A Pascal nyelv

A Turbo Pascal 7.0 egy magas szintű programozási nyelv. A nyelv használatához a saját gép, C: meghajtó, Tp mappa, Bin mappa, Tpx futtatható állománya által létrehozható, DOS-os (karakteres képernyő, de egér van) Integrált Fejlesztői Környezet (IDE) áll rendelkezésre.

A Tpx betöltése után a File menü Change dir… parancsával be kell állítani a felhasználó home-könyvtárához rendelt hálózati meghajtót, illetve ezen belül - a már előzőleg létrehozott - Pascal könyvtárat, amelyben a programlistákat és egyéb lemezes állományokat tároljuk.

Megírt programjainkat F2 billentyű segítségével menthetjük lemezre (home-könyvtárba), előzőleg kimentett állományokat F3 billentyű segítségével tölthetjük be.

A programlista szerkesztését a Word szövegszerkesztőben megszokott módon végezhetjük, válthatunk beszúrásos és felülírásos üzemmódok között az INS billentyű segítségével, kijelölhetünk szöveget egérrel vagy billentyűzet SHIFT + nyilak segítségével, CTRL+INS segítségével a kijelölt szöveget lefényképezhetjük, SHIFT+INS segítségével a kurzor helyére beszúrhatjuk.

A programlistát F9 segítségével fordíthatjuk, CTRL+F9 segítségével futtathatjuk.

Fordításnál előforduló gyakori hibaüzenetek:

";" expected (az idézojelbe tett írásjel - ez esetben pontosvessző - hiányzik)

Unknow identifier (ismeretlen azonosító, valamely kulcsszót helytelenül írtunk, vagy valamely változót még nem deklaráltunk)

A Pascal program szerkezete.

(program-fej:)

Program programnev;

Uses Crt, CrtPlus;

(deklarációs rész:)

Label 1;

Const max=100;

Var i,j: byte; (globális változók)

Type rekord= Record

Mezo1: String;

Mezo2: Integer;

End;

Var rek1: rekord;

Procedure proc1;

Var a:byte; (lokális változók)

Procedure alproc1; (lokális eljárás)

Begin

(utasítások)

Edn;

Begin (proc1 végrehajtó része)

(utasítások)

End;

Function func1;

Begin

(utasítások)

func1:=valami;

End;

.

.

.

(főprogram, végrehajtó rész:)

Begin

(utasítások)

End.

A program írásakor használandó lefoglalt szavak és magyarázatuk.

Program : a programlista első szava, jelzi, hogy a lista programot tartalmaz.

Begin : kezdet, mely a főprogram, az eljárások vagy függvények, illetve összetett utasítások kezdetét jelzik.

End. : vége, a főprogram és egyúttal a programlista végét jelzi, a fordító azokat a jeleket, amelyeket ez után írunk, már nem értelmezi.

End; : vége, eljárások, függvények, összetett utasítások, CASE szerkezet, RECORD szerkezet végét jelzi.

Uses : használat, a program futtatásához szükséges UNIT-ok listáját e kulcsszó után kell - vesszővel elválasztva - felsorolni.

Var : változó, a programban használt változókat előre deklarálni kell, meg kell mondani mi a neve és milyen típusú.

Const : konstans deklarációja, név = érték formában.

String : a szöveges változó típusneve.

Array : a tömb típusú változó típusneve.

Label : címke, a feltétel nélküli utasítás címkéje.

Of : tömbelemek típusa, File elemeinek típusa, Case szerkezet része.

In : halmazba tartozás művelete.

Mod : egész osztás maradéka.

Div : egész osztás hányadosa.

Absolute : az abszolút memóriacím megadása előtt alkalmazandó lefoglalt szó.

With : minősítő utasítás, rekord mezőire a rekord neve kiemelése után, rekordnév nélkül hivatkozhatunk. Szintaktikája: With (rekordnév) Do Begin (mezonév1:= ... mezonév2:= ...) End;

Procedure : eljárás, helye a deklarációs részben van, szerkezete a program szerkezetével megegyezik, a főprogramban, eljárásokban és függvényekben tetszőleges sokszor hívható (használható).

Function : függvény, gyakorlatilag olyan, mint az eljárás, csak visszaadott értékkel bír. Hívható eljárásként is, de úgy is, hogy egy értékadó utasítás jobb oldalában használjuk.

 

A program végrehajtási sorrendjét meghatározó struktúrák.

Szekvencia: végrehajtási sorrend, ha a lista értelmezéséből egyéb végrehajtási sorrend nem következik, akkor az utasításokat a gép a beírás sorrendjében, azaz balról jobbra, fentről lefelé haladva, kihagyás nélkül hajtja végre.

Iteráció: ismétlés, azaz a program egy részletét gép nem egyszer, hanem többször, esetleg egyetlen egyszer sem hajtja végre. A Pascal nyelvben három féle iteráció áll rendelkezésünkre.

1.     A For ciklus. Elől tesztelő léptető iteráció. Szintaktikája: For i:=1 To 100 Do +az ismétlendő utasítás. Példánkban az i egy sorszámozott típusú változó (ez esetben egész szám), neve ciklusváltozó, melynek kezdoértéke 1, végértéke 100, és a végrehajtásban értéke egyesével növekszik. Gyakorlatilag az a szerepe, hogy számolja a végrehajtások számát. Természetesen az ismételendő utasításban az i-nek szerepe lehet, értékét viszont átírni nem szabad. A Do hatásköre egyetlen utasítás. Ha több utasításra szeretnék ezt kiterjeszteni, akkor azokat egy összetett utasításba (BeginEnd;-be) kell összefogni. A For ciklust akkor kell használni, amikor előre tudjuk azt, hogy hányszor kell ismételni a ciklus magját (az ismétlendő utasításokat). Ha a kezdő és végértékek úgy jöttek létre, hogy a végérték a kisebb, akkor a For ciklus magja egyetlen egyszer sem hajtódik végre. Ha nagyobb kezdő értéktől kisebb végértékig szeretnénk a ciklusváltozóval haladni (szintén egyesével), akkor a To helyett DownTo-t kell használni. Az így leírt ciklus magja akkor nem fog egyetlen egyszer sem végrehajtódni, ha a kezdoérték kisebb, mint a végérték. A For ciklus az egyik leggyakrabban használt programszerkezet.

2.     A Repeat ciklus. Hátul tesztelő ismétlő eljárás. Szintaktikája: Repeat ... (utasítások) ... Until (logikai kifejezés); Az utasítások mindaddig amig a logikai kifejezés igazzá nem válik, ismétlődik. Mivel a logikai kifejezés vizsgálata az utasítások után van, ezért az utasítások legalább egyszer végrehajtódnak. Ezt az ismétlő eljárást tehát akkor használjuk, ha nem ismert előre, hogy az eljárásokat hányszor kell végrehajtani, de legalább egyszer igen, és az ismétlés befejezéséről a program, vagy a felhasználó (valamilyen beavatkozó szervvel: billentyuzet, egér stb.) gondoskodik.

3.     A While ciklus. Elől tesztelő ismétlő eljárás. Szintaktikája: While (logikai kifejezés) Do (utasítás). Az utasítás mindaddig végrehajtódik, ameddig a logikai kifejezés igaz értékkel bír. Mivel a logikai kifejezés vizsgálata az utasítás előtt megtörténik, lehet, hogy az utasítás egyetlen egyszer sem hajtódik végre, mert lehet, hogy a logikai kifejezés már kezdetben False értékkel bír. Mivel a Do csak egyetlen utasításra vonatkozik, több ismételendő utasítás esetén, azokat egy összetett utasításba kell zárni. Ezt az ismétlő eljárást akkor használjuk, ha nem ismert előre, hogy az eljárásokat hányszor kell végrehajtani, sőt még az is lehetséges, hogy egyetlen egyszer sem, ugyanakkor az ismétlés befejezéséről a program, vagy a felhasználó (valamilyen beavatkozó szervvel: billentyűzet, egér stb.) gondoskodik.

Szelekció: választás vagy elágazás, azaz a program egy részletét a gép egyszer, vagy egyetlen egyszer sem hajtja végre. A végrehajtás vagy logikai értéktől, vagy egy sorszámozott típusú (egész vagy karakter) változó értékétől függ. Lehetőségek:

1.     Az If utasítás. Egyszerű elágazás. Szintaktikája: If (feltétel) Then (utasítás) Else (utasítás). Azaz utasítások végrehajtását egy feltételhez kötjük, vagyis, ha a feltétel igaz, akkor a Then utáni, ha nem akkor az Else utáni utasítás hajtódik végre. Az Else előtt pontosvessző nem állhat. Az egyszerű If szerkezetben az Else hiányzik, így csak egyetlen utásítás végrehajtása függ a feltétel logiakai értékétől: ha igaz akkor végrehajtódik, ha nem igaz a feltétel, akkor nem. Az utasítások helyén több utasítás nem, legfeljebb egy összetett utasítás szerepelhet.

2.     A Case utasítás. Többszörös elágazás. Szintaktikája: Case (szelektor) Of érték1: utasítás; érték2: utasítás; ...; Else utasítás; End;. A szelektor értékétől függően (amely maga valamilyen sorszámozott típusú változó) a felsorolás azon sora (csak egyetlen) hajtódik végre, amelyet a szelektor aktuális értéke kijelöl. Az Else ág használata nem kötelező, ekkor lehet, hogy olyan lesz a szelektor értéke, amely a felsorolásban nem szerepel, ekkor egyetlen utasítást sem hajt végre a szerkezet. Az Else előtt a pontosvessző használata szükséges. Az utasítások helyén több utasítás nem, legfeljebb egy összetett utasítás szerepelhet.

Feltétel nélküli ugró utasítás : a gép feltétel nélkül, egy meghatározott programsorra ugrik, illetve befejezi a program végrehajtását. Lehetőségek:

1.     A GoTo. A programlista bármely helyét címkével láthatjuk el. A GoTo + címke neve - eljáráshívással a program feltétel nélkül a címkével jelölt hely utáni első utasítással folytatódik. A címke után kettőspontot kell írni. A címke nem állhat olyan kulcsszavak között, melynek szintaktikája összetett. Azaz pl. egy For ciklus kulcsszavai között. A GoTo nem illeszkedik a strukturált programozási környezetbe, ezért használatát kerüljük.

2.     Az Exit. Eljárásból vagy függvényből feltétel nélküli kiugrást előidéző eljárás. A gép a program végrehajtását az eljárás vagy függvény hívási helye utáni utasításon folytatja.

3.     A Halt. A program feltétel nélküli befejezését előidéző eljárás. A gép vezérlése visszakerül a programot elindító környezetbe.

 

Változók típusai.

A Pascal nyelvben minden változót a használatba vétel előtt deklarálni kell. Érvényességi kör szerint kétféle változót ismerünk, globálist és lokálist. A globális változót a programlista bármely helyén használhatjuk. A lokálist, melyet eljárásban vagy függvényben deklarálhatunk, csak az adott eljáráson vagy függvényen belül.

Egész típusú változók:

Byte: 0-255 egész szám.

Integer: -32768 - +32767 közötti egész szám.

Longint: kb. -2 milliár - +2 milliárd közötti egész szám.

Word: 0-65535 közötti egész szám.

Valós típusú változók:

Real : valós.

Szöveges típusú változók:

String: 0-255 hosszúságú szöveg.

Char: tetszőleges karakter (pontosan 1 hosszúságú).

Logikai változó:

Boolean : logikai típus, értéke vagy True (igaz) vagy False (hamis).

Strukturált változók:

Array: tömb, indexes változók. Az indexek száma szerint nevezhetjük vektornak (ha egy), mátrixnak (ha kettő) vagy többdimenziós tömbnek (ha kettőnél több az indexek száma). Nagy előnye, hogy egy néven nagyon sok azonos típusú változót tudunk tárolni.

Record: rekord. Olyan változó, amelyben egy adott dolog több különböző típusú jellemzőjét tudjuk tárolni. Az egyes jellemzoknek a neve: mező. A mezők tetszőleges előre deklarált típusok lehetnek. Ha ebből a típusból sok változónk van, akkor használhatunk rekord-tömböt, amely az egyik legbonyolultabb változótípus a Pascal nyelvben.

File típusú változók:

File : háromféle file-típus létezik.

Első a Text, amely szöveges állományt jelöl. A file-ba writeln-el lehet írni, readln-el lehet belőle olvasni (azaz teljes sorokat), hiszen sorokra tagolt a #10#13 karakterekkel.

Második a tipizált, melybe write-al írhatunk és read-al olvashatunk, elemei előre definiált típusú változók, leggyakrabban rekordok. Mivel minden eleme egyenlő hosszú, így az írás és olvasás pozicionálható.

Harmadik a típus nélküli állomány, melynek írása és olvasásakor az értékek értelmezését a programnak (a program írójának) kell végrehajtani. Az írás és olvasás vagy byte-onként, vagy blokkonként történik.

 

Fontosabb eljárások és függvények.

Write : ir, paraméteres eljárás, a konstans paraméter értékét változatlanul, a változót aktuális értékével jeleniti meg. Megengedett több paraméter, melyeket vesszővel kell elválasztani. Ha az első paraméter egy logikai file-név, akkor a logikai file-hoz hozzárendelt lemezes állományba ír. WriteLn alakban az írást követően egy soremelést is végrehajt. Szöveges lemezes állomány irására csak WriteLn használható. Paraméter nélkül soremelést hajt végre.

Read :olvas, paraméteres eljárás, a változó paraméter értékét a beolvasott értékkel tölti. Megengedett több paraméter, melyeket vesszővel kell elválasztani. Ha az első paraméter egy logikai file-név, akkor az olvasás a logikai file-hoz rendelt lemezes állományból történik. ReadLn alakban az olvasás a #10#13 jelig történik, azaz egy teljes sort olvas a szöveges állományból. Mivel a számitógép a billentyűzethez is egy szöveges állományt rendel, igy a billentyűzetről is csak ReadLn-al olvashatunk. Paraméter nélkül lényegében a gép arra vár, hogy a billentyűzeten az Enter billentyűt megnyomjuk.

Readkey : billentyűzet-puffer olvasása, függvény, visszaadott értéke a megnyomott billentyű kódja.

KeyPressed : függvény, logikai visszaadott értékkel, amely True, ha meg volt nyomva a billentyű (azaz a billentyűzet-puffer nem üres), és False egyébként.

ClrScr : képernyőtörlés, eljárás, mely az aktuális képernyőt az aktuális háttérszínnel törli, és feltölti a képernyot #32-es karakterekkel, azaz Space-szel.

GoToXY : kurzor pozicionálása a képernyőn, paraméteres eljárás, két paraméterének a jelentése: X: 1-80 (vízszintes paraméter, oszlopszám), Y: 1-25 (függőleges paraméter, sorszám). Ha a paraméterek hibásan vannak megadva, akkor a program nem ad hibajelzést, csak egyszerűen nem hajtja végre az eljárást.

TextBackGround : szöveg háttérszín, paraméteres eljárás, beállítja a szöveg háttár színét, csak akkor látjuk hatását, ha a beállítást követően írunk, vagy képernyőt törlünk. Megengedett paraméter értékek: 0-7.

TextColor : szövegszín, paraméteres eljárás, beállítja a szöveg színét, csak akkor látjuk hatását, ha a beállítást követően írunk a képernyőre. Megengedett paraméter értékek: 0-15.

Window : ablak, paraméteres eljárás, az aktuális ablakméretet állítja a képernyőn. Négy paramétere: bal felső csúcs X koordinátája, bal felső csúcs Y koordinátája, jobb alsó csúcs X koordinátája és a jobb alsó csúcs Y koordinátája. Az X koordináták (1. és 3.) értéke 1-80 között, az Y koordináták értéke (2. és 4.) 1-25 között kell lenni, valamint az első koordinátának kisebb-egyenlőnek kell lennie a harmadiknál, a másodiknak pedig a negyediknél. Ha a paraméterek hibásan vannak megadva, akkor a program nem ad hibajelzést, csak egyszerűen nem hajtja végre az eljárást.

Chr : karakter előállítása számból, paraméteres függvény, a paraméter értéke 0-255, a visszaadott érték a paraméter értéke által meghatározott ASCII kódú karakter.

Random : véletlen szám előállítása, paraméteres függvény, egész "n" esetén véletlen számot kapunk a [0, n-1] intervallumból. Alkalmazása: először megállapítjuk, hány véletlen számból választunk, majd megállapítjuk, hogy melyik az első szám, amit kapni szeretnénk, és ezt a zárójelen kívül még hozzáadjuk a kapott véletlen értékhez. Ha például [100, 200] intervallumból kellenek véletlen számok, akkor ez: random(101)+100.

Randomize : a véletlen-szám generátor inicializálása, annak érdekében, hogy a véletlen számsor, ne mindig ugyanaz legyen, paraméter nélküli eljárás.

Delay : várakozás, paraméteres eljárás, a paraméter a várakozás időtartama ezred másodpercben.

Sound : hang, paraméteres eljárás, a paraméter a megszólalandó hang frekvenciája.

NoSound : hanggenerátor kikapcsolása, paraméter nélküli eljárás. Ha a hanggenerátort nem kapcsoljuk ki, akkor az a program befejezése után is szól.

Str : számnak stringgé történő átalakítása, kétparaméteres eljárás, első paraméter a szám, második a string, amivé alakítjuk a számot, a második paraméter csak változó lehet.

Val : string-nek számmá történő átalakítása, háromparaméteres eljárás, első paraméter az átalakítandó string, a második az az egész változó, amelybe a szám kerül, harmadik paramétere egy integer tipusú változó, amelyből kiolvasható, hogy milyen sikeres az átalakítás, ugyanis az első át nem alakítható karakter helyét jelzi, ha tehát ez nulla, akkor az átalakítás sikeres.

Lo : alsó byte, paraméteres függvény, a word tipusú paraméter alsó byte-ja a visszaadott érték.

Hi : felső byte, paraméteres függvény, a word tipusú paraméter felso byte-ja a visszaadott érték.

Sqrt : négyzetgyök, paraméteres függvény, a visszaadott érték a paraméter négyzetgyöke.

Sin : sinus, paraméteres függvény, a visszaadott érték a paraméter sinusa, a paraméter a szögérték radiánban kifejezve.

Cos : cosinus, paraméteres függvény, a visszaadott érték a paraméter cosinusa, a paraméter a szögérték radiánban kifejezve.

Pi : pi, a nevezetes szám-konstans, 3.141569…

Length : szöveghossz, paraméteres függvény, a paraméternek mint szövegnek a hossza.

Copy : szövegmásolás, háromparaméteres string-értéku függvény, az első paraméter a forrás string, a második egy szám, mely a másolt string első karakterének helye a forrásban, a harmadik paraméter a másolt karakterek száma.

Ord : sorszám, paraméteres függvény, a paraméter valamely sorszámozott típusú érték, a visszaadott érték a sorszámozott típusú változó sorszáma.

Insert : szövegbeszúrás, háromparaméteres eljárás, az elso paraméter a beszúrandó szöveg, második az a string, amelybe beszúrunk, harmadik paraméter azt adja meg, hogy hányadik helytől kezdve szúrunk be.

Delete : szövegrész törlése, háromparaméteres eljárás, az első paraméter a csonkitandó szöveg, második az első törlendő karakter helye, harmadik a törlendő karakterek száma.

Pos : szövegrész keresése, kétparaméteres függvény, az első az a string amit keresnünk, a második az a string amiben keresünk. A visszaadott érték az a hely, ahonnan kezdve az első string megtalálható a másodikban, ha nem található meg, akkor a visszaadott érték 0.

UpCase : nagybetűs alak, paraméteres függvény, a paraméter egy karakter, a visszaadott szintén, csak mindenképp nagybetűs alakot ad, ha az adott karakternek olyan alakja létezik.

FillChar : karakterekkel való feltöltés, háromparaméteres eljárás, az első egy változó, második egy szám, mely megmutatja, hogy a változó hány byte-ját töltjük fel a harmadik paraméterként megadott karakterrel. Ez lényegében közvetlenül a memóriába ír, a paraméterként átadott memóriahelyére.

SizeOf : változó mérete, paraméteres függvény, a paraméter valamely változó, visszaadott értéke a változó mérete byte-okban.

Inc : növelés, kétparaméteres eljárás, első paraméter az az egész tipusú változó, amelyet növelni szeretnénk, a második paraméter azt mutatja, hogy mennyivel. Egy paraméterrel is hivható, ekkor a növelés eggyel történik.

Dec : csökkentés, kétparaméteres eljárás, első paraméter az az egész tipusú változó, amelyet csökkenteni szeretnénk, a második paraméter azt mutatja, hogy mennyivel. Egy paraméterrel is hivható, ekkor a csökkentés eggyel történik.

Round : kerekítés, paraméteres függvény, paramétere valós, visszaadott értéke egész típusú, a paraméter egészre való kerekítése.

Unitok

Standard Unitok. Az IDE által generált *.EXE állományok nagysága két dologtól függ. Egyrészt attól, hogy milyen hosszú programlistát írunk, másrészt attól, hogy mennyire szerteágazó témakörökből tartalmaz eljárásokat, függvényeket (pl.: képernyőkezelés, lemezkezelés, grafika …). Annak érdekében, hogy a futtatható állomány mérete csak a szükséges méretű legyen, a különböző részterületekhez kapcsolódó eljárásokat és függvényeket egy-egy egységbe (UNIT-ba) helyezték el, melyet a program elején használatba kell venni (Uses kulcsszó). A következő standard unitokat fogjuk használni:

System: az alapvető eljárásokat és függvényeket tartalmazó unit, automatikusan használatba kerül, minden futtatható állományba beszerkesztődik.

Crt: a képernyő és billentyűzet kezelésével kapcsolatos eljárások és függvények.

Dos: dátummal, idővel, lemezkezeléssel kapcsolatos eljárások és függvények.

Printer: nyomtató használatához.

Graph: a pascal két alapvetően különböző képernyőkezelést ismer. Az egyik a karakteres, a másik a grafikus. Alapértelmezésben a képernyő karakteres. A grafikus megjelenítéshez különböző interfész állományokat használhatunk, melyek kiterjesztése *.BGI (Borland Grafikus Interfész). Ezek használata a Graph unit segítségével lehetséges.

A Unit szerkezete:

Unit unitnev;

Interface

Uses unit1,unit2…;

Procedure proc1;

Procedure proc2;

Function func1;

...

Const (globális)

Type (globális)

Var (globális)

Implementation

Procedure proc1;

Begin

End;

Procedure proc2;

Begin

End;

Function func1;

Begin

End;

End.