Les Types de données complexes Les variables traditionnelles ne permettent de stocker qu’une donnée à la fois. Lourdeur de programmation. Besoin de types plus évolués. Les structures. Peuvent contenir des données hétérogènes Les tableaux. Permettent de stocker plusieurs données de même type Bases de la programmation en C++
Les structures Définition d’un type personnalisé à partir des types de base. Exemple: On déclare une structure « Date », qui contient: Un jour (de type entier). Un mois (de type entier). Une année (de type entier). On a alors créé le type Date. Bases de la programmation en C++
Déclaration d’un type structure On définit un nouveau type. On utilise ce type pour déclarer les variables struct NomStructure { Type1 NomChamp1; Type2 NomChamp2; …. }; Pas obligatoire en C++ struct NomStructure NomVariable ; Bases de la programmation en C++
Exemple de déclaration du type structure Client struct Client { unsigned int Age ; unsigned float Taille ; }; struct Client Jean, Philippe; Client Paul; Déclaration de 3 variables de type Client Bases de la programmation en C++
Exemple de déclaration struct Client { unsigned int Age ; unsigned float Taille ; } Jean ; struct { unsigned int Age ; unsigned float Taille ; } Jean ; ou Déclaration du type structure Client et d’une variable de type Client Déclaration d’une variable de type structure (pas de nom pour la structure) Attention on ne pourra pas réutiliser ce type de structure (le type n’a pas été déclaré) Bases de la programmation en C++
Accès à un champ d’une structure Les éléments d’une structure sont accédés par un point, suivi du nom du champ de la structure à accéder. Exemples NomStructure . NomChamp struct Client { unsigned int Age ; unsigned float Taille ; }; struct Client Jean, Philippe; Client Paul; Jean. Age = 22; Jean. Taille = 180; cin >> Philippe.Taille; cout << Jean. Age ; Philippe = Jean; Bases de la programmation en C++
Exemple de déclaration / affectation Cette structure est visible par toutes les fonctions du fichiers Exemple de déclaration / affectation struct Date { int Jour ; int Mois ; int Annees ; }; int main () Date Anniv; //déclaration simple Anniv.Jour = 22; //affectation Anniv.Mois = 04; //affectation Anniv.Années = 1978; //affectation cout<< Anniv.Mois<<endl; return 0; } struct Date { int Jour ; int Mois ; int Annees ; }; int main () //déclaration avec affectation Date Anniv={22,04,1978}; Date Demain; Demain = Anniv; cout<< Demain.mois<<endl; return 0; } L’affectation marche mais pas la comparaison ‘==‘ Bases de la programmation en C++
Exemple d’imbrication de structures struct Date { int Jour ; int Mois ; int Annees ; }; struct Personne float taille; Date date_naissance; int main () { Personne Paul; //déclaration simple //déclaration avec affectation Personne Jean={180,{6,8,1985} }; // on aurait aussi pu écrire // Personne Jean={180, 6,8,1985 }; Paul. date_naissance. Jour = 5; Paul. date_naissance. Mois = 12; Paul. date_naissance. Annees = 1984; Paul. Taille=179; Jean={182,{6,9,1983} }; } Uniquement à la déclaration Bases de la programmation en C++
Exemple de passage de structure en paramètre struct Client { int Age ; float Taille ; }; Client plus_grand (Client c1, Client c2) if (c1. Taille > c2. Taille ) return c1; else return c2; } int main () { Client Max; Client Jean = {23,180.0 }; Client Paul = {22,190.0 }; Max = plus_grand(Jean, Paul ); cout<< Max.age; // la console va inscrire 22 } Bases de la programmation en C++
Les tableaux Suite de n données du même type, stockées de manières consécutive en mémoire. Un tableau est donc une suite de cases (espace mémoire) de même taille. La taille de chacune des cases est conditionnée par le type de donnée que le tableau contient. Les éléments du tableau peuvent être: des données de type simple: int, char, float, long, double, ... (la taille d'une case du tableau est alors le nombre d'octets sur lequel la donnée est codée). des tableaux. des structures. Lorsque le tableau est composé de données de type simple, on parle de tableau monodimensionnel (ou vecteur) Lorsque celui-ci contient lui même d'autres tableaux on parle alors de tableaux multidimensionnels (aussi matrice ou table) Bases de la programmation en C++
Les tableaux unidimensionnels Déclaration d’un tableau: Exemple: un tableau de 10 entiers Entier qui détermine le nombre d’élément du tableau Pas de variable! Le type d’élément que contient le tableau (int, char, etc…) Le nom de la variable de type tableau type Nom_du_tableau [Nombre d'éléments] ; int tab [10]; int Bases de la programmation en C++
Accéder aux éléments On accède à un élément par son indice. (numéro d’ordre dans le tableau) Syntaxe: Règles: L'indice du premier élément du tableau est 0 Un indice est toujours positif L'indice du dernier élément du tableau est égal au nombre d'éléments - 1 Exemple: un tableau de 10 entiers Nom_du_tableau [indice] int tab [10]; int Indices 1 2 3 4 5 6 7 8 9 Bases de la programmation en C++
Exemple de manipulation Manipulation des éléments comme des variables normales: //Déclaration d’un tableau de 10 entiers ( [0….9] ). int Toto[10]; Int h=10; int Toto[h]; //erreur de compilation! H est une variable et pas une constante //On affecter la valeur 6 au huitième élément Toto[7] = 6; //On affecte au 10ème élément le résultat de l'addition des éléments 1 et 2 Toto[9] = Toto[0] + Toto[1]; //On affecte 5 au (i+2)ème élément int i = 3; Toto[i+2] = 5; Bases de la programmation en C++
Initialisation d’un tableau Valeur par valeur (bof…) Utilisation d’une boucle (mieux!) int Toto[10]; //déclaration //Initialisation Toto[0]=8; Toto[1]=32; //etc… int Toto[10]; //déclaration int Indice; //var locale for (Indice = 0; Indice < 10; Indice++) { Toto[Indice] = 0; } A la déclaration int Toto[10] = {1, 2, 6, 5, 2, 1, 9, 8, 1, 5}; // toutes les éléments ont une valeur int Toto[10] = {1, 2, 6, 5}; // les éléments non définit sont initialisé à 0 // au moins un élément doit être définit Bases de la programmation en C++
Restriction On ne peut pas affecter une série de valeurs en dehors de la déclaration. On ne peut pas affecter un tableau à un autre. On ne peut pas comparer deux tableaux. int t[3] = {4, 5, 8}; // OK int t[3] ; t = {1, 2, 6, 5}; // ERREUR int x[3] ,int y[3] ; // déclaration de deux tableaux d’entier … x = y; // ERREUR int x[3] ,int y[3] ; // déclaration de deux tableaux d’entier … if(x == y) // ERREUR Bases de la programmation en C++
Exemple : produit scalaire de deux vecteurs int main() { int u[10], v[10]; // déclaration de deux vecteurs de 10 éléments : entrées int Produit_scalaire = 0; //sortie int ind; // var local cout<< "saisie de u"<<endl; for (ind=0;ind<10;ind++) // saisie des 10 éléments du vecteur u cin >> u[ind]; cout<< "saisie de v"<<endl; for (ind=0;ind<10;ind++) // saisie des 10 éléments du vecteur v cin >> v[ind]; for (ind=0;ind<10;ind++) // calcul du produit scalaire Produit_scalaire = Produit_scalaire + u[ind] * v[ind] ; cout<< "Le produit scalaire de u et v est: "<< Produit_scalaire <<endl; return 0; } Bases de la programmation en C++
Les tableaux Multidimensionnels Déclaration d’un tableau: Exemple: un tableau d’entiers à 2 dimensions (3 lignes, 4 colonnes) Le type d’élément que contient le tableau (int, char, etc…) Le nom de la variable de type tableau Nombre d’élément dans chaque dimension type Nom_du_tableau [dim1][dim2]…[dimn] ; Tableau[0][0] Tableau[0][1] Tableau[0][2] Tableau[0][3] Tableau[1][0] Tableau[1][1] Tableau[1][2] Tableau[1][3] Tableau[2][0] Tableau[2][1] Tableau[2][2] Tableau[2][3] int tab [3][4]; Bases de la programmation en C++
Initialisation d’un tableau Utilisation d’une boucle Valeur par valeur int Toto[3][5]; //déclaration int i,j; //var locale for (i = 0; i < 3; i++) { for (j = 0; j < 5; j++) Toto[i][j] = 0; } int Toto[3][5]; //déclaration //Initialisation Toto[0][0]=8; Toto[1][2]=32; //etc… A la déclaration int Toto[3][5] = {1, 2, 6, 5, 2, 1, 9, 8, 1, 5,8,3,6,7,9}; // de la forme: // { [0][0] , [0][1] , [0][2] , [0][3] , [0][4] , [1][0] , [1][1] , [1][2] , [1][3] ,etc ….} Bases de la programmation en C++
Passage de tableaux en paramètre Cas monodimensionnel. Cas Multidimensionnel. int main() { int tab[20]; ….. Fonction ( tab); } void Fonction( int x[ ] ) { ….. } Ne pas préciser la taille du tableau Pas de passage par valeur ou référence Le tableau d’origine peut être modifié dans tout les cas! int main() { int tab[10][4]; ….. Fonction ( tab); } void Fonction( int x[ ][4] ) { ….. } Ne pas préciser la première taille Bases de la programmation en C++
Expression à convertir Transtypages Permet de changer le type d’une valeur. Exemple: Type désiré (type) expression Expression à convertir int i=5, j=2; float result1; float result2; Result1 = i / j; // Result1 prend la valeur 2 Result2 =(float) i / (float) j; // Result2 prend la valeur 2.5 // i et j ont été transformés en float pour cette opération Bases de la programmation en C++
Exercice4 Boite à outils pour vecteur Declarer une structure homme Faire entrer 2 vecteurs à l’utilisateur (taille = 3) Faire entrer un operateur (‘*’ ou ‘+’)(produit scalaire, addition) Rendre le produit vectoriel ou l’addition des deux vecteur Utiliser 2 fonctions Addition et produit_scalaire. float produit_scalaire(int u[ ], int v[ ]) void Addition (int u[ ], int v[ ],int Result[ ]) Declarer une structure homme Date naissance; Reel taille; int age. Faire une fonction qui retourne le plus agé de 2 hommes. L’appeler dans le main Bases de la programmation en C++