Skip to: site menu | section menu | main content
A Pascal programozási nyelv Blaise Pascalról (1623-1692) kapta nevét, aki francia filozófus és matematikus volt. Tehetségéről árulkodik, hogy 19 éves korában egy összeadni és kivonni tudó mechanikus számológépet készített.
N. Wirth 1968-ban definiálta a Pascal nyelvet, melyet főként tudományos műszaki problémák megoldására tervezett. A Turbo Pascal nyelvet a Borland cég fejleszti 1982 óta elsősorban az IBM PC-kre
A program kulcsszóval kezdődik, melyet a program neve követ. A program logikai neve a program azonosítására szolgál. Ezt a nevet más programelem azonosítására nem használhatjuk. A program nevének megadását követően a USES alapszó után sorolhatjuk fel a programban használni kívánt egységeket. Az egység (unit) nem ebben a programban deklarált konstansok, változók, eljárások, függvények gyűjteménye.
Itt deklaráljuk azokat a változókat, amelyekkel a program dolgozni fog. A var (variable=változó) kulcsszó jelzi, hogy változó deklarálása következik. A változót úgy deklaráljuk, hogy neve után kettősponttal elválasztva megadjuk a típusát. A deklarációt pontosvessző zárja. Az ugyanolyan típusú változók deklarációját összevonhatjuk úgy, hogy azok azonosítóit vesszővel elválasztva felsoroljuk. Két különböző változónak nem adhatjuk ugyanazt a nevet.
Ez a végrehajtandó rész. Begin kulcsszóval kezdődik és az end szóval zárul. A program végét az end után álló pont jelzi. A program utasításait a begin és az end közé írjuk. Az utasításokat pontosvesszővel választjuk el egymástól.
Milyen részekből áll egy Pascal nyelvű program?
Mi a szerepe a deklarációs résznek?
Mivel választjuk el az utasításokat egymástól?
Byte | 1 byte | 0..255 |
Shortint | 1 byte | -128..127 |
Word | 2 byte | 0..65535 |
Integer | 2 byte | -32768..32767 |
Longint | 4 byte | -2 31..2 31-1 |
Single | 3+1 byte |
Real | 5+1 byte |
Double | 6+2 byte |
Extended | 7+3 byte |
A real típus megkötések nélkül használható. A többi típus csak numerikus társprocesszorral vagy annak emulálásával léptethető működésbe {$N+, $E+}. Egy osztás eredménye mindig valós típusú!
Műveletek
1 operandusú: + -
2 operandusú: + - * /
összehasonlítások: < > =
Char: értékkészlete az ASCII karakterkészlet. Ebben a típusban a [0..255] intervallumban minden egész számhoz egy karaktert rendelünk. A karakterek 1 bájtot foglalnak el a memóriában.
Műveletek: összehasonlítások a karakterek sorszáma alapján
Függvényei
ord: ASCII-kódot ad vissza
chr: karaktert ad vissza
Azokat az adattípusokat tartalmazza, melyeket a felhasználó hoz létre, azok neveinek felsorolásával. Sorszáma a felsorolásbeli sorszám. A sorszámozás a 0-val kezdődik. A felsorolt nevek nem szerepelhetnek beolvasó vagy kiíró utasításban. Használhatjuk az összehasonlító műveleteket.
pl.: nyelv : (magyar, angol, nemet, francia);
Az intervallumtípus esetén egy már definiált, sorszámozott típus részsorozatát határozzuk meg. MEg kell adni az intervallum alsó és felső határát. Az intervallum elemeinek sorszáma az eredeti típusban levő sorszám.
Műveletei: az eredeti típuson végezhető műveletek
Függvényei: a sorszámozott típusok függvényei
pl.: betu: 'a'..'z';
Kétféle értéket vehet fel: igaz vagy hamis értéket. A hamis (false) sorszáma 0, az igaz (true) sorszáma pedig 1. Tárolása 1 byte-on történik. A logikai műveleteknél (AND, OR, NOT, XOR) az operandusok és az eredmény is logikai típusú.
a) String: karakterlánc, maximális hossza 255 karakter lehet. A karakterlánc elemeire úgy hivatkozunk, mint a tömb elemeire (pl. s[1] az s string első karakterét jelenti). A string 0. eleme a karakterlánc aktuális hosszát tartalmazza.
Műveletei
összefűzés: pl. 'alma'+'fa'='almafa'
összehasonlítás: < > =
Függvényei közül leggyakrabban a length(s) függvénnyel találkozunk, mely az s karakterlánc hosszát adja meg.
b) Array: tömb, azonos típusú elemeket tartalmaz.
Az indextípus a longint kivételével minden sorszámozott típus lehet. Az indextípus gyakran intervallumtípus. Az intervallum első eleme nem lehet nagyobb az utolsó elemnél. Az indexek számát a tömb dimenziójának nevezzük. (Az egydimenziós tömböt vektornak, a kétdimenziós tömböt mátrixnak is nevezzük.) A komponensek a tömb elemei. Az elemtípus a fájltípus kivételével bármilyen típus lehet. Az elemekre indexeikkel hivatkozhatunk. A tömb elemei a memóriában sorfolytonosan foglalnak helyet.
nev: array [indextípus] of elemtípus;
c) Record: rekord, különböző típusú elemek tárolására alkalmas. A rekordon belüli mező-azonosítóknak egyedieknek kell lenniük. Ha azonos nevű változó van a programban, akkor attól megkülönböztethető a rekord ugyanolyan nevű mezője, mert másképp kell rá hivatkozni. A rekord mezőire úgy hivatkozunk, hogy a rekordváltozó neve után ponttal elválasztva írjuk a mező nevét (azonosítóját).
A rekord neve értékadó utasításban is szerepelhet, ha teljesül az értékadás kompatibilitás (a kifejezés bal oldalán álló változóba csak akkor tehetjük a jobb oldal értékét, ha az elfér a változóban).
A mezőlista két részből állhat: fix és változó részből. Ha van változó része a mezőlistának, akkor azt a mezőlista végén helyezzük el.
A változó rekord deklarációjának lényegét a CASE szerkezet adja. Végére ebben az esetben nem kell END, mert a szelektormező minden lehetséges értékét fel kell sorolni.
A WITH utasítás: WITH rekordnev DO utasítás. A DO utáni utasításon belül a program a WITH alapszó után írt rekorddal dolgozik. Így nem kell a rekordnevet ismételgetni a mezőnevek előtt. A WITH utasítás érvényessége a WITH után felsorolt rekordok aktuális értékeire és csak a DO utáni utasításra vonatkozik.
Melyik típusoknál szükséges a numerikus társprocesszor?
Milyen egyszerű típusai vannak a Pascal nyelvnek?
Melyek a Pascal-ban használható összetett típusok?
Mi a különbség a char és a string típusok között?
Mi a különbség és a hasonlóság a tömb és a rekord típus között?
Utasítások egymás utáni végrehajtása.
Kiválasztás. Megvalósításai:
IF feltétel THEN utasítás1 ELSE utasítás2
Ha a feltétel igaz, akkor az utasítás1 végrehajtódik, ha nem igaz, akkor az utasítás2 fog végrehajtódni.
CASE szelektormező OF
Érték1: utasítás1;
Érték2: utasítás2;
...
END;
Ciklus. Megvalósításai:
A ciklusmagot egy előre meghatározott számszor hajtjuk végre.
Pl.: for i := 1 to 10 do writeln('HELLO');
i: ciklusváltozó, csak sorszámozott típusú változó lehet (egész szám, karakter, logikai)
A ciklusváltozó csökkenhet is, ilyenkor a TO helyett a DOWNTO kulcsszót alkalmazzuk.
Az értékhatárokat és a ciklusváltozót a ciklusmagban megváltoztatni tilos!
A program a ciklusba való belépés előtt megvizsgál egy feltételt - ezt belépési feltételnek nevezzük -, és ha ez teljesül, akkor a ciklusmag végrehajtódik, egyébként nem. A ciklusmag ismételten végrehajtódik, amíg a belépési feltétel teljesül. Ha már nem teljesül, akkor a vezérlés a ciklus utáni utasításra kerül.
A WHILE-ciklusnak a végrehajtás feltételét meg kell tudni változtatnia. Ha a feltétel sosem válik hamissá, akkor a ciklusból való kilépés reménytelen. Ilyenkor végtelen ciklusról beszélünk. A feltétel megváltoztatása általában a ciklusmag dolga. Meg kell adnia a lehetőséget, hogy a feltétel hamis is lehessen.
A WHILE-ciklus olyan problémák megoldására való, ahol az induló feltételek határozzák meg a ciklusmag végrehajtásának szükségességét.
Hátultesztelő ciklus esetén a ciklus magja egyszer mindenképpen végrehajtódik, majd a ciklus végén történik egy feltételvizsgálat, ami eldönti, kiléphetünk-e a ciklusból. Ebben az esetben a feltételt kilépési feltételnek nevezzük.
REPEAT
Utasítások
UNTIL feltétel;
A REPEAT és UNTIL kulcsszavak több utasítást is közrefoghatnak, így nem kell azokat utasítás-zárójelbe tenni. Ha a feltétel igazzá (!) válik, kilép a ciklusból.
szekvencia, szelekció, iteráció
Mit jelent a szekvencia?
Milyen megvalósításai vannak a szelekciónak?
Hol találkozunk belépési feltétellel?
Milyen problémák esetén alkalmazzuk a while-ciklust?
Melyik az a vezérlési szerkezet, ahol a ciklusmag egyszer mindenképpen lefut?
write, writeln: kiíró utasítások. A writeln a kiírás végén sort emel. A write és writeln utasításoknak bármennyi paramétere lehet, a paramétereket vesszővel választjuk el egymástól. A paraméterek kifejezések is lehetnek. A paraméter nélküli writeln eljárással sort emelhetünk. Minden paraméter után megadhatjuk, hogy milyen hosszon történjen a kiírás. Ha a megadott hossz nagyobb, mint a kiírandó karakterek száma, akkor jobbra ütköztetés történik. Ha kisebb, akkor a hossz felülbírálódik és kiírja az összes karaktert. Számok esetén egy második hossz is megadható, ez a tizedesjegyek száma.
read, readln: segítségükkel adatokat olvashatunk be a memóriába. Amikor a program vezérlése ehhez az utasításhoz ér, akkor a billentyűzeten leütött karakterek megjelennek a képernyőn, s azokat az Enter leütéséig szerkeszthetjük. Az Enter leütésekor a begépelt karakterek bekerülnek a paraméterként megadott változóba. A begépelt karaktersorozat átmenetileg egy billentyűzet-pufferbe kerül. Itt maximálisan 127 karakter fér el. A readln eljárás a feladat végrehajtása után a pufferben maradt szemetet kitakarítja. A paraméter nélküli readln eljárás vár egy bevitelt, majd üríti a puffert.
billentyűzet-puffer
Milyen kiíró utasítások vannak Pascal-ban?
Mi a különbség a write és a writeln között?
Mi történik, ha a writeln után megadott hossz nagyobb, mint a kiírandó karakterek száma?
Hány karakter fér el a billentyűzet-pufferben?
Mi a szerepe a billentyűzet-puffernek?
Az alprogram egy olyan névvel ellátott utasításblokk, amelyet valamilyen konkrét feladat elvégzésére készítünk. Az alprogramot a program különböző helyeiről a neve segítségével aktivizáljuk, hívjuk. Az alprogram a hívás hatására a benne rögzített feladatot végrehajtja, majd visszaadja a vezérlést a hívó programnak. Alprogramokat akkor célszerű írni, ha
Az alprogramok önmagukban nem használhatók. Egy alprogramot aktivizáló programot meghajtóprogramnak, keretprogramnak vagy hívóprogramnak nevezünk. Azok a programok, amelyek másik programon belül nem használhatók, csak önállóan, főprogramok. Nemcsak főprogram hívhat alprogramokat, hanem alprogram is, sőt alprogram is hívhatja saját magát.
A meghajtóprogram a hívással egy időben információt is átadhat az alprogramnak, amit az alprogram feldolgoz, majd visszatéréskor visszaadhatja a hívóprogramnak. Az információátadást paraméterekkel valósítjuk meg.
Kétféle alprogramot használhatunk a Pascal programnyelvben: eljárásokat és függvényeket.
Az eljárások feladata egy meghatározott, önmagában is értelmes tevékenység elvégzése. Az alprogramot a hívóprogram blokkjában, a deklarációs részben definiáljuk.
A definíció az eljárásfejjel kezdődik. Az eljárásfejet a procedure alapszó vezeti be, majd az eljárás neve, utána - ha vannak - zárójelben a paraméterek leírása következik, melyek az eljárás és a hívóprogram információs kapcsolatát határozzák meg. A definícióban szereplő paramétereket formális paramétereknek nevezzük. A formális paraméterek megadásával jelezzük, hogy az eljárásnak milyen információkat kell kapnia a hívóprogramtól a híváskor, és milyen értékeket juttat vissza a főprogramnak, ha elvégezte feladatát.
Procedure név ( formális paraméterek ) ;
Az eljárásfej után az eljárásblokk következik, amely tartalmazhat deklarációkat. A formális paramétereket nem kell deklarálni. Begin és End között a tevékenység leírása, az eljárástörzs következik.
Az eljárás hívásakor az eljárás nevét adjuk meg, és a formális paraméterek helyébe a hívóprogram-egység objektumait, az aktuális paramétereket helyettesítjük. Az aktuális paraméterek számának, sorrendjének és típusának meg kell egyeznie a formális paraméterekével.
Léteznek paraméter nélküli, érték szerint, illetve cím szerint hívott paraméteres eljárás. A paraméter nélküli eljárások mindig ugyanazt a műveletet végzik. Ha egy paraméter nélküli eljárás működését kívülről szeretnénk vezérelni, akkor globális változókat használhatunk az eljárással való kommunikációra. (Az ilyen eljárások használata kerülendő!)
Az értékszerinti paraméterátadás csak egyirányú kommunikációt tesz lehetővé a hívó program és a hívott eljárás között. Eljáráshíváskor minden egyes aktuális paraméter értéke a paraméterlista azonos helyén álló formális paraméterbe másolódik. A fordítóprogram az eljárás hívásakor ellenőrzi, hogy az aktuális és a formális paraméterek szám, típusa megegyezik-e.
Abban az esetben, ha az eljárásnak nem küldeni akarunk értéket, hanem azt szeretnénk, hogy egy új értéket adjon, akkor változó-paramétereket kell használnunk. Ilyen például a readln(x) eljárás is. Az is előfordulhat, hogy egy változó értékét meg akarjuk változtatni az eljárással - erre az inc(i) a példa. Ilyenkor nem értéket adunk át az eljárásnak, hanem a változó 4 bájtos címét. Példa a cím szerinti paraméterátadásra:
Procedure szoroz(var mit:integer; szorzo:integer);
Begin
Mit:=mit*szorzo;
End;
A függvény nagyon sok dologban hasonlít az eljáráshoz. Szerkezete:
Function nev (paraméterlista) : típusazonosító; (függvény feje)
Var ... (deklarációs rész)
Begin
...
Nev : = kifejezés; (végrehajtó rész)
End;
Amikor egy függvényt meghívunk, ugyanúgy végrehajtódik a függvény blokkja, mint az eljárásnál. A paraméterekre és a lokális változókra ugyanazok a szabályok érvényesek.
Különbség: a függvény mindig visszaad egy értéket. A függvényhivatkozás maga jelenti az értéket, azokat általában kifejezésekben használjuk.
Szabályok:
A függvény blokkjában legalább egyszer mindenképpen szerepelnie kell egy értékadó utasításnak, melynek bal oldalán a függvény neve áll, jobboldalon pedig egy kifejezés. Ekkor kap a függvény értéket.
alprogram, hívó program, eljárás, függvény, formális paraméter, aktuális paraméter, érték szerinti paraméterátadás, cím szerinti paraméterátadás
Mi az alprogramok szerepe?
Mi jellemző az alprogramokra?
Mi a különbség az eljárások és a függvények között?
Milyen összefüggés van a formális és az aktuális paraméterek között?
Mikor kell egy paramétert cím szerint átadni? Hogyan történik ez?
Hogyan kap egy függvény értéket?
Mennyi értéket ad vissza egy függvény?
Milyen típusú lehet a visszaadott érték?