Hiver 2010 JGA Beaulieu
GEF 243BProgrammation 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
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
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
Hiver 2010 JGA Beaulieu
Rappel - Types en C
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
Hiver 2010 JGA Beaulieu
Types Dérivés en C
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
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);
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)
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
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
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!!!
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};
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];
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]
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]);
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
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;
}
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)
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
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
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
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
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
}
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
Hiver 2010 JGA Beaulieu
Quiz Time
• Que représentent les trois dimensions i, j et k pour un tableau 3-DA[i][j][k]