1.實習題目
【問題描述】
假設某銀行有四個視窗對外置待客戶,從早晨銀行開門起不斷有客戶進入銀行。由於每個視窗在某個時刻只能接待乙個客戶,因此在客戶人數眾多時需在每個視窗前順次排隊,對於剛進入銀行的客戶,如果某個視窗的業務員正空閒,則可上前辦理業務,反之,若四個視窗均有客戶所佔,他便會排在人數最少的隊伍後面。現在需要編制乙個程式以模擬銀行的這種業務活動並計算一天中客戶在銀行逗留的平均時間。
【實現要求】
假設模擬資料已按客戶到達的先後順序依次存入到資料檔案中,對應每位客戶有兩個資料,即到達時間和需要辦理業務的時間。
2.需求分析
為了計算這個平均時間,我們自然需要掌握每個客戶到達銀行和離開銀行這兩個時刻,後者減去前者即為每個客戶在銀行的逗留時間。所有客戶逗留時間的總和被一天內進入銀行的客戶數除便是所求的平均時間。
3.概要設計
分析需求可得,我們有兩類事件處理:一類是客戶到達事件,另一類是客戶離開時間,因為前一類事件是自然發生的,而後以類事件是由客戶處理事務所需時間和等待時間而決定,因為是有先後之分,所以事件表應是有序表,其主要操作是插入和刪除事件。
而客戶排隊需要用佇列來處理(qnode),因為有四個視窗,因此需要四個佇列(linkqueue q[5];),佇列中有關客戶的主要資訊是客戶到達時刻和辦理業務所需要的時間typedef struct qnodeqnode;
由以上可見,我們只需要兩種資料型別:有序表和佇列。
然後先處理客戶到達事件,因為客戶到達銀行是隨機的,因此我們需要在客戶到達事件發生時需先產生兩個隨即數,其一為此時到達的客戶辦理業務所需時間durtime,其二為下乙個客戶將到達的時間間隔intertime(durtime=rand()%25),假設當前事件發生時刻occurtime(intertime=rand()%24),則下乙個客戶到達的時刻為occurtime+intertime,由此應產生新的客戶到達事件表,剛到達的客戶則應插入當前所含元素最少的佇列中,在此時則需要得到每只佇列的長度(status queuelength())然後判斷並且得到最短佇列(int minqueue()),則還應產生乙個客戶離開事件的插入表。
接著再處理客戶離開事件,首先計算該使用者在銀行逗留的時間,然後從佇列中刪除該客戶((status delfirst()))後檢視佇列是否空(status listempty()),若不空則設定乙個新的隊頭客戶離開事件。
因為還需設定結束的條件,由此我們定義closetime;
4.詳細設計
eventlist ev事件表
event en事件
linkqueue q[5四個客戶佇列
qnode customer客戶記錄
int totaltime,customernum累計客戶逗留時間,客戶數
int durtime,intertime,closetime=100;linkqueue q[5];
void openforday()
初始化操作
totaltime=0初始化累計時間
customernum=0初始化客戶數為0
initlist初始化事件鍊錶為空表
en.occurtime=0, en.ntype=0設定第乙個客戶到達事件
orderinsert(ev插入事件表
int i置空佇列
for(i=1;i<=4;i++)
initqueue(&q[i]);
}void customerarrived()
i=minqueue(q求長度最短佇列
enqueue(&q[i],en.occurtime,durtime);
printf("\n%2d%12d%19d\n",c++,en.occurtime,durtime);
if(queuelength(q[i])==1)
}void customerdeparture()
處理客戶離開事件
int i;
i=en.ntype刪除第i佇列的排頭客戶
delqueue(&q[i]);
totaltime += en.occurtime-customer.arrivatime累計客戶逗留時間
if(q[i].head->next!=null)
}void main()
printf("\n\n輸出結果,定義輸出格式
printf(" 總時間是:%f\n",(float)totaltime);
printf(" 客戶數是:%d\n",customernum);
printf(" 平均時間=%d/%d=%f\n",totaltime,customernum,(float)totaltime/customernum);
}5.除錯分析
1.c:\users\qq\desktop\2010211487.
cpp(174) : error c2664: 'initqueue' :
cannot convert parameter 1 from 'linkqueue *' to 'linkqueue'
no constructor could take the source type, or constructor overload resolution was ambiguous
原因是status initqueue(linkqueue q)—>解決方法是status initqueue(linkqueue *q),對指標這塊又模糊了,不知道什麼時候需要*,這樣的問題遇到了幾個。
2.c:\users\qq\desktop\2010211487.
cpp(39) : warning c4101: 'q' :
unreferenced local variable原因是多設了q變數
3.c:\users\qq\desktop\2010211487.
cpp(68) : error c2562: 'listempty' :
'void' function returning a value還妄圖返回值,明顯不可能。所以改為status listempty()
4.沒錯誤,時間和客戶數對,但是平均時間為0,原因是忘了強制定義totaltime為float型,記得整型/整型=整型,等等,除錯的還挺多的。
6.使用者手冊
作為這個程式,全部需要的資料已經包含在程式裡面了,所以使用者只需執行,便能清晰明了的看到結果。
7.測試結果
8.附錄
#include
#include
#include
#include
#define error 0
#define ok 1
typedef int status;
typedef struct event
event,*eventlist;
typedef struct qnode
qnode;
typedef struct
linkqueue;
eventlist ev;
event en;
linkqueue q[5];
qnode customer;
int totaltime,customernum;
int durtime,intertime,closetime=100;
status initlist()
status orderinsert(eventlist p)
else
if(p->next!=null)
else
}return ok;
}status listempty()
status initqueue(linkqueue *q)
資料結構上機實驗報告
一 實驗目的 文學研究人員需要統計某篇英文 中某些形容詞的出現次數和位置,試寫出乙個實現這一目標的文字統計系統,成為 文學研究助手 二 實驗內容 英文 存放在乙個文字檔案中 帶統計的額詞彙集合要以此輸入完畢,即統計工作必須在程式的以此執行後全部完成 程式的輸出結果是每個詞的出現次數和出現位置所在的行...
資料結構上機實驗
一 實驗目的 1 掌握用visual c 6.0上機除錯順序表的基本方法 2 掌握順序表的基本操作,插入 刪除 查詢等演算法的實現 二 實驗內容 1 順序表基本操作的實現 問題描述 當我們要在順序表的第i個位置上插入乙個元素時,必須先將順序表中第i個元素之後的所有元素依次後移乙個位置,以便騰空乙個位...
《資料結構》上機實驗
資料結構 上機實驗 適用專業 資訊專業 x大學經濟管理學院 資訊 系 2015年 2月 前言 資料結構 是一門理論性和實踐性都很強的課程,通過本課程的學習,可以使學生分析研究計算機加工的資料物件的特性,以便選擇恰當的資料結構和儲存結構以及相應的演算法,並初步掌握演算法的時間分析和空間分析的技巧 另一...