lectura de

Muestra el calendario basado en el año ingresado por el usuario. Usando un algoritmo para saber que dia de la semana fue, dado su fecha.

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

/* Se define el tipo de datos bool */
#define TRUE 1;
#define FALSE 0;
typedef int bool;

/* Declaracion de funciones */
int get_days(int, int);
void show_months(int, int);
bool bisiesto(int);

int main(int argc, char *argv[]) {
    int year = 0;
    int i;
    
    if (argc > 1) { /* Ver si es posible cargar por parametro */
        year = (int)strtoul(argv[1], 0, 10);
    }
    while (year < 1900) {
        printf("Ingrese un a%co posterior a 1900: ", 164);
        scanf("%d", &year);
    }
    
    for (i = 1; i <= 12; i++){
        show_months(i, year);
    }

    return 0;
}

void show_months(int month, int year) {
    int day, i, dias;
    char *meses[12] = {"Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"};
    int cuantos_dias[12] = {31, -1, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

    /* Imprimir el titulo MES AÑO */
    dias = cuantos_dias[month - 1];
    if (dias == -1) {
        dias = bisiesto(year) ? 29 : 28;
    }
    printf(" %s", meses[month - 1]);
    printf(" %d\n", year);

    day = ((year-1)%7+((year-1)/4 -3*((year-1)/100+1)/4)%7+get_days(month,year)+1%7)%7;

    /* Imprimir los días */
    printf(" Do Lu Ma Mi Ju Vi Sa\n");

    for(i = 0; i < day; i++) {
        printf("   ");
    }

    for(i = 0; i < dias; i++){
        if( (i + day)%7 == 0 && i != 0) { 
            printf("\n");
        }
        printf("%3d", i+1);
    }
    printf("\n\n");
}

/**
 * esta funcion se utiliza en el algoritmo para determinar el
 * dia de una fecha en específico
 */
int get_days(int month, int year) {

    int bis[12] = {0, 3, 4, 0, 2, 5, 0, 3, 6, 1, 4, 6};
    int no_bis[12] = {0, 3, 3, 6, 1, 4, 6, 2, 5, 0, 3, 5};

    return bisiesto(year) ? bis[month - 1] : no_bis[month - 1];
}

/** 
 * recibe un año, y retorna true si dicho año es bisiesto.
 * false en caso contrario
 */
bool bisiesto(int year) {
    
    return year%4==0 && (year%400==0 || year%100!=0);
}
Blog Logo

Juan Pablo Escalona G.


Publicado el

comments powered by Disqus
Image

JPEG {codes}

Códigos azarosos en múltiples lenguajes, JavaScript, Ruby, C, Python. Bienvenidos aquellos que quieran aprender.

Volver al inicio