Une structure itérative complète est utilisée pour répéter une suite d'instructions, un nombre fini de fois connu à l'avance.
Ecrire un programme qui calcule la somme de n entiers saisis au clavier.
{Algorithmique} s ⟵ 0 pour i de 1 à n faire Ecrire("Donner un nombre : ") Lire(v) s ⟵ s + v fin pour
{Pascal} s := 0; for i := 1 to n do begin Write('Donner un nombre : '); Readln(v); s := s + v; end;
Ecrire un programme qui permet d'inverser une chaine.
Exemple : pour ch = "sami" le programme affiche "imas"
{Algorithmique} ch1 ⟵ "" pour i de Long(ch) à 1 faire ch1 ⟵ ch1 + ch[i] fin pour
{Pascal} ch1 := ''; for i := Length(ch) downto 1 do ch1 := ch1 + ch[i];
Faute fréquente
L'élève croit que la boucle suivante va afficher toutes les valeurs de 1 à n, mais le programme affiche uniquement une seule valeur (n+1).
Correction : enlever le point virgule (;) devant do.
{ Version incorrecte } for i:=1 to n do; { <-- notez bien le point virgule ici } Write(n);
{ Version corrigée } for i:=1 to n do Write(n);
Faute fréquente
L'élève croit que la boucle suivante permet de remplir le tableau t. Cependant, la boucle affiche le message Donner t[1] : Donner t[2] : ..., et permet de saisir une seule valeur dans t[n+1].
Correction : Sans begin et end; la boucle concerne uniquement la première instruction qui suit la boucle. Pour corriger, il faudra ajouter begin et end;.
{ Version incorrecte } for i:=1 to n do Write('Donner t[', i, '] : '); Readln(t[i]);
{ Version corrigée } for i:=1 to n do begin Write('Donner t[', i, '] : '); Readln(t[i]); end;
Faute fréquente
L'élève croit que la boucle suivante permet d'afficher les valeurs de 0 à (-5), hors la boucle n'affiche rien.
Correction : Rappelez-vous que 0 > (-5). Dans ce cas, on doit utiliser downto au lieu de to.
{ Version incorrecte } for i:=0 to -5 do Writeln(i);
{ Version corrigée } for i:=0 downto -5 do Writeln(i);
Une structure à condition d'arrêt est utilisée pour répéter une suite d'actions jusqu'à ce qu'une condition soit vraie.
Ecrire un programme qui permet de retrouver si une lettre c existe dans une chaine ch sans utiliser la fonction prédéfinie pos.
{Algorithmique} i ⟵ 1 répéter tr ⟵ (ch[i] = c) i ⟵ i + 1 jusqu'à (i > long(ch)) ou (tr)
{Pascal} i := 1; repeat tr := ch[i] = c; i := i + 1; until (i > Length(ch)) or (tr);
Ecrire un programme qui permet de saisir un entier n (2 ≤ n ≤ 100).
{Algorithmique} répéter Ecrire("Donner n [2, 100] : ") Lire(n) jusqu'à (n dans [2..100])
{Pascal} repeat Write('Donner n [2, 100] : '); Readln(n); until (n in [2..100]);
Une structure itérative à condition de marche est utilisée pour répéter une suite d'actions tant que une condition est vraie.
Ecrire un programme qui permet de déterminer si un mot ch est palindrôme.
Exemple : RADAR, AZIZA se lisent de la même façon de gauche à droite ou de droite à gauche.
{Algorithmique} palin ⟵ Vrai i ⟵ 1 j ⟵ Long(ch) Tantque (j > i) et (palin) Faire palin ⟵ ch[i] = ch[j] i ⟵ i + 1 j ⟵ j - 1 Fin Tantque
{Pascal} palin := True; i := 1; j := Length(ch); While (j > i) and (palin) do begin palin := ch[i] = ch[j]; i := i + 1; j := j - 1; end;
Faute fréquente
L'élève croit que la boucle suivante va calculer le PGCD(a, b) en utilisant la méthode de soustraction. Mais, elle résulte en une boucle infinie comme a est toujours différent de b puisque l'instruction if n'est jamais atteinte.
Correction : enlever le point virgule (;) devant do.
{ Version incorrecte } a := 100; b := 120; while (a <> b) do; { <-- notez bien le point virgule ici } if (a > b) then a := a - b else b := b - a;
{ Version corrigée } a := 100; b := 120; while (a <> b) do if (a > b) then a := a - b else b := b - a;
Faute fréquente
L'élève croit que la boucle suivante permet de calculer le PGCD(a, b) en utilisant la méthode d'euclide. Mais, lors de l'exécution le programme se bloque puisque b est toujours différent de 0.
Correction : Sans begin et end; la boucle concerne uniquement la première instruction qui suit la boucle. Pour corriger, il faudra ajouter begin et end;.
{ Version incorrecte } while (b <> 0) do r := a mod b; a := b; b := r;
{ Version corrigée } while (b <> 0) do begin r := a mod b; a := b; b := r; end;