C++ házi feladatok 2010/2011 II. félév A feladat bemutatásakor elektronikus formában be kell adnia: - a feladat címét - az Ön által kibővített specifikációt, - a megoldási vázlatot, az osztályok leírását (bármilyen leíró módszerrel), - programozási leírást az elkészített objektum(ok) felhasználásához, - tesztelési dokumentációt - a (szabványos C++) program forráskódját Definiálja a feladathoz köthető adatokat és függvényeket! Lehetőleg valósítsa meg a feladathoz értelmesen köthető műveleteket operátor túlterheléssel (is)! A megoldásban használjon öröklést! Az adatokat tudni kell elmenteni és visszaolvasni. Demonstrálja a működést!
1. Kombinációs hálózat Készítsen kombinációs hálózatot, mely egy adott igazságtábla alapján AND, OR és NOT kapukból épül fel. Hálózatok összekötésére is legyen lehetőség, vagyis egy hálózat kimenete köthető legyen egy másik hálózat egyik bemenetére. Az adatokat fájlba is el kell tudni menteni visszaolvashatóan. A hálózatot valamilyen egyszerű módon a képernyőn is meg kell jeleníteni.
2. Négyszögek Készítsen osztályt a síkon elhelyezkedő négyszögek tárolására és manipulálására. A megkülönböztetett fajták: négyzet, téglalap, paralelogramma, rombusz és trapéz. A típusba sorolhatóság ellenőrzése a felvételkor meg kell történjen. A kapcsolódó metódusok: tengelyes és középpontos tükrözés, centrális nagyítás, forgatás, a csúcsok koordinátáinak kiíratása. A síkon lévő összes idomot el kell tudni tárolni illetve vissza kell tudni olvasni és ki kell tudni íratni az origótól mért távolságuk sorrendjében is.
3. Útvonaltárolás Írjunk olyan programot, amely bemenetként egy tetszőleges útvonalat olvas be, és tárol el. Az útvonalaknak a távolságát bemenetként kell beolvasni. Az útvonalak útszakaszai lehetnek - Szárazföldi (autó, 60km/h átlagsebesség) - Légi (repülő, 865km/h átlagsebesség) - Vízi (hajó, 55 km/h átlagsebesség) A program feladata sorrendben kiírni az útvonal szakaszait (kezdő és végpontjukkal) és a hatásos utazási időt (a várakozásokat nem számolva)! A program támogassa az egyes útvonalak elmentését.
4. Építkezés költségvetése Az épít ipari munkákra kapott árak alapján kell a költségeket összesíteni. Az építő cégek az egységárakon egy-egy szint befejezése után változtathat, a betonozás ára a térfogattal arányos, a falazás a felülettel, a villanyvezeték helyének vésése pedig a hosszal arányos. A ház szintjein eltérő mennyiségű munka végzendő az egyes fajtákból. A munkák sorozatát lehessen menteni fájlba is, illetve az egyes részmunkák adatait lehessen listázni elvégzésük sorrendjében. _
5. Nyílászáró kereskedés Egy nyílászáró-kereskedés rendelési listát állít össze. Bejárati ajtókat, erkélyajtókat valamint ablakokat forgalmaznak és szeretnék kiszámítani, hogy mekkora teherautóra van szükség a szállításhoz. Az össztérfogat számításánál az ajtót 1:2 arányúnak, az erkélyajtót 2:3 arányúnak az ablakot pedig négyzetesnek veszik, mert a rendelésen csak a rövidebb oldal hossza és a vastagság szerepel. Feladat a rendelési listát karbantartani és menteni, illetve el kell végezni a térfogatszámítást is. A lista elemeit térfogatuk alapján sorrendezve is kell tudni írni.
6. Autókiállítás Az autókiállításon az egyes cégek autókat, motorokat és teherautókat mutatnak be. A cél ezekről olyan katalógust nyilvántartani, amelyből az árakon kívül a legérdekesebb adatok lekérdezhetők: - autó: gyorsulás 100-ra, - motor: végsebesség - teherautó: teljesítmény. A bevitt adatokat el kell tudni menteni és az árak sorrendjében, illetve csoportosítva, az adott jellemző szerinti sorrendben is ki kell tudni írni. _
7. Fafeldolgozás Az asztalosüzemben polcokat, asztalokat és székeket gyártanak, azonos, négyzetméterre adott árú alapanyagból. Az elkészült darabokat egy nyilvántartásba veszik fel, jelezve a legnagyobb felület méretét és az eladási árat. A nyilvántartás alapján a napi nyereséget kell kiszámítani a fa ára alapján, figyelembe véve, hogy a polcnál a 6-os, az asztalnál 1.5-ös, a széknél pedig 2-es szorzóval számolnak a legnagyobb felülethez képest. Az adatokat fájlba is kell tudni menteni, illetve az egyes elemeket az elkészülés sorrendjében listázni.
8. Antikvárium Egy antikvárium napi egyenlegét kell kiszámítani a vételi és eladási listák alapján. A vételi illetve eladási árak: - folyóiratoknál: laponként 1 Ft, - könyveknél: kilónként 10 forint, - képeknél: négyzetcentiméterenként 1 Ft A nyilvántartást tudni kell bővíteni és menteni, valamint az eladások illetve vásárlások sorrendjében kiíratni.
9. Számítógép-alkatrész raktár Egy raktárban monitorokat, alaplapokat és merevlemezeket tárolnak. A biztosító ezek értékét az alábbi módszerrel becsli: - monitor: 4000 Ft/coll - alaplap: 10000 Ft/MHz - merevlemez: 200 Ft/GByte A kockázati besoroláshoz a következő adatokat kell tudni lekérdezni a fájlba is menthető nyilvántartásból: legdrágább tárolt alkatrész, egy adott árnál drágább alkatrészek listája ár szerint sorrendezve, összérték illetve átlagár.
10. Szőnyegáruház Egy áruházban háromféle szőnyeget árulnak: - a nagyméretű szőnyegek ára a felületüktől függ, - a futószőnyegek ára a hossztól, - a kisebb szőnyegeket pedig darabra adják. Készítsen programot, amely nyilvántartja, menti és ár, illetve idő szerinti sorrendben listázza a napi eladási adatokat. Az árakról (szöveges) hisztogramm jellegű kimutatást és egyszerű statisztikákat készít (minimum, maximum, átlag).
11. Üdítő-automata Egy üdítő-automatából többféle ízben szénsavas, szénsavmentes és light italokat lehet venni. A három kategória a lejárati időtartamban különbözik. Az automatában a kifogyott italfajtákat töltik csak fel, a feltöltési időpontokat pedig egy programmal tartjuk nyilván. Az elémenthető lista alapján ki kell tudnunk keresni a legkorábban és legkésőbb lejáró terméket és lejárati időpontját, valamint az egy adott időpont előtt lejáró italok listáját a lejárat sorrendjében.
12. Energiafogyasztás Egy lakás energiafogyasztását akarjuk nyomon követni, ezért a számlákon szereplő adatokat eltároljuk: dátum, ellenérték, illetve a fogyasztott mennyiség, ami a gáz esetében megajoule-ban, az áram esetében pedig kilowattórában adott. A program ki kell, hogy írja az egy adott időszakban elhasznált összes energiát (pl. megajoule-ban) és ennek összköltségét. A listát lehessen menteni és visszaolvasni, valamint az egyes számlákat dátum szerinti sorrendben listázni.
13. Festékbolt Egy festékbolt raktárosának jegyeznie kell az alábbi, eltérő mértékegységben mért és eltérő egységárú termékek forgalmát: parkettalakk (liter), gipszkarton (négyzetméter) és ecset (darab). A raktárost támogató programnak tudnia kell kezelni a beérkezett és eladott tételeket. Ezeket fájlba is kell tudni menteni és listázni az érkezés illetve eladás sorrendjében. A programnak meg kell tudni mondani, hogy az egyes termékekből mennyi van raktáron illetve mennyi az összbevétel egy adott időszakra.
14. Publikációk Egy kutató a saját tudományos közleményeit szeretné nyilvántartani. A bevitt adatokat fájlban is szeretné tárolni és az alábbi lekérdezések érdeklik: az összes publikáció időrendi listája, az egyes típusok listája külön-külön, az egyes típusok darabszámai. A közleményeknek címük, szerzőik és dátumuk van és egyelőre az alábbi típusokat szeretnénk támogatni: könyv (ennek ISBN száma is van), folyóirat (évfolyama és száma is van), konferencia cikk (helyszíne is van).
15. Modellügynökség Egy ügynökség a foglalkoztatott modellek adatait szeretné rendszerezni. Három típusú jelentkezővel foglalkoznak (akikhez az adott extra attribútum tartozik): gyermek (magasság), férfi (bicepszméret), nő (mellbőség). A modellek tarifája különböző, típusuktól függ. Fájlba is menthető megoldással számon kell tartani, hogy egy-egy modell eddig hány órát dolgozott az ügynökségnek és ez alapján összesíteni az eddigi kiadásokat. A programnak a ráköltött összeg alapján sorrendezve is ki kell tudni írni a modellek adatait.
16. DVD kölcsönző Egy DVD kölcsönző rendszerezni szeretné a filmeket, amelyeket három kategóriába sorolnak: gyerekfilm (epizódok hossza), nagyjátékfilm (Oscar díjak száma), egyéb film. A zárójelben a típusra jellemző speciális adat szerepel. A kategóriák kölcsönzési árai eltérnek. A programnak nyilván kell tartania, hogy melyik filmek vannak kikölcsönözve és mennyi bevétellel számolhatunk, ha ezeket most rögtön visszahoznák. A listázás a kikölcsönzés időpontja szerinti sorrendben történjen. További funkció az összes film kategória szerint csoportosított listázása.
17. Írószerbolt Az írószerbolt megrendeléseit kellene programmal megtámogatni. Egy napi megrendelő-listában olyan elemek szerepelnek, melyek egy írószert és az abból rendelendő darabszámot tartalmazzák. Minden egyes termékre jellemző még a színe, márkája és mindnek eltérő egységára lehet. A bolt háromféle termékkel foglalkozik: ceruza, töltőtoll, golyóstoll, amikre rendre az alábbi adatok is jellemzők: grafitkeménység, nyomvastagság, illetve hossz. A programnak kezelnie kell egy megrendelési listát (új elem felvétele, mentés, stb.) és ki kell tudni listáznia azt a tételek ára szerinti sorrendben is.
Generikus konténerek A feladat egy generikus tárolóosztály létrehozása (+ egy egyszerű tesztelő program, amely bemutatja az osztályok képességeit). Minden tárolóosztály rendelkezik az alábbi tulajdonságokkal: • hozzá lehet adni egy elemet (Add) • le lehet kérdezni, hogy egy elem benne van-e a tárolóban (IsElement) • ki lehet üríteni a tárolót (Clear) • le lehet kérdezni a tárolt elemek számát (GetLength) • a tároló minden egyes elemén végre lehet hajtani egy magadott műveletet (ForEach) • a tároló elemeit egy tömbbe lehet másolni (ToArray) • a tárolót egy tömb elemeivel fel lehet tölteni (FromArray) A sor (Queue) konténerosztály további tulajdonságai: • az új elemet mindig a sor végéhez fűzi hozzá (Add) • le lehet kérdezni a sor elején álló elemet, anélkül hogy módosítanánk azt (Peek) • törölni lehet a sor elején álló elemet (Poll) A prioritási sor (Priority Queue) konténerosztály további tulajdonságai: • az új eleme a sorba az elem prioritása alapján teszi be, a sor elején a legmagasabb prioritású elem áll (Add) • le lehet kérdezni a legmagasabb prioritású elemet, anélkül hogy módosítanánk azt (Peek) • törölni lehet a legmagasabb prioritású elemet (Poll) A dinamikusan tömb (Vector) konténerosztály további tulajdonságai: • új elemet lehet a tömb végére lehet fűzni (Add) • új elemet lehet a megadott indexű helyre beszúrni (Add túlterhelve) • törölni lehet a megadott indexű elemet (Remove) • az [ ] operátorral le lehet kérdezni, illetve módosítani a megadott indexű elemet Mind a három konténerosztály kell, hogy rendelkezzen alapértelmezett és másoló konstruktorral, valamint az értékadó operátorfüggvényt felül kell definiálni.
Generikus mátrix osztály Az osztálysablon egy tetszőleges méretű mátrixot kezel, magassága és szélessége inicializáláskor megadható (a konstruktor a létrehozott mezőket lenullázza), de ezt követően is változtatható. A mátrixban tárolt elemek típusát a sablonparaméter határozza meg (a dokumentációban szerepeljen milyen tulajdonságokkal kell hogy rendelkezzen az elem amit tárolunk (pl: osztály esetén kell hogy legyen rendesen működő operator= tagfüggvénye)).
A mátrix rendelkezik a fontosabb operátorfüggvényekkel: másolás A=B=C összeadás A=B+C mátrix szorzása skalárral A = λ * C és B = C * λ mátrix szorzása mátrixszal A=B*C elemek lekérdezése, módosítása λ = A(3, 7) és A(6, 2) = λ elemenkénti összehasonlítás A == B és A != B Ahol A, B, C: mátrix λ: skalár Ha valamelyik művelet során hiba történik (pl: két különböző méretű mátrixot próbálunk összeadni) a tagfüggvények megfelelő típusú kivételt dobnak. Statikus tagfüggvények: egy NxN-es egységmátrixot létrehozó tagfüggvény (N a függvény paramétere) Az alábbi tagfüggvények közül legalább hárommal rendelkezik: • transzponált • hatványozás • determináns (kivételt dob, ha a mátrix nem négyzetes) • rang • inverz (kivételt dob, ha a determináns 0)
Tetszőleges hosszú egész szám (BigInteger) A feladat egy olyan osztályt írni, amely dinamikus memóriakezeléssel egy tetszőlegesen hosszú egész számot tárol. Rendelkezik az alábbi operátorfüggvényekkel: =, +, -, *, /, %, ==, !=, <, > és kiírás (<<) stream osztályokon keresztül. Megvalósítandók vele az alábbi konverziók: • string <-> BigInteger (hiba esetén kivételt dob) • int <-> BigInteger További ötletek az osztály tagfüggvényeire: • • •
Abs (abszolútérték) Sign (előjel) Pow (hatványozás)
Statikus tagfüggvények: • Random (tetszőleges hosszúságú ál-véletlen számot generál) • GreatestCommonFactor (két szám legnagyobb közös osztóját adja vissza) • RelativePrimes (logikai igaz értéket ad vissza ha a paraméterében megadott számok relatív prímek)
Rajzoló program A felhasználó különböző geometriai alakzatokat (kör, téglalap, egyenes szakasz, stb.) származtasson egy közös Alakzat osztályból. Az Alakzat osztály Rajz() tagfüggvényét valósítsa meg úgy, hogy az egyes alakzatokat egy heterogén kollekcióba téve, és ezeknek a Rajz() metódusát meghívva egy ismert képformátú fájl (pl: BMP) álljon elő. Az alakzatokhoz definiáljon további tranzformációs (eltolás, forgatás, nyújtás) függvényeket.
További saját ötletek és játékprogramok