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 :

Mettre en majuscule lettre précise d'un mot - problème d'affichage du résultat final


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 62
    Points : 38
    Points
    38
    Par défaut Mettre en majuscule lettre précise d'un mot - problème d'affichage du résultat final
    Bonjour,

    merci pour votre aide....

    voici la requête
    Entrer un mot de plus de 10 caractères : extraordinaire
    Lettre à rechercher : a
    Résultat : extrAordinAire
    la lettre a apparaît aux positions 5 et 11.

    il me reste a intégrer cette partie a la saisie d’écran qui est terminer.

    Le problème lorsque je mets un indice a mon tableau le résultat ne s'affiche pas de la même manière
    que si je mets mon indice direct.

    deuxième problème lorsque j’enlève la ligne cout << str << ' ' << pos[i] << '\n'; je n'est plus les majuscule que remplacer

    voici mon code;

    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
    int main ()
    {  string str = "extraordinaire";
     
      string lettre = "i";
      string var = "";
     
      int pos[20];
     
      for (int i=1;i < 20;i++)
       {
           size_t trouver = str.find(lettre);
           if (trouver!= string::npos)
              {var=putchar(toupper(str[trouver]));
               str.replace(str.find(lettre),lettre.length(),var);
               pos[i]= ("%d",trouver+1);
     
               cout << str << ' ' << pos[i] << '\n';
              }
        }
     cout << str,"%s";
     cout << "                                                                             ";
     cout << "La lettre ("<< lettre <<") apparait a la position: "<<(pos[1]);
     int ind2=1;
     int nbr;
     for (int ind=0;ind < 21;++ind)
      {if (pos[ind] <0)
            { cout<<" et "<<pos[ind];
            };
      }
      cout << ".";
      cout << "              return 0;
    }
    lorsque je mets mon ind à pos[ind] :
    Nom : exercice ind.PNG
Affichages : 416
Taille : 3,1 Ko
    lorsque je mets 2 direct à pos[2] :
    Nom : exercice 3.PNG
Affichages : 417
Taille : 4,6 Ko

    résultat attendu
    Nom : exercice3 att.PNG
Affichages : 425
Taille : 2,6 Ko";

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Je te donnes un petit code qui fonctionne parce que je vois trop de trucs qui ne vont pas.
    En vrac
    • les indices de boucle commencent à 0 et non pas 1
    • mauvais algo: pourquoi utiliser la méthode find avec une boucle for alors qu'il faut utiliser une boucle while. Édit: je ne connais pas trop les std::string mais la méthode find me semble inappropriée à utiliser dans ce cas
    • Le tableau initialisé de façon pas précise. Ainsi que la fin des 2 boucles
    • Les cout ne sont pas regroupés
    • Trop de variables utilisées pour rien. Ainsi que la fonction putchar
    • La classe string peut être utilisée comme un tableau C. Je pense que c'est quand même un super point.
    • Avec les cout utiliser endl à la place de '\n'
    • Tu as voulu faire quoi avec ton retour de main dans un cout


    Après pour l'utilisation du tableau pos_array pour stocker les positions je n'ai rien contre, mais ce n'est pas optimal.

    Et utilises la balise code signalée par le croisillon

    Édit: Ton problème me semble venir de cette ligne pos[i]= ("%d",trouver+1); même si je ne savais pas qu'on pouvait faire cela ()
    Mais à ce que comprend tu prends une variable size_t qui est un unsigned int ou un unsigned long que tu transformes en chaîne de caractères (même pas en char) avec "%d" et que cette dernière est castée en int pour être mise dans ton tableau.
    Et après tu ne comprends pas pourquoi pos[i] = 2 lui fonctionne

    Édit 1: Merci @the Hound et @leternel, même si je ne vois pas l'utilité du truc ou x = (a, b) <=> a; x = b;.


    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
    #include<iostream>
    #include <string.h> // pour le memset
     
    using namespace std;
     
    int main ()
    {
        string str = "extraordinaire";
     
        char letter = 'i';
     
        int str_len = str.size();
        int pos_array[str_len];
        int pos = 0, count = 0;
     
        memset(pos_array, 0, str_len); // Pas forcement utile
     
        for(pos = 0 /* En C/ C++ on commence tjs par 0*/; pos < str_len; ++pos) {
    //      On teste 2 chars
            if (str[pos] == letter) {
                pos_array[pos] = 1;
                str[pos] += ('A' - 'a'); // Majuscule ;-)
                count++;
     
    //          On peut regrouper les cout
    //          On ajoute 1 a la position pour que ce soit plus humain
                cout << str << ' ' << pos + 1 << endl;
            }
        }
     
    //  On peut regrouper les cout
        cout << "La nouvelle chaine est " << str << '.' << endl << "La lettre (" << letter << ") apparait " << count << " fois ";
     
        if (count > 0) {
            cout << ((count > 1)? "aux positions ": "a la position ");
     
    //      Petite optimisation
    //      On va decrementer count pour arreter plus vite
     
    //      On peut reutiliser la variable pos
            for(pos = 0; ((pos < str_len) && (count > 0)); ++pos) {
                if (pos_array[pos] == 1) {
                    cout << pos;
     
                    --count;
     
                    if (count > 0) { cout << " et "; }
                };
            }
        }
     
        cout << "." << endl;
     
        return 0;
    }

  3. #3
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2014
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2014
    Messages : 345
    Points : 1 211
    Points
    1 211
    Par défaut
    Pour info, x = (a, b, c); <=> a; b; x = c;
    Donc pos[i] = ("%d", trouver + 1); <=> pos[i] = trouver + 1;
    Non, on ne peut pas caster aussi facilement ou alors pas en C/C++ !

  4. #4
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Quelques précisions complémentaires concernant la virgule.

    l'opérateur virgule a la plus basse priorité (18), après l'affectation (16) et même après throw (17).
    Il prends deux opérandes (comme l'addition), les évalue, et retourne le second.

    Tout se passe comme s'il était ainsi défini: template <typename A, typename B> B operator,(A, B) {return B;}. aux subtilités de copie et déplacement près

    Dans boost, il y a un cas de redéfinition (avec le =) pour simplifier la création de vector. C'est maintenant inutile avec C++, mais ca existe.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

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

Discussions similaires

  1. mettre en majuscule la premiere lettre d'un mot
    Par teophane dans le forum Requêtes
    Réponses: 5
    Dernier message: 18/11/2011, 13h54
  2. Réponses: 0
    Dernier message: 31/05/2011, 18h59
  3. Mettre en majuscule la première lettre d'un mot
    Par bobosh dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 05/09/2008, 07h55
  4. [RegEx] Mettre des majuscules au début de chaque mot
    Par Guilhem_mdg dans le forum Langage
    Réponses: 9
    Dernier message: 01/02/2007, 10h33
  5. Mettre la première lettre des mots en majuscule
    Par seb.49 dans le forum Langage
    Réponses: 8
    Dernier message: 23/05/2003, 14h26

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