01 - Isge-2021 - Koala
01 - Isge-2021 - Koala
01 - Isge-2021 - Koala
Structures de données
dynamiques
Gouayon KOALA
Doctorant / Département Informatique (UJKZ)
[email protected]
72 26 61 56 / 76 55 63 81 / 78 88 06 75
I. Les Fonctions en C
13/02/2024 2
[email protected] Gouayon KOALA ISGE 2ARITFI
/ 2AMIFI
Les Fonctions en C
Introduction
Les fonctions sont des sous-programmes qui peuvent être compilés, testés
séparément et réutilisés dans d’autres programmes.
et son corps.
et son corps.
13/02/2024 10
[email protected] Gouayon KOALA ISGE 2ARITFI / 2AMIFI
Les Fonctions en C
Déclaration et définition de fonctions
int max( int , int); Déclaration de la fonction max ()
int main ()
{ // Teste de la fonction max()
int m,n;
do
{ scanf(‘’%d %d, &m, &n);
printf("Maximum ( %d , %d ) = %d\n" , m, n, max (m,n));
}
while (m !=0);
}
int max (int x, int y)
{ if (x<y) return y; Définition de la fonction max ()
else return x;
13/02/2024 11
} [email protected] Gouayon KOALA ISGE 2ARITFI / 2AMIFI
Les Fonctions en C
Les fonctions ne fournissant pas un résultat
void sansval(int n)
13/02/2024 12
[email protected] Gouayon KOALA ISGE 2ARITFI / 2AMIFI
Les Fonctions en C
Les fonctions fournissant un résultat
13/02/2024 13
[email protected] Gouayon KOALA ISGE 2ARITFI / 2AMIFI
Les Fonctions en C
Les fonctions fournissant un résultat
L’instruction return s’écrit de trois façons possibles:
return; : la valeur retournée est indéfinie. Le compilateur ajoute
automatiquement un retour de ce type quand il ne retrouve pas cette
instruction.
return constante; : La valeur retournée est une constante.
return (expression); : l’expression est évalué et sa valeur est retournée
après conversion de type si le résultat de l’expression est d’un type
différent de celui de la fonction
float fexple(float x, int b, int c)
{
return (x*x+b*x+c);
}
13/02/2024 15
[email protected] Gouayon KOALA ISGE 2ARITFI / 2AMIFI
Les Fonctions en C
Paramètres et fonctions
Pour une fonction, on distingue deux types de paramètres:
- Les paramètres formels: paramètres utilisés lors de la déclaration
de la fonction;
- Les paramètres réels: paramètres fournis à la fonction par le
programme appelant.
Les paramètres formels encore appelés arguments de la fonction sont
considérés comme des variables locales à la fonction. On ne peut
donc pas rédéclarer un paramètre formel dans une fonction.
13/02/2024 16
[email protected] Gouayon KOALA ISGE 2ARITFI / 2AMIFI
Les Fonctions en C
Paramètres et fonctions
int Test ( int x, int y )
{ int x, a; // Erreur car double déclaration de la variable x
}
L’utilisation des paramètres réels nécessite une bijection entre la liste des paramètres
réels et celle des paramètres formels lors de l’appel de la fonction. Le type de
chaque paramètre réel doit être identique à celui du paramètre formel
correspondant.
int Test ( int x, int y, double z )
{ int a,b; double n;
Test (a,b,n); // Appel correct car correspondance
Test (a,n,b); // Incorrect
}
13/02/2024 17
[email protected] Gouayon KOALA ISGE 2ARITFI / 2AMIFI
Les Fonctions en C
Passage de paramètres à une fonction
En ce qui concerne le passage de paramètres à une fonction, le
programmeur a deux besoins fondamentaux :
– soit il désire passer une valeur qui sera exploitée par la fonction. Une
telle façon de passer un paramètre s’appelle du passage par valeur ;
– soit il désire passer une référence à une variable, de manière à
permettre à la fonction de modifier la valeur de cette variable. Une
telle façon de passer un paramètre s’appelle du passage par
adresse.
13/02/2024 18
[email protected] Gouayon KOALA ISGE 2ARITFI / 2AMIFI
Les Fonctions en C
Passage de paramètres par valeur
En C, le passage des paramètres se fait toujours par valeur, autrement
dit les fonctions n’obtiennent que les valeurs de leurs paramètres
et n’ont pas d’accès aux variables elles-mêmes.
Les paramètres d’une fonction sont à considérer comme des variables
locales qui sont initialisées automatiquement par les valeurs
indiquées lors d’un appel.
A l’intérieur de la fonction, On peut donc changer les valeurs des
paramètres sans influencer les valeurs originales dans les fonctions
appelantes.
13/02/2024
[email protected] Gouayon KOALA ISGE 2ARITFI / 2AMIFI
19
Les Fonctions en C
Passage de paramètres par adresse
Comme on vient de le voir, tout paramètre est passé par valeur, et cette
règle ne souffre aucune exception. Cela pose le problème de réaliser
un passage de paramètre par adresse lorsque le programmeur en a
besoin.
On13/02/2024
peut alors atteindre la variable à l’aide du pointeur. 20
[email protected] Gouayon KOALA ISGE 2ARITFI / 2AMIFI
Les Fonctions en C
Passage de paramètres par adresse
Exemple : Supposons qu’on désire écrire une fonction Add, admettant trois paramètres a, b et
c.
On désire que le résultat de l’exécution de Add soit d’affecter au paramètre c la somme des
valeurs des deux premiers paramètres. Le paramètre c ne peut évidemment pas être
passé par valeur, puisqu’on désire modifier la valeur du paramètre effectif correspondant.
void Add(int a, int b, int *c)
{ /* c repère l’entier où on veut mettre le résultat */
*c = a + b;
}
int main()
{ int i=10,j=14,k;
/* on passe les valeurs de i et j comme premiers paramètres */
/* on passe l’adresse de k comme troisième paramètre */
Add(i,j,&k);
}
13/02/2024 21
[email protected] Gouayon KOALA ISGE 2ARITFI / 2AMIFI
Les Fonctions en C
Fonctions récursives
une fonction récursive est une fonction qui peut s'appeler elle-même
au cours de son exécution ; on parle également de définition récursive
ou d'appel récursif de fonction.
Exemple 1: la fonction factorielle
int fact ( int n)
{ if (n==0)
return 1;
else
return n*fact(n-1); Appel récursif de la fonction fact
}
13/02/2024 22
[email protected] Gouayon KOALA ISGE 2ARITFI / 2AMIFI
Les Fonctions en C
Fonctions récursives
Exemple 2 : Suite récurrente
u0 = 1
un = 2 un -1+ 1 ∀ n ≥ 1
13/02/2024 24
[email protected] Gouayon KOALA ISGE 2ARITFI / 2AMIFI
II. Les Pointeurs
13/02/2024 25
[email protected] Gouayon KOALA ISGE 2ARITFI / 2AMIFI
Notion de Variable (rappel) :
➢Déclarer une variable, c'est attribuer un nom (l'identificateur) à une
zone de la mémoire centrale. Cette zone est définie par :
- sa position c'est-à-dire l’adresse de son premier octet,
- sa taille c'est-à-dire le nombre d’octets.
➢Pour accéder à la valeur contenue dans une variable, on utilise tout
simplement son nom. Mais il peut arriver qu'on veuille accéder à
l'adresse d'une variable.
Dans ce cas, on utilise l'opérateur d'adresse & suivi du nom de la
variable.
13/02/2024 26
[email protected] Gouayon KOALA ISGE 2ARITFI / 2AMIFI
Les Pointeurs
Notion de Pointeur
Définition
Un pointeur est une variable qui contient l'adresse
d'une autre variable.
✓ L'adresse contenue dans un pointeur est celle d'une
variable qu'on appelle variable pointée.
✓ On dit que le pointeur pointe sur la variable dont il
contient l'adresse.
✓ Un pointeur est associé à un type de variable sur
lequel il pointe. Par exemple, un pointeur sur entier
ne peut pointer que sur des variables entières.
13/02/2024 27
[email protected] Gouayon KOALA ISGE 2ARITFI / 2AMIFI
Les Pointeurs
Notion de Pointeur
Définition
int n=5; 5
n
n indique au compilateur une adresse en mémoire dont le contenu est
un entier de valeur 5.
13/02/2024 28
[email protected] Gouayon KOALA ISGE 2ARITFI / 2AMIFI
Les Pointeurs
Notion de Pointeur
Définition
int * pointeEntier;
Adresse d’une case Adresse d’une case
float * pointeReel; contenant un entier contenant un réel
pointeEntier pointeReel
Il est possible d’avoir un pointeur sur n’importe quel type de variables.
Le symbole * est un opérateur unaire diffèrent du symbole de
multiplication.
Ces déclarations réservent la case mémoire mais elles ne déclarent pas les
variables correspondantes.
En plus, les variables déclarés ne sont pas encore initialisées.
13/02/2024 29
[email protected] Gouayon KOALA ISGE 2ARITFI / 2AMIFI
Les Pointeurs
Notion de Pointeurs
Intérêts des pointeurs
13/02/2024 32
[email protected] Gouayon KOALA ISGE 2ARITFI / 2AMIFI
Les Pointeurs
Notion de Pointeur
Priorité des opérateurs
13/02/2024 33
[email protected] Gouayon KOALA ISGE 2ARITFI / 2AMIFI
Les Pointeurs
Notion de Pointeur
Exemple :
int main()
{
int i = 3;
int *p_v;
p_v = &i;
printf("*p_v = %d \n ",*p_v);
return 0
}
Dans ce programme, les objets i et *p sont identiques : ils
ont mêmes adresse et valeur. Cela signifie en particulier
que toute modification de *p_v modifie i. Ainsi, si l'on
ajoute l'instruction *p_v = 0; à la fin du programme
précédent, la valeur de i devient nulle.
13/02/2024 34
[email protected] Gouayon KOALA ISGE 2ARITFI / 2AMIFI
Les Pointeurs
Notion de Pointeur
On peut donc dans un programme manipuler à la
fois les objets p et *p. Ces deux manipulations sont
très différentes. Comparons par exemple les deux
programmes suivants :
Exemple 1: Exemple 2:
int main() int main()
{ {
int i = 3, j = 6; int i = 3, j = 6;
int *p1, *p2; int *p1, *p2;
p1 = &i; p1 = &i;
p2 = &j; p2 = &j;
*p1 = *p2; p1 = p2;
return 0 return 0
} }
13/02/2024 35
[email protected] Gouayon KOALA ISGE 2ARITFI / 2AMIFI
Les Pointeurs
Notion de Pointeur
Arithmétique des pointeurs
La valeur d'un pointeur étant un entier, on peut lui appliquer
un certain nombre d'opérateurs arithmétiques classiques.
Les seules opérations arithmétiques valides sur les
pointeurs sont :
• l'addition d'un entier à un pointeur. Le résultat est un
pointeur de même type que le pointeur de départ ;
• la soustraction d'un entier à un pointeur. Le résultat est un
pointeur de même type que le pointeur de départ ;
• la différence de deux pointeurs pointant tous deux vers des
objets de même type. Le résultat est un entier.
Notons que la somme de deux pointeurs n'est pas autorisée.
13/02/2024 36
[email protected] Gouayon KOALA ISGE 2ARITFI / 2AMIFI
Les Pointeurs
Notion de Pointeur
Arithmétique des pointeurs
Incrémentation et décrémentation de pointeurs
Les opérations sur les pointeurs sont à employer avec beaucoup de
précautions. Une erreur peut entraîner des écritures n’importe où en
mémoire.
13/02/2024 37
[email protected] Gouayon KOALA ISGE 2ARITFI / 2AMIFI
Les Pointeurs
Notion de Pointeur
Arithmétique des pointeurs
Addition et soustraction
Elles ne sont possibles qu’avec des entiers. Mais, tout
comme l’incrémentation, l’unité de compte n’est pas l’octet
mais la taille de l’élément.
long *ptrL;
float *ptrR;
Comparaison
13/02/2024 39
[email protected] Gouayon KOALA ISGE 2ARITFI / 2AMIFI
Les Pointeurs
Notion de Pointeur
Arithmétique des pointeurs
Multiplication et division
13/02/2024 40
[email protected] Gouayon KOALA ISGE 2ARITFI / 2AMIFI
Les Pointeurs
Notion de Pointeur
Application aux passages de paramètres
13/02/2024 41
[email protected] Gouayon KOALA ISGE 2ARITFI / 2AMIFI
III. La gestion dynamique de la
mémoire
13/02/2024 42
[email protected] Gouayon KOALA ISGE 2ARITFI / 2AMIFI
La gestion dynamique de la mémoire
Principe de l’allocation dynamique
13/02/2024 43
[email protected] Gouayon KOALA ISGE 2ARITFI / 2AMIFI
La gestion dynamique de la mémoire
Demander de la place en mémoire
Malloc retourne:
Un pointeur sur une zone mémoire de la taille demandée
en cas de succès.
NULL en cas d’échec.
13/02/2024 44
[email protected] Gouayon KOALA ISGE 2ARITFI / 2AMIFI
La gestion dynamique de la mémoire
Demander de la place en mémoire
13/02/2024 45
[email protected] Gouayon KOALA ISGE 2ARITFI / 2AMIFI
La gestion dynamique de la mémoire
Demander de la place en mémoire
Malloc (2)
sizeof(char) ->1
sizeof(double) ->8
13/02/2024 46
[email protected] Gouayon KOALA ISGE 2ARITFI / 2AMIFI
La gestion dynamique de la mémoire
Demander de la place en mémoire
Realloc
Augmentation de la taille d’une zone précédemment allouée.
13/02/2024 47
[email protected] Gouayon KOALA ISGE 2ARITFI / 2AMIFI
La gestion dynamique de la mémoire
13/02/2024 48
[email protected] Gouayon KOALA ISGE 2ARITFI / 2AMIFI
La gestion dynamique de la mémoire
13/02/2024 49
[email protected] Gouayon KOALA ISGE 2ARITFI / 2AMIFI
La gestion dynamique de la mémoire
Demander de la place en mémoire
Calloc
Allocation d’une zone mémoire initialisée avec des caractères nuls.
13/02/2024 50
[email protected] Gouayon KOALA ISGE 2ARITFI / 2AMIFI
La gestion dynamique de la mémoire
Demander de la place en mémoire
La fonction calloc de la librairie stdlib.h a le même
rôle que la fonction malloc mais elle initialise en
plus l'objet pointé *p à zéro.
Sa syntaxe est calloc(nb-objets, taille-objets).
Ainsi, si p est de type int*, l’instruction :
p = (int*)calloc(N,sizeof(int));
est strictement équivalente à
p = (int*)malloc(N * sizeof(int));
for (i = 0; i < N; i++)
*(p + i) = 0;
L'emploi de calloc est simplement plus rapide.
13/02/2024 51
[email protected] Gouayon KOALA ISGE 2ARITFI / 2AMIFI
La gestion dynamique de la mémoire
Restituer de la place en mémoire allouée
void free (void * ptr) //ptr doit être l’adresse du début de cette zone.
13/02/2024 52
[email protected] Gouayon KOALA ISGE 2ARITFI / 2AMIFI
La gestion dynamique de la mémoire
Allocation dynamique des tableaux
Tableau à un seul indice (1)
Dans le cas simple d’un tableau mono indicé, il y’a une
équivalence formelle entre l’identificateur du tableau et le
pointeur.
13/02/2024 53
[email protected] Gouayon KOALA ISGE 2ARITFI / 2AMIFI
La gestion dynamique de la mémoire
Allocation dynamique des tableaux
Tableau à un seul indice (2)
Ainsi :
t+1 &t[1]
t+i &t[i]
t[i] * (t+i)
13/02/2024 54
[email protected] Gouayon KOALA ISGE 2ARITFI / 2AMIFI
La gestion dynamique de la mémoire
Allocation dynamique des tableaux
13/02/2024 55
[email protected] Gouayon KOALA ISGE 2ARITFI / 2AMIFI
La gestion dynamique de la mémoire
Allocation dynamique des tableaux
13/02/2024 56
[email protected] Gouayon KOALA ISGE 2ARITFI / 2AMIFI
La gestion dynamique de la mémoire
Allocation dynamique des tableaux
13/02/2024 57
[email protected] Gouayon KOALA ISGE 2ARITFI / 2AMIFI
La gestion dynamique de la mémoire
Allocation dynamique des tableaux
13/02/2024 58
[email protected] Gouayon KOALA ISGE 2ARITFI / 2AMIFI
La gestion dynamique de la mémoire
Fonction free()
• void free(void* p)
Free() permet de libérer de la mémoire
préalablement allouée par les fonctions
malloc(). En paramètre, on passe
l'adresse du bloc mémoire à libérer.
13/02/2024 59
[email protected] Gouayon KOALA ISGE 2ARITFI / 2AMIFI
IV. Les chaînes de caractères
13/02/2024 60
[email protected] Gouayon KOALA ISGE 2ARITFI / 2AMIFI
Les chaînes de caractères
Définition et initialisation d’une chaîne
Une chaîne de caractères est une suite de caractères
alphanumériques terminée par le caractère ‘\0’.
Les définitions suivantes char texte[8]= ‘’bonjour’’; ou char texte
[]= ‘’bonjour’’; permettent de réserver un tableau de 8 éléments
dans lequel sont stockés les 7 caractères du mot «bonjour» suivis
par le caractère nul ‘\0’ ( c’est-à-dire dont le code ASCII est 0).
Remarques :
ne pas confondre les guillemets ‘’ ’’ de la chaîne de caractères et les
apostrophes ‘ ’ qui entourent un caractère.
Toute chaîne se termine automatiquement par ‘\0’
13/02/2024 61
[email protected] Gouayon KOALA ISGE 2ARITFI / 2AMIFI
Les chaînes de caractères
Ecriture d’une chaîne
En considérant la chaîne comme un tableau, on peut réaliser l’affichage caractère par
caractère jusqu’au moment où le caractère nul est atteint.
13/02/2024 62
[email protected] Gouayon KOALA ISGE 2ARITFI / 2AMIFI
Les chaînes de caractères
Lecture d’une chaîne
La fonction scanf permet de lire les caractères avec le format %s mais la lecture
s’effectue jusqu’à a rencontre d’un séparateur (espace, tabulation ou retour chariot).
La chaine est complétée par le caractère ‘\0’.
13/02/2024 63
[email protected] Gouayon KOALA ISGE 2ARITFI / 2AMIFI
Les chaînes de caractères
Quelques fonctions de traitement de chaînes de caractères
13/02/2024 64
[email protected] Gouayon KOALA ISGE 2ARITFI / 2AMIFI
Les chaînes de caractères
Quelques fonctions de traitement de chaînes de caractères
13/02/2024 65
[email protected] Gouayon KOALA ISGE 2ARITFI / 2AMIFI
Les chaînes de caractères
Quelques fonctions de traitement de chaînes de caractères
13/02/2024 66
[email protected] Gouayon KOALA ISGE 2ARITFI / 2AMIFI
Les chaînes de caractères
Quelques fonctions de traitement de chaînes de caractères
13/02/2024 67
[email protected] Gouayon KOALA ISGE 2ARITFI / 2AMIFI
Les chaînes de caractères
Quelques fonctions de traitement de chaînes de caractères
13/02/2024 68
[email protected] Gouayon KOALA ISGE 2ARITFI / 2AMIFI
Les chaînes de caractères
Tableaux de chaînes de caractères
13/02/2024 69
[email protected] Gouayon KOALA ISGE 2ARITFI / 2AMIFI
V. Les structures
13/02/2024 70
[email protected] Gouayon KOALA ISGE 2ARITFI / 2AMIFI
V. Les structures
Définition
13/02/2024 71
[email protected] Gouayon KOALA ISGE 2ARITFI / 2AMIFI
V. Les structures
Déclaration et initialisation
Notion de structure
Une structure définit un nouveau type qui, de même qu’un
entier ou un réel, est une entité pouvant être traitée comme
un élément autonome
13/02/2024 72
[email protected] Gouayon KOALA ISGE 2ARITFI / 2AMIFI
V. Les structures
Déclaration et initialisation
Modèle de structure
Les structures ne sont pas des types préexistants en C. Il est nécessaire de les
définir avant toute utilisation. Cette définition consiste principalement à nommer les
différents éléments, avec leur taille, qui recevront ensuite les informations.
struct Personne
{
char nom [20];
char prenom[20];
int age ;
};
Cette déclaration n’est pas une déclaration de variable. Elle se contente de décrire la
structure en indiquant les champs la composant et en lui donnant un nom
13/02/2024 73
[email protected] Gouayon KOALA ISGE 2ARITFI / 2AMIFI
V. Les structures
Déclaration et initialisation
Déclaration de variable de type structuré (1)
Une fois la définition de la structure, il faut déclarer des variables de ce nouveau type.
Il existe deux façons habituelles de définir des variables de type structuré
struct Personne
{
char nom [20];
char prenom[20];
int age ;
} p1, p2;
Cette façon déclare le modèle de structure Personne en même temps que les deux types
variables p1 et p2.
13/02/2024 74
[email protected] Gouayon KOALA ISGE 2ARITFI / 2AMIFI
V. Les structures
Déclaration et initialisation
Déclaration de variable de type structuré (2)
Dans ce cas, l’identificateur de la structure peut même être omis s’il n’est
plus nécessaire ultérieurement.
struct
{
char nom [20];
char prenom[20];
int age ;
} p1, p2;
Cette façon déclare le modèle de structure Personne en même temps que les deux
types variables p1 et p2.
13/02/2024 75
[email protected] Gouayon KOALA ISGE 2ARITFI / 2AMIFI
V. Les structures
Déclaration et initialisation
Déclaration de variable de type structuré (3)
La deuxième façon sépare la définition du modèle et la déclaration de
la variable.
struct Personne
{
char nom [20];
char prenom[20];
int age ;
};
struct Personne p1, p2;
Cette deuxième forme est plus pratique et plus claire pour la maintenance des
programmes.
13/02/2024 76
[email protected] Gouayon KOALA ISGE 2ARITFI / 2AMIFI
V. Les structures
Déclaration et initialisation
Déclaration de variable de type structuré (4)
Les variables de type structuré prennent différentes formes. Ainsi, à l’aide du
modèle de Personne, il est possible de déclarer les variables suivantes:
13/02/2024 77
[email protected] Gouayon KOALA ISGE 2ARITFI / 2AMIFI
V. Les structures
Déclaration et initialisation
Structures imbriquées
Les champs dans une structure sont de tout type, y compris des
structures elles-mêmes.
struct Personne
{
struct date
char nom [20];
{
char prenom[20];
int jour;
int age ;
int mois;
struct date Naissance;
int an;
struct date Embauche;
};
};
13/02/2024 78
[email protected] Gouayon KOALA ISGE 2ARITFI / 2AMIFI
V. Les structures
Déclaration et initialisation
Initialisation de variables structurées
L’initialisation des variables de type structuré se fait de la même façon que
pour les tableaux
L’initialisation peut être incomplète mais elle doit être contiguë à partir du début.
13/02/2024 79
[email protected] Gouayon KOALA ISGE 2ARITFI / 2AMIFI
V. Les structures
Utilisation d’une structure
Accès global à la structure
L’affectation globale entre deux variables définies à partir du
même modèles (de nom identique) est possible.
struct Personne
{
char nom [20];
char prenom[20];
int age ;
};
struct Personne p1, p2;
p1=p2;est interdit sur la variable structurée prise dans son ensemble. Il
Remarque: Tout autre opérateur
est impossible de comparer des variables structurés. Ainsi if(p1==p2) provoque une faute de
compilation.
De même, la lecture ou l’écriture globale de la variable structuré sur l’écran est rejetée. Il faut le
faire champ par champ.
13/02/2024 80
[email protected] Gouayon KOALA ISGE 2ARITFI / 2AMIFI
V. Les structures
Utilisation d’une structure
Accès aux champs d’une structure
Les champs d’une structure peuvent être manipulés comme n’importe
quelle variable du type correspondant.
La désignation d’un champs se note en faisant suivre le nom de la variable
13/02/2024 82
[email protected] Gouayon KOALA ISGE 2ARITFI / 2AMIFI
V. Les structures
La structure en tant que paramètre
Portée du nom du modèle de la structure
A l’image des variables, la « portée » d’un modèle de
structure dépend de l’emplacement de sa déclaration:
Si elle se situe au sein d’une fonction ( y compris la fonction
main), elle n’est accessible que depuis cette fonction.
Si elle se situe en dehors d’une fonction, elle est accessible de
toute la partie du fichier source qui suit sa déclaration; elle peut
aussi être utilisée par plusieurs fonctions
13/02/2024 83
[email protected] Gouayon KOALA ISGE 2ARITFI / 2AMIFI
V. Les structures
La structure en tant que paramètre
Passage d’informations structurées entre fonction
Des fonctions peuvent avoir besoin de se transmettre des
variables structurées. Il est dans ce cas conseillé de passer
l’adresse de la variable structurée. On évite ainsi de dupliquer
une zone mémoire importante, et de plus la fonction appelée
peut modifier la variable structurée.
13/02/2024 84
[email protected] Gouayon KOALA ISGE 2ARITFI / 2AMIFI
V. Les structures
La structure en tant que paramètre
Un raccourci consiste à former une flèche avec un tiret suivi d'un chevron >.
Ainsi on aura : ptr->prenom= ‘’Ousmane’’;
13/02/2024 85
[email protected] Gouayon KOALA ISGE 2ARITFI / 2AMIFI
V. Les structures
Types de données personnalisées (typedef)
La directive typedef permet à un utilisateur de créer des types de
données personnels en renommant des types existants.
Syntaxe : typedef struct type nouveau_type
13/02/2024 86
[email protected] Gouayon KOALA ISGE 2ARITFI / 2AMIFI
V. Les structures
Structure autoréférentielles (Listes chaînées)
13/02/2024 87
[email protected] Gouayon KOALA ISGE 2ARITFI / 2AMIFI
V. Les structures
Structure autoréférentielles (Listes chaînées)
Lorsque la structure contient des données et un pointeur vers la
structure suivante, on parle de la liste chaînée.
13/02/2024 88
[email protected] Gouayon KOALA ISGE 2ARITFI / 2AMIFI
V. Les structures
Structure autoréférentielles (Listes chaînées)
Qu’est-ce qu’une liste chaînée (1)
C’est une structure comportant des champs contenant des
données et un pointeur vers une structure de même type. .Ainsi, la
structure correspondant à la liste chaînée contenant une chaîne de
15 caractères et un entier sera comme ceci:
struct Nom_de_la_liste
{
char chaine[16];
int entier;
struct Nom_de_la_liste * pSuivant;
};
13/02/2024 89
[email protected] Gouayon KOALA ISGE 2ARITFI / 2AMIFI
V. Les structures
Structure autoréférentielles (Listes chaînées)
13/02/2024 90
[email protected] Gouayon KOALA ISGE 2ARITFI / 2AMIFI
V. Les structures
Structure autoréférentielles (Listes chaînées)
Ajout du premier élément (1)
Une fois la structure définie, il est possible d’ajouter un premier
maillon à la liste chaînée, puis de l’affecter au pointeur Tete.
struct Liste
{
char chaine[16];
int entier;
struct Liste * pSuivant;
};
13/02/2024 91
[email protected] Gouayon KOALA ISGE 2ARITFI / 2AMIFI
V. Les structures
Structure autoréférentielles (Listes chaînées)
Ajout du premier élément (2)
Nouveau->pSuivant=NULL;
13/02/2024 92
[email protected] Gouayon KOALA ISGE 2ARITFI / 2AMIFI
V. Les structures
Structure autoréférentielles (Listes chaînées)
Ajout d’un élément en fin de liste (1)
Il faut définir un pointeur (appelé généralement pointeur courant) afin de parcourir la
liste jusqu’à atteindre le dernier maillon ( celui dont le pointeur possède la valeur
NULL.
13/02/2024 93
[email protected] Gouayon KOALA ISGE 2ARITFI / 2AMIFI
V. Les structures
Structure autoréférentielles (Listes chaînées)
Ajout d’un élément en fin de liste (2)
13/02/2024 94
[email protected] Gouayon KOALA ISGE 2ARITFI / 2AMIFI
VI. Les unions
13/02/2024 95
[email protected] Gouayon KOALA ISGE 2ARITFI / 2AMIFI
96 Déclaration d’une union
Déclaration
La déclaration d’une union est similaire dans sa forme à celle d’une structure et présente les mêmes caractéristiques.
union ecran
{
unsigned char mot;
Unsigned char octet[8];
};
union ecran cellule; //Déclaration qui est suivie d’une réservation en mémoire d’une variables
Dans le cas d’une structure, la place occupée par la variable est la somme de tous les champs tandis que dans le cas
de l’union, la place occupée est la taille du champ le plus grand.
Accès global
Tout comme une structure, l’accès global est valide. L’affectation directe de deux variables structurées
à l’aide de la même union est très pratique. Il est bien sûr toujours possible de travailler également
avec un pointeur chargé par l’adresse de l’union à l’aide de l’opérateur &.
Les champs de l’union sont atteints, comme pour la structure, à l’aide de l’opérateur ‘’.’’
Ecran.mot;
Ecran.octet[0];
L’opérateur -> est aussi utilisé et simplifie l’écriture dans le cas de pointeur sur
des unions (ptr->mot au lieu de (*ptr).mot).
Portée de l’union
La déclaration du modèle de l’union n’est connue que dans la fonction où elle est écrite. Si ce
modèle est utilisé dans plusieurs fonctions, il est préférable de l’écrire en variable globale au
début du code source, en dehors de toute fonction, comme pour les structures.
Passage de paramètre
13/02/2024 102
[email protected] Gouayon KOALA ISGE 2ARITFI / 2AMIFI
VII. Les fichiers
13/02/2024 103
[email protected] Gouayon KOALA ISGE 2ARITFI / 2AMIFI
104 Notion de fichier (1)
Les fichiers permettent de stocker sur un support permanent ( disque ou disquette) un ensemble de
données produites par le programme. Nous verrons toutefois qu’en C, tous les périphériques, qu’ils
soient d’archivage ou de communication (clavier, écran) peuvent êtres considérés comme des fichiers.
Ainsi les entrées-sorties conversationnelles c’est-à-dire les fonctions permettant d’échanger des
informations entre le programme et l’utilisateur apparaîtront comme un cas particulier de la gestion de
fichiers.
Les fonctions dites «de niveau 1 » ou bas niveau sont très proches du système d’exploitation. Elles
considèrent le fichier comme une suite ininterrompue d’octets, sans considération d’organisation logique.
Les fonctions dites « de niveau 2 » considèrent le fichier comme une suite d’enregistrements organisés
logiquement (mais il est toujours possible de lire n’importe quel nombre d’octets). L’accès aux
informations se fait à travers un tampon géré par le C. De ce fait, les informations peuvent être formatées,
comme une entrée/sortie conversationnelle.
Déclaration du fichier
On déclare un fichier de la façon suivante : FILE * Dico;
La variable Dico est un pointeur sur un objet de FILE. Ce nom écrit en majuscule, désigne un
modèle de structure défini dans stdio.h.
‘’w’’ Ecriture seule. Le curseur est positionné sur le premier octet du fichier. Celui-ci est crée s’il n’existe pas, son ancien
contenu est écrasé s’il existe.
‘’a’’ Ce mode autorise l’ajout. Le curseur est positionné en fin de fichier. Celui-ci est crée s’il n’existe pas.
‘’r+’’ Lecture et écriture sur un fichier existant. Utile pour effectuer des modifications. Le fichier doit déjà exister.
‘’w+’’ Ecriture et lecture. Le fichier est créé s’il n’existe pas, son ancien contenu est écrasé s’il existe.
‘’a+’’ Ecriture et lecture. Le curseur est positionné à la fin du fichier. Celui-ci est crée s’il n’existe pas.
FILE * Dico;
Dico= fopen(‘’individu.dat’’, ‘’a’’); // ouverture du fichier en mode ajout
If(Dico==NULL)
puts(‘’problème à l’ouverture du fichier’’);
Fermeture du fichier
Le rôle principal de la fermeture du fichier est de vider le tampon associé au fichier. En effet,
l’écriture dans le fichier ne se fait pas variable par variable. Les différentes écritures transitent dans
un canal appelé buffer. Une fois que ce buffer est plein, il y a transfert dans le fichier.
fclose(Dico);
While(fread(&Nombre,sizeof(Nombre),1,Dico)&&!feof(Dico))….
fseek positionne le pointeur de fichier pour le flot stream; une lecture ou une écriture ultérieure
accèdera aux données commençant à la nouvelle position. Pour un fichier binaire, la position est fixée
à offset caractères de origin, qui peut valoir SEEK_SET ( début de fichier), SEEK_CUR (position
courante ou SEEK_END (fin de fichier). Ces différentes valeurs sont définies dans le fichier stdio.h .
ftell retourne la position courante du pointeur de fichier par rapport au début du fichier.
fseek et rewind retournent 0 après une correction sans erreur du pointeur de fichier. Elles retournent une
valeur différente de 0 s’il y a erreur.
Dans de tels fichiers, chaque octet représente un caractère. Généralement, on y trouve des caractères de fin
de ligne (\n), de sorte qu’ils apparaissaient comme une suite de lignes.
Les fonctions permettant de travailler avec des fichiers de texte ne sont rien d’autre qu’une généralisation aux fichiers
déjà rencontrés pour les entrées/sorties conversationnelles
Ce sont:
fscanf(FILE *fp, char *format,liste-d’adresses)
fprintf(FILE *fp, char * format, liste-d’expression)
fgetc(FILE * fp) // lecture d’un caractère
fputc(FILE *fp) // écriture d’un caractère
fgets(char chaine, int taille_max, FILE *fp) // lecture d’une chaîne
fputs (char chaine, FILE *fp) //Ecriture d’une chaîne
La signification de leurs arguments est la même que pour les fonctions conversationnelles correspondes. Seule fgets
comporte un argument entier (taille_max) de contrôle de longueur. Il précise le nombre maximal de caractères ( y
compris \0 de fin) qui seront placés dans la chaîne.
13/02/2024 117
[email protected] Gouayon KOALA ISGE 2ARITFI / 2AMIFI