Chapitre 6: Boucles While


La technique de définition de nouvelles fonctions et de définition for les boucles - aussi utiles soient-elles - ne permettent pas réellement à Karel de résoudre de nouveaux problèmes. Chaque fois que vous run un programme, il fait toujours exactement la même chose. Les programmes deviennent beaucoup plus utiles lorsqu'ils peuvent répondre différemment à différentes entrées.

À titre d'exemple, disons que vous vouliez écrire un programme pour avoir Karel avancer sur un mur. Mais vous ne voulez pas simplement que ce programme fonctionne sur un seul monde avec une taille fixe. Vous souhaitez écrire un programme unique qui pourrait fonctionner sur n'importe quel monde.

Essayez de changer le monde en cliquant sur le menu déroulant "Changer le monde" au-dessus du monde. Pour n'importe quel monde de taille, Karel sera avancer jusqu'à ce qu'il touche un mur. Notez que cet exploit ne peut pas être accompli en utilisant un for boucle. Cela nous obligerait à connaître la taille du monde au moment de la programmation.

Boucle While normale

À Karel, un while la boucle est utilisée pour répéter un corps de codeaussi longtemps queune condition donnée tient. le while loop a la forme générale suivante:

while tester :
déclarations à répéter

Le flux de contrôle d'un while la boucle est la suivante. Lorsque le programme atteint un while boucle il commence à répéter un processus là où il est en premierchèques si le test réussit, et si ouirun sle code dans le corps.

Quand le programmechèques si le test réussit, il décide si letesterest vrai pour l'état actuel du monde. Si tel est le cas, la boucle run le code dans le corps. Si le test échoue, la boucle est terminée et le programme avancer est avancer .

Quand le programmerun sle corps de la boucle, le programme exécute les lignes du corps une par une. Lorsque le programme arrive à la fin du while boucle, il revient en haut de la boucle. Il revérifie ensuite le test, en continuant à boucler s'il réussit. Le programme ne quitte pas la boucle jusqu'à ce qu'il atteigne un contrôle, et le test échoue.

Karel a beaucouptester déclarations, et nous les passerons toutes en revue dans le chapitre suivant. Pour l'instant, nous allons utiliser une seule déclaration de test: l'avant_est_clair() ce qui est vrai s'il n'y a pas de mur directement devant Karel.

Bug de poteau de clôture

Modifions notre programme ci-dessus pour le rendre plus intéressant. Au lieu de simplement se déplacer vers un mur, jetons Karel de placer une ligne de jetons , une dans chaque case. Encore une fois, nous voulons que ce programme fonctionne pour un monde de toute taille:

Ça a l'air génial. Sauf pour un problème. Sur tous les jeton Karel ne place pas de jeton sur le dernier carré de la ligne (regardez bien). Lorsque Karel est sur le dernier carré, le programme n'exécute pas le corps de la boucle car le test ne passe plus - Karel est face à un mur. Vous pourriez être tenté d'essayer de changer l'ordre du corps afin que Karel avancer s avant de placer un jeton . Le code est modifiable alors essayez-le!

Il y a un problème plus profond qu'aucun réarrangement du corps ne peut résoudre. Pour le monde à 7 colonnes, Karel doit mettre 7 jetons , mais ne devrait avancer() 6 fois. Depuis le while loop exécute les deux lignes lorsqu'un test réussit, comment pouvez-vous faire en sorte que le programme exécute une commande une fois de plus que l'autre?

Le bogue de ce programme est un exemple de problème de programmation appelé erreur de poteau de clôture . Le nom vient du fait que si vous voulez construire une clôture faite de panneaux qui ont un poteau de clôture sur l'une ou l'autre taille, le nombre de poteaux de clôture est toujours supérieur au nombre de panneaux. De combien de poteaux de clôture, par exemple, avez-vous besoin pour construire une clôture avec 10 panneaux? La réponse est 11, comme l'illustre le diagramme suivant:

Une fois que vous l'avez découvert, corriger ce bogue est en fait assez facile. Avant que Karel ne s'arrête au bout du monde, tout ce que le programme a à faire est de placer un dernier jeton :


Chapitre suivant