3 (*****************************************************************************)
\r
4 (********************************** F I F O **********************************)
\r
5 (*****************************************************************************)
\r
7 unit FIFO : class ( type T);
\r
9 var HEAD,LAST : ELEM;
\r
11 unit ELEM : class ( INFO : T);
\r
16 unit EMPTY : function : boolean;
\r
18 result := (HEAD=NONE)
\r
21 unit INTO : procedure ( INFO : T );
\r
24 HEAD := new ELEM(INFO);
\r
27 LAST.NEXT := new ELEM(INFO);
\r
32 unit FIRST : function : T;
\r
37 unit OUT_FIRST : procedure;
\r
45 unit CARDINAL : function : integer;
\r
51 result :=result + 1;
\r
59 (*****************************************************************************)
\r
60 (************************** E N D F I F O *******************************)
\r
61 (*****************************************************************************)
\r
65 (*****************************************************************************)
\r
66 (************************* S I M U L A T I O N *******************************)
\r
67 (*****************************************************************************)
\r
69 UNIT PRIORITYQUEUE: IIUWGRAPH CLASS;
\r
71 UNIT QUEUEHEAD: CLASS;
\r
72 (* HEAP ACCESING MODULE *)
\r
75 UNIT MIN: FUNCTION: ELEM;
\r
77 IF ROOT=/= NONE THEN RESULT:=ROOT.EL FI;
\r
80 UNIT INSERT: PROCEDURE(E:ELEM);
\r
81 (* INSERTION INTO HEAP *)
\r
87 ROOT.LEFT,LAST:=ROOT
\r
104 LAST.LEFT.RIGHT:=X;
\r
110 CALL CORRECT(E,FALSE)
\r
113 UNIT DELETE: PROCEDURE(R: ELEM);
\r
120 if y<>none then Y.RIGHT:= LAST else root :=none fi;
\r
130 LAST.NS:= LAST.NS-1;
\r
134 z.left.right := none;
\r
136 z.left, z.right, z.up := none;
\r
137 IF X.LESS(X.UP) THEN CALL CORRECT(X.EL,FALSE)
\r
138 ELSE CALL CORRECT(X.EL,TRUE) FI;
\r
141 UNIT CORRECT: PROCEDURE(R:ELEM,DOWN:BOOLEAN);
\r
142 (* CORRECTION OF THE HEAP WITH STRUCTURE BROKEN BY R *)
\r
143 VAR X,Z:NODE,T:ELEM,FIN,LOG:BOOLEAN;
\r
148 IF Z.NS =0 THEN FIN:=TRUE ELSE
\r
149 IF Z.NS=1 THEN X:=Z.LEFT ELSE
\r
150 IF Z.LEFT.LESS(Z.RIGHT) THEN X:=Z.LEFT ELSE X:=Z.RIGHT
\r
152 IF Z.LESS(X) THEN FIN:=TRUE ELSE
\r
163 IF X=NONE THEN LOG:=TRUE ELSE LOG:=X.LESS(Z); FI;
\r
172 IF X=NONE THEN LOG:=TRUE ELSE LOG:=X.LESS(Z);
\r
181 UNIT NODE: CLASS (EL:ELEM);
\r
182 (* ELEMENT OF THE HEAP *)
\r
183 VAR LEFT,RIGHT,UP: NODE, NS:INTEGER;
\r
184 UNIT LESS: FUNCTION(X:NODE): BOOLEAN;
\r
186 IF X= NONE THEN RESULT:=FALSE
\r
187 ELSE RESULT:=EL.LESS(X.EL) FI;
\r
192 UNIT ELEM: CLASS(PRIOR:REAL);
\r
193 (* PREFIX OF INFORMATION TO BE STORED IN NODE *)
\r
195 UNIT VIRTUAL LESS: FUNCTION(X:ELEM):BOOLEAN;
\r
197 IF X=NONE THEN RESULT:= FALSE ELSE
\r
198 RESULT:= PRIOR< X.PRIOR FI;
\r
201 LAB:= NEW NODE(THIS ELEM);
\r
206 UNIT SIMULATION: PRIORITYQUEUE CLASS;
\r
207 (* THE LANGUAGE FOR SIMULATION PURPOSES *)
\r
210 signal ERROR1, ERROR2;
\r
211 VAR CURR : SIMPROCESS, (* ACTIVE PROCESS *)
\r
212 PQ : QUEUEHEAD, (* THE TIME AXIS *)
\r
213 MAINPR : MAINPROGRAM;
\r
216 UNIT SIMPROCESS: COROUTINE;
\r
217 (* USER PROCESS PREFIX *)
\r
219 VAR EVENT, (* ACTIVATION MOMENT NOTICE *)
\r
220 EVENTAUX: EVENTNOTICE,
\r
221 (* THIS IS FOR AVOIDING MANY NEW CALLS AS AN RESULT OF *)
\r
222 (* SUBSEQUENT PASSIVATIONS AND ACTIVATIONS *)
\r
225 UNIT IDLE: FUNCTION: BOOLEAN;
\r
227 RESULT:= EVENT= NONE
\r
230 UNIT TERMINATED: FUNCTION :BOOLEAN;
\r
235 UNIT EVTIME: FUNCTION: REAL;
\r
236 (* TIME OF ACTIVATION *)
\r
238 IF IDLE THEN raise ERROR1; FI;
\r
239 RESULT:= EVENT.EVENTTIME;
\r
243 WRITELN(" AN ATTEMPT TO ACTIVATE AN IDLE PROCESS TIME");
\r
246 WRITELN(" AN ATTEMPT TO ACTIVATE A TERMINATED PROCESS TIME");
\r
259 UNIT EVENTNOTICE: ELEM CLASS;
\r
260 (* A PROCESS ACTIVATION NOTICE TO BE PLACED ONTO THE TIME AXIS PQ *)
\r
261 VAR EVENTTIME: REAL, PROC: SIMPROCESS;
\r
263 UNIT VIRTUAL LESS: FUNCTION(X: EVENTNOTICE):BOOLEAN;
\r
264 (* OVERWRITE THE FORMER VERSION CONSIDERING EVENTTIME *)
\r
270 RESULT:= EVENTTIME< X.EVENTTIME OR
\r
271 (EVENTTIME=X.EVENTTIME AND PRIOR<= X.PRIOR);
\r
278 UNIT MAINPROGRAM: SIMPROCESS CLASS;
\r
279 (* IMPLEMENTING MASTER PROGRAM AS A PROCESS *)
\r
281 DO ATTACH(MAIN) OD;
\r
284 UNIT TIME:FUNCTION:REAL;
\r
285 (* CURRENT VALUE OF SIMULATION TIME *)
\r
287 RESULT:=CURRENT.EVTIME
\r
290 UNIT CURRENT: FUNCTION: SIMPROCESS;
\r
291 (* THE FIRST PROCESS ON THE TIME AXIS *)
\r
296 UNIT SCHEDULE: PROCEDURE(P:SIMPROCESS,T:REAL);
\r
297 (* ACTIVATION OF PROCESS P AT TIME T AND DEFINITION OF *)
\r
298 (* "PRIOR"- PRIORITY WITHIN TIME MOMENT T *)
\r
301 if p.terminated then raise ERROR2 fi;
\r
303 IF T<TIME THEN T:= TIME FI;
\r
304 IF P=CURRENT THEN CALL HOLD(T-TIME) ELSE
\r
305 IF P.IDLE AND P.EVENTAUX=NONE THEN (* HAS NOT BEEN SCHEDULED YET*)
\r
306 P.EVENT,P.EVENTAUX:= NEW EVENTNOTICE(RANDOM);
\r
309 IF P.IDLE (* P HAS ALREADY BEEN SCHEDULED *) THEN
\r
310 P.EVENT:= P.EVENTAUX;
\r
311 P.EVENT.PRIOR:=RANDOM;
\r
313 (* NEW SCHEDULING *)
\r
314 P.EVENT.PRIOR:=RANDOM;
\r
315 CALL PQ.DELETE(P.EVENT)
\r
318 P.EVENT.EVENTTIME:= T;
\r
319 CALL PQ.INSERT(P.EVENT) FI;
\r
322 UNIT HOLD:PROCEDURE(T:REAL);
\r
323 (* MOVE THE ACTIVE PROCESS T MINUTES BACK ALONG PQ *)
\r
324 (* REDEFINE PRIOR *)
\r
326 CALL PQ.DELETE(CURRENT.EVENT);
\r
327 CURRENT.EVENT.PRIOR:=RANDOM;
\r
328 IF T<0 THEN T:=0; FI;
\r
329 CURRENT.EVENT.EVENTTIME:=TIME+T;
\r
330 CALL PQ.INSERT(CURRENT.EVENT);
\r
331 CALL CHOICEPROCESS;
\r
334 UNIT PASSIVATE: PROCEDURE;
\r
335 (* REMOVE THE ACTVE PROCESS FROM PQ AND ACTIVATE THE NEXT ONE *)
\r
337 CALL PQ.DELETE(CURRENT.EVENT);
\r
338 CURRENT.EVENT:=NONE;
\r
342 UNIT RUN: PROCEDURE(P:SIMPROCESS);
\r
343 (* ACTIVATE P IMMEDIATELY AND DELAY THE current PROCESS BY REDEFINING*)
\r
346 CURRENT.EVENT.PRIOR:=RANDOM;
\r
349 P.EVENT.EVENTTIME:=TIME;
\r
350 CALL PQ.CORRECT(P.EVENT,FALSE)
\r
352 IF P.EVENTAUX=NONE THEN
\r
353 P.EVENT,P.EVENTAUX:=NEW EVENTNOTICE(0);
\r
355 P.EVENT:=P.EVENTAUX;
\r
358 P.EVENT.EVENTTIME:=TIME;
\r
360 CALL PQ.INSERT(P.EVENT);
\r
362 CALL CHOICEPROCESS;
\r
365 UNIT CANCEL:PROCEDURE(P: SIMPROCESS);
\r
366 (* REMOVE PROCESS P FROM PQ AND CONTINUE SIMULATION *)
\r
368 IF P= CURRENT THEN CALL PASSIVATE ELSE
\r
369 CALL PQ.DELETE(P.EVENT);
\r
373 UNIT CHOICEPROCESS:PROCEDURE;
\r
374 (* CHOOSE THE FIRST PROCESS FROM PQ TO BE ACTIVATED *)
\r
376 (**** poprawka 10-93 ****)
\r
377 CURR:= PQ.MIN QUA EVENTNOTICE.PROC;
\r
378 IF CURR=NONE THEN WRITE(" ERROR IN THE HEAP"); WRITELN;
\r
380 ELSE ATTACH(CURR); FI;
\r
384 PQ:=NEW QUEUEHEAD; (* SIMULATION TIME AXIS*)
\r
385 CURR,MAINPR:=NEW MAINPROGRAM;
\r
386 MAINPR.EVENT,MAINPR.EVENTAUX:=NEW EVENTNOTICE(0);
\r
387 MAINPR.EVENT.EVENTTIME:=0;
\r
388 MAINPR.EVENT.PROC:=MAINPR;
\r
389 CALL PQ.INSERT(MAINPR.EVENT);
\r
390 (* THE FIRST PROCESS TO BE ACTIVATED IS MAIN PROGRAM *)
\r
395 (*****************************************************************************)
\r
396 (************************ E N D S I M U L A T I O N *********************)
\r
397 (*****************************************************************************)
\r
400 (* B U S S I M U L A T I O N *)
\r
402 pref iiuwgraph block
\r
405 PREF SIMULATION BLOCK
\r
406 const pojemnosc=30;
\r
408 autobusy:arrayof bus,
\r
409 przystan:arrayof przystanek,
\r
414 i,j,jj,p,czas_sym,czas,ilosc_przystankow,
\r
415 ilosc_auto,czestosc,odstep1,odstep2,podst1,podst2:integer;
\r
417 unit wsp:class(x,y,i:integer);
\r
421 unit nast:function(w:wsp):wsp;
\r
424 if w.i <= ilosc_przystankow div 2
\r
426 pom:=new wsp(w.x,w.y - odstep1,i mod ilosc_przystankow +1)
\r
430 pom:=new wsp(600-w.x,20,i mod ilosc_przystankow+1)
\r
432 pom:=new wsp(w.x,w.y+odstep1,i mod ilosc_przystankow+1)
\r
438 unit bus:simprocess class(kolor:integer);
\r
440 wolnych_miejsc : integer,
\r
441 dokad : arrayof integer,
\r
443 wsiadajacy:pasazer;
\r
445 array dokad dim (1: ilosc_przystankow);
\r
446 wolnych_miejsc := pojemnosc;
\r
449 ws := new wsp(480,282,1);
\r
450 call auto(kolor,ws.x,ws.y,wolnych_miejsc);
\r
453 i:= entier(random*10);
\r
456 (* dojazd do pierwszego przystanku *)
\r
457 while ws.y>przystan(i).ws.y
\r
459 call auto(kolor,ws.x,ws.y,wolnych_miejsc);
\r
460 call auto(0 ,ws.x,ws.y,wolnych_miejsc);
\r
465 do (* petla w ktorej pracuje autobus *)
\r
467 ws.y:=przystan(i).ws.y;
\r
469 if i <= ilosc_przystankow div 2
\r
471 kier:=1; ws.x := 480 else kier := -1; ws.x :=420;
\r
474 call auto(kolor,ws.x+kier*10,ws.y,wolnych_miejsc);
\r
476 (* autobus jest na przystanku *)
\r
478 wolnych_miejsc:=wolnych_miejsc + dokad(i);
\r
479 (* z autobusu wysiadlo dokad(i) pasazerow *)
\r
480 call auto(kolor,ws.x+kier*10,ws.y,wolnych_miejsc);
\r
484 (*** teraz pasazerowie wsiadaja ***)
\r
485 while (wolnych_miejsc > 0) and (not przystan(i).kolejka.empty)
\r
487 wsiadajacy:=przystan(i).kolejka.first;
\r
488 dokad(wsiadajacy.dokad) := dokad(wsiadajacy.dokad) +1;
\r
489 call usun(przystan(i).ws.x,przystan(i).ws.y,
\r
490 kier*przystan(i).kolejka.cardinal);
\r
491 call przystan(i).kolejka.out_first;
\r
492 wolnych_miejsc:=wolnych_miejsc - 1;
\r
494 call auto(0,ws.x+kier*10,ws.y,wolnych_miejsc);
\r
495 call auto(kolor,ws.x+kier*10,ws.y,wolnych_miejsc);
\r
497 call run(wsiadajacy);
\r
502 (* autobus rusza z przystanku *)
\r
503 call auto(0,ws.x+kier*10,ws.y,wolnych_miejsc);
\r
504 if i= ilosc_przystankow div 2
\r
508 call auto(kolor,ws.x,ws.y,wolnych_miejsc);
\r
510 call auto(0,ws.x,ws.y,wolnych_miejsc);
\r
513 ws.x := 420; (*autobus przeskakuje na druga strone ulicy*)
\r
517 if i=ilosc_przystankow then
\r
520 call auto(kolor,ws.x,ws.y,wolnych_miejsc);
\r
522 call auto(0,ws.x,ws.y,wolnych_miejsc);
\r
525 ws.x := 480; (*autobus przeskakuje na druga strone ulicy*)
\r
530 if i<ilosc_przystankow div 2
\r
532 while ws.y>przystan(i+1).ws.y
\r
534 call auto(kolor,ws.x,ws.y,wolnych_miejsc);
\r
536 call auto(0,ws.x,ws.y,wolnych_miejsc);
\r
537 ws.y := ws.y-kier*2;
\r
541 while ws.y< przystan(i+1).ws.y
\r
543 call auto(kolor,ws.x,ws.y,wolnych_miejsc);
\r
545 call auto(0,ws.x,ws.y,wolnych_miejsc);
\r
546 ws.y := ws.y-kier*2;
\r
550 i:=i mod ilosc_przystankow + 1;
\r
554 unit pasazer:simprocess class(nr,kolor:integer);
\r
555 var czas_przyjscia,czas_oczekiwania:integer,
\r
558 dokad := 1+entier(random*(ilosc_przystankow-1));
\r
559 czas_przyjscia:=time;
\r
561 czas_oczekiwania:=time-czas_przyjscia;
\r
562 przystan(nr).laczny_czas:=przystan(nr).laczny_czas +
\r
564 przystan(nr).sredniczas:=przystan(nr).laczny_czas /
\r
569 unit przystanek:simprocess class(nr:integer);
\r
570 var k , jak_czesto : integer;
\r
575 kier,ilosc_pas,total,laczny_czas,czas_do_nast:integer,
\r
578 kolejka:=new FIFO(pasazer);
\r
580 (*to powinno byc zalezne od szybkosci autobusu*)
\r
581 (* i odleglosci miedzy przystankami*)
\r
583 if nr<=ilosc_przystankow div 2 then
\r
584 ws:=new wsp(510,290-podst1-(nr-1)*odstep1,nr)
\r
586 ws:=new wsp(390,podst2+(nr-ilosc_przystankow div 2-1)*odstep2,nr)
\r
590 call move(ws.x-15,ws.y+10)
\r
592 call move(ws.x,ws.y+10)
\r
599 call hold(20);(* jak_czesto sa losowani pasazerowie *)
\r
600 if nr<= ilosc_przystankow div 2
\r
601 then kier :=1 else kier :=-1 fi;
\r
602 k:= entier(random*12)+2; (*kolor pasazera*)
\r
603 new_pas:=new pasazer(nr,k);
\r
605 call kolejka.into(new_pas);
\r
606 call kol(ws.x,ws.y,kier*kolejka.cardinal,k);
\r
607 call schedule(new_pas,time);
\r
613 (*------------------------------------------------------------------------*)
\r
614 (*-------------------- PROCEDURY POMOCNICZE ----------------------------*)
\r
615 (*------------------------------------------------------------------------*)
\r
617 unit ludzik:procedure(x,y,k :integer);
\r
622 call draw(x-2,y+10);
\r
624 call draw(x+2,y+10);
\r
625 call move(x-2,y+2);
\r
626 call draw(x+2,y+2);
\r
627 call move(x-2,y+2);
\r
628 call draw(x-4,y+4);
\r
629 call move(x+2,y+2);
\r
630 call draw(x+4,y+4);
\r
635 unit usun:procedure(x,y,m:integer);
\r
641 call ludzik(x+8*m,y,0);
\r
646 unit kol:procedure(x,y,m,k:integer);
\r
651 call ludzik(x+8*m,y,k)
\r
656 unit wypisz : procedure(x:integer);
\r
657 unit CHRTYP :function ( x:integer):string;
\r
658 (* zamiana liczby na tekst *)
\r
661 when 1 : result:="1";
\r
662 when 2 : result:="2";
\r
663 when 3 : result:="3";
\r
664 when 4 : result:="4";
\r
665 when 5 : result:="5";
\r
666 when 6 : result:="6";
\r
667 when 7 : result:="7";
\r
668 when 8 : result:="8";
\r
669 when 9 : result:="9";
\r
670 when 0 : result:="0"
\r
675 if x<0 then call outstring("ujemna liczba")
\r
677 call outstring(chrtyp(x div 10));
\r
678 call outstring(chrtyp(x mod 10))
\r
683 unit zegar:simprocess class;
\r
687 call ramka(420,310,480,335);
\r
688 call ramka(422,312,478,333);
\r
689 call ramka(421,311,479,334);
\r
693 call move(433,320);
\r
695 call outstring(":");
\r
698 if j=60 then j:=0;i:=i+1 fi;
\r
704 unit info:simprocess class;
\r
708 call ramka(0,0,324,140+10*ilosc_przystankow);
\r
709 call ramka(1,1,326,141+10*ilosc_przystankow);
\r
712 call outstring("Max. nb. of persons in the bus:");
\r
713 call outstring("30 os.");
\r
715 call outstring("Time przejazdu miedzy");
\r
717 call outstring("przystankami:");
\r
718 call outstring(" 3 min.");
\r
720 call outstring("The time of Simulation:");
\r
721 if czas_sym div 60=/=0
\r
723 call wypisz(czas_sym div 60);
\r
724 call outstring(" h. ")
\r
726 call wypisz(czas_sym mod 60);
\r
727 call outstring(" min.");
\r
729 call outstring("Frequency :");
\r
730 call wypisz(czestosc);
\r
731 call outstring(" min.");
\r
732 call move(200,100);
\r
733 call outstring("Avrage ");
\r
734 call move(200,110);
\r
735 call outstring("waiting-time:");
\r
737 call outstring("BUS");
\r
739 call outstring("STOP");
\r
740 call outstring(" ");
\r
742 call outstring("Number");
\r
744 call outstring("of persons");
\r
746 call ramka(530,5,610,20);
\r
748 call outstring("Esc - END");
\r
751 if inkey=27 then call run(mainpr) fi;
\r
753 for i:=1 to ilosc_przystankow
\r
755 call move(30,120+i*10);
\r
757 call outstring(" ");
\r
758 call move(90,120+i*10);
\r
759 call wypisz(przystan(i).kolejka.cardinal);
\r
760 call outstring(" ");
\r
761 call move(200,120+i*10);
\r
762 call wypisz(entier(przystan(i).sredniczas));
\r
763 call outstring(".");
\r
764 call wypisz(entier(przystan(i).sredniczas*10) mod 10);
\r
765 call outstring(" min. ")
\r
773 unit ramka : procedure(x1,y1,x2,y2:integer);
\r
783 unit pr:procedure(x,y,dx,dy:integer);
\r
785 call ramka(x-dx div 2,y-dy div 2,x+dx div 2,y+dy div 2)
\r
788 unit auto:procedure(k,x,y,n:integer);
\r
789 begin (* ilosc miejsc wolnych w aucie *)
\r
792 call pr(x,y,10,20);
\r
794 call wypisz(n); (* ilosc pasazerow w autobusie *)
\r
799 unit zabij_pas:procedure(i:integer);
\r
802 while przystan(i).kolejka.cardinal>0
\r
804 p:=przystan(i).kolejka.first;
\r
805 call przystan(i).kolejka.out_first;
\r
806 if p.event=/=none then call cancel(p) fi;
\r
811 unit wstep:procedure;
\r
814 call ramka(230,120,480,220);
\r
815 call ramka(228,118,482,222);
\r
816 call ramka(226,116,484,224);
\r
817 call move(250,140);
\r
818 call outstring(" PROJET 6 ");
\r
819 call move(250,160);
\r
820 call outstring(" BUS SIMULATION ");
\r
821 call move(250,180);
\r
822 call outstring("Author: Nguyen Tuan Trung");
\r
823 call move(250,200);
\r
824 call outstring(" Warsaw 24 - 05 - 1990");
\r
825 WHILE INKEY=0 DO OD;
\r
829 (*----------- PROGRAM GLOWNY---------------------------------------------*)
\r
834 do (* to repeat simulation *)
\r
837 write("Simulation time = ");
\r
841 else writeln(" The simulation time must be >0 ")
\r
845 write("Number of bus-stops (1-20) = ");
\r
846 readln(ilosc_przystankow);
\r
847 if ilosc_przystankow>1 and ilosc_przystankow < 21 then exit
\r
848 else writeln("It must be not bigger than 20!")
\r
852 write("Number of buses (>0) = ");
\r
853 readln(ilosc_auto);
\r
854 if ilosc_auto>0 then
\r
857 writeln("Must be bigger than 0 !")
\r
861 write("Frequency of buses (>10) = ");
\r
863 if czestosc>=10 then exit
\r
865 writeln("Must be bigger than 9 !")
\r
870 call color(2); (* ta ramka odpowiada jezdni *)
\r
871 call ramka(400,3,502,300);
\r
872 call ramka(399,2,503,301);
\r
873 call ramka(398,1,504,302);
\r
874 call ramka(395,0,507,305);
\r
876 odstep1:=290 div (ilosc_przystankow div 2 + 1);
\r
877 podst1:=(290- (ilosc_przystankow div 2-1)*odstep1) div 2;
\r
878 odstep2:=290 div (ilosc_przystankow -
\r
879 ilosc_przystankow div 2 + 1);
\r
880 podst2:=(290- (ilosc_przystankow-
\r
881 ilosc_przystankow div 2-1)*odstep2) div 2;
\r
885 (* rysowanie pasa srodkowego jezdni *)
\r
887 call ramka(448,300-i*40,452,320-i*40);
\r
888 call ramka(449,300-i*40,451,320-i*40);
\r
889 call ramka(450,300-i*40,450,320-i*40);
\r
894 array przystan dim(1:ilosc_przystankow);
\r
895 for i:=1 to ilosc_przystankow
\r
897 przystan(i):=new przystanek(i);
\r
898 call schedule(przystan(i),time)
\r
900 array autobusy dim(1:ilosc_auto);
\r
901 for i:=1 to ilosc_auto
\r
903 j:= entier(random*5)+2; (*kolor autobusu*)
\r
904 autobusy(i):=new bus(j) ;
\r
905 call schedule(autobusy(i),time+(i-1)*czestosc+0.6)
\r
908 call schedule(cl,time);
\r
910 call schedule(inf,time+0.5);
\r
911 call hold(czas_sym+0.7);
\r
913 (* dlaczgo to mi sie wykonuje tak rzadko ????? *)
\r
915 call ramka(520,290,620,345);
\r
916 call ramka(521,291,619,344);
\r
917 call move(530,300);
\r
919 call outstring("TIME IS OUT");
\r
920 call move(530,320);
\r
921 call outstring("GO ON(y/n)?");
\r
923 while i=0 do i:=inkey od;
\r
927 call move(530,320);
\r
928 call outstring("add: ");
\r
929 call move(565,320);
\r
934 while ( not( i>=ord('0') and i<=ord('9')) and i=0)
\r
937 jj := 10*jj+ (i-ord('0'));
\r
940 call outstring(" min");
\r
941 fi; (******************************????*)
\r
942 for j:=1 to 2000 do od;
\r
944 call ramka(520,290,620,345);
\r
945 call ramka(521,291,619,344);
\r
947 call move(530,300);
\r
948 call outstring(" ");
\r
949 call move(530,320);
\r
950 call outstring(" ");
\r
952 czas_sym:=czas_sym+czas;
\r
955 call outstring(" ");
\r
957 call outstring("Czas symulacji:");
\r
958 if czas_sym div 60<>0
\r
960 call wypisz(czas_sym div 60);
\r
961 call outstring(" godz. ")
\r
963 if czas_sym mod 60 <>0 then
\r
964 call wypisz(czas_sym mod 60);
\r
965 call outstring(" min.");
\r
970 for i:=1 to ilosc_auto
\r
972 call cancel(autobusy(i));
\r
975 for i:=1 to ilosc_przystankow
\r
978 call cancel(przystan(i));
\r
988 write("Do you like to repeat the simulation process (y/n) ?");
\r
990 if c<> 'y' then exit fi ;
\r