L'itération
Le principe de l'itération est de pouvoir répéter une séquence d'instructions plusieurs fois. Ce principe peut se matérialiser dans plusieurs structures :
la boucle
whilerépète une séquence d'instructions tant qu'une condition d'itération est vraie :int nombre = -1; while (nombre < 0) { scanf("%d", &nombre); } printf("%d est forcément un nombre positif\n", nombre);la boucle
do...whileexécute une première fois une séquence d'instructions puis la répète tant qu'une condition d'itération est vraie :int nombre; do { scanf("%d", &nombre); } while (nombre < 0); printf("%d est forcément un nombre positif\n", nombre);la boucle
forest une alternative à la bouclewhilespécialisée pour itérer un nombre connu ou calculé de fois :for (int i = 0; i < 10; i++) { printf("%d\n", i); }
Exemple
Voici une petite visualisation d'un programme écrit en C qui permet de calculer la somme des nombres de 1 à 5 grâce à une boucle for :
Précondition, postcondition et invariant
Chaque boucle qui se termine possède toujours une précondition, une postcondition et un invariant :
Précondition (PRE) : Une proposition qui doit être vraie avant l'exécution de la boucle.
Elle peut être composée de plusieurs prédicats comme dans la précondition
x > 0 && y > 2qui signifie qu'il faut s'assurer que la variablexsoit plus grande que0et que la variableysoit plus grande que2avant que la boucle ne soit exécutée.Postcondition (POST) : Une proposition qui doit être vraie après l'exécution de la boucle.
Elle peut être composée de plusieurs prédicats comme dans la postcondition \( n \in \mathbb{N} \land n = n_0 \land somme = \sum^{n}_{x = 1} x \) qui signifie qu'après l'exécution de la boucle, la variable
nsera un entier naturel égal à sa valeur avant l'exécution de la boucle et la variablesommesera la somme des nombres de1àn.Invariant (INV) : Une proposition qui doit être vraie au moment de l'entrée et après chaque itération de la boucle.
Elle peut être composée de plusieurs prédicats comme dans l'invariant \( n \in \mathbb{N} \land n = n_0 \land 0 \leq i \leq n \land somme = \sum^{i}_{x = 1} x \) qui signifie que au moment de l'entrée dans la boucle et après chaque itération l'exécution de la boucle, la variable
nsera un entier naturel égal à sa valeur avant l'exécution de la boucle, la variableisera inclue entre0etnet la variablesommesera la somme des nombres de1ài.
En général, il est souvent nécessaire de réaliser quelques instructions avant et après la boucle donc on inclut souvent ces quelques instructions dans le concept de boucle.
Voici donc la liste des différentes parties d'une boucle :
- Initialisation : La séquence d'instructions juste avant d'entrer dans la boucle qui sert, par exemple, à initialiser des variables temporaires qui sont nécessaires dans la boucle et son invariant mais qui ne sont pas dans la précondition comme des variables dites "compteur".
- Condition d'itération : C'est la condition qui doit être respectée pour itérer sur la boucle et qui est toujours associée à une condition d'arrêt qui est simplement la négation de cette condition d'itération.
- Instructions d'itération : La séquence d'instructions qui est réexécutée à chaque itération de la boucle.
- Clôture : La séquence d'instructions juste après l'exécution de la boucle qui sert, par exemple, à désallouer les variables temporaires qui étaient nécessaires dans la boucle et son invariant mais qui ne le sont plus dans la postcondition.
En résumé, ces différents concepts ressemblent à cela sur une boucle while :
// PRE
// Initialisation
// INV
while (...) { // Condition d'itération
// Instructions d'itération
}
// Clôture
// POST
Exemple avec un invariant
Ci-dessous, vous pouvez trouver une visualisation d'un programme qui calcule la moyenne de la somme des nombres de 0 à 4 avec une boucle while.
Dans celle-ci, vous pouvez voir que la précondition, la postcondition et l'invariant sont respectés quand ils doivent l'être.
Plus important, elle permet de visualiser le lien qu'il y a entre les variables de ces propositions, comme le lien entre la variable i et la variable sum dans l'invariant.
INGInious