3 (********************************************************)
\r
4 (* procedure qui efface l'
\82cran *)
\r
5 (********************************************************)
\r
6 UNIT NewPage : procedure;
\r
8 write( chr(27), "[2J");
\r
12 (********************************************************)
\r
13 (* Processus gerant l'
\82cran pour chaque philosophe *)
\r
14 (********************************************************)
\r
15 UNIT ecran : iiuwgraph process (n : integer);
\r
17 var compteur : integer,
\r
18 xf, yf, xa, ya, ra, r, i : integer,
\r
21 (********************************************************)
\r
22 (* procedure qui dessine une fourchette
\85 l'
\82cran *)
\r
23 (********************************************************)
\r
24 UNIT fourchette : procedure(num_phi, o, couleur : integer);
\r
25 var r1, r2, r3, r4, x, y : integer,
\r
28 call color(couleur);
\r
33 angle := (num_phi * 2 + o) * PI/5;
\r
34 x := round((rt-50) *cos(angle) + xt);
\r
35 y := round((rt-50) *sin(angle) + yt);
\r
37 call draw(round(r1*cos(angle)+x), round(r1*sin(angle)+y));
\r
39 call draw(round(r2*cos(angle+3*PI/4)+x),round(r2*sin(angle+3*PI/4)+y));
\r
41 call draw(round(r3*cos(angle-3*PI/4)+x),round(r3*sin(angle-3*PI/4)+y));
\r
43 call draw(round(r4*cos(angle+PI)+x),round(r4*sin(angle+PI)+y));
\r
48 (********************************************************)
\r
49 (* procedure qui dessine un guardien
\85 l'
\82cran *)
\r
50 (********************************************************)
\r
52 UNIT Guard : procedure(x,y,c:integer);
\r
55 call cirb(x, y, 15, 1, 0, 1, 1, 1, 1);
\r
59 call draw(x-25,y+100);
\r
61 call draw(x+25,y+100);
\r
62 call move(x-25,y+25); call draw(x+25,y+25);
\r
63 call cirb(x+25,y+25,5,0,0,1,1,1,1);
\r
64 call cirb(x-25,y+25,5,0,0,1,1,1,1);
\r
65 call move(x+25,y-20); call draw(x+25,y+95);
\r
68 (********************************************************)
\r
69 (* procedure affichant les bulles dans lesquelles les *)
\r
70 (* philosophes pourront
\82crire leurs actions *)
\r
71 (********************************************************)
\r
72 UNIT bulles : procedure(n : integer);
\r
73 var x1, x2, x3, y1, y2, y3, num, r1, r2, r3 : integer,
\r
77 angle := (2*num+1)*PI/5;
\r
81 x1 := round(r1*cos(angle) + xt);
\r
82 y1 := round(r1*sin(angle) + yt);
\r
83 x2 := round(r2*cos(angle + PI/64) + xt);
\r
84 y2 := round(r2*sin(angle + PI/64) + yt);
\r
85 x3 := round(r3*cos(angle - PI/64) + xt);
\r
86 y3 := round(r3*sin(angle - PI/64) + yt);
\r
87 call cirb(x1, y1, 5, 0, 0, 1, 0, 1, 1);
\r
88 call cirb(x2, y2, 10, 0, 0, 1, 0, 1, 1);
\r
89 call cirb(x3, y3, 35, 0, 0, 1, 0, 1, 1);
\r
92 (********************************************************)
\r
93 (* procedure qui affiche les actions des philosophes *)
\r
94 (********************************************************)
\r
95 UNIT actionp : procedure(n, action : integer);
\r
96 var x1, x2, x3, y1, y2, y3, num, r1, r2, r3, i, j : integer,
\r
100 angle := (2*num+1)*PI/5;
\r
103 x3 := round(r3*cos(angle - PI/64) + xt);
\r
104 y3 := round(r3*sin(angle - PI/64) + yt);
\r
109 when 1: call outstring(" PENSER ");
\r
110 when 2: call outstring(" RENTRER");
\r
111 when 3: call outstring(" MANGER ");
\r
113 when 4: call outstring(" SORTIR ");
\r
114 when 5: call outstring(" ANORMAL");
\r
115 when 6: call outstring("G RENDUE");
\r
116 call fourchette(n,0,14);
\r
119 when 7: call outstring("D RENDUE");
\r
120 call fourchette(n-1,0,14);
\r
123 when 8: call outstring(" PARTIR ");
\r
124 when 9: call outstring("G PRISE ");
\r
125 call fourchette(n ,0,0);
\r
128 when 10: call outstring("D PRISE ");
\r
129 call fourchette(n-1,0,0);
\r
132 when 11: call outstring("G REFUS ");
\r
133 when 12: call outstring("D REFUS ");
\r
138 (*******************************************************)
\r
139 (* procedure affichant un cercle *)
\r
140 (*******************************************************)
\r
141 UNIT cercle : procedure (x,y,r : integer);
\r
142 var xp, yp, xn, yn, i : integer,
\r
143 Dangle, angle : real;
\r
145 Dangle := 2*PI/100;
\r
150 angle := Dangle * i;
\r
151 xn := round((r*cos(angle)) + x);
\r
152 yn := round((r*sin(angle)) + y);
\r
160 unit table: procedure(xt,yt,rt : integer);
\r
162 (* affichage de la table *)
\r
163 call cercle(xt, yt, rt);
\r
164 (* affichage des assiettes *)
\r
167 angle := ( (i*2)+1 ) *PI/5;
\r
169 xa := round ( (r*cos(angle)) + xt);
\r
170 ya := round ( (r*sin(angle)) + yt);
\r
172 call cirb(xa, ya, ra, 0, 0, 1, 1, 1, 1);
\r
175 call hascii (48 + (i-1) div 10);
\r
176 call Hascii (48 + (i+1) mod 10);
\r
181 UNIT finir : procedure;
\r
183 compteur := compteur + 1;
\r
195 accept bulles, fourchette, finir,guard, table,actionp, cercle;
\r
199 (*******************************************************)
\r
200 (* processus philosophe *)
\r
201 (*******************************************************)
\r
202 UNIT philosophe : iiuwgraph process( node, num_phi : integer,
\r
203 gardien : doorman, fourch_g, fourch_d : fork, e : ecran);
\r
204 var i, compt_m : integer,
\r
205 Goccupee, Doccupee : boolean;
\r
207 unit waitt : procedure(n:integer);
\r
210 for j := 1 to n do od;
\r
215 call e.bulles(num_phi);
\r
216 call e.actionp(num_phi, 1);
\r
218 while (compt_m < 3)
\r
220 call gardien.dem_entrer(num_phi);
\r
221 call e.actionp(num_phi, 2);
\r
223 (* tant que le philosophe n'a pas les deux fourchettes *)
\r
224 while ( (not Goccupee) or (not Doccupee) )
\r
226 (* demander
\85 avoir la fourchette de gauche *)
\r
227 if (not Goccupee) then
\r
228 call fourch_g.prendref(Goccupee,num_phi,0);
\r
232 (* demander
\85 avoir la fourchette de droite *)
\r
233 if (not Doccupee) then
\r
234 call fourch_d.prendref(Doccupee,num_phi,1);
\r
238 (* le philosophe a obtenu les 2 fourchettes *)
\r
240 call e.actionp(num_phi, 3);
\r
242 (* le philosophe a fini de manger *)
\r
243 (* il rend la fourchette de gauche *)
\r
244 call fourch_g.rendref(Goccupee,num_phi,0);
\r
247 (* il rend la fourchette de droite *)
\r
248 call fourch_d.rendref(Doccupee, num_phi,1);
\r
251 (* le philosophe demande
\85 sortir de table *)
\r
252 call gardien.sortir(num_phi);
\r
256 compt_m := compt_m + 1;
\r
258 (* le philosophe a mange 5 fois *)
\r
259 (* il part d
\82finitivement *)
\r
260 call e.actionp(num_phi, 8);
\r
265 (*******************************************************)
\r
266 (* processus qui gere les entrees et sorties des *)
\r
268 (*******************************************************)
\r
269 UNIT doorman : iiuwgraph process(node, place_dispo : integer, e : ecran);
\r
271 UNIT dem_entrer : procedure(num : integer);
\r
275 (* il y a des places disponibles
\85 table *)
\r
276 (* le philosophe peut rentrer *)
\r
277 place_dispo := place_dispo - 1;
\r
278 call e.actionp(num, 2);
\r
279 if place_dispo = 0 then
\r
280 (* il n'y a plus de places disponibles *)
\r
281 (* aucun philosophe ne peut entrer *)
\r
282 return disable dem_entrer;
\r
285 call e.actionp(num, 5);
\r
290 UNIT sortir : procedure(num : integer);
\r
292 (* un philosophe sort de la salle *)
\r
293 (* une place est liberee *)
\r
294 place_dispo := place_dispo + 1;
\r
295 call e.actionp(num, 4);
\r
296 return enable dem_entrer;
\r
300 enable dem_entrer, sortir;
\r
305 (*******************************************************)
\r
306 (* processus permettant de prendre et rendre les *)
\r
308 (*******************************************************)
\r
309 UNIT fork : iiuwgraph process (node : integer,e:ecran);
\r
312 UNIT prendref : procedure (output foccupee : boolean;
\r
313 input num,i:integer);
\r
316 then foccupee := true;
\r
319 else foccupee := false;
\r
324 call e.actionp(num, 9);
\r
326 call e.actionp(num, 11);
\r
331 call e.actionp(num, 10);
\r
333 call e.actionp(num, 12);
\r
338 UNIT rendref : procedure (output foccup : boolean;
\r
339 input num:integer,i:integer);
\r
343 if i=0 then call e.actionp(num, 6)
\r
344 else call e.actionp(num,7 ) fi;
\r
349 enable prendref, rendref;
\r
352 accept prendref, rendref;
\r
356 (*******************************************************)
\r
357 (* PROGRAMME PRINCIPAL *)
\r
358 (*******************************************************)
\r
368 ph : arrayof philosophe,
\r
372 BEGIN (********* programme principale ***********)
\r
378 call e.table(xt,yt,rt);
\r
380 (* affichage des fourchettes *)
\r
383 call e.fourchette(i, 0, 14);
\r
385 (* affichage de gardien *)
\r
386 call e.guard(50,250,14);
\r
387 gardien := new doorman(0, 4, e);
\r
388 array ph dim (1:5);
\r
392 f0 := new fork(0,e);
\r
399 ph0 := new philosophe(0, i, gardien, f(i mod 5), f(i-1), e);
\r