OKJ vizsga programozó - Feladatsor VI. tétel
1. Ismertesse az adattípus fogalmát! 10 pont
2. Ismertesse az Ön által tanult magasszintű programozási nyelvben az egyes adattípusokat! 10 pont
3. Ismertesse a tömbök rendezésének alapalgoritmusait! 10 pont
4. Ismertesse a szöveges állományok felépítését és műveleteit! 10 pont
5. Ismertesse az adatszerkezet fogalmát és az adatszerkezet műveleteit!
6. Ismertesse a moduláris programfelépítést (több programmodul) megvalósító eszközök használatát az Ön által tanult magasszintű programozási nyelvben! 12 pont
7. Ismertesse az első normálforma (1NF) fogalmát és egy relációs 1NF alakra hozásának módját! 8 pont
8. Ismertesse az OSI modell szerinti hálózati réteg feladatát! 10 pont
9. Ismertesse az operációs rendszerek alkalmazói programokkal kapcsolatos védelmi rendszerek jellemzőit! 10 pont
1. A nyelv előírója, hogy változókat tulajdonságaik szerint csoportosítsunk, azaz típusokba soroljuk őket. Minden változót egy (és csak egy) típusba sorolunk. A típus leszűkíti, meghatározza változókhoz hozzárendelt értékek halmazát.
2. A Pascal nyelv adattípusai:
Egész típusok:
| Típusnév | Helyfoglalás (byte) | Értelmezési tartomány |
| Byte | 1 | 0 .. 255 |
| Shortint | 1 | -128 .. 127 |
| Word | 2 | 0 .. 65535 |
| Integer | 2 | -32768 .. 32767 |
| Longint | 4 | -2147483648 .. 2147483647 |
| Comp | 8 | -9.22*10-18 .. 9.22*10-18 |
Valós típusok:
| Típusnév | Helyfoglalás (byte) | Értelmezési tartomány |
| Single | 4 | 7-8 |
| Real | 6 | 11-12 |
| Double | 8 | 15-16 |
| Extended | 10 | 19-20 |
Logikai típus (Boolean):
Ez a típus a következő két féle értéket veheti fel: logikai igaz: True és a logikai hamis: False. Ezek egy bájtot foglalnak a memóriában.
Szöveges típusok:
- Char típus. Értelmezési tartomány_ASCII karakterkészlet. A hossza pedig egyetlen karakter lehet.
- String típus. Ez a típus tulajdonképpen karakterek egymáshoz fűzött láncolata. Max. hossza 255 karakter lehet.
- Tömbök
- Felsorolt típus
- Sorszámozott típus
Felhasználó által definiált típus: A program deklarációs részében előre definiálhatunk típusokat. A típus definícióját a TYPE kulcsszó vezeti be. A típus azonosítója az egyenlőségjel baloldalán áll. A típus jobboldalán egy típusleírás vagy egy másik típusazonosító szerepel.
3. Tömbök rendszerezésének alapalgoritmusai:
A minimum-kiválasztásos rendezés:
- Először megkeressük az egész tömb legkisebb elemét! Ezt az elemet kicseréljük az első elemmel.
Következésképpen most az első helyen lesz a legkisebb elem, ahogy ezt szeretnénk is.
- Most már csak a maradék részt, vagyis a 2..NevekSzáma tömbrészt kell rendeznünk. Keressük meg itt is a legkisebb elemet! Ezt az elemet kicseréljük a második elemmel, és így most már két elemünk van jó helyen.
- Folytassuk ezt a procedúrát: tegyük a helyére a többi elemet is. Utolsó lépésként az utolsó előtti helyre kell kiválasztanunk a legkisebb elemet, hiszen ezzel az utolsó is a helyére kerül.
Beszúrásos rendezés:
Feltételezzük, hogy van egy szigorú sorrend. Megnézzük az első elemet. Majd megnézzük a másodikat és a helyére tesszük. Aztán felvesszük a harmadikat, helyére tesszük és így tovább. Minden esetben megkeressük a kérdéses kártyának a helyét a már rendezett sorban, és oda beszúrjuk.
A tömbök rendezése lehet közvetlen és indexes. A közvetlen elmozgatásánál a tömb elemeit fizikailag is módosíthatjuk a tárban. Indexes rendezésnél mindig van egy index tömb, amelyben csak rendezendő tömb indexeit tároljuk és módosítjuk fizikailag. Ezután pedig az index tömb elemei alapján hivatkozunk az eredetire.
4. A szöveges (text) állomány onnan kapta az elnevezését, hogy tartalma egy olvasható szöveg. Szövegek nem csak lemezen lehetnek, hanem egyéb perifériális eszközökön is, mint például terminálon vagy nyomtatón. Bizonyos eszközökről csak olvashatók másokra csak írhatók a szövegek.
Felépítése: A szöveges állomány sorokból áll, a sorok pedig karakterekből. Minden sor végén egy-egy sorvége jel (EOLN) található. Az állományt pedig az állomány vége jel (EOF) zárja. Az állomány szervezése soros, vagyis az egyes karaktereket csak egymás után lehet elérni, és az állományt nem lehet egyszerre írni és olvasni. Deklarációnál csak a szöveges állomány tényét kell megadni:
Var T: Text;
Nyitás, zárás: A szöveges állományt ugyanúgy hozzá kell rendelni egy fizikai állományhoz, mint bármely más állományt. Három megnyitási mód létezik:
- Reset(T); Az állományt csak olvasni lehet sorosan, az első pozíciótól kezdődően.
- Rewrite(T); Nyitáskor az állomány törlődik, vagy létrehozódik. Az állományba csak írni lehet sorosan, az első pozíciótól kezdődően.
- Append(T); Az állomány mutatója a fájl végén van, innen már csak írni lehet.
Szabványos eszközök:
CON: írás esetén a képernyő, olvasás esetén a billentyűzet.
LPT1, LPT2, LPT3: három nyomtató csatlakoztatható a számítógéphez, ezek bármelyikére lehet írni.
COM1, COM2: Soros kommunikáció.
NUL: ez egy kitalált eszköz, amely elnyeli a karaktereket. Általában tesztelési célra használatos.
Szabványos beviteli állomány
Assign(input,’CON’);
Reset(input);
Szabványos kiviteli állomány
Assign(output,’CON’);
Reset(output);
Szabványos kiviteli állomány a nyomtatóhoz
Assign(lst,’PRN’);
Reset(lst);
5. Adatszerkezet fogalma és műveletek:
egy számítógépes rendszer alapvetően kétféle modellből áll: adatmodellből és eljárásmodellből, melyek azonban nem választhatóak el egymástól. Mindkettő a rendszer szerves része. Az adatmodell a rendszer elemeinek adatokkal kifejezhető tulajdonságait írja le, és felállítja az elemek közötti kapcsolatokat is. Az eljárásmodell az adatmodellen bekövetkező változásokat írja le. Az adatszerkezetek egymással kapcsolatban álló adatok, objektumok összessége. A kapcsolatokban részt vevő struktúraelemeket csomóponti adatoknak szokás nézni.
Konstrukciós műveletek: Az adatszerkezeteket leíró és továbbépítő mechanizmusok.
Szelekciós műveletek: Az adatszerkezetet lebontó, megszüntető, valamint az adatelemek elérését biztosító mechanizmusok.
6. Pascal nyelv: UNIT
A unit első közelítésben speciális programkönyvtár, amely eljárások, függvények, konstansok, típusok és változók halmaza. Az e könyvtárban lévő, lefordított alprogramokat beépíthetjük az általunk írott programokba. Unitok alkalmazása nélkül csupán max. 64 Kbyte méretű lefordított programot lehet létrehozni. Ha unitokat is használunk, akkor más csak a memória mérete, illetve az operációs rendszer szab felső korlátot a lefordított programnak. A unit-okat – a programokhoz hasonlóan – forrásnyelven, írjuk meg, majd fordítjuk le.
A forrás unit-ok szerkezet:
Unit unitnev;
Interface
Uses unit1, unitn
Type
Const
Var
Label
Procedure
Function
Implementation
{privát deklarációk eljárások és függvények}
Begin
{inicializációs rész}
End.
Unitfej
Ezzel indul az unit. Az unit szó után megadjuk a unit nevét, amely egy tetszőleges azonosító.
Finterface rész
Az interface rész vezeti be ezt a részt. Ez után különböző deklarációk következnek. Az e részbeli deklarációk globálisak, szemben az implementációs részbeli lokális deklarációkkal. A globális tulajdonság esetünkben azt jelenti, hogy a deklarált elemek használhatók minden – e unitot használó – programban és unitban.
Implementációs rész
Ezt a részt az implementation szó vezeti be. Ebben a részben az interface-ben megnevezett függvényeket és eljárásokat definiáljuk. Az interface-ben már deklaráltuk ezek fejét.
Ebben a részben is állhatnak deklarációk, de azok csak lokálisak, azazcsak az unitban használhatók.
7. Első normálforma
Definíció. Egy R relációról azt mondjuk, hogy első normálformában (1NF-ben) van, ha minden sorában pontosan egy attribútumérték áll.
A reláció 1NF-re hozása
a) Első módszer
A több attribútumértéket tartalmazó sort annyi sorra bontjuk, amennyit benne az attribútumértékek száma.
b) Második módszer
Két relációra bontjuk az eredeti relációt, úgy hogy az egyikben a reláció kulcsának értékei mellé írjuk az egyszeres attribútumértékeket, másik relációban pedig a kulcshoz rendelt külső kulcs mellé annyi sort írunk, ahányszoros attribútum érétkek szerepelnek a többszörös attribútumokban.
8. Hálózati réteg: A réteg biztosítja a különböző hálózatok közötti kapcsolatot, az üzenetek irányítását, az érkező csomagok újraegyesítését. A réteg feladata az útvonalválasztás, idegen kifejezéssel routplás, amely meghatározza az optimális útvonalat az egyik számítógéptől a másik felé. Heterogén hálózatokban protokoll átalakulást végez.
9. A fejlettebb mikroprocesszorok a felhasználó számára különféle védelmi lehetőségeket biztosítanak. Ezek a lehetőségek részint egy felhasználói task-on belül fellépő hibák ellen nyújtanak védelmet, részint egy multitasking rendszerben kívánatos az egyik task megvédése egy másik task által okozott, hibáktól. Ez utóbbi probléma különösen élesen jelentkezik, akkor amikor az egyes taskok együttműködését is lehetővé kívánjuk tenni. Két alapvető problémát kell megoldani, nevezetesen, észlelni kell a védelem megsértését, másrészt a hibák hatását annak a tasknak a belsejére kell korlátozni, melyben a hiba fellépett. A legegyszerűbb rendszereknél olcsó és nagyon korlátozott hardver védelmet biztosítanak egy tárolóterület védelmével. A tárolót rögzített vagy változó méretű részekre bontják és az egyes részekhez védelmi attribútum-ok rendelhetőek, például egy terület csak olvasható. A védelmi hardver írási művelet esetén ellenőrzi, hogy a kiadott tárolócím a megengedett tartományba esik-e. Ezzel a módszerrel biztosítható, hogy egy programrészletet vagy kritikus adatokat ne írhassunk felül. Természetesen ez a védelem továbbfejleszthető úgy, hogy a felhasználókhoz, vagy a task egyes részeihez különböző prioritási számok (jogosultsági szintek) rendelhetőek és mondjuk egy védett tárolóterületre az a programrészlet írhat, melynek prioritási száma kisebb a területhez definiált érteknél. A módszer elvi problémája, hogy így egy tárolóterületet védünk, holott megoldandó feladatunk algoritmusa és adatai, azaz logikai egységei a védendő objektumok. Tekintsünk először egyetlen taskot. Egy task utasítások sorozatából, adatokból és speciális tárolóterületek (például stack) kezeléséből áll. A klasszikus Neumann-féle architektúra – éppen univerzalitása miatt – tárolócímeket kezel és nem törődik azzal, hogy a tárolórekeszeknek mi a tartalam. A tárolórekeszek tartalmának értelmezése az utasításokba van beépítve, ahol viszont alapesetben a processzor vezérlőegysége annak a tárolórekesznek a tartalmát értelmezi utasításnak, mely rekesz címét az utasításszámláló regiszter tartalmazza. Teljesen hasonló a helyzet a stack tárolóval is, ha a processzor csak egy mutatóregisztert tartalmaz, de a stack maga az operatív tárolóban helyezkedik el. Így hibás program esetén előfordulhat például egy olyan utasítás, mely egy művelet eredményét, mondjuk egy téves címszámítás eredményeként, egy olyan rekeszbe írja be, melynek tartalmát a vezérlőegység később adat helyett utasításnak értelmezi és a program „eltéved”. Ez a probléma az ún. szegmentálás bevezetésével oldható meg. Bontsuk fel a tárolót egy olyan területre, ahol csak a stack helyezkedhet el. Ezeket a területekre szegmenseknek nevezzük. A tárolóra vonatkozó címszámítást pedig bázisregiszterhez viszonyított (relatív) címzési móddal végezük úgy, hogy mindenegyes szegmenstípushoz egy-egy bázisregiszter tartozik (tehát esetünkben kódszegmens regiszter, adatszegmens regiszter és stack-szegmens regiszter). A szegmensregiszterek tartalma az illető szegmens kezdőcíme lesz. Például egy lehívandó utasítás címe tehát a kódszegmens regiszter tartalmának és az utasításszámláló tartalmának az összege lesz. Ha a szegmensek méretét korlátozzuk (vagy úgy, hogy egy-egy szegmenshossz regisztert használunk, vagy egy processzortípus esetén előre rögzített értékű), akkor ellenőrizhető, hogy a kiszámított című rekesz a megfelelő típusú szegmens belsejébe esik-e. Ezt az ellenőrzést a processzor hardver úton végzi és hiba esetén, például programmegszakítás kérést eredményez. Vegyük azonban észre, hogy a szegmentálás bevezetése egy task-on belül lehetőséget nyújt az eltévedés elleni védelmére, azonban az univerzalitás (a programmódosítási lehetőség) rovására. Az univerzalitás megtartása kétféleképpen biztosítható. Az egyik módszer az, hogy a szegmenseket a tárolóban tetszőleges helyre helyezhetjük el (tehát át is fedhetik egymást). Ezt a módszert egyébként meg kell valósítani amiatt is, mert az egyes számítógépek tárolókonfigurációja eltérhet egymástól. A másik módszer egy speciális utasítástípus (a prefix utasítás) bevezetése. Egy prefix utasítás címrésze azt adja meg, hogy a következő utasításlehívás és feldolgozás esetén az utasítás, illetve adatok címének kiszámításához az alapértelemzésben szereplő kódszegmens, adatszegmens, illetve stack-szegmens regiszterek helyett, mely szegmensregiszterek tartalmát kell a megfelelő helyeken használni. Természetesen a programozó által ilyenkor elkövetett esetleges hiba (ún. algoritmus hiba) ellen a védelem hatástalan. Multitasking rendszerben a védelmi rendszert célszerű kiegészíteni egy újabb – magasabb – logikai védelmi szinttel. Ilyenkor ugyanis meg kell oldani azt a további feladatot, hogy az egyik task futtatása ne okozzon hibát egy másik task-ban. Ezt azonban úgy kell megoldani, hogy lehetőség nyíljon arra, hogy az egyik task felhasználhassa egy vagy több másik task adatait és/vagy programrészleteit.
