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

SL & STL C++ Discussion :

Sudefinition (istream & operator >>)


Sujet :

SL & STL C++

  1. #1
    Membre éclairé
    Avatar de jmjmjm
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2005
    Messages
    760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2005
    Messages : 760
    Par défaut Sudefinition (istream & operator >>)
    Bonjour, j'ai creer une classe pour faire du calcul de fraction, tout marche niquel sauf que pour la surdefinition de >> je souhaiterais avoir deux possibilité, premiere : l'utilisateur rentre 3/4 et on affecte 3 au num et 4 au denom, facile c ca :


    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
    /////////////////////////////////////////////////////////////////////////////
    ////                      SURDEFINITION FLOT >>                          ////
    ///////////////////////////////////////////////////////////////////////////// 
    istream & operator >> (istream & entree, fraction & f)
    {
        char c='\0';
        int num,denom;
        bool ok=1;
     
     
     
        entree >> num >> c;
        if (c!='/') ok=0;
          else entree >> denom;
     
       if (ok) {f.num=num; f.denom=denom;}
         else entree.clear (ios::badbit | entree.rdstate() );
     
       return entree;
    }
    Mais je voudrais aussi que si je tappe 4, la suredifinition de >> passe 4 au num et 1 au denom ce qui evite de rentrer 4/1 , mais je n'y arrive pas le :
    if (c!='/') ok=0;
    fait que le cin attend un carctere / et tant que je lui donne pas il valide pas !!

    Quelqu'un aurait une solution ??

    MERCI ET BON DEVELOPPEMENT

  2. #2
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    Par défaut
    Salut,

    Déjà, il faut etre attentif au fait que l'opérateur >> n'a que pour but de rediriger un flux (ici, un flux d'acquisition)...

    Il ne me semble donc pas très logique de demander à cet opérateur d'effectuer un affichage (sauf pour debuggage)...

    Personnellement, je ferais une fonction du genre de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    const std::string Fraction::GiveIntro() const
    {
        return "veuillez introduire votre fraction";
    }
    comme cela, logiquement, tu écrira un code pour afficher cette introduction sous la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::cout<<tonobjet.GiveIntro()<<" blabla"<<std::endl;
    Ensuite, on pourra s'occuper de l'introduction meme de ta fraction

    Pour ce faire, on va donc surcharger l'opérateur >>, sous la forme de
    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
    friend std::istream& operator >>(std::istream& ifs, Fraction &ref)
    {
        //Le mieux, c'est d'utiliser une chaine pour l'introduction
        std::string intro;
        //acquisition de la chaine;
        ifs>>intro;
        // on va maintenant utiliser un istringstream pour la convertion, 
        // il s'initialise dés la déclaration en prenant la chaine qu'on vient
        // d'acquérir
        std::istringstream iss(intro);
        //récupération du numerateur
        iss>>ref.numerateur;
        // s'il existe, le / n'a pas été pris... on s'en occupe maintenant
        //en renvoyant d'office le flux s'il n'y a plus rien à prendre
        //mais pour ce faire, il nous faut un caractere
        char signe;
        //récupération du "/"
        iss>>signe;
        //et récupération du dénominateur
        iss>>ref.denominateur;
        //cet affichage est juste là pour te montrer que ca a marché ;)
        std::cout<<numerateur<<"\n"<<signe<<"\n"<<denominateur<<std::endl;
        //il n'y a plus qu'à renvoyer le flux pour permettre des introductions en
        //séries
        return ifs;
    }
    Quelques infos supplémentaires:

    Pour disposer des chaines, qui sont disponibles dans l'espace de nommage std, il faut inclure le fichier d'en-tete <string>

    Pour disposer des *stringstream (flux permettant la conversion vers et au départ de chaine), également disponibles dans l'espace de nommage std, il faut inclure le fichier d'en-tete <sstream>

    Enfin, j'ai considéré que la classe (ici nommé fraction) disposait de réel (float ou double) nommés respectivement numerateur et denominateur comme membres...
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Membre éclairé
    Avatar de jmjmjm
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2005
    Messages
    760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2005
    Messages : 760
    Par défaut
    Salut,

    Déjà, il faut etre attentif au fait que l'opérateur >> n'a que pour but de rediriger un flux (ici, un flux d'acquisition)...

    Il ne me semble donc pas très logique de demander à cet opérateur d'effectuer un affichage (sauf pour debuggage)...
    Pourquoi parle tu d'affichage?? je ne veux rien afficher !! je veux justement faire que de l'acquisition !

    Sinon merci pour le code c'est niquel ca fonctionne !!!

    PS : si quelqu'un ce sert de ce poste c'est pas chaine mais intro dans iss(chaine)

  4. #4
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    Par défaut
    Autant pour moi, il m'avait semblé à la première lecture, que tu avais un cout<<"introduisez votre fraction"... raison de la remarque...

    Maintenant, si tu as modifié ton code en attendant, c'est pas sympa
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  5. #5
    Membre éclairé
    Avatar de jmjmjm
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2005
    Messages
    760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2005
    Messages : 760
    Par défaut
    je te jure que je n'ai pas modifié mon code
    tu as lu trop vite en tout cas merci beaucoup ma classe fonctionne niquel


    BONNE FETE DE FIN D'ANNEE A TOI !!

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

Discussions similaires

  1. afficher la signature des opérations dans XDE
    Par ChristopheH dans le forum Rational
    Réponses: 1
    Dernier message: 24/05/2004, 15h41
  2. [JSP] thread ? Message d'avancement des operations en cours
    Par buffyann dans le forum Servlets/JSP
    Réponses: 14
    Dernier message: 18/12/2003, 11h39
  3. operation sur des alias
    Par 74160 dans le forum Requêtes
    Réponses: 4
    Dernier message: 24/11/2003, 18h19
  4. Réponses: 8
    Dernier message: 21/11/2003, 18h38

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