program ring; (***************************************************************) unit ecran : process(node: integer); var fin : boolean; unit koniec : procedure; begin fin:= true; end koniec; unit Bold : procedure; begin write( chr(27), "[1m") end Bold; unit Blink : procedure; begin write( chr(27), "[5m") end Blink; unit Reverse : procedure; begin write( chr(27), "[7m") end Reverse; unit Normal : procedure; begin write( chr(27), "[0m") end Normal; unit Underscore : procedure; begin write( chr(27), "[4m") end Underscore; unit inchar : IIuwgraph function : integer; (*podaj nr znaku przeslanego z klawiatury *) var i : integer; begin do i := inkey; if i <> 0 then exit fi; od; result := i; end inchar; unit NewPage : procedure; begin write( chr(27), "[2J") end NewPage; unit SetCursor : procedure(row, column : integer); var c,d,e,f : char, i,j : integer; begin i := row div 10; j := row mod 10; c := chr(48+i); d := chr(48+j); i := column div 10; j := column mod 10; e := chr(48+i); f := chr(48+j); write( chr(27), "[", c, d, ";", e, f, "H") end SetCursor; unit pisz :procedure( co, li,kol, jak: integer); var i: integer; begin for i := 1 to 9000 do i :=i od; call SetCursor(li,kol); case jak when 1 : call Normal; when 2 : call Bold; when 3 : call Reverse; when 4 : call Underscore; esac; write(co); end pisz; var x: integer; begin (* ecran ************************) fin := false; call NewPage; call SetCursor(2,30);call Bold; write( "RING OF PROCESSES "); return; enable inchar; do accept pisz, koniec; if fin then call SetCursor(22,30); call Normal; write("KONIEC"); x := inchar;exit fi; od; end ecran; unit Pr : process(n,nr: integer, booo : boolean, next : Pr, E: ecran); var prive, number, x_pos,w_pos: integer; unit info : procedure(pp:Pr); begin next := pp; end info; unit send : procedure( x,n: integer); begin call E.pisz(x,5+2*nr+1,x_pos,1); x_pos := x_pos+4; prive := x;number :=n; end send; unit work : procedure(output x : integer); begin x := random * 10; call E.pisz(x,5+2*nr,w_pos,3); w_pos := w_pos+4; end work; begin x_pos := 10; w_pos := 10; call E.pisz(nr,5+2*nr,2,2); (* number:= E.inchar; *) return; if booo then accept info; call work(prive); call next.send(prive,nr); fi; do accept send; if prive = 0 then if number<>nr then call next.send(0,number) fi; call E.pisz(0,5+2*nr,x_pos,4); if number=nr then call E.koniec fi; exit fi; call work(prive); call next.send(prive,nr); od; end Pr; var Ar_Pr: arrayof Pr, pp,q : Pr, nb_pr ,i: integer, Ek: ecran; begin (* main program *******************************************) call ranset(5); writeln; write("Nb process = "); readln(nb_pr); array Ar_Pr dim (1:nb_pr); Ek := new ecran(0); resume(Ek); pp := new Pr(0,nb_pr,true,none, Ek); q:=pp; resume(pp); for i :=nb_pr-1 downto 1 do pp := new Pr(0,i,false,pp,Ek); resume(pp); od; call q.info(pp); end ring;