IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Je suis faché avec les conversions en C#


Sujet :

C#

  1. #1
    Futur Membre du Club
    Homme Profil pro
    BTS SIO
    Inscrit en
    Octobre 2016
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : BTS SIO

    Informations forums :
    Inscription : Octobre 2016
    Messages : 4
    Points : 8
    Points
    8
    Par défaut Je suis faché avec les conversions en C#
    Bonjour,

    Je suis actuellement en BTS SIO et voila je dois faire un programme pour m'afficher 4 choix (Somme, Quotient, Moyenne, Produit) sauf que j'ai toujours les mêmes erreurs de conversions. En gras, c'est les erreurs

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace Exercice_5_Menu
    {
        class Program
        {
            static void Main(string[] args)
            {   
                string s;
                double resultat;
                int e;
                int f;
                double g;
                int h;
                string a, b, c, d;
                
    
                Console.WriteLine("Quel est votre choix (entrez un nombre entre 1 et 4)");
                Console.WriteLine("a Somme");
                Console.WriteLine("b Quotient");
                Console.WriteLine("c Moyenne");
                Console.WriteLine("d Produit");
                Console.ReadLine();
                
                Console.WriteLine("Taper a");
                resultat = Console.ReadLine();
                e = Convert.ToInt32(resultat);
    
                Console.WriteLine("Taper b");
                f = Convert.ToInt32(resultat);
                
                
                if(a)
                { 
                    
    
                        resultat = (e + f);
                        Console.WriteLine("Le résultat est :" +resultat);
                        Console.ReadLine();
                }
                else
                if(b)
                {
                    
    
                    resultat = (e/f);
                    Console.WriteLine("Le résultat de la division est:" +resultat);
                    Console.ReadLine();
                }
                else
                if(c)
                {
                    
    
                    resultat = (e + f / 2);
                    Console.WriteLine("La moyenne est:" +resultat);
                    Console.ReadLine();
    
                }
                else
                if(d)
                {
                    
    
                    resultat = (e * f);
                    Console.WriteLine("Le résultat de la multiplication est:" +resultat);
                    Console.ReadLine();
                }
    
                Console.ReadLine();
            }
        }
    }
    Erreur :

  2. #2
    Expert confirmé
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Points : 4 005
    Points
    4 005
    Billets dans le blog
    7
    Par défaut
    Bonsoir,

    Ce sont des erreurs de conversions implicites c'est pourtant explicite !

    (va falloir penser à se convertir dans un autre métier....)

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2015
    Messages : 51
    Points : 37
    Points
    37
    Par défaut Tout le monde a débuté un jour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
     
    namespace Exercice_5_Menu
    {
        class Program
        {
            static void Main(string[] args)
            {
                string s;
                string resultat; // Le resultat est une string à afficher
                int e;
                int f;
                double g;
                int h;
                string a, b, c, d;
     
     
                Console.WriteLine("Quel est votre choix (entrez un nombre entre 1 et 4)");
                Console.WriteLine("a Somme");
                Console.WriteLine("b Quotient");
                Console.WriteLine("c Moyenne");
                Console.WriteLine("d Produit");
                Console.ReadLine();
     
                // on convertit la string dans un int pour faire les comparaison dans les if.
                int opération = int.Parse(Console.ReadLine());
     
                Console.WriteLine("Taper a");
                resultat = Console.ReadLine();
                e = Convert.ToInt32(resultat);
     
                Console.WriteLine("Taper b");
                f = Convert.ToInt32(resultat);
     
     
                if (opération == 1)
                {
     
                    // On convertit un int en string pour afficher le texte
     
                    resultat = (e + f).ToString(); // On convertit un int en string pour afficher le texte
                    Console.WriteLine("Le résultat est :" + resultat);
                    Console.ReadLine();
                }
                else if (opération == 2)
                {
     
     
                    resultat = (e / f).ToString(); // On convertit un int en string pour afficher le texte
                    Console.WriteLine("Le résultat de la division est:" + resultat);
                    Console.ReadLine();
                }
                else
                if (opération == 3)
                {
     
     
                    resultat = (e + f / 2).ToString(); // On convertit un int en string pour afficher le texte
                    Console.WriteLine("La moyenne est:" + resultat);
                    Console.ReadLine();
     
                }
                else if (opération == 4)
                {
     
     
                    resultat = (e * f).ToString(); // On convertit un int en string pour afficher le texte
                    Console.WriteLine("Le résultat de la multiplication est:" + resultat);
                    Console.ReadLine();
                }
     
                Console.ReadLine();
            }
        }
    }

  4. #4
    Expert confirmé
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Points : 4 005
    Points
    4 005
    Billets dans le blog
    7
    Par défaut
    Citation Envoyé par juju742 Voir le message
    Débuter n'implique pas d être assisté !

  5. #5
    Invité
    Invité(e)
    Par défaut
    Console.WriteLine te renvoie toujours des strings, tu dois les parser si tu veux un autre type.
    penses au try catch si l'utilisateur ne saisie pas ce que tu attends.

  6. #6
    Membre expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Points : 3 570
    Points
    3 570
    Par défaut
    Je me permets une correction, tu as du taper trop vite
    Citation Envoyé par benoit1024 Voir le message
    Console.ReadLine te renvoie toujours des strings, tu dois les parser si tu veux un autre type.
    penses au try catch si l'utilisateur ne saisie pas ce que tu attends.
    (Console.WriteLine ne renvoie rien)
    Plus je connais de langages, plus j'aime le C.

  7. #7
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 193
    Points : 28 077
    Points
    28 077
    Par défaut
    Bon, on va reprendre un peu les choses car les réponses peuvent être bien confuses pour un novice.

    Le message d'erreur : ligne 29, impossible de convertir implicitement le type string en double.
    Le code ligne 29 : resultat = Console.ReadLine(); .
    Console.ReadLine renvoie une string, Resultat est de type Double. Ce que dit le message c'est que l'on ne peut pas mettre directement (conversion implicite) le résultat de Console.ReadLine (string) dans résultat (double).

    Pourquoi convertir ? parce que pour mettre une string dans un double, il faut faire une conversion, une interprétation de la valeur de la string.
    Pourquoi implicite ? parce que lorsqu'on tente d'affecter une valeur d'un type dans une variable d'un autre type, si on ne précise rien explicitement, le complateur essaye de faire de lui-même implicitement la conversion nécessaire avec ce qu'il sait faire. Et il ne sait pas toujours faire, comme ici.

    Le message d'erreur : ligne 36, impossible de convertir implicitement le type string en bool.
    Le code ligne 36 : if(a); .
    Même principe, on peut pas directement convertir une string en boolean.
    Une expression de type if attend en opérande un boolean, c’est à dire soit une variable bool, soit une opération qui renvoie un bool, soit, et c'est le cas le plus fréquent, un test qui ne peut renvoyer que Vrai ou Faux (un bool, un test n'étant au final qu'une opération virtuelle renvoyant un boolean)

    a n'est pas un boolean, n'est pas une opération renvoyant un boolean, même si a contient TRUE (VRAI) ou FALSE (FAUX). Il faut ici aussi, ou faire un test avec a (par exemple a = string.empty), ou interpréter la valeur de a (par exemple bool.Parse(a) ), si celle-ci contient déjà le terme TRUE ou FALSE

    Idem pour les autres messages d'erreurs.
    --- Sevyc64 ---

    Parce que le partage est notre force, la connaissance sera notre victoire

  8. #8
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 904
    Points : 10 168
    Points
    10 168
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    Citation Envoyé par wallace1 Voir le message
    Bonsoir,

    (va falloir penser à se convertir dans un autre métier....)
    Même pas. Se convertir à VB cela va être assez

    Ceci dit, quand on ne le sait pas, ou qu'on n'y pense pas; la conversion implicite, peut transformer un programme en gruyère. Quand on est jeune et que l'on est débutant, c'est mieux de s'habituer et d'utiliser les conversions explicites avec toute la ferveur requise.
    À ma connaissance, le seul personnage qui a été diagnostiqué comme étant allergique au mot effort. c'est Gaston Lagaffe.

    Ô Saint Excel, Grand Dieu de l'Inutile.

    Excel n'a jamais été, n'est pas et ne sera jamais un SGBD, c'est pour cela que Excel s'appelle Excel et ne s'appelle pas Access junior.

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2015
    Messages : 51
    Points : 37
    Points
    37
    Par défaut
    Ceci dit, quand on ne le sait pas, ou qu'on n'y pense pas; la conversion implicite, peut transformer un programme en gruyère. Quand on est jeune et que l'on est débutant, c'est mieux de s'habituer et d'utiliser les conversions explicites avec toute la ferveur requise.
    Tu peux développé, je suis jeunes et débutant ! Merci.

  10. #10
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 904
    Points : 10 168
    Points
    10 168
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    Comme j'ai dit, je suis plus familier avec VB qu'avec C#. Je vais donc parler pour VB (VB.net, VB6 et VBA, c'est semblable pour les 3)

    À l'origine BASIC (Beginners All Purpose Symbolic Instruction Code) a été conçu comme un langage devant être utilisé dans l'apprentissage plus vaste du Fortran. Pour peu que je puisse comprendre la conversion implicite permettait d'arriver à un programme fonctionnel sans trop se préoccuper des types de données. Cela a fait du BASIC un langage extrêmement souple et léger qui pouvait fonctionner dans des PC avec aussi peu que 8 k (sic) de mémoire. (Moyennant quelques sacrifices comme une cassette audio 4 pistes comme mémoire de masse, sans disque dur, un écran strictement texte au début et en noir (vert) et blanc.

    Quand Microsoft et d'autres ont décidé d'intégrer un logiciel de programmation dans les PC naissants, BASIC s'est avéré le choix le plus logique et s'est largement imposé. Mais la conversion implicite a été maintenue.

    Par exemple dans tes deux lignes suivantes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    resultat = (e + f / 2).ToString(); // On convertit un int en string pour afficher le texte
    Console.WriteLine("La moyenne est:" + resultat);
    Tu as converti ton résultat d'un type mathématique à un type String.

    Dans un programme VB.net si tu as désactivé les conversions explicites, une seule ligne (sans le ";" ) suffit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Console.WriteLine("La moyenne est:" + resultat)
    Dans ce cas, que ton calcul donne un résultat mathématique n'a pas grande importance. VB va prendre ton résultat mathématique et le convertir en texte, sans poser de question. Il va se dire ce nombre-là est supposé être en texte, on en fait un texte. Si c'était juste cela, cela ne serait pas vraiment problématique.

    Un autre cas où la conversion implicite va fonctionner assez bien (Très semblable en VBA, si jamais tu dois l'utiliser avec Microsoft Office)
    en VB.net
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub ImpliciteVBnet()
         dim résultat as Integer 'résultat est un entier
         textbox1.text = 3
         Textbox2.text =9
         résultat = textbox1.text * textbox2.text
         messagebox.show (résultat)
    End sub
    en VBA

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub ImpliciteVBA()
         dim résultat as Integer 'résultat est un entier
         textbox1.text = 3
         Textbox2.text =9
         résultat = textbox1.text * textbox2.text
         msgbox(résultat)
    End sub
    Même si 3 et 9 sont en théorie du texte, la conversion implicite va en faire deux entiers pour que résultat soit entier, puis résultat, toujours grâce à la conversion implicite va devenir un texte pour pouvoir être gobé et affiché par la messageBox.

    Mais là où la conversion peut devenir une vraie peste, c'est dans des choses du genre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub ImpliciteVBnet2()
         dim résultat as single 'résultat est un nombre en virgule flottante en précision simple
         dim a as Integer 'a est un entier
         dim b as long 'b est un entier long
         c= a+b
         résultat = c/3,14
    End sub
    Dans ce cas, pour avoir C, il est impossible de faire l'addition sans convertir l'un ou l'autre des nombres. La conversion implicite va choisir le type de donnée unique qui peut inclure les autres types de données et les convertir sans prévenir dans le type unique. Là, ce n'est pas si mal, dépendant de la valeur de a et b on va avoir deux integer ou deux long et c va être Integer ou Long, selon le résultat.
    Mais là, le résultat final doit être en virgule flottante et précision simple et la surprise peut être totale. En premier lieu, la conversion implicite va regarder la valeur de c. Si c dépasse la valeur limite d'un nombre en Single, c va être converti en Double et 3.14 aussi. Mais comme résultat doit être Single, tu vas avoir un résultat en Single, si le résultat est plus petit que la valeur maximale du type single. Sinon, tu vas avoir un beau message d'erreur. Et quelqu'un qui n'est pas familier avec la conversion implicite pourrait chercher longtemps.

    C'est encore pire en VBA (ou VB6). En VB6-VBA un nombre en Integer ne peut pas dépasser 32768 pou être inférieur à -32767. Le type Long peut atteindre quelque chose dans les 2 700 000, si mes souvenirs sont exacts. Cala fait que des choses dans ce genre-là sont encore plus dangereuses qu'en VB.net

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub ImpliciteVBA2()
         dim résultat as single 'résultat est un nombre en virgule flottante en précision simple
         dim a as Integer 'a est un entier
         dim b as long 'b est un entier long
         dim c as integer
         a= 32500
         b= 8000
         c= a+b
         résultat = c/3,14
    End sub
    Là, avec c devant être en Integer, l'addition devient carrément impossible, parce que la conversion implicite devient incapable de convertir un résultat en type Long en type integer, parce l'additition dépasse 32768. La prime, un beau plantage. Et puis, on n'a pas encore parlé des variables qui sont passées en paramètres ou des variables publiques.

    Même que la conversion implicite permet des acrobaties du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    Sub ImpliciteVBA3()
         dim résultat as single 'résultat est un nombre en virgule flottante en précision simple
         dim a as String 'a est un texte
         dim b as Integer 'b est un entier
         a= "2500"
         b= 8000
         c= a+b
         résultat = c/3,14
    End sub
     
    Sub ImpliciteVBA4()
         dim résultat as single 'résultat est un nombre en virgule flottante en précision simple
         dim a as String 'a est un texte
         dim b as Integer 'b est un entier
         a= "2500"
         b=1
         c= a*b
         résultat = c/3,14
    End sub
    Si je me fie à cette discussion le C n'autorise pas la conversion implicite. Cela oblige à prévoir et effectuer chaque conversion explicitement, ce qui oblige à prévoir les résultats et permet de dépister plus facilement les erreurs. Avec la conversion implicite, les temps de développement sont possiblement plus courts, mais la conversion implicite mal maîtrisée peut être source d'erreurs.

    Mais VB permet heureusement de rendre obligatoire la déclaration explicite
    À ma connaissance, le seul personnage qui a été diagnostiqué comme étant allergique au mot effort. c'est Gaston Lagaffe.

    Ô Saint Excel, Grand Dieu de l'Inutile.

    Excel n'a jamais été, n'est pas et ne sera jamais un SGBD, c'est pour cela que Excel s'appelle Excel et ne s'appelle pas Access junior.

  11. #11
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 193
    Points : 28 077
    Points
    28 077
    Par défaut
    Citation Envoyé par clementmarcotte Voir le message
    Si je me fie à cette discussion le C n'autorise pas la conversion implicite. Cela oblige à prévoir et effectuer chaque conversion explicitement, ce qui oblige à prévoir les résultats et permet de dépister plus facilement les erreurs. Avec la conversion implicite, les temps de développement sont possiblement plus courts, mais la conversion implicite mal maîtrisée peut être source d'erreurs.

    Mais VB permet heureusement de rendre obligatoire la déclaration explicite
    Si tu parle de C#, le comportement ici est le même qu'en VB.Net avec l'option STRICT sur ON

    D'ailleurs tu peux faire le test, le code C# est traduisible quasiment mot à mot en VB, le comportement sera identique.
    --- Sevyc64 ---

    Parce que le partage est notre force, la connaissance sera notre victoire

  12. #12
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2015
    Messages : 51
    Points : 37
    Points
    37
    Par défaut
    Merci, je comprends maintenant pourquoi j'aime pas aimer le python et percer dans le C# a la place. C'est une raison explicite qui est implicite à la caste .

Discussions similaires

  1. je suis perdu avec les applications mobiles Firemonkey
    Par francheteau dans le forum Composants FMX
    Réponses: 1
    Dernier message: 01/08/2015, 20h15
  2. Réponses: 0
    Dernier message: 15/07/2015, 01h09
  3. [MySQL] Je suis perdu avec les encodages, accents et autres joyeusetés!
    Par fxbrg dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 02/09/2009, 08h43
  4. Mandriva est il faché avec les thread java?
    Par Flophx dans le forum Applications et environnements graphiques
    Réponses: 2
    Dernier message: 29/12/2007, 12h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo