Programozás II. Gyakorlatok
2015
C# 4. Gyakorlat – Öröklés
1. feladat Vészesen közeleg az állatverseny időpontja, és a megrendelő most jött rá, hogy módosítani kellene a programunkat (a megrendelők már csak ilyenek ) Hiába dugjuk az orra alá az eredeti kérését, mégpedig ezt: „Az állatmenhely alapítvány március közepén kisállat-versenyt rendez. Mindegyik állat regisztrálásakor meg kell adni az állat nevét és a születési évét. Ezek a verseny során nyilván nem változhatnak. Mindegyikőjüket pontozzák, pontot kapnak a szépségükre és a viselkedésükre is. A pontszám meghatározásakor figyelembe veszik a korukat is (csak év): egy egységesen érvényes maximális kor fölött 0 pontot kapnak, alatta pedig az életkor arányában veszik figyelembe a szépségre és a viselkedésre adott pontokat. Minél fiatalabb, annál inkább a szépsége számít, és minél idősebb, annál inkább a viselkedése. (Ha pl. 10 év a maximális kor, akkor egy 2 éves állat pontszáma: (10-2)*a szépségére adott pontok + 2* a viselkedésére kapott pontok.)” ő közli, hogy bocsánat, tévedett, és kéri a módosítást. Kiderült ugyanis, hogy a versenyen kutyák és macskák vesznek részt, nem teljesen egyforma feltételekkel. A regisztrációra és a pontozásra való előírás nagyjából marad, de ezeket a módosításokat kéri: Kutyák esetén a gazdához való viszonyt is pontozzák. Ez hozzáadódik a szépségért és viselkedésért kapott pontokhoz, de ezt a viszony-pontot még a verseny előtt adja a zsűri, és csak akkor vehet részt a kutya a versenyen, ha már túlesett ezen az előfeltételen. Ha nincs viszony-pontja, akkor a végső pontszáma nulla lesz. Mivel kutyák és macskák együtt szerepelnek, ezért csak olyan macskák versenyezhetnek, akiknek van macskaszállító dobozuk. A doboz létét már a regisztráció során be kell jelenteni, de a verseny pillanatáig módosítható. Ha a verseny pillanatában nincs ilyen doboz, akkor az ő végső pontszáma is nulla lesz. Bár a megrendelő csak ennyit mondott, de azért figyelmeztessük rá, hogy így nem lehet egyértelműen azonosítani az állatokat, hiszen miért ne lehetne köztük két azonos nevű. Most állapodjunk meg abban, hogy mindegyikőjük kap egy rajtszámot, mégpedig a regisztrálás sorrendjének megfelelő értéket. Minden állat ToString() metódusa így nézzen ki: rajtszám. kutya/macska neve, pontszáma. 1. Először próbáljuk ki az elkészült osztályokat két konkrét példányra. 2. Utána kapcsolja össze a feladatot az előző órán tanultakkal, azaz regisztráljon valahány állatot (vegyesen kutyákat és macskákat), majd versenyeztesse őket (legegyszerűbb, ha véletlen pontokat ad). A regisztráció után is és a verseny után is írassa ki az adataikat. Az adatokat az allatok.txt fájlból olvassa. (A megoldás több részletét kedd estétől az AllatVerseny2.pdf fájlban olvashatja.)
1
Programozás II. Gyakorlatok
2015
2. feladat Járműpark továbbfejlesztése. A szomszéd vállalkozó is szeretne egy járműparkot adminisztráló programot, de az ő vállalkozása kicsit összetettebb: teherautókat és buszokat ad bérbe, ráadásul elég nagy telephelye van, vagyis elvileg bármikor bővítheti a rendelkezésre álló járműparkot. Mindkét járműfajtának van rendszáma, regisztrációkor mindegyiknél meg kell adni a gyártási évet és a fogyasztást, de a buszoknál a férőhelyek számát is, teherautók esetén pedig a maximálisan szállítható mennyiséget (tonna). Ugyanúgy lehet kiszámolni a buszok és teherautók futott kilométerszámát és egy-egy út költségét, mint ahogy ezt a járművek esetén tárgyaltuk, de ezeket a járműveket bérbe is lehet adni. Minden jármű esetén van egy egységes alap bérleti díj, amelyre buszok esetén is és teherautók esetén is rájön még egy-egy pótdíj: buszoknál a férőhelyek számának és egy, az összes buszra egyformán érvényes szorzónak a szorzata, teherautóknál pedig a maximális teherbírás és egy, a teherautókra egyformán érvényes, de a buszokétól esetleg eltérő szorzónak a szorzata. Ezen kívül minden egyes jármű esetén ki kell fizetni az aktuális út költségének x %-kal növelt értékét. Ez a százalékérték minden jármű esetén egyforma. (Ez a haszonkulcs, vagyis ha pl. 1000 Ft a költség és x=10%os haszonkulccsal dolgozik a cég, akkor a díjnak ez a része 1100 Ft.) Tesztelje az elkészült osztályokat! (A megoldás menetét kedd estétől a Jarmupark3.pdf fájlban olvashatja.)
3. feladat Különböző henger alakú testek nyilvántartását végző programot szeretnénk írni. Vannak olyan hengerek, amelyek csupán mértani testek. Ezeknek van sugaruk és magasságuk. Vannak rudak, melyeknek tömegük is van (tömör hengerek). Az ilyen alakzatoknak van sűrűségük is. Végül vannak csövek, azaz lyukas rudak Készítsük el a megadott alakzatok osztályait, figyelembe véve az alakzatok közötti hierarchikus kapcsolatot (öröklődést). Minden alakzat legyen képes visszaadni alapadatait, térfogatát és esetleges tömegét. Készítsünk indító osztályt, amelyben létrehozunk egy hengert, egy rudat és két csövet, és a program kiírja az objektumok megfelelő adatait. (A megoldás lépéseit csütörtök estétől a Henger.pdf fájlban olvashatja.)
4. feladat Vannak téglalap alapú hasábok, hengerek és kockák, próbáljuk meg kiszámítani minél kevesebb ismétlődéssel és az öröklődés felhasználásával a térfogatukat, felületüket. Tesztelje a megoldást néhány adattal. Segítség: gondolja végig, mi az, amire minden térfogatszámításnak szüksége van, ez legyen az ősosztályban (ez akár absztrakt osztály is lehet), és gondolja végig azt is, hogy melyik osztály melyikből öröklődhet.
2
Programozás II. Gyakorlatok
2015
5. feladat Egy könyvet jellemez a címe, szerzője, oldalszáma, beszerzési ára, adója és eladási ára. Az adó értékét az egységes ÁFA-kulcs határozza meg, az eladási ár a beszerzési ár áfával növelt értéke. A könyv „borítójára” (ToString()) a szerzőt, címet, oldalszámot és eladási árat kell feltüntetni. Az idegen nyelvű könyvet szintén jellemzik ezek az adatok, valamint egy, a könyv nehézségére utaló jelző. Ezt a könyvpéldány létrehozásakor egy egész számmal jelezzük, de a könyv „borítójára” a megfelelő szó kerül majd, és az is, hogy a könyv olvasása hány idegen szó ismeretét igényli (mekkora szókincs kell hozzá). Alapértelmezett adatok lehetnek például ezek: 1-es szint: 400 szó, alapfok; 2-es szint: 1000 szó, középfok, 3-as szint: 1500 szó felsőfok. Hogy serkentsék a nyelvtanulást, a könyv árából elengedik a szókincs ezrelékének megfelelő összeget, de egy minimális árnál olcsóbban semmit sem adnak. a/ Tesztelje az elkészült osztályokat néhány példány létrehozásával és kiíratásával. Próbálja megoldani azt is, hogy módosítani lehessen az idegen nyelvű könyvek nehézségére vonatkozó szó-számot, feliratot. Ha elég ügyes, avval is próbálkozhat, hogy a szintek száma is lehessen eltérő. b/ Olvasson be néhány adatot, ezekből hozzon létre könyv példányokat és számolja ki, hogy mekkora a bevétel, ha eladják az összes könyvet. Azt, hogy az épp aktuális könyv magyar vagy idegen nyelvű, egy véletlen szám alapján döntse el, és persze, ennek megfelelően kérje vagy ne kérje be a könyv szintjét. c/ A mellékelt konyvek.txt adatfájlból (vagy egy Ön által készített hasonló adatfájlból) olvassa be az adatokat, és hozza létre a könyvek listáját, majd számolja ki, mekkora az össz-bevétel, ha eladjuk őket. Melyik(ek) a legdrágább és melyik(ek) a legolcsóbb könyv(ek)?
6. feladat A mai gyerekek már elektronikus meséken nőnek fel (szegények ). Sőt, a mesékhez nem egyszer készül játék szoftver is. Akár az Ön feladata is lehet valamikor később, hogy egy, mondjuk a Csipkerózsika mesét feldolgozó játékszoftvert író csapat munkatársa legyen. Talán emlékszik rá, hogy a mesében vannak tündérek és boszorkány(ok) is. Hogy érdekesebb legyen a játék, ezek a karakterek rendelkezhetnek valamilyen, a játékhoz szükséges tulajdonságokkal. Például lehet varázserejük, ami változhat a játék során. Amikor találkoznak egy emberrel, akkor ennek az erőnek megfelelően valamilyen hatást gyakorolhatnak rájuk – a tündérek nyilván jó hatást, a boszorkányok rosszat, stb. Egy ilyen játék persze akkor érdekes, ha a felhasználó grafikus felületen, interaktív módon beleavatkozhat a játék menetébe, de még nem rendelkezik az ehhez szükséges ismeretekkel. A karakterek alaptulajdonságait viszont már meg tudja fogalmazni, és egy egyszerűbb kis tesztprogrammal ellenőrizni is tudja a működésüket. Ez lesz most a feladata. Vannak tehát tündérek és boszorkányok. Mindegyiknek van neve, és mindegyik rendelkezik valamekkora mágikus erővel (egy int érték). Mindegyikük tud áldani vagy átkozni. A „varázslás” (azaz áldás vagy átok) során mindegyikük kifejt valamekkora hatást. Ez a hatás egy egész szám, amelyet az illető hölgy ereje alapján számítunk, mégpedig úgy, hogy tündérek esetén ezt az erőt megszorozzuk egy, a tündérekre egyaránt érvényes szorzóval, boszorkányok esetén pedig egy, a boszorkányokra egyaránt érvényes szorzóval. Boszorkányok esetén ez a hatás még egy -1-es szorzóval is kiegészül. Mivel a jócselekedetek növelik az ember erejét, a rosszak pedig – legalábbis a mesében – csökkentik, ezért a tündérek ereje minden egyes varázsláskor 1-gyel növekszik, a boszorkányoké 1-gyel csökken, de csak addig, amíg nulla nem lesz. 3
Programozás II. Gyakorlatok
2015
Mindenki tudja visszaadni (ToString()) azt, hogy tündér vagy boszorkány, továbbá a nevét és az erejének értékét. Ha a boszorkány ereje nullára csökken, akkor még az is kerüljön az adatok mellé, hogy „ megjavult”. a/ Tesztelje néhány adattal az elkészült osztályokat. b/ Írja meg a mese keresztelő részét, vagyis: olvassa be a meghívottak nevét addig, amíg van újabb meghívott (egy kérdésre adott válasz dönti el, hogy van-e még). Az illető hölgy induló ereje legyen egy véletlen érték. Az pedig, hogy tündér-e vagy boszorkány, szintén a véletlenen múlik. Vegye figyelembe azt is, hogy a hölgyeknek kb. x %-a boszorkány. A meghívás után írassa ki a jelenlévő hölgyeket, majd egyenként mindenki „varázsoljon”, és számoljuk ki ezek összhatását. c/ A mellékelt boszi.txt adatfájlból (vagy egy Ön által készített hasonló adatfájlból) olvassa be az adatokat, és hozza létre a hölgyek listáját, majd számolja ki, az átlagos varázserőt, valamint a legnagyobb varázserejű tündér és a leggonoszabb boszorkány nevét.
7. feladat Egy projekt elvégzésére dolgozókat és gyakornokokat vesznek fel. A gyakornok csak annyiban különbözik egy „teljes értékű” dolgozótól, hogy fizetése a teljes munkaidős dolgozó fizetésének 65%-a. Felvételkor meg kell adni a dolgozó nevét és azt, hogy milyen munkakörbe vették fel. A projekt ideje alatt ezek egyike sem változhat. A dolgozók a ledolgozott óraszámuk alapján kapják a fizetésüket, az óradíj minden egyes dolgozó esetén azonos. A dolgozó időnként dolgozik valahány órát, ekkor ledolgozott óraszáma a metódus paraméterében lévő óraszámmal növekszik. Írjon programot, amelyben felveszi a jelentkezőket (beolvassa az adataikat egy adatfájlból), dolgoztatja őket (kérdezze meg, hogy ki hány órát dolgozott), majd kiíratja a fizetésüket. Számítsa ki az összes kifizetett bér értékét is.
8. feladat Készítsünk alkalmazást egy vállalatnál dolgozó emberek fizetésének kiszámítására. A dolgozók között vannak Vezetők, akik havi fix bérért dolgoznak. Vannak ÓraBéres munkások, akiknek a bére attól függ, hogy hány órát dolgoztak. A túlóráért az órabér 150%-át kapják. A ledolgozott órák számát és a túlórák számát is megadhatja egy set beállítással. Az óradíj egységes. A DarabBéres munkások bére attól függ, hogy hány darab terméket állítottak elő. A darabbér minden darabra azonos. A dolgozók negyedik csoportja a Kereskedő, akik fix alapbért kapnak, és jutalék is jár nekik, amely attól függ, hány terméket értékesítettek. A jutalék minden termékre azonos. Minden dolgozót jellemez: Azonosító, Név, Belépés dátuma, munkabére. A ToString() adja vissza az azonosítót, nevet és belépési dátumot. A munkabér nem ennyire nyilvános, azt alapból ne adja vissza, csak akkor, ha direkt kérjük. Hozzon létre egy absztrakt Dolgozo osztályt, amely definiálja a MunkaBer() metódust. Hozza létre a leszármazott osztályokat, és az osztálynak megfelelő módon számítsa ki a dolgozók bérét. Írjon egy alkalmazást, ahol teszteli a megoldását! (Elég, ha csak néhány példányt hoz létre.)! 4
Programozás II. Gyakorlatok
2015
Emlékeztető: Öröklődés: Class UtodOsztaly : OsOsztaly { … }
Az öröklődés során egy meglévő osztályból kiindulva, új osztályt hozunk létre (származtatunk). Az ősosztálytól örököljük annak public és protected mezőit és metódusait. Ezen mezőkre a saját metódusainkban hivatkozhatunk, az örökölt metódusokat meghívhatjuk. Hasonlóan örököljük a private mezőket és metódusokat is, de azok védelmi szintje, hatásköre miatt ezekre nem hivatkozhatunk közvetlenül. Valójában a származtatott osztály az ősosztály minden tagját, metódusát örökli, kivéve a példánykonstruktorokat, a statikus konstruktorokat és a destruktorokat. Az ősosztály metódusának újradefiniálása a leszármazott osztályban az override kulcsszóval történik. A lecserélhetőséget az ősben a virtual kulcsszóval jelezzük. Az absztrakt (abstract) osztályt nem lehet példányosítani. Az absztrakt osztály tartalmazhat normál metódusokat. Az absztrakt metódusok csak deklarálva vannak az absztrakt osztályban, az utódosztályban kell megvalósítanunk őket. A megvalósító metódusokat az override kulcsszóval kell ellátnunk. Az absztrakt metódusok implicite virtuálisak is.
5