结构化分析与设计

博客班级 https://edu.cnblogs.com/campus/ahgc/AHPU-SE-19/
作业要求 https://edu.cnblogs.com/campus/ahgc/AHPU-SE-19/homework/11540
作业目标 掌握结构化的分析方法、测试的基本方法
学号 3190704124
实验目的:
(1)掌握结构化的分析方法

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

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

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

(5)掌握测试的基本方法
【实例1】机票预订系统

参考:

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

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

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

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

机票给顾客
实验步骤

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

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

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

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

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

①、顶层数据流图
参考得到航空公司的机票预订系统需要那些功能:

②、层数据流图
旅客订票流程:

③补充层数据流图:
对于功能缺少部分进行修改和补充:

数据字典:
机票预订系统数据字典
旅客记录=身份证号+姓名+性别+工作单位+联系电话
机票记录=航班+出发地+目的地+起飞时间+到达时间+{机票类别}+票价+票数+剩余票数
机票类别={{舱等类别}普通票,{舱等类别}旅游票、{舱等类别}学生票、{舱等类别}团体票}
舱等类别={头等舱,商务舱,经济舱}
订票记录=身份证号+航班+机票类别+订票日期+旅行日期+取票否
订票单={旅客记录}+航班+机票类别+旅行日期+旅行目的地
取票通知单=身份证号+旅客姓名+航班+领票日期+旅行日期
帐单=身份证号+旅客姓名+航班+账款
机票=身份证号+姓名+航班+机票类别+座位号+起飞时间
座位号=(机票记录)票数-(机票记录)剩余票数+1
日期=年+月+日
时间=小时+分钟
旅客文件={旅客记录}
机票文件={机票记录}
订票文件={订票记录}
/*********list.h/

include

include <malloc.h>

include <string.h>

using namespace std;
typedef struct TK{
char Name[20];
int SeatId;
struct TK *next;
}Ticket;

typedef struct FLY
{
char FlightId[10];
int Seat[50];
Ticket *PersonHead;
struct FLY *next;
}Flight;

class Person{
public:
void ListInitiate(Flight **head);
bool Check(int *Seat,int Ch);
void Insert(Flight *head);
int Delete(Flight *head);
void show(Flight *head);
void Search(Flight *head);
void AddFlght(Flight *head);
void DeleteFlght(Flight *head);
};

/*********main.cpp/

include "list.h"

int menu()
{
int option;
cout<<endl<<endl;
cout<<"主菜单"<<endl;
cout<<" 1.Booking the ticket of flighting"<<endl;
cout<<" 2.Cancel the flighting"<<endl;
cout<<" 3.Display the information "<<endl;
cout<<" 4.Search"<<endl;
cout<<" 5.Add a Flight"<<endl;
cout<<" 6.Delete a Flight"<<endl;
cout<<" 0.Exit"<<endl<<endl;
cout<<"Please input your option:";
cin>>option;
getchar();
cout<<endl;
if(option>=0&&option<=6)
return option;
else
return -1;
}
int main()
{

cout<<"------------------------->航班管理系统<<<<-----------------------------"<<endl;
cout<<" 欢迎你使用该航班系统"<<endl;
Flight head;
Person P;
P.ListInitiate(&head);
while(true)
{
switch(menu( ))
{
case 1:P.Insert(head);break; //预订
case 2:P.Delete(head);break; //取消
case 3:P.show(head);break; //显示
case 4:P.Search(head);break; //查询
case 5:P.AddFlght(head);break; //添加航班
case 6:P.DeleteFlght(head);break; //删除航班
case 0:exit(0);
default:cout<<"Choice error!\n";
}
}
return 0;
}
/*****************************************passenger.cpp
************************/

include "List.h"

void Person::ListInitiate(Flight **head)
{
int count=0;
head = (Flight )malloc(sizeof(Flight));
(
head)->PersonHead=(Ticket )malloc(sizeof(Ticket));
(
head)->PersonHead->next=NULL;
(
head)->next=NULL;
for(int i=0;i<50;i++)
{
(*head)->Seat[i]=0;
}
}

bool Person::Check(int Seat,int Ch)
{
int i;
for(int i=0;i<50;i++)
{
if(Ch==i&&Seat[i]!=1)return 1;
}
return 0;
}
Flight
Index(Flight *head,char *Id)
{
Flight *p=head->next;

while(p)
{
	if(strcmp(p->FlightId,Id)==0)
	{
		return p;
	}
	p=p->next;
}

return NULL;

}
/*预定/
void Person::Insert(Flight *head)
{
int count=0;
int Ch;
Flight *s=head;

if(s->next==NULL)
{
	cout<<"暂无航班!"<<endl;
	return ;
}
cout<<"航班列表:"<<endl;
s=s->next;
while(s!=NULL)
{
	puts(s->FlightId);
	count++;
	if(count%5==0)
		cout<<"\n";
	s=s->next;
}
count=0;
char FID[10];
cout<<"输入航班ID:";
gets(FID);
s=Index(head,FID);
if(s==NULL)
{
	cout<<"输入ID有误"<<endl;
	return;
}
cout<<endl;
cout<<"有以下座位可供选择:"<<endl;
for(int i=0;i<50;i++)
{
	if(s->Seat[i]!=1)
	{
		cout<<i<<"号"<<"\t";
		count++;
		if(count%5==0)
			cout<<"\n";
	}
}
cout<<endl;
cout<<"输入座位号:\n";
cin>>Ch;
getchar();
if(!Check(head->Seat,Ch))
{
	cout<<"This Seat have been booked or it is non-existent";
	return ;
}
s->Seat[Ch]=1;
char name[20];
cout<<endl;
cout<<"Input your Name:";
gets(name);
Ticket *p=s->PersonHead,*q;

while(p->next!=NULL)
{	
	if(strcmp(p->next->Name,name)>0)
		break;
	p=p->next;
}

q=(Ticket *)malloc(sizeof(Ticket));
q->next=p->next;
p->next=q;
strcpy(q->Name,name);
q->SeatId=Ch;

}

/*取消预定/
int Person::Delete(Flight *head)
{
char name[20],FID[10];
cout<<"Input your Name:";
gets(name);
getchar();
Flight *s;
cout<<"Input the Flight ID:";
gets(FID);
s=Index(head,FID);
if(s==NULL)
{
cout<<"输入ID有误"<<endl;
return 0;
}

Ticket *p=s->PersonHead->next,*pre=s->PersonHead;
int flag=0;
while(p!=NULL)
{
	if(strcmp(p->Name,name)==0){
		flag=1;
		break;	
	}
	pre=p;
	p=p->next;
}
if(flag==1){
	pre->next=p->next;
	s->Seat[p->SeatId]=0;
	free(p);
	cout<<"你的机票已经取消成功";
}
else 
{
	cout<<"您还没订票\n";
	return 0;	
}
return 1;

}
/*显示信息/
void Person::show(Flight *head)
{
Flight *s;
char FID[10];
cout<<"Input The Flight ID:";
gets(FID);
s=Index(head,FID);
if(sNULL)
{
cout<<"输入ID有误"<<endl;
return;
}
Ticket *p=s->PersonHead->next;
if(p
NULL)
{
cout<<"还没乘客订票"<<endl;
return;
}
while(p!=NULL)
{
cout<<"乘客: "<Name<<" 座位号:" <SeatId;
p=p->next;
}
}

/查询相关信息/
void Person::Search(Flight head)
{
char name[20];
cout<<"Input Your Name:";
gets(name);
Flight s;
char FID[10];
cout<<"Input The Flight ID:";
gets(FID);
s=Index(head,FID);
if(sNULL)
{
cout<<"输入ID有误"<<endl;
return;
}
Ticket *p=s->PersonHead->next;
int flag=0;
while(p!=NULL)
{
if(strcmp(p->Name,name)
0){
flag=1;
break;
}
p=p->next;
}
if(flag==1){
cout<<name<<" 已订机票"<<endl;
}
else
{
cout<<name<<" 未订机票"<<endl;
}
}
/
增加航班******/
void Person::AddFlght(Flight *head)
{
char FlightID[10];
Flight p=head,q;
cout<<" 输入航班ID:";
gets(FlightID);
while(p->next)
{
p=p->next;
}

ListInitiate(&q);
p->next=q;
strcpy(q->FlightId,FlightID);
cout<<"——航班已添加成功!";

}
/删除航班*********/
void Person::DeleteFlght(Flight *head)
{
char FlightID[10];
int flag=0;
Flight p=head->next,q=head;

int count=0;
Flight *s=head;

if(s->next==NULL)
{
	cout<<"  暂无航班!"<<endl;
	return ;
}
cout<<"  航班列表:"<<endl;
s=s->next;
while(s!=NULL)
{
	cout<<s->FlightId<<endl;
	count++;
	if(count%5==0)
		cout<<"\n";
	s=s->next;
}
cout<<"  输入航班ID:";
gets(FlightID);
while(p)
{
	if(strcmp(p->FlightId,FlightID)==0)
	{
		flag=1;break;
	}
	q=p;
	p=p->next;
}
if(flag==0)
{
	cout<<"  该航班ID不存在!";
	return ;
}
q->next=q->next->next;
free(p);
cout<<"  航班已删除!\n";

}

思考题

(1)简述需求说明书,概要设计,详细设计说明书的主要内容。

需求说明书:待开发的软件系统的名称;本项目的任务提出者、开发者、用户及实现该软件的计算中心或计算机网络;该软件系统同其他系统或其他机构的基本的相互来往关系。

概要设计说明书:待开发软件系统的名称;列出此项目的任务提出者、开发者、用户以及将运行该软件的计算站(中心)。

详细设计说明书:待开发软件系统的名称;本项目的任务提出者、开发者、用户和运行该程序系统的计算中心。

(2)结构化分析方法与面向对象分析方法有无本质上的不同?

结构化系统分析方法是采用“自顶向下,由外到内,逐层分解”的思想对复杂的系统进行分解化简,从而有效地控制了系统分析每一步的难度,并运用数据流图、加工说明和数据字典作为表达工具的一种系统分析技术。而面向对象的分析方法则是通过将数据和逻辑结构抽象成为对象,运用对象属性和方法等来操作和处理业务数据和逻辑的系统分析方法。

两者的区别在于,当软件项目较小、系统分析员能力足够高的时候,结构化方法能快速的找到最简洁、高效率的逻辑根型,结构化方法对复杂问题的帮助有限,而面向对象的分析方法提供了一种方便的、可持续观测和扩展系统的机制,通过信息隐藏和封装等手段屏蔽了对象内部的执行细节,控制了错误的蔓延,对于需求变化频繁的系统,可以用面向对象软件系统的方法。

(3)对数据流图进行审查有何意义?

分层的数据流图要保证一致性和完整性。简单说就是分层不存在矛盾和冲突,完整性指分层保证本身的完整性,不遗漏数据流,加工等元素。为了保证数据流图的一致性和完整性,需要对数据流图进行审查。

posted @ 2020-12-07 19:53  冷月多多营业  阅读(126)  评论(0编辑  收藏  举报