250 likes | 383 Views
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í.
E N D
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í
record end seznam položek pevná část ; ; proměnná část Deklarace záznamu seznam položek
Pevná část záznamu pevná část : typ seznam identifikátorů ;
case typ varianta of identifikátor : ( ) konstanta seznam položek , Proměnná část záznamu proměnná část varianta
Příklady type TDatum = record den : 1..31; mesic : 1..12; rok : word; end; TAdresa = record ulice : string[20]; cislo : string[10]; mesto : string[25]; psc : string[5]; end;
Příklady type TCas = record hod : 0..24; min : 0..60; sec : 0..60; end; TZak = record trida : 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é var datum : TDatum ; begin Write('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 (.) var pracovnik : record jmeno, prijmeni : string[15]; datnar : TDatum; adresa : TAdresa; end; begin Write('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.
with proměnná záznamového typu do , Přístup pomocí příkazuwith var datum : TDatum; begin WriteLn('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 var termin : record datum : TDatum; cas : TCas; end; begin WriteLn('Stanovený termín:'); with termin do begin with datum do begin Write('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 type TZnamka = 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 dobegin Write(i, '. znamka: '); ReadLn(Zak.znamky[i]); end; … end.
Pole záznamů type TZbozi = 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] dobegin Write('Nazev: '); ReadLn(nazev); Write('Jednotka: '); ReadLn(jednotka); Write('Jednotkova cena: '); ReadLn(cena_j); end; … end.
Pole záznamů obsahujících pole type TBody = array [1..10] ofreal; 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].jmeno body 5. závodníka za 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 type TOsoba = record Jmeno : string [30]; Vek : byte; Vyska : byte; Vlasy : string [30]; case Pohlavi : charof 'M' : (plnovous, knir : boolean); 'Z' : (prsa, pas, boky : byte); end;
Typové konstanty type TZavod = 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 caseInteger 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] ofShortint; 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í type TZlomek = 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 type TCas = record hod : word; min : byte; sec : byte; end; procedure Sec_HMS(s : word; var cas : TCas); begin with cas dobegin hod := s div 3600; s := s mod 3600; min := s div 60; s := s mod 60; sec := s; end; end;