软件工程B实验报告.docx
- 文档编号:7259154
- 上传时间:2023-01-22
- 格式:DOCX
- 页数:16
- 大小:178.63KB
软件工程B实验报告.docx
《软件工程B实验报告.docx》由会员分享,可在线阅读,更多相关《软件工程B实验报告.docx(16页珍藏版)》请在冰豆网上搜索。
软件工程B实验报告
软件工程B实验报告
专业班级
学号
姓名
指导教师
安徽工业大学计算机学院
实验题目:
编制一个万年历程序
一、实验目的与要求:
1.实验目的
软件工程是一门实践性很强的课程,上机实验是其重要的环节。
本实验指导书配合《软件工程》课程的学习而制订的。
实验目的是:
1).能按照软件工程的思想,采用面向过程的方法开发出一个小型软件系统。
2).在软件系统开发过程中,能综合利用一门编程语言和软件工程等多门课程的知识。
3).培养良好的软件开发习惯,了解软件企业文化。
4).通过实例使同学们掌握结构化数据流分析技术。
5).通过实例使同学们掌握结构化程序设计的基本概念与技术,并且养成良好的编码风格。
6).通过实例使同学们掌握单元测试的一般步骤及技术。
7).通过实例使同学们掌握集成测试的一般步骤和技术。
2.实验要求
1).要求做到使用结构化数据流分析技术分析课题需求,写出详细的数据流图和数据字典,数据流图的基本处理的个数不得少与5个。
2).要求做到对上一实验的软件需求进行软件结构设计,模块数不少于四个。
然后再进行详细设计并编码。
程序要符合结构化程序的要求。
3).单元测试:
要求掌握如何设计测试方案、撰写测试说明书,并掌握程序修改的常用技术。
要求对上一实验所编的程序进行单元测试,要编写存根和驱动程序,要分步进行,要有教详细的测试说明书,要测试通过。
4.)集成测试:
要求掌握如何设计测试方案、撰写测试说明书,并掌握程序修改的常用技术。
要求对上一实验测试通过的单元进行集成测试,要分步进行,至少要有一个存根和驱动程序,要有教详细的测试说明书,要测试通过。
二、实验内容:
(一),软件需求分析
1.需求分析:
编制一个万年历程序,程序的功能包括
1).一次显示所有年份
2).显示某年指定的月份
3).月份中显示星期
4).能自动判断是否为闰年
2.根据需求及以上的功能画出如下数据流图
输入
否
是
否
是
3.数据字典
年份:
程序中的变量名(year),范围:
0-9999
月份:
程序对应的变量名(month),范围:
1-12
星期:
程序中的变量名(week)范围:
周一至周日
闰年:
程序中的变量名(leap),用于判断某一年是否为闰年
(二)、软件设计与编码
1.系统功能设计
2.系统主要功能实现
1)判断是否为闰年:
IsLeapYear=(Year%4==0&&Year%100!
=100||Year%400==0)?
1:
0;
2)查询星期
intA;
charxq[][10]={"星期一","星期二","星期三","星期四","星期五","星期六","星期日"};
printf("请输入您要查询的年月日(格式:
2008812):
\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)+(Year/400))%7+1;
printf("\n%d年%d月%d日是%s\n",Year,Month,Day,xq[A-1]);
3.程序代码
#include"stdio.h"
#include"stdlib.h"
intmain()
{
intYear,Month=1,Day;//年、月
intFirstDay_Year,FirstDay_Month;//某年的第一天是星期几,某年某月的第一天是星期几(范围是0~6,其中0代表星期日)
intIsLeapYear;//是否为闰年,0表示不是闰年,1表示是闰年
inti,d,y,twelve=0,display,choice;//临时变量,twelve控制显示12个月,display控制显示模式,
//0:
一次显示12个月,1:
显示12个月,每次显示一个月,2:
显示指定月份
charYN,ch='y',chk,str[100],*st=NULL;//YesNo,程序是否要继续,控制显示模式1
st=(char*)malloc(100*sizeof(char));
intDays[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
//Days[1~12]存储每个月有多少天,其中二月的天数是可变的(闰年29天,平年28天),这里初始化为28天
printf("C语言简单万年历\n\n");//打印标题
_XunHuan:
//循环标号(可以通过goto跳转到这里)
chk='\n';
Month=1;
twelve=0;
again1:
printf("0,退出\n1,查询某年是否是闰年\n2,查询某天是周几\n3,打印月份\n4,清屏\n请选择:
");
scanf("%d",&choice);
gets(str);
if(str[0]!
='\0'){
system("cls");
printf("Youinputwrongnumber!
\n\n\n");
gotoagain1;
}
if(choice==0)
return0;
elseif(choice==1){
again2:
printf("请输入年份<0000~9999>:
");
scanf("%d",&Year);//把输入的年份赋值给变量Year
gets(str);
if(str[0]!
='\0'){
system("cls");
printf("Youinputwrongnumber!
\n\n");
gotoagain2;
}
if(Year<0||Year>9999){
printf("Youinputwrongnumber!
\n\n");
gotoagain2;
}
IsLeapYear=(Year%4==0&&Year%100!
=100||Year%400==0)?
1:
0;
if(IsLeapYear==1)
printf("%disleapyear!
\n",Year);
else
printf("%disnotaleapyear!
\n",Year);
printf("Continue?
(Y/N)");
scanf("%c",&YN);
getchar();
if(YN=='y'||YN=='Y')
goto_XunHuan;
else
return0;
}
elseif(choice==2){
intA;
charxq[][10]={"星期一","星期二","星期三","星期四","星期五","星期六","星期日"};
again3:
printf("请输入您要查询的年月日(格式:
2008812):
\n");
scanf("%d%d%d",&Year,&Month,&Day);
gets(str);
if(str[0]!
='\0'){
system("cls");
printf("Youinputwrongnumber!
\n\n");
gotoagain3;
}
if(Year<0||Year>9999||Month<1||Month>12||Day<1||Day>31){
printf("Youinputwrongvalue!
\n\n");
gotoagain3;
}
if(Day==31){
intcheck[]={1,3,5,7,8,10,12};
for(i=0;i<7;i++)
if(Month==check[i])
break;
if(i==7){
printf("%d年%d月没有31天\n\n",Year,Month);
gotoagain3;
}
}
if((Month==1)||(Month==2)){
if(Month==2&&Day==29){
IsLeapYear=(Year%4==0&&Year%100!
=100||Year%400==0)?
1:
0;
if(!
IsLeapYear){
printf("%d年%d月没有29天\n\n",Year,Month);
gotoagain3;
}
}
Month+=12;
Year--;
}
A=(Day+2*Month+(3*(Month+1)/5)+Year+(Year/4)-(Year/100)+(Year/400))%7+1;
if(Month>12){
Month-=12;
Year++;
}
printf("\n%d年%d月%d日是%s\n",Year,Month,Day,xq[A-1]);
printf("Continue?
(Y/N)");
scanf("%c",&YN);
getchar();
if(YN=='y'||YN=='Y')
goto_XunHuan;
else
return0;
}
elseif(choice==3){
again4:
printf("请输入年份<0000~9999>:
");//提示输入年份(0~9999)
scanf("%d",&Year);//把输入的年份赋值给变量Year
gets(str);
if(str[0]!
='\0'){
system("cls");
printf("Youinputwrongnumber!
\n\n");
gotoagain4;
}
if(Year<0||Year>9999){
printf("Youinputwrongnumber!
\n\n");
gotoagain4;
}
again5:
printf("请输入显示模式:
\n");
printf("[0]一次显示12个月\n[1]手动控制显示12个月(输入q中途退出)\n[2]显示指定的月份\n[3]清屏\n[4]返回\n");
scanf("%d",&display);
gets(str);
if(str[0]!
='\0'){
printf("Youinputwrongnumber!
\n\n");
gotoagain5;
}
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)?
1:
0;
//判断是否为闰年
Days[2]=(IsLeapYear==1)?
29:
28;//闰年二月29天,非闰年二月28天
while(ch!
='q'&&ch!
='Q'&&Month<13){
for(i=1,d=0;i d=d+Days[i]; FirstDay_Month=(d+FirstDay_Year)%7;//当月的第一天是星期几(0代表星期日) printf("\n****************************************************\n"); printf("\t\t公元%d年%2d月",Year,Month);//打印年月 printf("\n****************************************************\n"); printf("星期日星期一星期二星期三星期四星期五星期六\n"); //打印星期表头 for(i=0;i printf("%7c",'');//当某月的第一天不是星期日时打印空格占位 for(d=1;d<=Days[Month];d++){//循环,从每个月的第一天开始打印 printf("%7d",d); if(((d+FirstDay_Month)%7)==0&&d printf("\n");//当输出了星期六而且还未输出所有天数时,换行 } printf("\n****************************************************\n"); twelve++; Month++; if(display==1){ printf("q(Q)退出,任意键继续: "); //chk=getchar(); scanf("%c",&ch); if(ch! ='\n') getchar(); } } printf("\n"); printf("是否继续(Y/N)? \n"); scanf("%c",&YN); if(YN=='Y'||YN=='y'){ twelve=0; Month=0; ch='y'; goto_XunHuan; } } elseif(display==2){ again6: printf("请输入月份<1~12>: ");//提示输入月份(1~12) scanf("%d",&Month);//把输入的月份赋值给变量Month gets(str); if(str[0]! ='\0'){ system("cls"); printf("Youinputwrongnumber! \n\n"); gotoagain6; } if(Month<1||Month>12){ printf("Youinputwrongnumber! \n\n"); gotoagain6; } y=Year; FirstDay_Year=5*(y/4)+(y%4)-(y/100)+(y/400);//蔡勒公式(计算某年的第一天是星期几) IsLeapYear=(y%4==0&&y%100! =100||y%400==0)? 1: 0; //判断是否为闰年 Days[2]=(IsLeapYear==1)? 29: 28;//闰年二月29天,非闰年二月28天 for(i=1,d=0;i d=d+Days[i]; FirstDay_Month=(d+FirstDay_Year)%7;//当月的第一天是星期几(0代表星期日) printf("\n****************************************************\n"); printf("\t\t公元%d年%2d月",Year,Month);//打印年月 printf("\n****************************************************\n"); printf("星期日星期一星期二星期三星期四星期五星期六\n"); //打印星期表头 for(i=0;i printf("%7c",'');//当某月的第一天不是星期日时打印空格占位 for(d=1;d<=Days[Month];d++){//循环,从每个月的第一天开始打印 printf("%7d",d); if(((d+FirstDay_Month)%7)==0&&d printf("\n");//当输出了星期六而且还未输出所有天数时,换行 } printf("\n****************************************************\n"); printf("\n"); printf("是否继续(Y/N)? \n"); scanf("%c",&YN); getchar(); if(YN=='Y'||YN=='y') goto_XunHuan; } elseif(display==3){ system("cls"); gotoagain5; } elseif(display==4){ gotoagain1; } else{ printf("Youinputwrongnumber! \n\n\n"); gotoagain5; } } elseif(choice==4){ system("cls"); gotoagain1; } else{ system("cls"); printf("Youinputwrongnumber! \n\n\n"); gotoagain1; } return0; }4.单元测试与集成测试 单元测试也称模块测试或程序测试,单元测试是对每个模块单独进行的,验证模块接口与设计说明书是否一致,对模块的所有主要处理路径进行测试且与预期的结构进行对照,还要对所有错误处理路径进行测试。 对源码进行审查,对照设计说明书,检查源程序是否符合功能的逻辑要求,是进行单元测试前的重要工作。 单元测试一般由程序员完成也称程序测试。 闰年测试如下: 二、总结 1,实验内容总结 本次实验已经实现了实验题目所要求的功能,可以打印一年的日历,可以显示某一个月的日历,可以查询某一天是周几,可以判断某一年是否为闰年。 当然这些都是一些基本的功能。 虽然完成了所要求的功能,但是由于写的比较急,代码的可读性不是很好,变量的定义,主函数和子函数的设置。 不过虽然只是小小的几个功能,但是真正实施起来并不简单,一个模块一个模块的完成,测试,怎样使程序运行之后更符合我们的逻辑思维,不出现重大错误。 虽然学习了软件工程这门课,但是通过这个实验发现自己对于软件的开发还没有一个很好的掌握和理解,当然对于这样一个小程序虽然不比那么麻烦,但是参考软件工程的设计方法,总会对程序有所帮助。 2,心得体会与建议 C语言是我们最先接触的编程语言,理论上来说是编程经验最丰富的一门语言,但是这次实验让感觉到,积累的c语言编程经验还不够,对于编程风格,变量定义还没有形成一种编程意识,使程序更具有可读性,更加直观,逻辑性更强,本次实验代码甚至有些混乱,不过因为程序小,所以弊端几乎没有任何表现。 我会在以后的编程实验中继续积累经验,弥补不足。 同时基本程序编写完成后,后面大量的工作就是调试错误和优化,这就需要足够的耐心和清晰的逻辑思维。 实验后期就是大量的调试,程序的容错性非常重要,但是也非常耗费时间。 也正是这次实验让我懂得了编程需要规范,需要更加细心,养成良好的编程风格,不仅使程序可读性更强,即使出错了进行调试也会非常方便。 建议: 由于编程是一门实践性很强的学科,所以在平时上课过程中应该穿插一些实验,而不是课程上完之后再去做实验,效果应该会好一些。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 软件工程 实验 报告