河南省高等教育自学考试
实 验 报 告 册
计算机及应用专业(本科段)
《软件工程》
姓名准考证号所属地市
实验地点实验日期
实验总成绩指导教师签名
实验单位(实验室)意见:主考院校审核意见:
河南科技大学自学考试办公室
二 零 一 零 年 三 月
实验一 学生成绩管理系统需求分析
1.实验目的
l 了解软件工程中需求分析阶段的主要活动;
l 了解需求分析文档描述的主要内容;
l 掌握利用数据流图描述系统功能需求的方法。
l 掌握数据字典的描述方法。
2.实验设备
(1) 硬件环境:586 以上微机。
(2) 软件环境:ms word 2000,visio 2000。
3.学生成绩管理系统需求分析
(一)实验目的
总结软件开发过程中的方法和技巧,更好的应用和掌握数据库技术 。
(二)需求分析文档主要内容描述
分析确定系统的规模和范围,确定软件的总体要求以及所需要的硬件和支撑软件,确定待开发软件与外界的接口,根据用户的情况确定软件对操作的要求,以及待开发软件总体上的约束和限制,完善项目计划。 在这之后,这一阶段的大部分时间将被用来进行需求收集和分析。向学校管理人员及学生了解情况,确定软件系统的综合要求,分析软件系统的数据要求,导出系统的逻辑模型,修正项目开发计划。采用结构化分析方法,生成数据流图、数据词典及加工逻辑说明。估计阶段跨度:20##年某月初至某月中旬
(三)分层绘制的数据流图
1.关联图(顶级流图)
实体:学生、课程、成绩。
实体属性定义
学生:学号、姓名、性别、出生日期、入学年月
课程:课程编号、课程名称、课程学分、课程描述
成绩:学号、课程编号、分数、考核日期
实体关系图:
教务人员维护学生信息和课程信息,并登录学生的选课成绩;
学生查询自己的成绩单。
第0层DFD图
2.功能级流水图
第1层DFD图
对第0层DFD图中的一个加工"学生成绩管理"进行展开。
3.细化数据流图
* 第2层DFD图
对第1层DFD图中的一个加工"查询学生成绩"进行展开。
(四) 需求分析数据字典描述
以下列出"学生成绩管理系统"的部分数据字典条目:
(五)绘制数据流图的常见错误及解决方法
根据以上实例和经验,绘制数据流图应当遵循以下原则:
(1) 分层时,子图的输入、输出数据流必须和父图中相应加工的输入、输出数据流一致;
(2) 加工的编号应该唯一且具有层次性;
(3) 加工不应该只有输入或只有输出,通常既有输入又有输出;
(4) 数据流图不应反映处理的顺序;
(5) 加工之间应通过数据存储进行通信,避免从一个加工直接流到另一个加工;
(6) 数据应通过加工进行流动,避免从一个数据存储直接流到另一个数据存储;
(7) 数据流图中所有元素的命名应当对客户有意义,且与业务相关;
(8) 不要在一个图中绘制7个以上的加工,否则难于绘制和理解。
实验二 白盒测试
1.实验目的
l 理解软件测试的目的;
l 掌握白盒测试用例的设计方法;
l 熟悉软件调试的步骤和方法。
2.实验设备
(3) 硬件环境:586 以上微机。
(4) 软件环境:turbo C 2.0。
3.白盒测试
(一) 实验目的
1、通过简单程序白盒测试,熟悉测试过程,对软件测试行程初步了解,并养成良好的测试习惯。
2、熟练掌握如何运用基路径测试方法进行测试用例设计,进行逻辑覆盖率分析。
(二) 被测试程序清单
#include"stdio.h"
typedef struct MyDate{
int month;
int day;
int year;
}MyDate;
MyDate PreDate(MyDate date);
int Leapyear(int year);
void Print(MyDate date);
MyDate PreDate(MyDate date)
//输入日期有效性检查中其他模块实现,此处假设输入日期都是合法数据
{
1.MyDate yesterday;
2.yesterday.month = date.month; // initialization
3.yesterday.day = date.day;
4.yesterday.year = date.year;
5.int days_month[13]={0,31,0,31,30,31,30,31,31,30,31,30,31};
//初始化每月天数,其中2月不确定,初始化为0
6.if(date.day>1)
7.yesterday.day=date.day-1;
else
{
8.if(date.month==1)
{
9.yesterday.year=date.year-1;
10.yesterday.month=12;
11.yesterday.day=31;
}
12.else if(date.month==3)
{
13.if(Leapyear(date.year))
{
14.yesterday.month=2;
15.yesterday.day=29;
}
else
{
16.yesterday.month=2;
17.yesterday.day=28;
}
}
else
{
18.yesterday.month=date.month-1;
19.yesterday.day=days_month[date.month-1];
}
}
20.return yesterday;
}
21.int Leapyear(int year)
{
22.if((year%4==0&&year%100!=0) || (year%400==0))
23.return 1;
24.else return 0;
}
void Print(MyDate date)
{
25.printf("%d--%d--%d\n",date.year,date.month,date.day);
}
(三)程序流程图
(四)测试用例设计
1)环路复杂度计算
由图可知,图中的环路有五条,故环路复杂度为五。
2)基本路径集设计
基本路径集为:
A.1、2、3、4、5、6、8、12、13、14、15、20、25
B.1、2、3、4、5、6、8、12、16、17、20、25
C.1、2、3、4、5、6、8、12、18、19、20、25
D.1、2、3、4、5、6、8、9、10、11、20、25
E.1、2、3、4、5、6、7、20、25
3)测试用例集设计
测试用例集为:
20##-1-2 20##-1-1 20##-3-1
1999-3-1 1980-5-1
(五) 测试步骤及结果分析
#include"stdio.h"
typedef struct MyDate{
int month;
int day;
int year;
}MyDate;
int a[6];
MyDate PreDate(MyDate date);
int Leapyear(int year);
void Print(MyDate date);
int count();
MyDate PreDate(MyDate date)
//输入日期有效性检查中其他模块实现,此处假设输入日期都是合法数据
{
MyDate yesterday;
yesterday.month = date.month; // initialization
yesterday.day = date.day;
yesterday.year = date.year;
int days_month[13]={0,31,0,31,30,31,30,31,31,30,31,30,31};
//初始化每月天数,其中2月不确定,初始化为0
if(date.day>1)
{
a[0]=count();
yesterday.day=date.day-1;
}
else
{
a[1]= count();
if(date.month==1)
{
a[2]= count();
yesterday.year=date.year-1;
yesterday.month=12;
yesterday.day=31;
}
else if(date.month==3)
{
a[3]=count();
if(Leapyear(date.year))
{
a[4]=count();
yesterday.month=2;
yesterday.day=29;
}
else
{
a[5]=count();
yesterday.month=2;
yesterday.day=28;
}
}
else
{
a[6]=count();
yesterday.month=date.month-1;
yesterday.day=days_month[date.month-1];
}
}
return yesterday;
}
int Leapyear(int year)
{
if((year%4==0&&year%100!=0) || (year%400==0))
return 1;
else return 0;
}
void Print(MyDate date)
{
printf("%d--%d--%d\n",date.year,date.month,date.day);
}
int count()
{
return 1;
}
void DriverofPreDate()
{
int tcPassNum = 0;
int tcFailNum = 0; // 存储通过和失败的测试用例总数
FILE *pFpFrom=NULL;
FILE *pFpTo=NULL;
//----------- 打开数据文件,准备读取测试用例的数据-----------
char *DataFileName="test.txt";
pFpFrom=fopen(DataFileName,"r");
if(!pFpFrom){
printf("读取数据失败,返回\n");
return; }
//----------- 打开数据文件,准备记录测试用例执行结果-----------
char *DataFileTestResultName="DivedeTestResult.txt";
pFpTo=fopen(DataFileTestResultName,"w");
if(!pFpTo){
printf("打开文件失败,返回\n");
return; }
fprintf(pFpTo,"----------对函数PreDate的单元测试结果------------\n");
//----------- 执行测试用例,记录测试结果-----------
int TCID = 0;
int sum=0;
MyDate date ; // 测试用例的输入
MyDate expectedOut,actualOut; // 测试用例的预期、实际输出
printf("对函数PreDate展开单元测试\n");
while(!feof(pFpFrom)){ // 不断读取每个测试用例的数据
fscanf(pFpFrom, "%d ", &TCID); // 读入测试用例的ID
fscanf(pFpFrom, "%d %d %d", &date.month,&date.day,&date.year); //读测试用例输入
fscanf(pFpFrom,"%d %d %d", &expectedOut.year,&expectedOut.month,&expectedOut.day); // 读入测试用例的预期输出
actualOut = PreDate(date); // 执行测试用例
printf( "测试用例%d: 输入%d,%d,%d, 预期输出%d,%d,%d,,实际输出%d,%d,%d, ",
TCID, date.month,date.day,date.year,expectedOut.year, expectedOut.month,expectedOut.day,actualOut.year,actualOut.month,actualOut.day); // 输出测试用例的信息
if( actualOut.day==expectedOut.day&&actualOut.month==expectedOut.month&&actualOut.year==expectedOut.year){// 若测试用例通过,则记录通过用例总数
tcPassNum ++; printf( "通过\n" );
fprintf(pFpTo,"测试用例%d:Pass",TCID); //将测试结果存入结果文件
}
else{
tcFailNum ++; printf( "失败\n" );
fprintf(pFpTo,"测试用例%d:Fail",TCID); //将测试结果存入结果文件
}
} //----------- 统计测试结果-----------
for(int i=0;i<=6;i++)
{
sum=sum+a[i];
}
printf("覆盖率=%d", sum*100/7);
printf("%%\n");
printf( "共执行%d 个测试用例,其中%d 个通过,%d 个失败\n", tcPassNum+tcFailNum, tcPassNum, tcFailNum );
fprintf(pFpTo,"共执行%d 个测试用例,其中%d 个通过,%d 个失败\n", tcPassNum+tcFailNum, tcPassNum, tcFailNum );
fclose(pFpFrom);
fclose(pFpTo);
}
void main()
{
DriverofPreDate ( );// 调用测试驱动程序
}
第二篇:软件工程实验报告5
软件工程导论课外实验
项 目 名 称:旅游管理系统开发过程
所 在 班 级:20##级JAVA(1)班
姓 名:赵媛媛
指 导 教 师:王业
起 止 时 间:10月25日-11月4日
旅游管理系统开发过程
一、系统分析
1.1需求分析
根据要求,系统具有以下功能:
1.由于该系统的使用对是对客户信息,导游信息,景点信息进行管理的多方管理系统。
2.确保系统的安全性。
3.方便的全方位的数据查询。
4.统计功能。
二、总体设计
2.1系统主要功能
客户管理系统是一个非常有特点的管理软件,系统由客户信息维护、信息查询、数据管理、系统管理和帮助信息等几个功能模块组成,规划系统功能模块如下:
(1)客户信息维护模块
客户信息维护模块主要包括客户信息。
(2)信息查询模块
信息查询模块主要包括客户信息查询、导游信息查询、景点查询、联系方式查询4个部分
(3)数据管理模块
数据管理模块主要包括客户信息、导游信息、密码信息3个部分。
(4)系统管理模块
系统管理模块主要包括操密码修改、退出系统3个部分。
2.2 系统功能结构图
2—1旅游管理系统功能结构图
三、系统设计
3.1 设计目标
本系统可以达到以下目标:
(1)系统运行稳定,安全可靠。
(2)界面设计美观,人机交互界面友好。
(3)信息查询灵活、方便、快捷、准确,数据存储安全可靠。
(4)采用多种方式查询数据。
(5)对用户输入的数据,系统进行严格的数据检验,尽可能排除人为的错误。
3.2 开发及运行环境
系统开发平台:Microsoft Visual Basic 6.0 中文版
运行平台:Windows xp
3.3 数据库设计
本系统采用Microsoft Office Access 2003设计数据库
数据表结构
(1)密码表
密码表示维护系统安全的最重要的功能。
表3-1
(2)旅游信息
是关于旅游游客,景点,导游的信息,是对旅行社对旅游信息的描述。
表3-2
四、主要功能模块设计
4.1 主窗体设计
主窗体是显示系统主要操作功能的面板。
4—1系统主窗体
4.2 密码设置
输入密码,输入错误之后会出现从新输入,以达到校验的目的。
4—2 密码校验窗口
代码设计
在窗体加载时,其实现的代码如下:
(点击“确定”按钮时实现的的用户密码登陆)
Private Sub Command1_Click()
Adodc1.RecordSource = "select * from 密码表 where 用户名 ='" & Text1.Text & "'"
Adodc1.Refresh
If Text2.Text <> Text3.Text Then
MsgBox "两次输入密码不同请重新输入", vbOKOnly, "提示"
Text2.Text = ""
Text3.Text = ""
Text2.SetFocus
Else
Text4.Text = Text2.Text
Adodc1.Recordset.Fields(1) = Text4.Text
Adodc1.Recordset.Update
Adodc1.Recordset.Close
MsgBox "修改成功", vbOKOnly, "提示"
End If
End Sub
(点击“取消”实现的密码登陆的取消功能。)
Private Sub Command2_Click()
Unload Me
Form1.Show
End Sub
Private Sub Form_Load()
Adodc1.RecordSource = "select * from 密码表"
Adodc1.Refresh
If Adodc1.Recordset.RecordCount > 0 Then
ListView1.Enabled = True
ListView1.ListItems.Clear
i = 1
Adodc1.Recordset.MoveFirst
Do While Adodc1.Recordset.EOF = False
Key = Adodc1.Recordset.Fields("用户名")
Set itmX = ListView1.ListItems.Add(, , Key, i)
i = i + 1
Adodc1.Recordset.MoveNext
Loop
Else
ListView1.Enabled = False
End If
End Sub
Private Sub ListView1_Click()
Text1.Text = ListView1.SelectedItem
Adodc1.Refresh
Text1.SetFocus
4.3 系统用户管理
系统用户管理包括,游客编号,游客姓名,工作单位,景点编号,景点名称
导游编号,导游姓名,利用功能键实现查找的功能。
4—3 系统用户管理窗口
代码设计
其实现的关键代码如下:
(点击“首条”时实现的是移动到首条)
Private Sub Command1_Click()
Adodc1.Recordset.MoveFirst
If Adodc1.Recordset.BOF Then
Adodc1.Recordset.MoveFirst
End If
End Sub
(点击“上一条”时实现的是上一条)
Private Sub Command2_Click()
Adodc1.Recordset.MovePrevious
If Adodc1.Recordset.BOF Then
Adodc1.Recordset.MoveFirst
MsgBox "已经为首条", vbOKOnly, "提示"
End If
End Sub
(但点击“下一条”时,实现的是下一条。)
Private Sub Command3_Click()
Adodc1.Recordset.MoveNext
If Adodc1.Recordset.EOF Then
Adodc1.Recordset.MoveLast
MsgBox "已经为末条", vbOKOnly, "提示"
End If
End Sub
(点击“最后一条”实现的是最后一条。)
Private Sub Command4_Click()
Adodc1.Recordset.MoveLast
If Adodc1.Recordset.EOF Then
Adodc1.Recordset.MoveLast
End If
End Sub
(点击“添加”实现的是添加功能)
Private Sub Command5_Click()
Adodc1.Recordset.AddNew
End Sub
(点击“更新”实现的是更新功能)
Private Sub Command6_Click()
Adodc1.Recordset.Update
MsgBox "修改成功!", vbOKOnly + vbExclamation, ""
End Sub
(点击“删除”实现的是删除功能)
Private Sub Command7_Click()
answer = MsgBox("是否删除本条?", vbYesNo, "提示")
If answer = vbYes Then
Adodc1.Recordset.Delete
MsgBox "删除成功!", vbOKOnly, "提示"
Adodc1.Refresh
Else
MsgBox "已确认未删除", vbOKOnly, "提示"
End If
End Sub
(点击“取消”实现的是退出功能。)
Private Sub Command8_Click()
Unload Me
End Sub
4.4 旅游管理浏览
系统用户浏览包括用户的所有信息,通过第一条,上一条,下一条,和末条,打印,返回实现浏览的功能。
4—4旅游管理浏览窗口
代码设计
在窗体加载时,其实现的关键代码如下:
(点击“首条”时实现的是移动到首条)
Private Sub Command2_Click()
Unload Me
End Sub
(点击“上一条”时实现的是上一条)
Private Sub Command3_Click()
Adodc1.Recordset.MoveFirst
If Adodc1.Recordset.BOF Then
Adodc1.Recordset.MoveFirst
End If
End Sub
(但点击“下一条”时,实现的是下一条。)
Private Sub Command4_Click()
Adodc1.Recordset.MovePrevious
If Adodc1.Recordset.BOF Then
Adodc1.Recordset.MoveFirst
MsgBox "已经为首条", vbOKOnly, "提示"
End If
End Sub
Private Sub Command5_Click()
Adodc1.Recordset.MoveNext
If Adodc1.Recordset.EOF Then
Adodc1.Recordset.MoveLast
MsgBox "已经为末条", vbOKOnly, "提示"
End If
End Sub
(点击“最后一条”实现的是最后一条。)
Private Sub Command6_Click()
Adodc1.Recordset.MoveLast
If Adodc1.Recordset.EOF Then
Adodc1.Recordset.MoveLast
End If
End
4.5 旅游管理查询界面
查询系统包括景点查询和导游查询
运行结果如图4--5所示。
4—5旅游管理查询窗口
代码设计
在窗体加载时,其实现的关键代码如下
(点击“确定”实现了查询功能)
Private Sub Command1_Click()
a = "select * from 表2 where "
n = 0
If Check1.Value = Checked Then
a = a + "景点编号='" + Combo1 + "'"
Adodc1.RecordSource = a
Adodc1.Refresh
n = 1
End If
If Check2.Value = Checked Then
If n = 1 Then
End If
a = a + " 导游编号='" + Combo2 + "'"
Adodc1.RecordSource = a
Adodc1.Refresh
n = 1
End If
End Sub
(点击“关闭”实现了窗口的关闭功能)
Private Sub Command2_Click()
Unload Me
End Sub
Private Sub Form_Load()
Combo1.AddItem "100"
Combo1.AddItem "200"
Combo1.AddItem "300"
Combo1.AddItem "400"
Combo2.AddItem "010"
Combo2.AddItem "020"
Combo2.AddItem "030"
Combo2.AddItem "040"
End Sub
4.6 旅游管理统计界面
运行结果如图6所示。
4—6旅游管理统计窗口
代码设计
在窗体加载时,其实现的关键代码如下:
(点击“按单位统计”实现了按单位数据的统计功能)
Private Sub Command3_Click()
strsql = "select 工作单位,count(*) as 人数 from 表3 GROUP BY 工作单位"
Adodc1.RecordSource = strsql
Adodc1.Refresh
End Sub
(点击“按导游统计”实现了按导游数据的统计功能)
Private Sub Command4_Click()
strsql = "select 导游编号,count(*) as 人数 from 表3 GROUP BY 导游编号"
Adodc1.RecordSource = strsql
Adodc1.Refresh
End Sub
(点击“按景点编号统计”实现了按景点编号数据的统计功能)
Private Sub Command1_Click()
strsql = "select 景点编号,count(*) as 人数 from 表3 GROUP BY 景点编号"
Adodc1.RecordSource = strsql
Adodc1.Refresh
End Sub
Private Sub Command2_Click()
Unload Me
End Sub
4.7 旅游管理界面登录
密码登录窗口通过点左侧的人物,在代码中设置了对应的密码,点完人物之后直接点确认键即可登录。
4—7旅游管理登陆窗口
代码设计
在窗体加载时,其实现的关键代码如下:
(点击“确定”实现了登陆的功能)
Private Sub Command1_Click()
Dim MPassword As String
Adodc1.RecordSource = "select * from 密码表 where 用户名 ='" & Text1.Text & "'"
Adodc1.Refresh
If Adodc1.Recordset.RecordCount > 0 Then
MPassword = Adodc1.Recordset.Fields("密码")
If Text2.Text = MPassword Then '判断数据的密码是否正确
Name1 = Text1.Text
Form1.Show
'frm_Main.Show
Unload Me
Else
MsgBox "密码不正确,请您确认后重新输入", , "提示信息"
Text2.Text = ""
Text2.SetFocus
End If
Else
MsgBox "对不起 没有此用户的信息", , "提示信息"
Text1.Text = ""
Text2.Text = ""
End If
End Sub
Private Sub Command2_Click()
End
End Sub
Private Sub Form_Load()
'Adodc1.RecordSource = "select * from 密码表"
Adodc1.Refresh
If Adodc1.Recordset.RecordCount > 0 Then
ListView1.Enabled = True
ListView1.ListItems.Clear
i = 1
Adodc1.Recordset.MoveFirst
Do While Adodc1.Recordset.EOF = False
Key = Adodc1.Recordset.Fields("用户名")
Set itmX = ListView1.ListItems.Add(, , Key, i)
i = i + 1
Adodc1.Recordset.MoveNext
Loop
Else
ListView1.Enabled = False
End If
End Sub
Private Sub ListView1_Click()
Text1.Text = ListView1.SelectedItem
'Adodc1.Refresh
Text2.SetFocus
End Sub