PROGRAMOVANIE TURBO PASCAL 7.0
Jazyk TurboPascal firmy Borland International je tak prínosnou a komerčne úspešnouimplementáciou Wirthovho Pascalu, že je možné prehlásiť programátorovuneznalosť tejto implementácie za podobný poklesok, akým je vo všeobecnejrovine neznalosť práce s osobným počítačom vôbec. (Martin Kvoch, Programovanie v Turbo Pascale 6.0, KOPP1992) ProfesorNiklaus Wirth pôsobil v rokoch 1963-1967 na stanfordskej univerzite, potom dvaroky na univerzite v Zürichu. Od roku 1968, už ako profesor informatiky,prednášal na Vysokej škole technickej a na univerzite Zürichu.
Štruktúrapascalovského programu: program ; {direktívyprekladača}
uses knižníc (jednotiek, unitov)>
label návestí>
const konštánt>
type typov>
var premenných>
procedure function užívateľských procedúr a funkcií>
begin hlavného programu>
end. Štruktúra pascalovskéhoprogramu je pevne daná a nie je dovolené prehadzovať jednotlivé časti.V prípade, ak chceme zadeklarovať viac premenných alebo konštánt, stačípoužiť len raz var, alebo const.
Deklaráciajednotiek: napr.:
uses CRT, DOS, GRAPH; Klauzula
uses v programe uvádza zoznam jednotiek (knižníc), ktoré máprekladač prehľadať pri preklade programu, to znamená, že má zmysel uvádzať lentie jednotky, ktorých príkazy program využíva. Všetky pascalovské príkazy súkvôli rýchlosti spracovania rozdelené do skupín - jednotiek. Je rýchlejšieprehľadať zopár jednotiek, ako zoznam všetkých príkazov. Navyše Pascal umožňujevytvárať jednotky vlastné, v ktorých si môžem zadefinovať vlastné príkazy(procedúry a funkcie) a vlastné premenné. Ak môj program používa príkazyurčené pre textovú obrazovku, stačí ak napíšem len
uses crt;. Ak začnem používaťaj grafickú obrazovku, stačí deklaráciu jednotiek zmeniť na
uses crt, graph;.
Deklarácia návestí, sekcia label: napr.:
label 1,2,3; begin ........ goto 5; ........ 5: writeln(’vykonal sa skok na 5’); ........ end.
Návestieje postupnosť číslic 1 až 9999, alebo akýkoľvek identifikátor.. Návestiedefinuje miesto, na ktoré sa vykoná skok príkazom goto.Znamená to asi toľko, že program sa nemusí nutne vykonávať riadok po riadku,ale môžem príkazom goto niektoré riadky vynechať, prípadne ichnechať vykonať viackrát. V Turbo Pascale nie je povolený skok do alebo zbloku. Znamená to, že nie je možný skok do alebo z podprogramu. Skok dozloženého príkazu nie je Pascalom definovaný ako chyba, môže však spôsobiťvážne problémy. Skok je zvodná, ale nebezpečná štruktúra. Ak sa to dá, treba savyvarovať použitiu skokov (i keď niekedy je to riešenie najjednoduchšie).
Deklaráciakonštánt: napr.:
const A = 1; {číselná konštanta} B = 'd'; {znaková konštanta} C = 'retazec'; {reťazcová konštanta}
Konštanta: konštanta je dátovýobjekt, ktorého hodnota sa v priebehu výpočtu nemení. Aj z matematikypoznáme konštanty ako napr.: e=2.72, =3.14 atď.Hodnotu konštanty nie je dovolené v priebehu výpočtu meniť (ak ju predsa chcemzmeniť, namiesto konštanty použijem premennú).
Deklaráciapremenných: napr.:
var a : integer; {premenná a je typu celé číslo} ab : real; {premennáabje typu reálne číslo} c : char; {premennácje typu znak} d : string[15]; {premenná d je typu reťazec maximálnej dĺžky 15znakov}
Premenná: premenná je dátovýobjekt, ktorého hodnota sa v priebehu výpočtu môže meniť. Na rozdiel odmatematiky dovoľuje Pascal používať aj iné ako číselné premenné. Použiť sa dajúaj znakové, reťazcové, dokonca aj nami zadefinované štruktúrované premenné.
Poznámka: meno premennej alebokonštanty (identifikátor, od identifikovať) je postupnosť znakov a čísliczačínajúca znakom. Všeobecne platí, že dva rôzne objekty (premenné, konštanty,procedúry ...) nemôžu používať to isté meno, ten istý identifikátor.
Deklarácia: deklarácia slúži kzavedeniu a pomenovaniu určitých súčastí programu. V časti deklarácií uvádzamzoznam všetkých premenných, konštánt, procedúr, funkcií, ktoré v programepoužívam. Všeobecne platí, že v programe môže použiť len to, čo somzadeklaroval alebo zadefinoval.
Výraz: výraz je operačná štruktúra, pomocouktorej sa vo vyšších programovacích jazykoch popisuje výpočet hodnoty. Výrazommôže byť napr.: (-b-sqrt(d))/(2*a).Každý výraz sa skladá z operátorov (operácií) a operandov. Operátory sú vnašom príklade -,*,/ a operandy sú b,d,a. Pri zápise výrazov je potrebné uvedomiť si priorituoperátorov, napr. a+b*csa vyhodnotí nasledovne: najskôr súčin b*c,ktorý sa potom sčíta s a.Ak chceme najskôr vyhodnotiť sčítanie, musíme náš výraz upraviť nasledovne: (a+b)*c. V tomtoprípade sa vyhodnotí súčet a+b,ktorý sa potom vynásobí hodnotou c.V Pascale (podobne ako v matematike) platí nasledovná priorita operátorov:
| Operátor | Priorita |
Operátory v tom istom riadku | not | najvyššia |
majú rovnakú prioritu. | * / div mod and | |
| + - or xor | |
| = <> <= >= < > in | najnižšia |
+ operáciasčítania
not logická negácia
=,
<>,
<=,
>=,
<,
> operáciarovný,
- operáciaodčítania
and logickéa rôzny,menší alebo rovný, väčší
* operácianásobenia
xor logické buďalebo alebo rovný,menší, väčší
/ operáciadelenia
or logickéalebo
in patriaci do
div celočíselnédelenie
mod zvyšok poceločíselnom delení
Príkaz: jednotlivé výpočtové akcie a ichnáväznosti sa popisujú pomocou príkazov. Pascal rozlišuje dva druhy príkazov:jednoduché a zložené. Jednoduché príkazy sú napr.: a:=1, write(x). Zložené príkazy majúnasledovný tvar: begin príkaz1; príkaz2; ...end. Všimnite si, že teloprogramu tvorí jeden zložený príkaz. Rezervované slová begina endmôžeme chápať ako ľavú a pravú zátvorku. Použitie zloženého príkazu má svojvýznam na miestach, kde Pascal dovoľuje použiť len jeden príkaz.
Rezervované slová: (týmto pojmom saoznačujú slová v Pascale, ktoré majú presne definovanú funkciu a nesmú sapoužiť k iný účelom)
and, case, div,end, goto, or, type, var, const, do, if, not, repeat, string, unit, while,array, downto, for, label, then, until, begin, else, function, mod, program,to, uses, xor. Typ definuje množinu prípustných hodnôt. Aksi zadefinujem premennú atypu integer,množinu prípustných hodnôt tvorí interval celých čísel <-32768,32767>.Žiaden typ nemôže definovať nekonečnú množinu hodnôt. Je to obmedzené hranicamiintervalu, počtom platných číslic alebo jednoducho veľkosťou pamäte počítača.
Štandardnétypy dát: Celočíselnétypy: typ rozsah byte 0..255
shortint -128..127
word 0..65535
integer -32768..32767
longint -2147483648..2147483647Množina operácií: aritmetické:
+,
-,
*,
div, mod relačné:
>,
>=,
<,
<=,
<>,
=(operácia / semnepatrí, dôvodom je fakt, že napr.: výraz 4/2 má v Pascale hodnotu 2.000000000čo je číslo reálne a to aj napriek tomu, že jeho desatinná časť je nulová)
Reáln
e typy: typ rozsah real 2.9*10-39..1.7*1038
single 1.5*10-45..3.4*1038
double 5.0*10-324..1.7*10308
extended 3.4*10-4932..1.1*104932
comp -263+1..263-1Množina operácií: aritmetické:
+,
-,
*,
/ relačné:
>,
>=,
<,
<=,
<>,
= Konverziamedzi typmi INTEGER (int)
a REAL(real)
: a | b | a+b | a-b | a*b | a/b | a div b | a mod b | a >,>=,<,<=,<>,= b |
int | int | int | int | int | real | int | int | boolean |
int | real | real | real | real | real | --- | --- | boolean |
real | int | real | real | real | real | --- | --- | boolean |
real | real | real | real | real | real | --- | --- | boolean |
REAL:= INTEGER - konverzia tohto typu je dovolená INTEGER:= REAL - konverzia tohto typu nie je dovolená
Typ char: premennátypu
char je určená pre prácu soznakmi a obsahuje práve jeden znak v ASCII (American Standard Code forInformation Interchange, zjednodušene sú to všetky znaky, ktoré môžeme napísaťpomocou klávesnice) kóde. Konštanty typu char sú uzavreté medzi apostrofmi, napr.'d', 'D'. Pozor: 'd' <>'D'.
Typ string:premenná typu
string jeurčená pre prácu s reťazcami (postupnosťami) znakov dĺžky 1 až 255. Ak nie jeuvedená dĺžka, predpokladá sa dĺžka 255 znakov.
Konverziamedzi typmi CHAR (chr)
a STRING (str)
: a | b | a+b (zreťazenie) | a > , >= , < , <= , <> , = b |
char | char | string | boolean |
char | string | string | boolean |
string | chrar | string | boolean |
string | string | string | boolean |
STRING:= CHAR - konverzia tohto typu je dovolená CHAR:= STRING - konverzia tohto typu nie je dovolená
Typboolean: premennej typu
boolean môže byť priradená práve jedna z dvoch hodnôt: true(pravda) alebo false (nepravda). Je to logická premenná a používa sa pri prácis logickými premennými.
Význam logických spojok | | Pravdivostná tabuľka logických spojok | |
AND | logická spojka a | | A | B | A and B | A or B | A xor B | NOT(A) |
OR | logická spojka alebo | | T | T | T | T | F | F |
XOR | logická spojka buď alebo | | T | F | F | T | T | F |
NOT | logická negácia | | F | T | F | T | T | T |
| F | F | F | F | F | T |
| | | | | | | | | |
Množina operácií: logické:
AND,
OR,
NOT,
XOR relačné:
>,
>=,
<,
<=,
<>,
= Jednoduché typy pracujú s lineárneusporiadanou množinou znakov M, pre ktoré platí:
a,b Î M =>(a > b) Ú (
a = b) Ú(
a < b) (trichotómia).Na základe tejto vlastnosti sú v Pascale pre jednoduché typy (real nie jejednoduchý typ) definované funkcie
SUCC,PRED, ORD (viď. ordinárne funkcie). Jednoduché typy, pre ktoré súdefinované tieto funkcie, nazývame
ordinárne.
Štandardnéprocedúry a funkcie Pascal-u: Pre všetky procedúry, funkcie apríkazy jazyka Pascal platí, že pred ich použitím v programe je vhodné sipreštudovať nápovedu jazyka Pascal. Všeobecnú nápovedu získame stlačenímklávesu , nápovedu kukonkrétnemu príkazu kombináciou klávesov (stačí sanastaviť kurzorom na príslušné slovo, ktorého nápovedu chceme použiť a stlačiť).
Nasleduje zoznam procedúr a funkcií,rozdelený do jednotlivých kategórií. Pri každej procedúre a funkcii jeuvedený stručný popis jej činnosti a jej deklarácia. V časti deklarácie časti vhranatých zátvorkách [ v týchto ] sú nepovinné. Je dôležité dodržiavať presnúsyntax daných podprogramov (procedúry a funkciesa súhrnne nazývajú podprogramy). Všímajte si počet parametrov a ich typy.
Štandardnéprocedúry a funkciedispose | procedúra uvoľní dynamickú premennú z operačnej pamäti deklarácia: Dispose(var p : pointer) |
exit | procedúra spôsobí návrat z podprogramu (ak je volaná z procedúry alebo funkcie) alebo ukončí program, ak je volaná z hlavného programu deklarácia: Exit |
halt | procedúra ukončí program a vráti riadenie operačnému systému deklarácia: Halt |
new | procedúra vytvára novú dynamickú premennú a nastavuje ukazovateľ tak, aby ukazoval na túto premennú, referenciu (odkaz) na novo vzniknutú premennú možno previesť napr.: pomocou p^ deklarácia: New(var p : pointer) |
Konverznéfunkciechr | funkcia vracia znak, ktorý je reprezentovaný číselnou hodnotou, konvertuje celočíselnú typ na typ char deklarácia: Chr(x : byte) : byte |
ord | funkcia vracia ordinárne číslo špecifikovanej hodnoty ordinárneho typu, konvertuje typ ordinárny na typ integer deklarácia: Ord(x) : longint |
round | funkcia zaokrúhľuje reálne číslo na celočíselnú hodnotu, konvertuje typ real na typ celočíselný deklarácia: Round(x : real) : longint |
trunc | funkcia orezáva desatinnú časť reálneho čísla a získanú hodnotu vracia ako celočíselnú, konvertuje typ real na typ celočíselný deklarácia: Trunc(x : real) : longint |
Aritmetickéfunkcieabs | funkcia vracia absolútnu hodnotu, výsledok je rovnakého typu ako parameter x deklarácia: Abs(x : y) : y |
arctan | funkcia vracia arcustangens (výsledok je v radiánoch) deklarácia: ArcTan(x : real) : real |
cos | funkcia vracia kosínus (argument je v radiánoch) deklarácia: Cos(x : real) : real |
exp | funkcia vracia hodnotu ex deklarácia: Exp(x : real) : real |
frac | funkcia vracia desatinnú časť reálneho argumentu (x-Int(x)) deklarácia: Frac(x : real) : real |
int | funkcia vracia celú časť reálneho argumentu (výsledok je typu real) deklarácia: Int(x : real) : real |
ln | funkcia vracia prirodzený logaritmus argumentu (logaritmus pri základe e=2.718281828) deklarácia: Ln(x : real) : real |
pi | funkcia vracia hodnotu 3.1415926535897932386 () deklarácia: Pi : extended |
sin | funkcia vracia sínus argumentu (argument v radiánoch) deklarácia: Sin(x : real) : real |
sqr | funkcia vracia druhú mocninu argumentu deklarácia: Sqr(x : real) : real |
sqrt | funkcia vracia druhú odmocninu argumentu deklarácia: Sqrt(x : real) : real |
Ordinárne funkciedec | procedúra zmenšuje ordinárnu premennú x o zadaný počet n, ak nie je n zadané, predpokladá sa jeho hodnota 1, platí Dec(x,n) <=> x := x - n deklarácia: Dec(var x [; n : longint]) |
inc | procedúra zväčšuje ordinárnu premennú x o zadaný počet n, ak nie je n zadané, predpokladá sa jeho hodnota 1, platí Inc(x,n) <=> x := x + n deklarácia: Inc(var x [; n : longint]) |
odd | funkcia vracia true ak je celočíselný argument párny, inak vráti false deklarácia: Odd(x : longint) : boolean |
pred | funkcia vracia predchodcu argumentu, ktorý je ordinárneho typu, výsledok je rovnakého typu ako argument deklarácia: Pred(x : ordinal) : ordinal |
succ | funkcia vracia nasledovníka argumentu, ktorý je ordinárneho typu, výsledok je rovnakého typu ako argument deklarácia: Succ(x : ordinal) : ordinal |
Procedúrya funkcie pre prácu s reťazcamistr | procedúra konvertuje numerickú hodnotu na jej reprezentáciu v reťazci znakov deklarácia: Str(x [: dlzka[: desatinne]]; var s : string) |
val | procedúra konvertuje hodnotu typu string do zodpovedajúcej numerickej hodnoty, premenná code je po úspešnom prevedení nastavená na 0, inak ukazuje index znaku, pri ktorom došlo k chybe, premenná v je typu integer alebo real deklarácia: Val(s : string; var v; code : integer) |
Ostatnéprocedúry a funkcierandom | funkcia vracia náhodné číslo, ak nie je zadaný parameter funkcia generuje reálne číslo x v rozsahu 0 x 1, ak je zadaný parameter celočíselného typu, tak generuje celé číslo x z intervalu 0 x n deklarácia: Random(n : word) : word Random : real |
randomize | procedúra inicializuje generátor náhodných čísel deklarácia: Randomize |
Štandardnéprecedúry a funkcie pre súboryassign | procedúra priraďuje meno externého súboru premennej typu súbor deklarácia: Assign(var f : file; meno : string) |
append | procedúra otvára existujúci súbor (pozor, len typu text) pre zápis a nastavuje pozíciu zápisu na koniec súboru deklarácia: Append(var f : text) |
close | procedúra uzatvára otvorený súbor deklarácia: Close(var f : file) |
eof | funkcia nadobudne hodnotu true , ak sa dosiahne koniec súboru, inak je false deklarácia: Eof [(var f : file)] |
eoln | funkcia má hodnotu true, ak je pozícia súboru (pozor, len textový súbor) na znaku konca riadku deklarácia: Eoln [(var f : text)] |
read, readln | procedúra umožňuje načítať hodnotu z textového súboru (z klávesnice), ln umožní prechod na nový riadok v súbore (na obrazovke) deklarácia: Read([var f : text;] v1 [,v2, ...,vn]) deklarácia: Readln[([var f : text;] v1 [,v2, ...,vn])] |
reset | procedúra otvára existujúci súbor pre čítanie deklarácia: Reset(var f : file) |
rewrite | procedúra otvára nový súbor pre zápis, starý maže deklarácia: Rewrite(var f : file) |
write, writeln | procedúra umožňuje zapísať hodnotu do súboru (na obrazovku), ln zapíše aj znak konca riadku (presunie kurzor do nového riadku) deklarácia: Write([var f : text;] v1 [,v2, ...,vn]) deklarácia: Writeln[([var f : text;] v1 [,v2, ...,vn])] |
Procedúrya funkcie jednotky CRT:clreol | procedúra vymaže znaky od kurzora do konca riadku vrátane deklarácia: CleEol |
clrscr | procedúra vymaže obrazovku a kurzor umiestni do ľavého horného rohu, výsledná farba obrazovky je daná nastavením farby pozadia procedúrou TextBackground, ak je na obrazovke okno, týka sa zmena len okna deklarácia: ClrScr |
delay | procedúra pozastaví výpočet na špecifikovaný počet milisekúnd deklarácia: Delay(pocet_milisekund : word) |
delline | procedúra vymaže riadok, na ktorom je kurzor, a zvyšok textu posunie smerom hore deklarácia: DelLine |
gotoxy | procedúra umiestni kurzor na špecifikovanú pozíciu v aktuálnom okne deklarácia: GotoXY(x,y : byte) |
keypressed | funkcia váti true v prípade, že bol stlačený nejaký kláves deklarácia: KeyPressed : boolean |
nosound | procedúra vypína vnútorný tónový generátor, inak zostáva zvukový generátor zapnutý aj po skončení programu deklarácia: NoSound |
readkey | funkcia prečíta znak z klávesnice bez jeho výpisu na obrazovku deklarácia: Readkey : char |
sound | procedúra zapne vnútorný tónový generátor na frekvenciu zadanú parametrom f v Hz deklarácia: Sound(f : byte) |
textbackground | procedúra určí farbu pozadia textu (v rozsahu 0 .. 7), pri použití clrscr sa zmena prevedie v aktuálnom okne, bez clrscr len na práve písaných znakoch deklarácia: TextBackground(farba : byte) |
textcolor | procedúra určuje farbu textu (v rozsahu 0 .. 15) deklarácia: TextColor(farba : byte) |
wherex | funkcia vracia x-ovú súradnicu kurzoru na obrazovke (vzhľadom na aktívne okno) deklarácia: WhereX : byte |
wherey | funkcia vracia y-ovú súradnicu kurzoru na obrazovke (vzhľadom na aktívne okno) deklarácia: WhereY : byte |
window | procedúra definuje textové okno na obrazovke, kde x1, y1 je ľavý horný roh a x2, y2 je pravý dolný roh deklarácia: Window(x1,y1,x2,y2 : word) |
Procedúrya funkcie jednotky GRAPH: Grafický výstup nie je pre Pascalštandardný, preto ho treba zvlášť inicializovať. Môžeme to spraviť postupnosťoupríkazov: detectgraph(gd,gm); initgraph(gd, gm, ’cesta k suborom BGI’) grafická obrazovka je inicializovaná amôžeme používať grafické príkazy closegraph;Keď je inicializovaná grafická obrazovka, nedajúsa použiť napr. príkazy write a read.
bar | procedúra nakreslí obdĺžnik aktuálnym typom výplne a aktuálnou farbou (pozri setfillstyle) deklarácia: Bar(x1,y1,x2,y2 : integer) |
bar3d | procedúra nakreslí 3-rozmerný stĺpec aktuálnym typom výplne (pozri setfillstyle) a aktuálnou farbou (pozri setcolor), ktorého tretí rozmer má veľkosť hĺbka a kreslenie hornej časti povoľuje (zakazuje) hodnota logickej premennej vrchol deklarácia: Bar3D(x1,y1,x2,y2:integer;hlbka:word;vrchol:boolean) |
circle | procedúra nakreslí kružnicu s polomerom r a stredom x,y deklarácia: Circle(x,y : integer; r : word) |
cleardevice | procedúra vymaže grafickú obrazovku deklarácia: ClearDevice |
closegraph | procedúra ukončí prácu v grafickom režime, je potrebné ju uviesť vždy pred ukončením grafického režimu deklarácia: CloseGraph |
detectgraph | procedúra zistí, aký grafický driver a aký grafický režim potrebujeme pre činnosť grafického programu deklarácia: DetectGraph(var gd, dm : integer) |
ellipse | procedúra nakreslí eliptický oblúk so stredom x,y, začiatočným uhlom zu, koncovým uhlom ku, veľkosťou vodorovnej polosi vo a veľkosťou zvislej polosi zo deklarácia: Ellipse(x,y:integer; zu,ku:word; vo,zo:word) |
fillellipse | procedúra nakreslí elipsu so stredom x,y, veľkosťou vodorovnej polosi vo a veľkosťou zvislej polosi zo vyplnenú aktuálnym výplňovým vzorom deklarácia: FillEllipse(x,y:integer; vo,zo:word) |
floodfill | procedúra zaplní ohraničenú oblasť aktuálnym typom výplne, je potrebné zadať bod x,y ležiaci vo vnútri oblasti a farbu hranice uzatvorenej oblasti deklarácia: FloodFill(x,y:integer; farba_hranice:word) |
getx | funkcia vracia x-ovú súradnicu aktuálnej polohy grafického kurzora deklarácia: GetX : integer |
gety | funkcia vracia y-ovú súradnicu aktuálnej polohy grafického kurzora deklarácia: GetY : integer |
initgraph | procedúra inicializuje grafický systém a nastavuje grafický režim (gm) na grafickom adaptéry (gd), pozri detectgraph deklarácia: InitGraph(var gd:integer;var gm:integer;cesta:string) |
line | procedúra nakreslí čiaru ako spojnicu dvoch bodov [x1,y1]a [x2,y2] deklarácia: Line(x1, y2, x2, y2 : integer) |
linerel | procedúra nakreslí čiaru od aktuálnej polohy grafického kurzora do bodu, ktorého súradnice sú dané prírastkom dx v smere osi x a prírastkom dy v smere osi y k aktuálnej pozícií kurzora deklarácia: LineRel(dx, dy : integer) |
lineto | procedúra nakreslí čiaru z pozície aktuálneho kurzora do definovaného bodu [x,y] deklarácia: LineTo(x,y : integer) |
moverel | procedúra posunie grafický kurzor do bodu, ktorého súradnice sú dané prírastkom dx v smere osi x a prírastkom dy v smere osi y k aktuálnej pozícii kurzora deklarácia: MoveRel(dx, dy : integer) |
moveto | procedúra premiestni grafický kurzor na definovanú pozíciu [x,y] deklarácia: MoveTo(x,y : ineteger) |
outtext | procedúra zobrazí textový reťazec na aktuálnu pozíciu grafického kurzora deklarácia: OutText(text : string) |
outtextxy | procedúra zobrazí textový reťazec na definované súradnice [x,y] deklarácia: OutTextXY(x,y : integer; text : string) |
putpixel | procedúra nakreslí na pozícii [x,y] bod zadanej farby deklarácia: PutPixel(x,y : integer; farba : word) |
setcolor | procedúra nastaví farbu pre kreslenie čiar a iných obrazcov deklarácia: SetColor(farba : word) |
setbkcolor | procedúra nastaví farbu pozadia deklarácia: SetColor(farba : word) |
setfillstyle | procedúra nastaví nový výplňový vzor a jeho farbu deklarácia: SetFillColor(vzorka, farba : word) |
settextstyle | procedúra nastaví znakový font, smer písania a koeficient zväčšenia grafického textu deklarácia: SetTextStyle(font:word; smer:word; zvatsenie: word)) |
Štandardnépríkazy PASCALu: Priraďovací príkaz: :=. Realizácioupriraďovacieho príkazu sa priradí premennej na ľavej strane príkazu hodnotavýrazu na pravej strane príkazu. Napr.: príkaz efekt a := 1; hodnotaaje 1 b := 21 - a; hodnotabje 20 c := 'ret' + 'azec'; hodnota c je 'retazec'
Príkaz výstupu: WRITE,
WRITELN (writeln- prechod na nový riadok). Príkaz výstupu zabezpečuje výstup údajov z programuna monitor alebo do súboru.Napr.: (a=2, b=3) príkaz výstupna monitor WRITE(1); 1 WRITE(1,2); 12 WRITE(a,b); 23 WRITE(a,' ',b); 2 3 WRITE('a','b'); ab WRITE('a'+'b'); ab WRITE(a+b); 5 Formátovanie výstupu:Príkaz WRITE má všeobecný tvar WRITE(parameter).Pre parameter sú povolené celkom trirôzne tvary: výstupnýúdaj výstupnýúdaj : počet znakov výstupnýúdaj : počet znakov : počet desatinných miest Napr.: (I=-253, R=345.25, Z='A', B=true)
príkaz: | výstup na monitor |
WRITE(I:4); | - | 2 | 5 | 3 | | | | | |
WRITE(ABS(I):5); | | | 2 | 5 | 3 | | | | |
WRITE(I:2); | - | 2 | 5 | 3 | | | | | |
WRITE(R:8:3); | | 3 | 4 | 5 | . | 2 | 5 | 0 | |
WRITE(R:9); | | 3 | . | 4 | 5 | E | + | 0 | 2 |
WRITE(Z:5); | | | | | A | | | | |
WRITE(B:5); | | t | r | u | e | | | | |
Poznámka: číslo 3.45E+02 je počítačový zápis čisla 3,45 . 102.
Príkaz vstupu: READ,READLN (readln - prechod na nový riadok).Príkazvstupu zabezpečuje vstup údajov z klávesnice alebo zo súboru do programu. Napríklad: príkaz vstupz kláv. efekt READ(a) 23 hodnotaa je 23 READ(a,b,c) 1 aa 3.14 hodnota a je1, b je 'aa' a c je 3.14 Príkaz
IF slúži na podmienené vetvenie programu. To znamená, že vzávislosti od platnosti nejakej podmienky môžeme zmeniť postup výpočtu.Všimnite si program v úvode, kde na základe platnosti (alebo neplatnosti)podmienky D>=0 program nájde dve riešenia kvadratickej rovnice alebovyhlási, že rovnica riešenie nemá. Príkaz IF má dva tvary: príkaz IF úplný(zariadi to, čo sa má spraviť ak podmienka platí a čo sa má spraviť akpodmienka neplatí) a príkaz IF neúplný.(ten zariadi len to, čo sa má spraviť akpodmienka neplatí).
PríkazIF (neúplný): IF podmienka
THEN príkaz; alebo
IF podmienka
THEN BEGINpríkaz1;
príkaz2;
...
príkazn;
END; Príkaz savykoná, resp. príkaz1 až príkazn sa vykoná len v tomprípade, ak podmienka je splnená. Akpodmienka nie je splnená, nevykoná sa ani jeden z uvedených príkazov. Podmienkaje výraz typu boolean (ide teda o logický výraz, ktorý buď platí, aleboneplatí). Napr.: WRITELN(’Zadajvstupne heslo’); READLN(a); IF a ='tajne' THEN WRITELN('Heslo je spravne');
PríkazIF (úplný):
IF podmienka
THEN príkaz1
ELSE príkaz2; alebo
IF podmienka
THEN BEGINpríkaz1;
príkaz2;
... príkazn;
END
ELSE BEGINpríkazn+1;
príkazn+2;
...
príkazk;
END;Príkaz1 sa vykoná, resp. príkaz1 až príkazn sa vykoná len v tomprípade, ak podmienka je splnená. Príkaz2 sa vykoná, resp. príkazn+1 ažpríkazk sa vykoná lenv tom prípade, ak podmienka nieje splnená. Pred ELSE sa ';' nepíše. Nemôže sa stať, aby sa vykonali všetkypríkazy príkaz1 až príkazn a súčasne príkazy príkazn+1 ažpríkazk, alebo aby sa nevykonal ani jedenpríkaz. V tomto prípade by podmienka musela platiť a neplatiť súčasne, čo jevšak nemožné. Napr. WRITELN(’Zadajvstupne heslo’); READLN(a); IF a = 'tajne' THEN WRITELN('Heslo je spravne') ELSEWRITELN('Heslo je nespravne');
Príkaz CASE: Príkaz case umožňuje viacnásobnépodmienené vetvenie programu do niekoľkých alternatív v závislosti na hodnotepremennej alebo výrazu.
CASE premenna
OF Napr.:
WRITELN(’Zadaj znak’); hodnota1 : prikaz1; READLN(a); hodnota2 : prikaz2; CASE a OF ...
’a’..’z’ : WRITELN(’Male pismeno’); hodnotan : prikazn ’A’..’Z’ : WRITELN(’Velke pismeno’);
ELSE prikazn+1; ’0’..’9’: WRITELN(’Cislica’);
END;
’<’ : WRITELN(’Znak mensi’)
ELSE WRITELN(’Iny znak’); END; Príkazi (i je z intervalu<1,n>) sa vykoná len vtedy, ak hodnota premennej je hodnotai. Premennaa hodnotai musia byť rovnakéhoordinárneho typu. V prípade, že hodnota premennejje rôzna od hodonota1 až hodnotan vykoná sa príkazn+1.Vetva
ELSE nie je povinná (ak by smevetvu ELSE vynechali a hodnota premennej bybola rôzna od hodonota1 až hodnotan nevykonalby sa ani jeden z daných príkazov). Premennámusí byť ordinálneho typu (napr. integer, char).
Príkazy cykluPomocoupríkazu cyklu sa predpisuje opakované vykonávanie príkazov alebo postupnostipríkazov (niekedy potrebujeme viackrát opakovať tie isté alebo podobné príkazy,máme v podstate dve možnosti: buď daný príkaz 100 krát opíšeme, alebo vytvorímecyklus a povieme mu, aby príkaz 100 krát zopakoval). Okrem príkazov, ktoré samajú opakovane vykonávať, je súčasťou každého príkazu cyklu aj špecifikácia riadiacatoto opakovanie. Pri príkazoch repeat,resp. whileje táto špecifikácia daná podmienkou (výrazom typu boolean), ktorej splneniealebo nesplnenie znamená opakované vykonávanie cyklu. V príkaze for sa udáva intervalhodnôt ordinárneho typu, pre ktoré sa príkaz postupne vykonáva. Často bývazákladným problémom rozhodnúť sa, ktorý z cyklov použiť. Pomôcť mi môže toto:ak presne viem koľkokrát chcem príkaz opakovať, použijem FOR, ak opakovaniepríkazu závisí od platnosti nejakej podmienky, ale aspoň raz sa zopakovať musí,použijem REPEAT, ak opakovanie príkazu závisí od platnosti nejakej podmienky,ale príkaz se nemusí zopakovať ani raz, použijem WHILE.
Príkazcyklu FOR TO:FOR i := zac_hod
TO konc_hod
DO príkaz; Vprípade,
že zac_hod <= konc_hod sa príkaz vykoná konc_hod - zac_hod + 1 krát.
V opačnom prípade sa prikaz nevykoná. Premenná i sa nazývariadiacou premennou cyklu a je ordinárneho typu (napr. integer, char). Tátopremenná nadobúda počas práce cyklu hodnoty od zac_hod po konc_hod (prikaždom prechode cyklom sa zväčší o 1). Namiesto príkazu môžeme použiť ajzložený príkaz. Napr.: WRITELN(’Zadaj cele cislo’); READLN(cislo); z:=1; k:=10; WRITELN(’Nasobky cisla:’,cislo); FOR i:=z TO k DOWRITELN(i,’*’,cislo,’=’,i*cislo);
Príkazcyklu FOR DOWNTO:FOR i := zac_hod
DOWNTO konc_hod
DO príkaz; Vprípade,
že zac_hod >= konc_hod sa príkaz vykoná zac_hod - konc_hod + 1 krát.
V opačnom prípade sa prikaz nevykoná. Premenná i sa nazývariadiacou premennou cyklu a je ordinárneho typu (napr. integer, char). Tátopremenná nadobúda počas práce cyklu hodnoty od zac_hod po konc_hod (prikaždom prechode cyklom sa zmenší o 1). Napr.: writeln(’Mala anglicka abeceda odzadu:’); z:=’z’; for i:=z downto’a’ do writeln(i,’ ’); Poznámka: Všimnite sirozdiel medzi za ’z’.Zápis: zoznačuje premennú z a zápis: ’z’označuje znak malého písmena z. Hodnotou premennej z je znak ’z’ (premenná z teda musí byť typu char). Ako koncovú hodnotusme nepoužili premennú, ale znak malé písmenko a. PríkazFORbude opakovať len jeden príkaz. Vždy je to prvý príkaz uvedený za rezervovanýmslovom DO.V prípade, ak chceme v cykle opakovať viac ako jeden príkaz, uzatvoríme tietopríkazy medzi rezervované slová begina end.,inými slovammi použijeme zložený príkaz. Príkaz FOR sa nazýva aj príkaz cyklu s pevnýmpočtom opakovaní. Vždy vieme presne povedať, koľko krát sa daný cyklus budeopakovať (pozri vyššie).
Príkazcyklu WHILE: WHILE podmienka
DO prikaz; alebo
WHILE podmienka
DO BEGINprikaz1;
prikaz2;
...
prikazn;
END;Vprípade, že podmienka platí, tak sa prikazresp. prikaz1, prikaz2, ..prikazn bude opakovane vykonávať pri každomprechode cyklom. V prípade, že podmienka neplatí, príkaz while sa ukončí. Telocyklu (príkazy sa slovom DO) musí obsahovať aj príkazy, ktoré majú vplyv naplatnosť podmienky. V opačnom prípade bude vykonávanie cyklu nekonečné. Keďženajskôr sa testuje platnosť podmienky, cyklus sa nemusí zopakovať ani raz(stane sa to v tom prípade, ak podmienka hneď na začiatku neplatí, pozrirepeat). Pretože podmienka je na začiatku, nazýva sa tento cyklus aj cyklus spodmienkou na začiatku. Cyklus WHILE končí, ak podmienka prvýkrát neplatí. Tentoprogram (presnejšie povedané časť programu) vypíše všetky znaky, ktoré sa dajúzobraziť pomocou klávesnice (pozor, niektoré znaky sú neviditeľne, napr.:medzera). Všetky znaky sú zoradené jeden za druhým. Každému z nich je pridelenéporadové číslo. Všetkých znakov je 256 a majú poradové čísla od 0 do 255.Funkcia chr (pozri konverzné funkcie) priradí poradovému číslu znak s týmtoporadovým číslom. Druhý cyklus nikdy neskončí, pretože hodnota premennej i budestále 255, čo je vždy väčšie ako 0. Napr. správne nesprávne writeln(’Vypis ASCIIznakov:’) writeln(’Vypis ASCII znakov:’)i := 255; i:= 255;WHILE i >=0 DO BEGIN WHILEi >= 0 DO BEGIN WRITELN(chr(i)); WRITELN(chr(i)); i :=i - 1; END; END;
Príkazcyklu REPEAT: REPEAT prikaz1; prikaz2; ... prikazn;
UNTIL podmienka; Príkazcyklu REPEAT zabezpečí opakované vykonávanie príkazov prikaz1,prikaz2, ... prikazn.Príkazy sa opakujú, pokiaľ podmienka neplatí.Príkaz cyklu REPEAT skončí, ak podmienka poprvýkrát platí. Telo cyklu musí obsahovať príkazy, ktoré majú vplyv na platnosťpodmienky. V opačnom prípade sa cyklus REPEAT môže opakovať nekonečneveľakrát (bude teda nekonečným cyklom). Keďže najskôr sa vykonajú príkazy prikaz1, prikaz2, ... prikazn a až potom sa testuje platnosť podmienky,vykonajú sa príkazy cyklu vždy aspoň raz (ak sa príkazy cyklu zopakovalipráve raz, nastal prípad, že hneď priprvom testovaní podmienky podmienka platí, pozri while). Cyklus REPEAT sanazýva aj cyklus s podmienku na konci. Všimnite si, že ak chceme v telecyklu zopakovať viac ako jeden príkaz, tak nemusíme použiť begin a end. Tentoalgoritmus zistí, či zadané číslo x je prvočíslo (t.j. také číslo, ktoré mápráve dva rôzne delitele, jedničku a samé seba). Algoritmus skúša deliť číslo xkaždým celým číslom z intervalu <2,>. Na začiatku má premenná je_delitel hodnotu true(predpokladáme, že číslo x je prvočíslo) V prípade, že algoritmus nájde číslo,ktorým je x deliteľné ((x mod delitel)=0), hodnota premennej je_delitel sazmení na false. Cyklus REPEAT skončí ak premenná je_prvočíslo má hodnotu false(not(false)=true) alebo delitel>. Pr.: writeln(’Zadajprirodzene cislo’); readln(x); je_prvocislo:=true; delitel:=2; REPEAT if(x mod delitel)=0 thenje_prvocislo:=false; delitel:=delitel+1; UNTIL not(je_prvocislo)or (delitel>sqrt(x)); ifje_delitel then writeln(’Cislo ’,x,’ je prvocislo’) elsewriteln(’Cislo ’,x,’ nie jeprvocislo’);
Užívateľom definované typy Prispracovaní dát nie vždy vystačíme s typmi premenných (dát), ktoré ponúkaPascal. Navyše údaje, ktoré potrebujeme spracovať, môžu byť rôzne štruktúrované(napríklad informácia o jednom človeku môže byť hodnotou jednej premennej, aletá ako taká sa môže skladať z jeho mena, priezviska, adresy, telefónneho čísla,čísla občianskeho preukazu atď.) a jednoduché pascalovské typy už nestačia.Pascal aj tu ponúka možnosť. Dovoľuje definovať vlastné typy (pozri deklaráciutypov pri štruktúre programu). Základnými metódami štruktúrovania sú
array (pole),
record (záznam),
set(množina) a
postupnosť (súbor).Vybrať správnu štruktúru reprezentovania dát v počítači patrí medzi kľúčovéproblémy programátorského umenia.
Typ pole: Pole je homogénnadátová štruktúra skladajúca sa so zložiek rovnakého typu, ktoré sa vźajomnerozlišujú pomocou indexu. Využíva sa najmä vtedy, ak potrebujeme pomocoupremenných uchovať veľa hodnôt rovnakého typu (mená všetkých ľudí v triede,známky žiakov, záznamy o ľuďoch a pod.). Na sprístupnenie prvku poľa jepotrebné poznať meno celej štruktúry a index (indexom zvyčajne býva interval,alebo viac intervalov) prvku v poli.Popis typu pole (jehodefinícia) má základný tvar:
TYPE meno_pola =
ARRAY[typindexu]
OF typpoložky Týmtosme definovali len typ (len nejakú štruktúru), Aby sme ju mohli aj využívať,potrebujeme si ju sprístupniť. Deklarujeme teda premennú, ktorá bude typu"meno_pola" (všimnite si, že typ meno_pola sme definovali, alepremennú ktorá je typu meno_pola sme deklarovali, definovať znamená slovnevymedziť pojem uvedením jeho základných vlastností a deklarovať znamenávyhlásiť, že v programe použitá premenná má vlastnosti definované v definíciipoľa).Početpoložiek poľa je daný počtom rôznych hodnôt, ktoré patria do typu indexu. Častotým intervalom býva nejaký intervel z typu integer, ale môže to byť ľubovoľnýordinárny typ (znamená to, že hodnoty tohto indexu musia byť usporiadané). Pr.: Nasledovnýpríklad ukazuje praktické využitie typu pole. V prvom riadku definujeme typpole, ktoré má maximálne 20 položiek (pole má jednu nevýhodu, vždy trebadopredu definovať maximálny počet položiek, i keď ich v programe nemusímevyužiť všetky). Ďalej si deklarujeme premennú a, ktorá je typu pole. To čo smezatiaľ vytvorili, vyzerá v reprezentácií počítača asi nasledovne:
premenná a vyzerá takto: | | | | | | | | | | | | | | | | | | | | |
jednotlivé časti sú indexované | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 |
Je zatiaľ prázdne, aledo každého okienka môžeme zapísať jedno celé číslo. V cykle REPEAT sanačítavajú položky pola, pričom po každom načítaní zväčšíme index o 1(inc(index)). Cyklus (načítavanie) skončí ak zadáme nulu, alebo ak bolozadaných 20 čísel (po 20 čísle je hodnota indexu 21). Potom v cykle od 1 do index-1 budepočítač hrať príslušné tóny (sound). TYPEpole=ARRAY[1..20] OF WORD;VAR a:pole;....WRITELN(’Zadavajtony, zadavanie ukonci 0’);index:=1;REPEATreadln(a[index]);INC(index);UNTILa[index]=0 OR index=21;for i:=1 toindex-1 do begin sound(a[index]); delay(200); end;nosound; Predchádzajúcipríklad ukazuje použitie jednorozmerného poľa. Pascal však dovoľuje zadefinovaťaj viacrozmerné pole (v princípe si môžeme zadefinovať n rozmerné pole). Ak kprvkom jednorozmerného poľa sme pristupovali pomocou jedného indexu, tak naprvky dvojrozmerného poľa sa budeme odvolávať pomocou dvoch indexov.Dvojrozmerné pole si môžeme predstaviť ako tabuľku, ktorá má niekoľko stĺpcov (
s) a niekoľko riadkov (
r). V každom okamihu výpočtu môžemepracovať s ľuboľným prvkom poľa (nech je to prvok v stĺpci
i a riadku
j).
| | | x | | | |
| | 1 | 2 | 3 | ... | s |
| 1 | | | | ... | |
| 2 | | | 1 | ... | |
R | 3 | | 5 | | ... | |
| : | : | : | : | | : |
| r | | | | ... | |
Definíciadvojrozmerného poľa môže vyzerať nasledovne: TYPE dpole=ARRAY[1..10,1..10] OFINTEGER;VAR a:dpole; Pripoužívaní dvojrozmerného poľa je potrebné dávať si pozor na to, čo námreprezentuje riadky a čo nám reprezentuje stĺpce. Podľa predchádzajúcehoobrázku platí a[i,j]=5, ale a[j,i]=1 (v tomto prípade platí i=2 a j=3).Načítanie prvkov poľa a ich nasledovný výpis vyzerá nasledovne: writeln(’Zadajpocet stlpcov a riadkov’);readln(s,r);writeln(’Zadavajprvky pola’);for y:=1 to r dobegin for x:=1 to s do read(a[x,y]); readln; end;WRITELN(’Vypisprvkov pola:’);for y:=1 to r dobegin for x:=1 to s do WRITE(a[x,y]); WRITEln; end;
Typ záznam: niekedy potrebujemev počítači reprezentovať údaje, ktoré síce nie sú rovnakého typu, ale istýmspôsobom patria k sebe. Napríklad reprezentácia informácií o ľuďoch. Každýčlovek môže byť reprezentovaný nasledujúcimi údajmi: meno : string[20] priezvisko : string[20] pohlavie : (muz,zena) ak pohlavie=muz takvojna : boolean ak pohlavie=zena takrodena : string[20]Typ záznam,
record, obsahuje definovaný početpoložiek, hovoríme o položkách záznamu. Položky môžu byť rôznych typov. Pridefinícií typu záznam sa musí definovať identifikátor a typ každej premennej.Definícia premenných môže mať aj premenlivú časť. V našom prípade, ak pohlaviemá hodnotu muz, tak záznam obsahuje položku vojna (áno znamená absolvoval, nieznamená že ho to ešte čaká) a ak pohlavie má hodnotu zena, tak záznam obsahujepoložku rodená (meno za slobodna). Všimnite si ešte (ďalej v texte), žečasť záznamu: a.pohlavie,a.vojnanemôžeme načítať priamo, ale pomocou premennej pom. Typ premennej pohlavie je
vymenovaný typ, kde pri deklaráciívymenujeme množinu prípustných hodnôt. type clovek =record meno:string[20]; priezvisko : string[20]; case pohlavie:(muz,zena) of 'muz' : (vojna :boolean); 'zena' : (rodena : string[20]); end;var a :clovek; pom : string;beginwriteln('zadajmeno');readln(a.meno);writeln('zadajpriezvisko');readln(a.priezvisko);writeln('zadajpohlavie');readln(pom);if pom='muz'then begin a.pohlavie := muz; writeln('Absolvoval vojnu'); readln(pom); if pom=’ano’ thena.vojna:=true elsea.vojna:=false; end else begin a.pohlavie := zena; writeln('zadaj rodena'); readln(a.rodena); end;
Typ množina: pascal vie pracovať aj s dátovýmiobjektmi, ktorých hodnoty sú množiny. Typ množina je zložený z ordinárnychtypov. Množina nesmie mať viac ako 255 prvkov. V rámci triedy množina súdefinované množinové a relačné operácie: A+B <=> zjednoteniemnožín A a B A=B <=> rovnosťmnožín A a BA-B <=> rozdielmnožín A a B A<>B <=> nerovnosťmnožín A a BA*B <=> prienikmnožín A a B A<=B <=> Aje podmnožinou B
A>=B <=> Aobsahuje B
xin A <=> prvokx je prvkom AMedzi jednoduchéprípady použitia množín patrí vyjadrovanie podmienok príslušnosti nejakejhodnoty do určitej množiny hodnôt, kde dlhé logické výrazy nahradím relácious operátorom
in.V praxi môžepoužitie množín vyzerať nasledovne: USES crt;TYPE znaky =SET OF char;const velke :znaky = ['A'..'Z']; pismenko : znaky = ['A'..'Z']+['a'..'z']; cislica : znaky = ['0'..'9'];var a : char;beginwriteln('Stlaclubovolny klaves');a:=readkey;if a in velke then writeln('Velkepismenko');if a in pismenko-velke then writeln('Malepismenko');if a in cislica+pismenko then writeln('Cislica,pismenko');end.
Typ súbor: Je síce pekné, akprogram spracuje množstvo dát, vyhodnotí údaje a poskytne výsledky. Ako náhlepočítač vypneme, výsledky sú nenávratne preč. Bolo by teda vhodné mať možnosť,uchovať výsledky aj po vypnutí počítača. A na to sú stvorené súbory, súhrny informáciíuložené na pevnom disku počítača, ktoré sa uchovávajú aj po vypnutí počítača.Turbo Pascalrozpoznáva celkom tri druhy premenných typu súbor (
file). Sú to súbory
s udanýmtypom,
bez udaného typu a súbory
typu text. Ukážme si, ako sa pracujeso súborom s udaným typom a so súborom typu text. Súbor s udaným typom pracujes položkami, ktoré sú všetky rovnakého typu (integer, real, record...). Toznamená, že zápis ale aj čítanie so súbory prebieha vždy po položkách. Takýtosúbor je bez toho aby sme niečo vedeli o type položky v podstate nečitateľný(napr. v Norton Commanderi príkazom F3). Súbor typu text obsahuje textovéinformácie (premenná typu string je definovaná ako array[0..255] of char).Tento súbor sa dá veľmi jednoducho prezerať aj v NC. Nasledujúci programdemonštruje prácu so súbormi: uses crt;var c:file ofinteger; t:text;varcislo:integer; retazec:string; znak : char;beginassign(c,'subor.num');rewrite(c);assign(t,'subor.txt');rewrite(t);repeat writeln('Zadaj cele cislo'); readln(cislo); write(c,cislo); writeln('Dalsi vstup? a/n'); znak := readkey;untilznak='n';repeat writeln('Zadaj text'); readln(retazec); writeln(t,retazec); writeln('Dalsi vstup? a/n'); znak := readkey;untilznak='n';close(t);append(t);writeln(t,'Textna konci suboru');writeln('Pripojeniena koniec suboru');repeat writeln('Zadaj text');readln(retazec); writeln(t,retazec); writeln('Dalsi vstup? a/n'); znak := readkey;untilznak='n';reset(c);reset(t);writeln('Obsahsubor.num:');while noteof(c) do begin read(c,cislo); writeln(cislo); end;writeln('Obsahsubor.txt:');while noteof(t) do begin read(t,znak); write(znak); if eoln(t) then begin readln(t); writeln; end; end;close(t);close(c);end.
PROCEDÚRY a FUNKCIE: každýzložitejší mechanizmus je potrebné riadiť hierarchickým spôsobom. Hierarchiaspočíva v tom, že horné vrstvy (šéfovia, vedúci, velitelia) sa zaoberajúvšeobecnými problémami a informáciami a dolné vrstvy (podriadení, robotníci,vojaci) sa zaoberajú detailmi. Generál vie ako vyhrať boj, ale nie veľmi hozaujíma ako ženista postaví most cez rieku. Jedno však spraviť musí: prikázaťženistovi "
postav_most".Takže, náš generál začal používať príkaz: "
postav_most". Všetko bolo v poriadku až do chvíle, keď samali vojaci preplaviť v mieste, kde tiekli dve rieky. Chudák ženista nevedel naktorej rieke má most postaviť. Uvedomil si to aj generál a zmenil svoj príkazna tvar "
postav_most cez rieku R".Istú dobu to fungovalo, ale občas sklerotický ženista zabudol kde naposledymost staval a tak ho nemohol nájsť a postaviť znova na inom mieste. Generálporozmýšľal a vymyslel príkaz: "
postav_mostna rieke R, most nájdeš na mieste M"., kde M bolo miesto, kde sa mostnaposledy staval. Samozrejme že vždy keď sa postavil most na novom mieste,zmenila sa aj hodnota M, takže generál mal vždy prehľad o tom, kde sa moststaval naposledy. Zdalo sa, že všetko bude v poriadku, ale nebolo to tak. Jerozdiel v tom, či je most postavený na pokojnej malej riečke, alebo naveľkej rýchlo tečúcej rieke. Ak bol most na malej riečke, mohlo cez most prejsťviac vojakov a rýchlejšie. Ak to bola veľká rieka, vojaci museli chodiťopatrne, po jednom, čo značne spomaľovalo presun. Generál preto vydalnariadenie, podľa ktorého príkaz pre stavbu mosta cez rieky znie: "
postav most na rieke R, most nájdeš namieste M, podaj hlásenie ako rýchlo sa vojaci môžu po moste prepravovať, P".Ak ženista dostal tento príkaz, vedel na ktorej rieke (R) má most postaviť,vedel kde bol most postavený naposledy (M), takže ho rýchlo našiel, navyše podal generálovi hlásenie opriepustnosti mosta (P). Ak ženista vykonal príkaz, vedel generál kde jenovopostavený most a akú má priepustnosť. Presne tak to funguje aj vprogramovaní, ale nestaviame mosty a nie je tu generál a ženista, ale počítamehodnoty premenných podľa istých vzťahov, je tu hlavný program a podprogramy,ktoré nazývame
procedúry a
funkcie. Ak by sme chceli generálovepríkazy prepísať do jazyka Pascal mohlo by to vyzerať nasledovne:1 príkaz:
procedurepostav_most ;
2 príkaz:
procedurepostav_most(R); begin begin najdi most; najdi most; presun most; presun most k rieke R; postav most; postav most; end; end; 3 príkaz:
procedurepostav_most(R,var M); begin; chod na miesto M; presun most k rieke R; postav most; zmen hodnotu M; end; 4 príkaz
functionpostav_most(R,var M):P; begin chod na miesto M; presun most k rieke R; postav most; zmen hodnotu M; podaj hlasenie opriepustnosti mosta P; end; Procedúry a funkcie tvoriapostupnosti inštrukcií, ktoré potrebujeme v programe opakovať viackrát a narôznych miestach. Procedúry a funkcie musia byť deklarované v časti deklaráciíprocedúr a funkcií. Po deklarácii môžebyť procedúra alebo funkcia použitá kdekoľvek v nasledujúcom bloku programu.Rozdiel medzi procedúrou a funkciou je v tom, že funkcia vracia hodnotu a môžesa použiť priamo vo výrazoch. Procedúra sa vyvolá príkazom volania procedúry avykoná jednu alebo viac inštrukcií. Všimnite si kapitolu "Štandardnéprocedúry a funkcie Pascalu". Príkazy, ktoré bežne používate, sú procedúrya funkcie, ale už sú dopredu zadeklarované. Nemusíte teda vedieť ako pracujú,ale čo robia. Procedúry a funkcie môžu byť bez parametrov (príkaz 1), sparametrami volanými hodnotou (príkaz 2), s parametrami volanými odkazom(príkaz 3: var M). Samozrejme, že je možná ich ľubovoľná kombinácia. Pr.: Vytvorme opäťprogram, ktorý hľadá korene kvadraticke rovnice, a použime procedúry a funkcie. vara,b,c,d:real;functiondeterminant(kvad,lin,abs:real):real;begindeterminant:=sqr(lin)-4*a*c;end;functionma_riesenie(x:real):boolean;beginifx<0 then ma_riesenie:=false else ma_riesenie:=true;end;procedurekorene(kvad,lin,det:real);varx1,x2:real;beginx1:=(-lin+sqrt(det))/(2*kvad);x2:=(-lin-sqrt(det))/(2*kvad);writeln(’Korenerovnice su: ’,x1,’ ’,x2);end; procedurevstup(var kv,li,ab:real);beginwriteln(’Zadajkoeficienty kvadratickej rovnice: ’);readln(kv,li,ab);end; beginvstup(a,b,c);d:=determinant(a,b,c);ifma_riesenie(d) then korene(a,b,d) else writeln(’Rovnica nemariesenie’);end. Zbierka príkladov: