Ejercicios prácticos de fundamentos de C: solución de problemas clásicos

A continuación se presentan ejercicios típicos de programación en C, junto con sus soluciones y explicaciones. Se ha optado por reescribir el código original con cambios en la lógica y nombres de variables para ilustrar distintas formas de abordar los mismos problemas.

1. Problema de los cien pollos (百鸡百钱)

Un granjero quiere comprar exactamente 100 aves con exactamente 100 monedas. Un gallo cuesta 5 monedas, una gallina 3 monedas y tres pollitos cuestan 1 moneda. ¿Cuántos gallos, gallinas y pollitos debe comprar?

#include <stdio.h>

int main() {
    int g, h, p; // gallos, gallinas, pollitos (en grupos de 3)
    for (g = 0; g <= 20; g++) {
        for (h = 0; h <= 33; h++) {
            // p debe ser múltiplo de 3 para que el costo sea entero
            for (p = 0; p <= 100; p += 3) {
                if (g + h + p == 100 && 5*g + 3*h + p/3 == 100) {
                    printf("Gallos: %d, Gallinas: %d, Pollitos: %d\n", g, h, p);
                }
            }
        }
    }
    return 0;
}

2. Verificar si un número es palíndromo

Un número es palíndromo si se lee igual de izquierda a derecha que de derecha a izquierda (ej. 12321).

#include <stdio.h>

int main() {
    int num, original, reverso = 0, digito;
    printf("Ingrese un número: ");
    scanf("%d", &num);
    original = num;
    while (num > 0) {
        digito = num % 10;
        reverso = reverso * 10 + digito;
        num /= 10;
    }
    if (original == reverso)
        printf("%d es palíndromo\n", original);
    else
        printf("%d no es palíndromo\n", original);
    return 0;
}

3. Día del año a partir de fecha

Dados año, mes y día, calcular el número de día correspondiente (1–366).

#include <stdio.h>

int main() {
    int anio, mes, dia;
    printf("Ingrese año mes día: ");
    scanf("%d %d %d", &anio, &mes, &dia);
    int extra = 0;
    if (mes > 2) {
        if ((anio % 4 == 0 && anio % 100 != 0) || (anio % 400 == 0))
            extra = 1;
    }
    int total = dia;
    switch (mes) {
        case 12: total += 30;
        case 11: total += 31;
        case 10: total += 30;
        case 9:  total += 31;
        case 8:  total += 31;
        case 7:  total += 30;
        case 6:  total += 31;
        case 5:  total += 30;
        case 4:  total += 31;
        case 3:  total += 28 + extra;
        case 2:  total += 31;
        case 1:  printf("Día del año: %d\n", total);
    }
    return 0;
}

4. Buscar una clave en un arreglo

Se pide al usuario ingresar 5 números enteros y luego una clave. Determinar si la clave está presente en el arreglo.

#include <stdio.h>

int main() {
    int arr[5];
    int clave, i;
    printf("Ingrese la clave a buscar: ");
    scanf("%d", &clave);
    printf("Ingrese 5 números:\n");
    for (i = 0; i < 5; i++) {
        printf("Número %d: ", i+1);
        scanf("%d", &arr[i]);
    }
    int encontrado = 0;
    for (i = 0; i < 5; i++) {
        if (arr[i] == clave) {
            encontrado = 1;
            break;
        }
    }
    if (encontrado)
        printf("%d está en el arreglo\n", clave);
    else
        printf("%d no está en el arreglo\n", clave);
    return 0;
}

5. Máximo de un arreglo (dos métodos)

Primer método: ordenar parcialmente (burbuja) y tomar el último elemento. Segundo método: recorrido simple con actualización del máximo.

#include <stdio.h>

int main() {
    int arr[5];
    int i, j;
    printf("Ingrese 5 números:\n");
    for (i = 0; i < 5; i++) {
        scanf("%d", &arr[i]);
    }
    // Método 1: burbuja simple (solo para obtener el máximo)
    for (i = 0; i < 4; i++) {
        for (j = 0; j < 4 - i; j++) {
            if (arr[j] > arr[j+1]) {
                int temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
            }
        }
    }
    printf("Máximo (método burbuja): %d\n", arr[4]);
    
    // Método 2: recorrido directo
    int arr2[5];
    printf("Ingrese 5 números otra vez:\n");
    for (i = 0; i < 5; i++) {
        scanf("%d", &arr2[i]);
    }
    int max = arr2[0];
    for (i = 1; i < 5; i++) {
        if (arr2[i] > max) max = arr2[i];
    }
    printf("Máximo (recorrido directo): %d\n", max);
    return 0;
}

6. Preguntas de opción múltiple (selección)

  1. ¿Cuál de las siguientes es una funcionalidad del preprocesador? → D (todas: expansión de macros, inclusión de archivos, compilación condicional)
  2. El operador de conversión forzada (cast) es: → A ( )
  3. Salida de i=0x10+010+10 en hexadecimal: → B (22)
  4. Macro SQUARE(10+2) usando X*X da: → B (32)
  5. sizeof(int) suele ser: → A (depende de la plataforma, pero en muchos casos 4; en el examen asumen 4)
  6. Estructura con char, int, short en 32 bits: → 12 bytes (alineación)
  7. *(p+3) con int value[]={11,33,51,70,99}: → A (70)
  8. Programa con if(x==y) sin llaves: → D (20,0)
  9. while(!b_val) equivale a: → C (while(b_val==0))
  10. Rango de unsigned short: → C (0–65535)
  11. Expresiones con valor diferente: → 1<<3 = 8, 0x0F&0x08 = 8, 2^3 = 1, 3^2 = 1; A y B son iguales (8), C y D son iguales (1); no hay única diferencia
  12. ++*p es equivalente a: → C (++a[0])
  13. Función con punteros sin desreferenciar: → A (0,0)
  14. Tipo inválido en C: → D (long short)
  15. Asignación incorrecta para enlazar nodo: → B (p.next&b; p es puntero, requiere ->)
  16. z = x^y<<2 con x=3, y=6: → A (00011011)
  17. Inserción en tabla de 127 elementos, promedio de movimientos: → B (63.5)
  18. Probabilidad de ver lluvia de estrellas en 6 meses (91% anual): → B (70%)
  19. Secuencia {2,1,4,9,8,10,6,20} como segunda iteración: → D (inserción)

7. Fibonacci iterativo

#include <stdio.h>

int fibIter(int n) {
    if (n == 1 || n == 2) return 1;
    int a = 1, b = 1, c;
    for (int i = 3; i <= n; i++) {
        c = a + b;
        a = b;
        b = c;
    }
    return b;
}

int main() {
    int n;
    printf("Ingrese n: ");
    scanf("%d", &n);
    printf("Fib(%d) = %d\n", n, fibIter(n));
    return 0;
}

8. Invertir una cadena

#include <stdio.h>
#include <string.h>

void invertirCadena(char str[]) {
    int inicio = 0;
    int fin = strlen(str) - 1;
    while (inicio < fin) {
        char temp = str[inicio];
        str[inicio] = str[fin];
        str[fin] = temp;
        inicio++;
        fin--;
    }
}

int main() {
    char cadena[100];
    printf("Ingrese una cadena: ");
    scanf("%99s", cadena);
    invertirCadena(cadena);
    printf("Cadena invertida: %s\n", cadena);
    return 0;
}

Nota adicional sobre ordenamiento

Ordenamiento burbuja: compara pares adyacentes y los intercambia si están en orden incorrecto, repitiendo hasta que no haya intercambios.

Ordenamiento selección: encuentra el elemento más pequeño (o más grande) y lo coloca al inicio, luego continúa con el subarreglo restante.

Etiquetas: C ejercicios de programación palíndromo fibonacci búsqueda

Publicado el 6-26 05:03