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 :

Calculatrice de base


Sujet :

C++

  1. #1
    Membre confirmé

    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mars 2016
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mars 2016
    Messages : 16
    Par défaut Calculatrice de base
    Bonjour,

    En ce moment j'essaie de faire une petite calculatrice C++ en mode console.
    Voici comment s'articule mon code :

    Main.cpp
    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
     
    #include <iostream>
    #include "fcalcul.h"
     
    using namespace std;
     
     
    int main()
    {
        /*Calculatrice*/
     
        int argUn (0);
        int argDeux (0);
        int resultat1 (0);
        char operateur ('+');
     
        cout << "Bienvenue sur votre calculatrice basique" << endl ;
        cout << "Que voulez-vous calculer ? : " << endl ;
        cout << "Valeur 1 = " ;
        cin >> argUn;
        cout << "Operateur = " ;
        cin >> operateur;
        cout << "Valeur 2 = " ;
        cin >> argDeux;
     
        resultat1 = calcul (argUn, operateur, argDeux);
     
        cout << argUn << operateur << argDeux << " = " << resultat1 << endl ;
     
        return 0;
    }
    La Fonction fcalcul.cpp

    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
     
    #include <iostream>
    #include "fcalcul.h"
     
     
    using namespace std;
     
     
    /*Fonction Calcul*/
     
    int calcul (int arg1 , int arg2 , char operat)
    {
        int resultat2;
        switch (operat)
            {
            case '+' : return ('arg1 + arg2 = resultat2');
                break;
            case '-' : return ('arg1 - arg2 = resultat2');
                break;
            case '*' : return ('arg1 * arg2 = resultat2');
                break;
            case '/' : return ('arg1 / arg2 = resultat2');
                break;
            default : cout << "Vous n'avez utilisé aucun signe de calcul, veuillez recommencer !" ;
                break;
            }
     
        return resultat2;
     
    }
    fcalcul.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #ifndef FCALCUL_H_INCLUDED
    #define FCALCUL_H_INCLUDED
     
    int calcul(int arg1, int arg2, char operat);
     
    #endif // FCALCUL_H_INCLUDED
    Voici le problème que j'ai (image):

    Pièce jointe 204771


    Je pense que j'ai un problème au niveau de la variable char (opérateur).
    C'est comme s'il ne voyait pas que c'est un opérateur.

    Si vous avez une idée.

    Merci à vous pour votre aide.

    Cordialement,

    Alaz

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Quand je clique sur ta pièce jointe, j'obtiens ceci:
    Pièce jointe spécifié(e) non valide. Si vous suivez un lien valide, veuillez notifier l'administrateur

    Autre chose, ton code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return ('arg1 + arg2 = resultat2');
    Ça compile, ça?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par main.cpp
    calcul (argUn, operateur, argDeux);
    Citation Envoyé par fcalcul.cpp
    int calcul (int arg1 , int arg2 , char operat)


    Ca compile surement, mais ça défie toutes les lois de la logique, et j'ai aucune idée de ce que ça retourne, mais ça doit pas être beau
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  4. #4
    Membre confirmé

    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mars 2016
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mars 2016
    Messages : 16
    Par défaut
    Ah mince alors je vais vous écrire la compilation. (Oui ça compile bien) .

    Dans mon terminal j'ai :

    Bienvenue sur votre calculatrice basique
    Que voulez-vous calculer ? :
    Valeur 1 = 2
    Operateur = +
    Valeur 2 = 2
    Vous n'avez utilisé aucun signe de calcul, veuillez recommencer !2+2 = 0

    Process returned 0 (0x0) execution time : 11.852 s
    Press ENTER to continue.



    EDIT 1 : Lol Bousk, j'ai déclarer 2 fois les variables, 1 fois dans main.cpp et une autre dans fcalcul.cpp. Je suppose donc que je doit corriger ma fonction fcalcul. Medinoc je vais essayer, Merci à tout les deux .

  5. #5
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 760
    Par défaut
    Relit les messages de ton compilateur, notamment les warning, parce que return 'arg1 + arg2 = resultat2', c'est du n'importe quoi.

  6. #6
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    c'est surtout une constante multicaractère, de type int, dont la valeur est dépendante du compilateur.
    Ca n'a rien à voir avec l'évaluation.
    Ajoutons que resultat2 n'est pas initialisé

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par Alazban Voir le message
    EDIT 1 : Lol Bousk, j'ai déclarer 2 fois les variables, 1 fois dans main.cpp et une autre dans fcalcul.cpp. Je suppose donc que je doit corriger ma fonction fcalcul. Medinoc je vais essayer, Merci à tout les deux .
    J'ai pas compris ton histoire sur les variables déclarées 2 fois. Mais si tu relisais un peu ton code, que j'ai mis en avant, tu ne passes pas les paramètres correctement surtout..
    Et tu as certainement des warnings qui t'en informent. Que tu tronques un int en char.
    Bon ça changera pas le résultat absurde que tu auras surement avec ta syntaxe par-dessus ça, mais ce serait un bon début.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  8. #8
    Membre confirmé

    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mars 2016
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mars 2016
    Messages : 16
    Par défaut
    Bon ce matin j'ai relu le code et j'ai fais quelques modifications.

    main.cpp, j'ai modifié cette ligne resultat1 = fcalcul (argUn, argDeux, operateur); j'ai inversé argDeux et operateur et enfin la fonction récupère l'opérateur. Il doit y avoir un sens à respecter je pense car a chaque fois dans le code j'ai déclaré valeur1 valeur2 puis operateur sauf à cet endroit.
    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
     
    #include <iostream>
    #include "fcalcul.h"
     
    using namespace std;
     
     
    int main()
    {
        /*Calculatrice*/
     
        int argUn (0);
        int argDeux (0);
        int resultat1 (0);
        char operateur ('+');
     
        cout << "Bienvenue sur votre calculatrice basique" << endl ;
        cout << "Que voulez-vous calculer ? : " << endl ;
        cout << "Valeur 1 = " ;
        cin >> argUn;
        cout << "Operateur = " ;
        cin >> operateur;
        cout << "Valeur 2 = " ;
        cin >> argDeux;
     
        resultat1 = fcalcul (argUn, argDeux, operateur);
     
        cout << argUn << " " << operateur << " " << argDeux << " = " << resultat1 << endl ;
     
        return 0;
    }
    Autre chose, j'ai renommé mes variable correctement. ça fonctionne mieux.

    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
     
    #include <iostream>
    #include "fcalcul.h"
     
    using namespace std;
     
     
    /*Fonction Calcul*/
     
    int fcalcul (int argUn , int argDeux , char operateur)
    {
        int resultat1 (0);
     
        switch (operateur)
            {
            case '+' : return ('argUn + argDeux = resultat1');
                break;
            case '-' : return ('argUn - argDeux = resultat1');
                break;
            case '*' : return ('argUn * argDeux = resultat1');
                break;
            case '/' : return ('argUn / argDeux = resultat1');
                break;
            default : cout << "Vous n'avez utilisé aucun signe de calcul, veuillez recommencer !" ;
                break;
            }
     
        return resultat1;
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #ifndef FCALCUL_H_INCLUDED
    #define FCALCUL_H_INCLUDED
     
    int fcalcul(int argUn, int argDeux, char operateur);
     
     
    #endif // FCALCUL_H_INCLUDED
    Par contre j'ai toujours un problème, car maintenant il me fait le calcul mais me renvoie toujours le même résultat genre
    2+3=1987643693
    C'est surement un problème avec resultat1, un truc que je pige pas bien.... resultat1 dans main.cpp et resultat1 dans fcalcul.cpp ... comment se fait la communication entre les deux fichiers ? j'ai du la déclarer 2 fois . Bizarre j'ai le cerveau bloqué la xD.

    Bref je vais regarder dans les warnings , merci pour votre précieuse aide.
    J’espère avoir été clair.

  9. #9
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Citation Envoyé par Alazban Voir le message
    Par contre j'ai toujours un problème, car maintenant il me fait le calcul mais me renvoie toujours le même résultat genre
    2+3=1987643693
    C'est surement un problème avec resultat1, un truc que je pige pas bien.... resultat1 dans main.cpp et resultat1 dans fcalcul.cpp ... comment se fait la communication entre les deux fichiers ? j'ai du la déclarer 2 fois . Bizarre j'ai le cerveau bloqué la xD.
    C'est le problème de return ('argUn + argDeux = resultat1');, le truc dont je suis surpris que ça compile et qui sur un compilateur correctement configuré, devrait au moins te donner un warning.

    Que cherches-tu à faire avec un tel code, pour commencer? Que signifient les simple quotes pour toi?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  10. #10
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par défaut
    Plus je te lis, plus j'ai l'impression que tu mets la charrue avant les boeufs.
    Avant de courrir, on apprend à marcher.
    Citation Envoyé par Alazban Voir le message
    Il doit y avoir un sens à respecter je pense car a chaque fois dans le code j'ai déclaré valeur1 valeur2 puis operateur sauf à cet endroit.
    Bien sur qu'il y a un sens.. Comment crois-tu que ça fonctionne sinon ? Si la fonction attend un string, int et Objet, il faut les lui fournir à l'emplacement attendu, par l'argument attendu. Elle ne devinera rien.
    Citation Envoyé par Alazban Voir le message
    Par contre j'ai toujours un problème, car maintenant il me fait le calcul mais me renvoie toujours le même résultat genre
    2+3=1987643693
    Ca on te le dit depuis le premier post : tu as écrit n'importe quoi, donc le résultat est n'importe quoi.
    return ('arg1 + arg2 = resultat2'); a un sens pour ton compilateur, et il te retourne la valeur qu'il en tire. Qui n'est clairement pas le sens que tu espères lui donner, et donc forcément pas la valeur que tu attends.

    Citation Envoyé par Alazban Voir le message
    resultat1 dans main.cpp et resultat1 dans fcalcul.cpp ... comment se fait la communication entre les deux fichiers ? j'ai du la déclarer 2 fois . Bizarre j'ai le cerveau bloqué la xD.
    Les noms des variables n'ont aucune signification une fois le programme compilé. Des variables au nom identique dans des scopes différents n'ont strictement aucun lien entre elles.

    Tu devrais commencer par te renseigner et lire un minimum de cours, et je ne parle pas que de C++.
    La portée des variables et l'appel des fonctions en passant des arguments se retrouve dans le B.A.BA de quasiment tous les langages.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  11. #11
    Membre confirmé

    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mars 2016
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mars 2016
    Messages : 16
    Par défaut
    Je n'ai jamais lu de cours, ça m'est venu comme ça surtout que je ne suis pas un intello qui retient tout et qui ne sait même pas mettre en pratique ce qu'il a appris ... je suis plutôt l'inverse, j’apprends par la pratique (en me basant sur divers cours) je ne crois pas me tromper en disant qu'un élève ne fait jamais d'erreur ????? .... Un peu de positif ça fait pas de mal !

    je vais donc chercher à modifier return = argUn *+-/ argDeux = resultat1

    Merci pour votre aide

  12. #12
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Ca n'est pas être négatif que de dire qu'il faut apprendre sérieusement.
    A tenter au pif, tu ne risques qu'une seule chose: croire sans savoir.

    return est une instruction, qui met fin à l'exécution d'une fonction en définissant la valeur que doit prendre l'expression constituée par son appel.

    C'est à dire que dans le code suivant, la valeur de l'expression f(2,3) est 5:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int f(int a, int b) {
        return a+b;
    }
     
    int main() {
        int i = f(2,3);
        return 0;
    }
    La valeur de retour de l'appel de main sera systématiquement 0.
    Pour la question des variables, c'est pareil, il faut comprendre la notion de portée (scope).

  13. #13
    Membre confirmé

    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mars 2016
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mars 2016
    Messages : 16
    Par défaut
    Je pense la même chose que vous, il me semblait bien avoir posté dans le sous-forum débutant.

    Je vous remercie pour vos conseils.

    Alaz

  14. #14
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par Alazban Voir le message
    je vais donc chercher à modifier return = argUn *+-/ argDeux = resultat1
    t'as fait 99% du truc, pourquoi chercher compliqué ? return argUn + argDeux; et basta
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  15. #15
    Membre confirmé

    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mars 2016
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mars 2016
    Messages : 16
    Par défaut
    Merci pour vos réponses, cependant je tiens à faire quelque chose qui tient la route.
    J'ai testé ce que m'a dit Bousk mais j'ai toujours le même type de résultat.
    Donc si la structure de contrôle ne convient pas ... je peux changer et faire appel a if ...else.... .

    Merci je vais continuer a lire mes cours en attendant.

    Alaz

  16. #16
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    fais voir ton code actuel?

  17. #17
    Membre confirmé

    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mars 2016
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mars 2016
    Messages : 16
    Par défaut
    Pour l'instant il n'a pas vraiment changé..

    main.cpp
    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
     
    #include <iostream>
    #include "fcalcul.h"
     
    using namespace std;
     
     
    int main()
    {
        /*Calculatrice*/
     
        int argUn (0);
        int argDeux (0);
        int resultat1 (0);
        char operateur ('+');
     
        cout << "Bienvenue sur votre calculatrice basique" << endl ;
        cout << "Que voulez-vous calculer ? : " << endl ;
        cout << "Valeur 1 = " ;
        cin >> argUn;
        cout << "Operateur = " ;
        cin >> operateur;
        cout << "Valeur 2 = " ;
        cin >> argDeux;
     
        resultat1 = fcalcul (argUn, argDeux, operateur);
     
        cout << argUn << " " << operateur << " " << argDeux << " = " << resultat1 << endl ;
     
        return 0;
    }
    fonction fcalcul.cpp
    Si je dois modifier quelque chose je pense que c'est dans la fonction ... au niveau du return dans le switch, à la vue de ce que l'on m'a déjà expliqué même si je ne saisis pas vraiment pourquoi je ne peux pas utiliser switch pour retourner un résultat. Si je ne peut pas utiliser return alors avec quoi je renvois mon résultat. Si la condition switch ne convient pas je peux faire autrement.
    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
     
    #include <iostream>
    #include "fcalcul.h"
     
    using namespace std;
     
     
    /*Fonction Calcul*/
     
    int fcalcul (int argUn , int argDeux , char operateur)
    {
        int resultat1 (0);
     
        switch (operateur)
            {
            case '+' : return ('argUn + argDeux');
                break;
            case '-' : return ('argUn - argDeux');
                break;
            case '*' : return ('argUn * argDeux');
                break;
            case '/' : return ('argUn / argDeux');
                break;
            default : cout << "Vous n'avez utilisé aucun signe de calcul, veuillez recommencer !" ;
                break;
            }
     
        return resultat1;
     
    }
    fcalcul.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #ifndef FCALCUL_H_INCLUDED
    #define FCALCUL_H_INCLUDED
     
    int fcalcul(int argUn, int argDeux, char operateur);
     
     
    #endif // FCALCUL_H_INCLUDED

  18. #18
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Reprenons les bases.

    Ton main est le suivant:
    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
    int main()
    {
        /*Calculatrice*/
     
        int argUn (0);
        int argDeux (0);
        int resultat1 (0);
        char operateur ('+');
     
        // lecture de cin
     
        resultat1 = fcalcul (argUn, argDeux, operateur);
     
        cout << argUn << " " << operateur << " " << argDeux << " = " << resultat1 << endl ;
        return 0;
    }
    Supposons que cin produisent les valeurs suivante pour les variables locales de main
    • argUn = 1;
    • operateur = '+';
    • argDeux = 2;


    On arrive à l'instruction suivante: resultat1 = fcalcul (argUn, argDeux, operateur);.
    Il s'agit d'une seule instruction (il n'y a qu'un ;), constituée uniquement d'une expression.
    Une telle instruction-expression est évaluée pour ses "effets de bord", c'est à dire les modifications en mémoire et les entrées sorties.
    Je prends le temps de détailler cette instruction pour que tu percoives le problème dans la suite
    D'après les règles de priorité, cette expression est ainsi constituée:
    application de l'opérateur = avec pour opérande gauche resultat1 et opérande droit l'expression fcalcul (argUn, argDeux, operateur).
    C'est à dire l'affectation de la valeur de cette sous-expression à la variable resultat1.

    fcalcul (argUn, argDeux, operateur) est un appel de la fonction int fcalcul (int argUn , int argDeux , char operateur).

    Tu noteras que le type de l'appel de fonction est le type de retour de la fonction appelée, ici int.
    Jusque là, tout va bien, tu affectes un int à un int.

    Avant toute autre chose, l'évaluation de l'appel de fcalcul commence par la création de trois variables temporaires (les paramètres de la fonction): chacune est initialisée avec la valeur indiquée dans l'appel. (Aux optimisations près, qui ne changeront pas les effets de ce fonctionnement)
    Ainsi, les variables int argUn , int argDeux , char operateur, déclarées par la fonction, sont créées, et initialisées en leur affectant les valeurs des variables de main().
    C'est à dire, ici, tout se passe comme si on avait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int argUn = 1;
    int argDeux = 2;
    char operateur = '+';
    C'est précisément ce mécanisme qu'on appelle le passage par copie.

    On en arrive à la définition de ta fonction:
    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
     
    int fcalcul (int argUn , int argDeux , char operateur) {
        int resultat1 (0);
     
        switch (operateur) {
            case '+' : return ('argUn + argDeux');
                break;
            case '-' : return ('argUn - argDeux');
                break;
            case '*' : return ('argUn * argDeux');
                break;
            case '/' : return ('argUn / argDeux');
                break;
            default : cout << "Vous n'avez utilisé aucun signe de calcul, veuillez recommencer !" ;
                break;
            }
     
        return resultat1;
     
    }
    Je commence par quelques remarques "tactiques":
    les mots clés continue, break, return et throw créent des instructions qui changent inconditionnellement le flux normal d'exécution. Ces trois mots clés ont un point commun: l'instruction suivante n'est pas celle qui la suit. (goto aussi, mais celui-là permet de faire de grosses bêtises)
    Ainsi un break après un return est toujours inaccessible, donc inutile.

    Pour plus de lisibilité, si un case ne tient pas sur une seule ligne, je recommande de ne rien mettre sur la ligne du case.

    Ainsi, ton code peut être plus lisible:
    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
     
    int fcalcul (int argUn , int argDeux , char operateur) {
        int resultat1 (0);
     
        switch (operateur) {
            case '+' : return ('argUn + argDeux');
            case '-' : return ('argUn - argDeux');
            case '*' : return ('argUn * argDeux');
            case '/' : return ('argUn / argDeux');
            default :
                cout << "Vous n'avez utilisé aucun signe de calcul, veuillez recommencer !" ;
                break;
        }
     
        return resultat1;
    }
    On remarque plusieurs choses:
    • resultat1 n'est utilisé que par le dernier return: autant remplacer la variable par sa valeur à cet endroit, et retirer la variable ("une variable de moins est une source d'erreur en moins")
    • tu détectes bien une erreur, mais ta fonction retourne une valeur légitime (0) plutot qu'une impossible ou de lever une exception. Il n'y a pas de valeur impossible pour int (dans ton cas), donc tu devrais avoir une exception. Cela supprime carrément le return du point précédent.
    • Tu n'as pas lu nos messages précédents.

    Pour les premiers points on arrive au code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    int fcalcul (int argUn , int argDeux , char operateur) {
        switch (operateur) {
            case '+' : return ('argUn + argDeux');
            case '-' : return ('argUn - argDeux');
            case '*' : return ('argUn * argDeux');
            case '/' : return ('argUn / argDeux');
            default :
                throw std::runtime_error("Vous n'avez utilisé aucun signe de calcul, veuillez recommencer !");
        }
    }
    Passons au point qui te pose vraiment problème.
    Puisqu'on a supposé que operateur vaut '+', la fonction est exécuté exactement comme si elle était écrite ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int fcalcul (int argUn , int argDeux) {
        return ('argUn + argDeux');
    }
    J'en reviens encore une fois à la grammaire du langage.
    L'instruction return ('argUn + argDeux'); est une "return instruction", constituée du mot-clé return, d'une sous-expression et d'un ;.
    En tant que "return instruction", son action est de donner la valeur de la sous-expression à l'expression ayant appelé la fonction.
    Il s'agit donc d'attribuer la valeur de ('argUn + argDeux') à une valeur temporaire de type int (le type de retour de la fonction).

    Toujours d'après la grammaire, cette sous-expression est constituée de:
    • une parenthèse ouvrante (
    • une sous expression constituée de
      • une apostrophe '
      • des caractères différents d'une apostrophe argUn + argDeux
      • une apostrophe '
    • une parenthèse fermante )


    L'opérateur parenthèse vaut la même chose que la sous expression qu'il contient, il est ici inutile.
    Tu aurais aussi bien pu écrire return 'argUn + argDeux';. Pour t'en souvenir, saches que return n'est pas une fonction, mais un mot-clé.

    Par les apostrophes qui la commencent et la terminent, la sous expression 'argUn + argDeux' est une déclaration de litéral de caractère.
    Il s'agit d'une constante de compilation, exactement comme 42, 'a' et "truc".
    Sauf que si ces trois dernières sont de types respectifs int, char et char const*, 'argUn + argDeux' est un batard de la norme: un "Multicharacter literal" de type int, et de valeur complètement arbitraire (mais pas aléatoire, car définie par l'implémentation du compilateur). (regarde le point 6 de la documentation sur cppreference.com)

    Et c'est précisément à cause de ce type batard, int que Médinoc a été surpris, car l'expression étant à la fois valable et du bon type, le compilateur n'a aucune raison de créer un warning.
    Cela dit, il devrait y avoir un warning systématique sur les constantes multicaractères, qui ne sont ni portables, ni gérables, ni vraiment sémantiques.

    Maintenant, comprends-tu ton problème?
    Il y a quelque chose de bizarre dans ton code, entre return 'argUn + argDeux'; et return resultat1;.
    L'un utilise des apostrophes, pas l'autre. Ca manque de cohérence.

    J'irai plus loin, avec plus de warning, et compilateur un minimum gentil, tu aurais eu des messages concernant des paramètres de fonction nommés sans être utilisés (argUn et argDeux)

  19. #19
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Citation Envoyé par Alazban Voir le message
    Si je dois modifier quelque chose je pense que c'est dans la fonction ... au niveau du return dans le switch, à la vue de ce que l'on m'a déjà expliqué même si je ne saisis pas vraiment pourquoi je ne peux pas utiliser switch pour retourner un résultat. Si je ne peut pas utiliser return alors avec quoi je renvois mon résultat. Si la condition switch ne convient pas je peux faire autrement.
    En fait, il faut que tu prennes le temps de comprendre précisément comment fonctionne chaque mot-clé, chaque symbole que tu utilises.
    Ici, ton problème, ce n'est ni switch, ni return, mais la paire d'apostrophes (').

  20. #20
    Membre confirmé

    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mars 2016
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mars 2016
    Messages : 16
    Par défaut
    Merci pour le temps que tu as pris, je vais méditer ça et je reviendrais quand j'aurais avancé, vraiment merci.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [Debutant sans bases] Calculatrice
    Par faeze dans le forum Windows Forms
    Réponses: 4
    Dernier message: 23/12/2009, 18h57
  2. [Windows]accès base de registre windows
    Par Greg01 dans le forum API standards et tierces
    Réponses: 27
    Dernier message: 05/06/2007, 15h14
  3. taille maximale d'une base de donnée paradox
    Par Anonymous dans le forum Paradox
    Réponses: 5
    Dernier message: 14/02/2004, 17h39
  4. sauver une base
    Par phil_java dans le forum Administration
    Réponses: 3
    Dernier message: 07/03/2003, 17h08
  5. [Concept] Stabilité d'une base de donnée
    Par lassmust dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 03/07/2002, 16h16

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