C++ Programme
C++ Programme
C++ Programme
Le C++ est le descendant du langage C. Ces deux langages, bien que semblables au premier abord, sont néanmoins
différents. Le C++ propose de nouvelles fonctionnalités qui permettent de programmer avec une approche différente.
Outil nécessaire :
Un éditeur de code comme Code::Blocks (mac, Windows, Linux).
using namespace std; indique que vous allez utiliser std (la libraire standard de iostream) dans la suite de votre fichier
de code.
N'oubliez pas d’utiliser endl pour réaliser des retours à la ligne, et de séparer chaque morceau de texte par les
chevrons <<
La ligne return
return 0;
Ce type d'instruction clôt généralement les fonctions. En fait, la plupart des fonctions renvoient une valeur (un nombre, par
exemple). Ici, la fonction main renvoie 0 pour indiquer que tout s'est bien passé (toute valeur différente de 0 aurait indiqué
un problème).
En plus de ces règles, il existe une convention partagée par beaucoup de programmeurs, pour harmoniser les
noms de variables et améliorer la lisibilité :
bool Une valeur parmi deux possibles, vrai (true) ou faux (false).
Nom du type Ce qu'il peut contenir
char Un caractère.
1. Son type.
2. Son nom.
3. Et la valeur qu'elle contient :
TYPE NOM(VALEUR);
int ageUtilisateur(16);
L'ordinateur voit qu'on veut emprunter un tiroir dans sa mémoire avec les propriétés suivantes :
int ageUtilisateur(16);
double pi(3.14159);
char lettre('a');
return 0;
Dans ce programme, nous n'avons pas encore déclaré de variables de type string. Et en fait, la procédure est un
peu particulière. En plus de la déclaration classique, il faut :
ajouter une ligne au début de votre programme, qui demande au compilateur d'inclure les outils
nécessaires à la gestion des strings, #include <string> :
#include <iostream>
#include <string>
using namespace std;
int main()
{
string nomUtilisateur("Albert Einstein");
return 0;
}
string prenom("Albert"), nom("Einstein");
D'ordinaire, lors de la déclaration d'une variable, votre programme effectue automatiquement deux opérations
successives :
1. Il demande à l'ordinateur de lui fournir une zone de stockage dans la mémoire. On parle alors
d'allocation de la variable.
2. Il remplit cette case avec la valeur fournie. On parle alors d'initialisation de la variable.
Quand on ne sait pas quelle valeur donner à une variable lors de sa déclaration, il est possible d'effectuer une allocation sans
initialisation.
Il suffit d'indiquer le type et le nom de la variable, sans spécifier de valeur : TYPE NOM;
int ageUtilisateur(16);
cout << "Votre age est : " << ageUtilisateur << endl;
#include <iostream>
#include <string>
int main()
{
int qiUtilisateur(150);
cout << "Vous vous appelez " << nomUtilisateur << " et votre QI vaut " << qiUtilisateur << endl;
return 0;
En fait, c'est la même chose en C++ : on peut coller une deuxième étiquette à une case mémoire (et même plus, si
on veut). On obtient alors un deuxième moyen d'accéder à la même case mémoire.
C'est un peu comme si on donnait un surnom à une variable en plus de son nom normal. On parle parfois d'alias, mais le mot correct
en C++ est référence.
On a une seule case mémoire, mais deux étiquettes qui lui sont accrochées.
Au niveau du code, on utilise une esperluette ( & ) pour déclarer une référence sur une variable :
int& maVariable(ageUtilisateur); //Déclaration d'une référence nommée maVariable qui est accrochée à la variable ageUtilisateur
À la ligne 1, on déclare une case mémoire nommée ageUtilisateur , dans laquelle on met le nombre 16. Et à la
ligne 3, on accroche une deuxième étiquette à cette case mémoire. On a donc dorénavant deux moyens
d'accéder au même espace dans la mémoire de notre ordinateur. On dit que maVariable fait référence
à ageUtilisateur .
La référence doit impérativement être du même type que la variable à laquelle elle est accrochée ! Un int& ne peut faire
référence qu'à un int , de même qu'un string& ne peut être associé qu'à une variable de type string .
#include <iostream>
int main()
cout << "Vous avez " << ageUtilisateur << " ans. (via variable)" << endl;
cout << "Vous avez " << maReference << " ans. (via reference)" << endl;
return 0;
}
Ce qui donne :
En résumé
Une variable est une information stockée en mémoire.
Les noms de variables peuvent contenir des lettres, des chiffres et des tirets bas _ uniquement ; le
premier caractère doit être une lettre ; on ne peut pas utiliser d'accents ou d'espaces.
C++ est sensible à la casse ; agemathieu est donc différent de ageMathieu .
Il existe différents types de variables en fonction de la nature de l'information à stocker
: int , char , bool …
Une variable doit être déclarée avant utilisation. Exemple : int ageUtilisateur(16); .
La valeur d'une variable peut être affichée à tout moment avec cout .
Les références sont des étiquettes qui permettent d'appeler une variable par un autre nom. Exemple : int&
maReference(ageUtilisateur); .
Question 1
int main()
return 0;
Quelle bibliothèque devez-vous absolument inclure dans le programme pour utiliser les fonctions d’affichage
et de saisie ?
o
o #include <stdlib.h>
o #include <iostream>
o #include <stdio.h>
o #include <display>
Question 2
Maintenant, vous allez simplifier le code en évitant de répéter l'espace de nommage std::.
Quelle instruction devez-vous ajouter après avoir inclues les bibliothèques pour pouvoir accéder à l’espace de
nommage de la bibliothèque standard ?
o namespace std;
o using std;
Quelles sont les bonnes méthodes pour ajouter des commentaires dans le code ?
o int main()
o {
o }
o
o /*
o */
o int main()
o {
o }
o
o #include <iostream> <!-- Inclut la bibliothèque iostream -->
o int main()
o {
o cout<< "J'adore ce QUIZ !" << endl; <!-- Affiche un message -->
o }
o int main()
o {
o }
Question 4
Vous souhaitez créer une variable qui contiendra un nombre décimal. Quel type est le plus adapté pour
stocker ce chiffre sans perdre d'information ?
bool
char
o
int
double
Question 5
Vous souhaitez créer une variable nommée booleen contenant un booléen initialisé à faux.
Quelle instruction choisissez-vous ?
o bool booleen(false);
Question 6
#include <iostream>
using namespace std;
int main()
double pi(3.1415);
return 0;
}
Quelle instruction faut-il ajouter après la déclaration de la variable pi pour afficher la valeur contenue dans
cette variable ?
o cout << pi
Question 7
Considérez le code suivant :
#include <iostream>
int main()
int longueur(2);
}
Comment créer une référence de la variable longueur que vous nommerez largeur ?
o int largeur(longueur);
o int& largeur(longueur);
o int largeur&(longueur);
o int* largeur(longueur);
Question 8
Dans le code ci-dessous, quelle est la valeur qui sera affichée dans la console à la fin du programme ?
#include <iostream>
int main()
int variable(12);
int& reference(variable);
variable = 27;
reference++;
27
o
12
28
13
#include <iostream>
int main()
cin >> ageUtilisateur; //On fait entrer un nombre dans cette case
cout << "Vous avez " << ageUtilisateur << " ans !" << endl; //Et on l'affiche
return 0;
Évidemment, ce que je vous ai présenté marche aussi avec d'autres types de variables :
nclude <iostream>
#include <string>
int main()
{
cout << "Quel est votre prenom ?" << endl;
string nomUtilisateur("Sans nom"); //On crée une case mémoire pour contenir une chaine de caractères
cin >> nomUtilisateur; //On remplit cette case avec ce qu'écrit l'utilisateur
double piUtilisateur(-1.); //On crée une case mémoire pour stocker un nombre réel
cin >> piUtilisateur; //Et on remplit cette case avec ce qu'écrit l'utilisateur
cout << "Vous vous appelez " << nomUtilisateur << " et vous pensez que pi vaut " << piUtilisateur << "." << endl;
return 0;
L'ordinateur n'a rien demandé pour pi, et le nom de famille a disparu ! Que s'est-il passé ?
C'est un problème d'espaces.
Quand on appuie sur la touche Entrée , l'ordinateur copie ce qui a été écrit par l'utilisateur dans la case mémoire. Mais il s'arrête au
premier espace ou retour à la ligne.
Il faudrait récupérer toute la ligne, pas juste le premier mot. Et si je vous en parle, c'est qu'il y a une solution pour
le faire : la fonction getline() .
Il faut remplacer cin >> nomUtilisateur; par getline(cin, nomUtilisateur) :
string nomUtilisateur("Sans nom"); //On crée une case mémoire pour contenir une chaine de caractères
getline(cin, nomUtilisateur); //On remplit cette case avec toute la ligne que l'utilisateur a écrit
Addition + resultat = a + b;
Soustraction - resultat = a - b;
Multiplication * resultat = a * b;
Division / resultat = a / b;
Modulo % resultat = a % b;
Si l'on utilise d'abord cin >> puis getline() , par exemple pour demander la valeur de pi avant de demander le
nom, le code ne fonctionne pas. L'ordinateur ne demande pas son nom à l'utilisateur, et affiche n'importe quoi.
Pour pallier ce problème, il faut ajouter la ligne cin.ignore() après l'utilisation des chevrons :
#include <iostream>
#include <string>
using namespace std;
int main()
double piUtilisateur(-1.); //On crée une case mémoire pour stocker unnombre réel
cin.ignore();
string nomUtilisateur("Sans nom"); //On crée une case mémoire pour contenir une chaine de caractères
getline(cin, nomUtilisateur); //On remplit cette case avec toute la ligne que l'utilisateur a écrit
cout << "Vous vous appelez " << nomUtilisateur << " et vous pensez que pi vaut " << piUtilisateur << "." << endl;
return 0;
}
Avec cela, plus de souci.
Pour modifier le contenu d'une variable de type int , on écrit le nom de la variable suivi du symbole = puis de la
nouvelle valeur.
C'est ce qu'on appelle l'affectation d'une variable.
int unNombre(0); //Je crée une case mémoire nommée 'unNombre' et qui contient le nombre 0
Addition + resultat = a + b;
Soustraction - resultat = a - b;
Multiplication * resultat = a * b;
Division / resultat = a / b;
Modulo % resultat = a % b;
Pour déclarer une constante, on ajoute le mot-clé const entre le type et le nom :
nombreJoueur++
#include <iostream>
int main()
{
double nombre(5.3);
return 0;
}
Ces opérations sont utiles quand il faut ajouter ou soustraire autre chose que 1.
#include <cmath>
La fonction racine carrée
Sqrt
Pour utiliser une fonction mathématique, on écrit le nom de la fonction suivi, entre parenthèses, de la valeur à
calculer. On utilise alors l'affectation pour stocker le résultat dans une variable :
resultat = fonction(valeur);
resultat = sqrt(valeur); .
Le cas particulier de la fonction puissance
1. Des conditions : elles permettent d'écrire dans le programme des règles du type : "Si ceci arrive, alors fais
cela".
2. Des boucles : elles permettent de répéter plusieurs fois une série d'instructions.
Symbole Signification
== Est égal à
!= Est différent de
En C++, il y a bien 2 symboles == pour tester l'égalité. On a tendance à oublier cela quand on débute…
Un seul = n'a pas la même signification. C'est un opérateur d'affectation simple et il signifie "affecter à".
Testez des variables avec la condition de base : if else
#include <iostream>
using namespace std;
int main()
{
int nbAnimaux(2);
if (nbAnimaux > 0)
{
cout << "Super ! Les animaux de compagnie ca change la vie !" << endl;
}
cout << "Fin du programme" << endl;
return 0;
}
Écrivez ce qu'il faut faire si la condition n'est pas vérifiée avec else
#include <iostream>
int main()
int nbAnimaux(0);
if (nbAnimaux > 0)
{
cout << "Super ! Les animaux de compagnie ca change la vie !" << endl;
else
return 0;
#include <iostream>
int main()
{
int nbAnimaux(2);
if (nbAnimaux == 0)
else if (nbAnimaux == 1)
cout << "C'est super d'avoir un fidele compagnon !" << endl;
else if (nbAnimaux == 2)
cout << "Ca doit en faire du monde a la maison !" << endl;
else
{
cout << "Votre budget croquettes doit etre important" << endl;
return 0;
#include <iostream>
int main()
int nbAnimaux(2);
switch (nbAnimaux)
case 0:
break;
case 1:
cout << "C'est super d'avoir un fidele compagnon !" << endl;
break;
case 2:
cout << "Ca doit en faire du monde a la maison !" << endl;
break;
default:
cout << "Votre budget croquettes doit etre important" << endl;
break;
return 0;
switch ne permet de tester que l'égalité. Vous ne pouvez pas tester "Si le nombre d'animaux est supérieur à 2"
avec switch : il faut dans ce cas utiliser if .
De plus, switch ne peut travailler qu'avec des nombres entiers ( int , unsigned int , char ). Il est impossible de
tester des nombres décimaux ( double ).
switch est donc limité en termes de possibilités, mais cette instruction propose une écriture alternative parfois
plus pratique dans des cas simples.
bool adulte(true);
if (adulte == true)
il est possible d'omettre la partie == true dans la condition, cela revient au même ! Regardez ce code, qui est
équivalent :
bool adulte(true);
if (adulte)
}
Combinez des conditions
Pour les conditions les plus complexes, sachez que vous pouvez faire plusieurs tests au sein d'un seul et même if . Pour
cela, il va falloir utiliser de nouveaux mots-clés :
and ET
or OU
not NON
Vous pourriez aussi utiliser les symboles hérités du langage C, car ils sont équivalents :
&& ET
|| OU
! NON
… mais je vous incite quand même à utiliser la méthode avec les mots-clés.
Notez que j'aurais également pu écrire cette condition ainsi :if (adulte == true and nbEnfants >= 1).
Cependant, comme je vous l'ai expliqué un peu plus tôt, il est facultatif de préciser « == true » sur les booléens,
et c'est une habitude que je vous invite à prendre.
Testez "OU" avec or
Pour faire un "OU", on utilise le mot-clé or .
if (not adulte)
Cela pourrait se traduire par "Si la personne n'est pas adulte".
1. while
2. do ... while
3. for
while (condition)
/* Instructions à répéter */
}
Tout ce qui est entre accolades sera répété tant que la condition est vérifiée.
Exemple : on redemande le nombre d'enfants à l'utilisateur tant que celui-ci est inférieur à 0. Ce genre de boucle
permet de s'assurer que l'utilisateur rentre un nombre correct :
int main()
cout << "Merci d'avoir indique un nombre d'enfants correct. Vous en avez " << nbEnfants << endl;
return 0;
int cpt=1;
while (cpt<=10){
cpt++;
une initialisation ;
une condition ;
une incrémentation.
Voici sa forme :
}
Regardons un exemple concret qui affiche des nombres de 0 à 9 :
int main()
int compteur(0);
return 0;
}
Vous pouvez faire autre chose qu'une incrémentation si vous le désirez. La dernière section du for est réservée à la
modification de la variable, et vous pouvez donc y faire une décrémentation ( compteur-- ) ou avancer de 2 en 2
( compteur += 2 ), etc.
Notez qu'il est courant d'initialiser la variable directement à l'intérieur du for , comme ceci :
int main()
}
return 0;
En résumé
Les boucles permettent de répéter les mêmes instructions plusieurs fois.
On distingue trois types de boucles : while , do... while et for .
La boucle for est généralement utilisée lorsqu'on sait combien de fois on souhaite répéter les instructions,
tandis que while et do... while sont plutôt utilisées lorsqu'on souhaite répéter des instructions jusqu'à ce
qu'une condition spécifique soit vérifiée.
Description
Dans ce quiz, vous allez construire au fur et à mesure des questions un convertisseur d’argent d’euros vers le
dollar américain, regroupant ce que vous avez pu apprendre lors de cette première partie.
Dans la réponse à la dernière question de ce quiz, vous trouverez le corrigé du programme complet. Bonne
chance !
Voici le point de départ du code :
#include <iostream>
Question 1
Vous devez tout d'abord créer la fonction main qui contiendra l’ensemble du programme. Quelle forme a la
fonction principale d’un programme C++ ?
o main()
o {
o }
o int start()
o {
o }
o int run
o {
o }
o
o int main()
o {
o }
Question 2
Vous allez maintenant implémenter les instructions du programme. Commencez par déclarer une variable de
type double qui permettra d’enregistrer la saisie de l’utilisateur. Vous allez l’initialiser à 0 pour l’instant et la
nommer euroUtilisateur .
Quelle est la bonne méthode pour déclarer et initialiser cette variable euroUtilisateur ?
euroUtilisateur = 0;
int euroUtilisateur = 0;
double euroUtilisateur(0);
euroUtilisateur(0);
Question 3
Ensuite, vous allez ajouter une variable constante qui contiendra le ratio qui permettra de convertir l’euro vers
le dollar. Ici, le ratio sera égal à 1,20 et la variable se nommera ratioDollar .
Quelle instruction permet de déclarer la constante ratioDollar avec la valeur 1,20 ?
ratioDollar = 1.20;
const ratioDollar(1.20);
Question 4
C'est le moment d'ajouter un petit message accueillant au démarrage du programme, car pour l’instant
l’utilisateur n’a pas beaucoup d’informations. Vous allez donc inclure le message suivant : "Convertisseur euro
-> dollar".
Quelle ligne devez-vous ajouter pour faire afficher ce message dans la console ?
Question 5
Passons aux choses sérieuses : vous allez demander à l’utilisateur de saisir le montant qu’il souhaite convertir
et récupérer cette saisie.
Quelles sont les deux lignes qui permettront d’indiquer à l’utilisateur d’écrire une valeur et de la récupérer afin
de l’enregistrer dans la variable euroUtilisateur ?
Question 6
Il est temps d’effectuer le calcul qui permet de convertir le montant en euros vers le dollar. Pour cela, il faut
effectuer une multiplication avec la saisie de l’utilisateur et le ratio.
Il ne faut pas oublier de créer une variable pour stocker le résultat de ce calcul.
Vous allez donc déclarer une variable resultat de type double .
Quelle instruction permet d’effectuer le calcul de la conversion et de le stocker dans la variable resultat :
euroUtilisateur x ratioDollar;
Question 7
Il y a un petit problème dans le code. Effectivement, il n'est pas nécessaire de faire la conversion si le
nombre saisi par l'utilisateur est négatif.
if (euroUtilisateur < 0)
else
cout << euroUtilisateur << "€ equivaut a " << resultat << "$" << endl;
o if (euroUtilisateur < 0)
o {
o cout << euroUtilisateur << "€ equivaut a " << resultat << "$" << endl;
o }
o else
o {
o }
o if (euroUtilisateur >= 0)
o {
o cout << euroUtilisateur << "€ equivaut a " << resultat << "$" << endl;
o }
o else
o {
o }
o if (euroUtilisateur >= 0)
o {
o else
o {
o cout << euroUtilisateur << "€ equivaut a " << resultat << "$" << endl;
o }
Question 8
Vous pouvez encore optimiser votre super convertisseur. Vous allez ajouter une instruction pour continuer à
demander à l'utilisateur d'entrer un nombre tant que la saisie n'est pas correcte (tant que la saisie n'est pas un
nombre positif). Vous n'avez pas le choix, vous devez ajouter une boucle.
Quelles boucles sont les plus adaptées pour répéter cette demande tant que la saisie est incorrecte ?
do...while
while
loop
for
//
// main.cpp
// convertisseur
//
//
#include <iostream>
int main() {
double euroUtilisateur(0);
if (euroUtilisateur < 0)
else
cout << euroUtilisateur << "€ équivaut à " << resultat << "$" << endl;
return 0;
int main() {
double euroUtilisateur(0);
do
if (euroUtilisateur < 0)
}
else
cout << euroUtilisateur << "€ équivaut à " << resultat << "$" << endl;
return 0;
*/
Nous allons créer ensemble une fonction ajouteDeux et on va voir comment l'appeler dans le main :
Créez une fonction qui prend plusieurs paramètres
Il y a des fonctions qui prennent plusieurs paramètres, comme pow() et getline() , par exemple.
Pour passer plusieurs paramètres à une fonction, il faut les séparer par des virgules :
return a+b;
return a*b*c;
}
La première de ces fonctions calcule la somme des deux nombres qui lui sont fournis, alors que la deuxième
calcule le produit des trois nombres reçus.
À l'inverse, on peut aussi créer des fonctions sans arguments. Il suffit de ne rien écrire entre les parenthèses !
Pensez par exemple à une fonction qui demande à l'utilisateur d'entrer son nom ; elle n'a pas besoin de paramètre
:
string demanderNom()
string nom;
return nom;
Tous les exemples jusque-là prenaient des arguments et renvoyaient une valeur. Mais il est aussi possible d'écrire
des fonctions qui ne renvoient rien. Enfin presque : rien ne ressort de la fonction mais, quand on la déclare, il faut
quand même indiquer un type.
void direBonjour()
{
cout << "Bonjour !" << endl;
//Comme rien ne ressort, il n'y a pas de return !
}
int main()
{
direBonjour();
//Comme la fonction ne renvoie rien
//On l'appelle sans mettre la valeur de retour dans une variable
return 0;
}
#include <iostream>
int main()
dessineRectangle(largeur, hauteur);
return 0;
}
Une fois compilé, ce programme s'exécute et donne par exemple :
Largeur du rectangle : 16
Hauteur du rectangle : 3
****************
****************
****************
int ajouteDeux(int a)
a+=2;
return a;
#include <iostream>
int ajouteDeux(int a)
a+=2;
return a;
}
int main()
resultat = ajouteDeux(nombre);
cout << "Le nombre original vaut : " << nombre << endl;
cout << "Le resultat vaut : " << resultat << endl;
return 0;
}
Cela donne sans surprise :
{
a+=2;
return a;
}
Lorsque l'on appelle la fonction, il n'y a plus de copie. Le programme donne simplement un alias à la variable nombre
Utiliser des références peut donc être très dangereux. C'est pour cela qu'on ne les utilise que lorsqu'on en a réellement
besoin.
L'exemple classique, c'est la fonction echange() ; elle échange les valeurs des deux arguments qu'on lui fournit :
b = temporaire; //Et on utilise la valeur sauvegardée pour mettre l'ancienne valeur de 'a' dans 'b'
int main()
cout << "a vaut " << a << " et b vaut " << b << endl;
cout << "a vaut " << a << " et b vaut " << b << endl;
return 0;
}
Ce code donne le résultat suivant :
a vaut 1.2 et b vaut 4.5
a vaut 4.5 et b vaut 1.2
Les valeurs des deux variables ont été échangées.
Si l'on n'utilisait pas un passage par référence, ce seraient alors des copies des arguments qui seraient échangées, et non les vrais
arguments. Cette fonction serait donc inutile.
En utilisant un passage par référence, aucune copie n'est effectuée. Seulement, cette manière de procéder a un petit défaut
: elle autorise la modification de l'argument (c'est justement dans ce but que les références existent.)
La solution est d'utiliser ce que l'on appelle un passage par référence constante. On évite la copie en utilisant
une référence, et l'on empêche la modification de l'argument en le déclarant constant.
1. Un fichier source dont l'extension est .cpp : il contient le code source de la fonction.
2. Un fichier d'en-tête dont l'extension est .hpp : il contient uniquement la description de la fonction, ce qu'on
appelle le prototype de la fonction.
Créons donc ces deux fichiers pour notre fonction ajouteDeux() :
return valeur;
}
Manipulez des tableaux statiques
Les tableaux dont la taille est fixée à l'avance sont plus faciles à utiliser
Voyons cela avec un exemple : la liste des meilleurs scores d'un jeu.
Si vous voulez afficher la liste des 5 meilleurs scores des joueurs, il va vous falloir en réalité deux listes :
string nomMeilleurJoueur1("Nanoc");
string nomMeilleurJoueur2("M@teo21");
string nomMeilleurJoueur5("Archimede");
int meilleurScore1(118218);
int meilleurScore2(100432);
int meilleurScore3(87347);
int meilleurScore4(64523);
int meilleurScore5(31415);
Et pour afficher tout cela, il va aussi falloir pas mal de travail :
cout << "1) " << nomMeilleurJoueur1 << " " << meilleurScore1 << endl;
cout << "2) " << nomMeilleurJoueur2 << " " << meilleurScore2 << endl;
cout << "3) " << nomMeilleurJoueur3 << " " << meilleurScore3 << endl;
cout << "4) " << nomMeilleurJoueur4 << " " << meilleurScore4 << endl;
cout << "5) " << nomMeilleurJoueur5 << " " << meilleurScore5 << endl;
C'est là qu'interviennent les tableaux : nous allons pouvoir déclarer les 100 meilleurs scores et les noms des 100 meilleurs
joueurs d'un seul coup.
Dans cet exemple, nous avons besoin de 100 variables, c'est-à-dire 100 places dans le tableau. C'est ce qu'on
appelle, en termes techniques, la taille du tableau.
Si la taille du tableau reste inchangée et est fixée dans le code source, alors on parle d'un tableau statique
On indique le type, puis le nom choisi et enfin, entre crochets, la taille du tableau :
TYPE NOM[TAILLE];
Voyons cela avec un exemple :
#include <iostream>
int main()
return 0;
}
On retrouve les deux zones mémoire avec leurs étiquettes mais, cette fois, chaque zone est découpée en cases : trois cases
pour le tableau anglesTriangle et cinq cases pour le tableau meilleurScore .
Pour l'instant, aucune de ces cases n'est initialisée. Leur contenu est donc quelconque.
Il est également possible de déclarer un tableau en utilisant comme taille une constante de type int ou unsigned
int. On indique simplement le nom de la constante entre les crochets, à la place du nombre :
double anglesIcosagone[tailleTableau];
Nous avons de la place dans la mémoire. Il ne nous reste plus qu'à l'utiliser.
Pour accéder à une case, on utilise la syntaxe nomDuTableau[numeroDeLaCase] . Il y a simplement une petite subtilité : la
première case possède le numéro 0 et pas 1. Tout est en quelque sorte décalé de 1.
Pour accéder à la troisième case de meilleurScore et y stocker une valeur, il faudra donc écrire :
meilleurScore[2] = 5;
En effet, 3−1=2 ; la troisième case possède donc le numéro 2. Si je veux remplir mon tableau des meilleurs scores
comme dans l'exemple initial, je peux donc écrire :
int const nombreMeilleursScores(5); //La taille du tableau
}
La variable i prend successivement les valeurs 0, 1, 2, 3 et 4, ce qui veut dire que les valeurs
de meilleursScores[0] , puis meilleursScores[1] , etc., sont envoyées dans cout .
double notes[nombreNotes];
Étape 2 : remplissez ce tableau avec vos notes
J'espère que vous savez encore comment faire :
int const nombreNotes(6);
double notes[nombreNotes];
notes[0] = 12.5;
notes[3] = 12;
notes[4] = 14.5;
notes[5] = 15;
#include <iostream>
int main()
double notes[nombreNotes];
notes[0] = 12.5;
notes[3] = 12;
notes[4] = 14.5;
notes[5] = 15;
double moyenne(0);
//En arrivant ici, la variable moyenne contient la somme des notes (79.5)
moyenne /= nombreNotes;
cout << "Votre moyenne est : " << moyenne << endl;
return 0;
}
Voyons ce que cela donne quand on l'exécute :
int main()
{
int const taille = 3;
double tableau[taille];
double moyenne = 0;
moyenne += tableau[i-1];
return 0;
1. On ne peut pas écrire une fonction qui renvoie un tableau statique. C'est impossible.
2. Un tableau statique est toujours passé par référence. Et il n'y a pas besoin d'utiliser l'esperluette ( & ) : c'est
fait automatiquement. Cela veut dire que, lorsqu'on passe un tableau à une fonction, cette dernière peut le
modifier.
Voici donc une fonction qui reçoit un tableau en argument :
//…
}
Il ne faut rien mettre entre les crochets.
Mais ce n'est pas tout ! Très souvent, on veut parcourir le tableau, avec une boucle for par exemple. Il nous
manque une information cruciale la taille du tableau ! Il faut donc impérativement ajouter un deuxième argument
contenant la taille :
//…
Pour vous entraîner, je vous propose d'écrire une fonction moyenne() qui calcule la moyenne des valeurs d'un
tableau. Voici ma version :
/*
*/
double moyenne(0);
moyenne /= tailleTableau;
return moyenne;
type nomTableau[tailleX][tailleY]
Pour reproduire le tableau du schéma, on doit déclarer le tableau suivant :
int tableau[5][4];
Ou encore mieux, en déclarant des constantes :
int const tailleX(5);
int tableau[tailleX][tailleY];
LA POO EN C++
Une classe représente le modèle structurel d’un objet. Elle est composée :
L'encapsulation consiste à masquer l'accès à certains attributs et méthodes d'une classe. Elle est réalisée à l'aide des mots
clés :
private : les membres privés ne sont accessibles que par les fonctions membres de la classe. La partie privée est aussi
appelée réalisation.
protected : les membres protégés sont comme les membres privés. Mais ils sont aussi accessibles par les fonctions
membres des classes dérivées (voir l'héritage).
public : les membres publics sont accessibles par tous. La partie publique est appelée interface.
Les mots réservés private, protected et public peuvent figurer plusieurs fois dans la déclaration de la classe.
1. ENTÊTE DANS LE .HPP
Tout comme il est préconisé de le faire en C pour une fonction, l’entête d’une classe est généralement placé dans un fichier
avec l’extension .hpp (.h pour le C). Voici la déclaration type d’une classe :
class maClasse {
private :
// on place ici les données et méthodes inaccessibles de l’extérieur
// (cette partie ne sera pas non plus accessible par héritage - nous verrons cela plus loin)
int a ; // déclaration d’une variable privée
protected :
// partie visible uniquement par les classes dérivées
public :
// partie visible de l’extérieur, c’est ici qu’on place généralement les méthodes
// permettant d’accéder aux élément de la section private.
int b ;
int valeurA(void) ; // méthode pour accéder à la variable a - principe d’encapsulation.
void modifierA(int) ; // idem
int additionnerA(int) ; // idem
int init( ) ;
} ;
2. DÉFINITION DANS LE .CPP
C’est dans le fichier comportant l'extention .cpp que l’on écrit le corps de la classe décrite dans le fichier .hpp.
Afin d’éviter toute ambiguïté, on prendra soin de préciser pour chaque implémentation le nom de la classe s’y rapportant.
#include "maClasse.hpp"
//…
3. INSTANCIATION ET UTILISATION
Il existe deux manières d’instancier des classes selon que l’on passe par des pointeurs ou non.
#include " maClasse.hpp "
int main(void) {
maClasse c1;
c1.modifierA(10) ; // on fixe la valeur de a à 10.
c1.b = 15 ;
c1.a = 12 ; // NON, attribut privé
}
Exercice pratique
Ecrire une classe Compte qui permet de créditer un compte bancaire et d’afficher ses informations
Compte.cpp
#include "Compte.hpp"
Compte::Compte()
//ctor
}
Compte::~Compte()
//dtor
// Surcharge du constructeur
nom = nnom;
solde = nsolde;
double Compte::getSolde(){
return solde;
solde += montant;
}
void Compte::afficherInfos(){
Main.cpp
#include <iostream>
#include "Compte.hpp"
int main()
c1.addMontant(100.0);
c1.afficherInfos();
return 0;
Compte.hpp
#ifndef COMPTE_H
#define COMPTE_H
#include <string>
#include <iostream>
class Compte
public:
Compte();
Compte(std::string nom, double solde);
virtual ~Compte();
void afficherInfos();
double getSolde();
protected:
private:
double solde;
std::string nom;
};
#endif // COMPTE_H