日历系统.docx
《日历系统.docx》由会员分享,可在线阅读,更多相关《日历系统.docx(12页珍藏版)》请在冰豆网上搜索。
日历系统
《数据结构》课程设计报告
专业:
班级:
学号:
姓名:
完成日期:
2011年7月11日
2011年7月11日
一、问题描述:
1)用C语言设计一个日历系统
2)输入任一年将显示出该年的所有月份日期,对应的星期3)注意闰年情况
二、基本要求:
1)输入任一年将显示出该年的所有月份日期,对应的星期
2)中文英文显示日历都可以3)下一行显示星期,从周日到周六
4)下一行开始显示日期从1号开始,并按其是周几实际情况与上面的星期数垂直对齐
三、测试数据:
平年2011,输出2011年12个月份的日历;闰年2000,输出2000年12个月份的日历
四、算法思想:
以2000年为基年分为两种情况,一种是当所输入的年份大于2000时,首先判断此年是否为闰年,然后计算输入的年份距2000的总天数,即可得到每月得天数,又已知2000年1月1号是星期六,然后把天数对7取余就可以得到所对应的是星期几。
另一种小于2000的计算方法与上类似。
五、模块划分:
1)intleap(intyear),其功能是判断所输入的年份是否为闰年
2)voidcount(intyear,intmonth),其功能是对所输入的年份进行计算,输出该年12个月份的日历,调用leap()函数进行闰年的判断
3)voidmain(),主函数,功能是输入要查询的年份的12个月份的日历,调用voidcount()函数实现问题要求
七、源程序:
#include"stdio.h"
#defineYEAR365
intleap(intyear)/*判断输入的年份是否为闰年*/
{
intn;
n=(year%4==0&&year%100!
=0||year%400==0);
return(n);
}
voidrili(intyear,intmonth)/*以2000年1月为基础计算某年日历year表示输入的年份,month表示改年的月份*/
{
inti,day,first_day,flag,year1,year2;
inttemp=6;
flag=leap(year);
year1=year/100;/*相差几百年*/
year2=year%100;/*中间几十年*/
if(year>=2000)/*大于2000年的算法*/
{
year1=year1-20;
day=year1/4;/*百闰年数*/
day+=(YEAR+24)*year1+YEAR*year2+(year2-1)/4;/*2000年至现年总天数*/
if(year>2000)
day++;/*加上2000年闰年2月的29天*/
switch(month)
{
case1:
day+=0;break;
case2:
day+=31;break;/*加上月份天数*/
case3:
day+=59+flag;break;
case4:
day+=90+flag;break;
case5:
day+=120+flag;break;
case6:
day+=151+flag;break;
case7:
day+=181+flag;break;
case8:
day+=212+flag;break;
case9:
day+=243+flag;break;
case10:
day+=273+flag;break;
case11:
day+=304+flag;break;
case12:
day+=334+flag;break;
}
day+=temp;/*加上2000年1月1号是星期六*/
first_day=day%7;/*对7取余,为1号星期*/
}
else/*小于2000年的算法*/
{
year1=20-1-year1;
year2=100-year2-1;/*倒减,应多减1*/
day=year1/4;
day+=36524*year1+365*year2+year2/4;
switch(month)
{
case12:
day+=31;break;
case11:
day+=61;break;
case10:
day+=92;break;
case9:
day+=122;break;
case8:
day+=153;break;
case7:
day+=184;break;
case6:
day+=214;break;
case5:
day+=245;break;
case4:
day+=275;break;
case3:
day+=306;break;
case2:
day+=334+flag;break;
case1:
day+=365+flag;break;
}
day-=temp;/*减去1号的6天*/
day=day%7;
first_day=(7-day)%7;/*反对称*/
}
switch(month)
{
case1:
case3:
case5:
case7:
case8:
case10:
case12:
month=31;break;
case4:
case6:
case9:
case11:
month=30;break;
case2:
month=28+flag;
}
printf("SunMonTueWedThuFriSat\n");
for(i=1;i<=4*first_day;i++)/*输出空格*/
printf("");
for(i=0;i{
printf("%4d",i+1);/*输出日历*/
if((first_day+i)%7==6)
printf("\n");
}
printf("\n");
printf("============================\n");
}
voidmain()
{
intyear,i;
printf("Inputtheyear:
");
scanf("%d",&year);
while(year<=0)
{
printf("输入错误,请重新输入");
scanf("%d",&year);
fflush(stdin);
}
printf("\n");
printf("Thecalendaroftheyear%d.\n",year);
printf("\n");
printf("============================\n");
for(i=1;i<13;i++)
{
printf("%d月份\n",i);
rili(year,i);
}
}
八、测试情况:
当输入小于或等于0的年份时,程序会输出错误提示;当输入大于0的年份时程序会输出该年12个月份的日历情况。
2011(平年):
2000(闰年):
参考书目:
[1]秦锋.数据结构[M].合肥:
中国科学技术大学出版社,2006.
[2]罗文劼,王苗,石强.数据结构习题解答与实验指导[M].北京:
中国铁道出版社,2001.
[3]何军,胡元义.数据结构500题[M].北京:
清华大学出版社,2003.