Les structures de contrôle itératives
I. INTRODUCTION
Le traitement conditionnel, combinant test et séquence, permet d’exécuter chaque action 0 ou 1 fois. Nous aurons parfois besoin d’exécuter une séquence d’actions, plusieurs fois. Le nombre de fois peut être quelconque. C’est l’objet des structures répétitives ou itératives ou boucles.
II. LA STRUCTURE ITERATIVE COMPLETE (La boucle Pour)
1. N
OTATIONNotation au niveau de l’analyse et
en algorithmique Notation en Turbo Pascal [Init]
Pour Compteur De Vi À Vf Répéter Inst1
Inst2
……
Inst n FinPour
[Init] ;
For Compteur := Vi To Vf Do Begin
Inst1 ; Inst2 ;
…… ; Inst n ; End ;
2. R
EMARQUES RELATIVES À LA STRUCTUREP
OUR La boucle POUR est considérée comme une structure répétitive complète car le nombre d’itérations est connu au préalable. En effet on dispose de :
(Vf – Vi+1) itérations dans le cas où le compteur est du type entier.
(Ord (Vf) – Ord (Vi) + 1) itérations dans le cas où le compteur est du type caractère.
La partie INIT contient les éventuelles initialisations des variables qui seront mises à jour au niveau du traitement répétitif.
Le compteur doit être de type scalaire simple.
Vi et Vf sont respectivement la valeur initiale et la valeur finale du compteur.
L'avancement du compteur est automatique.
Il se fait par un pas = 1 (Pour Compteur De Vi À Vf Répéter) ; avec Vi ≤ Vf
Il se fait par un pas = -1 (Pour Compteur De Vf A Vi Répéter) ; avec Vi ≤ Vf
Lorsque le pas = -1; la notation en Turbo Pascal change : For Compteur := Vf Downto Vi Do
Le traitement répétitif de la boucle Pour peut s'exécuter n fois (n≥1).
Lorsque le traitement répétitif est composé de plus qu'une instruction, les expressions Begin et End sont nécessaires.
3. L
A NOTION DE TRACE D’
EXÉCUTIONLa notion de trace d'exécution permet de bien comprendre la notion de boucle (itérations).
Exemple :
4. A
PPLICATIONSoit à afficher la moyenne arithmétique ma d’une classe de n élèves dont les moyennes me sont saisies au clavier.
a. Pré analyse
Il s’agit d’afficher la moyenne arithmétique d’une classe de n élèves. Cette moyenne est égale au total des moyennes générales divisé par le nombre des élèves n. Ce total est obtenu ainsi :
initialiser le total à 0
pour chaque élève, il s’agit de saisir sa moyenne et mettre à jour le total.
Le nombre des élèves n est une donnée.
b. Analyse
Résultat = Ecrire (Moyenne) Moyenne Total / n
Total = [Total 0 ]
Pour i de 1 à n répéter
Ecrire (" Introduire une moyenne ") ME = Donnée (" ME",i, "= ") Total Total + ME
FinPour
n = Donnée("Donner le nombre d’élève")
c. Algorithme
0- Début Calcul_moy
1- Ecrire (" Introduire le nombre des élèves : "), Lire (n) T 0
Pour i de 1 à n répéter Prenons la structure Pour suivante
S 0
Pour i De 1 A 5 Répéter S - S + 2 * i
FinPour
La trace d’exécution sera la suivante : Etat initial: S = 0
N° de l’itération 1 2 3 4 5
Valeur de i 1 2 3 4 5
Valeur de S 2 6 12 20 30 On quitte la boucle Pour avec i = 5 et S = 30
Ecrire (" Introduire une moyenne : ") Lire (ME) T T + ME
FinPour 2- M T / n 3- Ecrire (M) 4- Fin Calcul_moy
Tableau de déclaration des objets
Objet Code Type/Nature Rôle
ME n
i Total Moyenne
ME n
i T M
Réel Entier Entier Réel Réel
Saisie de la moyenne d’u élève Saisie du nombre des élèves Compteur
Calcul du total des moyennes Calcul de la moyenne arithmétique
d. Traduction en Pascal
Program Calcul_moyenne ; Uses wincrt ;
Var me,Total, Moyenne :real ; n,i:integer;
Begin
Writeln(‘introduire le nombre d’’eleves : ’) ; Readln(n) ;
Total :=0 ;
For i := 1to n do begin
Writeln(‘introduire une moyenne’);
Readln (me);
Total :=Total+me ; End ;
Moyenne :=Total/n ;
Writeln(‘la moyenne de la classe est : ‘,Moyenne) ; End.
III. LA STRUCTURE ITERATIVE A CONDITION D’ARRET (La boucle Répéter)
1. N
OTATIONNotation au niveau de la grille et en algorithmique
Notation en Turbo Pascal [Init]
Répéter Inst1 Inst2 …..
Instn Jusqu’à condition
[Init] ; Repeat
Inst1 ; Inst2 ; ….. ; Instn ; Until condition ;
2. R
EMARQUES RELATIVES A LA STRUCTURE REPETER S'il y a un éventuel compteur, il faut l'initialiser avant la boucle ; de même on doit assurer son avancement au sein de la boucle.
Le traitement répétitif de la boucle Répéter peut s'exécuter 1 ou n fois (n ≥ 2).
La condition à vérifier à chaque fois est considérée comme une condition de sortie car elle nous permet de quitter la boucle.
Même si le traitement répétitif est composé de plusieurs instructions, on n'a jamais besoin des expressions Begin et End.
La boucle répéter est utilisée entre autres dans le contrôle des données saisies.
3. A
PPLICATIONSoit à saisir une suite de réels et d’afficher la partie entière de chaque nombre.
Remarque : On suppose que la suite contient au moins un élément.
a. Analyse
Résultat = Affichage Affichage = [ ] Répéter
Elément = Donnée ("Introduire un réel ")
Ecrire ("La partie entière de",Elément,"est:",INT(Elément)) Répéter
Réponse = Donnée (" Y a t il un autre réel à saisir ? ") Jusqu’à ( Majus ( réponse ) Dans ["O","N"] )
Jusqu’à ( Majus ( réponse ) = " N" ) Remarque :
Pour éviter d’écrire Jusqu’à (réponse Dans ["o","O","n","N"]), on utilise la fonction Majus qui transforme un caractère en un caractère majuscule si c’est possible.
b. Algorithme
0- Début Partie_entière 1- Répéter
Ecrire (" Introduire un réel : "), Lire (E)
Ecrire (" La partie entière de ", E , " est : ",INT(E) ) Répéter
Ecrire ("Y a t il un autre réel à saisir ? "),Lire(R) Jusqu’à ( Majus ( R ) Dans ["O","N"] )
Jusqu’à ( Majus ( R ) = " N " ) 2- Fin Partie_entière
Tableau de déclaration des objets
Objet Code Type/Nature Rôle
Elément Réponse
E R
Réel Caractère
Saisie d’un réel
Saisie de la réponse ( O pour oui et N pour non )
c. Traduction en Pascal
Program Partie_entiere ; Uses wincrt ;
Var e :real ; r :char ; begin
Repeat
Writeln(‘introduire un reel: ‘); readln (e);
Writeln (‘la partie entiere de ‘,e,’est’,int(e));
Repeat
Writeln(‘y a-t-il un autre reel a saisir ? ‘) ; readln(r) ; Until (upcase(r) in [‘O’,’N’]);
Until (upcase(r) =’N’); //Fin de la saisie//
End.
IV. LA STRUCTURE ITERATIVE A CONDITION D’ARRET ( La boucle Tant que )
1. N
OTATIONNotation au niveau de la grille et en algorithmique
Notation en Turbo Pascal Init
Tant que condition Faire Inst1
Inst2
…..
Instn Fin Tant que
Init ;
While condition Do Begin
Inst1 ; Inst2 ;
….. ; Instn ;
End ;
2. R
EMARQUES RELATIVES A LA STRUCTURET
ANT QUE S'il y a un éventuel compteur, il faut l'initialiser avant la boucle; de même on doit assurer son avancement au sein de la boucle.
Le traitement répétitif de la boucle Tant que peut s'exécuter 0 ou n fois ( n > l ). 0 fois, lorsque dés le début, la condition n'est pas vérifiée.
La condition à vérifier à chaque fois est considérée comme une condition d'entrée car elle nous permet d'accéder au corps de la boucle.
Si le traitement répétitif est composé de plusieurs instructions, on doit utiliser les expressions Begin et End.
3. A
PPLICATIONSoit à saisir une suite de réels et d'afficher la partie entière de chaque nombre.
Remarque : On suppose que la suite peut être vide.
a. analyse
Résultat = Affichage
Affichage = [ ] Tant Que Majus (réponse)= "O" Faire Ecrire("Introduire un réel :")
Elément = Donnée
Ecrire("La partie entière de",élément, "est: ",INT(élément) ) Répéter
Ecrire("Y a t il un autre réel à saisir ? (O/N) ") Réponse = Donnée
Jusqu’à (Majus (réponse) Dans ["O", "N"]
Fin Tant Que Réponse = [ ] Répéter
Ecrire("Y a t il un autre réel à saisir ? (O/N) ") Réponse = Donnée
Jusqu'à (Majus(réponse) Dans ["O","N"] )
b. Algorithme
0- Début Composante_entière 1- Répéter
Ecrire("Y a t il un autre réel à saisir ? (O/N) ") Lire ( R )
Jusqu'à ( Majus( R ) Dans ["O","N"] ) 2- Tant Que Majus ( R ) = "O" Faire
Ecrire("Introduire un réel :") , LIRE ( E )
Ecrire("La partie entière de", E , "est: ",INT( E ) ) Répéter
Ecrire("Y a t il un autre réel à saisir ? (O/N) ") Lire ( R )
Jusqu’à ( Majus ( R ) Dans ["O", "N"] ) Fin Tant Que
3- Fin Composante_entière Tableau de déclaration des objets
Objet Code Type/Nature Rôle
Elément
Réponse E
R Réel
Caractère Saisie d’un réel
Saisie de la réponse ( O pour oui et N pour non )
c. Traduction en Pascal
Program Partie_entiere ; Uses wincrt ;
Var e :real ; r :char ; begin
Repeat
Writeln(‘y a-t-il un autre reel a saisir (O/N) ? ‘) ; readln(r) ;
Until (upcase(r) in [‘O’,’N’]);
While upcase(r) =’O’ do begin
Writeln(‘introduire un reel: ‘); readln (e);
Writeln (‘la partie entiere de ‘,e,’est’,int(e));
Repeat
Writeln(‘y a-t-il un autre reel a saisir (O/N) ? ‘) ; readln(r) ; Until (upcase(r) in [‘O’,’N’]);
End;
Writeln(‘ **** Fin de la saisie ******’);
End.
Exercice 5 page 141 ; program mots;
uses wincrt;
var ch:string;
i,c:integer;
begin repeat
writeln('Donner une chaine');
readln(ch);
until length(ch)<50;
c:=1;
for i:=1 to length(ch) do if ch[i]=' ' then
begin repeat i:=i+1;
until ch[i]<>' ';
c:=c+1;
end;
writeln('La chaine cotient ',c, ' mots');
end.
Exercice 4 page 141 ; uses wincrt;
var ch:string;
i,c:integer;
trouve:boolean;
begin repeat
writeln('Donner une chaine');
readln(ch);
until length(ch)<50;
i:=1;
repeat
if ch[i]=ch[i+1] then begin
writeln(ch[i]);
trouve:=true ; end
else i:=i+1;
until (trouve) or (i>length(ch));;
end.