Big Tuto : Apprenez le C++

Chapitre 1 : Analyse d'un programme en C++

Tutoriel présenté par : Robert Gillard (Gondulzak)
Date d'écriture : 5 juillet 2015
Date de révision : 31 octobre 2015

      Avant de commencer...

   Pourquoi un Big tuto C++ ? surprise La réponse est simple. La plateforme SFML qui utilise le langage C++ comme outil de développement s'améliore sans cesse au fur et à mesure de ses nouvelles versions et apporte à chaque fois plus de fonctionnalités. Programmer en C++ sous cette plateforme devient pratiquement un des incontournables actuels en ce qui concerne le développement de jeux. wink

   Mais il y en a d'autres, car sur le site de Meruvia, en plus de la SFML nous connaissons des plateformes qui utilisent soit le langage C (les SDL ou SDL 2, représentées par leurs big tutos respectifs), soit le langage C# avec la plateforme Xna ou Monogame. Chacun a donc l'opportunité de choisir son langage préféré en fonction de ses connaissances propres ou de celles qu'il aurait acquises en suivant l'un ou l'autre big tuto. smiley

   Revenons-en au C++. Nous savons que ce n'est pas un langage facile, et à moins de n'utiliser que ses éléments basiques sans oser se lancer dans les difficultés (reconnaissons-le cheeky) de la Programmation Orientée Objet et de la STL, autant continuer à programmer en C ! laugh Mais chaque chose en son temps. wink

 

      Un peu d'histoire

   Le C++ n'est pas un langage récent, il date déjà figurez-vous. indecision

   En effet, dès 1978, un certain Bjarne Stroustrup, l'inventeur de ce langage, écrivait les premières définitions de ce qui à l'époque fût nommé « Du C avec des Classes ».

   Afin de garantir la portabilité du langage, on décida d'en faire une « Norme ». Celle-ci, dénommée ANSI (American National Standard Institute) vit le jour en 1998, et, bénéficiant d'une très bonne stabilité, ne fut revue pour la première fois qu'en 2003. Il fallut ensuite attendre le 12 Août 2011 pour voir apparaître la norme suivante qui prit le nom de C++ 11, en raison de sa date de mise à jour. wink

 

      Etude du langage et compilation

   Les nouveautés de la nouvelle norme C++ 11 sont nombreuses et la plupart sortiront du cadre de ces tutoriels. Seules quelques nouvelles fonctionnalités intéressantes seront vues dès que l'occasion se présentera dans ce cours, ainsi que dans l'étude de la STL (Standard Template Library) et des Conteneurs. Mais ces derniers restent encore lointains car nous devrons avant cela passer par la très importante partie qui traitera de la Programmation Orientée Objet, ou POOwink

   Le C++ étant une «surcouche» du langage C, tous les éléments du langage repris du C ne seront bien évidemment pas réexpliqués. Je parle ici notamment des types de variables issus du C ainsi que les structures de contrôle (boucles for, while, switch case, etc... Vous pourrez donc toujours aller jeter un oeil au tuto C, pour vous rafraîchir la mémoire ! wink).

   Par contre, nous ferons une sérieuse révision des pointeurs, tableaux et fonctions, ce qui ne fera que renforcer nos connaissances. J'en vois quelques-uns parmi vous ouvrir de grands yeux et se demander « Mais où veut-il donc nous emmener, Gondulzak ? surprise ». Ne craignez rien, nous prendrons notre temps afin de bien tout assimiler, et dans la mesure du possible, chaque chapitre ne devrait pas être trop long afin de ne pas fatiguer le lecteur. cool
   En outre, les exemples seront le plus souvent présentés de façon ludique, afin de garder l'attention de celui-ci. laugh

   Je vous propose de compiler les programmes sous Visual Studio 2013, bien que ceux qui seront présentés pourront l'être sans problème, je l'espère, avec d'autres compilateurs. wink

   Les programmes seront écrits dans la Console (oui je sais, mais il s'agit d'abord de découvrir le langage avant de l'appliquer au jeu cheeky) mais il se peut que de temps à autre, j'utilise la plateforme SFML dans certains cas, ce qui devrait donner un peu de couleur à nos programmes. Heureux non ? angel

   Bien, nous pouvons commencer maintenant et n'oubliez pas que « Le plus long chemin commence par un premier pas ('Gondulzak'), heu... je veux dire ('Lao Tseu')». indecision


      Analyse d'un programme C++

         1 – Un programme qui ne fait... rien ! cheeky

   Et j'explique ici (mais pour cette fois seulement cheeky) les manipulations à faire dans VS 2013. 

 

 

   Après avoir ouvert votre IDE, cliquez sur Start -> New Project. Vous obtenez la fenêtre suivante :

 

 

   Dans la fenêtre de gauche cliquez sur Visual C++ et dans le menu central, cliquez sur Win32 Console Application. Dans le bas de la fenêtre, donnez comme nom 001Prog1 au projet. Cliquez sur Ok. La fenêtre suivante apparaît alors :

 

 

    Cliquez sur Next pour voir apparaître la fenêtre qui suit :

 

 

   Cochez la case Empty Project et pour terminer cliquez sur Finish. Maintenant, dans l'Explorateur de solutions, faites un clic droit sur Source files et faites un clic gauche sur Add -> New Item. Vous obtiendrez alors la fenêtre suivante :

 

 

   Cliquez sur C++ file (.cpp) et remplacez le nom de fichier par Prog1.cpp.

   Nous pouvons maintenant écrire notre mini programme ! angel Entrez les lignes suivantes :

 
int main()
{
return 0;
}

 

   Quand je vous parlais d'un mini programme, j'aurais dû dire micro... blush mais voyons de suite ce qu'il y a dans la Bête ! laugh

   La fonction principale d'un programme C++ est, comme en C, le main(). Notez que le type de retour de la fonction DOIT être de type int. Le corps de notre fonction ne contient qu'une seule instruction return 0, signifiant que le programme se déroule sans erreur. La fonction ne possède pas de paramètres mais nous verrons plus tard que l'on peut lui en passer.

   Voilà, vous pouvez maintenant cliquer sur Build solution afin de compiler le programme. Pressez ensuite la touche F5 pour voir apparaître et aussitôt disparaître la console !! angry Rassurez-vous cependant, tout s'est très bien passé et nous allons donner les explications nécessaires à la suite de notre second exemple. wink Dans celui-ci, nous allons écrire à l'écran, ce qui déjà va nous apprendre quelques nouvelles fonctionnalités.  

 

Les projets complets de ce chapitre :

 

         2 – Les flux d'entrées / sorties : cout

   Faites un second projet que vous appellerez 002Laotseu, et entrez-y le code suivant (ou ouvrez le projet, téléchargé ci-dessus wink) :

 

#include <iostream>
 
int main()
{
std::cout << "Le plus long voyage commence par un premier pas." << std::endl;
std::cout << "5 + 6 = " << 5 + 6 << std::endl;
 
return 0;
} 

 

   Ce programme affiche deux choses :

- Une chaîne de caractères. Mais vous ne vous attendiez quand-même pas au trop connu «Hello World»... Non ? indecision
- Le résultat d'une addition.

   Ceux d'entre-vous qui ont étudié le langage C savent que pour envoyer des informations à l'écran, il faut inclure une librairie d'en-tête avant la fonction main(). En C, il s'agissait du fichier d'en-tête stdio.h.  

  Le C++ utilise quant à lui la librairie iostream (istream et ostream ou input stream et output stream qui sont les flux d'entrée/sortie wink). Vous écrirez donc #include <iostream> sans ajouter l'extension .h à iostream.

   La librairie ostream utilise l'objet cout pour écrire vers l'écran. Il est représenté par un double signe inférieur à, soit <<. Son expression complète est std::cout car il utilise l'espace de nom standard std. La partie à droite de << est l'information qui sera envoyée à l'écran. wink

   A la fin de chaque instruction, nous voyons un second opérateur, std::endl. Il a pour but de provoquer un saut de ligne et de vider le buffer (en C nous utilisions la séquence d'échappement \n).

   Notre première instruction affiche une chaîne de caractères à l'écran. Comme dans le langage C, une chaîne de caractères est précédée et terminée par des doubles quotes (soit le signe '').

   La seconde instruction, qui affiche le résultat d'une addition, écrit en premier la chaîne ''5+6 = '' et donne ensuite son résultat.

   C'est tout pour l'objet cout ! smiley

   Compilez le programme et regardez le résultat dans la console. Attention, si vous travaillez avec Visual C++ vous devrez impérativement presser les touches Ctrl + F5 pour que la console reste affichée et ne disparaisse pas comme lors de notre premier essai. cheeky Une autre solution est d'ajouter l'instruction std::cin.get() avant l'instruction return 0. Dès lors, seule une pression de la touche F5 est suffisante pour afficher le résultat de notre programme à l'écran. wink

 

         3 – Les flux d'entrées / sorties : cin

   Voici un autre exemple qui utilise, quant à lui, le flux d'entrée istream et l'objet cin qui attend une frappe de l'utilisateur au clavier. Prenons cet exemple (projet 003cin) :

 
#include <iostream>
#include <conio.h>
 
int main()
{
int nombre1 = 0, nombre2 = 0;
std::cout << "Entrez un nombre " << std::endl;
std::cin >> nombre1;
std::cout << "Entrez un autre nombre " << std::endl;
std::cin >> nombre2;
std::cout << "La somme de " << nombre1 << " et " << nombre2 << " est " <<
nombre1 + nombre2 << std::endl;
 
_getch();
 
} 

 

Remarque : L'instruction de fin de programme std::cin.get() ne marchant pas dans toutes les circonstances, pour rendre visible la console dès l'exécution du programme par F5, je vous conseille d'ajouter ces deux lignes qui garderont la console ouverte dans tous les cas : il suffit d'inclure le fichier C conio.h en dessous de iostream et d'ajouter l'instruction _getch en fin de programme. Cette instruction attend toujours que l'on presse une touche pour fermer la console. Notez bien que getch() étant dépréciée en C++, vous devez écrire l'instruction getch() précédée d'un caractère de soulignement, soit _getch();

   Voyons maintenant comment écrire notre flux d'entrée au clavier :

   L'objet std::cin du flux d'entrée istream attend que l'on frappe un caractère alphanumérique au clavier. Il est suivi d'un double signe supérieur à (soit >>) et d'une variable qui enregistrera notre frappe. 

Attention : en C++, il est conseillé d'initialiser les variables avant leur utilisation. Dans notre exemple nous initialisons donc à 0, deux variables de type int qui vont enregistrer nos saisies au clavier.

   Nous affichons ensuite leur somme avec l'objet std::cout du flux de sortie ostream.

   Remarquez qu'il y a deux manières d'initialiser une variable entière en C++. Nous aurions aussi bien pu écrire int nombre1(0), nombre2(0) à la place de int nombre1 = 0, nombre2 = 0wink

   Les objets des flux d'entrée/sortie ne se limitent pas à cin et cout, et il y en a au moins un autre que vous devrez connaître et qui renvoie une erreur vers un fichier, il s'agit de std::cerr.

 

         4 – L'espace de nom Standard : std

   Si comme moi, vous en avez marre de toujours écrire std:: devant cin ou cout, nous allons de ce pas y remédier ! angel

   Les noms cin, cout, endl, sont tous définis dans la librairie standard du C++ (Standard Library) et tout ce qui est défini par la librairie standard se trouve dans l'espace de nom (namespace) std.
   Il nous suffit donc (avant le main()), d'ajouter l'instruction using namespace std;

   Ceci indiquera au compilateur que nous allons utiliser l'espace de nom standard, et dès lors nous n'aurons plus besoin d'écrire ces fastidieux std:: partout ! cheeky

 

         5 – Problème de saisie des chaînes de caractères

   Voyons le programme suivant (projet 004Rpg1) :

   Nous créons ici une variable de type char d'une taille suffisante pour, par exemple, recevoir la chaîne «Legends of Meruvia».

 
#include <iostream>
#include <conio.h>
 
using namespace std;
 
int main()
{
char rpgName[50];
 
cout << "Entrez le nom du rpg" << endl;
cin >> rpgName;
cout << "Le resultat de votre saisie est : " << rpgName << endl;
 
_getch();
return 0;
} 

 

   Compilez, pressez F5 et oh surprise... surprise le programme affiche simplement le premier mot soit «Legends». Que s'est-il passé ? crying

   Nous nous apercevons ainsi que cin n'arrive pas à afficher une phrase complète. En effet, lors de la saisie, cin a saisi les caractères 'L' 'e' 'g' 'e' 'n' 'd' 's' et quand il s'est aperçu que le caractère suivant le 's' était un espace, il a supposé que la saisie était terminée frown et c'est pourquoi, il a ajouté le caractère nul \0. angry

   Pour remédier à ce problème, le plus simple est d'utiliser la librairie «string» de la STL. Voyons comment faire, entrez le programme suivant (projet 005Rpg2) :

 

#include <iostream>
#include <conio.h>
#include <string>
 
using namespace std;
 
int main()
{
string rpgName("");
 
cout << "Entrez le nom du rpg" << endl;
getline(cin, rpgName);
cout << "Le resultat de votre saisie est : " << rpgName << endl;
 
_getch();
return 0;
} 

 

   Cette fois, si vous avez entré la chaîne «Legends of Meruvia», le résultat affiché sur la console sera bien «Legends of Meruvia» au complet. angel

   En premier lieu, nous avons inclus la librairie <string> dans notre programme. Nous avons ensuite déclaré rpgName de type string et comme le C++ aime bien que nous initialisions nos variables, nous l'avons fait avec une chaîne vide, mais nous aurions aussi bien pu écrire string rpgName;

   Nous avons pu saisir toute la phrase grâce à la fonction getline() qui prend cin et notre variable chaîne en paramètres. Et voilà notre problème de saisie de chaînes de caractères résolu ! laugh

   Quand nous aurons revu la théorie sur l'arithmétique des pointeurs et fait connaissance avec les références, nous présenterons quelques exemples de chaînes de caractères déclarées avec les nouvelles variables automatiques et un spécificateur de type du C++11 (mais ce sera pour plus tard ! wink).

   En outre, nous détaillerons les flux plus en profondeur à la suite de la première partie de notre étude de la POO.

 

         6 – Quelques mots sur les commentaires

   En C++, un commentaire commence avec une double barre oblique (double slash) et se termine par une nouvelle ligne.

Ex :  //Ceci est un commentaire.
        //Et en voici un autre.

   Néanmoins, les autres types de commentaires qui utilisent deux délimiteurs (/* et */) et qui sont hérités du langage C sont toujours valables en C++ et peuvent s'excécuter sur plusieurs lignes. wink

   En voici un court exemple (projet 006Comments) :

 
#include <iostream>
 
using namespace std;
 
int main()
{
// Tââ-Aâ est un archer du pharaon Amenhotep
// et nous allons lui demander son grade.
 
cout << "Hola archer ! De quelle compagnie es-tu et quel est ton grade ?" << endl;
cout << "Je suis capitaine de la garde des fils d'Amon." << endl;
 
/* Tââ-Aâ a l'air bien jeune, bien que bien bâti, et nous aimerions
connaitre son âge */
cout << "Quel est ton age, capitaine ?" << endl;
cout << "Je viens d'avoir 25 ans, mon Prince..." << endl;
 
cin.get();
return 0;
} 

 

   Ces commentaires parlent d'eux-mêmes, les premiers sont de type C++ et exigent un double slash à chaque ligne.

   Les seconds sont de type C, commencent par un slash suivi d'une étoile et ne se terminent qu à la fin des lignes de commentaire par une étoile suivie d'un slash.

 

   Et c'est tout pour ce premier chapitre ! angel

   J'espère que ce cours vous plaira. Comme vous pouvez le voir, nous n'allons pas trop vite et nous aurons l'occasion de revenir plusieurs fois sur des sujets déjà abordés tout en les approfondissant. wink


   Dans le prochain chapitre, nous allons parler des types de données, variables et constantes, de la création d'alias avec typedef et nous ferons une première approche des fonctions. cool

@ bientôt, smiley

Gondulzak.
  

 

 

Connexion

CoalaWeb Traffic

Today235
Yesterday178
This week735
This month4409
Total1743616

25/04/24