Házi feladat

A félév során kötelező egy nagy házi feladat önálló megoldása. A feladat szabadon választott. Lehet a lenti listából is választani, vagy azokhoz hasonló nehézségű, az elvárásoknak megfelelő saját problémák is megoldhatóak. Ne untasd magad, ne a C házid készítsd el újra... A választást mindenképpen jóvá kell hagyja a laborvezető.

A bordó dőlt betűvel

címzett feladatok csak a nagyon informatikus beállítottságúaknak ajánlottak.

Követelmények

A nagy házi feladat a következő követelményeknek kell megfeleljen:

Formai követelmények:

Megjelenítés – grafikus képernyőhöz segédlet

A házi feladatnak nem követelménye a grafikus megjelenítés. Vannak feladatok, melyeknek azonban csak úgy van értelme. Ha nem szeretnél grafikával, eseményvezérléssel, időzítésekkel bajlódni, kerüld el az ilyen feladatokat.

A grafikus programokhoz pl. a platformfüggetlen SDL könyvtárat lehet használni. Elérhető egy rövid útmutató a telepítéshez és a használathoz.

Értékelési szempontok

Automatikusan elutasításra kerül


Pontozás (22 pont)

Határidők (2 pont)

Programkód minősége (7+7 pont)

Dokumentáció minősége (6 pont)


Minimum 250 kódsoros programot várunk, minden hiányzó 50 sorért 5 pont levonás jár. Normál sűrűségű, vagy a laborvezető által olyanná alakított kódolás esetén, a megjegyzéseket és sormintákat (ismétlődő kódrészek) figyelmen kívül hagyva.


Értékelés

11 pont alatt elégtelen. 11-13 elégséges, 14-16 közepes, 17-19 jó, fölötte jeles.

Matematikai jellegű programok

Egész aritmetika

Készíts bignum osztályt, amely nem korlátozott ábrázolási tartományú egész aritmetikát valósít meg – vagyis képes tetszőlegesen nagy, akár 1000 számjegyű egész számokkal is számolni. Az osztály támogassa az érték beolvasását és kiírását, rendelkezzen operátorokkal a négy (+1) alapművelet elvégzésére. Legyen alkalmas bignum és int ill. long operandusokkal végzett műveletekre is.

Kifejezés

Készíts C++ osztályhierarchiát, mely alkalmas az alábbi alapelemek tetszőleges kombinációjaként felépített összetett kifejezések egyszerűen kiértékelhető tárolására!

Játékok

Reversi 1

Készíts objektumot a reversi (Othello) nevű játék megvalósításához! Az objektum tárolja a játék állását és "ismerje" a szabályokat, azaz automatikusan "forgassa" át megfelelő korongokat, melyek szintén objektumok! Demonstráld a működést külön modulként fordított tesztprogrammal! A tesztprogram két ember egymás elleni játéka lehet. (A gépnek nem kell tudnia a felhasználó ellen játszani.) Rajzolja ki a program karakteres üzemmódban a játékállást, az egyes sorokat és oszlopokat számmal, illetve betűvel megjelölve; utána a felhasználók a megfelelő indexek megadásával helyezhessék el bábuikat (pl. "D5"). Legyen lehetőség fájlba menteni és visszatölteni az állást.

Reversi 2

Írj reversi (Othello) játékot, amelyben a gép ellen lehet játszani! A tábla objektum tárolja a játék állását és "ismerje" a szabályokat, azaz automatikusan "forgassa" át megfelelő korongokat, melyek szintén objektumok! A program tudjon támadó stratégiákat alkalmazni.

Hexxagon

  _
 /*\_
 \_/o\
 / \_/
 \_/

Táblás játék. A pálya hatszögletű elemekből áll. Mindkét fél néhány bábuval indul. Minden lépésben a játékosok valamely bábuval a szomszédos helyre terjeszkedhetnek (ilyenkor nő a bábuk száma), vagy kettővel arrébb ugorhatnak (ilyenkor nem) egy szabadon választott bábujukkal. Az újonnan lerakott bábu mellett az ellenség bábui színt váltanak; a lépő játékos megnyeri azokat. YouTube videó itt: http://www.youtube.com/watch?v=_E10ydLaLE8. Ha nem is lesz szépen, de ez is megoldható szöveges képernyőn, lásd a rajzot.

Írj programot, amelyben a gép különféle stratégiákkal játszik a felhasználó ellen!

Aknakereső játék

Készíts aknakereső játékot. A pálya téglalap alakú, cellákból álló tábla. Egy cellára rálépve megtudhatjuk, hogy az adott cellán van-e akna (ebben az esetben felrobbanunk - vége a játéknak), illetve, hogy hány szomszédos cellán van. Legyen lehetőség: a tábla méreteinek a meghatározására; a táblán lévő aknák számának megadására; a játékidő mérésére (esetleg limitálására); a játékos által aknának gondolt cellák megjelölésére. Az egyes cellák, illetve a pálya legyenek objektumok! (Pl. palya.lep(5,7)) A program legyen képes egy félkész játékállást elmenteni, illetve betölteni (fájl műveletek). A programnak nem kell grafikusnak lennie, elég a szöveges képernyőre kirajzolni a pályát. A felhasználó a programot a pálya oszlopa betűjének, és sora számának beírásával vezérelhesse!

Torpedó játék

Készíts objektumokat a torpedó játék megvalósításához! A játékos objektum leszármazottai az ember és a gép objektum, az ősben kötelezően előírt lép tagfüggvényükben térnek el. A cella objektumokból álló tábla objektum ismerje fel, ha az ellenfél megnyerte a játékot! Demonstráld a működést külön modulként fordított tesztprogrammal! (A gépnek nem kell tudnia a felhasználó ellen játszani, elegendő, ha véletlenszerűen tippelget.) Rajzolja ki a program karakteres üzemmódban a játékállást, az egyes sorokat és oszlopokat számmal, illetve betűvel megjelölve; utána a felhasználó a megfelelő indexek megadásával tüzelhet (pl. "D5").

„Informatikus” feladatok

Útvonaltervező

STL tárolók felhasználásával készíts gráf sablont!

Készíts hely és út objektumot, a térkép az ezekből felépített gráf. Lehessen a térkép alapján két megadott helyszín között útvonalat tervezni. Lehessen megadni az útvonaltervezés szempontját is (leggyorsabb, legrövidebb, stb)!

Buszjáratok

Készíts programot, amely egy közlekedési társaság buszjáratait képes nyilvántartani, és a menetrendek alapján útvonalakat felépíteni! Elvárások a programmal szemben:

SDL grafika

Az SDL egy C-hez illeszkedő grafikus könyvtár. Csomagold be egy osztályba, mely garantálja a biztonságos használatot C++ környezetben. Az egyes alrendszereket érdemes külön osztályokba pakolni.

„Informatikus” feladatok örökléssel

Neumann gép

Készíts objektummodellt egyszerű Neumann-elvű számítógép szimulálásához: Definiálj közös ősből származó utasítás-, és adat-objektumokat, melyek a memória-objektumban tárolhatók. A vezérlő egység feladata a memóriából kivenni a soron következő utasítás objektumot, végrehajtani a run metódusát, majd meghatározni a következő utasítás helyét. Demonstráld a működést egy olyan programmal, ami megadja, hogy két szám barátságos-e. Elegendő az ehhez szükséges minimális utasításkészletet megvalósítani.

Híd forgalma

Egy hídon 1 tonnás személygépkocsik, 4.5 tonnás teherautók, és 20 tonnás villamosok mennek át. Egy közlekedés-felügyelő szoftver figyeli, hogy mennyi a hídon lévő járművek össztömege, és csak akkor ad zöld lámpát a következő járműnek, ha a hídon lévő járművek össztömege nem haladja meg a híd teherbírásának 23%-át. A hídon egy villamospálya és egy aszfaltozott sáv van (mint a Szabadság-hídon). Az autók a hidat olyan sorrendben hagyják el, amilyen sorrendben érkeztek, a villamos és az autók sorrendje viszont tetszőleges (2 FIFO). Készítsd el a szükséges osztályokat, használj öröklést, dinamikus kötést és dinamikus adatszerkezetet! Az objektumok működését mintaprogrammal demonstráld!

Áruház

Egy áruházba háromféle ember léphet be: őr, eladó és vevő. Az őr bármikor beléphet, de csak akkor hagyhatja el az áruházat, ha van bent rajta kívül más őr is, vagy ha senki sincs bent rajta kívül, ő az utolsó. Eladó csak akkor léphet be, ha van bent őr, és csak akkor léphet ki, ha nincs bent vevő. Vevő csak akkor léphet be, ha van bent eladó, és bármikor kiléphet. Az áruház befogadóképessége meghatározott, ha ezt meghaladja a bent tartózkodók száma, akkor senki sem léphet be, míg fel nem szabadul egy hely. Készítsd el a szükséges osztályokat, használj öröklést, dinamikus kötést és dinamikus adatszerkezetet! Az objektumok működését mintaprogrammal demonstráld!

Cipőfűzés

Készítsd el egy cipőbe cipőfűzőt fűző cég szoftverét! A cég háromféle cipőt fűz: kicsit, közepeset és nagyot, háromféle cipőfűzővel: kicsivel, közepessel és naggyal. Folyamatosan érkeznek a cipő és a cipőfűző szállítmányok, de sorrendjük kiszámíthatatlan. Minden cipőbe lehetőleg neki megfelelő méretű fűzőt kell fűzni, de ha nincs, akkor nagyobbat is lehet használni, kisebbet viszont nem. Amikor beérkezik egy szállítmány, be kell fűzni annyi cipőt, amennyit lehet, az elkészült fűzött cipőkhöz használt alapanyagok levonódnak a raktárkészletből. Jelezze, ha az aktuális szállítmányt részben vagy egészben nem tudta fölhasználni, és közölje, mennyi sikerült, mennyi került raktárba, illetve miből mennyi került felhasználásra. Készítsd el a szükséges osztályokat, használj öröklést, dinamikus kötést és dinamikus adatszerkezetet! Az objektumok működését mintaprogrammal demonstráld!

Könyvespolc

Egy könyvespolc három szintje egyforma szélességű (darabszám), de eltérő magasságú: kicsi, közepes és nagy könyvek számára. Könyvekből is csak ez a három méret létezik. A könyvespolcra akkor lehet könyvet feltenni, ha van elegendő szabad hely a könyvnek megfelelő, vagy annál magasabb polcon. Időnként új könyveket vásárolunk, melyeket el kell helyezni a polcon, és fontos tudnunk róla, ha ez nem lehetséges. Készítsd el a szükséges osztályokat, használj öröklést, dinamikus kötést és dinamikus adatszerkezetet! Az objektumok működését mintaprogrammal demonstráld!

Szimulációk

Ágyú

Készíts ágyú osztályt, mely minden lövéskor létrehoz egy új lövedék objektumot, és kilövi. A légellenállás nem elhanyagolható! A pályák legnagyobb magassága és a lövések hosszának a maximuma legyenek a lövedék osztály statikus tagváltozói. Ezeket a lövések állítják be. A lövedékek, valamint a röppálya tárolható STL vector-ban. Legyen lehetőség az összes kilőtt lövedék röppályáját együtt megjeleníteni (konzol vagy grafikus), valamint állandó szél (1D) hatását figyelembe venni.

Tömegvonzás

Készíts osztályt égitestek modellezésére. Készíts osztályt, amely égitesteket tárol, és egy 2D-s naprendszert modellez: egy központi égitest körül bolygók keringenek. A bolygók nem hatnak egymásra. A naprendszer legyen képes adatait file-ból olvasni. Az időlépést egy naprendszer tagfüggvény kell végrehajtsa (erőtörvény+iteráció). Az eredményközléshez a naprendszer kiíró függvénye hívja meg az egyes égitestek kiíróját. A bolygók számára használhatsz STL tárolót.

Monte-Carlo szimuláció

A Monte-Carlo módszer lényege, hogy megfelelő eloszlásfüggvény szerint sorsoljuk a részecskék mikroszkópikus jellemzőit, amivel létrehozunk egy lehetséges szituációt. Ezt a kísérletet sokszor megismételve statisztikus megközelítéssel adódnak a makroszkópikus jellemzők. Keress megfelelő fizikai problémát, melyet MC szimulációval vizsgálhatsz, és készíts OO programot, mely el is végzi. (Ügyelj a kivárható futásidő fenntartására.)

Inga 1

Készíts objektumot, mely egy fonálingát modellez: fonál végén véges kiterjedésű gömb, képes annak mozgását szimulálni (erőtörvény+iteráció). A fonál ideális, de a légellenállás nem hanyagolható el! Készíts egy további osztályt, melyben két inga található. Az ingák oly módon helyezkednek el, hogy stabil nyugalmi helyzetükben a két gömb éppen összeér, és középpontjuk azonos magasságban található. A mozgás szimuláció során az ütközésre az ingáknak kell figyelni, és fizikailag reális módon kezelni. Az ütközésnél is lehet veszteség a mozgási energiából. Egyszerű tesztelővel demonstráld a működést.

Inga 2

Készíts objektumot, mely egy kettős fonálingát modellez: fonál végén véges kiterjedésű tömeg, és valahol a fonálon még egy tömeg. Legyen képes saját mozgását szimulálni (erőtörvény+iteráció). A fonál ideális, de a légellenállás nem hanyagolható el! Egyszerű tesztelővel demonstráld a működést.

Grafikus programok

Inga 3

Készíts objektumot, mely egy fonálingát modellez: fonál végén véges kiterjedésű gömb, képes annak mozgását szimulálni (erőtörvény+iteráció). A fonál ideális, a légellenállás elhanyagolható! Készíts egy további osztályt, melyben két inga található. Az ingák oly módon helyezkednek el, hogy stabil nyugalmi helyzetükben a két gömb éppen összeér, és középpontjuk azonos magasságban található. A mozgás szimuláció során az ütközésre az ingáknak kell figyelni, és fizikailag reális módon kezelni. Az ütközésnél lehet veszteség a mozgási energiából. Grafikusan jelenítsd meg az ingák mozgását.

Biliárd

Készíts objektumot, mely egy biliárdgolyót modellez, képes annak mozgását szimulálni (erőtörvény+iteráció). A légellenállás elhanyagolható! Készíts egy további osztályt az asztal reprezentálására. A mozgás szimuláció során az egymással és a fallal ütközésre is a golyóknak kell figyelni, és fizikailag reális módon kezelni. Az ütközésnél lehet veszteség a mozgási energiából. Grafikusan jelenítsd meg a golyók mozgását.

Rezgő-mozgó

STL tárolók felhasználásával készíts gráf sablont!

Készíts tömegpont és rugó objektumot. Készíts rezgő-mozgó objektumot, mely egy gráfban tömegpontokat, és azokat összekötő rugókat tárol, és erőtörvény + iteráció segítségével követi a rendszer állapotát. Lehet gravitációs mező nélkül is: űr-rezgőmozgó.

Életjáték

Készíts grafikus C++ programot, mely a Conway féle LIFE (életjáték) modellt valósítja meg OO megközelítésben. Részletek a http://en.wikipedia.org/wiki/Conway%27s_Game_of_Life címen. A program legyen képes:

Az egyes sejtek, illetve a pálya legyenek objektumok!

Langton hangyája

Készíts C++ programot, mely egy nem szokványos hangya (Langton's ant) modellt valósít meg: A cellák K-féle állapottal (színnel) rendelkeznek, a hangya egy állapottal, de négyféle lépéssel! A program legyen képes ésszerű méretű élettéren, file-ból beolvasott szabályokkal indulva, a szimuláció N lépésenkénti megjelenítésére. Az egyes cellák, a hangya, illetve a pálya legyenek objektumok, saját viselkedésüket megvalósító tagfüggvényekkel! A szabályokat az alábbi formában definiáljuk: I, U, <, ill. > karakter jelzi, hogy az adott állapotú cellára lépve a hangya mit tegyen: egyenesen tovább, forduljon vissza, balra, ill. jobbra. (Ha az első kettőt nem használjuk, a szokásos hangya viselkedést kapjuk.) Pl. 4<>>< egy négyállapotú szabályrendszert ír elő.

Töltés-játék

(Grafikus program.) A játék a következő. A program a képernyő adott pontjából, adott irányban kilő egy pozitív töltéssel rendelkező részecskét. A játékos számára adott néhány másik töltés, amelyeket úgy kell elhelyeznie a képernyőn, hogy a mozgó töltés egy megadott célba jusson. Ezek az elhelyezendő töltések lehetnek különböző erősségűek, polaritásúak stb. Közben a pályán lehetnek fix töltések, falak stb. (Hasonló játék itt: http://kmk.blog.hu/2007/07/26/newton_kedvenc_jateka)

A fix töltések, a mozgó töltés, a falak és a pálya legyenek objektumok. A gátló tényezőket STL tárolóba is helyezheted.

Pohl Laci nehezebb feladatai

Mátrix

Készíts mátrix osztályt! Legyenek értelmezettek a következő műveletek: mátrixok összeadása, kivonása, szorzása, mátrix számmal szorzása, mátrix invertálása. Használj operátor átdefiniálást, ahol annak értelme van! Tedd az osztályt iostream kompatibilissé a << és >> operátorok megfelelő átdefiniálásával! További mátrixműveleteket is megvalósíthatsz.

Opcionális: megvalósíthatsz valós vagy komplex elemű mátrixot, illetve osztálysablonként is elkészítheted, így létrehozáskor dőlhet el a tárolt elemek típusa. Megvalósíthatod a kétdimenziós tömbök kezeléséhez hasonló indexelést (pl. m[i][j]) is: ehhez érdemes egy segédosztályt definiálni a mátrix osztályon belül.

Korlátlan valós

Készíts osztályt valós számok nagypontosságú tárolására! A C++ nyelvben használt double típus kb 15 értékes (tizedes)jegy tárolására alkalmas. Előfordulhat azonban, hogy ez nem elég. Az általad készített osztály esetén létrehozáskor lehessen megmondani, hogy mekkora pontossággal tárolja a számot az objektum. Két megközelítés közül választhatsz: - Fixpontos számábrázolás: megadható, hogy a szám egész része ill. törtrésze hány számjegyből állhasson, és az osztály ennek megfelelően tárol (ízlés szerint akár két külön dinamikus tömbben). - Lebegőpontos: az osztály mantisszát és karakterisztikát tárol. Ebből csak a mantissza esetén kötelező lehetővé tenni a tetszőleges pontosságot, azaz a mantissza dinamikus tárolását, a karakterisztika lehet egy int érték. Mindkét esetben a dinamikus tömbök egész számokat tárolnak. Az osztálynak legyen megfelelő konstruktora/konverziós operátora a double típusra való oda-vissza konverzióra.

Kalandjáték

Szöveges kalandjáték. A tárgyak egy ősosztály, ennek leszármazottja a fegyverek. Minden tárgynak van súlya, a játékos teherbírása véges: ha a nála lévő tárgyak súlya túl nagy, nem vehet fel újabbat. Ha a játékos megsérül, a teherbírása is csökken. A fegyvereknek van ereje és gyorsasága, esetleg más tulajdonsága. Az egyik ellenfélnek az egyik, a másiknak a másik fegyver árt többet. Az ellenfél is egy osztály, mindegyik tudja a saját nevét, meg a harci paramétereit, esetleg azt, hogy követi-e a játékost, vagy az elmenekülhet előle. Az eddig leírtak csak ötletek, lehet bármit másképpen csinálni.

Sakk

Sakk. A figura ősosztályból származnak az egyes figurafajták. Minden figurának van léphet-e tagfüggvénye, amely egy új koordinátapárt kap a sakktáblán mint célpontot. Ha a figura léphet az adott pontra (szabályos a lépés), akkor logikai igazzal tér vissza. Természetesen csak akkor léphet egy mezőre a figura, ha ott nem áll saját színű figura. A feladat megvalósítható úgy, hogy két ember játszik egymás ellen, de úgy is, hogy az ember ellenfele a gép.

Töltés

Töltött részecskék dobozban. Készíts töltött részecske és doboz osztályt! A doboz töltött részecskéket tárol. Kezdetben véletlenszerűen elhelyezel valamennyi töltött részecskét a dobozban, mindnek 0 a sebessége. Minden részecskének van egy számol és egy frissít tagfüggvénye. A számol függvény a többi részecske helyzete és töltése alapján meghatározza a részecske új sebességvektorát. A frissít függvény egy delta t időt kap paraméterként, és kiszámítja a részecske új pozícióját az előzőleg számított sebességvektor alapján. A részecskék a konstruktoruk paramétereként kapják az őket tároló dobozt is, így férhetnek hozzá egymás adataihoz. Kezeld azt is valamilyen módon, ha egy részecske egy doboz oldalának ütközik.

QT

Grafikus felhasználói felülettel rendelkező program. Egyszerűbben megtanulható, kényelmesebben kezelhető egy program, ha grafikus felhasználói felülettel rendelkezik. A Programozás tantárgyakban tanultak felhasználásával önállóan megtanulható ilyen programok készítése. Számos C vagy C++ nyelven készült ingyenes grafikus környezet elérhető. Az egyik legnépszerűbb ilyen környezet a Qt, amely a http://qt-project.org/ oldalról érhető el. A Qt C++-ban készült, és Windows mellett számos platformra elérhető, pl. Linux, Mac, de mobil platformokra is. A Qt-hoz saját fejlesztőkörnyezet is tartozik (Qt Creator), ebben egyszerűen összeállítható egy-egy ablak tartalma (menü, gombok, feliratok, szerkesztőmezők, stb.). Az interneten rengeteg anyag hozzáférhető a Qt megtanulásához: a fejlesztőkörnyezet oldalán minden komponens részletes, példákkal illusztrált leírása ott van; a YouTube-on számos videóban láthatjuk, hogyan lehet egy programot a nulláról elindulva megtervezni, stb.

A Qt nincs telepítve a HSzK gépeire, ezért célszerű saját notebookon bemutatni az ezzel készült programot. Aki mégis a HSzK gépén szeretné bemutatni, az a bemutatás előtt próbálja ki, hogy megy-e ott a program. Ahhoz, hogy az exe a Qt Creatoron kívül elinduljon, általában szükség van arra, hogy a Qt-hoz tartozó számos .dll fájlt is átmásoljunk.

Házi feladatnak megfelel, ha valaki készít egy egyablakos felhasználói felületet, melyen valamilyen egyszerűbb probléma megoldását mutatja be: