Outils d'utilisateurs

Outils du Site


hello_world

Différences

Cette page vous donne les différences entre la révision choisie et la version actuelle de la page.

Lien vers cette vue

hello_world [2015/04/12 00:48]
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 &quot;hello world&quot======+&lt;note warning&gt;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>;
  
-Dans le chapitre précédent, vous avez vu la structure de base d'un programme C++ et un aperçu du processus de compilation. Cependant, le code présenté ne faisait rien, ce n'était pas très intéressant. Dans ce chapitre, vous allez voir comment afficher un message. 
  
-Pour illustrer cette fonctionnalité en C++, nous allons prendre le programme "hello world" comme exemple. Ce programme permet simplement d'afficher le message "hello, world!". Il est traditionnellement utilisé pour montrer la syntaxe de base d'un langage informatique, ce qui explique qu'il possède son propre nom. Vous pouvez voir sur Wikipédia ce programme dans différents langages : [[http://fr.wikipedia.org/wiki/Liste_de_programme_Hello_world|Wikipédia]]. 
- 
-Le programme //hello world// en C++ est assez proche du programme minimal présenté dans le chapitre précédent. Vous pouvez ouvrir ce code dans [[http://coliru.stacked-crooked.com/a/d4c54f7ea6b23310|Coliru]] et copier-coller le code dans l'éditeur de votre choix. 
- 
-<code cpp main.cpp> 
-#include <iostream> 
- 
-int main() { 
-    std::cout << "Hello, world!" << std::endl; 
-} 
-</code> 
- 
-Par rapport au code minimal, vous pouvez voir que l'on a ajouté deux lignes. La première ligne, qui contient la directive ''#include'', permet de spécifier des fonctionnalités utilisées par le programme. "iostream" fournit les fonctionnalités de base pour afficher un message et récupérer les textes saisies par l'utilisateur. 
- 
-La quatrième ligne, commençant par ''std::cout'', permet l'affichage proprement dit. On voit sans problème le message à afficher "hello, world!" en clair dans le code. Vous pouvez vous amuser à changer le texte et voir ce que cela donne. 
- 
-Ces deux lignes de code permettent d'utiliser le flux de sortie ''std::cout'' de 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. La conséquence est que de nombreuses fonctionnalités ne sont pas intégrées directement dans le langage (même l'affichage d'un message ne fait pas partie du langage). 
- 
-Heureusement, lorsqu'une fonctionnalité n'existe pas dans le langage, cela ne veut pas dire que l'on ne peut pas utiliser cette fonctionnalité. Il est possible d'écrire des bibliothèques, qui fournissent de nouvelles fonctionnalités utilisables en C++ (ou dans d'autre langages, mais cela sort du cadre de ce cours). 
- 
-Cela veut dire aussi que si vous créer un programme qui propose des fonctionnalités intéressantes, vous pouvez également créer une bibliothèque pour que d'autres développeurs utilisent vos fonctionnalités (ou que vous puissiez vous même utiliser ces fonctionnalités dans plusieurs de vos programmes. La création d'une bibliothèque sera vu par la suite. 
- 
-**La bibliothèque standard fait partie intégrante du C++, il est indispensable d'apprendre à l'utiliser en même temps que le langage, l'un ne va pas sans l'autre.** 
- 
-Pour utiliser une fonctionnalité de la bibliothèque standard, il faut dans un premier temps le spécifier au compilateur, en utilisant la directive de pré-processeur ''#include''. L'une des syntaxes de cette directive est la suivante (il en existe d'autres, mais qui ne seront pas utilisée avec la bibliothèque standard) : 
- 
-<code cpp> 
-#include <nom_fichier> 
-</code> 
- 
-<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. 
- 
-Il n'est pas possible d'expliquer le fonctionnement de la directive ''#include'' sans expliquer avant le fonctionnement en détail du pré-processeur. Cela sera vu dans un chapitre dédié à la compilation en profondeur.</note> 
- 
-Pour afficher un message, on utilise un objet particulier de la bibliothèque standard, nommé ''std::cout''. Si vous regardez dans la [[http://en.cppreference.com/w/cpp/io/cout|documentation]], vous voyez au début de la page qu'il est écrit : "Defined in header <iostream>". 
- 
-{{ :cout.png |}} 
- 
-Cela vous indique quel fichier il faut inclure pour utiliser ''std::cout'' : le fichier ''iostream'' : 
- 
-<code cpp> 
-#include <iostream> 
-</code> 
- 
-"iostream" correspond à //**I**nput/**O**utput 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 (par exemple afficher un message à l'écran ou enregistrer dans un 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'' pour les messages de log. 
- 
-Par défaut, ces flux s'affichent tous dans le terminal, vous pouvez utiliser n'importe quel flux. Le programme suivant : 
- 
-<code cpp main.cpp> 
-#include <iostream> 
- 
-int main() { 
-    std::cout << "le flux cout" << std::endl; 
-    std::wcout << "le flux wcout" << std::endl; 
-    std::cerr << "le flux cerr" << std::endl; 
-    std::wcerr << "le flux wcerr" << std::endl; 
-    std::clog << "le flux clog" << std::endl; 
-    std::wclog << "le flux wclog" << std::endl; 
-} 
-</code> 
- 
-affiche : 
- 
-<code> 
-le flux cout 
-le flux wcout 
-le flux cerr 
-le flux wcerr 
-le flux clog 
-le flux wclog 
-</code> 
- 
-Cependant, il est possible de différentier ces sorties et d'appliquer un traitement différent (par exemple, enregistré le flux ''clog'' dans un fichier ou permettre à un éditeur d'afficher la sortie ''cerr'' en rouge, pour que les erreurs soient bien visibles). 
- 
-Le ''w'' signifie que le flux prend en charge les caractères étendus ("w" pour //wide//), c'est-à-dire les caractères avec accent ou provenant d'un autre alphabet que l'anglais. La gestion de l’internationalisation est un peu complexe en C++, en particulier à cause de la multiplicité des normes de codage et la prise en charge très variable selon le système d'exploitation. Cela fera l'objet d'un chapitre dédié.</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 ===== 
- 
- 
- 
-L'affichage proprement dit est réalisé en utilisant un objet particulier, nommé ''cout'', fourni par la bibliothèque standard. 
- 
-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 ===== 
- 
-^ [[programme_minimal|Chapitre précédent]] ^ [[programmez_avec_le_langage_c|Sommaire principal]] ^ [[histoire|Chapitre suivant]] ^ 
- 
-{{tag> Cours C++}} 
hello_world.1428792481.txt.gz · Dernière modification: 2015/04/12 00:48 par gbdivers