27
GEF 243B Programmation informatique appliquée Types dérivés, structures et tableaux §8.1 - 8.3

GEF 243B Programmation informatique appliquée Types dérivés, structures et tableaux §8.1 - 8.3

Embed Size (px)

Citation preview

Page 1: GEF 243B Programmation informatique appliquée Types dérivés, structures et tableaux §8.1 - 8.3

GEF 243BProgrammation informatique

appliquée

Types dérivés, structures et tableaux

§8.1 - 8.3

Page 2: GEF 243B Programmation informatique appliquée Types dérivés, structures et tableaux §8.1 - 8.3

4/11/23 2JGA 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

Page 3: GEF 243B Programmation informatique appliquée Types dérivés, structures et tableaux §8.1 - 8.3

4/11/23 3JGA Beaulieu

Synopsis

• Concept d’un type dérivé• Concept des structures de données• Tableaux et fonctions• Tableaux à une dimension• Tableaux à deux dimensions• Tableaux à multi dimensions

Page 4: GEF 243B Programmation informatique appliquée Types dérivés, structures et tableaux §8.1 - 8.3

4/11/23 4JGA Beaulieu

Concept d’un type dérivé

• Comme nous l’avons 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 l’information

• Si nous avions seulement ces types, nous limiterions la puissance d’expression de nos programmesOu nous compliquerions la façon dont nos programmes

sont écrits

Page 5: GEF 243B Programmation informatique appliquée Types dérivés, structures et tableaux §8.1 - 8.3

4/11/23 5JGA Beaulieu

Rappel - Types en C

Page 6: GEF 243B Programmation informatique appliquée Types dérivés, structures et tableaux §8.1 - 8.3

4/11/23 6JGA Beaulieu

Concept d’un 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 l’information

• 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

Page 7: GEF 243B Programmation informatique appliquée Types dérivés, structures et tableaux §8.1 - 8.3

4/11/23 7JGA Beaulieu

Types Dérivés en C

Page 8: GEF 243B Programmation informatique appliquée Types dérivés, structures et tableaux §8.1 - 8.3

4/11/23 8JGA Beaulieu

Concept des structures de données

• Imaginez que vous voulez traiter 20 integers.Nous voulons lire chaque entier du clavierEnsuite nous voulons les traiter, et même les

afficher/imprimer

• Pour ce faire, nous devons stocker ces integers en mémoire pour quelque tempsNous avons donc besoin d’une référence

symbolique pour chacun de ces entiers: 20 variables

Page 9: GEF 243B Programmation informatique appliquée Types dérivés, structures et tableaux §8.1 - 8.3

4/11/23 9JGA 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(“C’est le nombre1 : %d“, nombre1);

printf(“C’est le nombre2 : %d“, nombre2);

printf(“C’est le nombre20 : %d“, nombre20);

Page 10: GEF 243B Programmation informatique appliquée Types dérivés, structures et tableaux §8.1 - 8.3

4/11/23 10JGA Beaulieu

Concept des structures de données

• Même si couper et coller fonctionne, nous voulons être capable d’exprimer 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 d’un genre de structure qui nous donne une collection séquentielle d’information:

• Le tableau! (array)

Page 11: GEF 243B Programmation informatique appliquée Types dérivés, structures et tableaux §8.1 - 8.3

4/11/23 11JGA 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

Page 12: GEF 243B Programmation informatique appliquée Types dérivés, structures et tableaux §8.1 - 8.3

4/11/23 12JGA Beaulieu

Tableaux à une dimension

• Si nous voulons utiliser la puissance des boucles pour itérer dans un tableau, nous avons besoin d’une façon d’accé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

Page 13: GEF 243B Programmation informatique appliquée Types dérivés, structures et tableaux §8.1 - 8.3

4/11/23 13JGA 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: C’est 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!!!

Page 14: GEF 243B Programmation informatique appliquée Types dérivés, structures et tableaux §8.1 - 8.3

4/11/23 14JGA Beaulieu

Tableaux à une dimension - init

• L’initialisation d’un tableau peut être fait au temps de la déclaration tout comme les variables. Il y a quelques façons de faire l’initialisation:

int nombres [5] = {1,6,9,12,321};

int nombres [] = {54,8,-2};

int nombres [5] = {3,8};

int nombres [5] ={0};

Page 15: GEF 243B Programmation informatique appliquée Types dérivés, structures et tableaux §8.1 - 8.3

4/11/23 15JGA Beaulieu

Tableaux à une dimension - init

• Accès aux éléments d’un 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];

Page 16: GEF 243B Programmation informatique appliquée Types dérivés, structures et tableaux §8.1 - 8.3

4/11/23 16JGA Beaulieu

Indexes de tableaux

• MatLab les indexes commencent à 1comme en Basic et d’autres langages

• En C c’est 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]

Page 17: GEF 243B Programmation informatique appliquée Types dérivés, structures et tableaux §8.1 - 8.3

4/11/23 17JGA Beaulieu

Tableaux et fonctions

• Vous pouvez passer un élément dans un tableau à n’importe 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]);

Page 18: GEF 243B Programmation informatique appliquée Types dérivés, structures et tableaux §8.1 - 8.3

4/11/23 18JGA Beaulieu

Tableaux et fonctions

• Le dernier exemple utilise les valeurs du tableau nombres mais ces valeurs n’ont 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

Page 19: GEF 243B Programmation informatique appliquée Types dérivés, structures et tableaux §8.1 - 8.3

4/11/23 19JGA 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;

}

Page 20: GEF 243B Programmation informatique appliquée Types dérivés, structures et tableaux §8.1 - 8.3

4/11/23 20JGA 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 d’octets (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)

Page 21: GEF 243B Programmation informatique appliquée Types dérivés, structures et tableaux §8.1 - 8.3

4/11/23 21JGA 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

Page 22: GEF 243B Programmation informatique appliquée Types dérivés, structures et tableaux §8.1 - 8.3

4/11/23 22JGA Beaulieu

Tableaux à deux dimensions

• Il y a quelques façons d’initialiser 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

Page 23: GEF 243B Programmation informatique appliquée Types dérivés, structures et tableaux §8.1 - 8.3

4/11/23 23JGA 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 l’effet est limité à la fonction qui est appelée

Page 24: GEF 243B Programmation informatique appliquée Types dérivés, structures et tableaux §8.1 - 8.3

4/11/23 24JGA Beaulieu

Tableaux à deux dimensions

• Passage de paramètres: Une rangée, par référence#define MAX_RANGÉES 2#define MAX_COLONNES 3void MaFonction(int rangéeDeInts[]); //déclarationint main(void){

int rangée; int numTable[2][3]; //init comme il y a deux slidesfor (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

Page 25: GEF 243B Programmation informatique appliquée Types dérivés, structures et tableaux §8.1 - 8.3

4/11/23 25JGA 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 qu’avant

MaFonction(numTable); //Tout le tableau

}

void MaFonction(int tableDeInts[][MAX_COLONNES])

{énoncés… //Traite tout le tableau

}

Page 26: GEF 243B Programmation informatique appliquée Types dérivés, structures et tableaux §8.1 - 8.3

4/11/23 26JGA Beaulieu

Tableaux Multi dimensions

• Les tableaux multi dimensions sont une extension des tableaux 2-D.Ceci fonctionne pour les déclarations, initialisations et

l’accè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 tableauxCe concept est vrai pour les autres dimensions > 3

Page 27: GEF 243B Programmation informatique appliquée Types dérivés, structures et tableaux §8.1 - 8.3

4/11/23 27JGA Beaulieu

Quiz Time

• Que représentent les trois dimensions i, j et k pour un tableau 3-DA[i][j][k]