Java Programozás 1. Gy: Java alapok Ismétlés ++ 24/1 B ITv: MAN 2018.02.18
Feladat Készítsünk egy komplett konzolos alkalmazást, mely generál egy számot 0 és 100 között (mindkét határt beleértve), feladatunk a szám kitalálása. Beírunk egy tippet, és kapunk egy üzenetet: A szám kisebb a tippedtől! A szám nagyobb a tippedtől! Eltaláltad! A programot írjuk meg, ahogy tudjuk, aztán alakítsuk át az oop elveknek megfelelően, végül alakítsuk át az MVC szemléletnek megfelelően. 24/2
Magyarázatok Programlogika: 1. Generálunk egy véletlen számot (rndnum) 2. Bekérünk a konzolról egy számot 3. Megvizsgáljuk a bekért számot: Írtak be valamilyen adatot? Az adat számmá konvertálható? 4. Ha az adat számmá konvertálható, átkonvertáljuk (tipp) 5. Ha nincs beírt adat, vagy nem konvertálható számmá, hibaüzenetet írunk, és visszatérünk a 2. lépéshez 6. Vizsgáljuk a tipp és az rndnum viszonyát, kiírjuk a kiértékelést 7. Ha nem találtuk ki, visszatérünk a 2. lépéshez 8. Ha kitaláltuk, leáll a program 24/3
Magyarázatok Véletlen szám generálás: 1. lehetőség: java.lang.math osztály double random() metódussal, mely 0-1 között generál véletlen számot: int rnd = (int)(101*math.random()); 2. lehetőség: java.util.random osztály int nextint(n) metódusával, mely a 0 <= x < n tartományban generál véletlen számot: Random rnd = new Random(); int rndnum = rnd.nextint(101); 24/4
Magyarázatok Beolvasás konzolról: Használjuk a java.util.scanner osztály nextline() utasítását: Scanner sc = new Scanner(System.in); String tipps = sc.nextline(); A bekért adat vizsgálata: Hossz ellenőrzése: if (tipps.length()==0) Adat konvertálása számmá: try { int x = Integer.valueOf(tippS); catch (NumberFormatException nfe) {... 24/5 int x = Integer.parseInt(tippS);
A kód import java.util.random; import java.util.scanner; public class Tipper1 { static Scanner sc = new Scanner(System.in); public static void main(string[] args) { Random rand = new Random(); int rndnum = rand.nextint(101); boolean success = false, numok = false; int tipp=0; 24/6
A kód while (!success) { System.out.print("Kérem a tippet : "); String tipps = sc.nextline(); if (tipps.length()==0) {System.out.println("Nem írtál be adatot!"); else { try { tipp = Integer.valueOf(tippS); numok = true; catch (NumberFormatException nfe) { numok = false; System.out.println("Hibás a beírt adat formátuma!"); if (numok) { if (rndnum == tipp) { success = true; System.out.println("Eltaláltad"); if (rndnum < tipp) System.out.println("A szám kisebb a tippedtől!"); if (rndnum > tipp) System.out.println("A szám nagyobb a tippedtől!"); //== end main //== 24/7 end program
Feladat Számoljuk, hogy hányadik tippel sikerül kitalálni a számot. Az eredmény írjuk ki. 24/8
A kód import java.util.random; import java.util.scanner; public class Tipper1 { static Scanner sc = new Scanner(System.in); public static void main(string[] args) { Random rand = new Random(); int rndnum = rand.nextint(101); boolean success = false, numok = false; int tipp=0, db=0; 24/9
A kód while (!success) { System.out.print("Kérem a tippet : "); String tipps = sc.nextline(); if (tipps.length()==0) {System.out.println("Nem írtál be adatot!"); db++; else { try { tipp = Integer.valueOf(tippS); numok = true; db++; catch (NumberFormatException nfe) { numok = false; db++; System.out.println("Hibás a beírt adat formátuma!"); if (numok) { if (rndnum == tipp) { success = true; System.out.println("Eltaláltad!\nTippek száma: "+db); if (rndnum < tipp) System.out.println("A szám kisebb a tippedtől!"); if (rndnum > tipp) System.out.println("A szám nagyobb a tippedtől!"); //== end main 24/10 //== end program
Feladat Próbáljuk úgy átalakítani a kódot, hogy az "üzleti logikát" metódusokba szervezzük. Létrehozandó metódusok: 1. Véletlen egész számot előállító metódus, legyen a neve randomnumber; 2. Adatot beolvasó metódus (neve: readtip), mely kiírja, hogy "Kérem a tippet :", beolvassa azt, és visszaadja a stringet. 3. Adat ellenőrző (check névvel), mely ellenőrzi, hogy üres-e az adat, és hogy számmá alakítható-e. Logikai értéket adjon vissza. 4. Stringet egésszé alakító metódus, legyen a neve StoInt. 5. Kiértékelő metódus (evaluate névvel), mely megkapja a leellenőrzött beolvasott stringet, számmá alakítja, és kiértékeli a tippet (az eredményt kiírja a képernyőre), és számolja a tippeket. Igaz értéket adjon vissza, ha eltaláltuk a számot, hamisat, ha nem. 6. A metódusokat felhasználva írjuk át a főprogramot! 24/11
A kód Véletlen egész számot előállító metódus, legyen a neve randomnumber; public static int randomnumber() { Random rand = new Random(); return rand.nextint(101); Adatot beolvasó metódus (neve: readtip), mely kiírja, hogy "Kérem a tippet :", beolvassa azt, és visszaadja a stringet. public static String readtip() { System.out.print("Kérem a tippet : "); String s = sc.nextline(); return s; 24/12
A kód Adat ellenőrző (check névvel), mely ellenőrzi, hogy üres-e az adat, és hogy számmá alakítható-e. Logikai értéket adjon vissza. public static boolean check(string s) { boolean out = true; if (s.length()==0) { System.out.println("Nem írtál be adatot!"); out = false; if (out) { try { int x=integer.valueof(s); catch (NumberFormatException nfe) { System.out.println("Hibás a beírt adat formátuma!"); out = false; return out; 24/13
A kód Stringet egésszé alakító metódus, legyen a neve StoInt. public static int StoInt (String s) { int x = -1; try { x=integer.valueof(s); catch (NumberFormatException nfe) { System.out.println("StoInt: "+nfe.getmessage()); return x; 24/14
Kiértékelő metódus (evaluate névvel), mely megkapja a leellenőrzött beolvasott stringet, számmá alakítja, és kiértékeli a tippet (az eredményt kiírja a képernyőre), és számolja a tippeket. Igaz értéket adjon vissza, ha eltaláltuk a számot, hamisat, ha nem. public static boolean evaluate(string s) { boolean ok = false; String ms = ""; int tipp = StoInt(s); db++; if (rndnum == tipp) { ms="eltaláltad!\ntippek száma: "+db; ok = true; if (rndnum < tipp) { ms="a szám kisebb a tippedtől!"; if (rndnum > tipp) { ms="a szám nagyobb a tippedtől!"; System.out.println(mS); return ok; 24/15
A kód A metódusokat felhasználva írjuk át a főprogramot! public class Tipper1 { static Scanner sc = new Scanner(System.in); static int db = 0; static int rndnum = 0; static boolean success = false; public static void main(string[] args) { rndnum = randomnumber(); 24/16 while (!success) { String tipps = readtip(); if (check(tipps)) { success = evaluate(tipps); else db++;
Feladat Újabb fejlesztés következik: 1. Vezessünk be egy limit nevű változót, ez legyen a véletlen generálás felső határszáma. Csak ezen kelljen változtatni ahhoz, hogy más tartományban működjön a program. 2. Készítsünk egy tájékoztató metódust (inform néven), mely ismerteti a program működését, használatát. 3. Vezessünk be külön üzenetet arra, ha olyan számot tippelünk, ami kívül esik a határon (pl: -10, vagy 200); (Bővítsük az evaluate működési logikáját!) 4. Vezessünk be változókat, és tartsuk nyilván, hogy milyen határokon belül van a kitalálandó érték (a tippelés során ez a tartomány egyre kisebb). Ha a határokon kívül értéket tippelünk, ilyen tartalmú üzenetet adjon az evaluate metódus. 24/17
A kód Vezessünk be egy limit nevű változót, ez legyen a véletlen generálás felső határszáma. Csak ezen kelljen változtatni ahhoz, hogy más tartományban működjön a program. public class Tipper1 { static int limit = 100; public static int randomnumber() { Random rand = new Random(); return rand.nextint(limit+1); 24/18
A kód Készítsünk egy tájékoztató metódust (inform néven), mely ismerteti a program működését, használatát. public static void inform() { System.out.println("A program generál egy egész számot 0 és " +limit+" között, ezt kell kitalálni!"); System.out.println("Tippelj, és kapsz információt a tippedről!"); public static void main(string[] args) { rndnum = randomnumber(); inform(); 24/19
A kód Vezessünk be külön üzenetet arra, ha olyan számot tippelünk, ami kívül esik a határon (pl: -10, vagy 200); (Bővítsük az evaluate működési logikáját!) public static boolean evaluate(string s) {... if (tipp < 0) ms="a tippelt szám kisebb, mint az alsó határ!"; if (tipp > limit) ms="a tippelt szám nagyobb, mint a felső határ!"; System.out.println(mS); return ok; 24/20
A kód Vezessünk be változókat, és tartsuk nyilván, hogy milyen határokon belül van a kitalálandó érték (a tippelés során ez a tartomány egyre kisebb). Ha a határokon kívül értéket tippelünk, ilyen tartalmú üzenetet adjon az evaluate metódus. public class Tipper1 { static Scanner sc = new Scanner(System.in); static int db = 0; static int rndnum = 0; static boolean success = false; static int limit = 100; static int min = 0; static int max = limit; 24/21
public static boolean evaluate(string s) { Az boolean evaluate ok = false; metódus kódja String ms = ""; int tipp = StoInt(s); db++; if (rndnum == tipp) { ms="eltaláltad!\ntippek száma: "+db; ok = true; if (rndnum < tipp) { 24/22 ms="a szám kisebb a tippedtől!"; if (tipp <= max) max = tipp; //Miért kell az if? if (rndnum > tipp) { ms="a szám nagyobb a tippedtől!"; if (tipp >= min) min = tipp; //Miért kell az if? if (tipp > max) ms="a tippelt szám nagyobb, mint a már ismerhető legnagyobb érték!"; if (tipp < min) ms="a tippelt szám kisebb, mint a már ismerhető legkisebb érték!"; if (tipp < 0) ms="a tippelt szám kisebb, mint az alsó határ!"; if (tipp > limit) ms="a tippelt szám nagyobb, mint a felső határ!"; System.out.println(mS); return ok;
Házi feladat Úgy átírni a kódot, hogy a teljes üzleti logika egy másik (mondjuk Controller nevű) osztályba kerüljön! A főprogram valahogy így nézzen ki: public static void main(string[] args) { rndnum = con.randomnumber(); con.inform(); while (!success) { String tipps = con.readtip(); if (con.check(tipps)) { success = con.evaluate(tipps); else con.dbplus(); Ahol a con egy Controller példány. 24/23
VÉGE VÉGE 24/24