La programmation en C++ moderne

Apprenez la programmation de zéro jusqu'à l'infini !

a marqué ce sujet comme résolu.

Alors, au sommaire de cette nouvelle mise en bêta, nous avons quelques petites réécritures dans le premier chapitre (avec notamment ajout d’un paragraphe sur la norme), mais surtout il y a un nouveau chapitre sur les littérales et les variables. Seule la partie sur les littérales est écrite, mais y’a déjà de quoi faire, puisque je parle des caractères (simple et chaînes, avec caractères spéciaux et chaînes brutes) et des nombres, les booléens on verra après.

Je sais que ça ressemble beaucoup au cours de gbdivers et c’est normal, j’aime la façon dont il a introduit ça. Du coup, il est cité dans les remerciements. Voilà.

Merci d’avance pour vos commentaires.

Salut à tous !

Au programme de cette nouvelle bêta, il y a la suite du chapitre sur les variables. Je ne l’ai pas encore fini ; il rest à parler de const, l’entrée standard et la conclusion. Par contre, j’ai pu parler des variables, de comment les déclarer, modifier leur valeur, les syntaxes raccourcis.

Je n’ai pas parlé des conversions entre types ni des limites de capacités. Pensez-vous que ce soit adapté ? Ou bien à mettre plus tard ? Je n’ai pas d’avis, mais je me demande si ajouter ces notions ne rendra pas le chapitre bien trop lourd.

Merci d’avance pour vos commentaires.

Salut,

Quelques petites suggestions.

Qu’est-ce que sont les littéraux ? Une valeur écrite directement dans le code.

On pourrait peut-être dire « une valeur écrite littéralement dans le code », d’où le mot « littéral ».

Un char ou un std::string initialisé avec une valeur par défaut ne contient rien du tout. Il n’y a ni caractère, ni chaîne de caractères.

Le std::string est effectivement une chaîne ne contenant aucun caractère, mais le char, quant à lui, est initialisé avec le caractère nul ('\0'), qui vaut simplement zéro comme les autres types représentant des nombres. Peut-être faudrait-il parler du fait qu’un char n’est au fond qu’un nombre comme tous les autres types arithmétiques, et que std::string est un type « spécial » ?

Peut-être aussi rapidement introduire les mots-clés float, bool, long ? Parler rapidement de auto ?

Parler de la syntaxe alternative int a = 3; pour initialiser les variables ? (Histoire qu’on soit au courant que ça existe.)

Parler du fait qu’on peut initialiser une variable avec une opération et pas seulement un littéral ou une valeur par défaut ? (int c = a + b; ou int c { a + b };) Peut-être parler de auto ici ?

Finalement, quelques erreurs :

Erreur Correction
n’est-ce-pas n’est-ce pas
littérale / littérales littéral / littéraux (nom masculin)
une agglomérations une agglomération
soi-mêmes soi-même
du à l’origine dû à l’origine
vous avez étudiez vous avez étudié

Merci pour tes retours. :)

Je prends en note tes corrections de forme et de fond sur char et les formes d’initialisation.

Pour les types float et long, je ne les ait pas introduits parce qu’ils ne sont pas trop utiles, encore plus pour un débutant et demandent des explications sur les limites de types. Pour bool, je compte l’introduire dans le chapitre sur les conditions, pour qu’il ait plus de sens pour un débutant.

Salut à tous.

Au programme de cette mise à jour, plusieurs choses.

  • J’ai finalement rajouté un chapitre sur des outils à installer localement. J’ai fais des captures d’écran pour Visual Studio Community, mais je n’ai rien pour le monde GNU/Linux, je ferai ça plus tard (sauf si une âme charitable veut m’aider).
  • J’ai décidé de parler des limites des types, mais je ne suis pas satisfait du résultat.
  • J’ai ajouté une section sur les entrées, avec un exemple d’échec si on tape une chaîne de caractères alors que std::cin attend un entier. Ça me sert d’introduction aux conditions pour le chapitre suivant.

Pour lire tout ça, l’adresse est juste ci-dessous.

Merci à tous pour vos retours.

Salut !

Juste une petite suggestion : ne pensez-vous pas qu’il soit utile de parler du processus de compilation ?

C’est quelque chose de totalement invisible (surtout sous Windows) qund on utilise un IDE, mais dans mon cas, comprendre la compilation et l’edition de liens m’avait aide a mieux apprehender le langage, et a souvent mieux comprendre les messages d’erreurs.

Et puis quand on debute, il est difficile de comprendre (en tout cas ca l’etait pour moi au tout debut) d’ou viennent les messages au’affiche l’IDE quand on compile.

Bon voila je parle juste de ca parce que j’etais vraiment content quand j’ai decouvert, en meme temps que Linux, que l’on pouvait compiler ses fichiers sources soi-meme !

Bon en tout cas le tutoriel se profile bien, et j’ai hate qu’il soit complete ! Bon courage a vous :p

+1 -0

Je pense qu’il est important de comprendre le processus de compilation, mais pas aussi tôt dans le tutoriel. Là, ça embrouillera plus le lecteur que ça ne l’aidera.

Mieux vaut lui expliquer un message d’erreur courant qu’il rencontre (ou mieux, qu’on lui fait rencontrer) et, une fois les bases solides, aborder le processus de compilation.

Ok, c’est vrai qu’expliquer si tot dans le tutoriel peut etre reverbatif et on risque de ne pas trop comprendre !

Bon et bien je fais confiance en ton sens de la pedagogie, bonne continuation !

+0 -0

Bravo pour le travail déja fourni Voici quelques modifications à apporter 1. tu devrais montrer la syntaxe d’initialisation des variables avec des parentheses pour que les lecteurs la connaissent s’ils la rencontre 2. expliquer en meme temps que les vectors les différences entre {}(std::initializer_list) et ()(constructeur) 3. rajouter une image de Wandbox avnt la description un peu comme cela :

Survol de Wandbox

Image utilisateur

(Encadré Rouge)En haut à gauche, dans un encart vert, c’est le langage de programmation utilisé. Si un autre nom que C++ est écrit, pas de soucis, il suffit de cliquer sur la liste déroulante en dessous, puis sur « C++ » et choisir « GCC HEAD » ou « Clang HEAD » (qui sont les toutes dernières versions de ces compilateurs).

(Encadré Bleu)Un peu plus bas, la liste déroulante commençant par C++ permet de choisir la version du langage. Dans ce tutoriel, nous utiliserons la version « C++1z », qui correspond à la version 2017 du langage. Que vous choisissiez « C++1z » ou « C++1z (GNU) », cela n’a aucune importance à notre niveau.

(Encadré Vert)La grande zone de texte blanche est là où nous écrirons le code.

(Encadré Jaune)Enfin, le bouton Run (or Ctrl+Enter) servira à lancer le compilateur et lui faire compiler le code écrit dans l’encadré précédent.

+0 -0

Presque un an sans avoir écrit… Que le temps passe vite ! Mais inutile de regarder derrière. Ce qui compte, c’est le présent et donc cette mise à jour du tutoriel. :)

Pour l’instant, le chapitre sur les conditions n’est pas fini mais il est bien avancé. Je compte ensuite introduire les boucles, puis les fonctions, et avec ça, on ferra déjà plein de choses marrantes. Je n’ai pas encore décidé exactement de l’ordre des notions présentées après.

@faymon : Merci. :)

Je viens de finir le chapitre sur les boucles. Je ne suis cependant pas satisfait de la partie sur break et continue. Je vais voir ce que je vais faire.

Il y a un chapitre qui parle de portée mais c’est juste que j’ai oublié de le supprimer. Pour l’instant, je ne sais pas quelle notion je vais aborder maintenant. Soit les conteneurs, soit les fonctions. Je réfléchis.

Merci d’avance pour vos commentaires.

§ Boucles

instructions une par suite

Je ne connais pas l’expression. "Une après l’autre" peut-être?

do while

peut se traduire par "répéter … tant que" – attention au piège p/r aux langages qui "répètent jusqu’à"

exo des saisies

on va plutôt préférer l’écriture canonique qui est while (! (flux >> donnee))

Mais ne trouvez-vous pas ça dommage de créer des variables spécifiques à nos boucles, type compteur, juste pour elles ?

La formulation est bizarre. Si on doit compter, on n’a pas le choix, on va avoir besoin d’un compteur. Je me demande d’ailleurs s’il n’y a pas un papier pour avoir while (init-statement ; cond) à partir du C++20.

Pour l’équivalence, c’est

{ init ; while (cond) { action; iter; } }

BTW, dans le cas de for, la 3e clause est plus une clause d’itération, pas nécessairement d’incrémentation.

L’avantage, n’est pas sans me rappeler le SRP: on réunit au même endroit tout ce qui participe à une itération. Dans le cas de while, on va être plus générique on boucle.

Cette possibilité est cependant à prendre avec des gants parce qu’elle peut rendre le code très peu lisible.

Une bonne solution est de mettre chaque clause sur une ligne différente. While ne simplifie rien: la complexité est la même. Je dirai de choisir par rapport à ce que l’on veut exprimer donc: for pour itérer (la quantité d’itérations n’est pas forcément connue pour les listes en extensions avec la STL2/ranges v3), while pour réaliser un traitement autant de fois que nécessaire (c’est plus flou et générique).

Il faudrait traiter des for-range loop en C++ aujourd’hui.

vous ne verrez jamais affiché

afficher

Dans le cas de boucles imbriquées, break ne stoppe l’exécution que de la boucle dans laquelle il se trouve, mais pas les boucles englobantes.

Cela me rappelle pas mal de posts de débutants dans les forums qui croient que if est une boucle. Tous sont des structures de contrôle, if une structure (?) de saut conditionnel, les autres des boucles. Faut-il le rappeler pour les lecteurs distraits?

La difficulté avec break et continue, c’est qu’il faut rapidement parler de qualité: quand pouvons nous ou pas utiliser ces instructions? La discussion peut vite dévier vers l’écriture de fonctions dédiées plutôt que de boucles avec positionnement de flag trouvé. Et du coup, il faudrait même dire qu’un for/while + break, c’est souvent un std::find_if() qui s’ignore…

Merci pour tous tes retours lmghs. :)

instructions une par suite

Je ne connais pas l’expression. "Une après l’autre" peut-être?

lmghs

Je me suis embrouillé et j’ai fais un mix de plusieurs expressions. Corrigé.

do while

peut se traduire par "répéter … tant que" – attention au piège p/r aux langages qui "répètent jusqu’à"

lmghs

J’ai modifié le titre de la section, merci pour la suggestion.

exo des saisies

on va plutôt préférer l’écriture canonique qui est while (! (flux >> donnee))

lmghs

Effectivement. Je vais réécrire cette partie.

Mais ne trouvez-vous pas ça dommage de créer des variables spécifiques à nos boucles, type compteur, juste pour elles ?

La formulation est bizarre. Si on doit compter, on n’a pas le choix, on va avoir besoin d’un compteur. Je me demande d’ailleurs s’il n’y a pas un papier pour avoir while (init-statement ; cond) à partir du C++20.

Pour l’équivalence, c’est

{ init ; while (cond) { action; iter; } }

lmghs

Je disais ça dans le sens que pour compter de 1 à 10, par exemple, notre variable compteur, ou i ou ce qu’on veut est créée avant la boucle mais n’a d’utilité que pour celle-ci ? Est-ce qu’on peut limiter sa portée ? Oui regardez for.

BTW, dans le cas de for, la 3e clause est plus une clause d’itération, pas nécessairement d’incrémentation.

lmghs

Corrigé merci.

L’avantage, n’est pas sans me rappeler le SRP: on réunit au même endroit tout ce qui participe à une itération. Dans le cas de while, on va être plus générique on boucle.

Je vais voir pour développer ce point. Sans rentrer dans les détails bien sûr, parce que SRP ne parlera pas à un débutant.

Cette possibilité est cependant à prendre avec des gants parce qu’elle peut rendre le code très peu lisible.

Une bonne solution est de mettre chaque clause sur une ligne différente. While ne simplifie rien: la complexité est la même. Je dirai de choisir par rapport à ce que l’on veut exprimer donc: for pour itérer (la quantité d’itérations n’est pas forcément connue pour les listes en extensions avec la STL2/ranges v3), while pour réaliser un traitement autant de fois que nécessaire (c’est plus flou et générique).

lmghs

J’aime ta façon de décrire les différences entre ces deux boucles. Je vais réécrire comme ça.

Il faudrait traiter des for-range loop en C++ aujourd’hui.

lmghs

C’est prévu dans le chapitre sur les tableaux, juste après celui sur les boucles. :)

vous ne verrez jamais affiché

afficher

lmghs

Merci.

Dans le cas de boucles imbriquées, break ne stoppe l’exécution que de la boucle dans laquelle il se trouve, mais pas les boucles englobantes.

Cela me rappelle pas mal de posts de débutants dans les forums qui croient que if est une boucle. Tous sont des structures de contrôle, if une structure (?) de saut conditionnel, les autres des boucles. Faut-il le rappeler pour les lecteurs distraits?

lmghs

Bonne idée.

La difficulté avec break et continue, c’est qu’il faut rapidement parler de qualité: quand pouvons nous ou pas utiliser ces instructions? La discussion peut vite dévier vers l’écriture de fonctions dédiées plutôt que de boucles avec positionnement de flag trouvé. Et du coup, il faudrait même dire qu’un for/while + break, c’est souvent un std::find_if() qui s’ignore…

lmghs

Je vais réfléchir pour cette partie. Peut-être introduire comme ça dans ce chapitre puis dans le suivant avec std::vector faire quelque chose comme "Oh mais regardez, on peut se passer de ça avec les super algos de la STL". À voir.

J’ai mis à jour le tutoriel en intégrant les remarques de lmghs, mais j’ai également apporté plusieurs corrections orthographiques, quelques détails supplémentaires ainsi que le début du chapitre sur les tableaux. Dans celui-ci, je parlerai de std::vector et std::array, des boucle for pour conteneurs ainsi que de comment lire la documentation. Et je réfléchis également à la gestion des erreurs.

Merci d’avance pour vos commentaires.

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