万年历课程设计报告Word格式文档下载.docx
《万年历课程设计报告Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《万年历课程设计报告Word格式文档下载.docx(18页珍藏版)》请在冰豆网上搜索。
![万年历课程设计报告Word格式文档下载.docx](https://file1.bdocx.com/fileroot1/2022-11/29/5ab0506b-4e4e-4f25-8b82-7ec463339f73/5ab0506b-4e4e-4f25-8b82-7ec463339f731.gif)
确定设计方案;
3.7月7号至7月12号:
方案的实现、调试与验证,撰写课程设计报告;
4.7月12号至7月14:
完善软件功能,修订并完成课程设计报告书;
1.6收集的参考书籍、文献网络等相关资料
1.《C语言程序设计实例精粹》.谭明金.电子工业出版社
2.《C语言编程技巧及实用程序荟萃》.鲁沐浴.电子工业出版社
3.《C语言解惑》.AlanR.Feuer.人民邮电出版社
4.《C语言实例解析精粹》.曹衍龙.人民邮电出版社
5.《C语言实战105例》.王为青.人民邮电出版社
6.MSDN
第2章系统功能需求分析
2.1系统概述
时间是方便人们科学的安排生活历程,而万年历则是为人们更合理的安排时间。
我编写程序(万年历)就是为了方便人们时时刻刻都能明确具体时间。
在此,我衷心希望该程序能为用户提供方便,让用户拥有更科学的时间观!
2.2系统构成
左边:
万年历显示
右边:
万年历帮助
注:
键盘输入左移、右移键、下移键、上移键、向上翻页移键、向下翻页移键、小写字母q、大写字母Q、空格键、可以实现help对应的功能。
2.3各模块的功能
1.日历显示功能。
2.日期查询、闰年判断功能
3.日期合法性检查功能。
4.支持通过键盘操作设定系统日期。
2.4系统的运行环境
系统的运行环境:
Tc
第三章系统设计
3.1总体结构设计
3.2数据库设计
<
stdio.h>
bios.h>
dos.h>
conio.h>
3.3中心算法代码说明
万年历的显示方法:
voidshowCalendar(intyear,intmonth,intday)
{
inti;
intj;
/*输出的日期*/
intoutDay;
intleapFlag;
/*本月第一个星期中,在上月的天数*/
intdayLastMon;
intweek;
/*该数组用于保存每个月的天数*/
inta[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
outDay=0;
dayLastMon=0;
week=0;
/*判断给定年份是否是闰年*/
leapFlag=isLeapyear(year);
/*如果是闰年则2月应该是29天*/
if(leapFlag==1)
{
a[2]++;
}
/*如果给定的日期中,天数大于该月的最大天数*/
if(day>
a[month])
printf("
Thenumberofthismonth'
sdayis%datmost!
\n"
a[month]);
Pressanykeytocontinue......\n"
);
getchar();
/*以当前系统时间重新赋值*/
year=sysTime.da_year;
month=sysTime.da_mon;
day=sysTime.da_day;
currentYear=sysTime.da_year;
currentMonth=sysTime.da_mon;
currentDay=sysTime.da_day;
/*当前月的天数*/
n_currentMon=a[month];
/*上一月的天数*/
n_lastMon=a[month-1];
/*根据给定日期,获取给定月份1号的星期*/
week=dayLastMon=getWeek(year,month,1);
/*清除文本模式窗口*/
clrscr();
\nTHECALENDERIS%d"
year);
textcolor(10);
/*显示给定年份是否是闰年*/
cprintf("
-{leapyear}-"
if(leapFlag==0)
-{notleapyear}-"
textcolor(7);
printSeparator();
textcolor(RED);
/*输出月份提示,1-12分别表示1月到12月*/
switch(month)
case1:
January1"
break;
case2:
February2"
case3:
March3"
case4:
April4"
case5:
May5"
case6:
June6"
case7:
July7"
case8:
August8"
break;
case9:
September9"
case10:
October10"
case11:
Nevember11"
case12:
December12"
\n\n"
textcolor(13);
SunMonTueWedThuFriSat"
/*因为一个月中最多跨度6个星期,所以循环从0到5*/
for(i=0;
i<
6;
i++)
/*如果是该月的第一个星期*/
if(i==0)
/*第一个星期中还要7-dayLastMon天本月,有dayLastMon天在上个月,
所以输出dayLastMon*4个空格符,每个日期在日历中占用4个空格*/
printSpace(dayLastMon*4);
/*剩余在本月的第一个星期中的天数为7-dayLastMon*/
for(j=0;
j<
7-dayLastMon;
j++)
/*到达day的前一天时,输出++outDay*/
if(outDay==day-1)
/*用黄色字体突出显示*/
[%d]"
++outDay);
/*到达day当天时,并且不是星期天*/
elseif(outDay==day&
&
week!
=0)
%3d"
/*到达day当天时,并且是星期天*/
else
%4d"
/*计算当天的星期,如果前一天是星期六(6),则当天是星期天(0),
其他情况则直接星期加1*/
week=(week<
6)?
week+1:
0;
/*如果不是该月的第一个星期*/
/*则输出该星期中的7天*/
7;
/*输出的天数小于该月的最大天数*/
if(outDay<
/*输出一位数字*/
9)
/*输出两位数字*/
[%2d]"
/*计算当天星期*/
if(outDay==a[month])break;
/*输出分隔线*/
/*输出当前选择的日期和星期*/
Thedayyouchooseis:
printWeek();
gotoxy(1,22);
.............................\n"
/*输出系统日期和星期*/
\nTodayis:
%d-%d-%d"
sysTime.da_year,sysTime.da_mon,sysTime.da_day);
printWeek2(getWeek(sysTime.da_year,sysTime.da_mon,sysTime.da_day));
/*显示按键操作*/
printUsage();
gotoxy(1,25);
}
第四章系统实现
4.1登陆模块的设计与实现
(一)日历显示功能。
运行效果;
中心代码如下:
(如上)
(二)日期查询、闰年判断功能。
中心代码:
intisLeapyear(intyear)
/*闰年的判断:
(1)year被4整除,并且year不被100整除
或
(2)year被4整除,并且year被400整除*/
if(year%4==0&
year%100||year%400==0)
return1;
return0;
(三)日期合法性检查功能。
voidcheckDate()
/*如果给定的日期中年份部分为负数或者0*/
if(currentYear<
gotoxy(1,27);
Theyearshouldbeapositivenumber.\n"
gotoxy(1,28);
Pressanykeytocontinue......"
/*如果给定的日期中月份部分为负数,为0或者大于12*/
if(currentMonth>
12||currentMonth<
1)
Themonthshouldbeanumberbetween1and12.\n"
/*如果给定的日期中天数部分为负数,为0或者大于31*/
if(currentDay>
31||currentDay<
Thedayshouldbeanumberbetween1and31.\n"
(四)支持通过键盘操作设定系统日期。
voidgetKeyValue()
intkey;
charch;
/*默认显示当前系统日期和星期*/
showCalendar(currentYear,currentMonth,currentDay);
while
(1)
/*获取键值,根据键值调整日历输出*/
key=bioskey(0);
/*右移键,增加月份*/
if(key==RIGHT)
/*月份值在1-12之间,则直接加1*/
if(currentMonth<
12&
currentMonth>
=1)
currentMonth++;
/*如果月份为12,则加1后进位,即年份加1,月份变为1*/
currentYear++;
currentMonth=1;
/*左移键,减少月份*/
if(key==LEFT)
/*月份值在1-12之间,则直接减1*/
=12&
currentMonth--;
/*如果月份为1,则减1后,到上一年,月份变为12*/
currentYear--;
currentMonth=12;
/*上移键,增加年份*/
if(key==UP)
/*下移键,减少年份*/
if(key==DOWN)
/*上移键,减少天数*/
if(key==PAGEUP)
/*当前日不是该月的第一天,则天数直接减1*/
if(currentDay!
currentDay--;
/*当前日是该月的第一天,并且是该年的第一个月(即1月1日),
则天数减1后,变为上一年的最后一个月的最后一天(即12月31日)*/
elseif(currentDay==1&
currentMonth==1)
currentDay=31;
/*当前日是该年中某一个月的最后一天,则天数减1后,
变为上个月的最后一天*/
currentDay=n_lastMon;
/*下移键,增加天数*/
if(key==PAGEDOWN)
/*当前日不是该月的最后一天,则天数直接加1*/
if(n_currentMon!
=currentDay)
currentDay++;
/*当前日是该年的最后一天(即12月31日),则天数加1后,
变为下一年的第一个月的第一天(即1月1日)*/
elseif(n_currentMon==currentDay&
currentMonth==12)
currentDay=1;
/*当前日是该年中某一个月的最后一天,则天数加1后,
变为下个月的第一天*/
/*Q或者q键,表示查询指定日期的星期*/
if(key==QLOWER||key==QUPPER)
printf("
Inputdate(eg,%d-%d-%d):
"
scanf("
%d-%d-%d"
&
currentYear,&
currentMonth,&
currentDay);
checkDate();
/*空格键,重置到系统日期*/
if(key==SPACE)
/*Escpe键退出系统*/
if(key==ESC)
Doyoureallywanttoquit?
(Y/N)"
ch=getchar();
if(ch=='
y'
||ch=='
Y'
)
4.2学生信息维护模块的设计与实现
(无)
第5章总结
5.1总结
这次课程设计感受很多,从一开始的一点头绪没有,茫然不知所措,到慢慢进入状态以及到后来程序运行成功的喜悦。
这之间所经历了太多太多。
从一开始凭着自己的感觉选定题目之后,对着选题一遍又一遍发呆,苦想,再到自己着手写代码,到最后加入自己的思想把功能改进得更加完善完美。
其间我学会了很多很多,并且学会了把书本知识更好的运用于实际,同时也更好的掌握了知识,学会了从容得面对困难,懂得了:
付出就会有收获,坚持就是胜利!
5.2存在的主要问题
(1)对于应用数据库知识编写的代码,在运行程序,计算机报错时,不知错误的原因,更不知如何修改。
(2)由于考虑问题不周,没有给出录入的限制条件,并且不知如何处理。
(3)编制的程序常常不能运行。
参考文献:
6.MSDN