C语言课程设计实验报告万年历.docx
- 文档编号:25328821
- 上传时间:2023-06-07
- 格式:DOCX
- 页数:24
- 大小:123.20KB
C语言课程设计实验报告万年历.docx
《C语言课程设计实验报告万年历.docx》由会员分享,可在线阅读,更多相关《C语言课程设计实验报告万年历.docx(24页珍藏版)》请在冰豆网上搜索。
C语言课程设计实验报告万年历
C语言课程设计
一、题目及功能描述
题目:
万年历的设计
利用C语言设计出万年历,使其实现如下要求
1、输入一个年份,在屏幕上输出该年的年历(包括每月的天数和所对应的星期几),并且在每月的左上角或右上角打印出相应的年份和月份,要求输出界面尽可能整齐、美观,符合年历显示规范。
假定输入的年份在1-9999年之间。
2、输入年月,输出该月的月历。
3、输入年月日,输出距今天还有多少天,是星期几,是否是公历节日。
:
4、指定键盘的某些键,用于控制变换不同年、月、日的显示。
即:
当前若正在显示2011年的年历,按下键盘“←”方向键后,年历变为2010年的。
二、使用的所有变量的说明
变量说明:
(以下均为整型变量)
year表示年份的变量
month表示月份的变量
day表示日期的变量
select表示菜单选择的变量
i表示月份的变量
j表示一个月中的某一天的变量
sum判断某天是一年中的第几天的变量
number判断某天离公元1年1月1日还有几天的变量
a[]表示每月天数的数组变量
year1系统时间年份的变量
month1系统时间月份的变量
day1系统时间日期的变量
三、程序清单及其说明
#include"time.h"/*包含的头文件*/
#include"stdio.h"
#include"math.h"
#include"windows.h"
#include"conio.h"
#defineKEYNUMUp0x48/*宏定义*/
#defineKEYNUMDown0x50
#defineKEYNUMLeft0x4b
#defineKEYNUMRight0x4d
#defineKEYNUMPageUp0x49
#defineKEYNUMPageDown0x51
inteachyeartotal(intyear,intmonth,intday);/*函数声明*/
intcounterdays(intyear,intmonth,intday);
intnowtime(intyear,intmonth,intday);
intweek(intyear,intmonth,intday);
intmaxDay(intyear,intmonth);
intisleap(intyear);
voidwhatweek(intyear,intmonth,intday);
voiddisplay(intyear,intmonth);
voiddisplay2(intyear,intmonth);
voiddisplay3(intyear,intmonth,intday);
voidsetDay1(intyear,intmonth,intday);
voidsetDay2(intyear,intmonth,intday);
voidsetDay3(intyear,intmonth,intday);
voidjieri(intmonth,intday);
voiddisplay1(intyear);
voidgetmenu();
voidmain()/*主函数*/
{
intyear,month,day,select;
while
(1)
{
getmenu();
printf("请输入相应数字:
");/*菜单选择*/
scanf("%d",&select);
system("cls");
switch(select)
{
case1:
/*当选择为1时显示年历*/
printf("年历显示:
输入年(如2011):
");
scanf("%d",&year);
if(year>0&&year<10000)/*显示年份从0-10000*/
{
display1(year);/*调用函数*/
printf("提示按↑:
上一年按↓:
下一年按其他键:
返回菜单\n\n");
setDay1(year,month,day);
}
else
system("cls");
printf("输入无效,重新输入!
\n");
break;
case2:
/*当选择为2显示月历*/
printf("月历显示:
输入年月(如2011,6):
");
scanf("%d,%d",&year,&month);
if(year>0&&year<10000&&month>=1&&month<=12)
{
display2(year,month);
printf("提示按←:
上个月按→:
下个月按其他键:
返回菜单\n\n");
setDay2(year,month,day);
}
else
system("cls");
printf("输入无效,重新输入!
\n");
break;
case3:
/*当选择为3时显示日期*/
printf("日期显示:
输入年月日(比如2011,6,23):
");
scanf("%d,%d,%d",&year,&month,&day);
if(year>0&&year<10000&&month>=1&&month<=12&&day>=1&&day<=maxDay(year,month))
{
display3(year,month,day);
printf("提示按PageUp:
前一天按PageDown:
后一天按其他键:
返回菜单\n\n");
setDay3(year,month,day);
}
else
system("cls");
printf("输入无效,重新输入!
\n");
break;
case4:
exit(0);
default:
/*当输入其他数字时,输入无效,重新输入*/
system("cls");
printf("输入无效,重新输入!
\n");
}
}
}
intisleap(intyear)/*判断是否为闰年*/
{
if(year%4==0&&year%100!
=0||year%400==0)
return1;
else
return0;
}
intmaxDay(intyear,intmonth)/*每月的天数*/
{
inta[]={31,28,31,30,31,30,31,31,30,31,30,31};/*每个月中的天数*/
if(isleap(year))
a[1]=29;/*闰年2月份有29天*/
returna[month-1];
}
inteachyeartotal(intyear,intmonth,intday)/*判断某天是一年中的第几天*/
{
inti,sum=0;
for(i=1;i sum+=maxDay(year,i); sum+=day; returnsum; } intweek(intyear,intmonth,intday)/*对天数进行判断确定是星期几*/ { intnumber=(year-1)+(year-1)/4-(year-1)/100+(year-1)/400 +eachyeartotal(year,month,day); number=number%7; returnnumber; } voiddisplay(intyear,intmonth)/*输出年月*/ { intmax,number,i,j=1; max=maxDay(year,month); number=week(year,month,1); printf("%4s%4s%4s%4s%4s%4s%4s\n","Sun","Mon","Tue","Wed", "Thu","Fri","sat"); for(i=0;i printf("");/*1号前的星期补空格*/ while(j<=max) { printf("%6d",j); if(i%7==6) printf("\n");/*每7格换一行*/ i++; j++; } printf("\n\n"); } voiddisplay1(intyear)/*输出年历*/ { inti; printf("\n"); for(i=1;i<=12;i++) { printf("%d年%d月\n\n",year,i); display(year,i); } } voiddisplay2(intyear,intmonth)/*输出月历*/ { printf("\n%d年%d月\n",year,month); display(year,month); } voiddisplay3(intyear,intmonth,intday)/*输出日历*/ { whatweek(year,month,day); jieri(month,day); counterdays(year,month,day); } intcounterdays(intyear,intmonth,intday)/*判断今天距特定日期的天数*/ { intyear1,days0,days1,month1,days,day1; time_ttimep; structtm*p; time(&timep); p=gmtime(&timep); year1=(1900+p->tm_year); month1=(1+p->tm_mon); day1=(p->tm_mday);/*获取系统时间year1、month1、day1分别为年、月、日*/ days0=(year-1)*365+(year-1)/4-(year-1)/100+(year-1)/400+eachyeartotal(year,month,day); days1=(year1-1)*365+(year1-1)/4-(year1-1)/100+(year1-1)/400+eachyeartotal(year1,month1,day1); days=days0-days1;/*计算出两个日期之间的时间差*/ printf("\n今天距%d年%d月%d日还有%d天\n\n",year,month,day,days); returndays; } voidwhatweek(intyear,intmonth,intday)/*判断是星期几*/ { intnumber; number=(year-1)+(year-1)/4-(year-1)/100+(year-1)/400+eachyeartotal(year,month,day); number=number%7; switch(number) { case0: printf("\n%d年%d月%d日是星期日",year,month,day);break; case1: printf("\n%d年%d月%d日是星期一",year,month,day);break; case2: printf("\n%d年%d月%d日是星期二",year,month,day);break; case3: printf("\n%d年%d月%d日是星期三",year,month,day);break; case4: printf("\n%d年%d月%d日是星期四",year,month,day);break; case5: printf("\n%d年%d月%d日是星期五",year,month,day);break; case6: printf("\n%d年%d月%d日是星期六",year,month,day);break; default: system("cls"); printf("出现错误! \n"); } } voidjieri(intmonth,intday)/*判断是否公历节日*/ { if(month==1) switch(day) { case1: printf(",这天是元旦"); } if(month==2) switch(day) { case14: printf(",这天是情人节"); } if(month==3) switch(day) { case8: printf(",这天是妇女节"); break; case12: printf(",这天是植树节"); } if(month==4) switch(day) { case1: printf(",这天是愚人节"); } if(month==5) switch(day) { case1: printf(",这天是劳动节"); break; case4: printf(",这天是青年节"); } if(month==6) switch(day) { case1: printf(",这天是儿童节"); } if(month==7) switch(day) { case1: printf(",这天是建党节"); } if(month==8) switch(day) { case1: printf(",这天是建军节"); } if(month==9) switch(day) { case10: printf(",这天是教师节"); } if(month==10) switch(day) { case1: printf(",这天是国庆节"); } } voidsetDay1(intyear,intmonth,intday)/*通过键盘“↑”“↓”控制年历的变换*/ {chark; getch(); k=getch(); switch(k) { caseKEYNUMUp: /*“↑”年份减小*/ if(year<2) { system("cls"); printf("警告! 超出范围! \n"); break; } year--; display1(year); setDay1(year,month,day); break; caseKEYNUMDown: /*“↓”年份变大*/ year++; display1(year); setDay1(year,month,day); break; default: system("cls"); } } voidsetDay2(intyear,intmonth,intday)/*通过键盘“←”“→”控制月历的变换*/ { chark; getch(); k=getch(); switch(k) { caseKEYNUMLeft: /*“←”月份变小*/ if(month<2) { month+=12; year--; } if(year<1) { system("cls"); printf("警告! 超出范围! \n"); break; } month--; display2(year,month); setDay2(year,month,day); break; caseKEYNUMRight: /*“→”月份变小*/ if(month>11) { month-=12; year++; } if(year<9999); month++; display2(year,month); setDay2(year,month,day); break; default: system("cls"); ; } } voidsetDay3(intyear,intmonth,intday)/*通过键盘“PageUp”“PageDown”控制日期的变换*/ { chark; getch(); k=getch(); switch(k) { caseKEYNUMPageUp: /*“PageUp”日期变小*/ if(day<2) { month--; day=maxDay(year,month); } if(month<1) { month+=12; year--; } if(year<1) { system("cls"); printf("警告! 超出范围! \n"); break; } day--; display3(year,month,day); setDay3(year,month,day); break; caseKEYNUMPageDown: /*“PageDown”日期变大*/ day++; if(day>maxDay(year,month)) { day=1; month++; } if(month>12) { month-=12; year++; } if(year<10000); display3(year,month,day); setDay3(year,month,day); break; default: system("cls"); ; } } voidgetmenu()/*显示菜单选择*/ { printf("************主菜单************\n\n"); printf("*欢迎进入万年历系统*\n\n"); printf("*1、年历显示*\n\n"); printf("*2、月历查询*\n\n"); printf("*3、日期查询*\n\n"); printf("*4、退出系统*\n\n"); printf("******************************\n\n"); } 四、运行结果清单 打开软件,进入如下菜单界面,输入数字进行选择 1年历的显示 (1)输入数字1进入年历的显示 (2)输入年份2011,显示2011年的年历如下 (3)按↑键盘显示上一年(2010年)的年历,显示如下 (4)按↓键盘显示上一年(2012年)的年历,显示如下 2、月历的显示 (1)在菜单中选择2,进入月历的显示,输入2011,6,显示2011年6月份的月历,显示效果如下 (2)按←键盘显示上一个月(5月)的月历,显示效果如下 (3)按→键盘显示上上个月(7月)的月历,显示效果如下 3、日历的显示 (1)输入选择3进入日历的显示,如图输入2011,10,1显示这天的星期,是否为公历节日,距离现在还有多少天 (2)按PagDown显示前一天的日历,显示如下 (3)按PagUp显示后一天的日历,显示如下 4退出程序 输入选择4,显示如下界面,按任意键退出程序 五、总结和体会。 本次用C语言编写的万年历系统主要实现了年历、月历、日历的显示,并且可通过键盘来变换相应的年月日,最终的设计结果达到的这些要求,是一次成功的课程设计。 在设计初期,首先温习了课本内容,再次熟熟悉了C程序,然后广泛的查找有关万年历的资料,并结合查找到的资料,整理出设计的主要思路,画出流程图,最终写出了源程序,并编译成功,在实验中,碰到了不少问题,其中包括如何获取系统时间,如何计算任意时间的时间差,这些困难,都通过查阅资料和问同学得到了解决。 当然,由于时间和能力的原因,选作部分农历的显示没有实现。 通过这次课程设计,使我对C语言了解不在停留在书面的了解,而是有了更深的理解,培养了自己的分析能力和设计能力,受益匪浅。 附: 参考文件 [1]谭浩强.C程序设计(第三版).北京: 清华大学出版社.2005 [2]谭浩强.C程序设计题解与上机指导(第三版).北京: 清华大学出版社.2005 [3]徐慧林锐C语言实例解析精粹.武汉: 华中理工大学出版社.1996 [4]戴建鹏译C语言大全(第三版).北京: 电子工业大学出版社.1994
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 课程设计 实验 报告 万年历