les_structures_de_donnees_

Document Sample
les_structures_de_donnees_ Powered By Docstoc
					ISIGK 2009– 1SI
Halioui Ahmed



           Atelier de Programmation 2


                 Les structures de données
Pourquoi les structures?
Pourquoi les structures?
Pourquoi les structures?
Déclaration
              Nom de la structure


       struct book {
            char title[41];
            char author[31];
            float price;
      }
                       Éléments de la
                         structure
                                        5
Exemple
 Un nombre complexe est un nombre de la forme
                         a + b*i
 où a et b sont des nombres réels et le symbole i vaut   1

 On doit d'abord définir un nouveau type dont le nom est
 complexe.
 Ce nouveau type aura l'espace mémoire nécessaire pour
 contenir les 2 nombre réels a et b.

 Après la déclaration: complexe x la mémoire associée
 sera:

                        x.a:                   réel
                        x.b:                   réel
Exemple en C
 struct complexe {
  float reel;
  float imag;
 };

 struct complexe x;




                       x.reel:   double
                      x.imag:    double
Où définir un nouveau type
Si on défini un nouveau type à
l‟intérieur d‟une fonction alors il     #include <stdio.h>
ne sera visible qu‟à l‟intérieur de     struct complexe {
cette fonction.                          double reel;
                                         double imag;
Pour qu‟un type composé soit
                                        };
visible dans toutes les fonctions
d‟un fichier, il faut le déclarer au    
début du fichier, à l‟extérieur de
toute fonction.
                                        fonction(...){
                                        struct complexe x;
Note: La même chose s‟applique à        
la déclaration de variables: c‟est ce
                                        }
que l‟on appelle les variables
globales.
Assignation d'une valeur
dans une structure
 struct complexe {
  float reel;
  float imag;
 };

 struct complexe x;

 x.reel = 5;
 x.imag = 3;

                     x.reel:   5
                 x.imag:       3
Accéder aux membres d’une structure

 struct complexe x, y, z;    x.reel:   5
                            x.imag:    3
 x.reel = 5;                           
 x.imag = 3;
                             y.reel:   5
 y = x;                     y.imag:    3
                                       
 z.reel = x.réel;            z.reel:   5
 z.imag = 8;                z.imag:    8
Comparer deux structures

                                             x.reel:   5
if (x == y)                                 x.imag:    3
   printf(“Deux structures égales”);                   
                                             y.reel:   5
if (x != z)
   printf(“Deux structures différentes”);   y.imag:    3
                                                       
                                             z.reel:   5
                                            z.imag:    8
Les structures et les fonctions
 • On peut passer des structures en paramètre.

 • On peut utiliser les structures comme valeur de retour.
Exemple
struct complexe somme(struct complexe x, struct complexe y){
 struct complexe a;

    a.reel = x.reel + y.reel;
    a.imag = x.imag + y.imag;
    return a;
}
Exercice 1
 Ecrire une fonction cmp_date permettant de comparer deux
 dates. La comparaison porte sur les faits : avant, égal ou
 après. Une date est définie par le jour, le mois et l‟année.

 On utiliseras le type énuméré comme type de variable de
 retour.
Exercice 1
struct date
{
int jour, mois, annee;
}

enum {avant, egal, apres};

int cmp_date (struct date d1, struct date d2)
{
       if (d1.annee>d2.annee) return (AVANT),
       …
}
typedef
 Dans l‟exemple précédent, il est laborieux d‟avoir à écrire
autant de struct complexe.

Le C fournit une fonctionnalité appelée typedef servant à créer
des noms de nouveaux types de donnéees.

Exemple:
      typedef struct complexe Complexe
      Complexe x, y;

Le nom Complexe devient synonyme de struct complexe
Les structures et les pointeurs
  L‟opérateur de prise d‟adresse & fonctionne avec les
 structures.

 On peut définir des pointeurs sur des types composés.

 struct complexe *pc, x;
 pc = &x;
 (*pc).reel = 3;
 (*pc).imag = 5;

 Remarque: Les parenthèse sont nécessaires puisque
 l‟opérateur . a une priorité supérieure à l‟opérateur *.
Les structures et les pointeurs
 Les pointeurs de structures sont si fréquemment utilisés
 qu‟il existe une notation abrégée.

 Exemple:
      struct complexe *p, x;
      pc = &x;

        pc->reel = 3; /* identique à (*pc).reel=3 */
        pc->imag = 5; /* identique à (*pc).imag=5 */
Transmission de l’adresse d’une structure
 Cherchons à modifier l‟exemple précédent pour que la fonction
  struct complexe somme(complexe x, complexe y) permet autant
 d‟incrémenter le contenue x et y juste avant la somme. Que sera
 la forme de la fonction?



       struct complexe somme(complexe*x, complexe* y)
Les structures contenant des structures

 Les membres d‟un type composé peuvent être eux mêmes des
 variables de types composé différents.

 En C, cela se traduit par le fait qu‟une structure peut être
 membre d‟une autre structure.
Exemple
  struct point{
   int x;
   int y;
 };

 struct point p1={2, 1}, p2={8, 5};

                      y
                                      p2
                  5
                  4
                  3
                  2
                  1
                          p1
                  0                         x
                      0 1 2 3 4 5 6 7 8 9
Exemple
 struct rect{
  struct point q1;
  struct point q2;
};
                         y
struct rect r ;                         p2
                     5
r.q1.x = p1.x;       4
r.q1.y = p1.y;       3
r.q2.x = p2.x;       2
r.q2.y = p2.y;       1
                             p1
                     0                         x
ou encore:               0 1 2 3 4 5 6 7 8 9

r.q1=p1;
r.q2=p2;
Remarque
Le type des membres ne peut pas être la structure elle-même.

Ainsi l‟exemple suivant est invalide.
        struct objet{
          int n;
          struct objet x;
        }

Mais l‟exemple suivant est valide et même très courant
       struct objet{
         int n;
         struct *objet x;
       }
Les tableaux de structures
   On peut faire des tableaux de types composés tout
  comme on peut faire des tableaux de type de base.

  Exemple:
        struct complexe tab[1000];

         for (i=0; i<1000; i=i+1){
           tab[i].reel = 0;
           tab[i].imag = 0;
         }

               tab[0].reel   tab[1].reel   ...   tab[999].reel
        tab:
               tab[0].imag   tab[1].imag   ...   tab[999].imag
A éviter
    tab[2].imag -- OK!
    tab.imag [2] -- Erreur
    tab[2].imag[4] -- 5ième
    image du 3ième type
    composé.
Exercice 2
Ecrire un programme en C permettant de lire et d‟afficher un
tableau de structure ligne_commande. Chaque commande est
définie par son nom, l‟article et la qté achetée ainsi que le prix
unitaire .
La taille d’une structure
  Le nombre d‟octets alloués pour chaque variable d‟un
 type composé n‟est pas toujour la somme de la taille de ses
 membres.

 Exemple:
       struct exemple{
        char c1, c2, c3;
        int n;
       } x;

 Sur Visual Studio il y a toujours un nombre pair d‟octets
 réservés pour chaque variable (sauf si un seul octet est
 nécessaire).
 Donc, 8 octets seront alloués pour x, c‟est-à-dire qu‟un
 octet sera perdu.
La taille d’une structure
 Le C dispose d‟un opérateur permettant de déterminer le
 nombre d‟octets nécessaires pour mémoriser un objet du type
 de son opérande.

 sizeof expression    (L‟expresion n‟est pas évalué)
 sizeof (nom de type)

 exemple:
       sizeof „a‟ vaut 1
       sizeof (*p) vaut ?
       sizeof (char) vaut 1
       sizeof (121+434)/2 vaut ?
       sizeof (int) vaut ?
       sizeof (struct complexe) vaut 8
Exercice 3
Reprenons l‟exercice 2.

1 – Afficher la somme des quantités vendues.

2 – Calculer le revenu R des 20 premiers articles vendus.
       R20 = qté*prix unitaire.

3 – Ajouter un élement Prix_vente dans la structure
ligne_commande et créer une fonction permettant d‟alimenter
ce champs.
       Prix de vente = Revenue depuis un seul article

				
DOCUMENT INFO
Shared By:
Tags:
Stats:
views:1
posted:10/9/2012
language:French
pages:29