Blog ENI : Toute la veille numérique !
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
💥 Du 22 au 24 novembre : Accès 100% GRATUIT
à la Bibliothèque Numérique ENI. Je m'inscris !
  1. Livres et vidéos
  2. Développement informatique
  3. Les structures de données : struct, typedef struct
Extrait - Développement informatique Apprenez à concevoir avant de programmer
Extraits du livre
Développement informatique Apprenez à concevoir avant de programmer
3 avis
Revenir à la page d'achat du livre

Les structures de données : struct, typedef struct

Objectifs du chapitre

Il s’agit dans ce chapitre de créer de nouveaux types de données et de les utiliser dans des fonctions.

Présentation

Dans les exemples des chapitres précédents, nous avons utilisé les types de base (int, float…) et des tableaux de ces types de base.

Il peut être intéressant de créer de nouveaux types de données adaptés aux problèmes applicatifs à résoudre.

Si pour chaque stagiaire d’une formation, on souhaite enregistrer son numéro identifiant et son nom, il est pratique de créer un type de données STAGIAIRE qui regroupe ces deux informations. C’est ce que montre l’exemple suivant.

Structure de données

1. Mot-clé struct

La déclaration suivante crée un nouveau type de données appelé STAGIAIRE. Il n’y a aucune allocation de mémoire.

numero et nom sont les champs de la structure.


struct STAGIAIRE 
{ 
    int numero;                     /* Numero du stagiaire                   */ 
    char nom[51];                   /* Nom du stagiaire                      */ 
};
 


int main() 
{
 

L’instruction suivante alloue une zone mémoire de type STAGIAIRE. Il y a réservation d’un entier et de 51 char :


    struct STAGIAIRE s;
 
images/01063a.png

Avec le compilateur de C++, il n’est pas nécessaire de répéter le mot "struct". La déclaration STAGIAIRE s suffit, mais ce n’est pas standard.

Les instructions suivantes initialisent les deux champs de la variable s.

Elles utilisent l’opérateur . (point) qui permet de désigner un champ de la structure :

  • s.numero est une variable int comme une autre. Elle est ici initialisée à 10.

  • s.nom est un tableau de char comme un autre. Il est rempli avec la chaîne "Pie".


    s.numero = 10; 
    strcpy(s.nom...

Pointeurs sur des structures, opérateur ->

La déclaration suivante réserve un espace mémoire (un entier) destiné à contenir l’adresse d’une variable de type STAGIAIRE :


int main() 
{ 
    STAGIAIRE* pStagiaire;
 
images/01064a.png

L’instruction suivante permet l’allocation dynamique d’une variable de type STAGIAIRE. L’adresse de cette zone est mise dans le pointeur pStagiaire :


    pStagiaire = (STAGIAIRE*) calloc(1, sizeof(STAGIAIRE));
 
images/01064b.png

Les instructions suivantes remplissent les champs numero et nom pointés par pStagiaire :


    pStagiaire->numero = 10; 
    strcpy(pStagiaire->nom, "Pie");
 
  • pStagiaire est un pointeur sur une variable de type STAGIAIRE.

  • *pStagiaire est la variable pointée.

  • (*pStagiaire).numero est la variable numero de la variable STAGIAIRE pointée.

L’instruction pStagiaire->numero = 10; pourrait s’écrire : (*pStagiaire).numero = 10;


    printf("Stagiaire : %3d  %s\n\n", pStagiaire->numero, pStagiaire->nom); 
 
    return 0; 
}
 

Voici le résultat de l’exécution de ce programme :

images/01064c.png

Pour accéder à une variable correspondant à un champ d’une structure (exemple avec STAGIAIRE) :

Employer la syntaxe : s.numero si s est une variable de type STAGIAIRE.

Employer la syntaxe :...

Structures contenant des structures

Une fois définie, une structure peut être employée comme n’importe quel type, par exemple dans une autre structure :


typedef struct 
{ 
    char rue[51]; 
    char code_postal[6]; 
    char ville[51]; 
} ADRESSE; 
 
typedef struct 
{ 
    int numero; 
    char nom[51]; 
    ADRESSE adresse; 
} EMPLOYE; 
 
int main() 
{ 
    EMPLOYE employe;  
 
    employe.numero = 10; 
    strcpy(employe.nom, "Oie bernache"); 
    strcpy(employe.adresse.rue, "1, rue des étangs"); 
    strcpy(employe.adresse.code_postal, "80230"); 
    strcpy(employe.adresse.ville, "SAINT VALERY"); 
 
    printf("Employe : %3d  %s\n\n%s\n%s\n%s\n", employe.numero, 
           employe.nom, 
           employe.adresse.rue, 
           employe.adresse.code_postal, 
           employe.adresse.ville); 
 
    return 0; 
}
 

Voici le résultat de l’exécution de ce programme :

images/01065a.png

Travail pratique : structures de données

1. Objectif

Utiliser des structures de données dans la conception de fonctions.

2. Sujet

Il s’agit de reprendre le TP foncFractions (chapitre Les fonctions) en utilisant une structure de données FRACTION :

typedef struct 
{ 
    int Num; 
    int Den; } FRACTION; 

3. Structures de données : proposition de correction


typedef struct 
{ 
    int Num; 
    int Den; 
} FRACTION;
 
  • La fonction saisie() doit remplir une variable de type FRACTION, donc la modifier. Il faut lui passer l’adresse de la fraction à remplir.

  • La fonction affiche() affiche la fraction sans la modifier. On peut lui passer directement la fraction à afficher.

  • La fonction somme() prend en paramètres les deux fractions à additionner et utilise une valeur de retour de type FRACTION pour retourner le résultat.

  • La fonction pgcd() ne change pas. Elle n’a pas un lien direct avec FRACTION. Elle calcule le pgcd de deux entiers, qu’ils soient dans une fraction ou pas.

Les prototypes des fonctions sont :


void saisie(FRACTION*); 
void affiche(FRACTION); 
FRACTION somme(FRACTION, FRACTION); 
int pgcd(int, int);
 


int main() 
{ 
    FRACTION f1, f2, f3; 
 
    f2.Num = 5; 
    f2.Den = 2; 
 
    printf("Saisie...