#include<stdio.h>
#include<stdlib.h>
int bisiesto(int anyo); //comprueba si una año es bisiesto
int bisiestos(int anyo); //cuenta los bisiestos que hay entre 1900 y cualquier año superior
int diaComienzoAnyo(int anyo); //Averigua que en que dia de la semana comienza un año
int Qdiaes(int anyo,int mes,int dia); //Indica que dia de la semana es una fecha determinada
int ImprimeMes(int anyo,int mes);
int ImprimirCalendarioCompleto(int anyo);
main()
{
int
opc, //opcion
anyo, //año
dia, //dia
diasem, //dia de la semana
mes; //mes
printf("Elige una opcion:\n1.Visualizar calendario del mes\n2.Visualizar calendario completo del año\n3.Saber el dia de la semana de una fecha\n4.Salir\n");
scanf("%d",&opc);
switch(opc)
{
case 1: //Visualizar mes
printf("Introduce un anyo: (A partir de 1900)");
scanf("%d",&anyo);//necesitas verificar
printf("Mes?");
scanf("%d",&mes); //tambien de 1 a 12
ImprimeMes(anyo,mes);
break;
case 2: //Visualizar año completo
printf("Introduce un anyo: (A partir de 1900)");
scanf("%d",&anyo);
ImprimirCalendarioCompleto(anyo);
break;
case 3: //Saber el dia de la fecha
printf("Introduce un anyo: (A partir de 1900)");
scanf("%d",&anyo);
printf("Mes?");
scanf("%d",&mes);
printf("Dia?");
scanf("%d",&dia);
printf("dia:%d",dia);
diasem=Qdiaes(anyo,mes,dia);
switch(diasem)
{
case 1: //LUNES
printf("\nEs Lunes\n");
break;
case 2: //MARTES
printf("\nEs Martes\n");
break;
case 3: //MIERCOLES
printf("\nEs Miercoles\n");
break;
case 4: //JUEVES
printf("\nEs Jueves\n");
break;
case 5: //VIERNES
printf("\nEs Viernes\n");
break;
case 6: //SABADO
printf("\nEs Sabado\n");
break;
case 0: //DOMINGO
printf("\nEs Domingo\n");
break;
}
break;
default: //Salir
break;
}
}
int DiaComienzoAnyo(int anyo)
{
int diacomienzoanyo=0,nobisiestos=0;
nobisiestos=(anyo-bisiestos(anyo))-1900;
if(anyo>1900)
{
if(bisiestos(anyo)>0)
diacomienzoanyo=(bisiestos(anyo)*366)+(nobisiestos*365);
else
diacomienzoanyo=(anyo-bisiestos(anyo))*365;
}
// printf("comienza el dia: %d,nobisiestos=%d,bisiestos=%d\n",diacomienzoanyo%7,nobisiestos,bisiestos(anyo));
return(diacomienzoanyo%7);
}
int bisiesto(anyo) //comprueba si un año es bisiesto
{
int cont,i,bisiesto;
if((anyo%4==0) && ((anyo%100!=0) || (anyo%400==0)))
{
//BISIESTO
bisiesto=1;
// printf("%d\n",anyo);
}
else
{
//NO BISIESTO
bisiesto=0;
}
return(bisiesto);
}
int bisiestos(anyo) //cuenta los bisiestos que hay entre 1900 y cualquier año superior
{
int i,cont=0;
for(i=1900;i<anyo;i++)
{
if( bisiesto(i)==1)
cont++;
}
// printf("\n bisiestos son: %d\n",cont);
return(cont);
}
int Qdiaes(int anyo,int mes,int dia)
{
int mes1=1,dia1=0,esbisiesto,dias=0;
for(mes1=0;mes1<mes;mes1++)
{
if(mes1==1 || mes1 ==3 || mes1 ==5 || mes1==7 || mes1 ==8 || mes1== 10 || mes1==12)
{
dias=dias+31;
}
if(mes1==2)
{
if(bisiesto(anyo)!=0)
{
dias=dias+28; // no es bisiesto
}
else
{
dias=dias+29;
}
}
if(mes1==4 || mes1 ==6 || mes1==9 || mes1==11)
{
dias=dias+30;
}
// printf("%d-%d\n",mes1,dias);
}
dias=dias+dia;
dia1=((DiaComienzoAnyo(anyo))+dias)%7;
// printf("dia1:%d,dias: %d\n%d/%d/%d seria: %d",dia1,dias,anyo,mes,dia,dias%7);
// printf("dia1:%d,DiaComienzoanyo: %d,dias: %d\n",dia1,DiaComienzoAnyo(anyo-1),dias);
return(dia1);
}
int ImprimeMes(int anyo,int mes)
{
int numDias=0,mes1=mes,esbisiesto=0,contdia=0,i,contdias=0;
switch(mes)
{
case 1: printf("--ENERO--");
numDias=numDias+31;
break;
case 3: printf("--MARZO--");
numDias=numDias+31;
break;
case 5: printf("--MAYO--");
numDias=numDias+31;
break;
case 7: printf("--JULIO--");
numDias=numDias+31;
break;
case 8: printf("--AGOSTO--");
numDias=numDias+31;
break;
case 10:printf("--OCTUBRE--");
numDias=numDias+31;
break;
case 12:printf("--DICIEMBRE--");
numDias=numDias+31;
break;
case 2: printf("--FEBRERO--");
if(bisiesto(anyo)!=1)
{
numDias=numDias+28;
}
else
numDias=numDias+29;
break;
case 4: printf("--ABRIL--");
numDias=numDias+30;
break;
case 6: printf("--JUNIO--");
numDias=numDias+30;
break;
case 9: printf("--SEPTIEMBRE--");
numDias=numDias+30;
break;
case 11: printf("--NOVIEMBRE--");
numDias=numDias+30;
break;
}
printf("\n\n[LU][MA][MI][JU][VI][SA][DO]\n----------------------------\n");
switch(Qdiaes(anyo,mes,1))
{
case 1: //Lunes
printf("[1 ]");
contdias=1;
break;
case 2: //Martes
printf("[ ][1 ]");
contdias=2;
break;
case 3: //Miercoles
printf("[ ][ ][1 ]");
contdias=3;
break;
case 4: //Jueves
printf("[ ][ ][ ][1 ]");
contdias=4;
break;
case 5: //Viernes
printf("[ ][ ][ ][ ][1 ]");
contdias=5;
break;
case 6: //Sabado
printf("[ ][ ][ ][ ][ ][1 ]");
contdias=6;
break;
case 0: //Domingo
printf("[ ][ ][ ][ ][ ][ ][1 ]");
contdias=7;
break;
}
for(i=2;i<=numDias;i++)
{
if(contdias%7==0)
{
printf("\n");
}
if(i<10) //pongo eso para que sea mas estetico el calendario
{
printf("[%d ]",i);
contdias++;
}
if(i>=10)
{
printf("[%d]",i);
contdias++;
}
}
printf("\n");
}
ImprimirCalendarioCompleto(anyo)
{
int i;
for(i=1;i<=12;i++)
{
ImprimeMes(anyo,i);
printf("\n");
}
}
if((anyo%400==0) || (anyo%4==0))
if(anyo%100!=0)
bisiesto=1;
#include <stdio.h>
int bisiesto(int);
int cuantos_bisiestos(int);
int numero_dias(int,int,int);
int dias_mes[]={31,28,31,30,31,30,31,31,30,31,30,31}; //Dias que tiene cada mes del año.
char dia_semana[][10]={"Lunes","Martes","Miercoles","Jueves","Viernes","Sabado","Domingo"};
char meses_anyo[][12]={"Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto",
"Septiembre","Octubre","Noviembre","Diciembre"};
main()
{
int dia, mes, anyo,bis,numero,d_semana;
do
{
do
{
printf("Dia: ");
scanf("%d",&dia);
if(dia<1 || dia>31)
printf("\nERROR. INTRODUCE UN DIA ENTRE 1 Y 31\n");
}while(dia<1 || dia>31);
do
{
printf("Mes: ");
scanf("%d",&mes);
if(mes<1 || mes>12)
printf("\nERROR. INTRODUCE UN MES ENTRE 1 Y 12\n");
}while(mes<1 || mes>12);
do
{
printf("Anyo (>1900): ");
scanf("%d",&anyo);
if(anyo<1900)
printf("\nERROR. INTRODUCE UN ANYO SUPERIOR A 1900\n");
}while(anyo<1900);
bis=bisiesto(anyo);
if(bis==1)
dias_mes[1]=29;
if(dia>dias_mes[mes-1])
printf("\nERROR. %s TIENE %d DIAS. VUELVE A ESCRIBIR DIA Y MES\n",meses_anyo[mes-1],dias_mes[mes-1]);
}while(dia>dias_mes[mes-1]);
printf("\nDias entre la fecha y 1 de Enero de 1900: %d\n",numero=numero_dias(dia,mes,anyo));
d_semana=numero%7;
printf("\nEl dia %d/%d/%d era/es/sera '%s'\n",dia,mes,anyo,dia_semana[d_semana]);
}
int bisiesto(int anyo)
{
if((anyo%4==0 && anyo%100!=0) || anyo%400==0 )
return 1;
return 0;
}
int cuantos_bisiestos(int anyo)
{
int i,n=0;
for(i=1900;i<anyo;i++) //Si el anyo introducido es bisiesto no se tiene en cuenta.
{
if(bisiesto(i)==1)
n++;
}
return n;
}
int numero_dias(int dia, int mes, int anyo)
{
int numero=0,i;
numero=365*(anyo-1900);
for(i=0;i<(mes-1);i++)
numero+=dias_mes[i];
numero+=dia-1; //dia-1 porque empezamos a contar desde el dia 1 y no desde el dia 0.
numero+=cuantos_bisiestos(anyo); //Sumo el dia extra de los años que tienen 366 dias.
return numero;
}
genioenred escribió:#include <stdio.h>
int bisiesto(int);
int cuantos_bisiestos(int);
int numero_dias(int,int,int);
int dias_mes[]={31,28,31,30,31,30,31,31,30,31,30,31}; //Dias que tiene cada mes del año.
char dia_semana[][10]={"Lunes","Martes","Miercoles","Jueves","Viernes","Sabado","Domingo"};
char meses_anyo[][12]={"Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto",
"Septiembre","Octubre","Noviembre","Diciembre"};
main()
{
int dia, mes, anyo,bis,numero,d_semana;
do
{
do
{
printf("Dia: ");
scanf("%d",&dia);
if(dia<1 || dia>31)
printf("\nERROR. INTRODUCE UN DIA ENTRE 1 Y 31\n");
}while(dia<1 || dia>31);
do
{
printf("Mes: ");
scanf("%d",&mes);
if(mes<1 || mes>12)
printf("\nERROR. INTRODUCE UN MES ENTRE 1 Y 12\n");
}while(mes<1 || mes>12);
do
{
printf("Anyo (>1900): ");
scanf("%d",&anyo);
if(anyo<1900)
printf("\nERROR. INTRODUCE UN ANYO SUPERIOR A 1900\n");
}while(anyo<1900);
bis=bisiesto(anyo);
if(bis==1)
dias_mes[1]=29;
if(dia>dias_mes[mes-1])
printf("\nERROR. %s TIENE %d DIAS. VUELVE A ESCRIBIR DIA Y MES\n",meses_anyo[mes-1],dias_mes[mes-1]);
}while(dia>dias_mes[mes-1]);
printf("\nDias entre la fecha y 1 de Enero de 1900: %d\n",numero=numero_dias(dia,mes,anyo));
d_semana=numero%7;
printf("\nEl dia %d/%d/%d era/es/sera '%s'\n",dia,mes,anyo,dia_semana[d_semana]);
}
int bisiesto(int anyo)
{
if((anyo%4==0 && anyo%100!=0) || anyo%400==0 )
return 1;
return 0;
}
int cuantos_bisiestos(int anyo)
{
int i,n=0;
for(i=1900;i<anyo;i++) //Si el anyo introducido es bisiesto no se tiene en cuenta.
{
if(bisiesto(i)==1)
n++;
}
return n;
}
int numero_dias(int dia, int mes, int anyo)
{
int numero=0,i;
numero=365*(anyo-1900);
for(i=0;i<(mes-1);i++)
numero+=dias_mes[i];
numero+=dia-1; //dia-1 porque empezamos a contar desde el dia 1 y no desde el dia 0.
numero+=cuantos_bisiestos(anyo); //Sumo el dia extra de los años que tienen 366 dias.
return numero;
}
Te dejo un programa que te dice correctamente el dia de la semana de una fecha (apartado 3 de tu programa). Si tienes alguna duda dimelo.
#include<stdio.h>
#include<stdlib.h>
int validafecha(int dia,int mes,int anyo);
int bisiesto(int anyo); //comprueba si una año es bisiesto
int bisiestos(int anyo); //cuenta los bisiestos que hay entre 1900 y cualquier año superior
int diaComienzoAnyo(int anyo); //Averigua que en que dia de la semana comienza un año
int Qdiaes(int anyo,int mes,int dia); //Indica que dia de la semana es una fecha determinada
int ImprimeMes(int anyo,int mes);
int ImprimirCalendarioCompleto(int anyo);
main()
{
int
opc, //opcion
anyo, //año
dia, //dia
diasem, //dia de la semana
mes, //mes
verdad=0,
fverdadero=0;
while(verdad==0)
{
// system("clear");
printf("Elige una opcion:\n1.Visualizar calendario del mes\n2.Visualizar calendario completo del anyo\n3.Saber el dia de la semana de una fecha\n4.Salir\n");
scanf("%d",&opc);
switch(opc)
{
case 1: //Visualizar mes
fverdadero=0;
while(fverdadero==0)
{
printf("Introduce un anyo: (A partir de 1900)");
scanf("%d",&anyo);//necesitas verificar
printf("Mes?");
scanf("%d",&mes); //tambien de 1 a 12
if(anyo>=1900)
{
if(mes>0 && mes<=12)
fverdadero=1;
}
}
ImprimeMes(anyo,mes);
break;
case 2: //Visualizar año completo
printf("Introduce un anyo: (A partir de 1900)");
fverdadero=0;
while(fverdadero==0)
{
scanf("%d",&anyo);
if(anyo>=1900)
fverdadero=1;
}
ImprimirCalendarioCompleto(anyo);
break;
case 3: //Saber el dia de la fecha
fverdadero=0;
while(fverdadero==0)
{
printf("Introduce un anyo: (A partir de 1900)");
scanf("%d",&anyo);
printf("Mes?");
scanf("%d",&mes);
printf("Dia?");
scanf("%d",&dia);
//printf("dia:%d",dia);
fverdadero=validafecha(dia,mes,anyo);
}
diasem=Qdiaes(anyo,mes,dia);
switch(diasem)
{
case 1: //LUNES
printf("\nEs Lunes\n");
break;
case 2: //MARTES
printf("\nEs Martes\n");
break;
case 3: //MIERCOLES
printf("\nEs Miercoles\n");
break;
case 4: //JUEVES
printf("\nEs Jueves\n");
break;
case 5: //VIERNES
printf("\nEs Viernes\n");
break;
case 6: //SABADO
printf("\nEs Sabado\n");
break;
case 0: //DOMINGO
printf("\nEs Domingo\n");
break;
}
break;
case 4: //Salir
verdad=1;
break;
}
}
}
int validafecha(int dia,int mes,int anyo)
{
int esbisiesto;
// printf("%d,%d,%d\n",dia,mes,anyo); //prueba
switch(mes)
{
case 1: // Enero
if(dia>1 && dia<=31)
return 1; //devuelve el valor (1) a la variable "escorrecta" (mas adelante)
else
return 0;
break;
case 2: // Febrero
esbisiesto=bisiesto(anyo);//bisiesto o no
if(esbisiesto==1 && dia>1 && dia<=29)
return 1; //devuelve el valor (1) a la variable "escorrecta" (mas adelante)
else // como deben utilizar los if else, else if
return 0;
if(esbisiesto==0 && dia>1 && dia<=28)
return 1; //devuelve el valor (1) a la variable "escorrecta" (mas adelante)
else
return 0;
break;
case 3: // Marzo
if(dia>1 && dia<=31)
return 1; //devuelve el valor (1) a la variable "escorrecta" (mas adelante)
else
return 0;
break;
case 4: // Abril
if(dia>1 && dia<=30)
return 1; //devuelve el valor (1) a la variable "escorrecta" (mas adelante)
else
return 0;
break;
case 5: // Mayo
if(dia>1 && dia<=31)
return 1; //devuelve el valor (1) a la variable "escorrecta" (mas adelante)
else
return 0;
break;
case 6: // Junio
if(dia>1 && dia<=30)
return 1; //devuelve el valor (1) a la variable "escorrecta" (mas adelante)
else
return 0;
break;
case 7: // Julio
if(dia>1 && dia<=31)
return 1; //devuelve el valor (1) a la variable "escorrecta" (mas adelante)
else
return 0;
break;
case 8: // Agosto
if(dia>1 && dia<=31)
return 1; //devuelve el valor (1) a la variable "escorrecta" (mas adelante)
else
return 0;
break;
case 9: // Septiembre
if(dia>1 && dia<=30)
return 1; //devuelve el valor (1) a la variable "escorrecta" (mas adelante)
else
return 0;
break;
case 10:// Octubre
if(dia>1 && dia<=31)
return 1; //devuelve el valor (1) a la variable "escorrecta" (mas adelante)
else
return 0;
break;
case 11:// Noviembre
if(dia>1 && dia<=30)
return 1; //devuelve el valor (1) a la variable "escorrecta" (mas adelante)
else
return 0;
break;
case 12:// Diciembre
if(dia>1 && dia<=31)
return 1; //devuelve el valor (1) a la variable "escorrecta" (mas adelante)
else
return 0;
break;
default: // cualquier numero que no se corresponda a los meses
return 0;
break;
}
}
int DiaComienzoAnyo(int anyo)
{
int diacomienzoanyo=0,nobisiestos=0;
nobisiestos=(anyo-bisiestos(anyo))-1900;
if(anyo>1900)
{
if(bisiestos(anyo)>0)
diacomienzoanyo=(bisiestos(anyo)*366)+(nobisiestos*365);
else
diacomienzoanyo=nobisiestos*365;
}
// printf("comienza el dia: %d,diacomienzoanyo:%d,nobisiestos=%d,bisiestos=%d\n",diacomienzoanyo%7,diacomienzoanyo,nobisiestos,bisiestos(anyo));
return(diacomienzoanyo%7);
}
int bisiesto(anyo) //comprueba si un año es bisiesto
{
int cont,i,bisiesto;
if((anyo%4==0) && ((anyo%100!=0) || (anyo%400==0)))
{
//BISIESTO
bisiesto=1;
// printf("%d\n",anyo);
}
else
{
//NO BISIESTO
bisiesto=0;
}
return(bisiesto);
}
int bisiestos(anyo) //cuenta los bisiestos que hay entre 1900 y cualquier año superior
{
int i,cont=0;
for(i=1900;i<anyo;i++)
{
if( bisiesto(i)==1)
cont++;
}
// printf("\n bisiestos son: %d\n",cont);
return(cont);
}
int Qdiaes(int anyo,int mes,int dia)
{
int mes1=1,dia1=0,dias=0;
for(mes1=0;mes1<mes;mes1++)
{
if(mes1==1 || mes1 ==3 || mes1 ==5 || mes1==7 || mes1 ==8 || mes1== 10 || mes1==12)
{
dias=dias+31;
}
if(mes1==2)
{
if(bisiesto(anyo)==0)
{
dias=dias+28; // no es bisiesto
}
else
{
dias=dias+29;
}
}
if(mes1==4 || mes1 ==6 || mes1==9 || mes1==11)
{
dias=dias+30;
}
// printf("dia:%d,mes1:%d,dias:%d\n",dia,mes1,dias);
}
dias=dias+dia;
dia1=((DiaComienzoAnyo(anyo))+dias)%7;
// printf("dia1:%d,dias: %d\n%d/%d/%d seria: %d",dia1,dias,anyo,mes,dia,dias%7);
// printf("dia1:%d,DiaComienzoanyo: %d,dias: %d\n",dia1,DiaComienzoAnyo(anyo-1),dias);
return(dia1);
}
int ImprimeMes(int anyo,int mes)
{
int numDias=0,mes1=mes,contdia=0,i,contdias=0;
switch(mes) //para saber el dia de una fecha determinada. Ve haciendo pruebas desde 1900 y mira a ver cuál es el primer día que falla
{
case 1: printf("--ENERO--");
numDias=numDias+31;
break;
case 3: printf("--MARZO--");
numDias=numDias+31;
break;
case 5: printf("--MAYO--");
numDias=numDias+31;
break;
case 7: printf("--JULIO--");
numDias=numDias+31;
break;
case 8: printf("--AGOSTO--");
numDias=numDias+31;
break;
case 10:printf("--OCTUBRE--");
numDias=numDias+31;
break;
case 12:printf("--DICIEMBRE--");
numDias=numDias+31;
break;
case 2: printf("--FEBRERO--");
if(bisiesto(anyo)==0)
{
numDias=numDias+28;
}
else
numDias=numDias+29;
break;
case 4: printf("--ABRIL--");
numDias=numDias+30;
break;
case 6: printf("--JUNIO--");
numDias=numDias+30;
break;
case 9: printf("--SEPTIEMBRE--");
numDias=numDias+30;
break;
case 11: printf("--NOVIEMBRE--");
numDias=numDias+30;
break;
}
printf("\n\n[LU][MA][MI][JU][VI][SA][DO]\n----------------------------\n");
switch(Qdiaes(anyo,mes,1))
{
case 1: //Lunes
printf("[1 ]");
contdias=1;
break;
case 2: //Martes
printf("[ ][1 ]");
contdias=2;
break;
case 3: //Miercoles
printf("[ ][ ][1 ]");
contdias=3;
break;
case 4: //Jueves
printf("[ ][ ][ ][1 ]");
contdias=4;
break;
case 5: //Viernes
printf("[ ][ ][ ][ ][1 ]");
contdias=5;
break;
case 6: //Sabado
printf("[ ][ ][ ][ ][ ][1 ]");
contdias=6;
break;
case 0: //Domingo
printf("[ ][ ][ ][ ][ ][ ][1 ]");
contdias=7;
break;
}
for(i=2;i<=numDias;i++)
{
if(contdias%7==0)
{
printf("\n");
}
if(i<10) //pongo eso para que sea mas estetico el calendario
{
printf("[%d ]",i);
contdias++;
}
if(i>=10)
{
printf("[%d]",i);
contdias++;
}
}
printf("\n");
}
ImprimirCalendarioCompleto(anyo)
{
int i;
for(i=1;i<=12;i++)
{
ImprimeMes(anyo,i);
printf("\n");
}
}
#include <stdio.h>
int bisiesto(int);
int cuantos_bisiestos(int);
int numero_dias(int,int,int);
int menu(void);
void dia_semana_fecha(void);
void mostrar_mes(void);
void mostrar_anyo(void);
int imprimir_mes(int,int,int);
int dias_mes[]={31,28,31,30,31,30,31,31,30,31,30,31}; //Dias que tiene cada mes del año.
char dia_semana[][10]={"Lunes","Martes","Miercoles","Jueves","Viernes","Sabado","Domingo"};
char meses_anyo[][12]={"Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto",
"Septiembre","Octubre","Noviembre","Diciembre"};
main()
{
int opcion;
do
{
opcion=menu();
if(opcion==-1234) //Si hemos metido una letra o simbolo lo detecta.
{
printf("\nNO SE ADMITEN LETRAS o SIMBOLOS\n");
putchar('\n');
system("pause");
}
else if(opcion<1 || opcion>3)
{
printf("\nDEBES INTRODUCIR UN NUMERO ENTRE 1 Y 3\n");
putchar('\n');
system("pause");
}
}while(opcion<1 || opcion>3);
switch(opcion)
{
case 1: dia_semana_fecha();
break;
case 2: mostrar_mes();
break;
case 3: mostrar_anyo();
break;
default: break;
}
printf("\n\n");
system("pause");
return 0;
}
void dia_semana_fecha(void)
{
int dia,mes,anyo,bis,numero,d_semana;
putchar('\n');
do
{
fflush(stdin);
printf("Dia: ");
scanf("%d",&dia);
fflush(stdin);
printf("Mes: ");
scanf("%d",&mes);
fflush(stdin);
printf("Anyo (>1900): ");
scanf("%d",&anyo);
bis=bisiesto(anyo);
if(bis==1) //Si el año introducido es bisiesto cambiamos los dias de febrero a 29.
dias_mes[1]=29;
if(mes>12 || mes<1 || dia>dias_mes[mes-1] || dia<1 || anyo<1900) //Si algun dato no es valido.
printf("\nERROR. FECHA INCORRECTA. INTRODUCE LOS DATOS DE NUEVO.\n\n");
}while(mes>12 || mes<1 || dia>dias_mes[mes-1] || dia<1 || anyo<1900);
numero=numero_dias(dia,mes,anyo); //Calculo los dias transcurridos desde el 1 de enero de 1900.
d_semana=numero%7; //Para saber que dia de la semana es (0=Lunes,...,6=Domingo).
printf("\nEl dia %d/%d/%d fue/es/sera '%s'\n",dia,mes,anyo,dia_semana[d_semana]);
}
void mostrar_mes(void)
{
int mes_usuario,anyo_usuario,c,numero,d_semana,bis;
putchar('\n');
do
{
fflush(stdin);
printf("Introduce mes [1,12]: ");
c=scanf("%d",&mes_usuario);
if(mes_usuario<1 || mes_usuario>12 || c!=1)
printf("\nERROR. DATO NO VALIDO\n");
}while(mes_usuario<1 || mes_usuario>12 || c!=1);
do
{
fflush(stdin);
printf("Introduce anyo (>1900): ");
c=scanf("%d",&anyo_usuario);
if(anyo_usuario<1900 || c!=1)
printf("\nERROR. DATO NO VALIDO\n");
}while(anyo_usuario<1900 || c!=1);
bis=bisiesto(anyo_usuario);
if(bis==1)
dias_mes[1]=29;
numero=numero_dias(1,mes_usuario,anyo_usuario);
d_semana=numero%7;
//Ahora se en que dia empieza el mes_usuario (0=Lunes, 1=Martes, ... , 6=Domingo).
printf("\n***** %s de %d *****\n",meses_anyo[mes_usuario-1],anyo_usuario);
imprimir_mes(d_semana,mes_usuario,anyo_usuario);
}
void mostrar_anyo(void)
{
int anyo_usuario,c,numero,d_semana,i,d,bis;
do
{
fflush(stdin);
printf("Introduce anyo (>1900): ");
c=scanf("%d",&anyo_usuario);
if(anyo_usuario<1900 || c!=1)
printf("\nERROR. DATO NO VALIDO\n");
}while(anyo_usuario<1900 || c!=1);
bis=bisiesto(anyo_usuario);
if(bis==1)
dias_mes[1]=29;
numero=numero_dias(1,1,anyo_usuario);
d_semana=numero%7;
//Ahora se en que dia empieza el anyo_usuario (0=Lunes, 1=Martes, ... , 6=Domingo).
for(i=0;i<12;i++) //Imprimo los 12 meses del año.
{
printf("\n\n\n ***** %s *****\n",meses_anyo[i]);
d=imprimir_mes(d_semana,i+1,anyo_usuario); //d es la posicion de escritura en el calendario.
d_semana=d; //Para saber donde empiezo a escribir el siguiente mes.
}
}
int menu(void)
{
int opcion,check_car;
system("cls");
fflush(stdin);
puts("Que desea hacer?");
puts("1. Saber el dia de la semana de una fecha.");
puts("2. Mostrar calendario de un mes especifico.");
puts("3. Mostrar calendario de un anyo especifico.");
check_car=scanf("%d",&opcion);
if(check_car!=1)
opcion=-1234;
return opcion;
}
int bisiesto(int anyo)
{
if((anyo%4==0 && anyo%100!=0) || anyo%400==0 )
return 1;
return 0;
}
int cuantos_bisiestos(int anyo)
{
int i,n=0;
for(i=1900;i<anyo;i++) //Si el anyo introducido es bisiesto no se tiene en cuenta.
{
if(bisiesto(i)==1)
n++;
}
return n;
}
int numero_dias(int dia, int mes, int anyo)
{
int numero=0,i;
numero=365*(anyo-1900);
for(i=0;i<(mes-1);i++)
numero+=dias_mes[i];
numero+=dia-1; //dia-1 porque empezamos a contar desde el dia 1 y no desde el dia 0.
numero+=cuantos_bisiestos(anyo); //Sumo el dia extra de los años que tienen 366 dias.
return numero;
}
int imprimir_mes(int d_semana,int mes, int anyo)
{
int i,j,d=1;
printf("\nLu Ma Mi Ju Vi Sa Do\n--------------------------\n");
for(i=0;i<d_semana;i++)
printf(" "); //Imprimo espacios hasta llegar el dia de la semana donde empieza el mes.
for(j=0;j<dias_mes[mes-1];j++) //Imprimo tantos numeros como tenga dicho mes.
{
if(d<10) //Para justificar a la derecha los numeros de una cifra.
putchar(' ');
printf("%d ",d);
d++;
i++;
if(i%7==0) //Si hemos escrito el domingo, imprimo salto de linea para imprimir debajo de Lu.
putchar('\n');
}
return (i%7); //Devuelvo la posicion de escritura del calendario.
}
genioenred escribió:#include <stdio.h>
int bisiesto(int);
int cuantos_bisiestos(int);
int numero_dias(int,int,int);
int menu(void);
void dia_semana_fecha(void);
void mostrar_mes(void);
void mostrar_anyo(void);
int imprimir_mes(int,int,int);
int dias_mes[]={31,28,31,30,31,30,31,31,30,31,30,31}; //Dias que tiene cada mes del año.
char dia_semana[][10]={"Lunes","Martes","Miercoles","Jueves","Viernes","Sabado","Domingo"};
char meses_anyo[][12]={"Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto",
"Septiembre","Octubre","Noviembre","Diciembre"};
main()
{
int opcion;
do
{
opcion=menu();
if(opcion==-1234) //Si hemos metido una letra o simbolo lo detecta.
{
printf("\nNO SE ADMITEN LETRAS o SIMBOLOS\n");
putchar('\n');
system("pause");
}
else if(opcion<1 || opcion>3)
{
printf("\nDEBES INTRODUCIR UN NUMERO ENTRE 1 Y 3\n");
putchar('\n');
system("pause");
}
}while(opcion<1 || opcion>3);
switch(opcion)
{
case 1: dia_semana_fecha();
break;
case 2: mostrar_mes();
break;
case 3: mostrar_anyo();
break;
default: break;
}
printf("\n\n");
system("pause");
return 0;
}
void dia_semana_fecha(void)
{
int dia,mes,anyo,bis,numero,d_semana;
putchar('\n');
do
{
fflush(stdin);
printf("Dia: ");
scanf("%d",&dia);
fflush(stdin);
printf("Mes: ");
scanf("%d",&mes);
fflush(stdin);
printf("Anyo (>1900): ");
scanf("%d",&anyo);
bis=bisiesto(anyo);
if(bis==1) //Si el año introducido es bisiesto cambiamos los dias de febrero a 29.
dias_mes[1]=29;
if(mes>12 || mes<1 || dia>dias_mes[mes-1] || dia<1 || anyo<1900) //Si algun dato no es valido.
printf("\nERROR. FECHA INCORRECTA. INTRODUCE LOS DATOS DE NUEVO.\n\n");
}while(mes>12 || mes<1 || dia>dias_mes[mes-1] || dia<1 || anyo<1900);
numero=numero_dias(dia,mes,anyo); //Calculo los dias transcurridos desde el 1 de enero de 1900.
d_semana=numero%7; //Para saber que dia de la semana es (0=Lunes,...,6=Domingo).
printf("\nEl dia %d/%d/%d fue/es/sera '%s'\n",dia,mes,anyo,dia_semana[d_semana]);
}
void mostrar_mes(void)
{
int mes_usuario,anyo_usuario,c,numero,d_semana,bis;
putchar('\n');
do
{
fflush(stdin);
printf("Introduce mes [1,12]: ");
c=scanf("%d",&mes_usuario);
if(mes_usuario<1 || mes_usuario>12 || c!=1)
printf("\nERROR. DATO NO VALIDO\n");
}while(mes_usuario<1 || mes_usuario>12 || c!=1);
do
{
fflush(stdin);
printf("Introduce anyo (>1900): ");
c=scanf("%d",&anyo_usuario);
if(anyo_usuario<1900 || c!=1)
printf("\nERROR. DATO NO VALIDO\n");
}while(anyo_usuario<1900 || c!=1);
bis=bisiesto(anyo_usuario);
if(bis==1)
dias_mes[1]=29;
numero=numero_dias(1,mes_usuario,anyo_usuario);
d_semana=numero%7;
//Ahora se en que dia empieza el mes_usuario (0=Lunes, 1=Martes, ... , 6=Domingo).
printf("\n***** %s de %d *****\n",meses_anyo[mes_usuario-1],anyo_usuario);
imprimir_mes(d_semana,mes_usuario,anyo_usuario);
}
void mostrar_anyo(void)
{
int anyo_usuario,c,numero,d_semana,i,d,bis;
do
{
fflush(stdin);
printf("Introduce anyo (>1900): ");
c=scanf("%d",&anyo_usuario);
if(anyo_usuario<1900 || c!=1)
printf("\nERROR. DATO NO VALIDO\n");
}while(anyo_usuario<1900 || c!=1);
bis=bisiesto(anyo_usuario);
if(bis==1)
dias_mes[1]=29;
numero=numero_dias(1,1,anyo_usuario);
d_semana=numero%7;
//Ahora se en que dia empieza el anyo_usuario (0=Lunes, 1=Martes, ... , 6=Domingo).
for(i=0;i<12;i++) //Imprimo los 12 meses del año.
{
printf("\n\n\n ***** %s *****\n",meses_anyo[i]);
d=imprimir_mes(d_semana,i+1,anyo_usuario); //d es la posicion de escritura en el calendario.
d_semana=d; //Para saber donde empiezo a escribir el siguiente mes.
}
}
int menu(void)
{
int opcion,check_car;
system("cls");
fflush(stdin);
puts("Que desea hacer?");
puts("1. Saber el dia de la semana de una fecha.");
puts("2. Mostrar calendario de un mes especifico.");
puts("3. Mostrar calendario de un anyo especifico.");
check_car=scanf("%d",&opcion);
if(check_car!=1)
opcion=-1234;
return opcion;
}
int bisiesto(int anyo)
{
if((anyo%4==0 && anyo%100!=0) || anyo%400==0 )
return 1;
return 0;
}
int cuantos_bisiestos(int anyo)
{
int i,n=0;
for(i=1900;i<anyo;i++) //Si el anyo introducido es bisiesto no se tiene en cuenta.
{
if(bisiesto(i)==1)
n++;
}
return n;
}
int numero_dias(int dia, int mes, int anyo)
{
int numero=0,i;
numero=365*(anyo-1900);
for(i=0;i<(mes-1);i++)
numero+=dias_mes[i];
numero+=dia-1; //dia-1 porque empezamos a contar desde el dia 1 y no desde el dia 0.
numero+=cuantos_bisiestos(anyo); //Sumo el dia extra de los años que tienen 366 dias.
return numero;
}
int imprimir_mes(int d_semana,int mes, int anyo)
{
int i,j,d=1;
printf("\nLu Ma Mi Ju Vi Sa Do\n--------------------------\n");
for(i=0;i<d_semana;i++)
printf(" "); //Imprimo espacios hasta llegar el dia de la semana donde empieza el mes.
for(j=0;j<dias_mes[mes-1];j++) //Imprimo tantos numeros como tenga dicho mes.
{
if(d<10) //Para justificar a la derecha los numeros de una cifra.
putchar(' ');
printf("%d ",d);
d++;
i++;
if(i%7==0) //Si hemos escrito el domingo, imprimo salto de linea para imprimir debajo de Lu.
putchar('\n');
}
return (i%7); //Devuelvo la posicion de escritura del calendario.
}
Al final me pique y lo hice entero xD. Quizas este te guste mas jajajaja.
Saludos!!