万年历的课程设计报告及程序.pdf
1 第一部分:正文 一,课程设计名称:1.万年历 2.(a)(b)*二,使用工具软件:Microsoft Visual Basic 6.0 中文版。三,课程设计内容简介:(1)万年历的课程设计的基本结构流程:Main 函数 Yearshow 函数 Monthshow 函数 Getmonthweekday 函数 Getmonthday 函数 Isleap 函数 Getyeaweekday 函数 Getyearday 函数 2 从 main函数开始,比如输入 2001年,调用函数 yearshow,它是控制总循环次数 12 个月的,在 yearshow里有调用了以个函数是monthshow,是控制每个月如何输出显示的,在这个函数里有调用了getmonthweekday函数,它是获得每个月一号是星期几的函数,此函数分为两部分,以 2000年 1 月 1 号是星期六为准;做十一次运算便可得知 2 月到 12 月各个月的 1 号为星期几。而在这个函数又调用了getyearday这个函数,是返回天数的函数,它有调用了 isleap函数,计算时平年还是闰年是,时闰年返回 366,平年返回 355。到这步开始就返回值了,首先 isleap告诉 getyeardays2000是闰年和平年,于是 getyeardays得到 366getyearweekday,getyearweekday就计算 sum=366且返回(366+6)%7=2给 getmonthweekday,w=2,getmonthweekday中若计算 1月 1号则为星期二,2月-12月中如 3月则要加上以月和二月的天数载加上 2对 7取余数,这个数返回给monthshow,若这个数是 w=0;不输出空格,不等于 0就输出 w-1个空格,以便日期和星期对应,如此循环十二个月就计算完了,一边计算一遍显示。3(2)(a)图形的课程设计的基本结构流程 (3)(b)图形的课程设计的基本结构流程 Y N 键 盘 输 入int p 值 p0|p%2=0 main 二重 for 循环控制输出图形 结束 4 y N (4)运行环境:Win32 Console Application 四,得意之处.1把程序分解成多个小函数,那么问题就分解成几个小问题。(1)int getYearWeekDay(int y)是给定年的一月一号是星期几。(2)getYearDays(int y)是从 2000 年到给定年每年各有多少天。(3)isLeap(int y)计算从 2000 年到给定年分别是平年还是闰年有 并把值反给函数 getyearday 和 getmonthday。键 盘 输 入m 值 m0|m%2=0 int y 二重 for 循环控制输出图形 结束 main 5(4)getMonthWeekDay(int y,int m)计算给定年 2 月到 12 月每月一号是星期几(5)getMonthDays(int y,int m)控制给定年的各个月有多少天(6)yearShow(int y)用 for 控制十二个月的输出(7)monthShow(int y,int m)控制每个月的输出,并且有两个函数调用了它,分别是 getyearday 和 getmonthday 2 计算星期数的时候,2000 年的 1 月 1 号是星期六。若要查询的年大于 2000 年就用 for(i=2000;i y;i+)sum+=getYearDays(i);return(sum+6)%7;若要查询的年小于 2000 年就用 for(i=y;i 2000;i+)sum+=getYearDays(i);return(-sum%7+6)%7;五创意的技术实现(1)int isLeap(int y)return y%4=0&y%100!=0|y%400=0;/return y=366;/else return y=365;该小程序实现平年和闰年,有两个函数要调用它。(2)主要程序段是 monthshow 函数 int monthShow(int y,int m)6 int i=0,w;cout endl*m 月*endl;cout Sun Mon Tue Wed Thu Fri Satendl;w=getMonthWeekDay(y,m);for(i=1;i=getMonthDays(y,m);i+)coutsetw(4)setfill()i;w+;w%=7;if(w=0&i getMonthDays(y,m)cout t endl;return 0;六课程设计中目前存在的问题 在编写程序的过程中遇到很多的问题,尤其是万年历,可以说我一点头绪都没有,如何显示平年或闰年,如何输出月,日,星期,最后查看了资料和上网查询才有了思路,到最后输出结果还是从在很多的问题,请求李龙飞的帮忙才能够正确输出结果,但最后不管输入哪年,输出的结果十二月 30 号后面总是有一个多余 0。这个问题好没有解决。在编写图形程序过程中也出现了问题,输出的图形不正确,上半部分输出下半部分不能正确输出,或者*数和空格数不正确,上下两部分不能对齐,这些问题都是 for循环中的个数没有控制好,仔细考虑就可以把问题解决了,可以输出完整的图形。七设计实践过程中的自我感受。(1)当看到题目时觉得很难,上网查询以 2000年的 1 月 1 日星期六为准,计算各个月的星期数。(2)首先要有控制平年或闰年的函数isleap,一个控制月份的函数,yearshow函数,其次要有一个月份输出的函数,monthshow函数,知 7 道该月一号是星期几就能显示该月就,有了函数 getmonthweekday,而 getmonthweekday又需要一月一号的星期数和它前面的月的总天数,又有了 getmonthday和 getyearweekday,它两,又调用了函数isleap。(3)复杂图形程序要比万年历简单多了。万年历参考了之后才有思路,看到图形的打印题时就有了好几方面得到解决方法,这次程序设计总体感受是编写一个程序需要持之以恒和全心投入及小组成员合作,我们要把大的问题化解成小的问题,一步一步的解决,图书馆翻阅资料及上网查询都是学习的好方法,当遇到很难解决的问题就要和同学一起讨论,若还没有解决的办法,请求老师的帮忙。第二部分:参考文献 1 c+程序设计教程(第二版)2 C+二级考试教材 3.c+程序设计教程(谭浩强)第三部分:附录程序 1.万年历 以 2000年为参照(2000年的第一天时星期六)#include 8#include using namespace std;int getYearWeekDay(int y);int getYearDays(int y);int isLeap(int y);int getMonthWeekDay(int y,int m);int getMonthDays(int y,int m);int yearShow(int y);int monthShow(int y,int m);int getYearWeekDay(int y)int sum=0,i;if(y=2000)for(i=2000;i y;i+)sum+=getYearDays(i);return(sum+6)%7;else for(i=y;i 2000;i+)sum+=getYearDays(i);return(-sum%7+6)%7;int getYearDays(int y)return isLeap(y)?366:365;int isLeap(int y)return y%4=0&y%100!=0|y%400=0;/return y=366;/else return y=365;int getMonthWeekDay(int y,int m)int sum=0;int i;for(i=1;i m;i+)sum+=getMonthDays(y,i);return(getYearWeekDay(y)+sum)%7;int getMonthDays(int y,int m)switch(m)case 1:case 3:case 5:case 7:case 8:case 10:9 case 12:return 31;case 4:case 6:case 9:case 11:return 30;case 2:return isLeap(y)?29:28;default:return 0;yearShow(int y)int i;for(i=1;i=12;i+)monthShow(y,i);return 0;int monthShow(int y,int m)int i=0,w;cout endl*m 月*endl;cout Sun Mon Tue Wed Thu Fri Satendl;w=getMonthWeekDay(y,m);for(i=1;i=getMonthDays(y,m);i+)coutsetw(4)setfill()i;w+;w%=7;if(w=0&i getMonthDays(y,m)cout t endl;return 0;int main()int y;cout y;cout setw(16)setfill()y 年endl;cout yearShow(y)endl;二图形(a)及(b)的程序。(a)/课程设计:选作题目二打印复杂图形#include using namespace std;void main()10 int p,i,j,k,m,n;coutp;if(p0|(p%2=0)cout”this is a error program:”;if(p%2!=0)/判断输入的数是否是奇数 for(i=1;i=(p+1)/2;i+)/输出上半部分的行数 for(j=1;j=(p+1)/2-i;j+)cout;/输出上左半部分的空格 for(k=1;k2*i;k+)cout*;/输出上左半部分的“*”for(m=1;m=p-2*i+1;m+)cout;/输出上半部分中间的空格 for(n=1;n2*i;n+)cout*;/输出上右半部分的“*”coutn;for(i=1;i=(p-1)/2;i+)/输出下半部分的行数 for(j=1;j=i;j+)cout;/输出下左半部分的空格 for(k=1;k=p-2*i;k+)cout*;/输出下左半部分的“*”for(m=1;m=2*i;m+)cout;/输出下半部分中间的空格 for(n=1;n=p-2*i;n+)cout*;/输出下右半部分的“*”coutn;(b)/课程设计:选作题目二打印复杂图形#include using namespace std;void main()int i,j,k,y;couty;11 if(y0|(y%2=0)cout”this is a error program:”;if(y%2!=0)/判断是否是奇数 for(i=1;i=(y+1)/2;i+)/输出上半部分的行数 for(j=1;j=(y+3)/2-i;j+)cout*;/输出上左半部的“*”for(k=0;k2*i-3;k+)cout;/输出上半部分的空格 if(i=2)for(j=1;j=(y-1)/2;j+)cout2)for(j=1;j=(y+3)/2-i;j+)cout*;/输出上半部分的空格 coutn;for(i=1;i=(y-1)/2;i+)/输出下半部分的行数 for(j=1;j=i+1;j+)cout*;/输出下左半部的“*”for(k=1;k=y-2*(i+1);k+)cout;/输出下半部分的空格 if(i=(y-1)/2-2)for(j=1;j=i+1;j+)cout=(y-1)/2-1)for(j=1;j=(y-1)/2;j+)cout*;/输出下右半部分倒数 2 行的“*”coutn;