Content extract
SZAKDOLGOZAT A Pascal programozási nyelv bemutatása telefonregiszter elkészítésén keresztül. egy Öveges József Szakképző Iskola és Gimnázium Készítette: Szladovits Viktor műszaki informatikai mérnökasszisztens jelölt 2003. május 23 TARTALOMJEGYZÉK 1. 2. 3. Bevezetés . 3 A programozás alapfogalmai: . 4 Algoritmus-leíró eszközök:. 5 1.1 Folyamatábra. 5 1.2 Struktogramm: . 6 1.3 Jackson jelölés, funkcionális leírás: . 7 1.4 Pszeudokód: . 9 4. Programnyelvek kialakulásának történeti áttekintése: 12 5. A Pascal nyelv általános bemutatása 13 6. A gyakorlati tevékenység részletes leírása 14 6.1 A programkód szerkezeti felbontása és értelmezése . 15 7. A gyakorlati tevékenység összefoglalása 27 2 1. Bevezetés A Pascal programozási nyelvet hivatott bemutatni a szakdolgozatom, egy gyakorlati példán keresztül. Programozást mind szakközépiskolai tanulmányaimban, mind a műszaki informatikai mérnökasszisztens
képzésben tanultam. A Pascal programozási nyelven kívül a c++, a html és a Java programozási nyelvet is tanultuk. Azért választottam ezt a témát, mert annak ellenére, hogy a programozás témakör egy elég sokrétű és szinte megfoghatatlan szelete az informatikának, ha az ember szán elég időt és fáradtságot egy konkrét programozási nyelv – esetemben a Pascal – megismerésére, akkor jelentős eredményeket érhet el. Nagy kihívás volt számomra egy programozási tételt választani szakdolgozatom témájául, de úgy érzem mindent megtettem ahhoz, hogy jól teljesítsem a feladatot, és eleget tegyek a követelményeknek. A szakdolgozatom gyakorlati részének egy telefonregiszter programot választottam, mert ez a program egy általános problémát, a telefonszámok eltárolását oldja meg. A témavezetőm Tóth Lajos Péter tanár úr volt. A szakdolgozatom felépülésének bemutatása: − a programozás alapfogalmai, algoritmusok − a
programnyelvek kialakulásának történeti áttekintése az 50-es évektől kezdve említ meg fontosabb programozási nyelveket, kialakulásuk okait, és jellemző adatokkal is szolgál az egyes nyelveket illetően. − a Pascal nyelv általános jellemzőinek bemutatása. − a gyakorlati rész egy telefonregiszter elkészítése Pascal programozási nyelven, az algoritmus leírása, és részletes magyarázata. − melléklet: a teljes Pascal programkód leírása 3 2. A programozás alapfogalmai: Adat: Egy objektumnak rengeteg mérhető és mérhetetlen tulajdonsága van. Az objektum számunkra fontos tulajdonságait adatnak nevezzük. Ismeret: Az adatok olyan összessége, melyet az ember képes észlelni, érzékelni, felfogni és összefüggéseiben látni. Információ: Új ismeretet tartalmazó adathalmaz. Program: A számítógép számára érthető instrukciók sorozata, mely az adatok megfelelő számításaival és mozgatásaival egy feladat megoldását célozza.
Algoritmus: Egy probléma megoldásának leírása. Elvárások az algoritmusokkal szemben: − Általános legyen, ne csak egy speciális problémára jelentsen problémát − Véges számú lépésben (véges idő alatt) vezessen eredményre − Megfelelő bemenő adatok esetén megfelelő kimenő adatot kell produkálnia. Azonos bemenő adatok esetén azonos kimenő adatokat várunk − Legyen hatékony, megbízható Algoritmus tervezése: − A probléma körültekintő elemzése és megfogalmazása − A megoldási módszer keresése − A feladat specifikáció Moduláris programozás: A feladatot egyszerre nem tudjuk megoldani, ezért modulokra kell bontani. Az egyes részeket meg kell oldani, majd újra össze kell azokat állítani, hogy együtt működhessenek. Irányelvek: − Oszd meg és uralkodj elv − Adatok elrejtésének elve − Döntések elhalasztásának elve − Döntések kimondásának elve − Modulokra bontás iránya 4 Strukturált programozás: −
Szekvencia − Szelekció − Iteráció − Feltétel nélküli ugrás 3. Algoritmus-leíró eszközök: 1.1 Folyamatábra A program dinamikus viselkedésének részletekbe menő ábrázolása T - Tevékenység Adatbevitel T Gyűjtőcsomópont Változó Adatkiírás Program eleje Adatok START Növekményes ciklus Program vége vált:=.tólig Szekvencia STOP Kapcsolódási pont A T A T Döntéscsomópont Igaz Hamis F 5 Egyágú szelekció Kétágú szelekció Igaz Hamis Hamis F F Igaz T T Elöltesztelő, T Hátultesztelő ciklus Hamis T F Hamis Igaz F T Igaz 1.2 Struktogramm: Szekvencia Tevékenység Tevékenység Szelekciók Egyágú Kétágú Feltétel Igen Feltétel Igen Tevékenység(ek) Tevékenység(ek) Nem Tevékenység(ek) Többágú 6 Feltétel Feltétel1 Feltétel2 Tevékenység(ek) Tevékenység(ek) Esetválasztás Egyébként Egyébként Eset1 Eset2 Tevékenység(ek) Tevékenység(ek) Ciklusok Elöltesztelő
Hátultesztelő Feltétel Ciklusmag Feltétel Ciklusmag Növekményes Ciklusváltozó=tólig Ciklusmag 1.3 Jackson jelölés, funkcionális leírás: Szekvencia Funkcionális leírás A B C A seq B C A end 7 Szelekciók Egyágú Funkcionális leírás A F B A select F B A end Kétágú Funkcionális leírás A F B C A select F B A OR (NOT F) C A end Iterációk Elöltesztelő Hátultesztelő Funkcionális leírás A F B * A iter while F B A end A B * F 8 1.4 Pszeudokód: Mondatszerűen írja le a program algoritmusát. Bevitel, kivitel: Be: felsorolás[megszorítások] Ki: felsorolás[kiírási formák] Szekvencia: tevékenység1 tevékenység2 tevékenység3 tevékenység1: tevékenység2 Szelekciók: Egyágú szelekció: Ha feltétel akkor tevékenység(ek) Elágazás vége Kétágú szelekció: Ha feltétel akkor tevékenység(ek)1 egyébként tevékenység(ek)2 Elágazás vége 9 Többágú szelekció: Elágazás feltétel1 esetén
tevékenység(ek)1 feltétel2 esetén tevékenység(ek)2 feltételn esetén tevékenység(ek)n egyéb esetben tevékenység(ek)n+1 Elágazás vége Ciklusok: Elöltesztelő ciklus: Ciklus amíg Feltétel Tevékenység(ek) Ciklus vége Hátultesztelő ciklus: Ciklus Tevékenység(ek) Mígnem Feltétel Ciklus vége Növekményes ciklus: Ciklusváltozó = tól-ig Tevékenység(ek) Ciklus vége 10 Program, eljárás, függvény Program Tevékenység(ek) Program vége Eljárás eljárásnév(formális paraméterlista): Tevékenység(ek) Eljárás vége Függvény függvénynév(formális paraméterlista): típus Tevékenység(ek) Függvénynév := kifejezés Függvény vége 11 4. Programnyelvek kialakulásának történeti áttekintése: 50-es évek: Magas szintű programozási nyelvek megjelenése FORTRAN: Az IBM készítette kimondottan tudományos műszaki területre, számításokra. COBOL: Az IBM készítette az Amerikai Hadügyminisztérium felkérésére, pénzügyi
területekre, erőssége az adat és szövegfeldolgozás. 60-as évek: ALGOL60: Eleve tervezett, matematikailag konstruált nyelv, tudományos műszaki területekre. LISP: Dekleratív nyelv, az ALGOL tervezési szempontjainak tagadására jött létre PL1: Az IBM készítette univerzális programozási nyelv, az eddigi feladatok mellett, rendszerprogramozásra is alkalmasnak, de itt nem terjedt el. Bonyolult nyelv 70-es évek: PASCAL: Wirth készítette ALGOL verzió, a strukturális programozási elvet megvalósító eszköz. PROLOG: Dekleratív nyelv. 80-as évek: ADA: Az Amerikai Hadügyminisztérium kívánságlistáját megvalósító csúcsnyelv 90-es évek: C: Első magas szintű nyelv, amit valóban használtak rendszerprogramozásra is JAVA: Tisztán objektumorientált nyelv, a 90-es évek nyelve 12 5. A Pascal nyelv általános bemutatása A pascal nyelv (nyelvcsalád) fejlesztésének alap koncepciója egy magasszintű programozási nyelv kifejlesztését célozta.
Fontos szempontként jelentkezett, hogy a nyelvhez viszonylag "könnyű" legyen a fordítóprogramot elkészíteni. Ezen cél alapján az azonosítóknak a fordítási időben ki kell derülniük. Ez eredményezi, hogy a pascal az erősen típusos nyelvek közé tartozik. A fordító a típusok egyezőségét a típust azonosító név alapján egyezteti és minden eltérés esetén üzenetet küld. Még akkor is, ha a típus szerkezete egyébként megegyezik. Hasonlóképpen a hivatkozott eljárás, ill. Függvényazonosítóknak is a hívás pillanatában ismertnek kell lennie. A nyelv nem támogatja a tömbök dinamikus kezelését sem. A tömbök maximális méretének is fordítási időben kell kiderülnie. A nyelv fordító programja .exe fájl előállítását teszi lehetővé, tehát a fordítást és szerkesztést is elvégzi. A nyelv magasszintű, általános problémák megoldását biztosítja. Korszerű változatai lehetőséget biztosítanak összetett
algoritmikus feladatok kezelésére is. Pl rekurzió, közvetlen memóriakezelés, vagy objektum orientált feladatmegoldás is lehetséges. A memóriakezelése az elkészült programnak dinamikus. Vagyis szükség szerint foglal le memória helyet, illetve ha nincs a helyre további szükség, fel is szabadítja azt. A hely és memória szükségletet csökkentendő, és a programozó szabadságát növelendő csak kevés a foglalt szavak száma (kb. 5060) Hogy ne keljen mégsem a programozónak minden feladatrészt magának megírnia a gyakori feladatokra előre elkészített eljárások, függvények, illetve típusok a nyelvfejlesztők által definiálva lettek. Ezek egyes csoportjait külön állományokba rendezték. Használatukhoz ezekre külön kell hivatkozni rájuk 13 6. A gyakorlati tevékenység részletes leírása A Pascal programozási nyelven írt programot Turbo Pascal 7.0 szoftverrel készítettem el. A program forráskódja a Telpas, amit a Pascal programban
írtam, a Tel.exe maga a program, amit futtatunk, ezt a Pascal program állítja elő. A programot úgy készítettem el, hogy programot átírtam, amelyet még régebben kellett egy iskolai feladatként beadni. Nem a program megírását elemzem, hanem a megírt program forráskódját bontom szét, apró alkotóelemeire és azáltal magyarázom meg a működését, hogy szinte minden sorának jelentését konkrétan leírom. De mielőtt a programot a benne szereplő eljárásokra bontva elemezném, a programot forráskód szempontjából globálisan nézve felhívnám pár érdekességre a figyelmet. A programban indokolatlanul sokszor szerepel a textcolor és a textbackground. Ez azért van, ha valaki át akarja írni a programban, például a menü vagy a szöveg színét, akkor egyszerűen megteheti. Én mindenhol a szöveget pirosnak és a hátteret feketének adtam meg, de a háttér és a szöveg színe bárhol tetszőlegesen változtatható a textcolor vagy a textbackground
utáni zárójelbe írt szám átírásával. A programban szerepel fordítási direktíva (ami kapcsoló direktíva). A fordítási direktívák speciális szintaxissal bíró megjegyzések. Egy $ jellel kezdődnek, amelyet az adott direktíva neve követ. A kapcsoló direktívák fordítási opciókat kapcsolnak be ill. ki attól függően, hogy a direktíva nevét + vagy - követi A{$I-} direktíva megtiltja az I/O műveletek eredményének vizsgálatát a {$I+} pedig engedélyezi. Ha be van kapcsolva, I/O hiba esetén a futás véget ér egy hibaüzenettel, ellenkező esetben magunknak kell megvizsgálni az eredményt ioresult fügvénnyel. 14 6.1 A programkód szerkezeti felbontása és értelmezése program telefonregiszter; uses crt,windos; type Tadat=record nev:string[30]; tel:string[25]; varos:string[25]; cim:string[25]; megj:string[20]; end; var ms,ss:word; key:char; f:file of Tadat; i:integer; adb:string; A programfej a program nevét és paramétereit határozza meg.
Semmi jelentősége a programra nézve. A uses az aktuális program vagy unit által használatos unitok nevét sorolja fel. Ahhoz, hogy a fordító biztosan megtalálja a lemezen, a unitot, az szükséges, hogy a file neve megegyezzen, a unit nevével és a .TPU kiterjesztést viselje A unit konstansok, adattípusok, változók, eljárások és függvények gyűjteménye. Külön vannak lefordítva és mindegyik használható más programból. A program a cls és a windos unitokat használja. A type sor egy típusdefiníció, egy azonosítót határoz meg, amely egy típust jelöl. A type Tadat=record azt jelenti, hogy a Tadat változó record típusú. A record tetszőleges számú, különböző típusú mezőkből állhat. A nev, tel, varos, cím, megj, mind string azaz szöveg típusúak. A []-be tett számok az eltárolható karakterek számát jelentik. A tel azért 25 karakter hosszúságú, mert így két telefonszám is eltárolható elválasztó karakterrel vagy szóközzel
együtt. Az end az adattípus végét jelenti jelen esetben. A var változóparaméter meghatározására használatos. Az ms és ss változó word azaz szó típusú, a key változó char, azaz karakter típusú, ezt ASCII karakterek beolvasására használjuk. f: file of Tadat azt jelenti, hogy a Tadat rekord típusú file. Az i változó integer azaz egész szám típusú. Az adb változó pedig szintén string, szöveg típusú Fontos a programban szereplő változókat még használatuk előtt 15 definiálni, mert különben a program hibát jelez. Nagyon fontos a sorok végén szereplő ; is, mert a hiánya is hibajelzést eredményez. procedure cls; begin textbackground(0);clrscr; textcolor(4);gotoxy(1,25); gotoxy(33,1);write(Telefonregiszter); gotoxy(26,2);write(Készítette: Szladovits Viktor); gotoxy(2,25);write(Aktív adatbázis:); textcolor(4);gotoxy(19,25);write(adb); end; A procedure egy eljárásdefinició, amire a későbbiek során hivatkozni fogunk. Az
eljárásokra is igaz az, hogy meg kell határoznunk őket (meg kell írni), mielőtt hivatkozunk rájuk, mert különben hibás lesz a program. Itt azt is fontosnak tartom megjegyezni, hogy az is hibát jelent, ha egy eljárás, amire hivatkozunk, a hivatkozás után van megírva, ezért nem mindegy az eljárások sorrendje. Minden eljárásnak van egy azonosítója (ez alapján tudunk hivatkozni rá), begin sorral kezdődnek (; nélkül!) és end sorral végződnek. Ez az eljárás a képernyőtörléssel (clrscr) kezdődik, utána a write paranccsal kiírja az utána lévő záró-és idézőjelben szereplő kifejezést, a kiiratásoknál a (’ ’) is fontos, mert különben itt is hibajelzésbe ütközünk. A gotoxy kifejezés a kiírandó szöveg képernyőn elhelyezkedő szöveg első karakterének helyét határozza meg xy koordinátarendszerhez hasonló módon. A zárójelben lévő első szám az x koordináta, amellyel a balra tolást a másodikkal, az y-nal pedig a lefelé
tolást oldjuk meg. procedure ora; var h,m,s,s2:word; begin gettime(h,m,s,s2); if (ms<>m) or (ss<>s) then begin ms:=m;ss:=s; textcolor(4);textbackground(0); gotoxy(72,25);clreol; write(h);write(:);write(m);write(:);write(s); end; end; A következő eljárás az óra kiíratása a monitor jobb alsó sarkába (körülbelül, mint a Windows-nál). A gettime az idő beállítására szolgál, az időadatokat a h, m, s és az s2 változókba raktározza el. 16 Az if, or, then egy összetett függvényt valósítanak meg. Ha ms nagyobb ill. kisebb, mint m vagy ss nagyobb ill kisebb, mint s, ha ez igaz, akkor a begin-nel kezdődő utasítás hajtódik végre. Az utasításban az ms-t egyenlővé teszi m-mel és ss-t egyenlővé teszi s-sel. Ez az összetett függvény a percek és másodpercek változását teszik tulajdonképpen lehetővé. Utána a clreol utasítással a kurzorpozíciótól a sor végéig törli a képernyőt. A write parancsokkal pedig kiíratja az időt.
Ebben az eljárásban két fontos dologra kell figyelni, az egyik, hogy az értékadás mindig :=-lel történik, a másik pedig, ha a write utáni zárójelben kihagyjuk a ’ jelet, akkor egy változó értékét írathatjuk ki. És még egy megjegyzés, azért van két end, mert az első a ha föggvény utáni utasításokat zárja le a második pedig az egész óra eljárást. procedure menu; begin cls; textcolor(4);textbackground(0); gotoxy(22,10);write(1 - Adatbázis megjelenítése/szerkesztése); gotoxy(22,11);write(2 - Új név felvétele); gotoxy(22,12);write(3 - Keresés); gotoxy(22,13);write(4 - Új adatbázis létrehozása); gotoxy(22,14);write(5 - Adatbázis betöltése file-ból); gotoxy(22,15);write(6 - Teljes adatbázis megtekintése); gotoxy(22,16);write(7 - Kilépés); end; A menü eljárás a választható menüpontok kiíratásáért felelős, a cls; sor a cls eljárásra hivatkozik, letörli a képernyőt. Utána a megadott koordinátákra kiíratja a
képernyőre a menüpontokat. procedure kereses; var s:string; a:Tadat; b,index:integer; procedure kiir; var d:char; begin cls;textbackground(0); textcolor(4); gotoxy(58,4);write(ENTER=továbbléptet);textcolor(4); gotoxy(10,5);write(Megjelenített név ();write(b);write(/);write(index+1);write():); gotoxy(10,7); write( Név: );textcolor(4);write(a.nev);textcolor(4); gotoxy(10,8); write( Telefonszám: );textcolor(4);write(a.tel);textcolor(4); gotoxy(10,9); write( Város: );textcolor(4);write(a.varos);textcolor(4); gotoxy(10,10);write( Közelebbi cím: );textcolor(4);write(a.cim);textcolor(4); gotoxy(10,11);write( Megjegyzés: );textcolor(4);write(a.megj);textcolor(4); 17 gotoxy(10,15);write( Keresett szó: );textcolor(4);write(s); repeat ora; if keypressed then begin d:=readkey; case d of chr(27):begin menu;exit;end; chr(13):exit; end; end; until false; end; begin if adb=nincs aktív adatbázis then begin gotoxy(6,20);textbackground(0);textcolor(4);write(Nincs aktív adatbázis!);
repeat ora;until keypressed;menu;exit; end; b:=filesize(f); textcolor(4);textbackground(0); gotoxy(5,20);write(Írj be egy keresési kulcsszót!); gotoxy(8,21);textcolor(4);clreol;readln(s); if s= then begin gotoxy(5,22);textbackground(0);textcolor(4);write(Írj be egy kulcsszót!); repeat ora;until keypressed;menu;exit; end; seek(f,0); for index:=0 to filesize(f)-1 do begin read(f,a); if pos(s,a.nev)>0 then kiir; if pos(s,a.tel)>0 then kiir; if pos(s,a.varos)>0 then kiir; if pos(s,a.cim)>0 then kiir; if pos(s,a.megj)>0 then kiir; end; cls;menu; end; A következő eljárás a kereses. Az eljárás elején definiálom az eljárásban szereplő új változókat. Utána egy kiir eljárást indítok el, amely a kiíratásokért felel, ezt azért teszem, mert ez a késöbbiek folyamán csökkenti a forráskód nagyságát. A kiir eljárásban csak kiíratási és pozícionálási parancsok (write, gotoxy) vannak és megjelenik a repeat, amely az utána lévő óra eljárást
ismétli, a repeat ora; sor majdnem az összes eljárásben fog szerepelni a program során, hiszen mindenhol van rá lehetőség, hogy az órát kiírassuk. Ezután egy if függvény van, ha lenyomnak egy billentyűt, akkor folytatódik a program. A readkey a lenyomott billentyű beolvasását teszi meg. A lenyomott billentyű ASCII kódját a d változóba olvassa be. A case egy többirányú elágazás, amely után több irányba 18 folytatódhat a program. A chr(27) : begin menu; exit; end; sor azt jelenti, ha a 27-es ASCII kódú billentyű (Esc) kerül lenyomásra, akkor kilép és a menu eljárásra ugrik. A chr (13) az Enter lenyomása után csak ebből a programból lép, ki. Az until false; end; azt jelenti, ha nem igaz a case egyik feltétele sem (a lenyomott billentyű nem Enter és nem Esc, hanem más), akkor ugyanúgy lép ki, mint az Enter lenyomása után. Ezután kezdődik a tulajdonképpeni keresés eljárás. Legelőször egy ha függvénnyel megvizsgálja, van-e
aktív adatbázis. Ha nincs, azt tudatja velünk, until keypressed, menu; ez a sor azt jelenti, ha lenyomunk egy billentyűt, kilép a menübe. A további sorokban az adatbázis tartalmát változóba olvassa, és, ha a lenyomott billentyű(ke)t megtalálja valahol a változóban, akár a névnél, a telefonszámnál, városnál, közelebbi címnél vagy a megjegyzésnél, akkor az első olyan rekordmezőt íratja ki a kiir eljárás meghívásával, amelyikben a karaktert legelőször megtalálta. procedure letrehozas; var s:string; begin textcolor(4);textbackground(0); gotoxy(5,20);write(Az új adatbázis fileneve (kiterjesztés nélkül): ); gotoxy(8,21);textcolor(4);clreol;readln(s); if s= then begin gotoxy(5,22);textbackground(0);textcolor(4);write(Írj be egy filenevet!); repeat ora;until keypressed;menu;exit; end; s:=s+.tdb; assign(f,s); rewrite(f); for i:=length(s) downto 1 do if s[i]= then begin delete(s,1,i);break;end; adb:=s; menu; end; A következő eljárás a
létrehozás. Ez nem az új név, hanem egy üres adatbázis létrehozására vonatkozik. Először kéri az adatbázis kiterjesztés nélküli nevét. Utána azt létrehozza és .tdb kiterjesztést ad neki. Hogy ezt a file-t hova menti a számítógépen az attól függ, honnan futtatjuk a programot. Ha hajlékonylemezen (mint az én esetemben), akkor oda is menti, ha merevlemezről futtatjuk, de megadhatunk más partíciót is. A rewrite (f); sor azt 19 jelenti, ha létezik már ez az adatbázis, akkor minden vizsgálat nélkül felülírja. procedure ujnev; var a:Tadat; b:char; begin cls;textcolor(4);textbackground(0); gotoxy(6,5); write(Új név létrehozása); gotoxy(8,7); write( Név: ); gotoxy(8,8); write( Telefonszám: ); gotoxy(8,9); write( Város: ); gotoxy(8,10);write( Közelebbi cím: ); gotoxy(8,11);write( Megjegyzés: ); textcolor(4); gotoxy(26,7);clreol;readln(a.nev); gotoxy(26,8);clreol;readln(a.tel); gotoxy(26,9);clreol;readln(a.varos);
gotoxy(26,10);clreol;readln(a.cim); gotoxy(26,11);clreol;readln(a.megj); textcolor(4); gotoxy(6,15);write(Hozzáadhatom? (i/n)); repeat ora; if keypressed then begin b:=readkey; case b of i:break; n:begin menu;exit;end; end; end; until false; if adb=nincs aktív adatbázis then begin gotoxy(6,17);textbackground(0);textcolor(4);write(Nincs aktív adatbázis!); repeat ora;until keypressed;menu;exit; end; seek(f,filesize(f));write(f,a); gotoxy(6,15);textcolor(4);textbackground(0);write(Az új név hozzáadása megtörtént); repeat ora; until keypressed; menu; end; Az ujnev eljárás az adatbázisba történő új név hozzáadásáért felelős. Ebben az eljárásban kiírja a képernyőre a nevet és a többi adatot, amit be lehet vinni, és amint lenyomunk egy billentyűt, az is azonnal megjelenik. A readln (beolvasás) miatt nem lehet itt beállítani az órát. Csakis a legvégén miután a program kiírja, hogy a név hozzáadása megtörtént. Ha nincs aktív adatbázis, a program
csakis akkor figyelmeztet (bár mindvégig kiírja, ha nincs), amikor az új nevet ténylegesen hozzá akarjuk adni. Ha a hozzáadhatom kérdésre n billentyűt nyomunk le, akkor kilép a 20 menu eljárásra. Ha az új név hozzáadása megtörtént, egy billentyűt le kell nyomni, csakis akkor lép vissza a menübe a program. procedure quit; begin if adb<>nincs aktív adatbázis then begin if filesize(f)=0 then erase(f);close(f);end; halt(0); end; A kilépés eljárása a quit. Egy érdekes és jó ebben az eljárásban, ha van aktív adatbázis, és üres, akkor a program bezárása előtt törli azt. procedure betolt; var s:string; begin textcolor(4);textbackground(0); gotoxy(5,20);write(Írd be a betöltend‹ file nevét (kiterjesztés nélkül):); gotoxy(8,21);textcolor(14);clreol;readln(s); if adb<>nincs aktív adatbázis then begin if filesize(f)=0 then erase(f);close(f);end; s:=s+.tdb; assign(f,s); {$I-} reset(f); if ioresult<>0 then begin
textcolor(4);gotoxy(5,22);write(Ilyen file nem létezik!); repeat ora;until keypressed; menu;exit; end; {$I+} seek(f,filesize(f)); for i:=length(s) downto 1 do if s[i]= then begin delete(s,1,i);break;end; adb:=s; menu; end; Ez az eljárás az adatbázis betöltését teszi lehetővé. Itt kell kikapcsolni a kapcsoló direktívát, mert, ha nem találjuk meg az adatbázist, akkor a {$I-} sor nélkül a programból egy hibajelzéssel kilépne. Ezért kell az ioresult eljárás, hogy az adatbázis meglétét megvizsgálja. Itt meglehet adni elérési utat is, hogy honnan töltse be az adatbázist. De arra figyelni kell, hogy egy nyolc karakternél hosszabb nevű könyvtárra úgy kell hivatkozni, mint DOS-os környezetben, hat karakter után a ~1-et kell beírni. procedure torol(index:word); var a:Tadat; b:char; begin 21 textcolor(4);textbackground(0); gotoxy(11,15);write(Törölhetem? (i/n)); textcolor(4); repeat ora; if keypressed then begin b:=readkey; case b of i:break; n:begin
menu;exit;end; end; end; until false; if index=filesize(f)-1 then begin seek(f,filesize(f)1);truncate(f);exit;end; for i:=index to filesize(f)-2 do begin seek(f,i+1); read(f,a); seek(f,i);write(f,a); end; truncate(f); end; A nevek törléséért felelős ez az eljárás. A truncate(f); sor azt jelenti, hogy az f file végét az aktuális file-pozíciónál levágja. A seek egy léptető eljárás. procedure modosit(index:word); var a:Tadat; b:string; e:char; begin seek(f,index);read(f,a); cls;textbackground(0); textcolor(4);gotoxy(58,4);write(ENTER=marad a régi);textcolor(4); gotoxy(5,4); write( Név (régi) : );textcolor(4);write(a.nev);textcolor(4); textcolor(4); gotoxy(5,5); write( Név (új) : );textcolor(4);clreol;textcolor(4); gotoxy(5,7); write( Telefonszám (régi) : );textcolor(4);write(a.tel);textcolor(4); textcolor(4); gotoxy(5,8); write( Telefonszám (új) : );textcolor(4);clreol;textcolor(4); gotoxy(5,10);write( Város (régi) :
);textcolor(4);write(a.varos);textcolor(4); textcolor(4); gotoxy(5,11);write( Város (új) : );textcolor(4);clreol;textcolor(4); gotoxy(5,13);write(Közelebbi cím (régi): );textcolor(4);write(a.cim);clreol;textcolor(4); textcolor(4); gotoxy(5,14);write( Közelebbi cím (új) : );textcolor(4);clreol;textcolor(4); gotoxy(5,16);write( Megjegyzés (régi) : );textcolor(4);write(a.megj);clreol;textcolor(4); textcolor(4); 22 gotoxy(5,17);write( Megjegyzés (új) : );textcolor(4);clreol;textcolor(4); gotoxy(27,5);readln(b); if b= then begin gotoxy(27,5);write(a.nev);end else anev:=b; gotoxy(27,8);readln(b); if b= then begin gotoxy(27,8);write(a.tel);end else atel:=b; gotoxy(27,11);readln(b); if b= then begin gotoxy(27,11);write(a.varos);end else avaros:=b; gotoxy(27,14);readln(b); if b= then begin gotoxy(27,14);write(a.cim);end else acim:=b; gotoxy(27,17);readln(b); if b= then begin gotoxy(27,17);write(a.megj);end else amegj:=b; gotoxy(6,19);write(Módosíthatom? (i/n)); repeat ora; if
keypressed then begin e:=readkey; case e of i:break; n,chr(27):begin menu;exit;end; end; end; until false; seek(f,index);write(f,a); gotoxy(6,19);textcolor(4);textbackground(0);write(Az adatok módosítása megtörtént); repeat ora; until keypressed; menu; seek(f,index);write(f,a); end; A módosítást végzi ez az eljárás. procedure megnyit; var a,b:word; {b=összes adat, a=aktuális adat} c:Tadat; d:char; label start; begin a:=1; start: cls; if adb=nincs aktív adatbázis then begin gotoxy(30,13);textbackground(0);textcolor(4);write(Nincs aktív adatb zis!); repeat ora;until keypressed;menu;exit; end; if filesize(f)=0 then begin textbackground(0);textcolor(4);gotoxy(30,13);write(Az adatbázis űres!!!); repeat ora;if keypressed then begin menu;exit;end; until false; end; textcolor(4);textbackground(0); gotoxy(55,20);write(1 - Módosítás); gotoxy(55,21);write(2 - Törlés); 23 gotoxy(55,22);write(3 - Vissza a Főmenübe); textcolor(4);gotoxy(45,4);write(Jobbra, balra nyilak
a váltáshoz);textcolor(4); b:=filesize(f); gotoxy(10,5);write(Megjelenített név ();write(b);write(/);write(a);write():); seek(f,a-1);read(f,c); gotoxy(10,7); write( Név: );textcolor(4);write(c.nev);textcolor(4); gotoxy(10,8); write( Telefonszám: );textcolor(4);write(c.tel);textcolor(4); gotoxy(10,9); write( Város: );textcolor(4);write(c.varos);textcolor(4); gotoxy(10,10);write( Közelebbi cím: );textcolor(4);write(c.cim);textcolor(4); gotoxy(10,11);write( Megjegyzés: );textcolor(4);write(c.megj);textcolor(4); repeat ora; if keypressed then begin d:=readkey; case d of 3,chr(27):begin menu;exit;end; chr(77):if a<b then begin a:=a+1;goto start;end; chr(75):if a>1 then begin a:=a-1;goto start;end; 2,chr(60):begin torol(a-1);a:=1;goto start;end; 1,chr(59):begin modosit(a-1);goto start;end; end; end; until false; end; Ez az eljárás az adatbázis szerkesztését teszi lehetővé. Először azt vizsgálja meg, van-e aktív adatbázis, de akkor is figyelmeztet, ha az
adatbázis üres. A label címke deklaráció Az eljárás elején definiálni kell a cimkét. A címke csakis egyetlen utasítást jelölhet A címkére a goto utasítással lehet ugrani. procedure kilista(ks,b:word); var i,a:word; c: tadat; begin a:= ks; cls; textcolor(4);textbackground(0); textcolor(4);gotoxy(34,4);write(Jobbra, balra nyilak a váltáshoz, Esc a kilépés);textcolor(4); textcolor(4);gotoxy(4,5);write(Név Telefonszám(-ok) Megjegyzés);textcolor(4); i:=1; while (a<ks+15) and (a<=b) do begin seek(f,a-1);read(f,c); gotoxy(1,5+i);write(c.nev); gotoxy(31,5+i);write(c.tel); gotoxy(56,5+i);write(c.megj); a:=a+1;i:=i+1; end; end; 24 Ez az eljárás (részben) a teljes adatbázis megtekintését teszi lehetővé. Praktikussági szempontból csakis a név, telefonszám(ok), és a megjegyzés jelenik meg. Ez az eljárás tulajdonképpen a léptetésért felelős. procedure lista; var d:char; ks,b:word; begin cls; if adb=nincs aktív adatbázis then begin
gotoxy(30,13);textbackground(0);textcolor(4);write(Nincs aktív adatbázis!); repeat ora;until keypressed;menu;exit; end; if filesize(f)=0 then begin textbackground(0);textcolor(4);gotoxy(30,13);write(Az adatbázis üres!!!); repeat ora;if keypressed then begin menu;exit;end; until false; end; b:=filesize(f); textcolor(4);textbackground(0); textcolor(4);gotoxy(34,4);write(Jobbra, balra nyilak a váltáshoz, Esc a kilépés);textcolor(4); textcolor(4);gotoxy(4,5);write(Név Telefonszám(-ok) Megjegyzés);textcolor(4); ks:=1; kilista(ks,b); repeat ora; if keypressed then begin d:=readkey; case d of chr(27):begin menu;exit;end; chr(75):begin if ks>1 then begin ks:=ks-15; kilista(ks,b); end; end; chr(77):begin if ks+15<=b then begin ks:=ks+15; kilista(ks,b); end; end; end; end; until false; end; A lista eljárás a teljes lista megtekintését fogja össze, a kilista eljárás a léptetést teszi lehetővé, ez az eljárás pedig a kilista 25 eljárásra hivatkozva
megkülönbözteti az előre és visszalépést, és a kilista eljárásra hivatkozás előtt elvégzi azt a műveletet, amiben a kétféle léptetés különbözik. procedure mintabe; var s:string; begin s:=a:minta; if adb<>nincs aktív adatbázis then begin if filesize(f)=0 then erase(f);close(f);end; s:=s+.tdb; assign(f,s); {$I-} reset(f); if ioresult<>0 then begin textcolor(4);gotoxy(5,22);write(Nem találom a minta állományt! Kérem töltsön be egyet!); readkey; adb:=nincs aktív adatbázis; exit; end; {$I+} seek(f,filesize(f)); for i:=length(s) downto 1 do if s[i]= then begin delete(s,1,i);break;end; adb:=s; end; A mintabe eljárás teszi lehetővé, hogy ne kelljen mindenképp betölteni egy adatbázist, itt is alkalmazom a kapcsoló direktívát, mert, ha nem találja a program a mintaállományt (és, ha nem a hajlékonylemezről futtatják a programot és nincs is a meghajtóban, akkor ez történi), akkor az kilépést eredményezne a programból. procedure
menukey; begin repeat if keypressed then begin key:=readkey; case key of 1 :megnyit; 2 :ujnev; 3 :kereses; 4 :letrehozas; 5 :betolt; 6 :lista; 7,chr(27):quit; end; end; ora; until false; end; 26 A menukey eljárás egy többirányú elágazás, amely a különböző billentyűk lenyomása után különböző eljárásokat hív meg. A kilépés a chr(27) kitétel miatt az Esc billentyű lenyomásakor is működik. 7. A gyakorlati tevékenység összefoglalása A telefonregiszter programot minden szempontból teszteltem, és működött. Ez egy nem grafikus program, amelynek segítségével, rálátást lehet biztosítani a Pascal programozási nyelv, gyakorlati részére, arra a részre, amely tulajdonképpen maga a programírás, a programozás szakterületének leglátványosabb része. Szerettem volna bebizonyítani, hogy egy program bemutatásának keretében, meg lehet ismertetni egy programozási nyelvet másokkal, vagy legalább közelebb hozni, érthetőbbé és
átláthatóbbá tenni. Hogy sikerült-e ez a törekvésem azt nem az én tisztem eldönteni. 27 IRODALOMJEGYZÉK 1. Donát János: IBM PC információs kártya 2. Marton László: Bevezetés a Pascal nyelvű programozásba 3. Marton László, Pukler Antal, Pusztai Pál: Bevezetés a programozásba 28 KÖSZÖNETNYILVÁNÍTÁS Szeretném köszönetemet kifejezni azoknak az embereknek, akik nélkül ez a szakdolgozat nem jöhetett volna létre. A felsorolás sorrendje nem fontossági sorrendet vagy a segítség nagyságát mutatja, egyszerűen csak egy sorrend, mert a hálát nem lehet rangsorolni, vagy mennyiségben mérni: − Tóth Lajos Péter tanár úr, a szakmai konzulensem, aki nagyon sok szabadidőt és fáradtságot nem kímélve segített a szakdolgozatom elkészítésében − Turi Sándor tanár úr, az osztályfőnököm, aki örült ötleteim és a kevés idő ellenére is hitt bennem és abban, hogy elkészül a szakdolgozatom − Gazda János Péter, egy jó
barátom, aki önzetlenül a segítségemre sietett, mikor az otthoni rendszerem összeomlott, és noszogatása is erősen javított a szakdolgozatomhoz való hozzáállásomon − Marosi Géza, egy jó barátom és osztálytársam, aki szintén hitt bennem 29 NYILATKOZAT Kijelentem, hogy szakdolgozatom önálló munka eredménye és korábban sehol sem került publikálásra. Hozzájárulok, hogy a veszprémi Egyetem a szakdolgozatomat oktatási célból eredeti és átdolgozott tartalommal, nyomtatott, illetve Internetre felhelyezett formában szabadon felhasználja. 2003. május 23 . Szladovits Viktor 30