Nagy házi feladat – feladatlista

Czirkos Zoltán, Nagy Gergely · 2019.08.24.

A nagy házi feladathoz választható programok listája.

A tárgyban kötelező egy nagy házi feladat 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. (Egyetlen kivétel a plágiumkereső – azt nem szabad választani, mert az a minta házi.)

A nagy házi megoldásához néhány tipp és segédlet egy külön oldalon található. A házik melletti *-ok a nehézségeket mutatják, azzal a megjegyzéssel, hogy a nehézség szubjektív, mindenki másképp érzékeli. A grafikus házikkal kezdőként vigyázni kell: ilyen témákról nincs szó a tárgyban, külön utánanézés, rátanulás kell hozzájuk.

A háziban nem feladat a megjelenítés szépségével foglalkozni, hiszen a tárgyban a programkód minőségét pontozzuk. Ettől függetlenül, érdemes a megjelenítésről, grafikus elemekről szóló oldalt átolvasni.

1. Játékok

Amőba *

Készíts menüvezérelt C programot, mely amőbát játszik. A program legyen képes:

  • a játék adminisztrálására egy tetszőleges méretű táblán,
  • több támadó és védekező stratégiát alkalmazni,
  • állás elmentésére és visszatöltésére.

Reversi **

Írj reversi játékot, amelyben a gép ellen lehet játszani! A program legyen képes:

  • Kirajzolni a pályát (szövegesen vagy grafikusan).
  • Fájlba menteni és visszatölteni az állást.
  • Ellenőrizni, hogy helyes-e a játékos lépése.
  • Támadó stratégiákat alkalmazni.

(Vigyázat, ennél is kötelező dinamikus memóriakezelést használni, bár az amőbával ellentétben ezt fix méretű pályán szokták játszani. Konzultálj a laborvezetővel!)

Hexxagon **

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.

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

Sokoban **

A játékban egy figurával ládákat kell tologatni a képernyőn; úgy, hogy azok a megfelelő helyre kerüljenek. A pálya viszont olyan, hogy könnyű betolni olyan helyre a ládákat, ahonnan már elmozdítani nem lehet őket.

Olvasd a pályák leírását fájlból! Vezess dicsőséglistát! (Melyik játékos, melyik pályát, hány lépésből tudta megoldani?) Ez könnyedén megoldható szöveges képernyőn is.

Ehhez a játékhoz érdemes megcsinálni az XSB fájlok beolvasását. Egy ilyen fájl szövegként reprezentálja a pályát, pl. # a fal, szóköz a járat és így tovább. Ha ilyet tud a programod, rengeteg neten fellelhető pályával használható lesz, lásd például itt és itt.

Atomix **

A játékban egy zegzugos pályán kell kirakni az elszórt atomokból egy molekulát. A játékos egy kattintással (vagy egy gomb megnyomásával) megfoghatja az atomokat, utána pedig egy irány megadásával (fel, le, jobbra vagy balra) elindíthatja azokat. A nehézség abban áll, hogy ilyenkor az atomok nem egyet ugranak arrébb, hanem addig mennek, amíg falba vagy egy másik atomba nem ütköznek.

A játékban a pálya lehessen tetszőlegesen nagy! Pályák letölthetőek innen: atomix.zip. Leírás megtalálható a ZIP-ben. Az original.json fájl viszonylag egyszerű pályákat tartalmaz.

Töltés-játék **

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. 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 program számoljon pontszámot a játékos számára (pl. hány próbálkozásra sikerült megoldania a pályákat), és ez alapján tartson nyilván dicsőséglistát is, amelyet fájlba ment és vissza is olvas! A programnak tetszőlegesen sok töltést kell tudni kezelnie. A pályák leírását (hol van töltés, hol van fal) olvasd fájlból! Egy pályán lehessen tetszőlegesen sok mind a kettőből!

Moon Lander **

A játékban a pilóta feladata a következő. A program kirajzol oldalnézetben (2D grafika) egy hepehupás felszínt, amelyen van valahol egy leszállásra alkalmas, sík terület. Ide kell navigálnia a holdkompot a balra, jobbra (oldalirányú gyorsítás), felfelé (hajtómű erősebben visz felfelé), szóköz (hajtómű kikapcsolása) billentyűkkel. A pilóta az alábbi visszajelzéseket kapja a műszerfalon: magasság, x és y irányú sebesség, kontakt fény (amikor már olyan közel van a talajhoz, hogy kikapcsolhatja a hajtóművet).

A sikeres leszállás feltételei a következők:

  • Nem szabad ferde terepre leszállni.
  • Bekapcsolt hajtóművel nem szabad túl közel kerülni a talajhoz.
  • A leérkezés pillanatában nem lehet túl nagy a vízszintes irányú sebesség (mert a komp felborul).
  • A leérkezés pillanatában nem lehet túl nagy a függőleges irányú sebesség sem (mert akkor a komp lábai összecsuklanak).
  • Ha elfogy az üzemanyag, a holdkomp lezuhan.

Figyelj arra, hogy a billentyűkkel nem közvetlenül a komp helyzetét, de még csak nem is a sebességét lehet irányítani, hanem a gyorsulását. (Nehezített változat: a jobbra-balra gombokkal nem a vízszintes gyorsulást lehet szabályozni, hanem a holdkomp elfordulását. A gravitáció mindig a felszín felé hat, a felfelé gombra a hajtómű mindig a holdkomp aljának irányába bocsájtja ki a gázcsóvát – ami viszont az elfordulás miatt nem feltétlenül a felszín felé mutat.)

Vigyázat: ebben a feladatban is kell dinamikus memóriakezelés. Egy ötlet: a hajtóműből kiáramló részecskék tárolása.

Space Taxi **

A játékos itt egy repülő taxit irányít. Az utasok a pálya platformjain jelennek meg; le kell melléjük szállni, és átvinni őket arra a platformra, amit mondanak. Mindezt úgy, hogy minél kevesebbet kelljen várakozniuk, mert annál több borravalót fognak adni.

A taxival időnként tankolni is kell, az erre kialakított platformon. A tankolás természetesen pénzbe kerül.

A programban legyen lehetőség a pályát – a platformok elhelyezkedését, esetleg falakat stb. – fájlban definiálni!

Asteroids **

A játékos egy űrhajót irányít, és a felé repülő aszteroidákat kell szétlőnie. Természetesen a nagyobb aszteroidák nem csak simán eltűnnek, hanem kisebb darabokra esnek szét; közben vigyázni kell, nehogy az űrhajó bármelyiknek nekiütközzön.

A programban legyenek nehézségi szintek (pl. az aszteroidák gyakorisága alapján), és legyen dicsőséglista a legeredményesebb játékosok pontjaival!

Space Invaders **

A játékos a képernyő alján lévő űrhajót – ágyút – irányítja. Jobbra és balra mozoghat, és közben lőhet a fentről érkező űrlényekre.

A programban legyenek nehézségi szintek (pl. az űrlények száma, sebessége alapján), és legyen dicsőséglista a legeredményesebb játékosok pontjaival!

Laser Maze **

A Laser Maze egy gyerekeknek szóló fejlesztő játék, de létezik felnőtt változata is, nehéz feladványokkal.

A játék lényege, hogy egy adott pontból kiinduló lézerfényt kell tükrökkel egy megadott helyre irányítani. A kiindulás és a cél helye az adott pályától függ (honnan, milyen irányba induló fénysugarat kell eljuttatni hova, milyen irányból). A pályán lehetnek fix, nem mozgatható elemek is. A játékos az alábbi típusú elemeket használhatja fel, korlátos számban:

  • Tükör (a rajzon ez kék).
  • Féligáteresztő tükör, amely kettéosztja a fénysugarat (a rajzon zöld).
  • Egyes pályán a fénysugarat blokkoló falak is lehetnek.

Pipe Dream **

A játékos véletlenszerűen csődarabokat kap (egyenesen menő, kanyarodó, egymást kereszteződő elemek). Ezekből kell egy hosszú vezetéket építenie a víznek, hogy eljuttassa a kiindulási helyről a célba. Többféle játék elképzelhető:

  • Leghosszabb utat kell építeni.
  • Legrövidebb utat.
  • Időre megy – gyorsabban kell építeni a vezetéket, mint ahogyan a folyadék érkezik.

Csapos **

A játékos itt a csapos szerepét játssza. Az ajtón szomjas vendégek esnek be, akiknek a pult másik végén lévő csapból sört kell csapolni, és odalökni nekik.

Egy pultnál akár több vendég is lehet. A játékos akkor veszít, ha nem sikerült sört csapolni a vendégnek, mire a pultig elért.

A programban legyenek nehézségi szintek (pl. a vendégek száma alapján), és legyen dicsőséglista a legeredményesebb játékosok pontjaival!

Farm **

A Farmville játékban egy veteményes kertet kell gondoznia a játékosnak: kapálnia, növényeket ültetnie, termést betakarítania. A feladat egy ilyen programot írni. A programnak tudnia kell:

  • grafikusan megjeleníteni a kert állapotát (sok ingyenesen elérhető grafikai elem is van, pl. „plant tiles graphics” keresőszavak),
  • megadható méretű kerttel dolgozni,
  • az idő figyelembe vételével változtatni a kert állapotát,
  • a játékállást fájlba menteni, visszatölteni, több játékállással dolgozni.

Kalandjáték **

Készíts szöveges kalandjáték programot, amely

  • felajánlja a választási lehetőségeket,
  • a küldetéseket egy szövegfájlból dinamikus adatszerkezetbe olvassa be,
  • képes a játék állásának elmentésére.

A játékban tetszőlegesen sok helyszín között lehet mozogni, és a játékosnál tetszőlegesen sok tárgy lehet. Ezeket az adatokat fájlból kell olvasni; a helyszínek és tárgyak nem lehetnek a programba drótozottak. Másképp fogalmazva, ha a kódban megjelenik a játék története, az rossz megoldás. A történetet és szabályokat eldöntheted, de ne vállald túl magad a specifikációban!

Sakk **

Itt két emberi játékos játszik egymás ellen, a sakk szabályai szerint. A program feladata, hogy a lépéseket ellenőrizze, a szabályokat betartassa; továbbá hogy rögzítse a játék menetét, és lehetővé tegye a visszajátszást, valamint a lépések fájlba mentését.

A játék lehet grafikus is. De ha jól van beállítva a karakterkódolás, akár megoldható konzolos felületen is, hiszen a bábukhoz tartozóan vannak Unicode karakterek: ♔♕♖♗♘♙♚♛♜♝♞♟.

Kígyó játék **

Készíts kígyó játékot, ahol a kígyók ha megeszik a véletlenszerűen elhelyezett étket, akkor nő a méretük. Ha önmaguknak, vagy egymásnak ütköznek, az a játék végét jelenti. A program legyen képes:

  • Egy, illetve két játékos üzemmódra.
  • A pontok számolására és elmentésére.

Laser Squad ***

Ebben a játékban két katonai csapat harcol egymás ellen. A játék körökre osztott: a csapatok katonái felváltva léphetnek, előbb egyik, majd a másik csapat. Minden katonának valahány időegysége van mozogni egy körben. Pl. lépésenként egy egységnyi időt használ fel, vagy az idejét lövésre is használhatja.

A játék szabályait tetszőlegesen specifikálhatod. Például lehetnek gyors (több időegységgel rendelkező) és lassú katonák. Lehetnek könnyen (kevés időegységért) és nehezen használható, de erősebb fegyverek stb. De ne vállald túl magad a specifikációban!

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,
  • aknamentes környék automatikus felderítésére.

Életjáték *

Készíts menüvezérelt C programot, amely a Conway-féle LIFE (életjáték) modellt valósítja meg. Részletek a játék Wikipédia oldalán címen. A program legyen képes:

  • választott méretű élettéren,
  • a felhasználó által,
  • illetve fájlból beolvasott kezdeti állapotból indulni,
  • a szimuláció folyamatos vagy lépésenkénti megjelenítésére.

Lift-szimulátor **

A program feladata liftek vezérlése.

  • A liftekhez adott időközönként emberek érkeznek, akik választásod szerint jelzik úticéljukat (emelet száma), vagy úticéljuk irányát (fel/le).
  • A programnak valamilyen algoritmussal irányítania kell a lifteket, kiszolgálni az utasokat.
  • Az utasok a liftbe beszállva (ha az nincs túlterhelve) eljuthatnak a cél állomásra, ahol aztán kiszállnak. Amíg be nem fejezték az utazásukat, a programnak tételesen tudnia kell minden egyes utas adatait (hol van, hova készül stb.)

Bemenetként lehessen szövegfájlt megadni, amely a szimuláció adatait tartalmazza (pl. utasok megérkezésének ideje)! A program választásod szerint jelenítse meg az eredményt, vagy írja fájlba az utazások (kiszolgálások) adatait! A programod készítsen statisztikát az utazásokról (pl. várakozási idők, utazási idők)!

További játékok **/***

Készíts egyszerű játékprogramot (PacMan, Tetris, stb.) A program legyen képes:

  • a játékot pontozással értékelni,
  • a pontszámokat a játékos nevekkel együtt elmenteni (tetszőleges számban),
  • az elmentett eredményeket a pontok szerint csökkenő sorrendben megjeleníteni,
  • pálya térképet fájlból beolvasni (pacmannél), tetszőleges méretű pályán játszani (tetrisnél) stb.

Ki nevet a végén ***

A klasszikus Ki nevet a végén? társasjáték gépesített változata. A játékosok egymás ellen játszanak, a gép a kockadobásokat szimulálja és a játékszabályokat ellenőrzi.

Legyen képes a program:

  • a pályát megjeleníteni,
  • a játékosok lépését kezelni és ellenőrizni,
  • a játékállást fájlba menteni.

A program megvalósítható grafikusan és konzolon is. Figyelem: a nagy házi adatszerkezetekre vonatkozó követelményei itt is érvényesek. Egyeztess a laborvezetővel!

Kártyajáték **/***

Kártyalap grafikus készlet:
kartya.png, kartya.svg.

Készíts programot, amelyik valamilyen kártyajátékot valósít meg: römi, póker stb. A programnak nem kell tudnia játszani a felhasználó ellen, viszont:

  • Kezelje a lapokat listában.
  • Jelenítse meg az állást.
  • Legyen lehetőség az állás mentésére és visszatöltésére.

Megvalósítható szöveges és grafikus képernyőn is.

Scrabble **/***

A Scrabble nevű szókirakó játékban a játékosok betűket kapnak, amelyekből egy négyzetrácsos pályára értelmes szavakat kell kirakniuk, keresztrejtvényszerűen. Minél hosszabb szót raknak ki, minél több pályán lévő betűt felhasználva, annál több pontot kapnak (https://hu.wikipedia.org/wiki/Scrabble).

Készíts játékot, amelyben

  • több játékos játszhat egymás ellen,
  • a program a játékszabályokat ellenőrzi, a szavakat szótárból kikeresi,
  • képes a játékállást fájlba menteni és visszatölteni,
  • játékosok pontjai alapján dicsőséglistát készíteni.

A program sok irányba fejleszthető, sok nehezítés lehetséges. Pl. adhat a program tippeket a szótár alapján. Lehet tetszőleges méretű a pálya (előre megadott, vagy automatikusan növekedő). Lehet gépjátékos.

Gonosz akasztófa **

A szótáras és akasztófás programokhoz használható adatfájlok: szotar.zip.

Szokásos akasztófa játéknak tűnik: a gép gondol egy szót, a felhasználó pedig megpróbálja kitalálni azt olyan módon, hogy betűket tippel. A gonoszság abban rejlik, hogy a gép nem kötelezi el magát egyetlen egy szó mellett sem. A felhasználó tippjei alapján mindig úgy szűkíti a szóba jöhető szavak halmazát, hogy a legkevesebb segítséget adjon a felhasználónak. Pl. a felhasználó idáig eljutott: _k_r, és az „akár” szóra gondol. Ezért tippel egy a-t, mire a gép azt mondja, hogy veszített, mert a szó az „ökör” volt... Közben igazából nem is gondolt egyik szóra sem.

Legyen Ön Is Milliomos! *

A kérdések adatbázisa: loim.zip. Ebben egy Excel tábla van, amiből tetszőleges kódolással CSV-t, azaz szövegfájlt tudsz exportálni.

Mint a tévés játék: egymás utáni kérdések, mindegyikre egy jó és három rossz válasz. Rossz válasz esetén rögtön kiesik a játékos; lehet kérni a gép segítségét (elvesz két rossz választ) és a közönség segítségét (szavaznak). A program tartalmazzon dicsőséglistát a játékosokról: ki mennyi pénzt nyert, és mennyi ideig (perc) volt játékban.

A programnak fájlból kell beolvasnia a kérdéseket, amelyekből tetszőlegesen sok lehet. A táblázat minden kérdéshez egy nehézségi szintet is meghatároz; a létrehozott adatszerkezetnek a kérdéseket nehézség szerint kell csoportosítania, és a játékosnak választania kell tudni induláskor egy nehézségi szintet.

2. Matematikai jellegű programok

Egész aritmetika **

Készíts függvénykönyvtárat, amely nem korlátozott ábrázolási tartományú egész aritmetikát valósít meg – vagyis képes tetszőlegesen nagy, mondjuk 1000 (de akár még több) számjegyű egész számokkal is számolni. A program legyen képes a négy alapművelet elvégzésére – amelyekkel alkotott kifejezéseket a billentyűzetről vagy fájlból vár. (Ezek lehetnek fordított lengyel jelöléssel adottak is.)

Valósíts meg ezzel olyan algoritmusokat, amelyeket a Bevezetés a számításelméletbe c. tárgyban tanultál, pl. Euklidészi algoritmus tetszőlegesen nagy számokra!

Prímtesztek egész aritmetikával **

Valósítsd meg a Bevezetés a számításelméletbe tárgyban tanult prímtesztek valamelyikét tetszőlegesen nagy számokra!

Tizedes tört aritmetika **

Készíts függvénykönyvtárat, amellyel tetszőleges, előre meghatározott számú tizedesjegyig végezhetők el az alapműveletek! Pl. legyen képes 1000 tizedesjegyig, de akár még tovább számolni. Az első gyakorlati anyag alján mutatott algoritmussal számold ki a √2 értékét 1000 tizedesjegyig! A program legyen képes a négy alapművelet elvégzésére – amelyekkel alkotott kifejezéseket a billentyűzetről vagy fájlból vár. (Ezek lehetnek fordított lengyel jelöléssel adottak is.)

Numerikus integráló ***

Készíts C programot, mely a felhasználó által megadott függvényt numerikusan integrálja. Gondosan tervezd meg az adatstruktúrát! Tervezz egy megfelelő bemeneti nyelvet. A program legyen képes:

  • alapműveletek, polinomok,
  • a szokásos matematikai függvények (sin, log, exp stb.)
  • és tetszőleges kombinációjuk kezelésére.

A program legyen képes felhasználó által megadott kifejezéseket eltárolni és feldolgozni! (Ezek lehetnek fordított lengyel jelöléssel adottak is.)

Mátrix függvénykönyvtár **

Készíts függvénykönyvtárat, amellyel mátrixműveletek végezhetőek! Tárold egy mátrix szélességét, magasságát, valós értékeit! Legyen képes a programod bármilyen nagy mátrixokkal dolgozni, és a szokásos műveletek elvégzésén kívül a mátrixokat fájlba írni és fájlból visszaolvasni!

Valósíts meg a mátrixokon olyan algoritmusokat, amelyek a Bevezetés a számításelméletbe c. tárgyban szerepeltek. Választhatóak például: Gauss-elimináció, inverz mátrix, mátrix rangja, determináns stb.

Gráf tárolása ***

Készíts programot, amelyben gráfot tárolsz! Lehessen a gráfnak tetszőlegesen sok csúcsa, éle; lehessen csúcsot, élt hozzáadni és törölni! Lehessen a gráfot fájlba menteni, fájlból beolvasni!

A gráf alkalmazására tetszőleges feladatot kitalálhatsz. Pl. tárolhatod a csúcsok koordinátáit, hogy ki tudd rajzolni az, vagy tárolhatod az élek súlyát (távolságot), hogy legrövidebb utat keress Dijkstra algoritmusával. Megvalósíthatsz szélességi és mélységi bejárást.

Közösségi hálók ***

Sok szociológiai jelenség megmagyarázható a kapcsolatok (kapcsolati hálók) ismeretével. Az alábbi ábra példát mutat erre. A jelenség itt: a közösség minden tagja úgy gondolja, hogy a közösség 50%-a alkoholista. Valójában ez nincs így, csak a közösség egyharmada nagyivó. Azért érzik így mégis, mert az ismerőseik 50%-a tényleg az, és ezt vetítik ki a teljes közösségre.

Írj programot, amelyben ez a jelenség modellezhető! A program jelenítse meg a közösség tagjait, és lehessen megadni a közöttük lévő kapcsolati hálót is. Ezek után a program számítsa ki, a közösség mely tagja mit gondol a teljes közösségről.

A rajz a The Wisdom and/or Madness of Crowds oldalról származik – ez további ötleteket is adhat a programhoz.

Négyszín-tétel ***

A négyszín-tétel azt állítja, hogy bármely térkép országai kiszínezhetők négy különböző színnel. Formálisan: ha egy síkot tetszőlegesen összefüggő részekre osztunk, akkor ezek mindegyikéhez hozzárendelhetjük a négy szín egyikét úgy, hogy semelyik szomszédos rész nem lesz egyforma színű.

A feladat egy játékot írni, amely erre épít. A program véletlenszerűen felosztja a játékteret síkidomokra, a felhasználónak pedig ki kell színeznie azt. (Egy egyszerűbb változat: nem síkidomokat, hanem gráfokat ad a program, amelynek szomszédos csúcsait kell színezni négy különböző színűre. Vigyázat: ez nem lehet akármilyen gráf.)

Ötletek:

  • Mért játékidő, pontozás.
  • Játékállás mentése, betöltése.
  • Dicsőséglista.
  • Véletlenszerű térképek/gráfok újragenerálása.

Gráf síkbarajzolása ***

Némely gráfok síkbarajzolhatóak, azaz úgy, hogy az éleik nem keresztezik egymást. Az ilyen gráfok csúcsai úgy is elhelyezhetőek, hogy az éleket egyenes vonalakkal (szakaszokkal) sem fogja semelyik él keresztezni a másikat.

A feladat egy játékot írni. A program véletlenszerű gráfokat rajzol ki, amelyeknek csúcsait a játékos kell úgy elhelyezze, hogy sehol ne legyenek egymást keresztező élek.

Ötletek:

  • Mért játékidő, pontozás.
  • Játékállás mentése, betöltése.
  • Dicsőséglista.
  • Véletlenszerű térképek/gráfok újragenerálása.
  • A program generál nem síkbarajzolható gráfot, és a játékos meg kell mondja, hogy nem az,
  • Vagy a program nem generál ilyet (de ekkor ellenőrizni kell a véletlenszerűen generált gráfokat).

Útvonaltervező **

Készíts útvonaltervező programot! A program legyen képes egy térkép szöveges reprezentációját fájlból beolvasni és az ebből felépített adatstruktúra 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:

  • tudja tárolni megállók neveit
  • tárolja járatok adatait, amiben a fenti megállónevek szerepelnek,
  • legyen képes útvonalakat megtalálni egy adott helytől egy másik helyig (két megállónévvel adott), átszállásokkal együtt
  • tárolja a járatok menetrendjeit is (melyik órában hány percenként)
  • ezek alapján számolja ki egy utazás minimum és maximum időtartamát is
  • minden adatot mentsen fájlba, hogy azokat később vissza lehessen tölteni és tovább szerkeszteni

Koordinátageometria **

Írj a Geogebra nevű programhoz hasonló programot! Legyen képes a program köröket, szakaszokat, egyeneseket tárolni a síkon, és egyszerűbb szerkesztési lépéseket elvégezni! Például metszéspontok meghatározása, adott pontban merőleges állítása stb.

A programnak tetszőlegesen sok alakzatot kell tudnia tárolnia, és egy rajz alakzatait (körök, szakaszok, egyenesek) fájlba menteni, onnan betölteni.

Javasolt megjelenítési módszert keresni: pl. SDL-es grafikával, vagy SVG fájlba írással.

Koordinátageometria++ ***

A feladat ugyanolyan, mint az előzőnél, de építs be grafikus megjelenítést, és tedd lehetővé a felhasználó számára, hogy egérrel adja meg az alakzatokat!

3. „Számítástechnika, algoritmusok” feladatok

Képfeldolgozás ***

Készíts programot, amelyik képes képfájlok betöltésére, és mentésére, továbbá azon egyszerű képfeldolgozási lépések végrehajtására!

  • A dinamikus memóriakezelést, képek betöltését és mentését neked kell megvalósítanod.
  • Hajts végre különböző műveleteket a képen, pl. sötétítés, világosítás, kontrasztnövelés, elmosás, élkeresés stb. (Ezeknek érdemes utánaolvasni, esetleg rákeresve a „konvolúciós mátrix” fogalomra. Sok ilyen művelet mögött meglepően egyszerű a matematika.)
  • Grafikus megjelenítés opcionális, a program működhet parancssori alkalmazásként is.

Több olyan képfájl formátum van, amely tömörítetlen adatot tartalmaz, és a feldolgozása a Prog1 tananyag alapján elvégezhető. Ilyen például a Netpbm is (http://netpbm.sourceforge.net/doc/ppm.html). Dolgozz ilyennel!

Archív fájl függvénykönyvtár **

Készíts függvénykönyvtárat, amellyel egy archív fájlba becsomagolt fájlok nyithatók meg C programból! A függvénykönyvtár használata hasonlítson minél jobban az stdio.h fájlkezelésére!

A fájlok becsomagolását egy parancssori segédprogrammal lehessen végezni:

pack archiv.dat file1.bmp file2.dat file3.doc

Ekkor keletkezzen egy archiv.dat nevű fájl. Abból programból a file2.dat megnyitása:

ARCHIV_FILE *fp;
char tomb[1024];

fp = archiv_fopen("archiv.dat", "file2.dat", "rb");
archiv_fread(tomb, 1, 1024, fp);

A fájlokat tömöríteni nem kell.

Morze **

Készíts parancssorból hívható C programot, amely morze szövegeket kezel. Morze ábécét találsz az Interneten. A program tudjon:

  • Szöveget morzésítani.
  • Morze szöveget visszakódolni.
  • A konverzió iránya parancssor kapcsolóval legyen megadható.

A morze ábécé nem lehet rögzített. A programnak ezt egy fájlból kell azt beolvasnia (hogy akár egy teljesen más ábécével is dolgozhasson), és alkalmas adatszerkezetett kell építenie belőle. A tömb és a lista sem alkalmasak, dekódoló fát kell építeni, különben a megoldás nem elfogadható.

Parancssor program ***

Írj parancssor (shell) programot! A program legyen képes arra, hogy

  • a begépelt nevű másik programokat elindítsa,
  • a szabványos bemenet, szabványos kimenet átirányítására,
  • csővezeték (pipe) létrehozására,
  • változók létrehozására, értékük behelyettesítésére,
  • parancsnév-rövidítések (aliasok) létrehozására.

Figyelem: ezt a feladatot kizárólag olyanoknak ajánljuk, akik Unix (Linux) rendszereket valamennyire ismerik, és ilyenen szeretnék megvalósítani a programot.

Huffman kódoló ***

Készíts parancssorból hívható C programot, amely a Huffman kódoló algoritmust felhasználva tömörít fájlokat. Részleteket lásd a http://en.wikipedia.org/wiki/Huffman_code címen. Tervezz megfelelő fájl formátumot a tömörítés kódtáblázatának tárolására. A program legyen képes:

  • fájlok tömörítése,
  • fájlok visszaállítása,
  • a tömörítés iránya parancssor kapcsolóval legyen megadható.

Lempel-Ziv tömörítő ***

Lempel és Ziv algoritmusa a következő ötlettel tömöríti a fájlokat. Tegyük fel, hogy adott egy fájl a következő tartalommal:

Blah blah blah

Ebben a színnel jelölt részek egyformák, ezért a második előfordulást egy hivatkozással lehet helyettesíteni:

Blah b[D=5,L=5]lah

Ez azt jelenti, hogy D=5 bájtnyival ezelőtt volt egy L=5 hosszúságú sorozat, amit az adott helyen meg kell ismételni. (Most hosszabbnak tűnik, de binárisan tárolva ezt, rövidebb lesz.)

Írj programot, amely ilyen módszerrel képes tömöríteni és kicsomagolni fájlokat! Teszteld a programodat szövegfájlokon és képeken is (pl. BMP. A .png és .jpg fájlok már tömörítve vannak, azokat hiába próbálod tovább préselni.) Az algoritmusról sok írást találsz a neten.

Hash tábla **

Járj utána, hogy működik egy hash tábla, és mik azok a hash függvények!

Valósíts meg a programodban egy hash táblát! Ebben tárolódjanak valamilyen általad választott adatok, amelyeket lehessen egy sztring alapján eltárolni, visszakeresni és törölni! Alkalmazz láncolást (vödrös hash) az ütközések kezelésére! Legyen lehetőség az adatszerkezet fájlba mentésére és visszatöltésére!

4. Nyilvántartás jellegű programok

Ezeknél a programoknál mindig van valami, ami egyedivé teszi azt a többi feladathoz képest. Az egyedivé tevő funkcionalitás (pl. telefonkönyv esetén vCard export/import, étterem esetén alaprajz stb.) nem hagyható el a programból.

Telefonkönyv *

Készíts menüvezérelt C programot, amely „rekordokban” tárolja bizonyos személyek nevét, foglalkozását, címét, esetleg más jellemző adatait. A program legyen alkalmas:

  • új rekordok létrehozására, a régiek módosítására, törlésére,
  • név, telefonszám, egyéb mezők szerinti keresésre,
  • név esetén egy darab *-ot tartalmazó helyettesítés (wildcard) kezelésére (pl. a "Nagy*", "N*án", "*István" keresősztringek mindegyike megtalálja Nagy Istvánt a telefonkönyvben),
  • az adatbázis fájlba mentésére,
  • egy bejegyzés vCard formátumba történő exportálásra, vCard fájl beolvasásra (azokat a mezőtípusokat, amiket a programod ismer).

Teszteld a vCard fájl írását, beolvasását a telefonodról mentett, továbbá a programodból generált, a telefonodra elküldött fájllal!

Határidőnapló *

Készíts határidőnapló programot, amely „rekordokban” tárolja az események dátumát, pontos idejét, helyét, elnevezését, és egy hozzá kapcsolódó megjegyezést. A program legyen képes:

  • új rekodok létrehozására,
  • a régiek módosítására,
  • a régiek törlésére,
  • egy adott naphoz, héthez és hónaphoz tartozó események naptárszerű (időrendes) kilistázására,
  • esemény név szerinti keresésére,
  • az adatbázis fájlba mentésére, visszatöltésére.

Étterem *

Készíts programot, amely egy étteremben az egyes asztalokhoz tartozó megrendeléseket jegyzi meg. Legyen lehetőség:

  • Az asztalok megadására: hány fős, hol helyezkedik el az éttermen belül.
  • Az étterem menüjének rögzítésére.
  • Új asztal nyitására vendégek érkezése esetén.
  • Rendelések felvételére a menü alapján.
  • Számla „nyomtatására” (képernyőre).
  • Foglaltsági térkép megjelenítésére, figyelembe véve az asztalok elhelyezkedését (grafikus vagy egyszerű konzolos felületen).

Az adatokat mentse a program fájlba is, hiszen azokat nem felejtheti el egy újraindítás miatt!

Oktatók hallgatói véleményezése *

Készíts programot, amely OHV kérdőíveket és azokra adott válaszokat tárol! A kérdőívek tetszőlegesen sok kérdést tartalmazhatnak, amelyekre tetszőlegesen sok válasz lehet. Ezen felül tartalmaznak egy szöveges mezőt, ahova a kitöltő bármit írhat.

Készítsen a program statisztikát a kitöltött kérdőívek alapján! Legyen képes a kérdőívek és az eredmények fájlba mentésére, illetve visszatöltésére!

Prog1 nyilvántartás *

Készíts programot, amely képes hallgatók adatait nyilvántartani, és Prog1 eredményeiket számolni! A megjegyzendő adatok a következők:

  • A hallgatók neve, neptun kódja, előadás- és gyakcsoportja.
  • Az oktatóik neve, csoportjaik.
  • Hiányzások, kis ZH eredmények, NZH pontok stb.

„Tanítsd meg” a programnak a tárgykövetelményeket! Legyen képes a program listát készíteni azokról, akiknek PZH-t kell írniuk vagy nagy házi pótlást kell leadniuk! Legyen képes rangsorokat készíteni (pontszámok alapján), és ehhez hasonló listákat kiírni a képernyőre!

Feladatbank *

Készíts programot, amely egy oktató számára nyilván tudja tartani a ZH feladatok adatbázisát! Egy feladatról a következő adatokat kell tudnia a programnak:

  • a feladat szövege,
  • mintamegoldás és pontozási útmutató,
  • fő téma (pl. pointerek, fájlkezelés, ...)
  • megcélzott számonkérés (kis zh, nagy zh, ...)
  • utolsó kiadás dátuma.

Ezeket természetesen módosítani kell tudni, pl. az utolsó kiadás dátumát, ha egy feladat bekerül a ZH-ba, vagy a pontozási útmutatót, ha kiderül róla, hogy nem egyértelmű.

Legyen képes a program témák, számonkérések szerint keresni, és utolsó kiadás dátuma szerint rendezni is!

Könyvtár *

Készíts programot, amely képes egy könytár adatait eltárolni. A program legyen képes:

  • új könyvek létrehozására, a régiek módosítására, törlésére,
  • a könyvek szerző, cím, kiadási év, téma alapján való keresésére.

Legyen képes ezen felül:

  • Olvasók adatainak kezelésére,
  • a kölcsönzés adatainak kezelésére (melyik könyv épp kinél van),
  • megmondani egy adott könyvről, hogy az ki van-e kölcsönözve, és ha igen, kinél,
  • kilistázni egy adott olvasónál lévő könyveket.

Mentsd az összes adatot fájlba, hogy újraindítás esetén se vesszenek el az adatok!

Többnyelvű szótár **

Készíts többnyelvű szótár programot. A program adjon lehetőséget:

  • a szótárfájl kiválasztására,
  • új szótárfájl létrehozására,
  • a szótárfájl bővítésére és a bejegyzések javítására,
  • több, akár tetszőleges számú nyelv kezelésére.

(Figyelem: a kétnyelvű szótár az előadás példája. Annál itt összetettebb programot kell készíteni.)

Szociális háló *

Írj programot, amely emberek személyes adatait (név, nem, születési dátum stb.), továbbá ismeretségi viszonyait (kik ismerik egymást) képes nyilvántartani, és lehetővé teszi azt, hogy két ismerős üzenni tudjon egymásnak!

A programnak nem kell grafikusnak, se hálózatosnak lennie. Elég, ha egyszerre egy ember tudja használni: utána ő kijelentkezik, és valaki más bejelentkezik. Tegyen lehetővé ugyanakkor kereséseket (név szerint, iskola szerint, lakóhely szerint stb.), és ajánlja fel egy menüpontban a felhasználók számára az ismerősök ismerőseit! Tároljon el minden adatot fájlban (az üzeneteket is), és tegye lehetővé akárhány felhasználó és üzenet létezését!

Repülőjegyek *

Készíts menüvezérelt C programot, amellyel repülőjegyek foglalásait tudod nyilvántartani! Legyen lehetőség a programban a járatok adatait megadni. Ezen felül legyen lehetőség külön menüpontban elvégezni olyan műveleteket, amelyeket általában internetes repülőjegy-vásárlásnál is lehet:

  • Járatokat keresni.
  • Adott névre repülőjegyet foglalni.
  • Egy megkeresett foglaláshoz ülőhelyet rendelni.
  • Egy megkeresett foglaláshoz menüt (normál, vega, laktózmentes stb.) választani.

Legyen képes a program:

  • Kezelni az ülőhelyek számát, nehogy túlfoglalás legyen
  • Ne engedje két utasnak ugyanazt az ülőhelyet kiadni
  • Az ülőhelyekről foglaltsági térképet megjeleníteni (választás szerint konzolos vagy grafikus felületen)
  • Összesíteni, hogy melyik járatra, melyik menüből hány adagot kell felvinni.

Autószerviz *

A feladat egy olyan programot készíteni, amellyel egy autószerviz tarthatja nyilván az ügyfelei adatait, és az autóikon elvégzett javításokat. A program legyen képes:

  • Megjegyezni az ügyfelek (név, elérhetőség) és az autók adatait (rendszám, típus, vizsga érvényessége stb.)
  • Az autókhoz pedig tételesen feljegyezni az elvégzett javításokat.
  • Mindezeket fájlban tárolni.

A programban lehessen:

  • Új autó adatait rögzíteni (új autót vett), meglévő autót törölni (eladta)
  • Ügyfél és rendszám szerint keresni.
  • Elvégzett javítást (pl. olajcsere, vizsga stb.) dátum szerint feljegyezni, a javítás árát rögzíteni.
  • Szerviztörténetet megjeleníteni.
  • Listázni az autókat, amelyeknek hamarosan lejár a vizsgájuk.

Receptes könyv *

A programodnak egy receptgyűjteményt kell tárolnia:

  • Ehhez ismernie kell a felhasználható összetevőket (pl. liszt, paradicsom, ...)
  • Meg kell jegyezni az elkészíthető ételeket, amelyekhez tartozóan meg kell jegyeznie az étel nevét, a hozzávalókat (mennyiségekkel), és az elkészítés módját.
  • Lehessen új receptet rögzíteni, közben a hozzávalókat az összetevők listájából kiválasztva, vagy újat rögzítve.
  • És persze legyen lehetőség régi, megunt receptet törölni.

Lehessen a programban többféleképpen keresni a receptek között:

  • Az étel nevét megadva.
  • „Nincs ötletem” funkció: véletlenszerűen sorsol a program ételeket, és ha a felhasználó elfogadja valamelyiket, akkor megjeleníti annak a receptjét.
  • „De ennék egy kis...” funkció: a felhasználó megad egy összetevőt, és a program azokat az ételeket listázza, amelyek azt tartalmazzák. Ezután kiválasztható valamelyik, és a program megjeleníti a részleteket.
  • „El kell használni” funkció: a felhasználó megad egy vagy több összetevőt, és a program olyan recepteket listáz, amelyekben az összes megadott összetevő szerepel.

Állatorvos *

Egy állatorvosi rendelő működését segítő programot kell írnod. Ennek meg kell jegyeznie:

  • A tulajdonosok adatait, elérhetőségét.
  • Az állatok adatait (név, milyen állat, mikor kapott utoljára veszettség elleni oltást stb.) Egy tulajdonosnak több állata is lehet.
  • Az állatokon elvégzett vizsgálatok, kezelések adatait, azok dátumait.
  • Értelemszerűen ezeknek módosíthatóknak kell lenniük, pl. új vizsgálat adatainak rögzítése, vagy tulajdonos és hozzá tartozó állatok törlésére (ha elköltözött).

Legyen lehetőség többféleképpen keresni az adatok között:

  • Tulajdonost megkeresni, elérhetőségi adatait megtudni.
  • Adott tulajdonos állatait listázni.
  • Állatot név szerint keresni (vigyázat: több ugyanolyan nevű lehet, több tulajdonostól!
  • Tulajdonos szerint válogatva listázni azokat az állatokat, amelyek egy évnél régebben kaptak veszettség elleni oltást. Így értesíteni lehet majd őket.

A megtalált adatokat lehessen módosítani a keresés után!