3 (*----------------------------------------------------------------*)
\r
4 (*----------------------------------------------------------------*)
\r
5 (* PROGRAMME SIMULANT LE PROBLEME *)
\r
6 (* DES PHILOSOPHES ET DES SPAGHETTIS *)
\r
7 (*----------------------------------------------------------------*)
\r
8 (*----------------------------------------------------------------*)
\r
11 UNIT ecran : IIUWGRAPH PROCESS (n:integer);
\r
12 (*--------------------------------------------*)
\r
13 (* - - PROCESSUS SIMULANT L'ECRAN - - *)
\r
14 (*--------------------------------------------*)
\r
17 (*---------------------------------------------------*)
\r
18 (* PROCEDURE permettant d'utiliser le mode GRAPHIQUE *)
\r
19 (*---------------------------------------------------*)
\r
20 UNIT initgraph : PROCEDURE;
\r
25 (*---------------------------------------------------*)
\r
26 (* PROCEDURE permettant de fermer le mode GRAPHIQUE *)
\r
27 (*---------------------------------------------------*)
\r
28 UNIT closegraph : PROCEDURE;
\r
33 (*----------------------------------------------------------------*)
\r
34 (* AFFICHAGE en (x,y) d'un RECTANGLE de longueur l et de hauteur h *)
\r
35 (*-----------------------------------------------------------------*)
\r
36 UNIT rectangle : PROCEDURE(x,y,l,h : INTEGER);
\r
46 (*--------------------------------------------------------------------*)
\r
47 (* ECRITURE d'une CHAINE de caracteres sur l'ecran graphique en (x,y) *)
\r
48 (*--------------------------------------------------------------------*)
\r
49 UNIT ecrit_text : PROCEDURE(xy,x,y : INTEGER;str : string);
\r
50 VAR ch : ARRAYOF CHARACTER,
\r
56 lg := UPPER(ch) - LOWER(ch) + 1;
\r
59 CALL HASCII(ORD(ch(i)));
\r
63 (*---------------------------------*)
\r
64 (* LECTURE d'une touche au clavier *)
\r
65 (*---------------------------------*)
\r
66 UNIT inchar : FUNCTION : INTEGER;
\r
71 IF i =/= 0 THEN EXIT;
\r
79 UNIT finir : PROCEDURE;
\r
85 CALL ecrit_text (12,500,320,"TOUCHE");
\r
87 (* FERMETURE DU MODE GRAPHIQUE *)
\r
96 ACCEPT initgraph,closegraph,rectangle,ecrit_text,inchar,finir;
\r
100 (*-------------------------------------------------------------------------*)
\r
102 UNIT philosophe:PROCESS(node,nr,x,y:integer,gardien:garde,fourl,
\r
103 fourr:fourchette,e:ecran);
\r
104 (*-------------------------------------------------*)
\r
105 (* - - PROCESSUS SIMULANT UN PHILOSOPHE - - *)
\r
106 (*-------------------------------------------------*)
\r
108 var i,fin,car : integer, bol,bor:boolean;
\r
114 (* TANT QUE LE PHILOSOPHE N'EST PAS RENTRE 4 FOIS DANS LA SALLE *)
\r
118 (* 1ER TEMPS IL PENSE *)
\r
119 CALL e.ecrit_text (14,x,y,"PENS");
\r
124 (* 2 EME TEMPS IL DEMANDE AU GARDIEN L'AUTORISATION POUR RENTRER *)
\r
125 CALL gardien.entree;
\r
126 CALL e.ecrit_text (10,x,y,"ENTR");
\r
128 (* 3EME TEMPS IL PREND LA FOURCHETTE DE GAUCHE ET LA CELLE DE DROITE *)
\r
129 WHILE ((NOT bol) OR (NOT bor))
\r
132 CALL fourl.prendre(bol);
\r
133 IF bol THEN CALL e.ecrit_text (11,x,y,"FGAU"); FI;
\r
136 CALL fourr.prendre(bor);
\r
137 IF bor THEN CALL e.ecrit_text (11,x,y,"FDRO"); FI;
\r
141 (* 4EME TEMPS IL MANGE PENDANT UN TEMPS FINI *)
\r
142 CALL e.ecrit_text (12,x,y,"MANG");
\r
148 (* 5EME TEMPS IL DEPOSE LES FOURCHETTES *)
\r
149 CALL fourl.poser(bol);
\r
150 CALL fourr.poser(bor);
\r
151 CALL e.ecrit_text (13,x,y,"LIBE");
\r
153 (* 6EME TEMPS IL SORT DE LA SALLE *)
\r
154 CALL gardien.sortie;
\r
155 CALL e.ecrit_text (14,x,y,"SORT");
\r
159 (* ENFIN IL VA SE COUCHER *)
\r
160 CALL e.ecrit_text (9,x,y,"DORT");
\r
164 (*-------------------------------------------------------------------------*)
\r
166 UNIT garde : PROCESS(node : integer,level : integer);
\r
167 (*-------------------------------------------------*)
\r
168 (* - - PROCESSUS SIMULANT LE GARDIEN - - *)
\r
169 (*-------------------------------------------------*)
\r
170 UNIT entree : PROCEDURE;
\r
171 (*-------------------------------------------*)
\r
172 (* PROCEDURE permettant de gerer les entrees *)
\r
173 (* dans la SALLE A MANGER *)
\r
174 (*-------------------------------------------*)
\r
177 level := level - 1;
\r
179 return DISABLE entree;
\r
184 UNIT sortie : PROCEDURE;
\r
185 (*-------------------------------------------*)
\r
186 (* PROCEDURE permettant de gerer les sorties *)
\r
187 (* de la SALLE A MANGER *)
\r
188 (*-------------------------------------------*)
\r
191 return ENABLE entree;
\r
195 ENABLE entree,sortie;
\r
202 (*-------------------------------------------------------------------------*)
\r
204 UNIT fourchette : PROCESS (node : integer);
\r
205 (*-------------------------------------------------*)
\r
206 (* - - PROCESSUS SIMULANT UNE FOURCHETTE - - *)
\r
207 (*-------------------------------------------------*)
\r
211 UNIT prendre : PROCEDURE (output bo : boolean);
\r
212 (*---------------------------------------------------*)
\r
213 (* PROCEDURE retournant un booleen qui indique si la *)
\r
214 (* fourchette qui est demandee est disponible *)
\r
215 (*---------------------------------------------------*)
\r
225 UNIT poser : PROCEDURE (output b : boolean);
\r
226 (*---------------------------------------------------*)
\r
227 (* PROCEDURE permettant de rendre disponible la *)
\r
229 (*---------------------------------------------------*)
\r
237 ENABLE prendre,poser;
\r
245 (*-------------------------------------------------------------------------*)
\r
249 i,j:integer, (* Variable de travail et Indice de tableau *)
\r
250 gardien : garde, (* Gardien de la salle a manger *)
\r
251 f : arrayof fourchette, (* Tableau des cinq processus fourchettes *)
\r
252 f0:fourchette, (* Variable intermediaire permettant de *)
\r
253 (* remplir le tableau precedent *)
\r
254 ph : arrayof philosophe, (* Tableau des cinq processus philosophe *)
\r
255 ph0:philosophe, (* Variable intermediaire permettant de *)
\r
256 (* remplir le tableau precedent *)
\r
257 e:ecran, (* Variable de type processus ECRAN *)
\r
258 car:integer; (* Variable de travail pour une attente *)
\r
259 (* avant la suite de deroulement du *)
\r
263 (*-------------------------------------------------------------------------*)
\r
267 (* CREATION DU PROCESSUS ECRAN *)
\r
270 (* PROCESSUS ECRAN RENDU ACTIF *)
\r
273 (* OUVERTURE DE L'ENVIRONEMENT GRAPHIQUE *)
\r
276 (* EFFACEMENT DE L'ECRAN *)
\r
279 (* AFFICHAGE DE LA PRESENTATION *)
\r
280 CALL e.rectangle (1,1,635,348);
\r
281 CALL e.rectangle (100,50,435,100);
\r
282 CALL e.ecrit_text (15,160,95,"LES 5 PHILOSOPHES ET LES SPAGHETTIS");
\r
283 CALL e.ecrit_text (15,140,200,"PROGRAMME REALISE PAR CHASTANET STEPHANIE");
\r
284 CALL e.ecrit_text (15,160,300, "<TAPER SUR UNE TOUCHE POUR CONTINUER>");
\r
287 (* AFFICHAGE DE LA SALLE A MANGER ET DE LA DISPOSITION DES PHILOSOPHES *)
\r
289 CALL e.rectangle(1,1,600,348);
\r
290 CALL e.ecrit_text(15,245,15,"LA SALLE A MANGER");
\r
291 CALL e.CIRB(300,170,170,0,0,1,1,1,1);
\r
293 CALL e.cirb(215,90,25,0,0,1,1,1,1);
\r
295 CALL e.ecrit_text(15,160,70,"1");
\r
297 CALL e.cirb(165,200,25,0,0,1,1,1,1);
\r
299 CALL e.ecrit_text(15,110,200,"2");
\r
301 CALL e.cirb(390,90,25,0,0,1,1,1,1);
\r
303 CALL e.ecrit_text(15,430,70,"5");
\r
305 CALL e.cirb(435,200,25,0,0,1,1,1,1);
\r
307 CALL e.ecrit_text(15,470,200,"4");
\r
309 CALL e.cirb(300,270,25,0,0,1,1,1,1);
\r
311 CALL e.ecrit_text(15,295,300,"3");
\r
313 (* AFFICHAGE DU GARDIEN *)
\r
315 CALL e.cirb(615,92,5,0,0,1,1,1,1);
\r
316 CALL e.move (615,100);
\r
317 CALL e.draw (615,125);
\r
318 CALL e.move (610,110);
\r
319 CALL e.draw (620,110);
\r
321 (* CREATION D'UN PROCESSUS GARDIEN *)
\r
322 gardien := NEW garde(0,4);
\r
324 (* DECLARATION ET CREATION DU TABLEAU DES PROCESSUS PHILOSOPHES *)
\r
325 ARRAY ph DIM (1:5);
\r
327 (* DECLARATION ET CREATION DU TABLEAU DES PROCESSUS FOURCHETTES *)
\r
330 (* INITIALISATION DU TABLEAU DES PROCESSUS FOURCHETTES *)
\r
334 (* CREATION D'UN PROCESSUS FOURCHETTE *)
\r
335 f0 := NEW fourchette(0);
\r
338 (* PROCESSUS FOURCHETTE RENDU ACTIF *)
\r
342 (* PROCESSUS GARDIEN RENDU ACTIF *)
\r
345 (* POUR LES 5 PROCESSUS PHILOSOPHES, CREATION DU PROCESSUS *)
\r
347 ph0 := NEW philosophe (0,1,120,70,gardien,f(i-1),f(i mod 5),e);
\r
350 ph0 := NEW philosophe (0,2,70,200,gardien,f(i-1),f(i mod 5),e);
\r
353 ph0 := NEW philosophe (0,3,290,320,gardien,f(i-1),f(i mod 5),e);
\r
356 ph0 := NEW philosophe (0,4,500,200,gardien,f(i-1),f(i mod 5),e);
\r
359 ph0 := NEW philosophe (0,5,460,70,gardien,f(i-1),f(i mod 5),e);
\r
362 (* POUR CHAQUE PROCESSUS PHILOSOPHE DU TABLEAU *)
\r
365 FOR j:=1 TO 700 DO OD;
\r
367 (* PROCESSUS PHILOSOPHE RENDU ACTIF *)
\r