软件工程导论实验报告.docx
《软件工程导论实验报告.docx》由会员分享,可在线阅读,更多相关《软件工程导论实验报告.docx(26页珍藏版)》请在冰点文库上搜索。
![软件工程导论实验报告.docx](https://file1.bingdoc.com/fileroot1/2023-7/13/ce5f16f4-5476-4819-a4cb-e588a8755576/ce5f16f4-5476-4819-a4cb-e588a87555761.gif)
软件工程导论实验报告
2011-2012
(2)《软件工程导论》实验报告
学院:
计算机学院
班级:
软件工程班
姓名:
学号:
实验一:
项目计划、分析和设计
[实验日期]2013年5月8日
[实验目的]
初步了解结构化分析、设计方法的原理、步骤以及各阶段的文档,练习撰写简要的需求文档、设计文档。
[实验内容]通讯录管理程序
[实验原理和步骤]结构化分析(SA)分层数据流图面向数据流分析(DFA)的设计方法
[实验结果]
说明:
main()函数打开通讯录
Menu()函数选择要操作的功能
Load()函数读取文件内容到通讯录
List()函数显示通讯录中的内容
App函数添加记录到通讯录
Search函数按姓名查找
Dele函数删除记录
Save函数保存记录
Sort函数按姓名排序
各函数流程图如下
添加记录:
3>查找函数:
删除函数:
排序函数:
保存函数:
显示函数:
[实验总结]
规划一个软件系统,要考虑好每一步要做什么,各个方面都要得到深入的了解;并自己要把握好每一步,不能马虎。
正确分配好每一步,每个过程,就像规划人生一样,完成每个步骤,这样可以让我们更加清楚的知道我们在做什么、应该怎么做、、、、、
实验二:
编码
[实验日期]2013年5月8日
[实验目的]
培养良好的编码风格。
[实验内容]
根据详细设计的结果,按结构化思想编写代码,并对程序进行注释。
[实验原理和步骤]
编码风格强调“清晰易读”而不是个人技巧。
请注意变量或函数的名字要有意义,表达式和语句要一目了然,排版风格、循环语句风格要保持一致,函数宏的定义,常数的定义,注释要全面。
注释包括序言性注释、函数模块注释和程序语句注释。
[实验报告要求]
//用数组实现的简单通讯录
#include
#include
#defineSIZE80
structrecord
{
intnum;
charname[9];
intage;
chartel[13],email[20],addr[20],zip[7];
}rec[SIZE];
inti,m=0;//m为当前通讯录中的记录数
charmenu();//选单
voidload();//读入
voidlist();//显示
voidapp();//添加
voidsearch();//查找
voiddele();//删除
voidsave();//保存
voidsort();//排序
//**********************************************
main()
{
charchoice;
while
(1)
{
choice=menu();
switch(choice)
{
case'1':
printf("显示通讯录中的内容。
\n");
list();break;
case'2':
printf("添加记录。
\n");
app();break;
case'3':
printf("按姓名查找。
\n");
search();break;
case'4':
printf("从通讯录中的删除内容。
\n");
dele();break;
case'5':
printf("按姓名对通讯录中的内容重新排序。
\n");
sort();break;
case'6':
printf("保存通讯录中的内容到文件。
\n");
save();break;
case'7':
printf("从文件读记录到通讯录。
\n");
load();break;
case'0':
printf("退出通讯录管理系统。
\n");
save();break;
default:
printf("输入错误!
");
}
if(choice=='0')
break;
printf("\n按任意键继续.......!
");
getchar();
}
}
//******************************************************************************
charmenu()
{
charc;
printf("\n\n\n\n\n\n\n=====通讯录管理系统=====\n");
printf("--------------\n");
printf("1.显示通讯录\n");
printf("2.添加记录啊\n");
printf("3.按姓名查找\n");
printf("4.删除记录\n");
printf("5.排序记录\n");
printf("6.保存记录\n");
printf("7.读入记录\n");
printf("0.退出系统\n");
printf("\n\n请选择......\n\n\n\n\n");
c=getchar();
getchar();
returnc;
}
//*******************************************************************************
voidload()//从文件度记录到通讯录中
{
FILE*fp;
if((fp=fopen("txl.txt","wb"))==NULL)
{
printf("Cannotopenfile");
exit(0);
}
list();
for(i=0;iif(fwrite(&rec[i],sizeof(structrecord),1,fp)!
=1)
printf("Filewreteerror!
\n");
fclose(fp);
}
//*******************************************************************************
voidlist()//显示通讯录中的内容
{
for(i=0;i{
if(rec[i].name[0])
{
printf("%3d%-8s%2d",rec[i].num,rec[i].name,rec[i].age);
printf("%-12s%-20s",rec[i].tel,rec[i].email);
printf("%-20s%-6s\n",rec[i].addr,rec[i].zip);
}
}
}
//*********************************************************************************
voidapp()//添加记录
{
charan;
puts("当前通讯录中的内容:
\n");
list();
printf("当前通讯录中有%d条记录。
\n",m);
do
{
rec[m].num=m+1;
printf("姓名:
");gets(rec[m].name);
printf("年龄:
");scanf("%d",&rec[m].age);getchar();
printf("电话:
");gets(rec[m].tel);
printf("email:
");gets(rec[m].email);
printf("地址:
");gets(rec[m].addr);
printf("邮编:
");gets(rec[m].zip);
puts("新输入的记录为:
");
printf("%3d%-8s%2d",rec[m].num,rec[m].name,rec[m].age);
printf("%-12s%-20s",rec[m].tel,rec[m].email);
printf("%-20s%-6s\n",rec[m].addr,rec[m].zip);
m++;
puts("继续输入吗?
(Y/N)");
an=toupper(getchar());getchar();
}while(an=='Y');
}
//********************************************************************
voidsearch()//按姓名查找
{
charxm[9];
printf("请输入查找的姓名:
");
gets(xm);
for(i=0;i{
if(strcmp(xm,rec[i].name)==0)
{
printf("%3d%-8s%2d",rec[i].num,rec[i].name,rec[i].age);
printf("%-12s%-20s",rec[i].tel,rec[i].email);
printf("%-20s%-6s\n",rec[i].addr,rec[i].zip);
break;
}
}
}
//*********************************************************************
voiddele()//删除记录
{
intsc;
list();
printf("当前通讯录中有%d条记录。
\n",m);
do
{
printf("删除几号记录:
");
scanf("%d",&sc);
}while(sc>m&&sc>0);
if(sc!
=m-1)
for(i=sc;i{
rec[i-1]=rec[i];
rec[i-1].num=i;
}
m--;
list();
}
//*********************************************************************
voidsave()//保存通讯录中的内容到文件
{
FILE*fp;
if((fp=fopen("txl.txt","wb"))==NULL)
{
printf("Cannotopenfile");
exit(0);
}
list();
for(i=0;iif(fwrite(&rec[i],sizeof(structrecord),1,fp)!
=1)
printf("Filewreteerror!
\n");
fclose(fp);
}
//*************************************************************
voidsort()//按姓名对通讯录中的内容重新排序
{
intj,k;
structrecordt;
list();
for(i=0;i{
k=i;
for(j=i;jif(strcmp(rec[k].name,rec[j].name)>0)
k=j;
if(k!
=i)
{
t=rec[k];
rec[k]=rec[i];
rec[i]=t;
}
for(i=0;irec[i].num=i+1;
}
puts("\n排序已完成!
");
list();
}
[注意事项]
1.模块的逻辑描述应该清晰第一、使用标准的、规范的控制结构、正确可靠
[实验总结]
收获与体会:
1、不断运行:
从程序的运行过程中你可以明白你所写的这段代码是否正确,以及信息的输出形式是否人性化,是否能让使用者满意。
2、巧妙使用函数返回值:
程序的运行是看不见的,但是我们可以通过函数的返回值来了解它到底有没有运行某一出的代码,进而依据此信息做出后续要执行的语句。
3、注意细节:
编码是最忌浮躁,要静下心来专心对待才能避免一些编码错误。
实验三:
代码复查、编译、测试
[实验日期]2013年5月8日
[实验目的]
学习如何利用代码复查检查表快速而有效地发现程序中的缺陷。
[实验内容]
按照代码复查脚本规定的流程,对照代码复查检查表检查源代码并记录。
编译程序,测试程序,修复所有缺陷,同时填写缺陷记录日志。
[实验原理和步骤]
如果想发现和改正程序的每一个缺陷,就必须遵照一个精确的规程。
检查表可以帮助确保遵循这个规程。
检查表也是一个构思的来源。
当按照检查表去做时,就知道如何进行代码复查。
检查表包括了个人的经验。
通过不断地使用和改进个人检查表,可以更好地发现在程序中的缺陷。
[实验报告要求]
代码复查检查表
一般性说明:
在完成每个复查步骤之后,将发现的某个类型的缺陷的个数记录在右面的栏目中。
如果该步骤没有发现缺陷,就在右面的栏目中打个表示检查无误的交叉符号(X)。
在开始复查下一个程序单元之前,要按照检查表完成对程序,类,对象或方法的检查
检查内容
#
#
#
#
累计数
累计%
完整性
验证设计的所有功能都已经编码
X
X
X
X
Includes
验证Include语句是完全的
X
X
X
X
初始化
检查变量和参数的初始化:
● 在程序的开始;
● 在每个循环的开始;
● 在函数/过程的入口
X
X
X
X
调用
检查函数调用的格式:
● 指针;
● 参数;
● ‘&’的使用
X
X
X
X
名字
检查名字的拼写和使用:
● 是否前后一致?
● 是否在说明的作用域之内?
● 结构和类中变量的引用是否使用了’.’
1
X
X
X
1
25%
字符串
检查所有的字符串:
● 是用指针来标识的;
● 是以NULL结尾的
X
X
X
X
指针
检查所有的指针:
● 是初始化为NULL;
● 只有在New(新建)之后才Delete(删除);
● 在New并使用之后要删除
X
X
X
X
输出格式
检查输出格式:
● 换行是否合适?
● 间隔是否合适?
X
X
X
X
{}对
保证检查{}是适当的而且是成对的
2
X
X
X
2
50%
逻辑操作符
验证==,=,||等逻辑操作符的使用是合适的。
检查每个逻辑函数的( )是合适的
X
X
X
X
逐行检查
检查每一行代码:
● 指令的语法是否正确?
● 标点是否正确符号是否正确?
X
X
2
1
3
75%
标准
保证所有代码符合编码标准
X
X
X
1
1
25%
文件的打开与关闭
验证所有的文件:
● 是合适地声明的;
● 是合适地打开的;
● 是合适地关闭的
X
X
X
X
全面检查
对整个程序进行全面的检查以发现系统问题和非期望的问题
X
X
X
X
总计
2
X
2
2
6
缺陷类型
缺陷记录日志
缺陷记录日志
学生
日期
2013/5/8
教员
程序号
日期
编号
类型
引入阶段
排除阶段
修复时间
相关缺陷
5/4
20
语法
编码
复查
7min
在一开始时定义record结构体时错将num写成mnu以至后面很多错误
5/4
50
接口
编码
复查
5min
从list函数开始之后有很多printf语句,在输出类型的编码中多次将d编为D,还有便是忘掉了“%”
5/4
80
函数
编码
复查
2min
在编码过程中,对于一些函数的定义名时常写错
[实验总结]
①对重点实验结果进行分析;比如自己总查不出哪种错误
②实验中的问题和提高:
对老师或自己的编码进行评价,指出合理和不足之处,提出改进的方案。
③收获与体会:
代码复查是一次程序与程序员之间的交流。
通过对代码风格与规范的审查,可以大大提高代码的可读性与可维护性。
现在的软件,往往需要持续的维护与升级。
代码复查是一种鞭策,因为它的存在,督促着开发人员自觉地规范编码,养成好的编码习惯,提高代码质量。
实验四:
项目测试总结
[实验日期]2013年5月8日
[实验目的]
测试程序,总结缺陷数据。
[实验内容]
填写测试表,填写缺陷分析表
[实验原理和步骤]
按等价类+边界值设计测试数据,并记录测试结果;填写缺陷分析表并按类型排序.
[实验报告要求]
测试表
测试功能
预期结果
实际结果
登陆通讯录
成功
成功
添加记录
成功
成功
查找
成功
成功
缺陷分析表
类型
引入的缺陷
排出的缺陷
复查中漏过的缺陷
设计
编码
其他
复查
编译
测试
20
10
4
10
2
30
1
1
50
4
5
9
1
60
3
80
2
3
4
2
90
[实验总结]
①对重点实验结果进行分析;
②实验中的问题和提高:
对老师或自己的编码进行评价,指出合理和不足之处,提出改进的方案。
③收获与体会:
通过这次的编码,我认识到了很多的事情。
首先编码不是想象的那么简单的,它很是考验人的耐心,心浮气躁的很容易犯一些小错误:
如:
for(“i=0;i这些都是不该犯的错误的。
其次在编写大程序是也是有技巧的,分块、分函数进行都可以,这样便可以使程序更简明、好做。
最后程序的测试也使十分重要的,它不仅帮我们检查出了程序的错误所在,也在同时告诫了我们编程的基本思想与素质。