Ciklusok

  1. Készíts “Helló világ” programot.
  2. Írd ki a parancssori paraméterek számát.
  3. Írd ki a parancssori paraméterek szövegeit…
    1. sorrendben.
      • a tömbindexek számlálásával és bejárással egyaránt
    2. sorszámozva.
    3. fordított sorrendben.
      • tipp: az indexeket többféleképpen lehet kezelni
    4. csak a paraméterek hosszait.
    5. azokat, amelyek érvényes egész számok. (bónusz)
    6. azokat, amelyikekből több is található. (bónusz)
    7. ábécésorrendben. (bónusz)
  4. Tegyük fel, hogy a parancssori paraméterek mindegyike egész szám, szöveges alakban (pl. “416123”). Írd ki…
    1. az összegüket.
    2. az átlagukat.
    3. a párosakat.
    4. a legnagyobbat.
    5. az első szám összes osztóját.
    6. a számokat számsorrendben. (bónusz)
  5. A fenti feladatokat oldd meg úgy is, hogy az adatokat egy sor beolvasása adja.

Függvények

  1. Írd ki a Fibonacci-sorozat n-edik elemét. Az n paramétert az első parancssori paraméter tartalmazza.
    1. 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ó?
    2. kihasználva, hogy csak a szomszédos értékeket kell eltárolni
      1. az értékeket változóban tárolva
      2. az értékeket egy tömbben tárolva
    3. a két hatványt tartalmazó képlettel (bónusz)
    4. 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
    5. írd ki a sorozat első n elemét
      1. készíts ehhez függvényt, amely a sorozat elemeit tömbben adja vissza
  2. Vonj négyzetgyököt egy parancssorból kapott számból.
    1. Keresd meg, hogy hívják a műveletet.
    2. Használj Newton-iterációt. (bónusz)
  3. Készíts függvényt, amely a Pascal-háromszög egy sorát írja ki egy sorba.
    1. Készíts olyan változatot is, amely egy tömböt ad vissza az elemekkel.
    2. Készíts olyan változatot is, amely az első n sort adja vissza (tömbök tömbje).
  4. 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)

Osztályok: adattagok, műveletek

  1. Készíts Ember osztályt, amely egy ember adatait tárolja: családnév, személynév, életkor.
  2. Készíts getter/setter műveleteket mindegyik adattaghoz.
  3. Készíts az osztályhoz konstruktort, amely átveszi az ember adatait.
  4. Készíts szöveggé alakító műveletet (toString), amely ilyen szöveggé alakítsa az ember adatait: (Kovacs, Janos, 66)
  5. Példányosíts néhány embert, és írasd ki az adataikat.
  6. Konstruktor túlterhelése
    1. 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
    2. Az emberek adatait kapjuk parancssori paraméterként (az előbb leírt alakban), készítsünk tömböt belőlük.
    3. 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
        • ne duplikáld a kódot!
      1. Legyen hozzá setter.
      2. 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?
      3. 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)?
    4. 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
      1. A toString írja bele ezeket is a kimenetébe.
    5. Legyen az Ember osztályhoz másoló konstruktor.
      • megsérülhet-e az enkapszuláció?
  7. Műveletek
    1. A getVagyon művelet adja meg, mennyi pénze van az embernek.
    2. 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
    3. 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
    4. 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?
  8. Statikus adattagok
    1. Készíts osszVagyon statikus adattagot, amely mindig mutassa az összes ember összes bankszámláján található pénz értékét.
      1. Módosítsd úgy a fenti konstruktorokat és műveleteket úgy, hogy tartsák karban az adattagot.
    2. Készíts leggazdagabb és legszegenyebb statikus adattagot, amely mindig a legnagyobb/legkisebb vagyonú Ember objektumra hivatkozik (vagy null, ha nincsen még ember).
      1. Módosítsd úgy a fenti konstruktorokat és műveleteket úgy, hogy tartsák karban az adattagot.
    3. Készíts getter műveletet az osztályszintű adattagokhoz.

Fájlkezelés

  1. Add meg, hány soros egy (parancssori paraméterként megadott nevű) fájl.
    1. Ha a fájl nem létezik, írj ki egy hibaüzenetet.
  2. Egy fájlban számok találhatóak. Add meg az összegüket.
  3. Másolj át minden második sort egy fájlból egy másikba.
  4. 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…
    1. Írd ki az embereket egy másik fájlba, hasonló szerkezetben.
    2. 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.
      1. Lehessen barátot beállítani: barat Kovacs Janos Nagy Peter hatására legyen Kovács János barátja Nagy Péter.
      2. 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.
      3. 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.)
      4. Lehessen fájlba kiírni az emberek adatait: ment emberek.txt
      5. Lehessen fájlból betölteni az emberek adatait: tolt emberek.txt
      6. 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

  1. Készíts egy listát az első tízmillió számból.
  2. Fordítsd meg a listát, majd írd ki az 1., 3., 6., 10. stb. elemeit.
    1. Használd a get műveletet egy elem eléréséhez.
    2. Használj bejárót (iterátort).
    3. 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?
  3. Készíts listát a parancssori paraméterként (szövegesen, vesszőkkel ellátva) megkapott emberekből.
    1. 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.
      1. Ez legyen egy külön művelet: emberekNevSzerint.
    2. 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.
      1. Í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.
      2. Az osztálynak legyen hashCode művelete is, ami az equals művelettel “együtt jár”.
  4. 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.
    1. Egy fájl minden sora öt számot tartalmaz; mindegyik sorra írd ki, hány találatot ért el.

Halmaz

  1. Adott két fájl. Add meg azokat a szavakat, amelyek mindkettőben szerepelnek.
    1. Használj TreeSet-et, hogy a kiírásnál sorban kapjuk meg a szavakat.
  2. 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.)
  3. Két fájlban soronként emberek adatai találhatóak szövegesen. Írd ki azokat az embereket, akik mindkét fájlban szerepelnek.
    1. Használj TreeSet-et, hogy az emberek sorban íródjanak ki. Ehhez az Embereknek egymással összehasonlíthatóaknak kell lenniük. (bónusz)
  4. 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

  1. 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.
    1. 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.
    2. Írd ki, hogy melyik számot kik választották.
  2. Válassz egy (szöveges) könyvet, pl. a Project Gutenbergről.
    1. Melyik szó fordul elő benne a leggyakrabban?
    2. Írd ki a szavak gyakoriságértékeit.
  3. 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.
  4. Á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

  1. Az Ember osztályban legyen két statikus felsorolási típus.
  2. 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.
  3. 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

  1. 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.
  2. 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

  1. 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.
    1. Rendezd a fájlból beolvasott embereket, és írd ki őket.
  2. Készíts olyan Comparator-t, amely az embereket elsődlegesen a vagyonuk, másodlagosan a nevük alapján rendezi.
    1. Rendezd a beolvasott embereket ilyen módon is.
    2. 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

  1. Legyen az Ember osztálynak két gyermeke, a Hitelezo és a Reszvenyes.

Sablon

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

Gyakorlás

  1. 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.
  2. Egy fájl embereket ír le.
  3. 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.
  4. 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.