Chapitre II
Chapitre II
Chapitre II
66
1 Introduction
A partir des types prédéfinis du langage C (caractères,
entiers, flottants), on peut créer de nouveaux types, appelés
types composés :
Tableau
Structure
Union
Enumération, ...).
Les types composés permettent de représenter des
ensembles de données organisées.
67
2 Les tableaux
Tableau : ensemble fini d'éléments de même type, stockés
en mémoire à des adresses contiguës.
Déclaration : tableau à une dimension :
Type nomTableau[nombreElements];
Exemple :
float tabR[5]; /* tableau de 5 flottants (réels). */
int tabE[8]; /* tableau de 8 entiers. */
68
2 Les tableaux
Recommandation : Donner un nom à la constante
nombreElements par une directive au préprocesseur.
Exemple :
#define nombreElements 10
69
2 Les tableaux
Exemple :
#define N 10
main(){
int tab[N];
int i;
...
for (i = 0; i < N; i++)
printf("tab[%d] = %d\n", i, tab[i]);
}
70
2 Les tableaux
Un tableau correspond à un pointeur constant (voir les
pointeurs) vers le premier élément du tableau.
è aucune opération globale n'est autorisée sur un tableau.
tab1 = tab2;
tab[0] = 11
tab[1] = 22
tab[2] = 33
tab[3] = 44
72
2 Les tableaux
Un tableau de caractères = Chaîne de caractères
Initialisation :
char p1[10] = ’B’,’o’,’n’,’j’,’o’,’u’,’r’;
char p2[10] = "Bonjour"; /* init. par une chaîne litterale */
char p3[] = "Bonjour"; /* p3 aura alors 8 éléments */
73
3 Les tableau à n-dimensions
On peut déclarer un tableau à plusieurs dimensions.
Exemple : Tableau à 2 dimensions
Type nomTableau [nombreLignes][nombreColonnes];
74
3 Les tableau à n-dimensions
On peut initialiser un tableau à plusieurs dimensions à la
compilation par une liste dont chaque élément est une liste
de constantes.
#define M 2
#define N 3
int tab[M][N] = {{1, 2, 3}, {4, 5, 6}};
main(){
int i, j;
for (i = 0 ; i < M; i++){
for (j = 0; j < N; j++)
printf("%d\t", tab[i][j]);
printf("\n");
}
}
1 2 3
75 4 5 6
4 Les types énumérés
Permettent de définir un type par une liste de valeurs qu'il peut
prendre.
Défini par le mot clé enum et un identificateur de modèle, suivis
d’une liste de valeurs.
enum modele {constante1, constante2, ..., constanten};
76 b = 1
4 Les types énumérés
On peut modifier le codage par défaut des valeurs de la liste
d’une énumération lors de la déclaration.
Exemple :
enum booleen {faux = 12, vrai = 23};
77
5 Les structures
Structure : agrégat de plusieurs objets de types différents
regroupés dans une même variable.
Une donnée composant une structure = un champ ou attribut
Un champ peut être de types quelconques
Type simple,
Tableaux,
Autres structures,
…
Les champs possèdent un identificateur qui permet d’accéder
directement à la donnée qu’ils contiennent.
78
5 Les structures
Exemple :
Pour un étudiant, on peut regrouper dans une seule variable :
son nom (chaîne de caractères),
son prénom (chaîne de caractères),
son âge (entier),
son sexe (masculin ou féminin),
son numéro CNE (tableau de 10 chiffres), ...
79
5 Les structures
Déclaration d'un modèle de structure
struct modele{
type1 membre1;
type2 membre2;
...
typen membren;
};
Ou bien :
struct modele{
type1 membre1;
type2 membre2;
...
typen membren;
} objet;
80
5 Les structures
Exemples:
Une structure de nom Etudiant correspondant à un étudiant :
enum genres {Feminin, Masculin};
struct Etudiant {
char nom[20], prenom[20];
int age;
enum genres genre;
int numero[5];
} element = {"Aissaoui", "Ali", 22, Masculin,
{02,49,11,39,42}};
81
5 Les structures
Exemples:
Une structure Point correspondant à un point de coordonnées
x, y dans un plan.
struct Point {
int x;
int y;
};
83
5 Les structures
Le C permet de créer des alias sur une structure avec typedef :
typedef struct {
int a, b; // a et b dans la même déclaration
} couple;
84
5 Les structures
Remarque :
88
6 Les champs de bits
Possible de spécifier la longueur des champs d'une structure au
bit près si ce champ est de type entier.
Exemple :
La structure Registre possède deux membres, actif codé sur un
seul bit, et valeur codé sur 31 bits:
struct Registre{
unsigned int actif : 1;
unsigned int valeur : 31;
};
Tout objet de type struct Registre est donc codé sur 32 bits.
89
7 Les unions
union désigne un ensemble de variables de types différents
susceptibles d'occuper alternativement une même zone
mémoire.
Si les membres d'une union sont de longueurs différentes, la
place réservée en mémoire pour la représenter correspond à
la taille du membre le plus grand.
Déclarations et opérations sur union sont les mêmes que
struct.
90
7 Les unions
Exemple :
La variable hier de type union Jour peut être soit un entier,
soit un caractère.
union Jour{
char lettre;
int numero;
};
main(){
union Jour hier, demain;
hier.lettre = 'J';
printf("Hier = %c\n", hier.lettre);
hier.numero = 4;
demain.numero = (hier.numero + 2) % 7;
printf("Demain = %d\n", demain.numero);
}
Hier = J
91 Demain = 6
8 Définition de types composés avec
typedef
Pour alléger l'écriture, on peut affecter un nouvel identificateur
à un type composé à l'aide de typedef :
Exemple 1 :
struct Eleve{
char nom[20]; Eleve 1 : Alaoui Hamza 17.00
char prenom[20]; Eleve 2 : Hatimi Bouchra 13.00
float note;
};
typedef struct Eleve Eleve;
main(){
Eleve a = {"Alaoui", "Hamza", 17}, b;
strcpy(b.nom, "Hatimi"); strcpy(b.prenom, "Bouchra");
b.note = 13;
printf("Eleve 1 : %s %s %.2f\n", a.nom, a.prenom, a.note);
printf("Eleve 2 : %s %s %.2f\n", b.nom, b.prenom, b.note);
}
92
8 Définition de types composés avec
typedef
Exemple 2 : -‐-‐-‐-‐-‐-‐ Saisie -‐-‐-‐-‐-‐-‐
struct Eleve{ Eleve 1 : Hachimi Souad 16
char nom[20]; Eleve 2 : Alami Brahim 13
char prenom[20]; Eleve 3 : Hamdi Merieme 14
float note; -‐-‐-‐-‐-‐-‐ Affichage -‐-‐-‐-‐-‐-‐
}; Eleve 1 : Hachimi Souad 16.00
typedef struct Eleve Eleve; Eleve 2 : Alami Brahim 13.00
typedef Eleve TabEleve[100]; Eleve 3 : Hamdi Merieme 14.00
main(){
TabEleve T; int i;
printf("-‐-‐-‐-‐-‐-‐ Saisie -‐-‐-‐-‐-‐-‐\n");
for(i=0;i<3;i++){
printf("Eleve %d : ", i+1);
scanf("%s %s %f", T[i].nom, T[i].prenom, &T[i].note);
}
printf("-‐-‐-‐-‐-‐-‐ Affichage -‐-‐-‐-‐-‐-‐\n");
for(i=0;i<3;i++)
printf("Eleve %d : %s %s %.2f\n",
i+1, T[i].nom, T[i].prenom, T[i].note);
}
93