Atelier de programmation II
Plan
Les types de donnes structures. Pointeurs et allocation dynamique de la mmoire. Les Listes:
simplement chanes, doublement chanes.
Les arbres:
n-aires, binaires, quilibrs.
Atelier de programmation II
Rfrence bibliographique
Atelier de programmation II
Atelier de programmation II
Une structure, appele enregistrement dans d'autres langages (comme PASCAL), est une variable contenant plusieurs variables, appeles champs. Si une structure S contient un char et un int, chacun de ces champs portera un nom, par exemple Ch et Ent. Dans ce cas, S.Ch dsignera le char de S et S.Ent dsignera le int de S.
Dr. Slim BECHIKH 5 Atelier de programmation II
20 18
06895612 Ahmed
7
19
char [50]
char [100] int
Chaouachi
Expert comptable
16
98 122 155
Structure Personne.
Tableau dentiers.
Atelier de programmation II
Atelier de programmation II
4) Loprateur typedef
Nous pouvons nous dbarrasser du mot cl struct en renommant le type via lutilisation de loprateur typedef :
/*Exemple*/ #include <stdio.h> typedef struct Point // typedef nous a permis de crer un synonyme du { double abs; // type struct Point appel T_Point double ord; } T_Point; main ( ) { T_Point x; // Nous avons limin le terme struct x.abs = 2; x.ord = x.abs + 1; printf ("x = (%.3f, %.3f) \n", x.abs, x.ord); }
Dr. Slim BECHIKH 9 Atelier de programmation II
4) Tableau de structures
Ecrire un programme C qui remplie un tableau de 10 lments de type Point de sorte que les points appartiennent la droite dfinie par les points (0, 0) et (1, 1). Par la suite, afficher ce tableau.
#include <stdio.h> for (i = 0; i < 10; i++) typedef struct Point { printf ("P [%d] = (%.3f, %.3f) \n", i, P[i].abs, { double abs; P[i].ord); double ord; } } T_Point; } main ( ) { T_Point P [10]; int i; for (i = 0; i < 10; i++) { P [i].abs = i; P [i].ord = i; }
Dr. Slim BECHIKH 10 Atelier de programmation II
5) Structures et sous-programmes
1) Ecrire un sous-programme Init_Point qui permet dinitialiser un Point par des valeurs passes comme paramtres.
11
Atelier de programmation II
6) Evaluation
1) Dfinir un type structur permettant de reprsenter un tudiant comportant son nom, son prnom et sa date de naissance.
#include <stdio.h> typedef struct date { int jour; //entre 1 et 31 char mois[20]; //nom du mois "janvier", "fevrier", etc. int annee; //1999, 2000, etc. } date; typedef struct etudiant { char nom [32]; char prenom [32]; date date_naissance; } etudiant;
14
Atelier de programmation II
6) Evaluation (suite)
2) Ecrire une fonction test qui permet de tester si deux tudiants sont identiques ou non.
int test (etudiant a, etudiant b) { int identique =1; if (strcmp (a.nom, b.nom) != 0) {return 0;} if (strcmp (a.prenom, b.prenom) != 0) {return 0;} if (strcmp (a.date_naissance.mois, b. date_naissance.mois) != 0) {return 0;} if (a.date_naissance.jour != b.date_naissance.jour) {return 0;} if (a.date_naissance.annee != b.date_naissance.annee) {return 0;} return identique; }
15
Atelier de programmation II
Sance N2:
Pointeurs et allocation dynamique de la mmoire
16
Atelier de programmation II
Toute variable manipule dans un programme est stocke quelque part en mmoire centrale. Cette mmoire est constitue d'octets qui sont identifis de manire univoque par un numro qu'on appelle adresse. Pour retrouver une variable, il suffit donc de connatre l'adresse de l'octet o elle est stocke (ou, s'il s'agit d'une variable qui recouvre plusieurs octets contigus, l'adresse du premier de ces octets). Pour des raisons videntes de lisibilit, on dsigne souvent les variables par des identificateurs, et non pas par leurs adresses. C'est le compilateur qui fait alors le lien entre l'identificateur d'une variable et son adresse en mmoire. Toutefois, il est parfois trs pratique de manipuler directement une variable par son adresse. [INRIA 2013]
17
Atelier de programmation II
Variable i p
Valeur 3 480600
480600
480604
3
480600
18
Atelier de programmation II
Affichage en format hexadcimal. Nous pouvons afficher en mode dcimal car les adresses sont des entiers.
Dr. Slim BECHIKH 19 Atelier de programmation II
Conclusion 1: p == &i
Rcapitulation: 1) *p se lit contenu de la variable pointe par le pointeur p , 2) &i se lit adresse de la variable i .
Dr. Slim BECHIKH 20 Atelier de programmation II
malloc (nombre-octets)
23
Atelier de programmation II
La fonction malloc retourne un pointeur de type char * pointant vers un objet de taille nombre_octets octets. Pour initialiser des pointeurs vers des objets qui ne sont pas de type char, il faut convertir le type de la sortie de la fonction malloc l'aide d'un cast. L'argument nombre-octets est souvent donn l'aide de la fonction sizeof//Exemple ( ) qui renvoie le nombre d'octets utiliss pour stocker un objet. Ainsi, pour initialiser un pointeur vers un entier, on crit : #include <stdio.h> #include <stdlib.h> #include <stdlib.h> Main ( ) main() { int *p; { int i = 3; p = (int*) malloc (sizeof (int)); int *p; *p = 25; p = (int*) malloc (sizeof (int)); } *p = i; printf ("*p = %d\n",*p); }
24
Atelier de programmation II
Enfin, lorsque l'on n'a plus besoin de l'espace-mmoire allou dynamiquement (c'est--dire quand on n'utilise plus le pointeur p), il faut librer cette place en mmoire. Ceci se fait l'aide de l'instruction free qui a pour syntaxe:
free (nom-du-pointeur);
25
Atelier de programmation II
5) Pointeurs et tableaux?
L'usage des pointeurs en C est, en grande partie, orient vers la manipulation des tableaux. Tout tableau en C est en fait un pointeur constant. Dans la dclaration int tab[10]; tab est un pointeur constant (non modifiable) dont la valeur est l'adresse du premier lment du tableau. Autrement dit, tab a pour valeur &tab[0]. On peut donc utiliser un pointeur initialis tab pour parcourir les lments du tableau. On accde l'lment d'indice i du tableau tab grce l'oprateur d'indexation [ ], par l'expression tab[i]. Cet oprateur d'indexation peut en fait s'appliquer tout objet p de type pointeur. Il est li l'oprateur d'indirection * par la formule: tab[i] = *(p + i)
26
Atelier de programmation II
27
Atelier de programmation II
Puisquune chaine de caractres est un tableau de caractres, elle peut tre manipule en utilisant la notion de pointeur.
28
Atelier de programmation II
Sance N3:
Listes simplement chanes (Partie 1)
29
Atelier de programmation II
Prvoir une structure de donnes qui vite ce type dinconvnients: liste chane !
Dr. Slim BECHIKH 30 Atelier de programmation II
Donne
Donne
Donne
NULL
31
Atelier de programmation II
Tte
2ffx00
259
2ffx04
321
2ffx08
98
NULL
2ffx00
2ffx04
2ffx08 NULL
1) Une liste chane est accessible par sa tte. La tte est un pointeur qui contient ladresse du premier nud de la liste. 2) Le dernier nud de la liste pointe sur NULL.
Dr. Slim BECHIKH 32 Atelier de programmation II
val
suiv
#include <stdio.h> #include <stdlib.h> /*La structure Noeud contient une partie information (exemple: entier) et une partie pointeur vers le noeud suivant*/ typedef struct Noeud { int val; // Donne struct Noeud * suiv; // Pointeur vers le nud suivant } Noeud;
34
Atelier de programmation II
Tte NULL
35
Atelier de programmation II
Nouveau
info
tete Nouveau
suiv
info
tete Nouveau
NULL
tete
info suiv
info suiv
36
Atelier de programmation II
Question: Comment schmatiser les diffrents cas en se basant sur le code C du sous-programme inserer_fin ?
38
Atelier de programmation II
39
Atelier de programmation II
40
Atelier de programmation II
(*nouveau).val = info; // Raliser l'insertion (*precedent).suiv = nouveau; (*nouveau).suiv = courant; } // end du 2me if } // end du 1er if } // end du sous-programme
41 Atelier de programmation II
Question: Comment schmatiser les diffrents cas en se basant sur le code C du sous-programme inserer_position ?
42
Atelier de programmation II
43
Atelier de programmation II
Sance N4:
Listes simplement chanes (Partie 2)
45
Atelier de programmation II