Aller au menu - Aller au contenu

Icône Des boucles qui tournent

Mise à jour : 10/11/2011
Difficulté : Facile Facile Creative Commons BY-NC-SA
3 274 visites depuis 7 jours, dont 134 sur ce chapitre classé 50/786
Vous savez sûrement qu'un ordinateur calcule beaucoup plus vite que vous... Il va donc falloir lui apprendre à attendre l'utilisateur ! Et ce chapitre est fait pour ça.
Sommaire du chapitre :
Icône du chapitre
Chapitre précédent Sommaire Chapitre suivant

For... Next

Qu'est-ce qu'une boucle ?


Les boucles permettent de répéter une même action plusieurs fois, en n'écrivant qu'une seule fois la procédure.
Trois types de boucles s'offrent à vous, plusieurs critères permettent de choisir la plus adaptée à votre cas.

Boucle de type "Pour" (For - Next)



Cette boucle s'utilise lorsque le nombre de fois que nous devons parcourir la boucle est DÉTERMINÉ.
Que ce soit une constante, ou une valeur contenue dans une variable, si ce nombre est accessible par le programme alors cette boucle est la plus adaptée.

Fonctionnement



Cette boucle fonctionne à l'aide d'un compteur qui utilise une variable généralement appelée $i.
Code : Autre
1
2
3
4
5
For $i = <valeur de départ> To <valeur d'arrivée> Step <pas>

    ; Actions à effectuer

Next


Exemple 1



Code:
Code : Autre
1
2
3
4
5
For $i = 0 To 10

    msgbox(0,"Tutoriel", $i)

Next


Ceci nous affichera successivement : 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10.

Et si je ne veux afficher que 0, 2, 4, 6, 8, 10, je fais comment ?

Il suffit d'ajouter un "Step" à la fin de la ligne For, comme ceci :
Code : Autre
1
2
3
4
5
For $i = 0 To 10 Step 2

    msgbox(0,"Tutoriel", $i)

Next

0n a maintenant : 0, 2, 4, 6, 8, 10.

Exemple 2


Compte à rebours.

Je voudrais que vous fassiez un mini-mini-TP (ne prenez pas peur ;) ).
Très simple, il faut demander à l'utilisateur d'entrer un nombre, puis le programme va afficher une message box avec ce nombre et quand l'utilisateur cliquera dessus, le nombre du dessous apparaîtra... Magique ? Non ! (Oh, Oh, Oh, It's Magic, you know... :magicien: )

Vous devrez utiliser la fonction InputBox, alors n'hésitez pas à aller voir dans l'aide comment elle fonctionne, quels sont ses paramètres. Vous verrez qu'elle n'est pas très différente de MsgBox que nous avons vue précédemment.

Fini ? Ça devrait ressembler à quelque chose comme ça :

Code : Autre
1
2
3
4
5
6
$depart = InputBox("Tutoriel", "Entrez un nombre :")

For $i = $depart To 1 Step -1
    MsgBox(0,"Tutoriel", $i)
Next
MsgBox(0,"Tutoriel", "ZÉRO !")


Vous n'avez pas fait la même chose ? Ce n'est pas grave, je vous donne une chance de vous rattraper plus bas ! ;)

While... WEnd

Mais quand j'attends que l'utilisateur fasse quelque chose, je ne sais pas combien de boucles je dois effectuer, comment faire ?

Nous allons alors utiliser une boucle plus adaptée, la boucle "Tant que".

Boucle de type "Tant que" (While - WEnd)



Cette boucle s'utilise quand le nombre de fois que l'action doit être effectuée est inconnu. Si la proposition est fausse dès le départ, la boucle ne se lance pas.
Cette boucle n'a pas besoin de compteur pour fonctionner, la boucle est simplement effectuée tant que la condition reste vraie.

Fonctionnement



Code : Autre
1
2
3
4
5
Tant que (condition est vraie)

     On effectue ces actions

Fin


Ce qui se traduit en Autoit par :

Code : Autre
1
2
3
4
5
While [signifie littéralement tant que] (proposition est vraie)

    ;Actions à effectuer

WEnd


Exemple



Les boucles sont très utilisées pour attendre une action de l'utilisateur. En effet, il est impossible de savoir exactement quand l'utilisateur va enfin se décider à faire quelque chose. Alors c'est au programme de l'attendre (l'utilisateur est beaucoup plus long, si si je vous assure :lol: ).

Cesse tes bavardages inutiles, et continue ton tutoriel !

OK les amis, restons calmes ! :-°

Imaginons que la variable $quitter prenne la valeur 1 quand l'utilisateur décide de quitter le programme.
On a donc :

Code : Autre
1
2
3
4
5
While ( $quitter <> 1 )

    ;Actions du programme

WEnd



Très souvent on va utiliser une boucle sans fin, c'est-à-dire que théoriquement elle ne s'arrêtera jamais.
Pour faire une boucle sans fin, on peut déclarer une boucle "tant que" de la manière suivante :

Code : Autre
1
2
3
4
5
While 1

    ;action à répéter sans fin

WEnd


Cette boucle est ce que l'on peut appeler la partie principale du programme. Celui-ci va se balader dans la boucle en permanence, et s'il rencontre des If valables (cf. actions sous conditions), il va faire différentes actions.

Ne copiez pas tel quel le code ci-dessus, en effet le programme va peut-être faire planter votre ordinateur car il va en permanence utiliser votre CPU car aucune action n'est inscrite dans ce code. Essayez pour voir, mais que ceux qui ont des ordinateurs de l'an 2008 (totalement dépassés :D ) ne viennent pas se plaindre !


On va donc tout simplement dire au programme de faire des pauses de temps en temps.
Je sais que ce chapitre est très difficile (d'ailleurs je vous conseille de faire une pause après), mais voilà le code que j'ai utilisé afin de savoir combien de tours faisait le programme en 1 seconde :

Code : Autre
1
2
3
4
5
6
Local $t = TimerInit(),$i = 0 ; Declaration des variables

While TimerDiff($t)<=1000 ; Boucle principale. Tant que le temps est inférieur à une seconde, on additionne 1 à la variable $i
        $i = $i + 1
WEnd
MsgBox(65,"Tutoriel",$i) ; On affiche $i

Ici il n'y a qu'une chose nouvelle, la gestion des Timers. Ces derniers s'utilisent de la manière suivante.
Quand on le veut, on initialise le temps. Puis on demande par une boucle le temps écoulé depuis l'initialisation. Si vous ne voulez pas tout retenir, ne retenez pas ça.
Ce qu'il faut savoir, c'est que chez moi, en 1 seconde, le programme parcourt 175 000 fois la boucle.

Maintenant, nous allons voir une nouvelle fonction.

Sleep(Time)
Time est un entier en millisecondes. Pour pouvoir vérifier, n'oubliez pas d'appuyer sur F1 dans Scite pour accéder à la documentation.

Par exemple :
Sleep(1000)


À la differences des fonctions timer[...](), Sleep() va mettre en pause le programme, ou littéralement le plonger en léthargie. Pour comprendre, ajoutez Sleep(10) dans le code précédent.

Et alors , c'est pas 10 malheureuses millisecondes qui vont changer le monde !


Oh que si, essayez !

Chez moi, le programme ne fait plus que 65 tours au lieu de 175000. Ceci va permettre de libérer de la puissance pour l'ordinateur en restant tout à fait compétitif. Ne vous inquiétez pas, l'utilisateur ne va pas s'aperçevoir du changement, mais l'ordinateur si !
Donc à partir de maintenant, vous allez me faire ce plaisir, vous ajouterez un Sleep(10) dans toutes vos boucles While.

On peut également retrouver la boucle "Pour", vue précédemment, de cette manière



Code : Autre
1
2
3
4
5
6
7
$i = <valeur de départ>
While ($i <> <valeur d arrivée>)

    ;actions à effectuer

    $i = $i + <pas>
WEnd

Do... Until

Boucle "Faire - jusqu'à"



Cette boucle répète une action jusqu'à ce que la condition à atteindre devienne vraie.
Elle est utilisée lorsque le nombre de fois que l'action doit être effectuée est inconnu, mais dans ce cas l'action doit être effectuée AU MOINS une fois.

Fonctionnement



Code : Autre
1
2
3
4
5
Do

    ;actions à effectuer

Until (proposition)

Quand "proposition" devient VRAIE alors la boucle s'arrête.
Si la proposition est vraie dès le premier passage, l'action s'effectue quand même une fois. En effet la vérification ne se fait qu'à la fin de la boucle.

Exemple


On veut demander un mot de passe à l'utilisateur pour lancer le programme.
Tant qu'il se trompe on lui redemande le mot de passe. On ne sait donc pas combien de fois l'utilisateur va se tromper.
Une boucle while ne convient pas car l'action doit être effectuée au moins une fois.

Code :
Code : Autre
1
2
3
4
5
6
7
8
9
10
11
Do
    $pass = "mot de passe"
    $input = InputBox("Tutoriel", "Entrez le mot de passe :")

    If ($input <> $pass) Then
        MsgBox(0,"Tutoriel", "Mauvais mot de passe !")
    Else
        MsgBox(0,"Tutoriel", "Le mot de passe est correct !")
    EndIf

Until ($input = $pass)


Ce code ne devrait pas vous poser de réels problèmes, et ce sous-chapitre est déjà assez étoffé pour le remplir encore...
Passons à la suite, voulez vous ? N'hesitez pas à faire une pause pour vous éclaircir les idées. o_O
Pas trop difficile ? La suite l'est un peu plus rassurez-vous !
Chapitre précédent Sommaire Chapitre suivant

Partager

6 commentaires pour "Des boucles qui tournent"
Note moyenne : 3.56 / 4 (100 votes)
Pseudo Commentaire
Hors ligne timmalos # Posté le 25/07/2011 à 08:48:26
Avatar

Avis : Très bon

Études : INSA Lyon

Alors je vais tout de suite vous répondre car je n'aime pas trop votre pique du milieu, cette partie du tutoriel bien que vieille et ayant besoin d'être mise à jour (notamment la phrase que vous mettez en cause qui est trop incisive) est TOUT A FAIT CORRECTE. Une boucle While, dans cette situation, n'est PAS la meilleure possibilité.

D'ailleurs, vous avez bien du voir la différence entre votre code et le mien, vous avez été obligé de rajouter TOUT LE TRAITEMENT (Bon ici, ca correspond à un simple InputBox) 1 fois avant la boucle.

Genial comme facon de programmer, taper 2 fois les mêmes informations alors que de l'autre facon une seule fois suffit?

Dans ce cas, vous avez peut etre l'impression que votre facon est la meilleure. Imagniez maintenant que votre traitement fasse 30 lignes.
Soit vous creez une fonction, qui sera appelée avant la boucle puis pendant, soit vous copiez/collez 30 lignes identiques, vous trouvez ca plus interessant que de passer par une boucle Do / Until?


Maintenant pour répondre à votre attaque irréfléchie, sachez que si sur le forum ou vous êtes allez chercher de l'aide en demandant de nouveaux tutoriels car celui ci "est une pâle copie du tuto C", vous devriez mieux chercher, vous me trouverez, et vous verrez que je connais ce langage.
Si ce tuto ne vous convient pas, je vous invite à en faire part pour m'aider à l'améliorer.


D'autres part, sache que personnellement, j'aurais fait exactement la même chose que toi, car je n'utilise jamais Do/Until, même lorsque je devrais. Je n'y pense tout simplement pas. Mais nous sommes dans un tutoriel, je me dois d'expliquer toutes les possibilités car certains l'utilisent certainement, et je le répète, ils auraient raison.

Quand à la 'copie du C', sache que pour apprendre les bases d'un langage il n'y a pas 36 moyens de faire, alors certes le plan est à peu de chose prêt celui du tutoriel de mateo21, mais si tu continues dans le tutoriel tu verras que je m'en affranchie totalement.

Image utilisateur
 
Hors ligne DC_Volo # Posté le 25/07/2011 à 14:17:10

Avis : Décevant

Re bonjour,

Désolé si j'ai été un peu trop direct je commençais à être fatigué. De toute manière j'éstime pour ma part qu'on ne peut pas toujours recevoir que des avis " positif " qui mis à part faire plaisir ne servent pas à l'avancement.

Le plan, ainsi que le " type d'humour " et le contenu y sont presque exactement pareil.

Je dirai que si tu veux l'ameliorer y'a pas grand chose à faire de plus d'autre qu'a partir de ce chapitre :

Mettre les TP resolu en spoiler et donner un peu plus de TP ou pourquoi pas un gros TP qui par exemple à la fin du chapitre 3 contiendrai le chapitre 1 , 2 et 3. Pour la fin du chapitre 5 il contiendrai 1 , 2 ,3 ,4 ,5.

Et puis je répondais à un exemple concret et non à la méthode donc je persiste pour l'exemple " j'aurai " raison. Mais pour la méthode je suis d'accord répeter deux fois un script c'est >.>

Pour ce qui est d'avoir dit que vous ne saviez pas coder j'axais ma remarque plus sur la " copie" , je me doute bien que le createur du tutorial connait un minimum son langage ^^ ( C'est bon j'suis reveilé xD )

Je t'enverrai un MP si j'ai des suggestions/avis si sa te gènes tant que ça, pour t'aider ( pour le peu que je pourrai d'ailleurs ).
Hors ligne timmalos # Posté le 25/07/2011 à 14:26:44
Avatar

Avis : Très bon

Études : INSA Lyon

Toute critique est bonne à prendre, la votre était un peu trop "facile". En argumentant, ca passe beaucoup mieux. Je prends note pour les TPs, j'essairai dans ajouter un dans ce chapitre, mais ca reste un chapitre pour apprendre les bases, et il est vraiment très dur de trouver des TPs qui ne contiennent que ce que l'on vient de voir. (Vraiment, j'ai essayé, c'est un casse tête. Vous qui n'etes pas un zéro ne vous en rendez peut etre pas compte, mais certaines fois, je parle de choses que je n'ai pas encore expliqué, avec un TP c'est encore pire !)

C'est pour cela que les parties suivantes contiennent plus de TPs, car après qu'on ait tout vu, il devient bien plus simple de travailler.

Quand à la ressemblance au tuto du C, je persiste : C'est un tuto qui a fait ses preuves au niveau de l'apprentissage, et il est bien plus simple de s'en inspirer pour suivre un plan qui contiendra tout ce qu'il faut que de repartir de 0. Et l'humour, honnêtement j'y peux rien, essayez d'ecrire un tuto c'est toujours la même chose qui vous revient à l'esprit. Parce que croyez le ou non, c'est pas copié du tuto sur le c ;)

Je le repère, n'hesite pas à critiquer , on ne peut pas tous avoir le même avis, mais dis pourquoi tu n'aimes pas cela, ca me permet de faire des moyennes pour qu'a peut près tout le monde soit content.

Image utilisateur
 
Hors ligne Little Nooby # Posté le 21/03/2012 à 14:19:09
Je cause trop...
Avatar

Avis : Très bon

Ville : Namur
Pays : Belgique

Waaaah, les gens attaquent directement, même en ayant tord, chaud quand même.

Chapitre facile de compréhension, et effectivement il n'y a pas 36 façons d'expliquer, c'est des choses qui se retrouvent dans les bases de beaucoup de langages et les exemples sont toujours les mêmes. Logique vu que ça fait pareil.

P.S.: S'il vous plait, si vous voulez nous montrer votre code, mettez le dans les marqueurs adaptés, avec édontation (=mise en page) et tout le trala, sinon je ne lis même pas moi.

Je ne me trompe jamais, je trouve des façons de ne pas faire ce que je voulais.
 
Hors ligne abamoss # Posté le 07/05/2012 à 22:36:23
Avatar

Avis : Bon

Merci pour ce tuto...

y a-t-il moyen jouer directement sur la condition du mot de passe de l'utilisateur Windows en cours de session?

Voir tous les commentaires
Ce tutoriel a été corrigé par les zCorrecteurs.