ENREGISTREMENTS


Dans un tableau, tous les constituants doivent etre semblables. Ce n'est pas le cas des enregistrements, qui sont des variables composees de plusieurs variables (ou CHAMPS) de types differents.

DECLARATION

structure d'une declaration d'enregistrement :

VAR nom_variable :RECORD champ1:type ; champ2:type ;.... END

ou

TYPE nom_type = RECORD champ1:type ; champ2:type ;.... END

ex: TYPE date = RECORD
                 jour:1..31;
                 mois:1..12;
                 an:1980..1999
               END;
        facture = RECORD
                    reference:integer;
                    jour:date; {enregistrement d'enregistrement}
                    client:string[100];
                    total_HT:real
                  END;
   VAR date1,date2:date;
       comptes:array[1..100] of facture;
       fact:facture;
Dans un enregistrement, chaque champ doit avoir un nom different. Mais pour des enregistrements differents on peut reutiliser le meme nom de champ (ici JOUR).

UTILISATION DES ENREGISTREMENTS

Comme l'affectation fonctionne toujours pour des variables de meme type, on peut ecrire DATE1:=DATE2.

On accede a une composante par NOM_VARIABLE . NOM_CHAMP :

  writeln('reference de la facture ? ');
  readln(fact.reference);
  writeln('mois de la facture ? ');
  readln(fact.jour.mois);
  writeln('jour de la facture ? ');
  readln(fact.jour.jour);
 
  for i:= 1 to nb_fact do writeln(comptes[i].prix);
Une composante d'enregistrement s'utilise comme une variable du meme type (avec les memes possibilites mais aussi les memes limitations).

LA STRUCTURE WITH - DO (avec - faire)

structure : WITH nom_enregistrement DO instruction

Elle permet d'omettre le nom_enregistrement dans l'instruction.

ex : FOR I:=1 TO nb_fact DO
		WITH comptes[i] DO begin
		reference:=i;      (* c.a.d comptes[i].reference *)
		writeln('nom du client de la facture ndeg.',i,' ? ');
		readln(client);
	END

Dans un WITH on peut evidement acceder a d'autres enregis-trements, il suffit de preciser le nom_enregistrement.champ. Si l'on utilise des WITH imbriques, en cas d'ambiguite des noms de champs on se refere au WITH le plus proche (interieur).
ex : WITH fact DO begin
       WITH date1 DO begin
         mois:=12;      {date1.mois}
         reference:=1;  {fact.reference car date1.reference n'existe pas}
         jour:=15;      {date1.jour car WITH DATE1 le plus a l'interieur}
         fact.jour:=date2   {fact.jour puisqu'on le precise}
       end
     end

ENREGISTREMENTS AVEC VARIANTES

Certains champs d'un enregistrement peuvent etre differents suivant la valeur d'un des champs en utilisant la structure CASE OF dans la declaration de l'enregistrement.

ex:  TYPE statut=(celibataire,marie,divorce,veuf);
          perso=RECORD
                nom:string[20];
                CASE situation:statut OF
                  celibataire:();
                  marie:(enfants:0..10);
                  divorce,veuf:(enfants:0..10;remarie:boolean)
                END;
Il ne peut y avoir qu'un CASE par enregistrement. Celui-ci doit se placer en dernier, apres les champs commun (si il y en a). Mais dans ce CASE on peut avoir UN autre CASE imbrique (etc).

Les cas ou il n'y a pas de champ variant doivent etre precises (ici celibataire). Le champ discriminant (situation) s'utilise comme un autre champ commun.

exemples d'instructions possibles : (x declare comme perso)

        x.situation:=marie;
        if x.situation=veuf then writeln(x.enfants)

EXERCICE (tel) A l'aide d'un tableau de personnes (nom, prenom, numero dans la rue, rue, departement, ville, numero de telephone), faire un programme de recherche automatique de toutes les informations sur les personnes repondant a une valeur d'une rubrique donnee (tous les PATRICK , tous ceux de Saverne, etc...)