1. 程式人生 > 實用技巧 >CF920F SUM and REPLACE(線段樹+思維)

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】圖書管理系統

參考:http://lib.ahpu.edu.cn/

三.實驗步驟

(1)複習結構化的分析與設計方法的主要過程;

(2)討論系統存在的使用者角色、工作流等;

(3)對關鍵功能繪製資料流圖,給出資料字典,並反覆討論資料流的合理性;

(4)對應資料流圖,設計系統的功能結構圖,關鍵模組的流程圖;

(5)選擇對應的結構化程式設計語言,實現並測試部分功能模組

四.思考題
1)結構化分析方法與面向物件分析方法有無本質上的不同?

結構化分析也是面向過程分析,與面向物件分析是兩種思路完全不同的分析方法,面向過程分析方法,就是說我們先考慮問題大的方面,然後再從外面到裡面去深入這個問題的細節部分,一步一步去解決問題。
就是問題大的方面,然後我們再深入深入問題的細節部分,逐步解決問題。面向物件分析方法,我們把問題看作由幾個物件組成,以物件為主分析問題。
(2)對資料流圖進行審查有何意義?
確保以下作用:
1、便於使用者表達功能需求和資料需求及其聯絡;
2、便於兩類人員共同理解現行系統和規劃系統的框架;
3、清晰表達資料流的情況;
4、有利於系統建模.