C语言 万年历程序
原代码:chunli@Linux:~/c++$cat123.c
#include
#defineMon1
#defineTues2
#defineWed3
#defineThur4
#defineFri5
#defineSat6
#defineSun0
#defineJanuary_days31
#defineFebruary_days28
#defineMarch_days31
#defineApril_days30
#defineMay_days31
#defineJune_days30
#defineJuly_days31
#defineAugust_days31
#defineSeptember_days30
#defineOctober_days31
#defineNovember_days30
#defineDecember_days31
#definefirst1monthJanuary_days
#definefirst2monthJanuary_days+February_days
#definefirst3monthJanuary_days+February_days+March_days
#definefirst4monthJanuary_days+February_days+March_days+April_days
#definefirst5monthJanuary_days+February_days+March_days+April_days+May_days
#definefirst6monthJanuary_days+February_days+March_days+April_days+May_days+June_days
#definefirst7monthJanuary_days+February_days+March_days+April_days+May_days+June_days+July_days
#definefirst8monthJanuary_days+February_days+March_days+April_days+May_days+June_days+July_days+August_days
#definefirst9monthJanuary_days+February_days+March_days+April_days+May_days+June_days+July_days+August_days+September_days
#definefirst10monthJanuary_days+February_days+March_days+April_days+May_days+June_days+July_days+August_days+September_days+October_days
#definefirst11monthJanuary_days+February_days+March_days+April_days+May_days+June_days+July_days+August_days+September_days+October_days+November_days
intknown_weekday=Tues;
intknown_year=1901;
intkonwn_month=1;
intknown_day=1;
intday_count(intmonth)
{
switch(month)
{
case1:return0;break;
case2:returnfirst1month;break;
case3:returnfirst2month;break;
case4:returnfirst3month;break;
case5:returnfirst4month;break;
case6:returnfirst5month;break;
case7:returnfirst6month;break;
case8:returnfirst7month;break;
case9:returnfirst8month;break;
case10:returnfirst9month;break;
case11:returnfirst10month;break;
case12:returnfirst11month;break;
}
}
char*month_name(intmonth)
{
switch(month)
{
case1:
return"一月";
break;
case2:
return"二月";
break;
case3:
return"三月";
break;
case4:
return"四月";
break;
case5:
return"五月";
break;
case6:
return"六月";
break;
case7:
return"七月";
break;
case8:
return"八月";
break;
case9:
return"九月";
break;
case10:
return"十月";
break;
case11:
return"十一月";
break;
case12:
return"十二月";
break;
default:
break;
}
}
/*按格式打印某年某月名称*/
voidfirst_line_print(intmonth,intyear)
{
//printf("%20s%d\n",month_name(month),year);
printf("%8d年%s\n",year,month_name(month));
}
/*按格式打印星期名称*/
voidweek_print()
{
//printf("%-6s%-6s%-6s%-6s%-6s%-6s%-6s\n","Sun.","Mon.","Tues.","Wed.","Thur.","Fri.","Sat.");
printf("%-4s%-4s%-4s%-4s%-4s%-4s%-4s\n","日","一","二","三","四","五","六");
}
/*计算该年该月份与已知日子之间的距离天数*/
intdate_distance_count(intmonth,intyear)
{
intleap_year_count=0;
inti;
intdistance;
if(year>known_year)
{
for(i=known_year;i
{
if(((i%4==0)&&(i%100!=0))||(i%400==0))
{
leap_year_count++;
}
}
if(month>2)
{
if(((year%4==0)&&(year%100!=0))||(year%400==0))
{
leap_year_count++;
}
}
}
else
if(year==known_year)
{
if(month>2)
{
leap_year_count=1;
}
}
distance=(year-known_year)*365+leap_year_count+day_count(month);
returndistance;
}
/*确定该月份第一天是星期几*/
intmakesure_firstday_weekday(intmonth,intyear)
{
intdate_distance=0;
intweekday;
date_distance=date_distance_count(month,year);
weekday=(known_weekday+date_distance)%7;
returnweekday;
}
/*依次打印出该月份的日子*/
voidprint_in_turn(intmonth,intfirstday,intyear)
{
inti=1;
intweekday;
switch(firstday)
{
caseSun:
break;
caseMon:
printf("%-3s","");
break;
caseTues:
printf("%-6s","");
break;
caseWed:
printf("%-9s","");
break;
caseThur:
printf("%-12s","");
break;
caseFri:
printf("%-15s","");
break;
caseSat:
printf("%-18s","");
break;
}
switch(month)
{
case1:
case3:
case5:
case7:
case8:
case10:
case12:
{
for(i=0;i<31;i++)
{
weekday=(firstday+i)%7;
printf("%-3d",i+1);
if(weekday==Sat)
{
printf("\n");
}
}
break;
}
case2:
{
if(((year%4==0)&&(year%100!=0))||(year%400==0))/*闰年*/
{
for(i=0;i<29;i++)
{
weekday=(firstday+i)%7;
printf("%-3d",i+1);
if(weekday==Sat)
{
printf("\n");
}
}
break;
}
else/*平年*/
{
for(i=0;i<28;i++)
{
weekday=(firstday+i)%7;
printf("%-3d",i+1);
if(weekday==Sat)
{
printf("\n");
}
}
break;
}
}
case4:
case6:
case9:
case11:
{
for(i=0;i<30;i++)
{
weekday=(firstday+i)%7;/*计算该天是星期几*/
printf("%-3d",i+1);
if(weekday==Sat)
{
printf("\n");/*如果是星期六,则换行*/
}
}
break;
}
}
}
voiddate_print(intmonth,intyear)
{
intfirstday;
firstday=makesure_firstday_weekday(month,year);
print_in_turn(month,firstday,year);
printf("\n");
}
voidmain_month(intmonth,intyear)
{
first_line_print(month,year);
week_print();
date_print(month,year);
printf("\n\n");
}
voidmain_calendar(intyear)
{
inti;
for(i=1;i<=12;i++)
{
main_month(i,year);
}
}
intmain()
{
intyear;
printf("请输入年份:year=");
scanf("%d",&year);
printf("\n");
while(year
{
printf("请输入大于1901的年份\n");
printf("请输入年份:year=");
scanf("%d",&year);
printf("\n");
}
main_calendar(year);
return0;
}
chunli@Linux:~/c++$
编译运行:chunli@Linux:~/c++$gcc123.c&&./a.out
请输入年份:year=
一月
日一二三四五六
12
3456789
10111213141516
1718192223
24252627282930
31
二月
日一二三四五六
123456
78910111213
14151617181920
21222324252627
2829
三月
日一二三四五六
12345
6789101112
13141516171819
2223242526
2728293031
四月
日一二三四五六
12
3456789
10111213141516
1718192223
24252627282930
五月
日一二三四五六
1234567
891011121314
1516171819
22232425262728
293031
六月
日一二三四五六
1234
567891011
12131415161718
1922232425
2627282930
七月
日一二三四五六
12
3456789
10111213141516
1718192223
24252627282930
31
八月
日一二三四五六
123456
78910111213
14151617181920
21222324252627
28293031
九月
日一二三四五六
123
45678910
11121314151617
1819222324
252627282930
十月
日一二三四五六
1
2345678
9101112131415
1617181922
23242526272829
3031
十一月
日一二三四五六
12345
6789101112
13141516171819
2223242526
27282930
十二月
日一二三四五六
123
45678910
11121314151617
1819222324
25262728293031
chunli@Linux:~/c++$