某山寨

z4zr的待调教小窝

C语言输出万年历

C语言输出万年历

输入指定年月后输出对应月份的万年历。。。。。
与某小友聊天兴起搞之。。。。。
写成一个函数方便调用和修改
绝对精简绝对短233333333333333333333333333

样例

2014 11
Sun     Mon     Tue     Wed     Thu     Fir     Sat
                                                 1
 2       3       4       5       6       7       8
 9      10      11      12      13      14      15
16      17      18      19      20      21      22
23      24      25      26      27      28      29
30
2010 2
Sun     Mon     Tue     Wed     Thu     Fir     Sat
         1       2       3       4       5       6
 7       8       9      10      11      12      13
14      15      16      17      18      19      20
21      22      23      24      25      26      27
28
#include<stdio.h>
#include<string.h>

void calopt(int year,int mounth){
    int i,j,k,weak;
    int m[15]={0,31,28,31,30,31,30,31,31,30,31,30,31};
    int opt[7][7];
    if((year%4==0&&year%100!=0)||year%400==0){
        m[2]=29;
    }
    weak=(year+(year-1)/4-(year-1)/100+(year-1)/400)%7;
    for(i=0;i<mounth;i++){
        weak+=m[i];
    }
    memset(opt,0,sizeof(opt));
    int row=0,col=weak%7;
    for(i=1;i<=m[mounth];i++){
        if(col==7){col=0;row++;}
        opt[row][col]=i;
        col++;
    }
    printf("Sun\tMon\tTue\tWed\tThu\tFir\tSat\t\n");
    for(i=0;i<=row;i++){
        for(j=0;j<7;j++){
            if(opt[i][j]==0)printf("\t");
            else printf("%2d\t",opt[i][j]);
        }
        puts("");
    }
}
int main(){
    int mounth,year;
    while(scanf("%d%d",&year,&mounth)!=EOF){
        calopt(year,mounth);
    }
    return 0;
}

P.s 关于某一年第一天是星期几的判定
公元1年的第一天是星期一。这是一个计算前提。
闰年的规定:凡是年份能够被4整除、且不能被100整除的是闰年;凡是年份能被400整除的也是闰年;除此以外的年份都不是闰年。闰年366天、平年365天。

公元1年第一天之后,要计算某天是星期几,要用“这天与起始天之差”,与7求余,当余数为0,则这天与起始天星期几相同(星期一)。否则,这个余数+1就是这天的星期几。
假设year年的第一天距离起始天的差是:
(year-1)365+(公元1年到公元year-1年内的闰年个数(每个闰年多一天))-------(1)
公元1年到公元year-1年内的闰年个数的计算:
根据闰年规定,每4年有1个闰年,这样算得到:
公元1年到公元year-1年内的闰年个数=(year-1)/4,但每一百年要扣掉1个闰年,修正一下得到:
公元1年到公元year-1年内的闰年个数=(year-1)/4-(year/100) 但是这样多扣了!
每400年又要增加一个闰年,再次修正得到:
公元1年到公元year-1年内的闰年个数=(year-1)/4-(year/100)+(year/400)
代入(1)得到年份year第一天距离起始天的差是:
(year-1)
365+(year-1)/4-(year/100)+(year/400)
这天是星期几?前面说过,是这个差与7求余+1:
[(year-1)365+(year-1)/4-(year/100)+(year/400)]%7+1这个末尾的1可以放到被除数里面,即:
[(year-1)
365+(year-1)/4-(year/100)+(year/400)+1] %7
=[(year-1)(364+1)+(year-1)/4-(year/100)+(year/400)+1] %7
=[(year-1)
364+(year-1)+(year-1)/4-(year/100)+(year/400)+1] %7
364是7的倍数,year364也一定是7的倍数,所以year364可以去掉,这就得到了最后的算式
=[(year-1)+(year-1)/4-(year/100)+(year/400)+1] %7
这个[]内最后的1,可以看成是新年的第1天。更一般地,year年度的第X天是星期几?可以用下式计算
[(year-1)+(year-1)/4-(year/100)+(year/400)+X] %7


Warning: file_get_contents(http://api.hitokoto.us/rand): failed to open stream: Connection timed out in /data/htdocs/z4zr.host.smartgslb.com/usr/themes/Wcat/functions.php on line 87

文章二维码