Ciklusok
- Készíts “Helló világ” programot.
- Írd ki a parancssori paraméterek számát.
- Írd ki a parancssori paraméterek szövegeit…
- sorrendben.
- a tömbindexek számlálásával és bejárással egyaránt
- sorszámozva.
- fordított sorrendben.
- tipp: az indexeket többféleképpen lehet kezelni
- csak a paraméterek hosszait.
- azokat, amelyek érvényes egész számok. (bónusz)
- azokat, amelyikekből több is található. (bónusz)
- ábécésorrendben. (bónusz)
- Tegyük fel, hogy a parancssori paraméterek mindegyike egész szám, szöveges alakban (pl. “416123”). Írd ki…
- az összegüket.
- az átlagukat.
- a párosakat.
- a legnagyobbat.
- az első szám összes osztóját.
- a számokat számsorrendben. (bónusz)
- A fenti feladatokat oldd meg úgy is, hogy az adatokat egy sor beolvasása adja.
- művelet a beolvasáshoz:
System.console().readLine()
args
-hoz hasonló tömbbé alakítás: split(" ")
Függvények
- Írd ki a Fibonacci-sorozat
n
-edik elemét. Az n
paramétert az első parancssori paraméter tartalmazza.
- a sorozat szokásos (rekurzív) definíciója szerinti számítással
- kipróbálásra: mekkora
n
értékre lesz kivárhatatlanul lassú?
- kipróbálásra: mikor csordul túl a számláló?
- kihasználva, hogy csak a szomszédos értékeket kell eltárolni
- az értékeket változóban tárolva
- az értékeket egy tömbben tárolva
- a két hatványt tartalmazó képlettel (bónusz)
- a fenti megoldásokat függvényként is készítsd el
- a függvény csak a számítást írja le, a kiírás legyen külön
- írd ki a sorozat első
n
elemét
- készíts ehhez függvényt, amely a sorozat elemeit tömbben adja vissza
- Vonj négyzetgyököt egy parancssorból kapott számból.
- Keresd meg, hogy hívják a műveletet.
- Használj Newton-iterációt. (bónusz)
- Készíts függvényt, amely a Pascal-háromszög egy sorát írja ki egy sorba.
- Készíts olyan változatot is, amely egy tömböt ad vissza az elemekkel.
- Készíts olyan változatot is, amely az első
n
sort adja vissza (tömbök tömbje).
- A parancssori paraméterek lengyel formában adott kifejezést írnak le. A kifejezésben a négy alapművelet szerepelhet. Számítsd ki az eredményt. (bónusz)
- pl.
1 2 3 * +
eredménye (3 * 2) + 1
, azaz 7
- mj. DOS parancssorban a
*
speciális jelentésű
Osztályok: adattagok, műveletek
- Készíts
Ember
osztályt, amely egy ember adatait tárolja: családnév, személynév, életkor.
- Készíts getter/setter műveleteket mindegyik adattaghoz.
- az adattagok ne legyenek kívülről láthatóak, csak ezeken keresztül legyenek elérhetőek
- Készíts az osztályhoz konstruktort, amely átveszi az ember adatait.
- Készíts szöveggé alakító műveletet (
toString
), amely ilyen szöveggé alakítsa az ember adatait: (Kovacs, Janos, 66)
- Példányosíts néhány embert, és írasd ki az adataikat.
- Konstruktor túlterhelése
- Legyen olyan konstruktor is, amely egy szöveget vár, ilyet:
Kovacs,Janos,66
- tegyük fel, hogy a szöveg alakja helyes, nem kell külön vizsgálni
- a
String
osztály split
műveletével fel lehet darabolni
- Az emberek adatait kapjuk parancssori paraméterként (az előbb leírt alakban), készítsünk tömböt belőlük.
- Lehessen az embernek barátja is, egy másik
Ember
.
- ha nincsen barátja, az adattag legyen
null
- a korábbi konstruktoroknak legyen olyan változata is, ami megkapja a barátot
- Legyen hozzá setter.
- Tegyük fel, hogy páros sok parancssori paraméterünk van. Az emberek páronként legyenek egymás barátai.
- Használható ehhez a fenti konstruktor?
- A
toString
írja bele a szövegbe a barát nevét is (ha van).
- beleírhatná-e a barátot magát (mint
Ember
példányt, a toString
művelettel)?
- Mindegyik embernek lehetnek bankszámlái. Az ezeken tárolt összegek is jelenjenek meg a “vesszős” konstruktorban:
Kovacs,Janos,66,5000,20000,8000
- egy (egész számokat tartalmazó) tömb adattag tárolja őket
- a hosszuk nem ismert előre
- A
toString
írja bele ezeket is a kimenetébe.
- Legyen az
Ember
osztályhoz másoló konstruktor.
- megsérülhet-e az enkapszuláció?
- Műveletek
- A
getVagyon
művelet adja meg, mennyi pénze van az embernek.
- A
befizet
művelet két paramétert kap: hanyadik számlára és mekkora összeget. Ezt helyezzük el a megfelelő számlán.
- a számlaszámok 1-től indulnak
- tegyük fel, hogy a számlaszám érvényes, nem kell ellenőrizni
- A
kivesz
művelet megkapja a számlaszámot és a kívánt összeget.
- ha nincsen ennyi pénz a számlán, a teljes összeget vegye le róla
- térjen vissza a kivett pénz mennyiségével
- A
kamat
művelet egy egész számot kap. Mindegyik számla összege változzon meg ennyi százalékkal.
- pl. ha a szám
5
, akkor 105%
-ára változzon mindegyik összeg, ha -5
, akkor a 95%
-ára
- gyakori hiba, ha a készülő kód, bár ránézésre jónak tűnik, nem változtatja meg a számlák tartalmát
5
paraméterérték esetén, -5
esetén pedig kinullázza a számlákat. Mi ennek az oka, és hogyan lehet megjavítani a kódot?
- Statikus adattagok
- Készíts
osszVagyon
statikus adattagot, amely mindig mutassa az összes ember összes bankszámláján található pénz értékét.
- Módosítsd úgy a fenti konstruktorokat és műveleteket úgy, hogy tartsák karban az adattagot.
- Készíts
leggazdagabb
és legszegenyebb
statikus adattagot, amely mindig a legnagyobb/legkisebb vagyonú Ember
objektumra hivatkozik (vagy null
, ha nincsen még ember).
- Módosítsd úgy a fenti konstruktorokat és műveleteket úgy, hogy tartsák karban az adattagot.
- Készíts getter műveletet az osztályszintű adattagokhoz.
Fájlkezelés
- Add meg, hány soros egy (parancssori paraméterként megadott nevű) fájl.
- Ha a fájl nem létezik, írj ki egy hibaüzenetet.
- Egy fájlban számok találhatóak. Add meg az összegüket.
- Másolj át minden második sort egy fájlból egy másikba.
- Egy fájl második sorától kezdve minden sorában a fenti, vesszővel elválasztott alakban leírt emberek találhatóak; az első sor lévő szám megadja, hány ember található a fájlban. Töltsd be az embereket egy tömbbe, majd…
- Írd ki az embereket egy másik fájlba, hasonló szerkezetben.
- A felhasználó a sztenderd bemeneten egy-egy sorban utasításokat küld. A következő utasítás előtt írd ki az emberek adatait a sztenderd kimenetre.
- Lehessen barátot beállítani:
barat Kovacs Janos Nagy Peter
hatására legyen Kovács János barátja Nagy Péter.
- Lehessen barát nélkülivé tenni az embert:
barat Kovacs Janos
hatására Kovács Jánosnak ne legyen barátja beállítva.
- Lehessen az ember számlájára pénzt tenni/levenni:
penz Kovacs Janos 3 -2000
hatására Kovács János harmadik számlájáról vonódjon le 2000 egység. (Az egyszerűség kedvéért engedjük negatívba menni az összeget.)
- Lehessen fájlba kiírni az emberek adatait:
ment emberek.txt
- Lehessen fájlból betölteni az emberek adatait:
tolt emberek.txt
- Lehessen lekérdezni az ismerősöket:
ismeri Kovacs Janos Nagy Peter
utasításra a program vizsgálja meg, Kovács János barátja-e Nagy Péter, vagy a barátjának barátja-e stb. Ha a baráti kapcsolatokban kör van, azt nem kell a programnak jelenleg kezelnie, ilyenkor elszállhat.
Adatszerkezetek
Lista
- Készíts egy listát az első tízmillió számból.
- Hasonlítsd össze az
ArrayList
és a LinkedList
sebességét.
- Fordítsd meg a listát, majd írd ki az 1., 3., 6., 10. stb. elemeit.
- Használd a
get
műveletet egy elem eléréséhez.
- Használj bejárót (iterátort).
- Az előbbi két megoldáshoz készíts műveletet, amelynek paramétere
List
legyen, így felhasználhatóak ArrayList
és LinkedList
paraméterrel is. Melyik kombináció mennyire gyorsan fut?
- Készíts listát a parancssori paraméterként (szövegesen, vesszőkkel ellátva) megkapott emberekből.
- Járd be a listát, és egy másik listába tedd bele azokat az embereket, akiknek vagy a családneve, vagy a személyneve megegyezik egy megadott szöveggel.
- Ez legyen egy külön művelet:
emberekNevSzerint
.
- Az
Ember
osztálynak legyen equals
művelete. Két embert akkor tekintsünk egyenlőnek, ha mindenben megegyeznek, csupán a barátaik térhetnek el.
- Írd ki, hogy az első beolvasott emberrel kik egyenlőek.
- Az
equals
műveletnek reflexívnek kell lennie, ezért maga az ember jelen kell, hogy legyen.
- Az
equals
műveletnek szimmetrikusnak is kell lennie: a kiírt emberekre meghívva (az első embert paraméterként adva) igazat kell kapnunk.
- Az
equals
tranzitivitását most nem teszteljük, de teljesülnie kell.
- Az osztálynak legyen
hashCode
művelete is, ami az equals
művelettel “együtt jár”.
- Készíts lottójátékot. Keverd össze egy 1..90 számokat tartalmazó lista elemeit, és válaszd ki az első ötöt: ezek lesznek a nyerőszámok.
- Egy fájl minden sora öt számot tartalmaz; mindegyik sorra írd ki, hány találatot ért el.
Halmaz
- Adott két fájl. Add meg azokat a szavakat, amelyek mindkettőben szerepelnek.
- Használj
TreeSet
-et, hogy a kiírásnál sorban kapjuk meg a szavakat.
- Abban a feladatban, ahol az emberek barátait kellett bejárni, oldd meg, hogy a körök se okozzanak problémát. (Tartsd számon, kiket érintettél már.)
- Két fájlban soronként emberek adatai találhatóak szövegesen. Írd ki azokat az embereket, akik mindkét fájlban szerepelnek.
- Használj
TreeSet
-et, hogy az emberek sorban íródjanak ki. Ehhez az Ember
eknek egymással összehasonlíthatóaknak kell lenniük. (bónusz)
- Egy fájlban soronként emberek adatai találhatóak szövegesen, egy másik fájlban személynevek, egy harmadikban családnevek. Írd ki azokat az embereket, akiknek a nevei megtalálhatóak az utóbbi két fájlban.
Map
- Egy fájlban egy egyszámjáték adatai szerepelnek. Mindegyik sorban egy felhasználó neve található és az általa választott szám.
- Az egyszámjáték győztese az, aki a legkisebb számot választotta úgy, hogy senki más nem választotta azt a számot. Írd ki a győztes nevét.
- Írd ki, hogy melyik számot kik választották.
- Válassz egy (szöveges) könyvet, pl. a Project Gutenbergről.
- Melyik szó fordul elő benne a leggyakrabban?
- Írd ki a szavak gyakoriságértékeit.
- Egy fájl egyszerű szótárat tartalmaz: minden sorában két-két szó található. (Tegyük fel, hogy minden szó legfeljebb egyszer szerepel.) A program a szótár alapján “fordítsa le” a kapott szavakat (mindkét irányban); ha ismeretlen szó érkezik, változatlanul írja a kimenetre. A program, ha parancssori paramétert kapott, az abban megnevezett fájlból, különben a sztenderd bemenetről vegye a szavakat; ha van második paraméter is, akkor abba a fájlba, különben a sztenderd kimenetre írja a kimenetet.
- Ábrázolj térképet a következőképpen. A helyszíneket a
Helyszin
osztály ábrázolja (lehet neve, leírása stb.), az irányokat pedig vagy egész számok (pl. 1
= észak), vagy szövegek (pl. "DNy"
), vagy egy felsorolási típus elemei. Egy Map
kulcsai a helyszínek, értékei pedig szintén Map
-ek: irányokról helyszínekre képeznek, azaz megmutatják, hogy egy helyszínről merrefelé melyik másik helyszínre lehet jutni. Előfordulhat, hogy egy adott helyszínről nem minden lehetséges irányba lehet továbblépni, ekkor az az irány nem szerepel a belső Map
kulcsai között. Olvasd be a térképet egy fájlból, és a felhasználó lépkedhessen a térképen a sztenderd bemenetről. (… és még pár elem hozzátételével kész is az Időrégész.)
Jelentős típusok
Felsorolási típus
- Az
Ember
osztályban legyen két statikus felsorolási típus.
- a
Hajszin
lehetséges értékei: FEKETE
, BARNA
, VOROS
, SZOKE
, OSZ
- a
Szemszin
lehetséges értékei: KEK
, BARNA
, ZOLD
, SZURKE
- mj.: ugyan a
BARNA
mindkettőben lehetséges érték, mégsem kerülhet egyik a másik helyére
- az osztályban legyen egy
hajszin
és egy szemszin
adattag
- a konstruktorok kapják meg a két értéket
- a “vesszős” konstruktor a szövegbe kódolva kapja meg őket, a felsorolási típus
valueOf
műveletével lehet konvertálni
- a többi konstruktor az első két paraméterében kapja meg őket
- egy fájlból olvass be embereket, majd írd ki a
KEK-FEKETE.txt
, KEK-BARNA.txt
, …, SZURKE-OSZ.txt
fájlokba a megfelelő kombinációval rendelkező embereket
- ha egy adott kombinációra nincsen ember, a fájl ne jöjjön létre
- Készíts
HibasHajszin
és HibasSzemszin
kivételosztályt, és ha szükséges, a konstruktor váltsa ki őket. Mindkét osztályban legyen egy szoveg
mező (és getter hozzá), amely a hibás szöveget tartalmazza.
- A
Szemszin
elemei kaphassanak paraméterként tetszőleges számú Ember
objektumot. Ezeket az ismertEmberek
(lista típusú) adattagba tároljuk el az adott szemszínhez. Az adattaghoz tartozzon (megfelelően enkapszulált) getter, és legyen egy ujEmber
művelet, amely paraméterként egy embert kap, és felveszi a listába. Az Ember
konstruktorai gondoskodjanak róla, hogy amikor elkészül egy Ember
példány, kerüljön bele a megfelelő listába.
Kivételkezelés
- Ha az
Ember
“vesszős” konstruktora nem megfelelő szerkezetű (nem elegendő a vessző), akkor váltson ki egy RuntimeException
-t, amelynek szöveges paramétere legyen "Keves parameter."
. Ha a paraméterek száma elegendő, de valamelyik nem a megfelelő típusú (kivéve a külön kezelt szem- és hajszín esetében), akkor szintén RuntimeException
váltódjon ki "Hibas parameter"
szöveggel.
- A fájlból beolvasás során, ha hibás ember érkezik, akkor a sztenderd hibafolyamra kerüljön ki hibaüzenet, és folytatódjon a beolvasás.
Comparable, Comparator
- Valósítsa meg az
Ember
osztály a Comparable<Ember>
interfészt, azaz legyen két ember összehasonlítható. A vonatkozó compareTo
művelet ábécé szerint rendezze az embereket, két azonos nevű embert pedig a vagyonuk szerint.
- Rendezd a fájlból beolvasott embereket, és írd ki őket.
- Készíts olyan
Comparator
-t, amely az embereket elsődlegesen a vagyonuk, másodlagosan a nevük alapján rendezi.
- Rendezd a beolvasott embereket ilyen módon is.
- A rendezés műveletének a
Comparator
-t közvetlenül, névtelen függvény (lambda-kifejezés) segítségével add át. (bónusz)
Öröklődés
- Legyen az
Ember
osztálynak két gyermeke, a Hitelezo
és a Reszvenyes
.
- A
Hitelezo
knek legyen listája azokról az Ember
ekről, akiknek hitelezett. Feltételezzük, hogy a listán szereplő emberek legelső számláján van a kölcsönkapott összeg; ez számítson bele a Hitelezo
vagyonába (a getVagyon
művelet visszatérési értékébe).
- A
Reszvenyes
eknek van egy listája, amely Reszveny
eket tartalmaz, amelyeknek nev
e és darabszam
a van; a reszvenytVesz
es a reszvenytElad
műveletekkel lehet őket kezelni. A Reszvenyes
konstruktora átvesz paraméterként egy Map<String, Integer>
hivatkozást, ami megadja, hogy melyik részvénynek mi az árfolyama. (Erre nem kell enkapszuláció, mert változtathatják kívülről.) A Reszvenyes
vagyonába számítson bele a részvényeinek értéke is az aktuális árfolyamon.
- Az osztályokban definiáld felül a
toString
, equals
és hashCode
műveleteket értelemszerűen.
Sablon
- Készítsd el a
DuplazoSor
adatszerkezetet az adatszerk.duplazo
csomagban. Az osztály egy T
típusparaméterrel rendelkezik, és az adattagjai egy List<T>
típusú lista
, valamint egy T
típusú duplaElem
.
- Az adatszerkezet egy sort ábrázol: az
add
művelet egy T
típusú elemet tesz a lista végére, a remove
művelet pedig leveszi és visszaadja a lista
legelső elemét.
- Azonban, ha a
duplaElem
mező nem null
, akkor a remove
ezt az elemet adja vissza, és null
-ra állítja a mező értékét. (Feltételezzük, hogy a duplaElem
, ha ki van töltve, mindig a lista
egy elemére mutat.)
- A
remove
, ha az adatszerkezet üres, váltson ki UresSorException
kivételt. Ez, mint az alábbiakban megjelenő többi kivétel, az adatszerk.duplazo.exception
csomagban legyen.
- Az adatszerkezetnek legyen egy paraméter nélküli konstruktora (ekkor a
lista
mező kezdetben legyen üres), valamint egy olyan konstruktora, amely egy listát vesz át (ekkor a lista
mező ezekkel az értékekkel töltődjön fel, az enkapszuláció megtartásával).
- Az adatszerkezetnek legyen egy
setDuplaElem
művelete, amely egy egész számot vár. Ha ez érvényes indexe a lista
mezőnek, akkor a duplaElem
legyen a lista
megfelelő eleme, különben a művelet váltson ki ErvenytelenIndexException
kivételt. Ez tartalmazza az indexet az idx
adattagjában.
- A
DuplazoSor
innentől csak összehasonlító művelettel rendelkező típusokra működjön, azaz a paraméterezése legyen DuplazoSor<T extends Comparable<T>>
. Legyen egy setMaxDupla
művelet, amely a duplaElem
mezőt a lista
-ban található legnagyobb elemmel tölti ki.
- Az adatszerkezet valósítsa meg a
Queue<T>
interfészt. Ehhez 18 műveletet kell implementálni, amelyek többsége egyszerű; a legbonyolultabb az iterator()
, mert annak a visszatérési értéke egy olyan iterátor példány, amelynek a prioritásos elemet (ha van) első elemként kell érintenie.
Gyakorlás
- Egy fájlban egy város utcáinak adatai szerepelnek soronként. Minden sor pontosan egy vesszőt tartalmaz, a két oldalán két utcanév található; ezek az utcák szomszédosak.
- Töltsd be a fájlból a szomszédos utcák adatait egy
Map
adatszerkezetbe.
- Egy fájl embereket ír le.
- Minden embernek legyen tartózkodási helye, kezdetben oda kerüljön.
- Az egyszerűség kedvéért legyen minden embernek egy azonosítója is. Ha két embernek ugyanaz lenne az azonosítója, dobj
DuplaAzonositoException
kivételt.
- Az emberek lehessenek
Reszvenyes
ek és Hitelezo
k is.
- Egy fájl bankokat ír le. A bankokról ismert, melyik utcában vannak (ha egy utcában több bank is lenne, dobj
TulSokBankException
kivételt), és egy olyan ember, aki Hitelezo
, valamint részvényárfolyamokat is tartson számon.
- A főprogram, ha kap egy parancssori paramétert, az abban megadott nevű fájlból, ha nem kap paramétert, akkor a sztenderd bemenetről olvasson fel soronként utasításokat, és hajtsa őket végre. Legalább az alábbi fajta utasításokat lehessen végrehajtani.
mozog <azon> <utca>
: Az azon
azonosítójú ember mozogjon át az utcába, ha az szomszédos a jelenlegi utcájával.
hiteltKer <azon> <összeg>
: Csak bankban. A bank hitelezője folyósítja a hitelt, ha van elég pénze rá.
reszvenytVesz <azon> <részvény neve> <darabszám>
: Csak részvényes, csak bankban.
arfolyam <utca> <részvény neve> <ár>
: A megadott utca bankjában az árfolyam változzon meg.
kiir
: A város adatainak kiírása a sztenderd kimenetre.
ment <fájlnév>
: A város adatainak kimentése.
tolt <fájlnév>
: A város adatainak betöltése.