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, probleme scanf()


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 2
    Par défaut Calculatrice, probleme scanf()
    Salut à tous !
    Voilà, je me mets tranquillement au C en commençant par faire des petits programmes gentils, donc j'ai décidé après plusieurs programmes d'essayer de réaliser une calculatrice (simple juste avec +,-,*,/). Mais je me retrouve deja confronté a un problème :

    j'utilise :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    float a=0;
    char b;
    float c=0;
     
    scanf("%f%c%f",&a,&b,&c);
    ensuite je compare le char à +,-,*,/ et je fais l'opération adéquate. Jusque la pas de souci.. Mis à part que je ne peux faire des opérations que sur des floats à 1 chiffre !

    j'ai bien pensé à utiliser (j'ai cru comprendre que cela marchait) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    scanf("%f2%c%f2",&a,&b,&c);
    mais le problème est qu'à présent je ne peux faire des calculs que sur des floats à 2 chiffres ! J'ai aussi pensé à utiliser 3 scanf() à la suite, mais l'idée de devoir saisir chaque caractère indépendamment ne me séduit pas...

    Voilà, donc je me demande s'il est possible de faire des saisies de longueur pouvant varier sur les floats ?

    Quelqu'un peut-il m'aider ? (mis à part google, je sais qu'il est fort mais la ca devient un peu long comme question à lui taper...).

    Merci toopa

  2. #2
    Membre éprouvé
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    142
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 142
    Par défaut
    Salut,

    Je ne suis pas sur de ce que j'annonce là mais il me semble que quand tu tape par exemple 12.5, il considère le '.' comme un caractère.

    A mon avis tu devrait faire une fonction qui parser ton expression (qui sera pour le coup une chaîne de caractère-> %s). Et convertir ce que tu as parser avec des fonction tel que atoi, atol ou encore atof

  3. #3
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    J'utilise :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    float a=0;
    char b;
    float c=0;
     
    scanf("%f%c%f",&a,&b,&c);
    ensuite je compare le char à +,-,*,/ et je fais l'opération adéquate. Jusque la pas de souci.. Mis à part que je ne peux faire des opérations que sur des floats à 1 chiffre !
    Il n'y a pas de raisons :
    si je tape 12x45 , j'obtient bien a = 12, b = 'x' et c = 45 !
    Par contre, on ne peut taper 12 x 45

  4. #4
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 2
    Par défaut
    Ouais en fait ça marche très bien.. Je sais pas ce qu'il y avait j'avais du faire une autre erreur mais à présent tout fonctionne !

    Code de la "calcoulette" :

    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
     int main()
    {
        float a=0;
        float b=0;
        char c;
        float d=0;
     
        printf("Entrez votre calcul :\n");
        scanf("%f%c%f",&a,&c,&b);
     
        if(strcmp(&c,"+")==0){
            d=a+b;
            printf("%f",d);
         }
     
        else{if(strcmp(&c,"-")==0){
            d=a-b;
            printf("%f",d);
            }
            else{if(strcmp(&c,"*")==0){
            d=a*b;
            printf("%f",d);
                }
                else{if(strcmp(&c,"/")==0){
                d=(float)a/b;
                printf("%f",d);
                    }
                    else{printf("ERROR");}
                }
            }
        }
        return 0;
    }
    Par contre je me sens un peu pouilleux avec mes 4 if/else je pense utiliser des case si j'arrive a comprendre comment ça marche.
    En tout cas merci à vous 2 et bonne continuation

  5. #5
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 242
    Par défaut
    Par contre je me sens un peu pouilleux avec mes 4 if/else je pense utiliser des case si j'arrive a comprendre comment ça marche.
    C'est vrai que ici, un switch serait plus simple.
    D'ailleurs, (mais je me trompe peut être), utiliser strcmp avec un pointeur vers un char qui n'est PAS une chaine de caractère, peut être un problème.
    En effet, rien ne nous dit qu'en mémoire, après le 'c', on va bien trouver le 0 qui termine la chaine de caractères... (erreur de segmentation?).
    Je trouve aussi la remarque de Funk92 pertinente, même si ce que tu fais fonctionne... De cette manière, tu pourrais vérifier que l'on rentre bien des nombres et ce serait plus "sûr".

    Pour le switch, la syntaxe est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    switch (variable) {
      case valeur1 : action1 [break;] 
      case valeur2 : action2 [break;]
      ...
      case valeurN : actionN [break;]
      default  : actionParDefaut [break;]
    }
    Les break à la fin ne sont pas toujours mis selon ce qu'on désire faire, mais dans ton cas, met les (je te laisse chercher pourquoi). Le break après le défaut peut toujours être enlevé. Ca donnerait un truc du type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    switch (c) {
      case '+' : /*addition*/ break;
      case '-' : /*soustraction*/ break;
      case '*' : /*multiplication*/ break;
      case '/' : /*division*/ break;
      default : /*opérateur inconnu*/ 
    }
    Une dernière chose importante : Tu ne testes pas, si lors d'une division, le deuxième nombre vaut 0 ! Autant prévenir ce cas et afficher une erreur soit même, et ne pas demander au processeur de faire une division par 0.

  6. #6
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Citation Envoyé par toopa Voir le message
    ....
    Par contre je me sens un peu pouilleux avec mes 4 if/else je pense utiliser des case si j'arrive a comprendre comment ça marche.
    ....
    Pour confirmer ce que dit Climoo :

    Attention, tes if sont faux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        char c;
    ....
        if(strcmp(&c,"+")==0){
    strcmp compare deux chaînes de caractères "+" est bien une chaîne, mais &c ne l'est pas : c'est l'adresse d'UN caractère. Ce test échouera en général même si c vaut '+'

    Pour comparer deux caractères, il suffit de tester c == '+' (entre guillemets simples)

Discussions similaires

  1. scanf gros probleme
    Par widguet dans le forum C
    Réponses: 9
    Dernier message: 28/12/2006, 19h00
  2. [debutant] Probleme avec le scanf()
    Par mc_fly dans le forum C
    Réponses: 21
    Dernier message: 07/09/2006, 12h22
  3. Aide SVP probleme scanf
    Par ceagle75 dans le forum C
    Réponses: 10
    Dernier message: 17/06/2006, 18h04
  4. probleme scanf
    Par Yoshio dans le forum C
    Réponses: 16
    Dernier message: 21/02/2006, 09h35
  5. gets() a la suite de scanf() -> probleme
    Par ickis dans le forum C
    Réponses: 12
    Dernier message: 14/12/2003, 20h24

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