Structure et tableau dans une structure
Considérons les déclarations :
#define MAX 20
typedef struct date {int jour, mois, annee;} T_date;
typedef struct etudiant {
char nom[MAX], prenom[MAX];
float moyenne;
T_date date_naissance;
//date_naissance est un champ qui est une variable structurée
} T_etu;
Nous avons ajouté des définitions de type ainsi qu'un champ de type "T_date" dans le constructeur de structure "etudiant" auquel nous avons donné comme nom de type "T_etu".
Si l'on déclare :
T_etu vous;
La variable "vous" contiendra les champs "nom", "prenom", "moyenne" et "date_naissance". Ce dernier étant un champ qui est une variable structurée.
La fonction de saisie deviendra alors :
void saisie_etudiant( T_etudiant * un_pt_sur_etu)
{
printf("\n nom : ");
scanf("%s", un_pt_sur_etu->nom);
printf("\n prenom : ");
scanf("%s",un_pt_sur_etu->prenom);
printf("\n moyenne : ");
scanf("%f",&(un_pt_sur_etu->moyenne));
printf("\n jour de naissance : "); scanf("%d",&(un_pt_sur_etu->date_naissance.jour));
printf("\n mois de naissance : "); scanf("%d",&(un_pt_sur_etu->date_naissance.mois));
printf("\n annee de naissance : "); scanf("%d",&(un_pt_sur_etu->date_naissance.annee));
}
En effet, « un_pt_sur_etu -> date_naissance.jour» correspond à la variable « jour » qui est un champ, le « & » devant permet d'avoir son adresse, ce qui est nécessaire à la fonction « scanf ».
void affiche_etudiant( T_etudiant un_etu)
{
printf("\n nom : %s ", un_etu.nom);
printf("\n prenom : %s ",un_etu.prenom);
printf("\n moyenne : %f ",un_etu.moyenne);
printf("\n jour de naissance : %d ",un_etu.date_naissance.jour);
printf("\n mois de naissance : %d ",un_etu.date_naissance.mois);
printf("\n annee de naissance : %d ",un_etu.date_naissance.annee);
}
En effet, le champ "date_naissance" est vu comme une variable structurée. Nous pouvons donc utiliser comme nature de champ une autre structure.
Nous allons maintenant déclarer une structure comprenant un tableau de flottants :
#define MAX 500
typedef struct tableau_en_partie_rempli
{
int nombre_cases_utilisees; float t[MAX];
} T_tableau_en_partie_rempli;
Et la déclaration de variable :
T_tableau_en_partie_rempli notes, *pt_sur_paquet_note;
Nous pouvons décider de remplir des notes, avec les instructions :
notes.t[0] = 15.7;
scanf'("%f",&(notes.t[1]));
notes.t[2] = (notes.t[0] + notes.t[1])/2;
notes.nombre_cases_utilisees = 3;
pt_sur_paquet_note = ¬es;
pt_sur_paquet_note -> t[3] = 10.2;
scanf'("%f",&(pt_sur_paquet_note->t[4]));
pt_sur_paquet_note->t[5] = (pt_sur_paquet_note->t[3] + pt_sur_paquet_note->t[4])/2;
pt_sur_paquet_note->nombre_cases_utilisees = 6;
ainsi nous aurons 6 notes dans le tableau qui correspond au champ 't' de la variable 'notes', et le champ 'nombre_cases_utilisees' vaut 6.
Un champ qui est un tableau s'utilise comme un tableau, il suffit de faire attention à la façon dont on accède à ce champ (par un identificateur de variable structurée ou par un identificateur de pointeur vers variable structurée).