Sie sind auf Seite 1von 2

TD Info n5 : boucles REPEAT et WHILE

ECE3 Lyce Carnot


4 novembre 2011

Nous avons vu lors des TD prcdents, en tudiant les boucles FOR, une premire faon de
faire des instructions rptitives en Pascal. Cest un bon dbut, mais les boucles FOR prsentent un
dfaut : il faut savoir lavance le nombre dtapes du calcul, ce qui ne pose aucun problme quand
il sagit par exemple de calculer le terme dindice n dune suite rcurrente, mais est beaucoup plus
gnant quand on a envie de faire certains calculs jusqu ce quun vnement se produise. Exemple
classique, on veut faire jouer lutilisateur au jeu suivant : lordinateur tire un nombre au hasard entre
0 et 100, et lutilisateur doit le deviner en utilsant le moins dessais possible, sachant qu chaque
essai lordinateur lui prcise si le nombre tent est trop grand ou trop petit. On souhaite donc que
lutilisateur propose des nombres jusqu ce quil soit tomb sur le bon nombre, on ne sait pas
lavance le nombre dessais ncessaire.
Les boucles REPEAT et WHILE servent donc, tout comme les boucles FOR, faire des instructions
rptitives, mais larrt de la boucle sera dtermin par une condition et non plus par un nombre
dtapes donn. La diffrence entre les deux instructions est minime : avec une boucle REPEAT,
linstruction est effectue avant que la condition ne soit teste, alors quavec une boucle WHILE, le
test a lieu dabord. Leur syntaxe respective est la suivante :
REPEAT instruction UNTIL condition ;
WHILE condition DO instruction ;
Il est souvent utile malgr tout de compter le nombre dtapes dans une boucle de type REPEAT
ou WHILE. Pour cela, la mthode consiste crer une variable entire qui servira de compteur,
linitialiser la valeur 0 et augmenter sa valeur dune unit chaque passage de la boucle. Par
exemple, le programme suivant calcule la valeur du plus petit entier pour lequel n! > 1000 :
PROGRAM tagada ;
VAR p,i : integer ;
BEGIN
i :=0 ; p :=1 ;
WHILE p<1000 DO
BEGIN
i :=i+1 ;
p :=p*i ;
END ;
WriteLn(i) ;
END.
Si on remplaait la boucle WHILE par une boucle REPEAT, on calculerait exactement la mme
chose, mais on simplifieerait lgrement la syntaxe du programme, car on naurait pas besoin du
BEGIN END ; qui a t ncessaire avec la boucle WHILE : en effet, tout ce qui se trouve entre
les mots-cls REPEAT et UNTIL est effectu chaque tour de boucle, quel que soit le nombre
dinstructions.

Petits exercices
1. crire un programme permettant de jouer au jeu dcrit un peu plus haut. Pour tirer un nombre
alatoire, on dispose de linstruction random(101), qui permet exactement de tirer un entier
alatoire entre 0 et 100. Par contre, pour que cette instruction fonctionne, il faut insrer la
commande Randomize ; auparavant dans le programme (par exemple juste aprs le begin, cf
TD prcdant). Complter le programme pour quil compte le nombre dessais effectus avant
de trouver la bonne rponse.
2. crire un programme affichant lcran tous les multiples de 13 compris entre 500 et 600.
On pourra (mais ce nest pas absolument ncessaire) utiliser la fonction trunc qui permet de
calculer la partie entire dun nombre rel, ou encore la commande mod qui sert calculer des
restes de division euclidienne : par exemple 13 mod 3 renvoie le reste de la division de 13 par
3, cest--dire 1. En particulier, un nombre n est multiple de 13 si n mod 13 = 0.
k=n
X

1
. On admet que lim Sn = +. crire un programme calculant la plus
n+
k
k=1
petite valeur de n pour laquelle Sn > 5, puis Sn > 10.

3. On note Sn =

4. La suite de Syracuse est dfinie de la faon suivante : u0 est un entier naturel diffrent de 0,
un
et ensuite, on a un+1 =
si un est pair (jai bien dit si un est pair, et pas si n est pair), et
2
un+1 = 3un + 1 si un est impair. Vrifier la main sur quelques exemples que la suite finit par
prendre la valeur 1 (et est ensuite priodique). crire un programme calculant la plus petite
valeur de n pour laquelle un = 1 (u0 tant choisi par lutilisateur). Modifier le programme pour
quil calcule galement la plus grande valeur prise par la suite.

Das könnte Ihnen auch gefallen