中国矿业大学徐海学院软件开发基础实践报告姓名:李岳学号:22110522专业:计算机科学与技术指导教师:孙锦程职称:讲师2012年6月30徐州姓名/学号:李岳22110522班级:计(中软)11-1一、程序来源:百度贴吧c语言吧=c%D3%EF%D1%D4二、程序项目名称:万年历三、程序原理:1、intdays[12]={31,28,31,30,31,30,31,31,30,31,30,31};这是定义的关于每个月天数的数组,根据大小月以及二月分的特殊情况将每个月的天数最为数组中的元素存入数组当中。其中days[1]=28,是将闰年二月的天数28天作为初始元素存入。在经过theWeek函数后就可以给days[1]中存入正确的月天数。2、char*weeks[7]={Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday};char*months[12]={January,February,March,April,May,June,July,August,September,October,November,DeCember};这两组数据都设计利用了指针定义的。这两个数组的作用是存入每个月,每个星期的地址。利用指针可以提高程序的可读性,可以更方便使用。四、程序功能:1、输入年份,判断是否为闰年2、输入年月日,判断改日为星期几3、输入年份,打出12个月历,输入月份,打出该月的日历五、程序内容(输入输出):isLeap和theLeap函数的共同使用,一起判断出了输入年份是否为闰年的信息。theCalendar/*打开相应的详情*/,details/*月历详情函数*/,printCalendar/*输出日期详情及表格*/,通过这三个函数可以将输入数据的具体信息通过完整日历的形式表示出来。六、数据流分析(定义的变量,类型,数组,类型,结构体):头文件:stdio.h/**/conio.h/**/stdlib.h/**/采用指针形式定义了*weeks和*months两组数组指针变量在程序中运用了大量的自定义函数,都涉及为了使程序更简介明了。其中有:isLeap/*判断是否为闰年*/theLeap/*输入输出改年是否为闰年的信息*/Zeller/*判断星期的自定义函数*/theWeek()/*对于输入的日期输出该天是星期几*/printCalendar()/*输出日期详情及表格*/details/*月历详情函数*/theCalendar/*打开相应的详情*/Menu()/*程序的主菜单*/Select()/*按键的控制函数*/这些函数的定义极其相应的内部程序共同构筑起了这个万年历总程序。其中的isLeap函数是用来判断输入的年份是否为闰年,实现了预计功能的第一个方面;theWeek函数则是为了实现判断星期而编写的;printCalendar,details,theCalendar这三个函数的共同使用就能够完成第三个功能。七、程序代码分析(每个函数和代码模块的功能作用分析):1、总天数算法isLeap和theLeap函数的共同使用,一起判断出了输入年份是否为闰年的信息。判断一年是否为闰年的方法是:该年分而能被四整除但不能被100整除,或者是能被400整除。2、计算输入日期是星期几利用Zeller函数可以判断出星期,然后对于输入的日期可以通过theWeek()函数对Zeller进行一次调用然后就可以输出相应的星期数。①intZeller(intyear,intmonth,intday)//bytheWeek();printCalendar();/*判断星期的函数*/{intC,y,m,d,w;if(month3){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);}②voidtheWeek()//bySelect();/*对于输入的日期输出该天是星期几*/{intyear,month,day,w;printf(\n);do{printf(Pleaseinputthedate(YYYY-MM-DD):);scanf(%d-%d-%d,&year,&month,&day);if(isLeap(year))days[1]=29;//是否闰年elsedays[1]=28;}while(!((month0&&month13)&&(day0&&day=days[month-1])));w=Zeller(year,month,day);printf(\nThisday%d-%02d-%02dis%s.,year,month,day,weeks[w]);getch();}3、对输入信心的汇总theCalendar/*打开相应的详情*/,details/*月历详情函数*/,printCalendar/*输出日期详情及表格*/,通过这三个函数可以将输入数据的具体信息通过完整日历的形式表示出来。①voidprintCalendar(intyear,intmonth)//bydetails();theCalendar();/*输出日期详情及表格*/{intw,d;w=Zeller(year,month,1);printf(%28s,months[month-1]);printf(\n-%02d-\n,month);printf(SUNMONTUEWEDTHUFRISAT\n);for(d=0;dw;d++){printf();}for(month--,d=1;d=days[month];d++){printf(%4d,d);if((d+w)%7==0&&d!=days[month])printf(\n);}printf(\n============================\n);}②voiddetails(intyear)//bytheCalendar();/*月历详情函数*/{intmonth;while(true){do{system(cls);printf(Press'0'toexit.\n);printf(Pleaseinputthemonth:);scanf(%d,&month);}while(!(month=0&&month=12));if(month!=0){printf(\n);printf(Calendar%d\n,year);printCalendar(year,month);if(getch()=='0')break;}elsebreak;}}③voidtheCalendar()//bySelect();{intyear,month;printf(\nPleaseinputtheyear:);scanf(%d,&year);if(isLeap(year))days[1]=29;//是否闰年elsedays[1]=28;system(cls);printf(Calendar%d\n,year);for(month=1;month=12;month++){printCalendar(year,month);}printf(Moredetailsofeachmonth?[Y/N]);if(tolower(getch())=='y')details(year);}八、控制流分析(源程序整体流程图):九、源代码优点,好处:程序中使用了大量的自定义函数,使程序简单明了,效率更高开始计算是否为闰年计算星期数按键1?按键2?按键3?输出是否为闰年输出星期数计算编辑接收到的数据输出具体月历按键0?是是开始计算是否为闰年计算星期数按键1?按键2?按键3?输出是否为闰年输出星期数计算编辑接收到的数据输出具体月历按键0?是是是开始计算是否为闰年计算星期数按键1?按键2?按键3?输出是否为闰年输出星期数计算编辑接收到的数据输出具体月历按键0?是是是开始计算是否为闰年计算星期数按键1?按键2?按键3?输出是否为闰年输出星期数计算编辑接收到的数据输出具体月历按键0?是是计算是否为闰年计算星期数按键1?按键2?按键3?是是开始计算是否为闰年计算星期数按键1?按键2?按键3?输出是否为闰年输出星期数计算编辑接收到的数据输出具体月历按键0?是是是开始计算是否为闰年计算星期数按键1?按键2?按键3?输出是否为闰年输出星期数计算编辑接收到的数据输出具体月历按键0?是是计算是否为闰年计算星期数按键1?按键2?按键3?是开始计算是否为闰年计算星期数按键1?按键2?按键3?输出是否为闰年输出星期数计算编辑接收到的数据输出具体月历按键0?是是是开始计算是否为闰年计算星期数按键1?按键2?按键3?输出是否为闰年输出星期数计算编辑接收到的数据输出具体月历按键0?是是计算是否为闰年计算星期数按键1?按键3?是开始计算是否为闰年计算星期数按键1?按键2?按键3?输出是否为闰年输出星期数计算编辑接收到的数据输出具体月历按键0?是是是开始计算是否为闰年计算星期数按键1?按键2?按键3?输出是否为闰年输出星期数计算编辑接收到的数据输出具体月历按键0?是是结束退出十、总结及心得体会:这次“万年历系统设计”的课程设计不仅让我对C语言的熟悉程度上升到了另一个高度,更加熟练的运用C语言,而且在一定意义上对面向过程设计的理解更加深刻了。是我在编程路途上的一次质的飞跃。而且在处理非常规数据类型的运算的锻炼下,使我对编程语言有了一个新的认识。当看着一个具有图形界面的万年历的模型成品出现在自己面前时,心中有着无限感慨,原来编程也不是非常遥不可及的,原来在编程的趣味性中能让我学到更多有意思的知识十一、对源程序过程及方法、手段的改进建议:在主菜单输入0后,显示:是否真的要退出(Y/N)?如果输入Y则退出程序否则重新运行Case'0':后的代码改为printf(\nDoyouwanttoExit?(Y/N));con=getch();if((con=='y')||(con=='Y'))return;if((con=='n')||(con=='N'))Exit(1);报告评分:指导教师签字:源代码#includestdio.h#includeconio.h//getch();tolower();exit();#includestdlib.h//system();intdays[12]={31,28,31,30,31,30,31,31,30,31,30,31};char*weeks[7]={Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday};char*months[12]={January,February,March,April,May,June,July,August,September,October,November,December};boolisLeap(intyear)//bytheLeap();theCalendar();/*判断是否为闰年*/{if(year%4==0&&year%100!=0||year%400==0)return1;elsereturn0;}voidtheLeap()//bySelect();/*输入输出改年是否为闰年的信息*/{intyear;printf(\nPleaseinputtheyear:);scanf(%d,&year);if(isLeap(year)){printf(\nTheyear%disleapyear.,year);}else{printf(\nTheyear%disnotleapyear.,year);}getch();}intZeller(intyear,intmonth,intday)//bytheWeek();printCalendar();/*判断星期的自定义函数