Added upstream from http://ftp.icm.edu.pl/pub/loglan/
[loglan.git] / examples / chin / li1004.log
1 program bank22;\r
2 \r
3   UNIT PRIORITYQUEUE: CLASS;\r
4   (* HEAP AS BINARY LINKED TREE WITH FATHER LINK*)\r
5 \r
6 \r
7 \r
8     UNIT QUEUEHEAD: CLASS;\r
9         (* HEAP ACCESING MODULE *)\r
10              VAR LAST,ROOT:NODE;\r
11 \r
12              UNIT MIN: FUNCTION: ELEM;\r
13                   BEGIN\r
14                 IF ROOT=/= NONE THEN RESULT:=ROOT.EL FI;\r
15                  END MIN;\r
16 \r
17              UNIT INSERT: PROCEDURE(R:ELEM);\r
18                (* INSERTION INTO HEAP *)\r
19                    VAR X,Z:NODE;\r
20                  BEGIN\r
21                        X:= R.LAB;\r
22                        IF LAST=NONE THEN\r
23                          ROOT:=X;\r
24                          ROOT.LEFT,ROOT.RIGHT,LAST:=ROOT\r
25                        ELSE\r
26                          IF LAST.NS=0 THEN\r
27                            LAST.NS:=1;\r
28                            Z:=LAST.LEFT;\r
29                            LAST.LEFT:=X;\r
30                            X.UP:=LAST;\r
31                            X.LEFT:=Z;\r
32                            Z.RIGHT:=X;\r
33                          ELSE\r
34                            LAST.NS:=2;\r
35                            Z:=LAST.RIGHT;\r
36                            LAST.RIGHT:=X;\r
37                            X.RIGHT:=Z;\r
38                            X.UP:=LAST;\r
39                            Z.LEFT:=X;\r
40                            LAST.LEFT.RIGHT:=X;\r
41                            X.LEFT:=LAST.LEFT;\r
42                            LAST:=Z;\r
43                          FI\r
44                        FI;\r
45                        CALL CORRECT(R,FALSE)\r
46                        END INSERT;\r
47 \r
48       UNIT DELETE: PROCEDURE(R: ELEM);\r
49       VAR X,Y,Z:NODE;\r
50       BEGIN\r
51         X:=R.LAB;\r
52         Z:=LAST.LEFT;\r
53         IF LAST.NS =0 THEN\r
54            Y:= Z.UP;\r
55            Y.RIGHT:= LAST;\r
56            LAST.LEFT:=Y;\r
57            LAST:=Y;\r
58                    ELSE\r
59            Y:= Z.LEFT;\r
60            Y.RIGHT:= LAST;\r
61             LAST.LEFT:= Y;\r
62                     FI;\r
63         Z.EL.LAB:=X;\r
64         X.EL:= Z.EL;\r
65         LAST.NS:= LAST.NS-1;\r
66         R.LAB:=Z;\r
67         Z.EL:=R;\r
68         IF X.LESS(X.UP) THEN CALL CORRECT(X.EL,FALSE)\r
69                        ELSE CALL CORRECT(X.EL,TRUE) FI;\r
70      END DELETE;\r
71 \r
72      UNIT CORRECT: PROCEDURE(R:ELEM,DOWN:BOOLEAN);\r
73      (* CORRECTION OF THE HEAP WITH STRUCTURE BROKEN BY R *)\r
74      VAR X,Z:NODE,T:ELEM,FIN,LOG:BOOLEAN;\r
75      BEGIN\r
76      Z:=R.LAB;\r
77      IF DOWN THEN\r
78           WHILE NOT FIN DO\r
79                  IF Z.NS =0 THEN FIN:=TRUE ELSE\r
80                       IF Z.NS=1 THEN X:=Z.LEFT ELSE\r
81                       IF Z.LEFT.LESS(Z.RIGHT) THEN X:=Z.LEFT ELSE X:=Z.RIGHT\r
82                        FI; FI;\r
83                       IF Z.LESS(X) THEN FIN:=TRUE ELSE\r
84                             T:=X.EL;\r
85                             X.EL:=Z.EL;\r
86                             Z.EL:=T;\r
87                             Z.EL.LAB:=Z;\r
88                            X.EL.LAB:=X\r
89                       FI; FI;\r
90                  Z:=X;\r
91                        OD\r
92               ELSE\r
93      X:=Z.UP;\r
94      IF X=NONE THEN LOG:=TRUE ELSE LOG:=X.LESS(Z); FI;\r
95      WHILE NOT LOG DO\r
96           T:=Z.EL;\r
97           Z.EL:=X.EL;\r
98            X.EL:=T;\r
99           X.EL.LAB:=X;\r
100           Z.EL.LAB:=Z;\r
101           Z:=X;\r
102           X:=Z.UP;\r
103            IF X=NONE THEN LOG:=TRUE ELSE LOG:=X.LESS(Z);\r
104             FI;\r
105                 OD\r
106      FI;\r
107      END CORRECT;\r
108 \r
109     END QUEUEHEAD;\r
110 \r
111 \r
112     UNIT NODE: CLASS (EL:ELEM);\r
113     (* ELEMENT OF THE HEAP *)\r
114       VAR LEFT,RIGHT,UP: NODE, NS:INTEGER;\r
115       UNIT LESS: FUNCTION(X:NODE): BOOLEAN;\r
116           BEGIN\r
117           IF X= NONE THEN RESULT:=FALSE\r
118                     ELSE RESULT:=EL.LESS(X.EL) FI;\r
119           END LESS;\r
120     END NODE;\r
121 \r
122  \r
123     UNIT ELEM: CLASS(PRIOR:REAL);\r
124     (* PREFIX OF INFORMATION TO BE STORED IN NODE *)\r
125     VAR LAB: NODE;\r
126       UNIT VIRTUAL LESS: FUNCTION(X:ELEM):BOOLEAN;\r
127             BEGIN\r
128             IF X=NONE THEN RESULT:= FALSE ELSE\r
129                            RESULT:= PRIOR< X.PRIOR FI;\r
130             END LESS;\r
131       BEGIN\r
132       LAB:= NEW NODE(THIS ELEM);\r
133     END ELEM;\r
134 \r
135 \r
136   END PRIORITYQUEUE;\r
137 \r
138 \r
139  \r
140   UNIT SIMULATION: PRIORITYQUEUE CLASS;\r
141   (* THE LANGUAGE FOR SIMULATION PURPOSES *)\r
142  \r
143   VAR CURR: SIMPROCESS,  (*ACTIVE PROCESS *)\r
144       PQ:QUEUEHEAD,  (* THE TIME AXIS *)\r
145        MAINPR: MAINPROGRAM;\r
146 \r
147 \r
148       UNIT SIMPROCESS: COROUTINE;\r
149         (* USER PROCESS PREFIX *)\r
150              VAR EVENT,  (* ACTIVATION MOMENT NOTICE *)\r
151                  EVENTAUX: EVENTNOTICE,\r
152                  (* THIS IS FOR AVOIDING MANY NEW CALLS AS AN RESULT OF *)\r
153                  (* SUBSEQUENT PASSIVATIONS AND ACTIVATIONS             *)\r
154                  FINISH: BOOLEAN;\r
155  \r
156              UNIT IDLE: FUNCTION: BOOLEAN;\r
157                    BEGIN\r
158                    RESULT:= EVENT= NONE;\r
159                    END IDLE;\r
160 \r
161              UNIT TERMINATED: FUNCTION :BOOLEAN;\r
162                    BEGIN\r
163                   RESULT:= FINISH;\r
164                    END TERMINATED;\r
165 \r
166              UNIT EVTIME: FUNCTION: REAL;\r
167              (* TIME OF ACTIVATION *)\r
168                   BEGIN\r
169                   IF IDLE THEN CALL ERROR1;\r
170                                            FI;\r
171                   RESULT:= EVENT.EVENTTIME;\r
172                   END EVTIME;\r
173 \r
174     UNIT ERROR1:PROCEDURE;\r
175                 BEGIN\r
176                 ATTACH(MAIN);\r
177                 WRITELN(" AN ATTEMPT TO ACCESS AN IDLE PROCESS TIME");\r
178                 END ERROR1;\r
179 \r
180      UNIT ERROR2:PROCEDURE;\r
181                  BEGIN\r
182                  ATTACH(MAIN);\r
183                  WRITELN(" AN ATTEMPT TO ACCESS A TERMINATED PROCESS TIME");\r
184                  END ERROR2;\r
185              BEGIN\r
186 \r
187              RETURN;\r
188              INNER;\r
189              FINISH:=TRUE;\r
190               CALL PASSIVATE;\r
191              CALL ERROR2;\r
192           END SIMPROCESS;\r
193 \r
194 \r
195     UNIT EVENTNOTICE: ELEM CLASS;\r
196     (* A PROCESS ACTIVATION NOTICE TO BE PLACED ONTO THE TIME AXIS PQ *)\r
197       VAR EVENTTIME: REAL, PROC: SIMPROCESS;\r
198 \r
199       UNIT VIRTUAL LESS: FUNCTION(X: EVENTNOTICE):BOOLEAN;\r
200        (* OVERWRITE THE FORMER VERSION CONSIDERING EVENTTIME *)\r
201                   BEGIN\r
202                   IF X=NONE THEN RESULT:= FALSE ELSE\r
203                   RESULT:= EVENTTIME< X.EVENTTIME OR\r
204                   (EVENTTIME=X.EVENTTIME AND PRIOR< X.PRIOR); FI;\r
205 \r
206                END LESS;\r
207     END EVENTNOTICE;\r
208  \r
209 \r
210     UNIT MAINPROGRAM: SIMPROCESS CLASS;\r
211     (* IMPLEMENTING MASTER PROGRAM AS A PROCESS *)\r
212       BEGIN\r
213       DO ATTACH(MAIN) OD;\r
214     END MAINPROGRAM;\r
215  \r
216     UNIT TIME:FUNCTION:REAL;\r
217     (* CURRENT VALUE OF SIMULATION TIME *)\r
218      BEGIN\r
219      RESULT:=CURRENT.EVTIME\r
220     END TIME;\r
221 \r
222     UNIT CURRENT: FUNCTION: SIMPROCESS;\r
223     (* THE FIRST PROCESS ON THE TIME AXIS *)\r
224      BEGIN\r
225      RESULT:=CURR;\r
226     END CURRENT;\r
227  \r
228     UNIT SCHEDULE: PROCEDURE(P:SIMPROCESS,T:REAL);\r
229    (* ACTIVATION OF PROCESS P AT TIME T AND DEFINITION OF "PRIOR"- PRIORITY *)\r
230    (* WITHIN TIME MOMENT T                                                  *)\r
231       BEGIN\r
232       IF T<TIME THEN T:= TIME FI;\r
233       IF P=CURRENT THEN CALL HOLD(T-TIME) ELSE\r
234       IF P.IDLE AND P.EVENTAUX=NONE THEN (* HAS NOT BEEN SCHEDULED YET*)\r
235                 P.EVENT,P.EVENTAUX:= NEW EVENTNOTICE(RANDOM);\r
236                 P.EVENT.PROC:= P;\r
237                                       ELSE\r
238        IF P.IDLE (* P HAS ALREADY BEEN SCHEDULED *) THEN\r
239                P.EVENT:= P.EVENTAUX;\r
240                P.EVENT.PRIOR:=RANDOM;\r
241                                           ELSE\r
242      (* NEW SCHEDULING *)\r
243                P.EVENT.PRIOR:=RANDOM;\r
244                CALL PQ.DELETE(P.EVENT)\r
245                                 FI; FI;\r
246       P.EVENT.EVENTTIME:= T;\r
247       CALL PQ.INSERT(P.EVENT) FI;\r
248     END SCHEDULE;\r
249 \r
250     UNIT HOLD:PROCEDURE(T:REAL);\r
251     (* MOVE THE ACTIVE PROCESS T MINUTES BACK ALONG PQ *)\r
252     (* REDEFINE PRIOR                                  *)\r
253      BEGIN\r
254      CALL PQ.DELETE(CURRENT.EVENT);\r
255      CURRENT.EVENT.PRIOR:=RANDOM;\r
256      IF T<0 THEN T:=0; FI;\r
257       CURRENT.EVENT.EVENTTIME:=TIME+T;\r
258      CALL PQ.INSERT(CURRENT.EVENT);\r
259      CALL CHOICEPROCESS;\r
260     END HOLD;\r
261  \r
262     UNIT PASSIVATE: PROCEDURE;\r
263     (* REMOVE THE ACTVE PROCESS FROM PQ AND ACTIVATE THE NEXT ONE *)\r
264      BEGIN\r
265       CALL PQ.DELETE(CURRENT.EVENT);\r
266       CURRENT.EVENT:=NONE;\r
267       CALL CHOICEPROCESS\r
268     END PASSIVATE;\r
269 \r
270     UNIT RUN: PROCEDURE(P:SIMPROCESS);\r
271     (* ACTIVATE P IMMEDIATELY AND DELAY THE FORMER FIRST PROCESS BY REDEFINING*)\r
272     (* PRIOR                                                              *)\r
273      BEGIN\r
274      CURRENT.EVENT.PRIOR:=RANDOM;\r
275      IF NOT P.IDLE THEN\r
276             P.EVENT.PRIOR:=0;\r
277             P.EVENT.EVENTTIME:=TIME;\r
278             CALL PQ.CORRECT(P.EVENT,FALSE)\r
279                     ELSE\r
280       IF P.EVENTAUX=NONE THEN\r
281             P.EVENT,P.EVENTAUX:=NEW EVENTNOTICE(0);\r
282             P.EVENT.EVENTTIME:=TIME;\r
283             P.EVENT.PROC:=P;\r
284             CALL PQ.INSERT(P.EVENT)\r
285                         ELSE\r
286              P.EVENT:=P.EVENTAUX;\r
287              P.EVENT.PRIOR:=0;\r
288              P.EVENT.EVENTTIME:=TIME;\r
289              P.EVENT.PROC:=P;\r
290              CALL PQ.INSERT(P.EVENT);\r
291                           FI;FI;\r
292       CALL CHOICEPROCESS;\r
293     END RUN;\r
294 \r
295     UNIT CANCEL:PROCEDURE(P: SIMPROCESS);\r
296     (* REMOVE PROCESS P FROM PQ AND CONTINUE SIMULATION *)\r
297     BEGIN\r
298      IF P= CURRENT THEN CALL PASSIVATE ELSE\r
299       CALL PQ.DELETE(P.EVENT);\r
300      P.EVENT:=NONE;  FI;\r
301     END CANCEL;\r
302 \r
303     UNIT CHOICEPROCESS:PROCEDURE;\r
304     (* CHOOSE THE FIRST PROCESS FROM PQ TO BE ACTIVATED *)\r
305     VAR P:SIMPROCESS;\r
306     BEGIN\r
307      P:=CURR;\r
308      CURR:= PQ.MIN QUA EVENTNOTICE.PROC;\r
309      IF CURR=NONE THEN\r
310      WRITE(" ERROR IN THE HEAP"); WRITELN;\r
311                       ATTACH(MAIN);\r
312                  ELSE ATTACH(CURR); FI;\r
313     END CHOICEPROCESS;\r
314 \r
315   BEGIN\r
316     PQ:=NEW QUEUEHEAD;  (* SIMULATION TIME AXIS*)\r
317     CURR,MAINPR:=NEW MAINPROGRAM;\r
318     MAINPR.EVENT,MAINPR.EVENTAUX:=NEW EVENTNOTICE(0);\r
319     MAINPR.EVENT.EVENTTIME:=0;\r
320     MAINPR.EVENT.PROC:=MAINPR;\r
321     CALL PQ.INSERT(MAINPR.EVENT);\r
322     (* THE FIRST PROCESS TO BE ACTIVATED IS MAIN PROGRAM *)\r
323     INNER;\r
324     PQ:=NONE;\r
325   END SIMULATION;\r
326 \r
327 \r
328  \r
329   UNIT LISTS:SIMULATION CLASS;\r
330   (* WE WISH TO USE LISTS FOR QUEUEING PROCESSES DURING SIMULATION*)\r
331 \r
332            UNIT LINKAGE:CLASS;\r
333             (*WE WILL USE TWO WAY LISTS *)\r
334                 VAR SUC1,PRED1:LINKAGE;\r
335                           END LINKAGE;\r
336             UNIT HEAD:LINKAGE CLASS;\r
337             (* EACH LIST WILL HAVE ONE ELEMENT ESTABLISHED *)\r
338                       UNIT FIRST:FUNCTION:LINK;\r
339                                  BEGIN\r
340                              IF SUC1 IN LINK THEN RESULT:=SUC1\r
341                                              ELSE RESULT:=NONE FI;\r
342                                  END;\r
343                       UNIT EMPTY:FUNCTION:BOOLEAN;\r
344                                  BEGIN\r
345                                  RESULT:=SUC1=THIS LINKAGE;\r
346                                  END EMPTY;\r
347                    BEGIN\r
348                    SUC1,PRED1:=THIS LINKAGE;\r
349                      END HEAD;\r
350 \r
351           UNIT LINK:LINKAGE CLASS;\r
352            (* ORDINARY LIST ELEMENT PREFIX *)\r
353                      UNIT OUT:PROCEDURE;\r
354                               BEGIN\r
355                               IF SUC1=/=NONE THEN\r
356                                     SUC1.PRED1:=PRED1;\r
357                                     PRED1.SUC1:=SUC1;\r
358                                     SUC1,PRED1:=NONE FI;\r
359                                END OUT;\r
360                      UNIT INTO:PROCEDURE(S:HEAD);\r
361                                BEGIN\r
362 \r
363                                CALL OUT;\r
364                                IF S=/= NONE THEN\r
365                                     IF S.SUC1=/=NONE THEN\r
366                                             SUC1:=S;\r
367                                             PRED1:=S.PRED1;\r
368                                             PRED1.SUC1:=THIS LINKAGE;\r
369                                             S.PRED1:=THIS LINKAGE;\r
370                                                  FI FI;\r
371                                   END INTO;\r
372                   END LINK;\r
373 \r
374      UNIT ELEM:LINK CLASS(SPROCESS:SIMPROCESS);\r
375      (* USER DEFINED  PROCESS WILL BE JOINED INTO LISTS  *)\r
376                     END ELEM;\r
377 \r
378     END LISTS;\r
379 \r
380 \r
381   unit numero : class(val : real;choix:integer);\r
382     var next : numero;\r
383   end numero;\r
384  \r
385   unit liste : class;\r
386     var tete, queue : numero;\r
387  \r
388  \r
389     unit listevide : function : boolean;\r
390     begin\r
391       if tete = NONE then result := true fi\r
392     end listevide;\r
393  \r
394     unit supprime : procedure(inout valeur:real;inout choix:integer);\r
395       var aux : numero;\r
396     begin\r
397       if listevide then \r
398         valeur:=-1;\r
399         choix:=0;\r
400       else \r
401         valeur:=tete.val;\r
402         choix:=tete.choix;\r
403         aux := tete;\r
404         tete := tete.next;\r
405         kill(aux);\r
406       fi\r
407     end supprime;\r
408 \r
409 \r
410     unit ajout : procedure(e : real;choix:integer);\r
411       var aux : numero;\r
412     begin\r
413       if listevide then tete, queue := new numero(e,choix)\r
414                    else aux := new numero(e,choix);\r
415                         queue.next := aux;\r
416                         queue := aux\r
417       fi\r
418     end ajout;\r
419  \r
420     unit member : function(e : integer) : boolean;\r
421       var aux : numero;\r
422     begin\r
423       if listevide then exit fi;\r
424       aux := tete;\r
425       do if aux = NONE then exit fi;\r
426          if aux.val = e then result := true;\r
427                              exit\r
428                         else aux := aux.next\r
429          fi\r
430       od\r
431     end member;\r
432  \r
433     unit delliste : procedure;\r
434       var aux : numero;\r
435     begin\r
436       do if listevide then exit fi;\r
437          aux := tete.next;\r
438          kill(tete);\r
439          tete := aux\r
440       od\r
441     end delliste;\r
442   end liste;\r
443 \r
444 \r
445 \r
446  unit station : LISTS class;\r
447    unit prioritaire:procedure;\r
448    var\r
449       i,min:integer;\r
450    begin\r
451      min:=contenu(1);\r
452      numero_prioritaire:=1;\r
453      for i:=2 to nombre_machine\r
454      do\r
455          if( contenu(i)<min )\r
456          then\r
457            min:=contenu(i);\r
458            numero_prioritaire:=i\r
459          fi;\r
460      od;\r
461    end prioritaire;\r
462    unit arrivee_client:simprocess class(nombre_machine,nombre_client:integer);\r
463    var i:integer,\r
464        r:real;\r
465    begin\r
466        for i:=1 to nombre_client\r
467        do\r
468           if( random*10 < 10 )\r
469           then\r
470             (* choix machine *)\r
471             call prioritaire;\r
472             writeln("ARRIVEE : nouveau client sur machine ",\r
473                      numero_prioritaire);\r
474             r:=random;\r
475             if( r*10 < 3 )\r
476             then\r
477               call l(numero_prioritaire).ajout(time,1);\r
478             fi;\r
479             if( r*10 >= 3 ) AND (r*10 < 6 )\r
480             then\r
481               call l(numero_prioritaire).ajout(time,2);\r
482             fi;\r
483             if( r*10 >= 6 )\r
484             then\r
485               call l(numero_prioritaire).ajout(time,3);\r
486             fi;\r
487 \r
488             contenu(numero_prioritaire):=contenu(numero_prioritaire)+1;\r
489             call hold((nombre_machine+1)*base_temps);\r
490           else\r
491             i:=i-1;\r
492           fi;\r
493        od;\r
494        termine:=1;\r
495        writeln("ARRIVEE : FIN DES ARRIVEES");\r
496        do\r
497          call hold((nombre_machine+1)*base_temps);\r
498        od;\r
499    end arrivee_client;\r
500 \r
501      unit machine:simprocess class(base_temps,numero:integer);\r
502      var\r
503        total,nombre,heure,valeur:real,\r
504        choix:integer;\r
505      begin\r
506        total:=0;\r
507        nombre:=0;\r
508        while( ( termine = 0 ) OR ( not l(numero).listevide) )\r
509        do\r
510         if( not l(numero).listevide )\r
511         then\r
512             writeln("MACHINE nø",numero," : mise en marche. ");\r
513             heure:=time;\r
514             call l(numero).supprime(valeur,choix);\r
515             writeln("MACHINE nø",numero," : client arrive a ",valeur);\r
516             writeln("MACHINE nø",numero," : client servit a ",heure);\r
517             total:=total+(heure-valeur);\r
518             nombre:=nombre+1;\r
519             nbre_client(numero):=nbre_client(numero)+1;\r
520             writeln(" MMMMMMMMMMMMMMMMMMMMMMMMM choix :",choix);\r
521             if( choix > 1 )\r
522             then\r
523               (* prelavage *)\r
524               writeln(" MACHINE nø",numero," : prelavage de la voiture ",\r
525                       nombre);\r
526               call hold(5*(nombre_machine+1)*base_temps);\r
527             fi;\r
528 \r
529             (* lavage *)\r
530             writeln(" MACHINE nø",numero," : lavage de la voiture ",nombre);\r
531             call hold(10*(nombre_machine+1)*base_temps);\r
532             if( choix > 2 )\r
533             then\r
534               (* lustrage *)\r
535               writeln(" MACHINE nø",numero," : lustrage de la voiture ",\r
536                       nombre);\r
537               call hold(10*(nombre_machine+1)*base_temps);\r
538             fi;\r
539 \r
540             (* rincage *)\r
541             writeln(" MACHINE nø",numero," : rincage de la voiture ",nombre);\r
542             contenu(numero):=contenu(numero)-1;\r
543             call prioritaire;\r
544 \r
545         fi;\r
546         call hold(5*(nombre_machine+1)*base_temps);\r
547     od;\r
548     if( nombre <> 0 )\r
549     then\r
550       writeln("MACHINE nø",numero," : mise a jour resultat -->",total/nombre);\r
551       resultat(numero):=total/nombre;\r
552     fi;\r
553     fini:=fini+1;\r
554     writeln("MACHINE nø",numero," ARRET DE LA MACHINE");\r
555     do\r
556         call hold((nombre_machine+1)*base_temps);\r
557     od;\r
558   end machine;\r
559 \r
560  end station;\r
561 \r
562  var\r
563    l:arrayof liste,\r
564    k,termine,numero_prioritaire:integer,\r
565    contenu:arrayof integer,\r
566    fini,nombre_machine,nombre_client,numero_machine:integer,\r
567    resultat:arrayof real,\r
568    moyenne,base_temps,base_temps2:real,\r
569    nbre_client:arrayof integer;\r
570  begin  \r
571    PREF station BLOCK\r
572 \r
573      UNIT GENERATOR:SIMPROCESS CLASS;\r
574 \r
575               BEGIN\r
576               for k:=1 to nombre_machine\r
577               DO\r
578                 CALL SCHEDULE(NEW machine(base_temps,k),TIME+k*base_temps);\r
579               OD;\r
580               CALL SCHEDULE(NEW arrivee_client(nombre_machine,nombre_client),\r
581                             TIME+k*base_temps);\r
582 \r
583      END GENERATOR;\r
584    BEGIN\r
585        write("MAIN : donner le nombre de machines:");\r
586        readln(nombre_machine);\r
587        write("MAIN : donner le nombre de clients:");\r
588        readln(nombre_client);\r
589        write("MAIN : donner la base de temps:");\r
590        readln(base_temps);\r
591        write("MAIN : donner la tempo du main:");\r
592        readln(base_temps2);\r
593 \r
594        fini:=0;\r
595        numero_prioritaire:=1;\r
596        array nbre_client dim(1:nombre_machine);\r
597        array contenu dim(1:nombre_machine);\r
598        array l dim (1:nombre_machine);\r
599        array resultat dim (1:nombre_machine);\r
600        for k:=1 to nombre_machine\r
601        do\r
602          l(k):=new liste;\r
603        od;\r
604 \r
605        for k:=1 to nombre_machine\r
606        do\r
607          resultat(k):=0.0;\r
608          contenu(k):=0;\r
609          nbre_client(k):=0;\r
610        od;\r
611 \r
612        CALL SCHEDULE(NEW GENERATOR,TIME);\r
613 \r
614        while (fini<nombre_machine) \r
615        do\r
616          call hold(base_temps2);\r
617        od;\r
618        moyenne:=0;\r
619        for k:=1 to nombre_machine\r
620        do\r
621          writeln("MAIN: resultat machine numero ",k," = ",resultat(k));\r
622          writeln("MAIN : nombre de client machine numero ",k," = ",\r
623                  nbre_client(k));\r
624          moyenne:=moyenne+resultat(k);\r
625        od;\r
626        writeln("MAIN : le temps d'attente moyen pour laver sa voiture est ",\r
627                 moyenne/nombre_machine);\r
628      end;\r
629    END;\r
630 end bank22;\r
631 \r