Professional Documents
Culture Documents
A LIRE ABSOLUMENT
Pour maitriser les concepts de base il ne sagit pas de faire beaucoup dexercices car sils se ressemblent un seul
suffit. Mais il faut cibler quelques exercices bien choisis et surtout essayer de les rsoudre tout seul. Pour cela, il faut bien
entendu connatre son cours et cest seulement aprs quil faut attaquer les exercices. Cela est commun toutes les
matires.
Dans le cas de lalgorithmique, le but essentiel est de matriser le processus de dveloppement mais aussi de
sinterroger chaque tape du raisonnement de la cohrence de votre solution. Une fois que vous maitriserez ce
processus, vous pourrez affronter nimporte quel problme. Donc lorsque vous faites un exercice, ne le faites pas de faon
machinale mais vrifiez chaque tape que vous respectez la dmarche tudie et posez-vous les bonnes questions au bon
moment. Une fois que la dmarche est bien intriorise, vous commencerez lappliquer de faon naturelle. Arriv ce
niveau vous verrez par vous mmes les progrs que vous aurez accomplis et la facilit avec laquelle vous aborderez les
problmes les plus difficiles.
Dans les problmes que vous aurez rsoudre, les structures de donnes ncessaires votre solution peuvent
parfois vous tre imposes mais dans dautres cas cest vous de les proposer, lessentiel nest pas de trouver la mme
solution que votre enseignant ou lauteur dun livre, mais den proposer une qui soit logique, qui correspond au problme
rsoudre mais surtout den tenir compte tout au long de votre conception.
Les trois exercices qui vous sont proposs sont tous diffrents, non pas par rapport au sujet quils traitent mais par
rapport aux concepts quils mettent en uvre.
Dans le premier, une fois que la structure de donnes est arrte, la solution en elle mme nest pas complique si
on connat son cours. Il sagit de bien connatre comment on dclare un enregistrement et comment on manipule ses
diffrents champs ? Et bien sur de connatre les notions de base sur les chanes de caractres et les tableaux.
Dans le deuxime exercice lanalyse est pratiquement donne dans le sujet mais elle ncessite une connaissance
correcte des tableaux 2 dimensions, un bon dcoupage, un bon jeu dessai et une vigilance dans le droulement.
Dans le troisime exercice, outre la connaissance correcte des tableaux 2 dimensions cest la comprhension du
problme qui va ncessiter de lattention, car une fois que lon a compris le problme son analyse nest en principe pas
trs difficile.
Dans le quatrime exercice, la comprhension du problme nest pas dure, si on a dj fait le troisime exercice
mais cest lanalyse qui va exiger de la concentration et de la rflexion. Une fois cet cueil surmont il faut savoir
comment exprimer son ide et faire trs attention lors du droulement.
Ne faites pas des algorithmes comme si cest une corve mais prenez du plaisir affronter les problmes et
surtout les surmonter, les dcouper, concevoir la solution mais aussi la raliser.
Ne consulter pas les solutions des problmes au dpart, cest une trs mauvaise faon dapprendre.
Commencez, selon les exercices proposs, par imaginer une structure de donnes si elle ne vous est pas impose,
puis procder au dcoupage et sa justification. A ce moment, et si vous le souhaitez ou alors si vous tes
compltement bloqu confrontez votre proposition la solution. Attention ! Il ne sagit pas de trouver exactement la
mme chose mais dtre cohrent. Une structure de donne diffrente peut aboutir un dcoupage diffrent. Un problme
peut avoir plusieurs solutions. On peut dcouper une mme ide de faons diffrentes. Le plus important est que votre
dcoupage soit logique. Vrifiez les interfaces de vos modules et soignez particulirement leurs rles, qui doivent tre
prcis, clairs et concis.
Une fois ces deux tapes franchies, le reste ne pose pas de problme particuliers. Construisez chaque module
SEPAREMENT (analyse, algorithme, jeu dessai bien choisi et droulement).
Ouf ! La conception est termine. Attaquez la ralisation. La aussi pas de secret, il faut connatre le minimum
pour programmer, avoir TOUJOURS porte de main la documentation fournie et surtout la consulter chaque erreur.
Lorsque vous saurez utiliser correctement cette documentation et retrouver tout seul vos erreurs et les corriger vous
venez de faire un grand pas vers lAUTONOMIE. Cest le but ultime dune bonne cole.
Voila ! Ce que je vous propose est une trs bonne prparation votre examen. Attention ! le sujet sera totalement
diffrent mais la dmarche sera la mme.
Nous sommes arrivs au terme du cours, faites votre propre diagnostic, travaillez surtout les aspects dans lesquels
vous manquez dassurance.
Abordez ces exercices comme des jeux, sans stress inutile !
La veille de votre examen, faites un peu de sport ou simplement quelques kilomtres de marche rapide, dormez
de bonne heure. Le jour de lpreuve, prenez un bon petit djeuner et un jus dorange (citron, pamplemousse) et
concentrez vous sur votre preuve, et seulement votre preuve.
Bonne chance tous !
1 / 21
Merci denvoyer vos remarques , critiques et observations : B_CHERGOU@ESI.dz
ESI CPI1 - Cours dAlgorithmique Exercices avec corrigs
EXERCICE 1 :
Nous souhaitons construire un objet qui a les caractristiques suivantes :
Il contient une phrase que lon saisira et en mme temps
1. un tableau dont chaque lment contiendra un mot constituant cette phrase
2. le nombre de mots
3. et un autre tableau qui contiendra la frquence dapparitions de chaque lettre de lalphabet et ses positions dans la
phrase donne
Une fois le traitement termin nous afficherons cet objet de la manire suivante :
Nota : les mots de la phrase sont spars par un ou plusieurs blancs et il ny a pas de caractres spciaux
SOLUTION :
La premire tape consiste dcrire lobjet. Comme il est compos dautres objets de types diffrents, sa structure sera de
type enregistrement.
Plusieurs solutions sont possibles, lessentiel est de proposer une structure cohrente qui rpond notre problme mais
surtout de la respecter tout au long de notre solution.
On prendra donc celle qui dcoule naturellement de notre nonc.
Notre enregistrement contiendra :
1. la phrase donne
2. un tableau une dimension qui contiendra les diffrents mots
3. le nombre de mots
4. un tableau deux dimensions, de 26 lignes, dont chacune correspondra une lettre de lalphabet ( de A Z). La
1re colonne, de chaque ligne, contiendra la frquence (nombre) dapparitions de la lettre, et les autres colonnes
contiendront les positions ou apparat la lettre.
Nota : pour ce deuxime tableau plusieurs solutions sont possibles
E= ENREGISTREMENT
ph : Chane
Tmot : tab3
NbMots: Entier
T2 : tab2
FIN
Procdons maintenant notre dcoupage. Pour cela il suffit de complter lenregistrement partir dune phrase donne et
ensuite de lafficher selon une forme prcise. On aura ainsi besoin :
dun module (DECMOTS) qui va nous donner les diffrents mots qui composent notre phrase et leur nombre
dun module (FREQPOS) qui fournit la frquence dapparitions dune lettre donne dans une chaine de mme que ses
diffrentes positions
2 / 21
Merci denvoyer vos remarques , critiques et observations : B_CHERGOU@ESI.dz
ESI CPI1 - Cours dAlgorithmique Exercices avec corrigs
3 / 21
Merci denvoyer vos remarques , critiques et observations : B_CHERGOU@ESI.dz
ESI CPI1 - Cours dAlgorithmique Exercices avec corrigs
CONSTRUCTION DU MODULE FREQPOS
Analyse : on parcourt la chaine on compte, ds que lon rencontre le caractre L, on incrmente un compteur et on met sa
position dans POS
Procedure Freqpos (c: Chane ;L: caractre; var freq: Entier ;var Pos : tab1);
Variables i, k : Entier
DEBUTfreq:=0
k:=1
Pour i allant de 1 length(c) Faire
Si upcase(c[i]) = upcase(L) Alors
DSI
freq freq +1
pos[k] i
k k+1
FSI
FIN
Nota : vous avez constat lintrt dutiliser la fonction CHR(x) elle nous permet dviter des Si en cascade.
Si i = 1 alors lettre A
Sinon si i = 2 alors lettre B
Sinon si i = 3 alors lettre C (..cela 26 fois)
4 / 21
Merci denvoyer vos remarques , critiques et observations : B_CHERGOU@ESI.dz
ESI CPI1 - Cours dAlgorithmique Exercices avec corrigs
ALGORITHME exo_sup01
type tab1= Tableau [1..100] dentiers
tab2 = Tableau [1..26,1..100] dentiers
Tab3 = Tableau [1..100] de chane[25]
E= ENREGISTREMENT
ph : chane
Tmot : tab3
NbMot s: entiers
T2 : tab2
FIN
variables tabP : E
f, i, j: entiers
p : tab1
p2 : tab2
TfrPos : tab2
lettre: caractre
Procdures DECMOTS , FREQPOS
DEBUT
Ecrire ('Donner votre phrase : ')
Lire (TabP.ph)
DecMots(tabP.ph,tabp.Tmot,tabp.Nbmots)
Pour I allant de 1 26 Faire
Dpour
Lettre CHR(64+i)
FREQPOS(TAbP.ph,lettre,f,p)
tabP.T2[i,1] f
for j:=1 to F do
TabP.T2[i,j+1] p[j]
Fpour
Saut de ligne
Ecrire ('Phrase donnee : ', tabp.ph)
Saut de ligne
Ecrire ('Elle contient ' , tabP.NbMots, ' mots et qui sont : ')
Pour i allant de 1 tabP.NbMots Faire
Ecrire (tabP.Tmot[i] , ' | ')
Saut de ligne
Pour i allant de 1 26 Faire
Dpour
Si tabP.T2[i,1] <> 0 Alors
Dsi
Ecrire (chr(64+i), ' apparait ' , tabP.T2[i,1], ' fois et dans les positions : ')
Pour j allant de 1 tabP.T2[i,1] Faire
Ecrire ( TabP.T2[I , j+1] , ' ,')
Saut de ligne
Fsi
Fpour
FIN
5 / 21
Merci denvoyer vos remarques , critiques et observations : B_CHERGOU@ESI.dz
ESI CPI1 - Cours dAlgorithmique Exercices avec corrigs
LES PROGRAMMES
MODULE FREQPOS
MODULE FDECMOTS
//donne un tableau qui contient les mots qui compose la chaine C et leur nombre (NbM)
// type Tab3 = array[1..100] of string[25];
var i :integer;
mot :string[25];
BEGIN
Nbm:=0;
mot:='';
for i := 1 to length(c) do
if c[i] =' ' then
BEGIN
if mot <> ' ' then
BEGIN
Nbm := Nbm +1;
t[Nbm] := mot;
mot:='';
END;
END
else mot :=mot + c[i];
if mot <> ' ' then
BEGIN
Nbm := Nbm +1;
t[Nbm] := mot;
END;
END;
6 / 21
Merci denvoyer vos remarques , critiques et observations : B_CHERGOU@ESI.dz
ESI CPI1 - Cours dAlgorithmique Exercices avec corrigs
PROGRAMME PRINCIPAL
program exo_sup01;
// exercice sur les objets de types enregistrement, tableaux et chaine de caracteres
uses Crt;
type tab1= array[1..100] of integer;
tab2 = array[1..26,1..100] of integer;
Tab3 = array[1..100] of string[25];
E = record
ph : string;
Tmot: tab3;
NbMots:integer;
T2:tab2;
END;
var tabP :E;
f,i,j:integer;
p:tab1;
p2 :tab2;
TfrPos:tab2;
lettre:char;
{$i c:\algo\modules\DECMOTS.pro}
{$i c:\algo\modules\FREQPOS.pro}
BEGIN
clrscr;
Write('Donner votre phrase : ');
readln(TabP.ph);
DecMots(tabP.ph,tabp.Tmot,tabp.Nbmots); // on extrait les mots et leur nombre
// on remplit le tableau qui contient les frequences et les positions de chaque lettre
for i:=1 to 26 do
BEGIN
lettre:=CHR(64+i); // pour avoir les 26 lettres de l'alphabet
FREQPOS(TAbP.ph,lettre,f,p); //on evalue la frequence de chaque
//lettre et ses positions
tabP.T2[i,1] := f; //on complete l'enregistrement
for j:=1 to F do
TabP.T2[i,j+1]:=p[j];
END;
Writeln;
// affichage selon le format donne
writeln('Phrase donnee : ',tabp.ph);
writeln;
writeln('Elle contient ',tabP.NbMots, ' mots et qui sont : ');
for i := 1 to tabP.NbMots do
write(tabP.Tmot[i], ' | ');
writeln;
writeln;
for i := 1 to 26 do
BEGIN
if tabP.T2[i,1] <> 0 then
BEGIN
write(chr(64+i), ' apparait ', tabP.T2[i,1],' fois et dans les positions
: ');
for j := 1 to tabP.T2[i,1] do
write ( TabP.T2[i,j+1],' ,');
writeln;
END;
END;
readln;
END.
7 / 21
Merci denvoyer vos remarques , critiques et observations : B_CHERGOU@ESI.dz
ESI CPI1 - Cours dAlgorithmique Exercices avec corrigs
RESULTATS
Essayer maintenant de faire le travail inverse. On donne le tableau qui contient la frquence des
caractres et leurs positions et on veut reconstruire la phrase de dpart que mme que son
dcoupage en mots et leur nombre.
Sauriez-vous le faire ?
8 / 21
Merci denvoyer vos remarques , critiques et observations : B_CHERGOU@ESI.dz
ESI CPI1 - Cours dAlgorithmique Exercices avec corrigs
EXERCICE 2 :
Le dterminant dune matrice est une valeur scalaire. Si vous prenez une matrice carre de 2 sur 2,
A 1 2
1 x11 x12
2 X21 X22
A 1 2
1 1 2
2 3 4
Le dterminant est gal (1 * 4 ) ( 2 * 3 =) = -2
Det ( A) = ( 1) + ij
avec i = 1
ij
j =1
Un cofacteur dindices i,j est dfini comme lensemble des lments de la matrice dont la ligne i et la colonne j sont
enleves. Par exemple, dans la matrice carre A(3,3)
A 1 2 3
1 1 2 3
2 4 5 6
3 7 8 0
Cofacteur21(A) =
1 2
1 1 3
2 8 0
5 6 4 6 4 5
DetA = +1* Det ( ) 2 * Det ( ) + 3 * Det ( )
8 0 7 0 7 8
9 / 21
Merci denvoyer vos remarques , critiques et observations : B_CHERGOU@ESI.dz
ESI CPI1 - Cours dAlgorithmique Exercices avec corrigs
Dcoupage modulaire :
Algorithme :
DEBUT
det2 a[1,1] * a[2,2] - a[1,2] * a[2,1]
FIN
Analyse
Il faut ignorer les lments de T se trouvant sur la ligne i et sur la colonne j, pour cela :
Attention : Les indices Lco et Cco progressent videmment de faon diffrente que m et n . leur bornes sont L-1 et C-1
(puisque COF aura une ligne et une colonne en moins que T).
Algorithme
Procedure cofact (T : tab2 ; l, c, i, j : entier; var cof : tab2 ; var lco, cco : entier)
Variables m, n, l2, c2:entier
DEBUT
Lco 1
Cco 1
Pour m Allant de 1 l Faire
Pour n Allant de 1 c Faire
Si (m<>i) ET (n<>j) Alors
Dsi
cof[lco,cco] T[m,n];
l2 lco
c2 cco
cco cco+1
Si cco > c-1 Alors
Dsi
Cco 1
Lco lco+1
Fsi
Fsi
Lco l2
Cco c2
FIN
Algorithme
DEBUT
Res 0
Pour j Allant de 1 3 Faire
Dpour
Cofact(t, 3, 3, 1, 1, cf, l, c)
Res res + puiss(-1,j + 1) * t[1,j] * det2(cf)
Fpour
det3 res
FIN
11 / 21
Merci denvoyer vos remarques , critiques et observations : B_CHERGOU@ESI.dz
ESI CPI1 - Cours dAlgorithmique Exercices avec corrigs
ALGORITHME exosup01
type Tab2=Tableau[1..100,1..100] dentier
variables A: tab
x, y: Entier
Procdure lect2d
Fonction DET3
DEBUT
lect2d(A,x,y);
writeln(DET3(A))
FIN.
PROGRAMMES
function Det2(a:tab2):integer;
BEGIN
det2:=a[1,1]*a[2,2]-a[1,2]*a[2,1];
END;
=============================================================================
Procedure cofact(T:tab2;l,c,i,j:integer; var cof:tab2;var lco,cco :integer);
var m,n,l2,c2:integer;
Begin
lco:=1;
cco:=1;
for m:=1 to l do
for n:=1 to c do
if (m<>i) and (n<>j) then
Begin
cof[lco,cco]:= T[m,n];
l2:=lco;
c2:=cco;
cco:=cco+1;
if cco > c-1 then
Begin
cco:=1;
lco:=lco+1;
End;
End;
lco:=l2;
cco:=c2;
End;
============================================================================
function det3(var t:tab2):longint;
(* ---------- donne le determinant d'une matrice carree d'ordre 3 ------- *)
var j,l,c,res: integer;
Cf:tab2;
{$i E:\Algo\modules\puiss.fon}
{$i E:\Algo\modules\cofact.pro}
{$i E:\Algo\modules\det2.fon}
12 / 21
Merci denvoyer vos remarques , critiques et observations : B_CHERGOU@ESI.dz
ESI CPI1 - Cours dAlgorithmique Exercices avec corrigs
Begin
res:=0;
for j:= 1 to 3 do
Begin
Cofact(t,3,3,1,j,cf,l,c);
res:= res + puiss(-1,j+1)*t[1,j]*det2(cf);
End;
det3:=res;
End;
==============================================================================
program exosup01;
uses wincrt;
type Tab2=array[1..20,1..20] of integer;
var A,C: tab2;
x,y,:integer;
{$i E:\Algo\modules\lect2d.pro}
{$i E:\Algo\modules\det3.fon}
BEGIN
lect2d(a,x,y);
writeln(' Le determinant de la matrice d''ordre 3 est : ',Det3(a));
END.
13 / 21
Merci denvoyer vos remarques , critiques et observations : B_CHERGOU@ESI.dz
ESI CPI1 - Cours dAlgorithmique Exercices avec corrigs
EXERCICE 3
Qu'est ce qu'une grille autorfrente ?
Une grille autorfrente est une matrice de cinq (5) lignes et cinq (5) colonnes. Elle est compose de deux (2) parties :
1. une partie A (grise) compose des 2 colonnes de gauche
2. une partie B des 3 colonnes de droite
A
B
4 2 1 2 2
5 1 2 4 5
1 1 5 6 7
2 0 8 0 0
3 6 0 0 0
Problme ; comment remplir la partie B dune grille autorfrente dont on vous donne la partie A ?
A
B
4 2 0 0 0
5 1 0 0 0
1 1 0 0 0
2 0 0 0 0
3 6 0 0 0
14 / 21
Merci denvoyer vos remarques , critiques et observations : B_CHERGOU@ESI.dz
ESI CPI1 - Cours dAlgorithmique Exercices avec corrigs
SOLUTION
Dcoupage Modulaire : nous constatons quune case de la partie A nous donne le nombre dun chiffre donn dans le
tableau, ce chiffre pouvant aussi se trouver dans la partie A. nous allons donc compter le nombre dapparitions de ce
chiffre dans la grille de dpart (ou seule la partie A est donne) grce au module ComptVal. Et partir de l, nous allons
complter ventuellement la partie B. Par exemple si le chiffre 1 doit apparatre 5 fois , mais il existe dj 2 fois dans la
partie A , nous allons mettre trois 1 dans la partie B et ce grce au module CompleteB. A partir de ces deux modules nous
pouvons alors remplir toute la partie B partir de la partie A (module AutorefB). On aura aussi besoin des modules
Lect1d (T,l,c) et ecrit2d(T,l,c) , dj construits pour lire la grille initiale et crire la grille remplie.
PROCEDURE
T : Tab2
Chif : entier
Construction de COMPTVAL
Analyse :
On parcourt tout le tableau T et chaque fois que T[i,j]= val on incrmente un compteur (CPT)
DEBUT
Cpt 0
Pour i allant de 1 l faire
Pour j allant de 1 c faire
Si t[i,j]=val Alors cpt cpt+1
COMPTVAL cpt
FIN
15 / 21
Merci denvoyer vos remarques , critiques et observations : B_CHERGOU@ESI.dz
ESI CPI1 - Cours dAlgorithmique Exercices avec corrigs
Construction de COMPLETEB
Analyse :
On remplit Nb cases de T qui contiennent 0 par le chiffre donn
Mais en commenant par la 3ime colonne.
DEBUT
I1
J 3
K
rpeter
Si T[i,j] = 0 Alors
DSI
T[i,j] chiffre
K k+1
FSI
J j+1
Si j>5 Alors
DSI
I i+1
j 3
FSI
Jusqu' k=nb
FIN
Construction de AUTOREFA
Analyse :
Chiffre = 1
on fait varier j de 1 2 La partie A na que 2 colonnes
On fait varier i de 1 5 la grille a 5 colonnes
On compte le nombre d'apparitions du chiffre Chiffre dans la grille
nb = COMPTVAL(T,5,5,chiffre)
on complte T de faon ce que T[i,j] Nb cases contiennent chiffre
COMPLETEB(T,T[i,j] nb,chiffre)
on incrmente chiffre
(attention si chiffre > 9 on y met 0,) pour traiter le chiffre 0
DEBUT
Chiffre 1
Pour j allant de 1 2 faire
Pour i allant de 1 5 faire
DPOUR
Nb COMPTVAL(T, 5, 5, chiffre)
COMPLETEB(T, T[i,j] - nb, chiffre)
Chiffre chiffre+1
Si chiffre > 9 Alors chiffre 0
FPOUR
16 / 21
Merci denvoyer vos remarques , critiques et observations : B_CHERGOU@ESI.dz
ESI CPI1 - Cours dAlgorithmique Exercices avec corrigs
FIN
PROGRAMMES
================================================================================
function COMPTVAL(T:tab2;l,c,val:integer):integer;
var i,j,cpt:integer;
BEGIN
cpt:=0;
for i:=1 to l do
for j:= 1 to c do
if t[i,j]=val then cpt:= cpt+1;
COMPTVAL := cpt;
END;
procedure COMPLETEB(VAR T:tab2;nb,chiffre:integer);
var i,j,k:integer;
BEGIN
i:=1;
j:=3;
k:=0;
repeat
begin
if T[i,j] = 0 then
begin
T[i,j]:= chiffre ;
k:=k+1;
end;
j:=j+1;
if j>5 then
begin
i:= i+1;
j:=3;
end;
end;
until k=nb;
END;
procedure AUTOREFB(var T:tab2);
var i,j,chiffre,nb:integer;
{$i E:\Algo\modules\comptVal.fon}
{$i E:\Algo\modules\CompleteB.pro}
BEGIN
chiffre:=1;
for j:=1 to 2 do
for i:= 1 to 5 do
Begin
nb:= COMPTVAL(T,5,5,chiffre);
COMPLETEB(T,T[i,j]-nb,chiffre);
chiffre:=chiffre+1;
if chiffre >9 then chiffre :=0;
end;
END;
===========================================================================
program exosup03;
17 / 21
Merci denvoyer vos remarques , critiques et observations : B_CHERGOU@ESI.dz
ESI CPI1 - Cours dAlgorithmique Exercices avec corrigs
uses crt;
type tab2=array [1..5,1..5] of integer;
var i:integer;
A : tab2;
{$i E:\Algo\modules\AutorefB.pro}
{$i E:\Algo\modules\lect2d.pro}
{$i E:\Algo\modules\ecrit2d.pro}
BEGIN
clrscr;
lect2d(A,i,i);
AUTOREFB(A);
Writeln ('Remplissage de la partie B d''une grille autoreferente');
ecrit2d(A,5,5);
readln;
END.
RESULTATS
18 / 21
Merci denvoyer vos remarques , critiques et observations : B_CHERGOU@ESI.dz
ESI CPI1 - Cours dAlgorithmique Exercices avec corrigs
EXERCICE 4
A
B
0 0 1 2 2
0 0 2 4 5
0 0 5 6 7
0 0 8 0 0
0 0 0 0 0
SOLUTION
La solution est un peu plus complexe que la prcdente et il faut absolument trouver la solution de lexemple
compltement afin de bien observer comment il faut remplir la partie A ?
Dcoupage Modulaire : on aura besoin de compter le nombre dapparitions dun chiffre dans la grille de dpart (ou
seule la partie B est donne) grce au module ComptVal dj construit. Et partir de l, nous allons complter la partie A
(module AutorefA). On aura aussi besoin des modules Lect1d (T,l,c) et ecrit2d(T,l,c) , dj construits pour lire la grille
initiale et crire la grille remplie.
Analyse :
Le petit problme, cest quen remplissant la partie A , nous pouvons y mettre un chiffre que nous avons dj compt. Par
exemple si le chiffre 1 apparat 1 fois dans la grille, on va mettre 1 dans la partie A. Dans ce cas le 1 apparaitra 2 fois
dans la grille, cest ce petit problme qui sera rgl dans le module AutorefA.
Donc, on va remplir la partie A (qui contient au dpart des zros) de faon automatique, mais chaque fois quon la
modifie ,il faudra la remplir nouveau. On sarrtera quand ? eh bien ! Quand elle ne sera plus modifie. Et cest un
aiguillage boolen que lon utilisera pour cela.
Aig = faux (cet aiguillage servira savoir si une case de la partie A de la grille a t modifi)
on rptera ce qui suit tant que aig = faux
on met vrai dans aig ( lorsque l'on ne modifie plus T cela signifie que la partie A de la grille est
correcte)
chiffre =1 (cest le chiffre dont on cherchera le nombre dapparitions)
on fait varier j :1 , 2 (les 2 colonnes de la partie A)
on fait varier i : 1, 2,..,5 et chaque fois les 5 lignes de la partie A)
on compte le nombre d'apparitions de chiffre dans la grille
nb_App = COMPTVAL(T, 5, 5, chiffre)
si t[i,j] <> nb_app (on fait le nombre de chiffres est diffrent de celui de la partie A)
o t[i,] = nb_app
o on met faux dans aig (on signale que la partie A a t modifie)
on incrmente Chiffre (attention si chiffre >9 on y met 0) (traitement du zro)
19 / 21
Merci denvoyer vos remarques , critiques et observations : B_CHERGOU@ESI.dz
ESI CPI1 - Cours dAlgorithmique Exercices avec corrigs
DEBUT
aig faux
tant que aig = faux faire
DTQ
Aig vrai
chiffre 1
Pour j allant de 1 2 faire
Pour i allant de 1 5 faire
DPOUR
nb_app COMPTVAL(T, 5, 5, chiffre)
Si T[i,j] <> nb_app Alors
DSI
T[i,j] nb_app
aig Faux
FSI
chiffre chiffre +1
Si chiffre > 9 Alors chiffre 0
FPOUR
FTQ
FIN
var aig:boolean;
chiffre,i,j,nb_app:integer;
{$i E:\Algo\modules\comptVal.fon}
BEGIN
aig :=false;
while aig=false do
begin
aig:=true;
chiffre :=1;
for j:=1 to 2 do
for i := 1 to 5 do
begin
nb_app:= COMPTVAL(T,5,5,chiffre);
if T[i,j] <> nb_app then
begin
T[i,j] := nb_app;
aig:=false;
end;
chiffre := chiffre +1;
if chiffre >9 then chiffre :=0;
end;
end;
END;
20 / 21
Merci denvoyer vos remarques , critiques et observations : B_CHERGOU@ESI.dz
ESI CPI1 - Cours dAlgorithmique Exercices avec corrigs
ALGORITHME emd3_2004
DEBUT
assigner(Fic_A,'a:autoref_A.dat')
assigner(Fic_A,'a:autoref_B.dat')
assigner(Fic_R,'a:autoref.dat')
reset(fic_A)
reset(fic_B)
rewrite(Fic_R)
tant que eof(Fic_A) faire
DTQ
lire(fic_A,FENETRE)
AUTOREFA(FENETRE)
ecrire(Fic_R,FENETRE)
FTQ
Tant que eof(Fic_B) faire
DTQ
lire(fic_B,FENETRE)
AUTOREFB(FENETRE)
ecrire(Fic_R,FENETRE)
FTQ
fermer(Fic_B)
fermer(Fic_R)
FIN.
21 / 21
Merci denvoyer vos remarques , critiques et observations : B_CHERGOU@ESI.dz