周兵软件工程实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《软件工程》实验报告
一.实验目的
1.能按照软件工程的思想,采用面向过程的方法开发出一个小型软件系统。
2.在软件系统开发过程中,能综合利用一门编程语言和软件工程等多门课程的知识。
3.培养良好的软件开发习惯,了解软件企业文化。
4.掌握结构化数据流分析技术。
5.掌握结构化程序设计的基本概念与技术,并且养成良好的编码风格。
6.掌握单元测试的一般步骤及技术。
7.掌握集成测试的一般步骤和技术。
二.实验内容
1.软件需求分析
①、功能需求分析
·输入一个年份(1-3000),然后显示12个月的月历
·能解决闰年和平年问题
·能输出显示结果
②、运行需求分析
·操作系统:Windows2000, Windows XP、win7及更高版本
③、数据流图
软件结构图
2.软件设计与编码
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <math.h>
#define firstdayof1 1
/* define the first day of first year. 星期日=7 */
#define gap " "
/* set gap between numbers of dates */
#define dent " "
/* set right margin. */
struct info {
int month;
int firstdayofmonth;
int daysofmonth;
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 );
/* This fuction is to accept year, if it is leap year, it return 1, otherwise
return 0 */
int isleap(int y)//判断是否为闰年
{
return ((y%4==0 && y%100!=0) || y%400==0);//是闰年返回1,不是返回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(y<1 || y >3000)
{
printf("\n输入错误!。
\n\n");
y=0;
}
}while(y<1);
return y;
}
/* This function is to accept the input year, if it is the integer, it returns
it, otherwise it return -1 */
int inputyear(void)
{
char s[80];//定义一个字符串数组存放输入的年份字符串,字符串长度为80
int i, y;
y=-1;
printf("请输入年份(1-3000):");
for(i=0;i<80;++i)
{
s[i]=getchar();
if(s[i]==27)//循环接受字符,并判断字符,若此字符等于esc,退出此次接受年份,循环到下一次接受
exit(0);
if(s[i]==10)
break;
}
for(i=0;i<80;++i)
{
if(s[i]==10) break;
else if(!isdigit(s[i]))//不是数字,直接返回y=1,输出输入错误
return y;
}
y=atoi(s);
return y;
}
/*This module is to accept monthinfo, and print the whole year calender. */ void output(struct info monthinfo)
{
char ch;
do{
printhead(monthinfo);
printmonth(monthinfo);
printf("按任意键显视下一月, 按Esc键退出. \n");
ch=getchar();
if(ch==27)
exit(0);
monthinfo=setmonthinfo(monthinfo);
}while(monthinfo.month<13);
}
/* This module is to accept monthinfo, amd print monthly head like"一月" */
void printhead(struct info monthinfo)
{
char *ss;
printf("%s",dent);
switch(monthinfo.month)
{
case 1: ss="一月";
break;
case 2: ss="二月";
break;
case 3: ss="三月";
break;
case 4: ss="四月";
break;
case 5: ss="五月";
break;
case 6: ss="六月";
break;
case 7: ss="七月";
break;
case 8: ss="八月";
break;
case 9: ss="九月";
break;
case 10: ss="十月";
break;
case 11: ss="十一月";
break;
case 12: ss="十二月";
}
printf(" %s%s%s%s\n\n",gap,gap,gap,ss);
}
/* This module is to accept monthinfo, and print the numbered dates of the month.
*/
void printmonth(struct info monthinfo)
{
int i,j,k;
printf("%s",dent);
printf("一%s二%s三%s四%s五%s六%s日\n\n",gap,gap,gap,gap,gap,gap);
printf("%s",dent);
for(i=1;i<monthinfo.firstdayofmonth;i=i+1)
{
printf("%s ",gap);
}
k=monthinfo.firstdayofmonth;
for(j=1;j<=monthinfo.daysofmonth;j=j+1)
{
if(k>7)
{
k=k-7;
printf("\n\n%s",dent);
};
k=k+1;
printf("%2d%s",j,gap);
}
printf("\n\n");
}
/* This module is to accept the monthinfo, and set the monthinfo 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.daysofmonth=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;//firstdayof1初始化为1
for(i=1;i<year;i=i+1)//从第一年到year,monthinfo累计
{
if(isleap(i))
days=366;
else
days=365 ;
monthinfo.firstdayofmonth=(monthinfo.firstdayofmonth+days-1)%7+1;//元月一号
}
monthinfo.daysofmonth=31;
monthinfo.leap=isleap(year);
return monthinfo;
}
void main(){
int year ;
struct info monthinfo;
year = checkinput();
monthinfo = setinit(year);
output(monthinfo);
}
3.单元测试
①.白盒测试
②.黑盒测试
2015年
三.总结
1.实验内容总结
实验内容总结
实验过程中遇到的最大问题就是,不知道一年中的元月一号是星期几。
结果上网查了公式才知道。
实验时按照每个步骤进行,自己按照数据流图设计程序代码,定义结构体,虽然出现了一些问题,但通过上网的查询,都得到了解决。
这次的实
验对我的c语言又得到了一次较好的巩固。
2.心得体会与建议
经过对实验的研究,我按照软件工程的思想,把理论应用到了实践当中。
采用面向过程的方法开发出了一个万年历的小程序。
培养了良好的软件开发习惯,了解了一点软件的企业文化。
掌握了一定的结构化数据流分析技术。
了解了一定的结构化设计的基本概念与技术,对于以前学习的C语言知识有了更深的了解和更好的应用。
对子函数的应用更得心应手。
总之,这次实验让我受益匪浅。