menu de ejercicios en c

En este ejercicio hay que crear un programa que muestre en un menú todos los ejercicios realizados anteriormente para poder visualizarlos. Para la realización de este ejercicio voy a crear funciones en archivos externos para luego llamarlas en el archivo principal.

Se necesitan tres archivos:
main.c -> es el archivo principal en el que va el menú.
ejercicios.c -> es del tipo source file, en este se crean las funciones de los ejercicios.
ejercicios.h -> es del tipo header file, en este definen las funciones que se van a utilizar en el principal. Este archivo tiene que estar incluido en main.c.
—————main.c—————
[code lang=»c»]

#include <stdio.h>
#include "ejercicios.h"
main() {
    int menu;
    char fin;
    do {
        printf("\nMostrar los ejercicios anteriores");
        printf("\n1. Ejercicio 2 del manual.");
        printf("\n2. Ejercicio 1 del manual.");
        printf("\n3. Ejericio caracteres ASCII desde el 1 hasta el 164.");
        printf("\n4. Ejericio caracteres ASCII desde el 32 hasta el 164.");
        printf("\n5. Ejericio pasar un numero decimal a hexadecimal y octal.");
        printf("\n6. Ejericio ecuacion de 2º.");
        printf("\n7. Ejericio unsigned short.");
        printf("\n8. Ejericio division entera y real.");
        printf("\n9. Ejericio conversor de metro a pulgadas.");
        printf("\n10. Ejericio conversor de dolar a euro.");
        printf("\n11. Ejericio de post y pre incremento.");
        printf("\n12. Ejericio minicalculadora.");
        printf("\n13. Ejericio 5 manual.");
        printf("\n14. Ejericio 4 manual.");
        printf("\n15. Ejericio 3 manual.");
        printf("\n16. Ejericio union, struc, enum.");
        printf("\n17. Ejericio adivinar.");
        printf("\n18. Ejericio generar numero aleatorio.");
        printf("\n19. Ejericio tabla de multiplicar.");
        printf("\n20. Ejericio tabla de multiplicar con menu.");
        printf("\n21. Ejericio ecuacion de segundo grado con comprobacion de errores.");
        printf("\nPulsa 0 para salir del programa.");
        printf("\n\nIntroduce el numero de ejercicio a mostrar: ");
        scanf("%d", &menu);
        while (getchar() != '\n');
        switch (menu) {
            case 1:
                printf("Ejercicio 2 del manual.\n");
                ejer2_manual();
                break;
            case 2:
                printf("Ejericio 1 del manual.\n");
                ejer1_manual();
                break;
            case 3:
                printf("Ejericio caracteres ASCII desde el 1 hasta el 164.\n");
                ASCII_1_164();
                break;
            case 4:
                printf("Ejericio caracteres ASCII desde el 32 hasta el 164.\n");
                ASCII_32_164();
                break;
            case 5:
                printf("Ejericio pasar un numero decimal a hexadecimal y octal.\n");
                dec_oct_hex();
                break;
            case 6:
                printf("Ejericio ecuacion de 2º.\n");
                ecuacion();
                break;
            case 7:
                printf("Ejericio unsigned short.\n");
                uns_short();
                break;
            case 8:
                printf("Ejericio division entera y real.\n");
                div_entera_real();
                break;
            case 9:
                printf("Ejericio conversor de metro a pulgadas.\n");
                metros_pulgadas();
                break;
            case 10:
                printf("Ejericio conversor de dolar a euro.\n");
                USD_euros();
                break;
            case 11:
                printf("Ejericio de post y pre incremento.\n");
                post_pre_incremento();
                break;
            case 12:
                printf("Ejericio minicalculadora.\n");
                minicalculadora();
                break;
            case 13:
                printf("Ejericio 5 manual.\n");
                ejer5_manual();
                break;
            case 14:
                printf("Ejericio 4 manual.\n");
                ejer4_manual();
                break;
            case 15:
                printf("Ejericio 3 manual.\n");
                ejer3_manual();
                break;
            case 16:
                printf("Ejericio union, struc, enum.\n");
                union_struc_enum();
                break;
            case 17:
                printf("Ejericio adivinar.\n");
                adivinar();
                break;
            case 18:
                printf("Ejericio generar numero aleatorio.\n");
                random();
                break;
            case 19:
                printf("Ejericio tabla de multiplicar.\n");
                tabla_multiplicar();
                break;
            case 20:
                printf("Ejericio tabla de multiplicar con menu.\n");
                tabla_multiplicar_menu();
                break;
            case 21:
                printf("Ejericio ecuacion de segundo grado con comprobacion de errores.\n");
                ecuacion_comp_errores();
                break;
            case 0:
                printf("\nVa a salir del programa.");
                printf("\n¿Estas seguro? s/n...");
                scanf("%c", &fin);
                if (fin == 's') return;
                break;
            default:
                printf("\n\nNo ha introducido un numero valido.");
                break;
        }
        while (getchar() != '\n');
        printf("\nPulse una tecla para continuar: ");
        getchar();
    } while (1);
    return;
}

[/code]
—————ejercicios.c—————
[code lang=»c»]

#include <stdio.h>
#include <math.h>
#include <limits.h>
#include <float.h>
#include <stdlib.h>
#include <time.h>
int ejer2_manual() {
    char car;
    printf("Escriba un caracter: ");
    car = getchar();
    printf("\nEl caracter introducido es %c.\n", car);
    return 0;
}
int ejer1_manual() {
    printf("Primer programa\n");
    return 0;
}
int ASCII_1_164(void) {
    int i;
    printf("Los Caracteres ASCII son: \n");
    for (i = 1; i <= 164; i++) {
        printf("%c %d \t", i, i);
    }
    return 0;
}
int ASCII_32_164(void) {
    int i;
    printf("Los Caracteres ASCII son: \n");
    for (i = 32; i <= 164; i++) {
        if (i < 97 || i > 122)
            printf("%c %d \t", i, i);
    }
    return 0;
}
int dec_oct_hex(void) {
    int decimal;
    printf("\nIntroduce un número entero: ");
    scanf("%d", &decimal);
    printf("\n%d en hexadecimal es %X y en octal %o", decimal, decimal, decimal);
    return 0;
}
int ecuacion(void) {
    float a, b, c, x1, x2;
    printf("\nIntroduce el valor para a:");
    scanf("%f", &a);
    printf("\nIntroduce el valor para b:");
    scanf("%f", &b);
    printf("\nIntroduce el valor para c:");
    scanf("%f", &c);
    x1 = (-b + sqrt(b * b - 4 * a * c)) / 2 * a;
    x2 = (-b - sqrt(b * b - 4 * a * c)) / 2 * a;
    printf("\n%fx^2 + %fx + %f = 0 --> Solución 1: %f Solución 2: %f", a, b, c, x1, x2);
    return 0;
}
int uns_short(void) {
    unsigned short int i = 65534;
    i += 3;
    printf("\ni es un unsigned short int y después de sumar 65534 + 3 en i hay %d", i);
    printf("\n[El valor máximo a almacenar en un unsigned short int es %d]", USHRT_MAX);
    printf("\nHabría que utilizar un tipo superior, un int (sistemas 32 bits) o un long");
    return 0;
}
int div_entera_real(void) {
    float f1 = 5 / 2, f2 = 5.0 / 2.0;
    printf("\nEl valor de f1 es %f (5/2 da como resultado 3 por ser 5 y 2 números enteros --> división entera)", f1);
    printf("\nEl valor de f2 es %f (5.0/2.0 ambos son números reales --> división real)", f2);
    return 0;
}
int metros_pulgadas(void) {
    float metros;
    printf("\nMetros: ");
    scanf("%f", &metros);
    printf("\n%f metros son %.5f pulgadas", metros, metros * 39.3700787);
    return 0;
}
int USD_euros(void) {
    float usd, tipocambio = 0.765641;
    printf("\nUSD: ");
    scanf("%f", &usd);
    printf("\nEn euros es: %.2f E", usd * tipocambio);
    return 0;
}
int post_pre_incremento(void) {
    int a = 30, b = 11;
    printf("\nEl contenido de la variable a es %d", ++a);
    printf("\nEl contenido de la variable a es %d", a++);
    printf("\nEl contenido de la variable a es %d", a);
    a = b++;
    printf("\nEl contenido de a es %d", a);
    a = ++b;
    printf("\nEl contenido de a es %d", a);
    return 0;
}
int minicalculadora(void) {
    float a, b;
    printf("\nIntroduce a: ");
    scanf("%f", &a);
    printf("\nIntroduce b: ");
    scanf("%f", &b);
    printf("\n%f + %f = %f", a, b, a + b);
    printf("\n%f - %f = %f", a, b, a - b);
    printf("\n%f * %f = %f", a, b, a * b);
    printf("\n%f : %f = %f (división real)", a, b, a / b);
    printf("\n%f : %f = %d (división entera)", a, b, (int) a / (int) b);
    printf("\nResto de la división entera de %f : %f es %d", a, b, (int) a % (int) b);
    return 0;
}
int ejer5_manual() {
    char nombre[20];
    printf("Hola, me llamo Ordenador, y tu?\n");
    scanf("%s", &nombre[0]);
    printf("Me alegro de conocerte %s\n", nombre);
    return 0;
}
int ejer4_manual() {
    char a;
    short int b;
    int c;
    long int d;
    unsigned char e;
    unsigned short int f;
    unsigned int g;
    unsigned long int h;
    float i;
    double j;
    long double k;
    printf("Longitud de cada uno de los tipos basicos \n\n");
    printf("La longitud de char a= %d\n", sizeof (a));
    printf("La longitud de short int b= %d\n", sizeof (b));
    printf("La longitud de int c= %d\n", sizeof (c));
    printf("La longitud de long int d= %d\n", sizeof (d));
    printf("La longitud de unsigned char e= %d\n", sizeof (e));
    printf("La longitud de unsigned short int f= %d\n", sizeof (f));
    printf("La longitud de unsigned int g= %d\n", sizeof (g));
    printf("La longitud de unsigned long int h= %d\n", sizeof (h));
    printf("La longitud de float i= %d\n", sizeof (i));
    printf("La longitud de double j= %d\n", sizeof (j));
    printf("La longitud de long double k= %d\n", sizeof (k));
    printf("\nValores minimos y maximos de cada uno de los tipos\n\n");
    printf("Minimo y maximo de char a= %d\t\t%d\n", CHAR_MIN, CHAR_MAX);
    printf("Minimo y maximo de short int b=%d\t\t%d\n", SHRT_MIN, SHRT_MAX);
    printf("Minimo y maximo de int c= %d\t\t%d\n", INT_MIN, INT_MAX);
    printf("Minimo y maximo de long int d=%d\t\t%d\n", LONG_MIN, LONG_MAX);
    printf("Maximo de unsigned char e= %d\n", UCHAR_MAX);
    printf("Maximo de unsigned short int f= %d\n", USHRT_MAX);
    printf("Maximo de unsigned int g= %d\n", UINT_MAX);
    printf("Maximo de unsigned long int h= %d\n", ULONG_MAX);
    printf("Minimo y maximo de float i= %d\t\t%d\n", FLT_MIN, FLT_MAX);
    printf("Minimo y maximo de double j= %d\t\t%d\n", DBL_MIN, DBL_MAX);
    printf("Minimo y maximo de long double k=%d\t\t%d\n", LDBL_MIN, LDBL_MAX);
    return 0;
}
#define N 3
ejer3_manual() {
    struct agenda {
        char nombre[25];
        char telefono[10];
        int edad;
    };
    struct agenda amigos[N] = {
        {"Pepe", "913472314", 18},
        {"Juan", "915547623", 19},
        {"Rosa", "917456778", 21}};
    int i, clave;
    do {
        printf("\nIntroduzca la clave (0 para terminar): ");
        scanf("%d", &clave);
    } while (clave != 1234 && clave != 0);
    if (clave == 0) {
        printf("\nPrograma terminado - usuario ha pulsado cero");
    } else {
        for (i = 0; i < N; ++i) {
            printf("\nAmigo %s\t telefono %s\t edad %d", amigos[i].nombre,
                    amigos[i].telefono, amigos[i].edad);
        }
        printf("\n");
    }
    return 0;
}
int union_struc_enum(void) {
    enum diasSemana {
        LUNES = 1,
        MARTES = 2,
        MIERCOLES = 3,
        JUEVES = 4,
        VIERNES = 5,
        SABADO = 6,
        DOMINGO = 7
    }; // empezando en 1
    enum diasSemana hoy = MIERCOLES;
    // Struct - ver ejercicio 3 manual UCM
    union dato {
        int i;
        char ch;
    };
    union dato midato;
    printf("\nhoy es %d", hoy);
    midato.i = 6200;
    printf("\nmi dato contiene un entero: %d  [si pregunto por el char %c]", midato.i, midato.ch);
    midato.ch = 'A';
    printf("\nahora mi dato contiene un caracter: %c [si pregunto por el int %d]", midato.ch, midato.i);
    return 0;
}
int adivinar ()
{
  int secreto,numero,numeromaximo,opcion,intentos=0;
  clock_t t_ini, t_fin;
  double secs;
  /* Inicializar generador de números aleatorios*/
  srand (time(NULL));
  do{
      printf ("\n ADIVINA UN NÚMERO \n ----- MENÚ ----");
      printf ("\n1 .- El número a adivinar estará entre 0 y 10");
      printf ("\n2 .- El número a adivinar estará entre 0 y un número que indique");
      printf ("\n3 .- Finalizar el juego");
      printf ("\nElige la opcion deseada: ");
      scanf ("%d",&opcion);
      switch (opcion){
          case 1:
                numeromaximo = 10;
                break;
          case 2:
                printf ("\nIndique el valor máximo a adivinar: ");
                scanf ("%d",&numeromaximo);
                break;
          case 3:
                printf ("\n Juego finalizado");
                return 0;
                break;
          default:
            printf ("\nOpción no válida.");
            continue;
      }
      printf ("\nEmpieza el juego - adivina un número entre 1 y %d",numeromaximo);
    /* generar el número secreto: */
      secreto = rand() % numeromaximo + 1;
      t_ini = clock();
      do { // Bucle del juego
        printf ("\nUn número:");
        scanf ("%d",&numero);
        intentos++;
        if (secreto == numero) {
            printf ("\nMUY BIEN, LO HAS ADIVINADO [En %d intentos]",intentos);
            break;
        }
        if (secreto >= numero)
        {
            printf ("\nTe has quedado corto!!!");
        }
        else
        {
            printf ("\nTe has pasado!!!!");
        }
      } while (1);
      t_fin = clock();
      secs = (double)(t_fin - t_ini) / CLOCKS_PER_SEC;
      printf("\nTiempo empleado: %.16g milisegundos\n", secs * 1000.0);
    }while (1);
  return 0;
}
int generar_random (void){
     int numero,i;
     // Inicialización generador de números aleatorios
     srand (time (NULL));
     printf ("\n GENERACIÓN DE NÚMEROS ALEATORIOS");
     do {
         printf ("\nUn número aleatorio: %d",rand() % 50); // un número aleatorio entre 0 y 49
         printf ("\nOtro número aleatorio (s/n)? ");
     }while (getchar() != 'n');
     return 0;
 }
int tabla_multiplicar_menu (void){
     int numero,i;
     do {
         printf ("\nIntroduce un número entero: ");
         scanf ("%d",&numero);
         printf ("\nLa tabla del %d es: ",numero);
         for (i=0;i<=10;i++){
             printf ("\n%3d x %3d = %3d",numero, i , numero * i);
         }
         printf ("\nQuieres calcular otro número (n para salir, cualquier otra tecla para continuar)");
     }while (getchar() != 'n');
     return 0;
 }
int tabla_multiplicar (void){
     int numero,i;
     printf ("\nIntroduce un número entero: ");
     scanf ("%d",&numero);
     printf ("\nLa tabla del %d es: ",numero);
     for (i=0;i<=10;i++){
         printf ("\n%3d x %3d = %3d",numero, i , numero * i);
     }
     return 0;
 }
int ecuacion_comp_errores (void)
{
    float a, b, c, x1, x2;
    printf ("\nIntroduce el valor para a:");
    scanf ("%f",&a);
    printf ("\nIntroduce el valor para b:");
    scanf ("%f",&b);
    printf ("\nIntroduce el valor para c:");
    scanf ("%f",&c);
    if (2*a == 0)
    {
        printf ("\nError - división por cero.");
        return -1;
    }
    if ((b*b-4*a*c)<0)
    {
        printf ("\nError - no es posible calcular raiz cuadrada de un número negativo.");
        return -1;
    }
    x1 =  (-b+sqrt(b*b-4*a*c))/2*a;
    x2 =  (-b-sqrt(b*b-4*a*c))/2*a;
    printf ("\n%fx^2 + %fx + %f = 0 --> Solución 1: %f Solución 2: %f",a,b,c,x1,x2);
    return 0;
}

[/code]
—————ejercicios.h—————
[code lang=»c»]

#ifndef EJERCICIOS_H
#define	EJERCICIOS_H
int ejer2_manual();
int ejer1_manual();
int ASCII_1_164(void);
int ASCII_32_164(void);
int dec_oct_hex(void);
int ecuacion(void);
int uns_short(void);
int div_entera_real(void);
int metros_pulgadas(void);
int USD_euros(void);
int post_pre_incremento(void);
int minicalculadora(void);
int ejer5_manual();
int ejer4_manual();
ejer3_manual();
int union_struc_enum(void);
int adivinar ();
int generar_random (void);
int tabla_multiplicar_menu (void);
int tabla_multiplicar (void);
int ecuacion_comp_errores (void);
#ifdef	__cplusplus
extern "C" {
#endif
#ifdef	__cplusplus
}
#endif
#endif	/* EJERCICIOS_H */

[/code]