Solucionado: Proyecto en Lenguaje C: calendario

En primer lugar, no sabia donde poner este post, en el General o en el de Software libre, pero es que en EOL no hay categoria de programacion...

Es un proyecto de programacion en lenguaje C en modo consola que consiste en crear un programa que el usuario pueda tener 3 opciones:
- Visualizar el calendario de un mes.
- Visualizar el calendario completo de un año
- Saber el dia de la semana de una fecha determinada

tenemos como dato importante que el 1 de enero de 1900 fue lunes (el usuario deberia introducir un año superior o igual a 1900), de ahi voy sumando dias de los años (bisiestos o no), hasta el año introducido por el usuario, a partir desde entonces voy sumando los meses... hasta obtener el total de dias

A este total le hago un MOD 7, que deberia tener como resto 0 a 6, con un switch el programa nos dice que dia de la fecha es...


El motivo de este post es que tengo un par de fallos que no logro encontrarlos y solucionarlos...

El programa esta perfecto salvo que en algunos meses se salta un dia y además creo que la funcion DiaComienzoAnyo no funciona correctamente...

#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");
   }
   
}


Muchas gracias por vuestra atencion y tiempo

Si logro resolver este problema os lo podeis quedar el codigo como un buen análogo al comando cal de linux para windows XD
Creo que el programa que te calcula los años bisiestos esta mal, creo que es algo asi:
if((anyo%400==0) || (anyo%4==0))
      if(anyo%100!=0)
         bisiesto=1;
(mensaje borrado)
#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.
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.


Gracias Genioenred!

posteo mi programa por si alguien lo quiere:

#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.
}




Al final me pique y lo hice entero xD. Quizas este te guste mas jajajaja.

Saludos!!
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!!


Con Arrays queda mejor [sonrisa] pero mi profesor aun no me lo había dado cuando hice el proyecto jeje...
6 respuestas