Boucles et décisions : choisir un ensemble d'instruction selon un cas

Bien qu'il soit possible d'utiliser le mot-clé ElseIf pour vérifier de multiples conditions et exécuter certaines instructions pour chacune d'elles, il y a des cas où vous ne souhaitez pas vérifier quelque chose de différent à chaque fois, et pour lesquels vous désirez éviter la redondance de calculs et de comparaisons à chaque fois. C'est là qu'interviennent les mots-clés Select et EndSelect.

Le format d'un bloc Select...EndSelect est présenté ci-dessous :

Select <expression>
    Case <constante 1>
        ; Instructions

    [Case <constante 2>
        ; Instructions]

    [Case <constante 3>
        ; Instructions]

    ; ...

    [Case <constante n>
        ; Instructions]

    [Default
        ; Instructions]
EndSelect
Les opérations effectuées par cette structure sont les suivantes : d'abord la valeur de l'expression est calculée. Cela peut être toute sorte d'expression, pas seulement une comparaison ou une expression logique. Elle est ensuite comparée à chacune des constantes (numériques ou chaînes) qui suivent les mots-clés Case. Si elle correspond à l'une d'entre-elles alors le code suivant le mot-clé Case correspondant est exécuté, jusqu'à ce qu'un autre mot-clé Case soit atteint, et que le programme passe alors à la prochaine instruction située après le mot-clé EndSelect. Si aucune des conditions Case ne correspond alors les instructions situées après le mot-clé Default sont exécutées.

Encore une fois, les crochets indiquent que ces conditions sont facultatives, bien que vous devez avoir au moins une condition Case, et le mot-clé Default (s'il est présent) doit être la dernière condition à l'intérieur du bloc Select...EndSelect.

A l'instar du bloc If...EndIf, vous pouvez imbriquer les blocs Select...EndSelect les uns à l'intérieur des autres ou à l'intérieur de n'importe quels autres blocs ou boucles tant qu'un bloc est entièrement contenu à l'intérieur de l'autre.

L'exemple ci-dessous présente certaines utilisations du bloc Select...EndSelect. Vous pouvez également télécharger les sources à partir d'ici.

If OpenConsole()

    ; C'est la même chose qu'un des exemples précédents, sauf que
    ; les comparaisons concernent toujours l'égalité donc nous ne pouvons pas faire le
    ; même test qu'avec la partie ElseIf nom$<>"John" de l'exemple précédent
    nom$ = "John"
    Select nom$
        Case "Andrew"
            PrintN("Vous avez le meme nom que mon frere.")
            
        Case "Robert"
            PrintN("Votre nom vient-il du celebre roi ecossais ?")
            
        Case "John"
            PrintN("Ou pouvons-nous trouver Paul, George et Ringo ?")
            
        Default
            PrintN("Desole, je ne vous reconnais pas.")
    EndSelect


    ; Un ensemble simple d'instructions pour les fermiers, suivant l'âge de leurs poules ;)
    ; (NB : aucun animal n'a été blessé lors du test de cet exemple !)
    age_poule.w = -1
    Select age_poule
        Case 0
            PrintN("C'est plus une poulette qu'une poule")

        Case 1
            PrintN("Utile pour pondre des oeufs")

        Case 2
            PrintN("Age principal pour la viande - tchak ! tchak ! A la hache !")

        Case 3
            PrintN("Elle se fait vieille maintenant, mieux vaut mettre un terme a sa misere - tchak ! tchak ! A la hache !")

        Default
            PrintN("On les compte avant qu'elles soient hachees ?")
    EndSelect

    PrintN("Appuyez sur ENTREE pour quitter.")
    Input()
    CloseConsole()
EndIf
End

Cet exemple donne également une meilleure idée de l'imbrication des différents types de blocs ou de boucles. Vous noterez que l'ordre de début et fin des mots-clés est If, Select, EndSelect, Select, EndSelect et EndIf. C'est la manière correcte de les imbriquer, avec le bloc Select...EndSelect complètement renfermé à l'intérieur du bloc If...EndIf. Cela eut été une erreur d'avoir écrit le programme de sorte que l'ordre soit (par exemple) If, Select, EndSelect, Select, EndIf et EndSelect.