万年历C语言课程设计报告Word文档格式.docx
《万年历C语言课程设计报告Word文档格式.docx》由会员分享,可在线阅读,更多相关《万年历C语言课程设计报告Word文档格式.docx(28页珍藏版)》请在冰豆网上搜索。
如果是12月31号,则增加日期后进入到下一年的1月1号,如果是某一个月的最后一天,则增加日期后进入到下一个月的第一天;
如果是Q/q键表示查询日期,此时将输出提示信息,提示用户输入查询日期。
在用户输入查询日期后,系统就爱那个调用日期检查函数对输入日期的合法性进行检测,如果输入日期不合格,则提示错误信息并显示当前系统日期所在月的月历;
如果是空格键表示重置,显示当前系统日期所在月的月历;
如果是Esc键表示退出系统,按此键后,系统将询问用户是否确定退出,在得到确定回答(用户输入Y/y)后将退出系统。
2、函数功能描述
1)checkDate()
函数原型:
voidcheckDate()
checkDate()函数用于检查输入日期的合法性,包括检查输入日期中的年、月、日部分。
对于年,检查其是否是负数或者是0;
对于月,检查其是否是范围在1~12中的值;
对于日,检查其是否是范围在1~31中的值。
如果有一个部分不合法,则程序提示用户。
2)isLeapyear()
intisLeapyear(intyear)
isLeapyear()函数用于判断制定月份是否是闰年。
参数year为待判断的年份。
3)getWeek()
intgetWeek(intyear,intmonth,intday)
getWeek()函数用于计算并返回给定日期对应的星期。
其中参数year、month和day都为整型,分别表示输入的年、月和日。
4)printSpace()
voidprintSpace(intn)
printSpace()函数用于输出制定个数的空格。
其中整型参数n表示需要输出的空格的个数。
5)printSepatator()
voidprintSeparator()
printSeparator()函数用于在制定位置输出用户使用手册。
输出位置在函数中已经设定。
7)printWeek()
voidprintWeek()
printWeek()函数用于输出当前日期对应的星期,即由currentYear,currentMonth和currentDay确定的日期对应的星期。
该函数首先调用getWeek()函数返回当前日期对应的星期。
8)printWeek2()
voidprintWeek2(intweek)
printWeek2()函数用于根据制定值输出星期。
参数week是一个整型变量,其值可取0到6,分别表示星期一到星期日。
8)showCalendar()
voidshowCalendar(intyear,intmonth,intday)
showCalendar()函数用于显示日历。
参数year,month和day分别表示年、月和日。
该函数显示year所在年是否是闰年,显示month所在月的月历,突出显示day所在日的日期。
10)getKeyValue()
voidgetKeyValue()
getKeyValue()函数用于获取键盘的输入。
根据键盘的输入(上下移键、左右移键、上下翻页键、Q/q键)调整当前日期,并显示当前日期所在月的月历等。
4、遇到的问题和相应的解决措施
1.dos.h头文件不能在常用的VisualC++里使用。
若使用TurboC,则键入的汉字无法显示,且无法复制粘贴。
解决措施:
经过上网查询和询问同学,知道了导致问题的原因,但若把dos.h在visualc++中换成time.h,过程太复杂,很难实现。
最后,我们跟同学借了一个win-TC,是C语言程序,且可以使用中文和进行复制粘贴;
2.键入程序代码的时候显示“非法字符’?
(0xa3)在showCalender函数中”
解决措施:
把showCalender函数全部检查一遍也没有找出问题所在,然后咨询老师,经验丰富的老师一眼看出函数中的一个左括号是用拼音输出的,不是英文;
3.程序可以运行,但应该只显示一个向下箭头的地方显示了三行,且覆盖了其他的字符。
认真的又检查了一遍,发现“指定输出字符为向下的箭头”的函数中,_CX=01,写成了_CH=01;
4.万年历需要获取系统时间,不知从何下手。
经查阅资料,得知应用:
currentYear=sysTime.da_year;
currentMnth=sysTime.da_mon;
currentDay=sysTime.da_day;
5、心得体会
经历了这次课程设计的设计和制作的整个过程,我们才发现我们知识的贫乏和知识面的狭窄,原本以为不就是一个小小的课程设计,小case,很容易就可以搞定,可是到了后来实际的操作的时候可是花费了我们九牛二虎之力,不说其他的,只说时间上面,我们就花费了大把的时间,当然我们也从中体会了很多平时不能收获的东西。
经过一个多月的自主上机和三个多星期的大作业编写,我们一队三人的齐心努力,查阅书籍,上网查询等各种途径,完成了这次的大作业编写。
其中遇到了很多问题,一一解决的过程让我们学会了很多,当然有很多最初的构想没有实现,这也是我们的遗憾之处。
这次作课程设计我们也是收获很大,我们更深入的体会到团队的重要性,通过自学学到了更多C语言的编译,如插入颜色,读取系统时间等,这会是我们终身的财富。
首先,我们对C语言有了更深的了解,使用起来也更加的熟练,原来有一些不知道和不熟悉的函数,我们学会用了。
其次,我们这一次找了不少的资料,找专业的书籍、上网找各方面的资料,也使我们学到了一些书本中学不到的知识,让我们长了见识。
同时我们同学之间也互相的探讨,也增进了我们同学之间的感情。
这次的万年历设计,虽然我们自己觉的很有的成就感,但是这必竟是我们第一次C语言的课程设计,必然会有很多的不足之处有待改进,相信以后我们一定会做的更好。
同时也感谢老师们的耐心讲解与指导,我们期待下一次可以做的更好!
【程序代码】
/*加载头文件*/
#include<
stdio.h>
bios.h>
dos.h>
conio.h>
graphics.h>
string.h>
stdlib.h>
/*定义常量*/
/*左移键*/
#defineLEFT0x4b00
/*右移键*/
#defineRIGHT0x4d00
/*下移键*/
#defineDOWN0x5000
/*上移键*/
#defineUP0x4800
/*向上翻页键*/
#definePAGEUP0x4900
/*向下翻页键*/
#definePAGEDOWN0x5100
/*小写字母q*/
#defineQLOWER0x1071
/*大写字母Q*/
#defineQUPPER0x1051
/*空格键*/
#defineSPACE0x3920
/*Esc键*/
#defineESC0x011b
/*定义全局变量*/
structdatesysTime;
intcurrentYear;
intcurrentMonth;
intcurrentDay;
intn_currentMon;
intn_lastMon;
/*--------------------------自定义函数-------------------------*/
voidcheckDate();
intisLeapyear(intyear);
intgetWeek(intyear,intmonth,intday);
voidprintSpace(intn);
voidprintSaparator();
voidprintUsage();
voidprintWeek();
voidprintWeek2(intweek);
voidshowCalendar(intyear,intmonth,intday);
voidgetKeyValue();
welcome()
{
inti,graphdriver,graphmode,size,page;
chars[30];
graphdriver=DETECT;
initgraph(&
graphdriver,&
graphmode,"
"
);
cleardevice();
setbkcolor(BLUE);
setviewport(40,40,600,440,1);
setfillstyle(1,2);
setcolor(YELLOW);
rectangle(1,1,560,400);
floodfill(50,50,14);
rectangle(20,20,540,380);
setfillstyle(1,13);
/*开图视口*/
/*用绿色填画出的矩形框*/
floodfill(2l,300,14);
setcolor(BLACK);
settextstyle(1,0,6);
/*用淡洋红色填画出的矩形框*/
/*设要显示字符串的字形方向,尺寸*/
outtextxy(100,60,"
Welcomyou"
setviewport(100,150,540,380,0);
/*又开一窗口*/
setcolor(14);
setfillstyle(1,10);
rectangle(20,20,420,120);
settextstyle(2,0,9);
floodfill(21,100,14);
/*用深蓝色填充*/
sprintf(s,"
Heygirl!
!
Doyouwanttoknow?
/*将字符串存到s字符数组*/
setcolor
(1);
settextstyle(10,0,10);
/*设选用字形4,放大3倍,水平设置*/
outtextxy(110,80,s);
/*显示s字符串*/
getch();
closegraph();
}
/*功能控制模块*/
/*检查日期有效性函数*/
/*如果给定的日期中年份部分为负数或者0*/
if(currentYear<
=0)
gotoxy(1,27);
printf("
Theyearshouldbeapositivenumber!
\n"
gotoxy(1,28);
Pressanykeytocomtinue......."
getchar();
/*以当前系统时间重新赋值*/
currentMonth=sysTime.da_mon;
currentDay=sysTime.da_day;
/*如果给定的日期中月份部分为负数,为0或者大于12*/
if(currentMonth>
12||currentMonth<
1)
{gotoxy(1,27);
Themonthshouldbeanumberbetween1and12!
Pressanykeytocontinue......"
/*如果给定的日期中天数部分为负数,为0或者大于31*/
if(currentDay>
31||currentDay<
Thedayshouldbeanumberbetween1and31!
}
/*判断是否是闰年函数*/
/*闰年的判断:
(1)year被4整除,并且year不被100整除
或
(2)year被4整除,并且被400整除*/
if(year%4==0&
&
year%100||year%400==0)
return1;
else
return0;
/*根据给定日期计算星期函数*/
intleapFlag;
intweek;
inti;
/*该数组用于保存每个月的天数*/
inta[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
intcount=0;
/*判断给定年份是否是闰年*/
leapFlag=isLeapyear(year);
/*如果是闰年则2月份的日期应该为29天*/
if(leapFlag==1)
a[2]++;
/*计算从给定年份的1月1日到给定月份的1号之间的天数*/
for(i=1;
i<
month;
i++)
{
count+=a[i];
}
/*计算从给定年份的1月1日到给定日期之间的天数*/
count+=day;
/*计算星期*/
week=(year+1+(year-1)/4+(year-1)/100+(year-1)/400+count)%7;
returnweek;
/*打印输出模块*/
/*输出指定个数空格函数*/
for(i=0;
n;
printf("
"
/*输出分割线函数*/
38;
="
/*输出使用方法函数*/
voidprintUsage()
gotoxy(45,3);
/*设定字体颜色*/
textcolor(YELLOW);
/*送格式化输出至屏幕*/
cprintf("
-----------Usage-----------"
gotoxy(45,5);
YEAR"
gotoxy(50,5);
Upkey()toincrease;
gotoxy(50,7);
Downkey()todecrease.\n"
gotoxy(45,9);
MONTH:
gotoxy(50,9);
Rightkey()toincrease;
gotoxy(50,11);
Leftkey()todecrease.\n"
gotoxy(45,13);
DAY"
gotoxy(50,13);
PageDownkeytoincrease;
gotoxy(50,15);
PageUpkeytodecrease.\n"
gotoxy(45,17);
QUERY"
gotoxy(50,17);
Q/qkey\n"
gotoxy(45,19);
RESET"
gotoxy(50,19);
SPACEkey.\n"
gotoxy(45,21);
EXIT"
gotoxy(50,21);
Esckey\n"
gotoxy(59,5);
/*设置寄存器,表示在指定位置输出一次指定的字符*/
_CX=01;
_AH=0xa;
/*指定输出字符为向上的箭头*/
_AL=24;
/*产生一次中断,输出向上的箭头*/
geninterrupt(0x10);
gotoxy(61,7);
/*指定输出字符为向下的箭头*/
_AL=25;
gotoxy(62,9);
_AL=26;
/*指定输出字符为向右的箭头*/
gotoxy(61,11);
/*指定输出字符为向左的箭头*/
_AL=27;
/*还原字体颜色*/
textcolor(7);
/*根据系统日期输出星期函数*/
intday;
/*根据日期获得星期*/
day=getWeek(currentYear,currentMonth,currentDay);
textcolor(11);
/*输出星期,0表示星期天,1表示星期一……6表示星期六*/
if(day==0)
%d-%d-%d,Sunday!
currentYear,currentMonth,currentDay);
if(day==1)
%d-%d-%d,Monday!
if(day==2)
%d-%d-%d,Tuesday!
if(day==3)
%d-%d-%d,Wednesday!
if(day==4)
%d-%d-%d,Thursday!
if(day==5)
%d-%d-%d,Friday!
if(day==6)
%d-%d-%d,Saterday!
/*输出指定星期函数*/
if(week==0)
Sunday"
if(week==1)
Monday"
if(week==2)
Tuesday"
if(week==3)
Wendesday"
if(week==4)
Thursday"
if(week==5)
Friday"
if(week==6)
Staturday"
/*日历显示模块*/
/*显示日历函数*/
intj;
/*输出的日期*/
intoutDay;
/*本月第一个星期中,在上月的天数*/
intdayLastMon;
inta[13]={0,31,28,31,30,31,30,