210 likes | 339 Views
Les enregistrements (struct) suite. Struct. Rappel Enregistrement : Suite de données pouvant être de types différents, accessibles via une seule variable et le nom des champs. Struct. Enregistrement Champs. Struct. Définition : typedef struct { type champ1;
E N D
Struct • Rappel • Enregistrement : Suite de données pouvant être de types différents, accessibles via une seule variable et le nom des champs.
Struct • Enregistrement Champs
Struct • Définition : typedef struct { type champ1; type champ2; type champ3; ... type champn; }id_enregistrement;
Struct • Exemple 1 : typedef struct { double x; double y; double z; }t_point3D; • Exemple 2 : typedef struct { double direction; double longueur; }t_vecteur;
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
Passage de paramètres d’un struct • 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
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 les informations.
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;
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;
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;
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;
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;
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; …}
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 »;
Dites si les énoncés suivants sont valides ou invalides tab_labo[0].tab_station[0].ordi.tab_logiciel[0].nom = « TC»; valide
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
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; }
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; }
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; }