Mis à jour le mardi 23 mai 2017
  • 20 heures
  • Facile

Ce cours est visible gratuitement en ligne.

Ce cours existe en livre papier.

Vous pouvez être accompagné et mentoré par un professeur particulier par visioconférence sur ce cours.

J'ai tout compris !

TP : La calculatrice

Connectez-vous ou inscrivez-vous gratuitement pour bénéficier de toutes les fonctionnalités de ce cours !

Nous allons enchaîner avec deux travaux pratiques. Sachez que pour ces TP il est absolument inutile de sauter directement à la solution pour se retrouver avec un programme qui fonctionne, mais au final ne rien comprendre. Je l'ai déjà répété à plusieurs reprises, c'est en pratiquant que l'on progresse.

Essayez donc d'être honnêtes avec vous-mêmes et de chercher comment résoudre le problème que je vous pose, même si vous n'y arriverez peut-être pas du premier coup. J'en profiterai également pour introduire de nouvelles notions, donc pas de panique : on y va doucement.

Addition

Cahier des charges

Donc, c'est parti : je veux (j'ai toujours rêvé de dire ça ! :D ) un programme qui effectue l'addition de deux nombres demandés au préalable à l'utilisateur. Attention à prévoir le cas où l'utilisateur ne saisirait pas un nombre.

Vous connaissez déjà la marche à suivre pour demander des nombres, les additionner, afficher le résultat (je l'ai déjà indiqué, au cas où vous ne le sauriez pas), mais un problème subsiste : comment vérifier qu'il s'agit bel et bien d'un nombre ?

IsNumeric()

Il vous faut faire appel à une fonction évoquée précédemment, qui prend en argument une variable (de toute façon, ce sera indiqué lorsque vous le taperez) et renvoie un booléen (vrai si cette variable est un nombre, faux dans le cas contraire).

Il va donc falloir stocker la valeur que la personne a entrée dans une variable de type string.

Et pourquoi pas dans une variable de type integer ? C'est bien un nombre, pourtant ?

Eh bien, tout simplement parce que si la personne entre une lettre il y aura une erreur : le programme ne peut pas entrer de lettre dans un integer, à l'inverse d'un string.

Ensuite, vous allez utiliser la fonction IsNumeric() sur cette variable.

Je vous laisse, alors ? :p Bonne chance !

Module Module1

    Sub Main()
        'Déclaration des variables
        Dim ValeurEntree As String = ""
        Dim Valeur1 As Double = 0
        Dim Valeur2 As Double = 0

        Console.WriteLine("- Addition de deux nombres -")
        'Récupération du premier nombre
        Do
            Console.WriteLine("Entrez la première valeur")
            ValeurEntree = Console.ReadLine()
            'Tourne tant que ce n'est pas un nombre
        Loop Until IsNumeric(ValeurEntree)
        'Écriture de la valeur dans un double
        Valeur1 = ValeurEntree

        'Récupération du second nombre
        Do
            Console.WriteLine("Entrez la seconde valeur")
            ValeurEntree = Console.ReadLine()
            'Tourne tant que ce n'est pas un nombre
        Loop Until IsNumeric(ValeurEntree)
        'Écriture de la valeur dans un double
        Valeur2 = ValeurEntree

        'Addition
        Console.WriteLine(Valeur1 & " + " & Valeur2 & " = " & Valeur1 + Valeur2)

        'Pause factice
        Console.Read()
    End Sub

End Module
Le résultat
- Addition de deux nombres -
Entrez la première valeur
10
Entrez la seconde valeur
k
Entrez la seconde valeur
20
10 + 20 = 30

Je voulais utiliser Do While et non Do Until !

Comme ceci ?

Do
    Console.WriteLine("Entrez la première valeur")
    Valeur1 = Console.ReadLine()
    'Tourne tant que ce n'est pas un nombre
Loop While not IsNumeric(Valeur1)

C'est tout à fait juste.

Et voilà l'occasion d'utiliser le not vu précédemment. Et de toute façon, si vous ne vous souveniez plus de ce mot clé, vous aviez Until à votre disposition !

Autre chose : pourquoi stockes-tu les résultats dans une autre variable, et n'as-tu pas tout de suite utilisé les mêmes variables ?

À cause des types : avec votre suggestion, il aurait fallu mettre Valeur1 et Valeur2 en string, on est d'accord ? Sauf qu'une addition sur un string, autrement dit une chaîne de caractères, même si elle contient un nombre, aura comme effet de « coller » les deux textes. Si vous avez essayé, vous avez dû récupérer un « 1020 » comme résultat, non ? :p

Et pourquoi donc utiliser un Do, et non un simple While ou If ?

Parce qu'avec un If, si ce n'est pas un nombre, le programme ne le demandera pas plus d'une fois. Un simple While aurait en revanche suffi ; il aurait juste fallu initialiser les deux variables sans nombres à l'intérieur. Mais je trouve plus propre d'utiliser les Do.

Minicalculatrice

Nous venons donc de réaliser un programme qui additionne deux nombres.

Cahier des charges

Au tour maintenant de celui qui effectue toutes les opérations.

Pardon ?

Oui, exactement. Vous êtes tout à fait capables de réaliser ce petit module. La différence entre les deux applications est simplement un « menu », qui sert à choisir quelle opération effectuer. Je vous conseille donc la boucle Select Case pour réagir en fonction du menu. Autre chose : pensez à implémenter une fonction qui vérifie que le choix du menu est valide.

Vous avez toutes les clés en main ; les boucles et opérations sont expliquées précédemment. Bonne chance ! :)

Module Module1

    Sub Main()
        'Déclaration des variables
        Dim Choix As String = ""
        Dim ValeurEntree As String = ""
        Dim Valeur1 As Double = 0
        Dim Valeur2 As Double = 0

        'Affichage du menu
        Console.WriteLine("-   Minicalculatrice   -")
        Console.WriteLine("-  Opérations possibles -")
        Console.WriteLine("-     Addition : 'a'    -")
        Console.WriteLine("-   Soustraction : 's'  -")
        Console.WriteLine("-  Multiplication : 'm' -")
        Console.WriteLine("-     Division : 'd'    -")

        Do
            Console.WriteLine("- Faites votre choix :  -")
            'Demande de l'opération
            Choix = Console.ReadLine()
            'Répète l'opération tant que le choix n'est pas valide
        Loop Until Choix = "a" Or Choix = "s" Or Choix = "m" Or Choix = "d"

        'Récupération du premier nombre
        Do
            Console.WriteLine("Entrez la première valeur")
            ValeurEntree = Console.ReadLine()
            'Tourne tant que ce n'est pas un nombre
        Loop Until IsNumeric(ValeurEntree)
        'Écriture de la valeur dans un double
        Valeur1 = ValeurEntree

        'Récupération du second nombre
        Do
            Console.WriteLine("Entrez la seconde valeur")
            ValeurEntree = Console.ReadLine()
            'Tourne tant que ce n'est pas un nombre
        Loop Until IsNumeric(ValeurEntree)
        'Écriture de la valeur dans un double
        Valeur2 = ValeurEntree

        Select Case Choix
            Case "a"
                'Addition
                Console.WriteLine(Valeur1 & " + " & Valeur2 & " = " & Valeur1 + Valeur2)
            Case "s"
                'Soustraction
                Console.WriteLine(Valeur1 & " - " & Valeur2 & " = " & Valeur1 - Valeur2)
            Case "m"
                'Multiplication
                Console.WriteLine(Valeur1 & " x " & Valeur2 & " = " & Valeur1 * Valeur2)
            Case "d"
                'Division
                Console.WriteLine(Valeur1 & " / " & Valeur2 & " = ")
                Console.WriteLine("Valeur exacte : " & Valeur1 / Valeur2)
                Console.WriteLine("Résultat entier : " & Valeur1 \ Valeur2)
                Console.WriteLine("Reste : " & Valeur1 Mod Valeur2)
        End Select

        'Pause factice
        Console.Read()
    End Sub

End Module

J'ai choisi de faire appel à une méthode plutôt fastidieuse. En effet, dans la ligne Loop Until Choix = "a" Or Choix = "s" Or Choix = "m" Or Choix = "d", j'ai réécrit toutes les valeurs possibles du menu, mais imaginez-vous dans le cas d'un menu de vingt choix…

Dans cette situation, l'astuce serait d'utiliser un menu à numéros et, carrément, d'exclure une plage avec un nombre supérieur à 10, par exemple.

Voici ce que j'obtiens lorsque je lance le programme :

-   Minicalculatrice   -
-  Opérations possibles -
-     Addition : 'a'    -
-   Soustraction : 's'  -
-  Multiplication : 'm' -
-     Division : 'd'    -
- Faites votre choix :  -
y
- Faites votre choix :  -
d
Entrez la première valeur
255
Entrez la seconde valeur
12m
Entrez la seconde valeur
36
255 / 36 =
Valeur exacte : 7,08333333333333
Résultat entier : 7
Reste : 3

Pour ma part, j'utilise une variable intermédiaire, et je n'effectue pas directement l'opération dans le WriteLine ; mais dans le cas de la division, les résultats ne sont pas toujours justes… Pourquoi ?

Vous avez sûrement dû déclarer votre « variable intermédiaire » en integer. Si c'est le cas, je vous explique le problème : le integer ne sert pas à stocker des nombres à virgule. Essayez de placer cette variable en double pour vérifier. Idem pour les autres variables : si l'utilisateur veut additionner deux nombres à virgule, cela n'ira pas !

Alors, pas sorcier pour le reste ? Du moins, je l'espère. Allez, on passe à la suite ! :)

Exemple de certificat de réussite
Exemple de certificat de réussite