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 :

disperser les espaces dans une ligne


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 157
    Par défaut disperser les espaces dans une ligne
    bonjour tout le monde j'essaye envain d'aboutir à mon projet qui est de justifier un texte j'ai fait ça:

    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
     
    #include <string>
    #include <iostream>
    using namespace std;
    int main()
    {
     
    // Lecture
       string text;
       int l, deb;
       cout <<  "texte ?" << endl;
       getline(cin,text);
       cout << "Entrer le nombre de caractere que vous voulez pour une     ligne?" << endl;
       cin >> l;
     
     
       // Nombre de caracteres
       size_t len = text.length();
     
       // Nombre de mots
       unsigned int nb_words=0;
       for(unsigned int i=0;i<len;i++)
       {
          // avancer jusqu'au prochain mot
          while ((isalpha(text[i]) && i<len)) i++;
     
          // on a atteint la fin d'un mot ou de la chaine
          if (i<=len) 
               nb_words++;
        }
     
     
        if (l<10 or l>80){
           cout<<"l est erroné."<<endl;
        }
        else {
            if ((text.length()) < l)
            {
               cout<<text<<endl;
            }
            else
            {
     
     
               deb = 0;
               i = l;
               while (i < len)
               {
                  while ((i>deb) && (text[i] != ' ')) i--;
     
                  if (i>deb)
                  {
                     text[i]=10;
                     deb = i;
                     i += l;
                  }
                }
     
                cout << text << std::endl;
              }
         }
    }
    tout marche comme je le souhaite mais maintenant il faudrait que je répartise mes espaces entres mes mots suivant la longueur de la ligne, si vous pourriez m'indiquer comment je peut faire ce serait super.
    merci d'avance

  2. #2
    Expert confirmé
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Par défaut
    Une idée simple :

    Tu calcules le nombre d'espaces à rajouter ,
    Tu calcules le nombre de mots de ta ligne et par la même occasion le nombre d'espaces (nb_mots - 1)
    Tu calcules le nombre d'espaces à rajouter entre les mots pour justifier ta ligne.
    Tu rajoutes les espaces où il faut.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 157
    Par défaut
    ben enfaite je sais pas trop comment faire pour faire tous ça. Il faut que je compte mes lignes avant et que j'arrive à les disocier c'est bien ça?
    ensuite je calcul le nombre de caracte que j'ai par ligne et je soustrait l pour savoir le nombre d'espace qu'il me manque. Puis je calcul le nombre de mot dans ma ligne et je repartit les espaces de ma ligne suivant mes mot.
    on est d'accord?
    Problème c'est que je ne sait pas trop comment on fait pour compter les lignes, pour les dissocier et pour rajouter un espace à l'endroit souhaité.
    Voila merci d'avance de votre aide

  4. #4
    Expert confirmé
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Par défaut
    Il faut que je compte mes lignes avant et que j'arrive à les disocier c'est bien ça?
    Non, tu traites ligne par ligne. via le getline ...

    ensuite je calcul le nombre de caracte que j'ai par ligne et je soustrait l pour savoir le nombre d'espace qu'il me manque. Puis je calcul le nombre de mot dans ma ligne et je repartit les espaces de ma ligne suivant mes mot.
    on est d'accord?
    Exact.

    Problème c'est que je ne sait pas trop comment on fait pour compter les lignes
    Tu n'en as pas besoin, tu traite ligne par ligne.

    Le tout est de lire ta ligne et écrire dans une autre ligne le résultat (tu ne travailles pas sur place sinon, ça devient rapidement horriblement compliqué ...)

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 157
    Par défaut
    ben oui mais comment je fait pour distinguer mes lignes si je les compte pas?
    c'est ça enfaite mon plus gros probleme savoir comment faire pour distinguer mes lignes!!!
    merci pour votre aide

  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
    Je ne suis pas sûr que tu aies vu la différence entre:
    - les lignes que tu lis
    - les lignes que tu produis

    Tu n'as pas besoin de savoir combien de lignes tu lis. Tu as juste besoin de charger tous les mots initiaux dans un tampon. Et à chaque fois que le nombre de caractères accumulés, par les mots dans le tampon, dépasse le nombre max de caractères par lignes, tu vides tout jusqu'au mot précédent. Le vidage devant s'occuper de rajouter des espaces comme il se doit.
    En entrée, comme en sortie, peu importe le nombre de lignes.

    Avec ça, il devrait y avoir les mots clés pour définir des fonctions par raffinage successifs en partant du plus haut : le problème à résoudre.

    Quand un problème est trop compliqué, on le décompose en problèmes plus simples qui mis bouts à bouts participent à la solution. J'ai l'impression que tu es parti depuis le plus bas sans vraiment voir l'algo de plus haut niveau.
    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
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 157
    Par défaut
    ben enfaite il faut tout que je recommence car si le texte entré par l'utilisateur a un retour à la ligne ça ne fonctionne pas, ça fait defiler mes 'cout' donc voila. Je suis completement desesperer, je sais pas comment je vais faire il est à rendre pour samedi et ça faisait quand même une semaine que je travaillais dessus donc à moins d'un miracle je vois pas comment je vais pouvoir le faire.
    Merci beaucoup de votre aide

  8. #8
    Membre éclairé
    Avatar de Zenol
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    Par défaut
    Je ne garanti rien, mais j'ai peut-être une petite idée...

    Tu charge le texte depuis l'entrée standard (justif < texte envoi le texte dans l'entrée standard de mémoire)
    Une fois le texte dans un std::string, tu commence par éliminer les doubles d'espace entre les mots (imagine quelqu’un qui viens taper "abc def" ^

    Puis tu récupérer le nombre de caractère choisi en l'envoyant dans une première variable;
    Si après il y à un espace
    ->Impeccable on a pile une ligne qui se termine sur un mot
    Si malheureusement il n'y à pas d'espace après, tu efface les dernières lettres et l'espace qui précède, et tu note le numéro du caractère ou tu reprendra. Ensuite tu place des espaces de manière homogène, donc tu compte le nombre d'espace à placer, ainsi que le nombre de mot dans la ligne, et tu place un espace tout les NbEspace/NbMots mots de ta phrase (Si il y à un reste tu placera un espace à un des mots du texte à ou tu n'en a pas placer)

    par la suite, tu a belle phrase formater et tu peut enfin l'envoyer à la suite des phrase précédemment traiter, en oubliant pas un petit retour à la ligne.


    Voila j'espère que c'est plus claire pour toi ^^

    (Désoler pour les multiples fautes d'orthographe et de grammaire qui criblent ce texte :s)
    Mes articles Développez | Dernier article : Raytracer en haskell
    Network library : SedNL | Zenol's Blog : http://zenol.fr

    N'oubliez pas de consulter la FAQ et les cours et tutoriels.

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 157
    Par défaut
    j'ai pas tout compris ce que tu ma expliquer la.
    tu vois quoi par eliminer les double espaces entre les mots??
    De plus mes lignes elles sont déja crées mais c'est les espaces dans ma ligne qui ne sont positionner d'une bonne maniere.

  10. #10
    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
    Ne le pomme pas avec le nombre d'espaces à lire. Une simple utilisation de l'opérateur d'extraction (>>) suffit amplement pour extraire les mots.
    Qu'il finalise d'abord l'algo. Si son prof lui interdit un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    std::string mot;
    while (std::cin >> mot) {
        [...]
    }
    il pourra toujours remplacer cette lecture par une fonction "lit_mot(std::cin)" de son cru.
    Qu'il parte de l'algo de plus haut niveau avant de partir dans les détails

    Après l'algo ... je te l'ai donné. Je ne vois pas trop quoi rajouter.

    Si ton problème c'est que les lignes vides doivent déclencher une purge du tampon sans justifier la dernière ligne, il faut effectivement un peu feinter en faisant une lecture en deux étapes.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    tant que l'on peut lire des lignes(cin)
        si la ligne est vide, 
            purger le tampon de mots sans justification
            introduire une ligne vide
        sinon, pour chaque mot de la ligne
            si le nombre de caractères accumulé plus celui du nouveau mot dépasse la longueur max
                purger le tampon de mots avec justification
            fsi
            ajouter le nouveau mot au tampon 
        fsi
    ftq
    purger le tampon de mots sans justification
    Maintenant, tout ce que l'on peut faire plus, c'est envoyer directement la solution à ton prof (si tu as son email)



    Derniers trucs. Le pourquoi tu partais avec un handicap. Tu avais prototypé diverses fonctions, visiblement qui coupent du texte à position fixe, mais sans considération de l'intégrité des mots. Pourquoi pas. Mais cette fonction ne peut pas t'être utile car elle est loin du véritable problème que tu as à résoudre.
    Si au contraire tu part du problème que tu as à résoudre, on voit rapidement comment s'articulent, de là tu raffines au fur et à mesure en rentrant de plus en plus dans les détails.

    De même que de continuer à vouloir garder des lignes en mémoire. C'est s'embéter pour rien. Quand on justifie, on perd la notion de ligne de départ. En entrée, on a un paragraphe, en sortie un ensemble de lignes formattées. En insistant à vouloir voir des lignes en entrée, tu ne vas pas t'en sortir.
    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...

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 157
    Par défaut
    merci bcp de votre aide, mais si dans vos messages vous pourriez remplacer tout le masculin par du feminin car c'est pas il c'est "elle"!!!!! lol!
    eh oui y'a aussi des filles dans l'informatique tres peu j'avoue mais bon faut pas les oublier !!!!!
    Sinon au lieu d'envoyer la solution au prof tu me l'enverrais à moi directement ce serait genial!!!!! (je plaisante bien sur)
    donc en faite si j'ai bien compris toutes les lignes que je crées je les met dans un tableau (mais comment je fait pour designer les ligne que je creer par rapport au programme que j'ai fait???) puis je compte les mots à l'interieur de ma ligne je regarde les espaces manquant puis je les rajoute.
    Mais tu dit que je part d'un handicap d'ou le programme que je donne au debut il y a des truc à modifier??
    merci d'avance!!!

Discussions similaires

  1. Réponses: 9
    Dernier message: 06/11/2007, 12h36
  2. Supprimer les espaces dans une chaine de caractères
    Par arnaudperfect dans le forum Shell et commandes GNU
    Réponses: 13
    Dernier message: 23/07/2007, 22h24
  3. Effacer les espaces dans une chaîne de caractères
    Par JohnnyWalk dans le forum Débuter avec Java
    Réponses: 16
    Dernier message: 19/07/2007, 14h13
  4. supprimer les espaces dans une chaîne de caratères.
    Par Empty_body dans le forum Langage
    Réponses: 2
    Dernier message: 12/09/2006, 18h43
  5. [VB6]Gérer les espaces dans une command FTP
    Par ShortcutZ dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 24/07/2006, 21h28

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