您的位置:首页 > 编程语言 > C语言/C++

[原创] C语言实现:万年历

2010-08-29 05:12 603 查看
经过近这几天的努力,终于写完了这个"万年历"的程序了,共享一下, 特别是同"勉"共享

[需求]

请打印出任意年份的日历

[代码]

代码

#include <stdio.h>

#define LMonth 31
#define SMonth 30
#define VMonth 28

typedef enum {
Sun,
Mon,
Jue,
Wed,
Thu,
Fri,
Sat
} WEEK;

typedef enum {
January = 1,
February,
Match,
Apirl,
May,
June,
July,
August,
September,
October,
November,
December
} MONTH;

void printMonHead(void)
{
printf("    Sun    Mon    Jue    Wed    Thu    Fri    Sat\n");
}

void  printMonth(const WEEK firstDay, int length )
{
WEEK weekDay = firstDay % 7;

int i;

printMonHead();

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

for(i=1;i<=length;++i)
{
weekDay = (++weekDay)%7;
printf("%7d", i);

if(weekDay==0) printf("\n");
}

printf("\n");
}

int isLeapYear(const int yr)
{
return ( yr%( yr%100 ? 4:400) ? 0 : 1);
}

int getYearDay(const int year)
{

int lastYear = year-1;
int yearNum = lastYear-1899;

int walker,counter=0;
for(walker=1900; walker < year; ++walker)
{
if(isLeapYear(walker)==1)
++counter;
}

return (365*yearNum+counter+1)%7;
}

void printYear(const int y)
{
WEEK yDay = getYearDay(y);
int  vDay = isLeapYear(y);

int monWeeks[13];
int monLen  [13];

monLen[0]=0;
monLen[January]=31;     monLen[February]=28+vDay;   monLen[Match]=31;
monLen[Apirl]=30;       monLen[May]=31;             monLen[June]=30;
monLen[July]=31;        monLen[August]=31;          monLen[September]=30;
monLen[October]=31;     monLen[November]=30;        monLen[December]=31;

monWeeks[0]=0;
monWeeks[January]   = yDay;
monWeeks[February]  = ((monWeeks[January]       +monLen[January]        )%7);
monWeeks[Match]     = ((monWeeks[February]      +monLen[February]       )%7);
monWeeks[Apirl]     = ((monWeeks[Match]         +monLen[Match]          )%7);
monWeeks[May]       = ((monWeeks[Apirl]         +monLen[Apirl]          )%7);
monWeeks[June]      = ((monWeeks[May]           +monLen[May]            )%7);
monWeeks[July]      = ((monWeeks[June]          +monLen[June]           )%7);
monWeeks[August]    = ((monWeeks[July]          +monLen[July]           )%7);
monWeeks[September] = ((monWeeks[August]        +monLen[August]         )%7);
monWeeks[October]   = ((monWeeks[September]     +monLen[September]      )%7);
monWeeks[November]  = ((monWeeks[October]       +monLen[October]        )%7);
monWeeks[December]  = ((monWeeks[November]      +monLen[November]       )%7);

int i;
for(i=January; i<=December; ++i)
{
printf("\n-------------------------------------------------\n");
printf("                     %d, %d                      \n",y,i);
printf("-------------------------------------------------\n");
printMonth(monWeeks[i],monLen[i]);
printf("\n");
}

return;
}

int main(void)
{
//  int y3 = 2000;
//  int y3 = 1946;
//  printYear(y3);
int y;
int quit=0;

do
{
printf("Please enter which Year to Print For You (0 to quit): ");
scanf("%d",&y);
printf("\n");

if(y==0)
quit = 1;
else
printYear(y);

}while(!quit);

return 0;
}


[输出]

Please enter which Year to Print For You (0 to quit): 1973

Please enter which Year to Print For You (0 to quit): 1973

-------------------------------------------------

1946, 1

-------------------------------------------------

Sun Mon Jue Wed Thu Fri 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 31

-------------------------------------------------

1946, 2

-------------------------------------------------

Sun Mon Jue Wed Thu Fri 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

-------------------------------------------------

1946, 3

-------------------------------------------------

Sun Mon Jue Wed Thu Fri 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

31

-------------------------------------------------

1946, 4

-------------------------------------------------

Sun Mon Jue Wed Thu Fri 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

-------------------------------------------------

1946, 5

-------------------------------------------------

Sun Mon Jue Wed Thu Fri 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 31

-------------------------------------------------

1946, 6

-------------------------------------------------

Sun Mon Jue Wed Thu Fri 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

-------------------------------------------------

1946, 7

-------------------------------------------------

Sun Mon Jue Wed Thu Fri 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 31

-------------------------------------------------

1946, 8

-------------------------------------------------

Sun Mon Jue Wed Thu Fri 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 31

-------------------------------------------------

1946, 9

-------------------------------------------------

Sun Mon Jue Wed Thu Fri 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

-------------------------------------------------

1946, 10

-------------------------------------------------

Sun Mon Jue Wed Thu Fri 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 31

-------------------------------------------------

1946, 11

-------------------------------------------------

Sun Mon Jue Wed Thu Fri 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

-------------------------------------------------

1946, 12

-------------------------------------------------

Sun Mon Jue Wed Thu Fri 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 31

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/asiainfolf/archive/2010/08/29/5847101.aspx


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: