Prerrequisitos y Entorno de Ejecución Requerido¶
Para compilar y verificar las soluciones de este módulo bajo el estándar C11 estricto de cátedra, se requiere:
Compilador C11: GCC 9+ o Clang 11+ configurado con flags
-Wall -Wextra -Werror -pedantic -std=c11.Entorno POSIX: Linux o WSL con utilidades estándar, soporte de aserciones deterministas y verificación lógica.
Herramientas de Verificación: Valgrind (memcheck) y AddressSanitizer (
-fsanitize=address,undefined) para garantizar la ausencia de lecturas o escrituras de memoria no inicializada.Conocimientos Previos: Función
main(void), tipos primitivos escalares (int,double), lazosfor/while, funciones puras y aserciones conassert().
Objetivos Pedagógicos y Competencias (Taxonomía de Bloom)¶
Nivel 2 (Comprensión): Analizar la estructura canónica de un programa C11, variables, ámbito y evaluación de expresiones.
Nivel 3 (Aplicación): Implementar funciones puras desacopladas de E/S para cálculo de secuencias numéricas y algoritmos iterativos.
Nivel 4 (Análisis): Evaluar condiciones de borde en lazos y verificar invariantes numéricos mediante suites de prueba ejecutables.
Andamiaje Progresivo: Ejercicios andamiados con contratos formales (precondiciones/postcondiciones), tablas de vectores de prueba y suites ejecutables con
assert().
Capítulos de Apunte Correspondientes¶
Cuestiones de Estilo Aplicables¶
Resolución mediante funciones: Según la 0x2008h: Los ejercicios deben ser resueltos mediante funciones, la lógica principal que resuelve cada enunciado debe estar contenida en una función.
Separación de entrada/salida: De acuerdo con la 0x2002h: Las funciones no deben contener printf o scanf, a menos que ese sea su propósito explícito, las funciones de cálculo no deben contener
printfoscanf.Uso de llaves: Toda estructura de control debe utilizar llaves (
{}) según la 0x1001h: Todas las estructuras de control deben utilizar llaves.Lazos: Según la 0x1003h: Utilizá el lazo for para iteraciones con rango o contador definido y while para lazos controlados por condiciones lógicas, se debe preferir el uso de lazos
forpara iteraciones con rango o contador definido, ywhilepara lazos controlados por condiciones lógicas.
Primeros Pasos y Salida Básica¶
Rangos y Secuencias¶
Solution to Exercise 3
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38#include <stdio.h> #include <assert.h> int calcular_pasos_regresiva(int n) { if (n <= 0) { return 0; } int pasos = 0; for (int i = n; i >= 1; --i) { pasos++; } return pasos; } long long suma_cuenta_regresiva(int n) { if (n <= 0) { return 0; } long long suma = 0; for (int i = n; i >= 1; --i) { suma += i; } return suma; } int main(void) { assert(calcular_pasos_regresiva(5) == 5); assert(calcular_pasos_regresiva(1) == 1); assert(calcular_pasos_regresiva(0) == 0); assert(calcular_pasos_regresiva(-4) == 0); assert(suma_cuenta_regresiva(5) == 15); assert(suma_cuenta_regresiva(1) == 1); assert(suma_cuenta_regresiva(0) == 0); assert(suma_cuenta_regresiva(-10) == 0); return 0; }
Solution to Exercise 4
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27#include <stdio.h> #include <assert.h> int contar_pares_en_rango(int inicio, int fin) { if (inicio > fin) { int temp = inicio; inicio = fin; fin = temp; } int cuenta = 0; for (int i = inicio; i <= fin; ++i) { if (i % 2 == 0) { cuenta++; } } return cuenta; } int main(void) { assert(contar_pares_en_rango(1, 10) == 5); assert(contar_pares_en_rango(-4, 2) == 4); assert(contar_pares_en_rango(10, 1) == 5); assert(contar_pares_en_rango(3, 3) == 0); assert(contar_pares_en_rango(4, 4) == 1); return 0; }
Solution to Exercise 5
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25#include <stdio.h> #include <assert.h> long long suma_primeros_n_impares(int n) { if (n <= 0) { return 0; } long long suma = 0; int impar_actual = 1; for (int i = 0; i < n; ++i) { suma += impar_actual; impar_actual += 2; } return suma; } int main(void) { assert(suma_primeros_n_impares(1) == 1); assert(suma_primeros_n_impares(4) == 16); assert(suma_primeros_n_impares(10) == 100); assert(suma_primeros_n_impares(0) == 0); assert(suma_primeros_n_impares(-5) == 0); return 0; }
Operaciones con Rangos Numéricos¶
Solution to Exercise 6
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22#include <stdio.h> #include <assert.h> long long suma_secuencia_ascendente(int n, int m) { if (n >= m) { return 0LL; } long long suma = 0; for (int i = n; i < m; ++i) { suma += i; } return suma; } int main(void) { assert(suma_secuencia_ascendente(1, 5) == 10LL); assert(suma_secuencia_ascendente(-3, 2) == -5LL); assert(suma_secuencia_ascendente(7, 8) == 7LL); assert(suma_secuencia_ascendente(5, 5) == 0LL); assert(suma_secuencia_ascendente(10, 4) == 0LL); return 0; }
Calcular la suma de todos los números enteros en un rango cerrado [n, m]. Esto
es equivalente a la operación matemática .
Variables: Se necesita una variable
acumulador(osuma), inicializada en 0.Entrada: Leer los enteros
nym.Proceso: Usar un lazo
forque itere desdenhastam. En cadaSalida: Después de que el lazo termine, imprimir el valor final del acumulador.
Ayuda (pseudocódigo)
1 2 3 4 5 6 7 8 9 10 11 12ALGORITMO sumatoria_rango ENTRADA: n, m (enteros) VARIABLES: suma (entero) INICIO suma = 0 PARA i DESDE n HASTA m HACER suma = suma + i FIN PARA ESCRIBIR "La suma es: ", suma FIN
Calcular la suma de los cuadrados de todos los números enteros en un rango
cerrado [n, m]. La operación es .
Variables: Se necesita un
acumuladorinicializado en 0.Entrada: Leer los enteros
nym.Proceso: Usar un lazo
forque itere denam. En cada iteración, sumari * ial acumulador.Salida: Al final, imprimir el valor del
acumulador.
Ayuda (pseudocódigo)
1 2 3 4 5 6 7 8 9 10 11 12ALGORITMO suma_cuadrados_rango ENTRADA: n, m (enteros) VARIABLES: suma_cuadrados (entero) INICIO suma_cuadrados = 0 PARA i DESDE n HASTA m HACER suma_cuadrados = suma_cuadrados + (i * i) FIN PARA ESCRIBIR "La suma de cuadrados es: ", suma_cuadrados FIN
Estructuras Condicionales¶
Este es un ejercicio fundamental de lógica condicional. El programa debe solicitar un número entero al usuario y determinar si es par (divisible por 2) o impar.
Entrada: Leer un único número entero.
Proceso: La propiedad matemática clave es que un número entero es par si
Condición: Se utiliza una estructura
if-else. Sinumero % 2 == 0, el número es par; de lo contrario, es impar.Salida: Imprimir un mensaje claro que indique el resultado, como “El número es par” o “El número es impar”.
Ayuda (pseudocódigo)
1 2 3 4 5 6 7 8 9 10 11ALGORITMO verificar_par_impar ENTRADA: numero (entero) INICIO LEER numero SI numero MOD 2 == 0 ENTONCES ESCRIBIR "El número ", numero, " es Par." SINO ESCRIBIR "El número ", numero, " es Impar." FIN SI FIN
El programa debe clasificar un número real (de punto flotante) ingresado por el usuario en una de tres categorías: positivo, negativo o cero.
Entrada: Leer un número que puede tener decimales (tipo
floatodouble).Proceso: Utilizar una estructura de condicionales anidados o `if-else
Condiciones:
Salida: Imprimir el mensaje correspondiente a la categoría.
Ayuda (pseudocódigo)
1 2 3 4 5 6 7 8 9 10 11 12 13ALGORITMO clasificar_signo ENTRADA: numero (real) INICIO LEER numero SI numero > 0 ENTONCES ESCRIBIR "El número es Positivo." SINO SI numero < 0 ENTONCES ESCRIBIR "El número es Negativo." SINO ESCRIBIR "El número es Cero." FIN SI FIN
Fórmulas Geométricas¶
Calcular el área de un triángulo a partir de las longitudes de su base y su altura. La fórmula es .
Entrada: Solicitar al usuario dos valores: la base (
b) y la alturaProceso: Aplicar la fórmula matemática directamente. En C, esto se calcula como
(base * altura) / 2.0.Salida: Mostrar el área calculada.
Ayuda (pseudocódigo)
1 2 3 4 5 6 7 8 9 10 11ALGORITMO area_triangulo_base_altura ENTRADA: base, altura (reales) VARIABLES: area (real) INICIO LEER base LEER altura area = (base * altura) / 2 ESCRIBIR "El área del triángulo es: ", area FIN
Calcular el área de un triángulo conociendo únicamente la longitud de sus tres
lados (a, b, c). Para esto se utiliza la fórmula de Herón.
Entrada: Solicitar al usuario las longitudes de los tres lados.
Proceso:
Validación: Antes de calcular, es importante verificar si los lados
Ayuda (pseudocódigo)
1 2 3 4 5 6 7 8 9 10 11 12ALGORITMO area_triangulo_heron ENTRADA: lado1, lado2, lado3 (reales) VARIABLES: s, area (reales) INICIO LEER lado1, lado2, lado3 // Opcional: Validar desigualdad triangular s = (lado1 + lado2 + lado3) / 2 area = RAIZ_CUADRADA(s * (s - lado1) * (s - lado2) * (s - lado3)) ESCRIBIR "El área del triángulo es: ", area FIN
Calcular el área y la circunferencia (perímetro) de un círculo a partir de su radio.
Constantes: Se necesita el valor de . Se puede definir como una macro con
#define PI 3.14159265oconst double.Entrada: Solicitar al usuario el valor del radio (
r).Proceso:
Salida: Mostrar ambos resultados de forma clara.
Ayuda (pseudocódigo)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15ALGORITMO circulo_calculos ENTRADA: radio (real) CONSTANTES: PI = 3.14159 VARIABLES: area, circunferencia (reales) INICIO LEER radio area = PI * radio * radio circunferencia = 2 * PI * radio ESCRIBIR "Área: ", area ESCRIBIR "Circunferencia: ", circunferencia FIN
Calcular el área de un trapecio dadas las longitudes de sus dos bases paralelas y su altura.
Entrada: Solicitar al usuario tres valores: la base mayor (
B), la baseProceso: Aplicar la fórmula del área del trapecio: $A = \frac{B+b}{2}
Salida: Mostrar el área calculada.
Ayuda (pseudocódigo)
1 2 3 4 5 6 7 8 9 10ALGORITMO area_trapecio ENTRADA: base_mayor, base_menor, altura (reales) VARIABLES: area (real) INICIO LEER base_mayor, base_menor, altura area = ((base_mayor + base_menor) / 2) * altura ESCRIBIR "El área del trapecio es: ", area FIN
Calcular el área de un polígono regular (lados y ángulos iguales) a partir del número de lados, la longitud de un lado y la apotema.
Entrada: Solicitar el número de lados (
n), la longitud de un ladoProceso:
Salida: Mostrar el área calculada.
Ayuda (pseudocódigo)
1 2 3 4 5 6 7 8 9 10 11ALGORITMO area_poligono_regular ENTRADA: num_lados (entero), long_lado, apotema (reales) VARIABLES: perimetro, area (reales) INICIO LEER num_lados, long_lado, apotema perimetro = num_lados * long_lado area = (perimetro * apotema) / 2 ESCRIBIR "El área del polígono es: ", area FIN
Calcular el área y el perímetro de un rectángulo dadas las longitudes de su largo y su ancho.
Entrada: Solicitar el largo (
l) y el ancho (w).Proceso:
Salida: Mostrar ambos resultados.
Ayuda (pseudocódigo)
1 2 3 4 5 6 7 8 9 10 11 12ALGORITMO rectangulo_calculos ENTRADA: largo, ancho (reales) VARIABLES: area, perimetro (reales) INICIO LEER largo, ancho area = largo * ancho perimetro = 2 * (largo + ancho) ESCRIBIR "Área: ", area ESCRIBIR "Perímetro: ", perimetro FIN
Conversiones de Unidades¶
Crear un programa que pueda convertir temperaturas entre las escalas Celsius, Fahrenheit y Kelvin.
Entrada: Solicitar al usuario el valor de la temperatura y la escala
Proceso: Aplicar la fórmula de conversión correspondiente:
Celsius a Fahrenheit:
Fahrenheit a Celsius:
Celsius a Kelvin:
Precisión: Al trabajar con divisiones como 9/5, es importante usar
Ayuda (pseudocódigo) para celsius a fahrenheit.
1 2 3 4 5 6 7 8 9 10ALGORITMO convertir_c_a_f ENTRADA: grados_celsius (real) VARIABLES: grados_fahrenheit (real) INICIO LEER grados_celsius grados_fahrenheit = (grados_celsius * 9.0 / 5.0) + 32 ESCRIBIR grados_celsius, "°C son ", grados_fahrenheit, "°F" FIN
Convertir una medida de ángulo dada en formato sexagesimal (grados, minutos y segundos) a su valor total equivalente en segundos.
Relaciones: Recordar que 1 grado = 60 minutos y 1 minuto = 60 segundos.
Entrada: Solicitar al usuario tres valores enteros: grados, minutos y segundos.
Proceso: Aplicar la fórmula de conversión: $total = (grados \times 3600)
Salida: Mostrar el total de segundos.
Ayuda (pseudocódigo)
1 2 3 4 5 6 7 8 9 10ALGORITMO angulo_a_segundos ENTRADA: grados, minutos, segundos (enteros) VARIABLES: total_segundos (entero) INICIO LEER grados, minutos, segundos total_segundos = (grados * 3600) + (minutos * 60) + segundos ESCRIBIR "El total en segundos es: ", total_segundos FIN
Control de Flujo Avanzado¶
Implementá una función pura que genere los primeros múltiplos de una base dada (del 1 al ):
void generar_tabla_multiplicar(int base, int *salida, size_t n);donde salida[i] almacenará el valor base * (i + 1).
Nivel de Bloom: Nivel 2 (Comprensión) y Nivel 3 (Aplicación).
Conceptos requeridos: Lazos secuenciales indexados en 0, punteros a memoria contigua, operaciones aritméticas básicas.
Techo conceptual: Prohibido el uso de variables globales o efectos colaterales fuera del búfer de salida.
Precondiciones: Si ,
salida != NULL.Postcondiciones: Cada posición contiene
base * (i + 1).
Vectores de Prueba - Generación de Tabla de Multiplicar
| Tipo de Caso | Base | Cantidad | Salida Esperada | Justificación Técnica |
|---|---|---|---|---|
| Normal (Positivo) | 7 | 5 | {7, 14, 21, 28, 35} | Multiplicación secuencial estándar |
| Normal (Negativo) | -4 | 3 | {-4, -8, -12} | Preservación del signo negativo |
| Borde (Cero) | 0 | 4 | {0, 0, 0, 0} | Propiedad del elemento absorbente |
| Borde (Vacío) | 9 | 0 | Sin modificaciones | Tamaño cero no ejecuta escrituras |
Solution to Exercise 20
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40#include <assert.h> #include <stddef.h> void generar_tabla_multiplicar(int base, int *salida, size_t n) { if (salida == NULL || n == 0) { return; } for (size_t i = 0; i < n; i++) { salida[i] = base * (int)(i + 1); } } int main(void) { int tabla_7[5]; generar_tabla_multiplicar(7, tabla_7, 5); assert(tabla_7[0] == 7); assert(tabla_7[1] == 14); assert(tabla_7[2] == 21); assert(tabla_7[3] == 28); assert(tabla_7[4] == 35); int tabla_neg[3]; generar_tabla_multiplicar(-4, tabla_neg, 3); assert(tabla_neg[0] == -4); assert(tabla_neg[1] == -8); assert(tabla_neg[2] == -12); int tabla_cero[4]; generar_tabla_multiplicar(0, tabla_cero, 4); assert(tabla_cero[0] == 0 && tabla_cero[1] == 0 && tabla_cero[2] == 0 && tabla_cero[3] == 0); generar_tabla_multiplicar(9, NULL, 0); return 0; }
Implementá una función pura que calcule la trayectoria de la conjetura de Collatz (ó secuencia ) para un valor inicial :
size_t generar_secuencia_collatz(unsigned long long n, unsigned long long *salida, size_t cap_max);Reglas de transición:
Si es par: .
Si es impar: .
La secuencia concluye al alcanzar el valor
1(incluido).
Comportamiento del contrato:
Si , la función retorna
0inmediatamente.Si
salida == NULL, la función itera hasta alcanzar el1y retorna el total de términos de la secuencia sin escribir en memoria.Si
salida != NULL, almacena los términos generados hasta alcanzar el1o hasta agotarcap_maxelementos, retornando la cantidad efectiva de términos escritos.
Nivel de Bloom: Nivel 3 (Aplicación) y Nivel 4 (Análisis).
Conceptos requeridos: Lazos condicionales while, aritmética modular, punteros a memoria contigua, gestión defensiva de capacidades.
Precondiciones:
n >= 0. Sisalida != NULL, debe apuntar a un bloque con capacidad para al menoscap_maxelementos de tipounsigned long long.Postcondiciones: Retorna la cantidad de términos de la secuencia calculados/almacenados.
salidacontiene los términos en orden cronológico.
Vectores de Prueba - Conjetura de Collatz y Trayectorias
| Caso | inicial | salida | cap_max | Retorno | Salida Generada | Justificación |
|---|---|---|---|---|---|---|
| Borde (Cero) | 0 | NULL | 0 | 0 | - | no pertenece al dominio |
| Borde (Uno) | 1 | buf | 10 | 1 | {1} | Alcanza 1 inmediatamente |
| Normal () | 6 | buf | 20 | 9 | {6, 3, 10, 5, 16, 8, 4, 2, 1} | Trayectoria completa de 9 términos |
| Modo Conteo | 6 | NULL | 0 | 9 | - | Conteo puro sin buffer |
| Capacidad Parcial | 6 | buf | 4 | 4 | {6, 3, 10, 5} | Truncamiento defensivo por cap_max |
Solution to Exercise 21
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90#include <assert.h> #include <stddef.h> size_t generar_secuencia_collatz(unsigned long long n, unsigned long long *salida, size_t cap_max) { if (n == 0) { return 0; } if (salida == NULL) { size_t pasos = 1; unsigned long long actual = n; while (actual != 1) { if (actual % 2 == 0) { actual /= 2; } else { actual = actual * 3 + 1; } pasos++; } return pasos; } if (cap_max == 0) { return 0; } size_t escritos = 0; unsigned long long actual = n; salida[escritos++] = actual; while (actual != 1 && escritos < cap_max) { if (actual % 2 == 0) { actual /= 2; } else { actual = actual * 3 + 1; } salida[escritos++] = actual; } return escritos; } int main(void) { /* Caso borde: n = 0 */ assert(generar_secuencia_collatz(0, NULL, 0) == 0); /* Caso borde: n = 1 */ unsigned long long buf_1[5]; size_t len_1 = generar_secuencia_collatz(1, buf_1, 5); assert(len_1 == 1); assert(buf_1[0] == 1); /* Modo conteo sin buffer */ assert(generar_secuencia_collatz(6, NULL, 0) == 9); /* Caso normal: n = 6 */ unsigned long long buf_6[20]; size_t len_6 = generar_secuencia_collatz(6, buf_6, 20); assert(len_6 == 9); assert(buf_6[0] == 6); assert(buf_6[1] == 3); assert(buf_6[2] == 10); assert(buf_6[3] == 5); assert(buf_6[4] == 16); assert(buf_6[5] == 8); assert(buf_6[6] == 4); assert(buf_6[7] == 2); assert(buf_6[8] == 1); /* Capacidad acotada */ unsigned long long buf_trunc[4]; size_t len_trunc = generar_secuencia_collatz(6, buf_trunc, 4); assert(len_trunc == 4); assert(buf_trunc[0] == 6 && buf_trunc[3] == 5); return 0; }
Crear un programa que funcione como una calculadora simple. Debe solicitar al usuario dos números y un carácter que represente la operación aritmética a realizar (+, -, *, /).
Entrada: Leer dos números (pueden ser
doublepara mayor flexibilidad)Proceso: Utilizar una estructura
switch(oif-else if) para seleccionar la operación según el operador ingresado.Caso Especial: Manejar la división por cero. Si el operador es
/y el divisor es 0, informar error al usuario.Salida: Mostrar el resultado de la operación o el mensaje de error.
Ayuda (pseudocódigo)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24ALGORITMO calculadora ENTRADA: num1, num2 (reales), operador (caracter) VARIABLES: resultado (real) INICIO LEER num1, operador, num2 SEGUN operador HACER CASO '+': resultado = num1 + num2 CASO '-': resultado = num1 - num2 CASO '*': resultado = num1 * num2 CASO '/': SI num2 != 0 ENTONCES resultado = num1 / num2 SINO ESCRIBIR "Error: División por cero." TERMINAR FIN SI CASO CONTRARIO: ESCRIBIR "Error: Operador no válido." TERMINAR FIN SEGUN ESCRIBIR "Resultado: ", resultado FIN
Desarrollar un juego simple donde el programa genera un número secreto aleatorio y el usuario debe adivinarlo. El programa proporciona pistas para guiar al usuario.
Generación Aleatoria:
Proceso: Usar un lazo
do-whileowhileque se repita hasta que el usuario adivine el número secreto.Entrada: Dentro del lazo, solicitar al usuario que ingrese su intento.
Condiciones: Comparar el intento con el número secreto y dar una pista:
Ayuda (pseudocódigo)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18ALGORITMO adivina_el_numero VARIABLES: numero_secreto, intento_usuario (enteros) INICIO numero_secreto = generar_aleatorio(1, 100) HACER ESCRIBIR "Adivina el número (1-100):" LEER intento_usuario SI intento_usuario > numero_secreto ENTONCES ESCRIBIR "Muy alto." SINO SI intento_usuario < numero_secreto ENTONCES ESCRIBIR "Muy bajo." FIN SI MIENTRAS intento_usuario != numero_secreto ESCRIBIR "¡Felicidades! Adivinaste el número." FIN
Generar y mostrar los primeros n términos de la serie de Fibonacci. En esta
serie, cada número es la suma de los dos anteriores, comenzando con 0 y 1.
Variables: Se necesitan al menos tres variables para mantener el estado:
Casos Base: Los primeros dos términos (para n=0 y n=1) son fijos (0 y 1 respectivamente).
Proceso:
Ayuda (pseudocódigo)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19ALGORITMO fibonacci_iterativo ENTRADA: n (entero) VARIABLES: a, b, siguiente, i (enteros) INICIO SI n >= 1 ENTONCES ESCRIBIR 0 SI n >= 2 ENTONCES ESCRIBIR 1 a = 0 b = 1 PARA i DESDE 3 HASTA n HACER siguiente = a + b ESCRIBIR siguiente a = b b = siguiente FIN PARA FIN
Implementar una función que calcule el monto final y el interés simple ganado a partir de un capital inicial, una tasa de interés anual y un período de tiempo en años.
Entrada: Solicitar tres valores: capital (
P), tasa de interés anualProceso:
Salida: Mostrar tanto el interés ganado como el monto total acumulado.
Ayuda (pseudocódigo)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15ALGORITMO interes_simple ENTRADA: capital, tasa_anual, anios (reales) VARIABLES: interes_ganado, monto_final (reales) INICIO LEER capital, tasa_anual, anios // Asegurarse que la tasa esté en formato decimal tasa_decimal = tasa_anual / 100 interes_ganado = capital * tasa_decimal * anios monto_final = capital + interes_ganado ESCRIBIR "Interés ganado: ", interes_ganado ESCRIBIR "Monto final: ", monto_final FIN
Escribir un programa que calcule el Índice de Masa Corporal (IMC) de una persona y lo clasifique según las categorías de la OMS.
Entrada: Solicitar el peso en kilogramos (kg) y la altura en metros (m).
Proceso:
Clasificación (ejemplo):
IMC < 18.5: Bajo peso
18.5 <= IMC < 25: Normal
25 <= IMC < 30: Sobrepeso
IMC >= 30: Obesidad
Salida: Mostrar el valor del IMC y la categoría de peso correspondiente.
Ayuda (pseudocódigo)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20ALGORITMO calcular_imc ENTRADA: peso_kg, altura_m (reales) VARIABLES: imc (real) INICIO LEER peso_kg, altura_m imc = peso_kg / (altura_m * altura_m) ESCRIBIR "Su IMC es: ", imc SI imc < 18.5 ENTONCES ESCRIBIR "Categoría: Bajo peso" SINO SI imc < 25 ENTONCES ESCRIBIR "Categoría: Normal" SINO SI imc < 30 ENTONCES ESCRIBIR "Categoría: Sobrepeso" SINO ESCRIBIR "Categoría: Obesidad" FIN SI FIN
Crear un programa que, dado un mes (como número del 1 al 12) y un año, determine y muestre cuántos días tiene ese mes. Este ejercicio requiere manejar el caso especial de febrero en los años bisiestos.
Entrada: Leer el mes y el año como números enteros.
Proceso:
Año Bisiesto: Un año es bisiesto si es divisible por 4, excepto los años
Salida: Imprimir el número de días.
Ayuda (pseudocódigo)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25ALGORITMO dias_del_mes ENTRADA: mes, anio (enteros) VARIABLES: es_bisiesto (booleano) INICIO LEER mes, anio es_bisiesto = (anio MOD 4 == 0 Y anio MOD 100 != 0) O (anio MOD 400 == 0) SEGUN mes HACER CASO 1, 3, 5, 7, 8, 10, 12: ESCRIBIR "31 días" CASO 4, 6, 9, 11: ESCRIBIR "30 días" CASO 2: SI es_bisiesto ENTONCES ESCRIBIR "29 días" SINO ESCRIBIR "28 días" FIN SI CASO CONTRARIO: ESCRIBIR "Mes no válido." FIN SEGUN FIN
El objetivo es encontrar el valor más grande entre tres números enteros proporcionados por el usuario. Este ejercicio se centra en el uso de condicionales anidados o operadores lógicos para realizar comparaciones múltiples.
Entrada: Leer tres números enteros distintos (
a,b,c).Proceso: Se puede resolver de varias maneras: -
SI (a >= b Y a >= c) ENTONCES a es el máximo.-SINO SI (b >= a Y b >= c) ENTONCES b es el máximo.-SINO c es el máximo.Salida: Imprimir el número que resultó ser el mayor.
Ayuda (pseudocódigo)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16ALGORITMO maximo_de_tres ENTRADA: a, b, c (enteros) VARIABLES: maximo (entero) INICIO LEER a, b, c maximo = a SI b > maximo ENTONCES maximo = b FIN SI SI c > maximo ENTONCES maximo = c FIN SI ESCRIBIR "El número más grande es: ", maximo FIN
Dados los largos de tres lados, el programa debe determinar si pueden formar un triángulo válido y, en caso afirmativo, clasificarlo como equilátero (todos los lados iguales), isósceles (dos lados iguales) o escaleno (todos los lados diferentes).
Entrada: Leer las longitudes de los tres lados (
a,b,c).Validación (Desigualdad Triangular): Antes de clasificar, es crucial
Clasificación:
Ayuda (pseudocódigo)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17ALGORITMO clasificar_triangulo ENTRADA: a, b, c (reales) INICIO LEER a, b, c SI (a+b > c) Y (a+c > b) Y (b+c > a) ENTONCES SI a == b Y b == c ENTONCES ESCRIBIR "Es un triángulo Equilátero." SINO SI a == b O b == c O a == c ENTONCES ESCRIBIR "Es un triángulo Isósceles." SINO ESCRIBIR "Es un triángulo Escaleno." FIN SI SINO ESCRIBIR "Los lados no forman un triángulo válido." FIN SI FIN
Dado un monto de dinero entero, el programa debe calcular la cantidad mínima de billetes de distintas denominaciones para representar dicho monto.
Entrada: Leer un monto entero.
Denominaciones: Definir las denominaciones de billetes disponibles en un arreglo o mediante divisiones enteras sucesivas.
Proceso: Utilizar divisiones y el operador módulo para calcular cuántos
Ayuda (pseudocódigo)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17ALGORITMO desglose_billetes ENTRADA: monto (entero) VARIABLES: cantidad_billetes (entero) INICIO LEER monto denominaciones = [1000, 500, 200, 100, 50, 20, 10] PARA cada d EN denominaciones HACER cantidad_billetes = monto / d SI cantidad_billetes > 0 ENTONCES ESCRIBIR cantidad_billetes, " billete(s) de ", d FIN SI monto = monto MOD d FIN PARA FIN
Implementar el clásico juego de Piedra, Papel o Tijera para que un usuario juegue una partida contra la computadora.
Entrada del Usuario: Pedir al usuario que elija una opción (ej.
Elección de la Computadora: Generar un número aleatorio entre 1 y 3 para representar la jugada de la máquina.
Reglas del Juego:
Piedra vence a Tijera.
Tijera vence a Papel.
Papel vence a Piedra.
Proceso: Comparar la elección del usuario con la de la computadora
Ayuda (pseudocódigo)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19ALGORITMO piedra_papel_tijera VARIABLES: eleccion_usuario, eleccion_pc (entero) INICIO ESCRIBIR "Elige: 1-Piedra, 2-Papel, 3-Tijera" LEER eleccion_usuario eleccion_pc = generar_aleatorio(1, 3) SI eleccion_usuario == eleccion_pc ENTONCES ESCRIBIR "Empate." SINO SI (eleccion_usuario == 1 Y eleccion_pc == 3) O \ (eleccion_usuario == 2 Y eleccion_pc == 1) O \ (eleccion_usuario == 3 Y eleccion_pc == 2) ENTONCES ESCRIBIR "¡Ganaste!" SINO ESCRIBIR "Perdiste." FIN SI FIN
Implementar un programa que pida un número n e imprima un triángulo de n
filas de altura, construido con asteriscos, centrado como una pirámide.
Entrada: Leer un entero
npara la altura del triángulo.Proceso: Se necesitan dos lazos aninados. - El primer lazo interior imprime los espacios en blanco necesarios - El segundo lazo interior imprime los asteriscos. En la fila
i, se imprimen2 * i - 1asteriscos.Salida: Después de cada fila, imprimir un salto de línea.
Ayuda (pseudocódigo)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18ALGORITMO piramide_asteriscos ENTRADA: n (entero) INICIO PARA fila DESDE 1 HASTA n HACER // Imprimir espacios PARA espacio DESDE 1 HASTA n - fila HACER ESCRIBIR " " SIN SALTO DE LÍNEA FIN PARA // Imprimir asteriscos PARA asterisco DESDE 1 HASTA 2 * fila - 1 HACER ESCRIBIR "*" SIN SALTO DE LÍNEA FIN PARA ESCRIBIR SALTO DE LÍNEA FIN PARA FIN
Crear un programa que solicite una contraseña al usuario y no le permita
continuar hasta que ingrese la contraseña correcta. Este ejercicio practica el
uso de lazos do-while y la comparación de cadenas.
Contraseña Secreta: Definir una contraseña correcta como una cadena
Entrada: Dentro de un lazo, solicitar al usuario que ingrese la contraseña por consola.
Proceso: Usar un lazo
do-whilees ideal aquí, ya que la solicitud debeComparación de Cadenas: En C, las cadenas no se pueden comparar con
==; se debe utilizar la funciónstrcmp().
Ayuda (pseudocódigo)
1 2 3 4 5 6 7 8 9 10 11 12 13 14ALGORITMO validar_contrasena CONSTANTES: CLAVE_SECRETA = "password123" VARIABLES: intento (cadena) INICIO HACER ESCRIBIR "Ingrese la contraseña:" LEER intento MIENTRAS intento != CLAVE_SECRETA ESCRIBIR "Acceso concedido." FIN
Simular la interfaz de un menú de cajero automático. El programa debe mostrar una lista de opciones y ejecutar una acción simple según la elección del usuario, repitiendo el proceso hasta que el usuario decida salir.
Estado: Mantener una variable para el saldo de la cuenta.
Proceso: Usar un lazo
do-whileque se ejecute mientras la opciónMenú: Dentro del lazo, imprimir las opciones (1. Consultar, 2.
Entrada: Leer la opción del usuario.
Selección: Usar una estructura
switchpara manejar las diferentes
Ayuda (pseudocódigo)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31ALGORITMO cajero_automatico VARIABLES: saldo (real) opcion, monto (entero) INICIO saldo = 1000.0 HACER ESCRIBIR "1. Consultar Saldo" ESCRIBIR "2. Depositar" ESCRIBIR "3. Retirar" ESCRIBIR "4. Salir" LEER opcion SEGUN opcion HACER CASO 1: ESCRIBIR "Su saldo es: ", saldo CASO 2: ESCRIBIR "Ingrese monto a depositar:" LEER monto saldo = saldo + monto CASO 3: ESCRIBIR "Ingrese monto a retirar:" LEER monto SI monto <= saldo ENTONCES saldo = saldo - monto SINO ESCRIBIR "Saldo insuficiente." FIN SI FIN SEGUN MIENTRAS opcion != 4 FIN
Implementar un programa que pida un número impar n e imprima un rombo de
asteriscos de n filas de altura.
Estructura: Un rombo puede verse como una pirámide seguida de una pirámide invertida.
Entrada: Leer un entero impar
n.Proceso:
Ayuda (pseudocódigo)
1 2 3 4 5 6 7 8 9 10 11 12 13 14ALGORITMO rombo_asteriscos ENTRADA: n (entero impar) INICIO // Parte superior (pirámide) PARA fila DESDE 1 HASTA (n/2) + 1 HACER // Imprimir espacios y asteriscos como en el ejercicio de la pirámide FIN PARA // Parte inferior (pirámide invertida) PARA fila DESDE n/2 HASTA 1 CON PASO -1 HACER // Imprimir espacios y asteriscos de forma similar pero con el lazo decreciente FIN PARA FIN
Escribir un programa que sea flexible en la cantidad de números a promediar. Primero debe preguntar al usuario cuántos números va a ingresar y luego calcular el promedio de esa cantidad de números.
Entrada Inicial: Leer la cantidad de números a promediar ().
Variables: Se necesita un
acumuladorpara la suma y un contador.Proceso:
Salida: Mostrar el promedio calculado.
Ayuda (pseudocódigo)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21ALGORITMO promedio_n_numeros VARIABLES: cantidad, i (enteros) numero, suma, promedio (reales) INICIO ESCRIBIR "¿Cuántos números desea promediar?" LEER cantidad suma = 0 PARA i DESDE 1 HASTA cantidad HACER ESCRIBIR "Ingrese el número ", i, ":" LEER numero suma = suma + numero FIN PARA SI cantidad > 0 ENTONCES promedio = suma / cantidad ESCRIBIR "El promedio es: ", promedio FIN SI FIN
Crear una función que reciba un número entero y devuelva la cantidad de dígitos que lo componen.
Entrada: Un número entero.
Proceso: La forma más simple es usar la división entera por 10
Caso Especial: Si el número de entrada es 0, tiene 1 dígito. El lazo
Ayuda (pseudocódigo)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21ALGORITMO contar_digitos ENTRADA: numero (entero) VARIABLES: contador (entero) INICIO SI numero == 0 ENTONCES RETORNAR 1 FIN SI contador = 0 // Manejar números negativos numero_abs = VALOR_ABSOLUTO(numero) MIENTRAS numero_abs > 0 HACER numero_abs = numero_abs / 10 contador = contador + 1 FIN MIENTRAS RETORNAR contador FIN
Implementar una función que tome un número entero y devuelva otro número con los dígitos en orden inverso.
Entrada: Un número entero.
Proceso: Se puede construir el número invertido dígito por dígito.
Salida: Devolver el número
invertido.
Ayuda (pseudocódigo)
1 2 3 4 5 6 7 8 9 10 11 12 13 14ALGORITMO invertir_numero ENTRADA: numero (entero) VARIABLES: invertido, digito (enteros) INICIO invertido = 0 MIENTRAS numero != 0 HACER digito = numero MOD 10 invertido = (invertido * 10) + digito numero = numero / 10 FIN MIENTRAS RETORNAR invertido FIN
Escribir una función que calcule base^exponente sin usar la función pow() de
la biblioteca math.h. Debe funcionar para exponentes enteros no negativos.
Entrada: Una base y un exponente (entero no negativo).
Variables: Se necesita una variable
resultadoinicializada en 1.Proceso:
Salida: Devolver el
resultado.
Ayuda (pseudocódigo)
1 2 3 4 5 6 7 8 9 10 11 12ALGORITMO potencia_iterativa ENTRADA: base (real), exponente (entero) VARIABLES: resultado (real) INICIO resultado = 1.0 PARA i DESDE 1 HASTA exponente HACER resultado = resultado * base FIN PARA RETORNAR resultado FIN
Crear un programa robusto que presente al usuario un menú con varias opciones de conversión de unidades (ej. Celsius a Fahrenheit, Metros a Pies, Kilogramos a Libras). El programa debe repetir el menú hasta que el usuario elija la opción de salir.
Proceso: Similar al ejercicio del cajero automático. Usar un lazo
Modularidad: Es una buena práctica crear una función separada para cada
Ayuda (pseudocódigo)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17ALGORITMO menu_conversiones VARIABLES: opcion (entero) INICIO HACER ESCRIBIR "1. Celsius a Fahrenheit" ESCRIBIR "2. Metros a Pies" ESCRIBIR "3. Salir" LEER opcion SEGUN opcion HACER CASO 1: llamar funcion_convertir_c_a_f() CASO 2: llamar funcion_convertir_m_a_pies() FIN SEGUN MIENTRAS opcion != 3 FIN
Crear una función que valide si una combinación de día, mes y año corresponde a una fecha real en el calendario gregoriano.
Entrada: Tres enteros:
dia,mes,anio.Proceso: Realizar una serie de verificaciones en orden lógico:
Salida: Devolver un valor booleano (
truesi es válida,falsesi no).
Ayuda (pseudocódigo)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18FUNCION es_fecha_valida(dia, mes, anio) VARIABLES: dias_en_mes (entero) INICIO SI anio < 1 O mes < 1 O mes > 12 O dia < 1 O dia > 31 ENTONCES RETORNAR FALSO FIN SI // Lógica para dias_en_mes (similar al ejercicio 1.17) ... SI dia > dias_en_mes ENTONCES RETORNAR FALSO FIN SI RETORNAR VERDADERO FIN FUNCION
Pedir al usuario un número n y dibujar el contorno de un cuadrado de n x n
utilizando asteriscos. El interior del cuadrado debe estar vacío.
Entrada: Leer un entero
n.Proceso: Usar lazos aninados. El lazo exterior para las filas y el lazo interior para las columnas.
Condición: Dentro del lazo interior, se debe decidir si imprimir un asterisco en los bordes o un espacio en el interior.
Es la primera o la última fila (
fila == 1ofila == n).Es la primera o la última columna (
columna == 1ocolumna == n).
En cualquier otro caso, se imprime un espacio.
Ayuda (pseudocódigo)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15ALGORITMO cuadrado_hueco ENTRADA: n (entero) INICIO PARA fila DESDE 1 HASTA n HACER PARA columna DESDE 1 HASTA n HACER SI fila == 1 O fila == n O columna == 1 O columna == n ENTONCES ESCRIBIR "*" SIN SALTO DE LÍNEA SINO ESCRIBIR " " SIN SALTO DE LÍNEA FIN SI FIN PARA ESCRIBIR SALTO DE LÍNEA FIN PARA FIN
Dado un rango de números [n, m], el programa debe calcular la suma de todos
los números pares y la suma de todos los números impares de forma independiente
y mostrar ambos resultados.
Variables: Se necesitan dos acumuladores:
suma_paresysuma_impares, ambos inicializados en 0.Entrada: Leer los enteros
nym.Proceso:
Salida: Mostrar los valores finales de ambas sumas.
Ayuda (pseudocódigo)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18ALGORITMO suma_pares_impares_rango ENTRADA: n, m (enteros) VARIABLES: suma_pares, suma_impares (enteros) INICIO suma_pares = 0 suma_impares = 0 PARA i DESDE n HASTA m HACER SI i MOD 2 == 0 ENTONCES suma_pares = suma_pares + i SINO suma_impares = suma_impares + i FIN SI FIN PARA ESCRIBIR "Suma de pares: ", suma_pares ESCRIBIR "Suma de impares: ", suma_impares FIN
Un número de la suerte es un entero con una cantidad par de dígitos, donde la suma de los dígitos de la primera mitad es igual a la suma de los dígitos de la segunda mitad. El programa debe verificar si un número dado es de la suerte.
Entrada: Leer un número entero.
Proceso:
Ayuda (pseudocódigo)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31ALGORITMO numero_de_la_suerte ENTRADA: numero (entero) VARIABLES: total_digitos, mitad_digitos, i (enteros) primera_mitad, segunda_mitad (enteros) suma1, suma2 (enteros) INICIO LEER numero total_digitos = contar_digitos(numero) SI total_digitos MOD 2 != 0 ENTONCES ESCRIBIR "No es un número de la suerte (dígitos impares)." TERMINAR FIN SI mitad_digitos = total_digitos / 2 divisor = potencia(10, mitad_digitos) primera_mitad = numero / divisor segunda_mitad = numero MOD divisor suma1 = sumar_digitos(primera_mitad) suma2 = sumar_digitos(segunda_mitad) SI suma1 == suma2 ENTONCES ESCRIBIR "Es un número de la suerte." SINO ESCRIBIR "No es un número de la suerte." FIN SI FIN
Escribí un programa que solicite tu nombre y te salude personalmente.
Ejemplo de ejecución:
Ingresá tu nombre: Juan
¡Hola, Juan! Bienvenido a la programación en C.Orientación:
Usá
printf()para mostrar mensajesUsá
scanf()para leer el nombre (máximo 50 caracteres)Recordá incluir
<stdio.h>
Escribí un programa que lea dos números enteros y muestre su suma, resta, producto y división.
Ejemplo de ejecución:
Primer número: 10
Segundo número: 3
Suma: 13
Resta: 7
Producto: 30
División: 3.33Orientación:
Declará variables para los dos números
Para la división con decimales, convertí al menos uno de los operandos a
doubleUsá
%.2fpara mostrar dos decimales
Creá un programa que convierta temperatura de Celsius a Fahrenheit y Kelvin.
Fórmulas:
Fahrenheit = Celsius × 9/5 + 32
Kelvin = Celsius + 273.15
Orientación:
Usá
doublepara almacenar temperaturasAplicá las fórmulas de conversión
Mostrá resultados con dos decimales
Escribí un programa que calcule el área y perímetro de un rectángulo dados su ancho y alto.
Orientación:
Área = ancho × alto
Perímetro = 2 × (ancho + alto)
Usá
doublepara las medidasVerificá que ancho y alto sean positivos
Calculá el promedio de tres números decimales ingresados por el usuario.
Orientación:
Leé tres números con
scanf("%lf", ...)Promedio = (a + b + c) / 3.0
Mostrá el resultado con dos decimales
Leé dos números enteros y mostralos intercambiados (sin usar una tercera variable).
Ejemplo:
Ingresá a: 5
Ingresá b: 10
Después del intercambio:
a = 10
b = 5Orientación:
Usá operaciones aritméticas para intercambiar:
a = a + b;b = a - b;a = a - b;
Verificá el resultado imprimiendo antes y después del intercambio
Convertí una distancia en metros a kilómetros, centímetros y milímetros.
Orientación:
1 metro = 0.001 km = 100 cm = 1000 mm
Usá constantes para los factores de conversión
Mostrá todas las conversiones
Calculá el Índice de Masa Corporal (IMC) dados peso (kg) y altura (m).
Fórmula: IMC = peso / (altura × altura)
Orientación:
Verificá que altura sea mayor que 0
Mostrá el IMC con dos decimales
Opcionalmente, mostrá la categoría (bajo peso, normal, sobrepeso)
Dado un monto en pesos, calculá cuántos billetes de cada denominación (1000, 500, 200, 100, 50, 20, 10) se necesitan.
Ejemplo:
Monto: 1780
1 billete(s) de 1000
1 billete(s) de 500
1 billete(s) de 200
0 billete(s) de 100
1 billete(s) de 50
1 billete(s) de 20
1 billete(s) de 10Orientación:
Usá división entera y módulo
Empezá por el billete más grande
Restá el valor usado del monto
Convertí una cantidad de segundos a formato HH:MM:SS.
Ejemplo:
Segundos: 3665
Resultado: 1:01:05Orientación:
Horas = segundos / 3600
Minutos = (segundos % 3600) / 60
Segundos restantes = segundos % 60
Mostrá con formato
printf("%d:%02d:%02d", h, m, s)
Leé un número de tres dígitos y mostrá cada dígito por separado.
Ejemplo:
Número: 457
Centenas: 4
Decenas: 5
Unidades: 7Orientación:
Centenas = numero / 100
Decenas = (numero / 10) % 10
Unidades = numero % 10
Calculá el precio final de un producto aplicando un descuento porcentual.
Ejemplo:
Precio original: 1000
Descuento (%): 15
Precio final: 850.00Orientación:
Descuento = precio × (porcentaje / 100.0)
Precio final = precio - descuento
Mostrá ambos valores
Leé dos números enteros dividendo y divisor. Mostrá el cociente entero, el
resto de la división (módulo) y el resultado de la división real (con decimales).
Orientación:
Verificá que el divisor sea distinto de cero antes de realizar la operación
Usá
/para la división entera y%para el restoConvertí uno de los operandos a
doublemediante(double)para obtener el cociente con decimales
Convertí un número decimal a binario, octal y hexadecimal.
Orientación:
Usá especificadores de formato:
%d,%o,%xMostrá el número en las cuatro bases
Opcionalmente, implementá conversión manual con divisiones sucesivas
Calculá el área de un triángulo usando la fórmula de Herón dados los tres lados.
Fórmula:
s = (a + b + c) / 2
área = √(s × (s-a) × (s-b) × (s-c))
Orientación:
Verificá que los lados formen un triángulo válido (a + b > c, etc.)
Usá
sqrt()de<math.h>Compilá con
-lmpara enlazar la biblioteca matemática
Resolvé una ecuación cuadrática ax² + bx + c = 0, mostrando las raíces reales si existen.
Orientación:
Calculá el discriminante: Δ = b² - 4ac
Si Δ < 0: no hay raíces reales
Si Δ = 0: una raíz: x = -b / (2a)
Si Δ > 0: dos raíces: x = (-b ± √Δ) / (2a)
Usá
sqrt()de<math.h>
Calculá el monto final de una inversión con interés compuesto.
Fórmula: A = P × (1 + r/n)^(n×t)
Donde:
P = capital inicial
r = tasa de interés anual (decimal)
n = veces que se capitaliza por año
t = tiempo en años
Orientación:
Usá
pow()de<math.h>Mostrá el monto inicial, final y la ganancia
Compilá con
-lm
Convertí un color RGB (rojo, verde, azul) a su representación hexadecimal.
Ejemplo:
Rojo (0-255): 255
Verde (0-255): 127
Azul (0-255): 80
Hexadecimal: #FF7F50Orientación:
Verificá que cada valor esté en rango 0-255
Usá
printf("%02X", valor)para formato hexadecimalCombiná los tres valores en formato #RRGGBB
Calculá base^exponente usando solo multiplicaciones (exponente entero positivo).
Orientación:
Leé base (double) y exponente (int positivo)
Usá un lazo para multiplicar base por sí misma exponente veces
Considerá el caso especial cuando exponente = 0 (resultado = 1)
Spoiler: Este ejercicio requiere lazos, pero podés usar multiplicaciones repetidas en línea
Creá una calculadora que realice operaciones avanzadas: potencia, raíz cuadrada, seno, coseno, tangente, logaritmo.
Orientación:
Mostrá un menú de opciones
Leé la operación deseada y los operandos necesarios
Usá funciones de
<math.h>:pow(),sqrt(),sin(),cos(),tan(),log()Recordá que funciones trigonométricas usan radianes
Verificá casos especiales (raíz de negativo, log de 0 o negativo, etc.)
Compilá con
-lm
Notas Finales¶
Validación: Siempre verificá entradas inválidas (divisiones por cero, valores fuera de rango)
Formato: Usá
printf()con especificadores apropiados (%d,%f,%c, etc.)Constantes: Definí valores fijos con
#defineoconstComentarios: Documentá qué hace cada sección del código
Testing: Probá con diferentes entradas, incluyendo casos extremos
Para ejercicios que usan <math.h>, compilá con:
gcc -Wall -Wextra -std=c99 programa.c -o programa -lmEl flag -lm enlaza la biblioteca matemática.
Estas consignas cubren los conceptos fundamentales del Apunte 1: variables, tipos de datos, operadores aritméticos, relacionales, lógicos, entrada/salida, y uso básico de bibliotecas estándar.