11. Záznam - record

11.1 Tvar typu záznam

Záznam sdružuje více položek, které mohou být různého typu.

Syntaxe

record

     <seznam_identifikátorů1> : <typ1>;

      .....

     <seznam_identifikátorůN> : <typN>;

end

 

Všimni si: end tu opět figuruje v páru s něčím jiným než s begin!


record
   položka;
   položka;
...
   položka
end;

NEBO

record
    položka;
...
    case rozlišovací položka: type of
         varianta: ( položka );
          ...
         varianta: ( položka )
end;

Popis

Každá položka je seznam identifikátorů oddělených čárkou, následovaný dvojtečkou a typem.


11.2 Příklad

Deklarace proměnných v programu evidence žáků:

const MaxZaku = 30;

type Datum = record

           Den : 1..31;

           Mesic : 1..12;

           Rok : Integer;

        end;

       Predmet = ( prMat, prCJ, prAJ, prZem );

       Zak = record

           Jmeno : string [40];

            Narozen : Datum;

            Vysvedceni : array [Predmet] of 0..5;

            Omluveno, Neomluveno : Integer;

        end;

var Trida : array [1..MaxZaku] of Zak;


(* definice typu záznam *)
type
       Trida = (Cis, Dat, Retez);
          Datum = record
          D, M, Y: Integer;
end;

Fakta = record
      Jmeno: string[10];
      case Typ: Trida of
           Cis: (N: real);
           Dat: (D: Date);
           Retez: (S: string);
      end;


11.3 Příkaz with

Příkaz with je prostředek, který zkracuje zápis pro přístup k položkám typu record.

11.3.1 Syntaxe

with proměnná, ..., proměnná do příkaz

11.3.2 Popis

Uvnitř příkazu za slovem do mohou být položky jedné nebo více specifikovaných proměnných typu záznam zpřístupněny pouze pomocí jejich identifikátorů.

11.3.3 Příklad

Je-li třeba žákovi číslo 25 nastavit datum narození na 16. 12. 1963 lze to udělat elegantně takto:

with Trida [25].Narozen do

   begin

      Den := 16;

      Mesic := 12;

      Rok := 1963;

   end;

 

bez příkazu with by musel programátor psát nudné:

Trida [25].Narozen.Den := 16;

Trida [25].Narozen.Mesic := 12;

Trida [25].Narozen.Rok := 1963;

což by bylo kratší a jednodušší a srozumitelnější a proto by to nebylo dobře!

 

Další příklady

{ Příkaz with }
with Datum[I] do
   begin
      mes := 1;
     rok := rok + 1;
   end;

je ekvaivalent k:

Datum[I].mes := 1;
Datum[I].rok := Datum[I].rok + 1;


11.4 Ukázkový program:

zaprosp.pas: Seřazení žáků ve třídě podle průměrného prospěchu

program ProspechTridy;

 

const MaxZaku = 30;

type Zak = record

         Jmeno : string;

         Prumer : Real;

      end;

var Trida : array [1..MaxZaku] of Zak;

      PocetZaku, Prvni, Nejlepsi, I : Integer;

      PomZ : Zak;

begin

      PocetZaku := 0;

      Writeln ( 'Seřazení žáků podle průměru.' );

      Writeln ( 'Prázdné jméno ukončí vstup.' );

        {vstup dat}

      repeat

           PocetZaku := PocetZaku + 1;

           with Trida[PocetZaku] do

                begin

                   Write ( 'Jméno:' );

                   Readln ( Jmeno );

                   if Jmeno <> '' then

                        begin

                             Write ( 'Průměr:' );

                             Readln ( Prumer );

                         end;

                  end;

             if PocetZaku = MaxZaku then

                   Writeln ( 'Naplněna kapacita. Ukončuji vstup.' );

                    until (Trida[PocetZaku].Jmeno = '') or                                                 (PocetZaku = MaxZaku);

                          if Trida[PocetZaku].Jmeno = '' then

                                 PocetZaku := PocetZaku - 1;

                    {uspořádání}

                          for Prvni := 1 to PocetZaku-1 do

                              begin

                                    Nejlepsi := Prvni;

                                     for I := Prvni+1 to PocetZaku do

                                        if Trida[I].Prumer < Trida[Nejlepsi].Prumer then

                                               Nejlepsi := I;

                                               PomZ := Trida[Prvni];

                                               Trida[Prvni]:=Trida[Nejlepsi]; 

                                              Trida[Nejlepsi] := PomZ;

                               end;

                      {výstup}

                         for I := 1 to PocetZaku do

                                   with Trida[I] do

                                           Writeln ( Jmeno, ' (', Prumer:4:2, '), ' );

end.

Uspořádání žáků probíhá pomocí opakovaného výběru nejmenší hodnoty - jde o třídění přímým výběrem - podrobněji viz. kapitola 18


11.5 Poznámky a cvičení:

<-předchozí

další->

 

© 2001 Milan Volejník, http://hledej.to.zde.cz

aktualizace: 17.09.2002 17:25:35

Powered by Notepad editor.
Copyright © 2001 by !!!Protiproud!!! All rights reserved.
Revised: 17 IX 2002 17:49:11 +0200 .