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 :
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 :
1 2
| tabNotes[i] = ' '
tabNotes[i + 1] = ' ' |
Le programme tourne ainsi en boucle. J'ai tenté un :
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.
Partager