CF920F SUM and REPLACE(線段樹+思維)
實驗二 結構化分析與設計
一.實驗目的
(1)掌握結構化的需求分析方法;
(2)掌握分層資料流圖的繪製、資料字典和加工說明的編制;
(3)掌握資料流圖對映為軟體結構圖的方法;
(4)掌握需求說明書和設計說明。書的主要內容,學習軟體需求說明書和設計說明書的編寫;
(5)掌握測試的基本方法。
二.實驗內容
(1)參考一個熟悉的系統,如,機票預訂系統/教材訂購系統/ATM自動取款機,討論其使用者需求、系統需求和業務需求;
(2)繪製系統的分層資料流圖,並給出資料字典;
(3)將系統的分層資料流圖對映為軟體結構圖,繪製軟體結構圖;
(4)為關鍵模組進行詳細設計,如繪製關鍵模組的流程圖;
7.程式碼部分
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <malloc.h> #include <math.h> //機票預訂系統 struct FLIGHT { char fli[4]; //航班號 int num; }flights[20]; struct node { char name[40]; //姓名 char sex[1]; //性別 char tele[20]; //手機號 char D[18]; //身份證號碼 char fli[4]; //航班號 struct node *users;//指向下一結點的指標 }; int total;//需要錄入的旅客數 int sum=0,flag=0;//記錄系統中旅客資訊的數量 struct node *users=NULL;//這個要放在外面宣告,放在個函式內部,無法共享
清除錄入失敗的使用者資訊 void clear(int sum) { if(users==NULL) users=(struct node *)malloc(total*sizeof(struct node)); strcpy(users[sum].name,users[sum+1].name); strcpy(users[sum].sex,users[sum+1].sex); strcpy(users[sum].tele,users[sum+1].tele); strcpy(users[sum].D,users[sum+1].D); strcpy(users[sum].fli,users[sum+1].fli); }
錄入旅客資訊
void enter() //錄入旅客資訊............................................................................
{
int i;
if(flag==0)
{
flag=1;
system("cls");
printf("請輸入錄入旅客的數量:");
scanf("%d",&total);
system("cls");
}
if(users==NULL)
users=(struct node *)malloc(total*sizeof(struct node));
if(sum<total)
{
printf("請輸入姓名: ");
scanf("%s",users[sum].name);
printf("請輸入性別: ");
scanf("%s",users[sum].sex);
printf("請輸入手機號: ");
scanf("%s",users[sum].tele);
printf("請輸入身份證號碼: ");
scanf("%s",users[sum].D);
for(i=0;i<sum;i++)
{
if(strcmp(users[sum].name,users[i].name)==0)
{
printf("\n\n操作失敗!\n姓名重複!\n");
printf("可錄入人數為%d個,當前人數為%d個",total,sum);
printf("\n\n按回車返回上一介面......");
clear(sum);
getchar();
getchar();
system("cls");
break;
}
if(strcmp(users[sum].tele,users[i].tele)==0)
{
printf("\n\n操作失敗!\n電話重複!\n");
printf("可錄入人數為%d個,當前人數為%d個",total,sum);
printf("\n\n按回車返回上一介面......");
clear(sum);
getchar();
getchar();
system("cls");
break;
}
if(strcmp(users[sum].D,users[i].D)==0)
{
printf("\n\n操作失敗!\n身份證號重複!\n");
printf("可錄入人數為%d個,當前人數為%d個",total,sum);
printf("\n\n按回車返回上一介面......");
clear(sum);
getchar();
getchar();
system("cls");
break;
}
}
if(i>=sum||sum==0)
{
sum++;
printf("\n\n操作成功!\n");
printf("可錄入人數為%d個,當前人數為%d個",total,sum);
printf("\n\n按回車返回上一介面......");
getchar();
getchar();
system("cls");
}
return;
}
else
{
printf("人數超標\n ");
printf("\n\n按回車返回上一介面......");
getchar();
getchar();
system("cls");
}
}
機票預訂
void book(struct FLIGHT flights[20]) //機票預訂
{
int i,j;
char fli[4],name[40],D[18];
system("cls");
printf("航班號 出發地 目的地 出發時間 預計到達時間 剩餘座位\n");
printf(" %s 廣州 上海 12:30 19:30 %d \n",flights[0].fli,flights[0].num);
printf(" %s 廣州 北京 13:30 21:30 %d \n",flights[1].fli,flights[1].num);
printf("\n\n請輸入乘客姓名:");
scanf("%s",name);
printf("請輸入乘客身份證號:");
scanf("%s",D);
for(i=0;i<sum;i++)
if(strcmp(users[i].name,name)==0 && strcmp(users[i].D,D)==0)
{
flag=1;
printf("乘客繫結成功!\n");
break;
}
if(i>=sum)
{
printf("\n未查詢到該乘客\n");
printf("\n\n按回車返回上一介面......");
getchar();
getchar();
system("cls");
return;
}
printf("請選擇航班:");
scanf("%s",fli);
for(j=0;j<20;j++)
{
if(strcmp(flights[j].fli,fli)==0)
{
flights[j].num-=1;
strcpy(users[i].fli,fli);
printf("\n訂票成功\n");
break;
}
else
{
printf("\n未查詢到該航班\n");
printf("\n\n按回車返回上一介面......");
getchar();
getchar();
system("cls");
return;
}
}
printf("\n\n按回車返回上一介面......");
getchar();
getchar();
system("cls");
}
航班查詢
void inquiry()//航班查詢............................................................................
{
char name[40];
char D[18];
int i,flag=0;
printf("\n");
printf("\n");
printf("請輸入姓名:");
scanf("%s",name);
printf("請輸入身份證號:");
scanf("%s",D);
for(i=0;i<sum;i++)
if(strcmp(users[i].name,name)==0 && strcmp(users[i].D,D)==0)
{
flag=1;
printf("您的航班號為:%s\n",users[i].fli);
printf("\n\n按回車返回上一介面......");
getchar();
getchar();
system("cls");
return;
}
if(flag==0)
{
printf("\n");
printf("錯誤!");
printf("\n\n按回車返回上一介面......");
getchar();
getchar();
system("cls");
}
}
主函式
int main()
{
int choice;
struct FLIGHT flights[20] = {{"D20",18}, {"D21",16}};
system("cls");
while(1)
{
printf("\n\n\t\t************* 歡迎進入機票預訂系統 **************\n");
printf("\n");
printf("\n");
printf("\t\t1:錄入旅客資訊\n");
printf("\t\t2:機票預訂\n");
printf("\t\t3:查詢航班資訊\n");
printf("\t\t4:註冊賬戶(暫未開放)\n");
printf("\t\t5:賬戶充值(暫未開放)\n");
printf("\t\t6:餘額查詢(暫未開放)\n");
printf("\t\t0:退出系統\n");
printf("\n");
printf("\t\t*********** 請選擇您需進行的選項 ****************\n\n\n");
printf("\n\n");
printf("請選擇:");
scanf("%d",&choice);
printf("\n\n");
switch(choice)
{
case 1:
system("cls");
enter(); //錄入旅客資訊
break;
case 2:
system("cls");
book(flights); //預訂機票
break;
case 3:
system("cls");
inquiry();
break;
case 4:
system("cls");
break;
case 5:
system("cls");
break;
case 6:
system("cls");
break;
case 0:
exit(0);
break;
}
}
return 0;
}
【例項1】機票預訂系統
參考:
(1)攜程網:https://flights.ctrip.com/international/search/domestic
(2)去哪兒:https://www.qunar.com/?ex_track=auto_4e0d874a
為了方便旅客,某航空公司擬開發一個機票預定系統。旅行社把預定機票的旅客資訊(姓名、性別、工作單位、身份證號碼、旅行
時間、旅行目的地等)輸入該系統,系統為旅客安排航班,旅客在飛機起飛前一天憑取票通知和賬單交款取票,系統核對無誤即印出
機票給顧客
【例項2】教材訂購系統
銷售系統的工作過程為:首先由教師或學生提交購書單,經教材發行人員稽核是有效購書單後,開發票、登記並返給教師或學生領
書單,教師或學生即可去書庫領書。
採購系統的主要工作過程為:若是脫銷教材,則登記缺書,發缺書單給書庫採購人員;一旦新書入庫後,即發進書單通知給教材發
行人員。
【例項3】圖書管理系統
三.實驗步驟
(1)複習結構化的分析與設計方法的主要過程;
(2)討論系統存在的使用者角色、工作流等;
(3)對關鍵功能繪製資料流圖,給出資料字典,並反覆討論資料流的合理性;
(4)對應資料流圖,設計系統的功能結構圖,關鍵模組的流程圖;
(5)選擇對應的結構化程式設計語言,實現並測試部分功能模組
四.思考題
1)結構化分析方法與面向物件分析方法有無本質上的不同?
有
結構化分析也是面向過程分析,與面向物件分析是兩種思路完全不同的分析方法,面向過程分析方法,就是說我們先考慮問題大的方面,然後再從外面到裡面去深入這個問題的細節部分,一步一步去解決問題。
就是問題大的方面,然後我們再深入深入問題的細節部分,逐步解決問題。面向物件分析方法,我們把問題看作由幾個物件組成,以物件為主分析問題。
(2)對資料流圖進行審查有何意義?
確保以下作用:
1、便於使用者表達功能需求和資料需求及其聯絡;
2、便於兩類人員共同理解現行系統和規劃系統的框架;
3、清晰表達資料流的情況;
4、有利於系統建模.