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 :

Un mini programme de la part d'un débutant.


Sujet :

C

  1. #1
    Membre du Club
    Inscrit en
    Octobre 2006
    Messages
    54
    Détails du profil
    Informations personnelles :
    Âge : 34

    Informations forums :
    Inscription : Octobre 2006
    Messages : 54
    Points : 40
    Points
    40
    Par défaut Un mini programme de la part d'un débutant.
    Salut à tous, je débute en C, et j'ai conçu un mini programme permettant à l'utilisateur d'effectuer des opérations sur deux nombres qu'il rentre (en gros une calculette). Le code n'est pas du tout optimisé, et je souhaiterai avoir votre avis sur celui-ci et si il est possible de l'optimiser...
    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
     
    #include <iostream.h>
    #include <stdio.h>
     
    main()
    {
    int a;
    int b;
    char signe;
    printf("Bienvenue sur mon premier vrai programme en C.\n Ce programme est une calculette, vous pourrez donc effectuer plusieurs\n operations sur deux nombres\n");
    printf("commencez par choisir le type d'operation a effectuer en tapant soit le signe: * ou / ou - ou +");
    signe = getchar();
    switch(signe)
    {
    case'+':printf("vous avez tape +\n");
    	signe=1;
    	break;
    case'-':printf("vous avez tape -\n");
    	signe=2;
    	break;
    case'/':printf("vous avez tape /\n");
    	signe=3;
    	break;
    case'*':printf("vous avez tape *\n");
    	signe=4;
    	break;
    default:printf("desole, ce que vous avez tape n'est pas prevu...\n");
    	break;
    }
    printf("vous allez maintenant devoir rentrer le premier nombre\n");
    if (signe==1)
    {
    	printf("tapez maintenant le permier chiffre:\n");
    	scanf("%d",&a);
    	printf("tapez maintenant le second chiffre:\n");
    	scanf("%d",&b);
    	printf("le resultat est:%d\n",a+b);
    }
    else if(signe==2)
    {
    	printf("tapez maintenant le permier chiffre:\n");
    	scanf("%d",&a);
    	printf("tapez maintenant le second chiffre:\n");
    	scanf("%d",&b);
    	printf("le resultat est:%d\n",a-b);
    }
    else if(signe==3)
    {
    	printf("tapez maintenant le permier chiffre:\n");
    	scanf("%d",&a);
    	printf("tapez maintenant le second chiffre:\n");
    	scanf("%d",&b);
    	printf("le resultat est:%d\n",a/b);
    }
    else if(signe==4)
    {
    	printf("tapez maintenant le permier chiffre:\n");
    	scanf("%d",&a);
    	printf("tapez maintenant le second chiffre:\n");
    	scanf("%d",&b);
    	printf("le resultat est:%d\n",a*b);
    }
    		return 0;
    }

  2. #2
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    Juste une première remarque, tu déclares ta fonction main comme suit :

    Donc ne retourne rien, mais pourtant, tu fais à la fin : return 0;

    Normalement, on fait plutôt comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int main()
    {
    ...
     
     return EXIT_SUCCESS;
    }
    Tu as fait un switch/case au début, tu peux continuer après également. Tu as oublié le cas où c'est égal à signe==0 (si la personne tappe un mauvais caractère)


    Deuxième remarque, tu inclues la fichier d'entête : #include <iostream.h>, ce n'est pas un fichier de la bibliothèque C standard (mais C++, et dans ce cas, c'est mal inclue).
    Je ne répondrai à aucune question technique en privé

  3. #3
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par giggs
    Salut à tous, je débute en C, et j'ai conçu un mini programme permettant à l'utilisateur d'effectuer des opérations sur deux nombres qu'il rentre (en gros une calculette). Le code n'est pas du tout optimisé, et je souhaiterai avoir votre avis sur celui-ci et si il est possible de l'optimiser...
    Il y'a de l'idée, mais la réalisation est inutilement complexe.

    Je te conseille de renommer 'signe' en 'operateur' et de lui donner le type int. Ca évitera au compilateur de générer du code de conversion inutile.

    Ensuite, il n'est recommandé de changer la valeur d'une variable. Si elle a reçu une valeur qui est celle d'un caractère représentant un opérateur (+, - * etc.), il n'y a aucune raison de la modifier par la suite en lui donnant une valeur 1, 2 ou 3 qui n'a aucune signification. Il suffit d'utiliser la valeur initiale dans le switch et le code reste clair, lisible et maintenable.

    Plutôt que cette bardée de if-else-if, qui est correct et utile dans certains cas, il est préférable ici d'utiliser un switch-case qui convient parfaitement à une variable et à des constantes de type int.

    Enfin, pour les saisies, il est préférable d'éviter getchar() tout seul et scanf() au profit de fgets() suivit d'une fonction de nettoyage.

    http://emmanuel-delahaye.developpez....tes.htm#saisie
    http://emmanuel-delahaye.developpez....s.htm#fichiers

    dernière minute : ton code fait une division entière. Le resultat est donc naturellement peu précis. Tu pourrais garder l'esprit 'division entière' en affichant aussi le reste de la division.

    Voilà pour les remarques préliminaires. Maintenant, je vais tester ton code.
    est une abomination. En C, ça n'existe pas (ici, on fait du C, à supprimer). En C++ (la porte en face), non plus, depuis 1998.
    Le type retourné doit êre explicite depuis 1999. Il est conseillé d'utiliser la forme 'prototypale' qui exprime clairement qu'il n'y a pas de paramètres.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("Bienvenue sur mon premier vrai programme en C.\n Ce programme est une calculette, vous pourrez donc effectuer plusieurs\n operations sur deux nombres\n");
    Eviter les ignes trop longues. Une meilleure présentation permet d'éviter ça, et comme pas hasard, rend le code subitement plus lisible :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
       printf ("Bienvenue sur mon premier vrai programme en C.\n"
               " Ce programme est une calculette, vous pourrez donc effectuer plusieurs\n"
               " operations sur deux nombres\n");
    Je passe sur les incohérences 'nombre' vs 'chiffres'...

    Dans un premier temps, je conseille ceci :
    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
     
    #include <stdio.h>
     
    int main (void)
    {
       printf ("Bienvenue sur mon premier vrai programme en C.\n"
               " Ce programme est une calculette, vous pourrez donc effectuer plusieurs\n"
               " operations sur deux nombres\n\n");
     
       printf ("commencez par choisir le type d'operation a effectuer\n"
               " en tapant soit l'un des operateurs suivants : * / - +\n");
       {
          int operateur = getchar ();
     
          switch (operateur)
          {
          case '+':
             {
                int a;
                int b;
                printf ("vous avez tape %c\n", operateur);
                printf ("tapez maintenant le premier operande:\n");
                scanf ("%d", &a);
                printf ("tapez maintenant le second operande:\n");
                scanf ("%d", &b);
                printf ("%d %c %d = %d\n", a, operateur, b, a + b);
             }
             break;
     
          case '-':
             {
                int a;
                int b;
                printf ("vous avez tape %c\n", operateur);
                printf ("tapez maintenant le premier operande:\n");
                scanf ("%d", &a);
                printf ("tapez maintenant le second operande:\n");
                scanf ("%d", &b);
                printf ("%d %c %d = %d\n", a, operateur, b, a - b);
             }
             break;
     
          case '/':
             {
                int a;
                int b;
                printf ("vous avez tape %c\n", operateur);
                printf ("tapez maintenant le premier operande:\n");
                scanf ("%d", &a);
                printf ("tapez maintenant le second operande:\n");
                scanf ("%d", &b);
                printf ("%d %c %d = %d, reste %d\n", a, operateur, b, a / b, a % b);
             }
             break;
     
          case '*':
             {
                int a;
                int b;
                printf ("vous avez tape %c\n", operateur);
                printf ("tapez maintenant le premier operande:\n");
                scanf ("%d", &a);
                printf ("tapez maintenant le second operande:\n");
                scanf ("%d", &b);
                printf ("%d %c %d = %d\n", a, operateur, b, a * b);
             }
             break;
     
          default:
             printf ("desole, ce que vous avez tape n'est pas prevu...\n");
          }
       }
       return 0;
    }
    Evidemment, un meilleur codage permettrait d'éviter ces horribles redondances...

    Il est facile de tester l'appartenance d'un caractère à un ensemble de caractères (une chaine, en fait) avec strchr()...

    Ca permettrait à peu de frais de 'factoriser' la saisie qui est strictement identique...

    Dans le switch-case, il n'y aurait plus que le calcul et l'affichage du résultat...
    Pas de Wi-Fi à la maison : CPL

  4. #4
    Membre du Club
    Inscrit en
    Octobre 2006
    Messages
    54
    Détails du profil
    Informations personnelles :
    Âge : 34

    Informations forums :
    Inscription : Octobre 2006
    Messages : 54
    Points : 40
    Points
    40
    Par défaut
    Merci d'avoir prit le temps de me répondre, c'est vrai maintenant je réalise que les if-else sont inutiles, j'aurai pu tout mettre dans le switch tout betement...
    pour le iostream.h, en fait c'est mon compilateur qui l'a mis automatiquement, donc c'est pour ça une petite erreur...

  5. #5
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    Citation Envoyé par giggs
    en fait c'est mon compilateur qui l'a mis automatiquement,
    Ca me semble particulièrement suspect, un compilateur ne fait que lire le fichier source pour le traduire et ne modifie en rien le fichier....

    Tu parles peut être d'un EDI (environnement de développement intégré), dans ce cas, si tu lui as demandé de faire un projet en langage C et qu'il a inclu ça, il faut sérieusement penser à le changer...
    Je ne répondrai à aucune question technique en privé

  6. #6
    Membre du Club
    Inscrit en
    Octobre 2006
    Messages
    54
    Détails du profil
    Informations personnelles :
    Âge : 34

    Informations forums :
    Inscription : Octobre 2006
    Messages : 54
    Points : 40
    Points
    40
    Par défaut
    Non, en fait j'ai visual c++ 6.0 et je ne sais pas pourquoi il l'a rajouté, je suis certain de ne rien avoir mis à part le stdio.h parce que c'est à peu près le seul que je connais bien et que j'utilise correctement... Enfin de toute manière, le plus important c'est que j'ai compris comment optimiser ce code, merci encore.

  7. #7
    Membre émérite

    Homme Profil pro
    Inscrit en
    Juillet 2003
    Messages
    2 075
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations forums :
    Inscription : Juillet 2003
    Messages : 2 075
    Points : 2 844
    Points
    2 844
    Par défaut
    Citation Envoyé par giggs
    Non, en fait j'ai visual c++ 6.0 et je ne sais pas pourquoi il l'a rajouté, je suis certain de ne rien avoir mis à part le stdio.h parce que c'est à peu près le seul que je connais bien et que j'utilise correctement... Enfin de toute manière, le plus important c'est que j'ai compris comment optimiser ce code, merci encore.
    Tu devrais utiliser un vrai EDI comme Code::Blocks

  8. #8
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Citation Envoyé par Gnux
    Tu devrais utiliser un vrai EDI comme Code::Blocks
    +1

    C'est plus adapté, VC++ 6 ou .Net semble bien à première vu mais si tu veux faire du C Standard, oublies-les Pour le C Standard tu as Code::Blocks (qui est d'ailleurs portable sur plusieurs OS et au mieux, si tu veux te rapprocher plus de Linux, tu peut avoir CygWin
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  9. #9
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Franck.H
    C'est plus adapté, VC++ 6 ou .Net semble bien à première vu mais si tu veux faire du C Standard, oublies-les
    Mmm... je serais plus nuancé...
    • VC++6 est très bien pour faire du C standard ... 90.
    • Le débugger de VC++6 est inégalé.

    Je ne connais pas 'Vécés point nets'. (Sorry, couldn't resist)
    Pas de Wi-Fi à la maison : CPL

  10. #10
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Je ne connais pas 'Vécés point nets'. (Sorry, couldn't resist)
    (don't worry)
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 55
    Points : 72
    Points
    72
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Le débugger de VC++6 est inégalé.
    c'est la permiere chose qu'ils ont dev ches MS.....lol

    blague à part, je suis souvent retourné sur VS parce que le debuggeur est vraiment excellent et celui de 2005 encore mieux je trouve
    got root?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. probléme de comprehension d'un mini programme
    Par bensof1 dans le forum Débuter
    Réponses: 6
    Dernier message: 20/02/2012, 14h43
  2. comment éxécuter un mini programme avec GUI ?
    Par maammeur dans le forum Interfaces Graphiques
    Réponses: 5
    Dernier message: 31/07/2009, 23h48
  3. Mini programme avec boucles
    Par Imageek dans le forum Langage
    Réponses: 6
    Dernier message: 13/11/2008, 17h06
  4. mini programme de compta perso
    Par folkcyrus dans le forum Excel
    Réponses: 2
    Dernier message: 21/02/2008, 16h20
  5. Réponses: 4
    Dernier message: 09/10/2006, 22h12

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