2 (* BANK DEPARTMENT SERVICE SIMULATION *)
\r
6 UNIT PRIORITYQUEUE: CLASS;
\r
7 (* HEAP AS BINARY LINKED TREE WITH FATHER LINK*)
\r
11 UNIT QUEUEHEAD: CLASS;
\r
12 (* HEAP ACCESING MODULE *)
\r
15 UNIT MIN: FUNCTION: ELEM;
\r
17 IF ROOT=/= NONE THEN RESULT:=ROOT.EL FI;
\r
20 UNIT INSERT: PROCEDURE(R:ELEM);
\r
21 (* INSERTION INTO HEAP *)
\r
27 ROOT.LEFT,ROOT.RIGHT,LAST:=ROOT
\r
48 CALL CORRECT(R,FALSE)
\r
51 UNIT DELETE: PROCEDURE(R: ELEM);
\r
68 LAST.NS:= LAST.NS-1;
\r
71 IF X.LESS(X.UP) THEN CALL CORRECT(X.EL,FALSE)
\r
72 ELSE CALL CORRECT(X.EL,TRUE) FI;
\r
75 UNIT CORRECT: PROCEDURE(R:ELEM,DOWN:BOOLEAN);
\r
76 (* CORRECTION OF THE HEAP WITH STRUCTURE BROKEN BY R *)
\r
77 VAR X,Z:NODE,T:ELEM,FIN,LOG:BOOLEAN;
\r
82 IF Z.NS =0 THEN FIN:=TRUE ELSE
\r
83 IF Z.NS=1 THEN X:=Z.LEFT ELSE
\r
84 IF Z.LEFT.LESS(Z.RIGHT) THEN X:=Z.LEFT ELSE X:=Z.RIGHT
\r
86 IF Z.LESS(X) THEN FIN:=TRUE ELSE
\r
97 IF X=NONE THEN LOG:=TRUE ELSE LOG:=X.LESS(Z); FI;
\r
106 IF X=NONE THEN LOG:=TRUE ELSE LOG:=X.LESS(Z);
\r
115 UNIT NODE: CLASS (EL:ELEM);
\r
116 (* ELEMENT OF THE HEAP *)
\r
117 VAR LEFT,RIGHT,UP: NODE, NS:INTEGER;
\r
118 UNIT LESS: FUNCTION(X:NODE): BOOLEAN;
\r
120 IF X= NONE THEN RESULT:=FALSE
\r
121 ELSE RESULT:=EL.LESS(X.EL) FI;
\r
126 UNIT ELEM: CLASS(PRIOR:REAL);
\r
127 (* PREFIX OF INFORMATION TO BE STORED IN NODE *)
\r
129 UNIT VIRTUAL LESS: FUNCTION(X:ELEM):BOOLEAN;
\r
131 IF X=NONE THEN RESULT:= FALSE ELSE
\r
132 RESULT:= PRIOR< X.PRIOR FI;
\r
135 LAB:= NEW NODE(THIS ELEM);
\r
141 (*********************************************************************
\r
142 *********************************************************************)
\r
144 #include "simula.inc"
\r
146 UNIT LISTS:SIMULATION CLASS;
\r
147 (* WE WISH TO USE LISTS FOR QUEUEING PROCESSES DURING SIMULATION*)
\r
149 UNIT LINKAGE:CLASS;
\r
150 (*WE WILL USE TWO WAY LISTS *)
\r
151 VAR SUC1,PRED1:LINKAGE;
\r
153 UNIT HEAD:LINKAGE CLASS;
\r
154 (* EACH LIST WILL HAVE ONE ELEMENT ESTABLISHED *)
\r
155 UNIT FIRST:FUNCTION:LINK;
\r
157 IF SUC1 IN LINK THEN RESULT:=SUC1
\r
158 ELSE RESULT:=NONE FI;
\r
160 UNIT EMPTY:FUNCTION:BOOLEAN;
\r
162 RESULT:=SUC1=THIS LINKAGE;
\r
165 SUC1,PRED1:=THIS LINKAGE;
\r
168 UNIT LINK:LINKAGE CLASS;
\r
169 (* ORDINARY LIST ELEMENT PREFIX *)
\r
170 UNIT OUT : PROCEDURE;
\r
172 IF SUC1=/=NONE THEN
\r
175 SUC1,PRED1:=NONE FI;
\r
177 UNIT INTO:PROCEDURE(S:HEAD);
\r
182 IF S.SUC1=/=NONE THEN
\r
185 PRED1.SUC1:=THIS LINKAGE;
\r
186 S.PRED1:=THIS LINKAGE;
\r
191 UNIT ELEM:LINK CLASS(SPROCESS:SIMPROCESS);
\r
192 (* USER DEFINED PROCESS WILL BE JOINED INTO LISTS *)
\r
201 (*BEGIN OF BANK DEPARTMENT SIMULATION *)
\r
204 UNIT OFFICE:LISTS CLASS; (*AN OFFICE*)
\r
206 UNIT TILL:SIMPROCESS CLASS(QUEUE:HEAD);
\r
207 (* TELLER WITH CUSTOMERS QUEUEING UP *)
\r
208 UNIT VIRTUAL SERVICE:PROCEDURE;
\r
209 (* SERVICE OF THIS TELLER WILL BE PRECISED LATER *)
\r
211 VAR CSTM:CUSTOMER, (*THE CUSTOMER BEING SERVED*)
\r
217 REST:=REST+TIME-PAUSE;
\r
218 WHILE NOT QUEUE.EMPTY DO
\r
219 (* SERVE ALL QUEUE *)
\r
220 CSTM:=QUEUE.FIRST QUA ELEM.SPROCESS;
\r
222 CALL SCHEDULE(CSTM,TIME);
\r
229 UNIT CUSTOMER:SIMPROCESS CLASS;
\r
231 VAR ELLIST:ELEM, K:INTEGER;
\r
232 UNIT ARRIVAL:PROCEDURE(S:TILL);
\r
233 (* ATTACHING TELLER S *)
\r
236 ELLIST:=NEW ELEM(THIS CUSTOMER);
\r
237 CALL ELLIST.INTO(S.QUEUE);
\r
238 IF S.IDLE THEN CALL SCHEDULE(S,TIME) FI;
\r
239 CALL PASSIVATE; FI;
\r
247 UNIT BANKDEPARTMENT:OFFICE CLASS;
\r
250 UNIT COUNTER:TILL CLASS;
\r
251 VAR PAYTIME:REAL; (*RANDOM SERVICE TIME*)
\r
252 UNIT VIRTUAL SERVICE:PROCEDURE;
\r
254 WRITELN(" THE PAY DESK SERVES CUSTOMER NO",CSTM.K,
\r
256 CALL CSTM.ELLIST.OUT;
\r
257 PAYTIME:=RANDOM*2+2;
\r
258 CALL HOLD(PAYTIME);
\r
263 UNIT TELLER:TILL CLASS(NUMBER:INTEGER);
\r
264 VAR SERVICETIME:REAL;
\r
265 UNIT VIRTUAL SERVICE:PROCEDURE;
\r
268 WRITELN(" THE TELLER NO",NUMBER," WAS IDLE FOR",REST:10:4,
\r
270 CALL CSTM.ELLIST.OUT;
\r
271 N:=CSTM QUA BANKCUSTOMER.NO;
\r
272 WRITELN(" THE CUSTOMER NO",CSTM.K,
\r
273 " BEGINS TO BE SERVED BY THE TELLER NO",NUMBER,
\r
275 ACCOUNT(N):=ACCOUNT(N)+CSTM QUA BANKCUSTOMER.AMOUNT;
\r
276 IF ACCOUNT(N)<0 THEN CALL CSTM.ARRIVAL(CONTROL);FI;
\r
277 SERVICETIME:=RANDOM*7+3;
\r
278 CALL HOLD(SERVICETIME);
\r
284 UNIT BANKCUSTOMER:CUSTOMER CLASS(NO:INTEGER,AMOUNT:REAL);
\r
285 (* BANK CUSTOMER. AMOUNT- THE MONEY TO BE PAID AT THE BANK *)
\r
286 VAR ARRIVALTIME,STAYTIME:REAL,CHOOSETELLER:INTEGER;
\r
291 WRITELN(" THE CUSTOMER NO",K," ARRIVED AT",TIME:10:4);
\r
292 CHOOSETELLER:=RANDOM*5+1;
\r
293 CALL ARRIVAL(TELLERS(CHOOSETELLER));
\r
294 IF AMOUNT<0 THEN CALL ARRIVAL(CTR); FI;
\r
295 STAYTIME:=TIME-ARRIVALTIME;
\r
296 WRITELN(" THE CUSTOMER NO",K," STAYED AT THE BANK FOR",
\r
297 STAYTIME:10:4," SEC; STATE OF ACCOUNT",ACCOUNT(NO):10:4);
\r
300 VAR TELLERS:ARRAYOF TELLER,ACCOUNT:ARRAYOF REAL;
\r
301 VAR CTR:COUNTER, CONTROL:TILL,I:INTEGER;
\r
303 BEGIN (* NEW BANK DEPARTMENT GENERATION *)
\r
304 CTR:=NEW COUNTER(NEW HEAD);
\r
305 ARRAY TELLERS DIM(1:5); (* WE DEAL WITH 5 TELLES *)
\r
306 FOR I:=1 TO 5 DO TELLERS(I):=NEW TELLER(NEW HEAD,I); OD;
\r
307 ARRAY ACCOUNT DIM(1:100);
\r
308 (* WE DEAL WITH 100 ACOUNTS IN THIS BANK DEPARTMENT *)
\r
309 FOR I:=1 TO 100 DO ACCOUNT(I):=RANDOM*901+100; OD;
\r
310 (* AN ACCOUNT VALUE CAN FLUCTUATE FROM 100 TO 1000$ *)
\r
312 END BANKDEPARTMENT;
\r
316 BEGIN (* OF PROGRAM *)
\r
317 PREF BANKDEPARTMENT BLOCK
\r
318 UNIT GENERATOR:SIMPROCESS CLASS;
\r
319 (* CUSTOMERS GENERATION *)
\r
322 CALL SCHEDULE(NEW BANKCUSTOMER(RANDOM*100+1,
\r
323 RANDOM*9996+5),TIME);
\r
324 CALL HOLD(RANDOM*10);
\r
325 CALL SCHEDULE(NEW BANKCUSTOMER(RANDOM*100+1,
\r
326 -(RANDOM*900+5)),TIME);
\r
327 CALL HOLD(RANDOM*10);
\r
331 WRITELN(" BANK DEPARTMENT SERVICE SIMULATION");
\r
333 CALL SCHEDULE(NEW GENERATOR,TIME);
\r