Saisie de texte C++
Répondre à la discussion
Affichage des résultats 1 à 25 sur 25

Saisie de texte C++



  1. #1
    Lechero

    Saisie de texte C++


    ------

    Bonjour,

    merci pour vos réponses !

    J'ai une autre question concernant les char, mais là ce sera surtout un manipulateur sur cin que je cherche...

    Je veux que quelqu'un rentre un texte caractère par caractère, se texte se terminant par un @. Les "white spaces" (tab, espace, retour à la ligne,...) doivent être pris en compte. Or, lorsque j'essaye mon petit programme, ils ne le sont pas ...
    Le voici :
    Code:
    cout << "Veuillez saisir un texte se terminant par # s'il vous plait :" << endl;
        while (c!='#')
        {
            cin >> c;
            nblettres++;
    
        }
    Je veux compter le nombre de caractères (espaces, tab, ... compris).

    Vous avez un indice ?

    Merci

    -----
    A vaincre sans péril, on triomphe sans gloire (Corneille).

  2. #2
    Jack
    Modérateur

    Re : [C++] Conversion minuscule<--> majuscule

    et pourquoi ne pas utiliser tout simplement getline avec une chaine?
    Code:
      std::string ligne;
      std::getline (std::cin,ligne, '@');
    Dernière modification par Jack ; 10/02/2013 à 00h11.

  3. #3
    Lechero

    Re : [C++] Conversion minuscule<--> majuscule

    Bonjour,

    merci pour la réponse.

    cependant, j'ai deux questions :

    1) si je marque using namespace std; , suis-je obligé d'écrire les std:: ?
    2) aussi, je ne veux pas récupérer une ligne, mais un texte entier (incluant des retours à la ligne avec "entrée", des tabulations des espaces, etc...
    A vaincre sans péril, on triomphe sans gloire (Corneille).

  4. #4
    Jack
    Modérateur

    Re : [C++] Conversion minuscule<--> majuscule

    1) si je marque using namespace std; , suis-je obligé d'écrire les std:: ?
    non
    2) aussi, je ne veux pas récupérer une ligne, mais un texte entier (incluant des retours à la ligne avec "entrée", des tabulations des espaces, etc...
    Et getline ne le permet pas?

    A+

  5. A voir en vidéo sur Futura
  6. #5
    Lechero

    Re : [C++] Conversion minuscule<--> majuscule

    Si si, désolé, je débute en C++ ^^

    Ensuite pour le nombre de mots et de lignes, j'avais pensé à :

    - pour les mots : dès qu'il y a un espace, entrée, tab, ... un "white space", mettre une variable à 0 et, dès que l'un de ces white space est suivi d'un caractère non blanc, mettre cette variable à 1 et l'incrémenter à chaque fois qu'un espace blanc et suivi d'un caractère

    - pour les lignes, compter le nombre de retour chariot entré par l'utilisateur

    Mais pour ça, il faudrait que je parcourt la chaîne.

    Voici mon idée :
    Code:
    #include <string>
    
    string texte;
    ...
     int i(0),cptMot(0),cptLig(0);
    
    while (texte[i]< texte.size())
    {
         if ( ( texte[i]==' ' || texte[i]=='\t' || texte[i]=='\n' ) && ( texte[i+1]!=' ' || texte[i+1]!='\t' || texte[i+1]!='\n' )) cptMot ++;
    }
    i=0;
    while (texte[i]< texte.size())
    {
        if (texte[i]=='\n') cptLig++;
    }
    Mais cela ne marche pas ...
    A vaincre sans péril, on triomphe sans gloire (Corneille).

  7. #6
    Jack
    Modérateur

    Re : [C++] Conversion minuscule<--> majuscule

    Mais pour ça, il faudrait que je parcourt la chaîne.
    C'est l'idéal. Il y a tout ce qu'il faut pour faire çà dans la classe string.

    A+

  8. #7
    Lechero

    Re : [C++] Conversion minuscule<--> majuscule

    Je suis en train de penser : dans mon énoncé, il est écrit que la lecture se fait en une seule itération qui lit caractère par caractère et qu'il faut pour cela utiliser le flux cin.

    En déclarant un string, on ne respecte pas cette consigne ?
    A vaincre sans péril, on triomphe sans gloire (Corneille).

  9. #8
    Jack
    Modérateur

    Re : [C++] Conversion minuscule<--> majuscule

    L'idéal, quand on pose une question est de fournir d'entrée ce genre d'information.

    Il y a encore d'autres choses qu'il faut connaitre? On pourrait avoir l'énoncé exact du problème?

  10. #9
    Lechero

    Re : [C++] Conversion minuscule<--> majuscule

    Citation Envoyé par Lechero Voir le message
    Je veux que quelqu'un rentre un texte caractère par caractère, se texte se terminant par un @.
    Je l'avais déjà dit, peut-être mal formulé... Désolé.

    Les autres choses à connaitre sont que un tab est lu comme \t et le retour chariot \n.
    A vaincre sans péril, on triomphe sans gloire (Corneille).

  11. #10
    Jack
    Modérateur

    Re : [C++] Conversion minuscule<--> majuscule

    Ok. Quel est le problème en fait par rapport à ton code de départ? Tu lis les caractères un par un et il suffit ensuite de les tester pour savoir s'il s'agit d'un séparateur, d'une fin de ligne, ou de la fin de la saisie.
    Une série de if dans la boucle, ou mieux, un switch ... case devraient faire l'affaire.

    A+

  12. #11
    Jack
    Modérateur

    Saisie de texte C++

    Je viens de créer une nouvelle discussion car les derniers posts n'avaient plus rien à voir avec la discussion en cours.

    La prochaine fois: un problème => ouverture d'un nouveau fil
    Dernière modification par Jack ; 10/02/2013 à 15h29.

  13. #12
    Lechero

    Saisie de texte C++

    Ok pour la discussion.

    Ensuite, avec mon code de départ, si j'éxécute le programme et que je test avec "bonjour monsieur Dupont#", mon code me renvoi seulement 22 caractères, or il y en a 7+1+8+1+6 = 23 (le # ne doit pas être pris en compte, alors que les espaces si)
    A vaincre sans péril, on triomphe sans gloire (Corneille).

  14. #13
    Jack
    Modérateur

    Re : Saisie de texte C++

    on peut voir tout ton code?

  15. #14
    Lechero

    Re : Saisie de texte C++

    le voilà :
    Code:
    #include <iostream>
    
    
    using namespace std;
    
    void calcul (int & nbLig, int & nbMot, int & nbCar);
    
    int main ()
    {
        int nbLig(0),nbMot(0),nbCar(0);
    
        calcul(nbLig,nbMot,nbCar);
    
        cout << "Votre texte contient " << nbCar << " caracteres, " << nbMot << " mots et " << nbLig << " lignes." << endl;
    
        return 0;
    }
    
    
    void calcul (int & nbLig, int & nbMot, int & nbCar)
    {
        char c;
    
        cout << "Veuillez saisir un texte se terminant par # puis appuyer sur <Entree> s'il vous plait :" << endl;
    
        while (c!='#')
        {
            cin >> c;
            nbCar++;
        }
    
    }
    A vaincre sans péril, on triomphe sans gloire (Corneille).

  16. #15
    Lechero

    Re : Saisie de texte C++

    désolé du double post : je sais qu'il faut utiliser un manipulateur sur le flux cin pour indiquer que l'on accepte les white spaces, ça résoudra déjà mon problème du nombre de caractères
    A vaincre sans péril, on triomphe sans gloire (Corneille).

  17. #16
    Jack
    Modérateur

    Re : Saisie de texte C++

    Code:
       char c;
    
         while (c!='#')
    Pas bon du tout çà: la première fois que tu compare c avec le caractère '#', la valeur de c est indéterminée. Ton programme est donc "tombé en marche", t'as du bol quoi.

    Pour le reste, on ne peut pas saisir un seul caractère avec cin pour le tester immédiatement après. cin est bufferisée et attend que tu tapes la touche entrée pour passer à l'instruction suivante.

    A+

  18. #17
    Lechero

    Re : Saisie de texte C++

    Code:
    {
        char c='a';
        int auto(1); // auto : variable valant 1 quand c est un caractères autre qu'un white space
    
        cout << "Veuillez saisir un texte se terminant par # puis appuyer sur <Entree> s'il vous plait :" << endl;
    
        while (c!='#')
        {
            cin >> c;
    
            swhitch(c)
            {
                case '\n' : nbLig++; break;
                case ('\n' || '\t' || ' ') :
                {
                    if (auto==1) auto=0; // ces caractères ne font pas partie d'un mot
                    break;
                }
                case x : // x serait le cas où ce sont de bons caractères entré. je voudrais que auto soit égal à 1 quand un mot est parcouru, et compter au final le nombre de fois où il est passé à 1 pour avoir le nombre de mots total
                {
                    if (auto==0) auto=1
                }
            }
        }
    }
    En fait là je suis vraiment bloqué, ça fait un bon moment que j'essaye et rien...

    Merci de m'aider à avancer un peu plus
    A vaincre sans péril, on triomphe sans gloire (Corneille).

  19. #18
    Jack
    Modérateur

    Re : Saisie de texte C++

    [COTE] swhitch(c)

    [/COTE]Ca m'étonnerait que la compilation aboutisse
    En fait là je suis vraiment bloqué, ça fait un bon moment que j'essaye et rien...
    A vrai dire, je ne vois pas trop comment faire pour tester caractère par caractère avec cin pour les raisons que j'ai invoquées plus haut.

    A+

    PS: on ne peut toujours pas voir ton énoncé?
    Dernière modification par Jack ; 10/02/2013 à 19h57.

  20. #19
    Lechero

    Re : Saisie de texte C++

    Je n'ai pas de scanner, je vous l'écris :

    Faire la procédure qui calcule le nombre de caractères, de mots et de lignes d'un texte tapé au clavier et se terminant par le caractère #. Ces valeurs seront renvoyées via des paramètres références et affichées sur un gabarit de 4 caractères.
    Voici le prototype :
    void maproc (int & nbLig, int & nbMot, int & nbCar);

    Indications :
    * la lecture au clavier se fera à l'aide d'une seule itération, qui lira caractère par caractère en utilisant le flux cin. Il faudra utiliser un manipulateur pour indiquer que l'on veut lire aussi les séparateurs (white spaces : espace, tabulation, retour chariot, ...)
    * comptage des caractères : chaque caractère lu doit être comptabilisé (sauf le # final)
    * comptage des mots : on considère q'un mot est formé d'une suite de n'importe quels caractères autres que l'espace ou la tabulation ('\t). Plusieurs espaces et plusieurs tabulations successives peuvent séparer deux mots.
    On peut s'aider pour cela en programmant un automate à deux états : "mot en cours" (état 1), ou "pas de mot en cours" (état 0). A chaque caractère lu, on décide, en fonction de l'état courant et du caractère en train d'être lu, de la nouvelle valeur de l'état ==> chaque fois que l'état passe de 0 à 1, c'est qu'il y a un nouveau mot
    Le voilà !
    A vaincre sans péril, on triomphe sans gloire (Corneille).

  21. #20
    Jack
    Modérateur

    Re : Saisie de texte C++

    j'espérais avoir trouvé la solution avec cin.get() qui permet de définir un délimiteur. Le délimiteur est bien détecté, mais je ne vois pas comment on peut lire caractère par caractère dans la boucle de saisie.

  22. #21
    fred1599

    Re : Saisie de texte C++

    Bonjour,

    Est-ce que le code ci-dessous conviendrait, sinon, quel devrait être les modifications?

    Code:
    #include <iostream>
    
    using namespace std;
    
    int main(void)
    {
        char c;
        string result;
        while(c != '#')
        {
            cin.get(c);
            result += c;
        }
    
        cout << result << endl;
        cout << "nombre de caractères : " << result.size() - 1 << endl;
        return 0;
    }

  23. #22
    Lechero

    Re : Saisie de texte C++

    Bonjour,

    oui ce code fonctionne très bien, merci.

    Seulement, à la place du string, j'ai déclarer une variable de type entier i=0, que j'incrémente à chaque passage dans la boucle.

    merci encore !

    A votre avis, pour les mots et les lignes, je peux mettre des "if" de le while, afin de voir, par exemple, si c='\n', alors nbLig++ ?
    Pour le comptage des mots, je en vois pas comment programmer l'automate et compte rle nombre de fois où il est passé à 1
    A vaincre sans péril, on triomphe sans gloire (Corneille).

  24. #23
    fred1599

    Re : Saisie de texte C++

    A votre avis, pour les mots et les lignes, je peux mettre des "if" de le while, afin de voir, par exemple, si c='\n', alors nbLig++ ?
    Allez, test!

    Pour le comptage des mots, je en vois pas comment programmer l'automate et compte rle nombre de fois où il est passé à 1
    J'utiliserais pas cette méthode, mais avec le mot split et c++, tu trouveras peut-être ton bonheur via google.

    Ou alors tu peux détecter si une ponctuation est présente (espace, virgule, point virgule, ...) et passé à l'état 1 à chacune de ces rencontres.

  25. #24
    Lechero

    Re : Saisie de texte C++

    Bonsoir et merci encore pour les réponses !

    split et c++
    Dans les exemples que j'ai vu, j'ai l'impression qu'ils utilisent des vecteurs... Or, débutant totalement en C++, je ne pense pas que l'on ait besoin d'utiliser ces "choses" ^^

    tu peux détecter si une ponctuation est présente (espace, virgule, point virgule, ...) et passé à l'état 1 à chacune de ces rencontres
    Ça, ça détecterait les "séparateurs" de mots. Or, plusieurs espaces, tabulations, ... pouvant séparer deux mots, je ne peux pas y utiliser =(

    Je pensais à quelque chose du genre : si le caractère est \n, \t, ou " ", mettre ne variable à 0 qui le resterait jusqu'à ce qu'une prochain caractère différent de \n, \t et " " , puis mettre cette variable à 1 et enfin compter le nombre de fois où la variable a été à 1.
    A vaincre sans péril, on triomphe sans gloire (Corneille).

  26. #25
    Lechero

    Re : Saisie de texte C++

    Bonjour à tous,

    j'ai enfin trouvé !

    Voilà la solution si ca peut vous intéresser : le manipulateur noskipws !

    dans la boucle (while c!='#'), j'ai simplement mis cin >> noksipws >> c; , et ensuite une série de "if" pour tester les mots et les lignes.

    Merci à tous pour votre aide !
    A vaincre sans péril, on triomphe sans gloire (Corneille).

Discussions similaires

  1. sauvegarder saisie html
    Par invite4002ebae dans le forum Programmation et langages, Algorithmique
    Réponses: 2
    Dernier message: 14/04/2011, 14h31
  2. Dans WORD, texte horizontal + texte vertical comment ?
    Par Cornemuse dans le forum Logiciel - Software - Open Source
    Réponses: 6
    Dernier message: 24/01/2010, 06h28
  3. Logiciel saisie vocale
    Par freesbeep dans le forum Internet - Réseau - Sécurité générale
    Réponses: 1
    Dernier message: 19/04/2007, 09h07
  4. Saisie semi-automatique
    Par invitebea274dd dans le forum Internet - Réseau - Sécurité générale
    Réponses: 1
    Dernier message: 16/01/2006, 23h04
  5. money problème saisie
    Par ovaline dans le forum Logiciel - Software - Open Source
    Réponses: 0
    Dernier message: 04/01/2006, 13h29