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;