目 录
一 引言……………………………………………………….2 二 系统功能和数据说明…………………………………….3 一)功能简介………………………………………………3 二)程序中的数据说明……………………………………3 三 程序总体设计及流程图………………………………….4 一)应用到的c语言………………………………………4 二)程序的总框架…………………………………………5 四 功能模块设计及调试…………………………………….5 一)算法说明………………………………………………5 1. 总天数的算法………………………………………….5 2. 计算输入日期是星期几……………………………….6 3. 对输入信息的汇总…………………………………….8 4. .界面的控制…………………………………………..10 二)调试结果……………………………………………..11 五 程序清单…………………………………………………12 六 结束语……………………………………………………17
- 1 -
C语言课程设计——万年历
一 引言
通过大一上学期对C语言的学习,了解到了很多C语言的相关知识。学习的过程有很多困惑但是当自己能够独立的看懂,能过独立的完成一个简单的程序时,心中就会收获无限的喜悦和成就感。我可以里哟哦那个它看懂一些简单的程序,编写一些简单的计算程序,更多的是学会了一种思想——编程,它让我在去思考很多日常生活中的事物是怎么样通过一个个小小的函数实现功能的,激发我对探究的兴趣。
C语言是近年在国内外得到迅速推广应用的一种语言。C语言功能丰富,表达能力强,使用灵活方便,应用面广,目标程序效率高,可移植性好,既具有高级语言的优点,又具有低级语言的许多特点。因此,C语言特别适合于编写各种软件。
在这次的课程设计中我将把日常生活中最经常接触的——日期的查询利用C语言的程序编成一个简单的日历。通过这个小小的日历可以实现很多功能。在程序中你能看到很多熟悉的C语言关键字,同时也加入了很多自己课外了解到的一些关键字。在不断的调试中最终才获得最为完整的程序。接下来就是我的C语言课程设计的具体内容来了
- 2 -
C语言课程设计——万年历
二 系统功能和数据说明
(一)功能简介
在我们的日常生活中能接触到很多不同类型的日历,在日历上我们通常希望它能简介明了的给我们最想要的日期信息。在我的万年历当中,就是将日历,月历做的简单明了,很方便我们的使用。下面是它要实现的一些基本功能:
用C语言编写万年历
1、输入年份,判断是否为闰年 2、输入年月日,判断改日为星期几
3、输入年份,打出12个月历,输入月份,打出该月的日历 4、要求用多个函数实现 [名称]万年历
[修改]1、对输入的日期进行容错处理 2、增加和修改为英文的月份和星期显示 3、采用指针形式的weeks和month数组
(二)程序中的数据说明
①int days[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; 这是定义的关于每个月天数的数组,根据大小月以及二月分的特殊情况将每个月的天数最为数组中的元素存入数组当中。其中days[1]=28,是将闰年二月的天数28天作为初始元素存入。在经过theWeek函数后就可以给days[1]中存入正确的月天数。
②char *weeks[7] ={\"Sunday\\"Monday\\"Tuesday\\"Wednesday\\"Thursday\
char *months[12] = {\"January\\"February\\"March\\"April\\"May\\"June\\"July\\"August\\"September\\"October\\"November\
- 3 -
C语言课程设计——万年历
\"DeCember\
这两组数据都设计利用了指针定义的。这两个数组的作用是存入每个月,每个星期的地址。利用指针可以提高程序的可读性,可以更方便使用。
三 程序总体设计及流程图
(一)应用到的C语言
头文件:stdio.h /**/ conio.h /**/ stdlib.h /**/
采用指针形式定义了*weeks和*months两组数组指针变量
在程序中运用了大量的自定义函数,都涉及为了使程序更简介明了。其中有:isLeap/*判断是否为闰年*/
theLeap/*输入输出改年是否为闰年的信息*/ Zeller/*判断星期的自定义函数*/
theWeek()/*对于输入的日期输出该天是星期几*/ printCalendar()/*输出日期详情及表格*/ details /*月历详情函数*/ theCalendar/*打开相应的详情*/ Menu()/*程序的主菜单*/ Select()/*按键的控制函数*/
这些函数的定义极其相应的内部程序共同构筑起了这个万年历总程序。其中的isLeap函数是用来判断输入的年份是否为闰年,实现了预计功能的第一个方面;theWeek函数则是为了实现判断星期而编写的;printCalendar , details , theCalendar这三个函数的共同使用就能够完成第三个功能。
- 4 -
C语言课程设计——万年历
(二)程序的总框架
开始 按键按键11?? 是 按键2? 是按键按键33?? 是计算是否为闰年计算是否为闰年 计算星期数计算星期数 计算编辑接收到的数据 输出是否为闰年 输出星期数 输出具体月历 按键0? 是结束 退出
四 功能模块函数设计和调试 一).算法说明
1. 总天数的算法:
isLeap和theLeap函数的共同使用,一起判断出了输入年份是否为闰年的
- 5 -
C语言课程设计——万年历
信息。
判断一年是否为闰年的方法是:该年分而能被四整除但不能被100整除,或者是能被400整除。
流程图二:是否为闰年的判断
2. 计算输入日期是星期几:
利用Zeller函数可以判断出星期,然后对于输入的日期可以通过theWeek()
- 6 -
C语言课程设计——万年历
函数对Zeller进行一次调用然后就可以输出相应的星期数。
①int Zeller(int year, int month, int day) //by theWeek(); printCalendar();
/*判断星期的函数*/ {
int C, y, m, d, w;
if( month < 3) { year -= 1; month += 12; } c = year / 100; y = year % 100; m = month; d = day;
w = y + y/4 + C/4 - 2*C + 26*(m+1)/10 + d - 1; w %= 7;
return (w >= 0 ? w : w+7); }
②void theWeek() //by Select();/*对于输入的日期输出该天是星期几*/ {
int year, month, day, w; printf(\"\\n\"); do {
printf(\"Please input the date(YYYY-MM-DD): \"); scanf(\"%d-%d-%d\ if( isLeap( year ) ) days[1] = 29; //是否闰年 else days[1] = 28;
}while(!( (month > 0 && month < 13) && (day > 0 && day <= days[month - 1]) ) );
w = Zeller(year, month, day);
printf(\"\\nThis day %d-%02d-%02d is %s.\year, month, day,
- 7 -
C语言课程设计——万年历
weeks[w]);
getch(); }
3. 对输入信息的汇总:
theCalendar/*打开相应的详情*/ ,details /*月历详情函数*/ ,printCalendar /*输出日期详情及表格*/,通过这三个函数可以将输入数据的具体信息通过完整日历的形式表示出来。
①void printCalendar(int year, int month) //by details(); theCalendar();
/*输出日期详情及表格*/ {
int w, d;
w = Zeller(year, month, 1); printf(\"%28s\ printf(\"\\n -%02d-\\n\ printf(\" SUN MON TUE WED THU FRI SAT\\n\"); for(d = 0; d < w; d++) { printf(\" \"); } for(month--, d = 1; d <= days[month]; d++) {
printf(\"%4d\
if( (d + w)%7 == 0 && d != days[month]) printf(\"\\n\"); }
printf(\"\\n============================\\n\"); } 例:
1946, January SUN MON JUE WED THU FRI SAT 1 2 3 4 5
- 8 -
C语言课程设计——万年历
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
============================================
②void details(int year) //by theCalendar();/*月历详情函数*/
{
int month; while(true) { do {
system(\"cls\");
printf(\"Press '0' to exit.\\n\"); printf(\"Please input the month: \"); scanf(\"%d\
}while(!(month >=0 && month <= 12)); if(month != 0) {
printf(\"\\n\");
printf(\"Calendar %d\\n\ printCalendar(year, month); if( getch() == '0') break; }
else break; } }
③void theCalendar() //by Select();
{
- 9 -
C语言课程设计——万年历
int year, month;
printf(\"\\nPlease input the year: \"); scanf(\"%d\
if( isLeap( year ) ) days[1] = 29; //是否闰年 else days[1] = 28; system(\"cls\");
printf(\"Calendar %d\\n\ for(month = 1; month <= 12; month++) {
printCalendar(year, month); }
printf(\"More details of each month ?[Y/N]\"); if( tolower(getch()) == 'y' ) details( year ); }
4.界面的控制:
主要体现在主菜单的选择功能上。用到的是 Menu(), Select() 两个自定义函数。
1 –这年是否是闰年 2 –3 –这一天天的星期数 主菜单功能 这一年的月历
0 退出 - 10 -
C语言课程设计——万年历
二)调试结果
- 11 -
C语言课程设计——万年历
五 程序清单
*/
#include #include int days[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; char *weeks[7] ={\"Sunday\\"Monday\\"Tuesday\\"Wednesday\\"Thursday\ char *months[12] = {\"January\\"February\\"March\\"April\\"May\\"June\\"July\\"August\\"September\\"October\\"November\\"December\ bool isLeap(int year) //by theLeap(); theCalendar(); /*判断是否为闰年*/ { if(year%4 == 0 && year%100 != 0 || year%400 == 0) return 1; else return 0; } void theLeap() //by Select();/*输入输出改年是否为闰年的信息*/ { int year; printf(\"\\nPlease input the year: \"); scanf(\"%d\ if( isLeap( year ) ){ printf(\"\\nThe year %d is leap year.\year); } else { printf(\"\\nThe year %d is not leap year.\ getch(); } int Zeller(int year, int month, int day) //by theWeek(); - 12 - C语言课程设计——万年历 printCalendar(); /*判断星期的自定义函数*/ { int c, y, m, d, w; if( month < 3) { year -= 1; month += 12; } c = year / 100; y = year % 100; m = month; d = day; w = y + y/4 + C/4 - 2*C + 26*(m+1)/10 + d - 1; w %= 7; return (w >= 0 ? w : w+7); } void theWeek() //by Select();/*对于输入的日期输出该天是星期几*/ { int year, month, day, w; printf(\"\\n\"); do { printf(\"Please input the date(YYYY-MM-DD): \"); scanf(\"%d-%d-%d\ if( isLeap( year ) ) days[1] = 29; //是否闰年 else days[1] = 28; }while(!( (month > 0 && month < 13) && (day > 0 && day <= days[month - 1]) ) ); w = Zeller(year, month, day); printf(\"\\nThis day %d-%02d-%02d is %s.\year, month, day, weeks[w]); getch(); - 13 - C语言课程设计——万年历 } void printCalendar(int year, int month) //by details(); theCalendar(); /*输出日期详情及表格*/ { int w, d; w = Zeller(year, month, 1); printf(\"%28s\ printf(\"\\n -%02d-\\n\ printf(\" SUN MON TUE WED THU FRI SAT\\n\"); for(d = 0; d < w; d++) { printf(\" \"); } for(month--, d = 1; d <= days[month]; d++) { printf(\"%4d\ if( (d + w)%7 == 0 && d != days[month]) printf(\"\\n\"); } printf(\"\\n============================\\n\"); } void details(int year) //by theCalendar();/*月历详情函数*/ { int month; while(true) { do { system(\"Cls\"); printf(\"Press '0' to exit.\\n\"); printf(\"Please input the month: \"); scanf(\"%d\ - 14 - C语言课程设计——万年历 }while(!(month >=0 && month <= 12)); if(month != 0) { printf(\"\\n\"); printf(\"Calendar %d\\n\ printCalendar(year, month); if( getch() == '0') break; } else break; } } void theCalendar() //by Select(); { int year, month; printf(\"\\nPlease input the year: \"); scanf(\"%d\ if( isLeap( year ) ) days[1] = 29; //是否闰年 else days[1] = 28; system(\"Cls\"); printf(\"Calendar %d\\n\ for(month = 1; month <= 12; month++) { printCalendar(year, month); } printf(\"More details of each month ?[Y/N]\"); if( tolower(getch()) == 'y' ) details( year ); } void Menu() //by main();/*程序的主菜单*/ { - 15 - C语言课程设计——万年历 system(\"cls\"); printf(\"1 -This year is leap year or not\\n\"); printf(\"2 -This day is which day of the week\\n\"); printf(\"3 -The Calendar of this year\\n\"); printf(\"0 -Exit\\n\\n\"); printf(\"Please select the options:\"); } void Select() //by main();/*按键的控制函数*/ { char key; bool v = true; while( v ) { key = getch(); switch( key ) { Case '1': theLeap(); v = false; break; Case '2': theWeek(); v = false; break; Case '3': theCalendar(); v = false; break; Case '0': exit(1); } } } void main() { while(true) { Menu(); Select(); } } - 16 - C语言课程设计——万年历 六 小结 经历了这次课程设计的设计和制作的整个过程,我才发现我知识的贫乏和知识面的狭窄,原本以为不就是一个小小的课程设计,很容易就可以搞定,可是到了后来实际的操作的时候可是花费了我九牛二虎之力,不说其他的,只说时间上面,我在宿舍里面熬了三个通宵,更不用说白天的时间了。 这次作课程设计我也是收获很大,首先,我对C语言有了更深的了解,使用起来也更加的熟练,原来有一些不知道和不熟悉的函数,我学会用了。其次,我这一次找了不少的资料,找专业的书籍、上网找各方面的资料,也使我学到了一些书本中学不到的知识,让我长了见识。同时我们同学之间也互相的探讨,也增进了我们同学之间的感情。 这次作的这一个设计,虽然我自己觉的很有的成就感,但是这必竟是我第一次作C语言的课程设计,必然会有很多的不足之处有待改进,相信以后我一定会做的更好。 参考资料: [1]谭浩强。C程序设计(第三版).北京:清华大学出版社,2005 [2]谭浩强.C程序设计题解与上机指导(第三版)。北京:清华大学出版社,2005 - 17 - 因篇幅问题不能全部显示,请点此查看更多更全内容