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 :

problemes avec les fonction de string en c++


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    F�vrier 2006
    Messages
    6
    D�tails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : F�vrier 2006
    Messages : 6
    Par d�faut problemes avec les fonction de string en c++
    bonjour tous le monde
    voila j'ai un programme a etablir en c++ le truc est que le programme saisi 9chiffres et ils ne valident que s'il sont donner de cette maniere ex:111111111 ou 111 111 111 (deux espaces dans exactement ces emplacements) et apres validation ils procedent a des calculs selon cet algo:
    www.cra-arc.gc.ca/eservices/magmedia/sin-f.pdf ,mon probleme est le suivant pour la validation je ne vois pas comment faire si je ne declare pas une variable de type sting afin de faire mes tests mais comment proceder a des calculs selon l'algo alors que ma variable est de type string

    merci

  2. #2
    Invit�
    Invit�(e)
    Par d�faut
    salut magniaco,

    je comprends un peu ton d�sarroi, mais il va falloir que tu explique ton probleme avec d'avantage de d�tails si tu veux trouver de l'aide...

    perso, j'ai pas tout compris.

  3. #3
    Membre habitu�
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    13
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 13
    Par d�faut
    Salut,

    Je n'ai pas tout compris non plus, mais � mon avis, il te faudra lire ta chaine de caract�res (string) caract�re par caract�re, pour trouver les espaces.
    Si c'est les calculs sur des string qui te d�range, tu peux les convertir en int.

    Explique mieux ton probl�me et donne nous ta solution actuelle pour qu'on puisse te donner des r�ponses plus claires...

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    F�vrier 2006
    Messages
    6
    D�tails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : F�vrier 2006
    Messages : 6
    Par d�faut
    merci pour votre interet
    je vais vous expliquer un peu mon probleme plus en details des que je rentre chez moi

  5. #5
    Membre �clair�
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    37
    D�tails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Septembre 2006
    Messages : 37
    Par d�faut
    Une source d'inspiration :

    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 <ios>
    #include <iostream>
     
    struct NAS {
     
     signed char data_[9];
     
     
     NAS(
       std::istream & input) {
     
       static signed char const doubles_[] = { 0, 2, 4, 6, 8, 1, 3, 5, 7, 9 };
     
       // Read 3 digits, maybe a space, 3 digits, maybe a space and 3 digits.
       int j(0);
       char window(input.get());
       if(input and std::isdigit(window)) do {
     
           int i(0);
           do {
     
             data_[j*3+i]= window - '0'; // Let suppose '0', '1', ..., '9'.
             ++i;
             window= input.get();
     
           } while(input and std::isdigit(window) and i != 3);
     
           if(i != 3) {
     
             input.setstate(std::ios::badbit);
             throw "Failure";
           }
     
           if(input and window == ' ') { // Maybe use std::isspace.
             window= input.get();
           }
           ++j;
     
         } while(input and std::isdigit(window) and j != 3);
     
       if(j != 3) {
     
         input.setstate(std::ios::badbit);
         throw "Failure";
       }
     
       // See <http://www.cra-arc.gc.ca/eservices/magmedia/sin-f.pdf>.
       if((data_[0] + doubles_[data_[1]]+ data_[2] + doubles_[data_[3]] + data_[4]
          + doubles_[data_[5]] + data_[6] + doubles_[data_[7]] + data_[8]) % 10 != 0) {
     
         throw "Failure";
       }
     }
     
    };   
     
     
    int
    main() {
     
      NAS n(std::cin);
    }

  6. #6
    Expert confirm�
    Avatar de Luc Hermitte
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2003
    Messages
    5 296
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : A�ronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Ao�t 2003
    Messages : 5 296
    Par d�faut
    Citation Envoy� par violette327
    Je n'ai pas tout compris non plus, mais � mon avis, il te faudra lire ta chaine de caract�res (string) caract�re par caract�re, pour trouver les espaces.
    Si c'est les calculs sur des string qui te d�range, tu peux les convertir en int.

    Explique mieux ton probl�me et donne nous ta solution actuelle pour qu'on puisse te donner des r�ponses plus claires...
    Bah. Un std::getline suivit par un erase-remove (-> FAQ) si le test ne fait pas l'affaire, sinon une petite v�rif sur le buffer me parait plus simple.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne r�ponds � aucune question technique par le biais de ce m�dia. Et de toutes fa�ons, ma BAL sur dvpz est pleine...

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    F�vrier 2006
    Messages
    6
    D�tails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : F�vrier 2006
    Messages : 6
    Par d�faut
    Citation Envoy� par N i h i l
    Une source d'inspiration :

    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 <ios>
    #include <iostream>
     
    struct NAS {
     
     signed char data_[9];
     
     
     NAS(
       std::istream & input) {
     
       static signed char const doubles_[] = { 0, 2, 4, 6, 8, 1, 3, 5, 7, 9 };
     
       // Read 3 digits, maybe a space, 3 digits, maybe a space and 3 digits.
       int j(0);
       char window(input.get());
       if(input and std::isdigit(window)) do {
     
           int i(0);
           do {
     
             data_[j*3+i]= window - '0'; // Let suppose '0', '1', ..., '9'.
             ++i;
             window= input.get();
     
           } while(input and std::isdigit(window) and i != 3);
     
           if(i != 3) {
     
             input.setstate(std::ios::badbit);
             throw "Failure";
           }
     
           if(input and window == ' ') { // Maybe use std::isspace.
             window= input.get();
           }
           ++j;
     
         } while(input and std::isdigit(window) and j != 3);
     
       if(j != 3) {
     
         input.setstate(std::ios::badbit);
         throw "Failure";
       }
     
       // See <http://www.cra-arc.gc.ca/eservices/magmedia/sin-f.pdf>.
       if((data_[0] + doubles_[data_[1]]+ data_[2] + doubles_[data_[3]] + data_[4]
          + doubles_[data_[5]] + data_[6] + doubles_[data_[7]] + data_[8]) % 10 != 0) {
     
         throw "Failure";
       }
     }
     
    };   
     
     
    int
    main() {
     
      NAS n(std::cin);
    }

    merci pour ton aide mais je pense que c'est pas mal compliquer pour moi je cherche a resoudre avec des if else et des boucles j'ai pas trop le choix puisque j'ai pas encore vu beaucoup de matiere en c++
    merci quand meme

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    F�vrier 2006
    Messages
    6
    D�tails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : F�vrier 2006
    Messages : 6
    Par d�faut
    salut tous le monde
    bon je vais expliquer la premiere etape et ou je bloque exactement

    le programme demande une serie de numeros et validera ces numeros (9 chiffres) , bon la premiere condition est que les valeurs de neuf chiffres seront uniquement de cette forme (ex: 123456789 ou 123 456 789 (2fois un espace dans exactement les emplacements de l'exemple) ce qui veut dire si je lui donne moin que 9 ou plus que 9 chiffre il envoie un message d'erreur
    ou si je lui donne 9 chiffre avec un espace,trois espace,etc... ou 2 espaces dans d'autres emplacement que ceux citer dans l'exemple il envoie le message d'erreur


    ce que je fais c'est que je declare une variable de type string, mais je bloque vraiment dans la condition

  9. #9
    Expert confirm�
    Avatar de Luc Hermitte
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2003
    Messages
    5 296
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : A�ronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Ao�t 2003
    Messages : 5 296
    Par d�faut
    En supposant qu'il n'y ait rien d'autre sur la ligne, voil� un code qui n'est pas acceptable tel quel en r�ponse � un exo de cours... La structuration y est : lecture + d�coupage + analyse.
    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
    std::ifstream file("toto.txt");
    if (!file) throw ....;
     
    // lecture de la ligne
    std::string line;
    if (!std::getline(file, line)) throw ....
     
    // split
    std::ostringstream iss(line);
    std::vector<std::string> parts;
    std::string part;
    while (oss >> part) 
        parts.push_back(part);
     
    // analyse
    const size_t size = parts.size();
    int res = 0; // resultat
    if (size > 1) { // multi parties
        for (int i=0, mult=1 ; i!= size ; ++i,mult*=1000) {
            if (parts[i].size() > 3) throw ....;
            if (parts[i].size() < 3 && i!=size-1) throw ...;
            res += mult * boost::lexical_cast<int>(parts[i]);
        }
    } else {
        res = boost::lexical_cast<int>(parts[0]);
    }
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne r�ponds � aucune question technique par le biais de ce m�dia. Et de toutes fa�ons, ma BAL sur dvpz est pleine...

  10. #10
    Membre �prouv� Avatar de nicO1077
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    107
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Septembre 2006
    Messages : 107
    Par d�faut
    Citation Envoy� par magniaco
    salut tous le monde
    bon je vais expliquer la premiere etape et ou je bloque exactement

    le programme demande une serie de numeros et validera ces numeros (9 chiffres) , bon la premiere condition est que les valeurs de neuf chiffres seront uniquement de cette forme (ex: 123456789 ou 123 456 789 (2fois un espace dans exactement les emplacements de l'exemple) ce qui veut dire si je lui donne moin que 9 ou plus que 9 chiffre il envoie un message d'erreur
    ou si je lui donne 9 chiffre avec un espace,trois espace,etc... ou 2 espaces dans d'autres emplacement que ceux citer dans l'exemple il envoie le message d'erreur


    ce que je fais c'est que je declare une variable de type string, mais je bloque vraiment dans la condition
    Bonsoir,
    je ne sais pas si j'ai bien tout compris, mais, sans trop utilis� de code complexe (mais peut-�tre plus lourd), tu ne pourrais pas :

    - 1/ D'abord verifier que la saisie soit bien exactement de 11 caracteres (les 9 chiffres + les 2 espaces), et si oui, l'enregistrer dans un string

    - 2/ Ensuite, v�rifier un par un les caracteres avec un pointeur qui se d�placerait dans la chaine, et verifier si tu as bien un chiffre sur les 3 premiers carcteres, un espace sur le 4�me, un chiffre sur les 3 caracteres suivants, un espace, puis encore 3 caracteres ?

    Bon d'accord, c'est pas �volu� comme m�thode, mais peut-�tre que tu comprendrais mieux !! Enfin, je ne fais que proposer !!!

  11. #11
    Membre �prouv�
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    125
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 125
    Par d�faut
    test avec 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
     
    int f(char &c){if((c<'0')||(c>'9'))throw __LINE__; return c-'0';};
    void display(int & val){cout << val<<endl;};
     
    //dans ta fonction 
     
    string s="123 456 789";
    string::iterator end;
    end=remove(s.begin(),s.end(),' ');
    if((end-s.begin())!=9)throw __LINE__;
    vector<int>v;
    v.resize(9);
    transform(s.begin(),end,v.begin(),ptr_fun(f));
    //calcul avec le vecteur 
    ...
    for_each(v.begin(),v.end(),ptr_fun(display));

  12. #12
    Expert confirm�
    Avatar de Luc Hermitte
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2003
    Messages
    5 296
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : A�ronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Ao�t 2003
    Messages : 5 296
    Par d�faut
    Cette version ne v�rifire pas correctement la contrainte "un seul paquet, ou des paquets de 3".
    Et prendre des char et des int par r�f�rence n'a aucun sens dans une fonction qui ne fait que lire leur valeur.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne r�ponds � aucune question technique par le biais de ce m�dia. Et de toutes fa�ons, ma BAL sur dvpz est pleine...

  13. #13
    Membre �prouv�
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    125
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 125
    Par d�faut
    je suis daccord avec toi sur le fait qu'il check pas la forme

    mais je pense pas qu'il en ai besoin ( enfin il va nous le dire )
    il a 2 type d entree xxx xxx xxx ou xxxxxxxxx le remove vire les espaces et passe donc toujours au format sans espace
    quand a l'utilisation de la chaine de carac en tableau d entier
    c'est pour la suite de son algo vu qu il ve faire des sommes sur ces digits et oui tu peux virer le &

    enfin c est une piste pas un resultat

  14. #14
    Expert confirm�
    Avatar de Luc Hermitte
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2003
    Messages
    5 296
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : A�ronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Ao�t 2003
    Messages : 5 296
    Par d�faut
    Il a quand m�me sp�cifi� qu'il devait s'occuper de la validit� -- d'o� que je ne suis pas revenu sur le erase-remove. Et puis, cela a tellement une t�te d'exercice...
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne r�ponds � aucune question technique par le biais de ce m�dia. Et de toutes fa�ons, ma BAL sur dvpz est pleine...

Discussions similaires

  1. Problemes avec les fonctions
    Par Douly dans le forum D�buter
    R�ponses: 5
    Dernier message: 05/01/2010, 17h59
  2. [PHP 5.2] Probleme avec les fonctions fopen fwrite
    Par zeyro dans le forum Langage
    R�ponses: 2
    Dernier message: 20/02/2009, 15h34
  3. probleme avec les fonction get et set
    Par Invit� dans le forum Flex
    R�ponses: 0
    Dernier message: 23/01/2008, 14h44
  4. R�ponses: 2
    Dernier message: 20/07/2007, 11h21
  5. problème avec les fonctions MidStr et LeftStr
    Par timsah dans le forum C++Builder
    R�ponses: 1
    Dernier message: 07/02/2006, 10h07

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