• 结构化分析与设计


    所在班级 软件工程
    作业要求 结构化分析与设计
    作业目标 复习结构化分析与设计,并能够参照某个系统来尝试自己完成一个系统
    所在学号 3180701328

    一.实验目的

    (1)掌握结构化的需求分析方法;

    (2)掌握分层数据流图的绘制、数据字典和加工说明的编制;

    (3)掌握数据流图映射为软件结构图的方法;

    (4)掌握需求说明书和设计说明。书的主要内容,学习软件需求说明书和设计说明书的编写;

    (5)掌握测试的基本方法。

    二.实验内容

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

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

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

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

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

    本次实验采用机票预订系统:

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

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

    机票给顾客

    三.实验步骤

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

    (2)讨论系统存在的用户角色、工作流等;

    (3)对关键功能绘制数据流图,给出数据字典,并反复讨论数据流的合理性;

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

    (5)选择对应的结构化程序设计语言,实现并测试部分功能模块

    (1)结构化分析

    结构化分析方法的基本思想是自顶向下逐层分解。分解和抽象是人们控制问题复杂性的两种基本手段。对于一个复杂的问题,人们很难一下子考虑问题的所有方面和全部细节,通常可以把一个大问题分解成若干个小问题,每个小问题再分解成若干个更小的问题,经过多次逐层分解,每个最底层的问题都是足够简单、容易解决的,于是复杂的问题也就迎刃而解了。这个过程就是分解过程。结构化分析与面向对象分析方法之间的最大差别是:结构化分析方法把系统看作一个过程的集合体,包括人完成的和电脑完成的;而面向对象方法则把系统看成一个相互影响的对象集。结构化分析方法的特点是利用数据流图来帮助人们理解问题,对问题进行分析。
    结构化分析一般包括以下工具:
    结构化系统分析方法从总体上来看是一种强烈依赖数据流图的自顶向下的建模方法。它不仅是需求分析技术,也是完成需求规格化的有效技术手段。

    结构化分析的工作步骤
    在介绍具体的结构化分析方法之前,先对如何进行结构化分析做一个总结性描述,以帮助大家更好地应用该方法。
    1)研究“物质环境”。首先,应画出当前系统(可能是非计算机系统,或是半计算机系统)的数据流图,说明系统的输入、输出数据流,说明系统的数据流情况,以及经历了哪些处理过程。在这个数据流图中,可以包括一些非计算机系统中数据流及处理的命名,例如部门名、岗位名、报表名等。这个过程可以帮助分析员有效地理解业务环境,在与用户的充分沟通与交流中完成。
    2)建立系统逻辑模型。当物理模型建立完成之后,接下来的工作就是画出相对于真实系统的等价逻辑数据流图。在前一步骤建立的数据流图的基础上,将所有自然数据流都转成等价的逻辑流,例如,将现实世界的报表存储在计算机系统中的文件里;又如将现实世界中“送往总经理办公室”改为“报送报表”。
    3)划清人机界限。最后,确定在系统逻辑模型中,哪些将采用自动化完成,哪些仍然保留手工操作。这样,就可以清晰地划清系统的范围。

    (2)存在的用户角色:用户、管理员
    工作流:用户(登录、查询航班、购票、退票、改签)
    管理员(添加航班信息、查询航班信息、修改航班信息、删除航班信息)

    (3)旅客订票流程图:

    旅客取票图:

    机票预定系统的状态转换图

    机票预定系统的数据字典

    (4)机票预订系统的功能结构图:

    机票预定系统的流程图:

    (5)

    int find(struct airplane *a)
    {
    	int i;
    	char c;
    	while(1)
    	{
    		printf("*    请选择查询方式:   *
    ");
    		printf("   1.已知航班号查询;   
    ");
    		printf("   2.已知出发地查询;   
    ");
    		printf("   3.已知目的地查询;   
    ");
    		printf("   4.返回主菜单         
    ");
    		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("输入选项不存在,请重新输入!
    ");
    				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("航班号	起点	终点	飞行日	起飞时间	到达时间	机型	价格	乘员定额	余票量
    ");
    				printf("%s	%s	%s	%s	%s		%s		%s	%d	%d		%d
    ",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("没有查询到此航班的信息!
    ");
    		printf("请选择  1.继续查询;2.退出;
    ");
    		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=1;
    				}	
    				printf("%s	%s	%s	%s	%s	%s	%s	%d	%d	%d
    ",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("没有查询到此航班的信息!
    ");
    		printf("请选择  1.继续查询;2.退出;
    ");
    		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=1;
    				}	
    				printf("%s	%s	%s	%s	%s	%s	%s	%d	%d	%d
    ",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("没有查询到此航班的信息!
    ");
    		printf("请选择  1.继续查询;2.退出;
    ");
    		printf("请输入选项(点击任意键,继续查询):");
    		scanf("%d",&i);
    		c=getchar();
    		switch(i)
    		{
    			case 2:
    				return 0;
    			default :
    				break;
    		}
    	}
    }
    

    四.思考题

    (1)简述需求说明书,概要设计,详细设计说明书的主要内容。
    需求说明书:
    软件需求说明书,又称为软件规格说明书,是分析员在需求分析阶段需要完成的文档,是软件需求分析的最终结果。软件需求说明主要包括引言、任务概述、需求规定、运行环境规定和附录等内容。

    概要设计:
    概要设计的主要任务是把需求分析得到的系统扩展用例图转换为软件结构和数据结构。设计软件结构的具体任务是:将一个复杂系统按功能进行模块划分、建立模块的层次结构及调用关系、确定模块间的接口及人机界面等。数据结构设计包括数据特征的描述、确定数据的结构特性、以及数据库的设计。显然,概要设计建立的是目标系统的逻辑模型,与计算机无关。

    详细设计:
    详细设计是软件工程中软件开发的一个步骤,就是对概要设计的一个细化,就是详细设计每个模块实现算法,所需的局部结构。详细设计的主要任务是设计每个模块的实现算法、所需的局部数据结构。
    传统软件开发方法的详细设计主要是用结构化程序设计法。详细设计的表示工具有图形工具和语言工具。图形工具有业务流图、程序流程图、PAD图(Problem Analysis Diagram)、NS流程图(由 Nassi和 Shneidermen开发,简称 NS)。语言工具有伪码和PDL(Program Design Language)等。

    (2)结构化分析方法与面向对象分析方法有无本质上的不同?
    结构化分析方法:
    结构是指系统内各个组成要素之间的相互联系、相互作用的框架。结构化开发方法提出了一组提高软件结构合理性的准则,如分解与抽象、模块独立性、信息隐蔽等。针对软件生存周期各个不同的阶段,它有结构化分析(SA)和结构化程序设计(SP)等方法。
    结构化分析方法给出一组帮助系统分析人员产生功能规约的原理与技术。它一般利用图形表达用户需求,使用的手段主要有数据流图、数据字典、结构化语言、判定表以及判定树等。结构化分析的步骤如下:1.分析当前的情况,做出反映当前物理模型的DFD;2.推导出等价的逻辑模型的DFD;3.设计新的逻辑系统,生成数据字典和基元描述;4.建立人机接口,提出可供选择的目标系统物理模型的DFD;5.确定各种方案的成本和风险等级,据此对各种方案进行分析;6.选择一种方案;7.建立完整的需求规约。

    (3)对数据流图进行审查有何意义?
    检查图中是否存在错误或不合理(不理想)的部分。
    确保两大特性:
    一致性:分层DFD中不存在矛盾和冲突。
    完整性:是否有遗漏的数据流、加工等。

    (4)给出一次完整的会议讨论纪要,包括议题,最终结果。
    议题:
    如何根据例题,画出相应的数据流图

    结果:
    数据流图的设计方法 :
    1>画子系统的输入输出
    把整个系统视为一个大的加工,然后根据数据系统从哪些外部实体接收数据流,以及系统发送数据流到那些外部实体,就可以画出输入输出图。这张图称为顶层图。
    2>画子系统的内部
    把顶层图的加工分解成若干个加工,并用数据流将这些加工连接起来,使得顶层图的输入数据经过若干加工处理后,变成顶层图的输出数据流。这张图称为0层图。从一个加工画出一张数据流图的过程就是对加工的分解。
    3>画加工的内部
    把每个加工看作一个小系统,把加工的输入输出数据流看成小系统的输入输出流。于是可以象画0层图一样画出每个小系统的加工的DFD图。
    4>画子加工的分解图
    对第三步分解出来的DFD图中的每个加工,重复第三步的分解过程,直到图中尚未分解的加工都是足够简单的(即不可再分解)。至此,得到了一套分层数据流图。
    5>对数据流图和加工编号

    PSP:

    PSP2.1 任务内容 预计时间(分钟) 实际耗时(分钟)
    Planning 计划 20 40
    Estimate 估算开发时间 290 500
    Development 开发 80 100
    Analysis 需求分析 20 20
    Design Spec 生成设计文档 10 20
    Design Review 设计复审 10 10
    Coding Standard 代码规范 10 10
    Design 具体设计 20 20
    Coding 具体编码 20 20
    Code Review 代码复审 20 20
    Test 测试 30 20
    Reporting 报告 20 30
    Test Report 测试报告 20 30
    Size Measurement 计算工作量 20 20
    Postmorten & Process Improvement 事后总结,并提出过程改进计划 20 20
    Size Measurement 合计 300 350
  • 相关阅读:
    mysql数据库的test类型
    jvm虚拟机分享课笔记
    内存模型中没有gc的是哪个
    jvm内存模型中-栈,方法区,程序计数器是线程安全的
    Random.nextInt()替换Math.random()
    异常抛出注意点
    缓存好文章
    java 实现serialVersionUID
    什么叫反向代理什么叫正向代理
    mysql count与sum的区别
  • 原文地址:https://www.cnblogs.com/zyz12138/p/14100386.html
Copyright © 2020-2023  润新知