Aidez moi à comprendre

a marqué ce sujet comme résolu.

Je ne sais pas exactement ce que tu veux que je te disent sur le sujet

Aigle-Royal

J’essaie de comprendre les points de blocage. Et donc de comprendre ta démarche, ton raisonnement, quand tu as lu ce sujet.

Oublie pour le moment la solution proposée. Le probleme des solutions, c’est que ça peut bloquer les gens, qu’ils se disent "je saurais pas écrire cette solution". Il est important d’oser proposer ses propres solutions, même si elles sont moins bien, ou même ne marchent pas.

Le principal est d’essayer de proposer une solution, peu importe la qualité de la réponse, du moment que cela vient de toi.

Pour entrer dans le détail…

Allez, un exercice plus dur, pour vous forger le caractère.

Comment as tu pris cette phrase ? Est-ce que le "plus dur" t’a motivé ou au contraire t’a fait peur ? Ou rien ?

Le but est de reproduire une fonction qui existe dans de nombreux autres langages, comme C# ou Python, et qui permet de supprimer les espaces, au début et à la fin d’une chaîne de caractères.

En lisant cette phrase, as tu compris le but de l’exercice, en terme de résultat attendu ? As tu réussit a imaginer le type de chaîne que tu aurais a traiter et le résultat attendu ?

A ce point, une chose qui peut aider, c’est d’écrire des tests qui permettent de vérifier que le code écrit fait correctement le travail demandée. (C’est ce que l’on appelle le développement orientée par les tests, ou TDD). C’est a dire savoir écrire ce genre de code :

chaîne testée = "hello world"
résultat attendu = ...
test(chaîne testée == résultat attendu)

chaîne testée = "   hello world"
résultat attendu = ...
test(chaîne testée == résultat attendu)

J’ai écrit en pseudo code. Saurais tu compléter les parties "résultat attendu" ? Et ajouter d’autres tests ?

C’est généralement la première étape : avoir une idée du résultat attendu, en fonction des données qui sont données.

Pour aller plus loin, saurais tu écrire le code C++ correspondant a ces tests ? (sans le code qui réalise cette tache, juste les test). Pour la comparaison proprement dit, un simple std::cout est suffisant ici.

A ce stade de la lecture de l’énoncé, on peut déjà penser a une solution (je rappelle que pour le moment, on a lu que les 2 premières phrases de l’énoncé). Si tu avais a résoudre ce probleme sur papier, pourrais tu expliquer (en français pseudo code, pas en vrai code C++) étape par étape comment tu ferais pour résoudre cet exercice. Utilise que des fonctionnalités simple, comme "je prend le premier caractère, je regarde si c’est un espace, etc". Ou alors, si tu penses a une solution dans un autre langage, c’est bon aussi. Le principal est d’avoir une idée de solution.

On va commencer avec ces questions pour le moment.


c’est au début du cours ça ? Je m’attendai à parcourir la chaine avec un for et à tester caractère par caractère si on est sur un espace afin de reconstituer la chaine sans.

DonKnacki

Tout dépend de quel est le but cherchée. Ce cours se concentre sur ce qu’on attend d’un vrai dev C++. Or, si tu regarde des solutions proposées sur StackOverflow, c’est des solutions avec des algorithmes de la bibliotheque standard. Par exemple https://stackoverflow.com/questions/216823/how-to-trim-an-stdstring ou https://stackoverflow.com/questions/83439/remove-spaces-from-stdstring-in-c

Tu m’écris une telle boucle for pour faire cette tache au boulot, je refuse tout simplement ton code. Ce que j’attend, c’est pas un dev qui sache réécrire un algo a coup de boucle for, mais quelqu’un qui fera des recherches pour savoir s’il existe déjà une solution (boost::trim, QString::trim, etc). Savoir réécrire l’algo a la main, c’est la dernière solution attendue.

C’est l’une des grosses critiques par rapport a l’apprentissage de la programmation avec une approche historique (= en général, apprendre le C en premier). Comme le C est un langage assez pauvre, ça donne l’habitude de tout réécrire a la main. Ce qui n’est pas ce qu’on attend d’un dev. Il faut normalement apprendre ensuite des langages plus haut niveau et bien expliquer aux apprenants que l’on attend pas une solution "comme on ferait en C" dans les autres langages. On veut utiliser les outils disponibles dans les autres langages.

Cela ne veut pas dire en soi que c’est mal de proposer un telle solution. C’est bien d’avoir un début de solution, même en C. Mais le but du cours est justement d’aller plus loin. Beaucoup de débutants (et parfois des personnes moins débutant) pensent que connaitre le C++, c’est de connaitre la syntaxe pour écrire des algos a la main (for, if, etc). Mais connaitre le C++, c’est savoir écrire des boucles for, savoir utiliser les outils proposés et savoir choisir correctement la bonne approche.

(Et c’est pour ça que pas mal d’école d’info "pisseuse de code" sont mauvaises et a éviter)


Concernant l’exercice détaillé ci dessus, le vocabulaire utilisé n’aide pas à comprendre ce qu’on fait.

etherpin

Je pense pas que ce soit le probleme. Ni un probleme. Le probleme est en amont, parce qu’il n’a pas pu proposer un début de solution sans lire la solution. Et je pense pas que le vocabulaire choisi soit un probleme ici.

Personnellement, si je voulais apprendre C++, je n’utiliserais pas ce tutoriel, car à mon goût, il est bien trop bavard et ne présente pas une progression qui me convienne.

J’utiliserais le parcours proposé ici : http://www.france-ioi.org/algo/chapters.php en choisissant C++, ce qui correspond à ton projet. C’est très progressif, on tient compte des erreurs les plus fréquentes, et il y a beaucoup d’explications.

etherpin

Il n’y a pas de cours parfait, chaque apprenant a ses propres motivations, aucun cours ne peut satisfaire tout le monde.

Mais cf ce que j’expliquais juste avant. Ou cette récent discussion sur OC : https://openclassrooms.com/forum/sujet/baisser-lutilisation-memoire-de-mon-code. Le probleme d’un site comme france-ioi, c’est que cela s’intéresse qu’a la solution, pas la qualité du code. Ecrire des boucles for "comme en C" est tout a fait acceptable sur france-ioi. Et même d’écrire du C est acceptable dans un cours de C++ (cf la solution proposée dans OC). Personne ne dit a un moment "ta solution n’est pas celle qu’on attend d’un dev C++".

Et cela fait donc des lacunes dans l’apprentissage du C++, parce qu’on apprend pas a utiliser correctement le langage et ses outils.

Ça peut être un outil intéressant quand on veut justement bosser sur les syntaxes des boucles, conditions, etc. Et pratiquer l’algorithmique. Mais pour l’apprentissage correct d’un langage, c’est pas un site que je recommande.

+3 -1

c’est au début du cours ça ? Je m’attendai à parcourir la chaine avec un for et à tester caractère par caractère si on est sur un espace afin de reconstituer la chaine sans.

DonKnacki

Non, c’est à la fin au chapitre 8 de la première partie : "Le début du voyage".
Il y a 2 exercices : Palindrome et Couper une chaîne.
Il n’y a pas d’exercice avnt cela, mais quelques exemples. Noter qu’on est censé avoir "lu"
l’introduction à la programmation (ici, encore une incohérence, ce contenu s’intitule ne fait "Les bases de la programmation"). =====================================================================================================

@gbdivers

Tu écris "Ce cours se concentre sur ce qu’on attend d’un vrai dev C++.". C’est vraisemblable. Mais si tu lis l’introduction, l’objectif est très différent.

Bienvenue dans ce cours sur l’apprentissage de la programmation avec le langage C++. Vous débutez complètement et n’avez qu’une vague idée de ce que peut bien être la programmation ? On vous a dit d’en apprendre plus sur le C++ ? Alors ce tutoriel est fait pour vous.

On voit bien que cet objectif ne peut être atteint. On ne peut pas apprendre à nager en sautant dans le grand bain. Les promesses de cette introduction ne sont pas tenues.

Je continue à penser que ce tutoriel ne convient pas du tout à Aigle-Royal, et je pense que son objectif n’est pas de devenir un professionnel du codage en C++ moderne.

=======================================================================================================

@adri1

Tu mets un pouce rouge, mais tu n’expliques pas en quoi mon message n’est pas convenable. Cela ne me permet pas de reconsidérer ma position.

+0 -0

Tu écris "Ce cours se concentre sur ce qu’on attend d’un vrai dev C++.". C’est vraisemblable. Mais si tu lis l’introduction, l’objectif est très différent.

etherpin

Je précise : ce cous n’a pas pour objectif de partir de 0 et de former un dev C++ professionel. Il faudrait un cours beaucoup plus long que celui la. C’est juste les bases.

Mais le but est bien de donner des bases solides, en evitant les problemes que j’ai citee par rapport aux autres cours C++ (en particulier ceux avec une approche historique). Pour cela que ca parle de bibliotheque standard, que les pointeurs ne sont pas vu au debut, etc.

J’ai expliqué en detail ces problemes, libre a chacun ensuite de faire ses propres choix.

Et comme on est HS par rapport au PO, je vais me concentrer sur lui par la suite. N’hesite pas a ouvrir une nouvelle discussion si tu veux parler de ce que tu attends d’un cours C++.

+1 -0

Allez, un exercice plus dur, pour vous forger le caractère.

Comment as tu pris cette phrase ? Est-ce que le "plus dur" t’a motivé ou au contraire t’a fait peur ? Ou rien ? IL ne m’a pas fait peur en faite il ne ma rien fait mais je savais que l’exercice serrai plus dur du à cette phrase.

Le but est de reproduire une fonction qui existe dans de nombreux autres langages, comme C# ou Python, et qui permet de supprimer les espaces, au début et à la fin d’une chaîne de caractères.

En lisant cette phrase, as tu compris le but de l’exercice, en terme de résultat attendu ? As tu réussit a imaginer le type de chaîne que tu aurais a traiter et le résultat attendu ? J’ai compris le but attendu mais par contre je ne pouvais pas imaginé comment faire avec les connaissances qui se trouve sur le site, je n’arrivais pas à voir comment faire pour mettre en code cela avec les itérateurs et algorithme car je pense que le site ne donne pas assez de détails pour un débutant comme moi ou pas assez d’exemples pour bien assimilé le sujet.

A ce point, une chose qui peut aider, c’est d’écrire des tests qui permettent de vérifier que le code écrit fait correctement le travail demandée. (C’est ce que l’on appelle le développement orientée par les tests, ou TDD). C’est a dire savoir écrire ce genre de code :

chaîne testée = "hello world"
résultat attendu = hello world
test(chaîne testée == résultat attendu)

chaîne testée = "   hello world"
résultat attendu =   hello world
test(chaîne testée == résultat attendu)

chaîne testée = "Hello world" résultat attendu = hello word test (chaîne testée NOT résultat attendu)

std::string chaîne testée = "hello world"; std::string résultat attendu = hello world; if (chaîne testée == résultat attendu) { chaine testée =" hello world"; résultat attendu = hello world"; if (chaîne testée == résultat attendu) { chaîne testée ="Hello world"; résultat attendu ="hello world"; if (chaîne testée != résultat attendu) { //instruction } } }


J'ai écrit en pseudo code. Saurais tu compléter les parties "résultat attendu" ? Et ajouter d'autres tests ? 
bien que j'ai appris le pseudo code je ne comprends pas très bien ce que tu attend de moi dans ce pseudo code , et pour ce qui est de la partie test(chaîne testée == résultat attendu) je ne comprends pas trop bien ce que fais cette ligne mais je suppose que cela veux dire test le code si chaîne testée est égale à résultat attendu et ensuite passer à l'autre partie ou il et fait un second test la j'ai écris ce que je pense être un second test par à port à ce que tu attend j'espère avoir bien compris ce que tu me demande.

**C'est généralement la première étape : avoir une idée du résultat attendu, en fonction des données qui sont données.**

Pour aller plus loin, saurais tu écrire le code C++ correspondant a ces tests ? (sans le code qui réalise cette tache, juste les test). Pour la comparaison proprement dit, un simple `std::cout` est suffisant ici.
c'est fait.

A ce stade de la lecture de l’énoncé, on peut déjà penser a une solution (je rappelle que pour le moment, on a lu que les 2 premières phrases de l’énoncé). Si tu avais a résoudre ce probleme sur papier, pourrais tu expliquer (en français pseudo code, pas en vrai code C++) étape par étape comment tu ferais pour résoudre cet exercice. Utilise que des fonctionnalités simple, comme "je prend le premier caractère, je regarde si c’est un espace, etc". Ou alors, si tu penses a une solution dans un autre langage, c’est bon aussi. Le principal est d’avoir une idée de solution.

On va commencer avec ces questions pour le moment.

Je déclares une variable chaîne de caractères qui porte le nom chaîne testée et j’ajoute hello world dans cette variable je déclares une autre variable chaîne de caractères qui porte le nom résultat attendu et j’ajoute hello world aussi je test si chaîne testée est égale à résultat attendu) si oui je passe au instruction suivante sinon je n’effectue pas ce qui ce trouve dans le test mais j’effectue ce qui ce trouve en dehors du test.

Ensuite si vrais j’ajoute à chaîne testée la valeur " hello world" avec des espaces cette fois-ci. ensuite je passe à la ligne suivante et j’ajoute à la variable résultat attendu la même valeur puis je passe à la ligne suivante et j’effectue un second test qui va tester si la chaîne testée est égale à la variable résultat attendu) si vrais alors j’effectue les instruction suivante ce trouvant dans le test sinon j’effectue les instruction suivante en dehors du test

si vrais alors j’effectue la partie que j’ai écrite : je prend chaîne testée et je lui ajouts la valeur "Hello world" avec un H majuscule cette fois-ci je passe à la ligne suivante et j’ajoute à la variable résultat attendu une autre valeur "hello world" avec un h minuscule cette fois-ci. ensuite je passe à la ligne suivante et la je test si la chaîne testée n’est pas égale à résultat attendu) si vrais alors j’effectue les instruction suivante sinon j’effectue les instruction suivante en dehors du test.

Voila j’espère avoir compris ce que tu me demande .

je te souhaite une bonne soirée et encore merci de te pencher sur mon cas , une personne à l’écoute des faiblesse de l’autre pour s’améliorer est une grande qualité à bientôt.

+0 -0

(edite ton message, la mise en forme est complétement illisible :) )

gbdivers

Ah ok désolé j’avais pas vu que c’était illisible.


std::string chaîne testée = "hello world"; 
std::string résultat attendu = "hello world"; 

if (chaîne testée == résultat attendu) 
{ 
   chaine testée ="   hello world"; 
   résultat attendu = "   hello world"; 
   if (chaîne testée == résultat attendu) 
   { 
       chaîne testée ="Hello world"; 
       résultat attendu ="hello world"; 
       if (chaîne testée != résultat attendu) 
       { 
          //instruction } 
       }
   }
} 

Je déclares une variable chaîne de caractères qui porte le nom chaîne testée et j’ajoute hello world dans cette variable je déclares une autre variable chaîne de caractères qui porte le nom résultat attendu et j’ajoute hello world aussi je test si chaîne testée est égale à résultat attendu) si oui je passe au instruction suivante sinon je n’effectue pas ce qui ce trouve dans le test mais j’effectue ce qui ce trouve en dehors du test.

Ensuite si vrais j’ajoute à chaîne testée la valeur " hello world" avec des espaces cette fois-ci. ensuite je passe à la ligne suivante et j’ajoute à la variable résultat attendu la même valeur puis je passe à la ligne suivante et j’effectue un second test qui va tester si la chaîne testée est égale à la variable résultat attendu) si vrais alors j’effectue les instruction suivante ce trouvant dans le test sinon j’effectue les instruction suivante en dehors du test

si vrais alors j’effectue la partie que j’ai écrite : je prend chaîne testée et je lui ajouts la valeur "Hello world" avec un H majuscule cette fois-ci je passe à la ligne suivante et j’ajoute à la variable résultat attendu une autre valeur "hello world" avec un h minuscule cette fois-ci. ensuite je passe à la ligne suivante et la je test si la chaîne testée n’est pas égale à résultat attendu) si vrais alors j’effectue les instruction suivante sinon j’effectue les instruction suivante en dehors du test.

Pour répondre à la personne qui juge que je ne veux pas devenir un Dev pro je l’inviterai à ne pas jugé car il ne sais pas ce qu’il dit mon objectif est de maîtriser le c++ et d’autres langages encore je suis juste encore débutant donc un peu d’indulgence merci !

Ps: j’espère que c’est plus lisible maintenant.

+0 -0

Rapelles-toi que Google est ton ami

J’ai fait une recherche avec:

c++ efface sous string

Il faut bien avoir un peu d’imagination …

J’ai trouvé ce site:

Supprimer les espaces de début et de fin d’une chaîne en C++.

J’ai donc écrit le code suivant:

#include <iostream>
#include <string>
 
int main(void) {
    std::string hello { "+ Hello +" };
    size_t first = hello.find_first_not_of(" +");
    std::cout << first << std::endl;
     size_t none = hello.find_first_not_of(hello);
    std::cout << none << std::endl;
    if(none == std::string::npos)
        std::cout << "Rien d'autre dans la chaine" << std::endl;
    size_t last = hello.find_last_not_of(" +");
    std::cout << last << std::endl;
    hello.erase(last+1, hello.size()-last);
    std::cout << "*" << hello << "*" << std::endl;
    hello.erase(0, first);
    std::cout << "*" << hello << "*" << std::endl;
}

Qui donne le résultat:

2                                                                                                                       
18446744073709551615                                                                                                    
Rien d'autre dans la chaine                                                                                             
6                                                                                                                       
*+ Hello*                                                                                                               
*Hello*                                                                                                                  

C’est un peu plus court que ce que tu imaginais?

+0 -0

Voila j’espère avoir compris ce que tu me demande .

Aigle-Royal

Désolé, je n’ai pas été assez clair sur le type de test que je te demandais. C’est des tests qui permettent de vérifier que l’exercice demandé est correctement effectué. Plus précisément cette partie de l’énoncé dans un premier temps :

et qui permet de supprimer les espaces, au début et à la fin d’une chaîne de caractères.

Si par exemple, je donne la chaine en entrée :

"   hello world"

Quel est le résultat attendu ?

+0 -0

Voila j’espère avoir compris ce que tu me demande .

Aigle-Royal

Désolé, je n’ai pas été assez clair sur le type de test que je te demandais. C’est des tests qui permettent de vérifier que l’exercice demandé est correctement effectué. Plus précisément cette partie de l’énoncé dans un premier temps :

et qui permet de supprimer les espaces, au début et à la fin d’une chaîne de caractères.

Si par exemple, je donne la chaine en entrée :

"   hello world"

Quel est le résultat attendu ?

gbdivers

le résultat attend c’est qu’il va supprimer les espaces avant hello world. et normalement les espaces aussi après world mais vu qu’il n’y à pas d’espace il va juste supprimer les espaces avant hello world.

+1 -0

Très bien.

Le but d’un test, c’est de vérifier si le code que l’on a écrit fait correctement ce qu’on attend de lui. Pour faire ultra simple, ca revient à écrire (exemple en C++) :

int main() {
    // test 1
    // on initialise les variables
    const std::string input { "   hello" };
    const std::string expected { "hello" };

    // on écrit ici le code qui réalise la tâche
    const std::string output { le_code_a_ecrire(input) };

    // on teste si le code que l'on a écrit remplit bien sa tâche
    if (output == expected)
        std::cout << "le test passe." << std::endl;
    else
        std::cout << "le test échoue !!!" << std::endl;
}

(Bien sûr, dans un vrai code, on utilisera des vrais outils de tests. C’est pour montrer l’idée).

Dans ton code précédent, tu avais écris :

chaine testée ="   hello world"; 
résultat attendu = "   hello world"; 

Ce qui n’est pas le résultat attendu. Tu as compris ce point ?

Peux tu compléter ce code pour ajouter d’autres tests ? (Par exemple, on aime tester des cas limites : une chaine vide, une chaine qui est déjà correcte, une chaine avec que des espaces, une chaine avec des espaces devant, etc)

Le but de te faire écrire ces tests est de t’aider a bien clarifier ce qui est attendu.


L’étape suivante est de réfléchir à comment résoudre cette tâche de supprimer les espaces. Pas en C++, juste une idée, rédigé en français. Explique par exemple pour chacune de ces chaines comment tu ferais :

"hello"`
" hello"
"  hello"
+1 -0

Deux aspects avec ce type d’exercices:

  1. comprendre la logique pour travailler sur les données et les transformer
  2. transposer dans la syntaxe barbare des algos standards du C++ < 20, ou un chouilla moins barbare du C++20 (pas montrée sur le cours de ZdS), ou dans d’autres langages comme Python, etc.

Pour le point 2., il est nécessaire d’avoir quelques bases en algorithmie je pense. Et ensuite, un vrai cours avec vrai prof fera la différence pour animer l’application d’algorithmes avec itérateurs et algos standard du C++. Sans ça, il faut faire la démarche soi-même pour animer ce qu’il se passe. Et par animer, j’entends faire des dessins (avec paier+crayon), schémas dans un formalisme qui nous parle et effacer, gribouiller, écrire par dessus pour changer des valeur dans des cases, "déplacer" des flèches, etc.

Pour une première représentation des sites comme https://hackingcpp.com/ peuvent vraiment aider.

Pour le point 1. il faut… faire des katas. Des exos et encore des exo d’algorithmie pour que la chose devienne naturelle. Pour se familiariser avec des structures plus complexes, etc.

france-ioi a été cité. Autant il sera très bien pour travailler le point 1. Autant il sera exécrable pour apprendre à le travailler en C++ tel qu’on l’attend. Les corrections données sont mauvaises d’un point de vue langage C++. Ou alors il faudrait peut-être systématiquement 2 niveaux: 1 premier pour quand on ne dispose de rien, et un second pour réaliser la même chose avec un algo standard du C++ — sachant que les corrections données s’arrêtent tout juste au premier niveau.

Et les exos du cours de ZdS sont directement au second niveau si mes souvenirs sont bons. Mais il ne fait pas travailler l’algorithmie.

Bref. Une démarche, qui quelque part a été la mienne.

  1. Fais des schémas. Modifie-les, jette les à la poubelles et refais les si besoin.
  2. Si tu comprends les énoncés de ce qui est attendu de toi, imagine un procédé qui transposé en schéma qui "vit" finit bien par donner ce qui est attendu
  3. Comprends comment les outils du C++ altèrent ces schémas (-> comprendre comment se transposent les itérateurs, les index… ; et -> comprendre ce que font les divers algos standards)
  4. Applique les algos standards sur les données dont tu disposes pour résoudre les problèmes auxquels tu fais face.

Bonjour à tous, veuillez m’excusez pour la réponse tardive non pas que je vous ait oublié mais j’ai décidé de reprendre le cours à zéro, ce que j’ai fais et j’ai réussi à faire tout les exercices demander à un détails près , cependant me revoici dans les exercices de itérateurs , et pareillement je n’arrive pas à faire les exercices demander, non pas que je ne comprenne pas ce qu’on me demande j’ai bien compris ce qu’on demande dans les exercices, mais je n’arrive pas à retransférer cela en code, j’ai fais un premier essais avec ce que je pensais être juste mais cela ne fonctionne pas j’ai des erreurs de syntaxe et surement de logique aussi…

Je vous montre quand même ce que j’ai essayé de faire.


#include <iostream>
#include <functional>
#include <string>
#include <cctype>

int main()
{
    //Déclaration d'une chaîne de caractères avec espace et tabulation et retour à la ligne.
    std::string chaine_cara {"Bonjour comment allez-vous \t Aujourd'hui \n bien et vous ? "};

    //Supprimer tout les espaces d'une chaîne de caractères.
    while(true)
    {
       auto espace = std::find_if_not(std::begin(chaine_cara),std::end(chaine_cara),isspace);
       
       espace.erase(std::begin(chaine_cara),std::end(chaine_cara));

       std::cout << espace <<std::endl;
    }
}

Comme je l’ais mentionné ce code ne fonctionne pas mais vous verrez peut-être ma façon de faire et ma logique … j’ai du regarder la solution encore une fois cette fois-ci car je n’y suis pas arrivé, je comprends la solution mais ce que je n’arrive pas à comprendre c’est comment mettre tout cela en code..

J’ai bien pris note qu’il me faut aussi regarder le codes d’autre programmeur , me documenter etc, c’est ce que je compte faire, mais quelle site avez vous à me proposé pour poussé mon apprentissage du c++, j’ai aussi un livre papier que j’ai acheté il y à quelques temps il s’agit du livre de Claude Delannoy "programmer en c++ 9 édition" cette édition est dépasse maintenant il y en à une autre (je pense l’acheté aussi).

Donc voila.

Je vous remercie pour votre aide, et vos réponses…

Passez une bonne journée /soirée. et à bientôt

+0 -0

(Salut)

EDIT: Ignorer ce qui est après la ligne, j’avais lu beaucoup beaucoup trop vite. Mea culpa! Je garde pour "historique", mais le PS reste valide.

Ici il y a 3 soucis.

  • ce n’est pas un while(true) qu’il faut: comment savoir quand s’arrêter? Il faut pouvoir exprimer le quand il n’y a plus d’espaces on s’arrête
  • il y a des subtilités syntaxiques héritées du C avec std::isspace (un problème pourri pas pour débutant. :( -> passer un foncteur qui appelle std::ispsace à son tour)
  • erase s’applique sur la std::string, pas sur un itérateur. -> https://en.cppreference.com/w/cpp/string/basic_string/erase

L’algo si valide à la condition de fin oubliée, n’est pas optimal et en vrai on utilisera ici l’idiome erase+remove (et sur des vecteur C++20, on aurait eu droit à std::vector::remove(). Visiblement, personne n’a pensé à proposer au comité l’algo manquant dans std::string)


Hum… cela fait plusieurs fois que je te vois bien aimer rajouter des boucles. Pour moi cela n’a aucun sens dans les contextes où tu les emploies. Pourrais-tu nous retranscire en français :

  1. ce que tu penses avoir/avoir-voulu exprimé/er en C++?
  2. ce que veux dire while pour toi? Que cela soit en anglais, comme dans un contexte langage de programmation?

Et aussi, Qui? Ou "où" as-tu trouver tes ces whiles que tu aimes rajouter dans tes codes? (mélange de codes sources?)

PS: les bouquins de l’auteur que tu cites sont connus pour avoir une approche historique (on apprend à tailler des silex avant de faire cuire des oeufs dans une poêle). Maintenant, il va totalement esquiver les algos standards qui sont mis en avant dans le cours de ZdS. Et pour le coup tu vas avoir des boucles au lieu d’appeler des fonctions qui font (elles) des boucles en interne. (Ce (historique) qui fait que l’auteur a mauvaise presse dans les communautés C++ en ligne)

PPS: ta propension à rajouter des boucles est pour moi le mystère numéro 1, que si on arrive à le résoudre, je soupçonne que cela nous donnerait une petite chance de te faire progresser.

Comme je l’ais mentionné ce code ne fonctionne pas mais vous verrez peut-être ma façon de faire et ma logique … j’ai du regarder la solution encore une fois cette fois-ci car je n’y suis pas arrivé, je comprends la solution mais ce que je n’arrive pas à comprendre c’est comment mettre tout cela en code..

Aigle-Royal

Pour que tout le monde puisse t’aider, ce serait mieux :

  • de donner le texte de l’exercice
  • d’écrire plus précisément ce qui ne marche pas. On ne va pas t’aider juste avec "ce code ne fonctionne pas".

Par exemple, si tu as des messages d’erreur, il faut nous les donner.
Si c’est un problème de syntaxe, ça ne devrait pas être très compliqué à régler.
Si le programme ne fait pas ce que tu veux, il faut que tu aies une idée claire de ce que tu veux, puis te demander pourquoi le programme fait autre chose.

+1 -0

Bonsoir lmghs : Alors pour être honnête avec toi je me souviens plus ou j’avais vu l’emploie de la boucle while(true) qui veut dire tant que vrais. ce qui veux dire que cela va être une boucle infinie… par ailleurs ce que j’ai essayé de faire c’est de boucle tant que il trouve des espaces tabulation dans mon code c’est ce que j’ai voulu réaliser. Ok merci pour les infos du bouquin mais du coup quelle bouquin en français je pourrais utilisé pour apprendre à m’améliorer et avancé dans le c++ ?

Bonsoir Etherpin : Alor le texte de l’exercices et le suivant :

string_trim — Suppression des espaces Allez, un exercice plus dur, pour vous forger le caractère. Le but est de reproduire une fonction qui existe dans de nombreux autres langages, comme C# ou Python, et qui permet de supprimer les espaces, au début et à la fin d’une chaîne de caractères. Cela signifie non seulement les espaces ' ' mais aussi les tabulations '\t’, les retours à la ligne '\n’, etc. Pour vous aider, vous aller avoir besoin de deux choses.

Le prédicat isspace, pour savoir si un caractère est un type d’espace ou non. L’algorithme std::find_if_not, qui permet de trouver, dans un ensemble délimité par deux itérateurs, le premier caractère qui ne respecte pas une condition. Pour vous faciliter la vie, découper l’exercice en deux. Faites d’abord la fonction permettant de supprimer tous les espaces à gauche, puis pour ceux à droite. Bon courage.

Mes erreurs sont les suivante :

PS C:\Users\badsy> cd "c:\Users\badsy\OneDrive\Bureau\Travail avec mon Amour\Cours C++\Premier programmer\" ; if (?)g++tempCodeRunnerFile.cppotempCodeRunnerFile;if(?) { g++ tempCodeRunnerFile.cpp -o tempCodeRunnerFile } ; if (?) { .\tempCodeRunnerFile } tempCodeRunnerFile.cpp:1:1: error: extended character Ôs not valid in an identifier 1 | string_trimÔuppression des espaces | tempCodeRunnerFile.cpp:1:1: error: extended character Ôs not valid in an identifier tempCodeRunnerFile.cpp:1:1: error: extended character Ôs not valid in an identifier tempCodeRunnerFile.cpp:3:18: error: stray '#' in program 3 | langages, comme C# ou Python, et qui permet de supprimer les espaces, au d├®but et ├á la fin dÔne cha├«ne de caract├¿res. Cela signifie non | tempCodeRunnerFile.cpp:3:92: error: extended character Ôs not valid in an identifier 3 | langages, comme C# ou Python, et qui permet de supprimer les espaces, au d├®but et ├á la fin dÔne cha├«ne de caract├¿res. Cela signifie non | tempCodeRunnerFile.cpp:6:62: error: extended character Ôs not valid in an identifier 6 | Le pr├®dicat isspace, pour savoir si un caract├¿re est un type dÔspace ou non. | tempCodeRunnerFile.cpp:7:1: error: extended character Ôs not valid in an identifier 7 | LÔlgorithme std::find_if_not, qui permet de trouver, dans un ensemble d├®limit├® par deux it├®rateurs, le premier caract├¿re qui ne respecte pas une condition. | tempCodeRunnerFile.cpp:8:38: error: extended character Ôs not valid in an identifier 8 | Pour vous faciliter la vie, d├®couper lÔxercice en deux. Faites dÔbord la fonction permettant de supprimer tous les espaces ├á gauche, puis pour ceux ├á droite. | tempCodeRunnerFile.cpp:8:65: error: extended character Ôs not valid in an identifier 8 | Pour vous faciliter la vie, d├®couper lÔxercice en deux. Faites dÔbord la fonction permettant de supprimer tous les espaces ├á gauche, puis pour ceux ├á droite. | tempCodeRunnerFile.cpp:1:1: error: 'string_trim\U0000200a\U00002014\U0000202fSuppression' does not name a type 1 | string_trimÔuppression des espaces | PS C:\Users\badsy\OneDrive\Bureau\Travail avec mon Amour\Cours C++\Premier programmer>

Voila.

Je vous remercie à tout les deux de m’avoir répondu aussi rapidement.

Bonne soirée.

+0 -0

Si c’est un problème de syntaxe, ça ne devrait pas être très compliqué à régler.

Pour le coup le problème de syntaxe est obscur. -> https://gcc.godbolt.org/z/1sYbKd7zs

C’est d^u au fait que std::ispace() attend des int en bonne fonction héritée du C, mais on veut l’appeler avec des char, et le coté template des algos standard fait qu’il n’y a aucune place pour des conversions implicites. (cela aurait été obscur avec std::isspace au lieu de isspace)

EDIT: décidément, il faut que j’apprenne à lire. mismatch de types. find* renvoient des positions. Pas de chaines. => lire la doc.

EDIT2: mauvais find aussi. Il ne faut pas le nier. On cherche justement un espace et pas le contraire.

PS: triples back-quotes pour partager du code & cie

PPS: j’avais écrit une grosse bêtise. cf mon EDIT dans le message précédent. Au temps pour moi.

Tu n’as pas indiqué ce que tu cherche à faire.

Je comprends que tu veux faire : Faites d’abord la fonction permettant de supprimer tous les espaces à gauche

Si 'ai bien compris :

Comm indiqué par lmghs, il ne faut pas utiliser while(true).
Ensuite, auto espace = , que vient faire ce signe =ici ? C’est plutôt auto espace { qu’il faudrait.

ensuite, il faut réviser l’utilisation de erase.

+0 -0

Disons que pour que le while(true) tienne il faudrait tester si le résultat du find_if (et pas find_if_not!) est la fin de la chaine pour sortir avec un break (si on avait un while comme le if du C++17 on pourrait faire plus propre, mais ce n’est pas le cas, du coup while(true) + break ce n’est pas si mal). Dans tous les cas, while(true) tout seul, non.

Ensuite, auto espace = , que vient faire ce signe =ici ? C’est plutôt auto espace { qu’il faudrait.

C’est très très bien auto + =. D’autant plus sur auto, les licornes ne vont rien apporter. Je partage assez cette approche, même quand les {} sauvent de conversions implicites. https://quuxplusone.github.io/blog/2019/02/18/knightmare-of-initialization/

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte