Vous êtes sur la page 1sur 37

Chapitre V:

Les types composés


Pr Bouzid
ENSA de Marrakech
1

Programmation en langage C
Contenu du chapitre
1) Les tableaux
 à 1 dimension
 à 2 dimensions
 de caractères

2) Les structures

3) Définition de nouveaux types avec typedef

Programmation en langage C Pr BOUZID


Les tableaux
• Un tableau est un ensemble fini d’éléments de même type,
stockés en mémoire à des adresses contiguës
• Un tableau en C peut être à:
• 1 dimension (vecteur)
• 2 dimensions (matrice) ou plusieurs
• Syntaxe de déclaration d’un tableau à 1 dimension:
type nomdutableau[nombre-éléments];
• type: il s’agit des types standards: int, char, float, double… il
est possible de mettre des types spécifiques (structures,
pointeurs)
• nombre-éléments: est une constante entière positive
indiquant le nombre d’éléments que peut contenir le tableau 3

Programmation en langage C Pr BOUZID


Les tableaux à 1 dimension
• Exemple de déclaration: int tab[10];
• A la déclaration d’un tableau, un espace en mémoire lui est
réservé dont la taille en octet est:
dimension * taille du type
Exemples:
• short t[100]; → 200 octets seront réservés (100* 2octets)
• int tab[10]; → 40 octets seront réservés (10* 4octets)
• Remarque: il existe plusieurs manières de déclarer la
constante entière de la dimension du tableau:
• Avec une variable: int main(){
int n = 5;
int t[n];
… 4
}
Programmation en langage C Pr BOUZID
Les tableaux à 1 dimension
• Avec une constante :
#define N 10
int main(){
int t[N];

}

• Avec une saisie au clavier :


int main(){
int n;
printf("saisir la dimension du tableau: ");
scanf("%d",&n);
int t[n];

} 5

Programmation en langage C Pr BOUZID


Les tableaux à 1 dimension
• Initialisation du tableau à la déclaration:
type nomdutableau[n] = {const-1,const-2,...};
• Exemple: int t[5] = {10, 20, 30, 40, 50};
• Il est possible de ne pas indiquer le nombre d’éléments à
l’initialisation. Le nombre d’éléments sera égal au nombre de
valeur de la liste d’initialisation
• Exemple: int t[] = {10, 20, 30, 40, 50};
• Il est possible de ne pas initialiser tous les élements: dans ce cas, les
éléments restants auront la valeur 0 à l’initialisation :
• Exemple: int t[10] = {10, 20, 30, 40, 50};
• Remarque: la liste d’initialisation ne doit pas contenir plus de
valeurs que le nombre d’élément du tableau
6
• Exemple erroné: int t[4] = {10, 20, 30, 40, 50, 60, 70};

Programmation en langage C Pr BOUZID


Les tableaux à 1 dimension
• Représentation d’un tableau t à 1 dimension de 10 éléments:
t[0] t[1] t[2] t[3] t[4] t[5] t[6] t[7] t[8] t[9]

Indices 0 1 2 3 4 5 6 7 8 9
du tableau

• Chaque élément (case) est accessible par son indice. Un indice


i d’un tableau commence toujours à 0 et s’arrête à n-1
• On écrit t[i] pour faire référence à l’élément i du tableau t.
exemples: t[2] = 56; //56 est la valeur de l’élément d’indice 2
• Remarque:
• La lecture et l’écriture dans un tableau se fait toujours élément
par élément
• L’utilisation des boucles (for, while, …) est nécessaire dans ce cas 7

Programmation en langage C Pr BOUZID


Les tableaux à 1 dimension
• Affectation: t[i] = valeur;
• Exemple: t[0] = 23; t[1] = 50; t[2] = 8;
• Saisie des éléments d’un tableau avec scanf() :
for(i=0; i<N; i++) { //N est le nombre
printf ("Saisissez t[%d]: ", i); d’éléments du
scanf("%d", &t[i]); tableau
}

• Résultat: Saisissez t[0]: 45


Saisissez t[1]: 28
Saisissez t[2]: 5

Programmation en langage C Pr BOUZID


Les tableaux à 1 dimension
• Affichage des éléments d’un tableau t de N éléments:
for(i=0; i<N; i++)
printf(" %d \n", t[i]);

• Résultat de l’affichage: 45
28
5

• Remarque:
• Tous les opérateurs arithmétiques, relationnels, logiques,
conditionnels, etc. (+, -, *, ==, >, <, …) utilisés avec les variables
peuvent être utilisés avec les éléments d’un tableau
9

Programmation en langage C Pr BOUZID


Les tableaux à 1 dimension
• Exemple: Soit t un tableau de n entiers comme dans l’exemple.
Compter le nombre d’entiers supérieur à 20:
#define n 6 18 49 36 2 78 15

0 1 2 3 4 5
int i, c=0;
int t[n];
//remplissage du tableau
for(i=0; i<n; i++) {
printf ("Saisissez t[%d]: ", i);
scanf("%d", &t[i]);
}
//Comptage
for (i=0; i<n; i++){
if (t[i]>20) c++;
} 10
printf (" le nombre d’entiers > à 20 est : %d", c);

Programmation en langage C Pr BOUZID


Exercice d’application
• Ecrire un programme qui, étant donné un tableau de 5 entiers,
vérifie si un entier e saisi au clavier appartient au tableau
#include<stdio.h>
#define N 5
int main(){
int i, e, d=0; //d est un flag qui vaut ici soit 0 soit 1
for(i=0; i<N; i++) {
printf ("Saisissez t[%d]: ", i);
scanf("%d", &t[i]);
}
printf("saisissez e: ");
scanf("%d", &e);
for(i=0;i<N;i++){
if(t[i]==e) {d=1; break;}
}
if(d==1) printf("\n%d appartient au tableau", e); 11
else printf("\n%d n'appartient pas au tableau", e); return 0;
}
Programmation en langage C Pr BOUZID
Exercice d’application
• Ecrire un programme qui, étant donné un tableau de 5 entiers,
affiche sa plus grande valeur
… //début du programme
int i, max, n=5;
int t[n];
… //remplissage du tableau avec scanf
//recherche du max :
max=t[0];
for(i=0;i<n-1;i++){
if(max<=t[i+1]){
max=t[i+1];
}
}
printf("\nla plus grande valeur du tableau est: %d", max);
12

Programmation en langage C Pr BOUZID


Les tableaux à 2 dimensions
• Un tableau peut être de n dimensions
• Syntaxe: type nomdutableau[N1][N2]…[Nn];
• Syntaxe de déclaration d’un tableau à deux dimensions :
type nomdutableau[NbLignes][NbColonnes];
• Un tableau à deux dimensions t[n][m] contient n*m éléments.
Lors de la déclaration, l’espace mémoire qui lui est réservé est:
n*m* taille du type
• Représentation d’un tableau t de taille n*m :
Ex: float t[3][4]; t[0][0] t[0][1] t[0][2] t[0][3]
3 lignes, 4 colonnes
t[1][0] t[1][1] t[1][2] t[1][3]
t[2][0] t[2][1] t[2][2] t[2][3]
13

Programmation en langage C Pr BOUZID


Les tableaux à 2 dimensions
• Initialisation à la déclaration:
• en utilisant une liste, les éléments sont initialisés ligne par ligne:
int t[2][3] = {{10, 20, 30}, {40, 50, 60}};
• Dans le cas où on n’indique pas toutes les valeurs à l’initialisation,
les valeurs manquantes seront initialisées à 0
• Affectation:
• pour chaque élément t[i][j] du tableau t:
t[0][0]=47; t[0][1]=12; …
• Remplissage du tableau avec deux boucles :
for(i=0; i<N; i++){
for(j=0; j<M; j++){
printf ("\n Entrez la valeur de t[%d][%d]: \n ", i, j);
scanf("%d", &t[i][j]);
} 14
}
Programmation en langage C Pr BOUZID
Les tableaux à 2 dimensions
• Affichage des éléments d’un tableau t d’entiers de taille N*M:
for(i=0;i<N;i++){
for(j=0;j<M;j++){
printf("%d \t",t[i][j]);
}
printf("\n");
}

• Exemple de résultats pour un tableau t[2][4]:


38 26 2 20
18 98 72 4

15

Programmation en langage C Pr BOUZID


Exercice
• Soit un tableau d’entiers à deux dimensions t[5][5]. Vérifier si
les lignes d’indice pair ont les mêmes valeurs 22222
46261
55555
14358
… 88888
int i,j, init, d;
int t[n][n]={{2,2,2,2,2},{1,2,3,4,5},{5,5,5,5,5},{1,2,3,4,5},{8,8,8,8,8}};
for(i=0;i<n;i+=2){
d=0;
init=t[i][i]; // ou t[i][0]
for(j=1;j<n;j++){
if(t[i][j]!=init) {d=1; break;}
}
if(d==0) printf("\nla ligne d'indice %d a des entiers de memes valeurs", i);
} 16

Programmation en langage C Pr BOUZID


Les tableaux de caractères
• Une chaîne de caractères est un tableau de caractères (de
type char)
• Syntaxe: char nomvariable[longueur];
• Exemple: char chaine[30];
b o n j o u r \0
0 1 2 3 4 5 6 7
• Une chaîne de N caractères a besoin de N+1 octets en
mémoire: le dernier octet est réservé au caractère nul \0
marquant la fin de la chaîne
• Remarque: Le nom d’une chaîne de caractères est le
représentant de l’adresse en mémoire du 1er caractère de la
chaîne. On peut donc aussi déclarer une chaîne à l’aide d’un
pointeur (voir chapitre sur les pointeurs) 17

Programmation en langage C Pr BOUZID


Les tableaux de caractères
• Initialisation à la déclaration:
• Soit en indiquant chaque caractère:
char chaine[10] = {’b’,’o’,’n’,’j’,’o’,’u’,’r’,’\0’}
char chaine[] = {’b’,’o’,’n’,’j’,’o’,’u’,’r’,’\0’}
• Soit en indiquant une chaîne constante:
char chaine[]= ″Bonjour″;
• Lecture et écriture avec scanf et printf:
• Le spécificateur de format utilisé est: %s
• La chaîne est lue en une seule fois (pas besoin de parcourir le
tableau de caractères):
scanf (″%s″, chaine); //pas de & dans scanf (chaine est déjà une adresse)
printf("Ma chaine est: %s", chaine);
18

Programmation en langage C Pr BOUZID


Les tableaux de caractères
• Plusieurs fonctions existent d ans la bibliothèque standard du
langage C pour manipuler les chaînes de caractères
• On en trouve notamment dans: stdio.h, string.h et stdlib.h
• Avec stdio.h:
• gets(chaine) : lit la chaîne de caractère désignée par chaine
(équivalent d’un scanf):
• Exemple: char texte[50];
printf("Saisir texte: ");
gets(texte);

• puts(chaine): imprime à l’écran la chaîne de caractère chaine et


provoque un retour à la ligne:
• Exemple: char ch[]= "voici mon texte" ;
puts(ch); 19

Programmation en langage C Pr BOUZID


Les tableaux de caractères
• Avec string.h:
• strcat(ch1, ch2): ajoute ch2 à la fin de ch1 (concaténation). Le
caractère nul ‘\0’ de ch1 est écrasé par le 1er caractère de ch2
• Exemple: char ch1[]="voici ", ch2[]="mon texte";
strcat(ch1, ch2) ;
printf(" %s", ch1); // voici mon texte

• strncat(ch1,ch2,n): ajoute n caractères de ch2 à la fin de ch1


• strcpy(ch1,ch2): copie ch2 dans ch1
• Exemple: char ch[30], ch1[]="bonjour" ;
strcpy(ch, ch1);
puts(ch); // bonjour
• strncpy(ch1,ch2,n) : copie n caractères de ch2 dans ch1
20

Programmation en langage C Pr BOUZID


Les tableaux de caractères
• strcmp(ch1, ch2): compare ch1 et ch2 et retourne:
• 0 si ch1 et ch2 sont identiques
• Une valeur négative si ch1 précède ch2
• Une valeur positive si ch1 suit ch2
• Exemple: char ch1[20] = ″bonjour″; char ch2[20] = ″bonsoir″;
//strcmp(ch1,ch2)<0 car ch1 précède ch2 dans l’ordre
alphabétique
• Remarque: strcmp fait une comparaison lexicographique (ordre
alphabétique avec les majuscules précédant les minuscules)
• strlen(ch): renvoie la longueur de la chaîne ch
(ne compte pas le caractère de fin de chaîne)

21

Programmation en langage C Pr BOUZID


Exercice d’application
• Ecrire un programme qui lit un mot saisi au clavier et affiche le
mot inversé en utilisant une seconde chaîne
#include<stdio.h>
#include<string.h>
int main(){
char mot[20], minverse[20];
int i,j;
printf("saisissez un mot: ");
scanf("%s", mot);
for(i=0, j=(strlen(mot)-1);i<(strlen(mot))&&j>=0;i++,j--){
minverse[i]=mot[j];
}
minverse[i+1] = mot[i+1];
printf("le mot inverse est: %s", minverse);
return 0;
} 22

Programmation en langage C Pr BOUZID


Les structures
• Une structure est une suite finie d’objets de types différents
• Les différents éléments d’une structure n’occupent pas
nécessairement des zones contiguës en mémoire
• Chaque élément de la structure, appelé membre ou champ,
est désigné par un identificateur
• Syntaxe de déclaration d’un modèle de structure:
struct modele {
type_1 nom_champ_1;
type_2 nom_champ_2;
...
type_n nom_champ_n;
};
23

Programmation en langage C Pr BOUZID


Les structures
• Syntaxe de déclaration d’un objet de ce modèle de structure:
struct modele objet; //objet est une variable du modele
• Il est possible de déclarer les deux en même temps:
struct modele {
type_1 nom_champ_1;
type_2 nom_champ_2;
...
type_n nom_champ_n;
} objet;
• Exemple1: Exemple 2:
struct coordonnees { struct ficheEtudiant{
int x; char nom[50];
int y; int age;
}; float notes[4];
struct coordonnees point; } f; 24

Programmation en langage C Pr BOUZID


Les structures
• Représentation des exemples:
Exemple 1: structure Exemple 2: structure ficheEtudiant
coordonnées

4 16 durant 20 12 14.5 18 11
x y
nom age notes
Objet point
Objet f
• Initialisation de l’objet à la déclaration:
struct coordonnees point= {4, 16};
struct ficheEtudiant f = {″durant″, 20, {12,14.5,18,11}}
• Utilisation de l’objet du modèle: objet.nom_champ
Exemples: f.nom=″durant″; f.age = 20; f.notes[1]=14.5; point.x=4;
point.y=16 25

Programmation en langage C Pr BOUZID


Les structures
• Exemple :
• Soit la structure suivante:
#define N 4
struct ficheEtudiant{
char nom[50];
int age;
float notes[N];
};

• Saisir un étudiant puis calculer et afficher la moyenne de ses


notes

26

Programmation en langage C Pr BOUZID


Les structures
#include<stdio.h>
#define N 4
struct ficheEtudiant{
char nom[50]; int age; float notes[N];
};
int main(){
struct ficheEtudiant f;
int i; float som = 0, moy ;
printf(″saisissez le nom de l’etudiant: ″); scanf(″%s″, f.nom);
printf(″\nsaisissez l’age de l’etudiant: ″); scanf(″%d″, &f.age);
printf(″\nsaisissez les notes de l’etudiant: ″);
for(i=0;i<N;i++) {
printf(″\nsaisissez note %d: ″, i+1);
scanf(″%f″, &f.notes[i]);
som = som + f.notes[i];
}
moy = som/N;
printf(″\nL’etudiant %s d’age %d a pour moyenne du semestre: %.2f″, f.nom, f.age, moy); 27
}

Programmation en langage C Pr BOUZID


Définition de types avec typedef
• typedef permet d’affecter un nouvel identificateur à un type
composé : implique la création de nouveaux types (allège
l’écriture de programmes notamment dans le cas des tableaux et des
passages en paramètres des arguments dans les fonctions)
• Syntaxe: typedef déclaration; //à mettre au début du
programme, de préférence
avant le main()
• Exemple avec une structure:
typedef struct ficheEtudiant{
char nom[50];
int age;
float notes[4]; //ici FICHE est un nouveau
} FICHE; type et non pas un objet
28

Programmation en langage C Pr BOUZID


Définition de types avec typedef
• Déclaration de variables : nouveau_type variable;
• Exemples:
FICHE f; //f est une variable de type FICHE
FICHE t[10]; //t est un tableau de 10 éléments de type FICHE
• Représentation de la variable t (tableau de FICHE):

t

nom age notes nom age notes


0 1 2 …
Exemples d’affectations:
t[0].age = 20; 29
t[0].notes[2] = 14.5; //t[i].notes[j]
Programmation en langage C Pr BOUZID
Définition de types avec typedef
• Utilisation de typedef avec les tableaux:
• Exemple avec le nouveau type FICHE :
typedef FICHE TABF[10]; //définition d’un type TABF de type FICHE
TABF devient un type tableau de
FICHE à 1 dimension
• Autre exemple :
typedef int MATRICE[10][20]; //définition d’un type MATRICE d’entiers
MATRICE devient un type
tableau d’entiers à 2 dimensions
• Déclaration de variables avec les types tableaux:
• Exemples:
TABF t; // t est une variable tableau de type TABF (équivalent à FICHE t[10])

MATRICE m; //m est une variable tableau de type MATRICE 30

Programmation en langage C Pr BOUZID


Exemple global
Soit la structure suivante: struct ficheEtudiant{
char nom[50];
int age;
float notes[4];
};

Objectifs:
1) Créer un type FICHE de la structure ficheEtudiant puis un type
tableau de 5 FICHE
2) Remplir le tableau de FICHE
3) Afficher les informations sur l’étudiant x

31

Programmation en langage C Pr BOUZID


Solution
• Déclarations :
#include<stdio.h>
#include<string.h>
#define N 5
struct ficheEtudiant{
char nom[50];
int age;
float notes[4];
};
typedef struct ficheEtudiant FICHE; //création du type FICHE
typedef FICHE TABF[N]; //création d’un type tableau de FICHE

int main(){
int i,j;
TABF t; //déclaration du tableau de 5 FICHE
char nomx[20]; 32

Programmation en langage C Pr BOUZID


Solution
• Saisie de N étudiants:
for(i=0;i<N;i++){
printf("saississez le nom de l'etudiant %d:", i+1);
scanf("%s", t[i].nom);
printf("saississez l'age de l'etudiant %d: ", i+1);
scanf("%d", &t[i].age);
for(j=0;j<4;j++){
printf("saississez la note %d: ", j+1);
scanf("%f",&t[i].notes[j]);
}
}

33

Programmation en langage C Pr BOUZID


Solution
• Recherche de l’étudiant x:
printf("saisissez un etudiant: ");
scanf("%s", nomx);
for(i=0;i<N;i++){
if(strcmp(nomx,t[i].nom)==0){
printf("\ninformation sur l'etudiant %s: ", t[i].nom);
printf("\nage: %d",t[i].age);
for(j=0;j<4;j++){
printf("\nnote %d: %f", j+1, t[i].notes[j]);
}
printf("\n");
}
}

} 34

Programmation en langage C Pr BOUZID


Définition de types avec typedef
• Remarque: Il est possible d’utiliser un type nouveau dans la
déclaration d’un champ d’un modèle de structure
• Exemple: On déclare un modèle pour les notes:
typedef struct { //le nom du modèle est
char matiere[30]; facultatif quand on créé un
float note; nouveau type avec typedef
} NOTE;
On utilise maintenant le type NOTE pour déclarer un tableau
de 4 notes dans le type FICHE:
typedef struct ficheEtudiant{
char nom[50];
int age;
NOTE tabNote[4];
} FICHE; 35

Programmation en langage C Pr BOUZID


Définition de types avec typedef
type NOTE : type FICHE :

typedef struct { typedef struct ficheEtudiant{


char matiere[30]; char nom[50];
float note; int age;
} NOTE; NOTE tabNote[4];
} FICHE;

• Pour accéder à une note en utilisant un tableau de FICHE:


• Quelque soit l’écriture de déclaration du tableau:
FICHE t[10] ou typedef FICHE TABF[10];
TABF t;
• Il faut aller dans chaque niveau de champ:
• t[i].tabNote[j].matiere
• t[i].tabNote[j].note
36

Programmation en langage C Pr BOUZID


Définition de types avec typedef
• Exemple pour la saisie des notes:
for(i=0; i<N;i++){
… //saisie des autres champs de FICHE
//saisie des notes:
printf(″\nsaisissez les notes de l’etudiant: ″);
for(j=0;j<4;j++) {
printf(″\nsaisissez matiere %d: ″, j+1);
scanf(″%s″, t[i].tabNote[j].matiere);
printf(″\nsaisissez note %d: ″, j+1);
scanf(″%f″, &t[i].tabNote[j].note);
}
}

37

Programmation en langage C Pr BOUZID

Vous aimerez peut-être aussi