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
    Candidat au 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
    Points : 2
    Points
    2
    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
    Membre confirmé Avatar de toxcct
    Développeur informatique
    Inscrit en
    Juillet 2006
    Messages
    434
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 434
    Points : 511
    Points
    511
    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.
    besoin de réponses ? demande a un pote

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 13
    Points : 14
    Points
    14
    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
    Candidat au 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
    Points : 2
    Points
    2
    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 du Club
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Septembre 2006
    Messages : 37
    Points : 64
    Points
    64
    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 éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 279
    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 279
    Points : 11 013
    Points
    11 013
    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
    Candidat au 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
    Points : 2
    Points
    2
    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
    Candidat au 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
    Points : 2
    Points
    2
    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 éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 279
    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 279
    Points : 11 013
    Points
    11 013
    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 régulier 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
    Points : 111
    Points
    111
    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 habitué
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 125
    Points : 145
    Points
    145
    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 éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 279
    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 279
    Points : 11 013
    Points
    11 013
    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 habitué
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 125
    Points : 145
    Points
    145
    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 éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 279
    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 279
    Points : 11 013
    Points
    11 013
    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. [Visual C++]probleme avec les fonctions declarées static
    Par sana06 dans le forum Visual C++
    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