2009/2010 2. szemeszter.
A tárgy kódja: VIAUA116
A kis házifeladatokat a félév során rendszeresen adjuk ki a labor órákon. A beadás elektronikus formában történik az Automatizálási Tanszék portálján keresztül. Az emailben küldött megoldásokat csak nagyon kivételes esetben (pl. huzamosabb szerverleállás) fogadom el!
A beadáshoz feltöltendő egy (több feladat esetén összefűzött) szöveges, vagy tömörített fájl, melynek neve az alábbi formátumú: ABC123-X.***, ahol ABC123 a hallgató neptunkódja, X pedig a feladat kiadásának hete (az alábbi listában látható házi sorszám). A *** a megfelelő kiterjesztést (c, cpp, zip) jelenti. Egy feladat több részfeladatot is tartalmazhat, ezért kellhet tömöríteni. Az egyes részfeladatokra adott megoldás a forráskódot tartalmazó cpp és h fájlokat jelenti.
A beadás (feltöltés) határideje a kiadáshoz képest következő labor napján este 8 óra.
1. hét
1. feladat
Írjon C programot, amely bekér egy számot a standard bemeneten, és kiírja az összes osztóját.
2. feladat
Írjon C programot, amely bekér egy n számot, és kiszámolja az alábbi kifejezés értékét:
2. hét
1. feladat
Írjon és deklaráljon C függvényt,
amely egy nullavégű stringben kicseréli az angol ábécé kisbetűit a nekik
megfelelő nagybetűkre.
2. feladat
Írjon és deklaráljon C függvényt, amely egy nullavégű stringben, amely egyes karaktereket (’1’) és nullákat (’0’) tartalmaz, minden egymást követő hatodik egyes után beír egy nullát (’0’)! Az eredmény számára a függvény foglal helyet.
Pl: 11110111011111110011 ====> 111101110111111010011
3. hét
1. feladat
Írjuk át a laboron elkészített programot
úgy, hogy ne foglaljon helyet minden egyes új elemnek. Be lehessen állítani egy
méretet, és legalább annyi helyet mindig tartson lefoglalva. Ha az elemek száma
meghaladja ezt a méretet, akkor végezhet újrafoglalást elemenként.
4. hét
Írjunk egy háromszög osztályt!
a. Az osztály kívülről
hozzáférhetetlenül tárolja a háromszög három oldalát!
b. Inicializáláskor a
háromszöget meg lehessen adni két oldalával és a közbezárt szöggel, két
szögével és egy oldalával, illetve három oldalával, de valamelyiket mindig meg
kell adnunk, kezdeti argumentum nélkül ne lehessen példányosítani. Azt, hogy
melyik kombinációt adtuk meg, azt egy külön enum paraméterrel adjuk meg.
c. Gondoskodjunk róla, hogy ha
a háromszög inicializálása után nem korrekt értékeket tartalmazna, akkor legyen
0 hosszú az összes oldala.
d. Az osztály képes legyen
kiszámolni a háromszög területét, kerületét és megállapítani, hogy
derékszögű-e.
e. A háromszög bármely adata
(oldal ill. szög) lekérdezhető legyen.
f. A program tagolása (.h:
osztálydeklaráció, .cpp: hosszabb implementációjú függvények törzse) a C++
programozók körében elterjedt konvenciók alapján történjen, és védjük le a
többszörös beépítésből eredő újradefinicióról szóló hibaüzeneteket. A tesztelő
függvény (ld. később) is külön állományba kerüljön.
g. Írjunk egy diagnosztikai
függvényt, amely kiírja a tagváltozók értékét, és egy tesztelő függvényt (main),
amely teszteli a konstruktorokat és a többi tagfüggvényt.
5. hét
Írjon egy Queue osztályt (FIFO)!
Valósítsa meg a push
műveletet, amely betesz egy elemet a queue végére, valamint a pop
műveletet, amely kiveszi a legrégebben betett elemet (az elejéről).
A Queue tároljon egész
számokat! Készítsen tagfüggvényt, amellyel eldönthető, hogy üres-e a queue, valamint
amely megadja az elemek számát!
Az adatokat dinamikusan
tárolja!
A SetMain.cpp-ben található tesztek mintájára készítsünk
tesztet a FIFO osztályunkhoz!
6. hét
Alakítsuk át a String osztályt,
hogy képes legyen UNICODE karakterek tárolására! Ezzel kapcsolatban az alábbi
ismeretek szükségesek:
§ A
UNICODE karaktereket a char típus helyett a wchar_t típussal
lehet megadni. Ez a C-ben nem, a C++-ban önálló típus (függvénynevek
túlterhelésénél külön számít). A feladat első része, hogy a char típust
mindenhol wchar_t típusra cseréljük.
§ A
széles stringkonstanst ugyanúgy adjuk meg, mint eddig, csak az L előtagot kell
az idézőjel elé írni:
wchar_t
str[]=L"árvíztűrő tükörfúrógép";
§ Ez
karakterkonstansokra is igaz:
wchar_t wch=L'A';
§ A cout
helyett wcoutot használunk, az ostream helyett wostreamet.
Hasonló az elnevezési konvenció a többi I/O osztály és objektum elnevezésében.
§ A C
függvények is megváltoznak, az strlen helyett wcslen-t használunk.
Az MSDN együtt tárgyalja a normál függvényeket és a széles karaktereket váró
függvényeket, elég tehát az eredetire rákeresni. Az alulvonással kezdődő
függvények nem szabványosak.
§ A
programunk forráskódja (a széles karakterkonstansok miatt) tartalmazni fog
magyar karaktereket is. Ezért nem menthetjük az egyszerű ANSI formátumban.
Visual C++ alatt a File/Advanced Save Options menüpontban adjuk meg a Central
European (Windows) Codepage 1250 opciót!
§ Át kell
állítanunk a programunk nyelvi (és kulturális) beállításait:
#include
<locale>
//
Létrehozunk egy magyar locale-t
locale
hun("hungarian",locale::all);
//
Beállítjuk a magyar locale-t globálisnak
locale::global(hun);
§ Ettől a
programunk UNICODE karaktereket fog kiírni, állományban jól fog működni, de a
konzol nem lesz UNICODE: Windows alatt konverzió történik a konzol aktuális
kódlapja és a kiírt UNICODE karakterek között. Ha szeretnénk, hogy jól
jelenjenek meg a magyar szövegek, állítsuk át rendszer locale-t a Control
Panelben található Regional and Language Options segédprogram Advanced
paneljében magyarra.
A tesztelő főprogram letölthető innen.
7. hét
Írjuk át az előző laboron
elkészített String osztályban az alábbi függvényeket túlterhelt
operátorokra:
a. concatenate (+)
b. compare (= =, !=)
c. copy (=)
Az előző megoldás letölthető innen.
8. hét
A Húsvéti Nyúl háromfajta
ajándékot (Present) oszt: tojást (Egg), csokit (Chocolate)
és cukrot (Candy). Mindegyik különböző értékű, az alapegység egy
statikus változója az alaposztálynak (basePrice=50), a tojás darabja
ennek konstansszorosa (eggFactor=0.3), míg a csoki esetében ez a tényező
chocolateFactor=2.4, a cukornál candyFactor=1.2. A Nyúlnak írt
programunk egy tömbben tartja nyilván a kiosztott ajándékokat. Az egyes
ajándékok darabszámot is tartalmaznak. A célunk kiszámolni és kiírni az egyes
ajándékok értékét (getPrice()).
a) Tervezzük meg és vázoljuk fel az osztályok
öröklési hierarchiáját! Használjuk fel a fenti dőlt betűs osztály-, függvény-
és változóneveket! Az osztályok téglalapjaiban tüntessük fel az összeget
lekérdező függvény (getPrice) deklarációját és láthatóságát! Ügyeljünk
az elegáns OO megoldásokra!
b) Implementáljuk az osztályokat és
konstansokat az EasterBunny névtérben figyelve arra, hogy esetlegesen
egyes konstansokat is tagként vagy statikus tagként érdemes implementálni. Ne
legyen egy függvénytörzsben sem felesleges, nem használt kód! Egy új
ajándéktípus esetleges felvételéhez ne kelljen a már meglévő osztályokat
módosítani!
c) Írjon egy egyszerű programrészletet
nem dinamikus tömbbel, ami megmutatja három különböző típusú ajándék
felvételét, valamint kiírja a nevüket és árukat.
9.hét
Gyakorló feladat:
Egy irodában az iratkezelés támogatására informatikai rendszert készítenek. Az előzetes felmérések szerint 6 különböző irat (I1, I2, I3, I4, I5, IR) kezelését segítené a rendszer, de nem kizárt, hogy később ez bővülni fog. Az iratok közös attribútuma az iratot tartalmazó állomány neve, az irat iktatási dátuma, az irat selejtezési dátuma, irat iktatószáma, és az irat rövid (max. 1440 karakteres) leírása. Az iratok iktatása úgy történik, hogy az iratra az irattárba érkezéskor rápecsételik az aktuális időt, és egy folytonosan növekvő sorszámot, ami az iktatási szám, ezután az iratot dossziéba rakják. Egy dossziéba előre meghatározott (a dosszié létrehozásakor megadott) számú irat fér, ami dossziénként változhat. A dosszié elejére ráírják a benne tárolt első és utolsó irat iktatási dátumát, és iktatási számát.
A rendszerben a következő műveleteket kell biztosítani:
Készítsen objektummodellt a rendszer modellezésére! Határozza meg az objektumok felelősségét és kapcsolatát! Ügyeljen arra, hogy egyik objektum se férjen olyan adathoz, amit a valóságban nem ér el!
Deklarálja C++ nyelven az irattár, a dosszié és az irat objektumokat! Röviden írja le a publikus metódusok működését (nem kell implementálni)! Használjon öröklést!
Valósítsa meg a listázás funkciót az, IR típusú iratra, amely egy egyszerű szöveges állomány! Valósítsa meg a dosszié objektum konstruktorát és az irat dossziéba helyezése metódust!
Házi feladat: (beadási határidő április 15.):
Az előző héten elkészített CompSys programban használt alkatrészeket tegye be a korábban megoldott dinamikus Vector osztályba. Működjön a CompSysVector.cpp főprogram!
10.hét
Alakítsuk át a 7. laboron készített Vector osztályt, hogy a hibákat kivételekkel kezelje!
1. Írjunk saját kivételosztályt az exception osztályból származtatva!
2. Írjuk meg a hibakezelést a következő szabványos kivétel felhasználásával, amelyet a fordító súgójában részletesen megtalálhatunk: out_of_range (egy érték nem a kellő határok között mozog).
11.hét
A tömbös megoldás a Sort függvény
paraméterként nem objektum-orientált megoldás.
Hogyan lehetne a múltkori Vector
osztály segítségével azzá tenni?
Hogyan függetleníthetnénk a
megoldást az adott vektor implementációtól?
(Tipp: a SortableVector
osztály Comparable* típusokat tárol.)
12.hét
Alakítsuk át a 5. laboron készített Set osztályt generikussá!
13.hét
Írjuk bele a hiányzó függvényeket a String osztályba, amik a C könyvtárban megvannak! A C könyvtári függvények hívása megengedett.
Utolsó módosítás:2010. május 5.