1 / 21

Les enregistrements (struct) suite

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;

vaughn
Download Presentation

Les enregistrements (struct) suite

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Les enregistrements (struct) suite

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

  3. Struct • Enregistrement Champs

  4. Struct • Définition : typedef struct { type champ1; type champ2; type champ3; ... type champn; }id_enregistrement;

  5. Struct • Exemple 1 : typedef struct { double x; double y; double z; }t_point3D; • Exemple 2 : typedef struct { double direction; double longueur; }t_vecteur;

  6. 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

  7. 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

  8. Les enregistrements imbriqués

  9. 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.

  10. 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;

  11. 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;

  12. 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;

  13. 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;

  14. 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;

  15. 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; …}

  16. 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 »;

  17. Dites si les énoncés suivants sont valides ou invalides tab_labo[0].tab_station[0].ordi.tab_logiciel[0].nom = « TC»; valide

  18. 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

  19. 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; }

  20. 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; }

  21. 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; }

More Related