kategória | ||||||||||
|
||||||||||
|
||
Mûveletek, kifejezések kiértékelése, precedencia szabály. Az értékadó utasítás. Standard beviteli és kiviteli eljárások.
Mûveletek, kifejezések, precedencia szabályok:
A programozási nyelvekben a mûveleteket
(matematikai, logikai, stringmûvelet, stb.) kifejezésekként írjuk le. A
kifejezések operandusokból és operátorokból épülnek fel. Az operandusok
határozzák meg a mûveletben szerplõ értékeket, az operátor(ok)
pedig azt, hogy milyen mûveletet kell végrehajtani az operandusokon. A
kifejezések tartalmazhatnak függvényhívásokat is, amelyek általában
operandusként viselkednek, de befolyásolják a mûveletek végrehajtási
sorrendjét. A kifejezéseket két tulajdonsággal szokták jellemezni: érték és
típus. Minden kifejezésnek van értéke, melyet a kifejezés kiértékelése
(kiszámítása) után tudunk megállapítani. A kifejezés típusa határozza meg, hogy
a kifejezés értéke milyen típusú adat lesz, ennek meghatározásához a kifejezés
értékét nem szükséges meghatározni. A kifejezés típusát a kifejezésben
szereplõ operátorok és operandusok együtt határozzák meg.
A kifejezés kiértékelése a kifejezésben szereplõ összes mûvelet
elvégzését jelenti.
A Pascal operátorokat két csoportra lehet osztani:
- egyoperandusú operátorok
- kétoperandusú operá 212g63c torok
Az egyoperandusú mûveletek esetén mindig az operátor áll elõl, ezt követi az operandus. A kétoperandusú mûveletek esetén az operátor elõtt és után egyaránt áll egy-egy operandus. Az egyoperandusú operátorokat unary, a két operandusú operátorokat binary operátornak is nevezik.
A legegyszerûbb kifejezések egyetlen operátorból és egy vagy két operandusból épülnek fel (operátortól függõen). Ezen mûveletek kiértékelése során semmilyen probléma nem merül fel, a kifejezés kiértékelése balról jobbra haladva történik. Ezeket a kifejezéseket egyszerû kifejezésnek nevezzük. Az összetett kifejezések azonban több operátort és operandust is tartalmazhatnak, azaz a kifejezés kiértékelése során több mûveletet is végre kell hajtani. A kérdés, hogy a mûveleteket milyen sorrendben hajtsuk végre. A mûveletek végrehajtásának sorrendjét a precedencia szabály határozza meg.
A precedencia szabály tehát az összetett kifejezések kiértékelése során maghatározza a mûveletek elvégzésének sorrendjét.
A Pascal nyelv a kifejezések kiértékelése
során a következõ sorrendet követi:
1. zárójelek
2. függvényhívások
3. egyoperandusú operátorok (- + /elõjelek/ @ not ^)
4. multiplikatív operátorok (* / div mod and shl. shr)
5. additív operátorok (+ - or xor)
6. relációk (< <= = < =)
7. balról jobbra haladás szabálya
A fenti szabályok tehát a Pascal nyelv
precedencia szabályai.
A precedencia szabályokat csak akkor lehet alkalmazni, ha egy összetett
kifejezésben szereplõ mûveletek különbözõ precedenciával
rendelkeznek. A precedencia szabályokon kívül fontos még figyelembe venni, hogy
a kfejezések kiértékelése - amennyiben azonos precedenciával rendelkezõ
mûveletekbõl épül fel - balról jobbra haladva történik. Tehát a
precedencia szabályokat három megjegyzéssel kell kiegészíteni:
A zárójelek használatával megváltoztathatjuk a mûveletek kiértékelésének sorrendjét. (Egyes vélemények szerint a zárójelek nem tartoznak a precedencia szabályok közé.)
Ha nem alkalmazunk zárójeleket, akkor elõször a precedencia szabály alapján próbálja meg programunk meghatározni a kifejezés végrehajtási sorrendjét.
Ha a kifejezésben azonos precedenciájú mûveletek szerepelnek, akkor a mûveletek a felírásuk sorrendjében, azaz balról jobbra haladva értékelõdnek ki.
Példákon keresztül:
Zárójelekkel megváltoztatott mûveleti sorrend:
Különbözõ precedenciájú mûveletek kiértékelése:
3+5*9=48 (mivel 5*9=45 és 45+3=48)
A balról jobbra haladás szabálya alapján:
A Pascal nyelv mûveleteit (operátorait) a következõképpen csoportosíthatjuk:
Aritmetikai mûveletek:
+ pozitív
elõjel +a
- negatív
elõjel -a
+
összeadás a+b
-
kivonás a-b
*
szorzás a*b
/
osztás
a/b
mod
maradék a mod b
div
egészosztás a div b
Logikai mûveletek:
not logikai
tagadás not a
and logikai
és
a and b
or logikai
vagy a or b
xor logikai kizáró vagy a xor b
Bitenkénti logikai mûveletek:
not tagadás
bitenként not a
and bitenkénti
és
a and b
or bitenkénti
vagy
a or b
xor bitenkénti kizáró
vagy a xor b
shl biteltolás
balra
a shl b
shr biteltolás
jobbra
a shr b
Összehasonlító (relációs) mûveletek:
=
egyenlõ
a=b
< nem
egyenlõ
a<b
<
kisebb
a<b
nagyobb
ab
<= kisebb vagy
egyenlõ a<=b
= nagyobb vagy
egyenlõ a=b
Halmazmûveletek:
* halmazok
metszete
+ halmazok uniója
- halmazok
különbsége
= halmazok azonossága
< halmazok
különbözõsége
<= részhalmaz (a bal oldali
halmaz részhalmaza a jobb oldalinak)
= részhalmaz (a jobb oldali
halmaz részhalmaza a bal oldalinak)
in
tartalmazásvizsgálat
Az operátorok és operandusok együtt határozzák
meg a kifejezés típusát. Az operandusok típusa többféle lehet, de van néhány
olyan operátor, amely eleve kizárja (a mûvelet jellege miatt) hogy
tetszõleges típusú operandusokat használjunk, ilyen pld. a mod és a div
mûvelet, amely csak egész számok esetén van értelmezve.
Az aritmetikai mûveletek többségénél az operandus(ok) típusa határozza
meg az eredmény típusát. Kivétel az osztás, ahol minden esetben valós típusú
eredményt kapunk. Az egészosztás és a maradékképzés csak egész számok esetén
értelmezett, az eredmény is mindig egész típusú lesz.
A logikai mûveletek eredménye minden esetben logikai típusú lesz, mivel
az operátorok csak logikai típusúak lehetnek.
A bitenként végzett logikai mûveletek segítségével az egész típusú
változók bitjeihez férhetünk hozzá közvetlenül, beállíthatjuk vagy törölhetjük
azokat. A mûveletek bármely egész típus esetében végrehajthatóak.
Az összehasonlító mûveletek segítségével két kifejezés vagy változó
értékét hasonlíthatjuk össze, az eredmény logikai típusú lesz.
A halmazmûveletek esetén az operátorok minden esetben kétoperandusúak, és
egyetlen kivétellel mindig két halmaz áll az operátor két oldalán. Ez a kivétel
a tartalmazásvizsgálat, amikor a bal oldalon egy a halmaz alaptípusával
egyezõ típusú értéknek (változó vagy konstans) kell szerepelnie.
Az értékadó utasítás:
Ahhoz, hogy programunkban késõbb
felhasználhassuk a kifejezés kiértékelése után kapott eredményt, a kifejezés
értékét meg kell õriznünk egy változóban (típusos konstansban). A kifejezések
értékét megõrizhetjük az értékadó utasítás segítségével.
A programban használt változók, típusos konstansok által tárolt értéket az
értékadó utasítás segítségével változtathatjuk meg. Az értékadó utasítás minden
programozási nyelv alapvetõ eleme. A Pascal nyelvben a második
legegyszerûbb utasításként tartják számon - mivel a legegyszerûbb
utasítás az üres utasítás.
Az értékadó utasítás egyik oldalán egy változó (típusos konstans) azonosítója,
a másik oldalán egy kifejezés vagy változó áll. Az értékadó utasítás
végrehajtása után a bal oldalon álló változó felveszi a jobb oldalon álló
kifejezés vagy változó értékét. Az értékadó utasítás során gyakran használunk
konstans kifejezést. Pld:
A:= 5;
A:= C*B;
Az értékadó utasítás során nagyon fontos, hogy az utasítás két oldalán álló változó és kifejezés típusa azonos, de legalább komaptíbilis legyen. Amennyiben a két oldal típusa eltérõ, a fordítás során hibaüzenetet kapunk. A típuskompatibilitás kicsit enyhébb megkötés a típusazonosságnál. A típuskompatibilitás esetei:
A típusok azonosak (pld: Integer - Integer)
Az egyik típus résztartománya a másiknak (pld: Integer - Byte)
Mindkét típus ugyanannak a típusnak a résztartománya (felhasználó által létrehozott típusok esetén)
Mindkét típus halmaz, kompatibilis alaptípussal
Mindkét típus karaktertömb, elemszámuk azonos (pld String[40] - String[40])
Az egyik típus String, a másik karakter (String - Char)
Standard beviteli és kiviteli eljárások:
A standard perifériák a felhasználóval való kapcsolattartás alapvetõ
eszközei.
A Pascal nyelv szabványos eszközök által támogatja ezen perifériák kezelését,
tehát egy-egy beépített eljárás segítségével tudunk a
billentyûzetrõl beolvasni, illetve a képernyõre írni egy
vagy több adatot a programunkból. Az alapértemezett perifériákat kezelõ
eljárásokat a System unit tartalmazza, tehát minden különösebb
elõkészület nélkül használhatjuk õket bármely Pascal programban.
Írás a képernyõre:
A képernyõre íráshoz két eljárást
alkalmazhatunk:
Write(paraméterek);
Writeln(paraméterek);
A két eljárás nagyon hasonlóan mûködik,
de egy lényeges különbséget megfigyelhetünk:
A Write eljárás miután a paraméterlistában felsorolt adatokat kiírta a
képernyõre, a kurzort a kiírás utáni pozícióban hagyja.
A Writeln utasítás ezzel szemben a kiírás után a kurzort a következõ sor
elejére állítja, azaz soremelést végez.
Mindkét eljárás a kurzor aktuális pozíciójában írja ki a paraméterként megadott
adatokat.
Az eljárások paraméterei sokfélék lehetnek.
Mivel standard eljárásokról van szó, úgy alakították ki õket, hogy
lehetõség szerint a legtöbb eredményt, kimeneti információt kezelni
tudják, tehát ezek az eljárások nemcsak szövegek, hanem számok, változók,
kifejezések eredményének kiíratására is alkalmasak (szemben a grafikus felület
hasonló nem standard eljárásaival, amelyek csak szövegek megjelenítésére
alkalmasak).
A Write és Writeln eljárások paraméterlistájában több paramétert is
felsorolhatunk, egymástól vesszõvel elválasztva, a paraméterek típusa
különbözõ lehet. A paraméterlistában szerepelhet:
- Aposztrófok között megadott szöveg (szövegkonstans)
- Változók, konstansok azonosítója
- Aritmetikai kifejezések
- Logikai kifejezések
- Függvényhívások
A szövegek kiírása során nincs semmilyen
probléma, értelemszerûen a megadott szöveg kiírásra kerül, legyen szó
akár szöveges konstansról, akár String vagy Char típusú változóról.
Numerikus értékek esetén az egészek megjelenítése nem okoz problémát. A
lebegõpontos (bocs, valós) értékek esetén az alapértelmezés szerinti
formátum a lebegõpontos forma (azaz a normál alak). Ez a felhasználó
számára elég nehezen emészthetõ, ezért a Pascal lehetõséget
biztosít a lebegõpontos számok formázott (tizedes alakban
történõ) megjelenítésére. Ebben az esetben a megfelelõ változó,
konstans, kifejezés azonosítója után kettõsponttal elválasztva meg kell
adni az összes számjegy számát (mezõszélesség, tizedes és egészrész
együtt), majd újabb kettõspont után a tizedesjegyek számát. A
mezõszélességen belül a numerikus értékek jobbra vannak igazítása.
A logikai kifejezések megjelenítése során a Pascal a logikai kifejezés
értékétõl függõen a TRUE vagy FALSE szöveget jeleníti meg a
képernyõn.
Egy érdekesség, hogy a mezõszélességet
szöveges adatok esetén is alakmazhatjuk. A szöveges adatok a
mezõszélességen belül jobbra vannak igazítva.
Egy példa a fentebb leírtakra: Olvassunk be egy szöget fokban, majd írjuk ki
táblázatos formában a szög szinuszát, koszniuszát, tangensét és kotangensét.
Var Alfa, Rad: Real;
Begin
Write('Kerek egy szoget: ');
Readln(Alfa);
Rad:= Alfa/180*2*Pi;
Writeln;
Writeln;
Writeln(Alfa:5:2, 'sinusa:':15, sin(Rad):8:2);
Writeln(Alfa:5:2, 'koszinusza:':15, cos(Rad):8:2);
Writeln(Alfa:5:2, 'tangense:':15, sin(Rad)/cos(Rad):8:2);
Writeln(Alfa:5:2, 'kotangense:':15, cos(Rad)/sin(Rad):8:2);
Writeln;
End.
A Write és Writeln eljárások összetett típusú
változók, konstansok esetén nem alkalmazhatók!
Olvasás a billentyûzetrõl:
A Turbo Pascal-ban a szabványos bemeneti
periféria a billentyûzet, innen lehet a változók értékét beolvasni.
A billentyûzetrõl való olvasáshoz szintén két eljárást
alkalmazhatunk:
Read(paraméterek);
Readln(paraméterek);
Mindkét eljárás felfüggeszti a program
futását, és megvárja, amíg a felhasználó begépeli a kívánt értéket. A Read és
Readln eljárások csak numerikus és karakteres adatok beolvasására alkalmasak,
az összetett és logikai változók értékét nem lehet billentyûzetrõl
beolvasni.
A két eljárás mûködése között ebben az esetben is megfigyelhetõ a
különbség. A Pascal programok a változók beolvasását két lépésben végzik el.
Elsõ lépésben a billentyûzeten begépelt adatok egy pufferbe
kerülnek, majd az adatbevitel végén (amikor a felhasználó leüti az Enter
billentyût) a puffer tartalma másolódik át a megadott változókba. A Pascal
semmilyen ellenõrzést nem végez arra vonatkozóan, hogy a pufferbe milyen
és mennyi adat kerül. (A puffer maximum 127 byte adatot képes tárolni, stringek
esetén fontos lehet!)
A Read eljárás a pufferbõl kiolvassa a számára szükséges adatokat, és
ezeket törli is a pufferbõl. Ha a felhasználó a szükségesnél több adatot
adott meg, a fel nem használt adatok a pufferben maradnak, és a
következõ Read utasításnál kerülnek felhasználásra. Amikor tehát a Read
eljárást alkalmazzuk, akkor az elõször ellenõrzi a puffer
tartalmát, és csak akkor vár a billentyûzeten történõ begépelésre,
ha a puffer üres. (Számtalan hiba forrása lehet!)
A Readln eljárás is a pufferbõl olvassa ki a szükséges adatokat, és
ezeket törli is. Ha azonban a pufferben felesleges adat is található, az
eljárás a saját adatainak kiolvasása után ezeket is kitörli, azaz kiüríti a
puffert az olvasás után.
Nagyon fontos, hogy sem a Read, sem a Readln
eljárás nem végez semmilyen ellenõrzést a pufferben lévõ
adatokon, azokat kritikátlanul elfogadja. Ha a felhasználó hibásan adta meg a
szükséges adatokat a program mûködésének zavarát okozhatja (szám helyett
szöveg megadása), tehát a program írása során nagyon figyelni kell a beolvasott
adatok helyességének ellenõrzésére.
Találat: 7822