Programmation C++ BTS CIEL Informatique et Réseaux Lycée Louis Rascol, Albi
Release : v1.0 (23.09.23) joris.serrand@rascol.net Github : ciel-ir-rascol/cpp-cours
Release : v1.0 (23.09.23)
Nous souhaitons stocker en mémoire les notes de 5 évaluations de Maths, sans tableau on devrait faire :
float evalMaths1{10.5}; float evalMaths2{12}; float evalMaths3{13}; float evalMaths4{20}; float evalMaths5{9.25};
Imaginez la gestion des notes pour 10, voir 100 variables, ça peut vite devenir fastidieux
▶︎ Syntaxe
type_des_elements nom_tableau [nombre_elements];
▶︎ Exemples
float evalsMaths [5]; // Déclaration d'un tableau de 5 réels const int nbJoursAn {365}; // Déclaration d'une constante entière double hautesTemps [nbJoursAn]; // Déclaration d'un tableau de réels de 365 cases // À NE PAS FAIRE ! int nbJoursSemaine {7}; // Déclaration d'une variable int nbTachesJour [nbJoursSemaine]; // ERREUR on initialise pas un tab avec une var
type_des_elements nom_tableau [nombre_elements] {liste_init};
// Initialisation des 5 cases float notesEvals [5] {10.5,12,13,20,9.25}; // Initialisation des 365 cases à 0 int hautesTemps [365] {0}; // Taille du tableau en fonction de l'initialisation , ici 4 cases int unDernierTableau [] {1,2,3,4};
nom_du_tableau [index_de_l_element]
float notesEvals [5] {10.5,12,13,20,9.25}; cout << "Première note à l'index 0 : "<< notes[0] << endl; // Première note à l'index 0 : 10.5 cout << "Deuxième note à l'index 1 : "<< notes[1] << endl; // Deuxième note à l'index 1 : 12 cout << "Dernière note à l'index 4 : "<< notes[4] << endl; // Dernière note à l'index 4 : 9.25
nom_du_tableau [index_de_l_element] = valeur_a_assigner;
float notesEvals [5] {10.5,12,13,20,9.25}; cout << " 3eme note : " << notesEvals [2] << endl; // 3eme note : 13 // Modification de la 3ème note notesEvals [2] = 13.25; cout << " 3eme note : " << notesEvals [2] << endl; // 3eme note : 13.25
Initialisation d'un tableau de caractères legume :
legume
char legume [] = {'p','a','t','a','t','e'};
Nom du tableau → adresse de la 1ere case :
// Opérateur & pour obtenir l'adresse cout << &legume << endl; // 0x1000
Cases avant et après tableau ≠ 0
// On fait un dépassement (overflow) cout << legume[6] << endl ; // 135
Une case mémoire (RAM) vaut un octet : 8 bits
▶︎ Syntaxe d'un tableau en 2 dimensions
type_des_elements nom_tableau [nombre_lignes] [liste_colonnes];
int notesFilms [3][4];
▶︎ Déclaration et initialisation
// Déclaration d'un tableau de 3 lignes 4 colonnes int notesFilms [3][4] {{10,11,12,13}, {20,21,22,23}, {30,31,32,33}}; // Déclaration équivalente en une ligne int notesFilms [3][4] {{10,11,12,13},{20,21,22,23},{30,31,32,33}};
▶︎ Accès aux cases
int notesFilms [3][4] {{10,11,12,13},{20,21,22,23},{30,31,32,33}}; cout << "Contenu de la case [1][2] : " << notesFilms[1][2] << endl; // Contenu de la case [1][2] : 22
#include <vector> using namespace std; vector <char> voyelles; // Un vecteur de caractères vide vector <int> notesEval; // Un vecteur d'entiers vide // En spécifiant le nombre de cases au départ vector <char> voyelles(6); // Un vecteur de 6 voyelles initialisés à NUL vector <int> notesEval(10); // Un vecteur 10 entiers initialisés à 0
N'oubliez pas d'ajouter la bibliothèque <vector> au début de votre fichier !
<vector>
▶︎ Utilisation de listes d'initialisation
// Un vecteur de voyelles vector <char> voyelles{'a','e','i','o','u','y'}; // Un vecteur 5 entiers vector <int> notesEval{10,2,15,16,12}; // Création d'un vecteur de 10 doubles tous initialisés à 45.6 vector <double> temperatures(10,45.6);
▶︎ Utilisation de la méthode at()
at()
vector <int> notesEval{10,2,15,16,12}; // Un vecteur 5 entiers cout << "Le premier élément est : " << notesEval.at(0) << endl; // Le premier élément est : 10 cout << "L'élément 2 est : " << notesEval.at(2) << endl; // L'élément 2 est : 15
▶︎ Utilisation de la méthode size()
size()
vector <int> notesEval{10,2,15,16,12}; // Un vecteur 5 entiers cout << "Le vecteur comporte " << notesEval.size() << " éléments"; // Le vecteur comporte 5 éléments
▶︎ Utilisation de l'indice avec size() ou de la méthode .back()
.back()
vector <int> notesEval{10,2,15,16,12}; // Un vecteur 5 entiers cout << "Le dernier élément est " << noteEvals.at(notesEval.size()-1) << endl; // Le dernier élément est 12 cout << "Le dernier élément est " << notesEval.back() << endl; // Le dernier élément est 12
▶︎ Utilisation de la méthode push_back()
push_back()
vector <int> notesEval{10,2,15,16,12}; // Un vecteur 5 entiers notesEval.push_back(18); cout << notesEval.at(5); // 18
vector <vector<int>> matrice { {10,11,12}, {20,21,22}, {30,31,32} }; cout << "Valeur de l'élément (0,0) " << matrice.at(0).at(0) << endl; // 10 cout << "Valeur de l'élément (1,2) " << matrice.at(1).at(2) << endl; // 22
La syntaxe est un peu complexe, il faut juste comprendre qu'on déclare et qu'on utilise, un vecteur dans un vecteur.