Partage
  • Partager sur Facebook
  • Partager sur Twitter

Mon joli petit programme

calculatrice

Sujet résolu
    26 novembre 2005 à 20:04:22

    Salut a tous
    J'ai creer un petit programme (une calculatrice) et j'aimerai avoir des idees pour l'ameliorer.
    Voilà, je vous donne le code source:
    </gras>

    Citation : serionos

    #include <iostream> // iostream permet d'utiliser les fonctions "cin" et "cout"

    /* On défini une surface de travail */
    using namespace std;

    /* Fonction calcul() qui sert simplement à calculer en fonction des nombres demandés */
    int calcul(int nb1, int nb2, char operat)
    {
    switch (operat)
    {
    case '+' : return nb1 + nb2; // Si operate vaut '+', alors on ajoute les 2 nombres
    case '-' : return nb1 - nb2; // Si operate vaut '-', alors on soustrait les 2 nombres
    case '*' : return nb1 * nb2; // Si operate vaut '*', alors on multiplie ...
    case '/' : return nb1 / nb2; // ...

    // si il n'y a pas ni '+', ni '-', ni '*', ni '/' ...
    default :
    cout << endl << endl << "Vous n'avez entre ni '+', ni '-', ni '*', ni '/', veuillez recommencer." << endl;
    return 0; // ... On lui indique l'erreur et on renvoie au début
    }
    }


    /* Fonction initial(), qui initialise le tout et renvoie un caractère 'o' ou 'n'
    en fonction de si l'utilisateur veut recommencer ou pas */
    char initial(void)
    {
    int nb_1, nb_2, resultat;
    char operateur, booleen; // booleen va contenir le 'o' ou le 'n' qui indiquera si l'utilisateur veut recommencer ou pas


    // On demande à l'utilisateur deux nombres et un opérateur
    cout << endl << "Entrez un premier nombre : ";
    cin >> nb_1;
    cout << endl << "Maintenant un second nombre : ";
    cin >> nb_2;
    cout << endl << "Maintenant un operateur ('+', '-', '*' ou '/') : ";
    cin >> operateur;


    // On fait le calcul grâce à le fonction calcul() définie plus haut ;o)
    resultat = calcul(nb_1, nb_2, operateur);


    // On vérifie que l'utilisateur a bien rentré un bon opérateur
    if (operateur == '+' ^ operateur == '-' ^ operateur == '*' ^ operateur == '/')
    {
    cout << endl << endl << "Le resultat est " << nb_1 << " " << operateur << " " << nb_2 << " = " << resultat << endl;
    cout << endl << "Voulez-vous recommencer (o/n) ? ";
    cin >> booleen;
    return booleen; // On retourne la valeur entrée par l'utilisateur ('o' ou 'n', normalement ;o )
    }

    // Si l'utilisateur n'as pas rentré d'opérateur ou un mauvais opérateur ...
    else return 'o'; // ... on retourne 'o' pour recommencer sans donner le résultat
    }


    int main(void)
    {
    char restart;

    //on dit bonjour (bah quoi, on est poli)
    cout << "Bienvenue dans ma superbe calculatrice !" << endl;
    cout << "Bien sur, elle marche seulement avec des nombres entiers ;-) !" << endl;

    do
    {
    restart = initial(); // On initialise ... (restart va être égale à booleen)
    } while (restart == 'o'); // ... et on continue à tourner si l'utilisateur a répondu 'o'

    return 0; // On retourne zéro une fois la boucle finie et on termine le programme
    }

    </span><couleur nom="vertf"></couleur>
    Voilà
    <gras>Merci
    <italique></italique>

    P.S. Bravo à nos cheres Webmasqter prefere
    et felicitation pour leur zcode.
    • Partager sur Facebook
    • Partager sur Twitter
      26 novembre 2005 à 20:17:03

      include <iostream> // iostream permet d'utiliser les fonctions "cin" et "cout"

      /* On défini une surface de travail */
      using namespace std;

      /* Fonction calcul() qui sert simplement à calculer en fonction des nombres demandés */
      int calcul(int nb1, int nb2, char operat)
      {
           switch (operat)
           {
           case '+' : return nb1 + nb2; // Si operate vaut '+', alors on ajoute les 2 nombres
           case '-' : return nb1 - nb2; // Si operate vaut '-', alors on soustrait les 2 nombres
           case '*' : return nb1 * nb2; // Si operate vaut '*', alors on multiplie ...
           case '/' : return nb1 / nb2; // ...

           // si il n'y a pas ni '+', ni '-', ni '*', ni '/' ...
           default :
                cout << endl << endl << "Vous n'avez entre ni '+', ni '-', ni '*', ni '/', veuillez recommencer." << endl;
                return 0; // ... On lui indique l'erreur et on renvoie au début
           }
      }


      /* Fonction initial(), qui initialise le tout et renvoie un caractère 'o' ou 'n'
      en fonction de si l'utilisateur veut recommencer ou pas */

      char initial(void)
      {
           int nb_1, nb_2, resultat;
           char operateur, booleen; // booleen va contenir le 'o' ou le 'n' qui indiquera si l'utilisateur veut recommencer ou pas


           // On demande à l'utilisateur deux nombres et un opérateur
           cout << endl << "Entrez un premier nombre : ";
           cin >> nb_1;
           cout << endl << "Maintenant un second nombre : ";
           cin >> nb_2;
           cout << endl << "Maintenant un operateur ('+', '-', '*' ou '/') : ";
           cin >> operateur;


           // On fait le calcul grâce à le fonction calcul() définie plus haut ;o)
           resultat = calcul(nb_1, nb_2, operateur);


           // On vérifie que l'utilisateur a bien rentré un bon opérateur
           if (operateur == '+' ^ operateur == '-' ^ operateur == '*' ^ operateur == '/')
           {
                cout << endl << endl << "Le resultat est " << nb_1 << " " << operateur << " " << nb_2 << " = " << resultat << endl;
                cout << endl << "Voulez-vous recommencer (o/n) ? ";
                cin >> booleen;
                return booleen; // On retourne la valeur entrée par l'utilisateur ('o' ou 'n', normalement ;o )
           }

           // Si l'utilisateur n'as pas rentré d'opérateur ou un mauvais opérateur ...
           else return 'o'; // ... on retourne 'o' pour recommencer sans donner le résultat
      }


      int main(void)
      {
           char restart;

           //on dit bonjour (bah quoi, on est poli)
           cout << "Bienvenue dans ma superbe calculatrice !" << endl;
           cout << "Bien sur, elle marche seulement avec des nombres entiers ;-) !" << endl;

            do
           {
                restart = initial(); // On initialise ... (restart va être égale à booleen)
           } while (restart == 'o'); // ... et on continue à tourner si l'utilisateur a répondu 'o'

           return 0; // On retourne zéro une fois la boucle finie et on termine le programme
      }


      Pour le Zcode, utilise le correctement, c'ets mieux ;)

      Sinon, pourquoi utiliser un char alors que le type boléen existe?

      Enfin, y a d'autre pb, mais là je vais manger (et c'est raclette, alors... :p )
      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        26 novembre 2005 à 21:46:41

        Améliorer un programme comme ça ? Tu peux faire des optimisations, recodages plus clairs, puis ajouts de possibilitées : plus d'opérations, possibilité de passer des arguments pour qu'il fasse la calcul sans t'afficher les messages qui te demandent ce que tu veux, affichage dans une fenêtres graphique, affichage des nombres en 3D... (bon non oublies les deux derniers hein ;) )
        • Partager sur Facebook
        • Partager sur Twitter
          26 novembre 2005 à 22:19:28

          Nan les deux dernières suggestions sont plutot intéligente je trouve, ça donne un but à l'utilisation d'API graphique. Souvent on pense aux jeux-vidéo, mais pour les débutants c'est plutot compliqué.
          • Partager sur Facebook
          • Partager sur Twitter
            26 novembre 2005 à 22:26:06

            Sinon, plutôt que de demander:

            -Premier nombre?
            -Deuxième nombre?
            -Opérande?

            Tu pourrais essayer tout simplement de demander à l'utilisateur:

            "Votre calcul?"
            Et tu analyse la chaine de caractère (ex: "2+2")
            • Partager sur Facebook
            • Partager sur Twitter
              26 novembre 2005 à 22:46:13

              Ouai mais analysé le calcul c'est dur nan parce que si on met 22+2 par exemple ben le programme va voir comme entrer 2 et 2 et + et 2 ? je me trompe?
              • Partager sur Facebook
              • Partager sur Twitter
                26 novembre 2005 à 22:53:48

                Le mieux pour toi: Tu initialise un tableau de caractère (en dynamique si tu sais faire), dans lequel tu stoque la chaine rentrée par l'utilisateur. Ensuite, tu travail dessus avec par exemple des boucles for..

                L'idée c'est que par exemple, tant que c'est un nombre, ou un point, je met dans une variable, si c'est un opérande, je stoque le type d'opération, etc etc.

                Mais je me rend compte en écrivant ça que c'est pas vraiment de ton niveau ;)
                • Partager sur Facebook
                • Partager sur Twitter
                  26 novembre 2005 à 22:55:25

                  Moi je vote pour que Seeme nous fasse un tuto sur Lex et Yacc :D
                  • Partager sur Facebook
                  • Partager sur Twitter
                    26 novembre 2005 à 23:03:18

                    OUais, mais bon, en fait quand j'ai commencé à écrire le message d'avant, ça me paraissait simple à faire sans lib/système extérieur ^^

                    Mais au fur et à mesure, c'est sûr que.... :)

                    Pour Goten s'il est toujours intéressé :)
                    http://www.linux-france.org/article/devl/lexyacc/minimanlexyacc.html



                    J'aime toujours autant ton avatar bluestorm :)
                    • Partager sur Facebook
                    • Partager sur Twitter
                      27 novembre 2005 à 0:20:27

                      Si ses calculs en entrée se limite simplement à deux opérandes et un opérateur ça devrait être pour lui assez facilement faisable (avec un truc du style 3*9 par exemple...), bon après s'il commence à inclure plusieurs opérations, ça devient plus dur, avec les priorités, les parenthèses et tout ça...
                      • Partager sur Facebook
                      • Partager sur Twitter
                        27 novembre 2005 à 1:45:17

                        c'est fou ce que ca pue le C++ quand on regarde les sources :p
                        quand je pense qu'en 10 ligne , on fait l'equivalent en python avec interface graphique ...
                        • Partager sur Facebook
                        • Partager sur Twitter
                          27 novembre 2005 à 2:28:48

                          Citation : kedare

                          c'est fou ce que ca pue le C++ quand on regarde les sources :p
                          quand je pense qu'en 10 ligne , on fait l'equivalent en python avec interface graphique ...


                          Ce genre de commentaire aussi ça pue un peu ^^:p
                          Et puis si on discutait coté performance :p
                          • Partager sur Facebook
                          • Partager sur Twitter
                            27 novembre 2005 à 12:01:45

                            Dis-moi...

                            C'est vraiment toi qui a écrit ce code ? :p

                            Et après, on dit que je fais du plagiat... :diable:

                            EDIT : En plus, tu poses une question, tout le monde s'acharne à te répondre, et tu ne les gratifies même pas d'un "merci".
                            • Partager sur Facebook
                            • Partager sur Twitter
                              27 novembre 2005 à 12:16:10

                              Citation : Pas de titre

                              Sinon, pourquoi utiliser un char alors que le type boléen existe?


                              booléan => 4 ocets il me semble
                              char => 1 octet

                              Citation : Pas de titre


                              Ouai mais analysé le calcul c'est dur nan parce que si on met 22+2 par exemple ben le programme va voir comme entrer 2 et 2 et + et 2 ? je me trompe?


                              Je l'ai dit sur un autre post de calculette scanf le fait tout seul :) (mais pas cin ;) )
                              • Partager sur Facebook
                              • Partager sur Twitter
                                27 novembre 2005 à 13:26:49

                                Citation : asmanour

                                booléan => 4 ocets il me semble
                                char => 1 octet



                                Et alors? t'as peur de manquer de mémoire?
                                • Partager sur Facebook
                                • Partager sur Twitter
                                Anonyme
                                  27 novembre 2005 à 13:27:58

                                  On fait du C ou on n'en fait pas :p
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    27 novembre 2005 à 13:31:52

                                    Citation : Seeme

                                    Citation : asmanour

                                    booléan => 4 ocets il me semble
                                    char => 1 octet



                                    Et alors? t'as peur de manquer de mémoire?


                                    Non mais franchement gaspiller 3 octets pour un true ou false, je trouve ca un peu idiot. Autant qu'il laisse char, non ?

                                    ps : c'est asmanur et pas "asmanour" :)
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      27 novembre 2005 à 13:51:06

                                      Citation

                                      nom="Non mais franchement gaspiller 3 octets pour un true ou false, je trouve ca un peu idiot. Autant qu'il laisse char, non ?">



                                      Non ce n'est pas idiot du tout, c'est au contraire logique. Le résultat d'une condition est un booléan, il est alors logique d'utiliser les booléans pour les conditions. Les caractères permettent l'affichage et non la comparaison. A ce stade, utilser un caractère pour gagner en performance est totalement ridicule. On perd en lisibilité et en maintenabilité.
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        27 novembre 2005 à 13:53:00

                                        Citation : Seeme

                                        OUais, mais bon, en fait quand j'ai commencé à écrire le message d'avant, ça me paraissait simple à faire sans lib/système extérieur ^^

                                        Mais au fur et à mesure, c'est sûr que.... :)

                                        Pour Goten s'il est toujours intéressé :)
                                        http://www.linux-france.org/article/devl/lexyacc/minimanlexyacc.html



                                        J'aime toujours autant ton avatar bluestorm :)



                                        Bien sur que je suis toujours interessé ^^. par contre je n'avais pas compris que ton post au dessus s'adresser a moi ^^ au faites comment tu connais mon niveau? Mais t'as raison c'été pas de mon niveau ^^ . Merci beaucoup pour le lien.
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          27 novembre 2005 à 14:48:17

                                          Citation : asmanur

                                          Citation : Seeme

                                          Citation : asmanour

                                          booléan => 4 ocets il me semble
                                          char => 1 octet



                                          Et alors? t'as peur de manquer de mémoire?


                                          Non mais franchement gaspiller 3 octets pour un true ou false, je trouve ca un peu idiot. Autant qu'il laisse char, non ?

                                          ps : c'est asmanur et pas "asmanour" :)



                                          Autaniliser les types pour ce pourquoi on les a créé. Et à l'échelle d'un ordinateur, ou même d'une calculatrice graphique, 3 octets pour ce genre d'aplication, ce n'est pas du gaspillage et ça permet une meilleure logique, cmpréhension et entretient du code (même si l'évolutivité d'une mini calculette en console me parait assez réduie aujourd'hui, sauf dans le cas d'un aprentissage ;) )
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            27 novembre 2005 à 16:05:16

                                            Salut
                                            je voudrais tous vous remercier d'avoir répondu aussi vite, et pour tous ceux qui se posent des questions, je suis en train d'apprendre le C++ sur un site, mais bon le type qui a ecrit le tuto commence à s'emmeler dans les explications donc maintenant j'apprend sur le meilleur site du monde
                                            (devinez le quel)
                                            Bye
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              27 novembre 2005 à 16:50:28

                                              Personne ne t'oblige à copier mon site, surtout si c'est pour le critiquer après :diable:
                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                27 novembre 2005 à 17:10:16

                                                Lol, sympa l'autoproclamation du code source...
                                                Concernant le site de Saimoun quand je suis passé pour apprendre le C++ j'ai jetté un coup d'oeil sur le xHTML et le Mapping HL, ça avait un air de déjà vu, mais pour le C++ on peut supposer que c'est de lui...Ou alors d'un autre site, parceque si c'est de la copie du SdZ t'es vachement fort ;) ...
                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  27 novembre 2005 à 17:20:50

                                                  Salut,

                                                  Moi je trouve ce petit programme pas mal pour un debutant.
                                                  En revanche tu n'a pas penser a tout.
                                                  En effet si nb1=n'importe quel chiffre et nb2=0 et qut tu choisi l'operateur '/' et bien tu te retrouve avec un jolie bug. Car il est impossible de faire une division par 0.

                                                  Sur ce @+
                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    27 novembre 2005 à 18:55:47

                                                    oui d'accord je me suis un peu inspiré du site de saimoun mais bon j'avais quand meme réussi a en faire une tout seul. c'est juste pour pouvoir ameliorer le code
                                                    P.S. (pour Saimoun) desoler pour mon message je ne voulais pas t'offenser mais j'ai été sincère. j'ai été complétement largué au bout d'un moment
                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                    Anonyme
                                                      27 novembre 2005 à 19:07:50

                                                      Je vois pas comment un bool pourrait être plus gourmand qu'un char oO

                                                      Boolean : true or false | 1 ou 0 donc un bit ....
                                                      Char 1 octet donc 8 bits...
                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        28 novembre 2005 à 11:30:58

                                                        Citation : Lerat

                                                        Je vois pas comment un bool pourrait être plus gourmand qu'un char oO

                                                        Boolean : true or false | 1 ou 0 donc un bit ....
                                                        Char 1 octet donc 8 bits...


                                                        Toi tu fais pas d'assembleur :lol:
                                                        Il est impossible de prendre une variable qui occupe 1 seul bit, on est obligé de prendre au moins un octets. Bon et après vérification, un bool occupe bien un octet ^^, je sais plus ou j'ai lu qu'un bool occupe 4 octets o_O.
                                                        Je trouve pas plus logique d'utiliser un booléan, qu'un char, car je teste sans passer par ==true ou ==false, donc bon (pis en plus les bools c'est du C++ ), donc à la limite pour les retours de fonctions mais c'est bien d'avoir tout un panel de code d'erreur.
                                                        Sur ce, je m'en vais tout penaud.
                                                        • Partager sur Facebook
                                                        • Partager sur Twitter

                                                        Mon joli petit programme

                                                        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                                        • Editeur
                                                        • Markdown