データ構造の単一列--銀行の行列システム

2913 ワード

単列–銀行行列システム
プロジェクト名:銀行業務の単一列多窓サービス1実験目的でキューの基本操作を熟練に把握し、キューの応用を理解する.2実験内容は銀行がK個の窓口でサービスを提供すると仮定し、窓口の前に黄色い線を設置し、すべての顧客が到着時間に応じて黄色い線の後ろに長い列を作っている.ウィンドウが空きましたら、次の顧客はこの窓口で事務を処理します.複数のウィンドウが選択できる場合、顧客は常に一番小さいウィンドウを選択すると仮定する.この問題は、サービスを待っているN人のお客様の平均待ち時間、最大待ち時間、最後の仕上げ時間の出力を要求します.そして、窓口ごとに何人のお客様がサービスされていますか?3実験要求(1)入力説明:1行目を入力して正の整数N(≦1000)を提供し、お客様の総人数とする.その後、N行、各行はお客様の到着時間Tと事務処理時間Pを与え、入力データはすでに到着時間順に並べられていると仮定する.最後の行は正の整数K(≦10)を示し、開設された営業窓口数である.ここでは、お客様一人の事務が処理される最長時間は60分とします.(2)出力説明:1行目で平均待ち時間(小数点以下1桁に出力)、最長待ち時間、最終終了時間は、1つのスペースで区切られ、行末に余分なスペースがないようにする.第二行では番号順にウィンドウごとに何名のサービスを提供していますか?数字の間は1つのスペースで区切られています.行末に余分なスペースがないようにしてください.
コード
皬include typedef int ElemType;
//キューの結点構造を定義するtypedef struct Qnode{ElemType arrivetime;ElemTypee Needtime;struct Qnode*next;Qnode/構造体変数/、*Queueptr;構造体ポインター変数/
//キュー構造を定義するtypedef struct{Queueptr front;Queueptr rear;}LinkQue;
//初期化キューvoid InitQue(LinkQue&Q){Q.front=(Queueptr)malloc(sized of);/先頭ノードQ.rear=Q.frontに空間を割り当てる.
//列に要素を挿入して列に入る.e 1は到着時間で、e 2は必要な時間void EQue(LinkQue&Q、ElemType 1、ElemType 2).
//チーム要素を取得し、e 1が到着時間に戻り、e 2が必要な時間void GetElem(LinkQue&Q、ElemType&e 1、ElemType&e 2){e 1=Q.front->arrivetime;e 2=Q.front->Needtime;
//削除チームヘッド要素void DeleteElem(LinkQue&Q){Q.front=Q.front->next;
//キューが空かどうかを判断するint Empty(LinkQue&Q){if(Q.front==Q.rear)return 0;else return 1;}
int main(void){int N;/Nはお客様の人数です.printf(「お客様の総人数を入力してください」;scanf("%d"、&N)///入力人数LinkQue Que;InitQue;/初期化待ち行列for(int i=1;;;;;;;;i++price)/入力待ち時間は、入力時間はすべてのお客様になります.;scanf("%d"、&arrivetime);printf("お客様の業務処理時間を入力してください");scanf("%d"、&Needtime);EQue(Que,arrivetime,Needtime)//対応する到着時間を、必要な時間に列に入れます.
int K;//サービスウィンドウの総数printf(「サービスウィンドウの個数を入力してください」);scanf("%d"、&K);int windtime[10]={0}winum[10]={0]//winttime配列は各ウィンドウの完成時間であり、winunm配列は各ウィンドウのサービス人数int sumwait=0、longestwait=0{/ifwait記録は待つ必要があるかどうか、mintime記録は待つ必要があるなら、一番早く完成したウィンドウの時刻int ifwait=0、mintime=100、flagga;ElemType arrivetime、Needtime;/各ウィンドウを巡回して、もし到着時間が当該ウィンドウの完成時間より大きいなら、forを待つ必要がないことを表しています.(windtime[i]<=arrivetime){windtime[i]=arrivetime+Needtime;Deleteelem(Queue)//削除チームヘッド要素winum[i]+;ifwait=1;break;/並ぶ必要がないという意味です.
         if(mintime>wintime[i])
		  { 
            mintime = wintime[i];
            flag = i;//         
          }
    }
if(!ifwait) { 
onewait = mintime - arrivetime; 
if (longestwait < onewait) longestwait = onewait;
sumwait = sumwait + onewait;
wintime[flag] = mintime + Needtime;
winnum[flag]++;  //          1
DeleteElem(Queue);  //      
           }  
)
//最終完成時間int overtime=0;for(int=0;i<=K-1;i+){/エルゴードはwindtime配列の中で最大の一つを求めています.最終的な完成時間if(overtime)print(「平均待ち時間%1 lf最長待ち時間%d最終完成時間%d」、1.0*sumwait/9、最終完了時間%(int i=0;i<=K-1;i+){printf("各ウィンドウを出力するサービス人数%d]、///"各ウィンドウを出力する人の数if(i==K-1)printf(");else printf(");