Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<stdio.h>
- //#include<conio.h> //getch()
- /* Ingresa fecha: mes, dia y anio, y retorna la fecha si es valida.
- */
- #define true 1
- #define false 0
- #define FEBRERO 2
- //#define esAnioBisiesto(x) ((x%4 == 0)&&( x%100!=0||x%400==0))
- unsigned short int digitaNumeroDeMes(void);
- unsigned short int digitaNumeroDeDia(unsigned short int mes);
- unsigned long int digitaAnio(unsigned short int dia, unsigned short int mes);
- unsigned short int esAnioBisiesto(unsigned long int anio);
- void limpiaBufferIntermedio(void);
- void mainLoop(void);
- /*Abril, Junio, Septiembre y Noviembre. = 30 dias
- Enero, Marzo, Mayo, Julio, Agosto, Octubre y Diciembre = 31 dias
- Febrero = 28 dias excepto anio bisiesto que son 29 dias
- */
- /*Casos
- 1.- mes == Febrero y dias mayor a 28
- 2.- mes = Abril, Junio, Septiembre y Noviembre && dia mayor a 30
- 3.- Un anio es bisiesto si cumple:
- divisible por 4 y (no es divisible por 100 v si es divisible por 400)
- 4.- Corregir la adquisicion de datos, da muchos errores, dejar de usar scanf
- y utilizar getchar() o fgets() para formar un string de tamanio fijo con la linea ingresada
- luego parsear los datos de esa linea ingresada y obtener los caracteres numericos
- y descartar cualquier otro caracter, luego convertir a un tipo de datos entero.
- De esta forma tambien nos olvidamos del buffer intermedio.
- */
- struct MonthDay{
- unsigned char *mes;
- unsigned short int dias;
- };
- //typedef MonthDay * PMonthDay;
- struct MonthDay mesPorDias[]={ {"Enero",31}, //0
- {"Febrero",29}, // solo cada cuatro años
- {"Marzo",31}, //2
- {"Abril",30},
- {"Mayo",31}, //4
- {"Junio",30},
- {"Julio",31}, //6
- {"Agosto",31}, //7
- {"Septiembre",30},
- {"Octubre",31}, //9
- {"Noviembre",30},
- {"Diciembre",31} //11
- };
- //#define N_MESES sizeof(mesPordias)/sizeof(mesPorDias[0])
- //PMonthDay p = &mesPorDias[0];
- /*enum Mes {ENERO = 1, FEBRERO, MARZO, ABRIL, MAYO, JUNIO,JULIO,AGOSTO,SEPTIEMBRE,
- OCTUBRE,NOVIEMBRE, DICIEMBRE};*/
- int main (int argc, char* argv[]){
- mainLoop();
- return 0;
- }
- void mainLoop(void){
- unsigned char seguirLoop;
- unsigned short int mes,dia;
- do{
- dia = digitaNumeroDeDia(mes=digitaNumeroDeMes());
- printf("\nLa fecha indicada es: %hu de %s del %lu\n",dia,mesPorDias[mes-1].mes/*(p+mes-1)->mes*/,digitaAnio(dia, mes));
- printf("\n%c Quieres continuar (Y/N)?",168);
- limpiaBufferIntermedio();
- scanf("%c",&seguirLoop);
- system("cls");
- }while( seguirLoop == 'y' || seguirLoop == 'Y' );
- system("pause");
- }
- // entre 1 y 12 son los meses
- unsigned short int digitaNumeroDeMes(void){
- unsigned short int seguirMes;
- unsigned short int mes;
- printf("\n");
- do{
- printf("Digite el numero del mes que desea ver: ");
- scanf("%hu", &mes);
- seguirMes = false;
- if(mes<1 || mes>12){
- printf("\n Error: El numero del mes ingresado no es valido, vuelva a intentarlo !!!\n\n");
- seguirMes = true;
- }
- }while(seguirMes);
- return mes;
- }
- // dias entre 1 y 31 maximo dependiendo del mes.
- unsigned short int digitaNumeroDeDia(unsigned short int mes){
- unsigned short int seguirDia;
- unsigned short int dia;
- do{
- printf("\nDigite el dia del respectivo mes: ");
- scanf("%hu", &dia);
- seguirDia = false;
- if(dia<1 || dia>mesPorDias[mes-1].dias){ // dia inexistente
- printf("\n Error: El dia %hu indicado no es valido, vuelva a intentarlo !!!\n",dia);
- seguirDia = true;
- }
- }while(seguirDia);
- return dia;
- }
- unsigned long int digitaAnio(unsigned short int dias, unsigned short int mes){
- unsigned short int seguirAnio;
- unsigned long int anio;
- do{
- printf("\nDigite el anio del respectivo mes: ");
- scanf("%ul", &anio);
- seguirAnio = false;
- if((mes == FEBRERO && dias == 29) && !esAnioBisiesto(anio)){
- printf("\n Error: Ingrese anio bisiesto, vuelva a intentarlo !!!\n");
- seguirAnio = true;
- }
- if(anio<0)
- printf("\n Error:El numero del anio ingresado no es valido, vuelva a intentarlo !!!\n");
- }while(anio<0 || seguirAnio);
- return anio;
- }
- unsigned short int esAnioBisiesto(unsigned long int anio){
- return ((anio%4 == 0)&&( anio%100!=0||anio%400==0)); // retorna si anio es bisiesto o no
- }
- void limpiaBufferIntermedio(void){
- char c;
- while((c=getchar())!='\n'&& c!=EOF);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement