Cette page vous donne les différences entre la révision choisie et la version actuelle de la page.
hello_world [2015/04/11 13:27] gbdivers |
hello_world [2020/10/06 19:11] (Version actuelle) gbdivers |
||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
- | ^ [[programme_minimal|Chapitre précédent]] ^ [[programmez_avec_le_langage_c|Sommaire principal]] ^ [[histoire|Chapitre suivant]] ^ | ||
- | ====== Le programme "hello world" ====== | + | <note warning>Ce cours n'est plus à jour, il est préférable de ne pas le suivre. Je vous recommande le cours sur Zeste de Savoir : https://zestedesavoir.com/tutoriels/822/la-programmation-en-c-moderne/.</note> |
- | Un programme "hello world" est un programme qui affiche simplement le message "hello, world!" (d'où son nom). Ce type de programme est souvent utilisé comme premier exemple, pour montrer la syntaxe de base d'un langage de programmation. À partir de cet exemple, vous allez voir comment afficher un message en C++. | ||
- | Le programme "hello world" en C++ est assez proche du programme minimal présenté dans le chapitre précédent : | ||
- | [[http://coliru.stacked-crooked.com/a/d4c54f7ea6b23310|Tester ce code]]. | ||
- | |||
- | <code cpp main.cpp> | ||
- | #include <iostream> | ||
- | |||
- | int main() { | ||
- | std::cout << "Hello, world!" << std::endl; | ||
- | } | ||
- | </code> | ||
- | |||
- | Par rapport au code minimaliste, vous pouvez voir que l'on a ajouté deux lignes : la ligne d'inclusion (la première ligne du code, commençant par ''#include'') et la ligne pour afficher le message (la cinquième ligne, commençant par ''std::cout''). | ||
- | |||
- | L'affichage proprement dit est réalisé en utilisant un objet particulier, nommé ''cout'', fourni par la bibliothèque standard. | ||
- | |||
- | ===== La bibliothèque standard ===== | ||
- | |||
- | Lorsque l'on parle du C++, il faut en fait distinguer deux choses : le langage C++ et la bibliothèque standard. Le langage C++ proprement-dit propose uniquement les fonctionnalités fondamentales indispensables pour écrire un programme. L'utilisation du langage ne nécessite aucune inclusion supplémentaire, le compilateur se charge du travail. | ||
- | |||
- | Un grand nombre de fonctionnalités du C++ n'est pas pris en charge directement par le langage, mais par la bibliothèque standard. Celle-ci est en fait constituée d'un ensemble de codes écrits en C++, proposant de nombreuses fonctionnalités avancées. Il est indispensable d'apprendre à utiliser la bibliothèque standard lorsque l'on apprend le C++, l'un ne va pas sans l'autre. | ||
- | |||
- | Pour utiliser les fonctionnalités de la bibliothèque standard, il faut dans un premier temps inclure le fichier contenant le code C++ correspondant à la fonctionnalité que vous souhaitez utiliser. L'inclusion d'un fichier se fait en utilisant la directive de pré-processeur ''#include'', suivi du nom du fichier à inclure. Il existe deux syntaxes possibles : | ||
- | |||
- | <code cpp> | ||
- | #include <nom_fichier> | ||
- | #include "nom_fichier" | ||
- | </code> | ||
- | |||
- | La première syntaxe permet d'inclure les fichiers correspondant à la bibliothèque standard, c'est ce qui nous intéresse ici. La seconde version vous permettra d'inclure vos propres fichiers, vous verrez dans la suite de ce cours comment créer des fichiers. | ||
- | |||
- | <note info>**Les directives de pré-processeur** | ||
- | |||
- | Une directive de pré-processeur permet de paramétrer le comportement du pré-processeur lors de la compilation. Il existe différentes directives, vous en verrez plusieurs dans ce cours. Une directive s'écrit toujours avec un dièse suivi de la directive et d'éventuels paramètres optionnels.</note> | ||
- | |||
- | Pour afficher un message, il faut donc utiliser un objet particulier de la bibliothèque standard, nommé ''cout''. Si vous regardez dans la [[http://en.cppreference.com/w/cpp/io/cout|documentation de cet objet]], vous voyez au début de la page qu'il est écrit : "Defined in header <iostream>". | ||
- | |||
- | {{ :cout.png |}} | ||
- | |||
- | Cela vous indique quelle fichier il faut inclure pour utiliser ''cout'' : le fichier ''iostream'' : | ||
- | |||
- | <code cpp> | ||
- | #include <iostream> | ||
- | </code> | ||
- | |||
- | "iostream" signifie "input output stream", ce qui signifie "flux d'entrée et sortie". "Entrée" et "sortie" doivent être compris du point de vue du programme : "entrée" d'information depuis l'extérieur vers l'intérieur du programme (par exemple saisie d'un texte par l'utilisateur ou la lecture d'un fichier) et "sortie" d'information depuis le programme vers l'extérieur (comme par exemple afficher un message à l'écran ou enregistrer une fichier). Vous verrez juste en dessous pourquoi on parle de "flux". | ||
- | |||
- | <note info>**Les flux standards** | ||
- | |||
- | Si vous avez regardé un peu la documentation de ''cout'', vous avez peut-être remarqué qu'il existe d'autres flux de sortie : | ||
- | |||
- | * ''cout'' et ''wcout'' pour les messages standard ; | ||
- | * ''cerr'' et ''wcerr'' pour les messages d'erreur ; | ||
- | * ''clog'' et ''wclog'' également pour les messages d'erreur. | ||
- | |||
- | __Le ''w'' signifie que le flux prend en charge les caractères accentués...__</note> | ||
- | |||
- | |||
- | Lorsque vous utiliserez une fonctionnalité de la bibliothèque standard que vous ne connaissez pas, vous pourrez de la même manière aller rechercher dans la documentation quel est le fichier à inclure. | ||
- | |||
- | ===== L'espace de nom std ===== | ||
- | |||
- | En C++, chaque chose doit avoir un nom unique, pour permettre au compilateur de les identifier correctement. Donner un nom n'est pas très compliqué, vous verrez par la suite les quelques règles à respecter. Lorsque l'on a un petit programme de quelques centaines ou milliers de ligne, cela pose pas trop de problème pour trouver des noms uniques. Mais dans le cas d'un programme de plus grande taille ou utilisant différentes bibliothèques, cela peut devenir très compliqué. | ||
- | |||
- | Pour éviter cette contrainte, le C++ permet de regrouper les noms dans un espace dédié : les espaces de noms (//namespace//). En créant un espace de noms, vous évitez les conflits entre les noms, ce qui peut simplifier vos codes. La bibliothèque standard utilise un espace de noms appelé ''std''. Vous apprendrez par la suite à créer des espaces de noms, mais pour l'instant, voyons comment utiliser l'espace de noms de la bibliothèque standard. | ||
- | |||
- | Pour utiliser l'objet ''cout'' de la bibliothèque standard, il faut donc préciser que celui-ci provient de l'espace de noms ''std''. Plusieurs solutions sont possibles, selon le contexte. Premièrement, vous pouvez déclarer l'espace de noms ''std'' à chaque utilisation d'une fonctionnalité de la bibliothèque standard, en utilisant l'opérateur ''::'' : | ||
- | |||
- | <code cpp main.cpp> | ||
- | #include <iostream> | ||
- | |||
- | int main() { | ||
- | std::cout << "Hello, world!" << std::endl; | ||
- | } | ||
- | </code> | ||
- | |||
- | Dans ce cas, il faut faire précéder chaque utilisation de ''cout'' et de ''endl'' avec l'espace de noms. | ||
- | |||
- | La deuxième solution est de déclarer que vous allez utiliser une fonctionnalité d'un espace de noms en utilisant le mot-clé ''using''. Lorsque le compilateur rencontre ensuite ''cout'', il saura qu'il faut utiliser l'objet ''cout'' : | ||
- | |||
- | <code cpp main.cpp> | ||
- | #include <iostream> | ||
- | using std::cout; | ||
- | |||
- | int main() { | ||
- | cout << "Hello, world!" << std::endl; | ||
- | } | ||
- | </code> | ||
- | |||
- | Vous pouvez remarquer ici que seule l'objet ''cout'' est déclaré en utilisant ''using''. L'objet ''endl'' n'étant pas déclaré de cette manière, il faut l'écrire en utilisant la première syntaxe. | ||
- | |||
- | Pour terminer, il est possible d'activer un espace de noms globalement, en utilisant ''using namespace''. | ||
- | |||
- | <code cpp main.cpp> | ||
- | #include <iostream> | ||
- | using namespace std; | ||
- | |||
- | int main() { | ||
- | cout << "Hello, world!" << endl; | ||
- | } | ||
- | </code> | ||
- | |||
- | Vous remarquez ici qu'il n'est plus nécessaire d'écrire ''std::'' devant ''cout'' et ''endl''. __Cependant, cette syntaxe peut poser des problèmes, puisqu'il pourra y avoir des conflits entre un nom que vous aurez donné et un nom de la bibliothèque standard.__ Cela posera en particulier des problèmes lorsque vous utiliserez plusieurs fichiers. Vous verrez dans le chapitre correspondant les règles à utiliser, il est donc préférable de limiter l'utilisation de cette syntaxe et préférer la première syntaxe. | ||
- | |||
- | ===== cout est un flux ===== | ||
- | |||
- | Comme vous l'avez remarqué dans les codes précédents, pour afficher un message avec ''cout'', il faut utiliser l'opérateur ''<<''. Par exemple, pour afficher le texte "hello", il faut écrire : | ||
- | |||
- | <code cpp> | ||
- | cout << "Hello"; | ||
- | </code> | ||
- | |||
- | Ce code ne doit pas être compris comme signifiant "afficher hello", mais comme "envoyer hello à l'objet cout". L'opérateur ''<<'' permet d'envoyer des valeurs dans un flux de données. | ||
- | |||
- | Il est possible d'envoyer plusieurs valeurs en série dans un flux, en les séparant par plusieurs opérateurs ''<<'' : | ||
- | |||
- | <code cpp> | ||
- | cout << "Hello" << "world"; | ||
- | </code> | ||
- | |||
- | Ce code signifie "envoyer la chaîne hello à l'objet cout, puis envoyer la chaîne world à l'objet cout". Ce code est équivalent à appeler plusieurs fois l'objet ''cout'' : | ||
- | |||
- | <code cpp> | ||
- | cout << "Hello"; | ||
- | cout << "world"; | ||
- | </code> | ||
- | |||
- | Vous pouvez de cette manière afficher n'importe quelle valeur, aussi bien des chaînes que des entiers ou des nombres réels : | ||
- | |||
- | <code cpp> | ||
- | cout << "une chaîne" << 123 << 123.456; | ||
- | </code> | ||
- | |||
- | ===== Mettre en forme les messages affichés ===== | ||
- | |||
- | |||
- | __utiliser setw, setprecision. tabulation, retour à la ligne__ | ||
- | |||
- | __ get_money, put_money, get_time, put_time, quoted__ | ||
- | |||
- | ==== Les caractères spéciaux ==== | ||
- | |||
- | Au cours de vos essais, vous avez peut⁻être essayé d'afficher un backslash (''\'') ou des guillemets (''"''). Si ce n'est pas le cas, je vous propose de le faire maintenant: | ||
- | |||
- | <code cpp> | ||
- | #include <iostream> | ||
- | using namespace std; | ||
- | |||
- | int main() | ||
- | { | ||
- | cout << "Je fais des tests pour apprendre le C++ !" << endl; | ||
- | cout << """ << endl; | ||
- | cout << "\" << endl; | ||
- | return 0; | ||
- | } | ||
- | </code> | ||
- | |||
- | Le compilateur ne va pas aimer cela du tout et il un message d'erreur devrait s'afficher dans la zone au bas de votre fenêtre Code::Blocks. La raison est simple, pour afficher des guillemets, il faut utiliser la combinaison ''\"'' et pas juste ''"'', idem pour le backslash qu'il faut doubler __(Pourquoi ? Et parler des Raw String)__. On appelle cela des séquences d'échappement. Il faut donc écrire: | ||
- | |||
- | <code cpp> | ||
- | #include <iostream> | ||
- | using namespace std; | ||
- | |||
- | int main() | ||
- | { | ||
- | cout << "Je fais des tests pour apprendre le C++ !" << endl; | ||
- | cout << "\"" << endl; | ||
- | cout << "\\" << endl; | ||
- | return 0; | ||
- | } | ||
- | </code> | ||
- | |||
- | __Équivalent C++11 :__ | ||
- | |||
- | <code cpp> | ||
- | #include <iostream> | ||
- | using namespace std; | ||
- | |||
- | int main() | ||
- | { | ||
- | cout << "Je fais des tests pour apprendre le C++ !" << endl; | ||
- | cout << R"(")" << endl; | ||
- | cout << R"(\)" << endl; | ||
- | return 0; | ||
- | } | ||
- | </code> | ||
- | |||
- | Je vous laisse faire le test pour vérifier que cela fonctionne. Maintenant que vous avez vu ces deux petites exceptions, vous êtes prêt à écrire tout ce qui vous passera par la tête dans la console. Voyons maintenant ce qui se passe à la fin de notre programme. | ||
- | |||
- | ===== Exercices ===== | ||
- | |||
- | Modifier le code suivant pour afficher les messages demandés. [[http://coliru.stacked-crooked.com/a/e22719dacabeceda|Faire l'exercice]] | ||
- | |||
- | <code cpp main.cpp> | ||
- | #include <iostream> | ||
- | |||
- | int main() { | ||
- | // Modifier la ligne suivante pour afficher "Bienvenue tout le monde !" | ||
- | std::cout << "Hello, world!" << std::endl; | ||
- | |||
- | // Ajouter UNE ligne pour afficher "Bienvenue !" et "Tout le monde !" sur DEUX lignes | ||
- | std::cout << @@@@ | ||
- | |||
- | // Ajouter DEUX lignes pour afficher "Bienvenue !" et "Tout le monde !" sur UNE ligne | ||
- | std::cout << @@@@ | ||
- | std::cout << @@@@ | ||
- | |||
- | return 0; | ||
- | } | ||
- | </code> | ||
- | |||
- | Exos : include, recherche quel include pour utiliser vector ? array ? etc | ||
- | |||
- | ===== Aller plus loin ===== | ||
- | |||
- | * Le programme Hello World dans différents langage : [[http://fr.wikipedia.org/wiki/Liste_de_programme_Hello_world|Wikipédia]]. | ||
- | |||
- | ^ [[programme_minimal|Chapitre précédent]] ^ [[programmez_avec_le_langage_c|Sommaire principal]] ^ [[histoire|Chapitre suivant]] ^ | ||
- | |||
- | {{tag> Cours C++}} |