Az előadás letöltése folymat van. Kérjük, várjon

Az előadás letöltése folymat van. Kérjük, várjon

Programozás és programozás módszertan 2007/2008. -2. A számítástechnika és a programozás története  A számolást segítő eszközök története egyidős az.

Hasonló előadás


Az előadások a következő témára: "Programozás és programozás módszertan 2007/2008. -2. A számítástechnika és a programozás története  A számolást segítő eszközök története egyidős az."— Előadás másolata:

1 Programozás és programozás módszertan 2007/2008

2 -2. A számítástechnika és a programozás története  A számolást segítő eszközök története egyidős az emberiséggel  Az ősember az ujjait használta (digitus=ujj, ebből ered a digit, számjegy név, sőt a bit=binary digit, kettes számrendszer-beli számjegy elnevezés)  A következő lépés a mechanikus eszközök használata volt: –Kipu: az első helyiértékes számábrázolás, az amerikai indiánok használták, csomózáson alapult –Abakusz: sinekre vagy vájatokba helyezett kövekkel működő mechanikus „számológép”

3 -2. A számítástechnika és a programozás története  A következő lépést a XVII. századdal kezdődően a mechanikus számológépek kifejlesztése hozta. E munka főbb alakjai: –Wilhelm Schickard ( )  Német (thübingeni) csillagász  a négy alapművelet elvégzésére alkalmas, fogaskerekekből és rudakból felépülő számológépet épített (1960, IBM, felépítették a működő modellt) –Blaise Pascal ( )  francia matematikus, fizikus, filozófus  Az első sorozatban gyártott számológép megalkotója ( )  Ez csak összeadásra és kivonásra volt alkalmas –Gotfried Wilhelm Leibniz ( ):  német polihisztor  Pascal gépét fejlesztette tovább, megvalósította a szorzást és az osztást közbülső művelet nélkül  Ő javasolta először a kettes számrendszer használatát

4 -2. A számítástechnika és a programozás története –Charles Babbage ( )  angol matematikus  Ő tervezte az első igazi számítógépet, amelynek alapja a programvezérlés és az adatok tárolása volt  Első gépe a differenciális gép, mellyel hajózási táblázatokat számoltak volna, teljesen sosem készült el (1821)  Ez még számológép volt, programvezérlés nélkül  Második gépe az analitikus gép (1834), mely adatbevitelre és programozásra lyukkártyákat használt volna  Az ötlet Joseph Maria Jacquard mechanikus szövőszékéből ered (1820), amelynél a szövési mintákat tárolták lyukkártyákon  A kor technikája nem tette lehetővé a megépítését, mert pl. a súrlódást nem tudták kiküszöbölni a működés során  A csak elméletben megvalósult gépre Ada Lovelace (Augusta Ada Byron, Lord Byron felesége) programokat készített, amelyek a későbbi elemzéskor mind hibátlannak bizonyultak – ő volt az első programozónő  Az analitikus gépet a londoni Science Museumban elkezdték megépíteni a fennmaradt dokumentáció alapján

5 -2. A számítástechnika és a programozás története –James Hollerith ( ), amerikai mérnök  1887-ben az amerikai népszámlálás adatainak feldolgozására lyukkártyás gépet készített, amellyel a kiértékelés 3 év helyett 6 hetet vett igénybe  A lyukkártyák rendezését és szétválogatását tűk segítségével oldotta meg  Hollerith 1924-ben alapított cégéből fejlődött ki az IBM (International Business Machines)  Szerepeljen itt néhány kép a fent említett számoló és számítógépekről

6 -2. A számítástechnika és a programozás története Római abakusz rekonstrukciója

7 -2. A számítástechnika és a programozás története Pascal számológépe

8 -2. A számítástechnika és a programozás története A differenciális gép egy részlete, amelyet a Babbage műhelyében talált alkatrészekből raktak össze

9 -2. A számítástechnika és a programozás története Az épülő analitikus gép

10 -2. A számítástechnika és a programozás története  A következő lépést az elektromechanikus, elektronikus számítógépek megalkotása hozta –Sokan foglalkoztak több országban a kifejlesztésükkel, csak néhány név:  Conrad Zuse, Németország (első szabadon programozható számítógép, relékből, ),  Alan Turing (angol matematikus, Colossus nevű kódfejtésre használt számítógép, 1943),  Howard H. Aiken, (amerikai matematikus, Mark I. nevű számítógép, lövedékröppálya-táblázatok számítására, 1944) –ENIAC, 1945: az első teljesen elektronikus számítógép, elektroncsövekből –EDVAC, 1946: az első Neumann-elvű számítógép

11 -2. A számítástechnika és a programozás története  Neumann János ( ) magyar származású amerikában élt matematikus –Matematikai alapokon látott hozzá a számítógépek általános alapelveinek kidolgozásához –Ezeket 1946-ban publikálta legendás cikkében, amelyek a Neumann-elveket tartalmazták: 1.Soros utasításvégrehajtás 2.Kettes számrendszer használata 3.Belső memória (operatív tár) használata a program és az adatok tárolására 4.Teljesen elektronikus működésű, univerzális számítógép 5.Központi vezérlőegység, illetve aritmetikai egység használata

12 -2. A számítástechnika és a programozás története  A XX. Század negyvenes évei óta Neumann-elvű, elektronikus számítógépeket használunk, amelyeket az őket alkotó fő alkotórész milyensége szerint számítógép-generációkba sorolunk. Ezek a következők: 1.generációs számítógépek: elektroncsövekből épülnek fel 2.generációs számítógépek: fő alkotórészük az egyedi tranzisztor (1958-tól) 3.generációs számítógépek: integrált áramköröket tartalmaznak (1965-től) 4.generációs számítógépek: központi egységük a mikroprocesszor (1971, Intel, 4004 típusjelű processzor)  A különböző megvalósítás azonban nem jelentette a programozás alapelveinek változását

13 -1. Alapfogalmak  Adat: Egy objektum számunkra fontos tulajdonsága.  Ismeret: Az adatok olyan összessége, amelyet az ember képes észlelni, érzékelni, és összefüggéseiben látni.  Információ: Új ismeretet tartalmazó adathalmaz.

14 -1. Alapfogalmak  Program: A számítógép számára érthető utasítások sorozata, amely az adatok megfelelő számításaival és mozgatásaival egy feladat megoldását célozza.  Következtetés: PROGRAM=ADAT+ALGORITMUS

15 -1. Alapfogalmak  Algoritmus: egy feladat megoldásának leírása.  Követelmények: milyen legyen egy algoritmus? –Általános legyen, lehetőleg a feladattípusra adjon megoldást –Véges számú lépésben vezessen eredményre (időben és terjedelemre is véges legyen) –Megfelelő bemenő adatokra megfelelő kimenetet adjon

16 0. Feladatmegoldás számítógéppel I. Mintapélda a valós életből: házépítés 1.Igényfelmérés (szempontok: család mérete, elképzelés, pénz) 2.Tervezés (alaprajz, anyagigény) 3.Szervezés (ütemterv vagy vállalkozó) 4.Építkezés (anyagbeszerzés, kivitelezés) 5.Használatba vétel (szemrevételezés – szépség, kipróbálás – jóság) 6.Beköltözés, bentlakás (módosítgatás, újabb hibák, karbantartás)

17 0. Feladatmegoldás számítógéppel II. A programkészítés folyamata TevékenységEredmény TevékenységEredmény 1. Specifikálás (miből?,mit?)specifikáció 2. Tervezés (mivel?,hogyan?)adat- algoritmusleírás 3. Kódolás (a géppel hogyan?)kód (reprezentáció + implementáció) 4. Tesztelés(hibás?)hibalista (diagnózis) 5. Hibakeresés (hol a hiba?)hibahely, ok (terápia) 6. Hibajavítás (hogyan jó?)helyes program 7. Minőségvizsgálat, hatékonyság (jobbítható?)jó program (jobbítható?)jó program 8. Dokumentálás (hogy működik, hogyan kell használni?)használható program hogyan kell használni?)használható program 9. Használat, karbantartás (még mindig jó?) időtálló program (még mindig jó?) időtálló program

18 1. Feladatmegoldás számítógéppel – részletesen az egyes lépésekről - SPECIFIKÁCIÓ Részei:  Bemenő adatok (értékhalmaz, mértékegység) + összefüggéseik (előfeltétel)  Eredmények + kiszámítási szabályuk (utófeltétel)  A megoldással szembeni követelmények  Korlátozó tényezők  A használt fogalmak definíciói

19 1. Feladatmegoldás számítógéppel – részletesen az egyes lépésekről - SPECIFIKÁCIÓ Tulajdonságai:  Egyértelmű, pontos, teljes  Rövid, tömör, formalizált  Szemléletes, érthető Specifikációs eszközök:  Szöveges leírás  Matematikai leírás

20 2. Feladatmegoldás számítógéppel – részletesen az egyes lépésekről - TERVEZÉS  2 feladat együtt: –Algoritmustervezés –Adatszerkezet megtervezése

21 2/a. Feladatmegoldás számítógéppel – részletesen az egyes lépésekről - ALGORITMUSTERVEZÉS  Eszközei: Algoritmusleíró eszközök –Folyamatábra –Struktogram –Jackson-diagramok –Leírás mondatszerű elemekkel (pszeudokód) –Leírás programozási nyelven

22 2/a. Feladatmegoldás számítógéppel – részletesen az egyes lépésekről - ALGORITMUSTERVEZÉS  Milyen építőkövekből épül fel egy algoritmus? –Állítás: Néhány alapvető elem (vezérlési szerkezet) segítségével minden algoritmus elkészíthető. –Az a programozás, amely csak ezeket használja: STRUKTÚRÁLT PROGRAMOZÁS

23 2/a. Feladatmegoldás számítógéppel – részletesen az egyes lépésekről - ALGORITMUSTERVEZÉS  Melyek ezek az építőkövek? –Tevékenységek egymásutánja (bambán dolgozunk): SZEKVENCIA –Valamilyen döntésre kényszerül a program a végrehajtás során: ELÁGAZÁS (SZELEKCIÓ) (van egy-, két-, és többágú) –Valamilyen programrészletet többször kell végrehajtani (általában feltételtől függően): CIKLUS (ITERÁCIÓ) (többféle létezik) –A program részekre bontása alprogramokra (később tárgyaljuk)

24 2/a. Feladatmegoldás számítógéppel – részletesen az egyes lépésekről - ALGORITMUSTERVEZÉS  Szekvencia megvalósítása folyamatábrával utasítás1 utasítás2 utasítás3

25 2/a. Feladatmegoldás számítógéppel – részletesen az egyes lépésekről - ALGORITMUSTERVEZÉS  Elágazás megvalósítása folyamatábrával –Az ágak valamelyike el is maradhat: egyágú elágazás –Többágú elágazásra nincs folyamatábra-jelölés, több kétágú elágazással írható le feltétel Utasítás(ok) igaz esetén Utasítás(ok) hamis esetén i h

26 2/a. Feladatmegoldás számítógéppel – részletesen az egyes lépésekről - ALGORITMUSTERVEZÉS  Ciklusok megvalósítása folyamatábrával –A megismétlésre kerülő utasítások összefoglaló neve: CIKLUSMAG –Fajtái:  Elöltesztelő feltételes ciklus  Hátultesztelő feltételes ciklus  Számlálós (növekményes) ciklus (speciális elöltesztelő ciklus)

27 2/a. Feladatmegoldás számítógéppel – részletesen az egyes lépésekről - ALGORITMUSTERVEZÉS  Elöltesztelő ciklus megvalósítása folyamatábrával –A ciklusmag nem biztos, hogy biztos, hogy végrehajtódik! végrehajtódik! i ciklusfeltétel Ciklusmagutasításai h

28 2/a. Feladatmegoldás számítógéppel – részletesen az egyes lépésekről - ALGORITMUSTERVEZÉS  Hátultesztelő ciklus megvalósítása folyamatábrával –A ciklusmag egyszer biztosan végrehajtódik! biztosan végrehajtódik! i ciklusfeltétel Ciklusmagutasításai h

29 2/a. Feladatmegoldás számítógéppel – részletesen az egyes lépésekről - ALGORITMUSTERVEZÉS  Számlálós ciklus megvalósítása folyamatábrával –A ciklusmag nem biztos, hogy biztos, hogy végrehajtódik! végrehajtódik! i Változó:=tól..ig Ciklusmagutasításai h

30 2/a. Feladatmegoldás számítógéppel – részletesen az egyes lépésekről - ALGORITMUSTERVEZÉS  Egyéb folyamatábra-elemek –Bevitel, kiírás: –Algoritmus eleje, vége: Be: Start Stop

31 2/a. Feladatmegoldás számítógéppel – részletesen az egyes lépésekről - ALGORITMUSTERVEZÉS  Algoritmusleírás mondatszerű elemekkel –A beszélt nyelvhez közeli leírás –Logikája hasonlít a Pascal nyelvhez –Az összetartozó elemeket egy oszlopban kezdjük (tabulált írásmód)

32 2/a. Feladatmegoldás számítógéppel – részletesen az egyes lépésekről - ALGORITMUSTERVEZÉS  A mondatszerű leírás szabályainak definiálásához ún. metanyelvi szimbólumokat használunk: – Be kell helyettesíteni valamit –[…] Nem kötelező elem

33 2/a. Feladatmegoldás számítógéppel – részletesen az egyes lépésekről - ALGORITMUSTERVEZÉS  Szekvencia mondatszerű elemekkel..

34 2/a. Feladatmegoldás számítógéppel – részletesen az egyes lépésekről - ALGORITMUSTERVEZÉS  Elágazás mondatszerű elemekkel Ha akkor [Egyébként ] ] Elágazás vége

35 2/a. Feladatmegoldás számítógéppel – részletesen az egyes lépésekről - ALGORITMUSTERVEZÉS  Elágazás mondatszerű elemekkel –Többágú: Elágazás esetén esetén.. [Egyébként ] ] Elágazás vége

36 2/a. Feladatmegoldás számítógéppel – részletesen az egyes lépésekről - ALGORITMUSTERVEZÉS  Elöltesztelő ciklus mondatszerű elemekkel Ciklus amíg

37 2/a. Feladatmegoldás számítógéppel – részletesen az egyes lépésekről - ALGORITMUSTERVEZÉS  Hátultesztelő ciklus mondatszerű elemekkel Ciklus Amíg nem Amíg nem Ciklus vége

38 2/a. Feladatmegoldás számítógéppel – részletesen az egyes lépésekről - ALGORITMUSTERVEZÉS  Számlálós ciklus mondatszerű elemekkel Ciklus := -től -ig Ciklus vége Ciklus vége

39 2/a. Feladatmegoldás számítógéppel – részletesen az egyes lépésekről - ALGORITMUSTERVEZÉS  Egyéb algoritmuselemek mondatszerű elemekkel –Beolvasás: Be: …. –Kiírás: Ki: …

40 2/b. Feladatmegoldás számítógéppel – részletesen az egyes lépésekről - ADATTERVEZÉS  Hol helyezkedhetnek el a program futásához szükséges adatok? –Háttértáron –>fájlkezelés, külön foglalkozunk vele –Operatív tárban (memória, RAM)

41 2/b. Feladatmegoldás számítógéppel – részletesen az egyes lépésekről - ADATTERVEZÉS  Memóriában elhelyezkedő adatok kezelése –Két alapvetően különböző fajtája van:  Ami nem változik a program futása során: állandó, konstans (ha többször használjuk, érdemes nevet adni neki)  Ami változik a futás során: változó

42 2/b. Feladatmegoldás számítógéppel – részletesen az egyes lépésekről - ADATTERVEZÉS  Változók tulajdonságai –Neve van, ezzel hivatkozhatunk rá (azonosító) –A program bizonyos szakaszában használható csak (érvényességi kör, hatáskör) –A program futási ideje alatt sem mindig létezik (élettartam) –Meghatározott értékeket vehet fel, meghatározott műveletek végezhetők vele, meghatározott méretű helyet foglal a memóriában, és meghatározott szerkezete van (típus)

43 2/b. Feladatmegoldás számítógéppel – részletesen az egyes lépésekről - ADATTERVEZÉS  Néhány egyszerűbb típus –Egész típus –Valós típus –Karakter típus –Karakterlánc típus –Logikai típus.. Később részletesen lesz mindegyikről szó!!!

44 3. Feladatmegoldás számítógéppel – részletesen az egyes lépésekről - KÓDOLÁS  A program kódolása (megírása) valamilyen programozási nyelven történik.  Ahhoz, hogy ki tudjuk választani az általunk használni kívánt programozási nyelvet, tudnunk kellene, milyenek vannak egyáltalán  És azt is, hogy hogyan lehet ezeket jellemezni, csoportosítani

45 3. Feladatmegoldás számítógéppel – részletesen az egyes lépésekről - KÓDOLÁS  Programozási nyelvek csoportosítási szempontjai I. Emberközeliség szerint 1.Alacsony szintű a) Gépi kód  Az utasítások és az adatok is számok  Az ember számára szinte kezelhetetlen  A programozó közvetlenül a processzor utasításait írja b) Assembly  A gépi kódú utasításoknak pár karakterből álló szimbólumok felelnek meg (mnemonik)

46 3. Feladatmegoldás számítógéppel – részletesen az egyes lépésekről - KÓDOLÁS  Programozási nyelvek csoportosítási szempontjai I. Emberközeliség szerint 2.Magas szintű  A beszélt emberi nyelvhez (általában angolhoz) közeli programozási nyelvek  Az ipari méretű programozás hívta életre őket  Néhány példa: BASIC, Pascal, Java, PL-1, C, Ada…

47 3. Feladatmegoldás számítógéppel – részletesen az egyes lépésekről - KÓDOLÁS  Programozási nyelvek csoportosítási szempontjai II. Strukturáltság szerint 1.Strukturált  Csak a strukturált programozás eszközeit megvalósító utasításai vannak  Támogatja a program részekre, alprogramokra bontását (eljárások, függvények)  Pl.: C, Pascal, Java 2.Nem strukturált  Pl.: Assembly, eredeti BASIC nyelv

48 3. Feladatmegoldás számítógéppel – részletesen az egyes lépésekről - KÓDOLÁS  Programozási nyelvek csoportosítási szempontjai III. Alkalmazási kör szerint 1.Általános célú  Elméletileg bármilyen programozási feladat megoldására alkalmas  Emiatt azonban nincs optimalizálva egy speciális feladatra  Pl.: C, Pascal, BASIC 2.Speciális célú nyelvek  Általában egy feladatra optimalizáltak, pl. szövegfeldolgozás, szimuláció, adatbáziskezelés  Pl.: PROLOG, SIMULA, SQL, dBase

49 3. Feladatmegoldás számítógéppel – részletesen az egyes lépésekről - KÓDOLÁS  Programozási nyelvek csoportosítási szempontjai IV. Fejlettség szerint  1. Generációs nyelvek  Gépi kód  2. Generációs nyelvek  Már vannak benne vezérlési szerkezetek, az utasítások el vannak nevezve  Pl. Assembly, ALGOL60, FORTRAN  3. Generációs nyelvek  A magas szintű programnyelvek többsége, struktúrált utasításaival, alprogramok lehetőségével  4. Generációs nyelvek  Programgenerátorok, beépített adatbáziskezelőt tartalmaznak, a szoftver a háttérben írja a kódot helyettünk  Pl.: Visual Basic, Visual C++, Delphi

50 3. Feladatmegoldás számítógéppel – részletesen az egyes lépésekről - KÓDOLÁS  Programozási nyelvek csoportosítási szempontjai V. Fordítás típusa szerint  A forráskódot, amit a programozó létrehoz, a futtatáshoz gépi kódba kell alakítani, ez a fordítás a)Értelmező (interpreter) típusú nyelvek  A fordítás a program futása közben, az adott sor lefuttatása előtt történik  A futtatás emiatt lassúbb  A szintaktikai (nyelvtani) programhibák is csak futás közben derülnek ki  Pl. : korai BASIC-ek (Commodore 64, ZX Spectrum, Quick Basic)

51 3. Feladatmegoldás számítógéppel – részletesen az egyes lépésekről - KÓDOLÁS  Programozási nyelvek csoportosítási szempontjai V. Fordítás típusa szerint b)Fordító (compiler) típusú nyelvek  A fordítás a program futása előtt történik  A futtatás emiatt gyorsabb (a gépi kódú program fut)  A szintaktikai (nyelvtani) programhibák már futás előtt kiderülnek  Pl. : Pascal, C, C++, Delphi…

52 3. Feladatmegoldás számítógéppel – részletesen az egyes lépésekről - KÓDOLÁS  Programozási nyelvek csoportosítási szempontjai VI. Számítási modell szerint a)Neumann elvű nyelvek  A program felépítése erőteljesen kihasználja, hogy a számítógép, amin a program futni fog, Neumann-elvű (címezhető memória, változók, stb)  A ma létező legtöbb nyelv ilyen b)Automata elvű nyelvek (ipari robot, festőautomata programozásához  Az adatok állapotok, illetve bemeneteken mérhető értékek  A végrehajtás állapotok sorozata  Tevékenységorientált  Pl: LOGO grafikus része, ipari robotok pr. nyelvei

53 3. Feladatmegoldás számítógéppel – részletesen az egyes lépésekről - KÓDOLÁS  Programozási nyelvek csoportosítási szempontjai VI. Számítási modell szerint c)Logikai nyelvek  A program egy logikai kifejezés  A végrehajtás ennek kiértékelése  Erős matematikai kidolgozottság jellemzi ezeket a nyelveket  A program és az adatok nem különülnek el (nincsenek változók)  Vezérlési szerkezetek helyett logikai kifejezések és rekurzió  Pl.: PROLOG d)Funkcionális nyelvek  Az adatok állapotok, illetve bemeneteken mérhető értékek  A program egy függvény  A végrehajtás függvénykiértékelés  Erős matematikai kidolgozottság  Nincsenek változók, helyette függvényparaméterek  Pl.: LOGO szövegkezelő része, FORTH, LISP

54 3. Feladatmegoldás számítógéppel – részletesen az egyes lépésekről - KÓDOLÁS  Programozási nyelvek csoportosítási szempontjai VI. Számítási modell szerint e)Objektumelvű nyelvek  Objektum=tulajdonságai+műveletei  Az adat és a kód nem választható szét  Objektumtípus=osztály  Az objektumpéldányok eljárásokkal kommunikálnak  Eseményvezérelt programozás jellemzi  Öröklés: a származtatott objektumtípus rendelkezik egy másik objektum összes tulajdonságával és műveletével, de újak is lehetnek neki  Pl.:Turbo Pascal 6.0-tól, Visual Basic, Delphi, Smalltalk

55 3. Feladatmegoldás számítógéppel – részletesen az egyes lépésekről - KÓDOLÁS  Programozási nyelvek csoportosítási szempontjai VI. Típusosság szerint a) Erősen típusos: minden változó, objektum típusát meg kell adni a használat előtt, ezt deklarációnak hívják. (Pl.: Pascal, C) b) Gyengén típusos: Vannak előre definiált típusok (szöveges, numerikus), de a pontos típus futás közben derül ki (Pl. hogy egy változó egész vagy valós típusú). Bizonyos típusokat deklarálni kell (tömb). Ilyen nyelv a BASIC. c) Nem típusos nyelvek: A változók típusát nem kell megadni, sőt, bizonyos esetekben nincsenek is változók.

56 4. A Turbo Pascal nyelv alapjai  Névadó: Blaise Pascal, XVII. Századi matematikus, filozófus, teológus. (Pascal-háromszög ->binomiális együtthatók; Pascal-tétel: a nyomás egyenletes terjedésének törvénye, róla nevezték el a nyomás SI mértékegységét is) Miért névadó: mert ő készítette az első működő mechanikus számológépet  Megalkotója: Niklaus Wirth, a zürichi Műszaki egyetem tanára (1968), első fordítóprogram: 1970 (őse: ALGOL- 60)  1973: szabványos Pascal nyelv definiálása  1983: Borland – Turbo Pascal (mert gyors a fordítóprogram)  1991: Turbo Pascal for Windows  1992: Borland Pascal (védett módú programozás)  1995: Object Pascal, Delphi

57 4. A Turbo Pascal nyelv alapjai  Besorolása: –Magas szintű nyelv (az angol nyelv logikáját követi, de szigorúan kötött szintaktikai szabályai vannak) –Struktúrált nyelv (vannak nem struktúrált utasításai is – goto, halt, exit - de ezeket nem fogjuk tanulni) –Általános célú nyelv (különösen ajánlják első nyelvként, programozást tanulóknak) –TP: 3. generációs, Delphi: 4. generációs nyelv –Neumann-elvű nyelv, de tartalmaz objektum-elvű kiegészítést, ami az eredeti Pascalban nem volt –Erősen típusos nyelv – minden azonosítót, amit használunk, deklarálni kell. (Egyetlen hátránya is ebből adódik: az első működő programhoz viszonylag sok ismeretet kell elsajátítani.)

58 4.1. A Turbo Pascal program általános szerkezete – csak alapok Program ;{programfej} Var {Változó deklarációk}{deklarációs rész} {egyéb deklarációk} Begin {utasítások}{programtörzs} End.

59 4.2. A Turbo Pascal fejlesztői környezete, menűrendszere  Mi a Turbo Pascal 7.0 változatát használjuk  A futtatható állomány a c:\TP\bin\turbo.exe, de az asztalon van hozzá parancsikon. c:\TP\bin\turbo.exe

60 4.3. A Turbo Pascal nyelv nyelvi elemei 1. A nyelv jelkészlete –Az angol ABC betűi (A..Z, a..z) (a kis-és nagybetűket a Pascal nem különbözteti meg!!!) –Decimális számjegyek (0..9) –Hexadecimális számjegyek (0..9,a..z,A..z) –Szóköz (ASCII 32) és a többi vezérlőkarakter (ASCII 0..31) –Egyéb speciális jelek: + - * / =. ; ‘ ^ $ # [ ] ( ) { } –Bizonyos karakterpárok speciális jelentést hordoznak, ezek közé nem szabad szóközt tenni, és nem szabad a sorrendjüket felcserélni: := = <>.. (* *)

61 4.3. A Turbo Pascal nyelv nyelvi elemei 2. A foglalt szavak –A foglalt (fenntartott) szavak a Pascal nyelv utasításaiban és deklarációiban szereplő kulcsszavak, más célra használni őket tilos. –Néhány példa: program, begin, end, for, while, repeat, do, if, then, else (a teljes lista a könyvben található) –Vannak még ún. szabványos direktívák, ezeket lehet saját névként használni, de nem ajánlott (absolute, private, public, virtual, stb.)

62 4.3. A Turbo Pascal nyelv nyelvi elemei 3. A program utasításai és sorai –A Pascal program utasításokból áll, az utasításokat pontosvessző választja el (;) –Kivétel: a program végét záró end, aminek a végén pont (.) van! –Az utasítások a program soraiban vannak (a program egy szabványos szöveges fájl), de egy sor nem feltétlenül egy utasítás, és egy sorba több utasítás is írható –Az utasítások a foglalt szavakon kívül egyéb elemeket is tartalmazhatnak (ld. később)

63 4.3. A Turbo Pascal nyelv nyelvi elemei 4. Megjegyzések –A programban megjegyzéseket helyezhetünk el, amelyeket a fordítóprogram nem vesz figyelembe, csak a programozónak jelentenek a program későbbi olvasásánál könnyebbséget –Megjegyzéseket a programban { } vagy (* *) zárójelpárok között helyezhetünk el –Speciális megjegyzések a programban az ún. fordítói direktívák, amelyek a fordítóprogramnak adott utasítások. Ezek szintaxisa: {$...} –A fordítói direktívák lehetnek kapcsolódirektívák, amelyek a fordító valamely tulajdonságát (pl. értékhatár-ellenőrzés) kapcsolják ki v be. (példa: {R-}, értékhatár-ellenőrzés kikapcsolása –Léteznek ún. paraméter direktívák, amelyek a fordítóprogram valamely paraméterét állítják be, pl. a memória egyes területének méretei (ld. Később, a memóriakezelésnél) –A fordítói direktívák vonatkozhatnak a forrásszöveg egészére (globális direktívák), vagy annak egy részére (lokális direktívák) –Pl. a {$R+} globális, míg a {$I+} lokális direktíva

64 4.3. A Turbo Pascal nyelv nyelvi elemei 5. Azonosítók –A Pascal programban az általunk létrehozott elemeknek (változó, konstans, típus, eljárás, függvény, objektum, metódus, unit, rekord- és objektummezők, és maga a program) nevet kell adni, hogy később hivatkozni lehessen rájuk. –A névnek egyedinek kell lennie –Az azonosító bármilyen hosszú lehet, de csak az első 63 karaktert veszi figyelembe a fordító –Az azonosítónak betűvel vagy aláhúzás karakterrel(_) kell kezdődnie –A további karakterek betűk, számok és aláhúzásjelek lehetnek –A név lehetőleg utaljon a tartalomra („beszélő” nevek, azonosítók) –Ajánlás: ha több szóból állna a név, a szavak kezdőbetűit írjuk nagybetűvel (pl. FajlBeolvas)

65 4.3. A Turbo Pascal nyelv nyelvi elemei 6. Számok –Egész és valós számokat egyaránt használhatunk, és nem csak a tízes, hanem a tizenhatos számrendszert is használhatjuk –A programban elhelyezett számértékeket számkonstansnak nevezzük –Egész megadása: előjel és számjegyek –Hexadecimális egész: $ vezeti be, és $ és $FFFFFFFF közé kell esnie –Valós számok megadása: tizedes törtként adjuk meg, vagy pedig hatványkitevős (exponenciális) alakban –A tizedest a PONT (.) jelöli, az egészrész elhagyható –A hatványkitevő előtt e vagy E áll, a kitevő pedig tetszőleges egész szám lehet

66 4.3. A Turbo Pascal nyelv nyelvi elemei 7. Szövegkonstansok –A programban elhelyezett karakterlánc (karaktersorozat, sztring) tipusú állandókat nevezzük így –A szövegkonstansban tetszőleges karakter előfordulhat –Aposztróf (egyszeres idézőjel, felsővessző, ‘, Shift+1) határolja –Ha a szövegben is szerepel felsővessző, a karaktert duplázni kell (‘Rock’’n’’roll ’) –Az üres karakterlánc jele a ‘’ –Vezérlőkaraktereket is adhatunk meg, ASCII kódjukkal, de ezeknek az aposztrófokon kívül kell lenniük, és a kódjuk elé kettőskeresztet (hash) kell tenni (#7=csengő; #13=kocsivissza, #10=soremelés) –Ha a billentyűzeten nem szereplő karaktert akarunk beírni, itt is használható a jobb oldali Alt+ a numerikus billentyűzeten a karakter kódja

67 4.3. A Turbo Pascal nyelv nyelvi elemei 8. Operandusok –A program kifejezéseiben elhelyezett állandókat, változókat és függvényhívásokat nevezzük így –Pl. a+b/sqr(x)+1.34 A,b,c,x: változók 1.34: állandó Sqr: függvényhívás (négyzetre emelés)

68 4.3. A Turbo Pascal nyelv nyelvi elemei 9. Operátorok –A program kifejezéseiben elhelyezett állandókat, változókat és függyvényhívásokat összekapcsoló műveleti jeleket nevezzük így –Jelölhetnek aritmetikai (+,-,*,/), logikai (and, or, not), és relációs (,=,>=, ) műveletet –Köztük: elsőbbségi (precedencia) szabályok –Pl. a+b/sqr(x) ,-,*,/: operátorok +,-,*,/: operátorok

69 4.3. A Turbo Pascal nyelv nyelvi elemei 9. Kifejezések –A kifejezések operátorokból és operandusokból állnak, ezen kívül zárójeleket tartalmazhatnak –Két alapvető fajtájuk az aritmetikai kifejezés és a logikai kifejezés –A logikai kifejezések értéke egy logikai érték (igaz vagy hamis) –Az aritmetikai kifejezések értéke egy számérték

70 4.4. A Pascal kifejezésekről részletesen 1. Egyoperandusú és kétoperandusú operátorok –Azt a műveleti jelet, amely egyetlen operandusa előtt szerepel, egyoperandusú operátornak nevezzük –Ilyen az előjel, és a tagadás (not) –Amennyiben az operandusok közrefogják az operátort, kétoperandusú műveletről, operátorról beszélünk –Ilyen pl. az összes aritmetikai operátor, a logikai „és” és „vagy” (and, or)

71 4.4. A Pascal kifejezésekről részletesen 2. Elsőbbségi (precedencia) szabályok –A műveletek kiértékelési sorrendjét határozzák meg –A Pascalban négy precedenciaszint van a zárójelezésen kívül, ami mindent felülbírál –Két különböző precedenciájú művelet közül mindig az erősebb hajtódik végre először –Azonos precedenciájú műveletek között a balról jobbra szabály érvényes

72 4.4. A Pascal kifejezésekről részletesen 2. Elsőbbségi (precedencia) szabályok –Legerősebbek az egyoperandusú műveletek (+,- előjelként, not, (memóriacím lekérdezés) ) –Második szint: *,/ div, mod, and, shr, shl), ezek a multiplikatív műveletek –Harmadik szint a +,- or, xor (additív műveletek) –A legutolsó szinten a relációs, összehasonlító műveletek állnak (=,,>=,, in )

73 4.4. A Pascal kifejezésekről részletesen 3. A műveletekről részletesen az adott típus tulajdonságainál beszélünk, mert: Típus= adatstruktúra a memóriában + műveletei

74 4.5. A Turbo Pascal utasításai I. Egyszerű utasítások Az egyszerű utasítások segítségével egyetlen lépésben elvégezhető műveleteket írhatunk elő a program számára

75 4.5. A Turbo Pascal utasításai I. Egyszerű utasítások 1. Üres utasítás: ; akkor használjuk, ha a nyelv szabályai miatt kell egy utasítást elhelyeznünk 2. Értékadó utasítás := 3. Eljáráshívó utasítás ;);

76 4.5. A Turbo Pascal utasításai II. Strukturált utasítások Ezekkel az utasításokkal valósíthatóak meg a tanult vezérlési szerkezetek 1. Utasításblokk (összetett utasítás): Akkor használjuk, ha a nyelv szabályai szerint CSAK EGY utasítást írhatnánk, de mégis több utasítást kell írnunk. begin ; ; … end;

77 4.5. A Turbo Pascal utasításai II. Strukturált utasítások 1. Feltételes utasítások a)Az IF utasítás – egy- és kétirányú elágazás megvalósítása if then [else ]; Feltétel: logikai kifejezés Mindkét ágban csak EGY utasítás állhat Az ELSE ág elhagyható Az ELSE előtt soha nem állhat pontosvessző

78 4.5. A Turbo Pascal utasításai II. Strukturált utasítások 1. Feltételes utasítások a)Az IF utasítás – egy- és kétirányú elágazás megvalósítása Speciális esetek (1): Egyirányú elágazás: If then ;

79 4.5. A Turbo Pascal utasításai II. Strukturált utasítások 1. Feltételes utasítások a)Az IF utasítás – egy- és kétirányú elágazás megvalósítása Speciális esetek (2): Több utasítás az egyes ágakban: If thenIf then beginbegin {utasítások}{utasítások} endend; else elsebegin{utasítások}end;

80 4.5. A Turbo Pascal utasításai II. Strukturált utasítások 1. Feltételes utasítások a)Az IF utasítás – egy- és kétirányú elágazás megvalósítása Speciális esetek (3): If utasítások egymásba ágyazása If then If then else else If then If then else else ; else ;

81 4.5. A Turbo Pascal utasításai II. Strukturált utasítások 1. Feltételes utasítások b)A CASE utasítás  Többirányú utasítás megvalósítására  Általános alakja: Case of <érték1>:;<érték2>:;..<értékN>: Else ; Else ;End;{case}

82 4.5. A Turbo Pascal utasításai II. Strukturált utasítások 1. Feltételes utasítások b)A CASE utasítás  Tudnivalók: –A végén álló end-nek nincs begin párja!!! –Minden utasítás helyére utasításblokk is írható –A feltétel helyén álló kifejezés csak sorszámozott tipusú lehet (pl: nem lehet valós, karakterlánc)

83 4.5. A Turbo Pascal utasításai II. Strukturált utasítások 1. Feltételes utasítások b)A CASE utasítás  Müködése –Az utasítás kiértékeli a feltételt –Annak az ágnak az utasítása(i) hajtódnak végre, amely a kiszámított érték ágán van –Ha a kiszámított érték nincs a case ágai előtt felsorolt értékek között, akkor az else ág hajtódik végre (ha van). Ha nincs, akkor nem hajtódik végre semmi

84 4.5. A Turbo Pascal utasításai II. Strukturált utasítások 2. Ciklusutasítások a)A WHILE.. DO utasítás  Elöltesztelő utasítás megvalósítására  Általános alakja: While do ; Tudnivalók: –Az utasítás helyére utasításblokk is írható –A feltétel a ciklusba való belépés feltétele –Ha a feltétel hamis, a ciklusmag utasítása egyszer sem hajtódik végre –Ha a feltétel igaz, akkor a ciklusmagban el kell helyezni olyan utasítást, ami megváltoztatja a feltételben szereplő kifejezés értékét, mert ha ilyen nincs, végtelen ciklus keletkezhet

85 4.5. A Turbo Pascal utasításai II. Strukturált utasítások 2. Ciklusutasítások b)A REPEAT.. UNTIL utasítás  Hátultesztelő utasítás megvalósítására  Általános alakja: Repeat until ; Tudnivalók: –A ciklusmagba több utasítás is írható, nem kell begin-end –A feltétel a ciklusból való kilépés feltétele –A ciklusmag egyszer mindenképpen végrehajtódik –Ha a feltétel hamis, akkor a ciklusmagban el kell helyezni olyan utasítást, ami megváltoztatja a feltételben szereplő kifejezés értékét, mert ha ilyen nincs, végtelen ciklus keletkezhet

86 4.5. A Turbo Pascal utasításai II. Strukturált utasítások 2. Ciklusutasítások c)A FOR.. TO/DOWNTO.. DO utasítás  Hátultesztelő utasítás megvalósítására  Általános alakja: For := to do ; For := downto do ; Tudnivalók: –To esetén a ciklusváltozó egyesével növekszik, downto esetén egyesével csökken, más lehetőség nincs –A ciklusmag ismétléseinek száma: |végérték-kezdőérték| –Ha to szerepel, és végérték

87 4.6. A Turbo Pascal adattípusai Adattípusok Egyszerűtípusok String(karakterlánc)ValósakSorszámozotttípusok Boolean(logikai)EgészekChar(karakter)FelsoroltRész-tartomány MutatótípusokStruktúrálttípusok Array(tömb)File(fájl)Record(rekord)Set(halmaz)Object(objektum)

88 I. Egyszerű típusok 1. Numerikus típusok a.Egész típusok  5 féle egész típus létezik: byte, word, shortint, integer, longint  Az egészek sorszámozott típusúak, a legkisebb érték sorszáma 0 TípusnévÉrtéktartományHelyfoglalásTárolás Byte byte Bináris Word byte Bináris Shortint byte Kettes komplemens Integer byte Kettes komplemens Longint byte Kettes komplemens

89 4.6. A Turbo Pascal adattípusai I. Egyszerű típusok 1. Numerikus típusok a.Egész típusok  Műveleteik:  Aritmetikai műveletek: +, -, * (+ és – előjelként is), DIV (osztás egészrésze), MOD (osztás maradéka)  Bitenkénti logikai műveletek (AND, OR, XOR)  Bitenkénti eltolás (SHL, SHR)

90 4.6. A Turbo Pascal adattípusai I. Egyszerű típusok 1. Numerikus típusok a.Egész típusok  A kettes komplemens ábrázolás:  Probléma: negatív értékeket nem tudunk a sima kettes számrendszerbeli tárolással leképezni a memóriában  Pozitív értékekre kettes számrendszerbeli tárolás  Negatív értékekre feltétel az, hogy ugyanazt az értéket és a negatív megfelelőjét összeadva 0-t kapjunk. Ezért az pl. nem jó, hogy 7 biten a szám, és a legfelső bit az előjel (előjel-abszolútértékes ábrázolás)  Más megoldás: inverz kódú ábrázolás: minden bitet invertálunk, a legfelső bit 1 (ez jelzi a negatívot) (ezt az ábrázolást bizonyos lyukszalag vezérlésű szerszámgépekben alkalmazzák)

91 4.6. A Turbo Pascal adattípusai I. Egyszerű típusok 1. Numerikus típusok a.Egész típusok  A kettes komplemens ábrázolás:  A jó megoldás: vegyük a szám inverzét, és adjunk hozzá 1- t, ez a kettes komplemens. Ezzel ábrázoljuk a negatív számokat.  Példa: 9= Inverze: binárisan Eredmény: -9= kettes komplemensben Decimális értékének kiszámítása: az alsó 7 bit bináris formájából el kell venni a legfelső bit értékét, vagyis: -9=

92 4.6. A Turbo Pascal adattípusai I. Egyszerű típusok 1. Numerikus típusok a.Egész típusok  A kettes komplemens ábrázolás: Összeadva a pozitívot és a negatívot: 9= binárisan -9 = kettes komplemensben Eredmény maradék 1, de azt nem vesszük figyelembe

93 4.6. A Turbo Pascal adattípusai I. Egyszerű típusok 1. Numerikus típusok b.Valós típusok  5 féle egész típus létezik: real, single, double, extended, comp  A valósak nem sorszámozott típusok  Tárolásuk úgynevezett lebegőpontos formában történik  A második négy valós típus csak a {N+} fordítói direktíva mellett lehetséges (8087-es mód bekapcsolása) TípusnévÉrtéktartományHelyfoglalásPontosság real 2.9* * byte jegy single 4 byte 7-8 jegy double 8 byte jegy extended 10 byte jegy comp EZ 64 BITES EGÉSZ TÍPUS!!! 8 byte

94 4.6. A Turbo Pascal adattípusai I. Egyszerű típusok 1. Numerikus típusok b.Valós típusok  Műveleteik:  Aritmetikai műveletek: +, -, *, /, (+ és – előjelként is)

95 4.6. A Turbo Pascal adattípusai I. Egyszerű típusok 1. Numerikus típusok b.Valós típusok  A lebegőpontos ábrázolás  Exponenciális alakban tároljuk a számot  Pl.: 3.14*10 -8  Ebben a kifejezésben a részek neve: –3.14: mantissza –-8: exponens, kitevő v. karakterisztika  A valós típusok nem 10-es számrendszerbeli exponenciális alakban, hanem kettes számrendszerbeli exponenciális alakban tárolódnak

96 4.6. A Turbo Pascal adattípusai I. Egyszerű típusok 1. Numerikus típusok b.Valós típusok  A lebegőpontos ábrázolás  Real esetben: 1 bit előjel, 39 bit mantissza és 8 bit kitevő tárolódik Előjel (1 bit) Mantissza (39 bit) Exponens (8 bit)

97 4.6. A Turbo Pascal adattípusai I. Egyszerű típusok 1. Numerikus típusok b.Valós típusok  A lebegőpontos ábrázolás  További specialitások: –A valóságban az exponens alapja nem 2, hanem 16 (ezt 16 alapú ábrázolásnak hívják –Hogy ne kelljen negatív kitevőt tárolni, a kitevőt eltolják, real esetében 64-gyel, tehát a kitevő-64 számértékét tárolják

98 4.6. A Turbo Pascal adattípusai I. Egyszerű típusok 1. Numerikus típusok b.Valós típusok  A lebegőpontos ábrázolás A 10-es számrendszerbeli alak kiszámításának képlete: N=(-1) S *0.F*10 E-64 ahol: N – a szám S – előjel F – mantissza E – exponens

99 4.6. A Turbo Pascal adattípusai I. Egyszerű típusok 1. Numerikus típusok b.Valós típusok  A lebegőpontos ábrázolás Egy példa: N=-17.25N=(-1) S *0.F*10 E-64 S= = binárisan, ezt úgy alakítjuk, hogy az egészrésze 0 legyen, és 16 hatványával legyen megszorozva. Ehhez 8 bittel kell eltolni jobbra (16*16-tal való osztás Eredmény: *16 2 Ebből következik, hogy E=64+2=66, binárisan Ezeket összerakva:

100 4.6. A Turbo Pascal adattípusai I. Egyszerű típusok 2. Logikai (boolean) típus –Csak két értéket vehet fel: igaz (true), hamis (false) –Helyfoglalása a memóriában: 1 byte –Tárolása: False: 0, true: nem 0 érték –Deklarálása: Var L:Boolean –Sorszámozott típus, a false sorszáma 0, a true sorszáma 1

101 4.6. A Turbo Pascal adattípusai I. Egyszerű típusok 3. Szöveges típusok a.Karakter típus (char) –Csak egyetlen karakter tárolására alkalmas –Helyfoglalása a memóriában: 1 byte –Tárolása: az adott karakter ASCII kódjával –Deklarálása: Var ch:char; –Sorszámozott típus, a sorszám a tárolt karakter ASCII kódja –A karakterkonstanst aposztrófok közé kell tenni, pl.: ch:=‘a’;

102 4.6. A Turbo Pascal adattípusai I. Egyszerű típusok 3. Szöveges típusok b.Karakterlánc típus (string) –Maximálisan 255 karakter tárolására alkalmas –Helyfoglalása a memóriában: 256 byte –Tárolása: az első byteon (0. sorszám) az aktuális hossz, az ezt követő byteokon a karakterek ASCII kódjai –Deklarálása: Var s:string; –Ha tudjuk, hogy biztosan nem lesz a tartalma egy bizonyos hossznál hosszabb, akkor rövidebbre is lehet deklarálni: Var s1:string[25]; Ekkor a helyfoglalás a megadott hossz+1 byte

103 4.6. A Turbo Pascal adattípusai I. Egyszerű típusok 3. Szöveges típusok b.Karakterlánc típus (string) –Műveletei:  Egy karakter kiemelése a karakterláncból: S[3]  Karakterláncok összefűzése: +

104 4.6. A Turbo Pascal adattípusai I. Egyszerű típusok 4. Sorszámozott típusok közös jellemzői –Az eddigiekből nem sorszámozott a string, és a valós típusok –A sorszámozott típusok lehetséges értékei kölcsönösen egyértelműen hozzárendelhetőek a természetes számokhoz –A legkisebb sorszám mindig 0 –A sorszámozott típusoknak vannak közös függvényeik:  Ord( : megadja az adott érték sorszámát a típuson belül  Succ( : megadja az adott típuson belül a következő értéket  Pred( : megadja az adott típuson belül az előző értéket  Low(

105 4.6. A Turbo Pascal adattípusai I. Egyszerű típusok 4. Sorszámozott típusok közös jellemzői – a felsorolás típus –Magunk is hozhatunk létre tetszőleges sorszámozott típusokat, ennek neve felsorolás (felsorolt) típus –Deklarációjuk két példa alapján:  Var nyelv: (angol, nemet, spanyol, olasz);  Var evszak: (tavasz, nyar, osz, tel); –Tudnivalók:  A felsorolt értékek azonosítók, így rájuk az azonosítókra vonatkozó szabályok érvényesek  A felsorolt értékeknek egyedieknek kell lenniük, mert ha nem azok, bizonyos függvények kiértékelése gondot okozhat: –pl. az előzőhöz: –Var tantargy (magyar, matek, angol, nemet); –Az angol és nemet értékek sorszáma nem egyértelmű!!!!  A felsorolás típusra használhatók az ord, succ, pred, low és high függvények

106 4.6. A Turbo Pascal adattípusai I. Egyszerű típusok 4. Sorszámozott típusok közös jellemzői – a résztartomány típus –Egy létező sorszámozott típusból hozhatunk létre annak egy szűkebb tartományát tartalmazó típust, ez a résztartomány (intervallum) típus –Deklarációjuk két példa alapján:  Var egyjegyu: 0..9;  Var kisbetu:’a’..’z’; –Tudnivalók:  A résztartomány típusra használhatók az ord, succ, pred, low és high függvények  Ha futás közben ellenőrizni kívánjuk azt, hogy átléptük-e a típus határát, akkor a programot a {R+} fordítói direktívával kell lefordítani

107 4.7. Alprogramok a Turbo Pascalban I. Alapok  Alprogramot akkor használunk, amikor ugyanazt a tevékenységet a program különböző helyein kell elvégezni (eddigi tudásunkkal ez csak másolással oldható meg)  Az alprogramokat a nevük segítségével aktivizáljuk (hívjuk meg).  Az alprogram a hívás hatására elvégzi az algoritmusrészében leírt tevékenységet, majd visszaadja a vezérlést a főprogramnak vagy az őt hívó alprogramnak.

108 4.7. Alprogramok a Turbo Pascalban II. Előnyeik  Az alprogramban a tevékenységet leíró programrészlet csak egyszer szerepel a programban, ezért az rövidebb és áttekinthetőbb lesz. Emiatt egyszerűbb a hibajavítás, módosítás is.  Az alprogram a struktúrált programozási nyelvek egyik legfontosabb eleme. Segítségével egy bonyolult feladat részekre bontható, és könnyebben kezelhető (ez a „felülről lefelé” (top-down) programtervezési módszer)  Az alprogram segítségével megvalósítható a program moduláris szerkezete az eddig megismert monolitikus (egy blokkból álló) programhoz képest. Az alprogram külön működő egész, amelynek saját változói, típusai, akár alprogramjai vannak, ezeket a külvilág nem ismeri, csak egy kapcsolódási felületen (interfész) kapcsolódik az őt hívó modulhoz.  Az alprogramok segítségével művelet-orientált programozás valósítható meg, a későbbi felhasználás szempontjából az alprogramok belső működése közömbös.

109 4.7. Alprogramok a Turbo Pascalban III. Az alprogramok helye a Pascal programban  Az alprogramokat a program deklarációs részében kell megírni  Két különböző fajtájú alprogram létezik: –Eljárás: a procedure foglalt szóval deklarálható, és úgy hívható, mintha a Pascal nyelvhez saját „utasítást” írtunk volna –Függvény: a function foglalt szóval deklarálható, a neve meghatározott típusú értéket hordoz, ezért csak kifejezésekben használható –Az eljárások és függvények paramétereiken keresztül kapcsolódnak a program többi részéhez

110 4.7. Alprogramok a Turbo Pascalban III. Az alprogramok helye a Pascal programban Program ; Uses {használt unitok}; {globális deklarációk:} {globális deklarációk:} Const {konstansdeklarációk}; Type {típusdeklarációk}; Var {változódeklarációk}; Procedure ( ); {lokális deklarációk,lehet const, type, var, procedure, function is} Begin {az eljárás törzsének utasításai} End; Function ( ): ; {lokális deklarációk,lehet const, type, var, procedure, function is} Begin {a függvény törzsének utasításai} :=;End;Begin {a főprogram utasításai} End.

111 4.7. Alprogramok a Turbo Pascalban IV. Az eljárásokról részletesen  Az eljárás névvel ellátott programrész, amely egy jól meghatározott részfeladat megoldására készül  Általános szerkezete: Procedure [(formális paraméter[lista])]; {lokális deklarációk, lehet benne bármilyen deklaráció, const, type, var, procedure, function} Begin {az eljárás törzse, utasítások} End;

112 4.7. Alprogramok a Turbo Pascalban IV. Az eljárásokról részletesen  A paraméterek elmaradhatnak, ilyenkor paraméter nélküli eljárásról beszélünk.  Az eljárást a nevével hívjuk meg, a következő módon: ( ); ( );  A hívás hatására a vezérlés az alprogramhoz kerül, végrehajtódnak a benne foglalt utasítások, majd a vezérlés visszakerül a hívó programhoz

113 4.7. Alprogramok a Turbo Pascalban IV. Az eljárásokról részletesen Az eljáráshívás mechanizmusa Hívó program..;...;.. Eljárás

114 4.7. Alprogramok a Turbo Pascalban V. Az eljárás paraméterei  Az eljárások paramétereit az eljárásnév után közvetlenül, kerek zárójelek között, típusmegadással kell megadni.  A paraméterek lehetővé teszik, hogy az eljárást más adatokkal hívjuk meg  Nem kötelező paramétert megadnunk  Két különböző paramétertípus létezik, az értékparaméter, és a változó paraméter  A deklaráció általános alakja: Procedure ( : ;var : );  Az első az értékparaméter, a második a változó paraméter

115 4.7. Alprogramok a Turbo Pascalban V. Az eljárás paraméterei 1.Értékparaméterek  Akkor használjuk, ha azt szeretnénk, hogy a paraméter értékét a program ne tudja megváltoztatni (elsősorban bemenő paraméterként)  Az alprogram számára csak a paraméter értéke adódik át, az, hogy az eredeti érték a memóriában hol van, NEM. Ezért az alprogram nem tudja az eredetit felülírni  Ennek a mechanizmusnak érték szerinti paraméterátadás a neve  A deklarációban (formális paraméterlista) csak típusnév szerepelhet, típusleírás nem  Az aktuális paraméterlistában az értékparaméter helyén lehet konstans, kifejezés és változónév is.  A formális és aktuális paramétereknek értékadás- kompatibilisnek kell lenniük (pl. longint paraméter helyére írhatunk byte típusú értéket, de real típusút nem)  Az eljárás hívásakor az aktuális paraméterek értéke a formális paraméterekbe másolódik  A formális paraméterek az alprogram törzsében változókként használhatók  Azonban, ha megváltoztatjuk ezek értékét, a változás nem látszik a hívó program számára

116 4.7. Alprogramok a Turbo Pascalban V. Az eljárás paraméterei 2.Változó paraméterek  Akkor használjuk, ha azt szeretnénk, hogy a paraméter értékét a program meg tudja változtatni (pl. kimenő paraméterként)  Az alprogram számára átadódik a paraméterként megadott változó címe is, ezért az alprogram felül tudja írni  Ennek a mechanizmusnak cím szerinti paraméterátadás a neve  A deklarációban (formális paraméterlista) csak típusnév szerepelhet, típusleírás nem  Az aktuális paraméterlistában az értékparaméter helyén csak változónév lehet  A formális és aktuális paramétereknek értékadás- kompatibilisnek kell lenniük (pl. longint paraméter helyére írhatunk byte típusú értéket, de real típusút nem)  Az eljárás hívásakor az aktuális paraméterek értéke a formális paraméterekbe másolódik  A formális paraméterek az alprogram törzsében változókként használhatók  Ha megváltoztatjuk ezek értékét, a változás látszik a hívó program számára

117 4.7. Alprogramok a Turbo Pascalban VI. A lokális deklarációk  Minden eljárásnak lehetnek saját változói, típusai, konstansai, és akár saját eljárásai és függvényei is  Ezek deklarációja az eljárás fejléce és törzse között helyezkedik el  A lokálisan deklarált azonosítók az eljáráson kívül nem látszanak  A lokális változók csak az eljárás meghívásakor jönnek létre a memóriában, és amikor az eljárásból kilép a program, a változó megszűnik létezni  A lokális változók a program veremterületén tárolódnak, amelynek mérete alapértelmezetten 16 K. (A veremterület maximuma 64 K)  A főprogram változói máshol tárolódnak, a program adatterületén, amelynek mérete 64 K (ez minden esetben lefoglalódik a program futásának kezdetekor)

118 4.7. Alprogramok a Turbo Pascalban VII. A pascal program blokkszerkezete  A Pascal programot a főprogram és tetszőleges mélységben egymásba ágyazott alprogramok (blokkok) alkotják  Bármelyik blokkban deklarálhatunk azonosítókat  Kérdések: –Mikor jön létre és mikor szűnik meg egy deklarált objektum? (élettartam) –A program mely részeiből érhető el (látható) az objektum azonosítója (érvényességi kör)  Válaszok: –Élettartam: Egy azonosító akkor létezik, ha a program belép abba a blokkba, ahol deklarálták, a blokkból való kilépéskor megsemmisül. A főprogram változói a program egész futása alatt léteznek.

119 4.7. Alprogramok a Turbo Pascalban VII. A pascal program blokkszerkezete  A Válaszok: –Érvényességi kör:  Minden azonosítót a felhasználási helye előtt deklarálni kell  Abban a blokkban érvényes az azonosító, ahol deklaráltuk  Minden azonosítónak egyedinek kell lennie  Ugyanazzal a névvel különböző blokkokban lehet azonosítót deklarálni  Ha egy beépített azonosítóval azonos nevet adunk, akkor az eredeti néven elérhetetlenné válik abban a blokkban (van egy lehetőség, a system előtag, pl. system.writeln(‘szia’); ezzel jelezzük, hogy a system unit beli eljárást hívjuk)  PÉLDA

120 4.7. Alprogramok a Turbo Pascalban VII. Függvények  Minden érvényes rájuk, amit az eljárásokról elmondtunk  A nevük értéket ad vissza, ezért deklarálásukkor meg kell adni a visszatérési érték típusát  A visszatérési érték típusának megadásakor csak típusnév adható meg, típusleírás nem  Kötelezően kell szerepelnie bennük legalább egy olyan sornak, ahol a függvény neve értéket kap  A visszatérési érték típusa emiatt egyszerű típus kell, hogy legyen

121 4.8. Adatszerkezetek – összetett adattípusok a TP-ban I. Általános tudnivalók  Az összetett adattípusoknak belső szerkezetük van  Általában több egyszerű adattípussal írhatók le  Minden adatszerkezetnél megtanuljuk nem csak a szerkezetét, Pascal-beli deklarálásának szabályait, hanem a rá vonatkozó speciális műveleteket is

122 4.8. Adatszerkezetek – összetett adattípusok a TP-ban II. A tömb típus  A tömb előre meghatározott számú, azonos típusú elemből álló adatszerkezet  Úgy képzelhető el, mint egy egyszerű vagy összetett típusokból felépített valahány dimenziós táblázat  Az elemekre való hivatkozást indexelésnek nevezzük, ez az egy speciális művelete van ennek az adattípusnak (szelekciós vagy kiválasztó művelet)  Két típussal írható le: az egyik az indexeléshez használt típus, a másik pedig az elemek típusa

123 4.8. Adatszerkezetek – összetett adattípusok a TP-ban II. A tömb típus  Deklarálása a Turbo Pascalban: Var :Array [ ] of Var :Array [ ] of  Az indextípus mindig valamilyen sorszámozott típus, általában intervallumtípus  Ha felsorolunk több indextípust, vesszővel kell elválasztani, és az eredmény többdimenziós tömb lesz  Az, hogy egy elemet hány indexszel tudunk azonosítani (hány indexszel hivatkozunk), megadja a tömb dimenziószámát  Az egydimenziós tömb neve vektor  Az elemtípus tetszőleges típus lehet, névvel vagy akár leírással megadva

124 4.8. Adatszerkezetek – összetett adattípusok a TP-ban II. A tömb típus  Példák: Var T1:Array [1..10] of integer; (Ez egy tízelemű, egészekből álló tömb) Hivatkozás a tömb elemeire: T1[5]:=23; (Ezzel a tömb 5. elemébe, ami egy integer típusú változó, 23-at tettünk)

125 4.8. Adatszerkezetek – összetett adattípusok a TP-ban II. A tömb típus  Példák: Var T2:Array [1..10,1..20] of integer; (Ez egy tíz sorból, minden sorban 20 egész elemből álló tömb) Hivatkozás a tömb elemeire: T2[5,16]:=23; (Ezzel a tömb 5. sorának 16. elemébe, ami egy integer típusú változó, 23-at tettünk) Természetesen többdimenziós tömböt is használhatunk, a háromdimenziósat még könnyű elképzelni, de a többit már nem egyszerű…

126 4.8. Adatszerkezetek – összetett adattípusok a TP-ban II. A tömb típus  Példák: Var T3:Array [byte] of real; (Ez egy 256 elemű, valós elemű tömb, ahol az indexelés 0-tól 255- ig tart) Var T4:Array [Boolean] of Byte; (Ez egy kételemű tömb, van egy false és egy true indexű eleme) Típusként is deklarálhatunk tömböt: Type Tomb=Array [1..100,1..10] of byte; Az indextípusokat külön szögletes zárójelbe is tehetjük mind a deklaráláskor, mind a tömbelemre történő hivatkozáskor: Var T5:Array [1..5][1..7] of longint;...T5[1][1]:=22;

127 4.8. Adatszerkezetek – összetett adattípusok a TP-ban II. A tömb típus  Helyfoglalása a memóriában –A tömb helyfoglalása az elemtípus helyfoglalásának szorzata az elemek darabszámával –Pl. Var T6:Array[1..100,1..5] of byte; Ebben az esetben a helyfoglalás 100*5*1 byte –Vigyázni kell, hogy a változóink összmérete ne haladja meg a 64 Kbyte-ot, mert a program adatszegmense minden esetben maximálisan ekkora lehet

128 4.8. Adatszerkezetek – összetett adattípusok a TP-ban II. A tömb típus  Típusfeladatok tömbökkel 1.Egydimenziós tömb feltöltése, kiíratása  Ehhez mindig for ciklust használunk, mivel tudjuk előre, hogy hány elemet kell feltölteni Pl: Var T7:Array [1..10] of integer; i:byte;.. For i:=1 to 10 do T7[i]:=Random(100); (Kiíratás ugyanígy, csak Writeln(T7[i]); szerepel)

129 4.8. Adatszerkezetek – összetett adattípusok a TP-ban II. A tömb típus  Típusfeladatok tömbökkel 2.Kétdimenziós tömb feltöltése, kiíratása  Ehhez mindig két egymásba ágyazott for ciklust használunk Pl: Var T7:Array [1..10,1..20] of integer; i,j:byte;.. For i:=1 to 10 do For j:=1 to 20 do T7[i,j]:=Random(100); (Kiíratás ugyanígy, csak Writeln(T7[i,j]); szerepel, többdimenziós esetben )

130 Kitekintés: Programozási tételek I. Mik is ezek? –A programozásban előforduló típusfeladatokra adnak általános megoldást –Az adott feladattípusnak matematikailag bizonyíthatóan helyes és a legoptimálisabb megoldását adják II. Miért most tanuljuk? –A tételek többsége több bemenő adattal végez el valamilyen átalakítást, és ehhez a tömb adatszerkezet ismerete szükséges

131 Kitekintés: Programozási tételek III. Csoportosításuk –Aszerint csoportosítjuk őket, hogy mi a bemenő és kimenő adatuk, eszerint megkülönböztetünk: a)adatsorozathoz egy adatot rendelő tételeket; b)adatsorozathoz adatsorozatot rendelő tételeket

132 Kitekintés: Programozási tételek IV. Adatsorozathoz egy értéket rendelő tételek 1.Sorozatszámítás tétel  Bemenő adat: egy N elemű adatsorozat (A tömb)  Kimenő adat: Egy érték, amelynek kiszámításához az adatsorozat minden elemét felhasználjuk  Szükséges hozzá még egy kiszámítási szabály, amely megmondja, hogy az értéket hogy kapjuk meg a sorozat elemeiből (F)  Példák: összeg, számtani közép (átlag), mértani közép, négyzetösszeg, harmonikus közép, stb.

133 Kitekintés: Programozási tételek IV. Adatsorozathoz egy értéket rendelő tételek 1.Sorozatszámítás tétel  Általános algoritmusa (összegre megírva): Eljárás Sorozatszámítás Összeg:=0 Ciklus i:=1-től N-ig Összeg:=Összeg+A(i) Ciklus vége Eljárás vége

134 Kitekintés: Programozási tételek IV. Adatsorozathoz egy értéket rendelő tételek 2.Eldöntés tétel  Bemenő adat: egy N elemű adatsorozat (A tömb)  Kimenő adat: Egy logikai érték, amely megmondja, hogy egy adott T tulajdonságú elem előfordul-e az adatsorozatban  Példák: van-e páros, páratlan, hárommal osztható, vagy olyan elem, aminek az előző eleme páratlan, stb. (tetszőlegesen bonyolultat ki lehet találni)

135 Kitekintés: Programozási tételek IV. Adatsorozathoz egy értéket rendelő tételek 2.Eldöntés tétel  Általános algoritmusa: Eljárás Eldöntés i:=1 Ciklus amíg i<=N és A[i] nem T tulajdonságú i:=i+1 Ciklus vége VAN:=i<=N Eljárás vége

136 Kitekintés: Programozási tételek IV. Adatsorozathoz egy értéket rendelő tételek 3.Kiválasztás tétel  Bemenő adat: egy N elemű adatsorozat (A tömb)  Kimenő adat: Egy adott T tulajdonságú elem sorszáma  Előfeltétel: VAN T tulajdonságú elem az adatsorozatban  Példák: számelméleti feladatok, amelyekhez nem kell tömb: keressük meg egy pozitív természetes szám legkisebb prímosztóját, stb.

137 Kitekintés: Programozási tételek IV. Adatsorozathoz egy értéket rendelő tételek 3.Kiválasztás tétel  Általános algoritmusa: Eljárás Kiválasztás i:=1 Ciklus amíg A[i] nem T tulajdonságú i:=i+1 Ciklus vége SORSZÁM:=i Eljárás vége

138 Kitekintés: Programozási tételek IV. Adatsorozathoz egy értéket rendelő tételek 4.(Lineáris) keresés tétel  Bemenő adat: egy N elemű adatsorozat (A tömb)  Kimenő adat: Egy adott T tulajdonságú elem sorszáma, és egy logikai érték, amely megmondja, volt-e T tulajdonságú elem Példák: tömbben páros elem keresése, olyan elem keresése, amely két szomszédjának számtani közepe, stb.

139 Kitekintés: Programozási tételek IV. Adatsorozathoz egy értéket rendelő tételek 4.(Lineáris) keresés tétel  Általános algoritmusa: Eljárás Keresés i:=1 Ciklus amíg i<=N és A[i] nem T tulajdonságú i:=i+1 Ciklus vége VAN:=i<=N Ha VAN akkor SORSZÁM:=i Eljárás vége

140 Kitekintés: Programozási tételek IV. Adatsorozathoz egy értéket rendelő tételek 5.Megszámolás tétel  Bemenő adat: egy N elemű adatsorozat (A tömb)  Kimenő adat: Annak darabszáma, hogy egy adott T tulajdonságú elemből mennyi van  Példák: tömbben páros elemek megszámolása, karakterláncban magánhangzószámolás, stb.

141 Kitekintés: Programozási tételek IV. Adatsorozathoz egy értéket rendelő tételek 5.Megszámolás tétel  Általános algoritmusa: Eljárás Megszámolás DB:=0 Ciklus i:=1-től N-ig Ha A(i) T tulajdonságú, akkor DB:=DB+1 Ciklus vége Eljárás vége

142 Kitekintés: Programozási tételek IV. Adatsorozathoz egy értéket rendelő tételek 6.Maximum(minimum)kiválasztás tétel  Bemenő adat: egy N elemű adatsorozat (A tömb)  Szükséges hozzá egy olyan összehasonlíthatósági tulajdonság, amely szerint a kisebb és nagyobb reláció értelmezve van  Kimenő adat: Valamilyen szempontból a legnagyobb(legkisebb) elem értéke és/vagy sorszáma

143 Kitekintés: Programozási tételek IV. Adatsorozathoz egy értéket rendelő tételek 6.Maximum(minimum)kiválasztás tétel  Általános algoritmusa (1. változat): Eljárás Maximumkiválasztás MAXIMUM:=A(1)INDEX:=1 Ciklus i:=2-től N-ig Ha A(i)>MAXIMUM akkor MAXIMUM:=A(i) INDEX:=i Ciklus vége Eljárás vége

144 Kitekintés: Programozási tételek IV. Adatsorozathoz egy értéket rendelő tételek 6.Maximum(minimum)kiválasztás tétel  Általános algoritmusa (2. változat): Eljárás Maximumkiválasztás INDEX:=1 Ciklus i:=2-től N-ig Ha A(i)>A(INDEX) akkor INDEX:=i Ciklus vége MAXIMUM:=A(INDEX) Eljárás vége

145 Kitekintés: Programozási tételek V. Adatsorozathoz adatsorozatot rendelő tételek 1.Kiválogatás tétel  Bemenő adat: egy N elemű adatsorozat (A tömb)  Kimenő adat: Az összes T tulajdonságú elem egy új tömbben (B)  A kimenő adatok tárolásához ugyanakkora tömb szükséges, mint a bemenő adatokhoz, mert nem tudjuk előre, hány T tulajdonságú elem lesz  Példák: válogassuk ki a párosakat, prímeket, stb. egy számsorozatból.

146 Kitekintés: Programozási tételek V. Adatsorozathoz adatsorozatot rendelő tételek 1.Kiválogatás tétel  Általános algoritmusa Eljárás Kiválogatás j:=0 Ciklus i:=1-től N-ig Ha A(i) T tulajdonságú akkor j:=j+1 B(j):=A(i) Ciklus vége Eljárás vége

147 Kitekintés: Programozási tételek IV. Adatsorozathoz adatsorozatot rendelő tételek 2.Szétválogatás tétel  Bemenő adat: egy N elemű adatsorozat (A tömb)  Kimenő adat: Az összes T tulajdonságú elem egy új tömbben (B), és egy másikban (C) az összes nem T tulajdonságú elem  A kimenő adatok tárolásához ugyanakkora tömbök szükségesek, mint a bemenő adatokhoz, mert nem tudjuk előre, hány T tulajdonságú elem lesz  Példák: válogassuk szét a párosakat és nem párosokat, prímeket és nem prímeket, stb. egy számsorozatból.

148 Kitekintés: Programozási tételek V. Adatsorozathoz adatsorozatot rendelő tételek 2.Szétválogatás tétel  Általános algoritmusa Eljárás Kiválogatás j:=0k:=0 Ciklus i:=1-től N-ig Ha A(i) T tulajdonságú akkor j:=j+1 B(j):=A(i) egyébként egyébkéntk:=k+1C(k):=A(i) Elágazás vége Ciklus vége Eljárás vége

149 Kitekintés: Programozási tételek IV. Adatsorozathoz adatsorozatot rendelő tételek 3.Metszet  Bemenő adat: két adatsorozat, egy N elemű (A tömb), és egy M elemű (B), amelyek azonos elemtípusúak  Kimenő adat: Az összes olyan elem egy új tömbben (C), amely mindkét tömbben előfordul  A kimenő adatok tárolásához szükséges tömb mérete N és M közül a kisebb töm elemszámával egyezik meg  A feladat átfogalmazható: válogassuk ki A azon elemeit, amelyek benne vannak B-ben, vagyis két elemi tétel összeépítésével megoldható  Példák: számok közös osztóinak megadása, két ember határidőnaplójának ismeretében azon esték meghatározása, amikor el tudnak menni együtt vacsorázni

150 Kitekintés: Programozási tételek IV. Adatsorozathoz adatsorozatot rendelő tételek 4.Únió  Bemenő adat: két adatsorozat, egy N elemű (A tömb), és egy M elemű (B), amelyek azonos elemtípusúak  Kimenő adat: Az összes olyan elem egy új tömbben (C), amely legalább az egyik tömbben előfordul  A kimenő adatok tárolásához szükséges tömb mérete N+M  A feladat átfogalmazható: másoljuk le A elemeit, majd válogassuk ki B-ből azokat az elemeket, amelyek nincsenek benne A-ban. Vagyis egy sorozatszámítás, majd egy kiválogatás, ami egy eldöntést tartalmaz.  Példák: számok közös osztóinak megadása, két ember határidőnaplójának ismeretében azon esték meghatározása, amikor el tudnak menni együtt vacsorázni

151 Kitekintés: Programozási tételek V. Rendezések  Az alapfeladat: N elemű adatsorozat (A tömb) nagyság szerinti sorbarendezése(szükséges, hogy létezzen a <,<= reláció a sorozat elemtípusára)  Léteznek olyan módszerek, amelyek új tömbbe rendezik az adatsorozatot, vagy létrehoznak egy számsorozatot, amely leírja a sorrendet (indexelés)  A következő algoritmusok azonban helyben rendeznek, a rendezett sorozat magában az eredeti tömbben keletkezik  Minden esetben, ha két elemet ezek során fel kell cserélni, a következő eljárást alkalmazzuk: Eljárás Csere(A,B) Seged:=AA:=BB:=Seged Eljárás vége Eljárás vége

152 Kitekintés: Programozási tételek V. Rendezések 1.Egyszerű cserés rendezés  Alapelv: hasonlítsuk össze a sorozat első elemét sorban minden utána következő elemmel, és ha szükséges (nála kisebbet találtunk), akkor cseréljünk. Ezzel elérjük, hogy a sorozat legkisebb eleme az első helyre kerül.  Folytassuk ugyanezt a módszert a második, harmadik…stb. elemekre  A rendezéseket aszerint jellemezzük, hogy mekkora a helyfoglalása a memóriában, hány összehasonlítás és hány mozgatás szükséges hozzá. Ezek a jellemzők az egyszerű cserés rendezésre:  Helyfoglalás: N+1 elem  Összehasonlítások száma: N*(N-1)/2 (N*N-nel arányos)  Mozgatások száma: 0 – 3*N*(N-1)/2, függ az eredeti sorozat rendezettségétől

153 Kitekintés: Programozási tételek VI. Rendezések 1.Egyszerű cserés rendezés  Általános algoritmusa Eljárás Egyszerű cserés rendezés Ciklus i:=1-től N-1-ig Ciklus j:=i+1-től N-ig Ha A(i)>A(j) akkor Csere(A(i),A(j)) Ciklus vége Eljárás vége

154 Kitekintés: Programozási tételek V. Rendezések 2.Minimumkiválasztásos rendezés  Az előző módszer hátránya a sok felesleges csere.  Ennek csökkentésére új elv: keressük meg a sorozat legkisebb elemét, majd cseréljük fel az első elemmel  Ezután keressük meg a második elemmel kezdődő sorozat legkisebb elemét, és ezt cseréljük fel a második elemmel  Helyfoglalás: N+1 elem  Összehasonlítások száma: N*(N-1)/2 (N*N-nel arányos)  Mozgatások száma: 3*(N-1), nem függ az eredeti sorozat rendezettségétől

155 Kitekintés: Programozási tételek VI. Rendezések 2.Minimumkiválasztásos rendezés  Általános algoritmusa Eljárás Minimumkiválasztásos rendezés Ciklus i:=1-től N-1-ig MIN:=I Ciklus j:=i+1-től N-ig Ha A(MIN)>A(j) akkor MIN:=j Ciklus vége Csere(A(i),A(MIN) Eljárás vége

156 Kitekintés: Programozási tételek V. Rendezések 3.Buborékrendezés  Új alapelv: mindig szomszédos elemeket cseréljünk  Először induljunk az első elemtől, és csináljuk a szomszédok hasonlítását a sorozat végéig. Ekkor a legnagyobb elem az utolsó helyre kerül, a többi pedig a helye felé mozdul el ( a kisebbek az eleje, a nagyobbak a vége felé, innen a buborékmódszer elnevezés)  Ezután ismételjük meg a cseréket, de most már csak az elsőtől az utolsó előtti elemig, mert az utolsó már jó helyen van, és így tovább  Helyfoglalás: N+1 elem  Összehasonlítások száma: N*(N-1)/2 (N*N-nel arányos)  Mozgatások száma: 0 -3*N*(N-1), függ az eredeti sorozat rendezettségétől

157 Kitekintés: Programozási tételek VI. Rendezések 3.Buborékrendezés  Általános algoritmusa Eljárás Buborékrendezés Ciklus i:=N-től 2-ig -1-esével Ciklus j:=1-től i-1-ig Ha A(j)>A(j+1) akkor Csere(A(j,A(j+1)) Ciklus vége Eljárás vége

158 Kitekintés: Programozási tételek V. Rendezések 4.Beillesztéses rendezés  Új alapelv: egyetlen elem mindig rendezett, és ha van egy rendezett részsorozatunk, abba illesszük be a megfelelő helyre az aktuális elemet  Ez a beillesztés úgy működik, hogy az útban lévő elemeket a sorozat vége felé léptetjük  Helyfoglalás: N+1 elem  Összehasonlítások száma: 0 - N*(N-1)/2 (N*N-nel arányos, függ a rendezettségtől)  Mozgatások száma: 0 -3*N*(N-1), függ az eredeti sorozat rendezettségétől

159 Kitekintés: Programozási tételek V. Rendezések 4.Beillesztéses rendezés  Általános algoritmusa Eljárás Beillesztéses rendezés Ciklus i:=2-től N-ig j:=i-1 Ciklus amíg j>0 és A(j)>A(j+1) Csere(A(j,A(j+1))j:=j-1 Ciklus vége Eljárás vége

160 Kitekintés: Programozási tételek VI. Keresések –Ebben a részben speciális keresési feladatokkal foglalkozunk –Már tanultuk a lineáris keresést, ami rendezetlen sorozatban keres –Vannak azonban rendezett sorozatra ennél hatékonyabb keresési módszerek, illetve van olyan keresés is, amelynek nem egy elem, hanem egy adatsorozat az eredménye

161 Kitekintés: Programozási tételek VI. Keresések 1.Keresés rendezett sorozatban  Bináris, vagy logaritmikus keresésnek is nevezik  Elve: az intervallumfelezés  Megvizsgáljuk a sorozat középső elemét: ha a keresett elem ennél nagyobb, akkor a továbbiakban csak a sorozat második felével foglalkozunk, ha nem, akkor az elejével  Bemenő adat: egy N elemű RENDEZETT adatsorozat (A tömb)  (feltételeztük, hogy az elemek valamilyen tulajdonság alapján sorbarendezhetők)  Kimenő adat: Egy Y értékkel megegyező elem sorszáma (SORSZAM), és egy logikai érték, amely megmondja, volt-e Y értékkel megegyező elem (VAN)

162 Kitekintés: Programozási tételek VI. Keresések 1.Keresés rendezett sorozatban  Általános algoritmusa: Eljárás BinárisKeresés E:=1U:=NCiklus K:=[(E+U)/2]{E+U felének egészrésze} Elágazás YA(K) esetén E:=K+1 Elágazás vége Amíg E Y Ciklus vége VAN:=(E<=U) Ha VAN akkor SORSZAM:=K Eljárás vége

163 Kitekintés: Programozási tételek VI. Keresések 2.Visszalépéses keresés (back-track)  Ez nem igazi keresés: itt egy speciális feladat megoldását keressük  Ez a megoldás minden esetben maga is egy sorozat  E sorozat minden egyes tagját valamilyen sorozatból kell kikeresni, de az egyes keresések összefüggnek egymással  Minden egyes új választás az összes korábbitól függhet, a későbbiektől azonban nem (ezt egy speciális F függvénnyel írjuk le)  Egyes esetekben a választás a saját jellemzőjétől is függhet (ezt egy speciális G függvénnyel írjuk majd le)

164 Kitekintés: Programozási tételek VI. Keresések 2.Visszalépéses keresés (back-track)  Példafeladatok:  Helyezzünk el egy 8x8-as sakktáblán 8 vezért úgy, hogy egyik se üsse a másikat! (lehet más bábu is)  Egy vállalat N db munkára szeretne munkásokat felvenni. Jelentkezik N db munkás, mindegyik megadja, hogy milyen munkát tudna elvégezni. Osszuk el közöttük a munkát úgy, hogy minden munka el legyen végezve, és mindenkinek jusson munka!  N bolt M pékségtől rendel kenyeret. Ismerjük a boltok kenyérigényét, a pékségek sütési kapacitását, valamint azt, hogy melyik bolt melyik pékséggel áll kapcsolatban. Adjuk meg, melyik bolt pékségből rendelje a kenyeret, ha minden bolt csak egy pékségtől rendelhet!

165 Kitekintés: Programozási tételek VI. Keresések 2.Visszalépéses keresés (back-track)  Általános algoritmusa:  A használt változók:  N:egész [a sorozatok száma, pl. a 8 oszlop a sakktáblán]  M:tömb(1..N:egész) [az egyes sorozatok elemszáma, pl. a sakktábla oszlopainak hossza]  X:tömb(1..N:egész) [a választott elemek sorszáma, pl. a mező sorszáma, ahova az adott oszlopban elhelyezzük a vezért]  VAN:logikai [akkor igaz, ha minden sorozatból megtaláltuk a megfelelőt

166 Kitekintés: Programozási tételek VI. Keresések 2.Visszalépéses keresés (back-track)  Általános algoritmusa:  Az algoritmus megírásához három eljárást kell megírnunk:  A legfelső szinten megkeressük az i. sorozatból a megfelelő elemet. Ha találtunk ilyet, akkor továbblépünk az i+1. sorozatra, ha nem találtunk, akkor visszalépünk az i-1.-re, és abban keresünk tovább  Az i. sorozatban való keresés egy lineáris keresés, külön eljárásban  Lesz még egy, a feladattól függő RosszEset függvény, amely azt írja le, hogy mi a nem megfelelő eset (pl. mikor ütik egymást a királynők)

167 Kitekintés: Programozási tételek VI. Keresések 2.Visszalépéses keresés (back-track) Általános algoritmusa: Eljárás BackTrack(N,M,X,VAN) i:=1 X(1..N):=(0,..,0) {0 jelzi, hogy az adott sorozatban nem találtunk még megfelelőt} Ciklus amíg i>=1 és i =1 és i<=N JóEsetKeresés(M,X,i,melyik,VAN) {a melyik változóban adja vissza, hogy az i. sorozatban melyik a megfelelő} Ha VAN akkor X(i):=melyik i:=i+1 {előre lépünk} i:=i+1 {előre lépünk} egyébként X(I):=0 egyébként X(I):=0 i:=i-1 {visszalépünk} i:=i-1 {visszalépünk} Elágazás vége Eljárás vége

168 Kitekintés: Programozási tételek VI. Keresések 2.Visszalépéses keresés (back-track) Általános algoritmusa: Eljárás JóEsetKeresés(M,X,i,melyik,VAN) melyik :=X(i)+1 Ciklus amíg melyik<=M(i) és RosszEset(i,X,melyik) és nem G(i,X(i) melyik:=melyik+1 Ciklus vége VAN:=(melyik<=M(I)) Eljárás vége Függvény RosszEset(i,X,melyik):Logikai j:=1 Ciklus amíg j

169 4.8. Adatszerkezetek – összetett adattípusok a TP-ban III. A halmaz típus  Vannak olyan feladatok, amelyek a halmazokkal, halmazműveletekkel oldhatóak meg könnyen, ezért vezették be a halmaz adattípust  Deklarációja a set foglalt szóval történik a következő módon:  Var :Set of ;  Megszorítások:  A halmaznak legfeljebb 256 eleme lehet  Az elemtípus csak sorszámozott típusú lehet

170 4.8. Adatszerkezetek – összetett adattípusok a TP-ban III. A halmaz típus  Példák halmaz típusú változókra: Var abc: set of ‘a’..’z’; Egyjegyu: set of 0..9; Betu: set of char;  A halmaz típusú változók sem kapnak automatikusan értéket a deklarációkor, az értékadásról nekünk kell gondoskodni  Lehetséges értékadások a következők (a halmaz típusú állandókat {konstansokat} szögletes zárójelbe kell tenni)  abc:=[] ezzel {üres halmaz lesz az értéke}  abc:=[‘a’..’z’] {teljes halmaz, vagyis minden elemet beleteszünk}  Abc:=[‘b’,’d’] {kételemű halmaz}

171 4.8. Adatszerkezetek – összetett adattípusok a TP-ban III. A halmaz típus  Alapvető halmazműveletek: a Boole-algebra műveletei - unió, metszet, és különbség  * halmazok metszete, elsődleges precedenciájú  + halmazok úniója, másodlagos precedenciájú  - halmazok különbsége, másodlagos precedenciájú  Példák: ld. tábla.  Relációs műveletek  = - egyenlőség  <> - nem egyenlő  = - részhalmaz reláció  in – tartalmazásvizsgálat (használata csak in sorrendben helyes!!!)

172 4.8. Adatszerkezetek – összetett adattípusok a TP-ban III. A halmaz típus  Egyéb halmazműveletek  Elem hozzáadása és kivétele a halmazból két módszerrel lehetséges:  A + és – operátorokkal  Az include és exclude könyvtári eljárásokkal (csak a TP 7.0-ban)  Példák:  abc:=abc+[’x’]; {egyelemű halmazzal képzett unió}  abc:=abc-[’b’]; {egyelemű halmazzal képzett különbség} Ugyanez eljárásokkal:  Include(abc,’x’);  Exclude(abc,’b’);

173 4.8. Adatszerkezetek – összetett adattípusok a TP-ban III. A halmaz típus  A halmazváltozók helyfoglalása  Minden elemet egy bit jelöl, ennek értéke 0, ha a kérdéses elem nincs benne a halmazban, és 1, ha benne van.  Vagyis a lehetséges elemek száma határozza meg a halmazváltozó méretét (bájtban számolva a lehetséges elemek száma osztva 8-cal, és felfele kerekítve)  Példa: Var szamok:set of 1..90;  Itt a helyfoglalás 12 byte, mivel a 90 bit 11*8+2, 12 egész byteban fér el, és 2 bitet használunk a 12. byteból, de azt is le kell foglalni, mivel a memória csak byteonként foglalható le

174 4.8. Adatszerkezetek – összetett adattípusok a TP-ban IV. A rekord típus  Ez a legrugalmasabb Pascal adatszerkezet  A rekord tetszőleges, de előre meghatározott számú, különböző típusú adat tárolására alkalmas adattípus  Elemeit mezőnek hívjuk  Deklarációja:  Var : Record :;..:;End;  Vagyis ez a második eset, hogy az end kulcsszó begin nélkül áll

175 4.8. Adatszerkezetek – összetett adattípusok a TP-ban IV. A rekord típus  Példa a rekord adatszerkezetre: Var datum:record ev: ;honap:1..12;nap:1..31;tennivalo:String;End;  Ennek a rekordnak 4 mezője van.  A rekordváltozók helyfoglalása a mezőik helyfoglalásának az összege (ebben az esetben ( byte)

176 4.8. Adatszerkezetek – összetett adattípusok a TP-ban IV. A rekord típus  Hivatkozás a rekord mezőire: . .  Ezt szelekciós műveletnek is nevezik  A példában: datum.ev:=2007;datum.honap:=2;datum.nap:=6;datum.tennivalo:=‘Dolgozatírás’;  A rekord mezőit csak egyenként lehet beolvasni, kiíratni, csakúgy, mint a tömbnél, de azonos típusú rekordok közt megengedett az értékadás, ahogy a tömböknél is.  A típusazonosság név szerinti egyezést jelöl, tehát érdemes használni több azonos szerkezetű rekordváltozó deklarálásánál a type típusdeklarációt  Ha a rekordot át kell adni alprogramnak, nincs is más lehetőség

177 4.8. Adatszerkezetek – összetett adattípusok a TP-ban IV. A rekord típus  A with utasítás: a rekord mezőire való hivatkozás megkönnyítése  Ha használjuk, a with utasításon belül nem kell használni a rekordazonosítót, csak a mezőazonosítót  Általános alakja:  With do utasítás;  Ha a do után több utasítást akarunk szerepeltetni, begin – end közé kell tenni

178 4.8. Adatszerkezetek – összetett adattípusok a TP-ban IV. A rekord típus  A with utasítás: a rekord mezőire való hivatkozás megkönnyítése  Példa: With datum do begin ev:=2007;honap:=2;nap:=13;End;

179 4.8. Adatszerkezetek – összetett adattípusok a TP-ban IV. A rekord típus  A with utasítás: a rekord mezőire való hivatkozás megkönnyítése  A with után több rekordazonosítót is felsorolhatunk, erre lássunk egy bonyolultabb példát: Type Cim=Record Varos:String[30];UHSZ:String[4];IRSZ:String[4];End; Type Tanulo=Record Nev:String[20];Allakh:Cim;Idlakh:Cim;End;

180 4.8. Adatszerkezetek – összetett adattípusok a TP-ban IV. A rekord típus  A with utasítás: a rekord mezőire való hivatkozás megkönnyítése Var Diakok:Array[1..30] of Tanulo;.. With Diakok[3], Allakh, Idlakh do begin Nev:=‘Bakter Bálint’; Varos:=‘Kaposvár’;End;  Kérdés: A Varos mező itt melyik alrekordra vonatkozik?  Válasz: Az Idlakh.Varos mezőt jelenti, mert a rendszer hátulról kezdi el a felsorolt rekordokban a mezőazonosítót, és az első egyezésnél megáll  Ezek értelmében a fenti szerkezet egyenértékű ezzel: With Diakok[3] do With Allakh do With Idlakh do begin Nev:=‘Bakter Bálint’; Varos:=‘Kaposvár’;End;

181 4.8. Adatszerkezetek – összetett adattípusok a TP-ban V. Közös rész az összetett adattípusokhoz: típusos konstansok  Az eddig általunk használt konstansok ún. típus nélküli konstansok voltak  Ezekkel azt érhettük el, hogy azonosítójuk helyére mind a deklarációs részben, mind az algoritmusrészben a program gépi kódjába fordítódott a konstans értéke  A típusos konstansoknak a TP-ban TELJESEN MÁS A SZEREPE: ezekkel a kezdőértékkel rendelkező változókat valósítjuk meg  Ezzel a lehetőséggel egy, akár nagyméretű változónak még fordítási időben kezdőértéket adhatunk, a program futása ezáltal gyorsabbá válik  Ennek ára az, hogy a típusos konstansokat a deklarációs részben nem használhatjuk úgy, mint a típus nélküli konstansokat

182 4.8. Adatszerkezetek – összetett adattípusok a TP-ban V. Közös rész az összetett adattípusokhoz: típusos konstansok  A típusos konstansok általános deklarálási szabálya: Const : = ;  A típusos konstansok tetszőleges típusúak lehetnek, kivéve a következőkben tárgyalandó állománytípusokat (file)

183 4.8. Adatszerkezetek – összetett adattípusok a TP-ban V. Közös rész az összetett adattípusokhoz: típusos konstansok 1.Tömb típusú tipusos konstansok  Egydimenziós tömb esetében az elemeket zárójelben kell felsorolni: Const T1:Array[1..4] of integer=(5,1,3,4); fejlec1:Array[1..4] of char=(‘T’,’e’,’v’,’e’); fejlec2:Array[1..4] of char=‘Teve’;

184 4.8. Adatszerkezetek – összetett adattípusok a TP-ban V. Közös rész az összetett adattípusokhoz: típusos konstansok 1.Tömb típusú tipusos konstansok  Többdimenziós esetben többszörös zárójelezéssel kell jelezni az összetartozó elemeket:  Ha a tömböt akarjuk típusos konstansként deklarálni, így kell: Const T2:Array[1..2,1..3] of integer=((5,1,3),(4,0,2));

185 4.8. Adatszerkezetek – összetett adattípusok a TP-ban V. Közös rész az összetett adattípusokhoz: típusos konstansok 2.Halmaz típusú tipusos konstansok  Halmaz esetében az elemeket szögletes zárójelbe kell tenni: Const Egyjegyu:Set of byte=[0,1,2,3,4,5,6,7,8,9]; ABC:Set of char=[‘a..z’,’A’..’Z’]

186 4.8. Adatszerkezetek – összetett adattípusok a TP-ban V. Közös rész az összetett adattípusokhoz: típusos konstansok 3.Rekord típusú tipusos konstansok  Rekord esetében az mezőértékeket zárójelbe kell tenni, sorrendjük csak a deklaráció sorrendje lehet, de a mezőneveket is meg kell adni: Ha deklaráljuk a Type Datum=Record Ev: ;Honap:1..12;Nap:1..31;Tennivalo:String;End; típust, akkor egy ilyen típusú típusos konstans: Const MaiNap:Datum=(Ev:2007;Honap:2;Nap:13;Tannivalo:’TIT- es óra’);

187 4.8. Adatszerkezetek – összetett adattípusok a TP-ban VI. Állománykezelés 1.Általános tudnivalók  A fájlok háttértárakon elhelyezkedő, összetartozó adatokat tároló, névvel ellátott adathalmazok  A fájlok kezelését az adatokhoz való hozzáférés szerint két csoportba oszthatjuk: a)Szekvenciális (sorrendi) fájlkezelés: a fájl adataihoz csak a háttértárra való felírás sorrendjében lehet hozzáférni.  Ilyen tárolásra példa a korai számítógépek mágnesszalagos háttértára  Itt a szalagot először a kiolvasandó adathoz kellett csévélni az adathoz való hozzáféréshez b)Direkt (közvetlen) fájlkezelés: a fájl adataihoz tetszőleges sorrendben hozzá lehet férni az író-olvasó fej pozícionálásával  A mágneslemezes tárak és a közvetlenül címezhető elektronikus memóriák elterjedésével nőtt meg a szerepe  Példa: HDD, floppy, USB-kulcsok, optikai adathordozók  Előnye a gyorsabb hozzáférés

188 4.8. Adatszerkezetek – összetett adattípusok a TP-ban VI. Állománykezelés 2.A fájlkezelés általános lépései a Turbo Pascalban  A fájlok fogalma a TP-ban a fentiektől némileg eltérő. A TP a fájlokat két csoportra osztja: a)Eszközök (devices): a számítógépben található perifériák (billentyűzet, képernyő, nyomtatók és soros kommunikációs csatornák) közvetlen elérését teszik lehetővé b)Lemezen tárolt állományok (disk files): a számítógép lemezegységein tárolt adathalmazokat jelölik. Tartalmuk alapján szöveges, típusos és típus nélküli fájlokra oszthatjuk őket

189 4.8. Adatszerkezetek – összetett adattípusok a TP-ban VI. Állománykezelés 2.A fájlkezelés általános lépései a Turbo Pascalban -1. lépés: A fájlváltozó deklarálása  A TP programból a fájlokat az ún. fájlváltozóval azonosíthatjuk.  Természetesen a fájlváltozókat is deklarálni kell, mielőtt használni szeretnénk őket  A deklaráció formája attól függ, milyen fájlt (szöveges, típusos, típus nélküli) akarunk használni, ezért erre később térünk vissza 0. lépés: A fájlváltozó és a fizikai fájl egymáshoz rendelése  Ez a lépés biztosítja, hogy az elvégzett műveletek az általunk kívánt fájlra vonatkozzanak  A TP ehhez egy beépített eljárást biztosít, ennek használata: Assign(,[ \] );

190 4.8. Adatszerkezetek – összetett adattípusok a TP-ban VI. Állománykezelés 2.A fájlkezelés általános lépései a Turbo Pascalban 1. lépés: A fájl megnyitása  A használni kívánt fájlt, mielőtt adataihoz hozzá akarunk férni, vagy bele akarunk írni, meg kell nyitni. Zárt fájllal nem végezhetők fájlműveletek  A TP ehhez beépített eljárásokat biztosít, de ezek használata attól függ, milyen fájlt (szöveges, típusos, típus nélküli) akarunk használni, ezért erre később térünk vissza  Ha a fájl megnyitásakor valamilyen hiba lép fel, a program futási hibával leáll, ami nem jó (kész programtermék ilyent nem tartalmazhat)  Az ilyen hibákat azonban a programon belül is feldolgozhatjuk, ha a kritikus programrészt a {$I-} és a {$I+} lokális fordítói direktívák közé helyezzük  A fordítói direktíva egy, a programban a fordítóprogramnak adott eljárás. A fenti direktíva ki- illetve bekapcsolja az I/O- hibák fordítóprogrammal való lekezelését.  Ha kikapcsoljuk a fordítóprogram hibakezelését, akkor az IOResult paraméter nélküli, egész visszatérési értékű függvénnyel kérdezhetjük le az utolsó I/O művelet sikerességét. Ha a művelet sikeres volt, a visszatérési érték 0, ha valamilyen hiba történt, a visszatérési érték a hibakód.

191 4.8. Adatszerkezetek – összetett adattípusok a TP-ban VI. Állománykezelés 2.A fájlkezelés általános lépései a Turbo Pascalban 2. lépés: A tulajdonképpeni fájlműveletek  A lehetséges fájlműveletek: olvasás, írás, bizonyos esetben elemtörlés, mozgás a fájlban  A TP ehhez beépített eljárásokat biztosít, de ezek használata attól függ, milyen fájlt (szöveges, típusos, típus nélküli) akarunk használni, ezért erre később térünk vissza  A fájlműveletek során jelentkező hibákhoz szintén használható az I fordítói direktíva

192 4.8. Adatszerkezetek – összetett adattípusok a TP-ban VI. Állománykezelés 2.A fájlkezelés általános lépései a Turbo Pascalban 3. lépés: A fájl lezárása  Minden fájlváltozót ugyanazzal a beépített eljárással zárunk le, melynek általános alakja:  Close( )  A lezárás után a fájlváltozó és a fizikai fájl kapcsolata megmarad, így újbóli megnyitáskor nem kell újabb Assign  A lezárás nagyon fontos, mert ez frissíti a fájl tartalmát, és ha azt módosítottuk, a lezárás hatására mentődik el.  A Pascal programból való kilépéskor minden megnyitott fájl lezárásra kerül automatikusan, de A TARTALOM MENTÉSE NÉLKÜL!!!, tehát adatvesztés léphet fel

193 4.8. Adatszerkezetek – összetett adattípusok a TP-ban VI. Állománykezelés 3.Szöveges fájlok kezelése a. Szerkezetük:  karaktereket tartalmazó, különböző hosszúságú sorokból állnak  ezek végét sorvége jel (End Of Line, EOLN) zárja le,  a fájl végén pedig fájlvége jel (End Of File, EOF) áll  Az EOLN két karakterből áll: #13#10 (CR: carriage return,kocsivissza; LF:line feed, soremelés, billentyűzetről ENTER)  Az EOF egy karakteres, #26, billentyűzetről Ctrl+Z  Ez a szerkezet a DOS alapú rendszerekben szabványos, UNIX (Linux alatt) más a sorvége jel  A szöveges fájlok szekvenciálisan kezelhető fájlok

194 4.8. Adatszerkezetek – összetett adattípusok a TP-ban VI. Állománykezelés 3.Szöveges fájlok kezelése b. Kezelésük lépései -1. lépés: Deklaráció: Var :text; 0. lépés: Összerendelés Assign(,[<útvonal>\]) 1. lépés: Megnyitás  A szöveges fájlokat háromféleképp lehet megnyitni:  Rewrite( ) – új fájl létrehozása és megnyitása írásra  Append ( ) – létező fájl megnyitása hozzáírásra  Reset ( ) – létező fájl megnyitása olvasásra  A rewrite, reset esetében az aktuális fájlpozíció a megnyitás utána a fájl elejére kerül  Append esetében az aktuális fájlpozíció az eljárás hívásakor a fájl vége

195 4.8. Adatszerkezetek – összetett adattípusok a TP-ban VI. Állománykezelés 3.Szöveges fájlok kezelése b. Kezelésük lépései 2. lépés: fájlműveletek:  A lehetséges fájlműveletek a megnyitás módjától függnek  Ha írásra nyitottuk meg a fájlt (rewrite, append), akkor csak írni lehet bele az alábbi két eljárással: Write(,)Writeln(,)  A writeln eljárás az írások végrehajtása után kiír még egy sorvége jelet is a fájlba (vagyis teljes sort ír bele)

196 4.8. Adatszerkezetek – összetett adattípusok a TP-ban VI. Állománykezelés 3.Szöveges fájlok kezelése b. Kezelésük lépései 2. lépés: fájlműveletek:  Ha olvasásra nyitottuk meg a fájlt (reset), akkor szintén két eljárással olvashatunk belőle: Read(,)ReadLn(,)  A második esetben az olvasás sor végéig történik. Ha a változók mennyisége kevesebb, mint a sorban lévő adat, a fennmaradó karakterek elvesznek  A ReadLn esetén az olvasás után az aktuális fájlpozíció a következő sor eleje

197 4.8. Adatszerkezetek – összetett adattípusok a TP-ban VI. Állománykezelés 3.Szöveges fájlok kezelése b. Kezelésük lépései 2. lépés: fájlműveletek:  Resettel való megnyitáskor mód van bizonyos ellenőrzések elvégzésére  Sorok végének érzékelése: Eoln( ) boolean értékű függvény, értéke akkor igaz, ha az aktuális fájlpozíció a sor vége SeekEoln( ) boolean értékű függvény, értéke akkor igaz, ha az aktuális fájlpozíció és a sor vége között csak szóköz vagy tabulátor karakterek állnak  A fájl végének érzékelése: Eof( ) boolean értékű függvény, értéke akkor igaz, ha az aktuális fájlpozíció a fájl vége (vagy a fájlban #26-os karaktert értünk el) SeekEof( ) boolean értékű függvény, értéke akkor igaz, ha az aktuális fájlpozíció és a fájl vége között csak szóköz, tabulátor vagy sorvége karakterek állnak

198 4.8. Adatszerkezetek – összetett adattípusok a TP-ban VI. Állománykezelés 3.Szöveges fájlok kezelése b. Kezelésük lépései 2. lépés: fájlműveletek:  Általános, a szöveges fájlt soronként beolvasó programrészlet (f a szöveges fájlváltozó, sor egy string típusú változó): While not eof(f) do begin Readln(f,sor);..End;

199 4.8. Adatszerkezetek – összetett adattípusok a TP-ban VI. Állománykezelés 3.Szöveges fájlok kezelése b. Kezelésük lépései 3. lépés: a szöveges fájl lezárása:  Close( )

200 4.8. Adatszerkezetek – összetett adattípusok a TP-ban VI. Állománykezelés 4.Típusos fájlok kezelése a. Szerkezetük  A típusos fájlok olyan adathalmazok, amelyek azonos típusú adatelemekből állnak  Az adatelemek típusa a fájl és az objektumtípusok kivételével bármilyen típus lehet  Az adatelemeket közvetlen fájlkezeléssel érhetjük el  A fájlban tárolt elemek 0-tól kezdve egyesével sorszámozódnak  A sorszám felhasználásával tetszőleges elemre pozícionálhatunk  Azt, hogy a következő művelet melyik elemre vonatkozik, a fájlmutató értéke mutatja meg

201 4.8. Adatszerkezetek – összetett adattípusok a TP-ban VI. Állománykezelés 4.Típusos fájlok kezelése b. Kezelésük lépései -1. lépés: deklaráció: Var :file of ;  Az elemtípus helyére típusleírást és típusnevet egyaránt megadhatunk, de ajánlott előre deklarált típus használata  A fájl bájtokban mért mérete a következőképpen számítható ki: elemek száma*sizeof(elemtípus) 0. lépés: a fájlváltozó és a fizikai fájl összerendelése:  Megegyezik a szöveges fájloknál tanultakkal: Assign(,[<útvonal>\]);

202 4.8. Adatszerkezetek – összetett adattípusok a TP-ban VI. Állománykezelés 4.Típusos fájlok kezelése b. Kezelésük lépései 1. lépés: megnyitás:  A típusos fájlt két módon nyithatjuk meg:  Létező fájl megnyitása olvasásra és írásra: Reset();  Új fájl megnyitása írásra (és későbbiekben való olvasásra), valamint létező fájl felülírása: Rewrite( ); Rewrite( );  Mindkét módszerrel való megnyitáskor a fájlmutató a fájl elejére, a 0. pozícióra mutat  A fájlnyitás sikerességét, mint bármilyen fájlműveletét, a $I direktíva és az IOResult függvény segítségével ellenőrizhetjük

203 4.8. Adatszerkezetek – összetett adattípusok a TP-ban VI. Állománykezelés 4.Típusos fájlok kezelése b. Kezelésük lépései 2. lépés: fájlműveletek:  Mivel a típusos fájlban nincsenek sorok, az ilyen fájlokat csak elemenként lehet írni és olvasni: Read(,,

204 4.8. Adatszerkezetek – összetett adattípusok a TP-ban VI. Állománykezelés 4.Típusos fájlok kezelése b. Kezelésük lépései 2. lépés: fájlműveletek:  Újdonság a típusos fájlnál, hogy a direkt fájlkezelés miatt a fájlmutató mozgatható (pozícionálható) a fájlban, az erre szolgáló eljárás: Seek(,);  Az index egész típusú kifejezés lehet  Ha a fájl vége után pozícionálunk, olvasásnál Disk read error hibaüzenetet kapunk, írásnál a fájlt kiterjeszti a rendszer az adott pozícióigb (határozatlan értékű elemekkel)  Hibajelzést kapunk negatív index esetén is

205 4.8. Adatszerkezetek – összetett adattípusok a TP-ban VI. Állománykezelés 4.Típusos fájlok kezelése b. Kezelésük lépései 2. lépés: fájlműveletek:  Van két függvény, amely segíti a fájlkezelést és a pozícionálást a típusos fájlban:  Az aktuális fájlpozíció lekérdezése: Filepos()  A függvény visszatérési értéke longint típusú  A fájl elemszámának lekérdezése: FileSize()  Ez a függvény is longint típusú értékkel tér vissza, ha a fájl üres, 0-t ad visszatérési értékként

206 4.8. Adatszerkezetek – összetett adattípusok a TP-ban VI. Állománykezelés 4.Típusos fájlok kezelése b. Kezelésük lépései 2. lépés: fájlműveletek:  Példák az előzőek használatára (f típusos fájlváltozóval): Seek(f,FileSize(f)); (Ugrás az utolsó elem utáni pozícióra) Seek(f,Filepos(f)-1); (Ugrás az előző pozícióra)

207 4.8. Adatszerkezetek – összetett adattípusok a TP-ban VI. Állománykezelés 4.Típusos fájlok kezelése b. Kezelésük lépései 2. lépés: fájlműveletek:  A fájl végének levágása: Truncate();  Ez az eljárás az aktuális pozíciótól kezdve kitörli az elemeket a fájlból  Példa: Seek(f,0);Truncate(f);  Ezzel a két eljáráshívással a fájl egész tartalmát töröljük

208 4.8. Adatszerkezetek – összetett adattípusok a TP-ban VI. Állománykezelés 4.Típusos fájlok kezelése b. Kezelésük lépései 3. lépés: Lezárás: Close();  Használata megegyezik a szöveges fájlnál tanultakkal

209 4.8. Adatszerkezetek – összetett adattípusok a TP-ban VI. Állománykezelés 5.Típus nélküli fájlok kezelése a. Szerkezetük  A típus nélküli fájlok olyan adathalmazok, amelyek azonos méretű (bájtszámú) blokkokból állnak  Akkor használunk ilyen fájlokat, amikor a fájlkezelés során a fájlok tartalma közömbös (pl. fájlmásolás, képernyőtartalom elmentése fájlba, stb.)  Az blokkokat közvetlen fájlkezeléssel érhetjük el  A fájlban tárolt blokkok 0-tól kezdve egyesével sorszámozódnak  A sorszám felhasználásával tetszőleges blokkra pozícionálhatunk  Azt, hogy a következő művelet melyik blokkra vonatkozik, a fájlmutató értéke mutatja meg

210 4.8. Adatszerkezetek – összetett adattípusok a TP-ban VI. Állománykezelés 5.Típus nélküli fájlok kezelése b. Kezelésük lépései -1. lépés: deklaráció: Var :file;  Ennél a lépésnél még nem dől el a fájl blokkjainak mérete 0. lépés: a fájlváltozó és a fizikai fájl összerendelése:  Megegyezik a szöveges fájloknál tanultakkal: Assign(,[<útvonal>\]);

211 4.8. Adatszerkezetek – összetett adattípusok a TP-ban VI. Állománykezelés 5.Típus nélküli fájlok kezelése b. Kezelésük lépései 1. lépés: megnyitás:  A típus nélküli fájlt két módon nyithatjuk meg:  Létező fájl megnyitása olvasásra és írásra: Reset([,]);  Új fájl megnyitása írásra (és későbbiekben való olvasásra), valamint létező fájl felülírása: Rewrite( [, ]); Rewrite( [, ]);  A második paraméter egész típusú kifejezés  Ha elhagyjuk, az alapértelmezett blokkméret 128 byte  Legtöbb gépen az optimális sebesség eléréséhez a blokkméret 512 többszöröse kell, hogy legyen  Ha a fájl mérete nem osztható a blokkmérettel, a fájl végén lévő töredék blokk nem érhető el (megoldás:1 bájtos blokkméret)  Mindkét módszerrel való megnyitáskor a fájlmutató a fájl elejére, a 0. blokkra mutat  A fájlnyitás sikerességét, mint bármilyen fájlműveletét, a $I direktíva és az IOResult függvény segítségével ellenőrizhetjük

212 4.8. Adatszerkezetek – összetett adattípusok a TP-ban VI. Állománykezelés 5.Típus nélküli fájlok kezelése b. Kezelésük lépései 2. lépés: fájlműveletek:  A típus nélküli fájlokat blokkonként lehet írni és olvasni: Blockread(,,[,]); Blockwrite(,, [, ]);  Írás és olvasás is történhet egyesével, és egyszerre több blokk is írható vagy olvasható, de meg kell adni, hány blokkot akarunk írni, vagy olvasni  Írás és olvasás után is a fájlváltozó az utoljára írt/olvasott UTÁNI elemre mutat  A rendszer nem ellenőrzi, hogy a puffer mérete és a blokkszám*blokkméret egyenlő-e, erről a programozónak kell gondoskodnia  Korlát: blokkszám*blokkméret<65535 (64K)  A típus nélküli fájlnál is lekérdezhető az, hogy a fájlmutató az utolsó blokk utáni EOF-jelre (vagy darab blokkra) mutat-e, az Eof( ) függvénnyel  Ha a fájl végén állunk, akkor az írás során a fájl kiegészül az éppen írt blokkokkal, és a fájlmutató továbbra is a fájl végére mutat

213 4.8. Adatszerkezetek – összetett adattípusok a TP-ban VI. Állománykezelés 5.Típus nélküli fájlok kezelése b. Kezelésük lépései 2. lépés: fájlműveletek:  Itt is elvégezhető a fájlmutató mozgatása, de blokkonként: Seek(,);  Az aktuális fájlpozíció lekérdezése: Filepos()  A függvény visszatérési értéke longint típusú  A fájl méretének lekérdezése: FileSize()  Az értéke fájlméret(bájtban) div blokkméret(bájtban), vagyis az egész blokkok számát adja meg (longint)

214 4.8. Adatszerkezetek – összetett adattípusok a TP-ban VI. Állománykezelés 5.Típus nélküli fájlok kezelése b. Kezelésük lépései 2. lépés: fájlműveletek:  Itt is lehetséges a fájl végének levágása: Truncate(); 3. lépés: Lezárás: Close();  Használata megegyezik a szöveges és típusos fájlnál tanultakkal

215 4.8. Adatszerkezetek – összetett adattípusok a TP-ban VI. Állománykezelés 6.Operációs rendszeri funkciók megvalósítása TP programból a. Állományok törlése és átnevezése  Ezekhez a műveletekhez egymáshoz kell rendelni a fájlváltozót és a fizikai fájlt az Assign eljárással  A törlés eljárása: Erase();  Az átnevezés eljárása: Rename(, );  Az új név string tipusú paraméter  A művelet sikeressége ezeknél az eljárásoknál is lekérdezhető az IOResult függvénnyel a {$I-} után  Nyitott fájlokra egyik művelet sem alkalmazható

216 4.8. Adatszerkezetek – összetett adattípusok a TP-ban VI. Állománykezelés 6.Operációs rendszeri funkciók megvalósítása TP programból b. Könyvtárműveletek  Könyvtárváltás: chdir(<útvonal>);  Könyvtár létrehozása: mkdir(<útvonal>);  Könyvtár törlése: rmdir(<útvonal>)  Az útvonal paraméter minden esetben string típusú  A művelet sikeressége ezeknél az eljárásoknál is lekérdezhető az IOResult függvénnyel a {$I-} után  Az aktuális könyvtár lekérdezése: getdir(,);  A meghajtó paraméter: 0, ha az aktuális meghajtót akarjuk lekérdezni, 1 az A:, 2 a B:, 3 a C: stb.  A könyvtárnév változóban az aktuális könyvtárhoz vezető teljes útvonal keletkezik  Ha a megadott meghajtó nem létezik, a visszatérési érték az adott meghajtó főkönyvtára lesz

217 4.9. TP Grafika I. Alapismeretek 1.A grafikus vezérlők  Mivel a TP fejlesztése ma már nem folyik, a legnagyobb felbontás, amit a TP grafikus rendszere kezelni tud, a VGA: 640x480, 16 színű üzemmódban  Az ennél fejlettebb grafikus hardvert a TP VGA-ként kezeli  A régebbi vezérlők használatáról nem szólok, mivel nincs gyakorlati jelentőségük  Az itt megtanult eljárások többsége a Delphi alatt is használható, ott a Canvas objektumra hasonlóan rajzolhatunk

218 4.9. TP Grafika I. Alapismeretek 2.A TP grafikus rendszere  Mivel ugyanaz a Pascal program jó lenne, ha különböző grafikus hardveren is futtatható lenne, ezért a grafikus rendszer egy része a gépben lévő grafikus hardvertől független, másik része viszont függ attól  Mindkét rész tartalmaz olyan részt, amit a TP tartalmaz  A következő dia ezen részek egymásra épülését szemlélteti

219 4.9. TP Grafika I. Alapismeretek 2.A TP grafikus rendszere  A GRAPH.TPU állomány tartalmazza a grafikus eljárásokat, függvényeket, konstansokat, ezt hozzá kell szerkeszteni a programunkhoz (ez a graph unit)  Az EGAVGA.BGI tartalmazza a VGA szabványú illesztőprogramot a TP-hoz (Borland Graphics Interface) A Pascal program GRAPH.TPU EGAVGA.BGI Grafikus kártya

220 4.9. TP Grafika I. Alapismeretek 2.A TP grafikus rendszere  A grafikus program lefordításához szükség van a System unitot tároló TURBO.TPL állományra (mint eddig is),  valamint a GRAPH.TPU állományra  A grafikus program futtatásához szükség van a megfelelő.BGI fájlra,  és ha szöveget is írunk, akkor a karakterkészletet tároló.CHR állományra (GOTH.CHR, SANS.CHR, TRIP.CHR, LITT.CHR, de saját.CHR is készíthető)  A grafikus rendszer a működéséhez szükséges memóriát a program ún. halomterületéből (heap) foglalja le

221 4.9. TP Grafika I. Alapismeretek 3.A grafikus koordinátarenszer  A grafikus koordinátarendszer origója a képernyő bal felső sarka, ennek koordinátája (0,0)  A bal alsó sarok a (0,479), a jobb felső a (639,0), a jobb alsó a 639,479) pont  Grafikus módban az aktuális rajzpozíciót a grafikus kurzor tárolja, ami a szöveges mód kurzorával ellentétben nem látható (current pointer)  Egyes eljárások mozgatják a grafikus kurzort, mások nem  A grafikus képernyőn is definiálhatunk ablakot, és meghatározhatjuk, hogy az ablakon kívüli rajzok látsszanak-e vagy nem  A grafikus eljárásokban a szögeket fokokban kell megadni, a matematikai szabályok szerint

222 4.9. TP Grafika I. Alapismeretek 4.A grafikus rendszer inicializálása és bezárása (áttérés grafikus módba és visszatérés karakteresbe)  A legelső teendő, hogy a grafikus módot használni tudjuk, a graph unit hozzászerkesztése a programhoz: Uses Graph;  Ez után inicializálni kell a grafikus rendszert az alábbi módon:

223 4.9. TP Grafika I. Alapismeretek 3.A grafikus rendszer inicializálása és bezárása (áttérés grafikus módba és visszatérés karakteresbe) Var gvezerlo, gmod, hibakod:integer; BeginDetectGraph(gvezerlo,gmod);Initgraph(gvezerlo,gmod,’C:\TP\BGI’);hibakod:=GraphResult; If hibakod<>GrOK then Writeln(‘Grafikus hiba:’,GraphErroeMsg(Hibakod) Writeln(‘Grafikus hiba:’,GraphErroeMsg(Hibakod) else begin else begin {A program grafikus része} CloseGraph;end;End. II. Grafikus eljárások és függvények  Ld. Külön kiadott segédanyagban

224 5. Speciális programozási módszerek I. Rekurzió  A matematikában rekurzívnak nevezik az olyan meghatározásokat, amelyek valamilyen módon önmagukat tatrtalmazzák.  Pl: a faktoriális rekurzív definíciója:  n!=1, ha n=0, ha pedig n>0, akkor n*(n-1)!  A programozásban akkor beszélünk rekurzióról, ha egy alprogram meghívja önmagát

225 5. Speciális programozási módszerek I. Rekurzió  A rekurzió lehet közbetett és közvetlen:  Közvetlen, ha az eljárás, vagy függvény önmagát hívja;  Közvetett, ha A eljárás meghívja a B eljárást, majd B eljárás hívja meg az A eljárást.  Ez utóbbi látszólag ellentmond a Pascal nyelv szabályainak, mivel egy azonosító csak akkor használható, ha már deklarálták  E probléma áthidalására használható az előzetes deklaráció, amelyet a forward kulcsszóval lehet megvalósítani (példák a következő oldalakon)

226 5. Speciális programozási módszerek I. Rekurzió Program Kozvetlen_Rekurzio; Procedure A(N:Byte); BeginWriteln(N); If N>0 then A(N-1); End;BeginA(10);End.

227 5. Speciális programozási módszerek I. Rekurzió Program Kozvetett_Rekurzio; Procedure A(N:Byte);Forward; Procedure B(M:Byte); BeginWriteln(M); If M>0 then A(M-1); End; Procedure A; BeginWriteln(N); If N>0 then B(N-1); End;BeginA(10);End.

228 5. Speciális programozási módszerek I. Rekurzió –A forward kulcsszót tartalmazó sorban kell szerepelnie a formális paraméterlistának –Azon a helyen, ahol az alprogramot valójában megírjuk, már csak a nevét kell használni a procedure, vagy a function kulcsszó után –Rekurzív híváskor a program veremterületén (stack) az alprogram paramétereiből és lokális változóiból minden hívás alkalmával újabb példány képződik –Minden esetben gondoskodni kell a rekurzió befejeződéséről, mert ellenkező esetben a program végtelen ciklushoz hasonló helyzetbe kerül, újabb és újabb hívásokra kerül sor, és a veremterület elfogyásakor a program veremtúlcsordulással (stack overflow error) leáll –Erre a célra valamilyen elágazást szokás használni

229 5. Speciális programozási módszerek I. Rekurzió –Minden ciklust (iterációt) tartalmazó program átírható rekurzív formára –Ez az átírás azonban nem éri meg, mivel sok rekurzív hívás esetén nagy a memóriaigény, és sok átadott paraméter, lokális változó használatakor időigényes is –Ezért a rekurziót akkor használjuk, ha maga a megoldandó probléma rekurzív, vagy a programozási nyelv nem biztosít ciklusutasításokat (pl. LOGO) –Léteznek úgynevezett rekurzív adatszerkezetek (pl. bináris fa, ld. Később), amelyek feldolgozásakor mindig rekurzív algoritmust használunk –Közismertebb rekurzív problémák:  Faktoriális  Fibonacci-sorozat  Hanoi tornyai  Rekurzív geometriai alakzatok rajzolása (Sierpinsky-csipke, fraktálok)

230 5. Speciális programozási módszerek II. Memóriahasználat 1.Alapismeretek  Célunk: a RAM minél hatékonyabb használata (bár alapesetben a memóriát az operációs rendszer kezeli)  A memóriát a változókon keresztül értük el eddig, és ez után is ez történik, de:  Az eddig használt változók vagy a program egész futása alatt foglalták a helyet a memóriában (globális változók),  vagy addig léteznek, amíg az az alprogram fut, amelyben deklarálták őket  Ezt a kettőt együttesen STATIKUS VÁLTOZÓnak hívják  Ezek mérete a deklaráláskor dől el, program közben nem módosítható (pl. tömbök)  Ha a memóriát a programozó szeretné lefoglalni és felszabadítani, DINAMIKUS VÁLTOZÓt kell használnia

231 5. Speciális programozási módszerek II. Memóriahasználat 1.Alapismeretek  A különböző csoportba tartozó változók a program memóriaterületének különböző részein foglalnak helyet: –Globális változók: adatszegmens (data segment) –Alprogramok változói: veremterület (stack) –Dinamikus változók: halomterület (heap) 2.Dinamikus változók  A dinamikus változók használatához (és egyben a heap eléréséhez) új tipusú változó kell:  Mutató (pointer) típus –Tartalma: egy memóriacím –Helyfoglalása: 4 byte –Fajtái:  típusos és  típus nélküli mutató

232 5. Speciális programozási módszerek II. Memóriahasználat 2.Dinamikus változók  Elsőként csak a típusos mutatóval foglalkozunk  Azért nevezik így, mert mindig adott, hogy milyen típusú változóra mutat  Az általa mutatott változó típusa a deklarációjakor dől el  Deklarálása: Var :^ Var :^  Példák: Var p1:^integer; pstring:^string Type t=Array [1..100] of real; Var pt:^t;

233 5. Speciális programozási módszerek II. Memóriahasználat 2.Dinamikus változók  A mutató deklarációjakor még csak a mutató számára foglalódik le a hely, az általa mutatott változónak nem!!!!  A mutató által mutatott változónak használata előtt le kell foglalni a helyet (ettől dinamikus a változó)  Erre a célra New könyvtári eljárást kell használni  Használata: New( );  Példák: New(p1);New(pstring);New(pt);

234 5. Speciális programozási módszerek II. Memóriahasználat 2.Dinamikus változók  A dinamikus változóknak a hely a halomterületen foglalódik le, ha ott nincs elég hely, „Heap overflow error” futási hibaüzenetet kapunk  A mutató által mutatott változót ezek után ugyanúgy használhatjuk, mint a statikus változókat, csak a rájuk való hivatkozás mikéntje más: ^ ^  Példák: P1^:=23;Pstring^:=‘Tesa’; For i:=1 to 100 do pt^[i]:=Random; (kiolvasás: p1 által mutatott, stb.)

235 5. Speciális programozási módszerek II. Memóriahasználat 2.Dinamikus változók  A dinamikus változók számára fenntartott memóriaterületet, miután azt már nem használjuk, fel kell szabadítani  Erre a célra a Dispose könyvtári eljárást kell használni: Dispose( );  Példák: Dispose(p1);Dispose(pstring);Dispose(pt);  Ennek hatására a halomterületen lefoglalt hely felszabadul, újra használható más dinamikus változók számára

236 5. Speciális programozási módszerek II. Memóriahasználat 2.Dinamikus változók  A halomterület kezeléséhez vannak kiegészítő függvények és eljárások: –Üres halomterület méretének lekérdezése: MemAvail függvény –A legnagyobb összefüggő szabad memóriaterület méretének lekérdezése a halomterületen: MaxAvail függvény  A dinamikus változók használata nem a fenti példák által mutatott esetekben, hanem nagy mennyiségű adat egyidejűleg memóriában tartásakor ajánlott, illetve akkor, ha nem tudjuk előre, mennyi adatunk lesz  Vannak úgynevezett dinamikus adatszerkezetek, amelyek megvalósítása csak a mutató típus segítségével lehetséges

237 5. Speciális programozási módszerek II. Memóriahasználat 3.Dinamikus adatszerkezetek  A dinamikus adatszerkezetek kihasználják a dinamikus változók nyújtotta lehetőségeket  Négy adatszerkezetet tekintünk át, ezek a lista, a sor, a verem és a bináris fa  A listával és a bináris fával gyakorlatban is foglalkozunk, a másik kettőnek csak az elméleti tudnivalóit sajátítjuk el  Minden dinamikus adatszerkezetet úgynevezett láncolási technikával valósítanak meg  Ennek lényege, hogy az adatok mellett egy mutatót is el kell tárolni, amely a következő adatra, adatokra mutat

238 5. Speciális programozási módszerek II. Memóriahasználat 3.Dinamikus adatszerkezetek a. Lista  Szerkezetét rajzokon keresztül mutatom be  Másik neve: láncolt lista. Fajtái: –Egyirányban láncolt lista –Kétirányban láncolt lista –Gyűrűs lista (ez is lehet egy- és kétirányban láncolt)  A gyakorlaton az egyirányban láncolt listát valósítjuk meg TP nyelven

239 5. Speciális programozási módszerek II. Memóriahasználat 3.Dinamikus adatszerkezetek a. Lista  Egyirányban láncolt lista: Listafej (mutató) adat Következőre mutató pointer NIL Aktuális elem (mutató)

240 5. Speciális programozási módszerek II. Memóriahasználat 3.Dinamikus adatszerkezetek a. Lista  Kétirányban láncolt lista: Listafej (mutató) adat Következőre mutató pointer NIL ElőzőreMutatópointer NIL Listaláb (mutató) Aktuális elem (mutató)

241 5. Speciális programozási módszerek II. Memóriahasználat 3.Dinamikus adatszerkezetek a. Lista  Gyűrűs lista (egyirányban láncolva): Aktuális elem (mutató) adat Következőre mutató pointer

242 5. Speciális programozási módszerek II. Memóriahasználat 3.Dinamikus adatszerkezetek a. Lista  Egyirányban láncolt lista megvalósítása Turbo Pascalban –Önmagát magában foglaló típus deklarációjára van szükség –Emellett meg kell fogalmazni, milyen műveletek értelmezhetők a listán, és ezeket alprogrammal meg kell valósítani –A típus deklarációja: Type PElem=^ListaElemTip ListaElemTip=Record Adat:{amilyen típusú adatot akarunk tárolni} Kov:PElem;End;

243 5. Speciális programozási módszerek II. Memóriahasználat 3.Dinamikus adatszerkezetek a. Lista  Egyirányban láncolt lista megvalósítása Turbo Pascalban Műveletei: –Üres lista létrehozása (eljárás) –Üresség lekérdezése (függvény) –A lista tele voltának lekérdezése (függvény) –Következő elemre állás (eljárás) –Első elemre állás (eljárás) –Elem beszúrása az aktuális elem mögé (eljárás) –Elem beszúrása az első helyre (eljárás) –Aktuális utáni elem törlése (eljárás) –Elem törlése az első helyről (eljárás) –Lista feldolgozása (egész lista bejárása, kiírás, stb. – eljárás)

244 5. Speciális programozási módszerek II. Memóriahasználat 3.Dinamikus adatszerkezetek a. Lista  Előnyei: –Sokkal több adat tartható egyidőben a memóriában, mint a tömbök esetén –Nem kell előre tudnunk, hogy mennyi adat lesz  Hátrányai: –Nehézkes az elemekhez való hozzáférés (csak sorosan lehetséges) –Némi felesleges tárolás is történik (mutatók)

245 5. Speciális programozási módszerek II. Memóriahasználat 3.Dinamikus adatszerkezetek b. Sor  Alapelve: amit először beleteszünk, az vehető ki először belőle  Ezért általánosan FIFO-tárnak is nevezik (First In – First Out  Angol neve: queue vagy pipe  Példa a használatára: billentyűzetpuffer, nyomtatási sor  Megvalósítható statikusan és dinamikusan is, de a dinamikus megvalósítás az optimálisabb  Maga az adatszerkezet a dinamikus megvalósításnál a listához hasonló, csak a műveletek mások

246 5. Speciális programozási módszerek II. Memóriahasználat 3.Dinamikus adatszerkezetek b. Sor  Műveletei: –Üres sor létrehozása (eljárás) –Üresség lekérdezése (függvény) –A sor tele voltának lekérdezése (függvény) –Egy elem elhelyezése a sor végén (eljárás) –Egy elem elvétele a sor elejéről (eljárás)

247 5. Speciális programozási módszerek II. Memóriahasználat 3.Dinamikus adatszerkezetek c. Verem  Alapelve: amit utoljára beleteszünk, az vehető ki először belőle  Ezért általánosan LIFO-tárnak is nevezik (Last In – First Out  Angol neve: stack  Példa a használatára: alprogramok visszatérési címének és lokális változóinak tárolása  Megvalósítható statikusan és dinamikusan is, de a dinamikus megvalósítás az optimálisabb  Maga az adatszerkezet a dinamikus megvalósításnál a listához hasonló, csak a műveletek mások

248 5. Speciális programozási módszerek II. Memóriahasználat 3.Dinamikus adatszerkezetek c. Verem  Műveletei: –Üres verem létrehozása (eljárás) –Üresség lekérdezése (függvény) –A verem tele voltának lekérdezése (függvény) –Legfelső elem lekérdezése –Egy elem elhelyezése a verem tetején (eljárás) –Egy elem elvétele a verem tetejéről (eljárás)

249 5. Speciális programozási módszerek II. Memóriahasználat 3.Dinamikus adatszerkezetek d. Bináris fa  A fa, mint matematikai fogalom a gráfhoz kötődik  A gráf élekből és csomópontokból álló matematikai alakzat  Az irányított gráf olyan gráf, amelynek az éleinek iránya van (ezt nyíllal jelöljük rajzban)  A fa olyan gráf, amelyben nincs az élekből alkotott hurok  A bináris fa olyan irányított gráf, amely fa, és amelyben minden elemben egy él végződik, és minden elemből legfeljebb két él indul ki  Az elemhez tartozó két elemet gyerekelemnek hívjuk, amihez kapcsolódnak, az pedig a szülőelem  Az egy elemhez tartozó teljes fát részfának hívjuk, ilyenből is maximum kettő lehet: bal és jobb részfa  A bináris fa kiinduló elemét gyökérelemnek nevezzük

250 5. Speciális programozási módszerek II. Memóriahasználat 3.Dinamikus adatszerkezetek d. Bináris fa  A bináris fa is megvalósítható statikus és dinamikus módon, de a dinamikus megvalósítás az optimálisabb  Megvalósításakor a csomópontban tárolt adat mellett KÉT mutatót kell tárolnunk, amely a két részfa kiinduló elemére mutat (ha nincs részfa, akkor értékük NIL)  A bináris fa rekurzív adatszerkezet: hiszen minden elem bal és jobb részfája is bináris fa, így tartalmazza önmagát…

251 5. Speciális programozási módszerek II. Memóriahasználat 3.Dinamikus adatszerkezetek d. Bináris fa Gyökér Aktuális elem Aktuális elem NIL NIL NIL NIL NIL NIL NIL

252 5. Speciális programozási módszerek II. Memóriahasználat 3.Dinamikus adatszerkezetek c. Bináris fa  Bejárások –Az a céljuk, hogy egy elkészített bináris fa minden elemét feldolgozzuk –Három féle szisztematikus bejárás létezik, attól függően, hogy a bejárási sorrend milyen –Ezek a bejárások rekurzívak!!!!

253 5. Speciális programozási módszerek II. Memóriahasználat 3.Dinamikus adatszerkezetek c. Bináris fa  Bejárások –Preorder (Közép-Bal-Jobb, KBJ) bejárás  Alapelve: Előbb feldolgozzuk az aktuális elemet, majd bejárjuk a bal részfát preorder módon, ezután pedig a jobb részfát preorder módon

254 5. Speciális programozási módszerek II. Memóriahasználat 3.Dinamikus adatszerkezetek c. Bináris fa  Bejárások –Inorder (Bal-Közép-Jobb, BKJ) bejárás  Alapelve: Előbb bejárjuk a bal részfát inorder módon, ezután feldolgozzuk az aktuális elemet, végül bejárjuk a jobb részfát inorder módon

255 5. Speciális programozási módszerek II. Memóriahasználat 3.Dinamikus adatszerkezetek c. Bináris fa  Bejárások –Posztorder (Bal-Jobb-Közép, BJK) bejárás  Alapelve: Előbb bejárjuk a bal részfát posztorder módon, ezután bejárjuk a jobb részfát posztorder módon, majd feldolgozzuk az aktuális elemet

256 5. Speciális programozási módszerek II. Memóriahasználat 3.Dinamikus adatszerkezetek c. Bináris fa  Felhasználása –Vannak úgynevezett rendezett fák: itt minden elemre igaz, hogy az elem bal részfájában elhelyezkedő elemek a kérdéses elemnél kisebbek vagy egyenlőek, a jobb részfájában elhelyezkedő elemek pedig nagyobbak –Ezeket a fákat rendezésre és keresésre használhatjuk fel (keresőfák, rendezőfák) –A rendezés elve: rendezetten feltöltött bináris fát inorder módon bejárva az elemeket növekvő sorrendben dolgozzuk fel

257 5. Speciális programozási módszerek II. Memóriahasználat 3.Dinamikus adatszerkezetek c. Bináris fa  Műveletei: –Üres fa létrehozása (eljárás) –Üresség lekérdezése (függvény) –A fa tele voltának lekérdezése (függvény) –Annak lekérdezése, hogy ág végén állunk-e (függvény) –Gyökérelemre állás (eljárás) –Mozgás a fában a következő elemre (csak az ágak felé, eljárás) –Elem beszúrása a gyökérbe (tulajdonképpen egyelemű fa feltöltése adattal, eljárás) –Két bináris fa összeillesztése (eljárás) –Részfa törlése (eljárás)

258 5. Speciális programozási módszerek II. Memóriahasználat 3.További lehetőségek a memória elérésére a. A szegmentált címzés a 16 bites környezetben (DOS ablak) –A 8086/88-os processzor 16 bites processzor, ami azt jelenti, hogy 2 byteos adatokkal dolgozik, legyen szó igazi adatokról, vagy memóriacímekről (2 byteosak a processzor belső tárolói, regiszterei) –Azonban ez a processzor 1 Mbyte fizikai memória címzésére alkalmas, ami 20 bites cím használatát jelenti –Ezt az ellentmondást át kell hidalni valahogy, erre találták ki a szegmentált címzést –Ennek alapelve, hogy minden tizenhatodik fizikai cím alsó 4 bitje 0000, így ezen címek azonosításához elég a felső 16 bit –Ezzel a 16 bittel kijelölhetünk egy 64 kilobyteos részt a memóriában, amelynek fizikai kezdőcíme a szegmenscím*16 –A szegmensen belüli pontos címet még egy 16 bites számmal, az ún. offszetcímmel vagy eltolással határozhatjuk meg

259 5. Speciális programozási módszerek II. Memóriahasználat 3.További lehetőségek a memória elérésére a. A szegmentált címzés a 16 bites környezetben (DOS ablak) –Ezek után a fizikai cím kiszámítása: Fizikai cím=Szegmenscím*16+eltolás –Emiatt van az, hogy a címeket a Turbo Pascal (és az operációs rendszer) 4 byteon tárolja (2 byte szegmens, 2 byte offszet) –A szegmensek mérete a 16 bites cím miatt 64 kbyte –Emiatt van a pl. programunk adatszegmensének méretére a 64 kbyteos korlát

260 5. Speciális programozási módszerek II. Memóriahasználat 3.További lehetőségek a memória elérésére b. A Turbo Pascal és a szegmentált memória –A futó program a következőképp helyezkedik el a memóriában: (kép táblán és kiosztva papíron) –Következmények:  A program lefordított része maximum 64 kbyte lehet gép kódba lefordítva  Ez igaz a hozzáfordított unitokra is (egyenként)  Az adatszegmens is ennyi lehet legfeljebb, ezért a globális változóink és a típusos konstansok összes mérete sem lehet nagyobb  A veremszegmens is maximum 64 kilobyteos, vagyis a rekurziók, eljáráshívások mélységét, lokális változók összes méretét is ez korlátozza  A halomterület méretét az korlátozza, hogy végcíme a program memóriabeli kezdőcíme+640 kbyte (ez MS-DOS korlát)

261 5. Speciális programozási módszerek II. Memóriahasználat 3.További lehetőségek a memória elérésére b. A Turbo Pascal és a szegmentált memória –Programunk bizonyos memória- (verem- és halom-) területeinek mérete globális fordítói direktívával (vagy menüből) beállítható –Ennek szintaktikája: {$M,, } –Szabályok:  A veremméret 1024 és között lehet  A heapmin 0 és között lehet  A heapmax heapmin és között lehet –Jelentésük:  Heapmin: a program elindításához minimálisan szükséges halomterület  Heapmax: a felhasználható maximális halomterület

262 5. Speciális programozási módszerek II. Memóriahasználat 3.További lehetőségek a memória elérésére c. Bővebben a mutatókról –Az eddigi mutatók mindig típusos mutatók voltak, vagyis mindig tudtuk, milyen típusú változó az általuk mutatott –Vannak olyan mutatók is, amelyeknél nem adjuk meg, milyen típusú az általuk mutatott változó; ezek a típus nélküli mutatók. –Deklarálásuk Var :Pointer; –Helyfoglalás a típus nélküli mutatónak: GetMem(,)  A méret word tipusú paraméter, értéke 1 és között lehet –A pointer által mutatott terület felszabadítása: FreeMem(,)

263 5. Speciális programozási módszerek II. Memóriahasználat 3.További lehetőségek a memória elérésére c. Bővebben a mutatókról –A mutatókon értelmezett műveletek:  Értékadás két mutató között (nem lényeges az általa mutatott típus)  Összehasonlítás (egymással és a NIL konstanssal is) –Bármely Pascal-beli objektum címét lekérdezhetjük operátorral és az Addr függvénnyel, és értékül adhatjuk egy tetszőleges mutatónak –Szintén lekérdezhető bármely Pascal objektum címének szegmens- és offszet része, a Seg és Ofs függvényekkel –Két címrészből (szegmens és offszet) pedig összerakhatunk egy címet a Ptr függvény segítségével –Példák minderre órán…

264 5. Speciális programozási módszerek III. Több forráskódból álló program készítése 1.Miért van erre szükség?  Két oka van: –Van olyan eset, amikor a 64 kbyte kódszegmens-méret korlátozza a programunk méretét (a lefordított gépi kódú program nagyobb ennél a méretnél), sőt, elképzelhető, hogy a hagyományos, 640 Kbyteos memóriaméret sem elegendő –Elképzelhető, hogy olyan általános alprogramokat készítünk, amelyet később más programhoz is fel akarunk használni, és nem akarjuk újra és újra megírni ezeket 2.Hogyan lehet megcsinálni?  3 lehetőségünk van: –Unitok használata –Átlapolásos (overlay) technika (elavult) –DLL-ek használata (csak Windows)

265 5. Speciális programozási módszerek III. Több forráskódból álló program készítése 3.Unitok (modulok) használata  Akkor használjuk ezt a lehetőséget, ha a főprogram mérete túllépné a 64 kbyteot, vagy általánosan használt alprogramokat, típusokat, stb. készítünk  A saját unitok ugyanúgy hozzáfordíthatóak a programhoz, mint a rendszer beépített unitjai (Crt, DOS, Graph stb);  Unit írása esetén a program forrásszövege speciális szerkezetű, alapvetően eltér a főprogram szövegétől

266 5. Speciális programozási módszerek III. Több forráskódból álló program készítése 3.Unitok használata  A unit általános szerkezete: Unit ; {a unit fejrésze} Interface Uses … Const…Type…Var… Procedure … {globális eljárások fejlécei} Function… {globális függvények fejlécei} {Ezt illesztő résznek is hívjuk, vagy kapcsolódási felületnek: ezeket ismeri a program, amihez hozzáfordítjuk} Implementation Uses … Const…Type… Var… {ezek a unit saját belső deklarációi} Procedure … {globális eljárások teljes deklarációja, de csak név, fejléc nem} Function… {globális függvények teljes deklarációja, de csak név, fejléc nem} {Ezt megvalósító résznek is hívjuk: itt írjuk le, hogy az eljárások, függvények hogyan működnek} [Begin]{Ez az ún. inicializációs rész} {utasítások} End.

267 5. Speciális programozási módszerek III. Több forráskódból álló program készítése 3.Unitok (modulok) használata  Részletek: –Fejléc:  A unit neve maximum 8 karakter hosszúságú lehet, mivel meg kell egyeznie a lefordított unitot tartalmazó,.TPU állomány nevével (Turbo Pascal Unit)  (A unit forrásszövege PAS kiterjesztésű, a lefordított állomány pedig TPU és nem EXE) –Interface rész:  Az itt deklarált azonosítók a modult használó program számára globálisak lesznek, mintha a főprogramban deklaráltuk volna őket  Ezek nem csak a főprogramból, hanem más modulokból is elérhetőek  Az eljárásoknak és a függvényeknek itt csak a fejléce szerepel, hiszen annak a programnak, amely ezeket használja, csak a hívás módjára van szüksége

268 5. Speciális programozási módszerek III. Több forráskódból álló program készítése 3.Unitok (modulok) használata  Részletek: –Implementációs rész:  Ez tartalmazza az interface részben deklarált alprogramok törzsét, és a modul lokális azonosítóit (const, var, type, procedure, function)  Az alprogramok fejlécében csak a nevet kötelező szerepeltetni, a formális paraméterlistát nem, de lehet (azonban ez hibákhoz vezethet) –Inicializációs rész:  Az itt elhelyezett utasítások a főprogram lefutása előtt egyszer végrehajtódnak (pl. kezdőérték-adások)  Ez a rész nem kötelező, ha nincs, akkor a begin elhagyható, ekkor az end. az implementációs részt zárja le

269 5. Speciális programozási módszerek III. Több forráskódból álló program készítése 4.Overlay- (átlapolásos-) technika használata  Az overlay technika akkor használatos, amikor a sok unitot használó program lefordított kódja nem fér be a memóriába, vagy a nagy méretű program mellett a sok adatnak nem jut hely  Az átlapolás azt jelenti, hogy a program futása során az operatív memória egy kijelölt részében (overlay-puffer, ld. kiosztott ábra) különböző időpillanatokban más és más modulok kódja helyezkedik el  A lemezen tárolt overlay-unitok közül mindig az töltődik be, amelyikben lévő alprogramot hívja a program, az addig memóriában tartott pedig felülíródik  Ezzel a program memóriafelhasználása csökkenthető  A valóságban az overlay technika bonyolultabban működik, a TP alatt az átlapolásvezérlő az overlay-modulokban tárolt eljárások hívási gyakorisága alapján dönti el, hogy a pufferből meyil modul törölhető

270 5. Speciális programozási módszerek III. Több forráskódból álló program készítése 5.DLL-ek (dinamikusan szerkesztett [program]könyvtárak) használata  Windows alatt kétféle futtatható állomány létezik, a program és a dinamikusan szerkesztett könyvtár (Dinamic Linking Library, DLL)  A DLL-ek a unitokhoz hasonlóan főképp alprogramokat (függvényeket) tartalmaz, amiket akár több (sok) program is használhat  Minden, a Windows alatt használható függvény is ilyen DLL-ben foglal helyet, ez a Windows API (Application Interface)  Ha egy program a futása során egy DLL-beli függvényt hív, akkor az EXE fájlba nem fordítódik bele a függvény gépi kódja, hanem csak egy hivatkozás a DLL megfelelő helyére  A program indulásakor betöltődik a memóriába a DLL is, így a függvény kódja hozzáférhetővé válik  Ha egy időben több program is ugyanazt a DLL-t használja, akkor a Windows gondoskodik arról, hogy a DLL csak egyszer töltődjön be  Ezt a módszert nevezik dinamikus szerkesztésnek, mivel a unitokkal ellentétben a DLL-ben elhelyezett alprogram kódja nem szerkesztődik hozzá az EXE fájlhoz (az a statikus szerkesztés)  A DLL-készítés mikéntjét a DELPHI-vel foglalkozó részben tárgyaljuk

271 6. Objektumorientált programozás I. Mi is ez az egész?  –A bennünket körülvevő világ nem egymástól elválasztott adatokból és tárgyakból áll, hanem: –Dolgokból,  Amelyeknek tulajdonságaik vannak (szín, szag, méretek, tapintás, íz, stb.);  És ezekkel a dolgokkal különböző műveleteket végezhetünk, amelyek szigorúan kötődnek a dolog fajtájához (pl labdával elég nehéz árkot ásni, ásóval pedig focizni)  Ezeknek a dolgoknak vannak közös tulajdonságaik is (például a legtöbb tárgynak van súlya, sűrűsége, de pl íze nem feltétlenül)  A dolgok nagyobb csoportokba, családokba, osztályokba sorolhatóak a közös tulajdonságaik alapján (négyszögek, paralelogrammák, rombuszok, téglalapok, négyzetek, vagy pl.: építőanyagok, téglák, agyagtéglák, B30-as falazóblokk…)

272 6. Objektumorientált programozás I. Mi is ez az egész?  –Mivel a programozás a körülöttünk levő világ problémáira próbál megoldásokat találni, a világ modellezéséhez találták ki az objektum fogalmát a programozási nyelvekben –Az OOP olyan módszer, amely megszünteti a program kódjának és adatainak szétválasztását –Az objektum olyan programozástechnikai „dolog”, amelyre az alábbiak a jellemzőek:  Egységbezárás (encapsulation)  Öröklődés (inheritance)  Sokalakúság

273 6. Objektumorientált programozás II. Elnevezések –Az objektum tulajdonságait leíró „adattárolókat” az objektum adatmezőinek nevezzük (Object Pascalban [Delphi]: tulajdonságok, properties) –Az objektumon értelmezett műveleteket az objektum metódusainak nevezzük –Egy objektumfajta elnevezése objektumtípus, vagy objektumosztály (object class); –míg egy objektum típusú konkrét változó neve objektumpéldány

274 6. Objektumorientált programozás II. Az objektumok sajátosságairól részletesen 1.Egységbezárás (encapsulation) a. Általános szabályok  Mivel az objektum adatai és az objektum műveletei szorosan egybetartoznak, az objektum deklarációjának szintaxisa is támogatja ezt  Ez a deklaráció az objektum típusban valósul meg: Type =object {adatmezők, ugyanúgy, mint a rekordnál} Procedure [( )]; Function [( )]: [( )]:

275 6. Objektumorientált programozás II. Az objektumok sajátosságairól részletesen 1.Egységbezárás (encapsulation) a.Általános szabályok  A metódusoknak nem kell átadni paraméterként az adatmezőket, mert alapértelmezésként ezekkel végeznek műveleteket, tehát ezek azonosítói ismertek a metódus számára  Az objektum teljes definiálásához ez után a program deklarációs részében valahol (de még az objektumtípus példányainak használata előtt meg kell adni a metódusok teljes deklarációját (vagyis hogy mit csinálnak)

276 6. Objektumorientált programozás II. Az objektumok sajátosságairól részletesen 1.Egységbezárás (encapsulation) a.Általános szabályok  A metódusok megírásakor csak a nevüket kell szerepeltetni, nem az egész fejlécet, de le kell írni, hogy melyik objektumtípus metódusáról van szó: Procedure ; {lokális deklarációk} Begin{algoritmusrész}End; Function : ; {lokális deklarációk} Begin{algoritmusrész}:=;End;

277 6. Objektumorientált programozás II. Az objektumok sajátosságairól részletesen 1.Egységbezárás (encapsulation) b. Az adatrejtés elve  Az OOP alapelve az adatrejtés, ami azt jelenti, hogy az objektumok adatmezőihez csak a metódusokon keresztül férhessünk hozzá, közvetlen értékadással pl. nem  A TP 7.0 verziójától kezdve ezt két kulcsszóval szabályozhatjuk  A private kulcsszóval megtilthatjuk egy objektum adatmezőihez és metódusaihoz a közvetlen hozzáférést;  Míg a public kulcsszóval megengedhetjük ezt.  Általánosságban az adatmezők az objektum private, a metódusokat a public részében kell elhelyezni, de ettől lehetnek eltérések  Egy objektumon belül a private és public részek száma és sorrendje tetszőleges  A private és public csak akkor hatásos, ha az objektum deklarációja egy unit interface részében, a metódusok kifejtése pedig az implementációs részben foglal helyet

278 6. Objektumorientált programozás II. Az objektumok sajátosságairól részletesen 1.Egységbezárás (encapsulation) c. Az objektumpéldányok létrehozása  Az objektumpéldányok a többi változóhoz hasonlóan létrehozhatóak statikus vagy dinamikus helyfoglalással  A statikus helyfoglalású objektumpéldányok a program adat- vagy veremszegmensében jönnek létre  A program lefordítása során az egyes példányok adatterületének különálló hely foglalódik le a,  míg az objektum metódusai a példányok számától függetlenül csak egy példányban tárolódnak a program kódszegmensében, és a példányok ezt közösen használják

279 6. Objektumorientált programozás II. Az objektumok sajátosságairól részletesen 1.Egységbezárás (encapsulation) c. Az objektumpéldányok létrehozása  Mivel a metódusok hívása a. alakban történik, minden esetben egyértelmű, hogy a futó metódus mely példányhoz tartozik  Ez valójában a metódus egy nem látható, de mindig átadott paraméterének köszönhető, ez a self (önmaga) változó paraméterének segítségével valósul meg  Ezt a paramétert mi is használhatjuk a metódusainkban  Ha a metóduson belül az objektumpéldány címére van szükségünk, hivatkozással kérdezhetjük le  Statikus objektumpéldányok között értelmezett az értékadás művelete, ekkor a jobb oldalon álló változó teljes adatterülete a bal oldalon álló változó adatterületére másolódik

280 6. Objektumorientált programozás II. Az objektumok sajátosságairól részletesen 1.Egységbezárás (encapsulation) c. Az objektumpéldányok létrehozása  A dinamikus helyfoglalású objektumpéldányok létrehozásához típusos mutatókat alkalmazhatunk  A többi dinamikus változóhoz hasonlóan a New könyvtári eljárással foglalhatunk helyet egy objektumpéldánynak, és a Dispose eljárással szabadíthatjuk fel a halomterületet  Az elnevezésekre ajánlott azt a konvenciót használni, hogy az objektumpéldányra mutató pointert az objektumtípus neve elé tett P karakterrel jelezzük, pl: Type PTeglalap=^Teglalap; Teglalap=Object Teglalap=Object… End; End;

281 6. Objektumorientált programozás II. Az objektumok sajátosságairól részletesen 2.Öröklődés (inheritance)  Az OOP nyelvekben az öröklődés azt jelenti, hogy egy meglévő objektumból kiindulva újabb objektumot építhetünk fel  Ez az objektum örökli a felhasznált objektum adatmezőit és metódusait  A TP-ban azt az objektumot, amelyből származtatjuk az újat, ős (ancestor), vagy szűlőobjektumnak nevezzük;  Az új objektumot pedig származtatott (descendant) vagy gyerekobjektumnak nevezzük.  Az öröklődés során természetesen új adatmezőkkel és metódusokkal bővíthetjük az objektumot, és lehetőség van a az örökölt metódusok azonos névvel de új tartalommal való újradefiniálására is  Az objektumok öröklődése egyszeres, ami azt jelenti, hogy minden objektumnak pontosan egy közvetlen őse van  A Turbo Pascal rendszerek tartalmaznak előre elkészített objektum- hierarchiát, ami a szöveges képernyő ablakszerű kezeléséhez (Turbo Vision) nyújt segítséget, illetve a Borland Pascal tartalmazza a Windows környezet-beli programozáshoz az Object Windows objektum-könyvtárat (ezekkel nem foglalkozunk)

282 6. Objektumorientált programozás II. Az objektumok sajátosságairól részletesen 2.Öröklődés (inheritance)  Az öröklődés deklarálása: Type =Object( ) {új adatmezők, új és megváltozott metódusok fejléce} End;  Fontos szabály, hogy csak az új és megváltozott dolgokat kell deklarálni, és persze később kifejteni  Vigyázni kell arra, hogy a leszármazott objektum inicializáló metódusa ne csak a saját adatmezőit inicializálja, hanem a közvetlen ősének adatmezőit is (ezt a közvetlen ős inicializáló metódusának hívásával érhetjük el)  Ha többszörös öröklődési lánc van, ezt az elvet minden származtatási lépésnél be kell tartani  Ezt a hívást, és a közvetlen ős más metódusainak hívását könnyíti meg az inherited (öröklött) kulcsszó (TP 7.0)

283 6. Objektumorientált programozás II. Az objektumok sajátosságairól részletesen 2.Öröklődés (inheritance)  Probléma az öröklődésnél:  Ha egy öröklött metódusból hívunk egy másik, de újradefiniált metódust, akkor nem a gyerekobjektum, hanem a szülőobjektum metódusa hajtódik végre, ami a program rossz működését okozza  A jelenség oka: az objektumok zártsága  A fordítóprogram ugyanis a metódusokból elvégzett metódushívást a hagyományos alprogramokkal azonos módon, rögzített címen történő hívással fordítja (ezek az ún. statikus metódusok)  Emiatt az eddig tanult módszerekkel nem megvalósítható az objektumok harmadik tulajdonsága, a sokalakúság (polimorfizmus)

284 6. Objektumorientált programozás II. Az objektumok sajátosságairól részletesen 3.Sokalakúság (polimorphism, polimorfizmus)  Azt jelenti, hogy a gyerekobjektum metódusai felüldeklarálhatók, vagyis másképp kell egy gyerekobjektum műveletét végrehajtani  Azonban, ha a gyerekobjektum metódusában a szülő objektum metódusára történik hivatkozás, majd abban egy olyan metódusra, amely mindkét objektumban létezik, de különböző dolgot csinál, akkor a hívásnál probléma lehet, mert nem a megfelelő objektum metódusa fut le.  Erre megoldás: a virtuális metódusok használata  A virtuális metódusnál futási időben dől el, hogy melyik objektumtipus metódusát kell meghívni  Ahhoz, hogy virtuális metódusokat alkalmazzunk, az objektumtipus inicializását speciális módon kell elvégezni  Ekkor egy új kulcsszóval kell helyettesíteni a procedure kulcsszót: constructor  Ekkor a fordító az objektumtípushoz létrehoz egy virtuális metódus táblát (Virtual Method Table, VMT), amelyben eltárolja a virtuális metódusok címeit  Ezen felül a virtuális metódusokat a virtual kulcsszóval meg kell jelölni (ld. Példaprogram) – csak ezek címei kerülnek bele a VMT-be.

285 7. Tesztelés I. Általános tudnivalók •A tesztelés célja a program helyes működésének ellenőrzése és a program minél több hibájának felfedése. •Kézenfekvő lenne a programot minden lehetséges bemenő adattal kipróbálni, de erre általában nincs lehetőség. •Ezért a program működésére jellemző teszteseteket kell választani •Teszteset: a be- és kimeneti adatok és feltételek egy adott összessége •Vagyis tudnunk kell, hogy egy bemenetre milyen eredményt várunk

286 7. Tesztelés I. Általános tudnivalók •A programban alapvetően kétféle hiba lehet: 1. Szintaktikai („nyelvtani”): •Ez a hiba a programozási nyelv szabályaitól való eltérés 2. Szemantikai (tartalmi) hiba: •Ez a hiba akkor jelentkezik, amikor a programunk nem úgy működik, ahogy azt a specifikáció alapján elvárnánk

287 7. Tesztelés II. A tesztelés alapelvei •A jó teszteset az, amely nagy valószínűséggel egy új hibát fed fel •A teszteset a bemenő adatokon kívül a kimenetet is tartalmazza (ezeket rögzíteni kell a tesztelési jegyzőkönyvben, vagy a fejlesztői dokumentációban) •A meg nem ismételhető tesztesetek kerülendők •Tesztesetet mind az érvénytelen, mind a helyes bemenő adatokból kell képezni •Egy tesztesetből a lehető legtöbb információt ki kell nyerni •Azt is meg kell vizsgálni, hogy egy tesztesetnél miért nem végez el egy funkciót a program, és azt is, ha elvégez olyan dolgot is, amit nem feltételeztünk róla •A program tesztelését csak a program írójától különböző személy végezheti hatékonyan

288 7. Tesztelés II. A tesztelés módszerei •A tesztelési módszereket két csoportra osztjuk attól függően, hogy a tesztelés során végrehajtjuk-e a programot 1.Statikus tesztelési módszerek • Ekkor a programot nem hajtjuk végre a tesztelés során a. Kódellenőrzés •Ennél a módszernél az algoritmus logikáját követjük végig a kódban •Gyakran elég, ha egy másik személynek elmondjuk, hogy mit csinál a programunk a kód alapján •Más esetben egy másik személy végigköveti a program működését konkrét bemenő adatokkal

289 7. Tesztelés II. A tesztelés módszerei 1.Statikus tesztelési módszerek b. Formai ellenőrzés, kereszthivatkozási táblázatok •Értelmezőt (interpretert) használó nyelveknél használatos •Ilyen esetben azt, hogy ne legyen szintaktikai hiba, olyan tesztesetekkel lehet elérni, amely hatására minden utasítás lefut egyszer •Igen sok információt nyújthat, ha a felhasznált változókról készítünk egy olyan táblázatot, amely azt tartalmazza, hogy egy változóra hol hivatkozunk a programban •Compilert használó nyelveknél nem használjuk

290 7. Tesztelés II. A tesztelés módszerei 1.Statikus tesztelési módszerek c. Tartalmi ellenőrzés, ellentmondás keresés •A szemantikai hibák kiszűrésére használatos ez a módszer •Ekkor a program formailag helyes, tehát a formai ellenőrzés nem nyújt segítséget, de ennek ellenére vannak tipikus hibák, amelyek keresése formalizálható (ezek nem mindig hibák, de nagy valószínűséggel elírás eredményei, vagy korábbi verzióból maradtak): • Felhasználatlan objektum • Felhasználatlan változóérték • Érték nélküli változó • Nem változtató értékadás • Azonosan igaz vagy hamis logikai érték • Konstans értékű kifejezések • Végtelen ciklus • Érték nélküli függvény, operátor •Néhányat a fentiek közül a fejlettebb fordítóprogramok kiszűrnek(Delphi)

291 7. Tesztelés II. A tesztelés módszerei 2.Dinamikus tesztelési módszerek • E módszerek során a programot lefuttatjuk különböző tesztesetekkel. • Attól függően, hogy a teszteseteket mi alapján választjuk, két módszer van: a. Fekete doboz módszerek •Ezek során nem vesszük figyelembe az algoritmus működését, csupán a specifikációt •Adatvezérelt tesztelésnek is nevezik b. Fehér doboz módszerek •Ezeket az algoritmus szerkezetének ismeretében tervezzük meg •Logika vezérelt tesztelésnek is nevezik

292 7. Tesztelés II. A tesztelés módszerei 2.Dinamikus tesztelési módszerek a. Fekete doboz módszerek •Ekvivalenciaosztályok keresése • Ekkor a specifikáció alapján bemeneti halmazokat különítünk el, amelyekre a program azonosan működik, és ezekből választunk teszteseteket • Minden halmazhoz kell választani annak megfelelő és nem megfelelő tesztesetet is • Az érvényes és az érvénytelen bemenő adatokból is képezni kell ekvivalenciaosztályokat • Az egész lehetséges bemeneti halmazt le kell fedni az ekvivalenciaosztályokkal

293 7. Tesztelés II. A tesztelés módszerei 2.Dinamikus tesztelési módszerek a. Fekete doboz módszerek •Határeset elemzés • Az előzőt kiegészítő módszer • Ekkor az ekvivalenciosztályok határain lévő elemeket választjuk tesztesetnek • Nemcsak a bemeneti, hanem a kimeneti ekvivalenciaosztályokat is figyelembe vesszük

294 7. Tesztelés II. A tesztelés módszerei 2.Dinamikus tesztelési módszerek b. Fehér doboz módszerek •Ekkor a tesztelést a programszöveg ismeretében végezzük •Ez alapján választunk kipróbálási stratégiát •A stratégia alapján választott tesztutakhoz meghatározzuk, hogy azok mentén milyen bemeneti értékek választása után halad a program (tesztpredikátumok meghatározása) •A tesztpredikátumok ekvivalenciaosztályokat jelölnek ki, ezekből kell teszteseteket választanunk

295 7. Tesztelés II. A tesztelés módszerei 2.Dinamikus tesztelési módszerek b. Fehér doboz módszerek •Kipróbálási stratégiák: • Utasítások egyszeri lefedésének elve • Döntéslefedés elve • Részfeltétel-lefedés elve • Speciális tesztesetek elve

296 7. Tesztelés II. A tesztelés módszerei 2.Dinamikus tesztelési módszerek c. Speciális tesztek •Elfogadhatósági teszt • Annak vizsgálata, hogy a specifikáció tartalmaz-e ellentmondást, hiányosságokat •Funkcióteszt • Annak vizsgálata, hogy a program minden előírt funkciót tartalmaz-e •Biztonsági teszt • Ellenőrzi-e a program a felhasználótól érkező adatokat? Rossz adatok érkezésekor hogyan működik? („hülyebiztos” működés) •Stressz teszt • Hogy viselkedik a program nagy terhelés hatására? •Volumen teszt • A specifikációban meghatározott maximális adatmennyiség hatására történő viselkedés tesztelése •Hatékonysági teszt • Sebesség, erőforrás-felhasználás mérése •Modulteszt •Összeépítési teszt

297 8. Hibakeresés I. Általános tudnivalók •Az tesztelés célja a hiba felderítése, a hibakeresésé a hiba behatárolása •A valós programozás során nem mindig különül el a két tevékenység •A hibakeresésen kívül itt foglalkozunk a hibajavítással is

298 8. Hibakeresés II. A hibakeresés alapelvei •A hibakeresési eszközök használata előtt alaposan vizsgáljuk végig a programot •Amíg a hiba okát nem derítettük fel, addig ne kezdjük el a javítást, mert újabb hibákat generálhatunk •Ha megtaláltuk a hibát, akkor ennek a program más részeire is hatása lehet, tehát esetleg eddig elfedett hibák is előjöhetnek •A hibák száma és súlyossága általában a program méreténél sokkal gyorsabban növekszik

299 8. Hibakeresés III. A hibajavítás alapelvei •Nem a tüneteket kell megszüntetni, hanem a hibát kell kijavítani •A javítás után újra tesztelni kell!! •Annak a valószínűsége, hogy egy hibát jól kijavítottunk, a program méretével arányosan csökken •A hibajavítás visszanyúlhat az algoritmus- vagy adattervezés, sőt a specifikáció-készítés fázisába is

300 8. Hibakeresés IV. A hibakeresés módszerei 1.Indukciós módszer • Alapelv: tegyük fel, hogy a program csak a hibás eredményű tesztesetekre működik rosszul • Próbáljuk kijavítani ennek fényében a hibát, és teszteljünk • Ha a hiba még mindig fennáll, bővítsük a hibás bemeneti adatok körét • Ha sikerül elkülöníteni a két halmazt, akkor meg kell határozni azon tesztutakat, amelyeken haladva a működés rossz • Ezeken az ágakon kell megkeresni a hibát

301 8. Hibakeresés IV. A hibakeresés módszerei 2.Dedukciós módszer • Alapelv: megpróbáljuk szűkíteni a hiba lehetséges okainak körét • Itt fordítva haladva keressük meg a hibás eredményre vezető bemeneti adatok körét • Ezek után a módszer az előzővel azonos

302 8. Hibakeresés IV. A hibakeresés módszerei 3.Visszalépéses módszer • Alapelv: a hiba előfordulási helyétől gondolatban „visszafelé” futtatjuk a programot • Ha megtaláljuk azt a helyet, ahol már helyesek a végrehajtás eredményei, nagy valószínűséggel megtaláltuk a hiba helyét

303 8. Hibakeresés V. A hibakeresés eszközei •Változók értékének kiíratása •Nyomkövetés • TP és Delphi: soronkénti futtatás, két formája van: •Step over: az alprogramokat egy utasításnak tekinti •Trace into: az alprogramokat is soronként futtatja • Lehet teljes és részleges, a második esetben töréspontot helyezünk el (breakpoint) • Nyomkövetés közben a kritikus változók értékét láthatóvá tehetjük (Watch) •Adatnyomkövetés • Akkor kapunk üzenetet, ha az adott változó módosul

304 8. Hibakeresés V. A hibakeresés eszközei •Nyomkövetés visszafelé •A hiba helyének és okának kijelzése • TP és Delphi: debug információ a programba fordítása, futási hibák a program futása során (a hibákat a fordító kezeli) •Runtime error at…. •…exception at… •A kész programba ezeket már nem fordítjuk bele, az előforduló hibákat a kész program kell, hogy kezelje

305 9. A program dokumentálása I. A dokumentáció fajtái 1.Fejlesztői dokumentáció •Azoknak készül, akik a programban hibát keresnek, hibát javítanak, a programot hatékonyabbra írják, más nyelvre írják át, vagy továbbfejlesztik •Részei: • Specifikáció: Maga a feladat, és a megoldástól elvárt követelmények • Az algoritmusok és az adatok terve, leírása (döntések, alternatívák, érvek, magyarázatok) • Képernyőtervek (formok tervei) • A választott programnyelv, fejlesztői környezet, és annak verziószáma • A program kódja, megvalósítása (megjegyzések!!!) • Tesztesetek (milyen bemeneti adatokra hogy válaszol a program) • Hatékonysági mérések, javaslatok az esetleges hatékonyabbra írásra • Környezetleírás (számítógép-platform, operációs rendszer, szükséges memória, HDD-terület, grafikus kártya, stb.) • Egyéb dokumentumok: •Koncepcióterv, amelyben a fejlesztő leírja a probléma lehetséges megoldásait, megindokolja döntéseit •Rendszerterv, amelyben leírjuk a hardver-szoftver környezetet, a rendszer használhatósági körét. Döntéseket tartalmaz, indoklással, következményekkel.

306 9. A program dokumentálása I. A dokumentáció fajtái 2.Felhasználói dokumentáció •Azoknak készül, akik a programban használni fogják •Részei: • A feladat rövid összefoglalása az áttekintéshez, és részletes kifejtése a pontos használathoz • Környezetleírás (számítógép-platform, operációs rendszer, szükséges memória, HDD-terület, grafikus kártya, stb.) • A használat leírása (indítás, a program által feltett kérdések, azokra adandó válaszok, minden lehetőség, menü, menüpont, párbeszédpanelek leírása • Bemenő adatok, eredmények, a program szolgáltatásainak részletes leírása, mit milyen sorrendben kell megadni • Mintaalkalmazás, példafuttatás eredményei, ablakfotókkal, esetleges hibaüzenetekkel • Hibaüzenetek és magyarázatuk, teendő ezek esetén • Ide tartozik a súgó is!!!

307 9. A program dokumentálása I. A dokumentáció fajtái 3.Programismertető •Célja marketingjellegű, a vásárló, programkereső ember meggyőzése •Részei: • A feladat rövid összefoglalása az áttekintéshez • A program tulajdonságainak leírása • Minimális szoftver és hardver környezet megfogalmazása

308 9. A program dokumentálása I. A dokumentáció fajtái 4.Telepítési leírás, operátori kézikönyv •Nagyobb programoknál külön installálási kézikönyvet mellékelnek, máskor a felhasználói dokumentáció része •Az operátori kézikönyv olyan rendszereknél különül el a felhasználói dokumentációtól, ahol más a program felhasználója és kezelője, és az üzemeltetéshez szükséges tudnivalókat tartalmazza

309 10. A program hatékonysága I. Általános tudnivalók •A program hatékonysága 3 dolgot jelent: • A végrehajtási időt • A helyfoglalást • A bonyolultságot •Ezek csökkentésére irányuló minden módszer növeli a program hatékonyságát •Ezek a jellemzők két szinten, globálisan és lokálisan is jellemzik a programot •A hatékonyság növelésére szisztematikus módszerek léteznek, de ezekkel mi itt nem foglalkozunk


Letölteni ppt "Programozás és programozás módszertan 2007/2008. -2. A számítástechnika és a programozás története  A számolást segítő eszközök története egyidős az."

Hasonló előadás


Google Hirdetések