1. 程式人生 > 實用技巧 >結構化分析與設計

結構化分析與設計

部落格班級 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)對資料流圖進行審查有何意義?

分層的資料流圖要保證一致性和完整性。簡單說就是分層不存在矛盾和衝突,完整性指分層保證本身的完整性,不遺漏資料流,加工等元素。為了保證資料流圖的一致性和完整性,需要對資料流圖進行審查。