1、 1.需求分析:编制一个万年历程序,程序的功能包括 1).一次显示所有年份 2).显示某年指定的月份 3).月份中显示星期 4).能自动判断是否为闰年 2.根据需求及以上的功能画出如下数据流图输入 否是 3.数据字典 年份:程序中的变量名(year),范围:0-9999 月份:程序对应的变量名(month),范围:1-12 星期:程序中的变量名(week)范围:周一至周日 闰年:程序中的变量名(leap),用于判断某一年是否为闰年(二)、软件设计与编码 1.系统功能设计 2.系统主要功能实现 1)判断是否为闰年:IsLeapYear = (Year % 4 = 0 & Year % 100 !
2、= 100 | Year % 400 = 0) ? 1 : 0; 2)查询星期int A; char xq10 = 星期一, 星期二星期三星期四星期五星期六星期日 ; printf(请输入您要查询的年月日(格式:2008 8 12):n); scanf(%d %d %d, &Year, &Month, &Day); getchar(); if (Month = 1) | (Month = 2) Month += 12; Year-; A = (Day + 2 * Month + (3 * (Month + 1) / 5) + Year + (Year / 4) - (Year / 100) +
3、 (Year / 400) % 7 + 1;n%d年%d月%d日是%sn,Year,Month,Day, xqA - 1); 3.程序代码#includestdio.hstdlib.hint main() int Year, Month = 1, Day; /年、月 int FirstDay_Year, FirstDay_Month; /某年的第一天是星期几,某年某月的第一天是星期几(范围是06,其中0代表星期日) int IsLeapYear; /是否为闰年,0表示不是闰年,1表示是闰年 int i, d, y, twelve = 0, display, choice; /临时变量,twel
4、ve控制显示12个月,display控制显示模式, /0:一次显示12个月,1:显示12个月,每次显示一个月,2:显示指定月份 char YN, ch = y, chk,str100,*st=NULL; /Yes No,程序是否要继续,控制显示模式1 st = (char *)malloc(100 * sizeof(char); int Days13 = 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ; /Days112存储每个月有多少天,其中二月的天数是可变的(闰年29天,平年28天),这里初始化为28天 printf( C语言简单万年历
5、nn /打印标题_XunHuan: /循环标号(可以通过goto跳转到这里) chk = n; Month = 1; twelve = 0;again1: 0,退出n 1,查询某年是否是闰年n 2,查询某天是周几n 3,打印月份n 4,清屏n请选择: scanf(%dchoice); gets(str); if (str0 != 0) system(clsYou input wrong number!nnn goto again1; if (choice = 0) return 0; else if (choice = 1) again2:请输入年份: Year); /把输入的年份赋值给变量Y
6、ear gets(str); if (str0 ! system( printf(nn goto again2; if (Year 9999) IsLeapYear = (Year % 4 = 0 & if (IsLeapYear = 1)%d is leap year!, Year); else%d is not a leap year!Continue?(Y/N)%cYN); if (YN = | YN = Y) goto _XunHuan; return 0; else if (choice = 2) int A; again3: goto again3; if (Year 9999 |
7、 Month 12 | Day31)You input wrong value! if (Day = 31) int check = 1, 3, 5, 7, 8, 10, 12 ; for (i = 0; i 12) Month -= 12; Year+;, Year, Month, Day, xqA - 1); else if(choice = 3 ) again4: /提示输入年份(09999) goto again4;0 | Year9999) again5:请输入显示模式: 0 一次显示12个月n 1 手动控制显示12个月(输入q中途退出)n 2 显示指定的月份n 3 清屏n 4 返回
8、ndisplay); goto again5; if (display = 0 | display = 1) y = Year; FirstDay_Year = 5 * (y / 4) + (y % 4) - (y / 100) + (y / 400);/蔡勒公式(计算某年的第一天是星期几) IsLeapYear = (y % 4 = 0 & y % 100 != 100 | y % 400 = 0) ? /判断是否为闰年 Days2 = (IsLeapYear = 1) ? 29 : 28; /闰年二月29天,非闰年二月28天 while (ch !q & ch !Q Month 13) f
9、or (i = 1, d = 0; Month; i+) d = d + Daysi; FirstDay_Month = (d + FirstDay_Year) % 7; /当月的第一天是星期几(0代表星期日)n*ntt公元 %d 年 %2d 月 /打印年月 星期日 星期一 星期二 星期三 星期四 星期五 星期六n /打印星期表头 for (i = 0; FirstDay_Month;%7c, /当某月的第一天不是星期日时打印空格占位 for (d = 1; d = DaysMonth; d+) /循环,从每个月的第一天开始打印%7d, d); if (d + FirstDay_Month)
10、% 7) = 0 & DaysMonth) printf( /当输出了星期六而且还未输出所有天数时,换行 twelve+; Month+; if (display = 1)q(Q)退出,任意键继续: /chk=getchar(); scanf(ch); if (ch ! getchar();是否继续(Y/N)? scanf( if (YN = twelve = 0; Month = 0; ch = goto _XunHuan; else if (display = 2) again6:请输入月份 /提示输入月份(112)Month); /把输入的月份赋值给变量Month gets(str);
11、if (str0 ! system( goto again6; if (Month12) for (i = 1, d = 0; d = d + Daysi; FirstDay_Month = (d + FirstDay_Year) % 7; /打印星期表头 for (d = 1; if (d + FirstDay_Month) % 7) = 0 & getchar(); else if (display = 3) else if (display = 4) goto again1; else else if (choice=4) else return 0; 4.单元测试与集成测试 单元测试也
12、称模块测试或程序测试,单元测试是对每个模块单独进行的,验证模块接口与设计说明书是否一致,对模块的所有主要处理路径进行测试且与预期的结构进行对照,还要对所有错误处理路径进行测试。对源码进行审查,对照设计说明书,检查源程序是否符合功能的逻辑要求,是进行单元测试前的重要工作。单元测试一般由程序员完成也称程序测试。闰年测试如下:二、总结1,实验内容总结本次实验已经实现了实验题目所要求的功能,可以打印一年的日历,可以显示某一个月的日历,可以查询某一天是周几,可以判断某一年是否为闰年。当然这些都是一些基本的功能。虽然完成了所要求的功能,但是由于写的比较急,代码的可读性不是很好,变量的定义,主函数和子函数的
13、设置。不过虽然只是小小的几个功能,但是真正实施起来并不简单,一个模块一个模块的完成,测试,怎样使程序运行之后更符合我们的逻辑思维,不出现重大错误。虽然学习了软件工程这门课,但是通过这个实验发现自己对于软件的开发还没有一个很好的掌握和理解,当然对于这样一个小程序虽然不比那么麻烦,但是参考软件工程的设计方法,总会对程序有所帮助。2,心得体会与建议C语言是我们最先接触的编程语言,理论上来说是编程经验最丰富的一门语言,但是这次实验让感觉到,积累的c语言编程经验还不够,对于编程风格,变量定义还没有形成一种编程意识,使程序更具有可读性,更加直观,逻辑性更强,本次实验代码甚至有些混乱,不过因为程序小,所以弊端几乎没有任何表现。我会在以后的编程实验中继续积累经验,弥补不足。同时基本程序编写完成后,后面大量的工作就是调试错误和优化,这就需要足够的耐心和清晰的逻辑思维。实验后期就是大量的调试,程序的容错性非常重要,但是也非常耗费时间。也正是这次实验让我懂得了编程需要规范,需要更加细心,养成良好的编程风格,不仅使程序可读性更强,即使出错了进行调试也会非常方便。建议:由于编程是一门实践性很强的学科,所以在平时上课过程中应该穿插一些实验,而不是课程上完之后再去做实验,效果应该会好一些。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1