Université de Carthage DÉPARTEMENT INFORMATIQUE
Faculté des Sciences de Bizerte
Les structures & Tableaux de
structures
Niveau: SEIOT1-GLSI1
2024/2025
Attia Abir
Les Structures
2
Définition
Le tableau permet de désigner sous un seul nom un ensemble de
valeurs de même type, repérées par des indices.
TabAge 22 21 22 19
TabMoyenne 12.25 18.50 16.75 15.25
Un enregistrement, appelé structure en langage C, est une variable
complexe qui permet de désigner sous un seul nom un ensemble de
valeurs pouvant être de type différent.
Etudiant Nour 22 12.25
3
Déclaration d’une Structure (1/2)
Syntaxe
Noms
struct <Nom_Structure> { différents
<type_champ1> <Nom_Champ1>;
<type_champ2> <Nom_Champ2>;
<type_champ3> <Nom_Champ3>;
...
Tous les types
};
Exemple
struct etudiant
{
char nom[30];
int age;
float moyenneScolaire;
};
4
Déclaration d’une Structure (2/2)
Remarques :
Deux champs d’une même structure ne peuvent pas avoir
le même nom.
• Les données peuvent être de n'importe quel type hormis le type de
la structure dans laquelle elles se trouvent.
• La déclaration d'une structure ne fait que donner l'allure de la
structure, donc elle n’entraine pas la réservation d'espace mémoire
pour une variable structurée (variable de type structure).
• Il faut donc définir une (ou plusieurs) variable(s) structurée(s)
après avoir déclaré la structure.
5
Déclaration d’une Variable (1/3)
• Une variable structurée doit être définie comme suit :
struct <Nom_Structure> <Var_Structure>;
Exemple: Exemple:
struct etudiant { struct etudiant {
char nom[30]; char nom[30];
int age; int age;
float moyenneScolaire; float moyenneScolaire;
}; } E1, E2;
struct etudiant E1, E2;
6
Déclaration d’une Variable :
Utilisation de typedef (2/3)
Syntaxe
typedef struct <Nom_Structure> <nom_Definition>;
Exemple:
struct etudiant {
char Nom[30]; typedef struct etudiant Etudiant;
int Age;
float MoyenneScolaire;
};
Déclaration
<Nom_Définition> <Var_Structure>;
Etudiant E1;
7
Déclaration d’une Variable : Utilisation de
typedef (3/3)
Syntaxe
typedef struct {
<type_champ1> <Nom_Champ1>;
<type_champ2> <Nom_Champ2>;
<type_champ3> <Nom_Champ3>;
...
} <Nom_Structure> ;
Exemple Déclaration
typedef struct {
char Nom[30]; <Nom_Structure> <Var_Structure>;
int Age; Etudiant E1;
float MoyenneScolaire;
}Etudiant;
8
Initialisation d’une Structure
Initialiser une structure en indiquant entre accolades {} la liste
des valeurs séparées par des virgules.
Exemple:
struct etudiant {
char nom[30];
int age;
float moyenneScolaire;
};
struct etudiant E1={" test ",21,12};
9
Utilisation d’une structure (1/2)
Accès aux champs:
Pour accéder aux champs d'une structure on utilise l'opérateur de
champ (un simple point) placé entre le nom de la variable structurée
et le nom du champ.
Syntaxe:
<Var_Structure>.<Nom_Champ> ;
Pour affecter des valeurs à la variable E1, on pourra écrire:
E1.age= 22; // affectation d’un champ
printf ("donner la moyenne \n ") ;
scanf ("%f", &E1.Moyenne) ; //stockage dans un champ
10
Utilisation d’une structure (2/2)
Soit E1 et E2 deux variables de type Etudiant:
Il existe deux types d’affectation:
❑ Soit d’une façon individuelle (champs par champs), sur
chacun de leurs champs:
E1. niveau = E2.niveau;
E1.moyenne = E2.moyenne;
❑ Soit d’une manière globale sur toute la structure.
E1 = E2;
11
Structures contenant des tableaux
Une structure peut contenir des champs de type chaîne de caractères
ou bien de type tableau.
Exemple:
struct Etudiant
{
char nom [30];
char prenom [30];
float notes [4];
};
struct Etudiant E1,E2;
Notation:
E1.nom[0] : désigne le premier caractère du champ nom de l’étudiant E1
E2.notes[3] : désigne la quatrième note du tableau notes de l’étudiant E2
12
Structures imbriquées
Une structure imbriquée est une structure qui contient aussi un ou
plusieurs champ(s) de type structure. Cette dernière doit être
différente de la première.
Exemple:
struct Date {
int jour;
int mois;
int annee;
};
Struct Etudiant {
char nom [30] ;
char prenom [30] ;
struct Date date_naissance ;
};
NB: La structure Date doit aussi être déclarée et définie avant la structure
Etudiant 13
Tableaux de structures
14
Définition et Déclaration
Un tableau de structures est un tableau dont les éléments sont de type structure.
Syntaxe
struct <Nom_Structure>
{
<type_champ1> <Nom_Champ1>;
<type_champ2> <Nom_Champ2>;
<type_champ3> <Nom_Champ3>;
};
struct <Nom_Structure> tab [taille]; // tab est le nom du tableau
Exemple
struct Etudiant
{
char nom [30];
char prenom [30];
float notes [4];
};
struct Etudiant Classe[10];
Accès à un champ
Notation
Classe[i].note[1]= 15: désigne l’affectation de la valeur
15 au champ note[1] de l’élément de rang i du tableau
Classe.
Remarque : Classe.note[i] => N’a pas de sens!
Exemple
/*remplissage des 5 éléments du tableau Classe */
#include<stdio.h> for(i = 0 ; i <5 ; i++)
{
typedef struct printf(" Nom:" );scanf("%s",Classe[i].nom);
{ printf(" Prenom:" );scanf("%s",Classe[i].prenom);
char nom [30]; for(j=0;j<4;j++)
{
char prenom [30]; printf(" Note %d:" ,j );scanf("%f",&Classe[i].notes[j]);
float notes [4]; }
} Etudiant; }
/*Affichage des éléments du tableau Classe*/
for(i = 0 ; i <5; i++)
void main() {
{ Moy=0;
for(j=0;j<4;j++)
Etudiant Classe[5]; Moy+=Classe[i].notes[j];
int i,j; printf(" %s %s a une moyenne de %f" , Classe[i].nom,
float Moy; Classe[i].prenom,Moy/4);
}
}
Application
Implémenter un programme permettant de gérer les livres
d’une bibliothèque. Les livres sont stockés dans un tableau
unidimensionnel. Un livre est caractérisé par: - Sa référence
(chaîne de caractères). - Son nom(chaîne de caractères). - Le
nom de l’auteur(chaîne de caractères). - Sa date d’édition (de
type date).
Une date est caractérisée par - jour - mois - année Le
programme doit assurer les fonctionnalités suivantes via un
menu: 1- Ajouter un livre. Le programme doit assurer
l’unicité des références. 2- Afficher le tableau des livres. 3-
Trier le tableau selon un ordre décroissant des références
18
Les chaines & Tableaux de
chaines
Les chaînes de caractères
• Une chaîne de caractères est traitée comme un tableau de caractères à une
dimension.
• Déclaration
char Nom_du_tableau[longueur] ;
• Mémorisation
Le nom de la chaîne est le représentant de l'adresse du premier caractère.
20
chaînes de caractères constantes
• Les chaînes de caractères sont indiquées entre guillemets.
• La chaîne de caractères vide est alors:" "
char ch[] = "un ""deux ""trois"; //Concaténation implicite
char ch[] = "un deux trois"; //Écriture directe
=>le résultat final est identique!
21
Initialisation de chaînes de caractères
• on initialise les tableaux en indiquant la liste de ses éléments entre
accolades: char txt[]= {'h','e','l','l','o','\0’};
Pour une chaîne de caractères, on peut utiliser: char txt[]= "hello";
• Remarque : Si on ne spécifie pas la longueur, le bon nombre d'octets est
réservé (y compris le'\0’).
22
Lecture et fonctions
Accès aux éléments d'une chaîne
• L'accès se fait de la même manière que pour un élément d'un tableau.
Char A[6]="hello"; Les fonctions de string.h
strlen(s) fournit la longueur de la chaîne sans
compter le '\0' final
strcpy(s, t) copie t vers s
strcat(s, t) ajoute t à la fin de s
Lecture strcmp(s, t) compare s et t lexicographiquement
scanf (avec le spécificateur %s) et fournit un résultat:
Scanf ("%s" , &txt); négatif: si s précède t
zéro: si s est égal à t
gets(ch) positif: si s suit t
Char txt[20]; strncpy(s, t, n) copie au plus n caractères de t
gets(txt); vers s
strncat(s, t, n) ajoute au plus n caractères de t à
la fin de s 23
Lecture et fonctions
• Les fonctions de stdlib
atoi(s) retourne la valeur numérique représentée par s comme int
atol(s) retourne la valeur numérique représentée par s comme long
atof(s) retourne la valeur numérique représentée par s comme double (!)
Règles générales pour la conversion:
- Les espaces au début d'une chaîne sont ignorés
- Il n'y a pas de contrôle du domaine de la cible
- La conversion s'arrête au premier caractère non-convertible
- Pour une chaîne non-convertible, les fonctions retournent zéro
24
Tableaux de chaînes de caractères
• Déclaration, mémorisation
type nom[L][C];
• Accès aux différentes composantes
Il est possible d'accéder aux différentes chaînes de caractères d'un
tableau en indiquant
la ligne correspondante.
25
Tableaux de chaînes de caractères
• Exemple :
Char jour[7][9]={"lundi","mardi","mercredi","jeudi","vendredi",
"samedi","dimanche"};
printf("Aujourd'hui, c'est %s!\n",jour[2]);
affichage: Aujourd'hui, c'est mercredi!
jour[j] représente l'adresse du premier élément d'une chaîne de caractère,.
on ne peut donc:
modifier une telle adresse par une affectation du type:
• jour[4]="friday"; faux!
On doit utiliser la fonction strcpy(jour[4],"friday")
26