C语言课程设计万年历.docx
《C语言课程设计万年历.docx》由会员分享,可在线阅读,更多相关《C语言课程设计万年历.docx(19页珍藏版)》请在冰豆网上搜索。
C语言课程设计万年历
石家庄铁道大学课程设计
单位电气与电子工程分院(系)
专业电气信息类
学号
学生姓名
指导教师
完成日期2012年6月20日
摘要
万年历是生活中经常用到的东西,它不仅能够查询本年的日期信息,也能查询若干年前或若干年后的日期信息。
本工具就是基于开发工具Win—TC做出的万年历,功能齐全,包括默认显示当前日期,查询年历、月历、日历等,界面整洁,显示清晰。
关键词:
万年历,Win-TC,功能齐全
第1章选题的意义
1.1自我介绍
班级:
电09学号:
姓名:
专业:
电气信息类
1.2选题名称
万年历的设计
1.3选择本题的意义
随着生活节奏的加快,人们不可能仅仅满足对当天的日程进行安排,往往需要对几天、几个月甚至几年之后的工作进行安排,这就需要充分了解当天的信息,包括年、月、日、星期、是否为闰年等等。
万年历就能很好的完成这项工作。
因此,一个界面整洁,显示清晰的万年历显得尤为重要,它不仅能帮助人们了解将来的日期信息,也能帮助人们回忆过去的日子,让看上去烦乱的日期表变得简明而直观。
1.4选择本题对C语言学习的意义
在程序设计过程中,会用到C语言的许多知识,包括数组、指针;结构体、文件、循环结构等等,通过设计的训练,会对C语言有更深刻的了解,掌握利用C语言相关函数开发万年历的基本原理,为以后的学习与开发打下坚实的基础。
1.5时间安排
5月22日对所选题目用到的知识点上机实验。
5月23日初步完成课程设计报告中“选题意义”部分的内容。
根据课程设计任务书要求,进行系统功能需求分析和设计;设计初始代码框架。
5月29日系统功能需求分析,系统设计;初步完成课程设计报告“系统功能需求分析”,“系统设计”部分的内容。
5月30日完善课程设计报告“系统功能需求分析”,“系统设计”部分的内容,并上传服务器;设计初始代码,部分功能实现。
6月5日编写程序代码;部分功能实现;补充完善课程设计报告“系统功能需求分析”、“系统设计”。
6月6日编写程序代码;部分功能实现;补充完善课程设计报告“系统功能需求分析”、“系统设计”。
6月12日编写程序代码;部分功能实现;补充完善课程设计报告“系统功能需求分析”、“系统设计”。
6月13日编写程序代码;完成全部功能;补充完善课程设计报告“系统功能需求分析”、“系统设计”。
6月19日调试代码;完成功能;撰写课程设计报告
6月20日调试代码、美化界面;运行完成全部功能;撰写课程设计报告。
1.6参考资料
1.《C语言程序设计实例精粹》.谭明金.电子工业出版社
2.《C语言编程技巧及实用程序荟萃》.鲁沐浴.电子工业出版社
3.《C语言解惑》.AlanR.Feuer.人民邮电出版社
4.《C语言实例解析精粹》.曹衍龙.人民邮电出版社
5.《C语言实战105例》.王为青.人民邮电出版社
6.MSDN
第2章系统功能需求分析
2.1系统的基本要求
要求实现日历显示、查询任意日期功能,进行日期合法性检查功能。
1.日历显示功能。
该日历能够根据系统日期进行初始化,如果没有任何的输入,则会显示系统日期所在月份的月历,并能突出显示当前日期。
2.日期查询、闰年判断功能。
输入日期进行查询,查询后将显示查询日期所在月份的月历,并突出显示查询日期。
如果是闰年,则给出提示。
3.日期合法性检查功能。
程序还设置有对输入的日期进行合法性检查功能,如果年份、月份或者天数不合法,查询将被拒绝,并显示提示信息。
4.支持通过键盘操作设定系统日期。
通过键盘的操作调整年份、月份和日期,并显示调整后的日期。
还可以通过键盘操作复位到系统所在日期等。
如:
左移键表示减少月份、右移键表示增加月份;上移键表示减少年份、下移键表示增加年份;如S键表示显示系统日期;如果按ESC键,表示退出系统等。
2.2功能模块
显示部分:
显示系统当月月历,突出显示当前日期,并且能够翻阅万年历;
查询部分:
根据用户输入,查询用户所需的日期信息.
2.3流程图说明
(1)显示系统的当前日期
用函数getdate()获得系统当前时间;用printWNL()函数打印当天的日历;根据用户←、→、↑、↓的输入进行年、月的翻查;Tab键表示用户需要输入进行查询,点此键可进入第二部分,Esc退出;
(2)根据用户输入,查询其它日期:
isLeap()判断输入数据是否是闰年;maxDay()判断某年某月最多天数;eachYearTotal()判断这一天是该年的第几天;week判断某年某月某日的编号;output()输出该天星期几;display()显示当前月历;check()检查有效性;display3()输出日历;getMenu()调菜单;
第3章系统设计
3.1流程图
3.2数据结构
a[]={31,28,31,30,31,30,31,31,30,31,30,31};存储1~12月每个月的天数
3.3中心算法代码
voidprintWNL(int,int);简单格式打印万年历
intWeek(int,int,int);求星期几
intgetDays(int,int);计算某个月的天数
intisRunNian(int);判断是否闰年
inteachYearTotal(intyear,intmonth,intday);判断是第几天
intweek(intyear,intmonth,intday);判断星期几
intcheck(intyear,intmonth,intday);检查输入
display();显示当前月历;
voiddisplay3(intyear,intmonth,intday);输出日历;
第4章系统实现
4.1程序代码
#include
#include
#include
#include
#include
#include
#defineup72
#definedown80
#defineleft75
#defineright77
#defineTab9
#defineEsc27
#defines115
voidprintWNL(int,int);
intWeek(int,int,int);
intgetDays(int,int);
intisRunNian(int);
intisLeap(intyear);
intmaxDay(intyear,intmonth);
inteachYearTotal(intyear,intmonth,intday);
intweek(intyear,intmonth,intday);
char*chineseWeek(intnumber);
voidoutput(intyear,intmonth,intday);
voiddisplay(intyear,intmonth);
intcheck(intyear,intmonth,intday);
voiddisplay1(intyear);
voiddisplay2(intyear,intmonth);
voiddisplay3(intyear,intmonth,intday);
voidgetMenu();
voidmain()
{
intyear,month,q,y,m,d1;
structdated;
charch;
intday,flag,select;
getdate(&d);
year=d.da_year;
month=d.da_mon;
day=d.da_day;
y=d.da_year;
m=d.da_mon;
d1=d.da_day;
do
{
system("cls");
printf("今天是:
%d月%d日",m,d1);
q=isLeap(year);
if(q==1)printf("\n注:
本年为闰年.");
printf("\n");
printWNL(year,month);
ch=getch();
if(ch==Esc)
gotostop;;
if(ch==Tab)
break;
elseif(ch==0)
ch=getch();
switch(ch)
{cases:
{year=d.da_year;
month=d.da_mon;
day=d.da_day;};break;
caseleft:
year--;break;
caseright:
year++;break;
caseup:
month--;
if(month==0)
{
month=12;
year--;
}
break;
casedown:
month++;
if(month==13)
{
month=1;
year++;
}
break;
default:
;
}
}while
(1);
printf("\n请选择(输入相应数字):
");
while
(1)
{
getMenu();
printf("输入选择:
");
fflush(stdin);
scanf("%d",&select);
fflush(stdin);
switch(select)
{
case1:
do
{
printf("输入年月日(年、月、日之间加空格):
");
scanf("%d%d%d",&year,&month,&day);
flag=check(year,month,day);
if(flag==0)
{
printf("输入有误,请重新输入!
\n");
}
}while(flag==0);
display3(year,month,day);
break;
case2:
exit(0);
default:
printf("输入有误,请重新输入!
\n\n");
}
q=isLeap(year);
if(q==1)printf("注:
本年为闰年.\n");
}
stop:
printf("谢谢使用!
\n");
}
voidprintWNL(inty,intm)
{
inti,j;
intday=1-Week(y,m,1);
intdays=getDays(y,m);
printf("%4d年%2d月\n",y,m);
printf("日一二三四五六\n");
for(i=1;i<=6;i++)
{
for(j=1;j<=7;j++)
{
if(day<=0||day>days)
printf("");
else
printf("%3d",day);
day++;
}
printf("\n");
}
printf("操作说明:
【←】减年【→】加年【↑】减月【↓】加月\n【Tab】查询【s】复位到系统时间【Esc】退出\n");
}
intWeek(inty,intm,intd)
{
intdays=0;
inti;
for(i=1;idays+=isRunNian(i)?
366:
365;
for(i=1;idays+=getDays(y,i);
days+=d;
returndays%7;
}
intisRunNian(inty)
{
return(y%4==0&&y%100!
=0||y%400==0)?
1:
0;
}
intgetDays(inty,intm)
{
intdays=0;
switch(m)
{
case1:
case3:
case5:
case7:
case8:
case10:
case12:
days=31;break;
case4:
case6:
case9:
case11:
days=30;break;
case2:
days=isRunNian(y)?
29:
28;break;
default:
;
}
returndays;
}
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;
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%=7;
returnnumber;
}
char*chineseWeek(intnumber)
{
switch(number)
{
case0:
return"星期天";
case1:
return"星期一";
case2:
return"星期二";
case3:
return"星期三";
case4:
return"星期四";
case5:
return"星期五";
case6:
return"星期六";
default:
return"error";
}
}
voidoutput(intyear,intmonth,intday)
{
intnumber=week(year,month,day);
printf("%d年%d月%d日%10s\n\n",year,month,day,chineseWeek(number));
}
voiddisplay(intyear,intmonth)
{
intmax,number,i,j=1;
max=maxDay(year,month);
number=week(year,month,1);
printf("%5s%5s%4s%4s%4s%4s%4s\n","日","一","二","三","四","五","六");
for(i=0;i{
printf("");
}
while(j<=max)
{
printf("%4d",j);
if(i%7==6)
{
printf("\n");
}
i++;
j++;
}
printf("\n\n");
}
intcheck(intyear,intmonth,intday)
{
if(year<0||month<1||month>12||day<1||day>maxDay(year,month))
return0;
else
return1;
}
voiddisplay3(intyear,intmonth,intday)
{
printf("\n");
output(year,month,day);
display(year,month);
}
voidgetMenu()
{
printf("\n1.输入查询日期\t2.退出\n");
}
4.2系统使用
进入后默认显示系统当前日期,按←、→键可以进行减年、加年操作;↑、↓可以进行减月、加月操作;在翻阅过程中按s键可以复位到系统日期;按Esc键退出;按Tab键进行查询操作,输入需要查询日期后,会显示查询日期所在月历;如需继续查询,则按1继续查询,否则可按下2退出。
4.3运行效果说明
进入后会显示系统日期,并突出提示当天的日期
可以根据提示进行万年历的翻阅;在翻阅过程中按s键可复位到系统时间;
也可进行查询或者退出.
按下Tab键后,可进行万年历查询,默认显示所查日期的月历.
如果系统日期或者查询日期所在年为闰年,则会给出提示.
第5章总结
5.1独特设计
本万年程序将显示、翻阅、查询合为一体,操作简单,使用方便。
5.2设计中的问题以及收获
在程序设计过程中,最大的问题就是在编写万年历翻阅程序时感觉无从下手,不知道怎样用键盘输入来控制程序的进行,最后在一些资料和老师的帮助下,我才明白,这就是ascall码的运用,只需编写一个条件语句,告诉计算机用户输入控制键的ascall码,就能执行相应的操作。
在switch语句中,编写好每个条件后应该执行的操作即可。
经过这次程序设计之后,我真正明白了理论和实践之间的距离真的很大,把课本上的理论只是运用与实践并不是那么简单,或许在习题中给我一个switch语句让我看,我可以看懂,但是给我一个实际问题,我却没有想到用它,现在程序编写完了,回头想想程序中大部分只是都是学过的,但在实践中的使用却并不容易,这就需要我们在学好理论知识的基础上,多进行实践操作,提高解决实际问题的能力。
5.3设计题目及功能的改进意见
如果能将年历、月历的显示与系统的当前时间加入其中,功能会更加齐全。
5.4结束语
这次C语言课程设计,是真正的将理论与实践结合,不但我的基础知识得到了巩固与提高,同是也增强了我解决实际问题的能力,系统的运用的学过的知识,自己得到了综合的提高。
在课程设计结束后,我还会继续学习C语言,更多的进行实践,不断提高自己。
致谢词
感谢老师在课程设计中对我的帮助,在设计过程中耐心的帮我解决问题,让我的程序更加简单而合理,使设计顺利结束!
鸣谢以下参考文献:
1.《C语言程序设计实例精粹》.谭明金.电子工业出版社
2.《C语言编程技巧及实用程序荟萃》.鲁沐浴.电子工业出版社
3.《C语言解惑》.AlanR.Feuer.人民邮电出版社
4.《C语言实例解析精粹》.曹衍龙.人民邮电出版社
5.《C语言实战105例》.王为青.人民邮电出版社
6.MSDN