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.
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;
Příkaz with je prostředek, který zkracuje zápis pro přístup k položkám typu record.
with proměnná, ..., proměnná do příkaz
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ů.
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;
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
© 2001 Milan Volejník, http://hledej.to.zde.cz
aktualizace: 17.09.2002 17:25:35