3 (* ------------------------------------------------------------------------ *)
\r
5 UNIT Entier_long : CLASS;
\r
7 UNIT elem : CLASS (valeur:INTEGER, suivant:elem);
\r
10 (* ------------------------------------------------------------------------ *)
\r
14 (* ------------------------------------------------------------------------ *)
\r
16 UNIT depiler : FUNCTION : INTEGER;
\r
17 (* Cette fonction permet d'extraire d'une pile un
\82l
\8ament. *)
\r
23 RESULT := sommet.valeur;
\r
24 sommet := sommet.suivant
\r
30 (* ------------------------------------------------------------------------ *)
\r
32 UNIT pile_vide : FUNCTION : BOOLEAN;
\r
33 (* Cette fonction bool
\82en confirme si une pile est vide ou non.
\r
34 Si le sommet est faux null alors RESULT prend la valeur vraie
\r
50 (* ------------------------------------------------------------------------ *)
\r
52 UNIT empiler : PROCEDURE (x : INTEGER);
\r
53 (* Cette proc
\82dure permet d'empiler un
\82l
\8ament au sommet d'une pile. *)
\r
56 sommet := NEW elem (x,sommet);
\r
60 (* ------------------------------------------------------------------------ *)
\r
62 UNIT addition : FUNCTION (p2 : Entier_long) : Entier_long;
\r
63 (* Cette fonction permet d'effectuer l'addition, elle retourne une
\r
65 On effectue l'addition au fur et
\85 mesure que l'on d
\82pile. *)
\r
67 VAR retenu, so : INTEGER;
\r
71 RESULT := NEW Entier_long;
\r
73 WHILE (NOT pile_vide) OR (NOT p2.pile_vide)
\r
79 (* Si p1 est vide alors le calcul se fait avec la d
\82pile
\r
80 de p2 et la gestion de la retenu. *)
\r
81 so := p2.depiler + retenu
\r
86 (* Si p2 est vide alors le calcul se fait avec la d
\82pile
\r
87 de p1 et la gestion de la retenu. *)
\r
90 so := depiler + retenu
\r
93 so := depiler + p2.depiler + retenu
\r
94 (* Dans les autres cas, on d
\82pile les deux piles et on g
\82re
\r
103 (* On fait en quelque sorte un modulo 10. On enl
\8ave 10 pour em-
\r
104 piler le chiffre qui en est d
\82duit et la retenue vaut
\r
110 (* Ici le calcul donne un chiffre alors la retenu est nulle. *)
\r
115 CALL RESULT.empiler (so);
\r
118 (* Gestion de la retenu. *)
\r
123 CALL RESULT.empiler (retenu)
\r
129 (* ------------------------------------------------------------------------ *)
\r
131 UNIT soustraction : FUNCTION (p2 : Entier_long) : Entier_long;
\r
132 (* Cette fonction permet d'effectuer la soustraction, elle retourne une
\r
134 On effectue la soustraction au fur et
\85 mesure que l'on d
\82pile.
\r
135 A la fin de la fonction on va tester la valeur de la retenu, si elle
\r
136 est
\82gale
\85 1 cela signifie que le r
\82sultat est n
\82gatif. *)
\r
138 VAR retenu, di : INTEGER;
\r
143 RESULT := NEW Entier_long;
\r
145 WHILE (not pile_vide) OR (not p2.pile_vide)
\r
150 (* Si p1 est vide alors le calcul se fait avec la d
\82pile
\r
151 de p2 et la gestion de la retenu. *)
\r
153 di := - p2.depiler - retenu
\r
157 IF p2.pile_vide THEN
\r
158 (* Si p2 est vide alors le calcul se fait avec la d
\82pile
\r
159 de p1 et la gestion de la retenu. *)
\r
161 di := depiler - retenu
\r
164 (* Dans les autres cas, on d
\82pile les deux piles et on g
\82re
\r
167 di := depiler - p2.depiler - retenu
\r
174 (* Pour
\82viter d'avoir une valeur n
\82gative on ajoute 10
\r
175 \85 di pour empiler un chiffre positif et la retenu prend
\r
176 la valeur vaut alors 1. *)
\r
181 (* Ici le calcul donne un chiffre positif alors la retenu est nulle. *)
\r
187 CALL RESULT.empiler(di);
\r
192 IF retenu =/= 0 (* Cette deuxi
\8ame partie ne concerne que la
\r
193 division. Quand les piles sont vides
\r
194 si la retenu est diff
\82rente de 0 c'est que
\r
195 la valeur de p1 est <
\85 celle de p2. *)
\r
204 (* ------------------------------------------------------------------------ *)
\r
206 UNIT multiplication : FUNCTION (p2 : Entier_long ; n : INTEGER) : Entier_long;
\r
207 (* Cette fonction permet d'effectuer la multiplication elle retourne un
\r
208 entier long. n repr
\82sente le nombre d'
\82l
\8aments qu'il y a dans la plus
\r
209 grande pile. On d
\82coupe les piles jusqu'
\85 obtenir un type
\82l
\8ament. *)
\r
211 VAR val : INTEGER , x1, x2, x3, x4 : INTEGER , pp1, p11, pp2, pt,
\r
212 p22, pp3, p33, pp4, p44, mul1, mul2, mul3, mul4,
\r
213 som1, som2 : Entier_long;
\r
218 pp1 := NEW Entier_long; p11 := NEW Entier_long;
\r
219 pp2 := NEW Entier_long; pp3 := NEW Entier_long;
\r
220 p33 := NEW Entier_long; pp4 := NEW Entier_long;
\r
221 p44 := NEW Entier_long; pt := NEW Entier_long;
\r
223 mul1 := NEW Entier_long; mul2 := NEW Entier_long;
\r
224 mul3 := NEW Entier_long; mul4 := NEW Entier_long;
\r
225 som1 := NEW Entier_long; som2 := NEW Entier_long;
\r
227 RESULT := NEW Entier_long;
\r
231 CALL position (17,60);
\r
232 WRITE ("Calcul en cours...");
\r
234 WHILE NOT pile_vide
\r
235 DO (* Transfert de la pile p1 vers la pile pt.*)
\r
236 CALL pt.empiler (depiler);
\r
239 (* Le transfert vers 2 piles permet de sauvegarder les informations
\r
240 vers dans une autre pile parce qu'une fois les
\82l
\8aments utilis
\82s
\r
241 la pile qui les contenaient est vide. Et pour les utiliser une
\r
242 autre fois il faut les avoir sauvegarder dans une autre. *)
\r
244 CALL transferer_2_piles (pt,p11,pp1);
\r
246 CALL transferer_2_piles (transferer_pile (p2),p22,pp2);
\r
252 x3 := pp1.depiler ; x4 := pp2.depiler ; x1 := pp1.depiler ;
\r
253 x2 := pp2.depiler ;
\r
255 val := x1 * x2 * 100 + (x1 * x4 + x3 * x2) * 10 + (x3 * x4);
\r
257 RESULT := conversion (val,n1); (* Ici n1 ne sert
\85 rien puisse que
\r
258 son but dans la fuction est de compter
\r
259 aussi le nombre d'
\82l
\8aments qui se trou-
\r
260 ve dans la pile. dans laquelle est mise
\r
261 les chiffres qui sont convertis.*)
\r
265 pp3 := transferer_pile (apparition(pp1,n));
\r
267 p33 := transferer_pile (apparition(p11,n));
\r
269 pp4 := transferer_pile (apparition(pp2,n));
\r
271 p44 := transferer_pile (apparition(p22,n));
\r
273 (* mul1, mul2, mul3, mul4 : sont 4 traitements r
\82cursives au il
\r
274 ajouter pour certain cas un certain nombre de 0. *)
\r
276 mul1 := transferer_pile (pp1.multiplication (pp2,n));
\r
277 CALL mul1.ajouter_zero (n);
\r
279 mul2 := transferer_pile (p11.multiplication (pp4,n));
\r
280 CALL mul2.ajouter_zero (n DIV 2);
\r
282 mul3 := transferer_pile (p22.multiplication (pp3,n));
\r
283 CALL mul3.ajouter_zero (n DIV 2);
\r
285 mul4 := transferer_pile (p33.multiplication (p44,n));
\r
287 (* Addition des 4 mul trouv
\82s qui forment le r
\82sultat. *)
\r
289 som1 := transferer_pile (mul1.addition (mul2));
\r
291 som2 := transferer_pile (mul3.addition (mul4));
\r
293 RESULT := som1.addition (som2);
\r
297 END multiplication;
\r
299 (* ------------------------------------------------------------------------ *)
\r
301 UNIT carre : FUNCTION (n : INTEGER) : Entier_long;
\r
302 (* Cette fonction permet d'effectuer le carre d'une multiplication. *)
\r
304 VAR p3, p4, pt : Entier_long;
\r
307 RESULT := NEW Entier_long;
\r
308 p3 := NEW Entier_long;
\r
309 p4 := NEW Entier_long;
\r
310 pt := NEW Entier_long;
\r
312 WHILE NOT pile_vide
\r
313 DO (* Transfert de la pile p1 vers la pile pt.*)
\r
314 CALL pt.empiler (depiler);
\r
317 CALL transferer_2_piles (pt,p3,p4);
\r
318 RESULT := p4.multiplication (p3,n*2);
\r
320 CALL effacer_partie (1,19,16,58);
\r
324 (* ------------------------------------------------------------------------ *)
\r
326 UNIT division : FUNCTION (p2 : Entier_Long) : Entier_long;
\r
327 (* Cette fonction permet d'effectuer la division (enti
\8are) avec un
\r
328 Entier_long. Elle retourne Entier_long.
\r
329 Un division est une soustraction du dividande avec le diviseur. *)
\r
331 VAR p3, p5, p6, pt : Entier_long;
\r
337 RESULT := NEW Entier_long;
\r
338 p3 := NEW Entier_long;
\r
339 p5 := NEW Entier_long;
\r
340 p6 := NEW Entier_long;
\r
341 pt := NEW Entier_long;
\r
343 WHILE NOT pile_vide
\r
344 DO (* Transfert de la pile p1 vers la pile pt.*)
\r
345 CALL pt.empiler (depiler);
\r
348 CALL RESULT.empiler(0); (* R
\82sult est initialis
\82 \85 0. *)
\r
350 pt := transferer_pile (pt);
\r
352 WHILE b1 (* Correspond au bool
\82en donn
\82e par la soustraction. *)
\r
356 CALL position (17,60);
\r
357 WRITE ("Calcul en cours...");
\r
359 CALL transferer_2_piles (p2,p5,p6);
\r
360 pt := transferer_pile (pt.soustraction(transferer_pile (p5)));
\r
361 p2 := transferer_pile (p6); (* pour ne pas perdre l'information
\r
362 de base de p2 alors p6 redevient p2
\r
363 qui
\85 son tour redevient p6.*)
\r
365 IF b1 (* Quand on sort de la fonction traiter_soustrac-
\r
366 tion retenu n'est pas forc
\82ment
\82gale
\85 0. *)
\r
369 CALL p3.empiler (1); (* A chaque soustraction on incr
\82mente RESULT
\r
370 de 1. Ce 1 est alors empiler dans p3. *)
\r
372 RESULT := transferer_pile (RESULT.addition (p3));
\r
378 RESULT := transferer_pile (RESULT);
\r
380 CALL effacer_partie (1,19,16,58);
\r
384 (* ------------------------------------------------------------------------ *)
\r
386 UNIT modulo : FUNCTION (p2 : Entier_long) : Entier_long;
\r
387 (* Cette fonction permet de calculer le reste d'une division avec un
\r
388 entier long. Elle retourne un Entier_long. Quand le r
\82sultat de la sous-
\r
389 traction est vide est <
\85 0 il faut avoir garder quelque part la valeur
\r
390 du pr
\82c
\82dent dividande. En fait tant que le reste est positif, on r
\82ini
\r
391 tialise la RESULT. *)
\r
393 VAR p5, p6, pt : Entier_long;
\r
398 p5 := NEW Entier_long;
\r
399 p6 := NEW Entier_long;
\r
400 pt := NEW Entier_long;
\r
402 WHILE NOT pile_vide
\r
403 DO (* Transfert de la pile p1 vers la pile pt.*)
\r
404 CALL pt.empiler (depiler);
\r
411 CALL position (17,60);
\r
412 WRITE ("Calcul en cours...");
\r
414 CALL transferer_2_piles (p2,p5,p6); (* p2 et p6 font faire former un
\r
415 cycle pourque l'information ne
\r
418 RESULT := NEW Entier_long;
\r
420 (* pt et RESULT contient le dernier reste de la division. Si b1 est faux
\r
421 ce qui signifie que la valeur que contient la pile pt est inf
\82rieur
\r
422 \85 celle qui est incluse dans p5.
\r
423 Tant que la soustraction est positive (b1 est vrai) alors RESULT est
\r
424 reinitialis
\82e. *)
\r
426 CALL transferer_2_piles (pt,pt,RESULT);
\r
428 RESULT := transferer_pile (RESULT);
\r
430 pt := transferer_pile(transferer_pile (pt.soustraction(transferer_pile (p5))));
\r
432 p2 := transferer_pile (p6);
\r
436 CALL effacer_partie (1,19,16,58);
\r
440 (* ------------------------------------------------------------------------ *)
\r
442 UNIT pgcd : FUNCTION (p2 : Entier_Long) : Entier_long;
\r
443 (* Cette fonction permet de calculer le pgcd entre deux entiers longs.
\r
444 Elle retourne un Entier_long.
\r
446 r <-- a MOD b ; a <-- b ; b <-- r
\r
448 Ici r repr
\82sente p2 et b2 qui lui va prendre FAUX lors du transfert
\r
449 de p2 vers p2 si dans cette derni
\8are pile il y la valeur 0. *)
\r
451 VAR p5, pt : Entier_long;
\r
456 p5 := NEW Entier_long;
\r
457 pt := NEW Entier_long;
\r
459 WHILE NOT pile_vide
\r
460 DO (* Transfert de la pile p1 vers la pile pt.*)
\r
461 CALL pt.empiler (depiler);
\r
464 pt := transferer_pile (pt);
\r
470 CALL transferer_2_piles (p2,p2,p5);
\r
472 p2 := (pt.modulo (transferer_pile (p2)));
\r
474 RESULT := NEW Entier_long;
\r
476 RESULT := transferer_pile (transferer_pile (p5));
\r
478 p2 := transferer_pile (p2);
\r
484 pt := transferer_pile (RESULT);
\r
491 (* ------------------------------------------------------------------------ *)
\r
493 UNIT ppcm : FUNCTION (p2 : Entier_Long) : Entier_long;
\r
494 (* Cette fonction permet de calculer le ppcm entre deux entiers longs.
\r
495 Elle retourne un Entier_long. ppcm (a,b) = (a * b) / pgcd (a,b). *)
\r
497 VAR p3, p4, pt, pp : Entier_long;
\r
501 p3 := NEW Entier_long;
\r
502 p4 := NEW Entier_long;
\r
503 pp := NEW Entier_long;
\r
504 pt := NEW Entier_long;
\r
506 WHILE NOT pile_vide
\r
507 DO (* Transfert de la pile p1 vers la pile pt.*)
\r
508 CALL pt.empiler (depiler);
\r
512 CALL transferer_2_piles (transferer_pile (p2),p2,p4);
\r
514 CALL transferer_2_piles (pt,pt,p3);
\r
516 (* pp prend la valeur de la multiplication de p2 et de pt. *)
\r
517 pp := transferer_pile (pt.multiplication (p2,partition (grand(n1,n2,n3))));
\r
519 RESULT := pp.division (transferer_pile (p3.pgcd (p4)));
\r
523 (* ------------------------------------------------------------------------ *)
\r
525 UNIT conversion : FUNCTION (nbre : INTEGER ;
\r
526 OUTPUT n : INTEGER) : Entier_long ;
\r
527 (* Cette fonction d
\82compose un entier en tout chiffre qui la compose.
\r
528 Elle retourne un type Entier_long et comme param
\88tre le nombre de
\r
529 chiffres qui compose cette description ainsi ce dernier param
\88tre
\r
530 donne une id
\82e de la taille de la premi
\8are pile. Pareil que la
\r
531 fonction saisie, on va
\82viter d'empiler des 0 en d
\82but de nombre
\r
534 VAR x : INTEGER, trouve : BOOLEAN;
\r
538 RESULT := NEW Entier_long;
\r
550 CALL RESULT.empiler (x);
\r
552 nbre := nbre DIV 10;
\r
560 CALL RESULT.empiler (x);
\r
561 nbre := nbre DIV 10;
\r
579 (* ------------------------------------------------------------------------ *)
\r
581 UNIT transferer_pile : FUNCTION (p2 : Entier_long) : Entier_long;
\r
582 (* Cette fonction permet de d
\82piler une pile pour empiler dans une
\r
589 b2 := FALSE; (* b2 va tester si la valeur du
\8a reste est
\82gale
\85 \r
590 z
\82ro (ce qui est valable seulement pour
\r
593 RESULT := NEW Entier_long;
\r
595 WHILE NOT p2.pile_vide
\r
606 CALL RESULT.empiler (i);
\r
610 END transferer_pile;
\r
612 (* ------------------------------------------------------------------------ *)
\r
614 UNIT transferer_2_piles : PROCEDURE (p2 : Entier_long ;
\r
615 OUTPUT p3,p4 : Entier_long);
\r
616 (* Cette proc
\82dure permet de d
\82piler une pile pour empiler dans deux
\r
623 p3 := NEW Entier_long;
\r
624 p4 := NEW Entier_long;
\r
626 WHILE NOT p2.pile_vide
\r
629 CALL p3.empiler (x);
\r
630 CALL p4.empiler (x);
\r
633 END transferer_2_piles;
\r
635 (* ------------------------------------------------------------------------ *)
\r
637 UNIT apparition : FUNCTION (p2 : Entier_long ; n : INTEGER) : Entier_long;
\r
638 (* Cette fonction permet de faire appara
\8ctre une nouvelle pile en
\r
639 divisant celle qui existe en deux. n : repr
\82sente le nombre de
\r
640 chiffres contenu dans la pile. Cette fonction n'est valable pour la
\r
645 RESULT := NEW Entier_long;
\r
650 CALL RESULT.empiler (p2.depiler);
\r
656 (* ------------------------------------------------------------------------ *)
\r
658 UNIT max_de_2_piles : PROCEDURE (v1,v2 : INTEGER ;
\r
659 INOUT p2 : Entier_long ; OUTPUT max : INTEGER);
\r
660 (* Cette proc
\82dure d
\82termine quel nombre des piles est plus grand.
\r
661 Puisse qu'au d
\82part il y a s
\82lection dans la saisie (les z
\82ros qui pr
\82c
\8a-
\r
662 dent un chiffre autre qu'un z
\82ro) ; on fait la comparaison avec v1, v2 (le
\r
663 nombre de chiffres compris dans la pile).
\r
664 Si v1 et v2 sont
\82gaux (exemple 121 et 331) les valeurs sont ici 3 ; alors
\r
665 on compare deux
\85 deux les chiffres pour d
\82terminer la pile qui contient
\r
666 le nombre le plus grande.
\r
667 max resort 1 pour la pile1 et 2 pour la pile2.*)
\r
669 VAR x1, x2 : INTEGER, b : BOOLEAN, p3,p4,p5,p6 : Entier_long;
\r
673 p3 := NEW Entier_long; p4 := NEW Entier_long;
\r
674 p5 := NEW Entier_long; p6 := NEW Entier_long;
\r
676 max := 0; b := TRUE;
\r
677 (* 1ø partie : Comparaison des valeurs v1 et v2. *)
\r
686 ELSE (* Si dans les deux piles le nombre
\r
687 de chiffres est
\82gale, on compare
\r
688 les chiffres entre eux pour con-
\r
689 na
\8ctre enfin la plus grande. *)
\r
691 CALL transferer_2_piles (p1,p3,p5);
\r
692 CALL transferer_2_piles (p2,p4,p6);
\r
693 (* Au cours de la comparaison d
\8as que
\r
694 l'on a trouv
\82 une diff
\82rence entre
\r
695 les deux piles, on arr
\88te la recher-
\r
698 WHILE NOT (p3.pile_vide) AND b
\r
722 p1 := transferer_pile (p5);
\r
723 p2 := transferer_pile (p6);
\r
729 END max_de_2_piles;
\r
731 (* ------------------------------------------------------------------------ *)
\r
733 UNIT ajouter_zero : PROCEDURE (n : INTEGER);
\r
734 (* Cette fonction permet d'ajouter des z
\82ros
\85 la suite d'une pile
\r
735 n : repr
\82sente le nombre de 0 qui vont
\88tre empiler. Cette proc
\82dure
\r
736 est valable seulement pour la multiplication. *)
\r
751 (* ------------------------------------------------------------------------ *)
\r
753 UNIT saisir : FUNCTION (i, j : INTEGER ; OUTPUT n : INTEGER) : Entier_long;
\r
754 (* Cette fonction permet de saisir les chiffres pour les empiler.
\r
755 Par cette m
\82thode de saisie, les z
\82ros qui sont en d
\82but de nom-
\r
756 bre ne sont pas saisies (ce qui permet d'avoir une id
\82e rapide
\r
757 de la plus grande pile.
\r
758 i et j : deux variables qui repr
\82sentent la position du curseur
\85 l'
\82cran.
\r
759 n : resort le nbre de chiffre empil
\82s.*)
\r
761 VAR nnbre : CHAR, nbre : INTEGER, trouve : BOOLEAN;
\r
765 RESULT := NEW Entier_long;
\r
772 CALL position (i,j);
\r
775 THEN (* Passage
\85 la ligne pour des entiers tr
\8as longs.*)
\r
781 nnbre := chr (inchar);
\r
783 IF (ord (nnbre) < 48) OR (ord (nnbre) > 57)
\r
788 nbre := entier (nnbre);
\r
790 CALL position (i,j);
\r
798 CALL RESULT.empiler (nbre);
\r
799 trouve := TRUE; (* On fait un barage aux premiers
\r
805 (* Une fois un nbre diff
\82rent de 0 est
\r
806 saisie 0 peut
\88tre bien-s
\96r saisie
\r
807 autant de fois que possible. *)
\r
810 CALL RESULT.empiler (nbre);
\r
817 j := j + 1; (* Mise
\85 jour de la colonne de l'
\82cran. *)
\r
823 (* ------------------------------------------------------------------------ *)
\r
825 UNIT afficher_resultat : PROCEDURE ;
\r
826 (* Cette proc
\82dure permet d'afficher le r
\82sultat du calcul effectu
\82.
\r
827 Tant que la pile n'est pas vide, on d
\82pile. On
\82vite d'afficher les
\r
828 premiers 0 (Ce qui tr
\8as important pour une soustraction). *)
\r
830 VAR b : BOOLEAN , i : INTEGER ;
\r
836 WHILE NOT pile_vide DO
\r
838 IF (i =/= 0) or (b) THEN
\r
839 b := TRUE; (* Une fois que le premier
\r
840 nombre est affich
\82 et qu'il
\r
841 est diff
\82rent de 0, on peut afficher
\r
842 autant de fois de 0. *)
\r
852 END afficher_resultat;
\r
858 (* ------------------------------------------------------------------------ *)
\r
860 UNIT Inchar : IIUWgraph FUNCTION : INTEGER;
\r
861 (* Cette function permet de saisir une suite de caract
\8ares sans avoir
\r
862 \85 valider chaque fois. *)
\r
883 (* ------------------------------------------------------------------------ *)
\r
885 UNIT entier : FUNCTION (c : CHAR) : INTEGER;
\r
886 (* Cette proc
\82dure convertie un caract
\8are en entier parce que la
\r
887 fonction inchar lit un entier qu'elle traduit en caract
\8are. *)
\r
892 WHEN '0' : RESULT := 0;
\r
894 WHEN '1' : RESULT := 1;
\r
896 WHEN '2' : RESULT := 2;
\r
898 WHEN '3' : RESULT := 3;
\r
900 WHEN '4' : RESULT := 4;
\r
902 WHEN '5' : RESULT := 5;
\r
904 WHEN '6' : RESULT := 6;
\r
906 WHEN '7' : RESULT := 7;
\r
908 WHEN '8' : RESULT := 8;
\r
910 WHEN '9' : RESULT := 9;
\r
916 (* ------------------------------------------------------------------------ *)
\r
918 UNIT partition : FUNCTION (n : INTEGER):INTEGER;
\r
919 (* Cette fonction renvoit la valeur pour laquelle il faut partitionner
\r
920 les deux piles. La plus grande de leur deux valeurs (multilplier par 2
\r
921 par la fonction grand) doit
\88tre un multiple de deux. (ce qui est
\r
922 seulement utile pour la multiplication).*)
\r
931 (* La partition de la multiplication se fait
\r
932 pour des valeurs qui correspondent
\85 une
\r
933 suite g
\82om
\82trique de premier terme 2 et de
\r
944 (* ------------------------------------------------------------------------ *)
\r
946 UNIT grand : FUNCTION (d1, d2, d3 : INTEGER) : INTEGER;
\r
947 (* Cette fonction renvoit le nbre d'
\82l
\8ament qui a dans la plus grande
\r
948 pile. Le param
\88tre d3 accepte le max des deux piles.
\r
949 on rappelle que s'il vaut 2 alors il s'agit de la deuxi
\8ame pile qui a
\r
950 la grande valeur sinon la premi
\8are et cette valeur est multiplier par 2
\r
951 pour mieux partionner la pile. *)
\r
970 (* ------------------------------------------------------------------------ *)
\r
972 UNIT position : PROCEDURE (lig, col : INTEGER);
\r
973 (* Cette proc
\82dure permet de positionner sur l'
\82cran qui devient une
\r
974 matrice. Les param
\88tres lig et col correspondent respectivement
\85 l'
\r
975 abcisse x (ligne) et
\85 l'abcisse y (colonne). *)
\r
977 VAR c, d, e, f : CHAR, i, j : INTEGER;
\r
981 i := lig DIV 10; j := lig mod 10; c := chr (48+i);
\r
982 d := chr (48+j); i := col div 10; j := col mod 10;
\r
983 e := chr (48+i); f := chr (48+j);
\r
984 WRITE (chr (27), "[", c, d, ";", e, f, "H");
\r
988 (* ------------------------------------------------------------------------ *)
\r
990 UNIT tracer_ligne : PROCEDURE (lig1,col1,col : INTEGER);
\r
991 (* Cette proc
\82dure permet de tracer les lignes du cadre. x, y repr
\82-
\r
992 tentent les param
\88tres de POSITION c'est
\85 dire position ligne, colon
\r
993 ne, et col est la limite de la ligne. *)
\r
999 CALL POSITION (col1,lig1);
\r
1001 FOR i := 1 to col
\r
1008 (*------------------------------------------------------------------------- *)
\r
1010 UNIT tracer_colonne : PROCEDURE (lig,lig1, col : INTEGER);
\r
1011 (* Cette proc
\82dure permet de tracer les colonnes du cadre.
\r
1012 lig repr
\82sente : lig2 - lig1, et col : la colonne courante ou l'or-
\r
1013 donn
\82e de POSITON. *)
\r
1023 CALL POSITION (lig1+i,col);
\r
1029 END tracer_colonne;
\r
1031 (* ------------------------------------------------------------------------ *)
\r
1033 UNIT cadrer : PROCEDURE (lig1, lig2, col1,col2 : INTEGER);
\r
1034 (* Cette proc
\82dure dessine un cadre valable pour un
\82cran. D'abord
\r
1035 dessins : des lignes, ensuite des colonnes enfin des coins. Les para-
\r
1036 m
\88tres sont respectivement ligne du haut et du bas et colonne de droi-
\r
1037 te et de gauche. *)
\r
1041 CALL tracer_ligne (col1,lig1,col2-col1);
\r
1042 CALL tracer_ligne (col1,lig2,col2-col1);
\r
1044 CALL tracer_colonne (lig2-lig1,lig1,col1);
\r
1045 CALL tracer_colonne (lig2-lig1,lig1,col2);
\r
1047 CALL POSITION (lig1,col1);
\r
1050 CALL POSITION (lig2,col1);
\r
1053 CALL POSITION (lig1,col2);
\r
1056 CALL POSITION (lig2,col2);
\r
1061 (* ------------------------------------------------------------------------ *)
\r
1063 UNIT effacer_partie : PROCEDURE (lig, col, lig1, col1 : INTEGER);
\r
1064 (* Cette proc
\82dure permet d'effacer une partie de l'
\82cran (o
\97 on
\r
1065 \82crit un caract
\8are blanc) les param
\88tres lig, col, lig1, col1
\r
1066 l'intervale de ligne, colonne et la position de la ligne1 et
\r
1067 de la colonne1. *)
\r
1069 VAR k,w : INTEGER;
\r
1072 FOR k := 1 to col
\r
1077 CALL POSITION (lig1+w,col1+k);
\r
1083 END effacer_partie;
\r
1085 (* ------------------------------------------------------------------------ *)
\r
1087 UNIT prompt : PROCEDURE (i,j : INTEGER);
\r
1088 (* Cette proc
\82dure affiche le programme principal. *)
\r
1089 VAR choix : CHAR ;
\r
1095 WRITELN; (* Cette commande permet de vider le buffer *)
\r
1097 IF ecr (* Cette condition va permettre
\85 cette fen
\88tre de pas
\r
1098 ser du plein
\82cran au petit menu du haut de l'
\82cran. *)
\r
1102 CALL cadrer (8,16,2,80);
\r
1106 CALL cadrer (2,4,2,80);
\r
1109 CALL position (i,j);
\r
1111 WRITE ("1 : Aide - 2 : Calcul - 3 : Quitter -> Le choix : ");
\r
1113 WRITELN; (* Cette commande permet de vider le buffer *)
\r
1115 choix := chr(inchar);
\r
1117 CALL position (3,77);
\r
1120 WRITE (chr(27), "[2J");
\r
1124 WHEN '1' : CALL aide;
\r
1126 WHEN '2' : CALL effacer_partie (3,80,1,1);
\r
1127 CALL presentation;
\r
1129 CALL cadrer (3,7,8,74);
\r
1130 CALL fenetre_operation (4,14);
\r
1140 (* ------------------------------------------------------------------------ *)
\r
1142 UNIT fenetre_operation : PROCEDURE (i,j : INTEGER);
\r
1143 (* Cette proc
\82dure affiche la liste des op
\82rations possibles
\85 \r
1144 r
\82aliser et g
\82re les signes des op
\82rations saisies.
\r
1145 Cf la documentation pour comprendre la gestion des signes. *)
\r
1147 VAR choix : CHAR;
\r
1151 WRITELN; (* Cette commande permet de vider le buffer *)
\r
1153 CALL position (i,j);
\r
1155 WRITE ("1 : + ; 2 : - ; 3 : * ; 4 : ^2 ; 5 : DIV");
\r
1157 CALL position (i+2,j);
\r
1159 WRITE ("6 : MOD ; 7 : PGCD ; 8 : PPCM -> Le choix : ");
\r
1161 WRITELN; (* Cette commande permet de vider le buffer *)
\r
1163 choix := chr(inchar);
\r
1165 CALL position (i+2,j+54);
\r
1168 CALL effacer_partie (5,78,2,1);
\r
1170 CALL position (i+4,50);
\r
1171 (* Dans tous les cas signe1 et signe2 sont les valeurs des signes des piles
\r
1175 WHEN '1' : WRITE ("La s
\82lection est : ");
\r
1178 CALL cadrer (10,14,22,50);
\r
1179 CALL fenetre_saisie (11,25);
\r
1181 CALL cadrer (15,19,22,50);
\r
1182 CALL fenetre_saisie (16,25);
\r
1184 CALL p1.max_de_2_piles (n1,n2,p2,n3);
\r
1188 WHEN '-' : IF signe2 = '-'
\r
1192 p3 := p1.addition (p2);
\r
1193 CALL position (19,15);
\r
1197 IF (n3 = 1) (* cas o
\97 la 1ø pile est
\r
1198 >
\85 la 2ø pile.*)
\r
1201 p3 := p1.soustraction (p2);
\r
1202 CALL position (19,15);
\r
1205 ELSE (* cas o
\97 la 1ø pile est <=
\r
1207 p3 := p2.soustraction (p1);
\r
1212 OTHERWISE IF signe2 =/= '-'
\r
1215 p3 := p1.addition (p2);
\r
1219 IF (n3 = 1) (* cas o
\97 la 1ø pile est
\r
1220 >
\85 la 2ø pile.*)
\r
1223 p3 := p1.soustraction (p2);
\r
1225 ELSE (* cas o
\97 la 1ø pile est <=
\r
1227 p3 := p2.soustraction (p1);
\r
1233 CALL position (19,15);
\r
1242 WHEN '2': WRITE ("La s
\82lection est : ");
\r
1245 CALL cadrer (10,14,22,50);
\r
1246 CALL fenetre_saisie (11,25);
\r
1248 CALL cadrer (15,19,22,50);
\r
1249 CALL fenetre_saisie (16,25);
\r
1251 CALL p1.max_de_2_piles (n1,n2,p2,n3);
\r
1255 WHEN '-' : IF signe2 =/= '-'
\r
1259 p3 := p1.addition (p2);
\r
1260 CALL position (19,15);
\r
1264 IF (n3 = 1) (* cas o
\97 la 1ø pile est
\r
1265 >
\85 la 2ø pile. *)
\r
1268 p3 := p1.soustraction (p2);
\r
1269 CALL position (19,15);
\r
1272 ELSE (* cas o
\97 la 1ø pile est <=
\r
1273 \85 la 2ø pile. *)
\r
1274 p3 := p2.soustraction (p1);
\r
1280 OTHERWISE IF signe2 = '-'
\r
1283 p3 := p1.addition (p2);
\r
1287 IF (n3 = 2) (* cas o
\97 la 1ø pile est
\r
1288 >
\85 la 2ø pile.*)
\r
1291 p3 := p2.soustraction (p1);
\r
1292 CALL position (19,15);
\r
1295 ELSE (* cas o
\97 la 1ø pile est <=
\r
1296 \85 la 2ø pile. *)
\r
1297 p3 := p1.soustraction (p2);
\r
1303 WHEN '3': WRITE ("La s
\82lection est : ");
\r
1306 CALL cadrer (10,14,22,50);
\r
1307 CALL fenetre_saisie (11,25);
\r
1309 CALL cadrer (15,19,22,50);
\r
1310 CALL fenetre_saisie (16,25);
\r
1312 CALL p1.max_de_2_piles (n1,n2,p2,n3);
\r
1316 WHEN '-' : IF signe2 =/= '-'
\r
1319 CALL position (19,15);
\r
1323 OTHERWISE IF signe2 = '-'
\r
1326 CALL position (19,15);
\r
1332 p3 := p1.multiplication (p2,partition (grand(n1,n2,n3)));
\r
1334 CALL effacer_partie (1,19,16,58);
\r
1335 (* Permet d'effacer le message "Calcul en cours"*)
\r
1337 WHEN '4': WRITE ("La s
\82lection est : ");
\r
1340 CALL effacer_partie (1,14,13,1);
\r
1342 CALL cadrer (10,14,22,50);
\r
1343 CALL fenetre_saisie (11,25);
\r
1345 p3 := p1.carre (partition (n1));
\r
1347 WHEN '5': WRITE ("La s
\82lection est : ");
\r
1350 CALL cadrer (10,14,22,50);
\r
1351 CALL fenetre_saisie (11,25);
\r
1353 CALL cadrer (15,19,22,50);
\r
1354 CALL fenetre_saisie (16,25);
\r
1357 (* Traitement de la division par
\r
1361 CALL position (17,45);
\r
1362 WRITELN ("IMPOSSIBLE... Division par Z
\82ro");
\r
1366 IF ( (signe2 = '-') AND (signe1 =/= '-') )
\r
1367 OR ( (signe2 =/= '-') AND (signe1 = '-') )
\r
1370 CALL position (19,15);
\r
1374 p3 := p1.division (p2);
\r
1376 WHEN '6': WRITE ("La s
\82lection est : ");
\r
1379 CALL cadrer (10,14,22,50);
\r
1380 CALL fenetre_saisie (11,25);
\r
1382 CALL cadrer (15,19,22,50);
\r
1383 CALL fenetre_saisie (16,25);
\r
1386 (* Traitement de la division par
\r
1390 CALL position (17,45);
\r
1391 WRITELN ("IMPOSSIBLE... Division par Z
\82ro");
\r
1395 IF ( (signe2 = '-') AND (signe1 =/= '-') )
\r
1396 OR ( (signe2 =/= '-') AND (signe1 = '-') )
\r
1399 CALL position (19,15);
\r
1403 p3 := p1.modulo (p2);
\r
1406 WHEN '7': WRITE ("La s
\82lection est : ");
\r
1409 CALL cadrer (10,14,22,50);
\r
1410 CALL fenetre_saisie (11,25);
\r
1412 CALL cadrer (15,19,22,50);
\r
1413 CALL fenetre_saisie (16,25);
\r
1416 (* Traitement de la division par
\r
1420 CALL position (17,45);
\r
1421 WRITELN ("IMPOSSIBLE... Division par Z
\82ro");
\r
1425 IF ( (signe2 = '-') AND (signe1 =/= '-') )
\r
1426 OR ( (signe2 =/= '-') AND (signe1 = '-') )
\r
1429 CALL position (19,15);
\r
1434 p3 := p1.pgcd (p2)
\r
1437 WHEN '8': WRITE ("La s
\82lection est : ");
\r
1439 CALL cadrer (10,14,22,50);
\r
1440 CALL fenetre_saisie (11,25);
\r
1442 CALL cadrer (15,19,22,50);
\r
1443 CALL fenetre_saisie (16,25);
\r
1446 (* Traitement de la division par
\r
1450 CALL position (17,45);
\r
1451 WRITELN ("IMPOSSIBLE... Division par Z
\82ro");
\r
1455 IF ( (signe2 = '-') AND (signe1 =/= '-') )
\r
1456 OR ( (signe2 =/= '-') AND (signe1 = '-') )
\r
1459 CALL position (19,15);
\r
1463 p3 := p1.ppcm (p2);
\r
1465 OTHERWISE CALL effacer_partie (5,78,2,1);
\r
1466 CALL cadrer (3,7,2,79);
\r
1467 CALL fenetre_operation (i,j);
\r
1470 CALL position (19,17);
\r
1472 CALL p3.afficher_resultat;
\r
1475 END fenetre_operation;
\r
1477 (* ------------------------------------------------------------------------ *)
\r
1479 UNIT fenetre_saisie : PROCEDURE (i,j : INTEGER);
\r
1480 (* Cette proc
\82dure permet de r
\82aliser le choix entre la saisie d'un
\r
1481 entier court et long. Et permet d'effectuer la saisie du signe qui
\r
1482 sera g
\82rer dans la proc
\82dure ci dessus. *)
\r
1484 VAR choix : CHAR, nbre : INTEGER;
\r
1488 WRITELN; (* Cette commande permet de vider le buffer *)
\r
1490 CALL position (i,j);
\r
1492 WRITELN ("1 : Entier court");
\r
1493 CALL position (i+1,j);
\r
1494 WRITELN ("2 : Entier long");
\r
1495 CALL position (i+2,j+2);
\r
1496 WRITELN ("Entrer votre choix : ");
\r
1498 WRITELN; (* Cette commande permet de vider le buffer *)
\r
1500 choix := chr (inchar);
\r
1502 CALL position (i+2,j+23);
\r
1505 WRITELN; (* Cette commande permet de vider le buffer *)
\r
1507 (* La saisie d'un entier court n
\82cessite une conversion et un empilement.
\r
1508 Alors que la saisie d'un entier long se fait par empilement. *)
\r
1511 (* On g
\8are le choix et le position de l'
\82cran qui permet de savoir
\r
1512 si on manipule p1 (pour i = 11) ou p2 (pour i = 22). *)
\r
1514 WHEN '1' : IF i = 11
\r
1517 CALL effacer_partie (5,29,9,21);
\r
1518 WRITELN; (* Cette commande permet de vider le buffer *)
\r
1519 CALL position (9,16);
\r
1521 CALL position (9,17);
\r
1522 WRITELN; (* Cette commande permet de vider le buffer *)
\r
1523 signe1 := chr (inchar);
\r
1524 CALL position (9,17);
\r
1526 CALL position (9,20);
\r
1528 p1 := p1.transferer_pile (p1.conversion (nbre,n1) )
\r
1531 CALL effacer_partie (5,29,14,21);
\r
1532 WRITELN; (* Cette commande permet de vider le buffer *)
\r
1533 CALL position (14,16);
\r
1535 CALL position (14,17);
\r
1536 WRITELN; (* Cette commande permet de vider le buffer *)
\r
1537 signe2 := chr (inchar);
\r
1538 CALL position (14,17);
\r
1540 CALL position (14,20);
\r
1542 p2 := p2.transferer_pile (p2.conversion (nbre,n2) )
\r
1546 WHEN '2' : IF i = 11
\r
1549 CALL effacer_partie (5,29,9,21);
\r
1550 WRITELN; (* Cette commande permet de vider le buffer *)
\r
1551 CALL position (9,16);
\r
1553 CALL position (9,17);
\r
1554 WRITELN; (* Cette commande permet de vider le buffer *)
\r
1555 signe1 := chr (inchar);
\r
1556 CALL position (9,17);
\r
1558 CALL position (9,20);
\r
1559 WRITELN; (* Cette commande permet de vider le buffer *)
\r
1560 p1 := p1.saisir (9,20,n1)
\r
1563 CALL effacer_partie (5,29,14,21);
\r
1564 WRITELN; (* Cette commande permet de vider le buffer *)
\r
1565 CALL position (14,16);
\r
1567 CALL position (14,17);
\r
1568 WRITELN; (* Cette commande permet de vider le buffer *)
\r
1569 signe2 := chr (inchar);
\r
1570 CALL position (14,17);
\r
1572 CALL position (14,20);
\r
1573 WRITELN; (* Cette commande permet de vider le buffer *)
\r
1574 p2 := p2.saisir (14,20,n2);
\r
1578 OTHERWISE CALL fenetre_saisie (i,j);
\r
1582 END fenetre_saisie;
\r
1584 (* ------------------------------------------------------------------------ *)
\r
1586 UNIT presentation : PROCEDURE;
\r
1587 (* Cette proc
\82dure permet apr
\8as le prompt d'afficher la maquette de
\r
1588 saisie et de r
\82sultat. *)
\r
1592 CALL position (10,3);
\r
1593 WRITE ("Valeur nø1 : ");
\r
1594 CALL position (15,3);
\r
1595 WRITE ("Valeur nø2 : ");
\r
1596 CALL position (20,3);
\r
1597 WRITE ("R
\82sultat : ");
\r
1598 CALL position (25,76);
\r
1603 (* ------------------------------------------------------------------------ *)
\r
1605 UNIT aide : PROCEDURE;
\r
1606 (* Cette proc
\82dure permet d'afficher le texte de l'aide. *)
\r
1610 CALL position (5,3);
\r
1611 WRITELN ("Le calcul consiste
\85 :");
\r
1612 WRITELN (" - S
\82lectionner l'op
\82ration d
\82sir
\82e.");
\r
1613 WRITELN (" - Choisir entre un entier court ou long.");
\r
1614 WRITELN (" - Mettre le signe de l'op
\82ration dans le ' '.");
\r
1615 WRITELN (" - pour les valeur n
\82gatives.");
\r
1616 WRITELN (" + pour ou rien pour les valeurs positives.");
\r
1617 WRITELN (" - Valider la saisie des valeurs ");
\r
1619 WRITELN (" Pour le carre, il n'a pas de deuxi
\8ame saisie.");
\r
1621 WRITELN (" Si le r
\82sultat obtenu n'est pas visible
\85 l'
\82cran
\85 cause d'un");
\r
1622 WRITELN ("trop grand nombre de chiffres, il faut quitter ce logiciel et");
\r
1623 WRITELN ("taper 'int projet > exemple' et reprendre l'application pr
\82c
\82dente.");
\r
1625 WRITELN (" Ceci est tap
\82 n'est pas visible
\85 l'
\82cran. Pour visualiser la saisie");
\r
1626 WRITELN ("et le r
\82sultat il faut taper 'type exemple | more'
\85 partir du DOS.");
\r
1628 WRITELN ("Quitter : permet de revenir au Syt
\8ame d'Exploitation");
\r
1633 VAR p1,p2,p3 : Entier_long, (* p1, p2 sont deux piles de saisie et p3 : une
\r
1634 pile r
\82sultat. *)
\r
1636 n1, n2, n3 : INTEGER, (* n1, n2 correspondent au nombres de chiffres
\r
1637 qui sont dans les piles n3 resort leur maximum ou
\r
1638 leur
\82galit
\82. *)
\r
1640 b1, b2, ecr : BOOLEAN, (* Les deux premeirs repr
\82sentent respectivement
\r
1641 la l'obtention d'un r
\82sultat n
\82gatif pour la
\r
1642 soustraction et le test comme quoi la valeur
\r
1643 du reste est nulle pour le pgcd.
\r
1644 ecr va permetre au sommaire de passer de la
\r
1645 position de plein
\82cran
\85 celle de petit
\82cran
\r
1646 sur les trois premi
\8ares lignes.*)
\r
1648 signe1, signe2 : CHAR; (* Ils repr
\82sentent respectivement les valeurs
\r
1649 des signe de la pile 1 et 2. *)
\r
1654 (* Intialisation des trois piles. *)
\r
1655 p1 := new Entier_long;
\r
1656 p2 := new Entier_long;
\r
1657 p3 := new Entier_long;
\r
1659 WRITE (chr(27), "[2J");
\r
1661 CALL position (4,19);
\r
1662 WRITELN ("LA CALCULATRICE DES ENTIERS COURTS ET LONGS");
\r
1663 CALL position (19,76);
\r
1664 WRITELN ("D. V.");
\r
1667 CALL prompt (12,6) ;
\r