Csak akkor olvass tovább, ha a Könyv feladatot megoldottad, vagy nem sikerült megoldani.
Az alap feladatot a fenti linken megtalálod. A feladatban több helyen írtam megjegyzéseket, hogy könnyebben követhető legyen a feladat megoldása. Ha jól megnézed a feladatot, akkor a hibakezelés a program legnagyobb része, a tényleges programműködés (változók kezelése) ehhez képest jóval kevesebb. A feladat megoldását NetBeans project formában innen letöltheted.
Könyv objektum
/** * * @author http://webotlet.hu */ package webotlet_konyv; public class Konyv { int oldalszam; int aktualis; boolean nyitva; public Konyv() { oldalszam = (int) (Math.random() * 101)+50; aktualis = 0; nyitva = false; } public void kinyit() { if( nyitva ) { System.out.println( "A konyv mar nyitva van." ); return; } nyitva = true; // [1;oldalszam] aktualis = (int) (Math.random() * oldalszam) + 1; System.out.println( "Kinyitottad a konyvet a "+aktualis+ " oldalon." ); } public void bezar() { if( !nyitva ) { System.out.println( "A konyv mar be van zarva." ); return; } nyitva = false; aktualis = 0; System.out.println( "Bezartad a konyvet." ); } public void nez() { if( nyitva ) { System.out.println( "A konyv nyitva van a "+aktualis+ " oldalon." ); } else { System.out.println( "A konyv zarva van." ); } } public void lapoz( int irany ) { if( nyitva == false ) { System.out.println( "A konyv zarva van, nem lapozhato." ); return; } // elore lapozas if( irany > 0 ) { aktualis++; System.out.println( "Lapoztal egyet hatra." ); } // egyebkent hatra lapozas else { aktualis--; System.out.println( "Lapoztal egyet elore." ); } if( aktualis == 0 || aktualis == oldalszam + 1 ) { bezar(); } } public void porget( int irany ) { int elozo, mennyit; if( nyitva == false ) { System.out.println( "A konyv zarva van, nem porgetheto." ); return; } elozo = aktualis; // elore porgetes if( irany > 0 ) { if( aktualis == oldalszam ) { System.out.println( "Mar az utolso oldalon tartasz, arra "+ "nem porgetheted." ); return; } // a fennmarado oldalak [aktualis+1;oldalszam] mennyit = (int)(Math.random()*(oldalszam-aktualis))+aktualis+1; aktualis = mennyit; System.out.println( "Hatra porgettel "+ Math.abs(elozo-aktualis)+" oldalt." ); } // egyebkent hatra fele porgetes else { if( aktualis == 1 ) { System.out.println( "Mar az elso oldalon tartasz, arra "+ "nem porgetheted." ); return; } // lehetseges oldalak [1;aktualis-1] mennyit = (int)(Math.random()*(aktualis-1))+1; aktualis = mennyit; System.out.println( "Elore porgettel "+ Math.abs(elozo-aktualis)+" oldalt." ); } } @Override public String toString() { return "Konyv{" + "oldalszam=" + oldalszam + ", aktualis=" + aktualis + ", nyitva=" + nyitva + '}'; } }
Vezérlő objektum
/** * * @author http://webotlet.hu */ package webotlet_konyv; public class Webotlet_Konyv { public static void main( String[] args ) { Konyv k1 = new Konyv(); System.out.println( k1 ); k1.kinyit(); k1.kinyit(); k1.nez(); k1.lapoz( 1 ); k1.nez(); k1.bezar(); k1.bezar(); k1.kinyit(); k1.lapoz( 1 ); k1.nez(); k1.porget( 1 ); k1.nez(); k1.porget( 1 ); k1.nez(); k1.porget( 1 ); k1.nez(); k1.porget( 1 ); k1.nez(); } }
Udv!
Csak kezdo programozo vagyok, ezert elore is elnezest kerek, ha a kerdesem primitiv.
Addig ertem, hogy a konyv alapalapotban zarva van amit a konstruktorban ”nyitva = false”-al allitunk be . De miert van az, hogy a kinyit() metodus if-jeben ”if(nyitva)”, aminek erteke false es a program megis a ”nyitva = true” allitast veszi figyelembe.
Csak a hibakezeles miatt kell odatenni? Elore is koszi a valaszt. Amugy nagyon jo az oldal, csak igy tovabb.
Amikor ki akarom nyitni a könyvet, meg kell vizsgálnom az aktuális állapotát. Valóban jól látod, a hibakezelés miatt van ott az első if. Nem nyithatom ki kétszer.
Ha már eleve nyitva van: if( nyitva ) …. akkor nem tudom kinyitni még egyszer, és itt meg is áll a dolog. (az nyitva továbbra is true marad)
Ha ez az állítás hamis (zárva van), akkor jut csak el a program az if utáni nyitva = true; sorhoz, vagyis jelzem, most nyitottam ki.