Logo elrincondelc.com
curso de programación en c
Foros de programación en C
Inicio :: Código fuente
Usuario: Clave: Regístrate

Valoración
1

Calendario Perpetuo

codigo enviada por: digies (2007-06-30 17:48:26)
Este es un programa de calendario perpetuo. Debe ingresarse el año y el mes que se desea ver a modo de calendario. Posee un sistema de validación de datos de entrada bastante completo.
/* Programa 100% ANSI C */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

int calc_primerDAD(int anyo, int mes);
int calc_cantidadAB(int anyo, int k);
int preparar_calendario(int anyo, int mes, int primerDAD, int k);
void imprimir_calendario(int anyo, int mes, int primerDSMD);
void digies(void);

int cantDiasMes[12]= {31, 0, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
char *nombreDia[7]= {"DO", "LU", "MA", "MI", "JU", "VI", "SA"};
char *nombreMes[12]= {"ENERO", "FEBRERO", "MARZO", "ABRIL", "MAYO",
                     "JUNIO", "JULIO", "AGOSTO", "SEPTIEMBRE", "OCTUBRE", 
                     "NOVIEMBRE", "DICIEMBRE"};
                        
int main() {
   char strAnyo[6], /* Tolerancia máxima: 6 carácteres */
        strMes[4]; /* Tolerancia máxima: 4 carácteres */
   int anyo, i, mes, primerDAD, primerDSMD, k;
   unsigned char e;
   puts("ttt     CALENDARIO DEL MESn");
   do {
      e=0;
      printf("Ingresa el axA4o: ");
      scanf("%6s", strAnyo);
      fflush(stdin);
      if(strlen(strAnyo)>4) {
         puts("nDato no vxA0lidoan"); e=1;
      }
      else if(strlen(strAnyo)==1 || strlen(strAnyo)==2 || strlen(strAnyo)==3) {
         puts("nDato no vxA0lidoan"); e=1;
      }
      else {
         for(i=0; i<strlen(strAnyo); i++) 
            if(isascii(strAnyo[i])==0 || isdigit(strAnyo[i])==0) {
               puts("nDato no vxA0lidoan"); e=1; break;
            }
         if(e!=1) {
            anyo=atoi(strAnyo);
            if((anyo>=1000 && anyo<=1581) || (anyo>=2101 && anyo<=9999)) {
               printf("nAxA4o %d fuera del Calendario Gregorianoann",
               anyo); e=1;
            }
         }
      }
   } while(e==1);
   printf("nAxA4o: %dn", anyo);
   do {
      e=0;     
      printf("nIngresa el mes (1 ~ 12): ");
      scanf("%4s", strMes);
      fflush(stdin);
      if(strlen(strMes)>2) {
         puts("nDato no vxA0lidoa"); e=1;
      }
      else {
         for(i=0; i<strlen(strMes); i++) 
            if(isascii(strMes[i])==0 || isdigit(strMes[i])==0) {
               puts("nDato no vxA0lidoa"); e=1; break;
            }
	 if(e!=1) {
	    mes=atoi(strMes);
	    if(mes==0 || mes>12) {
               puts("nDato no vxA0lidoa"); e=1;
            }
         }
      }
   } while(e==1);
   printf("nMes: %dn", mes);
   primerDAD=calc_primerDAD(anyo, mes);
   primerDSMD=preparar_calendario(anyo, mes, primerDAD, k);
   imprimir_calendario(anyo, mes, primerDSMD);
   digies();
   printf("nn");
   system("PAUSE");
   return 0;
} 

int calc_primerDAD(int anyo, int mes) {
   long int dias;
   int cantidadAB;
   cantidadAB=calc_cantidadAB(anyo, 0);
   dias=(anyo-1)*365+cantidadAB;
   return (int)dias%7;
}

int calc_cantidadAB(int anyo, int k) { 
   int c=0;
   while(k <= anyo) {
      if(k%4==0)
         if(!(k%100==0 && k%400!=0))
            c++;
         k++;
   }
   return c;
}

int preparar_calendario(int anyo, int mes, int primerDAD, int k) { 
   int primerDSMD=primerDAD, i;
   if(calc_cantidadAB(anyo, k-1))
      cantDiasMes[1]=29; 
   else 
      cantDiasMes[1]=28; 
   for(i=0; i<mes-1; i++) 
      primerDSMD=primerDSMD+cantDiasMes[i]; 
   return primerDSMD%7;
}

void imprimir_calendario(int anyo, int mes, int primerDSMD) {
   int i=0, c=0, n=0, t=0;
   puts("nt    xC4xC4xC4xC4xC4xC4xC4xC4xC4xC4xC4xC4xC4xC4xC4
   xC4xC4xC4xC4xC4xC4xC4xC4xC4xC4xC4xC4xC4xC4xC4xC4xC4xC4xC4
   xC4xC4xC4xC4xC4xC4xC4xC4xC4xC4xC4xC4xC4xC4xC4xC4");
   printf("t    CALENDARIO %s DE %dnn", nombreMes[mes-1], anyo);
   while(i<7) {
      printf("t    %s", nombreDia[i]);
      i++;
   }
   printf("nn");
   while(primerDSMD > 0) {
      if(t==0) {
         printf("t    t"); /* ATENCIÓN: Los espacios deben estar entre los
         dos TAB. */
         ++t;
      }
      else
         printf("t");
      primerDSMD--;
      c++; n++;
   }
   for(i=0; i<cantDiasMes[mes-1]; i++) {
      if(c%7==0) {
         if(n==0) {
            if(i<9)
               printf("t     %dt", i+1); /* Imprime un espacio a la
               izquierda del número de un solo dígito. */
            else    
	       printf("t    %dt", i+1); /* Imprime el número de dos dígitos.
               */
	    n++;
         }
         else {
	    printf("n");
            if(i<9)
               printf("t     %dt", i+1); /* Imprime un espacio a la
               izquierda del número de un solo dígito. */
            else
               printf("t    %dt", i+1); /* Imprime el número de dos dígitos.
               */
         }
      }
      else {
         if(i<9)
            printf("     %dt", i+1); /* Imprime un espacio a la izquierda del
            número de un solo dígito. */
         else
            printf("    %dt", i+1); /* Imprime el número de dos dígitos. */
      }
      c++;
   }
   puts("nnt    xC4xC4xC4xC4xC4xC4xC4xC4xC4xC4xC4xC4xC4xC4xC4
   xC4xC4xC4xC4xC4xC4xC4xC4xC4xC4xC4xC4xC4xC4xC4xC4xC4xC4xC4
   xC4xC4xC4xC4xC4xC4xC4xC4xC4xC4xC4xC4xC4xC4xC4xC4");
   return;
}

void digies(void) {
   puts("t    (C) 2006tttttDiGiEs");
   return;
}
digies aclara: En el código subido no salieron impresos los caracteres de barra invertida. Por ejemplo: en printf("t %s", nombreDia[i]); debería haber salido: printf("[barra_invertida]t %s", nombreDia[i]); y en puts("nnt xC4xC4xC4xC4..."); tendría que ser puts("[barra_invertida]n[barra_invertida]n[barra_invertida]t [barra_invertida]xC4[barra_invertida]xC4[barra_invertida]xC4[barra_invertida]xC4..."); Estos caracteres especiales son los que dibujan las líneas en la consola de salida estándar al ejecutar el programa. A la barra invertida la he generado presionando conjuntamente las teclas _Alt_+_92_
(digies 2007-06-30 18:28:17)
me podrias mandar el codigo a mi correo por favor (gustavo_rgr@hotmail.com) gracias
(gustavo_rgr 2011-05-24 15:54:06)

Para enviar comentarios debes estar registrado.

(c) ElRincondelC.com, 1999-2007

Un proyecto de Urlan Heat : proyectos de Internet y soporte para el comercio electrónico.