1、能输出显示结果、运行需求分析 操作系统: Windows9x, Windows2000, Windows XP及更高版本、数据流图软件结构图:2软件设计与编码#include ctype.hstdlib.hmath.h#define firstdayof1 1 /* 定义第一年的第一天, 星期日=7 */#define gap /* set gap between numbers of dates */#define dent /* set right margin. */struct info int month; int firstdayofmonth; int daysofmonth;
2、int leap; monthinfo;int checkinput(void);int inputyear(void);int isleap(int y);void output(struct info);void printhead(struct info );void printmonth(struct info);struct info setinit(int);struct info setmonthinfo(struct info );/* 这个作用是判断年, 如果是闰年, return 1, 否则 return 0 */int isleap(int y) return (y%4=
3、0 & y%100!=0) | y%400=0);/* This module is to accept inputyear() and check if it is correct. if it is correct it return int year, otherwise ask user reenter */int checkinput(void) int y; do y=inputyear(); if(y3000) printf(n输入错误!。nn); y=0; while(y1); return y;/* This function is to accept the input y
4、ear, if it is the integer, it returns it, otherwise it return -1 */int inputyear(void) char s80; int i, y; y=-1;请输入年份(1-3000): for(i=0;i80;+i) si=getchar(); if(si=27) exit(0); if(si=10) break;+i) if(si=10) break; else if(!isdigit(si) y=atoi(s);/*This module is to accept monthinfo, and print the whol
5、e year calender. */void output(struct info monthinfo) char ch; printhead(monthinfo); printmonth(monthinfo);按任意键显视下一月, 按Esc键退出. n ch=getchar(); if(ch=27) monthinfo=setmonthinfo(monthinfo); while(monthinfo.month13);/* This module is to accept monthinfo, amd print monthly head like一 月 */void printhead(
6、struct info monthinfo) char *ss;%s,dent); switch(monthinfo.month) case 1: ss=; case 2:二 月 case 3:三 月 case 4:四 月 case 5:五 月 case 6:六 月 case 7:七 月 case 8:八 月 case 9:九 月 case 10:十 月 case 11:十一 月 case 12:十二 月 %s%s%s%snn,gap,gap,gap,ss);/* This module is to accept monthinfo, and print the numbered dates
7、of the month. */void printmonth(struct info monthinfo) int i,j,k;一%s二%s三%s四%s五%s六%s日nn,gap,gap,gap,gap,gap,gap); for(i=1;monthinfo.firstdayofmonth;i=i+1)%s ,gap); k=monthinfo.firstdayofmonth; for(j=1;j7) k=k-7;nn%s ; k=k+1;%2d%s,j,gap);/* This module is to accept the monthinfo, and set the monthinfo
8、 of next month. */ struct info setmonthinfo(struct info monthinfo) int m; monthinfo.firstdayofmonth= (monthinfo.firstdayofmonth+ monthinfo.daysofmonth-1)%7+1; monthinfo.month=monthinfo.month+1; monthinfo.daysofmonth=30; m=monthinfo.month; if(m=1 | m=3 | m=5 | m=7 | m=8 | m=10 | m =12) monthinfo.days
9、ofmonth=31; if(m=2) if(monthinfo.leap) monthinfo.daysofmonth = 29; else monthinfo.daysofmonth = 28; return monthinfo;/* This module is to initialize the monthinfo. */struct info setinit(int year) int i,days,total; struct info monthinfo; monthinfo.month=1; monthinfo.firstdayofmonth=firstdayof1;year;
10、if(isleap(i) days=366; days=365 ; monthinfo.firstdayofmonth=(monthinfo.firstdayofmonth+days-1)%7+1; monthinfo.leap=isleap(year);void main()printf( tt* n tt欢迎使用万年历演示程序 n int year ; year = checkinput(); monthinfo = setinit(year); output(monthinfo);3单元测试白盒测试黑盒测试2015年三月四月五月六月2016年:三总结和体会本次用C语言编写的万年历系统主要
11、实现了年历、月历、日历的显示。我根本就不喜欢敲代码了,看见代码就头疼。所以感觉厌恶这门专业,对学习也不感兴趣了。而且,还有一件更头疼的事是在写一个简单的程序时竟然老是出错,难一点的,复杂一点的程序竟然无从下手。但是去看程序的参考答案时都看得懂,又感觉很容易。学了软件工程以后,我就感觉我以前的学习方法是错误的。以前我只注重于代码,而不注重理论知识以及编程的思路,程序的架构。以至于在些程序时没有写程序的思路,不能形成程序的架构。只想到看脑袋里是否有与此类似的代码。越想程序越乱,最后脑袋里一片空白。不知道程序从哪个方面下手了。软件工程这门课程是做软件开发的人必学的课程,通过学这门课程,程序员就会注重
12、软件开发的理论知识,以及做项目开发的思路。学了这门课程后你写程序就不会去盲目的去套用代码,而是理清此程序的架构以及思路。程序该从什么时候开始,什么时候结束。在中间需要添加什么样的功能,以完善该软件。在设计初期,首先温习了课本容,再次熟悉了一下C语言程序,然后广泛的查找有关万年历的资料,并结合查找到的资料,整理出设计的主要思路,画出流程图,最终写出了源程序,并编译成功,在实验中,碰到了不少问题,其中包括如何获取系统时间,如何计算任意时间的时间差,这些困难,都通过查阅资料和问同学得到了解决。当然,由于时间和能力的原因,做得还不是很完美。在这学期的课程序设计中,收获知识的同时,还收获了阅历,收获了成
13、熟,通过查找大量资料,请教老师,以及不懈的努力,不仅培养了独立思考、 动手制作的能力,在各种其它能力上也都有了提高。更重要的是,在课程序设计里,我们学会了很多学习的方法,知道了理论和实践的巨大差别。而这是以后最实用的,真的是受益匪浅。要面 对社会的挑战,只有不断的学习、实践,再学习、再实践。同时在与老师和同学的交流过程中,互动学习,将知识融会贯通。通过自己的努力,做出了一个万年历,对以后的学习是一个莫大的鼓舞,激起了我的学习兴趣和开发创新思维。在调试过程中主要的问题就是结果的显示问题,显示易错位。以及函数之间调用问题。对于这些问题,主要是翻阅书籍和在网络上寻找解决方案,以及自己亲自用找到的方法去测试,最终成功的解决了问题。通过这次课程设计,使我对C语言了解不再停留在书面的了解,而是有了更深的理解,培养了自己的分析能力和设计能力,受益匪浅。