C语言--万年历

时间:2021-01-11 01:41:36
#include<stdio.h>
#include<stdlib.h>

//判断是否是闰年
int leap(int year)
{
    if(year%4==0&&year%100!=0) return 1;
    else if(year%400==0) return 1;
    else return 0;
}

//返回某年某月的天数
int monthdays(int year, int month)
{
    if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)
        return 31;
    else if(leap(year)==1&&month==2) return 29;
    else if(month==2) return 28;
    else return 30;
}

//返回输入年份的前一年到1900年的天数,为了计算输入年份1月1日需要空几个格子,即星期几
int sumdays(year)
{
    int sum=0, i, day;
    for(i=1900; i<year; i++)
    {
        if(leap(i)) day = 366;
        else day = 365;
        sum = sum+day;
    }
    return sum;
}

int main()
{
    char bk=' ';
    int year, month=1, week, day=1, i, mod, initial;
    printf("**********万年历**********\n\n");
    printf("请输入年份(大于1900):");
    scanf("%d", &year);
    if(year<1900)
    {
        printf("\n\n您输入的年份小于1900,请重新输入!\n");
        exit(0);
    }
//    year = 2014;
    printf("\n%15d年\n\n", year);
    initial = (sumdays(year)%7+0)%7;  //initial表示输入的年份1月1日应该空出几个格子
                                    //其中0表示1900年1月1日是星期一,即前面不需要空格
    for(month=1; month<=12; month++)
    {
        printf("%13d月\n\n", month);
        printf("一  二  三  四  五  六  日\n");
        if(initial<7)
            for(i=1; i<=initial*4; i++)  //4表示在打印的时候,每一天占用4个空格
                putchar(bk);
        for(i=initial; i<=monthdays(year,month)+initial-1; i++)  //打印日期
        {
            mod = i%7;
            if(mod==0&&i!=initial) printf("\n");
            if(day<10) printf("%d%c%c%c", day++,bk,bk,bk);   //为了显示整齐
            else printf("%d%c%c", day++,bk,bk);
        }
        printf("\n\n");
        initial = mod+1;
        day =1;  //初始化,下个月从1号开始打印
    }
    return 0;
}