Professional Documents
Culture Documents
Free Pascal Spojene Subory - Teoria
Free Pascal Spojene Subory - Teoria
Verzie
Najjednoduchší je TurboPascal, ktorý poskytuje základné možnosti pre výučbu princípov
programovania. Viac možností obsahuje Object Pascal, v ktorom môžeme pracovať z tzv.
objektmi. Existujú i Open Source aplikácie, ktoré nám poslúžia najmenej rovnako dobre.
GNU Pascal je určený najmä pre Linux a jeho inštalácia na Windowse je náročná. Preto
odporúčam Free Pascal - obdobu Object Pascalu.
Free Pascal
Je to multiplatformový kompilátor objektového Pascalu spolu s vývojovým prostredím. Má
pomerne jednoduché ovládanie, množstvo jednotiek (Units) a je ľahko rozšíriteľný. Jeho
prostredie sa podobá TurboPascalu, má však mnoho vylepšení.
Otvorenie
Ak sa vám v Štart menu vytvoril odkaz, určite nemusím nič viac hovoriť. Ak sa tak nestalo,
FreePascal otvoríte pomocou súboru s názvom fp.exe v priečinku (adresár Free
Pascalu)\bin\i386-win32\.
Prvý program
Ako všade inde - kliknite na menu File / New. Napíšte tento zdrojový kód (súbor príkazov, z
ktorého môže vzniknúť napr. program):
program prvy;
begin
writeln('Ahoj');
end.
Stlačte Alt+F9 alebo menu Compile / Compile. Ak vás program vyzve k uloženiu, zadajte
názov súboru. Mal by mať koncovku PAS - napr. prvy.pas.
Ahoj
Ak sa vám zobrazí chybová hláška, skúste skontrolovať napísaný zdrojový kód alebo zistiť
zmysel hlášky a napraviť chybu.
Stavba programu
Zdrojový kód v každom programovacom jazyku má svoju pevnú štruktúru. V Pascale (Free
Pascale) musí byť na začiatku každého samostatného programu slovo program. Za ním
nasleduje medzera a názov programu. Nemal by byť dlhší ako 8 písmen, ale nevylučujem,
že fungujú aj dlhšie názvy.
Poznámky
Pri programovaní často potrebujeme niečo zaznamenať - na čo slúži daná časť kódu, čo treba
dokončiť, čo je nefunkčné,... Pomôžu nám poznámky v zdrojovom kóde. Pravdepodobne
najpoužívanejší typ sa skladá zo zložených zátvoriek:
{ nejaká poznámka }
{ program cislo 1 }
program prvy;
begin
writeln('Ahoj'); { napise Ahoj }
end.
{ zaciatok
nejaky text
koniec }
(* poznamka *)
// jednoriadkova poznamka
Použitie premennej
Predtým, než premennú použijeme, musíme ju deklarovať. Na to slúži časť var.
program premenne;
var
cislo: integer;
Kľúčové slovo var sa nachádza ešte pred slovom begin. Za var nasleduje názov premennej
(cislo), dvojbodka, typ premennej (v tomto prípade celé číslo – integer(intidža)) a
bodkočiarka.
begin
cislo := 5;
writeln(cislo);
end.
program premenne;
var
cislo: integer;
begin
cislo := 5;
writeln(cislo);
end.
Ak všetko funguje ako má, zjaví sa na obrazovke číslo 5 (nezabudnite stlačiť Alt+F5 pre
zobrazenie).
Výmena premenných
Urobme si program, ktorý navzájom vymení obsah dvoch premenných (a, b). Ak do
premennej vložíme prvú hodnotu a potom druhú, prvá sa vymaže a zostane len druhá.
Nasledujúci postup:
a := b;
b := a;
je nesprávny. Tak ako na to? Iste zistíte, že na to treba ešte jednu, pomocnú premennú c. Do
nej uložíme obsah a, potom do a priradíme b a do b priradíme c. Vyzerá to byť zložité, ale je
to jednoduché.
program vymen;
var
a, b, c: integer;
begin
a := 1;
b := 2;
c := a;
a := b;
b := c;
writeln(a);
writeln(b);
end.
Konštanty
Základný rozdiel medzi konštantou a premennou je, že hodnotu konštanty nemôžeme meniť.
Deklaruje sa slovom const.
program konst;
const
biela = 255;
begin
writeln(biela);
end.
Výstup
Procedúru writeln už poznáme, ale naučíme sa o nej niečo viac. Je to procedúra, ktorá
dokáže na obrazovku vypísať texty a čísla. Text dávame medzi apostrofy, čísla nie.
writeln('nejake slova');
writeln(19);
Po napísaní daných informácií sa vždy vytvorí nový riadok a text pokračuje na ňom.
Poznáme však aj procedúru, ktorá nový riadok nevytvorí a pokračuje na aktuálnom riadku.
Nazýva sa write.
write('dnes ');
write('rano');
dnes rano
Vypísať môžeme i viacero informácií pomocou jednej procedúry. Jednotlivé texty i čísla
oddelíme čiarkami.
program vystup;
var
c: integer;
begin
c := 10;
writeln(c);
write('je ', c, ' hodin');
end.
Vstup
Pod pojmom štandardný vstup z klávesnice v Pascale rozumieme získavanie informácií, ktoré
užívateľ na klávesnici zadá, pričom na konci stlačí Enter. Obsah (text, číslo) sa zapíše do
nami určenej premennej. Procedúra, ktorú použijeme, sa nazýva readln .
program vstup;
var
nazov: string;
begin
writeln('zadajte nazov');
readln(nazov);
writeln('bolo napisane: ', nazov);
end.
Vráťme sa k procedúre readln . Pri nej sa program zastaví a zobrazí blikajúci textový
kurzor. Zadáme napríklad text: lietadlo a program vypíše:
program vstup2;
var
cislo: integer;
begin
writeln('zadajte stastne cislo');
readln(cislo);
writeln('zadali ste ', cislo);
end.
Zvyknite si pred readln ( ri:dln) vždy dávať writeln , aby užívateľ vedel, čo má zadať.
readln;
Free Pascal - Matematické operátory
Samozrejme, že programy neslúžia len na získavanie a produkciu informácií, ale aj na ich
spracúvanie. Preto sa poďme pozrieť na zopár príkladov.
cislo := 10+5;
writeln(cislo);
writeln(20-5);
writeln('20-5');
20-5
program mocnina;
var
cislo: integer;
begin
writeln('zadajte cislo');
readln(cislo);
writeln('2. mocnina = ', cislo*cislo);
end.
Delenie
Vo Free Pascale poznáme dva typy delenia - bežné a celočíselné.
Ak ako operátor delenia označíme lomítko (/), výsledok nie je typu „celé číslo“, ale
desatinné (označujeme ho real).
program del;
var
vysledok: real;
begin
vysledok := 10/3;
writeln(vysledok);
writeln(7/2);
end.
program del2;
var
vysledok: integer;
begin
vysledok := 10 div 3;
writeln(vysledok);
writeln(10 mod 3);
end.
Program napíše:
3
1
Možno ste si všimli, že niektoré príklady sú zbytočne neefektívne - najprv v nich priradíme
premennej konštantu (napr. 10 div 3) a potom ju vypíšeme. Samozrejme, že je to len pre
ukážku.
Kombinácia operátorov
V jednom výraze môžeme použiť viacero operátorov naraz, rovnako ako v matematike.
Napríklad:
writeln(10+2+3);
writeln(5-2*2);
cislo := 3;
writeln(2*(cislo+1) div 4);
Výsledok je zrejmý:
15
1
2
Free Pascal - Logické výrazy
Logický výraz môže nadobúdať vždy len dve hodnoty - true (pravda) alebo false
(nepravda). Súčasťou výrazov môžu byť operátory.
program logicke;
var
hodnota: boolean;
begin
hodnota := true;
end.
Spomenutý príklad nemá žiaden praktický význam. Nadobudne ho pri použití podmienky.
Najprv sa však naučíme logické operátory.
program log_op;
var
a: boolean;
begin
a := 5 < 7;
writeln(a);
writeln(15 = 16);
end.
Program napíše:
TRUE
FALSE
program unarny_o;
var
hodnota: boolean;
begin
hodnota := not (12 > 5);
writeln(hodnota);
end.
FALSE
Zložené výrazy
Skladajú sa z dvoch, prípadne viacerých jednoduchých výrazov. Tie spájame operátormi and,
or, xor a zátvorkami.
Pri použití operátora and bude výsledný výraz pravdivý (true), ak sú obidva
jednoduché výrazy pravdivé.
program zlozene1;
var
hodnota: boolean;
begin
hodnota := (1 < 5) and (6 > 3);
writeln(hodnota);
end.
Poďme sa pozrieť na operátor or. Ten urobí zložený výraz pravdivým, ak aspoň jeden
jednoduchý má hodnotu true.
program zlozene2;
var
hodnota: boolean;
begin
hodnota := (1 <= 1) or (6 > 7);
writeln(hodnota);
writeln((2 = 6) or (19 <> 19));
end.
Aplikácia vypíše najprv TRUE, pretože aspoň jeden výraz bol pravdivý, potom FALSE,
lebo boli obidva nepravdivé.
Teraz si ukážeme príklad na operátor xor, pri ktorom má zložený výraz pravdivú hodnotu,
len ak je práve jeden jednoduchý pravdivý.
program zlozene3;
begin
writeln((5 = 5) xor (10 > 1));
writeln((1 < 6) xor (7 <> 7));
end.
Toto je výsledkom:
FALSE
TRUE
Neúplná podmienka
Používame kľúčové slová if a then. Forma je nasledovná:
if podmienka then
príkaz;
Ak je príkazov viac, použijeme slová begin a end (za toto end dáme bodkočiarku).
Ako podmienku používame logické výrazy. Príkaz sa vykoná, ak sa daný logický výraz rovná
true. Nasledujúci program vypíše číslo zadané z klávesnice, len ak je menšie ako 10.
program podm;
var
c: integer;
begin
writeln('zadajte cislo');
readln(c);
if c < 10 then
writeln('cislo ', c, ' je mensie ako 10');
end.
Úplná podmienka
Tento typ podmieneného príkazu má tvar:
if podmienka then
príkaz1
else
príkaz2;
Ak bude logický výraz zadaný ako podmienka pravdivý, vykoná sa príkaz1, inak príkaz2. Pri
použití viacerých príkazov ich rovnako uzavrieme kľúčovými slovami begin a end.
Teraz si ukážeme skutočný zdrojový kód na príklade. Po zadaní čísla z klávesnice sa nám
zobrazí text informujúci, či je dané číslo párne. Okrem podmienky použijeme aj
operátor mod - zvyšok po delení.
program parne;
var
c: integer;
begin
writeln('zadajte cislo');
readln(c);
if c mod 2 = 0 then // ak je parne
writeln('cislo ', c, ' je parne')
else // inak
writeln('cislo ', c, ' je neparne');
end.
Príkaz CASE
Umožňuje nám zjednodušiť zdrojový kód pri väčšom množstve podmienok a výsledných
možností. Ak má výraz určitú hodnotu, vykoná sa určený príkaz. Hodnota však musí byť
vždy ordinálna (napr. celé číslo, znak). Takýto je tvar:
case premenná of
hodnota1: príkaz1;
hodnota2: príkaz2;
hodnota3: príkaz3;
...
else príkaz;
end;
V prípade viacerých príkazov pre jednu hodnotu použijeme známe begin a end.
case premenná of
hodnota1: begin príkazy1 end;
...
else begin príkazy2 end;
end;
program podmn;
var
cislo: integer;
begin
writeln('zadajte cislo');
readln(cislo);
case cislo of
7: writeln('to je stastne cislo');
13: writeln('vraj nestastne');
else writeln('ine cislo');
end;
end.
To však nie je všetko. Miesto jednej hodnoty môžeme určiť i viacero naraz, či dokonca celý
číselný rozsah.
program podmn2;
var
cislo: integer;
begin
writeln('zadajte cislo');
readln(cislo);
case cislo of
3,7: begin
writeln('stastne cislo');
writeln('OK');
end;
10..99: writeln('dvojciferne cislo');
end;
end.
program cisla;
var
c: integer;
begin
for c := 1 to 15 do
writeln(c);
end.
Ak chceme vykonať viac ako jeden príkaz, musíme použiť kľúčové slová begin a end.
Existuje aj variant, pri ktorom sa hodnota premennej nezväčšuje, ale zmenšuje. Stačí miesto
slova to použiť downto.
writeln('odpocitavanie:');
for i := 10 downto 1 do
writeln(i);
writeln('koniec');
Ešte jedna vychytávka. Miesto celého čísla môžeme tiež použiť znak - typ char.
program abeceda;
var
znak: char;
begin
for znak := 'a' to 'z' do
write(znak);
end.
Cykly s podmienkou
Využívame ho, ak má podmienka rozhodnúť o tom, či bude cyklus pokračovať.
while podmienka do
príkaz;
Príkaz sa bude vykonávať dovtedy, kým má logický výraz (testovaný na začiatku) hodnotu
true. Pri viacerých príkazoch používame známe begin a end. Tento príklad bude žiadať
napísanie čísla dovtedy, kým užívateľ nezadá číslo väčšie ako 10.
program cyklus2;
var
cislo: integer;
begin
while cislo <= 10 do begin
writeln('zadajte cislo vacsie ako 10');
readln(cislo);
end;
end.
repeat
príkaz(y)
until nepravdiva_podmienka
Daný príkaz sa bude opakovať, kým bude mať logický príkaz (zisťovaný na konci) hodnotu
false. Jednoduchým, ale užitočným príkladom je pozastavenie programu pred jeho koncom,
kým užívateľ nestlačí klávesu. Pomôže nám funkcia keypressed.
program vypisx;
uses
crt;
begin
writeln('x');
repeat until keypressed;
end.
program stop;
var
i, cislo: integer;
begin
for i := 1 to 5 do begin
writeln('Napiste cislo.');
readln(cislo);
if cislo >= 100 then begin
writeln('Nespravna hodnota, koncim!');
break; // uplny koniec cyklu
end;
writeln('Spravna hodnota.');
end;
end.
Náš program v ideálnom prípade prečíta päť čísel z klávesnice. Akonáhle však zadáme číslo
>= 100, vypíše sa hláška a celý cyklus sa ukončí.
Pokračovanie v cykle
Príkaz continue preskočí všetko, čo nasleduje za ním v cykle. Potom pokračuje až v ďalšom
opakovaní. Zvýši pritom počítaciu premennú / testuje podmienky cyklu, ako zvyčajne.
Pre pochopenie uvediem príklad, veľmi podobný predchádzajúcemu. Jediný rozdiel bude v
tom, že ak užívateľ zadá nesprávne číslo (teda >= 100), bude ešte musieť zadať aj zvyšné
čísla. Program teda vždy prečíta práve päť čísel.
program pokracuj;
var
i, cislo: integer;
begin
for i := 1 to 5 do begin
writeln('Napiste cislo.');
readln(cislo);
if cislo >= 100 then begin
writeln('Zla hodnota, ale to nevadi.');
continue; // skok na dalsie opakovanie
end;
writeln('Spravna hodnota.');
end;
end.
Procedúry
Procedúry sme už používali a zistili sme, že to nie je nič ťažké. Napríklad aj známy writeln
je procedúrou.
writeln('ano');
Poďme si však vytvoriť svoju vlastnú. Procedúra sa deklaruje ešte pred blokom begin - end.
(s bodkou). Vykonávame ju napísaním jej názvu (nezabudnime na bodkočiarku).
program nazov_programu;
{deklaracia procedury}
procedure moja_procedura;
begin
prikazy_procedury;
end;
{samotny program}
begin
moja_procedura;
end.
Naša sa bude volať meno a jej úlohou sa stane zistiť a vypísať vaše meno. Uznávam, že to nie
je vôbec praktický príklad, ale poslúži nám.
program mena;
var
text_mena: string;
// deklaracia procedury
procedure meno;
begin
writeln('Zadajte meno.');
readln(text_mena);
writeln('Volate sa ',text_mena,'.');
end;
// samotny program
begin
meno;
writeln('Skusime to este raz.');
meno;
end.
Procedúry môžu mať aj tzv. parametre. Sú to premenné, ktoré musíme funkcii dodať pri
každom jej vykonávaní a vždy môžu byť iné. Píšeme ich do zátvorky za názov procedúry. Ak
je parametrov viac, pri deklarácii ich oddeľujeme bodkočiarkami, pri vykonávaní čiarkami
(poznáte z writeln).
Teraz náš príklad zmeníme, aby bez zisťovania vypísal dve rôzne mená.
program mena2;
// deklaracia procedury
procedure meno
(poradie: integer; text_mena: string);
begin
writeln(poradie,'. meno je ',text_mena,'.');
end;
// samotny program
begin
meno(1,'Jano');
meno(2,'Peto');
end.
Funkcie
Funkcia sa od procedúry líši tým, že okrem vykonania sady príkazov vráti nejakú hodnotu.
Deklaruje sa kľúčovým slovom function. Hodnotu, ktorá sa má vrátiť, určuje špeciálna
premenná Result. Aby ste ju mohli vo Free Pascale používať bez jej manuálnej deklarácie,
treba zapnúť kompatibilitu s Delphi. Kliknite na menu Options / Compiler a zaškrtnite
políčko Delphi compatibility (ak už nie je zaškrtnuté).
Existuje aj iný spôsob - deklarovať premennú Result bežným spôsobom v časti var. Teraz sa
ale pozrime na príklad (kompatibilita je už zapnutá).
program mocniny;
// deklaracia funkcie
function mocnina
(zaklad, exponent: integer): integer;
var
c, vysledok: integer;
begin
vysledok := 1;
for c := 1 to exponent do
vysledok := vysledok * zaklad;
Result := vysledok;
end;
// samotny program
begin
writeln(mocnina(10,2));
readln;
end.
Všimnite si, že časť var sa môže nachádzať priamo v deklarácii funkcie. Tieto premenné
budú prístupné len pre aktuálnu funkciu a po jej ukončení sa vynulujú.
Nakoniec ešte spomeniem tretí spôsob vrátenia hodnoty, asi jediný použiteľný v starom Turbo
Pascale. Jednoducho priradíme výsledok premennej, ktorej názov je zhodný s názvom
funkcie.
function Funkcia;
begin
Funkcia := 10;
end;
Využitie
Ak napríklad potrebujeme zaznamenať 1000 čísel, určite ich nezačneme ukladať do tisícich
ručne vytvorených premenných nazvaných prem000, prem001, prem002,... Využijeme pole a
jediným riadkom ich deklarujeme. Prístup k prvkom je tiež veľmi jednoduchý. Tak ideme na
to.
Deklarácia poľa
Tu je schéma:
var
názov_poľa: array[začiatok..koniec]
of typ_premenných;
var
pole: array[5..123] of string;
Práca s prvkami
K prvkom v poli pristupujeme pomocou názvu poľa, za ktorým nasleduje v hranatých
zátvorkách index prvku.
ovocie[0] := 'jablko';
ovocie[1] := 'banan';
writeln(ovocie[0],' ', ovocie[1]);
Príklad vypíše:
jablko banan
Nasledujúci príklad ukazuje, ako najprv získame od užívateľa 5 čísel a potom ich vypíšeme v
opačnom poradí.
program polia;
var
c: integer;
pole: array[1..5] of integer;
begin
{ ziskavanie }
for c := 1 to 5 do begin
writeln('Zadajte ', c, '. cislo.');
readln(pole[c]);
end;
{ vypis cez cyklus for..downto }
writeln('Opacny vypis:');
for c := 5 downto 1 do
write(pole[c],' ');
end.
Špeciality
Indexy môžu byť i záporné.
a: array[-10..-5] of string;
b: array['a'..'n'] of integer;
Free Pascal - Náhodné javy
Zatiaľ viete, že pri programovaní musí mať všetko svoju logiku, nič nenechávame na náhodu.
Alebo predsa? V Pascale existuje tzv. generátor pseudonáhodných čísel. Tie však stále nie sú
úplne vymyslené - získavajú sa špeciálnymi algoritmami, pričom sa využíva aktuálny
systémový čas.
writeln(random);
Na obrazovke sa zjaví nič nehovoriace číslo. Dokonca, ak program spustíte viackrát, malo by
sa zobraziť presne to isté (nie je to však pravidlo).
writeln(random(5));
Aby sme zabránili generovaniu stále toho istého čísla, použijeme procedúru randomize.
Takto vyzerá kompletný program:
program nahodne;
begin
randomize;
writeln(random(5));
end.
Naša aplikácia vypíše náhodne vybrané celé číslo od 0 do 4 (vrátane 0 a 4). Skúste ju spustiť
viackrát.
Príklad
Skúsime napísať program, ktorý by vygeneroval a napísal 10 náhodných čísel od 1 do 15
(vrátane). Výsledné čísla sa však nesmú opakovať! Použijeme pole, do ktorého si budeme
ukladať generované hodnoty. Pred tým, ako číslo vložíme do poľa, skontrolujeme, či sa v
ňom už nenachádza. Aplikáciu nazveme Lotéria.
program loteria;
var
pole: array[1..10] of integer;
nahodne, c, d: integer; // pomocne
nachadza_sa: boolean;
begin
randomize;
for c := 1 to 10 do begin
repeat {aby sa cisla neopakovali}
nahodne := random(15)+1;
nachadza_sa := false;
for d := 1 to 10 do
if nahodne = pole[d] then
nachadza_sa := true;
until not nachadza_sa;
pole[c] := nahodne;
writeln(nahodne);
end;
end.
Príklad na začiatok
Predstavte si, že máte uchovávať údaje o európskych krajinách. Napríklad záznam Slovensko
typu TKrajina môže obsahovať dve celočíselné položky (Rozloha, PocetObyvatelov) a
reťazcovú položku HlavneMesto.
Vytvorenie a používanie
Máme dve možnosti - buď deklarujeme priamo premennú:
var
Zaznam: record
Vlastnost: integer;
InaVlastnost: string;
end;
alebo najprv definujeme nový typ a potom vytvoríme premennú tohto typu. Využijeme druhú
možnosť.
program ludia;
type
TClovek = record
Meno, Priezvisko: string; {2 retazce}
RokNarodenia: word; {cele cislo}
end;
var
Ujo: TClovek;
...
Teraz jednotlivým položkám záznamu Ujo priradíme hodnoty. Potom ich môžeme vypísať.
Oddeľovačom názvu záznamu a jeho položiek je bodka.
...
begin
Ujo.Meno := 'Jozko';
Ujo.Priezvisko := 'Mrkvicka';
Ujo.RokNarodenia := 1850;
write(Ujo.Meno, ' ', Ujo.Priezvisko);
writeln(' bol narodený r. ', Ujo.RokNarodenia);
end.
Podradené záznamy
Jeden záznam môže obsahovať iný záznam. Napríklad človek má okrem už spomenutých
údajov (meno, priezvisko, rok narodenia) aj adresu, ktorá obsahuje ulicu a mesto. Upravíme
teda predchádzajúci kód.
type
TClovek = record
Meno, Priezvisko: string; {2 retazce}
RokNarodenia: word; {cele cislo}
Adresa: record {podradeny zaznam}
Ulica, Mesto: string;
end;
end;
Ujo.Adresa.Ulica := 'Neznama';
Ujo.Adresa.Mesto := 'Hraskovo';
Urýchlený prístup
Ak chceme nejaký záznam používať dosť veľa krát za sebou, nemusíme k nemu pristupovať
vždy pomocou tvaru záznam.položka. Miesto toho môžeme použiť kľúčové slovo with.
Trieda
Veľmi zjednodušene možno povedať, že trieda je určitý typ premennej. Objekt je zas
premenná typu trieda.
Pokúsime sa vytvoriť program, v ktorom vytvoríme triedu TSkola. Bude v nej zadefinovaná
vlastnosť - premenná Ziaci (typu integer); ďalej tzv. metóda - procedúra
PrijmiZiakov(pocet: integer), ktorá prijme určitý počet nových žiakov na školu a
pripočíta ich k súčasnému počtu. Metóda VyhodZiaka zmenší počet žiakov školy o 1. Funkcia
(metóda) PocetLudi vráti celkový počet ľudí na škole.
Zdrojový kód v dnešnom článku je trocha dlhší, preto som ho trošku rozkúskoval.
program objekty;
const
{pocet zamestnancov skoly je konstantny}
Zamestnanci = 50;
type
TSkola = class
{pocet ziakov na skole}
Ziaci: integer;
{prijatie dalsich ziakov}
procedure PrijmiZiakov(pocet: integer);
{vyhodenie ziaka zo skoly}
procedure VyhodZiaka;
{funkcia vrati celkovy pocet ludi na skole}
function PocetLudi: integer;
{konstruktor volany pri vytvoreni objektu}
constructor Create;
end;
To bola deklarácia. Kľúčovým slovom type sme zadefinovali nový typ premennej - triedu
(class) TSkola. Nasledoval akýsi výpis vlastností a metód.
procedure TSkola.VyhodZiaka;
begin
{pascalovska procedura Dec
zmensi pocet ziakov o 1}
Dec(Ziaci);
end;
constructor TSkola.Create;
begin
{na zaciatku bude v kazdej skole 300 ziakov}
Ziaci := 300;
end;
Objekt
To však nie je všetko - zdrojový kód nášho programu pokračuje ďalej.
Vytvoríme objekt typu TSkola. Môže ich byť aj viacej. Každá škola má vlastnosti a metódy
Ziaci, VyhodZiaka, atď. No jedna z nich bude mať po prijatí nových študentov 450 žiakov a
druhá po ich vyhodení 280. To je jedna z výhod objektového programovania - môžeme
vytvoriť viac inštancií jednej triedy.
var
ZSMala, VelkeGymnazium: TSkola;
begin
ZSMala := TSkola.Create;
VelkeGymnazium := TSkola.Create;
ZSMala.PrijmiZiakov(150);
{300 ziakov + 50 zamestnancov
+ 150 prijatych = 500 ludi}
writeln('ZSMala: ', ZSMala.PocetLudi, ' ludi');
VelkeGymnazium.VyhodZiaka;
{300 + 50 - 1 = 349}
writeln('Velky gympel: ',
VelkeGymnazium.PocetLudi, ' ludi');
end.
Dedičnosť
Dedičnosť je jednou z vlastností OOP. Predstavme si, že chceme navrhnúť novú triedu -
TGymnazium, ktorá by mala okrem vlastností triedy TSkola navyše vlastnosť PocetRocnikov.
Nemusíme programovať všetko odznova, stačí ju vytvoriť takto:
type
TSkola = class
... (tu nič nemeníme) ...
end;
TGymnazium = class(TSkola)
PocetRocnikov: byte;
end;
Trieda TGymnazium zdedila vlastnosti a metódy triedy TSkola - je teda jej potomkom.
Pribudol jej však PocetRocnikov.
var
...
VelkeGymnazium: TGymnazium;
begin
...
VelkeGymnazium: TGymnazium.Create;
Prístup k vlastnostiam
Ak chceme zamedziť prístupu k daným vlastnostiam z určitých častí kódu, používame
kľúčové slová private (súkromné - neprístupné mimo triedy), public (prístupné z
akejkoľvek časti kódu), protected (prístupné len pre danú triedu a jej potomkov) a
published (niečo podobné ako public). Použitie je nasledovné:
type
TSkola = class
private
Ziaci: integer;
public
procedure PrijmiZiakov(pocet: integer);
...
end;
Polymorfizmus
O polymorfizme hovoríme, ak dva rôzne objekty / triedy reagujú na tú istú správu (napr.
procedúru / funkciu) rozdielne.
type
TSkola = class
...
function TypSkoly: string; virtual;
end;
TGymnazium = class(TSkola)
...
function TypSkoly: string; override;
Grafický režim
Aby sme mohli pracovať s grafikou, je potrebné prepnúť z textového do grafického režimu.
Uvediem tu kód, ktorý je nutné vkladať do každého pascalovského grafického programu.
Nemusíte mu rozumieť, keďže ide o systémové záležitosti, ale napíšem niečo aj o tom.
Najskôr pridáme do sekcie uses jednotku graph, ktorá obsahuje všetko potrebné na
„kreslenie“.
Premenná ovladac, veľmi zjednodušene povedané, obsahuje číslo ovládača grafickej karty.
Ovládač je súbor sprostredkujúci spoluprácu medzi hardvérom a softvérom. Grafmod je
grafický mód, v akom budeme pracovať - väčšina ovládačov totiž obsahuje viac režimov,
napr. mód 1 = rozlíšenie monitora 640x480, 256 farieb; mód 2 = rozlíšenie 720x400, 16 farieb
a pod.
program grafika;
uses
crt, graph;
var
ovladac, grafmod: integer;
begin
ovladac := Detect;
InitGraph(ovladac, grafmod, 'C:\OVLADACE');
...
repeat until keypressed;
end.
Grafická plocha
Grafickú plochu predstavuje v prípade TurboPascalu celá obrazovka, pri Free Pascale je to
špeciálne windowsovské okno.
Čiary
Na nakreslenie úsečky používame funkciu Line(X1, Y1, X2, Y2). Parametre sú celočíselné
a zohrávajú nasledujúcu úlohu:
Skúsime nakresliť vodorovnú čiaru začínajúcu na súradniciach [100, 50] a končiacu na [300,
50].
MoveTo(100, 50);
LineTo(300, 50);
Obdĺžniky
Obdĺžnik sa dá nakresliť viacerými čiarami, ale zvyčajne ho kreslíme jednoduchšie -
procedúrou Rectange(X1, Y1, X2, Y2). Parametre majú tentoraz takýto význam:
Nakreslíme obdĺžnik široký 200 a vysoký 80 px. Jeho ľavý horný roh bude na pozícii [100,
100].
Rectangle(100, 100, 300, 180);
Procedúra Bar má rovnaké parametre ako Rectangle, ale jej úlohou je nakresliť vyplnený
obdĺžnik. Predtým, ako ju zavoláme, je vhodné nastaviť štýl a farbu výplne pomocou
SetFillStyle(Typ_výplne, Farba).
SetFillStyle(SolidFill, red);
Bar(100, 100, 300, 180);
Kruhy a elipsy
Vytvoriť kruh je jednoduchšie, ako by sa mohlo zdať. Máme na to procedúru Circle(X, Y,
Polomer). Celočíselné parametre X a Y označujú súradnice stredu kruhu, význam slova
polomer asi netreba vysvetľovať.
Procedúra Ellipse, kresliaca elipsu alebo jej časť, má, samozrejme, trochu viac parametrov.
Takto znie definícia:
StAngle je uhol, od ktorého sa začína časť elipsy kresliť. EndAngle je uhol, kde sa má prestať
kresliť. Predstavte si uhlomer, kde 0 alebo 360 stupňov je vpravo, 90 hore, 180 vľavo a 270
dole. Viac možno pochopíte skúšaním rôznych hodnôt.
Text
Hoci sme v grafickom prostredí, nikto nepovedal, že na grafickú nemôžme písať text. Slúži na
to procedúra OutText s parametrom typu string. Daný text sa vypíše na aktuálnu pozíciu
(určenú cez MoveTo, atď.).
OutText('Nejaky text');
Farby
Farbu kresliaceho nástroja nastavíme procedúrou SetColor(Farba). Parametrom
je číslo, avšak existujú preddefinované konštanty, ktoré môžeme použiť -
napr. Blue je modrá, Yellow žltá a pod.
SetColor(LightBlue);
Line(0, 0, 100, 200);
program grafkvad;
uses
crt, graph;
const
zaciatok = -10;
koniec = 20;
var
ovladac, grafmod: integer;
x, stredX, stredY: integer;
{kvadraticka funkcia
s prepoctom na pascalovske suradnice}
function f(x: integer): integer;
begin
f := stredY-(x*x-10*x+30);
end;
begin
{prechod do grafickeho rezimu}
ovladac := Detect;
InitGraph(ovladac, grafmod, 'C:\OVLADACE');
{vykreslenie osi x a y}
Line(0, stredY, GetMaxX, stredY);
Line(stredX, 0, stredX, GetMaxY);
{napiseme k nim textovy popis}
OutTextXY(0,stredY+2,'X');
OutTextXY(stredX+2,0,'Y');
Súbory všeobecne
Najprv je potrebné vytvoriť premennú, ktorá bude daný súbor symbolizovať. Táto premenná
môže byť typu file - tzv. netypovaný súbor, file of nejaký_typ - súbor s určeným
typom, text - textový súbor.
var
Subor: Text;
Assign(Subor, 'C:\MOJE.TXT');
Assign(Subor, 'MOJE.TXT');
Keď je už názov súboru určený, je na čase otvoriť ho. V Pascale existujú tri možnosti jeho
otvorenia - na čítanie, zapisovanie a pripisovanie. Tretí spomínaný je dostupný len pre textové
súbory. Spôsob práce uvediem pre každý typ súboru zvlášť.
Textové súbory
Začneme s textovými súbormi, keďže sú asi najjednoduchšie na pochopenie. Ich využitie
nájdeme napr. pri tvorbe textového editora, ukladaní jednoduchých hodnôt do konfiguračného
súboru a pod.
Rewrite(Subor);
program subory;
var
Subor: Text;
riadok: string;
begin
{priradime premennej konkretny subor}
Assign(subor, 'C:\MOJE.TXT');
{otvorime ho na citanie}
Reset(subor);
{kym nie je koniec suboru}
while not Eof(subor) do begin
{precitame riadok zo suboru}
ReadLn(subor, riadok);
{zapiseme riadok na obrazovku}
WriteLn(riadok);
end;
{zatvorime subor}
Close(subor);
end.
Netypované súbory
Používajú sa najmä pri operáciách, kde nás nezaujíma, čo konkrétne je v súbore uložené -
napríklad na kopírovanie súborov.
Spomínané procedúry majú dva parametre. Prvý symbolizuje daný súbor (typ file) a druhý,
celočíselný, udáva veľkosť bloku dát.
Miesto procedúr Read a Write tu používame BlockRead a BlockWrite. Tie majú 3 povinné
parametre - súbor, buffer (ľubovoľná pomocná premenná), počet bytov zabraných bufferom.
Ten zistíme funkciou SizeOf(premenná). Do štvrtého (nepovinného) parametra sa uloží
počet prečítaných / zapísaných záznamov.
Je tu dosť veľa teórie, ale iste viac pochopíte z príkladu - už spomínané kopírovanie súborov:
program kopiruj;
var
zdroj, ciel: File;
{buffer bude pole 512 znakov}
buffer: array[1..512] of char;
precitane: integer;
begin
{zdrojovy subor otvorime na citanie}
Assign(zdroj, 'C:\ZDROJ.BIN');
Reset(zdroj, 1);
{cielovy na pisanie}
Assign(ciel, 'C:\CIEL.BIN');
Rewrite(ciel, 1);
{postupne citame z 1. a zapisujeme do 2. suboru}
repeat
{zo zdroja precitame max. 512 bytov, ulozime
ich do buffera, premenna PRECITANE bude
obsahovat pocet skutocne precitanych bytov}
BlockRead(zdroj, buffer,
SizeOf(buffer), precitane);
{buffer zapiseme do ciela}
{velkost buffera v bytoch = PRECITANE}
BlockWrite(ciel, buffer, precitane);
until precitane = 0;
Close(zdroj);
Close(ciel);
end.
var
subor: file of typ_premennej;
Na otváranie sú určené procedúry Reset a Rewrite (ako pri netypovaných súboroch). Čítanie
a zápis je možný vďaka procedúram Read a Write.
Príklad: Prvý program zapíše do súboru čísla zadané z klávesnice. Po zadaní a zapísaní nuly
sa program ukončí.
program citaj;
var
cislo: integer;
subor: File of integer;
begin
{otvorime a prepiseme subor}
Assign(subor, 'C:\CISLA.BIN');
Rewrite(subor);
repeat
{precitame cislo z klavesnice}
ReadLn(cislo);
{zapiseme ho do suboru}
Write(subor, cislo);
{zadanim nuly sa program ukonci}
until cislo = 0;
Close(subor);
end.
program pis;
var
cislo: integer;
subor: File of integer;
begin
{otvorime subor}
Assign(subor, 'C:\CISLA.BIN');
Reset(subor);
{kym nie je koniec suboru}
while not Eof(subor) do begin
{precitame cislo zo suboru}
Read(subor, cislo);
{vypiseme cislo na obrazovku}
WriteLn(cislo);
end;
Close(subor);
end.
program exist;
var
subor: file;
begin
Assign(subor, 'C:\SKUSKA.BIN');
{vypneme kontolu chyb}
{$I-}
{pokusime sa otvorit subor}
Reset(subor);
{podla hodnoty chyboveho kodu
vypiseme, ci subor existuje}
if IOResult = 0 then
writeln('Subor existuje.')
else
writeln('Subor neexistuje.');
{opat zapneme kontrolu chyb}
{$I+}
end.
Ďalšie operácie
Tu je zopár užitočných procedúr a funkcií:
Semafor
Jednoduchý príklad je obyčajný cestný semafor. Môže nadobúdať tri rôzne hodnoty - červená,
oranžová, zelená. Najskôr si vytvoríme typ TSemafor. Všetky prijateľné hodnoty
vymenujeme v zátvorke, oddeľujeme ich čiarkami. Býva dobrým zvykom dať pred
vymenované názvy 2-3 písmená, v našom prípade „sm“ ako semafor. Zabránime tým
prípadnému opakovaniu názvov, ktoré by mohlo viesť k chybám.
program vym_typ;
type
TSemafor = (smCervena, smOranzova, smZelena);
var
Semafor: TSemafor;
begin
Semafor := smCervena;
if Semafor = smCervena then
writeln('Este nemozete ist!');
end.
Funkcia Ord vráti číselný index hodnoty, ktorú jej dáme ako parameter.
writeln(Ord(smCervena));
Index prvého prvku vymenovaného typu je nula. Príklad teda vypísal nulu.
Funkcia Pred vráti hodnotu, ktorá sa nachádza v rade hneď pred zadaným prvkom. Succ vráti
nasledujúcu možnú hodnotu.
Asi ste si všimli, že premennú vymenovaného typu nemôžeme vypísať. Tak sme aspoň
vypísali jej index.
Funkcia Low vráti prvok s najnižším indexom, High zasa ten s najvyšším.
writeln(Ord(Low(smZelena))); // vypise 0
writeln(Ord(High(TSemafor))); // vypise 2
Ako vidíte, funguje to nielen s premennými, ale i s typmi.
Semafor := smOranzova;
Inc(Semafor);
if Semafor = smZelena then
writeln('Mozete prejst!');
type
TProza = (prPoviedka = 5, prNovela = 10,
prRoman = 15, prIne = 20);
Pri určovaní nového vymenovaného typu nemusíme vždy vypisovať všetky možné hodnoty.
Stačí určiť prvý prvok, napísať dve bodky a posledný prvok.
type
TBeznaProza = prPoviedka..prRoman;
TDvojciferne = 10..99;
var
MalePismeno: 'a'..'z';