3. A TURBO PASCAL nyelv elemei Mielőtt megismerkednénk a szabványos Pascal nyelv továbbfejlesztett változa-tával, a Turbo Pascal programozási nyelvvel, először definiálnunk kell a nyelv jelkészletét. A Turbo Pascal az ASCII karakterkészletet használja. Egy karakter egy byte-ban kerül tárolásra. Tekintsük át röviden a bináris és a hexadecimális számok képzését. 3.1. A bináris és a hexadecimális számok A mindennapi életben használt tizes számrendszert a számítógép közvetlenül nem tudja használni, ugyanis a számítógépek úgynevezett logikai áramkörei csak azt tudják megvizsgálni, hogy egy adott helyen (egy adott vezetékben) a feszültség értéke 0 vagy ettől eltérő. Ezt számokkal helyettesítve úgy lehet megfogalmazni, hogy a számítógép azt tudja eldönteni, hogy egy adott érték 0 vagy 1. Azt a számrendszert, amelyik csak ezt a két értéket használja, kettes vagy más néven bináris számrendszernek nevezzük. A bit (binary digit) egy kettes számrendszerbeli számot jelent, melynek az értéke 0 vagy 1 lehet. 8 bit alkot egy byte-ot. A memóriából kiolvasható legkisebb egység a byte. A bináris számrendszerbeli számok tizes (másnéven decimális) számrend- szerbeli értékének kiszámítását egy példán mutatjuk meg. 1 * 27 = 128 0 * 26 = 0 1 * 25 = 32 1 * 24 = 16 0 * 23 = 0 1 * 22 = 4 1 * 21 = 2 1 * 20 = 1 ------- 10110111 - 183 A példából is látható, hogy a bináris szám 1-es helyein lévő kettőhatványnak megfelelő helyiértékeit adtuk össze a decimális érték kiszámításához. A számítógép mindig bináris számokat használ, ez azonban számunkra nagyon kényelmetlen, hiszen például egy tizes számrendszerben ötjegyűként ábrázolt szám 14 - 17 jegyű bináris számot jelent. Keresni kell tehát egy olyan megoldást, amelyiket a számítógép is és mi is viszonylag könnyen kezelünk. Ennél a keresésnél vegyük figyelembe még azt a szempontot, hogy a számítógép felépítése olyan, hogy egyszerre mindig 8 illetve számítógéptől függően 16, 32 vagy 64 bináris számjegyet (másnéven bitet) használ. Az előbbi két szempont figyelembevételével az alkalmazott számábrázolási forma a 16-os, másnéven hexadecimális számrendszer lett. Ez egy eléggé tömör számábrázolás, és könnyen kettes számrendszerbeli számokká alakítható, ugyanis minden hexadecimális számjegynek négy bináris számjegy felel meg, és viszont. A bináris - hexadecimális számok konverzióját ismét egy példán mutatjuk meg. bináris bináris szám értéke szám értéke 8421 8421 ------------- ------------------ 0000 0 1010 A (10) 0001 1 1011 B (11) 0010 2 1100 C (12) 0011 3 1101 D (13) 0100 4 1110 E (14) 0101 5 1111 F (15) 0110 6 0111 7 1000 8 1001 9 1011 0111 = B7 = 11*16 + 7 = 183 B 7 Belátható, hogy egy byte-ba beírható legkisebb szám 0 és a legnagyobb szám az, ha a byte minden bitje 1: 1111 1111 = 128+64+32+16+8+4+2+1 = 255 Tehát egy byte 0-tól 255-ig vehet fel értékeket. Az ASCII karakterkészlet elemei egy byte-ban kerülnek ábrázolásra, mivel egy byte-ban összesen 256 különféle jelkombináció írható, ezért a karakterkészlet 256 elemet tartalmazhat maximálisan. Először ismerkedjünk meg a speciális szimbólumokkal és a foglalt szavakkal, mert ezeknek az ismerete is szükséges a további definíciók megértéséhez. 3.1. A nyelv jelkészlete A Turbo Pascal az ASCII karakterkészletből az alábbi szimbólumokat használja: Betűk - A .. Z és a .. z az angol ABC betűi, Számok - 0 .. 9, Hexadecimális számok - 0 .. 9, A .. F és a .. f, Szóköz (ASCII 32) és az összes ASCII vezérlőkarakter (ASCII 0..31), beleértve a sorvége vagy a return karaktert (ASCII 13). Egyszerű speciális szimbólumok: + - * / = . , : ; ' ^ _ @ $ # < > [ ] ( ) { } A következő karakterpárok szintén speciális szimbólumok: := <= >= <> .. (* *) A speciális szimbólumok tartalmazzák a műveleti jeleket is. Megjegyezzük, hogy helytelen az =<, =>, >< szimbólumok használata. Hibajelzést kapunk akkor is, ha a speciális két szimbólum közé üres helyet teszünk: < = 3.2. A foglalt szavak A foglalt szavak tulajdonképpen a Pascal nyelv utasításai és a deklarációkat bevezető kulcsszavak. A foglalt szavak: absolute end inline procedure type and external interface program unit array file interrupt record until begin for label repeat uses case forward mod set var const function nil shl while div goto not shr with do if of string xor downto implementation or then else in packed to A szabványos Pascal packed kulcsszava a Turbo Pascalban hatástalan. A foglalt szavak a könyv szövegében kiemelve kerülnek kiírásra. A Pascal nem érzékeny a kis- és nagybetűre, így a programban a foglalt szavakat, illetve az utasításokat kis- és nagybetűvel is használhatjuk. A foglalt szavakat azonban más célra nem szabad használni, ilyen nevű azonosítók használata nem megengedett. 3.3. A program sorai A program sorai tartalmazzák az utasításokat, amelyet egyenként részletesen ismertetünk és példákon keresztül bemutatjuk a működésüket. Pascalban az utasítások leírásának nincsenek merev szabályai, mivel egy utasítást több sorban is írhatunk, illetve egy sorban több utasítás is szerepelhet. Az utasítást a ; (pontosvessző) zárja. Kivételt képez a program végét lezáró end utasítás, amely után . (pontot) kell tenni. Mielőtt az utasításokat ismertetnénk, meg kell ismerkednünk az azonosítók fogalmával, különböző típusú számkonstansok ábrázolásával, a műveletek végrehajtásához szükséges operátorokkal és a program működését magyarázó megjegyzésekkel. 3.4. Azonosítók Változóknak, konstansoknak, típusoknak, eljárásoknak, függvényeknek, unit-oknak, programnak és a record-ban szereplő mezőknek is nevet kell adnunk, hogy hivatkozni tudjunk rájuk. Természetesen ezeknek a neveknek egyedieknek kell lennie, ami azt jelenti, hogy nem adhatjuk ugyanazt a nevet például változónak és függvénynek is. Tehát az azonosító azt jelenti, hogy az általunk megadott névvel azonosítjuk a különféle Pascal elemeket. Az azonosítók bármilyen hosszúak lehetnek, de csak az első 63 karaktert veszi figyelembe a fordítóprogram. Megvan a lehetőségünk, hogy olyan hosszú azonosító neveket használjunk, hogy a programjaink olvashatóak legyenek. Ez azt jelenti, hogy a különféle azonosítók nevei utalnak a bennük tárolt tartalomra. Az azonosítók képzésénél nem használhatjuk fel a teljes ASCII készletet, meg kell ismerkednünk tulajdonképpen a névalkotásának szabályaival. Az azonosítónak betűvel vagy _ (aláhúzás) kell kezdődnie és nem tartalmazhat szóközt (space). Betűk, számok és _ (aláhúzás) következhetnek az első karakter után. Hasonlóan a foglalt szavakhoz, az azonosítókban sincs megkülönböztetve a kis- és nagybetű. Azonosítóként a foglalt szavakat nem szabad felhasználni… Az azonosítók helyes használata: a, a1, b1a, hosszu, a_oldal, vektor1 Az alábbi nevek ugyanazt az azonosítót jelentik: a_oldal, A_oldal, A_Oldal, A_OLDAL Hibás azonosítók: a/1, b.23, a-b, a1*s, end mivel / . - * jeleket tartalmaznak illetve nem lehet az end azonosító. 3.5. Számok A számkonstansok lehetnek egész és valós típusúak, illetve decimálisak és hexadecimálisak. Megadásuk a következőképpen történik. Egész típusú szám megadása előjellel (pozitív előjel elhagyható) és az utána következő számjegyekkel történik: 2 -3 +10 1992 Valós típusú szám megadása a következő részekből állhat: előjel egészrész tizedespont törtrész kitevő - 1 . 234 E+02 A kitevőrészben a 10 hatványát az E vagy az e betű jelenti - pozitív előjelű kitevő esetén a pozitív jelet nem kötelező kitenni: -12.56e-5 = -12.56E-5 = -0.0001256 2.3e+3 = 2.3e3 = 2.3E+3 = 2.3E3 = 2300.0 Ha elhagyjuk az előjelet, akkor a szám pozitív lesz. A valós számban a tizedespont és a kitevőrész közül legalább az egyiknek szerepelnie kell, de ugyanez vonatkozik a egész részre és a törtrészre is. Az e betű a kitevőhöz tartozik. -12.5 1.0 0.5 1.34E-3 -2.4e-2 3.56e3 4e5 5E+4 Gyakorlat: 1. Alakítsuk át az alábbi normál alakú számokat tizedes törtté: a. 2.4E3 b. 0.56E-6 c. -12.06E-4 d. -2.345E7 Megoldás: a. 2400 b. 0.00000056 c. -0.001206 d. -23450000.00 2. Az alábbi decimális számokat írjuk át normál alakúra: a. -1240.5 b. 0.00367 c. -0.1254 d. 1.897 Megoldás: a. -1.2405E3 b. 3.67E-3 c. -1.254E-1 d. 1.897E0 Hibásan megadott valós számkonstansok: .5 -.25 .1E+3 12E+3.0 Hexadecimális egész szám a $00000000..$FFFFFFFF határon belül adható meg. A szám előtt álló $ jel jelzi, hogy hexadecimális megadást használunk. 3.6. Sztringek - karaktersorozatok A sztring nulla vagy több karaktert tartalmaz a kiterjesztett ASCII karakter-készletből, amelyeket egy sorba kell írni a programban és '' (aposztrófok) közé kell tenni. Ha a sztring aposztrófot tartalmaz, akkor az aposztrófnak párosan kell szerepelni. Ha a sztring semmit nem tartalmaz az aposztrófok között, azt üres sztringnek nevezzük: '' . A sztring hossza az aposztrófok közötti karakterek számának felel meg: 'ez egy sztring' a hossza 14 karakter. A Turbo Pascal megengedi, hogy a karakter sztring vezérlő karaktereket is tartalmazzon. A # után közvetlenül álló, előjel nélküli egész konstans (0-255 határ között) egy ASCII karaktert jelöl meg. A #10 kocsivissza és a #13 a soremelés egy új sor beiktatását jelenti a karakterek közé. Néhány példa a sztringre: 'Turbo Pascal' 'feladatok' '''' ';' '' #10#13 'első sor'#10#13'második sor' #7#7'csenget'#7#7 3.7. Címkék A címke számokból álló szekvencia (0-9999), a 0 a szám elején hatástalan. A Turbo Pascal-ban megengedett a címke azonosítóval való jelölése. A programban a címke az utasítás megjelölésére szolgál. A címkéket a goto utasításban használjuk. A goto utasítás megszakítja a program végrehaj-tásának folyamatát, és a vezérlés az utasításban megadott címke által kijelölt utasításra adódik át. A címkéket a label kulcsszó mellett kell felsorolni. A Turbo Pascal nyelvben használható címkék: label 12, ide, oda, 99, Vege, vissza; 3.8. Operandusok A kifejezésekben szereplő változókat, konstansokat (számokat, sztringeket, stb) és függvényhívásokat operandusoknak nevezzük. a + b*c/sqr(x)+1.34 A fenti aritmetikai kifejezés operandusai: az a,b,c és x változók, az sqr függvényhívás (négyzetre emelő függvény) és az 1.34 számkonstans. 3.9. Operátorok A kifejezésekben szereplő változókat, konstansokat és függvényhívásokat összekapcsoló műveleti jeleket operátoroknak nevezzük. Operátorok az aritmetikai műveleti jelek (+,-,/,* stb), a logikai műveleti jelek (and, or, stb) és a relációk (<,>,<=, stb.). Az operátorokkal és a műveletek közötti precedenciával későbbiekben részletesen foglalkozunk. a + b*c/sqr(x)+1.34 A fenti aritmetikai kifejezés operátorai: a +. -. *, / aritmetikai műveleti jelek. 3.10. Kifejezések A kifejezések, mint láttuk az operátorok és operandusok sorozatából állnak. Megkülönböztetünk aritmetikai és logikai kifejezéseket. Aritmetikai kifejezés: a+3.2*b x+sin(y) Az aritmetikai kifejezés kiértékelésének eredménye egy számérték. Logikai kifejezés: a > b (x < 2) and (y > 3) A logikai kifejezés kiértékelésének eredménye logikai érték. 3.11. Megjegyzések A program utasításai között bárhol tetszőleges hosszúságú magyarázatot, megjegyzéseket helyezhetünk el. Kétféle módon írhatjuk a megjegyzést: - kapcsos zárójelek között: { a megjegyzés első módja } - kerekzárójelezés és csillagok között: (* a megjegyzés második módja *) A megjegyzéseket egyszeresen egymásba ágyazhatjuk, ha a különböző lezáró karaktereket használjuk: { ez a jó (* megjegyzés megadása *) } { ez így { nincs jól megadva } } (* ez sincs (* jól megadva *) *) A Pascal programban szóközt, a sorvéget és a megjegyzéseket elválasztóként használjuk. Az azonosítók, számok és speciális szimbólumok belseje kivételével bárhol tetszőleges számú elválasztó állhat. A programban a megfelelő helyeken elhelyezett megjegyzések növelik a program olvashatóságát és kényelmessé teszik a program későbbi időpontban történő javítását és módosítását. A megjegyzések jó kiegészítője lehet a programdokumentációnak. Ellenőrző kérdések: 1. Milyen karakterkészletet használ a Turbo Pascal nyelv? 2. Mekkora helyet foglal el egy karakter a memóriában ? 3. Mekkora egy byte-ba beírható maximális szám… 4. Hány elemet tartalmaz az ASCII karakterkészlet? 5. Mi az értéke az alábbi byte-oknak 10-es számrendszerben: 0110 1010 1101 0110 0011 0101 1001 1001 6. Adjuk meg az alábbi byte-ok hexadecimális értékét: 0101 1100 1110 1011 1001 1100 0110 1110 7. Mik azok a foglalt szavak? 8. A foglalt szavak érzékenyek-e a kis- és a nagybetű használatára? 9. Hány utasítást lehet írni egy sorban? 10. Mivel kell lezárni az utasítást? 11. A program végét mivel jelezzük? 12. Mit nevezünk azonosítónak? 13. Válasszuk ki az alábbi azonosítók közül a hibásan megadottakat és mely azonosítók azonosítják ugyanazt a változót: sor, Sor, s-or, SOR, s1r, s/p, t_ir, z*text, ab#1, end, 1a1, sor, SOr, k.1, SoR, m-2, soR, a(1, 14. Sorolja fel a valós típusú számok részeit? 15. Mi a szerepe az E és a e betűknek az alábbi számkonstansokban. Śrja át a számokat tizedestört alakúvá… 1.02E+2 -3.24e-3 2.5E-4 4.5606e4 16. Milyen jellel kezdjük a hexadecimális számokat? 17. Milyen jelek között kell megadni a karaktersorozatot? 18. Mi a '''' string tartalom? 19. Mit jelent karaktersorozatban a #13 ? 20. Mivel azonosíthatjuk a címkéket? 21. Mire szolgálnak a címkék? 22. Mit jelent operandus fogalma? 23. Mit jelent az operátor? 24. Mi a kifejezés? 25. Milyen kifejezéseket ismer? 26. Milyen típusú az alábbi kifejezés? a+b*2+c 27. Milyen típusú az alábbi kifejezés? i < 2 28. Mik a megjegyzés írásának szabályai? 29. Hová helyezhető el megjegyzés? 30. Hová nem szabad megjegyzést elhelyezni? 31. Hogy lehet két megjegyzést egymásba ágyazni? 32. Mi a megjegyzés jelentősége? 33. Adjuk meg az alábbi megjegyzést kétfajta módon: Az adatok beolvasasa.