Programozás alapjai 2. labor-gyakorlat

2009/2010 2. szemeszter.

A tantárgy adatai

A tárgy kódja: VIAUA116

Kis házi feladatok

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.