实验报告电子万年历:一、需求分析:电子万年历系统主要实现以下单个查询功能: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<stdio.h>#include<conio.h>#include<stdlib.h>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",&select); //输入想选择的功能switch(select) //对select进行多分支选择{case 1:Search1();break; //select=1时,调用Search1函数case 2:Search2();break;case 3:Search3();break;case 0:printf("\n\t谢谢使用!再见\n");exit(0); //结束程序,退出系统default:("\n\t按键错误,请重新选择!\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<year;i++){flag=LeapYear(i); //判断第i年是否为闰年if(flag) days=days+366; //是闰年加366天else days=days+365; //不是闰年应加365天}return (days); //返回总的天数}//================================================================ //功能:计算当年前(month-1)个月的天数//参数:month为月份//返回:返回前(month-1)个月的总天数//主要思路:用for循环计算天数//================================================================int CountMonthDays(int month){int i,days=0;for(i=1;i<month;i++)days=days+g_MonthDays[i];return (days);}//================================================================= //功能:显示系统菜单//参数:无//返回:无//主要思路:用printf函数输出菜单//=================================================================void Menu(void){printf("\n");printf("\t------------------------------------------------\n");printf("\t* *\n");printf("\t* 欢迎使用万年历系统 *\n");printf("\t* *\n");printf("\t------------------------------------------------\n");printf("\n");printf("\t请选择您要查询的内容\n");printf("\t1.显示某年的日历\n");printf("\t2.显示某年某月的日历\n");printf("\t3.显示某天是星期几\n");printf("\t0.退出系统\n");printf("\t请选择按键(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<t;j++)printf(" "); //在数字1前输出9*t个空格printf(" % - 7d",i);if((i+t)%7==0) printf("\n");}}//=================================================================//功能:输出指定年份全年12月份的日历//参数:无//返回:无//主要思路:主要采用for语句循环输出每个月的日历//=================================================================void Search1(void){int year,t,k,flag,days;printf("\n请输入年份:");scanf("%d",&year);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月份天数为29printf("\n %d月:\n",k); //输出这是几月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",&year,&month);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 elseif(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",year,month);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",&year,&month,&day);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日是",year,month,day);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结束}。