实验二 结构化分析与设计

博客班级 计算机与信息学院AHPU-软件工程导论-计算机1
作业要求 实验二 结构化分析与设计
作业目标 (1)掌握结构化的需求分析方法;
(2)掌握分层数据流图的绘制、数据字典和加工说明的编制;
(3)掌握数据流图映射为软件结构图的方法;
(4)掌握需求说明书和设计说明;
(5)掌握测试的基本方法。
学号 <3180701116>

一、实验目的

(1)掌握结构化的需求分析方法;
(2)掌握分层数据流图的绘制、数据字典和加工说明的编制;
(3)掌握数据流图映射为软件结构图的方法;
(4)掌握需求说明书和设计说明。书的主要内容,学习软件需求说明书和设计说明书的编写;
(5)掌握测试的基本方法。

二、实验内容

(1)参考一个熟悉的系统,如,机票预订系统/教材订购系统/ATM自动取款机,讨论其用户需求、系统需求和业务需求;

(2)绘制系统的分层数据流图,并给出数据字典;

(3)将系统的分层数据流图映射为软件结构图,绘制软件结构图;

(4)为关键模块进行详细设计,如绘制关键模块的流程图;

(5)实现系统部分功能并测试。

【实例1】机票预订系统

参考:

(1)携程网:(https://flights.ctrip.com/international/search/domestic)

(2)去哪儿:(https://www.qunar.com/?ex_track=auto_4e0d874a)

为了方便旅客,某航空公司拟开发一个机票预定系统。旅行社把预定机票的旅客信息(姓名、性别、工作单位、身份证号码、旅行

时间、旅行目的地等)输入该系统,系统为旅客安排航班,旅客在飞机起飞前一天凭取票通知和账单交款取票,系统核对无误即印出

机票给顾客

【实例2】教材订购系统

销售系统的工作过程为:首先由教师或学生提交购书单,经教材发行人员审核是有效购书单后,开发票、登记并返给教师或学生领

书单,教师或学生即可去书库领书。

采购系统的主要工作过程为:若是脱销教材,则登记缺书,发缺书单给书库采购人员;一旦新书入库后,即发进书单通知给教材发

行人员。

【实例3】图书管理系统

参考:(http://lib.ahpu.edu.cn/)

三.实验步骤

(1)复习结构化的分析与设计方法的主要过程;

a.结构化分析方法步骤
*分析当前的情况,做出反映当前物理模型的DFD;
*推导出等价的逻辑模型的DFD;
*设计新的逻辑系统,生成数据字典和基元描述;
*建立人机接口,提出可供选择的目标系统物理模型的DFD;
*确定各种方案的成本和风险等级,据此对各种方案进行分析;
*选择一种方案;
*建立完整的需求规约。

b.结构设计化方法步骤
*评审和细化数据流图;
*确定数据流图的类型;
*把数据流图映射到软件模块结构,设计出模块结构的上层;
*基于数据流图逐步分解高层模块,设计中下层模块;
*对模块结构进行优化,得到更为合理的软件结构;
*描述模块接口。

(2)讨论系统存在的用户角色、工作流等;
用户角色
A.旅客:可以对自身信息(例如密码等信息)进行修改,并有对账户进行操作的权限,可以提供信息进行、查询、订票、取票、退票
B.旅行社:掌握部分旅客信息,可以根据旅客信息进行查询、订票、退票
C.管理员:可以对用户信息进行管理

(3)对关键功能绘制数据流图,给出数据字典,并反复讨论数据流的合理性;
数据字典
·登录信息:姓名+密码
来源:旅客\旅行社

·取\退票信息:姓名+性别+目的地+出发地+时间+航班+座次号
来源:系统出票信息

·订\退票信息:身份证号+姓名+性别+出发地+目的地+时间
来源:旅客\旅行社

·航班信息:航班号+出发地+目的地+价格+剩余票数+时间
来源:系统航班信息

数据流图

0层数据流图

1层数据流图

查询子图

订票子图

退票子图

取票子图

(4)对应数据流图,设计系统的功能结构图,关键模块的流程图;

(5)选择对应的结构化程序设计语言,实现并测试部分功能模块
实现查询功能(可以用航班号查询或目的地查询或出发地查询)
查询功能模块

int find(struct airplane *a)
{
	int i;
	char c;
	while(1)
	{
		printf("*    请选择查询方式:   *\n");
		printf("   1.已知航班号查询;   \n");
		printf("   2.已知出发地查询;   \n");
		printf("   3.已知目的地查询;   \n");
		printf("   4.返回主菜单         \n");
		printf("请输入选项:");
		scanf("%d",&i);
		c=getchar();
		switch(i)
		{
			case 1:
				findair(a);
				break;
			case 2:
				findstart(a);
				break;
			case 3:
				findend(a);
				break;
			case 4:
				return 0;
			default:
				printf("输入选项不存在,请重新输入!\n");
				break;
		} 
	}	
}

查询调用子程序

//按航班号查询//
int findair(struct airplane *a)
{
	int i,t;
	struct airplane *r=NULL;
	char s[8];
	char c;
	while(1)
	{
		r=a->front;
		printf("请输入已知航班号:");
		gets(s);
		t=0;
		while(r!=NULL)
		{
			if(strcmp(r->air,s)==0)
			{
				t=1;
				printf("航班号\t起点\t终点\t飞行日\t起飞时间\t到达时间\t机型\t价格\t乘员定额\t余票量\n");
				printf("%s\t%s\t%s\t%s\t%s\t\t%s\t\t%s\t%d\t%d\t\t%d\r\n",r->air,r->start,r->end,r->sche,r->time1,r->time2,r->mode,r->price,r->full,r->remain);
				break;
			}
			else
				r=r->front;
		}
		if(t==0)
			printf("没有查询到此航班的信息!\n");
		printf("请选择  1.继续查询;2.退出;\n");
		printf("请输入选项(点击任意键,继续查询):");
		scanf("%d",&i);
		c=getchar();
		switch(i)
		{
			case 2:
				return 0;
			default :
				break;
		}
	}
	
}
//按出发城市查询//
int findstart(struct airplane *a)
{
	int i,t;
	struct airplane *r=NULL;
	char s[6];
	char c;
	while(1)
	{	
		r=a->front;
		printf("请输入出发城市:");
		gets(s);
		t=0;
		while(r!=NULL)
		{
			if(strcmp(r->start,s)==0)
			{
				if(t==0)
				{
					printf("航班号\t起点\t终点\t飞行日\t起飞时间\t到达时间\t机型\t价格\t乘员定额\t余票量\n");
					t=1;
				}	
				printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%d\t%d\t%d\r\n",r->air,r->start,r->end,r->sche,r->time1,r->time2,r->mode,r->price,r->full,r->remain);
				r=r->front;
			}
			else
				r=r->front;
		}
		if(t==0)
			printf("没有查询到此航班的信息!\n");
		printf("请选择  1.继续查询;2.退出;\n");
		printf("请输入选项(点击任意键,继续查询):");
		scanf("%d",&i);
		c=getchar();
		switch(i)
		{
			case 2:
				return 0;
			default :
				break;
		}
	}
}
//按终点城市查询// 
int findend(struct airplane *a)
{
	int i,t;
	struct airplane *r=NULL;
	char s[6];
	char c;
	while(1)
	{
		r=a->front;
		printf("请输入终点城市:");
		gets(s);
		t=0;
		while(r!=NULL)
		{
			if(strcmp(r->end,s)==0)
			{
				if(t==0)
				{
					printf("航班号\t起点\t终点\t飞行日\t起飞时间\t到达时间\t机型\t价格\t乘员定额\t余票量\n");
					t=1;
				}	
				printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%d\t%d\t%d\r\n",r->air,r->start,r->end,r->sche,r->time1,r->time2,r->mode,r->price,r->full,r->remain);
				r=r->front;
			}
			else
				r=r->front;
		}
		if(t==0)
			printf("没有查询到此航班的信息!\n");
		printf("请选择  1.继续查询;2.退出;\n");
		printf("请输入选项(点击任意键,继续查询):");
		scanf("%d",&i);
		c=getchar();
		switch(i)
		{
			case 2:
				return 0;
			default :
				break;
		}
	}
}

运行截图:

四.思考题

1.简述需求说明书,概要设计,详细设计说明书的主要内容。
(1)需求说明书
软件需求说明书,又称为软件规格说明书,是分析员在需求分析阶段需要完成的文档,是软件需求分析的最终结果。软件需求说明主要包括引言、任务概述、需求规定、运行环境规定和附录等内容。
(2)概要设计说明书
概要设计说明书又可称系统设计说明书,这里所说的系统是指程序系统。编制的目的是说明对程序 系统的设计考虑,包括程序系统的基本处理流程、程序系统的组织结构、模块划分、功能分配、接口设计、运行设计、安全设计、数据结构设计和出错处理设计等,为程序的详细设计提供基础。
(3)详细设计说明书
详细设计说明书又可称程序设计说明书。编制目的是说明一个软件系统各个层次中的每一个程序 (每个模块或子程序)的设计考虑,如果一个软件系统比较简单,层次很少,本文件可以不单独编写,有关内容合并入概要设计说明书。
2.结构化分析方法与面向对象分析方法有无本质上的不同?
(1)结构化分析方法:

结构化分析方法可能存在的风险在于:在得到问题本质性的描述之前,不断分解出的结论和需要处理的信息越来越多、越来越复杂,使得“只见树木不见森林”的风险大大增加。
结构化分析方法运用得好,要求系统分析员具有一种“俯视全局”的能力,能够透过问题的表象直接把握到问题本质。
当软件项目较小、系统分析员能力足够高的时候,结构化方法能快速的找到简洁、高效率的逻辑模型。结构化方法对复杂问题的帮助有限。但结构化方法有助于使用面向分析方法的系统分析员确认系统初的高阶模型。

(2)面向对象方法:

提供了一种方便的、可持续观测和扩展系统的机制。面向对象抽象出的对象是健壮的、可控制和容易维护的。
总是试图抽象出更公用的类,因此对系统分析员抽象事物和把我初分析方向的要求很高。常常难以控制抽象对象的层次、粒度,甚至抽象出与问题本质面目全非的对象模型。掌握难度高于结构化分析方法。
通过信息隐藏和封装等手段屏蔽了对象内部的执行细节,控制了错误的蔓延,但发生错误时,定位故障的代价大。尤其时继承的深度很大时。
对于需求变化频繁的系统,得到一个高度可复用的面向对象软件系统设计是很困那的事情。

结论:两种方法不是对立的,没有谁先进谁过时之说,可在项目中结合使用。恰当的运用方法解决问题才是根本性的问题。在运用时应关注运用方法的成本和价值。
3.对数据流图进行审查有何意义?
检查图中是否存在错误或不合理(不理想)的部分

确保两大特性:
一致性:分层DFD中不存在矛盾和冲突。
完整性:是否有遗漏的数据流、加工等
4.给出一次完整的会议讨论纪要,包括议题,最终结果。

五、实验小结

掌握结构化的需求分析方法以及分层数据流图的绘制、数据字典和加工说明的编制;这成为我未来课程学习中的坚实基础。

posted @ 2020-12-08 23:28  行雨  阅读(236)  评论(0编辑  收藏  举报