Upload
moeshe
View
41
Download
2
Embed Size (px)
DESCRIPTION
Programování v Pascalu Přednáška 8. RNDr. Hana Havelková. Typ záznam. Deklarace Přístup k položkám záznamu, příkaz with Záznam obsahující záznamy Záznam obsahující pole Pole záznamů Variantní typy Typové konstanty Vybrané systémové záznamy Záznamy jako parametry procedur a funkcí. - PowerPoint PPT Presentation
Citation preview
Programování v Pascalu Přednáška 8
RNDr. Hana Havelková
Typ záznam
Deklarace Přístup k položkám záznamu, příkaz with Záznam obsahující záznamy Záznam obsahující pole Pole záznamů Variantní typy Typové konstanty Vybrané systémové záznamy Záznamy jako parametry procedur a funkcí
Deklarace záznamu
record
seznam položek
end
seznam položek
pevná část
proměnná část; ;
Pevná část záznamu
pevná část
seznam identifikátorů
;
: typ
Proměnná část záznamu
proměnná část
case
identifikátor
typ of varianta
varianta
,
konstanta seznam položek( ):
Příklady
typeTDatum = record
den : 1..31;mesic : 1..12;rok : word;
end;
TAdresa = recordulice : string [20];cislo : string [10];mesto: string [25];psc : string [5];
end;
Příklady
typeTCas = record
hod : 0..24;min : 0..60;sec : 0..60;
end;
TZak = recordtrida : string [4];cislo : byte;jmeno : string [15];prijmeni : string [20];
end;
Přístup k jednotlivým položkám
pomocí tečky
identifikátor proměnné . identifikátor proměnné
vardatum : TDatum ;
beginWrite('Zadej den: '); ReadLn (datum.den);Write('Zadej mesic: '); ReadLn (datum.mesic);Write('Zadej rok: '); ReadLn (datum.rok);……
end.
Přístup k položkám záznamu (.)
varpracovnik : record
jmeno, prijmeni : string[15];datnar : TDatum;adresa : TAdresa; end;
beginWrite('Zadej jmeno'); ReadLn(pracovnik.jmeno);Write('Zadej prijmeni'); ReadLn(pracovnik.prijmeni);Write('Zadávej postupně datum narozeni (den, mesic, rok)'); ReadLn(pracovnik.datnar.den, pracovnik.datnar.mesic, pracovnik.datnar.rok);WriteLn('Zadej adresu');Write('Ulice: '); ReadLn(pracovnik.adresa.ulice);Write('Číslo: '); ReadLn(pracovnik.adresa.cislo);Write('Město: '); ReadLn(pracovnik.adresa.mesto);Write('PSČ: '); ReadLn(pracovnik.adresa.psc);…
end.
Přístup pomocí příkazu with
with proměnná záznamového typu do
,
vardatum : TDatum;
beginWriteLn('Zadání data');with datum do begin
Write('Zadej den: '); ReadLn (den);Write('Zadej mesic: '); ReadLn (mesic);Write('Zadej rok: '); ReadLn (rok);
end;…end.
Přístup pomocí with
vartermin : record
datum : TDatum;cas : TCas;
end;begin
WriteLn('Stanovený termín:');with termin do begin
with datum do beginWrite('den, mesic, rok: ');ReadLn (den, mesic, rok);
end;with cas do begin
Write('hod, minuta, sekunda: ');ReadLn (hod, min, sec);
end;end;
……
end.
Záznam obsahující pole
typeTZnamka = 0..5;TZnamky = array [1..15] of TZnamka; TZak = record
cislo : byte;jmeno : string[30];znamky: TZnamky;
end;var
Zak : TZak;pocet, i : 1..15;
begin{pristup pomoci tecky}Write('Počet predmetu (znamek) – max 15'); ReadLn(pocet);Write('Cislo zaka: '); ReadLn(Zak.cislo);Write('Prijmeni a jmeno zaka: '); ReadLn(Zak.jmeno);for i := 1 to pocet do begin
Write(i, '. znamka: '); ReadLn(Zak.znamky[i]);end;…
end.
Pole záznamů
typeTZbozi = record
nazev : string [40];jednotka : string [2];cena_j : real;
end;var
Zbozi : array [1..200] of TZbozi;pocet : byte;
begin{pristup pomoci with}Write('Počet položek (zboží) – max 200'); ReadLn(pocet);for i := 1 to pocet do
with Zbozi[i] do beginWrite('Nazev: '); ReadLn(nazev);Write('Jednotka: '); ReadLn(jednotka);Write('Jednotkova cena: '); ReadLn(cena_j);
end;…
end.
Pole záznamů obsahujících pole
typeTBody = array [1..10] of real;TZavodnik = record
start_cislo : byte;jmeno : string [30];stat : string [3];umelecky_dojem : TBody;technicka_hodnota : TBody;
end;var
Zavodnici : array [1..100] of TZavodnik;
jméno 3. závodníka Zavodnici[3].jmenobody 5. závodníkaza umělecký dojem Zavodnici[5].umelecky_dojem[1]
Zavodnici[5].umelecky_dojem[2]Zavodnici[5].umelecky_dojem[3]…
Variantní záznam
type TDoprava = (Mistni, Dojizdejici, Internatni);
Zak = record trida : string [3];
Jmeno : string [30]; case Doprava : TDoprava of Mistni : (delka : real); Dojizdejici : (druh : char; delka : real); Internatni : (pokoj: byte; cena : real);
end;
Variantní záznam
typeTOsoba = record
Jmeno : string [30];Vek : byte;Vyska : byte;Vlasy : string [30];
case Pohlavi : char of 'M' : (plnovous, knir :
boolean); 'Z' : (prsa, pas, boky : byte); end;
Typové konstanty
typeTZavod = record
misto : string [50];datum : TDatum;start : TCas;
end;const ADRESA : TAdresa = (ulice:'Jeronymova'; cislo:'10';
mesto:'CB'); ZACATEK : TCas = (hod:9; min:0; sec:0); KONEC : TCas = (hod:11; min:59; sec:59); ZAVOD : TZavod = ( misto: 'Praha'; datum: (den:12; mesic:12; rok:2008); start: (hod:14; min:14; sec:14));
Systémové záznamové typy
DateTime (DOS) Registers (DOS) SearchRec (DOS) PalleteType (GRAPH) PointType (GRAPH) ViewPortType (GRAPH) …
Datový typ DateTime, Registers
type DateTime = record Year,Month,Day: Word; Hour,Min,Sec: Word; end;
Registers = record case Integer of 0: (AX, BX, CX, DX, BP, SI, DI, DS, ES, Flags:
Word); 1: (AL, AH, BL, BH, CL, CH, DL, DH: Byte); end;
Datový typ SearchRec
type { záznam použitý v rutině FindFirst a FindNext }
{ vyhledávání souborů v adresáři } SearchRec = record Fill: array [1..21] of Byte; Attr: Byte; Time: Longint; Size: Longint; Name: string [12]; end;
Ukázky datových typů jednotky GRAPH
const MaxColors = 15;type PaletteType = record Size : Byte; Colors : array [0..MaxColors] of
Shortint; end;
PointType = record X, Y : integer; end;
ViewPortType = record x1, y1, x2, y2 : integer; Clip : Boolean; end;
Záznam jako parametr procedur a funkcí
vstupní parametr (volání hodnotou) formální a skutečný parametr by měly být shodné typy
výstupní parametr (volání odkazem) používáme pokud
chceme načíst záznam v podprogramu chceme změnit hodnoty položek záznamu chceme výsledek výpočtů podprogramu uložit do
proměnné typu záznam event. uložit více výsledků u formálního parametru musíme použít var formální a skutečný parametr by měly být shodné typy
funkce nesmí vracet typ záznam !!!
Zlomky - krácení
typeTZlomek = record
citatel : integer;jmenovatel : word;
end;
{predpokladame existenci funkce NSD - nejvetsi spolecny delitel}
procedure Kraceni (var z : TZlomek);var
delitel : word;begin
delitel := NSD(z.citatel, z.jmenovatel);z.citatel := z.citatel div delitel;z.jmenovatel := z.jmenovatel div delitel;
end;
Zlomky
procedure Soucet (z1, z2 : TZlomek; var s : TZlomek);begin
Kraceni(z1);Kraceni(z2) ;s.citatel := z1.citatel*z2.jmenovatel + z1.jmenovatel*z2.citatel ;s.jmenovatel := z1.jmenovatel * z2.jmenovatel ;Kraceni(s) ;
end;
Převod času zadaného v sekundách
typeTCas = record
hod : word;min : byte;sec : byte;
end;procedure Sec_HMS (s : word; var cas : TCas);begin
with cas do beginhod := s div 3600; s := s mod 3600;min := s div 60; s := s mod 60;sec := s;
end;end;