Aidez moi à comprendre

a marqué ce sujet comme résolu.

Bonsoir à tous, comment allez-vous ?

Petite question au programmeurs c++, après quelques tentative de code que je n’ai pas réussi à faire car apparemment je n’étais pas encore outillé pour faire cela j’ai continué d’avancé dans le cours mais je suis bloqué au niveau des exercices sur les itérateurs et algorithmes. je n’arrive pas à faire les exercices j’ai beau essayé de les faires je n’y arrive, pas je n’arrive pas à comprendre comment mettre en code, j’ai vraiment bcp de difficultés avec ça bien que j’ai réussi les exercices plus simples au début de l’apprentissage du c++ la je n’y arrive tout simplement pas, je regarde alors la solutions mais même en regardant la solution c’est difficile pour moi de comprendre certaines choses…

Je vous demande donc des conseils pour m’aider à résoudre mes soucis pour écrire le code, que puis-je faire pour bien comprendre pour mieux appréhender le code, pour pouvoir réussir à faire ces exercices ? L’exercices sur le quelle je bloque c’est le deuxième exercices dans les algorithmes bien que j’ai aussi bloqué un peu sur l’exercice du palindrome j’avais l’idée de le faire avec la bonne fonction mais je n’arrivais pas à voir exactement comment faire j’ai donc du regarder la solution et la j’ai compris mais le deuxième exercice plus corsé la j’y arrive pas…

Je ne suis pas du genre à décourager mais la je dois admettre que cela me montre mes limites et quand je n’y arrive pas je n’ai pas tendance à rester 1h sur l’exercices en question….

Voila dons si vous avez des astuces, des conseils à me donné je suis preneur, sur ce bonne soirée à tous et à bientôt.

+0 -0

A ton avis, quel est ton problème principal? La logique (algorithme) ou la transformation en code c++?

DonKnacki

Un peux les deux je penses, mais j’ai réussi à comprendre ce que fais le code, par contre je suis incapable de transformer tout cela en code j’ai été obligé de regarder la solution et essayé de comprendre, merci à ChatGpt qui ma aider à comprendre le code source de l’exercice 2 en me disant en détails ce que faisait le code sans ChatGpt je n’aurais pas compris… Bon j’aurais pu aussi vous mettre le code et vous dire ce que je ne comprend pas mais je ne comprenait rien en faite du code … Mais la ça va j’ai bien compris par contre je peux pas dire que si je laisse dormir pendant une semaine l’exercice si je vais réussir à le refaire je ressayerais et je verrais, je vais essayé de faire l’exercices 3 maintenant en essayant de pas regarder ….

Ceci dis ma demande de conseils reste sur les conseils ou astuce que vous pourriez me donné pour bien comprendre et la logique et comme transformer en code c++ merci.

je vous souhaite une bonne soirée et à bientôt

+0 -0

Si tu as des difficultés à comprendre ce qui se passe avec du C++, tu pourrais essayer un langage informatique plus accessible, par exemple Python.
Si ça ne te plait pas, tu peux essayer de la programmation graphique, par exemple https://studio.code.org/s/express-2021 qui a une version en français.

+2 -0

Je ne demande pas qu’on me disent de changer de langage de programmation je veux connaître le c++ et que cela soit facile ou non m’importe peu je sais que tout début n’est pas facile ceci dis je n’aime pas la facilité j’ai tjr aimer les choses complexe … Donc je vais continuer le c++ et réussir car c’est un de mes rêves donc voila j’espère que c’est quelques informations vont e te faire prendre conscience qu’on ne juge pas quelqu’un sans le connaître.

Aigle-Royal

Passer par d’autres langages ne t’empêchera pas de continuer l’apprentissage du C++ mais te permettrait d’avoir une autre approche sur certains concepts, de mieux comprendre certaines notions algorithmiques et donc au final de consolider tes connaissances.

Mon conseil à tout début en prog est celui que personne (je caricature volontairement) ne suit à savoir d’abord réfléchir à comment je vais résoudre le problème avant même de coder la moindre ligne

On a tendance (et moi le premier) à se jeter sur le clavier

Ensuite, si tu as du mal avec la syntaxe : il n’y a pas de miracle. Il faut lire la documentation, regarder du code existant et y aller étape par étape quitte à faire des exercices supplémentaires (mais sur la même notion) lorsque tu en ressens le besoin

Salut,

Je n’ai pas vraiment de conseils à partager ou d’expérience à relater vu que je n’ai jamais été dans la même situation.

Cependant, je peux te dire que c’est normal d’avoir des difficultés à programmer, que tout le monde n’a pas la même aisance et que persévérer est probablement une bonne idée :

  • La programmation, c’est un moyen de communication artificiel. Alors qu’un humain devinera ce qu’on essaie de lui dire, un ordinateur fait ce qu’on lui dit et n’est en général pas assez malin pour deviner quoi que ce soit. Parfois, c’est difficile d’apprendre à penser comme l’ordinateur, et c’est normal.
  • Les langages de programmation sont comme des langues étrangères avec leur grammaire, leur vocabulaire et leurs concepts nouveau. Si tu as déjà appris une langue étrangère, tu as peut-être ressenti ce dépaysement avec toutes ces nouveautés et ces choses inhabituelles pour toi. Tout le monde ne les apprend pas à la même vitesse.
  • Les langages de programmation sont aussi des langages avec beaucoup de symboles qui ne sont pas des mots. C’est bête dit comme ça, mais c’est comme les formules en maths. Ce n’est pas ce qu’on retrouve dans les langues humaines et il peut y avoir de nouvelles compétences à développer (s’habituer à la densité de l’information par rapport au langage naturel ou reconnaître les idiomes au premier coup d’œil par exemple).

Certains ont parlé d’apprendre d’autres langages en parallèle. Je pense que ça peut être une bonne idée.

Par exemple, je ne connais pas C++, je ne l’ai jamais appris, mais je peux le lire (en général). Pourquoi ? Parce que j’ai de l’expérience avec d’autres langages de programmation et que je suis ainsi familier avec la plupart des concepts généraux qu’on retrouve dans la plupart des langages.

Dans ton cas, peut-être que ça t’aidera à te familiariser avec certains concepts sans forcément subir la complexité de C++ et de revenir sur C++ plus facilement ensuite.

+0 -0

@elegance, merci de faire attention à tes propos. Poster un jugement pour « espérer des réponses » n’est pas plus accepté que poster un jugement pour le fun. Tu as déjà fait l’objet de remarques pour ton manque de tact/civilité, 3 jours de lecture seule en conséquence.

Merci de ne plus recommencer.

+1 -0

Je reviens sur la suggestion qu’on t’a faite d’apprendre d’autres langages comme le Python.

J’ai également commencé à apprendre le C++ après plusieurs années d’uttilisation de C. Ce qui est arrivé est que je codais et pensais en C plutôt que C++.

J’ai appris le Python et je commence à coder en C++ plus à la façon de Python qu’en C. Ce que je veux dire est que je saisis mieux la POO maintenant que j’ai fait du Python.

Autre chose. Si tu as de la difficulté à comprendre les algorithmes, c’est plus facile de les coder et les tester en Python qqu’en C++. On n’a pas besoin de s’attarder aux complexités du langage C++. On est concentré sur l’algorithme et un minimum de syntaxe.

En ce qui concerne ton rtraitement lourd et ta spiritualité, il est difficile de commenter. D’autant plus que les traitements médicamenteux ne font pas le même effet chez tout le monde. Je prend des anxiolytiques qui sont censés réduire l’attention. Dans mon cas, cela l’améliore.

La spiritualité n’a rien de logique à mon avis. Je suis bien placé pour en parler car ma conjointe et moi sommes dans le domaine depuis longtemps. Ça peut cependant améliorer l’attention et habituer à la concentration.

+2 -0

OK merci pour vos avis concernant mon souci.

Pour répondre a PierrotLeFou,: la spiritualité est bien plus vaste que cela elle permet de développer des aptitudes dans plusieurs domaines notamment la logique, l’analyse, la concentration, la mémoire, la tranquillité d’esprit et bien d’autre encore que je n’évoquerai pas ici car ce n’est pas la raison de mon sujet, mais je peux juste dire ceci tout dépend de quelle spiritualité nous développons moi je suis ce qu’on appel un gnostique j’étudie la gnose et pratique certaines chose en elle qui permette de développer de grande capacités cérébrale, psychiques …, mais comme je l’ai dis je ne vais pas m’étendre sur le sujet.

Bonne soirée à tous et encore merci à vous, je vais continué de lire des tutos, voir des vidéos, me servir de chatGpt qui à été d’une grande aide , et continué le cours pour ce qui est des autres langage de programmation je vais attendre je ne veux pas m’éparpillé sur plusieurs langage car je n’ai pas les capacités actuellement de faire plusieurs langage à la foi ou apprendre un autre pour le moment mon cerveau du au traitement m’en empêche Par contre j’ai appris les pseudo code des algorithmes mais malgré cela j’ai encore quelques difficultés. Je vais par ailleurs persévérer doubler d’efforts et continué le c++.

bonne soirée.

+0 -0

Salut,

Tu mentionnes chatGPT, fais gaffe avec quand même. C’est juste un prédicteur de texte, donc il comprend absolument rien à ce qu’il raconte. Ça veut dire qu’il peut très facilement se mettre à te raconter des salades sans que tu t’en aperçoives. Quand on touche à des choses assez techniques qui demandent beaucoup de précision, comme la programmation en C++, tu peux vite de retrouver à lire des choses qui sont fausses de manière assez subtile.

+3 -0

Je ne suis pas intervenu plus tôt dans la discussion parce que je ne savais pas comment t’aider. Mais après réflexion, c’est justement le signe que c’est moi qui a quelque chose a apprendre de toi.

Le probleme des cours en ligne et de l’auto apprentissage, c’est que les cours sur internet sont rédigés en fonction en fonction du point de vue pédagogique des auteurs. Ils ne s’adaptent pas a chaque apprenant, comme pourrait le faire un vrai enseignant. Chaque apprenant doit donc trouver par lui même (ce qui n’est pas forcement simple) la pédagogie qui lui correspond, au lieu d’avoir l’enseignant qui adapte sa pédagogie a chaque élève.

Pourrais tu expliquer ta démarche et ton raisonnent quand tu as abordé ce probleme ? Idem pour la solution. Je remets le texte ici :

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.

Et la solution

#include <algorithm>
#include <cctype>
#include <iostream>
#include <string>

int main()
{
    std::string test { "\n\tHello !\n\t" };
    std::cout << "Avant modification : " << test << std::endl;

    // On utilise l'itérateur fourni par std::find_if_not, qui pointe sur le premier 
    // élément qui n'est pas un espace.
    auto premier_non_espace { std::find_if_not(std::begin(test), std::end(test), isspace) };
    test.erase(std::begin(test), premier_non_espace);
    // On affiche pour tester.
    std::cout << "Suppression au début : " << test << std::endl;

    // En inversant, tous les espaces de fin se retrouvent au début.
    std::reverse(std::begin(test), std::end(test));
    // On reprend le même algorithme.
    premier_non_espace = std::find_if_not(std::begin(test), std::end(test), isspace);
    test.erase(std::begin(test), premier_non_espace);
    // On revient à l'état initial.
    std::reverse(std::begin(test), std::end(test));
    // On affiche pour tester.
    std::cout << "Suppression à la fin : " << test << std::endl;

    return 0;
}

J’ai pleins de questions plus spécifiques a te poser, mais je ne le fais pas pour le moment, pour ne pas orienter ton raisonnement.

+1 -0

Je ne suis pas intervenu plus tôt dans la discussion parce que je ne savais pas comment t’aider. Mais après réflexion, c’est justement le signe que c’est moi qui a quelque chose a apprendre de toi.

Le probleme des cours en ligne et de l’auto apprentissage, c’est que les cours sur internet sont rédigés en fonction en fonction du point de vue pédagogique des auteurs. Ils ne s’adaptent pas a chaque apprenant, comme pourrait le faire un vrai enseignant. Chaque apprenant doit donc trouver par lui même (ce qui n’est pas forcement simple) la pédagogie qui lui correspond, au lieu d’avoir l’enseignant qui adapte sa pédagogie a chaque élève.

Pourrais tu expliquer ta démarche et ton raisonnent quand tu as abordé ce probleme ? Idem pour la solution. Je remets le texte ici :

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.

Et la solution

#include <algorithm>
#include <cctype>
#include <iostream>
#include <string>

int main()
{
    std::string test { "\n\tHello !\n\t" };
    std::cout << "Avant modification : " << test << std::endl;

    // On utilise l'itérateur fourni par std::find_if_not, qui pointe sur le premier 
    // élément qui n'est pas un espace.
    auto premier_non_espace { std::find_if_not(std::begin(test), std::end(test), isspace) };
    test.erase(std::begin(test), premier_non_espace);
    // On affiche pour tester.
    std::cout << "Suppression au début : " << test << std::endl;

    // En inversant, tous les espaces de fin se retrouvent au début.
    std::reverse(std::begin(test), std::end(test));
    // On reprend le même algorithme.
    premier_non_espace = std::find_if_not(std::begin(test), std::end(test), isspace);
    test.erase(std::begin(test), premier_non_espace);
    // On revient à l'état initial.
    std::reverse(std::begin(test), std::end(test));
    // On affiche pour tester.
    std::cout << "Suppression à la fin : " << test << std::endl;

    return 0;
}

J’ai pleins de questions plus spécifiques a te poser, mais je ne le fais pas pour le moment, pour ne pas orienter ton raisonnement.

gbdivers

Bonjour Gbdivers.

Alors tout d’abord merci de te pencher sur mon cas :-) c’est gentil .. Donc pour résoudre l’exercice comme je l’ai dis je me suis aider de chatGpt qui ma aider à comprendre point par point les différentes étapes de l’exercice (la solutions) sans cela je n’aurais pas pu comprendre l’exercice.

Au début je ne comprenais tout simplement pas comment fonctionnais les choses j’ai bcp de difficulté de transformer en code les exercices sauf les exercices du début que j’ai réussi à faire mais la c’est un niveau plus difficile pour moi. Je ne sais pas exactement ce que tu veux que je te disent sur le sujet je peux juste dire qu’il m’était impossible de résoudre l’exercices sans regarder la solution et essayé de comprendre point par point ce que l’exercices disait.

Voila si tu as d’autres questions je t’écoute il n’y à pas de soucis :-)

+0 -0

Concernant l’exercice détaillé ci dessus, le vocabulaire utilisé n’aide pas à comprendre ce qu’on fait.
En effet, le texte indique que qu’il faut :

supprimer tous les espaces à gauche, puis pour ceux à droite.

Mais dans la "correction" , le vocabulaire change, on y évoque la suppression du début et la suppression de la fin. Je ne comprends pas que cette maladresse n’ai pas été détectée et corrigée à la valgisation.

Ensuite, il n’y a pas de commentaire pour dire "supprimer tous les espaces à gauche" et "suppression tous les espaces à la fin". On peut deviner où c’est avec les instructions "std:cout" en ligne 16 et 26.

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.

+0 -2

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.

+4 -1
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