Tutoriales de informática - Abrirllave.com

Abrirllave.com

Ejercicio de lenguaje C - Validar fecha

Escribir en lenguaje C un programa que:

1º) Pida por teclado una fecha en tres variables: día, mes y año (datos enteros).

2º) Muestre por pantalla:

Nota 1: Para que una fecha sea válida, se tiene que cumplir que:

Nota 2:

Nota 3: Son bisiestos todos los años múltiplos de 4, excepto aquellos que son múltiplos de 100 pero no de 400.

En pantalla se verá, por ejemplo:

Visualización en pantalla del programa Validar fecha, siendo esta incorrecta, resuelto en lenguaje C.

Ahora bien, si la fecha es correcta, se verá:

Visualización en pantalla del programa Validar fecha, siendo esta correcta, resuelto en lenguaje C.

Solución 1: anidando instrucciones if y switch

Véase que, en el código fuente de la primera solución propuesta, hay seis anidamientos de instrucciones if y switch.

/* Programa: Validar fecha (Solución 1) */

#include <conio.h>
#include <stdio.h>

int main()
{
    int dia, mes, anio;

    printf( "\n   Introduzca d%ca: ", 161 );
    scanf( "%d", &dia );
    printf( "\n   Introduzca mes: " );
    scanf( "%d", &mes );
    printf( "\n   Introduzca a%co: ", 164 );
    scanf( "%d", &anio );

    if ( mes >= 1 && mes <= 12 )
    {
        switch ( mes )
        {
            case  1 :
            case  3 :
            case  5 :
            case  7 :
            case  8 :
            case 10 :
            case 12 : if ( dia >= 1 && dia <= 31 )
                          printf( "\n   FECHA CORRECTA" );
                      else
                          printf( "\n   FECHA INCORRECTA" );
                      break;

            case  4 :
            case  6 :
            case  9 :
            case 11 : if ( dia >= 1 && dia <= 30 )
                          printf( "\n   FECHA CORRECTA" );
                      else
                          printf( "\n   FECHA INCORRECTA" );
                      break;

            case  2 : if( anio % 4 == 0 && anio % 100 != 0 || anio % 400 == 0 )
                          if ( dia >= 1 && dia <= 29 )
                              printf( "\n   FECHA CORRECTA" );
                          else
                              printf( "\n   FECHA INCORRECTA" );
                      else
                          if ( dia >= 1 && dia <= 28 )
                              printf( "\n   FECHA CORRECTA" );
                          else
                              printf( "\n   FECHA INCORRECTA" );
        }
    }
    else
        printf( "\n   FECHA INCORRECTA" );

    getch(); /* Pausa */

    return 0;
}

Solución 2: utilizando una variable interruptor

A continuación, se muestra una segunda solución, en la cual, se hace uso de una variable interruptor (fecha_correcta), también llamada bandera, centinela o conmutador:

/* Programa: Validar fecha (Solución 2) */

#include <conio.h>
#include <stdio.h>

int main()
{
    int dia, mes, anio, fecha_correcta;

    printf( "\n   Introduzca d%ca: ", 161 );
    scanf( "%d", &dia );
    printf( "\n   Introduzca mes: " );
    scanf( "%d", &mes );
    printf( "\n   Introduzca a%co: ", 164 );
    scanf( "%d", &anio );

    fecha_correcta = 0;

    if ( mes >= 1 && mes <= 12 )
    {
        switch ( mes )
        {
            case  1 :
            case  3 :
            case  5 :
            case  7 :
            case  8 :
            case 10 :
            case 12 : if ( dia >= 1 && dia <= 31 )
                          fecha_correcta = 1;
                      break;

            case  4 :
            case  6 :
            case  9 :
            case 11 : if ( dia >= 1 && dia <= 30 )
                         fecha_correcta = 1;
                      break;

            case  2 : if ( anio % 4 == 0 && anio % 100 != 0 || anio % 400 == 0 )
                      {
                          if ( dia >= 1 && dia <= 29 )
                              fecha_correcta = 1;
                      }
                      else
                          if ( dia >= 1 && dia <= 28 )
                              fecha_correcta = 1;
        }
    }

    /* Llegados a este punto, según el valor de fecha_correcta,
       por pantalla se mostrará un mensaje u otro. */

    if ( fecha_correcta )
        printf( "\n   FECHA CORRECTA" );
    else
        printf( "\n   FECHA INCORRECTA" );

    getch(); /* Pausa */

    return 0;
}

Solución 3: utilizando una nueva variable

Por último, se propone una tercera solución, donde se utiliza una nueva variable llamada dia_maximo:

/* Programa: Validar fecha (Solución 3) */

#include <conio.h>
#include <stdio.h>

int main()
{
    int dia_maximo, dia, mes, anio, fecha_correcta;

    printf( "\n   Introduzca d%ca: ", 161 );
    scanf( "%d", &dia );
    printf( "\n   Introduzca mes: " );
    scanf( "%d", &mes );
    printf( "\n   Introduzca a%co: ", 164 );
    scanf( "%d", &anio );

    fecha_correcta = 0;

    if ( mes >= 1 && mes <= 12 )
    {
        switch ( mes )
        {
            case  1 :
            case  3 :
            case  5 :
            case  7 :
            case  8 :
            case 10 :
            case 12 : dia_maximo = 31;
                      break;

            case  4 :
            case  6 :
            case  9 :
            case 11 : dia_maximo = 30;
                      break;

            case  2 : if ( anio % 4 == 0 && anio % 100 != 0 || anio % 400 == 0 )
                          dia_maximo = 29;
                      else
                          dia_maximo = 28;
        }

        if ( dia >= 1 && dia <= dia_maximo )
            fecha_correcta = 1;
    }

    if ( fecha_correcta )
        printf( "\n   FECHA CORRECTA" );
    else
        printf( "\n   FECHA INCORRECTA" );

    getch(); /* Pausa */

    return 0;
}