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
34 result.a := HEAD.INFO (*!!!!!!!!*)
\r
37 unit OUT_FIRST : procedure;
\r
46 unit CARDINAL : function : integer;
\r
50 while HLP <> NONE do
\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(R:ELEM);
\r
81 (* INSERTION INTO HEAP *)
\r
87 (* root,right usunieto*) ROOT.LEFT,LAST:=ROOT
\r
103 LAST.LEFT.RIGHT:=X;
\r
108 CALL CORRECT(R,FALSE)
\r
111 UNIT DELETE: PROCEDURE(R: ELEM);
\r
118 if y<>none then Y.RIGHT:= LAST else root :=none fi; (**10-93***)
\r
128 LAST.NS:= LAST.NS-1;
\r
131 (**** poprawka 10-93 ******)
\r
132 z.left.right := none;
\r
134 z.left, z.right, z.up := none;
\r
135 IF X.LESS(X.UP) THEN CALL CORRECT(X.EL,FALSE)
\r
136 ELSE CALL CORRECT(X.EL,TRUE) FI;
\r
139 UNIT CORRECT: PROCEDURE(R:ELEM,DOWN:BOOLEAN);
\r
140 (* CORRECTION OF THE HEAP WITH STRUCTURE BROKEN BY R *)
\r
141 VAR X,Z:NODE,T:ELEM,FIN,LOG:BOOLEAN;
\r
146 IF Z.NS =0 THEN FIN:=TRUE ELSE
\r
147 IF Z.NS=1 THEN X:=Z.LEFT ELSE
\r
148 IF Z.LEFT.LESS(Z.RIGHT) THEN X:=Z.LEFT ELSE X:=Z.RIGHT
\r
150 IF Z.LESS(X) THEN FIN:=TRUE ELSE
\r
161 IF X=NONE THEN LOG:=TRUE ELSE LOG:=X.LESS(Z); FI;
\r
170 IF X=NONE THEN LOG:=TRUE ELSE LOG:=X.LESS(Z);
\r
179 UNIT NODE: CLASS (EL:ELEM);
\r
180 (* ELEMENT OF THE HEAP *)
\r
181 VAR LEFT,RIGHT,UP: NODE, NS:INTEGER;
\r
182 UNIT LESS: FUNCTION(X:NODE): BOOLEAN;
\r
184 IF X= NONE THEN RESULT:=FALSE
\r
185 ELSE RESULT:=EL.LESS(X.EL) FI;
\r
190 UNIT ELEM: CLASS(PRIOR:REAL);
\r
191 (* PREFIX OF INFORMATION TO BE STORED IN NODE *)
\r
193 UNIT VIRTUAL LESS: FUNCTION(X:ELEM):BOOLEAN;
\r
195 IF X=NONE THEN RESULT:= FALSE ELSE
\r
196 RESULT:= PRIOR< X.PRIOR FI;
\r
199 LAB:= NEW NODE(THIS ELEM);
\r
207 UNIT SIMULATION: PRIORITYQUEUE CLASS;
\r
208 (* THE LANGUAGE FOR SIMULATION PURPOSES *)
\r
209 (**** poprawka 10-93 *********)
\r
210 hidden Mmainpr, curr, pq;
\r
212 VAR CURR: SIMPROCESS, (*ACTIVE PROCESS *)
\r
213 PQ:QUEUEHEAD, (* THE TIME AXIS *)
\r
214 MAINPR: MAINPROGRAM;
\r
218 SIMPROCESS: COROUTINE;
\r
219 (* USER PROCESS PREFIX *)
\r
220 (***** poprawka 10-93 **********)
\r
221 hidden event, eventaux, finish;
\r
223 VAR EVENT, (* ACTIVATION MOMENT NOTICE *)
\r
224 EVENTAUX: EVENTNOTICE,
\r
225 (* THIS IS FOR AVOIDING MANY NEW CALLS AS AN RESULT OF *)
\r
226 (* SUBSEQUENT PASSIVATIONS AND ACTIVATIONS *)
\r
229 UNIT IDLE: FUNCTION: BOOLEAN;
\r
231 RESULT:= EVENT= NONE;
\r
234 UNIT TERMINATED: FUNCTION :BOOLEAN;
\r
239 UNIT EVTIME: FUNCTION: REAL;
\r
240 (* TIME OF ACTIVATION *)
\r
242 IF IDLE THEN raise ERROR1; FI;
\r
243 RESULT:= EVENT.EVENTTIME;
\r
247 WRITELN(" AN ATTEMPT TO ACTIVATE AN IDLE PROCESS TIME");
\r
250 WRITELN(" AN ATTEMPT TO ACTIVATE A TERMINATED PROCESS TIME");
\r
263 UNIT EVENTNOTICE: ELEM CLASS;
\r
264 (* A PROCESS ACTIVATION NOTICE TO BE PLACED ONTO THE TIME AXIS PQ *)
\r
265 VAR EVENTTIME: REAL, PROC: SIMPROCESS;
\r
267 UNIT VIRTUAL LESS: FUNCTION(X: EVENTNOTICE):BOOLEAN;
\r
268 (* OVERWRITE THE FORMER VERSION CONSIDERING EVENTTIME *)
\r
270 IF X=NONE THEN RESULT:= FALSE ELSE
\r
271 RESULT:= EVENTTIME< X.EVENTTIME OR
\r
272 (EVENTTIME=X.EVENTTIME AND PRIOR<= X.PRIOR); FI;
\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 "PRIOR"- PRIORITY *)
\r
298 (* WITHIN TIME MOMENT T *)
\r
300 (*** poprawka 10-93 *****)
\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
317 P.EVENT.EVENTTIME:= T;
\r
318 CALL PQ.INSERT(P.EVENT) FI;
\r
321 UNIT HOLD:PROCEDURE(T:REAL);
\r
322 (* MOVE THE ACTIVE PROCESS T MINUTES BACK ALONG PQ *)
\r
323 (* REDEFINE PRIOR *)
\r
325 CALL PQ.DELETE(CURRENT.EVENT);
\r
326 CURRENT.EVENT.PRIOR:=RANDOM;
\r
327 IF T<0 THEN T:=0; FI;
\r
328 CURRENT.EVENT.EVENTTIME:=TIME+T;
\r
329 CALL PQ.INSERT(CURRENT.EVENT);
\r
330 CALL CHOICEPROCESS;
\r
333 UNIT PASSIVATE: PROCEDURE;
\r
334 (* REMOVE THE ACTVE PROCESS FROM PQ AND ACTIVATE THE NEXT ONE *)
\r
336 CALL PQ.DELETE(CURRENT.EVENT);
\r
337 CURRENT.EVENT:=NONE;
\r
341 UNIT RUN: PROCEDURE(P:SIMPROCESS);
\r
342 (* ACTIVATE P IMMEDIATELY AND DELAY THE current PROCESS BY REDEFINING*)
\r
345 CURRENT.EVENT.PRIOR:=RANDOM;
\r
348 P.EVENT.EVENTTIME:=TIME;
\r
349 CALL PQ.CORRECT(P.EVENT,FALSE)
\r
351 IF P.EVENTAUX=NONE THEN
\r
352 P.EVENT,P.EVENTAUX:=NEW EVENTNOTICE(0);
\r
354 P.EVENT:=P.EVENTAUX;
\r
357 P.EVENT.EVENTTIME:=TIME;
\r
359 CALL PQ.INSERT(P.EVENT);
\r
361 CALL CHOICEPROCESS;
\r
364 UNIT CANCEL:PROCEDURE(P: SIMPROCESS);
\r
365 (* REMOVE PROCESS P FROM PQ AND CONTINUE SIMULATION *)
\r
367 IF P= CURRENT THEN CALL PASSIVATE ELSE
\r
368 CALL PQ.DELETE(P.EVENT);
\r
372 UNIT CHOICEPROCESS:PROCEDURE;
\r
373 (* CHOOSE THE FIRST PROCESS FROM PQ TO BE ACTIVATED *)
\r
375 (**** poprawka 10-93 ****)
\r
376 CURR:= PQ.MIN QUA EVENTNOTICE.PROC;
\r
377 IF CURR=NONE THEN WRITE(" ERROR IN THE HEAP"); WRITELN;
\r
379 ELSE ATTACH(CURR); FI;
\r
383 PQ:=NEW QUEUEHEAD; (* SIMULATION TIME AXIS*)
\r
384 CURR,MAINPR:=NEW MAINPROGRAM;
\r
385 MAINPR.EVENT,MAINPR.EVENTAUX:=NEW EVENTNOTICE(0);
\r
386 MAINPR.EVENT.EVENTTIME:=0;
\r
387 MAINPR.EVENT.PROC:=MAINPR;
\r
388 CALL PQ.INSERT(MAINPR.EVENT);
\r
389 (* THE FIRST PROCESS TO BE ACTIVATED IS MAIN PROGRAM *)
\r
394 (*****************************************************************************)
\r
395 (************************ E N D S I M U L A T I O N *********************)
\r
396 (*****************************************************************************)
\r
401 pref iiuwgraph block
\r
404 PREF SIMULATION BLOCK
\r
405 const pojemnosc=30;
\r
407 autobusy:arrayof bus,
\r
408 przystan:arrayof przystanek,
\r
413 i,j,p,czas_sym,czas,ilosc_przystankow,
\r
414 ilosc_auto,czestosc,odstep1,odstep2,podst1,podst2:integer;
\r
416 unit wsp:class(x,y,i:integer);
\r
420 unit nast:function(w:wsp):wsp;
\r
423 if w.i <= ilosc_przystankow div 2
\r
425 pom:=new wsp(w.x,w.y - odstep1,i mod ilosc_przystankow +1)
\r
429 pom:=new wsp(600-w.x,20,i mod ilosc_przystankow+1)
\r
431 pom:=new wsp(w.x,w.y+odstep1,i mod ilosc_przystankow+1)
\r
437 unit bus:simprocess class;
\r
438 var i,j,kier,wolnych_miejsc:integer,
\r
440 wsiadajacy:pasazer;
\r
442 wolnych_miejsc:=pojemnosc;
\r
445 ws:=new wsp(480,320-odstep1,1);
\r
447 if przystan(i).ws.x=510
\r
451 ws.y:=przystan(i).ws.y;
\r
453 call ruch(ws,true) ;
\r
455 wolnych_miejsc:=wolnych_miejsc +
\r
456 entier(random*(pojemnosc-wolnych_miejsc)*exp(i / pojemnosc));
\r
457 if wolnych_miejsc>pojemnosc then wolnych_miejsc:=pojemnosc fi;
\r
458 while (wolnych_miejsc > 0) and (not przystan(i).kolejka.empty)
\r
460 wsiadajacy:=przystan(i).kolejka.first;
\r
461 if (ilosc_przystankow div 2-i)>=0 then kier:=1
\r
464 call usun(przystan(i).ws.x,przystan(i).ws.y,
\r
465 kier*przystan(i).kolejka.cardinal);
\r
466 call przystan(i).kolejka.out_first;
\r
467 wolnych_miejsc:=wolnych_miejsc - 1;
\r
468 call run(wsiadajacy);
\r
472 call ruch(ws,false);
\r
473 call hold(przystan(i).czas_do_nast);
\r
474 i:=i mod ilosc_przystankow + 1;
\r
478 unit pasazer:simprocess class(nr:integer);
\r
479 var czas_przyjscia,czas_oczekiwania:integer;
\r
481 czas_przyjscia:=time;
\r
483 czas_oczekiwania:=time-czas_przyjscia;
\r
484 przystan(nr).laczny_czas:=przystan(nr).laczny_czas +
\r
486 przystan(nr).sredniczas:=przystan(nr).laczny_czas /
\r
491 unit przystanek:simprocess class(nr:integer);
\r
496 kier,ilosc_pas,total,laczny_czas,czas_do_nast:integer,
\r
499 kolejka:=new FIFO(pasazer);
\r
501 if nr<=ilosc_przystankow div 2 then
\r
503 ws:=new wsp(510,290-podst1-(nr-1)*odstep1,nr)
\r
506 ws:=new wsp(390,podst2+(nr-ilosc_przystankow div 2-1)*odstep2,nr)
\r
508 if ws.x>450 then call move(ws.x-15,ws.y+10)
\r
509 else call move(ws.x,ws.y+10) fi;
\r
511 call hold(3*ilosc_przystankow);
\r
513 call hold(2*abs(nr-ilosc_przystankow div 2)+1);
\r
514 new_pas:=new pasazer(nr);
\r
516 call kolejka.into(new_pas);
\r
517 if (ilosc_przystankow div 2-nr)>=0 then kier:=1
\r
520 call kol(ws.x,ws.y,kier*kolejka.cardinal);
\r
521 call schedule(new_pas,time);
\r
526 (*------------------------------------------------------------------------*)
\r
527 (*-------------------- PROCEDURY POMOCNICZE ----------------------------*)
\r
528 (*------------------------------------------------------------------------*)
\r
530 unit ludzik:procedure(x,y:integer);
\r
534 call draw(x-2,y+10);
\r
536 call draw(x+2,y+10);
\r
537 call move(x-2,y+2);
\r
538 call draw(x+2,y+2);
\r
539 call move(x-2,y+2);
\r
540 call draw(x-4,y+4);
\r
541 call move(x+2,y+2);
\r
546 unit usun:procedure(x,y,m:integer);
\r
552 call ludzik(x+8*m,y);
\r
557 unit kol:procedure(x,y,m:integer);
\r
562 call ludzik(x+8*m,y)
\r
567 unit wypisz:iiuwgraph procedure(x:integer);
\r
568 unit CHRTYP :function ( x:integer):string;
\r
569 (* zamiana liczby na tekst *)
\r
572 when 1 : result:="1";
\r
573 when 2 : result:="2";
\r
574 when 3 : result:="3";
\r
575 when 4 : result:="4";
\r
576 when 5 : result:="5";
\r
577 when 6 : result:="6";
\r
578 when 7 : result:="7";
\r
579 when 8 : result:="8";
\r
580 when 9 : result:="9";
\r
581 when 0 : result:="0"
\r
585 if x<0 then call outstring("ujemna liczba")
\r
587 call outstring(chrtyp(x div 10));
\r
588 call outstring(chrtyp(x mod 10))
\r
593 unit zegar:simprocess class;
\r
597 call ramka(420,310,480,335);
\r
598 call ramka(422,312,478,333);
\r
599 call ramka(421,311,479,334);
\r
600 call move(433,320);
\r
602 call outstring(":");
\r
605 if j=60 then j:=0;i:=i+1 fi;
\r
611 unit info:simprocess class;
\r
614 call ramka(0,0,280,140+10*ilosc_przystankow);
\r
615 call ramka(1,1,281,141+10*ilosc_przystankow);
\r
617 call outstring("Pojemnosc wozu:");
\r
618 call outstring("30 os.");
\r
620 call outstring("Czas przejazdu miedzy");
\r
622 call outstring("przystankami:");
\r
623 call outstring(" 3 min.");
\r
625 call outstring("Czas symulacji:");
\r
626 if czas_sym div 60=/=0
\r
628 call wypisz(czas_sym div 60);
\r
629 call outstring(" godz. ")
\r
631 call wypisz(czas_sym mod 60);
\r
632 call outstring(" min.");
\r
634 call outstring("Czestotliwosc kursowania:");
\r
635 call wypisz(czestosc);
\r
636 call outstring(" min.");
\r
637 call move(140,100);
\r
638 call outstring("Sr. czas ");
\r
639 call move(140,110);
\r
640 call outstring("oczekiwania:");
\r
642 call outstring("Przys.");
\r
644 call outstring("nr");
\r
645 call outstring(" ");
\r
647 call outstring("Ilosc");
\r
649 call outstring("ludzi");
\r
650 call ramka(490,5,610,20);
\r
652 call outstring("Esc - koniec.");
\r
654 if inkey=27 then call run(mainpr) fi;
\r
655 for i:=1 to ilosc_przystankow
\r
657 call move(30,120+i*10);
\r
659 call outstring(" ");
\r
660 call wypisz(przystan(i).kolejka.cardinal);
\r
661 call outstring(" ");
\r
662 call wypisz(entier(przystan(i).sredniczas));
\r
663 call outstring(".");
\r
664 call wypisz(entier(przystan(i).sredniczas*10) mod 10);
\r
665 call outstring(" min. ")
\r
673 unit ramka:iiuwgraph procedure(x1,y1,x2,y2:integer);
\r
683 unit pr:procedure(x,y,dx,dy:integer);
\r
685 call ramka(x-dx div 2,y-dy div 2,x+dx div 2,y+dy div 2)
\r
688 unit auto:procedure(x,y:integer);
\r
691 call pr(x,y,10,20);
\r
696 unit ruch:procedure(ws:wsp,jak:boolean);
\r
701 if praz andif ws.i=1 then call auto(ws.x+10,ws.y) fi;
\r
702 if ws.i>1 andif ws.i<=ilosc_przystankow div 2
\r
705 call auto(ws.x,ws.y+odstep1-odstep1 div 2);
\r
706 for j:=0 to odstep1-odstep1 div 2
\r
709 call auto(ws.x,ws.y+odstep1-odstep1 div 2-j);
\r
711 call auto(ws.x,ws.y+odstep1-odstep1 div 2-j);
\r
714 call auto(ws.x+10,ws.y);
\r
716 if ws.i=ilosc_przystankow div 2 +1
\r
719 call auto(480,290-podst1-(ws.i-2)*odstep1-odstep1 div 2);
\r
721 call auto(ws.x-10,ws.y);
\r
723 if ws.i=1 andif (not praz)
\r
726 call auto(420,(ilosc_przystankow-ilosc_przystankow div 2-1)*
\r
727 odstep2 + podst2 + odstep2 div 2);
\r
729 call auto(ws.x+10,ws.y);
\r
731 if ws.i>ilosc_przystankow div 2
\r
734 call auto(420,ws.y+odstep2 div 2-odstep2);
\r
735 for j:=1 to odstep2-odstep2 div 2
\r
738 call auto(ws.x,ws.y+j-odstep2+odstep2 div 2);
\r
740 call auto(ws.x,ws.y+j-odstep2+odstep2 div 2);
\r
743 call auto(ws.x-10,ws.y);
\r
749 call auto(ws.x,ws.y);*)
\r
754 if ws.i<=ilosc_przystankow div 2
\r
756 call auto(ws.x+10,ws.y)
\r
758 call auto(ws.x-10,ws.y)
\r
760 if ws.i<= ilosc_przystankow div 2
\r
762 for j:=0 to odstep1 div 2
\r
765 call auto(ws.x,ws.y-j);
\r
767 call auto(ws.x,ws.y-j);
\r
770 call auto(ws.x,ws.y-odstep1 div 2);
\r
772 for j:=0 to odstep2 div 2
\r
775 call auto(ws.x,ws.y+j);
\r
777 call auto(ws.x,ws.y+j)
\r
780 call auto(ws.x,ws.y+odstep2 div 2);
\r
786 unit zabij_pas:procedure(i:integer);
\r
789 while przystan(i).kolejka.cardinal>0
\r
791 p:=przystan(i).kolejka.first;
\r
792 call przystan(i).kolejka.out_first;
\r
793 if p.event=/=none then call cancel(p) fi;
\r
798 unit wstep:procedure;
\r
801 call ramka(230,120,480,220);
\r
802 call ramka(228,118,482,222);
\r
803 call ramka(226,116,484,224);
\r
804 call move(250,140);
\r
805 call outstring("Program zaliczeniowy nr 6 ");
\r
806 call move(250,160);
\r
807 call outstring(" Symulacja autobusowa ");
\r
808 call move(250,180);
\r
809 call outstring("Autor: Nguyen Tuan Trung");
\r
810 call move(250,200);
\r
811 call outstring(" Warszawa 24 - 05 - 1990r.");
\r
812 WHILE INKEY=0 DO OD;
\r
816 (*----------- PROGRAM GLOWNY---------------------------------------------*)
\r
823 write("czas symulacji=");
\r
827 else writeln("Musi byc dodatni !")
\r
831 write("ilosc przystankow=");
\r
832 readln(ilosc_przystankow);
\r
833 if ilosc_przystankow>1 and ilosc_przystankow < 21 then exit
\r
834 else writeln("Musi byc wieksza niz 1 i mniejsza niz 20!")
\r
838 write("ilosc autobusow=");
\r
839 readln(ilosc_auto);
\r
840 if ilosc_auto>0 then exit
\r
841 else writeln("Musi byc dodatnia !")
\r
845 write("czestotliwosc=");
\r
847 if czestosc>=10 then exit
\r
848 else writeln("Musi byc niemniejsza niz 10 min. !")
\r
851 ilosc_auto:=entier((3*ilosc_przystankow) / czestosc +0.5) ;
\r
852 if ilosc_auto=0 then ilosc_auto:=1 fi;
\r
854 call ramka(400,3,500,300);
\r
855 call ramka(395,0,505,305);
\r
856 odstep1:=290 div (ilosc_przystankow div 2 + 1);
\r
857 podst1:=(290- (ilosc_przystankow div 2-1)*odstep1) div 2;
\r
858 odstep2:=290 div (ilosc_przystankow -
\r
859 ilosc_przystankow div 2 + 1);
\r
860 podst2:=(290- (ilosc_przystankow-
\r
861 ilosc_przystankow div 2-1)*odstep2) div 2;
\r
864 call ramka(448,300-i*40,452,320-i*40);
\r
865 call ramka(449,300-i*40,451,320-i*40);
\r
866 call ramka(450,300-i*40,450,320-i*40);
\r
869 array autobusy dim(1:ilosc_auto);
\r
870 for i:=1 to ilosc_auto
\r
872 autobusy(i):=new bus ;
\r
873 call schedule(autobusy(i),time+(i-1)*czestosc+0.6)
\r
875 array przystan dim(1:ilosc_przystankow);
\r
876 for i:=1 to ilosc_przystankow
\r
878 przystan(i):=new przystanek(i);
\r
879 call schedule(przystan(i),time)
\r
882 call schedule(cl,time);
\r
884 call schedule(inf,time+0.5);
\r
885 call hold(czas_sym+0.7);
\r
887 call ramka(420,290,615,345);
\r
888 call ramka(421,291,614,344);
\r
889 call move(430,300);
\r
890 call outstring("SYMULACJA ZAKONCZONA");
\r
891 call move(430,320);
\r
892 call outstring("Przedluzac?(t/n)");
\r
894 while i=0 do i:=inkey od;
\r
895 if i=/=ord('t') then exit fi;
\r
896 call move(430,300);
\r
897 call outstring("Przedluzac symulacje");
\r
898 call move(430,320);
\r
899 call outstring(" o: ");
\r
900 call move(460,320);
\r
901 for p:=1 downto 0 do
\r
904 while i=0 do i:=inkey od;
\r
905 if i>=ord('0') andif i<=ord('9') then exit fi
\r
908 czas:=czas+(i-ord('0'))
\r
910 czas:=10*(i-ord('0'))
\r
913 (*call hascii(32);*)
\r
915 call outstring(" min.");
\r
916 for j:=1 to 2000 do od;
\r
918 call ramka(420,290,615,345);
\r
919 call ramka(421,291,614,344);
\r
921 call move(430,300);
\r
922 call outstring(" ");
\r
923 call move(430,320);
\r
924 call outstring(" ");
\r
925 czas_sym:=czas_sym+czas;
\r
927 call outstring("Czas symulacji:");
\r
928 if czas_sym div 60=/=0
\r
930 call wypisz(czas_sym div 60);
\r
931 call outstring(" godz. ")
\r
933 if czas_sym mod 60 =/= 0 then
\r
934 call wypisz(czas_sym mod 60);
\r
935 call outstring(" min.");
\r
936 else call outstring(" ")
\r
941 for i:=1 to ilosc_auto
\r
943 call cancel(autobusy(i));
\r
946 for i:=1 to ilosc_przystankow
\r
949 call cancel(przystan(i));
\r
959 write("Symulowac dalej ?(T/N)");
\r
961 if c=/='t' then exit fi
\r