Pascal pro začátečníky 7 - Strukturované datové typy

Zdroj: SOOM.cz [ISSN 1804-7270]
Autor: Kub@z
Datum: 13.4.2004
Hodnocení/Hlasovalo: 1.81/27

Co si představíte pod pojmem pole? Hromadu hlíny s obilím? Podobně je to i v Pascalu. Pole je datový typ, který obsahuje hromadu

Co si představíte pod pojmem pole? Hromadu hlíny s obilím? Podobně je to i v Pascalu. Pole je datový typ, který obsahuje hromadu proměnných. Příklad:

var pole: array[1..3] of integer;
begin
 pole[1] := 50; (* první položka má hodnotu 50 *)
 pole[2] := 10;
 pole[3] := 20;
 writeln(pole[1]);
 writeln(pole[2]+pole[3]);
end.

Pole se deklaruje klíčovým slovem "array". Za ním je uveden rozsah uzavřený do hranatých závorek. Následuje klíčové slovo "of" a typ proměnné. Když chceme do proměnné v poli přiřadit hodnotu, tak se zase index proměnné píše do hranatých závorek. Doufám, že je to jasné. Nyní si předvedeme, jak je možné vytvořit vícerozměrné pole:

var pole: array[1..3, 1..3] of integer;
begin
 pole[1,1] := 50;
 pole[1,3] := 10;
 pole[3,2] := 20;
end.

Z tohoto příkladu by vám mělo být jasné, jak se vícerozměrné pole používá. Je to vlastně jako kdybychom si vytvořili devět různých proměnných. Teď když jsme se dostali k poli, musím ještě zmínit, že s datovým typem "string" je možné pracovat jako s polem znaků, a to jak při deklaraci, tak při čtení nebo zápisu:

var retezec: string[50];

Vytvoří řetězec o délce maximálně 50 znaků. V programu následně použijeme:

writeln(retezec[12]);

Což vypíše 12. znak v řetězci. Toto čtení určitého znaku samozřejmě můžeme použít i když si řetězec nedeklarujeme s přesnou délkou, protože když napíšeme:

var retezec: string;

tak to má stejný význam jako:

var retezec: string[255];

Záznam

Co to je a k čemu slouží záznam? Slouží k uložení více typů informací do jednoho datového typu. Např. když budete třeba dělat něco jako databázi, tak budete chtít uložit jméno, příjmení atd. To byste udělali asi takhle:

var jmeno, prijm, telefon, adresa: string;
vek: integer;

No jo, ale co když budete chtít uložit 10 záznamů? To by nebylo snadné. A proto je tu typ "record". Teď se ještě musím zmínit o jednom klíčovém slově - "type", pomocí nějž si můžete vytvořit vlastní datový typ:

type mujtyp = integer;
var vek: mujtyp;

Tenhle zápis je celkem k ničemu, protože jsme si vlastně vytvořili "zástupné jméno" pro "integer", ale pro typ record je potřeba:

type zaznam = record
                jmeno, prijm, telefon, adresa: string;
                vek: integer;
              end;
var prom: zaznam;
begin
 prom.jmeno := 'petr'; (* prom.něco funguje jako samostatná proměnná *)
 prom.vek := 20; end.

Jak vidíte, k jednotlivým položkám se přistupuje pomocí tečky. Tento zápis pro nás nijak výhodný není, protože je vlastně delší než ten původní. Vraťme se ale k problému s 10 záznamy. Jak na to? Jednoduše - pomocí pole.

type zaznam = record
                jmeno, prijm, telefon, adresa: string;
                vek: integer;
              end;
var pole: array[1..10] of zaznam;
begin
 pole[1].jmeno := 'petr';
 pole[5].vek := 20;
end.

V souvislosti s tímto je nutné se zmínit o příkazu "with". Příklad:

type zaznam = record
                jmeno, prijm, telefon, adresa: string;
                vek: integer;
              end;
var prom: zaznam;
begin
 prom.jmeno := 'petr';
 prom.prijm := 'novák';
 prom.telefon := '0609112567';
 prom.adresa := 'U salónu 25';
 prom.vek := 20;
end.

Tento zápis je trošku zdlouhavý. Neleze vám tam na nervy to věčně se opakující "prom"? A to lze řešit právě příkazem "with":

type zaznam = record
                jmeno, prijm, telefon, adresa: string;
                vek: integer;
              end;
var prom: zaznam;
begin
with prom do begin
 jmeno := 'petr';
 prijm := 'novák';
 telefon := '0609112567';
 adresa := 'U salónu 25';
 vek := 20;
 end;
end; end.

To už je lepší ne?

Množina

Co je to množina si asi dovede představit každý, kdo prošel první třídou základní školy. Je to soubor prvků stejného typu (vzpomínáte na jabka a hrušky? :). Množina se vytváří jako datový typ pomocí příkazu "set". Nebudu se tady zabývat principy množiny, ale předvedu ji na nejčastějších použitích. Pozor! Množina musí být číselného typu. Použití:

1. Vytvořit si vlastní typ použitý místo číselného zápisu:

type ramecek = (jednoduchy, dvojity, trojity, levy, pravy);
var typ: ramecek;
begin
 typ := dvojity;
 case typ of
  jednoduchy: writeln('Ramecek ma jednu caru');
  dvojity: writeln('Ramecek ma dve cary');
  else writeln('Ramecek je nejakej jinej');
 end;
end.

Jak vidíte, vytvořili jsme si typ "ramecek", který tvoří množinu "čísel". Tato čísla jsou nahrazena zástupnými jmény, která můžeme v programu použít - hodí se ke zlepšení přehlednosti.

2. Množina znaků nebo čísel

uses crt; (* readkey je definováno v unitě crt, pokud to *)
          (* způsobuje error 200, použijte "fdelay" *)
const znaky = ['a','n','1','2','3'];
begin
 repeat
 until readkey in znaky;
end.

Zde jsme se setkali s novým operátorem - "in". Význam: "hodnota in množina" vrací "true", když se hodnota v množině nachází a "false" když ne. Tzn. že tento prográmek bude čekat na stisk jedné z kláves uvedených v množině. Jistě jste si všiml, že se v tomto případě přímého zápisu hodnot (ne zástupných jmen) uzavírá množina do hranatých závorek. Stejně tak to může být i množina čísel:

[255, 85, 41 ,56]

Kombinovat číselné a znakové množiny není možné. Teď si možná říkáte, proč jsem napsal, že se množina deklaruje klíčovým slovem "set". Je to z toho důvodu, že jak vidíte, do množin, které jsem zde uvedl není možné zadat hodnotu. V příkladu 2 byla množina konstanta, a proto se neuvádí datový typ. Ve skutečnosti je to však "set of typ":

var mnoz: set of char;
begin
 mnoz := ['A', 'B', 'C'];
end.

S proměnnou pracujeme stejně jako s konstantou z příkladu 2 s tím rozdílem, že do ní můžeme přiřadit hodnotu.

3. Kombinace obojího

Dochází vám, co tím myslím? Je to použití zástupných jmen jako prvků v množině:

var pismo: set of (tucne, podtrzene, kurziva, preskrtnute);
begin
 pismo := [tucne];
 pismo := [tucne, kurziva];
 pismo := pismo + [podtrzene];
 pismo := pismo - [tucne];
 if pismo = [kurziva] then writeln('Pismo je pouze kurzivou');
 if tucne in pismo then writeln('Pismo je tucne a mozna i jine');
end.

Tento příklad demostruje všechna použití tohoto typu množiny. A to je pro tuto lekci vše.

Kub@z