《C语言万年历程序设计.doc》由会员分享,可在线阅读,更多相关《C语言万年历程序设计.doc(18页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、目录第1章需求分析6第2章 概要设计6第3章详细设计11第四章 运行结果及分析171.登陆界面172.显示某年全年日历173.显示某月日历18第5章课程设计心得20参考文献21第1章需求分析(1)程序运行时,首先给出四个菜单选项和输入提示:图1-1(2)用户可以通过主菜单选择不同选项。输入1,通过输入年份可显示一年每个月份的日历;输入2,通过输入年份和月份(中间以空格分开)可显示该月的日历;若输入3,通过输入年份月份和日期(中间以空格分开)可显示该日的星期;输入0,则退出查询系统。第2章 概要设计1 菜单选择界面可通过下面所示函数时现; 主要思路:通过while语句与swichcase以及if
2、条件语句实现菜单的循环功能和不同选项的功能实现。闰年与平年的判断:代码如下: void main() int year,month,day,a,b; while(1) printf(nnnn);printf( *nn);printf( * * n);printf( 欢迎进入万年历查询系统 n); printf( * * nn); printf( *nnn);printf( 1 年历 2 月历 3 日历 4 退出n);printf( 请输入您的选择,按回车键确定: );scanf(%d,&b); switch(b) case 1: printf(n请输入您要查的年份: ); scanf(%d,&
3、year); a=x3(year,1,1); if(a=0) printf(错误!请您重新输入。n); break; nianli(year); break; case 2: printf(n请输入您要查的年和月,年月之间用空格隔开: ); scanf(%d%d,&year,&month); a=x3(year,month,1); if(a=0) printf(错误!请您重新输入。n); break; yueli(year,month); break; case 3: printf(n请输入您要查的年月日,年月日之间用空格隔开: ); scanf(%d%d%d,&year,&month,&da
4、y); a=x3(year,month,day); if(a=0) printf(错误!请您重新输入。n); break; rili(year,month,day); break; case 4: exit(0); default: printf(错误!请您重新输入。nn); 2 显示一年的日历,可通过函数void x1()实现,思路如下:先判断输入年份是否为闰年,若为闰年,则定义二月为29天,通过调用函数判断是否为闰年及每个月的天数依次打印12个月的月份打印每个月的日历,显示个每个月的日历:printf(%2s%2s%2s%2s%2s%2s%2sn, 星期日 , 星期一 , 星期二, 星期三
5、 , 星期四 , 星期五 , 星期六 );3 闰年的判断:计算所输入的年份是否可被4整除,若不能被整除,为平年。若可被4整除,计算此年份能否被100整除,不能被100整除则为闰年。既能被4整除,也能被100整除的年份,若也能被400整除,则为闰年,否则为平年。闰年366天,平年365天 图2-1代码:int runnian(int year) if(year%4=0&year%100!=0|year%400=0) return 1; else return 0; 4 判断某月的天数;通过函数:int day1(int year,int month) int a12=31,28,31,30,31
6、,30,31,31,30,31,30,31;若为闰,则二月为29天。 图2-2代码:if(runnian(year)a1=29;第3章详细设计#include #include /*定义头文件*/int runnian(int year)/*定义变量*/if(year%4=0&year%100!=0|year%400=0) /*利用函数判断输入年份是闰年还是平年*/return 1;elsereturn 0;int day1(int year,int month)int a12=31,28,31,30,31,30,31,31,30,31,30,31;/*定义数组确定12个月每个月的天数*/if
7、(runnian(year) /*如果输入年份是闰年*/a1=29;/*二月29天*/return amonth-1;int day2(int year,int month,int day)int i,sum=0;for(i=1;imonth;i+)sum+=day1(year,i);sum+=day;return sum;int week1(int year,int month,int day)int number=(year-1)+(year-1)/4-(year-1)/100+(year-1)/400+day2(year,month,day);number%=7;return numbe
8、r;char *Week2(int number)switch(number)/*分类一周七天*/case 0:return 星期日;case 1:return 星期一;case 2:return 星期二;case 3:return 星期三;case 4:return 星期四;case 5:return 星期五;case 6:return 星期六;default:return 错误!请您重新输入。;/*不符和上面七种情况的报错提示*/void x1(int year,int month,int day)int number=week1(year,month,day);if(runnian(ye
9、ar)printf(闰年);/*年份为闰年则输出“闰年“*/else printf(平年);printf( %d 年 %d 月 %d 日%10snn,year,month,day,Week2(number);/*按年 月 日输出结果*/void x2(int year,int month)int max,number,i,j=1;max=day1(year,month);number=week1(year,month,1);printf(%2s%2s%2s%2s%2s%2s%2sn, 星期日 , 星期一 , 星期二, 星期三 , 星期四 , 星期五 , 星期六 );/*按照间隔打印日历for(
10、i=0;inumber;i+)printf( );while(j=max)printf(%8d,j);if(i%7=6)printf(n);i+;j+;printf(nn);int x3(int year,int month,int day)if(year0|month12|dayday1(year,month)/*当输入植出现这些情况时*/return 0;/*返回0*/elsereturn 1;/*返回1*/void nianli(int year)int i;printf(n);for(i=1;i=12;i+)if(runnian(year)printf(闰年);else printf(
11、平年);printf( %d 年 %d 月nn,year,i);void yueli(int year,int month)if(runnian(year)printf(闰年);else printf(平年);printf( %d 年 %d 月nn,year,month);x2(year,month);void rili(int year,int month,int day)printf(n);x1(year,month,day);void main()int year,month,day,a,b;while(1)printf(nnnn);printf( *nn);printf( * * n)
12、;printf( 欢迎进入万年历查询系统 n);printf( * * nn);printf( *nnn);printf( 1 年历 2 月历 3 日历 4 退出n);printf( 请输入您的选择,按回车键确定: );scanf(%d,&b);switch(b)case 1:/*选择1时*/printf(n请输入您要查的年份: );/*给出输入提示*/scanf(%d,&year);/*输入查询的年份*/a=x3(year,1,1);if(a=0)printf(错误!请您重新输入。n);/*输入植异常时报错*/break;nianli(year);break;case 2:/*选择二时*/p
13、rintf(n请输入您要查的年和月,年月之间用空格隔开: );/*给出输入提示*/scanf(%d%d,&year,&month);/*输入需要查询的年 月*/a=x3(year,month,1);if(a=0)printf(错误!请您重新输入。n);break;yueli(year,month);break;case 3:/*选择3时*/printf(n请输入您要查的年月日,年月日之间用空格隔开: );/*给出输入提示*/scanf(%d%d%d,&year,&month,&day);/*输入年 月 日*/a=x3(year,month,day);if(a=0)printf(错误!请您重新输
14、入。n);/*输入植异常时报错*/break;rili(year,month,day);break;case 4:exit(0);default:printf(错误!请您重新输入。nn); 第四章 运行结果及分析1.登陆界面 图4-1登陆界面提供了四个选项进行选择,并提示输入后的操作方法;2.显示某年全年日历 图4-2输入指令后,依次打印出每个月份的日历。并显示平年或者闰年; 3.显示某月日历 图4-3第5章课程设计心得 通过本次课程设计我第一次通过自己的实践对书本上的知识进行了与生活相关的运用。在这个程序中,主要应用了这学期所学习的循环,条件语句,数组以及调用函数。这些知识的应用使我对课本内
15、容的认识得到了加深。 在编写程序的过程中,也出现了很多错误。比如程序语句错误导致检测时连续报错;函数语句编写错误导致输出结果与实际不符等。出现这些情况后,通过对一些新知识的学习和对网上相关资料的阅览,我发现了自己的程序的问题所在并进行了改正。最后得到了正确的结果。 在程序的编写完成后,我按照要求对程序进行了拓展。在输出年历的基础上增加了月历及确定日期的输出。本来设想增加农历生肖功能,但是由于程序过于复杂,最终没能在规定时间内调试成功。参考文献1 杨文君,杨柳.C语言程序设计教程M.清华大学出版社. 2010.32 谭浩强. C语言程序设计教程M. 清华大学出版社. 2007.63 C语言程序设
16、计精品课程4谭浩强.C程序设计教程.北京:清华大学出版社.2007.075魏海新 李燕主编. C语言程序设计实用教程.机械工业出版社.2007.096李泽中孙红艳主编. C语言程序设计.北京:清华大学出版社.2008.067路俊维 马雪松主编.C语言程序设计.中国铁道工业出版社.2009.061700 .业铁铁中设设 编雪雪维0 社大大清北设设言.编中中0. 社出.教设程程 编 魏0000社学:北程程程.课课课程 /. . .0 社社出出清 教教序言.00 版出. 计序 .,文功试内内规没,于序是是能生加加增。的的定历加础础历历年展拓程要要按成成编程 果果果确后正行行在所所序己现现览的相相网学
17、知一一过,些些。等等与果导错编编;续测测导误误程比误误了也中中程写深深深得的本本我我应知这用及及句件件循学学学这要,个个用用关活行知本本书书的通一设课课过心心设课课-图 日某某显 年年年平显显。月出出次,-图 日全全年法法法后后示,择项项了面面- 界陆分及及运运) 入重重!( )( ), , *错错异输输/ 入新新! 0= ) *日日月输输/ & ,% *提输给开开空用月月月的入输( * * ) ( )入入重重!错 0=(), *月月询询需输/ & %( *提提入入给:空之,月要您您 *时时选: ) ( *报报常植; 入重重! 00 ) *份份查查输) , ( *提提出*份的的入 ( * 选:
18、 ( )& ( ) :车车选的的 ( ) 历 年 ) * ( ) ( ) 统统查万迎 ) ) * ( ) ( , ( ), ) , ( ) ) ,%年年 )年平 )年( ) , ) )年 )年年( ) (+; ;() ( * *回回/ *这这植输) ,( | ( , ) + + ) =%), ) ( + 0(日印印照按按;六星星,四星三三 一 星 % % ), ) , *结输 年年; , % )平 *年出年份*) ) ) , , *提提错种七不不;入新新!误误 期期 五星星 期期 期 二 期 期期 00 *一一/ ( * ) +0/-(0) -)-( ( ) ( + . 设设设 =) 码码-
19、天 二二则则 00 0 , 数数数的; ; )00% |=% &= ) ( 码-图图 , 闰闰年否否闰则除除被若份的00也除除能。闰整 ,整整 否此计计 可平整能能除除整是年输输断判) 星,五期期四星星,期星 期,日日 % % % 历历每每个历历月月月月 天天月及为为断数天天天二则闰,闰闰是输下现现) 数通历日日;) 。重!错 : ;: ; ;。新请错错 )0; , , ; & , % ;开空之年年日年入入 : ; ; ( ;输输请误 00; ; & % ; 空空之,年年查入 : ; ;) (;)。新重误误 )=; , ; & ; 年您您请( : ) ; )确确回选选您请 )退退 历 ) * ( ; * * (;) 询历历进欢欢 ) ) * ) );, ) 下断断断现能项项不能的菜菜语条条以 路思思现时所过过面择设设要统统系退,入入星日日)分以以期日月月输 入入历该可分格格间月月入过,;的的每示显输通通输项择择菜通可可-示提项菜菜出首,运分需 献献0 心程程 历历月 历年某 _ 面 分结结运 _ 设详 _ 计计概 0 _ 分章 17
限制150内