Added upstream from http://ftp.icm.edu.pl/pub/loglan/
[loglan.git] / at_work / exe_old / bank2.log
1 BLOCK \r
2 (* BANK DEPARTMENT SERVICE SIMULATION *)\r
3  \r
4  \r
5  \r
6 UNIT PRIORITYQUEUE: CLASS;\r
7   (* HEAP AS BINARY LINKED TREE WITH FATHER LINK*)\r
8  \r
9  \r
10  \r
11      UNIT QUEUEHEAD: CLASS;\r
12         (* HEAP ACCESING MODULE *)\r
13              VAR LAST,ROOT:NODE;\r
14  \r
15              UNIT MIN: FUNCTION: ELEM;\r
16                   BEGIN\r
17                 IF ROOT=/= NONE THEN RESULT:=ROOT.EL FI;\r
18                  END MIN;\r
19  \r
20              UNIT INSERT: PROCEDURE(R:ELEM);\r
21                (* INSERTION INTO HEAP *)\r
22                    VAR X,Z:NODE;\r
23                  BEGIN\r
24                        X:= R.LAB;\r
25                        IF LAST=NONE THEN\r
26                          ROOT:=X;\r
27                          ROOT.LEFT,ROOT.RIGHT,LAST:=ROOT\r
28                        ELSE\r
29                          IF LAST.NS=0 THEN\r
30                            LAST.NS:=1;\r
31                            Z:=LAST.LEFT;\r
32                            LAST.LEFT:=X;\r
33                            X.UP:=LAST;\r
34                            X.LEFT:=Z;\r
35                            Z.RIGHT:=X;\r
36                          ELSE\r
37                            LAST.NS:=2;\r
38                            Z:=LAST.RIGHT;\r
39                            LAST.RIGHT:=X;\r
40                            X.RIGHT:=Z;\r
41                            X.UP:=LAST;\r
42                            Z.LEFT:=X;\r
43                            LAST.LEFT.RIGHT:=X;\r
44                            X.LEFT:=LAST.LEFT;\r
45                            LAST:=Z;\r
46                          FI\r
47                        FI;\r
48                        CALL CORRECT(R,FALSE)\r
49                        END INSERT;\r
50  \r
51 UNIT DELETE: PROCEDURE(R: ELEM);\r
52      VAR X,Y,Z:NODE;\r
53      BEGIN\r
54      X:=R.LAB;\r
55      Z:=LAST.LEFT;\r
56      IF LAST.NS =0 THEN\r
57            Y:= Z.UP;\r
58            Y.RIGHT:= LAST;\r
59            LAST.LEFT:=Y;\r
60            LAST:=Y;\r
61                    ELSE\r
62            Y:= Z.LEFT;\r
63            Y.RIGHT:= LAST;\r
64             LAST.LEFT:= Y;\r
65                     FI;\r
66        Z.EL.LAB:=X;\r
67        X.EL:= Z.EL;\r
68        LAST.NS:= LAST.NS-1;\r
69        R.LAB:=Z;\r
70        Z.EL:=R;\r
71        IF X.LESS(X.UP) THEN CALL CORRECT(X.EL,FALSE)\r
72                        ELSE CALL CORRECT(X.EL,TRUE) FI;\r
73      END DELETE;\r
74  \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
78      BEGIN\r
79      Z:=R.LAB;\r
80      IF DOWN THEN\r
81           WHILE NOT FIN DO\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
85                        FI; FI;\r
86                       IF Z.LESS(X) THEN FIN:=TRUE ELSE\r
87                             T:=X.EL;\r
88                             X.EL:=Z.EL;\r
89                             Z.EL:=T;\r
90                             Z.EL.LAB:=Z;\r
91                            X.EL.LAB:=X\r
92                       FI; FI;\r
93                  Z:=X;\r
94                        OD\r
95               ELSE\r
96     X:=Z.UP;\r
97     IF X=NONE THEN LOG:=TRUE ELSE LOG:=X.LESS(Z); FI;\r
98     WHILE NOT LOG DO\r
99           T:=Z.EL;\r
100           Z.EL:=X.EL;\r
101            X.EL:=T;\r
102           X.EL.LAB:=X;\r
103           Z.EL.LAB:=Z;\r
104           Z:=X;\r
105           X:=Z.UP;\r
106            IF X=NONE THEN LOG:=TRUE ELSE LOG:=X.LESS(Z);\r
107             FI;\r
108                 OD\r
109      FI;\r
110  END CORRECT;\r
111  \r
112 END QUEUEHEAD;\r
113  \r
114  \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
119           BEGIN\r
120           IF X= NONE THEN RESULT:=FALSE\r
121                     ELSE RESULT:=EL.LESS(X.EL) FI;\r
122           END LESS;\r
123      END NODE;\r
124  \r
125  \r
126 UNIT ELEM: CLASS(PRIOR:REAL);\r
127   (* PREFIX OF INFORMATION TO BE STORED IN NODE *)\r
128    VAR LAB: NODE;\r
129    UNIT VIRTUAL LESS: FUNCTION(X:ELEM):BOOLEAN;\r
130             BEGIN\r
131             IF X=NONE THEN RESULT:= FALSE ELSE\r
132                            RESULT:= PRIOR< X.PRIOR FI;\r
133             END LESS;\r
134     BEGIN\r
135     LAB:= NEW NODE(THIS ELEM);\r
136     END ELEM;\r
137  \r
138  \r
139 END PRIORITYQUEUE;\r
140  \r
141 (*********************************************************************\r
142 *********************************************************************) \r
143  \r
144 #include "simula.inc" \r
145  \r
146 UNIT LISTS:SIMULATION CLASS;\r
147  (* WE WISH TO USE LISTS FOR QUEUEING PROCESSES DURING SIMULATION*)\r
148  \r
149            UNIT LINKAGE:CLASS;\r
150             (*WE WILL USE TWO WAY LISTS *)\r
151                 VAR SUC1,PRED1:LINKAGE;\r
152                           END LINKAGE;\r
153             UNIT HEAD:LINKAGE CLASS;\r
154             (* EACH LIST WILL HAVE ONE ELEMENT ESTABLISHED *)\r
155                       UNIT FIRST:FUNCTION:LINK;\r
156                                  BEGIN\r
157                              IF SUC1 IN LINK THEN RESULT:=SUC1\r
158                                              ELSE RESULT:=NONE FI;\r
159                                  END;\r
160                       UNIT EMPTY:FUNCTION:BOOLEAN;\r
161                                  BEGIN\r
162                                  RESULT:=SUC1=THIS LINKAGE;\r
163                                  END EMPTY;\r
164                    BEGIN\r
165                    SUC1,PRED1:=THIS LINKAGE;\r
166                      END HEAD;\r
167  \r
168           UNIT LINK:LINKAGE CLASS;\r
169            (* ORDINARY LIST ELEMENT PREFIX *)\r
170                      UNIT OUT : PROCEDURE;\r
171                               BEGIN\r
172                               IF SUC1=/=NONE THEN\r
173                                     SUC1.PRED1:=PRED1;\r
174                                     PRED1.SUC1:=SUC1;\r
175                                     SUC1,PRED1:=NONE FI;\r
176                                END OUT;\r
177                      UNIT INTO:PROCEDURE(S:HEAD);\r
178                                BEGIN\r
179  \r
180                                CALL OUT;\r
181                                IF S=/= NONE THEN\r
182                                     IF S.SUC1=/=NONE THEN\r
183                                             SUC1:=S;\r
184                                             PRED1:=S.PRED1;\r
185                                             PRED1.SUC1:=THIS LINKAGE;\r
186                                             S.PRED1:=THIS LINKAGE;\r
187                                                  FI FI;\r
188                                   END INTO;\r
189                   END LINK;\r
190  \r
191      UNIT ELEM:LINK CLASS(SPROCESS:SIMPROCESS);\r
192      (* USER DEFINED  PROCESS WILL BE JOINED INTO LISTS  *)\r
193                     END ELEM;\r
194  \r
195     END LISTS;\r
196  \r
197  \r
198  \r
199  \r
200  \r
201   (*BEGIN OF BANK DEPARTMENT SIMULATION *)\r
202  \r
203  \r
204   UNIT OFFICE:LISTS CLASS; (*AN OFFICE*)\r
205  \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
210                                  END SERVICE;\r
211               VAR CSTM:CUSTOMER,  (*THE CUSTOMER BEING SERVED*)\r
212                   REST,PAUSE:REAL;\r
213  \r
214               BEGIN\r
215               PAUSE:=TIME;\r
216               DO\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
221                        CALL SERVICE;\r
222                        CALL SCHEDULE(CSTM,TIME);\r
223                                        OD;\r
224               PAUSE:=TIME;\r
225               CALL PASSIVATE\r
226               OD;\r
227      END TILL;\r
228  \r
229    UNIT CUSTOMER:SIMPROCESS CLASS;\r
230  \r
231               VAR ELLIST:ELEM, K:INTEGER;\r
232               UNIT ARRIVAL:PROCEDURE(S:TILL);\r
233               (* ATTACHING TELLER S *)\r
234                         BEGIN\r
235                         IF S=/=NONE THEN\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
240                         END ARRIVAL;\r
241        END CUSTOMER;\r
242  \r
243  END OFFICE;\r
244  \r
245  \r
246  \r
247 UNIT BANKDEPARTMENT:OFFICE CLASS;\r
248  \r
249  \r
250     UNIT COUNTER:TILL CLASS;\r
251               VAR PAYTIME:REAL; (*RANDOM SERVICE TIME*)\r
252               UNIT VIRTUAL SERVICE:PROCEDURE;\r
253                  BEGIN\r
254                  WRITELN(" THE PAY DESK  SERVES CUSTOMER NO",CSTM.K,\r
255                          " AT",TIME:10:4);\r
256                  CALL CSTM.ELLIST.OUT;\r
257                  PAYTIME:=RANDOM*2+2;\r
258                  CALL HOLD(PAYTIME);\r
259                  END SERVICE;\r
260     END COUNTER;\r
261  \r
262  \r
263     UNIT TELLER:TILL CLASS(NUMBER:INTEGER);\r
264               VAR SERVICETIME:REAL;\r
265               UNIT VIRTUAL SERVICE:PROCEDURE;\r
266                  VAR N:INTEGER;\r
267                  BEGIN\r
268                  WRITELN(" THE TELLER NO",NUMBER," WAS IDLE FOR",REST:10:4,\r
269                          " SEC");\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
274                           " AT",TIME:10:4);\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
279  \r
280                  END SERVICE;\r
281           END TELLER;\r
282  \r
283  \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
287                BEGIN\r
288                I:=I+1;\r
289                K:=I;\r
290                ARRIVALTIME:=TIME;\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
298             END BANKCUSTOMER;\r
299  \r
300   VAR TELLERS:ARRAYOF TELLER,ACCOUNT:ARRAYOF REAL;\r
301   VAR CTR:COUNTER, CONTROL:TILL,I:INTEGER;\r
302  \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
311     I:=0;\r
312  END BANKDEPARTMENT;\r
313  \r
314  \r
315  \r
316  BEGIN (* OF PROGRAM *)\r
317    PREF BANKDEPARTMENT BLOCK\r
318         UNIT GENERATOR:SIMPROCESS CLASS;\r
319          (* CUSTOMERS GENERATION *)\r
320               BEGIN\r
321               DO\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
328               OD\r
329               END GENERATOR;\r
330       BEGIN\r
331       WRITELN(" BANK DEPARTMENT SERVICE SIMULATION");\r
332       WRITELN;\r
333       CALL SCHEDULE(NEW GENERATOR,TIME);\r
334       CALL HOLD (40);\r
335        END\r
336 END \r