SlideShare une entreprise Scribd logo
1  sur  84
Télécharger pour lire hors ligne
Prof. Aziz DAROUICHI
1
Programmation Orientée Objet (C++):
Les tableaux
2
Notion de Tableaux
Tableaux statiques
Tableaux statiques multidimensionnels
Les tableaux statiques et les fonctions
Tableaux statiques en C++11
Les tableaux statiques array et les fonctions
Tableaux dynamiques
Fonctions spécifiques
Tableaux dynamiques multidimensionnels
Les tableaux dynamiques et les fonctions
Les tableaux dynamiques multidimensionnels et les fonctions
Q & A
Références
Notion de Tableaux
Tableaux statiques
Tableaux statiques multidimensionnels
Les tableaux statiques et les fonctions
Tableaux statiques en C++11
Les tableaux statiques array et les fonctions
Tableaux dynamiques
Fonctions spécifiques
Tableaux dynamiques multidimensionnels
Les tableaux dynamiques et les fonctions
Les tableaux dynamiques multidimensionnels et les fonctions
Q & A
Références
Les tableaux en C++
3
Notion de Tableaux
Array
Un tableau est une collection indexée d’éléments (valeurs)
homogènes tous du même type.
Structure à part entière
Il est caractérisé par sa taille et par le type de ses éléments
Un tableau est un objet référencé
Assimilable à une classe
33
4
Notion de Tableaux
Il existe deux sortes de tableaux
Ceux dont la taille est connue à l'avance, les tableaux statiques.
Ceux dont la taille peut varier en permanence, les tableaux dynamiques.
Utilisation des tableaux
Stockage de plusieurs variables de même type.
44
Tableaux statiques:
a) C-Style array
b) std::array
Syntaxe générale
type nomDuTableau[taille_maximale];
Exemple:
1) float t[10]; //réserve l’emplacement pour 10 éléments de type float
2) int tab[12]; //réserve l’emplacement pour 12 éléments de type int
6
Déclaration d‘un tableau
6
La dimension d’un tableau (son nombre d’éléments) ne peut être
qu’une constante ou une expression constante.
Ainsi, cette construction est correcte :
const int N(50);
int t[N];
float tab[2*N-1] ;
7
Déclaration d‘un tableau
7
Initialisation de tableaux à un indice
Chaque élément initialisé séparément:
int const tailleTab(5);
double tab[tailleTab];
tab[0] = 11.5;
tab[1] = 19;
tab[2] = 6.5;
tab[3] = 13.;
tab[4] = 15.5;
8
Création d’un tableau
8
Initialisation de tableaux à un indice
Chaque élément initialisé séparément par une boucle:
const int N(20);
int tab[N] ;
for (int i(0); i < N; i++) tab[i] = i;
9
Création d’un tableau
9
Initialisation de tableaux à un indice
Exemples:
int tab[5] = { 1, 120, 15, 10, 13 };
Il est possible de ne mentionner dans les accolades que les premières
valeurs, comme dans ces exemples :
int tab[5] = { 1, 120 } ;
int tab[5] = { 1, 120, 15 } ;
10
Création d’un tableau
10
Initialisation de tableaux à un indice
Il est possible d’omettre la dimension du tableau, celle-ci étant
alors déterminée par le compilateur par le nombre de valeurs
énumérées dans l’initialisation.
Exemple:
int tab[] = { 1, 120, 15, 10, 13} ;
11
Création d’un tableau
11
Déclaration-initialisation
Exemples:
1. int notes [] = {14, 16, 18, 17, 15};
2. double valeursNum[] = {1.2, 3.4, 2*5.6};
3. char valCarac[] = {‘a’, ‘b’, ‘c’};
4. string jours[] = {"lundi", "mardi", "mercredi", "jeudi", "vendredi",
"samedi", "dimanche"};
5. int joursParMois[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
6. int n, p ;
...
int tableau[] = {1, n, n+p, 2*p, 12} ;
12
Création d’un tableau
12
Initialisation de tableaux à un indice
On peut déclarer un tableau constant et l’initialiser comme suit :
const char voyelles[] = {‘a’, ‘e’, ‘i’, ‘o’, ‘u’, ‘y’};
Bien entendu, toute tentative ultérieure de modification du
tableau sera rejetée :
voyelles[2] = ’j’ ; // interdit
13
Création d’un tableau
13
14
Utilisation des Tableaux
Accès individuel aux éléments d’un tableau
1414
15
Utilisation des Tableaux
Affectation de tableaux
Considérons ces instructions qui créent deux tableaux d’entiers
tab1 et tab2 :
int tab1[4] ;
for (int i(0) ; i<4 ; i++) tab1[i] = i ;
int tab2[4] ;
for (int i(0); i<4 ; i++) tab2[i] = 10 + i ;
Exécutons maintenant l’affectation :
tab1 = tab2 ; // Error: affectation impossible
1515
Utilisation des Tableaux
Parcours d’un tableau de taille fixe
Exemple:
double tab[] = {1.1, 2.2, 3.3, 4.4};
cout << tab;
affiche la référence au tableau tab, donc une adresse mémoire.
Résultat:
0x28fef0
1616
Utilisation des Tableaux
Parcours d’un tableau de taille fixe
Utilisation de la boucle for classique
double tab[] = {1.1, 2.2, 3.3, 4.4};
for (int i(0); i<4; i++){
cout << tab[i];
}
1717
Utilisation des Tableaux
Parcours d’un tableau de taille fixe depuis C++11
Utilisation de la boucle for classique
double tab[] = {1.1, 2.2, 3.3, 4.4};
for (size_t i(0); i<4; i++){
cout << tab[i];
}
1818
Utilisation des Tableaux
Parcours d’un tableau de taille fixe depuis C++11
Utilisation de la boucle for-each
type: le type des éléments du tableau.
On peut également utiliser cette syntaxe :
for (auto elem : tableau ) instruction
1919
Utilisation des Tableaux
Parcours d’un tableau de taille fixe depuis C++11
Utilisation de la boucle for-each
Exemples: itération sur ensemble de valeurs
1)
double tab[] = {1.1, 2.2, 3.3, 4.4} ;
for (double val : tab){ //ou for (auto val : tab)
cout << val << endl;
}
2)
string villes[] = {"Rabat", "Berlin", "Paris", "Marrakech"};
for (auto str : villes) //type est auto, donc celui de str est déduit du type du
tableau villes
cout << str << endl;
2020
Utilisation des Tableaux
Utilisation de la boucle for-each
Remarque importante
Il faut bien noter que la boucle for-each:
Ne permet d’itérer que sur un seul tableau à la fois: il n’est pas
possible de traverser en une passe deux tableaux pour les comparer
par exemple.
Ne permet l’accés qu’à un seul élément du tableau: on ne peut pas
par exemple comparer un élément du tableau et son suivant.
Ne permet pas d’itèrer d’un pas en avant, de sauter des
éléments…
2121
Utilisation des Tableaux
Utilisation de la boucle for-each
Remarque importante (suite)
Pour permettre modifier le contenu du tableau, on utilise la syntaxe
suivante:
for (auto& elem : tableau ) instruction
Exemple:
double notes[6]={15, 16, 17, 18, 19, 20};
cout << " Voici le contenu du tableau : " << endl;
for(auto &note : notes) {
cout << " " << note << endl;
}
2222
Tableaux multidimensionnels
Comment déclarer un tableau à plusieurs dimensions?
On ajoute seulement un crochet [] de plus:
C’est en fait un tableau de tableaux (de tableaux, de tableaux,…)
2323
Tableaux multidimensionnels
2424
Syntaxe générale
Type nomDuTableau[taille_maximale1] [taille_maximale2]…[taille_maximaleN];
Exemple:
1) double matrice[3][4]; // tableau bidimensionnel
2) int mat[10][10];
N.B : Aucune limitation ne pèse sur le nombre d’indices que peut
comporter un tableau.
25
Déclaration d’un tableau multidimensionnel
25
Initialisation de tableaux à plusieurs indices
La première forme revient à considérer notre tableau comme
composé de trois tableaux de quatre éléments chacun:
int tab [3] [4] = { { 1, 2, 3, 4 } ,{ 5, 6, 7, 8 },{ 9, 10, 11, 12 }};
La seconde exploite la manière dont les éléments sont effectivement
rangés en mémoire, et elle se contente d’énumérer les valeurs du tableau
suivant cet ordre:
int tab [3] [4] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 } ;
26
Création d’un tableau multidimensionnel
26
Initialisation de tableaux à plusieurs indices
Là encore, à chacun des deux niveaux, les dernières valeurs peuvent
être omises.
Exemple:
Les déclarations suivantes sont correctes (mais non équivalentes):
int tab[3] [4] = { { 1, 2 } , { 3, 4, 5 } } ;
int tab[3] [4] = { 1, 2 , 3, 4, 5 } ;
27
Création d’un tableau multidimensionnel
27
Il est impossible d’écrire une fonction qui renvoie un tableau statique à
la C (C-style array).
Un tableau statique est toujours passé par référence.
Il n'y a pas besoin d'utiliser l'esperluette (&) : c'est fait
automatiquement.
Dans ce cas, lorsqu'on passe un tableau à une fonction, cette dernière
peut le modifier.
28
Les tableaux statiques et les fonctions
28
Exemple d’une fonction qui passe en argument un tableau statique :
void fonctionStatique(double tableau[], int tailleDuTableau)
{
Bloc d’instructions;
}
29
Les tableaux statiques et les fonctions
29
Appel d’une fonction qui passe en argument tableau statique:
Pour appeler une fonction recevant un tableau statique et sa taille en
argument, il n'y a rien de particulier à faire.
Il suffit de mettre le nom du tableau statique et sa taille comme
paramètres entre parenthèses lors de l'appel.
Exemple 1:
double tableau[]={1.5, 2.5, 3.5, 4.5}; //On crée un tableau de 4 réels
fonctionStatique(tableau, 4); //On passe le tableau et sa taille à la fonction
30
Les tableaux statiques et les fonctions
30
Exemple 2:
Écrire une fonction maxTab() qui calcule le maximum des valeurs
d'un tableau.
Réponse:
double maxTab(double tab[], int tailleDuTableau){
double max(tab[0]);
for(int i(1); i<tailleDuTableau; ++i){
if (max<tab[i]) max = tab[i];
}
return max;
}
31
Les tableaux statiques et les fonctions
31
Déclaration d’un tableau de taille fixe
std::array est un conteneur qui encapsule des tableaux de taille
constante (connue à la compilation).
Le type du tableau est défini dans la bibliothèque array.
Pour les utiliser, il faut ajouter en début de programme :
#include <array>
La syntaxe pour déclarer un tableau de taille fixe est la suivante :
array<type_du_tableau, taille_du_tableau> nom_du_tableau;
32
Les tableaux statiques en C++11
32
Déclaration d’un tableau de taille fixe
Exemple:
#include <array>
...
array<int, 5> vecteur; // déclaration d’un tableau de 5 entiers, initialisés à 0.
const size_t N(10);
array<double, N> ages; // déclaration d’un tableau de 10 double, initialisés à 0.
33
Les tableaux statiques en C++11
33
Initialisation d’un tableau de taille fixe
Un tableau de type array peut être initialisé directement lors de sa déclaration:
array<type_du_tableau, taille_tableau> nom_du_tableau({val_1, ... , val_tailleTableau});
Ou
array<type_du_tableau, taille_tableau> nom_du_tableau{val_1, ... , val_tailleTableau};
Ou
array<type_du_tableau, taille_tableau> nom_du_tableau = {val_1, ... , val_tailleTableau};
34
Les tableaux statiques en C++11
34
Initialisation d’un tableau de taille fixe
Exemple:
const size_t taille(7);
array<double, taille> notes ({16, 16.75, 17, 17.75, 18, 18.75, 19} );
// ou :
array<double, taille> notes{16, 16.75, 17, 17.75, 18, 18.75, 19} ;
// ou :
array<double, taille> notes ={16, 16.75, 17, 17.75, 18, 18.75, 19} ;
35
Les tableaux statiques en C++11
35
Utilisations d’un tableau de taille fixe
L’accès aux éléments d’un tableau de taille fixe en C++11 se fait de
la façon suivante :
directement : tableau[i]
par la boucle for-each : for(auto element : tableau)
par la boucle for « classique »
36
Les tableaux statiques en C++11
36
Utilisations d’un tableau de taille fixe
Les tableaux de taille fixe array ont aussi une fonction size() qui
renvoie leur taille.
Les affectations globales de tableaux de taille fixe array sont
acceptables :
array<int, 5> tableau1 = { 10, 20, 30, 40, 50 } ;
array<int, 5> tableau2 ;
...
tableau2 = tableau1 ; // copie de tout tableau1 dans tableau2
37
Les tableaux statiques en C++11
37
Fonctions spécifiques
tableauArray.size(): renvoie le nombre d’éléments du tableau.
tableauArray.empty(): vérifie si le tableau est vide ou non (bool).
tableauArray.front(): renvoie le premier élément du tableau.
tableauArray.back(): renvoie le dernier élément du tableau.
tableauArray.at(pos): renvoie l’élément à la position donnée pos.
tableauArray.fill(valeur): attribue la valeur donnée, valeur, à chaque
élément du tableau.
Pour plus de détails sur les array (std::array) voir ce lien:
https://en.cppreference.com/w/cpp/container/array
38
Les tableaux statiques en C++11
38
Exemple:
const size_t taille(7);
array<double, taille> notes ({16, 16.75, 17, 17.75, 18, 18.75, 19} );
cout<<notes.at(1)<<endl; // affiche 16.75
cout<<notes.front()<<endl; // affiche 16
cout<<notes.back()<<endl; // affiche 19
cout<<notes.size()<<endl; // affiche 7
cout<<notes.empty()<<endl; // affiche 0 (false)
array<double, 3> arr;
arr.fill(10.5); // remplit le tableau arr par 10.5, donc arr = {10.5, 10.5,
10.5}.
39
Fonctions spécifiques
39
Tableaux multidimensionnels
On peut déclarer des tableaux multidimensionnels de taille fixe.
Exemples:
array<array<int, 4>, 4> matrice;
array<array<int, N>, M> statistiques;
array<array<array<int, 4>, 2>, 3> tensor;
matrice[1][0] = 20;
statistiques[i] est un « array<int, N> », c’est-à-dire un tableau de N
entiers.
statistiques est bien un tableau de tableaux.
40
Les tableaux statiques en C++11
40
Les tableaux multidimensionnels array peuvent également être
initialisés lors de leur déclaration.
array<array<int, 3>, 4> matrice = {
1, 2, 3 ,
4, 5, 6 ,
7, 8, 9 ,
10, 11, 12
};
41
Tableaux multidimensionnels
41
1 2 3
4 5 6
7 8 9
10 11 12
matrice[][j]matrice[i]
matrice[1][2]
matrice[0]
1 2 3
On affiche les éléments du tableau matrice par la boucle for-each:
for (auto ligne : matrice){
for (auto elm : ligne){
cout << elm << " ";
}
cout << endl;
}
4242
Tableaux multidimensionnels
array en paramètre d'une fonction
Un std::array comme paramètre d’une fonction a le même
comportement qu’une variable de base (int, double, float, …).
Règle: toujours passer std :: array par référence ou par référence
constante.
Exemple:
void afficherTableau(array<int,4> &tab){
cout<<"Affichage des valeurs du tableau"<<endl;
for(auto v : tab) cout<<v<<" ";
}
43
Les tableaux statiques array et les fonctions
43
Tableaux dynamiques:
std::vector
Déclaration d’un tableau dynamique
Un tableau dynamique, est une collection de données homogènes, dont la
taille peut varier au cours du déroulement du programme.
std::vector est un conteneur séquentiel qui encapsule les tableaux de taille
dynamique.
La première à faire, il faut ajouter la ligne #include <vector> pour utiliser
les tableaux dynamiques.
La syntaxe pour déclarer un tableau dynamique est la suivante:
vector<type_du_tableau> nom_du_tableau;
ou en spécifiant la taille du tableau:
vector<type_du_tableau> nom_du_tableau (taille);
45
Tableau dynamique
45
Exemple:
#include <iostream>
#include <vector> //Ne pas oublier !
using namespace std;
int main()
{
vector<double> tab(10); //std:: vector<double> tab(10);
vector<int> myVector; //Déclaration d'un vecteur d'entiers de taille non connue
return 0;
}
46
Tableau dynamique
46
En C++11, il y a cinq façons d’initialiser un tableau dynamique :
vide
avec une taille initiale donnée et tous les éléments « nuls »
avec une taille initiale donnée et tous les éléments à une même
valeur donnée
avec une copie d’un autre tableau
avec un ensemble de valeurs initiales
47
Initialisation d’un tableau dynamique
47
Exemple:
1) vector<int> tableau; //Crée un tableau de 0 entiers
2) vector<int> tab(5); //correspond à la déclaration d’un tableau initialement
// constitué de 5 entiers, tous nuls.
3) vector<string> noms(10); //Crée un tableau dont les éléments sont de type
//string
4) vector<double> tab(7, 3.5);
//Crée un tableau de 7 nombres à virgules valant tous 3.5
5) vector<string> listeDesNoms(10, "nom");
//Crée un tableau de 10 strings valant toutes "nom"
6) vector<double> tab2(tab);
//Pour initialiser les éléments de tab2 aux mêmes valeurs que tab.
7) vector<int> Tab({10, 20, 30}); ou vector<int> Tab{10, 20, 30};
//initialise le tableau Tab par un ensemble de valeurs.
4848
Initialisation d’un tableau dynamique
Depuis la norme C++11, on peut initialiser un tableau dynamique
avec des valeurs initiales différentes, voici la syntaxe :
vector<type_du_tableau> nom_du_tableau ({val1, …, valn});
Ou
vector<type_du_tableau> nom_du_tableau {val1, …, valn};
Exemple:
vector<double> notes({ 17.5, 18, 19.5, 16.75, 15.5 });
Ou
vector<double> notes{17.5, 18, 19.5, 16.75, 15.5 };
Ou avec cette manière:
vector<double> notes = { 17.5, 18, 19.5, 16.75, 15.5 };
49
Initialisation d’un tableau dynamique
49
On peut également initialiser un tableau dynamique en utilisant une
copie d’un autre tableau dynamique, voici la syntaxe :
vector<type_du_tableau> nom_du_tableau (autreTableau);
où autreTableau est un tableau dynamique de même type de base
type_du_tableau.
Exemple:
vector<double> tab1(5, 19.5);
vector<double> tab2(tab1);
50
Initialisation d’un tableau dynamique
50
Affectation globale
On parle ici de l’affectation d’un tableau complet, dans sa totalité.
La syntaxe est :
tableau1 = tableau2 ; //copie de tout tableau1 dans tableau2
où tableau2 est un tableau de même type que tableau1.
Exemple:
vector<int> tab1({ 10, 20, 30 });
vector<int> tab2;
tab2 = tab1 ; // copie de tout tab1 dans tab2
51
Tableau dynamique
51
Accès aux éléments d'un tableau dynamique
On utilise également les crochets [] et la première case possède aussi
le numéro 0.
52
Tableau dynamique
52
Exemple
int const tailleTab(5); //La taille du tableau
vector<int> tableau(tailleTab); //Déclaration du tableau
tableau[0] = 828; //Remplissage de la première case
tableau[1] = 132; //Remplissage de la deuxième case
tableau[2] = 847; //Remplissage de la troisième case
tableau[3] = 623; //Remplissage de la quatrième case
tableau[4] = 35; //Remplissage de la cinquième case
vector<int> tableau2(tailleTab);
tableau2 = tableau;
53
Tableau dynamique
53
Il existe en fait au moins trois façons d’itérer sur un tableau :
avec la boucle for-each depuis la norme C++11:
for (type elem : tableau ) instruction
ou
for (auto elem : tableau ) instruction
ou
for (auto& elem : tableau ) instruction
avec la boucle for « classique » :
for(int i(0); i < tableau.size(); ++i)
ou
for(size_t i(0); i < tableau.size(); ++i)
avec des itérateurs (voir les chapitres suivants).
54
Parcours d’un tableau dynamique
54
Exemple:
vector<double> notes(4);
for (auto& note : notes) {
cout << " Saisir une note : ";
cin >> note;
}
cout << " Voici les notes saisies : " << endl;
for(auto note : notes) {
cout << " " << note << endl;
}
55
Parcours d’un tableau dynamique
55
Remarque: (la norme C++11)
Il est bien noter que c’est une bonne idée de rendre votre élément
constant si vous avez l’intention de l’utiliser en lecture seule:
int array[5] = { 9, 7, 5, 3, 1 };
for (const auto& element: array) // element est une référence constante à
// l'élément de tableau itéré
std::cout << element << " ";
56
Parcours d’un tableau dynamique
56
Il y a un certain nombre de fonctions sont prédéfinies dans la classe
vector.
L’utilisation d’une fonction spécifique se fait avec la syntaxe suivante:
nom_de_tableau.nom_de_fonction(arg1, arg2, ...);
57
Fonctions spécifiques
57
Ajout des cases à la fin du tableau
Pour ajouter des éléments à la fin d‘un tableau. Il faut utiliser la
fonction push_back().
La syntaxe est la suivante:
nom_du_tableau. push_back(valeur_a_ajouter);
58
Fonctions spécifiques
58
Ajout des cases à la fin du tableau
Exemple:
vector<int> tab(3,2); //Un tableau de 3 entiers valant tous 2
tab.push_back(5); //On ajoute une 4ème case au tableau.
//Cette case contient la valeur 5
5959
Fonctions spécifiques
On peut ajouter plusieurs cases à la suite les unes des autres.
Exemple:
vector<int> tab(3,12); //Un tableau de 3 entiers valant tous 12
tab.push_back(5); //On ajoute une 4ème case au tableau.
//Cette case contient la valeur 5
tab.push_back(3); //On ajoute une 5ème case qui contient le chiffre 3.
tab.push_back(4); //Et encore une avec le nombre 4 cette fois.
//Le tableau contient maintenant les nombres : 12 12 12 5 3 4
60
Ajout des cases à la fin du tableau
60
Supression de la dernière case du tableau
Pour supprimer la dernière case d'un tableau, on utilise la
fonction
pop_back() de la même manière que push_back().
Il n'y a rien à mettre entre les parenthèses.
Exemple:
vector<int> tab(3,12); //Un tableau de 3 entiers valant tous 12
tab.pop_back(); //Plus que 2 cases.
tab.pop_back(); //Plus qu'une case.
6161
Fonctions spécifiques
La taille d'un tableau dynamique
Comme la taille peut changer, il y a une fonction pour calculer la
taille exacte d’un tableau, à savoir la fonction size().
nom_du_tableau.size() permet de récupérer un entier correspondant
au nombre d'éléments de tableau.
Exemple:
vector<int> tab(5,8); //Un tableau de 5 entiers valant tous 8
int const tailleTab(tab.size()); //Une variable pour contenir la taille
//du tableau
6262
Fonctions spécifiques
Exercice:
Écrire un programme en utilisant la classe vector, qui permet de
calculer la moyenne des notes.
63
Tableau dynamique
63
Solution de l’exercice:
#include <iostream>
#include <vector> //Ne pas oublier !!
using namespace std;
int main(){
vector<double> notes; //Un tableau vide
notes.push_back(14.5); //On ajoute des notes avec push_back()
notes.push_back(17.5);
notes.push_back(16.75);
notes.push_back(19);
notes.push_back(18.5);
notes.push_back(15);
64
Tableau dynamique
64
Solution de l’exercice (suite):
double moyenne (0);
for(size_t i(0); i<notes.size(); ++i) { //on utilise notes.size() pour la limite
//de notre boucle
moyenne += notes[i]; //on additionne toutes les notes
}
moyenne /= notes.size(); //on utilise à nouveau notes.size() pour obtenir le
// nombre de notes
cout << "La moyenne des notes est : " << moyenne << endl;
return 0;
}
65
Tableau dynamique
65
66
Fonctions spécifiques
tableauVector.at(pos): renvoie l’élément à la position donnée pos.
tableauVector.insert(position, valeur): insert l'élément valeur
devant l'élément désigné par position.
tableauVector.insert (position): insert un élément construit par
défaut devant l'élément désigné par position.
tableauVector.insert(position, first, last): insert une séquence
d'élément désigné par first et last devant l'élément désigné par
position.
tableauVector.erase(position): efface l'élément à la position
donnée.
tableauVector.erase(first,last): efface les éléments entre first et last
exclus.
66
67
Fonctions spécifiques
tableau.clear(): efface tous les éléments du vecteur et le transforme
donc en vecteur vide.
tableau.empty() : détermine si tableau est vide ou non (bool).
tableau.front(): renvoie la valeur du premier élément. Il est donc
équivalent à tableau[0].
tableau.back(): renvoie la valeur du dernier élément. Il est donc
équivalent à tableau[tableau.size()-1].
Pour plus de détails sur les vector (std::vector) voir ce lien:
https://en.cppreference.com/w/cpp/container/vector
67
On peut aussi déclarer un tableau dont les éléments sont eux-mêmes de
type vector:
vector< vector <double> > Matrix(4);
Matrix est un tableau de 4 éléments.
Chaque élément est un tableau. Plus exactement, chaque élément est un
tableau vide.
Matrix
68
Tableaux dynamiques multidimensionnels
68
On peut faire:
Matrix(0) = vector<double>(3);
pour initialiser le premier élément à un tableau de 3 éléments.
Matrix[0] est maintenant un tableau de 3 éléments.
Matrix[0][1] est l'élément d'indice 1 du tableau Matrix[0]
Matrix[0] Matrix[0][1]
69
Tableaux dynamiques multidimensionnels
Matrix
69
Si on fait:
vector< vector<double> > Matrix(4);
Matrix[0] = vector<double> (3); Matrix
Matrix[1] = vector<double> (2);
Matrix[2] = vector<double> (5);
Matrix[3] = vector<double> (3);
on obtient le tableau de tableaux:
70
Tableaux dynamiques multidimensionnels
70
Cas particulier:
vector< vector<double> > Matrix(4); Matrix
for (size_t i(0); i < 4; ++i) {
Matrix[i] = vector<double>(3);
}
Matrix[i][j] est l'élément d'indice j du
tableau d'indice i.
71
Tableaux dynamiques multidimensionnels
71
Initialiser les éléments à 0
Pour initialiser tous les éléments des tableaux de Matrix, il faut
utiliser deux boucles for imbriquées:
for (size_t i(0); i < Matrix.size(); ++i) {
for(size_t j(0); j < Matrix[i].size(); ++j) {
Matrix[i][j] = 0;
}
}
72
Tableaux dynamiques multidimensionnels
72
Initialisation en version C++11
Voici un exemple d’initialisation d’un tableau dynamique multidimensionnel en version C++11:
vector<vector<int>> tableau(
{ { 10, 11, 12, 13, 142 },
{ 14, 15, 16 },
{ 17, 18 },
{ 19, 10, 11 }}
);
for(auto ligne : tableau) {
for(auto element : ligne) {
cout << element << " ";
}
cout << endl;
}
for(size_t i(0); i < tableau.size(); ++i) {
cout << "tableau[" << i <<"].size()="<< tableau[i].size() << endl;
}
73
Tableaux dynamiques multidimensionnels
73
74
Les tableaux dynamiques et les fonctions
vector en paramètre d'une fonction
Exemple d’une fonction passant en argument un tableau dynamique :
void fonctionDynamique(vector<double> & tableau)
{
Bloc d’instructions;
}
N. B: pas besoin de passer la taille du tableau en paramètre, il suffit
d'utiliser la fonction size().
74
75
vector en paramètre d'une fonction
Exemple 1:
void initialiserTab(vector<double> & tableau)
{
for(size_t i(0); i < tableau.size(); ++i) {
tableau[i] = i * 2;
}
}
75
76
vector en paramètre d'une fonction
Exemple :
void fonctionDynamique(vector<double> const& tableau)
{
Bloc d’instructions;
}
Passage par référence constante pour optimiser la copie.
Le tableau dynamique ne peut pas être modifié par la fonction.
Pour modifier le contenu du tableau passé en argument, il faut
utiliser un passage par référence tout simple.
76
77
vector en paramètre d'une fonction
Exemple 2:
Écrire une fonction maxTabDynamique() qui calcule le maximum
des valeurs d'un tableau dynamique de la classe vector.
Réponse:
double maxTabDynamique(vector<double> const& tab){
double max(tab[0]);
for(size_t i(1); i<tab.size(); ++i){
if (max<tab[i]) max = tab[i];
}
return max;
}
77
78
vector en paramètre d'une fonction
Exemple 2: (suite)
Pour appeler la fonction maxTabDynamique(), il suffit d’écrire:
vector<double> tab(4,2.5); //On crée un tableau de 4 réels valant 2.5
maxim=maxTabDynamique(tab);//Appel de la fonction en passant le tableau tab
//puis on sauvegarde le résultat renvoyé dans une variable par exemple maxim.
78
79
Les tableaux dynamiques et les fonctions
vector en résultat d'une fonction
Il est possible d'écrire une fonction renvoyant un std::vector.
Par exemple pour une fonction qui renvoie un tableau dynamique
de réels, il suffit d’écrire:
vector<double> fonctionRenvoyantTabDyna(int n)
{
//corps de la fonction
}
79
80
vector en résultat d'une fonction
Exemple:
vector<int> tableau_des_carres(int n) {
vector<int> Tab(n);
for(size_t i(0); i < n; ++i) {
Tab[i] = i * i;
}
return Tab;
}
Possible uniquement parce que Tab est déclaré en vector.
Pas possible si Tab avait été déclaré avec: int Tab[20];
80
81
vector en résultat d'une fonction
Exemple: (suite)
Appel de la fonction tableau_des_carres() :
vector<int> tab = tableau_des_carres(15);
81
82
Tableaux dynamiques multidimensionnels
et les fonctions
Tableau de tableaux en résultat d'une fonction
Exemple:
vector< vector<int> > initialiserTab2D(int n, int m)
{
vector< vector<int> > resultat(n);
for(size_t i(0); i < n; ++i) {
resultat[i] = vector<int>(m);
for(size_t j(0); j < m; ++j) {
resultat[i][j] = rand() % 100;
}
}
return resultat;
}
82
83
Q & A
83
Références
84
1) http://www.cplusplus.com
2) https://isocpp.org/
3) https://openclassrooms.com/fr/courses/1894236-programmez-avec-le-langage-c
4) https://www.tutorialspoint.com/cplusplus/
5) https://en.cppreference.com
6) https://en.cppreference.com/w/cpp/container/array
7) https://en.cppreference.com/w/cpp/container/vector
8) Programmer en C++, Claude Delannoy, éditions Eyrolles, 2014.
9) Initiation à la programmation (en C++), Jean-Cédric Chappelier, & Jamila Sam,
coursera, 2018.
10) Introduction à la programmation orientée objet (en C++), Jamila Sam & Jean-
Cédric Chappelier, coursera, 2018.
84

Contenu connexe

Tendances

Chapitre 5 classes abstraites et interfaces
Chapitre 5  classes abstraites et interfacesChapitre 5  classes abstraites et interfaces
Chapitre 5 classes abstraites et interfacesAmir Souissi
 
Algorithme & structures de données Chap I
Algorithme & structures de données Chap IAlgorithme & structures de données Chap I
Algorithme & structures de données Chap IInes Ouaz
 
Partie 11: Héritage — Programmation orientée objet en C++
Partie 11: Héritage — Programmation orientée objet en C++Partie 11: Héritage — Programmation orientée objet en C++
Partie 11: Héritage — Programmation orientée objet en C++Fabio Hernandez
 
Cours langage c
Cours langage cCours langage c
Cours langage ccoursuniv
 
Telecharger Exercices corrigés PL/SQL
Telecharger Exercices corrigés PL/SQLTelecharger Exercices corrigés PL/SQL
Telecharger Exercices corrigés PL/SQLwebreaker
 
Chap 6 : classes et interfaces
Chap 6 : classes et interfacesChap 6 : classes et interfaces
Chap 6 : classes et interfacesAziz Darouichi
 
Exercice 1 java Héritage
Exercice 1 java HéritageExercice 1 java Héritage
Exercice 1 java HéritageNadaBenLatifa
 
POO Java Chapitre 2 Encapsulation
POO Java Chapitre 2 EncapsulationPOO Java Chapitre 2 Encapsulation
POO Java Chapitre 2 EncapsulationMouna Torjmen
 
Cours algorithme
Cours algorithmeCours algorithme
Cours algorithmebadr zaimi
 
Exercices_Python_Fenni_2023 -corrigé.pdf
Exercices_Python_Fenni_2023 -corrigé.pdfExercices_Python_Fenni_2023 -corrigé.pdf
Exercices_Python_Fenni_2023 -corrigé.pdfsalah fenni
 
Cours python avancé
Cours python avancéCours python avancé
Cours python avancépierrepo
 
Cours les Listes doublement chainées Prof. KHALIFA MANSOURI
Cours les Listes doublement chainées Prof. KHALIFA MANSOURI Cours les Listes doublement chainées Prof. KHALIFA MANSOURI
Cours les Listes doublement chainées Prof. KHALIFA MANSOURI Mansouri Khalifa
 
Uml 2 pratique de la modélisation
Uml 2  pratique de la modélisationUml 2  pratique de la modélisation
Uml 2 pratique de la modélisationNassim Amine
 
Chap4 Récursivité en python
Chap4 Récursivité en pythonChap4 Récursivité en python
Chap4 Récursivité en pythonMariem ZAOUALI
 
Cours structures des données (langage c)
Cours structures des données (langage c)Cours structures des données (langage c)
Cours structures des données (langage c)rezgui mohamed
 
POO Java Introduction
POO Java IntroductionPOO Java Introduction
POO Java IntroductionMouna Torjmen
 

Tendances (20)

Chapitre 5 classes abstraites et interfaces
Chapitre 5  classes abstraites et interfacesChapitre 5  classes abstraites et interfaces
Chapitre 5 classes abstraites et interfaces
 
Algorithme & structures de données Chap I
Algorithme & structures de données Chap IAlgorithme & structures de données Chap I
Algorithme & structures de données Chap I
 
Partie 11: Héritage — Programmation orientée objet en C++
Partie 11: Héritage — Programmation orientée objet en C++Partie 11: Héritage — Programmation orientée objet en C++
Partie 11: Héritage — Programmation orientée objet en C++
 
Cours langage c
Cours langage cCours langage c
Cours langage c
 
Cours c++
Cours c++Cours c++
Cours c++
 
Telecharger Exercices corrigés PL/SQL
Telecharger Exercices corrigés PL/SQLTelecharger Exercices corrigés PL/SQL
Telecharger Exercices corrigés PL/SQL
 
Chap 6 : classes et interfaces
Chap 6 : classes et interfacesChap 6 : classes et interfaces
Chap 6 : classes et interfaces
 
COURS_PYTHON_22.ppt
COURS_PYTHON_22.pptCOURS_PYTHON_22.ppt
COURS_PYTHON_22.ppt
 
Exercice 1 java Héritage
Exercice 1 java HéritageExercice 1 java Héritage
Exercice 1 java Héritage
 
POO Java Chapitre 2 Encapsulation
POO Java Chapitre 2 EncapsulationPOO Java Chapitre 2 Encapsulation
POO Java Chapitre 2 Encapsulation
 
Cours algorithme
Cours algorithmeCours algorithme
Cours algorithme
 
TP C++ : enoncé
TP C++ : enoncéTP C++ : enoncé
TP C++ : enoncé
 
Exercices_Python_Fenni_2023 -corrigé.pdf
Exercices_Python_Fenni_2023 -corrigé.pdfExercices_Python_Fenni_2023 -corrigé.pdf
Exercices_Python_Fenni_2023 -corrigé.pdf
 
Cours python avancé
Cours python avancéCours python avancé
Cours python avancé
 
Cours les Listes doublement chainées Prof. KHALIFA MANSOURI
Cours les Listes doublement chainées Prof. KHALIFA MANSOURI Cours les Listes doublement chainées Prof. KHALIFA MANSOURI
Cours les Listes doublement chainées Prof. KHALIFA MANSOURI
 
Uml 2 pratique de la modélisation
Uml 2  pratique de la modélisationUml 2  pratique de la modélisation
Uml 2 pratique de la modélisation
 
Chap4 Récursivité en python
Chap4 Récursivité en pythonChap4 Récursivité en python
Chap4 Récursivité en python
 
Serie
SerieSerie
Serie
 
Cours structures des données (langage c)
Cours structures des données (langage c)Cours structures des données (langage c)
Cours structures des données (langage c)
 
POO Java Introduction
POO Java IntroductionPOO Java Introduction
POO Java Introduction
 

Similaire à Chapitre3TableauxEnCppV2019

LES TABLEAUX: dans le langage c et l'algorithme
LES TABLEAUX: dans le langage c et l'algorithmeLES TABLEAUX: dans le langage c et l'algorithme
LES TABLEAUX: dans le langage c et l'algorithmeaymaneelfellah
 
Chapitre 3 tableaux et pointeurs en C
Chapitre 3 tableaux et pointeurs en CChapitre 3 tableaux et pointeurs en C
Chapitre 3 tableaux et pointeurs en CAbdelouahed Abdou
 
Cours Algorithme: Tableau
Cours Algorithme: TableauCours Algorithme: Tableau
Cours Algorithme: TableauInforMatica34
 
Ch5-les tableaux et les pointeurs.pdf
Ch5-les tableaux et les pointeurs.pdfCh5-les tableaux et les pointeurs.pdf
Ch5-les tableaux et les pointeurs.pdfFadouaBouafifSamoud
 
Ch8 correction exercices (1)
Ch8 correction exercices (1)Ch8 correction exercices (1)
Ch8 correction exercices (1)abdellah12
 
Chapitre 8 - Les tableaux et les pointeurs.pdf
Chapitre 8 - Les tableaux et les pointeurs.pdfChapitre 8 - Les tableaux et les pointeurs.pdf
Chapitre 8 - Les tableaux et les pointeurs.pdfShiniGami0o0
 
Java uik-chap5-poo avance vf
Java uik-chap5-poo avance vfJava uik-chap5-poo avance vf
Java uik-chap5-poo avance vfAmel Morchdi
 
Theme 9(bis)
Theme 9(bis)Theme 9(bis)
Theme 9(bis)salmazen
 
Lecture 3: Visualization and Programming
Lecture 3: Visualization and ProgrammingLecture 3: Visualization and Programming
Lecture 3: Visualization and ProgrammingSmee Kaem Chann
 
Mat lab1
Mat lab1Mat lab1
Mat lab1fouadDD
 
TP3 Atelier C++/ GL2 INSAT / Tunisie
TP3 Atelier C++/ GL2 INSAT / TunisieTP3 Atelier C++/ GL2 INSAT / Tunisie
TP3 Atelier C++/ GL2 INSAT / TunisieMariem ZAOUALI
 
20XX-XX.cours.complexite.powerpoint.sdd.pptx
20XX-XX.cours.complexite.powerpoint.sdd.pptx20XX-XX.cours.complexite.powerpoint.sdd.pptx
20XX-XX.cours.complexite.powerpoint.sdd.pptxNabil Alami
 

Similaire à Chapitre3TableauxEnCppV2019 (20)

Chapitre3 tableauxcpp
Chapitre3 tableauxcppChapitre3 tableauxcpp
Chapitre3 tableauxcpp
 
Chapitre05 : Les tableaux
Chapitre05 : Les tableauxChapitre05 : Les tableaux
Chapitre05 : Les tableaux
 
LES TABLEAUX: dans le langage c et l'algorithme
LES TABLEAUX: dans le langage c et l'algorithmeLES TABLEAUX: dans le langage c et l'algorithme
LES TABLEAUX: dans le langage c et l'algorithme
 
Chapitre 3 tableaux et pointeurs en C
Chapitre 3 tableaux et pointeurs en CChapitre 3 tableaux et pointeurs en C
Chapitre 3 tableaux et pointeurs en C
 
Cours Algorithme: Tableau
Cours Algorithme: TableauCours Algorithme: Tableau
Cours Algorithme: Tableau
 
Ch5-les tableaux et les pointeurs.pdf
Ch5-les tableaux et les pointeurs.pdfCh5-les tableaux et les pointeurs.pdf
Ch5-les tableaux et les pointeurs.pdf
 
POO-chapitre6.pptx
POO-chapitre6.pptxPOO-chapitre6.pptx
POO-chapitre6.pptx
 
Ch8 correction exercices (1)
Ch8 correction exercices (1)Ch8 correction exercices (1)
Ch8 correction exercices (1)
 
Chapitre 8 - Les tableaux et les pointeurs.pdf
Chapitre 8 - Les tableaux et les pointeurs.pdfChapitre 8 - Les tableaux et les pointeurs.pdf
Chapitre 8 - Les tableaux et les pointeurs.pdf
 
Chapitre 1 rappel
Chapitre 1 rappelChapitre 1 rappel
Chapitre 1 rappel
 
Java uik-chap5-poo avance vf
Java uik-chap5-poo avance vfJava uik-chap5-poo avance vf
Java uik-chap5-poo avance vf
 
Chapitre 1 rappel
Chapitre 1   rappelChapitre 1   rappel
Chapitre 1 rappel
 
Pointeuren c
Pointeuren cPointeuren c
Pointeuren c
 
Theme 9(bis)
Theme 9(bis)Theme 9(bis)
Theme 9(bis)
 
Lecture 3: Visualization and Programming
Lecture 3: Visualization and ProgrammingLecture 3: Visualization and Programming
Lecture 3: Visualization and Programming
 
Cours de Matlab
Cours de MatlabCours de Matlab
Cours de Matlab
 
Mat lab1
Mat lab1Mat lab1
Mat lab1
 
TP3 Atelier C++/ GL2 INSAT / Tunisie
TP3 Atelier C++/ GL2 INSAT / TunisieTP3 Atelier C++/ GL2 INSAT / Tunisie
TP3 Atelier C++/ GL2 INSAT / Tunisie
 
20XX-XX.cours.complexite.powerpoint.sdd.pptx
20XX-XX.cours.complexite.powerpoint.sdd.pptx20XX-XX.cours.complexite.powerpoint.sdd.pptx
20XX-XX.cours.complexite.powerpoint.sdd.pptx
 
Matlab by Prof.Keang Sè Pouv
Matlab by Prof.Keang Sè PouvMatlab by Prof.Keang Sè Pouv
Matlab by Prof.Keang Sè Pouv
 

Plus de Aziz Darouichi

Chapitre 2: String en Java
Chapitre 2:  String en JavaChapitre 2:  String en Java
Chapitre 2: String en JavaAziz Darouichi
 
Chapitre 11: Expression Lambda et Référence de méthode en Java
Chapitre 11: Expression Lambda et Référence de méthode en JavaChapitre 11: Expression Lambda et Référence de méthode en Java
Chapitre 11: Expression Lambda et Référence de méthode en JavaAziz Darouichi
 
Chapitre8: Collections et Enumerations En Java
Chapitre8: Collections et Enumerations En JavaChapitre8: Collections et Enumerations En Java
Chapitre8: Collections et Enumerations En JavaAziz Darouichi
 
Chapitre1: Langage Python
Chapitre1: Langage PythonChapitre1: Langage Python
Chapitre1: Langage PythonAziz Darouichi
 
Cours Visual Basic.NET
Cours Visual Basic.NETCours Visual Basic.NET
Cours Visual Basic.NETAziz Darouichi
 

Plus de Aziz Darouichi (8)

Chapitre 2: String en Java
Chapitre 2:  String en JavaChapitre 2:  String en Java
Chapitre 2: String en Java
 
Chapitre 11: Expression Lambda et Référence de méthode en Java
Chapitre 11: Expression Lambda et Référence de méthode en JavaChapitre 11: Expression Lambda et Référence de méthode en Java
Chapitre 11: Expression Lambda et Référence de méthode en Java
 
Chapitre8: Collections et Enumerations En Java
Chapitre8: Collections et Enumerations En JavaChapitre8: Collections et Enumerations En Java
Chapitre8: Collections et Enumerations En Java
 
Partie3BI-DW-OLAP2019
Partie3BI-DW-OLAP2019Partie3BI-DW-OLAP2019
Partie3BI-DW-OLAP2019
 
Partie2BI-DW2019
Partie2BI-DW2019Partie2BI-DW2019
Partie2BI-DW2019
 
Partie1BI-DW2019
Partie1BI-DW2019Partie1BI-DW2019
Partie1BI-DW2019
 
Chapitre1: Langage Python
Chapitre1: Langage PythonChapitre1: Langage Python
Chapitre1: Langage Python
 
Cours Visual Basic.NET
Cours Visual Basic.NETCours Visual Basic.NET
Cours Visual Basic.NET
 

Dernier

GAL2024 - Décarbonation du secteur laitier : la filière s'engage
GAL2024 - Décarbonation du secteur laitier : la filière s'engageGAL2024 - Décarbonation du secteur laitier : la filière s'engage
GAL2024 - Décarbonation du secteur laitier : la filière s'engageInstitut de l'Elevage - Idele
 
JTC 2024 - SMARTER Retour sur les indicateurs de santé .pdf
JTC 2024 - SMARTER Retour sur les indicateurs de santé .pdfJTC 2024 - SMARTER Retour sur les indicateurs de santé .pdf
JTC 2024 - SMARTER Retour sur les indicateurs de santé .pdfInstitut de l'Elevage - Idele
 
JTC 2024 - Réglementation européenne BEA et Transport.pdf
JTC 2024 - Réglementation européenne BEA et Transport.pdfJTC 2024 - Réglementation européenne BEA et Transport.pdf
JTC 2024 - Réglementation européenne BEA et Transport.pdfInstitut de l'Elevage - Idele
 
GAL2024 - Traite des vaches laitières : au coeur des stratégies d'évolution d...
GAL2024 - Traite des vaches laitières : au coeur des stratégies d'évolution d...GAL2024 - Traite des vaches laitières : au coeur des stratégies d'évolution d...
GAL2024 - Traite des vaches laitières : au coeur des stratégies d'évolution d...Institut de l'Elevage - Idele
 
GAL2024 - L'élevage laitier cultive la biodiversité
GAL2024 - L'élevage laitier cultive la biodiversitéGAL2024 - L'élevage laitier cultive la biodiversité
GAL2024 - L'élevage laitier cultive la biodiversitéInstitut de l'Elevage - Idele
 
comprehension de DDMRP dans le domaine de gestion
comprehension de DDMRP dans le domaine de gestioncomprehension de DDMRP dans le domaine de gestion
comprehension de DDMRP dans le domaine de gestionyakinekaidouchi1
 
Câblage, installation et paramétrage d’un réseau informatique.pdf
Câblage, installation et paramétrage d’un réseau informatique.pdfCâblage, installation et paramétrage d’un réseau informatique.pdf
Câblage, installation et paramétrage d’un réseau informatique.pdfmia884611
 
GAL2024 - Changements climatiques et maladies émergentes
GAL2024 - Changements climatiques et maladies émergentesGAL2024 - Changements climatiques et maladies émergentes
GAL2024 - Changements climatiques et maladies émergentesInstitut de l'Elevage - Idele
 
GAL2024 - Renouvellement des actifs : un enjeu pour la filière laitière franç...
GAL2024 - Renouvellement des actifs : un enjeu pour la filière laitière franç...GAL2024 - Renouvellement des actifs : un enjeu pour la filière laitière franç...
GAL2024 - Renouvellement des actifs : un enjeu pour la filière laitière franç...Institut de l'Elevage - Idele
 
Algo II : les piles ( cours + exercices)
Algo II :  les piles ( cours + exercices)Algo II :  les piles ( cours + exercices)
Algo II : les piles ( cours + exercices)Sana REFAI
 
JTC 2024 La relance de la filière de la viande de chevreau.pdf
JTC 2024 La relance de la filière de la viande de chevreau.pdfJTC 2024 La relance de la filière de la viande de chevreau.pdf
JTC 2024 La relance de la filière de la viande de chevreau.pdfInstitut de l'Elevage - Idele
 
GAL2024 - Situation laitière 2023-2024 : consommation, marchés, prix et revenus
GAL2024 - Situation laitière 2023-2024 : consommation, marchés, prix et revenusGAL2024 - Situation laitière 2023-2024 : consommation, marchés, prix et revenus
GAL2024 - Situation laitière 2023-2024 : consommation, marchés, prix et revenusInstitut de l'Elevage - Idele
 
JTC 2024 - Leviers d’adaptation au changement climatique, qualité du lait et ...
JTC 2024 - Leviers d’adaptation au changement climatique, qualité du lait et ...JTC 2024 - Leviers d’adaptation au changement climatique, qualité du lait et ...
JTC 2024 - Leviers d’adaptation au changement climatique, qualité du lait et ...Institut de l'Elevage - Idele
 

Dernier (15)

GAL2024 - Décarbonation du secteur laitier : la filière s'engage
GAL2024 - Décarbonation du secteur laitier : la filière s'engageGAL2024 - Décarbonation du secteur laitier : la filière s'engage
GAL2024 - Décarbonation du secteur laitier : la filière s'engage
 
JTC 2024 - SMARTER Retour sur les indicateurs de santé .pdf
JTC 2024 - SMARTER Retour sur les indicateurs de santé .pdfJTC 2024 - SMARTER Retour sur les indicateurs de santé .pdf
JTC 2024 - SMARTER Retour sur les indicateurs de santé .pdf
 
JTC 2024 - Réglementation européenne BEA et Transport.pdf
JTC 2024 - Réglementation européenne BEA et Transport.pdfJTC 2024 - Réglementation européenne BEA et Transport.pdf
JTC 2024 - Réglementation européenne BEA et Transport.pdf
 
GAL2024 - Traite des vaches laitières : au coeur des stratégies d'évolution d...
GAL2024 - Traite des vaches laitières : au coeur des stratégies d'évolution d...GAL2024 - Traite des vaches laitières : au coeur des stratégies d'évolution d...
GAL2024 - Traite des vaches laitières : au coeur des stratégies d'évolution d...
 
GAL2024 - L'élevage laitier cultive la biodiversité
GAL2024 - L'élevage laitier cultive la biodiversitéGAL2024 - L'élevage laitier cultive la biodiversité
GAL2024 - L'élevage laitier cultive la biodiversité
 
comprehension de DDMRP dans le domaine de gestion
comprehension de DDMRP dans le domaine de gestioncomprehension de DDMRP dans le domaine de gestion
comprehension de DDMRP dans le domaine de gestion
 
Câblage, installation et paramétrage d’un réseau informatique.pdf
Câblage, installation et paramétrage d’un réseau informatique.pdfCâblage, installation et paramétrage d’un réseau informatique.pdf
Câblage, installation et paramétrage d’un réseau informatique.pdf
 
GAL2024 - Changements climatiques et maladies émergentes
GAL2024 - Changements climatiques et maladies émergentesGAL2024 - Changements climatiques et maladies émergentes
GAL2024 - Changements climatiques et maladies émergentes
 
GAL2024 - Renouvellement des actifs : un enjeu pour la filière laitière franç...
GAL2024 - Renouvellement des actifs : un enjeu pour la filière laitière franç...GAL2024 - Renouvellement des actifs : un enjeu pour la filière laitière franç...
GAL2024 - Renouvellement des actifs : un enjeu pour la filière laitière franç...
 
JTC 2024 - DeCremoux_Anomalies_génétiques.pdf
JTC 2024 - DeCremoux_Anomalies_génétiques.pdfJTC 2024 - DeCremoux_Anomalies_génétiques.pdf
JTC 2024 - DeCremoux_Anomalies_génétiques.pdf
 
Algo II : les piles ( cours + exercices)
Algo II :  les piles ( cours + exercices)Algo II :  les piles ( cours + exercices)
Algo II : les piles ( cours + exercices)
 
JTC 2024 La relance de la filière de la viande de chevreau.pdf
JTC 2024 La relance de la filière de la viande de chevreau.pdfJTC 2024 La relance de la filière de la viande de chevreau.pdf
JTC 2024 La relance de la filière de la viande de chevreau.pdf
 
GAL2024 - Situation laitière 2023-2024 : consommation, marchés, prix et revenus
GAL2024 - Situation laitière 2023-2024 : consommation, marchés, prix et revenusGAL2024 - Situation laitière 2023-2024 : consommation, marchés, prix et revenus
GAL2024 - Situation laitière 2023-2024 : consommation, marchés, prix et revenus
 
JTC 2024 - Leviers d’adaptation au changement climatique, qualité du lait et ...
JTC 2024 - Leviers d’adaptation au changement climatique, qualité du lait et ...JTC 2024 - Leviers d’adaptation au changement climatique, qualité du lait et ...
JTC 2024 - Leviers d’adaptation au changement climatique, qualité du lait et ...
 
CAP2ER_GC_Presentation_Outil_20240422.pptx
CAP2ER_GC_Presentation_Outil_20240422.pptxCAP2ER_GC_Presentation_Outil_20240422.pptx
CAP2ER_GC_Presentation_Outil_20240422.pptx
 

Chapitre3TableauxEnCppV2019

  • 1. Prof. Aziz DAROUICHI 1 Programmation Orientée Objet (C++): Les tableaux
  • 2. 2 Notion de Tableaux Tableaux statiques Tableaux statiques multidimensionnels Les tableaux statiques et les fonctions Tableaux statiques en C++11 Les tableaux statiques array et les fonctions Tableaux dynamiques Fonctions spécifiques Tableaux dynamiques multidimensionnels Les tableaux dynamiques et les fonctions Les tableaux dynamiques multidimensionnels et les fonctions Q & A Références Notion de Tableaux Tableaux statiques Tableaux statiques multidimensionnels Les tableaux statiques et les fonctions Tableaux statiques en C++11 Les tableaux statiques array et les fonctions Tableaux dynamiques Fonctions spécifiques Tableaux dynamiques multidimensionnels Les tableaux dynamiques et les fonctions Les tableaux dynamiques multidimensionnels et les fonctions Q & A Références Les tableaux en C++
  • 3. 3 Notion de Tableaux Array Un tableau est une collection indexée d’éléments (valeurs) homogènes tous du même type. Structure à part entière Il est caractérisé par sa taille et par le type de ses éléments Un tableau est un objet référencé Assimilable à une classe 33
  • 4. 4 Notion de Tableaux Il existe deux sortes de tableaux Ceux dont la taille est connue à l'avance, les tableaux statiques. Ceux dont la taille peut varier en permanence, les tableaux dynamiques. Utilisation des tableaux Stockage de plusieurs variables de même type. 44
  • 5. Tableaux statiques: a) C-Style array b) std::array
  • 6. Syntaxe générale type nomDuTableau[taille_maximale]; Exemple: 1) float t[10]; //réserve l’emplacement pour 10 éléments de type float 2) int tab[12]; //réserve l’emplacement pour 12 éléments de type int 6 Déclaration d‘un tableau 6
  • 7. La dimension d’un tableau (son nombre d’éléments) ne peut être qu’une constante ou une expression constante. Ainsi, cette construction est correcte : const int N(50); int t[N]; float tab[2*N-1] ; 7 Déclaration d‘un tableau 7
  • 8. Initialisation de tableaux à un indice Chaque élément initialisé séparément: int const tailleTab(5); double tab[tailleTab]; tab[0] = 11.5; tab[1] = 19; tab[2] = 6.5; tab[3] = 13.; tab[4] = 15.5; 8 Création d’un tableau 8
  • 9. Initialisation de tableaux à un indice Chaque élément initialisé séparément par une boucle: const int N(20); int tab[N] ; for (int i(0); i < N; i++) tab[i] = i; 9 Création d’un tableau 9
  • 10. Initialisation de tableaux à un indice Exemples: int tab[5] = { 1, 120, 15, 10, 13 }; Il est possible de ne mentionner dans les accolades que les premières valeurs, comme dans ces exemples : int tab[5] = { 1, 120 } ; int tab[5] = { 1, 120, 15 } ; 10 Création d’un tableau 10
  • 11. Initialisation de tableaux à un indice Il est possible d’omettre la dimension du tableau, celle-ci étant alors déterminée par le compilateur par le nombre de valeurs énumérées dans l’initialisation. Exemple: int tab[] = { 1, 120, 15, 10, 13} ; 11 Création d’un tableau 11
  • 12. Déclaration-initialisation Exemples: 1. int notes [] = {14, 16, 18, 17, 15}; 2. double valeursNum[] = {1.2, 3.4, 2*5.6}; 3. char valCarac[] = {‘a’, ‘b’, ‘c’}; 4. string jours[] = {"lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi", "dimanche"}; 5. int joursParMois[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; 6. int n, p ; ... int tableau[] = {1, n, n+p, 2*p, 12} ; 12 Création d’un tableau 12
  • 13. Initialisation de tableaux à un indice On peut déclarer un tableau constant et l’initialiser comme suit : const char voyelles[] = {‘a’, ‘e’, ‘i’, ‘o’, ‘u’, ‘y’}; Bien entendu, toute tentative ultérieure de modification du tableau sera rejetée : voyelles[2] = ’j’ ; // interdit 13 Création d’un tableau 13
  • 14. 14 Utilisation des Tableaux Accès individuel aux éléments d’un tableau 1414
  • 15. 15 Utilisation des Tableaux Affectation de tableaux Considérons ces instructions qui créent deux tableaux d’entiers tab1 et tab2 : int tab1[4] ; for (int i(0) ; i<4 ; i++) tab1[i] = i ; int tab2[4] ; for (int i(0); i<4 ; i++) tab2[i] = 10 + i ; Exécutons maintenant l’affectation : tab1 = tab2 ; // Error: affectation impossible 1515
  • 16. Utilisation des Tableaux Parcours d’un tableau de taille fixe Exemple: double tab[] = {1.1, 2.2, 3.3, 4.4}; cout << tab; affiche la référence au tableau tab, donc une adresse mémoire. Résultat: 0x28fef0 1616
  • 17. Utilisation des Tableaux Parcours d’un tableau de taille fixe Utilisation de la boucle for classique double tab[] = {1.1, 2.2, 3.3, 4.4}; for (int i(0); i<4; i++){ cout << tab[i]; } 1717
  • 18. Utilisation des Tableaux Parcours d’un tableau de taille fixe depuis C++11 Utilisation de la boucle for classique double tab[] = {1.1, 2.2, 3.3, 4.4}; for (size_t i(0); i<4; i++){ cout << tab[i]; } 1818
  • 19. Utilisation des Tableaux Parcours d’un tableau de taille fixe depuis C++11 Utilisation de la boucle for-each type: le type des éléments du tableau. On peut également utiliser cette syntaxe : for (auto elem : tableau ) instruction 1919
  • 20. Utilisation des Tableaux Parcours d’un tableau de taille fixe depuis C++11 Utilisation de la boucle for-each Exemples: itération sur ensemble de valeurs 1) double tab[] = {1.1, 2.2, 3.3, 4.4} ; for (double val : tab){ //ou for (auto val : tab) cout << val << endl; } 2) string villes[] = {"Rabat", "Berlin", "Paris", "Marrakech"}; for (auto str : villes) //type est auto, donc celui de str est déduit du type du tableau villes cout << str << endl; 2020
  • 21. Utilisation des Tableaux Utilisation de la boucle for-each Remarque importante Il faut bien noter que la boucle for-each: Ne permet d’itérer que sur un seul tableau à la fois: il n’est pas possible de traverser en une passe deux tableaux pour les comparer par exemple. Ne permet l’accés qu’à un seul élément du tableau: on ne peut pas par exemple comparer un élément du tableau et son suivant. Ne permet pas d’itèrer d’un pas en avant, de sauter des éléments… 2121
  • 22. Utilisation des Tableaux Utilisation de la boucle for-each Remarque importante (suite) Pour permettre modifier le contenu du tableau, on utilise la syntaxe suivante: for (auto& elem : tableau ) instruction Exemple: double notes[6]={15, 16, 17, 18, 19, 20}; cout << " Voici le contenu du tableau : " << endl; for(auto &note : notes) { cout << " " << note << endl; } 2222
  • 23. Tableaux multidimensionnels Comment déclarer un tableau à plusieurs dimensions? On ajoute seulement un crochet [] de plus: C’est en fait un tableau de tableaux (de tableaux, de tableaux,…) 2323
  • 25. Syntaxe générale Type nomDuTableau[taille_maximale1] [taille_maximale2]…[taille_maximaleN]; Exemple: 1) double matrice[3][4]; // tableau bidimensionnel 2) int mat[10][10]; N.B : Aucune limitation ne pèse sur le nombre d’indices que peut comporter un tableau. 25 Déclaration d’un tableau multidimensionnel 25
  • 26. Initialisation de tableaux à plusieurs indices La première forme revient à considérer notre tableau comme composé de trois tableaux de quatre éléments chacun: int tab [3] [4] = { { 1, 2, 3, 4 } ,{ 5, 6, 7, 8 },{ 9, 10, 11, 12 }}; La seconde exploite la manière dont les éléments sont effectivement rangés en mémoire, et elle se contente d’énumérer les valeurs du tableau suivant cet ordre: int tab [3] [4] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 } ; 26 Création d’un tableau multidimensionnel 26
  • 27. Initialisation de tableaux à plusieurs indices Là encore, à chacun des deux niveaux, les dernières valeurs peuvent être omises. Exemple: Les déclarations suivantes sont correctes (mais non équivalentes): int tab[3] [4] = { { 1, 2 } , { 3, 4, 5 } } ; int tab[3] [4] = { 1, 2 , 3, 4, 5 } ; 27 Création d’un tableau multidimensionnel 27
  • 28. Il est impossible d’écrire une fonction qui renvoie un tableau statique à la C (C-style array). Un tableau statique est toujours passé par référence. Il n'y a pas besoin d'utiliser l'esperluette (&) : c'est fait automatiquement. Dans ce cas, lorsqu'on passe un tableau à une fonction, cette dernière peut le modifier. 28 Les tableaux statiques et les fonctions 28
  • 29. Exemple d’une fonction qui passe en argument un tableau statique : void fonctionStatique(double tableau[], int tailleDuTableau) { Bloc d’instructions; } 29 Les tableaux statiques et les fonctions 29
  • 30. Appel d’une fonction qui passe en argument tableau statique: Pour appeler une fonction recevant un tableau statique et sa taille en argument, il n'y a rien de particulier à faire. Il suffit de mettre le nom du tableau statique et sa taille comme paramètres entre parenthèses lors de l'appel. Exemple 1: double tableau[]={1.5, 2.5, 3.5, 4.5}; //On crée un tableau de 4 réels fonctionStatique(tableau, 4); //On passe le tableau et sa taille à la fonction 30 Les tableaux statiques et les fonctions 30
  • 31. Exemple 2: Écrire une fonction maxTab() qui calcule le maximum des valeurs d'un tableau. Réponse: double maxTab(double tab[], int tailleDuTableau){ double max(tab[0]); for(int i(1); i<tailleDuTableau; ++i){ if (max<tab[i]) max = tab[i]; } return max; } 31 Les tableaux statiques et les fonctions 31
  • 32. Déclaration d’un tableau de taille fixe std::array est un conteneur qui encapsule des tableaux de taille constante (connue à la compilation). Le type du tableau est défini dans la bibliothèque array. Pour les utiliser, il faut ajouter en début de programme : #include <array> La syntaxe pour déclarer un tableau de taille fixe est la suivante : array<type_du_tableau, taille_du_tableau> nom_du_tableau; 32 Les tableaux statiques en C++11 32
  • 33. Déclaration d’un tableau de taille fixe Exemple: #include <array> ... array<int, 5> vecteur; // déclaration d’un tableau de 5 entiers, initialisés à 0. const size_t N(10); array<double, N> ages; // déclaration d’un tableau de 10 double, initialisés à 0. 33 Les tableaux statiques en C++11 33
  • 34. Initialisation d’un tableau de taille fixe Un tableau de type array peut être initialisé directement lors de sa déclaration: array<type_du_tableau, taille_tableau> nom_du_tableau({val_1, ... , val_tailleTableau}); Ou array<type_du_tableau, taille_tableau> nom_du_tableau{val_1, ... , val_tailleTableau}; Ou array<type_du_tableau, taille_tableau> nom_du_tableau = {val_1, ... , val_tailleTableau}; 34 Les tableaux statiques en C++11 34
  • 35. Initialisation d’un tableau de taille fixe Exemple: const size_t taille(7); array<double, taille> notes ({16, 16.75, 17, 17.75, 18, 18.75, 19} ); // ou : array<double, taille> notes{16, 16.75, 17, 17.75, 18, 18.75, 19} ; // ou : array<double, taille> notes ={16, 16.75, 17, 17.75, 18, 18.75, 19} ; 35 Les tableaux statiques en C++11 35
  • 36. Utilisations d’un tableau de taille fixe L’accès aux éléments d’un tableau de taille fixe en C++11 se fait de la façon suivante : directement : tableau[i] par la boucle for-each : for(auto element : tableau) par la boucle for « classique » 36 Les tableaux statiques en C++11 36
  • 37. Utilisations d’un tableau de taille fixe Les tableaux de taille fixe array ont aussi une fonction size() qui renvoie leur taille. Les affectations globales de tableaux de taille fixe array sont acceptables : array<int, 5> tableau1 = { 10, 20, 30, 40, 50 } ; array<int, 5> tableau2 ; ... tableau2 = tableau1 ; // copie de tout tableau1 dans tableau2 37 Les tableaux statiques en C++11 37
  • 38. Fonctions spécifiques tableauArray.size(): renvoie le nombre d’éléments du tableau. tableauArray.empty(): vérifie si le tableau est vide ou non (bool). tableauArray.front(): renvoie le premier élément du tableau. tableauArray.back(): renvoie le dernier élément du tableau. tableauArray.at(pos): renvoie l’élément à la position donnée pos. tableauArray.fill(valeur): attribue la valeur donnée, valeur, à chaque élément du tableau. Pour plus de détails sur les array (std::array) voir ce lien: https://en.cppreference.com/w/cpp/container/array 38 Les tableaux statiques en C++11 38
  • 39. Exemple: const size_t taille(7); array<double, taille> notes ({16, 16.75, 17, 17.75, 18, 18.75, 19} ); cout<<notes.at(1)<<endl; // affiche 16.75 cout<<notes.front()<<endl; // affiche 16 cout<<notes.back()<<endl; // affiche 19 cout<<notes.size()<<endl; // affiche 7 cout<<notes.empty()<<endl; // affiche 0 (false) array<double, 3> arr; arr.fill(10.5); // remplit le tableau arr par 10.5, donc arr = {10.5, 10.5, 10.5}. 39 Fonctions spécifiques 39
  • 40. Tableaux multidimensionnels On peut déclarer des tableaux multidimensionnels de taille fixe. Exemples: array<array<int, 4>, 4> matrice; array<array<int, N>, M> statistiques; array<array<array<int, 4>, 2>, 3> tensor; matrice[1][0] = 20; statistiques[i] est un « array<int, N> », c’est-à-dire un tableau de N entiers. statistiques est bien un tableau de tableaux. 40 Les tableaux statiques en C++11 40
  • 41. Les tableaux multidimensionnels array peuvent également être initialisés lors de leur déclaration. array<array<int, 3>, 4> matrice = { 1, 2, 3 , 4, 5, 6 , 7, 8, 9 , 10, 11, 12 }; 41 Tableaux multidimensionnels 41 1 2 3 4 5 6 7 8 9 10 11 12 matrice[][j]matrice[i] matrice[1][2] matrice[0] 1 2 3
  • 42. On affiche les éléments du tableau matrice par la boucle for-each: for (auto ligne : matrice){ for (auto elm : ligne){ cout << elm << " "; } cout << endl; } 4242 Tableaux multidimensionnels
  • 43. array en paramètre d'une fonction Un std::array comme paramètre d’une fonction a le même comportement qu’une variable de base (int, double, float, …). Règle: toujours passer std :: array par référence ou par référence constante. Exemple: void afficherTableau(array<int,4> &tab){ cout<<"Affichage des valeurs du tableau"<<endl; for(auto v : tab) cout<<v<<" "; } 43 Les tableaux statiques array et les fonctions 43
  • 45. Déclaration d’un tableau dynamique Un tableau dynamique, est une collection de données homogènes, dont la taille peut varier au cours du déroulement du programme. std::vector est un conteneur séquentiel qui encapsule les tableaux de taille dynamique. La première à faire, il faut ajouter la ligne #include <vector> pour utiliser les tableaux dynamiques. La syntaxe pour déclarer un tableau dynamique est la suivante: vector<type_du_tableau> nom_du_tableau; ou en spécifiant la taille du tableau: vector<type_du_tableau> nom_du_tableau (taille); 45 Tableau dynamique 45
  • 46. Exemple: #include <iostream> #include <vector> //Ne pas oublier ! using namespace std; int main() { vector<double> tab(10); //std:: vector<double> tab(10); vector<int> myVector; //Déclaration d'un vecteur d'entiers de taille non connue return 0; } 46 Tableau dynamique 46
  • 47. En C++11, il y a cinq façons d’initialiser un tableau dynamique : vide avec une taille initiale donnée et tous les éléments « nuls » avec une taille initiale donnée et tous les éléments à une même valeur donnée avec une copie d’un autre tableau avec un ensemble de valeurs initiales 47 Initialisation d’un tableau dynamique 47
  • 48. Exemple: 1) vector<int> tableau; //Crée un tableau de 0 entiers 2) vector<int> tab(5); //correspond à la déclaration d’un tableau initialement // constitué de 5 entiers, tous nuls. 3) vector<string> noms(10); //Crée un tableau dont les éléments sont de type //string 4) vector<double> tab(7, 3.5); //Crée un tableau de 7 nombres à virgules valant tous 3.5 5) vector<string> listeDesNoms(10, "nom"); //Crée un tableau de 10 strings valant toutes "nom" 6) vector<double> tab2(tab); //Pour initialiser les éléments de tab2 aux mêmes valeurs que tab. 7) vector<int> Tab({10, 20, 30}); ou vector<int> Tab{10, 20, 30}; //initialise le tableau Tab par un ensemble de valeurs. 4848 Initialisation d’un tableau dynamique
  • 49. Depuis la norme C++11, on peut initialiser un tableau dynamique avec des valeurs initiales différentes, voici la syntaxe : vector<type_du_tableau> nom_du_tableau ({val1, …, valn}); Ou vector<type_du_tableau> nom_du_tableau {val1, …, valn}; Exemple: vector<double> notes({ 17.5, 18, 19.5, 16.75, 15.5 }); Ou vector<double> notes{17.5, 18, 19.5, 16.75, 15.5 }; Ou avec cette manière: vector<double> notes = { 17.5, 18, 19.5, 16.75, 15.5 }; 49 Initialisation d’un tableau dynamique 49
  • 50. On peut également initialiser un tableau dynamique en utilisant une copie d’un autre tableau dynamique, voici la syntaxe : vector<type_du_tableau> nom_du_tableau (autreTableau); où autreTableau est un tableau dynamique de même type de base type_du_tableau. Exemple: vector<double> tab1(5, 19.5); vector<double> tab2(tab1); 50 Initialisation d’un tableau dynamique 50
  • 51. Affectation globale On parle ici de l’affectation d’un tableau complet, dans sa totalité. La syntaxe est : tableau1 = tableau2 ; //copie de tout tableau1 dans tableau2 où tableau2 est un tableau de même type que tableau1. Exemple: vector<int> tab1({ 10, 20, 30 }); vector<int> tab2; tab2 = tab1 ; // copie de tout tab1 dans tab2 51 Tableau dynamique 51
  • 52. Accès aux éléments d'un tableau dynamique On utilise également les crochets [] et la première case possède aussi le numéro 0. 52 Tableau dynamique 52
  • 53. Exemple int const tailleTab(5); //La taille du tableau vector<int> tableau(tailleTab); //Déclaration du tableau tableau[0] = 828; //Remplissage de la première case tableau[1] = 132; //Remplissage de la deuxième case tableau[2] = 847; //Remplissage de la troisième case tableau[3] = 623; //Remplissage de la quatrième case tableau[4] = 35; //Remplissage de la cinquième case vector<int> tableau2(tailleTab); tableau2 = tableau; 53 Tableau dynamique 53
  • 54. Il existe en fait au moins trois façons d’itérer sur un tableau : avec la boucle for-each depuis la norme C++11: for (type elem : tableau ) instruction ou for (auto elem : tableau ) instruction ou for (auto& elem : tableau ) instruction avec la boucle for « classique » : for(int i(0); i < tableau.size(); ++i) ou for(size_t i(0); i < tableau.size(); ++i) avec des itérateurs (voir les chapitres suivants). 54 Parcours d’un tableau dynamique 54
  • 55. Exemple: vector<double> notes(4); for (auto& note : notes) { cout << " Saisir une note : "; cin >> note; } cout << " Voici les notes saisies : " << endl; for(auto note : notes) { cout << " " << note << endl; } 55 Parcours d’un tableau dynamique 55
  • 56. Remarque: (la norme C++11) Il est bien noter que c’est une bonne idée de rendre votre élément constant si vous avez l’intention de l’utiliser en lecture seule: int array[5] = { 9, 7, 5, 3, 1 }; for (const auto& element: array) // element est une référence constante à // l'élément de tableau itéré std::cout << element << " "; 56 Parcours d’un tableau dynamique 56
  • 57. Il y a un certain nombre de fonctions sont prédéfinies dans la classe vector. L’utilisation d’une fonction spécifique se fait avec la syntaxe suivante: nom_de_tableau.nom_de_fonction(arg1, arg2, ...); 57 Fonctions spécifiques 57
  • 58. Ajout des cases à la fin du tableau Pour ajouter des éléments à la fin d‘un tableau. Il faut utiliser la fonction push_back(). La syntaxe est la suivante: nom_du_tableau. push_back(valeur_a_ajouter); 58 Fonctions spécifiques 58
  • 59. Ajout des cases à la fin du tableau Exemple: vector<int> tab(3,2); //Un tableau de 3 entiers valant tous 2 tab.push_back(5); //On ajoute une 4ème case au tableau. //Cette case contient la valeur 5 5959 Fonctions spécifiques
  • 60. On peut ajouter plusieurs cases à la suite les unes des autres. Exemple: vector<int> tab(3,12); //Un tableau de 3 entiers valant tous 12 tab.push_back(5); //On ajoute une 4ème case au tableau. //Cette case contient la valeur 5 tab.push_back(3); //On ajoute une 5ème case qui contient le chiffre 3. tab.push_back(4); //Et encore une avec le nombre 4 cette fois. //Le tableau contient maintenant les nombres : 12 12 12 5 3 4 60 Ajout des cases à la fin du tableau 60
  • 61. Supression de la dernière case du tableau Pour supprimer la dernière case d'un tableau, on utilise la fonction pop_back() de la même manière que push_back(). Il n'y a rien à mettre entre les parenthèses. Exemple: vector<int> tab(3,12); //Un tableau de 3 entiers valant tous 12 tab.pop_back(); //Plus que 2 cases. tab.pop_back(); //Plus qu'une case. 6161 Fonctions spécifiques
  • 62. La taille d'un tableau dynamique Comme la taille peut changer, il y a une fonction pour calculer la taille exacte d’un tableau, à savoir la fonction size(). nom_du_tableau.size() permet de récupérer un entier correspondant au nombre d'éléments de tableau. Exemple: vector<int> tab(5,8); //Un tableau de 5 entiers valant tous 8 int const tailleTab(tab.size()); //Une variable pour contenir la taille //du tableau 6262 Fonctions spécifiques
  • 63. Exercice: Écrire un programme en utilisant la classe vector, qui permet de calculer la moyenne des notes. 63 Tableau dynamique 63
  • 64. Solution de l’exercice: #include <iostream> #include <vector> //Ne pas oublier !! using namespace std; int main(){ vector<double> notes; //Un tableau vide notes.push_back(14.5); //On ajoute des notes avec push_back() notes.push_back(17.5); notes.push_back(16.75); notes.push_back(19); notes.push_back(18.5); notes.push_back(15); 64 Tableau dynamique 64
  • 65. Solution de l’exercice (suite): double moyenne (0); for(size_t i(0); i<notes.size(); ++i) { //on utilise notes.size() pour la limite //de notre boucle moyenne += notes[i]; //on additionne toutes les notes } moyenne /= notes.size(); //on utilise à nouveau notes.size() pour obtenir le // nombre de notes cout << "La moyenne des notes est : " << moyenne << endl; return 0; } 65 Tableau dynamique 65
  • 66. 66 Fonctions spécifiques tableauVector.at(pos): renvoie l’élément à la position donnée pos. tableauVector.insert(position, valeur): insert l'élément valeur devant l'élément désigné par position. tableauVector.insert (position): insert un élément construit par défaut devant l'élément désigné par position. tableauVector.insert(position, first, last): insert une séquence d'élément désigné par first et last devant l'élément désigné par position. tableauVector.erase(position): efface l'élément à la position donnée. tableauVector.erase(first,last): efface les éléments entre first et last exclus. 66
  • 67. 67 Fonctions spécifiques tableau.clear(): efface tous les éléments du vecteur et le transforme donc en vecteur vide. tableau.empty() : détermine si tableau est vide ou non (bool). tableau.front(): renvoie la valeur du premier élément. Il est donc équivalent à tableau[0]. tableau.back(): renvoie la valeur du dernier élément. Il est donc équivalent à tableau[tableau.size()-1]. Pour plus de détails sur les vector (std::vector) voir ce lien: https://en.cppreference.com/w/cpp/container/vector 67
  • 68. On peut aussi déclarer un tableau dont les éléments sont eux-mêmes de type vector: vector< vector <double> > Matrix(4); Matrix est un tableau de 4 éléments. Chaque élément est un tableau. Plus exactement, chaque élément est un tableau vide. Matrix 68 Tableaux dynamiques multidimensionnels 68
  • 69. On peut faire: Matrix(0) = vector<double>(3); pour initialiser le premier élément à un tableau de 3 éléments. Matrix[0] est maintenant un tableau de 3 éléments. Matrix[0][1] est l'élément d'indice 1 du tableau Matrix[0] Matrix[0] Matrix[0][1] 69 Tableaux dynamiques multidimensionnels Matrix 69
  • 70. Si on fait: vector< vector<double> > Matrix(4); Matrix[0] = vector<double> (3); Matrix Matrix[1] = vector<double> (2); Matrix[2] = vector<double> (5); Matrix[3] = vector<double> (3); on obtient le tableau de tableaux: 70 Tableaux dynamiques multidimensionnels 70
  • 71. Cas particulier: vector< vector<double> > Matrix(4); Matrix for (size_t i(0); i < 4; ++i) { Matrix[i] = vector<double>(3); } Matrix[i][j] est l'élément d'indice j du tableau d'indice i. 71 Tableaux dynamiques multidimensionnels 71
  • 72. Initialiser les éléments à 0 Pour initialiser tous les éléments des tableaux de Matrix, il faut utiliser deux boucles for imbriquées: for (size_t i(0); i < Matrix.size(); ++i) { for(size_t j(0); j < Matrix[i].size(); ++j) { Matrix[i][j] = 0; } } 72 Tableaux dynamiques multidimensionnels 72
  • 73. Initialisation en version C++11 Voici un exemple d’initialisation d’un tableau dynamique multidimensionnel en version C++11: vector<vector<int>> tableau( { { 10, 11, 12, 13, 142 }, { 14, 15, 16 }, { 17, 18 }, { 19, 10, 11 }} ); for(auto ligne : tableau) { for(auto element : ligne) { cout << element << " "; } cout << endl; } for(size_t i(0); i < tableau.size(); ++i) { cout << "tableau[" << i <<"].size()="<< tableau[i].size() << endl; } 73 Tableaux dynamiques multidimensionnels 73
  • 74. 74 Les tableaux dynamiques et les fonctions vector en paramètre d'une fonction Exemple d’une fonction passant en argument un tableau dynamique : void fonctionDynamique(vector<double> & tableau) { Bloc d’instructions; } N. B: pas besoin de passer la taille du tableau en paramètre, il suffit d'utiliser la fonction size(). 74
  • 75. 75 vector en paramètre d'une fonction Exemple 1: void initialiserTab(vector<double> & tableau) { for(size_t i(0); i < tableau.size(); ++i) { tableau[i] = i * 2; } } 75
  • 76. 76 vector en paramètre d'une fonction Exemple : void fonctionDynamique(vector<double> const& tableau) { Bloc d’instructions; } Passage par référence constante pour optimiser la copie. Le tableau dynamique ne peut pas être modifié par la fonction. Pour modifier le contenu du tableau passé en argument, il faut utiliser un passage par référence tout simple. 76
  • 77. 77 vector en paramètre d'une fonction Exemple 2: Écrire une fonction maxTabDynamique() qui calcule le maximum des valeurs d'un tableau dynamique de la classe vector. Réponse: double maxTabDynamique(vector<double> const& tab){ double max(tab[0]); for(size_t i(1); i<tab.size(); ++i){ if (max<tab[i]) max = tab[i]; } return max; } 77
  • 78. 78 vector en paramètre d'une fonction Exemple 2: (suite) Pour appeler la fonction maxTabDynamique(), il suffit d’écrire: vector<double> tab(4,2.5); //On crée un tableau de 4 réels valant 2.5 maxim=maxTabDynamique(tab);//Appel de la fonction en passant le tableau tab //puis on sauvegarde le résultat renvoyé dans une variable par exemple maxim. 78
  • 79. 79 Les tableaux dynamiques et les fonctions vector en résultat d'une fonction Il est possible d'écrire une fonction renvoyant un std::vector. Par exemple pour une fonction qui renvoie un tableau dynamique de réels, il suffit d’écrire: vector<double> fonctionRenvoyantTabDyna(int n) { //corps de la fonction } 79
  • 80. 80 vector en résultat d'une fonction Exemple: vector<int> tableau_des_carres(int n) { vector<int> Tab(n); for(size_t i(0); i < n; ++i) { Tab[i] = i * i; } return Tab; } Possible uniquement parce que Tab est déclaré en vector. Pas possible si Tab avait été déclaré avec: int Tab[20]; 80
  • 81. 81 vector en résultat d'une fonction Exemple: (suite) Appel de la fonction tableau_des_carres() : vector<int> tab = tableau_des_carres(15); 81
  • 82. 82 Tableaux dynamiques multidimensionnels et les fonctions Tableau de tableaux en résultat d'une fonction Exemple: vector< vector<int> > initialiserTab2D(int n, int m) { vector< vector<int> > resultat(n); for(size_t i(0); i < n; ++i) { resultat[i] = vector<int>(m); for(size_t j(0); j < m; ++j) { resultat[i][j] = rand() % 100; } } return resultat; } 82
  • 84. Références 84 1) http://www.cplusplus.com 2) https://isocpp.org/ 3) https://openclassrooms.com/fr/courses/1894236-programmez-avec-le-langage-c 4) https://www.tutorialspoint.com/cplusplus/ 5) https://en.cppreference.com 6) https://en.cppreference.com/w/cpp/container/array 7) https://en.cppreference.com/w/cpp/container/vector 8) Programmer en C++, Claude Delannoy, éditions Eyrolles, 2014. 9) Initiation à la programmation (en C++), Jean-Cédric Chappelier, & Jamila Sam, coursera, 2018. 10) Introduction à la programmation orientée objet (en C++), Jamila Sam & Jean- Cédric Chappelier, coursera, 2018. 84