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:
- "FECHA CORRECTA", en el caso de que la fecha sea válida.
- "FECHA INCORRECTA", en el caso de que la fecha no sea válida.
Nota 1: Para que una fecha sea válida, se tiene que cumplir que:
- El mes debe ser mayor o igual que 1 y menor o igual que 12.
- El día debe ser mayor o igual que 1 y menor o igual que un número, el cual dependerá del mes y año introducidos por el usuario.
Nota 2:
- Tienen 31 días: enero, marzo, mayo, julio, agosto, octubre y diciembre.
- Tienen 30 días: abril, junio, septiembre y noviembre.
- Tiene 29 días: febrero (si el año es bisiesto).
- Tiene 28 días: febrero (si el año no es bisiesto).
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:
Ahora bien, si la fecha es correcta, se verá:
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;
}