您的当前位置:首页安徽工业大学软件工程实验报告

安徽工业大学软件工程实验报告

2021-02-20 来源:乌哈旅游
《软件工程》实验报告

姓 名:江文杰 学 号:139074333 班 级:网133 指导老师:周兵

一. 实验目的

1.能按照软件工程的思想,采用面向过程的方法开发出一个小型软件系统。

2.在软件系统开发过程中,能综合利用一门编程语言和软件工程等多门课程的知识。

3.培养良好的软件开发习惯,了解软件企业文化。 4.掌握结构化数据流分析技术。

5.掌握结构化程序设计的基本概念与技术,并且养成良好的编码风格。

6.掌握单元测试的一般步骤及技术。 7.掌握集成测试的一般步骤和技术。 二. 实验内容

1. 软件需求分析

①、功能需求分析

·输入一个年份(1-3000),然后显示12个月的月历 ·能解决闰年和平年问题 ·能输出显示结果

②、运行需求分析

· 操作系统: Windows9x, Windows2000,

Windows XP及更高版本

③、数据流图 年份 年份 检 查输 年份 确定年份 是否闰开始信开始信计算1月1 显示1显示2软件结构图: 年份 非法 错误 checkinput 显示表头 main setinit() 任意键 output() printmontsetinfo显示其他月份 isleap () printhead显示12月 2. 软件设计与编码 inputyear(#include #include

#include #include #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 */

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();

0

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

*/

int inputyear(void) {

char s[80]; int i, y; y=-1;

printf(\"请输入年份(1-3000):\"); for(i=0;i<80;++i)

-1

{

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\

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\}

/* 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\

printf(\"一%s二%s三%s四%s五%s六%s日\\n\\n\

printf(\"%s\

for(i=1;iprintf(\"%s \ }

k=monthinfo.firstdayofmonth;

for(j=1;j<=monthinfo.daysofmonth;j=j+1) {

if(k>7) { k=k-7;

printf(\"\\n\\n%s\ }; k=k+1;

printf(\"%2d%s\ }

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;iif(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(\"

\\************************************ \\n\");

printf(\" \\欢迎使用万年历演示程序 \\n\");

printf(\"

\\************************************ \\n\");

int year ;

struct info monthinfo; year = checkinput(); monthinfo = setinit(year); output(monthinfo); }

3. 单元测试

白盒测试

②.黑盒测试

2015年

三月四月 五月六月 2016年: 三. 总结和体会

本次用C语言编写的万年历系统主要实现了年历、月历、日历的显示。我根本就不喜欢敲代码了,看见代码就头疼。所以感觉厌恶这门专业,对学习也不感兴趣了。而且,还有一件更头疼的事是在写一个简单的程序时竟然老是出错,难一点的,复杂一点的程序竟然无从下手。但是去看程序的参考答案时都看得懂,又感觉很容易。学了软件工程以后,我就感觉我以前的学习方法是错误的。以前我只注重于代码,而不注重理论知识以及编程的思路,程序的架构。以至于在些程序时没有写程序的思路,不能形成程序的架构。只想到看脑袋里是否有与此类似的代码。越想程序越乱,最后脑袋里一片空白。不知道程序从哪个方面下手了。软件工程这门课程是做软件开发的人必学的课程,通过学这门课程,程序员就会注重软件开发的理论知识,以及做项目开发的思路。学了这门课程后你写程序就不会去盲目的去套用代码,而是理清此程序的架构以及思路。程序该从什么时候开始,什么时候结束。在中间需要添加什么样的功能,以完善该软件。

在设计初期,首先温习了课本内容,再次熟悉了一下C语言程序,然后广泛的查找有关万年历的资料,并结合查找到的资料,整理出设计的主要思路,画出流程图,最终写出了源程序,并编译成功,在实验中,碰到了不少问题,其中包括如何获取系统时间,如何计算任意时间的时间差,这些困难,都通过查阅资料和问同学得到了解决。当然,由于时间和能力的原因,做得还不是很完美。

在这学期的课程序设计中,收获知识的同时,还收获了阅历,收获了成熟,通过查找大量资料,请教老师,以及不懈的努力,不仅培养了独立思考、 动手制作的能力,在各种其它能力上也都有了提高。更重要的是,在课程序设计里,我们学会了很多学习的方法,知道了理论和实践的巨大差别。而这是以后最实用的,真的是受益匪浅。要面 对社会的挑战,只有不断的学习、实践,再学习、再实践。

同时在与老师和同学的交流过程中,互动学习,将知识融会贯通。通过自己的努力,做出了一个万年历,对以后的学习是一个莫大的鼓舞,激起了我的学习兴趣和开发创新思维。

在调试过程中主要的问题就是结果的显示问题,显示易错位。以及函数之间调用问题。对于这些问题,主要是翻阅书籍和在网络上寻找解决方案,以及自己亲自用找到的方法去测试,最终成功的解决了问题。

通过这次课程设计,使我对C语言了解不再停留在书面的了解,而是有了更深的理解,培养了自己的分析能力和设计能力,受益匪浅。

因篇幅问题不能全部显示,请点此查看更多更全内容