Télécharger la présentation
La présentation est en train de télécharger. S'il vous plaît, attendez
Publié parArluin Ferrari Modifié depuis plus de 10 années
1
GEF 243B Programmation informatique appliquée Types dérivés, structures et tableaux §8.1 - 8.3
2
21-Jan-14 2 JGA Beaulieu Revue Pourquoi est-ce que les organigrammes sont utiles? Faites un organigramme pour le problème suivant: Ouvre le fichier lecture Lit le premier caractère Tant que monChar est différent de '\0' Lit le prochain caractère du fichier Si monChar est plus grand que 'Z' Imprime "minuscule" Sinon imprime "majuscule" Quand touts les caractères sont traités, ferme le fichier
3
21-Jan-14 3 JGA Beaulieu Synopsis Concept dun type dérivé Concept des structures de données Tableaux et fonctions Tableaux à une dimension Tableaux à deux dimensions Tableaux à multi dimensions
4
21-Jan-14 4 JGA Beaulieu Concept dun type dérivé Comme nous lavons vue, il y a quatre types principaux en C On ne peut pas déclarer des variables void Même si ces types sont utiles, il nous donnent seulement une capacité de base pour traiter les données et linformation Si nous avions seulement ces types, nous limiterions la puissance dexpression de nos programmes Ou nous compliquerions la façon dont nos programmes sont écrits
5
21-Jan-14 5 JGA Beaulieu Rappel - Types en C
6
21-Jan-14 6 JGA Beaulieu Concept dun type dérivé Les types dérivés nous permettent de combiner des types de bases (standard) pour augmenter notre capacité de représenter et manipuler linformation Donc nous combinons les types de données de base pour créer de nouveaux types Mais comment allons nous organiser ces types? …et voici les structures
7
21-Jan-14 7 JGA Beaulieu Types Dérivés en C
8
21-Jan-14 8 JGA Beaulieu Concept des structures de données Imaginez que vous voulez traiter 20 integers. Nous voulons lire chaque entier du clavier Ensuite nous voulons les traiter, et même les afficher/imprimer Pour ce faire, nous devons stocker ces integers en mémoire pour quelque temps Nous avons donc besoin dune référence symbolique pour chacun de ces entiers: 20 variables
9
21-Jan-14 9 JGA Beaulieu Concept des structures de données Chaque fois que nous voulons lire, traiter,.. les entiers comme un groupe, nous devons avoir 20 énoncés, chacun contenant un nom de variable : int nombre1, nombre2,…,int nombre20; … printf(Cest le nombre1 : %d, nombre1); printf(Cest le nombre2 : %d, nombre2); … printf(Cest le nombre20 : %d, nombre20);
10
21-Jan-14 10 JGA Beaulieu Concept des structures de données Même si couper et coller fonctionne, nous voulons être capable dexprimer la même chose en moins de lignes de code. Notre exemple avait seulement 20 nombres, maintenant imaginez que nous avons 20,000 integers!!! Nous voulons exploiter la puissance des boucles (itérations) Pour utiliser les itérations, nous avons besoin dun genre de structure qui nous donne une collection séquentielle dinformation: Le tableau! ( array )
11
21-Jan-14 11 JGA Beaulieu Tableaux à une dimension Une séquence déléments de longueur fixe du même type Donc un tableau a un type, il a aussi un nom et un nombre déléments fixe Ce qui suit est une déclaration/définition pour trois tableaux dérivés des types standard : int scores [10]; char firstName [25]; float averages [12]; * C-99 introduit les tableaux de longueur variable. Nous nous limitons aux tableaux de longueur fixe
12
21-Jan-14 12 JGA Beaulieu Tableaux à une dimension Si nous voulons utiliser la puissance des boucles pour itérer dans un tableau, nous avons besoin dune façon daccéder chaque élément. Pour ce faire on prend un index Un index est une expression integer. Les tableaux en C sont indexés à partir de zéro Le premier index est 0 et le dernier est sizeof(monTableau)-1 Ex. int monTableau[10] est indexé entre 0 et 9
13
21-Jan-14 13 JGA Beaulieu Tableaux à une dimension Donc comment est-ce que C sait où le i ème élément se trouve? Le nom du tableau est une référence symbolique au premier octet du tableau: Cest une adresse Parce que tout les éléments dans un tableau sont du même type et dans une séquence, le compilateur peut calculer un offset à partir du début du tableau. Si vous utilisez un index qui est hors du tableau, le compilateur ne vous le dira pas!!!
14
21-Jan-14 14 JGA Beaulieu Tableaux à une dimension - init Linitialisation dun tableau peut être fait au temps de la déclaration tout comme les variables. Il y a quelques façons de faire linitialisation: int nombres [5] = {1,6,9,12,321}; int nombres [] = {54,8,-2}; int nombres [5] = {3,8}; int nombres [5] ={0};
15
21-Jan-14 15 JGA Beaulieu Tableaux à une dimension - init Accès aux éléments dun tableau: nombres [2] = 1; myInt = nombres[0]; Vous ne pouvez pas affecter tout un tableau à la fois, même si le type et la grandeur sont pareils Vous devez itérer au travers: for (i=0; i<5; i++) secondNum[i] = premierNum[i];
16
21-Jan-14 16 JGA Beaulieu Indexes de tableaux MatLab les indexes commencent à 1comme en Basic et dautres langages En C cest 0 Tableau de 10 éléments en MatLab indexé nom(1), nom(2), …, nom(10) Tableau de 10 éléments en C indexé nom[0], nom[1], …, nom[9]
17
21-Jan-14 17 JGA Beaulieu Tableaux et fonctions Vous pouvez passer un élément dans un tableau à nimporte quelle fonction, tant que le type de lélément est le même que celui du paramètre formel: float DivisePar3 (int monInt); … int nombres [5] = {7,9,14,20,323}; float resultaDeDivPar3 [5]; … for (i=0; i<5; i++) resultaDeDivPar3[i] = DivisePar3(nombres[i]);
18
21-Jan-14 18 JGA Beaulieu Tableaux et fonctions Le dernier exemple utilise les valeurs du tableau nombres mais ces valeurs nont pas étés modifiées. Mais que ce passe-t-il si nous voulons traiter 20,000 valeurs; nous allons avoir à faire 20,000 appels de fonction!!! Il serait grandement plus efficace de passer les tableaux en paramètre à la fonction appelée et de la laisser modifier le tableau float directement
19
21-Jan-14 19 JGA Beaulieu Tableaux et fonctions #define MAX_ELEMENTS 5 void DivisePar3 (int monInt[], float resDiv[], int grandeur); int main (void) { int nombres [MAX_ELEMENTS] = {7,9,14,20,323}; float resultaDeDivPar3 [MAX_ELEMENTS]; … DivisePar3(nombres, resultaDeDivPar3, MAX_ELEMENTS); //appel } //end main void DivisePar3 (int x[], float y[], int grandeur) { int i; for (i=0, i < grandeur,i++) //notez utilisation de grandeur y[i] = x[i] / 3; }
20
21-Jan-14 20 JGA Beaulieu Tableaux à deux dimensions En mémoire, les valeur dans un tableau sont entreposées en séquence linéaire. Ceci est compréhensible parce que la mémoire, par définition, est une séquence doctets (un array) Cependant, plusieurs problèmes que nous voulons résoudre demandent que nous soyons capable de penser et dêtre capable de traiter les données comme étant à deux dimensions pour appliquer certains algorithmes : table ou matrice (rangées et colonnes)
21
21-Jan-14 21 JGA Beaulieu Tableaux à deux dimensions En langage C, les matrices sont traités comme un tableau de tableaux. En math et dans plusieurs langages, si vous voulez accéder un élément dans un tableau 2-D, vous utilisez A(1,2) – rangée 1 colonne 2 En C vous utilisez A[3][2] – Troisième tableau, deuxième élément dans le tableau Vous déclarez un tableau 2-D comme ceci: int numTable [5][4]; //5 rangées 4 colonnes
22
21-Jan-14 22 JGA Beaulieu Tableaux à deux dimensions Il y a quelques façons dinitialiser une matrice int numTable [2][3] = {2,5,8,1,9,11}; //bla! int numTable [2][3] = { {2,5,8}, {1,9,11} }; //préférée int numTable [][3] = { {2,5,8}, {1,9,11} }; //ne faites pas ça
23
21-Jan-14 23 JGA Beaulieu Tableaux à deux dimensions Accès à un élément: numTable[i][j] = unInt; Passage de paramètres: Un élément par valeur void MaFonction(int unInt); … MaFonction(numTable[i][j]); //un élém par valeur Quand on passe un paramètre par valeur leffet est limité à la fonction qui est appelée
24
21-Jan-14 24 JGA Beaulieu Tableaux à deux dimensions Passage de paramètres: Une rangée, par référence #define MAX_RANGÉES2 #define MAX_COLONNES3 void MaFonction(int rangéeDeInts[]); //déclaration int main(void) { int rangée; int numTable[2][3]; //init comme il y a deux slides for (rangée=0; rangée < MAX_RANGÉES; rangée++) MaFonction(numTable[rangée]); //1 rangée par ref } void MaFonction(int rangéeDeInts[]) //définition {énoncés… } //traite 1 rangée Effets trouvés aussi dans la fonction qui appèle
25
21-Jan-14 25 JGA Beaulieu Tableaux à deux dimensions Passage de paramètre: Tableau entier (2-D) #define MAX_RANGÉES 2 #define MAX_COLONNES 3 void MaFonction(int tableDeInts[][MAX_COLONNES]); int main(void) { int rangée; int numTable[2][3]; //init est la même quavant MaFonction(numTable); //Tout le tableau } void MaFonction(int tableDeInts[][MAX_COLONNES]) {énoncés… //Traite tout le tableau }
26
21-Jan-14 26 JGA Beaulieu Tableaux Multi dimensions Les tableaux multi dimensions sont une extension des tableaux 2-D. Ceci fonctionne pour les déclarations, initialisations et laccès aux valeurs La dimension de plus pour un tableau 3-D est appelée un plan. En C, on voit un tableau 3-D comme un tableau de tableaux de tableaux Ce concept est vrai pour les autres dimensions > 3
27
21-Jan-14 27 JGA Beaulieu Quiz Time Que représentent les trois dimensions i, j et k pour un tableau 3-D A[i][j][k]
Présentations similaires
© 2024 SlidePlayer.fr Inc.
All rights reserved.