Pascal: príručka programovania
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 dodiv 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álne 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 funkcie
dispose 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éfunkcie
chr 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éfunkcie
abs 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 funkcie
dec 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ťazcami
str 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 funkcie
random funkcia vracia náhodné číslo, ak nie je zadaný parameter funkcia generuje reálne číslo x v rozsahu