4. feladatsor

Néhány további feladat:

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

4. feladatsor adatai

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

Természetesen adatbázisból is olvashat, sőt, célszerű lenne legalább egy-két feladat esetén onnan olvasni, de a megadott megoldásrészletekben text-fájlból olvasunk. Arról se feledkezzen meg, hogy - legalább néhány esetben - teszteket is készítsen.


PTE jubileum


A Pécsi Tudományegyetem 2017 szeptemberében ünnepelte fennállásának 650. évfordulóját. A jubileum rendezvényeit szerencsére ingyenesen lehetett látogatni, a feladat kedvéért azonban fizetőssé tesszük őket.

Az ünnepséghez tehát rendezvények tartoznak. Minden egyes rendezvény a címével, időpontjával (jelenleg lehet sima String) és a belépőjegy árával jellemezhető.

Természetesen vannak (lehetséges) résztvevők is, sőt, a PTE azonosítóval rendelkezők még kedvezményt is kapnak. Minden résztvevőnek van neve (a név egyébként sohasem lehet egyedi azonosító, de most az egyszerűség kedvéért feltesszük, hogy minden név más). A PTE-s résztvevőt ezen kívül még egy azonosító is jellemzi.

Egy résztvevő akkor vesz részt egy adott rendezvényen, ha kifizeti a rendezvény részvételi díját. A PTE-s résztvevők egységesen 10% kedvezményt kapnak.

Minden egyes résztvevő esetén tudjuk felsorolni azokat a rendezvényeket, amelyeken részt vett az illető, illetve minden rendezvény esetén állapítsuk meg a résztvevők számát és a rendezvény bevételét.

Írjunk programot a rendezvények szimulálására, melynek eredményét egy grafikus felületen jelenítsük meg:

A képen látható felület belső mérete 600 * 500 pixel.

A program indulásakor már legyenek olvashatóak a rendezvények (cím, időpont, jegyár) és a potenciális résztvevők listájának adatai, illetve adatbeolvasáskor minden résztvevő kapjon véletlenszerűen valamennyi pénzt.

A Jubileum feliratú gomb megnyomására fusson le a szimuláció, vagyis minden egyes rendezvény esetén mindegyik résztvevő „döntse el” véletlenül, hogy részt akar-e venni a rendezvényen vagy sem. (A részvételi kedv kb. 80%-os.) A szimuláció lefutása után a gomb váljon inaktívvá.

A gombnyomás hatására jelenjen meg a legtöbb bevételt hozó rendezvények listája is, maguk a rendezvények pedig legyenek résztvevőszám szerint csökkenően kiírva (most úgy, hogy a rendezvény neve és a létszám).

A maximális bevételű rendezvények listája alatt lehessen látni a kijelölt rendezvények össz-bevételét.

A résztvevők listája alatt pedig azt, hogy a kiválasztott résztvevő mely rendezvényeken vett részt. Mindkét felirat csak akkor jelenjen meg, ha már választottunk a megfelelő listából.


Néhány megoldási ötlet: pte_jubileum.pdf


Gólyabál



Elkezdték árulni a jegyeket az idei gólyabálra, igyekezzen, hogy ez a program is időben készen legyen, és szimulálja vele a gólyabált.

Minden bálozónak egyedi sorszáma van, és természetesen neve. Mindegyikük fogyaszt(), ekkor költségei a metódus paraméterében lévő értékkel növekszenek, persze, csak addig, ameddig a zsebpénzéből futja. Mindegyikük táncol() is időnként, ekkor táncainak száma eggyel növekszik.

A gólyák kedvezményt kapnak. Bármit is fogyasztanak, kedvezményes áron kapják, mégpedig az összes gólyára egyaránt érvényes kedvezményszázalékkal olcsóbban. Még egy privilégiumuk van: választhatnak zeneszámot – természetesen ugyanazt többször is. Amikor egy gólya kiválaszt() egy zeneszámot, akkor az bekerül a kívánt zeneszámai listájába.

Egy zeneszám az előadójával és címével adható meg.

Szimulálja a bált egy 600*650 pixel belső méretű felületen:

A program indulásakor azonnal megjelenik a bálo­zók névsora (lehetőleg ábécé sorrendben), illetve a választható zeneszámok listája. A bálozók adatai­nak beolvasásakor mindenki kapjon 0 és egy egysé­ges határ közötti véletlen zsebpénz-mennyiséget.

(Adatfájlok: balozok.txt, adatszerkezet: név;évfolyam – nyilván az elsős a gólya; illetve zenek.txt.)

A bálozók listájára kattintva, ha gólya a kiválasztott illető, akkor „válasszon” egy véletlen zenét az adott kínálatból (nem a másik listára való kattintással, hanem véletlen generálással, bár szorgalmiként megoldhatja, hogy kattintással választhasson, de csak a gólya). Az alsó lista-felületen az általa választott zeneszámok listája legyen látható (az eddigi összes választott), a lista fölött pedig egy felirat jelezze, hogy kinek a választását látjuk. Ha nem gólya az illető, akkor az alsó listafelület maradjon üresen, a kiírt szöveg pedig tartalmazza azt, hogy a választott ember nem gólya.

A "Mulatás" feliratú gombot megnyomva fusson le egy ciklus, amelyben egy véletlenül választott ember táncol (nem muszáj párban), egy másik véletlen ember pedig véletlen mennyiségű pénzt költ. A jobboldali alsó listában pedig – minden gombnyomáskor frissülve – jelenjen meg a legtöbbet táncolók listája (első alkalommal a lista feletti felirat is). Az induló felületen csak a nevek legyenek olvashatóak a bálozók listájában (gólyák esetén mellette a g betű), a mulatás után viszont lássuk a táncok számát és az elköltött Ft mennyiséget is.

Néhány további futási kép: golyabal_futasi_kepek.pdf

Néhány megoldási ötlet: golyabal.pdf


Mobilfónia



Több mint 25 éve vezették be Magyarországon a kereskedelmi mobilszolgáltatást. (Vagyis valószínűleg Ön nem is élt mobil nélküli világban.) Ennek kapcsán most azt „vizsgáljuk”, hogyan hatnak ezek a kütyük (mobil- és okos-telefon) az emberekre.

Egy kütyü a típusával és egy egyedi sorszámmal azonosítható. Mindegyik tud üzenetetküld()eni, ekkor a kütyü által küldött üzenetek mérete megnövekszik a metódus paraméterében lévő karakter-számmal. Az üzenetek írása növeli az agy hüvelykujj irányítására szolgáló területét, a hüvelykujjsejt()ek száma (int) a küldött üzenetek méretétől függ, hasonlóan, de nem teljesen ugyanúgy számoljuk ki mobil- és okos-telefonok esetén.

Mobiltelefon esetén a hüvelykujjsejtek száma az üzenet mérete és egy, a mobiltelefonokra egyformán jellemző billentyűerő szorzata.

Okostelefon esetén ugyanígy számoljuk ki, csak a billentyűerő nagysága lesz más. Egy okos­telefon a típusa mellett az operációs rendszere nevének megadásával definiálható. Az eddigieken kívül esetenként még internetezni is lehet vele. Ez azon múlik, hogy van WiFi, vagy nincs. A kapcsolodik() metódus hatására lehet kapcsolódni, ekkor a van WiFi állítás igazzá válik, a lekapcsolodik() metódus hatására pedig hamissá. Amikor internetezik(), akkor, amennyiben van WiFi, a netezéssel töltött idő a metódus paraméterében lévő másodpercek (int) értékével növek­szik.

Egy embert a neve és személyigazolvány-száma definiál. Amikor kutyutvesz(), akkor kütyüinek listájához hozzáadódik a metódus paraméterében lévő kütyü. (Persze, kétszer nem veheti meg ugyanazt.) Az emberek hüvelykujjhasználatát és net-függőségét vizsgálják, ezért a huvelykujjero() metódus eredményeként a kütyük hüvelykujjsejt()-jeinek összegét kapjuk, a netidő() eredménye pedig a netezéssel töltött idők összege.

Végül a diagnozis() szöveges formában visszaadja a diagnózist, vagyis ha a hüvelykujj-erő nagyobb, mint egy, az összes emberre egyformán érvényes sejthatár, akkor „kóros hüvelykujjhasználat”, ha a netezéssel töltött idő nagyobb, mint egy, szintén egyformán érvényes függőségi határ, akkor „kóros netfüggő”, egyébként „normális”.

Olvassa be az emberek és a kütyük adatait. A program indulásakor azonnal jelenjen meg az emberek listája, illetve egy comboBox-ban a telefonválaszték.

A comboBox-ra kattintva véletlen sokszor fusson le a következő: hozzunk létre egy ugyanolyan típusú (és esetleg operációs rendszerű) új kütyüt, amilyen a kiválasztott prototípus (ezt választjuk ki a comboBox-ból), és ezt vegye meg egy véletlenül kiválasztott ember. Természetesen többször is választhatunk telefont, és egy embernek több ugyanolyan telefonja is lehet (de nem ugyanaz).

A Használat gomb hatása: valahányszor futtassuk le a következőt: válasszunk ki egy véletlen embert. Ha van kütyüje, akkor a kütyüi közül válasszunk ki véletlenszerűen egyet. Ez a kütyü küldjön egy véletlen hosszú­ságú üzenetet. Ha a kütyü történetesen okos-telefon, akkor valahány százalék eséllyel kap­csolódjon az internethez, egyébként kapcso­lódjon le, majd véletlen hosszúságú ideig próbáljon internetezni.

A Rendez gomb hatása: hüvelykujj-erő szerint csökkenően rendezi az embereket. Az embereket tartalmazó listában most a név mellett a hüvelykerő jelenjen meg.

Az alaposztályokhoz írjon tesztet is.


Néhány megoldási ötlet: mobilfonia.pdf


Pályázatok



A HÖK jó tanuló, jó sportoló pályázatot hoz létre. Szimulálja egy Java programmal.

Egy pályázat egy egyedi sorszám és a pályázó megadásával iktatható. Minden pályázat esetén meghatározható a folyosithatoOsszeg(). Ez nem haladhat meg egy egységes összegHatárt.

Kétféle pályázatot lehet beadni:

A tanulmányi pályázat esetén meg kell adni a kért összeget is (mert pl. ez egy verseny nevezési díja). Akkor kaphat pénzt, ha a pályázó rendelkezik tanári ajánlással. Ekkor a számára folyósítható összeg vagy a kért összeg lesz, ha az a megadott határ alatt van, vagy a pályázati összeghatár.

Sportpályázat esetén a pályázó akkor kaphat pénzt, ha rendelkezik edzői ajánlással. Ekkor mérkőzései számának valahányszorosát kaphatja, ha az kevesebb az összeghatárnál, egyéb­ként pedig az összeghatárt. A mérkőzésenkénti díj egységes.

A pályázót (diák) egyértelműen azonosítja a neve és kódja. Tanul() is és sportol() is. Tanulás során az okossági szintje mindig eggyel nő, és ha eléri az egységes okossági határt, akkor kap tanári ajánlást. (igazzá válik) Sportolás során a mérkőzéseinek száma növekszik eggyel, és ha eléri az egységes mérkőzéshatárt, akkor edzői ajánlást kap (vagyis ez válik igazzá).

Egy 600×400-as belső méretű felületen szimulálja a pályáztatási folyamatot.

Állítsa be a statikus adatokat, és olvassa be a pályázók adatait.

Lehetőleg névsorba rendezve írassa ki a pályázókat, majd szimulálja előbb a szorgalmiIdoszak()ot, majd a pályázás()t. (Egyikhez sem kell külön esemény, a beolvasás után automatikusan végrehajtódnak.)

A szorgalmiIdoszak() azt jelenti, hogy egy ciklusban ismételje meg a következőt: véletlenszerűen válasszon ki két diákot, az egyik sportol, a másik tanul. (Ha véletlenül ugyanaz a diák sportol is és tanul is, az nem baj.)

A pályázás() során minden egyes pályázó (diák) esetén, ha az illetőnek van edzői ajánlása, akkor adja be a sportpályázatot. Ha nincs edzői ajánlása, de van tanári, akkor adja be a tanulmányi pályázatot. A pályázat sorszáma egyesével növekszik , és nyilván az adott pályázó tartozik hozzá. Tanulmányi pályázat esetén a kért összeg legyen egy véletlen érték. A véletlent a pályázati összeghatár duplájáig generálja.

Az Elbírálás gomb hatására kerüljenek be a nyertesek a nyertes pályázatok listájába (azok nyernek, ahol a pályázat folyósítható összege nullánál nagyobb).

A nyertesek alá írja ki a teljes kifizetendő összeget és a legnagyobb kifizetés értékét.


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


Bill Gates



Bill Gates hatvanadik születésnapja tiszteletére több helyszínen is konferenciát tartottak, melyre kétféle résztvevő regisztrálhatott, a vendégek ott voltak a helyszínen, a virtuális résztvevők számítógépen kapcsolódtak az eseményhez.

Minden résztvevő egyértelműen megadható a nevével és egy egyedi sorszámmal. Mindenki értékeli Bill Gates munkáját egy pontszámmal. Mindenki csak egyszer pontoz()hat, ekkor egy véletlen pontszám keletkezik (kivételesen lehet alaposztályban véletlen), mégpedig egy, az összes résztvevőre egyformán jellemző alsó- és felső ponthatár közötti érték (a felsőt is felveheti, az alsó akár negatív is lehet). (Figyeljen rá, hogy tényleg csak egyszer generálódjon ez az érték.)

A vendég a helyszínen vesz részt a konferencián, ez csak azért érdekes, mert ott be tud szállni Bill Gates jótékonysági tevékenységébe. (BG megígérte, hogy a konferenciákon összegyűlt adomány dupláját adja jótékonysági célokra.) Ahhoz, hogy valaki vendég lehessen, feltétlenül rendelkeznie kell valamennyi pénzzel. Ebből a pénzből tud adakozni, az adomany() pedig az adott pontszám és egy, az összes vendégre egyformán jellemző szorzó szorzata lesz.

Természetesen csak annyit tud adni, amennyi pénze van, illetve csak adni tud, kapni akkor sem, ha rossz véleménnyel van BG-ről.

A virtuális résztvevők számítógépen kísérik az eseményeket, azonban sajnos előfordulhat, hogy csak késve tudnak kapcsolódni, mert a gépük épp elkezd frissíteni. Amikor frissit(), akkor a metódus paraméterében lévő frissítések számától függ a frissítési idő, mégpedig a frissítések számának és egy, az összes virtuális felhasználóra érvényes átlag idő szorzata. Csak akkor tud pontozni, ha a frissítési idő nem halad meg egy, az összes virtuális részvevőre jellemző időkorlátot.

Egy konferenciát a kódjával és helyszínével lehet megadni. A regisztráció() során egy, a metódus paraméterében lévő résztvevő kerül a résztvevők listájába – de természetesen mindenki csak egyszer vehet részt egy konferencián. A szavazas() során minden résztvevő pontoz. A pontszam() a résztvevők össz-pontszámát adja vissza, az adomany() pedig a vendégek adomá­nyainak összegét (ezek az értékek esetleg adattagként is számolhatók). A konferenciáknak van egy egységes részvételi díja is.

Olvassa be a konferenciák és a résztvevők adatait. Valaki akkor lehet vendég, ha egy adott határértéknél több pénze van, egyébként virtuális résztvevő lehet. (Esetünkben a konkrét határérték legyen a konferencia-díj, de általános határral oldja meg.) Ugyancsak a konferencia-díj legyen majd a vendégek szorzójának értéke is.

A program indulásakor azonnal jelenjen meg a konferenciák listája (ekkor a résztvevők listája még üres), és rögtön regisztráljanak is a résztvevők, azaz: valahányszor ismételje meg, hogy egy véletlenül kiválasztott konferenciára regisztrál egy véletlenül kiválasztott résztvevő (egy résztvevő több konferencián is részt vehet) .

Egy-egy elemet kiválasztva a konferenciák listá­járól, a másik listafelületen lehessen látni az adott konferencián résztvevőket (a virtuális résztvevő neve mellet (v) szerepel).

Induláskor a Szavazás gomb aktív, a Rendezés inaktív, szavazás után ez megfordul.

A Szavazás gomb hatása: először minden virtuális résztvevő gépe elkezd frissíteni 0 és egy adott érték közötti véletlen frissítés-számmal. Ezután minden konferencián lezajlik a szavazás, és a konferenciák lista alatt megjelenik az összes adomány ($) és az összes pont értéke.

A résztvevők listájából kiválasztva egyetlen em­bert, a lista alatt az általa generált pontszám olvasható.

A Rendezés gomb hatására a konferenciák listában adományok szerint csökkenő módon jelenjenek meg a konferenciák, a név, helyszín adatok mellett az adományok mennyisége is szerepeljen ($).

Tesztelje az alaposztályokat.


A korábbiakhoz képest nincs benne új (csak annyi, hogy most a Resztvevo osztály pontoz() metódusában szerepelhet véletlen generálás), próbálja önállóan megoldani.


Börtönkísérlet



Szimulálja az igencsak megdöbbentő stanfordi börtönkísérletet egy Java programmal. (https://hu.wikipedia.org/wiki/Stanfordi_börtönkísérlet )

A kísérletben résztvevő személyek véletlenszerűen kapják a fogoly vagy a börtönőr szerepét.

A kísérleti személy a nevével és egy egyedi sorszámmal azonosítható. Minden személy számára egyformán telnek a napok. Az ujabbNap() metódus hatására az eltelt napok száma eggyel nő. Minden személynek van egy saját naplója, melybe időnként bejegyzéseket kell írnia. A naplobejegyzes() során a naplóba beírja, hogy ma hanyadik nap van, majd kicsit eltérő módon folytatja a fogoly, ill. a börtönőr. A fogoly azt írja még be, hogy mekkora a fásultsági mértéke (pl. a beletörődés mértéke: 3), a börtönőr pedig azt, hogy mekkora az agresszivitása (pl. az agresszió mértéke 2).

A kísérlet során a fogoly fasul(), ekkor fásultsági mértéke eggyel növekszik. Előfordulhat, hogy időnként lazad(), ekkor fásultsági mértéke eggyel csökken.

A börtönőr viszont egyre agresszívabbá válik. Az agresszioNovekedes() metódus hatására az agresszió mértéke a metódus paraméterében megadott értékkel növekszik. Ha az agresszió mértéke elér egy, az összes börtönőrre egyformán érvényes határt, akkor gonoszkodik(). Ha ez már igaz, akkor a naplóba az agresszió mértékét jelző szám mellé kerüljön még be a „már gonoszkodik” szöveg is.

A napló a tulajdonos személlyel azonosítható, és bejegyzések (string lista) vannak benne. A napló létrejöttekor azonnal kerüljön be a legelső bejegyzés, az, hogy ez kinek a naplója. A beir() metódus hatására kerül be a bejegyzések közé a metódus paraméterében lévő string.

Olvassa be a kísérletben résztvevő személyek névsorát, és véletlen-szerűen döntse el, hogy kiből lesz fogoly, és kiből börtönőr. A személyek kb. 40%-a lesz őr. Minden személy azonnal megkapja a vadonatúj naplóját.

A 700x550-es felületen azonnal láthatóvá válik az őrök és a foglyok listája.

A "Kísérlet" gombra kattintva kezdődik egy újabb nap. Ekkor annyiszor fusson le a szimuláció, ahány fogoly, illetve ahány börtönőr van, a szimuláció során pedig válasszunk ki egy-egy véletlen foglyot, ill. véletlen börtönőrt.

A fogoly fele-fele eséllyel véletlenszerűen vagy fásul vagy lázad. Az őrnek pedig véletlen értékkel növekszik az agressziója. A listák alatt jelenjen meg az agresszió-szintek, ill. a fásultsági szintek összege.

Szintén a gombnyomás hatására láthassuk a legagresszívebbek listáját is.

Egy személyre kattintva (akár őr, akár fogoly, de egyszerre csak egyet lehessen választani) láthassuk az illető naplóját (mindegy, hogy textarea vagy lista).

A "Rendezve" gomb hatására fásultsági mérték szerint rendezze a foglyokat. Ekkor a nevek mellé írja oda a fásultság értékét is .


A korábbiakhoz képest nincs benne sok újdonság, próbálja önállóan megoldani. Figyeljen rá, hogy a napok egyformán telnek minden személy esetén.

Az alaposztályok kódrészleteit itt ellenőrizheti: bortonkiserlet.pdf


Könyvtár



Szimulálja Java programmal egy könyvtár működését.

Egy könyvet a szerzője, címe és egy egyedi azonosító jellemzi. A könyveket kölcsönözni lehet. A kölcsönzés() vagy sikeres, vagy nem. Ha már kikölcsönzött állapotban van, akkor nyilván sikertelen. Ha nincs kikölcsönözve, akkor sikeres a kölcsönzés. Ez azt jelenti, hogy a kikölcsönzött állapot igazzá válik, és a kölcsönzés dátuma felveszi a metódus paraméterében lévő értéket. A dátum most lehet egy int érték (mondjuk az év napja, de ez most lényegtelen). (Persze, ha kedve van hozzá, dolgozhat igazi dátummal is.) A visszahoz() metódus hatására a kikölcsönzött állapot ismét hamissá válik, a kölcsönzés dátuma pedig legyen nulla.

Minden könyv egy egységes kölcsönzési ideig adható ki (valahány nap). Az osztály tudja kiszámolni a kölcsönzés lejarat()-át is, vagyis azt, hogy a metódus paraméterében megadott dátumhoz képest hány nap van még hátra a kölcsönzésből.

A könyvtár hangos könyveket is kölcsönöz. A hangos könyvet a fentieken kívül még a szöveget felolvasó ember neve is jellemzi. Ha igaz, hogy másolásvédett, akkor ugyanúgy lehet kölcsönözni, mint bármilyen más könyvet, egyébként nem kölcsönözhető (csak helyben hallgatható). A másolásvédelem bármikor módosítható.

Egy 900*600-as belső méretű felületen szimulálja a könyvtár működését.

A felület betöltésekor olvassa be a konyvek.txt fájl tartalmát. (Adatszerkezet: szerző;cím;azonosító, és hangos könyv esetén a felolvasó neve.) Beolvasáskor a hangos könyvek kb. x százalékát lássa el másolásvédelemmel. (Véletlenszerűen döntse el, hogy melyik lesz másolásvédett és melyik nem.)

A beolvasott adatok értelemszerűen kerüljenek a megfelelő listafelületre. Könyvek esetén a szerző: cím legyen olvasható, hangos könyv esetén ezek után zárójelben legyen feltüntetve a felolvasó neve is.

A Kölcsönöz gomb hatására lehessen kölcsönözni. Ha nincs megadva a dátum, illetve nincs kiválasztás, akkor adjon hibaüzenetet. Egyébként kölcsönözze a kiválasztott könyveket. Sikeres kölcsönzés esetén kerüljön be a könyv a kölcsönzöttek listájára is (de maradjon meg az eredeti helyén is), ha nem lehet kölcsönözni, akkor pedig jelezze, hogy az illető könyv ki van kölcsönözve. (Ha több kijelölt is ki van kölcsönözve, akkor egyenként mindegyikhez dobjon fel egy üzenetet.)

Ugyanezt kell csinálni a hangos könyvek esetén is. Ott még azt is jelezze, ha a kiválasztott példány másolásvédelem hiánya miatt csak helyben hallgatható. Kölcsönzések után szűnjenek meg a kijelölések. (Mindkét fajta kölcsönzés esetén.)

A kölcsönzöttek listáján egy elemre kattintva a lista alatt jelenjen meg, hogy még hány nap van hátra a kölcsönzés lejártáig. (A dátum mezőben nyilván meg kell adni az aktuális dátumot – egy int értéket.) Ebből a listából egyszerre csak egy elemet lehessen kiválasztani.

A visszahoz gomb hatására menjen végig a kölcsönzött anyagok listáján, és véletlenszerűen hívja meg (vagy ne) egy-egy könyv visszahoz() metódusát. Utána még egyszer menjen végig ezen a listán, és törölje ki a felületről a visszavitt könyveket.


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