Petit probléme (substr)
Résolu
Arkapiro
Messages postés
6
Date d'inscription
Statut
Membre
Dernière intervention
-
Arkapiro Messages postés 6 Date d'inscription Statut Membre Dernière intervention -
Arkapiro Messages postés 6 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
J'ai commencé à apprendre le C++ il y a peu de temps. En essayant de résoudre un problème informatique je suis tombé sur une impasse. Je ne comprend pas d'où viens le problème. C'est pour cela que vous demande votre aide !
Voici la partie du code qui pose un problème :
De plus, je serais heureux d'entendre tout conseil (Si vous en avez) pour améliorez mon style de code !
Merci d'avance !
J'ai commencé à apprendre le C++ il y a peu de temps. En essayant de résoudre un problème informatique je suis tombé sur une impasse. Je ne comprend pas d'où viens le problème. C'est pour cela que vous demande votre aide !
Voici la partie du code qui pose un problème :
for(int compteur(0); compteur < suite.size()+1; compteur++)
{
if(suite.substr(compteur, 1) != (suite.substr(compteur + 1, 1)))
{
verification ++;
}
}
De plus, je serais heureux d'entendre tout conseil (Si vous en avez) pour améliorez mon style de code !
Merci d'avance !
A voir également:
- Petit probléme (substr)
- Trier du plus petit au plus grand excel - Guide
- Petit 3 ✓ - Forum Word
- Petit 2 ✓ - Forum Windows
- Petit 9 - Forum Mail
- Comment imprimer une photo en petit ✓ - Forum Photo numérique
2 réponses
Bonjour,
il vaudrait mieux écrire
C'est dommage de calculer à chaque fois la somme +1 alors que suite.size() conserve toujours la même valeur, il vaudrait mieux avoir
De plus je doute que ce soit réellement
Ici tu fais un substring de taille 1, tu récupères donc 1 seul caractère, il aurait donc été plus judicieux de faire un
Dans le dernier cas de la boucle (avec compteur==suite.size()) tu essayes de récupérer le caractère à la position
Tu dois arrêter ta boucle plus tôt sinon tu vas déborder.
Pour résumer :
Remarque : on peut encore faire un petit peu mieux, car compteur+1 calcules l'entier suivant, ce que fait aussi compteur++. aire deux fois le même calcul c'est une de trop.
NB. Je n'ai pas vérifié ces codes.
-
int compteur(0);
il vaudrait mieux écrire
int compteur=0;car la notation
compteur(0)est associée de la notion d'objet et de constructeur alors que
intest un type primitif.
-
compteur < suite.size()+1
C'est dommage de calculer à chaque fois la somme +1 alors que suite.size() conserve toujours la même valeur, il vaudrait mieux avoir
compteur < navec
int n = suite.size()+1calculé une seule fois.
De plus je doute que ce soit réellement
+1à mon avis ce sera
-1, j'y reviendrais.
-
suite.substr(compteur, 1)
Ici tu fais un substring de taille 1, tu récupères donc 1 seul caractère, il aurait donc été plus judicieux de faire un
suite[compteur]pour avoir directement le caractère voulu.
-
suite.substr(compteur + 1, 1)
Dans le dernier cas de la boucle (avec compteur==suite.size()) tu essayes de récupérer le caractère à la position
suite.size()+1alors que les caractères vont de 0 à
suite.size()-1...
Tu dois arrêter ta boucle plus tôt sinon tu vas déborder.
- Les accolades sont facultatives lorsqu'il n'y a qu'une seule instruction.
Pour résumer :
for (int compteur=0, limite=suite.size()-1; compteur<limite; compteur++) if (suite[compteur] != suite[compteur+1]) verification++;
Remarque : on peut encore faire un petit peu mieux, car compteur+1 calcules l'entier suivant, ce que fait aussi compteur++. aire deux fois le même calcul c'est une de trop.
for (int compteur=0, limite=suite.size()-1; compteur < limite; ) if (suite[compteur] != suite[++compteur]) verification++;
NB. Je n'ai pas vérifié ces codes.
Le problème venait de la chaine for :
Dans cette partie de code :
je ne comprends néanmoins (même si cela fonctionne) comment fonctionne la première ligne :
Et Je me demandais pourquoi on doit écrire : suite[++compteur] et pas : suite[compteur++]
Merci encore pour votre aide !
La boucle for fonctionne de cette manière :
Ici, instruction d'initialisation :
condition de continuation :
instruction d'incrément : aucune
À cause de l'ordre qu'il y a entre les deux opérations de retour de la valeur courante et de l'incrément de la valeur, qui est différente entre ces deux écritures.
Tu peux le faire avec replace (en remplaçant le caractère que tu veux par une chaîne vide)
http://www.cplusplus.com/reference/string/string/replace/
Ou alors avec deux substr (avant et après le caractère) que tu concatènes.
http://www.cplusplus.com/reference/string/string/substr/
Juste un dernier point, dans la boucle for l'incrémentation est automatique si le champ est vide ? (comme dans ton exemple :
)