2. feladatsor

Néhány további feladat:

A feladatok megoldásához ezeket vagy ezekhez hasonló adatfájlokat használjon:

2. feladatsor adatai

Ha sajátot ír, akkor figyeljen rá, hogy UTF-8 kódolással mentse, mert különben nem működik.


Csipkerózsika


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 gyakorol­hatnak 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 alap-tulajdonsá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 (pozitív) szorzóval, boszorkányok esetén pedig egy, a boszorkányokra egyaránt érvényes (negatív) szorzóval.

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.

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”.

Tesztelje néhány adattal az elkészült osztályokat.

Írja meg a mese „keresztelő” részét, vagyis: olvassa be a meghívottak névsorát a mellékelt csipkerozsika.txt fájlból. 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 beolvasás után írassa ki a jelenlévő hölgyeket, majd egyenként mindenki „varázsoljon”. Végül számolja ki az átlagos varázserőt, majd adja meg a legnagyobb varázserejű tündér(ek) és a leggonoszabb boszorkány(ok) nevét.


Néhány megoldási ötlet:

csipkerozsika.pdf


Egyetemisták


Néhány éve adták át ünnepélyes keretek között a pécsi székesegyház udvarában lévő középkori egyetem épületét. (http://www.kozepkoriegyetem.hu/) Ennek apropóján szimuláljunk egy gondolatkísérletet, és hasonlítsuk össze a mai és a középkori egyetemistákat.

  1. Szimulációról lévén szó, az egyetemistákat csak egy egyedi azonosító kóddal azonosítják. Minden egyetemistára jellemző az, hogy órán van(), tanul(), illetve kocsmázik(). A tanulás során a tanulási idő a metódus paraméterében lévő időértékkel (egész perc) növekszik. Mivel a középkorban inkább kupát használtak ivásra, ma meg korsót, illetve poharat, ezért ezek helyett a fogyasztott alkoholmennyiséget vesszük figyelembe (centiliter). A kocsmázás során mindegyikük fogyasztott alkoholmennyisége a metódus paraméterében lévő double értékkel növekszik. Minden egyetemistának meghatározható a tudás()a (egy egész érték), de nem teljesen egyforma módon számolhatunk a mai és a középkori egyetemisták esetén, azonban mindegyikben közös, hogy a tudás egy része a tanulási idő és egy, az összes egyetemistára jellemző állandó szorzata, amelyből le kell vonni az alkohol hatását, vagyis a fogyasztott alkohol mennyiségének és egy másik állandónak a szorzatát.

A középkorban élénk vita folyt az órákon. Vagyis ha egy középkori egyetemista órán van, akkor vitakészsége növekszik (esetünkben eggyel). Tudásának kiszámításakor az eddigi értékhez hozzáadódik még a vitázás során összeszedett tudás, vagyis a vitakészség és egy, az összes középkori egyetemistára jellemző állandó szorzata.

A mai egyetemisták vita helyett sajnos inkább a kütyüikkel vannak elfoglalva. Még órán sem tudnak megválni tőlük. Nehéz lenne egyenként számolni, hogy hányszor használják, de létezik egy jól kimutatható statisztikai állandó, ami mindegyikükre egyformán érvényes. Ha egy mai egyetemista órán van, akkor kütyühasználatának száma evvel az értékkel növekszik. Sajnos a kütyühasználat ugyanannyival növeli a tudást, mint amennyit elvesz belőle.

A toString() definiálásakor minden egyetemista esetén adja vissza az illető azonosítóját, azt, hogy mai vagy középkori egyetemista és tudásának értékét (mértékegység: „egység”), a maiaknál azt is, hogy hány alkalommal használt valamilyen kütyüt.

A fentiek figyelembevételével írja meg a szimulációt végző programot, azaz:

A statikus adatok beállítása után olvassa be az egyetemistak.txt fájl tartalmát. Az M betűvel kezdődő azonosító mai egyetemistát, a K betűvel kezdődő középkorit jelent. Beolvasás után írassa ki a szimulációban résztvevő emberek adatait, majd kezdődjön a szimuláció. Ez a következőt jelenti:

Véletlen sokszor futtassa le azt, hogy egy véletlenül kiválasztott egyetemista órán van, majd utána véletlentől függően vagy leül tanulni, vagy kocsmába megy. Ha tanul, akkor véletlen ideig tanuljon, ha kocsmázik, akkor véletlen mennyiségű alkoholt igyon (NE égesse be az adatokat).

A szimuláció után is írassa ki az adatokat, majd határozzon meg néhány statisztikai eredményt:

- Állapítsa meg, hogy a mai vagy a középkori egyetemistáknak nagyobb-e az átlagtudása (vagy esetleg egyforma).

- Kik azok, akiknek legnagyobb a tudásuk?

- Vannak-e olyanok, akik elitták az eszüket? Ha igen, hányan?

(Figyeljen rá, hogy az utolsó feladat miatt célszerű két külön is elérhető részre bontani a tudás kiszámítását. Sőt, mivel esetleg továbbfejlesztésként még a vitázásból eredő tudás is érdekelhet bennünket, azt is célszerű külön elérhetővé tenni.)

Néhány megoldási ötlet:

egyetemistak.pdf


Zenész-találkozó


A Művészetek Házában zenész-találkozót szerveznek. A résztvevők kétféle kategóriában regisztrálhatnak: vagy klasszikus zenészként vagy utcazenészként. Minden zenészt jellemez a találkozóig változtathatatlan neve, egy egyedi azonosító (klasszikus zenészeknél "K"-val, utcazenészeknél "U"-val kezdődjön), illetve az eddigi nyilvános szerepléseinek száma. A klasszikus zenésznek a regisztráció során azt is meg kell adnia, hogy melyik filharmonikus zenekar tagja (egyetlen String). Mivel a rendezvényig ki kell nyomtatni a résztvevőket azonosító kártyákat, ezért az utóbbi sem változhat. Ezeken a kártyákon (toString()) a zenész neve, azonosítója olvasható, klasszikus zenész esetén zenekarának neve is.

Mindegyikőjük képes szerepel()ni. A metódus során a nyilvános szereplések száma eggyel nő.

És bár elsősorban a zene öröme élteti őket, de azért nekik is fizetniük kell a megélhetésért, így ők is kapnak fizetés()t, de nem egyforma módon. A klasszikus zenészek fizetése egy országosan egységes alapbérből, plusz a fellépések számának X-szereséből tevődik össze, ahol X szintén minden egyes klasszikus zenészre ugyanúgy érvényes pénzösszeg. Ebből a bérből lejön a szintén egyforma K% adókulcsú adó.

Az utcazenészek fizetése bizonytalanabb, ők nem kapnak alapbért, fizetésük kizárólag a kalapozás()ból jön össze, viszont nem fizetnek adót. Ugyanakkor a diákok kivételével mindenkinek egy országosan egyforma mértékű helypénzt is kell fizetnie. Kalapozás során a kalap addigi tartalma növekszik a metódus paraméterében lévő értékkel. Fizetésük a kalap tartalma, amiből persze lejön az esetleges helypénz. (Így akár veszteséges is lehet.)

A vezérlő osztályban regisztrálhatnak a zenészek (zeneszek.txt fájl). A diákoknak igazolást kell kapniuk, ezért a beolvasáskor minden utcazenésztől "megkérdezik", hogy diák-e (a választ egy véletlen szám generátor segítségével adja meg).

Majd elkezdődik a zenésztalálkozó. A találkozó során minden zenész szerepel, sorban egyik a másik után. Ha utcazenész következik, akkor ő kalapozik is, mégpedig úgy, hogy minden egyes társa orra elé „odarakja” a kalapot. (Annyiszor hívjuk meg, ahány társ van.) A társak véletlenszerűen dobnak bele 0 és Z közötti összeget.

Az örömzene után megvitatják az anyagiakat is. Állapítsa meg, hogy kik járnak jobban, vagyis melyik a nagyobb, a klasszikus zenészek átlagfizetése vagy az utcazenészek aznapi átlagfizetése.

Ki(k) kalapozta(k) össze a legtöbb pénzt?

A korábbiakhoz képest nincs benne túl sok újdonság, de a közölt megoldásrészletben az egyedi azonosítót egy eddig még nem tárgyalt módon oldjuk meg, amelyhez érdemes előbb átnézni a singleton és a factory tervezési mintát, pl. itt:

http://www.tutorialspoint.com/design_pattern/singleton_pattern.htm

https://www.tutorialspoint.com/design_pattern/factory_pattern.htm

http://java.progtanulo.hu/25-tervezesi-mintak

de persze bármely más, a témával foglalkozó anyag is jó lehet.


Néhány megoldási ötlet:

zenesz_talalkozo.pdf


A boldogság világnapja


Minden évben március 20 a boldogság világnapja. Erre vonatkozóan egy felmérést végeznek, melyhez egy Java programot kell írni. A felmérés férfiak és nők boldogságértékét számolja.

A felmérésben résztvevő minden egyes embert egy azonosító és a születési évének megadásával regisztrálnak. Az emberek boldogságérték()ét több összetevő alapján határozzák meg. Számít a párkapcsolati mutató – ez egy -10, +10 közötti érték, amelyet a felmérés során árulnak el az emberek (NE égesse be). Ez az érték természetesen gyakran változhat. Tudósok azt is kimutatták, hogy a másokon segítő emberek sokkal boldogabbak, és azt is, hogy a boldogság a kor előrehaladtával csökkenhet is. A boldogságérték tehát a következő módon számolható: a párkapcsolati mutatóhoz hozzáadják a segítések számának egy, az összes emberre egyformán érvényes szorzóval való szorzatát, és osztják az illető kor()ával. Ez az érték eltérően módosul majd férfiak és nők esetén.

Minden embernek módjában áll segítenie. A segítés() során a segítések száma eggyel növekszik.

A férfiak roppant vágynak a sikerre is. Egy férfi boldogságértékének kiszámításakor az alapértékhez még hozzáadódik a sikeresség mértékének és az illető korának a hányadosa. A férfiaktól a felmérés során kérdezik meg, hogy mennyire érzik sikeresnek magukat.

A hölgyek boldogsága a gyerekszüléskor növekszik, és arányos a gyerekek számával. (A felmérés kezdetén meg kell adniuk a gyerekeik számát.) Az ő boldogságértékükhöz hozzáadódik még a gyerekek számának egy állandóval való szorzata. Ez az állandó minden hölgy esetén azonos. Egy hölgy akár még a (hosszabb ideig tartó) felmérés során is szülhet. Ha szül(), akkor gyerekei száma a metódus paraméterében megadott értékkel növekszik. (Ikreket is szülhet.)

Kiíratáskor (toString()) az illető azonosítóját, nemét és boldogságértékét (mértékegység: „egység”) lehessen olvasni. Hölgyek esetén tüntesse fel a gyerekek számát is.

A fentiek figyelembe vételével írjon programot a következőkre:

A statikus adatok beállítása után olvassa be az adatokat az emberek.txt fájlból. (Adatszerkezet soronként: azonosító, születési év, nők esetén a gyerekek száma.) A férfiak azonosítója F-fel, a nőké N-nel kezdődik. Beolvasás után írassa ki a vizsgálatban résztvevő emberek adatait, majd kezdődjön a vizsgálat.

A vizsgálat a következőt jelenti. Véletlen módon állítsuk be az összes ember párkapcsolati mutatójának és a férfiak sikerességi mértékének az értékét. A sikerességi mérték 0 és 10 között változhat (de ne égesse be!), majd véletlen sokszor futtassa le a következőt: válasszon egy véletlen embert, aki segít, és egy másik véletlen embert, aki ha nem túl öreg hölgy, akkor szül valahány gyereket. A korhatárra adjon egy reális értéket (ne égesse be), az újszülöttek száma pedig legyen egy 0 és 3 közötti véletlen érték. (Azaz legföljebb hármas ikrek lehetnek, most a még több gyerekkel várandósak kimaradnak a felmérésből, de ezt se égesse be).

A vizsgálat után is írassa ki az eredményeket, majd értékelje a vizsgálatot, azaz:

- Számolja ki az átlagos boldogságértéket (GNH – nemzeti boldogság index).

- Határozza meg, hogy kik a legboldogabbak.

- Állapítsa meg a gyerekek számát.


A korábbiakhoz képest nincs benne új, próbálja önállóan megoldani.


Sztárhírek


A Naprakész Sztárhírek című internetes újság ismert emberek (sztárok) életének kiteregetésével foglalkozik. A sztárokat általában jellemzi a nevük (ez ismertté, azaz sztárrá válásuk után nem változik meg) és az emberi élet alatt szintén változatlan IQ (intelligencia hányados). Mindegyikük egyforma alap gázsit kap fizetésként. Fontos számukra, hogy hányszor ír róluk a média. Ez a szám egy megjelenik() metódus során növekszik, minden megjelenéskor eggyel. Az újság időnként foglalkozik igazi művész sztárokkal is (őket a művészeti águk is jellemzi), de inkább az RTL klub sztárjaival. Közismertté válás után már nem szokás megváltoztatni a művészeti ágat. Mindkét sztártípus esetén a fizetés()ük arányban van az IQ-jukkal: művészek esetén az alapfizetéshez hozzáadódik még az IQ X-szerese, ahol X minden egyes művészre egyformán érvényes szorzó, RTL klub sztárok esetén azonban a fizetés fordított arányban áll az IQ-val (minél kisebb az IQ, annál nagyobb a fizetés :)), esetükben az alapfizetéshez hozzájön még az IQ reciprokának Y-szorosa, ahol Y minden egyes RTL-klub sztár esetén egyforma. (A legostobább embernek sem 0 az IQ-ja J)

A vezérlő osztályban előbb legyen egy sztárválogató, ahol addig, amíg van jelentkező (sztarok.txt fájl), bekérik az illető nevét és megmérik az IQ-ját (mérés helyett használjon most véletlen-szám generátort). Ha ez az IQ egy megadott értéknél nagyobb, akkor az illetőből művész lesz, ha egy másik, az előzőnél kisebb megadott értéknél kisebb, akkor RTL sztár, a kettő között pedig sikertelen a válogatás.

A sajtófigyelő() N napon át „figyelje” a sajtót, és véletlenszerűen döntse el, hogy aznap épp kiről írnak (természetesen csak a beválogatott sztárok közül). (A megjelenés azt jelenti, hogy kiíratja az illető jellemző adatait, vagyis a nevét és a megjelenések számát - művésznél a művészeti ágat is.)

Végül készítsen egy kis statisztikát, és állapítsa meg, hogy az adott időszakban

a/ kiknek volt nagyobb hatásuk a kultúrára, azaz összesen kik jelentek meg többször a sajtóban, az igazi művészek vagy az RTL klubosok;

b/ melyik RTL klubos(ok)nak legnagyobb a fizetése, és melyik művész(ek)é a legkisebb.

Adjon rá lehetőséget, hogy lekérdezhessük, egy-egy inputként megadott művészeti ág esetén kik az újság potenciális riportalanyai.

Rendezze a szereplő embereket IQ szerint csökkenő sorrendbe.

A korábbiakhoz képest nincs benne új, próbálja önállóan megoldani.


Szenvedélybetegek



Egy pszichiátriai klinikán szenvedélybetegeket vizsgálnak. Egy emberen egyszerre csak egyfajta szenvedélyt tudnak vizsgálni, ezért a kórházi felvételkor egyértelműen el kell dönteni, hogy alkoholfüggő, vagy facebook-függő egyént vesznek-e fel. Egyelőre csak diagnosztizálnak, vagyis a vizsgálat célja annak eldöntése, hogy az illető valóban függő()-e.

A vizsgálat abból áll, hogy a pácienseket engedik tetszőleges sokszor inni() is és internetezni() is (de mivel egy büfé és egyetlen számítógép van, ezért egyetlen időpillanatban csak egy ember lehet a büfében, ill egy ember a gépnél – és hogy mérhető legyen az eredmény, ezért minden más italforrást és minden saját gépet elkoboznak).

Betegfelvételkor meg kell adni a páciens nevét, TAJ-számát, alkoholfüggők esetén azt is meg kell adni, hogy az illető visszaeső-e.

A vizsgálat során bárki iszik() és internetezik(), de csak az alkoholfüggőknél figyelik, hogy mennyit isznak, és a facebook-függőknél, hogy mennyit interneteznek. Facebook-függők esetén minden egyes internetezéskor eggyel nő a belépések száma. Alkoholfüggők egyszerre egy pohárral isznak, és ilyenkor az alkoholszintjük megnövekszik a paraméterként megadott pohárban lévő alkohol mennyiségével. A facebook-függő akkor tekinthető függőnek, ha az internetes belépések száma meghalad egy, az összes facebook-függőre egyformán érvényes határt. Alkoholistáknál a függőség megállapításakor azt is figyelik, hogy az illető visszaeső-e. Egy visszaeső akkor tekinthető függőnek, ha alkoholszintjük egy, az összes alkoholfüggőre egyformán érvényes határ1 érték fölött van, nem visszaeső esetén pedig akkor, ha ez az érték egy határ2 fölött.

Minden egyes páciens esetén a kórlapra majd a páciens neve és TAJ-száma mellé az kerül majd, hogy az illető függő-e vagy sem. (Rendes szövegként, vagyis: „függő”, „nem függő”.)

A pohar-at egyértelműen megadhatjuk a benne lévő ital nevének, mennyiségének és alkoholfokának megadásával. Ezek alapján kiszámolható a pohárban lévő alkoholmennyiség().

A vezérlő osztályban a szükséges adatok beállítása után regisztrálja() a pácienseket, amíg van betegfelvétel (paciensek.txt fájl). Azt, hogy milyen vizsgálatra veszik fel, most véletlenszerűen döntse el (egyforma eséllyel lehet ilyen is, olyan is). Ha alkoholfüggő vizsgálatra kerül, akkor azt is véletlenszerűen döntse el, hogy az illető visszaeső-e vagy sem.

Ezután, amíg tart a vizsgálat() (egy kérdésre adott válasz dönti el, hogy tart-e még, de egyszerűbb, és kényelmesebb, ha végtelen sokszor lefut egy ciklus), véletlenszerűen döntse el, hogy épp ki iszik, illetve ki internetezik a betegek közül. Aki iszik, az a rendelkezésre álló poharak közül véletlenszerűen választ egyet.

Végül összesítse az eredményeket: névsorba rendezve írassa ki az összes beteg adatát. Állapítsa meg, hogy ki(k) internetezett a legtöbbet, illetve, hogy összesen mennyi a megfigyelt betegek által fogyasztott alkoholmennyiség.

Ha látogató érkezik, akkor a rendszer meg tudja mondani, hogy a klinikán van-e a keresett páciens. (Ehhez célszerű definiálni a paciens osztályban az equals() és hashcode() metódusokat).

Segítség: A poharak listáját létrehozhatja sima konstans adatokkal definiált példányok hozzáadásával.


A korábbiakhoz képest nincs benne új, próbálja önállóan megoldani.


Könyváruház



A tankönyvbolt a továbbiakban web-shopként is akar működni. Az ehhez szükséges program megírásához egy team-et kértek fel. A web-es felület, a szállítás, fizetés a team másik tagjainak a dolga, az öné a nyilvántartás és néhány részfeladat.

A bolt nyomtatott és elektronikus könyveket akar árulni. Minden könyvet jellemez a szerzője, címe és a beszerzési ára (kellene egy ISBN szám is, de ez idő hiányában kimaradhat). A beszerzési ár a könyvelés után nem változhat. A nyomtatott könyvek esetén nyilvántartásba kell venni az aktuális példányszámot is.

Egy könyv ar()a a beszerzési ár + az egyes haszonkulcsok alapján számolt bevétel. Minden könyvből lehet vásárol()ni, de nem teljesen egyformán. Mindkét esetben pénzért vásárolhatunk, vagyis csak akkor sikeres a vásárlási eljárás, ha a metódus paraméterében megadott pénzérték legalább akkora, mint a könyv ára. (A metódus adja vissza, hogy sikerült-e a vásárlás vagy sem.) Sikeres vásárlás esetén a bevételt könyvelje az eddigiekhez, vagyis a bevétellel (a beszerzési ár fölötti rész) növelje az eddigi össz bevételt. (A bevételt könyvenként figyeljük, hiszen az is szempont, hogy egy adott könyv mennyit „fial”.)

Nyomtatott könyvek esetén az is feltétel, hogy legyen belőle példány. Sikeres vásárlás esetén a példányok száma eggyel csökken. Elektronikus könyvek esetén nincs kötött példányszám, itt a vásárlások számát tartják nyilván. Vásárláskor ez növekszik eggyel.

Nyomtatott könyvek esetén a beszerzési árra rájön még az X%-os haszonkulcsnak megfelelő érték. (Vagyis pl. 100 Ft-os beszerzési ár és 10%-os haszonkulcs esetén a könyv ára 110 Ft.) Elektronikus könyvek esetén a haszonkulcs Y%.

Az elektronikus könyvek esetén van még egy hackelés() számláló metódus az illegális letöltések figyelésére. Ez minden egyes érzékelt hackeléskor eggyel növeli a hackelések számát.

Kiíratáskor (toString()) a könyvek szerzője, címe, ára látszódjon. (Természetesen lekérni más adatot is lehessen.)

A vezérlő osztályban töltse fel a boltot áruval, azaz olvassa be a szükséges adatokat (konyvek.txt fájl) – a véletlen döntse el, hogy az aktuális könyv nyomtatott vagy elektronikus. A bolt árukészletéből kb. 30% az e-könyv.

Ellenőrzésképpen írassa vissza a raktárkészletet.

Ezek után kezdjen vásárolni. A vásárlás során adja meg a keresett könyv szerzőjét, címét, és ha van ilyen, próbálja meg megvásárolni (ne feledkezzen meg az equals() és hascode() metódusokról). Vásárlás után írassa ki, hogy sikerült-e vagy sem. Ha van ilyen könyv, akkor a program jelezze vissza, hogy nyomtatott vagy elektronikus formában kapható. (Idő hiányában elég az elsőnek talált változatot kiírni, vagyis ha van ilyen is és olyan is, akkor a hamarabb megtalált nyert.) Ezt addig ismételgesse, amíg van kedve vásárolni.

Mivel „becsületes” világban élünk, ezért az e-könyvek mindegyike esetén véletlen sokszor hívja meg a hackelés metódust.

Végül állapítsa meg, hogy legálisan (vásárlással) vagy illegálisan (hackeléssel) töltöttek le több könyvet.

Rendezze a könyveket szerző szerint.


A korábbiakhoz képest nincs benne új, próbálja önállóan megoldani.