Acerca de¶
Estos ejercicios tienen como finalidad practicar la descomposición modular de problemas en funciones en C, definiendo firmas con sus tipos de datos correspondientes para los parámetros y valores de retorno.
Capítulos de Apunte Correspondientes¶
Cuestiones de Estilo Aplicables¶
Resolución mediante funciones: Según la Regla 0x2009h, la lógica debe ser encapsulada en funciones independientes.
Nomenclatura en funciones: Los nombres de funciones y variables locales deben seguir la convención
snake_caseen minúsculas, de acuerdo con las reglas 0x200Ah y 0x0007h.Separación de entrada/salida: En concordancia con la Regla 0x2002h, se debe evitar que las funciones realicen entrada/salida (I/O) a menos que ese sea su propósito explícito.
Definición y Llamada de Funciones¶
Ejercicio 5.1 - Doble de un número ⭐⭐☆☆☆¶
Solution to Exercise 1
1 2 3 4 5 6 7 8 9 10 11#include <stdio.h> int doble(int n) { return 2 * n; } int main(void) { printf("Doble de 5: %d\n", doble(5)); printf("Doble de 12: %d\n", doble(12)); return 0; }
Ejercicio 5.2 - Mayor de dos números ⭐⭐☆☆☆¶
Solution to Exercise funciones-2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16#include <stdio.h> int mayor(int a, int b) { int resultado = a; if (b > a) { resultado = b; } return resultado; } int main(void) { int x = 10; int y = 7; printf("El mayor es: %d\n", mayor(x, y)); return 0; }
Ejercicio 5.3 - Paridad de un número ⭐⭐☆☆☆¶
Solution to Exercise 2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15#include <stdio.h> void par_impar(int n) { if (n % 2 == 0) { printf("%d es par\n", n); } else { printf("%d es impar\n", n); } } int main(void) { par_impar(7); par_impar(12); return 0; }
Ejercicio 5.4 - Promedio de notas ⭐⭐☆☆☆¶
Solution to Exercise funciones-4
1 2 3 4 5 6 7 8 9 10#include <stdio.h> float promedio(int a, int b, int c) { return (a + b + c) / 3.0f; } int main(void) { printf("Promedio: %.2f\n", promedio(7, 8, 10)); return 0; }
Ejercicio 5.5 - Área de rectángulo ⭐⭐☆☆☆¶
Solution to Exercise 3
1 2 3 4 5 6 7 8 9 10#include <stdio.h> int area_rectangulo(int base, int altura) { return base * altura; } int main(void) { printf("Área: %d\n", area_rectangulo(5, 4)); return 0; }
Ejercicio 5.6 - Funciones Matemáticas Básicas ⭐☆☆☆☆¶
Creá funciones para operaciones matemáticas: sumar, restar, multiplicar,
dividir.
Orientación:
Cada función recibe dos
doubley retorna el resultadodividirdebe verificar divisor != 0En
main, usá las funciones en una calculadora simple
Ejercicio 5.7 - Función Es Primo ⭐⭐☆☆☆¶
Implementá bool es_primo(int n) que determine si un número es primo.
Orientación:
Probá divisibilidad desde 2 hasta √n
Optimización: solo verificar impares después del 2
En
main, mostrá primos en un rango
Ejercicio 5.8 - Factorial Recursivo e Iterativo ⭐⭐☆☆☆¶
Implementá dos versiones de factorial:
int factorial_iterativo(int n)int factorial_recursivo(int n)
Orientación:
Iterativo: usá lazo
Recursivo:
n * factorial(n-1), caso base:n <= 1retorna 1Compará tiempos (opcional)
Ejercicio 5.9 - Conversión de Temperatura ⭐⭐☆☆☆¶
Creá funciones para convertir temperaturas:
celsius_a_fahrenheitcelsius_a_kelvinfahrenheit_a_celsiuskelvin_a_celsius
Orientación:
Cada función recibe y retorna
doubleMostrá un menú en
mainpara elegir conversión
Ejercicio 5.10 - Validación de Entrada ⭐⭐⭐☆☆¶
Implementá funciones de validación:
int leer_entero(int min, int max)- lee y valida rangodouble leer_positivo()- lee y valida > 0char leer_si_no()- lee ‘s’ o ‘n’
Orientación:
Cada función repite lectura hasta entrada válida
Mostrá mensajes de error descriptivos
Usá estas funciones en
mainpara varios inputs
Ejercicio 5.11 - Máximo Común Divisor (MCD) ⭐⭐⭐☆☆¶
Implementá el algoritmo de Euclides para calcular MCD.
Algoritmo:
mcd(a, b) = mcd(b, a % b) si b != 0
mcd(a, 0) = aOrientación:
Implementá versión recursiva e iterativa
Agregá función
mcm(a, b)usando: mcm = (a * b) / mcd(a, b)
Ejercicio 5.12 - Números de Fibonacci ⭐⭐⭐☆☆¶
Implementá:
int fibonacci(int n)- retorna n-ésimo número de Fibonaccivoid imprimir_fibonacci(int cantidad)- muestra los primeros n
Orientación:
Implementá versión recursiva e iterativa
Compará eficiencia (recursiva es muy lenta para n > 40)
Ejercicio 5.13 - Operaciones con Dígitos ⭐⭐⭐☆☆¶
Creá funciones para manipular dígitos de un número:
int contar_digitos(int n)int suma_digitos(int n)int invertir_numero(int n)bool es_palindromo(int n)
Orientación:
Usá división y módulo para extraer dígitos
es_palindromocompara el número con su inverso
Ejercicio 5.14 - Conversión de Bases ⭐⭐⭐⭐☆¶
Implementá conversiones entre bases numéricas:
int binario_a_decimal(long binario)long decimal_a_binario(int decimal)Similar para octal y hexadecimal
Orientación:
Para convertir a decimal: suma potencias de la base
Para convertir desde decimal: divisiones sucesivas
Validá que los dígitos sean válidos para la base
Ejercicio 5.15 - Cálculo de Potencia ⭐⭐⭐⭐☆¶
Implementá tres versiones de potencia:
double potencia_simple(double base, int exp)- O(n)double potencia_rapida(double base, int exp)- O(log n)Manejá exponentes negativos
Orientación:
Simple: multiplica base n veces
Rápida: si exp es par,
pow(base, exp) = pow(base*base, exp/2)Exponente negativo:
pow(base, -n) = 1 / pow(base, n)
Ejercicio 5.16 - Generador de Números Primos ⭐⭐⭐⭐☆¶
Implementá:
bool es_primo(int n)int siguiente_primo(int desde)void listar_primos(int inicio, int fin)int contar_primos(int hasta)
Orientación:
Optimizá
es_primoprobando solo hasta √nReutilizá funciones entre sí
siguiente_primobusca el próximo primo >= desde
Ejercicio 5.17 - Combinatoria ⭐⭐⭐⭐☆¶
Implementá funciones combinatorias:
long factorial(int n)long combinaciones(int n, int k)- C(n,k) = n! / (k! × (n-k)!)long permutaciones(int n, int k)- P(n,k) = n! / (n-k)!
Orientación:
Optimizá evitando calcular factoriales completos
Maneja overflow (usa
longolong long)Validá que 0 <= k <= n
Ejercicio 5.18 - Geometría Modular ⭐⭐⭐⭐☆¶
Creá funciones para calcular áreas y perímetros de figuras:
Círculo
Rectángulo
Triángulo (con fórmula de Herón)
Trapecio
Orientación:
Parámetros específicos para cada forma
Validá dimensiones positivas
Opcionalmente, usá un menú para elegir figura
Ejercicio 5.19 - Estadísticas de un Array ⭐⭐⭐⭐☆¶
Implementá funciones estadísticas para un array de números:
double promedio(double arr[], int n)double mediana(double arr[], int n)double desviacion_estandar(double arr[], int n)
Orientación:
Promedio: suma / cantidad
Mediana: ordenar y tomar el del medio
Desviación: √(Σ(x - μ)² / n)
Ejercicio 5.20 - Simulación de Dado ⭐⭐⭐⭐☆¶
Creá un simulador de lanzamiento de dados:
int lanzar_dado(int caras)- retorna 1 a carasvoid lanzar_multiples(int cantidad, int caras, int resultados[])void estadisticas_lanzamientos(int resultados[], int n)
Orientación:
Usá
rand() % caras + 1Inicializá semilla con
srand(time(NULL))una sola vezEstadísticas: muestra frecuencia de cada número
Ejercicio 5.21 - Validador de Fechas ⭐⭐⭐⭐☆¶
Implementá funciones para trabajar con fechas:
bool es_fecha_valida(int dia, int mes, int anio)int dias_del_mes(int mes, int anio)bool es_bisiesto(int anio)int dia_del_anio(int dia, int mes, int anio)
Orientación:
Reutilizá funciones entre sí
Validá rangos apropiados
dia_del_aniosuma días desde inicio del año
Ejercicio 5.22 - Búsqueda y Ordenamiento ⭐⭐⭐⭐⭐¶
Implementá algoritmos básicos:
int busqueda_lineal(int arr[], int n, int objetivo)void ordenar_burbuja(int arr[], int n)void intercambiar(int *a, int *b)
Orientación:
Búsqueda lineal: O(n), retorna índice o -1
Burbuja: compara adyacentes e intercambia
intercambiarusa punteros para modificar valores
Ejercicio 5.23 - Calculadora de Fechas ⭐⭐⭐⭐⭐¶
Calculá diferencias y sumas con fechas:
int diferencia_dias(fecha_t f1, fecha_t f2)fecha_t sumar_dias(fecha_t f, int dias)int dia_de_semana(fecha_t f)- 0=Domingo, 6=Sábado
Orientación:
Definí
typedef struct { int dia, mes, anio; } fecha_t;Convertí fechas a “número de días desde época”
Usá algoritmo de Zeller para día de semana
Ejercicio 5.24 - Sistema de Ecuaciones ⭐⭐⭐⭐⭐¶
Resolvé sistemas de ecuaciones 2×2:
a₁x + b₁y = c₁
a₂x + b₂y = c₂Implementá:
bool resolver_sistema(double a1, double b1, double c1, double a2, double b2, double c2, double *x, double *y)
Orientación:
Usá método de Cramer
Calculá determinante: det = a1×b2 - a2×b1
Si det = 0, sistema sin solución única
x = (c1×b2 - c2×b1) / det
y = (a1×c2 - a2×c1) / det
Usá punteros para retornar x e y
Notas Finales¶
Estas consignas practican modularización, reutilización, paso de parámetros y diseño de interfaces de funciones.