1、如果是12月31号,则增加日期后进入到下一年的1月1号,如果是某一个月的最后一天,则增加日期后进入到下一个月的第一天;如果是Q/q键表示查询日期,此时将输出提示信息,提示用户输入查询日期。在用户输入查询日期后,系统就爱那个调用日期检查函数对输入日期的合法性进行检测,如果输入日期不合格,则提示错误信息并显示当前系统日期所在月的月历;如果是空格键表示重置,显示当前系统日期所在月的月历;如果是Esc键表示退出系统,按此键后,系统将询问用户是否确定退出,在得到确定回答(用户输入Y/y)后将退出系统。2、函数功能描述1) checkDate()函数原型:void checkDate()checkDate
2、()函数用于检查输入日期的合法性,包括检查输入日期中的年、月、日部分。对于年,检查其是否是负数或者是0;对于月,检查其是否是范围在112中的值;对于日,检查其是否是范围在131中的值。如果有一个部分不合法,则程序提示用户。2)isLeapyear()int isLeapyear(int year)isLeapyear()函数用于判断制定月份是否是闰年。参数year为待判断的年份。3)getWeek()int getWeek(int year,int month,int day)getWeek()函数用于计算并返回给定日期对应的星期。其中参数year、month和day都为整型,分别表示输入的年
3、、月和日。4)printSpace()void printSpace(int n)printSpace()函数用于输出制定个数的空格。其中整型参数n表示需要输出的空格的个数。5)printSepatator()void printSeparator()printSeparator()函数用于在制定位置输出用户使用手册。输出位置在函数中已经设定。7)printWeek()void printWeek()printWeek()函数用于输出当前日期对应的星期,即由 currentYear,currentMonth和currentDay确定的日期对应的星期。该函数首先调用getWeek()函数返回当前
4、日期对应的星期。8)printWeek2()void printWeek2(int week)printWeek2()函数用于根据制定值输出星期。参数week是一个整型变量,其值可取0到6,分别表示星期一到星期日。8)showCalendar()void showCalendar(int year,int month,int day)showCalendar()函数用于显示日历。参数year,month和day分别表示年、月和日。该函数显示year所在年是否是闰年,显示month所在月的月历,突出显示day所在日的日期。10)getKeyValue()void getKeyValue()get
5、KeyValue()函数用于获取键盘的输入。根据键盘的输入(上下移键、左右移键、上下翻页键、Q/q键)调整当前日期,并显示当前日期所在月的月历等。4、遇到的问题和相应的解决措施1.dos.h头文件不能在常用的Visual C+里使用。若使用Turbo C,则键入的汉字无法显示,且无法复制粘贴。解决措施:经过上网查询和询问同学,知道了导致问题的原因,但若把dos.h在visual c+中换成time.h,过程太复杂,很难实现。最后,我们跟同学借了一个win-TC,是C语言程序,且可以使用中文和进行复制粘贴;2.键入程序代码的时候显示“非法字符?(0xa3)在showCalender函数中” 解决
6、措施:把showCalender函数全部检查一遍也没有找出问题所在,然后咨询老师,经验丰富的老师一眼看出函数中的一个左括号是用拼音输出的,不是英文;3.程序可以运行,但应该只显示一个向下箭头的地方显示了三行,且覆盖了其他的字符。认真的又检查了一遍,发现“指定输出字符为向下的箭头”的函数中,_CX=01,写成了_CH=01;4.万年历需要获取系统时间,不知从何下手。经查阅资料,得知应用:currentYear=sysTime.da_year; currentMnth=sysTime.da_mon; currentDay=sysTime.da_day;5、心得体会经历了这次课程设计的设计和制作的整
7、个过程,我们才发现我们知识的贫乏和知识面的狭窄,原本以为不就是一个小小的课程设计,小case,很容易就可以搞定,可是到了后来实际的操作的时候可是花费了我们九牛二虎之力,不说其他的,只说时间上面,我们就花费了大把的时间,当然我们也从中体会了很多平时不能收获的东西。经过一个多月的自主上机和三个多星期的大作业编写,我们一队三人的齐心努力,查阅书籍,上网查询等各种途径,完成了这次的大作业编写。其中遇到了很多问题,一一解决的过程让我们学会了很多,当然有很多最初的构想没有实现,这也是我们的遗憾之处。这次作课程设计我们也是收获很大,我们更深入的体会到团队的重要性,通过自学学到了更多C语言的编译,如插入颜色,
8、读取系统时间等,这会是我们终身的财富。首先,我们对C语言有了更深的了解,使用起来也更加的熟练,原来有一些不知道和不熟悉的函数,我们学会用了。其次,我们这一次找了不少的资料,找专业的书籍、上网找各方面的资料,也使我们学到了一些书本中学不到的知识,让我们长了见识。同时我们同学之间也互相的探讨,也增进了我们同学之间的感情。这次的万年历设计,虽然我们自己觉的很有的成就感,但是这必竟是我们第一次C语言的课程设计,必然会有很多的不足之处有待改进,相信以后我们一定会做的更好。 同时也感谢老师们的耐心讲解与指导,我们期待下一次可以做的更好! 【程序代码】/*加载头文件*/#includebios.hdos.h
9、conio.hgraphics.hstring.hstdlib.h/*定义常量*/*左移键*/#define LEFT 0x4b00/*右移键*/#define RIGHT 0x4d00/*下移键*/#define DOWN 0x5000/*上移键*/#define UP 0x4800/*向上翻页键*/#define PAGEUP 0x4900/*向下翻页键*/#define PAGEDOWN 0x5100/*小写字母q*/#define QLOWER 0x1071/*大写字母Q*/#define QUPPER 0x1051/*空格键*/#define SPACE 0x3920/*Esc键*/
10、#define ESC 0x011b/*定义全局变量*/struct date sysTime;int currentYear;int currentMonth;int currentDay;int n_currentMon;int n_lastMon;/*-自定义函数-*/void checkDate();int isLeapyear(int year);int getWeek(int year,int month,int day);void printSpace(int n);void printSaparator();void printUsage();void printWeek();
11、void printWeek2(int week);void showCalendar(int year,int month,int day);void getKeyValue();welcome()int i, graphdriver,graphmode,size,page;char s30;graphdriver=DETECT;initgraph(&graphdriver,&graphmode,);cleardevice();setbkcolor(BLUE);setviewport(40,40,600,440,1);setfillstyle(1,2);setcolor(YELLOW);re
12、ctangle(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,Welcom yousetviewport(100,150,540,380,0); /* 又开一窗口 */setcolor(14);setfillstyle
13、(1,10);rectangle(20,20,420,120);settextstyle(2,0,9);floodfill(21,100,14);/* 用深蓝色填充 */sprintf(s,Hey girl!Do you want to know? /* 将字符串存到 s 字符数组*/setcolor(1);settextstyle(10,0,10); /* 设选用字形 4,放大 3 倍,水平设置 */outtextxy(110,80,s); /* 显示 s 字符串 */getch();closegraph();/*功能控制模块*/*检查日期有效性函数*/*如果给定的日期中年份部分为负数或者0
14、*/if(currentYear12|currentMonth31|currentDayThe day should be a number between 1 and 31 ! /*判断是否是闰年函数*/ /*闰年的判断:(1)year被4整除,并且year不被100整除 或(2)year被4整除,并且被400整除*/ if(year%4=0&year%100|year%400=0) return 1; else return 0; /*根据给定日期计算星期函数*/ int leapFlag; int week; int i; /*该数组用于保存每个月的天数*/ int a13=0,31,2
15、8,31,30,31,30,31,31,30,31,30,31; int count=0; /*判断给定年份是否是闰年*/ leapFlag=isLeapyear(year); /*如果是闰年则2月份的日期应该为29天*/ if(leapFlag=1) a2+; /*计算从给定年份的1月1日到给定月份的1号之间的天数*/ for (i=1;imonth;i+) count+=ai; /*计算从给定年份的1月1日到给定日期之间的天数*/ count+=day; /*计算星期*/ week=(year+1+(year-1)/4+(year-1)/100+(year-1)/400+count)%7;
16、 return week;/*打印输出模块*/*输出指定个数空格函数*/ for(i=0;n; printf( /*输出分割线函数*/38;=/*输出使用方法函数*/void printUsage() gotoxy(45,3); /*设定字体颜色*/ textcolor(YELLOW); /*送格式化输出至屏幕*/ cprintf(-Usage- gotoxy(45,5);YEAR gotoxy(50,5); Up key( ) to increase; gotoxy(50,7); Down key( ) to decrease.n gotoxy(45,9);MONTH: gotoxy(50,
17、9); Right key( ) to increase; gotoxy(50,11); Left key( ) to decrease.n gotoxy(45,13);DAY gotoxy(50,13); PageDown key to increase; gotoxy(50,15); PageUp key to decrease.n gotoxy(45,17);QUERY gotoxy(50,17); Q/q keyn gotoxy(45,19);RESET gotoxy(50,19); SPACE key.n gotoxy(45,21);EXIT gotoxy(50,21); Esc k
18、eyn 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);/*根据系统日期输出星期函数*/ int day; /*根据日期
19、获得星期*/ 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/*日历显示模块*/*显示日历函数*/ int j; /*输出的日期*/ int outDay; /*本月第一个星期中,在上月的天数*/ int dayLastMon; int a13=0,31,28,31,30,31,30,
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1