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 :

Bug avec du code simplissime pour additionner et soustraire des valeures.


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 Bug avec du code simplissime pour additionner et soustraire des valeures.
    Salut à tous, voila en fait j'ai un problème avec du code très très simple, en fait je me demande si ça ne vient pas de mon compilateur, voila le code:
    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
     
    #include <stdio.h>
     
    int soustraire(int *i)
    {
    printf("tapez le chiffre a soustraire:\n");
    int s;
    scanf("%d",&s);
    i-=s;
     
    	return 0;
    }
     
    int additionner(int *i)
    {
    printf("tapez le chiffre a additionner:\n");
    int s;
    scanf("%d",&s);
    i=i+s;
     
    	return 0;
    }
     
    int main(void)
    {
    	char choix;
    	int result;
    	int *ptr;
    	ptr=&result;
    	printf("voici un programme qui se propose de soustraire et d'additionner deux valeures a la pricipale\n");
    	printf("commencez par taper la valeure principale:\n");
    	scanf("%d",&result);
    	printf("par quoi voulez vous commencer, par additionner ou soustraire, tapez a ou s:\n");
    	choix=getchar();
    	 if(choix=='a')
    	{
    		printf("vous avez choisi d'additionner:\n");
    		additionner(ptr);
    	}
    	else if(choix=='s')
    	{
    		printf("vous voulez soustraire:\n");
    		soustraire(ptr);
    	}
    	else
    	{
    		printf("desole, la solution n'est pas prevue\n");
    	}
    	printf("voila vous avez fini l'operation, voici le resultat:%d\n",result);
    	return 0;
    }
    Alors voila le soucis: lorsque je rentre la premiere valeure qui est censé pouvoir etre additionnée ou soustraite après au lieux de me donner la fonction ensuite choisie, il me renvoie directement la ligne du else, ce que je trouve très bizarre. Peut-ètre que c'est moi qui suis complètement hors sujet et que je ne comprend plus rien à la programmation (ce qui est probable).

    PS: Ne pas s'affoler pour le peu de stabilité qu'offre le code avec les scanf et autre getchar(), je suis au courant des problèmes pouvant éventuelement apparaître (ce code n'est pas de moi d'origine et je cherche à aider un ami) mais il fallait que je le restitu tel quel pour bien comprendre...

    Merci par avance.

  2. #2
    Membre confirmé Avatar de Flow_75
    Femme Profil pro
    Ingénieure
    Inscrit en
    Mai 2005
    Messages
    1 096
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieure
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 096
    Points : 633
    Points
    633
    Par défaut
    Salut

    Essaye de remplacer tes 'if' par un switch, par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    switch (choix)
                 {
                    case 'a' :
                        // fonction d'addition;
                    case 's' :
                        // fonction de soustraction;
                    default  : 
                        printf("desole, la solution n'est pas prevue\n");
                  }

  3. #3
    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
    C'étais ma première idée, mais le problème reste entier, il me renvoyait alors directement au default (a la place du esle) et n'exécutait pas la fonction quand même...

  4. #4
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    Points : 354
    Points
    354
    Par défaut
    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
    int soustraire(int *i)
    {
    printf("tapez le chiffre a soustraire:\n");
    int s;
    scanf("%d",&s);
    i-=s;
     
    	return 0;
    }
     
    int additionner(int *i)
    {
    printf("tapez le chiffre a additionner:\n");
    int s;
    scanf("%d",&s);
    i=i+s;
     
    	return 0;
    }
    i est un pointeur sur int ! et tu lui ajoute (ou soustrait) s...c'est a *i qu'il faut ajouter ou soustraire, i contien l'adresse pas l'entier

    sinon apres le scanf, il faut purger le stdin
    __________
    "Any sufficiently advanced technology is indistinguishable from magic" Arthur C. Clarke

  5. #5
    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
    Oui, un oublie la dessus, il suffit de rajouter un * avant les i mais ça ne résoud en rien le problème, la ça aurai juste enmpecher de faire les calculs sur la variable, et non pas empecher toute la fonction de se lancer... Bizarre tout ça, d'origine je suis censé aider quelqu'un qui est en première année d'iut et résultat des courses, c'est moi qui ai besoin d'aide, la il n'y a aucune raison valable pour que les fonctions ne s'exécutent pas, je vais essayer avec un autre compilateur peut-ètre c'est le mien qui débloque...

  6. #6
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    Points : 354
    Points
    354
    Par défaut
    non, il faut purger apres chaque utilisation de scanf, c'est aussi pour ca que c'est deconceillé d'utiliser scanf !
    __________
    "Any sufficiently advanced technology is indistinguishable from magic" Arthur C. Clarke

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    633
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    Points : 711
    Points
    711
    Par défaut
    Bonjour,

    Les gaités de scanf (cherche un peu sur le forum, tu ne prux pas passer à travers, ça revient très souvent)

    D'autre part, pour tes fonctions, pourquoi les avoir écrites comme ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    (int soustraire(int *i)
    {
    printf("tapez le chiffre a soustraire:\n");
    int s;
    scanf("%d",&s);
    i-=s;
     
    	return 0;
    }
    Pourquoi toujours renvoyer 0 plutôt que la valeur du résultat ?

    (Je comprendrais bien que la valeur renvoyée ne soit pas le résultat du calcul, mais dans ce cas il faudrait que la valeur renvoyée prenne plusieurs valeurs, pour avertir l'appelant que tout s'est bien passé (ou mal).

    De plus, ton paramètre i passé aux fonctions est un pointeur, et quand tu fais
    tu enlèves s au pointeur, ce qui n'est sans doute pas ce que tu veux.

    Autre chose, pourquoi lire la 2ème valeur à traiter dans les fonctions que tu appelles ?
    Il me semblerait plus logique de lire les 2 valeurs dans le main, et faire des fonctions avec 2 paramètres, qui feraient le calcul, et renverraient le résult du calcul, plutôt que toujours 0 (car j'y reviens : renvoyer toujours la même valeur ne sert strictement à rien).
    Compilation sans erreur ne signifie pas programme sans erreur.
    L'indentation n'a pas été imaginée pour faire beau, mais pour faciliter la lecture des programmes.

  8. #8
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    Points : 354
    Points
    354
    Par défaut
    voila comment vider le stdin
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int c;
    while ( ((c = getchar()) != '\n') && c != EOF)
    {
    };

    http://xrenault.developpez.com/tutoriels/c/scanf/
    __________
    "Any sufficiently advanced technology is indistinguishable from magic" Arthur C. Clarke

  9. #9
    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
    C'est bon, j'ai trouvé, c'était bien le compilateur qui avait un problème avec un autre ça marche très bien...
    Thewho:
    JE n'ai pas écrit ces fonctions comme ça, le but de ce topic n'était pas d'améliorer un bout de code dans le but de le rendre plus souple ou lisible, mais de comprendre pourquoi les fonctions ne s'exécutaient pas, voila pourquoi j'ai précisé dès le début qu'il ne fallait pas s'attarder sur le style de programmation médiocre, je suis au courant que les fonctions telles fgets sont préférable à :scanf ou getchar...

  10. #10
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    Points : 354
    Points
    354
    Par défaut
    Citation Envoyé par giggs
    C'est bon, j'ai trouvé, c'était bien le compilateur qui avait un problème avec un autre ça marche très bien...
    ?? y'a des compilateur qui vident le flux entrant tout seuls apres le scanf ???

    ps: autre chose, si c'est du c et non du C++, il faut declarer les variables en debut de fonction et non en plein milieu, sinon ca compile pas
    __________
    "Any sufficiently advanced technology is indistinguishable from magic" Arthur C. Clarke

  11. #11
    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 le problème vient que j'ai voulu installé y a quelques jours la bibliothèque GTK+ et il s'en est suivi pleins de bug de la part de mon compilateur, donc il vas falloir que je le désinstalle puis le réinstalle.

  12. #12
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    Points : 354
    Points
    354
    Par défaut
    Non...
    tu as peut etre des problemes avec ton compilateur,
    mais le fait que tu te retrouve directement sur le else ou sur le default viens bien du scanf...
    ton code fais pareil chez moi !
    au risque de me repeter....il faut purger
    __________
    "Any sufficiently advanced technology is indistinguishable from magic" Arthur C. Clarke

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

Discussions similaires

  1. Bug avec un code de prolongement vers le haut
    Par Flo Flo dans le forum Fortran
    Réponses: 2
    Dernier message: 04/10/2012, 07h51
  2. Réponses: 4
    Dernier message: 30/04/2011, 12h27
  3. Réponses: 0
    Dernier message: 02/06/2010, 14h58
  4. Réponses: 1
    Dernier message: 25/11/2008, 11h11

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