12 (* Fonction qui attend qu'un caract
\8are soit tap
\82 au clavier *)
\r
14 UNIT GetChar:function:char;
\r
17 pref IIUWGRAPH block
\r
28 (* Fonction qui saisit une chaine de caract
\8ares et la place dans un tableau *)
\r
29 (* de caract
\8ares *)
\r
30 UNIT SaisieString : function : arrayof char ;
\r
32 s , tmp : arrayof char ,
\r
33 i , long : integer ;
\r
36 array tmp dim (1:255);
\r
47 array s dim (1:long);
\r
48 for i:=1 to long do s(i):=tmp(i); od ;
\r
52 (* Procedure permettant de choisir la couleur d'
\82criture et de fond du texte *)
\r
53 UNIT Couleur : procedure ( texte,fond : integer);
\r
58 Write ( chr(27) , "[1;3",t,";4",f,"m");
\r
61 (* Procedure permettant d'effacer la ligne courante *)
\r
62 UNIT EraseLine : procedure;
\r
64 Write( chr(27), "[K")
\r
67 (* Procedure permettant d'effacer enti
\8arement l'
\82cran *)
\r
68 UNIT Cls : procedure;
\r
70 Write( chr(27), "[2J");
\r
71 Write( chr(27), "[H");
\r
74 (* Procedure permettant de positionner le curseur sur l'
\82cran *)
\r
75 UNIT SetCursor : procedure(column, row : integer);
\r
87 Write( chr(27), "[", c, d, ";", e, f, "H")
\r
91 (* Procedure permettant de calculer a exposant b *)
\r
92 UNIT exposant : function (a,b:integer) : integer ;
\r
94 result:=round(exp(b*ln(a)));
\r
97 (* Procedure affichant le r
\82sultat d'un essai de pattern matching *)
\r
98 UNIT afficheresultat : procedure (resultat : boolean);
\r
100 call couleur(cyan,noir);
\r
101 call setcursor(18,18);
\r
103 Writeln("Le pattern a ete trouve dans la chaine");
\r
105 Writeln("Le pattern n'a pas ete trouve dans la chaine");
\r
107 call couleur(blanc,noir);
\r
108 call setcursor(55,24);
\r
109 Write("Appuyez sur ENTREE");
\r
111 End afficheresultat;
\r
113 (* Procedure mettant en place les differents textes sur l'
\82cran *)
\r
114 UNIT afficheecran : procedure (p , s : arrayof char);
\r
117 call couleur(blanc,noir);
\r
119 Write("Pattern : ");
\r
120 call couleur(jaune,noir);
\r
121 for t:=1 to upper(p)
\r
126 call couleur(blanc,noir);
\r
128 Writeln("Chaine ou on cherche le pattern :");
\r
129 call couleur(jaune,noir);
\r
130 for t:=1 to upper(s)
\r
137 (**************************************************************************)
\r
139 (* ALGORITHME SIMPLE *)
\r
141 (**************************************************************************)
\r
142 UNIT AlgoSimple : procedure ( p , s : arrayof char) ;
\r
144 (* Procedure ecrivant diff
\82rents textes sur l'
\82cran *)
\r
146 UNIT ecran : procedure ;
\r
148 call couleur(blanc,noir);
\r
149 call setcursor(1,10);
\r
150 Writeln("On compare la premiere lettre de : ");
\r
151 Writeln(" avec la premiere lettre de : ");
\r
153 Writeln("Si elles sont egales, on reduit le pattern de 1 caractere");
\r
156 (* Procedure permettant d'afficher les diff
\82rentes
\82tapes de l'ex
\82cution de *)
\r
159 UNIT AfficheChaine : procedure (p,s:arrayof char; posp,poss : integer);
\r
160 Var t , longs , longp , posx , longtest : integer ;
\r
166 longtest:=longp-posp+1;
\r
167 call couleur(jaune,bleu);
\r
168 call setcursor(35,10);
\r
169 for t:=posp to longp
\r
173 call couleur(jaune,noir);
\r
177 if ( (t>=poss) and (t<poss+longtest) ) then
\r
178 call couleur(jaune,bleu);
\r
179 call setcursor(posx,11);
\r
182 call couleur(jaune,noir);
\r
184 call couleur(jaune,bleu);
\r
186 call couleur(jaune,noir);
\r
188 call setcursor(t,4);
\r
194 Var i , j , m , n : integer ,
\r
195 resultat : boolean ;
\r
197 (* corps de l'algorithme simple *)
\r
199 (* initialisations *)
\r
200 call afficheecran (p,s);
\r
207 (* boucle principale *)
\r
208 while ((i<=m) and (j<=n))
\r
210 call AfficheChaine(p,s,i,j);
\r
220 call afficheresultat(resultat) ;
\r
225 (**************************************************************************)
\r
227 (* ALGORITHME DE KNUTH, MORRIS et PRATT *)
\r
229 (**************************************************************************)
\r
230 UNIT AlgoKMP : procedure(p , s : arrayof char) ;
\r
232 (* procedure permettant d'effectuer les affichages *)
\r
234 UNIT ecran : procedure (h:arrayof integer) ;
\r
237 call couleur(blanc,noir);
\r
238 call setcursor(1,7);
\r
239 writeln("On compare le caractere en surbrillance du pattern avec celui de la chaine.");
\r
240 writeln("Quand on trouve un caractere non correspondant, on revient en arriere dans le");
\r
241 writeln("pattern d'un nombre n de positions.");
\r
242 writeln("n est donn
\82 par la table suivante:");
\r
243 writeln("caractere num :");
\r
244 writeln("hash code (=n) :");
\r
245 call couleur(jaune,noir);
\r
246 for i:=1 to upper(h)
\r
248 call setcursor(13+i*4,11);
\r
250 call setcursor(13+i*4,12);
\r
255 (* procedure d'affichage du texte *)
\r
257 UNIT AfficheChaine : procedure (p,s:arrayof char; posp,poss : integer);
\r
258 Var t , longs , longp : integer ;
\r
263 call setcursor(11,1);
\r
267 call couleur(jaune,bleu);
\r
269 call couleur(jaune,noir);
\r
273 call setcursor(1,4);
\r
277 call couleur(jaune,bleu);
\r
279 call couleur(jaune,noir);
\r
286 (* Procedure de calcul de la hash function, stockee dans une table *)
\r
288 UNIT KMPhash : function(p : arrayof char) : arrayof integer;
\r
289 var i, j : integer,
\r
290 h : arrayof integer ,
\r
294 (* initialisations *)
\r
301 (* boucle principale *)
\r
309 if (p(j) <> p(i)) then
\r
318 if (p(i) = p(j)) then h(i) := h(j);
\r
325 var i, j, m, n : integer,
\r
326 h : arrayof integer,
\r
327 sortie , resultat : boolean;
\r
329 (* Corps de l'algorithme KMP *******************)
\r
332 call afficheecran(p,s);
\r
334 (* initialisations *)
\r
343 (* boucle principale *)
\r
344 while ((i <= m) and (j <= n))
\r
351 if (p(i) <> s(j)) then
\r
354 call setcursor(1,14);
\r
355 call couleur(blanc,noir);
\r
356 write("On se deplace a la position : ",i);
\r
359 call affichechaine(p,s,i,j);
\r
361 call setcursor(1,14);
\r
362 call couleur(blanc,noir);
\r
364 call affichechaine(p,s,i+1,j);
\r
371 resultat := (i > m);
\r
372 call afficheresultat(resultat);
\r
375 (**************************************************************************)
\r
377 (* ALGORITHME DE KARP et RABIN *)
\r
379 (**************************************************************************)
\r
380 UNIT AlgoKarpRabin : procedure (p , s : arrayof char);
\r
382 (* Affichage de l'ecran et des commentaires *)
\r
384 UNIT Ecran : Procedure (hash : integer);
\r
386 call couleur(blanc,noir);
\r
387 call setcursor(1,8);
\r
388 write("Hash code du pattern :");
\r
389 call couleur(jaune,noir);
\r
391 call couleur(blanc,noir);
\r
392 writeln("Hash code du texte selectionne :");
\r
395 (* procedure d'affichage du texte *)
\r
397 UNIT AfficheChaine : procedure (s:arrayof char ; poss ,longp,hash:integer);
\r
398 Var t , longs : integer ;
\r
402 call couleur(jaune,noir);
\r
403 call setcursor(33,9);
\r
405 call setcursor(1,4);
\r
408 if ( (t>=poss) and (t<poss+longp) ) then
\r
409 call couleur(jaune,bleu);
\r
411 call couleur(jaune,noir);
\r
418 (* Procedure de calcul de la premiere valeur de la hash function *)
\r
420 UNIT hashfunction : function( str : arrayof char, m : integer ):integer;
\r
425 result := result + ord(str(a)) ;
\r
429 (* Procedure de calcul des valeurs suivantes de la hash function *)
\r
431 UNIT newhash : function( oldh , m ,j:integer, str : arrayof char ): integer;
\r
433 result:=oldh + ord(str(j+m)) - ord(str(j)) ;
\r
436 var j, m, n, a , d : integer,
\r
437 hpat, hstr : integer ,
\r
440 (* Corps de l'algorithme KR ************************)
\r
444 (* initialisations *)
\r
445 call afficheecran(p,s);
\r
450 hpat := hashfunction(p,m);
\r
451 hstr := hashfunction(s,m);
\r
455 (* boucle principale *)
\r
457 if ( hpat = hstr ) then
\r
458 call couleur(blanc,noir);
\r
459 call setcursor(1,12);
\r
460 write("Les deux hashcodes correspondent, on compare le pattern et la selection");
\r
463 while ((trouve) and (a <= m))
\r
465 if ( p(a) = s(j+a-1) ) then
\r
472 call couleur(blanc,noir);
\r
473 call setcursor(1,12);
\r
476 call affichechaine(s,j,m,hstr);
\r
477 if ( (j>= (n-m+1)) or ( trouve) ) then exit fi;
\r
478 hstr := newhash(hstr , m , j , s);
\r
482 call afficheresultat(trouve);
\r
485 (**************************************************************************)
\r
487 (* ALGORITHME DE BOYER et MOORE (modifi
\82 HORSPOOL) *)
\r
489 (**************************************************************************)
\r
490 UNIT AlgoBoyerMoore : procedure ( p , s : arrayof char);
\r
492 (* procedure d'affichage du texte *)
\r
494 UNIT AfficheChaine : procedure (s:arrayof char; poss : integer);
\r
495 Var t , longs : integer ;
\r
499 call setcursor(1,4);
\r
503 call couleur(jaune,bleu);
\r
505 call couleur(jaune,noir);
\r
512 (* Procedure de remplissage de la table Delta *)
\r
514 UNIT Delta : function (p : arrayof char) : arrayof integer ;
\r
516 Var d : arrayof integer,
\r
520 array d dim(1:127);
\r
522 (* initialisation *)
\r
526 (* calcul pour le pattern *)
\r
533 var j, m, n, a : integer,
\r
535 d : arrayof integer;
\r
538 (* Corps de l'algorithme BM ************************)
\r
541 (* initialisations *)
\r
542 call afficheecran(p,s);
\r
549 (* boucle principale *)
\r
550 while ( (j<=n) and (not trouve) )
\r
552 call affichechaine(s,j);
\r
553 if (s(j) = p(m)) then
\r
557 if (p(a)<>s(j-m+a)) then
\r
562 call couleur(blanc,noir);
\r
563 call setcursor(1,8);
\r
564 if (not trouve) then
\r
565 writeln("La derniere lettre du pattern ne correspond pas avec la lettre de la chaine");
\r
566 writeln("en surbrillance, alors on se deplace de ",d(ord(s(j))):2," positions");
\r
574 call afficheresultat(trouve);
\r
576 End AlgoBoyerMoore ;
\r
579 (* Procedure affichant le premier ecran et saisissant les choix *)
\r
581 UNIT EcranPrincipal : procedure ;
\r
582 var choix : integer ,
\r
583 p , s : arrayof char ;
\r
588 call couleur(blanc,noir);
\r
590 call setcursor(27,1);
\r
591 Write("Programme Pattern Matcher");
\r
592 call setcursor(27,2);
\r
593 Write("-------------------------");
\r
594 call setcursor(1,22);
\r
595 writeln("Tous les algorithmes s'executent en pas a pas, il faut appuyer sur une touche");
\r
596 write("pour faire s'executer le pas suivant...");
\r
598 call setcursor(1,6);
\r
599 writeln(" 1) Algorithme simple");
\r
600 writeln(" 2) Algorithme de Karp et Rabin");
\r
601 writeln(" 3) Algorithme de Knuth, Morris et Pratt");
\r
602 writeln(" 4) Algorithme de Boyer et Moore");
\r
603 writeln(" 5) Quitter le programme");
\r
605 write("Votre choix : ");
\r
607 if (choix < 5) then
\r
609 writeln("Saisie de la chaine ou on recherche le pattern :");
\r
610 call couleur(jaune,noir);
\r
612 call couleur(blanc,noir);
\r
613 writeln("Saisie du pattern a rechercher :");
\r
614 call couleur(jaune,noir);
\r
616 call couleur(blanc,noir);
\r
618 when 1 : call algoSimple(p,s);
\r
619 when 2 : call algoKarpRabin(p,s);
\r
620 when 3 : call algoKMP(p,s);
\r
621 when 4 : call algoBoyerMoore(p,s);
\r
625 End EcranPrincipal;
\r
628 (***************************************************************************)
\r
629 (* PROGRAMME PRINCIPAL *)
\r
630 (***************************************************************************)
\r
634 call ecranprincipal;
\r