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 :

Concaténation d'une string dans boucle


Sujet :

C++

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 10
    Points : 2
    Points
    2
    Par défaut Concaténation d'une string dans boucle
    Bonjour à tous.

    Voici mon problème : j'ai fait une boucle qui me renvoie la valeur de cle[i-1] pour chaque itération mais je voudrais prendre chaque valeur de clef pour chaque itération afin de l'affecter à une variable finale qui correspondrais à la valeur finale de la clef.

    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
    for (i=1;i<=lgcle;i++){
    int max=0;
    for (j=1;j<=26;j++)
    t[j]=0;
    for (j=i-1;j<=cpt;j+=lgcle)
    {
    char motl=liste[j];
    if (motl>='a' && motl<='z'){
    t[motl-'a'+1]++;
    if (t[motl-'a'+1]>max){
    max=t[motl-'a'+1];
    if (motl>='e')
    cle[i-1]=motl-4;
    else
    cle[i-1]=motl+22;}}}
    cout<<"voici la valeur de la cle (lettre par lettre):"<<cle[i-1]<<endl;
    }}
    Voila ce que me renvoie le terminal :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    voici la valeur de la cle (lettre par lettre):b
    voici la valeur de la cle (lettre par lettre):o
    voici la valeur de la cle (lettre par lettre):n
    voici la valeur de la cle (lettre par lettre):j
    voici la valeur de la cle (lettre par lettre):o
    voici la valeur de la cle (lettre par lettre):u
    voici la valeur de la cle (lettre par lettre):r
    Je voudrais un truc de ce style ;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    voici la valeur de la cle =bonjour
    J'ai beau essayé de concaténer le tout dans un string mais je n'y arrive pas.
    Merci de votre aide.

  2. #2
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Bonjour,

    utilise les balise [codeX] ton code [/code] (en enlevant le 'X' pour rendre ton code plus lisible.


    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
    for (i=0;i<lgcle;++i)
    {
            int max=0;
           //N'oublie pas qu'un tableau commence à l'indice 0
           for (j=0;j<26;++j)
                  t[j]=0;
           //tu peux aussi faire : int t[26] = {0};
           for (j=i;j<=cpt;j+=lgcle)
           {
                  char motl=liste[j];
                  if (motl>='a' && motl<='z')
                 {
                          ++(t[motl-'a']);
                          if (t[motl-'a']>max)
                          {
                                 max=t[motl-'a'];
                                 if (motl>='e')
                                      cle[i]=motl-4;
                                 else
                                      cle[i]=motl+22;
                           }
                 }
            }
    cout<<"voici la valeur de la cle (lettre par lettre):"<<cle[i]<<endl;
    }
    Tu avais apparemment une accolade de trop.

    Au lieu de commencer i à 1 et de toujours faire i - 1, commence à 0.

    i++ sauvegarde la valeur de i, incrémente i puis retourne la valeur sauvegarder, il faut utiliser ++i, c'est plus rapide.

    Si cle est un string :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    string cle = ""; //initialisation
    cle += 't'; //ajout d'une lettre.
    cle += 'o';
    cle += 't';
    cle += 'o';
    cout << cle << end;
    //affiche "toto"

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    Oui je vous remercie mais le résultat est le même. Le terminal me renvoie la clef lettre par lettre.

    Ps : j'ai définie cle comme étant un char.

  4. #4
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Clé est un char * et non un char alors.

    C'est alors très simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    cle[i+1] = '\0'; //ou cle[i+1] = 0;
    cout<<"voici la valeur de la cle (lettre par lettre):"<< cle <<endl;

    Sinon ton algorithme me semble un peu étrange, peux-tu me dire exactement ce qu'il doit faire ?


    EDIT : tu peux simplifier ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int t[lgcle][26] = {{0}};
    for(int i = 0; i < cpt; ++i)
    {
              //...
              t[i%lgcle][...];
              //...
              
    }
    Ceci t'évitera la boucle for for (j=i;j<=cpt;j+=lgcle) à l'intérieur de ta boucle for.

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    Je peux t'envoyer le code source par mp si tu veux ?

  6. #6
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Si possible poste le code source ici.

    Sinon pour les mp il faut que je fasse un petit tri dans la messagerie, j'ai presque atteint la limite

    De plus je suis un peu occupé ces temps-ci donc je ne pourrais pas regarder ton code source avant 2/3 jours.

    N.B. J'ai édité mon précédant post.

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    Ok en gros c'est ç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
    int t[lgcle][26] = {{0}};
    for(int i = 0; i < cpt; ++i)
    {
            int max=0;
           //N'oublie pas qu'un tableau commence à l'indice 0
           for (j=0;j<26;++j)
                  t[j]=0;
           //tu peux aussi faire : int t[26] = {0};
             t[i%lgcle][...];
           {
                  char motl=liste[j];
                  if (motl>='a' && motl<='z')
                 {
                          ++(t[motl-'a']);
                          if (t[motl-'a']>max)
                          {
                                 max=t[motl-'a'];
                                 if (motl>='e')
                                      cle[i]=motl-4;
                                 else
                                      cle[i]=motl+22;
                           }
                 }
            }
    cout<<"voici la valeur de la cle (lettre par lettre):"<<cle[i]<<endl;
    }

  8. #8
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Utilise les balise 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
    int t[lgcle][26] = {{0}};
    for(int i = 0; i < cpt; ++i)
    {
            int max=0;
           //N'oublie pas qu'un tableau commence à l'indice 0
           for (j=0;j<26;++j)
                  t[j]=0; //inutile, tu initialise déjà t à 0 avec la ligne en-dessus
             t[i%lgcle][...]; //les '...' c'était pour que tu remplace par la bonne valeur
           {
                  char motl=liste[j];
                  if (motl>='a' && motl<='z')
                 {
                          ++(t[i%lgcle][motl-'a']);
                          if (t[i%lgcle][motl-'a']>max)
                          {
                                 max=t[i%lgcle][motl-'a'];
                                 if (motl>='e')
                                      cle[i]=motl-4;
                                 else
                                      cle[i]=motl+22;
                           }
                 }
            }
    cout<<"voici la valeur de la cle (lettre par lettre):"<<cle[i]<<endl;
    }
    Pour le max, il va falloir aussi que tu le remplace par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    int max[lgcle];
    max[i%lgcle];
    Par contre je n'ai pas compris ce que tu essayes de faire avec ce max, ceci me parait un peu étrange...

  9. #9
    Membre du Club
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2011
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Août 2011
    Messages : 88
    Points : 65
    Points
    65
    Par défaut
    Citation Envoyé par Neckara Voir le message
    i++ sauvegarde la valeur de i, incrémente i puis retourne la valeur sauvegarder, il faut utiliser ++i, c'est plus rapide.
    Il me semble qu'au niveau du code ASM ++i ou i++ revient au même. Est-ce alors véritablement plus rapide ?

  10. #10
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    J'ai une erreur lors de la compilation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    erreur: conflicting declaration ‘int t [(((long unsigned int)(((long int)lgcle) + -0x00000000000000001)) + 1)][26]
    Ps : c'est pour la ligne : int t[lgcle][26] = {{0}};

  11. #11
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Citation Envoyé par Nekkro Voir le message
    Il me semble qu'au niveau du code ASM ++i ou i++ revient au même. Est-ce alors véritablement plus rapide ?
    En C oui car i++ n'a pas de copie à effectuer, i++ et ++i revient au même.

    En C++ non, i++ doit effectuer une copie, s'incrémenter puis retourner sa copie.
    Bon, les temps d'exécutions sont assez proche, mais c'est une habitude à prendre et c'est de l'optimisation gratuite.

    Si on veut juste faire une incrémentation, il faut utiliser ++i.
    Sinon on prend l'habitude du C à utiliser i++ et dès qu'on fait :
    tab[i++]; on perd du temps à chercher ce qui ne va pas.

    Par contre on peut avoir des choses marrante avec i++ en C++ comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    char *tab;
    char *chaine;
    while( *tab++ = *chaine++); // implémentation de strcpy



    EDIT :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int t[lgcle][26] = {{0}};
    L'initialisation marche en C théoriquement, je penserais qu'il marcherait en C++ aussi.

    Essaye int t[lgcle][26]; pour voir si l'erreur provient de l'initialisation ou non.

    Sinon je suis sur que l'initialisation int t[lgcle][26] = {0}; marche en C++.

  12. #12
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    non les deux solutions ne marchent pas

  13. #13
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Est-ce que tu peux montrer pour les deux cas tout ce que le compilateur dit?

  14. #14
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    Pour int t[lgcle][26]; :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    erreur: conflicting declaration ‘int t [(((long unsigned int)(((long int)lgcle) + -0x00000000000000001)) + 1)][26]
    et pour int t[lgcle][26] = {0}; :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    erreur: conflicting declaration ‘int t [(((long unsigned int)(((long int)lgcle) + -0x00000000000000001)) + 1)][26]

  15. #15
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Juste pour tester :

    essais 1 :
    essais 2 :
    essais 3 :
    Donne moi pour chacun des essais le message d'erreur.

    Même si je pense savoir où vient le message d'erreur, n'auras-tu pas défini plus haut dans ton code une variable int t[] ?

  16. #16
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    J'ai deja definie une variable long int t

  17. #17
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Elle te sert en dehors du code que tu nous as montré?


    Sinon peux-tu m'expliquer ton algorithme ? (= Ce que tu essaye de faire)

    Je ne comprend pas tout à fait le rôle que tu essaye de donner à max.

  18. #18
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    Non elle ne me sert pas en dehors du code.

    Ce que j'essaye de faire : une fois que je possède la taille de la clef, j’essaye de trouver la valeur de la clef lettre par lettre pour ensuite concaténer ces valeur dans une variable qui sera ma clef finale.

  19. #19
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Si elle ne te sert pas ailleurs supprime là, c'est juste que tu déclare deux fois la variable t donc le compilateur aime pas.

    Cet algorithme, es-ce toi qui l'a fait, où est-ce que c'est un algorithme d'un exercice, ou un algorithme connu ?

    J'aimerais bien lire ce qu'il doit faire en détail.

    C'est surtout que avec ta variable max, il y aura des bout de ta clé qui seront indéterminé. Je ne vois pas son utilité.

  20. #20
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 10
    Points : 2
    Points
    2
    Par défaut
    C'est moi qui ait fait cette algo. Ça fait à peine une semaine que j'ai découvert le C, le C++ et d'autre langages. C'est pour ça que je suis mauvais mais bon, j'essaye de m'exercer. Je vais tester j’espère que ça va marcher. Je te tiens au courant.

Discussions similaires

  1. Réponses: 2
    Dernier message: 15/03/2006, 10h13
  2. Comment enregistrer une string dans un fichier
    Par Dnx dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 23/09/2005, 14h52
  3. Réponses: 12
    Dernier message: 27/06/2005, 19h06
  4. Concaténation d'une variable dans une commande
    Par dreamanoir dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 10/03/2005, 17h08
  5. Réponses: 6
    Dernier message: 24/07/2003, 12h39

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