4. Tömbök és ciklusok gyakorlása

Stringek

A String egy olyan referencia típus, ami szöveget tud tárolni. A HelloWorld programonál már találkoztunk ezzel, ugyanis minden, ami idézőjelek közé van írva egy String.

A Stringeken leggyakrabban a az összefűzés (concatenate) műveletet használjuk, amit “összead” vagyis egymás után rak két Stringet.

String text = "Hello";
System.out.println(text + " World!");

Egy másik fontos metódus a length(), ami megadja a String hosszát. Ezen kívül még van sok más is, de egyelőre ezekkel nem foglalkozunk.

String text = "Hello";
System.out.println(text.length());

Tömbök

A tömböket úgy érdemes feldogni, mint egy változó (egy névvel azonosítható memóriaterület), ami egyszerre több értéket tárol. Az egyes értékekre a változó nevével és sorszámával tudunk hivatkozni.

Elősször nézzük meg, hogyan tudunk tömböket létrehozni:

// int tömb, értékek megadásával
int[] fibonacci = new int[]{ 1, 1, 2, 3, 5, 8 };
  
// mérettel megadás, 6 hosszú
int[] fibonacci = new int[6];

fibonacci[0] = 1;
fibonacci[1] = 1;
fibonacci[2] = 2;
fibonacci[3] = 3;
fibonacci[4] = 5;
fibonacci[5] = 8; // az 5 az utolsó index, mert 0-tól kezdjük a számozást

Egy tömb hosszát a tombNev.length -el tudjuk lekérdezni.

While és do while

Alapvetően két fontos ciklus van a Javaban, a for és a while ciklus.

A while az  egyszerűbb, amíg teljesül a feltétel, addig végrehajtja az utasításokat:

while (feltetel) {
    Utasitas1;
    
    UtasitasN;
  
}

Ezt folyamdiagrammal így lehetne szemléltetni:

Demonstration of how a while loop works in Python

Ennek egy változata a hátultesztelős ciklus, ami végrehajtja az utasításokat, és amíg teljesül a feltétel, addig újra és újra végrehajtja.

do {
    Utasitas1;
    
    UtasitasN;
} while (feltetel);
  

For ciklus

A for ciklus egy kicsit komplikáltabb első ránézésre, de valójában csak egy egyszerűsítés.

A for utáni zárójelben három dolog van:

  • (Amit az elején kell megcsinálni;
  • Ami a feltétel, hogy folytassa a futtatást;
  • Amit minden futás után meg kell csinálni)
for (inicializalas; feltetel; inkrementalas) {
    Utasitas1;
    
    UtasitasN;
}

Gyakran előfordul, hogy végig szeretnénk menni egy tömb összes elemén és műveleteket végezni rajtuk (ezért is használunk ilyenkor tömböt).

Erre a for ciklus a legkézenfekvőbb, írjuk ki a tömb összes elemét:

for (int i = 0; i < tombNev.length; i++) {
    System.out.println(tombNev[i]);
}

Foreach ciklus

A foreach ciklus egy még tovább egyszerűsített ciklus, egy tömböt vagy kollekciót (hamarosan…) tudunk vele bejárni, de a sima for ciklussal szemben elveszítjük az (init, feltétel, inkrement) hármas módosításának lehetőségét.

// for (valtozotipus nev : tombnev)
for (int szam : fibonacci) {
    System.out.println(szam);
}

Break, continue

Ha egy cikluson belül kiadjuk a break; utasítást, akkor a program kilép a legbelső ciklusból, és onnan folytatja tovább.

for (int i = 0; i < 10; i++) {
    if (i == 5) break;
    System.out.print(i + ",");
}
  
// Output: 0, 1, 2, 3, 4,

Ha a continue; utasítást használjuk, akkor a program kihagyja a ciklus hátralévő részét és a következő ciklusfutás elején folytatja.

for (int i = 0; i < 10; i++) {
    if (i % 2 == 0) continue;
    System.out.print(i + ",");
}
  
// Output: 1, 3, 5, 7, 9

Feladatok

Mintamegoldás

Közzéteszek egy mintamegoldást kommentekkel, a fenti leírás alapján már mindenkinek értenie kéne.

Aki még nem próbálta, de most már menne neki, az még próbálkozhat: https://github.com/Dawars/Trefort-Android-Szakkor/blob/master/src/Szakkor3Feladat.java

És a részletes megoldás: https://github.com/Dawars/Trefort-Android-Szakkor/blob/master/src/Szakkor3Megoldas.java

Új Gyakorlófeladat

Ennek a feladatnak az a célja, hogy kipróbálhasd és elmélyítsed az eddig tanultakat. A függvényeket megírtam, csak ki kell egészíteni: link

  1.  Tömb elemeinek átlaga
  2. Ki kell számolni az $latex  \LARGE 1+\frac{1}{2^2}+\frac{1}{3^2}+…+\frac{1}{n^2}$ összeget, addig amit ay utolsó tag nagyobb, mint eps.
  3. Írj egy for ciklust while ciklussal (írja ki egy tömb összes elemét)
  4. Szorgalmi: Fizetés a lehető legkevesebb érmével
    • Adott egy m szám (az összeg, amit ki akarunk fizetni) és egy c tömb, hogy milyen pénzérmék állnak a rendelkezésünkre.
    • A feladat, egy olyan program írása, ami tartalmaz egy int felvalt(int m, int[] c, int[] db) függvényt, ami visszaadja a minimális érmeszámot, amivel fel lehet váltani az összeget, valamint a db tömbben azt, hogy miből mennyi kell.
    • A c érték szerint csökkenően tartalmazza az érméket.
    • A jó megoldás tetszőleges ország pénzeire jó eredményt kell, hogy adjon
    • Például: m = 42, c = [25 20 5 1] esetén a megoldás n = 4, db = [0 2 0 2]

Ha elkészültetek a feladatokkal, küldjétek el nekem emailben ([email protected]).