Les enregistrements (struct) suite. Struct Rappel Enregistrement : Suite de données pouvant être...

21
Les enregistrements (struct) suite

Transcript of Les enregistrements (struct) suite. Struct Rappel Enregistrement : Suite de données pouvant être...

Page 1: Les enregistrements (struct) suite. Struct Rappel Enregistrement : Suite de données pouvant être de types différents, accessibles via une seule variable.

Les enregistrements (struct)

suite

Page 2: Les enregistrements (struct) suite. Struct Rappel Enregistrement : Suite de données pouvant être de types différents, accessibles via une seule variable.

Struct

•Rappel

•Enregistrement : Suite de données pouvant être de types différents, accessibles via une seule variable et le nom des champs.

Page 3: Les enregistrements (struct) suite. Struct Rappel Enregistrement : Suite de données pouvant être de types différents, accessibles via une seule variable.

Struct

•Enregistrement

Champs

Page 4: Les enregistrements (struct) suite. Struct Rappel Enregistrement : Suite de données pouvant être de types différents, accessibles via une seule variable.

Struct

•Définition :

typedef struct { type champ1; type champ2; type champ3; ... type champn;}id_enregistrement;

Page 5: Les enregistrements (struct) suite. Struct Rappel Enregistrement : Suite de données pouvant être de types différents, accessibles via une seule variable.

Struct

•Exemple 1 :

typedef struct { double x; double y; double z;}t_point3D;

•Exemple 2 :

typedef struct { double direction; double longueur;}t_vecteur;

Page 6: Les enregistrements (struct) suite. Struct Rappel Enregistrement : Suite de données pouvant être de types différents, accessibles via une seule variable.

Struct

•On peut maintenant avoir des variables de ce type.

– t_point3D p1;– t_vecteur v1;– t_point3D tab_point[10]; //un tableau de points– ...

•On accède à un champ par le nom de la variable suivi d’un point suivi du nom du champ

– Ex: p1.x, v1.direction, tab_point[1].x

Page 7: Les enregistrements (struct) suite. Struct Rappel Enregistrement : Suite de données pouvant être de types différents, accessibles via une seule variable.

• Un struct est passé en paramètre par copie (oui, il copie tous les champs).

• Pour modifier un struct dans un sous-programme, il faut aussi un pointeur (passage par référence).

• On peut passer une adresse et empêcher la modification avec const.

• La syntaxe pour accéder à un champs d’une référence sur un struct, il faut parenthéser .

– ex: (*point).x est différent de *point.x

• On peut utiliser une autre syntaxe équivalent pour les pointeurs sur un struct (préférable).

– Ex: point->x

Passage de paramètres d’un struct

Page 8: Les enregistrements (struct) suite. Struct Rappel Enregistrement : Suite de données pouvant être de types différents, accessibles via une seule variable.

Les enregistrements imbriqués

Page 9: Les enregistrements (struct) suite. Struct Rappel Enregistrement : Suite de données pouvant être de types différents, accessibles via une seule variable.

Nous voulons pouvoir conserver des informations sur les différentes machines dans les laboratoires d’informatique de l’ÉTS. Le technicien en charge des laboratoires vous dit les choses suivantes :

Un laboratoire contient une ou plusieurs station(s). Chaque laboratoire a un numéro de local (ex. : 1222, 1226, etc.).  Une station, c’est un ordinateur et un écran. Évidemment, chacune des stations possède un numéro qui permet de l’identifier. Pour chaque ordinateur, nous voulons la puissance du CPU (en MHz), la quantité de mémoire vive (en Mo), la capacité du disque (en Go) et la marque (ex. : "Compaq", "Hp", etc.). Il faut aussi pouvoir conserver tous les logiciels installés sur la machine. Pour chaque écran il faut : la marque (ex. : "Samsung", "Sony", etc.), la taille (en pouces) et la résolution (comme .25 ou .27). Pour chaque logiciel, il faut : le nom du logiciel (ex. : "Word", "Excel", etc.), la compagnie distributrice (ex. : "Microsoft", "Borland", etc.) et la version (ex. : 1.5, 2.08, etc.). Les chaînes de caractères sont au maximum de 40 caractères. Il y a au maximum 100 logiciels par ordinateur, 25 stations par laboratoire et 10 laboratoires.

Définissez les structures nécessaires pour éventuellement conserver lesinformations.

Page 10: Les enregistrements (struct) suite. Struct Rappel Enregistrement : Suite de données pouvant être de types différents, accessibles via une seule variable.

On définit les constantes et les enregistrements qui ont des champs de type élémentaire comme l’écran.

#include <stdio.h>#include <stdlib.h>

#define MAX_CAR 41 //40 caractères + ‘\0’#define MAX_LOGICIEL 100#define MAX_STATION 25#define MAX_LABO 10

typedef char t_chaine[MAX_CAR];

//un écran

typedef struct{ double resolution; double taille; t_chaine marque;}t_ecran;

Page 11: Les enregistrements (struct) suite. Struct Rappel Enregistrement : Suite de données pouvant être de types différents, accessibles via une seule variable.

On peut définir le type qui représente les logiciels

//un logiciel

typedef struct{

t_chaine nom; t_chaine cie; double version;

}t_logiciel;

Page 12: Les enregistrements (struct) suite. Struct Rappel Enregistrement : Suite de données pouvant être de types différents, accessibles via une seule variable.

On peut maintenant définir le type qui représente les ordinateurs

//un tableau de logiciels typedef t_logiciel t_tab_logiciel[MAX_LOGICIEL];

//un ordinateur typedef struct {

t_chaine marque; double puissance; double espace_disque; double memoire;

//un tableau statique vient en paquet de deux t_tab_logiciel tab_logiciel;

int nb_logiciel;

}t_ordinateur;

Page 13: Les enregistrements (struct) suite. Struct Rappel Enregistrement : Suite de données pouvant être de types différents, accessibles via une seule variable.

On peut maintenant définir le type qui représente les stations

//une station typedef struct {

char numero; t_ordinateur ordi; t_ecran ecran;

}t_station;

Page 14: Les enregistrements (struct) suite. Struct Rappel Enregistrement : Suite de données pouvant être de types différents, accessibles via une seule variable.

On peut maintenant définir le type qui représente les laboratoires

//un tableau de station typedef t_station t_tab_station[MAX_STATION];

//un labo

typedef struct {

char numero;

//un tableau statique vient en paquet de deux t_tab_station tab_station;

int nb_station;

}t_labo;

Page 15: Les enregistrements (struct) suite. Struct Rappel Enregistrement : Suite de données pouvant être de types différents, accessibles via une seule variable.

On peut maintenant définir le type pour le tableau de labo et la définition de la variable-tableau.

//la définition du tableau contenant les laboratoirestypedef t_labo t_tab_labo[MAX_LABO];

int main (void){

//pas de variable, pas d'espace réservét_tab_labo tab_labo = {0};

int nb_labo = 0;

…}

Page 16: Les enregistrements (struct) suite. Struct Rappel Enregistrement : Suite de données pouvant être de types différents, accessibles via une seule variable.

Dites si les énoncés suivants sont valides ou invalides

tab_labo1.tab_station1.ordi.marque = « Nec »;

Invalide : On aurait du voir :

tab_labo[1].tab_station[1].ordi.marque = « Nec »;

Page 17: Les enregistrements (struct) suite. Struct Rappel Enregistrement : Suite de données pouvant être de types différents, accessibles via une seule variable.

Dites si les énoncés suivants sont valides ou invalides

tab_labo[0].tab_station[0].ordi.tab_logiciel[0].nom = « TC»;

valide

Page 18: Les enregistrements (struct) suite. Struct Rappel Enregistrement : Suite de données pouvant être de types différents, accessibles via une seule variable.

Dites si les énoncés suivants sont valides ou invalides

t_ecran ecran = {1024*768,17,"Nec"}; t_ordinateur ordi = {"Vtech",4,1.4,200,{0}};

t_station station;station.numero = 1;station.ecran = ecran;station.ordi = ordi;

tab_labo[0].tab_station[0] = station;

valide

Page 19: Les enregistrements (struct) suite. Struct Rappel Enregistrement : Suite de données pouvant être de types différents, accessibles via une seule variable.

Exemples de fonction

int ecran_pareil(const t_ecran* ec1, const t_ecran* ec2){

return ec1->resolution == ec2->resolution &&

ec1->taille == ec2->taille &&

strcmp(ec1->marque,ec2->marque) == 0;

}

int logiciel_pareil(const t_logiciel* log1, const t_logiciel* log2){

return strcmp(log1->nom, log2->nom) == 0 &&

strcmp(log1->cie, log2->cie) == 0 &&

log1->version == log2->version;

}

Page 20: Les enregistrements (struct) suite. Struct Rappel Enregistrement : Suite de données pouvant être de types différents, accessibles via une seule variable.

Exemples de fonction

int ordi_pareil(const t_ordinateur* ord1, const t_ordinateur* ord2){

int i; int log_tous_pareil = FALSE;

if(ord1->nb_logiciel == ord2->nb_logiciel)

//le même ordi s'il a les mêmes logiciels dans le même ordre for(i = 0; i < ord1->nb_logiciel && log_tous_pareil;i++) log_tous_pareil = logiciel_pareil(&ord1->tab_logiciel[i], &ord2->tab_logiciel[i]);

return strcmp(ord1->marque, ord2->marque) == 0 && ord1->puissance == ord2->puissance && ord1->espace_disque == ord2->espace_disque && ord1->memoire == ord2->memoire && log_tous_pareil; }

Page 21: Les enregistrements (struct) suite. Struct Rappel Enregistrement : Suite de données pouvant être de types différents, accessibles via une seule variable.

Exemples de fonction

int station_pareil(const t_station* st2, const t_station* st2){

return ecran_pareil(&st1->ecran, &st2->ecran) &&

ordi_pareil(&st1->ordi, &st2->ordi) &&

st1->numero == st2->numero;

}