Page MenuHomePhabricator

La boucle répéter, tant que
Updated 1,008 Days AgoPublic

La boucle do while

La boucle RÉPÉTER ... TANT QUE permet de réitérer un bloc d'instructions jusqu'à ce que la condition de sortie soit vérifiée. Cette structure est semblable à la structure TANT QUE, avec la différence suivante que cette nouvelle évalue la condition après avoir exécuté le bloc d'instructions. Ainsi le bloc d'instructions est toujours exécuté au moins une fois. Dans de telle boucle, on effectue généralement le passage au suivant, puis le traitement.

Cf-until-fr.svg.png (240×289 px, 9 KB)

Dans la pratique, la structure RÉPÉTER ... TANT QUE n'est pas si fréquente que sa rivale ; mais dans certains cas, elle fournit une solution plus élégante. Cette boucle est préférée pour évaluer des suites jusqu'à obtenir une précision suffisante. Cette boucle est également utilisée pour valider le contrôle de la saisie de l'utilisateur.

Le contrôle de la saisie

Dans les programmes informatiques, il est beaucoup plus convivial de permettre un utilisateur de corriger son erreur que de planter. C'est pourquoi, contrôler la saisie de l'utilisateur est important, cela permet d'éviter un bon nombre de sources d'erreurs. Par rapidité, dans les programmes qui tournent dans un terminal ont demande généralement à l'utilisateur d'entrer une seule lettre : Y pour yes, et N pour No. Ainsi, l'algorithme suivant oblige l'utilisateur à entrer Oui ou Non, la boucle recommence s'il entre autres choses.

DÉBUT
VARIABLE c: CARACTÈRE

RÉPÉTER
    LIRE "Avez-vous plus de 18 ans? [Y/N]", c
TANT QUE PAS (c=='Y' OU c=='N')

ÉCRIRE "L'utilisateur a répondu: ", c
FIN

Exercices

  • Écrivez un algorithme qui autorise uniquement l'utilisateur à entrer une valeur numérique. Cette valeur doit être stockée dans une variable de type CARACTÈRE.
Un caractère numérique
DÉBUT
VARIABLE c: CARACTÈRE

RÉPÉTER
    LIRE "Veuillez entre un nombre:", c
TANT QUE PAS (c >= '0' ET c <= '9')

ÉCRIRE "L'utilisateur a répondu: ", c
FIN
  • Écrivez un algorithme qui autorise uniquement l'utilisateur à entrer une lettre de l'alphabet uniquement en majuscule.
Un caractère majuscule
DÉBUT
VARIABLE c: CARACTÈRE

RÉPÉTER
    LIRE "Veuillez entre un caractère majuscule:", c
TANT QUE PAS (c >= 'A' ET c <= 'Z')

ÉCRIRE "L'utilisateur a répondu: ", c
FIN
  • Écrivez un algorithme qui autorise l'utilisateur à entrer uniquement un caractère alphanumérique (nombre, majuscule, minuscule).
Un caractère alphanumérique
DÉBUT
VARIABLE c: CARACTÈRE

RÉPÉTER
    LIRE "Veuillez entre un caractère alphanumérique:", c
TANT QUE PAS ((c >= '0' ET c <= '9') OU (c >= 'a' ET c <= 'z') OU (c >= 'A' ET c <= 'Z') )

ÉCRIRE "L'utilisateur a répondu: ", c
FIN
  • Écrivez un algorithme qui demande un mot de passe à l'utilisateur d'au moins 5 caractères alphanumériques terminé par le caractère spécial NUL. Astuce: CHAÎNE + CARACTÈRE = CHAÎNE
Un mot de passe
DÉBUT
VARIABLE c: CARACTÈRE
VARIABLE pass: CHAÎNE
VARIABLE length: ENTIER

RÉPÉTER

    RÉPÉTER
        LIRE "Veuillez entre un caractère alphanumérique:", c
    TANT QUE PAS ((c >= '0' ET c <= '9') OU (c >= 'a' ET c <= 'z') OU (c >= 'A' ET c <= 'Z') OU c=NUL)

    SI c = '.' ET length < 5:
        length<-0
        pass<-""
        ECRIRE "Le mot de passe est trop cours, veuillez rééessayer."
    SINON:
        pass<-pass+c
        length<-length+1
    FIN SI

TANT QUE length < 5 ET c != NUL
ÉCRIRE "Le mot de passe est: ", pass
FIN

Évaluer à une précision souhaitée

Par exemple, la fonction racine carrée utilisée dans les ordinateurs est en réalité issue des travaux de l'algorithme de Newton. L'expression est évaluée jusqu'à obtenir une précision équivalente à la précision maximale de la variable. L'algorithme est le suivant, où x0 peut être de n'importe quelle valeur approchée de la racine, mais plus cette valeur est proche, plus l'algorithme converge rapidement.

x0=1x_{0}=1 xn+1=xn+axn2x_{n+1}={\frac {x_{n}+{\frac {a}{x_{n}}}}{2}}

Si l'on développe cette série pour la racine carrée de deux, nous pouvons la voir converger très rapidement :

x1=1+22=32=1.5x_{1}={\frac {1+2}2}={\frac 32}=1.5 x2=3/2+4/32=1712=1.4166x_2=\frac{3/2+4/3}2=\frac{17}{12}=1.4166\ldots x3=17/12+24/172=577408=1.4142156x_{3}={\frac {17/12+24/17}2}={\frac {577}{408}}=1.4142156\ldots x4=577/408+816/5772=665857470832=1.4142135623745x_{4}={\frac {577/408+816/577}{2}}={\frac {665857}{470832}}=1.4142135623745\ldots

Lorsqu'on programme un tel algorithme, on peut calculer la précision jusqu'à ce qu'on obtienne un delta |xₙ - xₙ₊₁| plus petit que la précision que l'on souhaite obtenir. En d'autres mots, on augmente la précision de nombre tant que l'on n'est pas suffisamment précis.

DÉBUT
VARIABLE x0, x1, a: RÉEL
CONSTANTE E0.0000001
x11

LIRE "Entrez une valeur:", a

RÉPÉTER
    x0<-x1
    x1<-(x0 + (a/x0)) / 2.0
TANT QUE |x1 - x0| > E

ÉCRIRE "La racine carrée vaut: ", x1
FIN
L'ordinateur ne traite pas toutes les opérations mathématiques de la même façon. Nous avons vu ici qu'en réalité la racine carrée est particulièrement compliquée pour lui. Il en va de même pour les opérations en virgule flottante, et les fonctions trigonométriques. Pensez toujours à essayer de minimiser le nombre d'opérations pour que votre algorithme soit le plus rapide possible.

Exercices

  • Écrivez un algorithme à l'aide de la structure RÉPÉTER... TANT QUE qui affiche la série "1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, ..." pour la constante N=20.
Une série qui se répète
DÉBUT
VARIABLE v: ENTIER
CONSTANTE N=20

v<-0
RÉPÉTER
    v<-v+1
    ECRIRE -n v%10, ", "
TANT QUE v < N
ÉCRIRE "..."

FIN
  • Écrivez un algorithme à l'aide de la structure RÉPÉTER... TANT QUE qui calcule la fractionnelle d'un nombre.
Factorielle dun nombre
DÉBUT
VARIABLE v, r: ENTIER

LIRE "Veuillez enetrer une valeur: ", v
r<-v

RÉPÉTER
    v<-v-1
    r<-r*v
TANT QUE v > 1

ÉCRIRE "La factorielle vaut: ", r
FIN
  • Écrivez un algorithme qui évalue l'expression mathématique de π4\frac{\pi}{4} à l'aide de la série: xn+1=(1)n12n+1x_{n+1}=(-1)^{n} \frac{1}{2n+1}. Tentez de sortir l'exposant de la boucle principale.
PI/4 v1
DÉBUT
VARIABLE x0, x1: RÉEL
VARIABLE i: ENTIER
CONSTANTE E=0.00000001

i<-0
x1<-1

RÉPÉTER
    x0<-x1
    i<-i+1
    x1<-x0 + ((-1))/(2i+1)
TANT QUE |x1-x0| > E

ÉCRIRE "PI/4 vaut ", x1
FIN
PI/4 v2
DÉBUT
VARIABLE x0, x1: RÉEL
VARIABLE i: ENTIER
CONSTANTE E=0.00000001

i0
x11

RÉPÉTER
    x0x1
    ii+1
    SI i%2 == 0:
        x1<-x0 + 1/(2i+1)
    SINON:
        x1<-x0 - 1/(2i+1)
    FIN SI
TANT QUE |x1-x0| > E

ÉCRIRE "PI/4 vaut ", x1
FIN
PI/4 v3
DÉBUT
VARIABLE x0, x1: RÉEL
VARIABLE i, sign: ENTIER
CONSTANTE E=0.00000001

sign<- -1
i<-0
x1<-1

RÉPÉTER
    x0<-x1
    i←<-+1
    sign<- -sign
    x1<-x0 + sign/(2i+1)
TANT QUE |x1-x0| > E

ÉCRIRE "PI/4 vaut ", x1
FIN
PI/4 v4
DÉBUT
VARIABLE x0, x1: RÉEL
VARIABLE i, sign: ENTIER
CONSTANTE E=0.00000001

sign<- -1
i<-0
x1<-1

RÉPÉTER
    x0<-x1
    i<-i+2
    sign<- -sign
    x1<-x0 + sign/i
TANT QUE |x1-x0| > E

ÉCRIRE "PI/4 vaut ", x1
FIN
Il faut parfois écrire une première version d'un algorithme, le valider, et puis travailler étape par étape pour réduire sa complexité de calcul. La première étape ici fut de retirer l'exposant. L'exposant a été retiré à l'aide d'un simple modulo 2 puisque la série doit simplement faire varier le signe d'une itération à l'autre.
  • Écrivez un algorithme qui évalue l'expression mathématique cos(x)cos(x) à l'aide de la série: xn+1=x2n12n!x_{n+1} = x^{2n} \frac{1}{2n!}.
cos(x)
DÉBUT
VARIABLE x0, x1, x, y, N, D: RÉEL
VARIABLE i: ENTIER
CONSTANTE E=0.00000001

LIRE "Quelle est la valeur de x?", x
x1<-1
N<-1
D<-1
y<-x*x

RÉPÉTER
    x0<-x1
    N<-N*y
    D<-D*2n*(2n-1)
    x1<-x0 + (N/D)
TANT QUE |x1-x0| > E

ÉCRIRE "PI/4 vaut ", x1
FIN
Last Author
kossolax
Last Edited
Aug 25 2020, 9:40 AM

Event Timeline

kossolax edited the content of this document. (Show Details)
kossolax changed the title from La boucle répéter, jusqu'à ce que to La boucle répéter, tant que.Aug 18 2020, 8:26 AM
kossolax edited the content of this document. (Show Details)
kossolax edited the content of this document. (Show Details)
kossolax edited the content of this document. (Show Details)
kossolax edited the content of this document. (Show Details)
kossolax edited the content of this document. (Show Details)
kossolax edited the content of this document. (Show Details)
kossolax edited the content of this document. (Show Details)
kossolax edited the content of this document. (Show Details)