资源描述
《软件工程》实验报告
姓 名:江文杰
学 号:139074333
班 级:网133
指导老师:周兵
一. 实验目的
1.能按照软件工程的思想,采用面向过程的方法开发出一个小型软件系统。
2.在软件系统开发过程中,能综合利用一门编程语言和软件工程等多门课程的知识。
3.培养良好的软件开发习惯,了解软件企业文化.
4.掌握结构化数据流分析技术。
5.掌握结构化程序设计的基本概念与技术,并且养成良好的编码风格。
6.掌握单元测试的一般步骤及技术。
7.掌握集成测试的一般步骤和技术。
二. 实验内容
1. 软件需求分析
①、功能需求分析
·输入一个年份(1—3000),然后显示12个月的月历
·能解决闰年和平年问题
·能输出显示结果
②、运行需求分析
· 操作系统: Windows9x, Windows2000, Windows XP及更高版本
③、数据流图
是否闰年
确定年份
开始信息
开始信息
年份
显示其他月份
显示12月
错误
显示表头
计算1月1日
检查输入
年份
任意键
年份
年份
非法
显示2月
显示1月
软件结构图:
main
setinit()
output()
inputyear()
checkinput()
setinfo()
printmonth()
printhead()
isleap ()
2. 软件设计与编码
#include 〈stdio。h〉
#include 〈ctype。h〉
#include <stdlib。h>
#include <math.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;
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==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(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];
int i, y;
y=—1;
printf(”请输入年份(1—3000):”);
for(i=0;i〈80;++i)
{
s[i]=getchar();
if(s[i]==27)
exit(0);
if(s[i]==10)
break;
}
for(i=0;i〈80;++i)
{
if(s[i]==10) break;
else if(!isdigit(s[i]))
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;
for(i=1;i〈year;i=i+1)
{
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(){
printf(" \t\t************************************ \n");
printf(” \t\t欢迎使用万年历演示程序 \n");
printf(” \t\t************************************ \n”);
int year ;
struct info monthinfo;
year = checkinput();
monthinfo = setinit(year);
output(monthinfo);
}
3. 单元测试
①. 白盒测试
②.黑盒测试
2015年
三月四月
五月六月
2016年:
三. 总结和体会
本次用C语言编写的万年历系统主要实现了年历、月历、日历的显示。我根本就不喜欢敲代码了,看见代码就头疼。所以感觉厌恶这门专业,对学习也不感兴趣了。而且,还有一件更头疼的事是在写一个简单的程序时竟然老是出错,难一点的,复杂一点的程序竟然无从下手。但是去看程序的参考答案时都看得懂,又感觉很容易。学了软件工程以后,我就感觉我以前的学习方法是错误的。以前我只注重于代码,而不注重理论知识以及编程的思路,程序的架构.以至于在些程序时没有写程序的思路,不能形成程序的架构.只想到看脑袋里是否有与此类似的代码。越想程序越乱,最后脑袋里一片空白。不知道程序从哪个方面下手了。软件工程这门课程是做软件开发的人必学的课程,通过学这门课程,程序员就会注重软件开发的理论知识,以及做项目开发的思路。学了这门课程后你写程序就不会去盲目的去套用代码,而是理清此程序的架构以及思路。程序该从什么时候开始,什么时候结束.在中间需要添加什么样的功能,以完善该软件。
在设计初期,首先温习了课本内容,再次熟悉了一下C语言程序,然后广泛的查找有关万年历的资料,并结合查找到的资料,整理出设计的主要思路,画出流程图,最终写出了源程序,并编译成功,在实验中,碰到了不少问题,其中包括如何获取系统时间,如何计算任意时间的时间差,这些困难,都通过查阅资料和问同学得到了解决。当然,由于时间和能力的原因,做得还不是很完美。
在这学期的课程序设计中,收获知识的同时,还收获了阅历,收获了成熟,通过查找大量资料,请教老师,以及不懈的努力,不仅培养了独立思考、 动手制作的能力,在各种其它能力上也都有了提高。更重要的是,在课程序设计里,我们学会了很多学习的方法,知道了理论和实践的巨大差别。而这是以后最实用的,真的是受益匪浅。要面 对社会的挑战,只有不断的学习、实践,再学习、再实践。同时在与老师和同学的交流过程中,互动学习,将知识融会贯通。通过自己的努力,做出了一个万年历,对以后的学习是一个莫大的鼓舞,激起了我的学习兴趣和开发创新思维。
在调试过程中主要的问题就是结果的显示问题,显示易错位.以及函数之间调用问题。对于这些问题,主要是翻阅书籍和在网络上寻找解决方案,以及自己亲自用找到的方法去测试,最终成功的解决了问题。
通过这次课程设计,使我对C语言了解不再停留在书面的了解,而是有了更深的理解,培养了自己的分析能力和设计能力,受益匪浅。
7
展开阅读全文