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 :

"reboucher" un array après x suppressions de doublons


Sujet :

C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2013
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 15
    Points : 14
    Points
    14
    Par défaut "reboucher" un array après x suppressions de doublons
    Bonjour,

    Je travaille sur un petit exercice et je bute à un endroit. Celui-ci consiste à supprimer dans un tableau les valeurs en doubles. Ainsi :

    [a][b][b][c] deviendra successivement

    [a][][][c]

    [a][c]

    Décaler les valeurs d'un tableau vers la gauche ou vers la droite lorsqu'un seul vide est présent, je sais faire, mais lorsqu'il y a x vides c'est différent. Je pense qu'il faut passer par un while mais je bute un peu sur la condition.

    Il faudrait très certainement faire quelque chose du genre :
    Tant que case vide
    alors décaler vers la gauche

    J'ai tenté de mettre en application cet algorithme sans succès...

    Des indices pour m'aider ?

    Merci à vous

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Salut,

    l'idée c'est d'avoir 2 indices : un qui parcourt le tableau, un qui indique à quel endroit tu es en train de replacer le prochain élément
    partant de là, une simple boucle de parcours suffit
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mars 2011
    Messages
    94
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 94
    Points : 122
    Points
    122
    Par défaut
    Est-ce que tu as commencé à faire quelque chose ? Montre-nous ton bout de code histoire qu'on puisse t'aider

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2013
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 15
    Points : 14
    Points
    14
    Par défaut
    Salut,

    Désolé du retard et merci pour l'aide apportée . J'ai fais une petite pause. J'ai fais le code suivant qui semble marcher :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int iPlace = i;
    for(int iDecale = i; iDecale < (int)tabNotes.length();iDecale++){
        if(tabNotes[iDecale] != ' '){
            tabNotes[iPlace] = tabNotes[iDecale];
            tabNotes[iDecale] = ' ';
            iPlace++;   
        }
    }
    Je ne me suis pas encore posé la question de savoir si c'était optimisable ^^

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2013
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 15
    Points : 14
    Points
    14
    Par défaut
    Re,

    Je vais vous exposer l'énoncé. Il sera ainsi plus facile pour vous de comprendre et de m'aider. Il faut noter que l'idée est d'utiliser le moins possible les fonctions existantes de C++.

    Ce que doit faire votre programme :

    Les notes de musiques sont représentées par les lettres 'a', 'b', 'c', 'd', 'e', 'f' et 'g'.

    Votre programme doit lire une seule ligne de texte représentant le morceau de musique (composé de moins de 500 notes) et doit afficher la version du morceau "corrigée" où tous les doublons sont supprimés tant qu'il en existe.
    EXEMPLE

    entrée :

    baaabbacddc

    sortie :

    b

    COMMENTAIRES

    Sur l'exemple donné une suite possible d'élimination des doublons est la suivante :

    baaabbacddc
    baaabbacc
    babbacc
    babba
    baa
    b


    Le code que j'ai actuellement :
    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
     
    int main()
    {
       string tabNotes;
       cin >> tabNotes;
       int i = 0;
       while(i < (int)tabNotes.length()) {
     
          if((tabNotes[i] == tabNotes[i + 1])){
             tabNotes[i] = ' ';
             tabNotes[i + 1] = ' ';
     
            //décalage
            int iPlace = i;
             for(int iDecale = i; iDecale < (int)tabNotes.length();iDecale++){
                if(tabNotes[iDecale] != ' '){
                   tabNotes[iPlace] = tabNotes[iDecale];
                   tabNotes[iDecale] = ' ';
                   iPlace++;   
                }
             }
          }
          else{
             i++;
          }
       }
       cout << tabNotes;
    }
    Celui-ci est incorrect car la taille du tableau ne diminue pas avec le décalage, ainsi il arrive un moment où ma première condition est toujours vérifiée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    tabNotes[i] = ' '
    tabNotes[i + 1] = ' '
    Le programme tourne ainsi en boucle. J'ai tenté un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tabNotes.erase(remove(tabNotes.begin(),tabNotes.end(),' '),tabNotes.end());
    Oui, j'ai triché

    Sans succès. Je suis sans doute parti dans la mauvaise direction dès la conception du programme. Mon idée principale étant :

    Si 2 lettres similaires:
    - suppression des lettres similaires
    - reboucher trou du tableau
    - revérification à partir de la première lettre de la paire similaire découverte
    etc.

  6. #6
    Expert confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Points : 4 442
    Points
    4 442
    Par défaut
    Il faut que tu te balade sur ton tableau avec 2 indices : un qui sert à la lecture pour découvrir les doublons, et un en écriture pour copier les caractères au bon endroit.
    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
    std::string str;
    int lec = 0, ecr = 0; // les deux indices
    while(lec < str.size() - 1) {
        if(str[lec] == str[lec+1]) { // si doublon
            lec += 2; // on le passe
        }
        else {
            if(ecr < lec) { // copie inutile si lec == ecr
                str[ecr] = str[lec]; // sinon on copie le caractere
            }
            ++ecr;
            ++lec; // et on passe au caractère suivant
        }
    }
    str.resize(ecr); // la fin du string est inutile, ce qui nous intéresse c'est le début sur lequel on à travaillé
    Ça représente une passe, il faut exécuter ça en boucle jusqu’à ce que plus rien ne change.

    Il est inutile de faire ça en 2 étapes : changer les pairs en espaces puis les supprimer.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2013
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 15
    Points : 14
    Points
    14
    Par défaut
    Salut,

    Merci pour ces conseils. je vais tenter de résoudre mon exercice avec ça !

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