27
Hiver 2010 JGA Beaulieu GEF 243B Programmation informatique appliquée Types dérivés, structures et tableaux

Hiver 2010JGA Beaulieu GEF 243B Programmation informatique appliquée Types dérivés, structures et tableaux

Embed Size (px)

Citation preview

Page 1: Hiver 2010JGA Beaulieu GEF 243B Programmation informatique appliquée Types dérivés, structures et tableaux

Hiver 2010 JGA Beaulieu

GEF 243BProgrammation informatique

appliquée

Types dérivés, structures et tableaux

Page 2: Hiver 2010JGA Beaulieu GEF 243B Programmation informatique appliquée Types dérivés, structures et tableaux

Hiver 2010 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 lue, ferme le fichier

Page 3: Hiver 2010JGA Beaulieu GEF 243B Programmation informatique appliquée Types dérivés, structures et tableaux

Hiver 2010 JGA 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: Hiver 2010JGA Beaulieu GEF 243B Programmation informatique appliquée Types dérivés, structures et tableaux

Hiver 2010 JGA 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: Hiver 2010JGA Beaulieu GEF 243B Programmation informatique appliquée Types dérivés, structures et tableaux

Hiver 2010 JGA Beaulieu

Rappel - Types en C

Page 6: Hiver 2010JGA Beaulieu GEF 243B Programmation informatique appliquée Types dérivés, structures et tableaux

Hiver 2010 JGA 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: Hiver 2010JGA Beaulieu GEF 243B Programmation informatique appliquée Types dérivés, structures et tableaux

Hiver 2010 JGA Beaulieu

Types Dérivés en C

Page 8: Hiver 2010JGA Beaulieu GEF 243B Programmation informatique appliquée Types dérivés, structures et tableaux

Hiver 2010 JGA 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: Hiver 2010JGA Beaulieu GEF 243B Programmation informatique appliquée Types dérivés, structures et tableaux

Hiver 2010 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(“C’est le nombre1 : %d“, nombre1);

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

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

Page 10: Hiver 2010JGA Beaulieu GEF 243B Programmation informatique appliquée Types dérivés, structures et tableaux

Hiver 2010 JGA 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: Hiver 2010JGA Beaulieu GEF 243B Programmation informatique appliquée Types dérivés, structures et tableaux

Hiver 2010 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

Page 12: Hiver 2010JGA Beaulieu GEF 243B Programmation informatique appliquée Types dérivés, structures et tableaux

Hiver 2010 JGA 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• An 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: Hiver 2010JGA Beaulieu GEF 243B Programmation informatique appliquée Types dérivés, structures et tableaux

Hiver 2010 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: 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: Hiver 2010JGA Beaulieu GEF 243B Programmation informatique appliquée Types dérivés, structures et tableaux

Hiver 2010 JGA 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: Hiver 2010JGA Beaulieu GEF 243B Programmation informatique appliquée Types dérivés, structures et tableaux

Hiver 2010 JGA 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: Hiver 2010JGA Beaulieu GEF 243B Programmation informatique appliquée Types dérivés, structures et tableaux

Hiver 2010 JGA 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: Hiver 2010JGA Beaulieu GEF 243B Programmation informatique appliquée Types dérivés, structures et tableaux

Hiver 2010 JGA 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: Hiver 2010JGA Beaulieu GEF 243B Programmation informatique appliquée Types dérivés, structures et tableaux

Hiver 2010 JGA 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: Hiver 2010JGA Beaulieu GEF 243B Programmation informatique appliquée Types dérivés, structures et tableaux

Hiver 2010 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;

}

Page 20: Hiver 2010JGA Beaulieu GEF 243B Programmation informatique appliquée Types dérivés, structures et tableaux

Hiver 2010 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 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: Hiver 2010JGA Beaulieu GEF 243B Programmation informatique appliquée Types dérivés, structures et tableaux

Hiver 2010 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

Page 22: Hiver 2010JGA Beaulieu GEF 243B Programmation informatique appliquée Types dérivés, structures et tableaux

Hiver 2010 JGA 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: Hiver 2010JGA Beaulieu GEF 243B Programmation informatique appliquée Types dérivés, structures et tableaux

Hiver 2010 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 l’effet est limité à la fonction qui est appelée

Page 24: Hiver 2010JGA Beaulieu GEF 243B Programmation informatique appliquée Types dérivés, structures et tableaux

Hiver 2010 JGA 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: Hiver 2010JGA Beaulieu GEF 243B Programmation informatique appliquée Types dérivés, structures et tableaux

Hiver 2010 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 qu’avant

MaFonction(numTable); //Tout le tableau

}

void MaFonction(int tableDeInts[][MAX_COLONNES])

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

}

Page 26: Hiver 2010JGA Beaulieu GEF 243B Programmation informatique appliquée Types dérivés, structures et tableaux

Hiver 2010 JGA 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: Hiver 2010JGA Beaulieu GEF 243B Programmation informatique appliquée Types dérivés, structures et tableaux

Hiver 2010 JGA Beaulieu

Quiz Time

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