Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Ejercicios: Control de Flujo

Problemas y soluciones sobre lazos y condicionales en C

Universidad Nacional de Río Negro

Acerca de

Estos ejercicios tienen como propósito ejercitar la lógica condicional, las estructuras de repetición y el control de flujo estructurado y seguro en C.

Capítulos de Apunte Correspondientes

Cuestiones de Estilo Aplicables


Estructuras Condicionales

Ejercicio 4.1 - Condición de aprobación ⭐⭐☆☆☆

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>

int main(void)
{
    int nota = 0;
    printf("Ingrese la nota: ");
    if (scanf("%d", &nota) != 1) {
        printf("Error al leer la nota.\n");
        return 1;
    }

    if (nota >= 6) {
        printf("Promociona\n");
    } else if (nota >= 4) {
        printf("Aprueba\n");
    } else {
        printf("Desaprueba\n");
    }
    return 0;
}

Estructuras de Repetición (Lazos)

Ejercicio 4.2 - Cuenta descendente ⭐⭐☆☆☆

Solution to Exercise while #
1
2
3
4
5
6
7
8
9
10
#include <stdio.h>

int main(void) {
    int i = 10;
    while (i >= 1) {
        printf("%d\n", i);
        i = i - 1;
    }
    return 0;
}

Ejercicio 4.3 - Múltiplos de 3 ⭐⭐☆☆☆

Solution to Exercise for #
1
2
3
4
5
6
7
8
9
10
#include <stdio.h>

int main(void) {
    for (int i = 0; i <= 30; i = i + 1) {
        if (i % 3 == 0) {
            printf("%d es múltiplo de 3\n", i);
        }
    }
    return 0;
}

Ejercicio 4.4 - Clave de acceso con do-while ⭐⭐☆☆☆

Solution to Exercise for #
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>

int main(void) {
    int clave = 0;
    int clave_correcta = 1234;

    do {
        printf("Ingrese la clave: ");
        if (scanf("%d", &clave) != 1) {
            printf("Error al leer la clave.\n");
            return 1;
        }

        if (clave != clave_correcta) {
            printf("Clave incorrecta. Reintente.\n");
        }
    } while (clave != clave_correcta);

    printf("Acceso concedido.\n");
    return 0;
}

Control de Flujo Seguro

Ejercicio 4.5 - Refactorización de break ⭐⭐☆☆☆

Solution to Exercise break #

Se reestructura el lazo reemplazando el for e implementando un lazo while controlado por una bandera lógica booleana (bool) del encabezado <stdbool.h> que se establece en false al alcanzar la condición de parada:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
#include <stdbool.h>

int main(void) {
    int i = 0;
    bool continuar = true;
    while (i < 10 && continuar) {
        printf("valor actual: %d\n", i);
        if (i == 4) {
            continuar = false;
        }
        i++;
    }
    return 0;
}

Ejercicio 4.6 - Refactorización de continue ⭐⭐☆☆☆

Se reestructura el lazo de forma segura eliminando la instrucción continue y encerrando el cuerpo restante del lazo dentro de una condición positiva que filtra los elementos que se desean procesar (en este caso, los impares):

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>

int main(void) {
    for (int i = 0; i <= 10; i++) {
        if (i % 2 != 0) {
            printf("i = %d\n", i);
        }
    }
    return 0;
}

Ejercicio 4.7 - Lazo de clave con bandera ⭐⭐☆☆☆

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 <stdbool.h>

int main(void)
{
    int clave = 0;
    int clave_correcta = 1234;
    bool clave_correcta_ingresada = false;

    while (clave_correcta_ingresada == false) {
        printf("Ingrese la clave de acceso: ");
        if (scanf("%d", &clave) != 1) {
            printf("Error al leer la clave.\n");
            return 1;
        }

        if (clave == clave_correcta) {
            printf("Acceso concedido.\n");
            clave_correcta_ingresada = true; // Se modifica el estado de la bandera
        } else {
            printf("Clave incorrecta. Intente nuevamente.\n");
        }
    }
    return 0;
}

Ejercicio 4.8 - s de Práctica ⭐⭐☆☆☆

Ejercicio 4.9 - Mayor de dos números reales ⭐⭐☆☆☆

Escribí un programa que solicite dos números reales al usuario y muestre cuál es el mayor.

Ejercicio 4.10 - Números del 1 al 100 ⭐⭐☆☆☆

Diseñá un programa que imprima en pantalla los números enteros del 1 al 100 utilizando un lazo for.

Ejercicio 4.11 - Suma de pares del 1 al 100 ⭐⭐☆☆☆

Desarrollá un algoritmo que sume los números pares comprendidos en el rango del 1 al 100 inclusive.

Ejercicio 4.12 - Verificación de número primo ⭐⭐☆☆☆

Escribí un programa que solicite un número entero positivo e indique si es un número primo (divisible únicamente por 1 y por sí mismo).

Ejercicio 4.13 - Estado de aprobación de calificación ⭐⭐⭐☆☆

Escribí un programa que pida una calificación (0 a 10) e indique si el estudiante aprobó (calificación mayor o igual a 4).

Ejercicio 4.14 - Contraseña de caracteres iterativa ⭐⭐☆☆☆

Escribí un programa que solicite repetidamente una contraseña de caracteres al usuario hasta que coincida con un valor establecido de acceso seguro.

Ejercicio 4.15 - Contar del 1 al 10 ⭐☆☆☆☆

Mostrá los números del 1 al 10 usando un lazo for.

Orientación:


Ejercicio 4.16 - Suma de N Números ⭐☆☆☆☆

Leé un número N y calculá la suma de los primeros N números naturales.

Orientación:


Ejercicio 4.17 - Tabla de Multiplicar ⭐⭐☆☆☆

Mostrá la tabla de multiplicar de un número ingresado por el usuario (1 a 10).

Orientación:


Ejercicio 4.18 - Factorial con While ⭐⭐☆☆☆

Calculá el factorial de N usando un lazo while.

Orientación:


Ejercicio 4.19 - Números Pares en Rango ⭐⭐☆☆☆

Mostrá todos los números pares entre dos valores ingresados.

Orientación:


Ejercicio 4.20 - Suma hasta Cero ⭐⭐☆☆☆

Leé números enteros hasta que el usuario ingrese 0, luego mostrá la suma total.

Orientación:


Ejercicio 4.21 - Validación de Entrada ⭐⭐⭐☆☆

Leé un número entre 1 y 100. Si está fuera de rango, pedí nuevamente hasta que sea válido.

Orientación:


Ejercicio 4.22 - Contar Dígitos ⭐⭐⭐☆☆

Contá cuántos dígitos tiene un número entero.

Orientación:


Ejercicio 4.23 - Número Primo ⭐⭐⭐☆☆

Determiná si un número es primo probando divisibilidad.

Orientación:


Ejercicio 4.24 - Secuencia de Fibonacci ⭐⭐⭐☆☆

Generá los primeros N números de Fibonacci.

Orientación:


Ejercicio 4.25 - Búsqueda en Array ⭐⭐⭐☆☆

Buscá un valor en un array. Si lo encontrás, mostrá su posición y break.

Orientación:


Ejercicio 4.26 - Menú Interactivo ⭐⭐⭐☆☆

Implementá un menú que se repita hasta que el usuario elija “Salir”.

Orientación:


Ejercicio 4.27 - Mayor y Menor de N Números ⭐⭐⭐☆☆

Leé N números y encontrá el mayor y menor.

Orientación:


Ejercicio 4.28 - Invertir un Número ⭐⭐⭐⭐☆

Invertí los dígitos de un número (ej: 1234 → 4321).

Orientación:


Ejercicio 4.29 - Números Perfectos ⭐⭐⭐⭐☆

Encontrá todos los números perfectos hasta N. Un número es perfecto si la suma de sus divisores (excluyéndolo) es igual al número.

Ejemplo: 6 = 1 + 2 + 3

Orientación:


Ejercicio 4.30 - Patrón de Asteriscos - Triángulo ⭐⭐⭐⭐☆

Dibujá un triángulo de asteriscos de altura N.

Ejemplo (N=5):

*
**
***
****
*****

Orientación:


Ejercicio 4.31 - Máximo Común Divisor (Euclides) ⭐⭐⭐⭐☆

Implementá el algoritmo de Euclides iterativo para calcular MCD.

Algoritmo:

mientras b != 0:
    temp = b
    b = a % b
    a = temp
retornar a

Orientación:


Ejercicio 4.32 - Número de Armstrong ⭐⭐⭐⭐☆

Determiná si un número es Armstrong (suma de sus dígitos elevados a la cantidad de dígitos igual al número).

Ejemplo: 153 = 1³ + 5³ + 3³ = 153

Orientación:


Ejercicio 4.33 - Simulación de Cajero Automático ⭐⭐⭐⭐⭐

Simulá un cajero con saldo inicial. Menú: depositar, retirar, consultar, salir.

Requisitos:

Orientación:


Ejercicio 4.34 - Criba de Eratóstenes ⭐⭐⭐⭐⭐

Encontrá todos los números primos hasta N usando la Criba de Eratóstenes.

Algoritmo:

  1. Creá array booleano de tamaño N+1, todos en true

  2. Marcá 0 y 1 como no primos

  3. Para cada número i de 2 a √N:

    • Si i es primo (marcado true):

      • Marcá todos sus múltiplos como no primos

  4. Los que quedaron en true son primos

Orientación:


Ejercicio 4.35 - s Adicionales de Patrones ⭐⭐☆☆☆

Ejercicio 4.36 - Pirámide Centrada ⭐⭐⭐⭐⭐

Dibujá una pirámide centrada de asteriscos.

Ejemplo (N=5):

    *
   ***
  *****
 *******
*********

Orientación:


Ejercicio 4.37 - Rombo ⭐⭐⭐⭐⭐

Dibujá un rombo de asteriscos.

Orientación:


Problemas de Lazos Anidados

Ejercicio 4.38 - Tabla de Multiplicar Completa ⭐⭐⭐⭐☆

Mostrá tabla de multiplicar del 1 al 10 (todas las tablas).

Orientación:


Ejercicio 4.39 - Números Primos en Rango ⭐⭐⭐⭐☆

Mostrá todos los números primos entre A y B.

Orientación:


Problemas de Validación y Control

Ejercicio 4.40 - Juego de Adivinanza Mejorado ⭐⭐⭐⭐⭐

El programa elige un número aleatorio. El usuario tiene máximo 7 intentos.

Orientación:


Notas Finales

Estas consignas cubren todos los aspectos de lazos: for, while, do-while, lazos anidados, control de flujo y validación con repetición.

Ejercicio 4.41 - Mostrar Argumentos ⭐☆☆☆☆

Mostrá todos los argumentos recibidos.

Orientación:

1
2
3
4
5
6
int main(int argc, char *argv[]) {
    printf("Cantidad de argumentos: %d\n", argc);
    for (int i = 0; i < argc; i++) {
        printf("argv[%d] = %s\n", i, argv[i]);
    }
}

Ejercicio 4.42 - Saludo Personalizado ⭐☆☆☆☆

Lee un nombre desde argv y saludá.

Uso: ./saludo Juan

Orientación:


Ejercicio 4.43 - Suma de Dos Números ⭐⭐☆☆☆

Sumá dos números pasados como argumentos.

Uso: ./suma 5 3

Orientación:


Ejercicio 4.44 - Calculadora Simple ⭐⭐⭐☆☆

Implementá calculadora: ./calc <num1> <operador> <num2>

Uso: ./calc 10 + 5

Orientación:


Ejercicio 4.45 - Flags Booleanos ⭐⭐⭐☆☆

Procesá flags opcionales -v (verbose) y -h (help).

Uso: ./programa -v archivo.txt

Orientación:


Ejercicio 4.46 - Concatenar Argumentos ⭐⭐☆☆☆

Concatená todos los argumentos (excepto argv[0]) en un string.

Uso: ./concat Hola mundo desde C Salida: Hola mundo desde C

Orientación:


Ejercicio 4.47 - Conversor de Temperatura ⭐⭐⭐☆☆

Convertí temperatura según flags.

Uso: ./temp -c 100 (Celsius a Fahrenheit) Uso: ./temp -f 212 (Fahrenheit a Celsius)

Orientación:


Ejercicio 4.48 - Procesar Archivo(s) ⭐⭐⭐☆☆

Lee uno o más archivos pasados como argumentos y mostrá su contenido.

Uso: ./cat archivo1.txt archivo2.txt

Orientación:


Ejercicio 4.49 - Flag con Valor ⭐⭐⭐⭐☆

Procesá flag que requiere un valor: -n <cantidad>

Uso: ./programa -n 10 archivo.txt

Orientación:

1
2
3
4
5
6
7
8
9
for (int i = 1; i < argc; i++) {
    if (strcmp(argv[i], "-n") == 0) {
        if (i + 1 < argc) {
            cantidad = atoi(argv[++i]);  // Incrementa i
        } else {
            fprintf(stderr, "Flag -n requiere valor\n");
        }
    }
}

Ejercicio 4.50 - Múltiples Flags ⭐⭐⭐⭐☆

Implementá programa con varios flags: -v (verbose), -o <salida>, -n <num>

Uso: ./programa -v -o salida.txt -n 100 entrada.txt

Orientación:


Ejercicio 4.51 - Validación de Argumentos ⭐⭐⭐☆☆

Validá que números sean realmente números.

Orientación:

1
2
3
4
5
6
char *endptr;
long num = strtol(argv[1], &endptr, 10);
if (*endptr != '\0') {
    fprintf(stderr, "Error: '%s' no es un número válido\n", argv[1]);
    return 1;
}

Ejercicio 4.52 - Ayuda Automática ⭐⭐⭐☆☆

Mostrá ayuda si se pasa -h o --help, o si argumentos son incorrectos.

Orientación:

1
2
3
4
5
6
7
8
9
10
11
12
13
void mostrar_ayuda(const char *programa) {
    printf("Uso: %s [opciones] archivo\n", programa);
    printf("Opciones:\n");
    printf("  -h, --help    Mostrar esta ayuda\n");
    printf("  -v            Modo verbose\n");
    printf("  -o <archivo>  Archivo de salida\n");
}

if (argc < 2 || strcmp(argv[1], "-h") == 0 || 
    strcmp(argv[1], "--help") == 0) {
    mostrar_ayuda(argv[0]);
    return 0;
}

Ejercicio 4.53 - Grep Simplificado ⭐⭐⭐⭐☆

Buscá patrón en archivo(s).

Uso: ./grep "patron" archivo1.txt archivo2.txt

Orientación:


Ejercicio 4.54 - Wc (Word Count) Simplificado ⭐⭐⭐⭐☆

Contá líneas, palabras y caracteres de archivos.

Uso: ./wc [-l] [-w] [-c] archivo(s)

Flags:

Orientación:


Ejercicio 4.55 - Sort con Opciones ⭐⭐⭐⭐⭐

Ordená líneas de archivo con opciones.

Uso: ./sort [-r] [-n] archivo.txt

Flags:

Orientación:


Ejercicio 4.56 - Procesamiento de Lote ⭐⭐⭐⭐⭐

Aplicá operación a múltiples archivos.

Uso: ./batch -op <operacion> archivo1 archivo2 ...

Operaciones: upper, lower, reverse, count

Orientación:


Ejercicio 4.57 - Configuración desde Archivo y Args ⭐⭐⭐⭐⭐

Leé configuración de archivo, permitiendo override por línea de comandos.

Uso: ./programa -c config.txt -n 50

Orientación:


Ejercicio 4.58 - Pipeline Simulado ⭐⭐⭐⭐⭐

Implementá programa que puede leer de stdin o archivo.

Uso:

Orientación:

1
2
3
4
5
6
FILE *entrada;
if (argc > 1) {
    entrada = fopen(argv[1], "r");
} else {
    entrada = stdin;  // Lee de stdin
}

Ejercicio 4.59 - Getopt Simplificado ⭐⭐⭐⭐⭐

Implementá tu propia versión simplificada de getopt para parsear flags.

Orientación:

int getopt_simple(int argc, char *argv[], const char *optstring);

Ejercicio 4.60 - Sistema de Comandos ⭐⭐⭐⭐⭐

Implementá programa con subcomandos estilo Git.

Uso:

Orientación:


Notas Finales

Estas consignas cubren procesamiento de argumentos desde básico hasta sistemas complejos estilo herramientas Unix, esenciales para programas de línea de comandos profesionales.