实验报告
电子万年历:
一、需求分析:
电子万年历系统主要实现以下单个查询功能:
1、 查询某一年的日历。要求从键盘输入年份,输出该年12个月份的日历
2、 查询某一天某一个月的日历。要求从键盘输入年份和月份,输出该月的日历。 3、 查询某一天是星期几。要求从键盘输入年、月、日,输出这一天是星期几。 二、总体设计:
1、功能模块图
万年历系统 计算模块 输出模块 查询模块 计算模块:用于计算天数,判断闰年 输出模块:用于菜单输出和日历输出
查询模块:实现查询某一年的日历。查询某一天某一个月的日历。查询某一天是星期几。 三、详细设计:
1、 计算模块:
计算模块主要包含3个函数:LeapYear()、CountYearDays()、CountMonthDays函数
CountYearDays()功能是计算从公元元年1月1日到某年12月31日一共有多少天。
CountYearDays()功能是几双当年1月1日到输入日期的前一个月的天数 2、 输出模块包含2个函数:Menu()和ListMonth()函数。
Menu()函数用来输出系统提供的功能选项。
ListMonth()函数用来按规定格式输出一个月的日历。
3、 查询模块针对系统要实现三个查询功能定义了3个函数:Search1()、 Search2()
和 Search3()函数。
函数Search1()用来显示一年12个月的日历,输入年份后,计算该年1月1日是星期几,然后从1月份开始一次输出每个月的日历,其中调用了函数LeapYear()、CountYearDays()和CountMonthDays()。
函数Search2()用来显示某年某月的日历,输入年份和月份后,计算出该年该月1日是星期几,然后输出这个月的日历,其中调用了函数LeapYear()和CountYearDays()、CountMonthDays()和ListMonth()。
函数Search3()用来显示某天是星期几,通过调用函数LeapYear()、
CountYearDays()和CountMonthDays()计算出从公元元年1月1日到这一天总共过去了多少天,用这个总天数除以7得到的余数即为答案。 4、 调试与测试:
在调试过程中主要的问题就是结果的显示问题,显示易错位。以及函数之间调用问题。对于这些问题,主要是翻书籍和网络上找解决方案,以及自己亲自用找到的方法去测试。最终解决问题。 5、 测试结果 菜单界面:
功能一展示:
功能二展示:
功能三展示:
6、 附录:
程序代码:
#include int g_MonthDays [13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; //定义全局数组 //函数声明 int LeapYear(int n); int CountYearDays(int year); int CountMonthDays(int month); void Menu(void); void ListMonth(int days,int t); void Search1(void); void Search2(void); void Search3(void); void main() //main函数定义 { int select; while(1) { Menu(); //调用Menu函数,显示菜单 scanf(\"%d\输入想选择的功能 switch(select) //对select进行多分支选择 { case 1:Search1();break; //select=1时,调用Search1函数 case 2:Search2();break; case 3:Search3();break; case 0:printf(\"\\n\谢谢使用!再见\\n\");exit(0); //结束程序,退出系统 default:(\"\\n\按键错误,请重新选择!\\n\"); //输入错误,应重新输入 } //switch结束 } //while结束 } //================================================================ //功能:判断闰年 //参数:n为需要判断的年份 //返回:是闰年返回1,否则返回0 //主要思路:用if语句判断某一脸是否是闰年 //================================================================ int LeapYear(int n) { if((n%4==0&&n%100==0)||n%400==0) return (1); //是闰年返回1 else return (0); //不是闰年返回0 } //================================================================ //功能:计算从公元元年到公元(year-1)年的总天数 //参数:year为年份 //返回:返回总天数 //主要思路:用for循环计算天数 //================================================================ int CountYearDays(int year) { int i,flag,days=0; for(i=0;i //返回:返回前(month-1)个月的总天数 //主要思路:用for循环计算天数 //================================================================ int CountMonthDays(int month) { int i,days=0; for(i=1;i //参数:无 //返回:无 //主要思路:用printf函数输出菜单 //================================================================= void Menu(void) { printf(\"\\n\"); printf(\"\------------------------------------------------\\n\"); printf(\"\* *\\n\"); printf(\"\* 欢迎使用万年历系统 *\\n\"); printf(\"\* *\\n\"); printf(\"\------------------------------------------------\\n\"); printf(\"\\n\"); printf(\"\请选择您要查询的内容\\n\"); printf(\"\1.显示某年的日历\\n\"); printf(\"\2.显示某年某月的日历\\n\"); printf(\"\3.显示某天是星期几\\n\"); printf(\"\0.退出系统\\n\"); printf(\"\请选择按键(0-3)\\n\"); } //================================================================= //功能:按规定格式输出一个月的日历 //参数:days表示要输出月份的天数,t表示要输出月份的1日是星期几 //返回:无 //主要思路:主要采用for语句输出日历 //================================================================= void ListMonth(int days,int t) { int i,j; printf(\"星期日 星期一 星期二 星期三 星期四 星期五 星期六\"); for(i=1;i<=days;i++) { if(i==1) for(j=0;j //主要思路:主要采用for语句循环输出每个月的日历 //================================================================= void Search1(void) { int year,t,k,flag,days; printf(\"\\n请输入年份:\"); scanf(\"%d\ flag=LeapYear(year); //调用LeapYear函数,判断Year是否为闰年 t=(CountYearDays(year)+1)%7; //计算该年的第一天是星期几 for(k=1;k<=12;k++) //k表示月份,没循环一次输出一个月的日历 { days=g_MonthDays[k]; //days为第k个月的天数 if(flag&&k==2) days=29; //若是闰年,则2月份天数为29 printf(\"\\n %d月:\\n\输出这是几月 ListMonth(days,t); //输出k月的日历 t=(t+days%7)%7; //计算第(k+1)个月的第一天是星期今 printf(\"\\n\"); if(k%3==0) //每输出3个月的日历暂停,等用户按任意键后再继续输出 { printf(\"\\n按任意键继续!\\n\"); getch(); //函数功能是输入一个字符且不回显,函数定义在conio.h中 } }//for结束 } //================================================================= //功能:输出某年某个月的日历 //参数:无 //返回:无 //主要思路:通过调用函数计算天数 //================================================================= void Search2(void) { int t,year,month,flag,days,ydays,mdays,alldays; printf(\"\\n请输入年.月(如:2009.5):\"); scanf(\"%d.%d\ ydays=CountYearDays(year); //计算前Year-1年的天数 mdays=CountMonthDays(month); //计算前month-1个月的天数 days=g_MonthDays[month]; //days为第month个月的天数 flag=LeapYear(year); //判断该年是否为闰年 if(flag) { if(month>2) mdays++; //是闰年且month大于2时,前(month-1)个月的天数加1 else if(month==2) days==29; //是闰年且month为2月,则2月份天数加1 } alldays=ydays+mdays+1;//计算公元元年1月1日到输入日起这个月1日的总天数 t=alldays%7; //计算第month个月的第一天是星期几 printf(\"\\n%d年%d月:\\n\\n\ ListMonth(days,t); //输出该月日历 printf(\"\\n\"); } //================================================================ //功能:输出某一天是星期几 //参数:无 //返回:无 //主要思路:通过调用函数计算天数,在计算并输出这一天是星期几 //================================================================ void Search3(void) { int t,year,month,day,flag,ydays,mdays,alldays; printf(\"\\n请输入年.月.日如(2009.3.25):\"); scanf(\"%d.%d.%d\ ydays=CountYearDays(year); //计算前(year-1)年的天数 mdays=CountMonthDays(month); //计算前(month-1)个月的天数 flag=LeapYear(year); //判断该年是否为闰年 if(flag&&month>2) mdays++; //是闰年且month大于2时,则前(month-1)个月的天数加1 alldays=ydays+mdays+day; //计算总天数 t=alldays%7; printf(\"\\n%d年%d月%d日是\ switch(t) //对t进行多分支选择 { case 0:printf(\"星期日\\n\");break; case 1:printf(\"星期一\\n\");break; case 2:printf(\"星期二\\n\");break; case 3:printf(\"星期三\\n\");break; case 4:printf(\"星期四\\n\");break; case 5:printf(\"星期五\\n\");break; case 6:printf(\"星期六\\n\");break; }; //switch结束 } 因篇幅问题不能全部显示,请点此查看更多更全内容