Hirdetés

Keresés

Új hozzászólás Aktív témák

  • Szmeby
    tag

    Köszönöm mindenkinek a segítséget, nektek köszönhetően sikerült túllendülnöm a problémán. :R

    (#10653) Szmeby: az első karakter szortírozásnak az volt a célja, hogy ha bizonyos számokkal kezdődött a telefonszám, akkor a megfelelő osztályt kellett meghívnia, ahol kiszámolta az adott szolgáltató díjszabása szerinti összeget.
    A System.exit()-et valóban nem szeretem használni, de if-else esetében hirtelen nem tudtam mást kitalálni, aztán inkább váltottam switchre, ahogy (#10654) axioma is javasolta.
    Valóban nem tanultam még az exceptionről, de utánanéztem azóta.
    A változók nevét azért írtam nagy kezdőbetűvel, mert a feladatban is így szerepelt, és a kiértékelő már ezért is pontlevonással büntet, ha nem minden ugyanúgy van, ahogy elvárják.
    Végül pedig, a return phoneNumber-t tényleg elég volt egyszer kitennem, a legvégén, és sikerült működésre bírnom.

    (#10654) axioma: a konstruktorokkal igazad volt, elfeledkeztem róluk, utólag pótolva megoldódott a probléma.
    Az öröklést már az elején beállítottam, azzal nem volt semmi gond, de köszönöm, hogy felhívtad rá a figyelmet.

    (#10655) sztanozs: Igen, a feladat meghatározása és kiértékelése elég szigorú, sajnos minden értéket ugyanúgy kellett felvennem, ahogy a meghatározásban szerepelt.

    A szortírozós kérdésem inkább elgondolkoztató jellegű volt. Ha tudod, hogy egyéb esetekben milyen díjszabást kell alkalmazni, akkor azt a konstruktort kell meghívnod és az objektumot visszaadnod, ami azt a díjat számolja ki.
    De látom, hogy sikerült megoldani, úgyhogy nem ragozom tovább. Grat!

  • Zsoxx
    őstag

    Köszönöm mindenkinek a segítséget, nektek köszönhetően sikerült túllendülnöm a problémán. :R

    (#10653) Szmeby: az első karakter szortírozásnak az volt a célja, hogy ha bizonyos számokkal kezdődött a telefonszám, akkor a megfelelő osztályt kellett meghívnia, ahol kiszámolta az adott szolgáltató díjszabása szerinti összeget.
    A System.exit()-et valóban nem szeretem használni, de if-else esetében hirtelen nem tudtam mást kitalálni, aztán inkább váltottam switchre, ahogy (#10654) axioma is javasolta.
    Valóban nem tanultam még az exceptionről, de utánanéztem azóta.
    A változók nevét azért írtam nagy kezdőbetűvel, mert a feladatban is így szerepelt, és a kiértékelő már ezért is pontlevonással büntet, ha nem minden ugyanúgy van, ahogy elvárják.
    Végül pedig, a return phoneNumber-t tényleg elég volt egyszer kitennem, a legvégén, és sikerült működésre bírnom.

    (#10654) axioma: a konstruktorokkal igazad volt, elfeledkeztem róluk, utólag pótolva megoldódott a probléma.
    Az öröklést már az elején beállítottam, azzal nem volt semmi gond, de köszönöm, hogy felhívtad rá a figyelmet.

    (#10655) sztanozs: Igen, a feladat meghatározása és kiértékelése elég szigorú, sajnos minden értéket ugyanúgy kellett felvennem, ahogy a meghatározásban szerepelt.

    Miféle oktatási intézmény az, ahol nem ismerik az alapvető kódolási konvenciókat?

  • Taoharcos
    aktív tag

    Hogy lehetne megoldani, hogy if-else szerkezeten belül a megfelelő return hajtódjon végre?
    (A feladat szerint a String szam telefonszám bekérése után a megfelelő osztályba kerülünk, ahol további számítások vannak, de azt már megírtam.)

    private static PhoneNumber PhoneNumber;  //gyanítom erre is szükség lesz

    public static PhoneNumber create(String szam) {
            String regex = "\\d+";
            String firstLetter = String.valueOf(szam.charAt(0));
            if (szam.matches(regex) == false) {
                System.out.println("nem jó");
                System.exit(0);
            } else if (szam.matches(regex) == true) {
                System.out.println("tartalmazza");
                if (firstLetter == "1") {
                    PhoneNumber =  new KwakPhoneNumber();
                    return PhoneNumber;
                } else if (firstLetter == "8") {
                    PhoneNumber = new IkiPhoneNumber();
                    return PhoneNumber;
                } else if (firstLetter == "9") {
                    PhoneNumber = new McChipPhoneNumber();
                    return PhoneNumber;
                }
            }
              return PhoneNumber; //ez itt a fő kérdés, hogyan adjam vissza a megfelelő returnt
            }

    Ami statikus azért miért kell példányosítani?

  • sztanozs
    veterán

    Hogy lehetne megoldani, hogy if-else szerkezeten belül a megfelelő return hajtódjon végre?
    (A feladat szerint a String szam telefonszám bekérése után a megfelelő osztályba kerülünk, ahol további számítások vannak, de azt már megírtam.)

    private static PhoneNumber PhoneNumber;  //gyanítom erre is szükség lesz

    public static PhoneNumber create(String szam) {
            String regex = "\\d+";
            String firstLetter = String.valueOf(szam.charAt(0));
            if (szam.matches(regex) == false) {
                System.out.println("nem jó");
                System.exit(0);
            } else if (szam.matches(regex) == true) {
                System.out.println("tartalmazza");
                if (firstLetter == "1") {
                    PhoneNumber =  new KwakPhoneNumber();
                    return PhoneNumber;
                } else if (firstLetter == "8") {
                    PhoneNumber = new IkiPhoneNumber();
                    return PhoneNumber;
                } else if (firstLetter == "9") {
                    PhoneNumber = new McChipPhoneNumber();
                    return PhoneNumber;
                }
            }
              return PhoneNumber; //ez itt a fő kérdés, hogyan adjam vissza a megfelelő returnt
            }

    Ugyanaz a változónév mint az osztály neve? Nem sivít emiatt a fordító? Btw, ha nem megfelelő a formátum, akkor én simán dobnék egy exception-t.

  • axioma
    veterán

    Hogy lehetne megoldani, hogy if-else szerkezeten belül a megfelelő return hajtódjon végre?
    (A feladat szerint a String szam telefonszám bekérése után a megfelelő osztályba kerülünk, ahol további számítások vannak, de azt már megírtam.)

    private static PhoneNumber PhoneNumber;  //gyanítom erre is szükség lesz

    public static PhoneNumber create(String szam) {
            String regex = "\\d+";
            String firstLetter = String.valueOf(szam.charAt(0));
            if (szam.matches(regex) == false) {
                System.out.println("nem jó");
                System.exit(0);
            } else if (szam.matches(regex) == true) {
                System.out.println("tartalmazza");
                if (firstLetter == "1") {
                    PhoneNumber =  new KwakPhoneNumber();
                    return PhoneNumber;
                } else if (firstLetter == "8") {
                    PhoneNumber = new IkiPhoneNumber();
                    return PhoneNumber;
                } else if (firstLetter == "9") {
                    PhoneNumber = new McChipPhoneNumber();
                    return PhoneNumber;
                }
            }
              return PhoneNumber; //ez itt a fő kérdés, hogyan adjam vissza a megfelelő returnt
            }

    Egyreszt tipikus switch-case pelda az else if-ek helyett, ha mar tanultatok.
    Masreszt gyanus, hogy az altipusok konstruktorai nem kapjak meg a szam nevu stringet.
    Harmadreszt lehet egybol return new KwakPhoneNumber(szam);alakban. Vagy ha mar mindenkepp valtozoba is teszed (bar ez a jelen reszlet nem indokolja), akkor nem kell az adott agon vissza is adni, eleg az ahova odakommentelted... ami jelenleg nonreachable, az IDE nem jelzi neked? ja nem, akkor az jo, ha az az altalanos eset, de ott is kene akkor egy konstruktorhivas es a parameter megadasa.

    [Amugy az altipusok azok leszarmazottjai rendesen a PhoneNumbernek? Mert anelkul nem fog menni.]

  • Szmeby
    tag

    Hogy lehetne megoldani, hogy if-else szerkezeten belül a megfelelő return hajtódjon végre?
    (A feladat szerint a String szam telefonszám bekérése után a megfelelő osztályba kerülünk, ahol további számítások vannak, de azt már megírtam.)

    private static PhoneNumber PhoneNumber;  //gyanítom erre is szükség lesz

    public static PhoneNumber create(String szam) {
            String regex = "\\d+";
            String firstLetter = String.valueOf(szam.charAt(0));
            if (szam.matches(regex) == false) {
                System.out.println("nem jó");
                System.exit(0);
            } else if (szam.matches(regex) == true) {
                System.out.println("tartalmazza");
                if (firstLetter == "1") {
                    PhoneNumber =  new KwakPhoneNumber();
                    return PhoneNumber;
                } else if (firstLetter == "8") {
                    PhoneNumber = new IkiPhoneNumber();
                    return PhoneNumber;
                } else if (firstLetter == "9") {
                    PhoneNumber = new McChipPhoneNumber();
                    return PhoneNumber;
                }
            }
              return PhoneNumber; //ez itt a fő kérdés, hogyan adjam vissza a megfelelő returnt
            }

    Ha tudod, hogy az 1 a Kwak, 8 az Iki, és a 9 pedig McChip, akkor azt is illene tudnod, hogy az összes többi esetben (0, 2, 3, stb) micsoda. Nos, ezt a bizonyos new MicsodaPhoneNumber()-t fogod azokban az esetekben visszaadni. :)
    Mi a célja az első karakter szerinti szortírozásnak?

    Megj. 1: Stringeket ne hasonlíts össze egymással az == operátort használva, mert hibás eredményt kaphatsz, a String#equals() javasolt helyette. De akár maradhatott volna char is az a firstLetter. Mindezektől függetlenül a String#startsWith() picit átláthatóbbá tenné a kódot.

    Megj. 2: A System.exit() nem szép, ne nagyon szokd meg. Majd amikor tanulsz az Exception-ről, egy világ tárul ki előtted.

    Megj. 3: Az == true elhagyható. Az == false is, amennyiben használod a ! operátorral jelzett tagadást. Vagy egyszerűen else if helyett csak simán az else kifejezést használod (persze ez esetben meg kell cserélni a két külső blokkot, és a végén lesz a hibás formátum jelzése, de ez semmit nem változtat a működésen).

    Megj. 4: Jávában a változók neveit kisbetűvel kezdjük, ez egy ilyen konvenció.

    Megj. 5: Ha megfigyeled, hogy minden if blokkod ugyanúgy végződik (return phoneNumber;), akkor felmerülhet a gondolat, hogy felesleges annyiszor megismételni azt, elegendő az összes if blokk mögött elhelyezni, csupán egyszer, az eredmény ugyanaz lesz.

  • mobal
    nagyúr

    Valaki elmagyarázná nekem (valami egyszerűbb példán keresztül), hogy mik a factory metódusok, és mire használjuk őket? Előre is köszönöm! :R

  • axioma
    veterán

    Sziasztok.

    Hogy lehet egyik osztály függvényéből átadni értéket egy másik osztály függvényének?

    Jelen esetben:

    Innen szeretném

    public class Ital {
    String nev;
    double szazalek;
    int ml;

    public double getAlkoholGramm() {
    return 0.8*ml*szazalek/100.0;
    }
    }

    a getAlkoholGramm() függvény értékét átadni a veralkoholEzrelek() függvénynek:

    public class Ember {
    String nev;
    int kilogramm;
    double alkoholGramm;

    public double veralkoholEzrelek() {
    return alkoholGramm / kilogramm;
    }
    }

    Ha a veralkoholEzrelek()-be beleírom, hogy alkoholGramm = Ital.getAlkoholGramm(); , akkor pedig ezt az üzenetet írja ki NetBeans: non-static method getAlkoholGramm() cannot be referenced from a static context

    Tudnátok segíteni, hogy mi a gond és hogyan lehet megoldani? Előre is köszönöm! :R

    A gond ott kezdodik (bocs, nem bantas, hanem segitseg akar lenni), hogy mas az osztalydefinicio es mas a peldany.
    Menjunk vissza, mi a cel? Lesznek ember-peldanyaid, meg ital-peldanyaid, es az a kerdes, hogy ha megissza egy emberpeldany az italt, mi a(z uj) veralkohol-szintje. Vagy az jobban illik az eddigi kododhoz, hogy ha meginna, mennyivel emelne a veralkohol-szintjet.

    Szoval a lenyeg, hogy a fenti, nevezzuk inkabb verezrelekNoveles() fuggvenyednek kene egy Ital tipusu parametert definialni, es az adott ital-peldanytol elkerni a megfelelo adatot.

    public double verezrelekNoveles(Ital egyital) {
    return egyital.getAlkoholGramm() / kilogramm;
    }

    Az elnevezes most direkt ilyen "kilogo", hogy jobban lasd a kulonbseget, de nem kovetendo.

    szerk. lassu vagyok... keresztposzt

  • Zsoxx
    őstag

    Sziasztok.

    Hogy lehet egyik osztály függvényéből átadni értéket egy másik osztály függvényének?

    Jelen esetben:

    Innen szeretném

    public class Ital {
    String nev;
    double szazalek;
    int ml;

    public double getAlkoholGramm() {
    return 0.8*ml*szazalek/100.0;
    }
    }

    a getAlkoholGramm() függvény értékét átadni a veralkoholEzrelek() függvénynek:

    public class Ember {
    String nev;
    int kilogramm;
    double alkoholGramm;

    public double veralkoholEzrelek() {
    return alkoholGramm / kilogramm;
    }
    }

    Ha a veralkoholEzrelek()-be beleírom, hogy alkoholGramm = Ital.getAlkoholGramm(); , akkor pedig ezt az üzenetet írja ki NetBeans: non-static method getAlkoholGramm() cannot be referenced from a static context

    Tudnátok segíteni, hogy mi a gond és hogyan lehet megoldani? Előre is köszönöm! :R

    Csak statikus metódust tudsz meghívni osztálynévvel (Ital.getAlkoholGramm()).
    Példányosítani kell az Ital osztályt, és azon a példányon meghívni a getAlkoholGramm() metódust.

  • axioma
    veterán

    Nekem még így sem jó:

    Kérem a diák nevét!
    Szabó István
    Kérem a diák születési évét!
    1996
    Kérem a diák átlagát!
    3.4
    Exception in thread "main" java.util.InputMismatchException
    at java.util.Scanner.throwFor(Scanner.java:864)
    at java.util.Scanner.next(Scanner.java:1485)
    at java.util.Scanner.nextDouble(Scanner.java:2413)
    at diakteszt.Diakteszt.beker(Diakteszt.java:19)
    at diakteszt.Diakteszt.main(Diakteszt.java:28)
    C:\Users\Vesp\AppData\Local\NetBeans\Cache\8.2\executor-snippets\run.xml:53: Java returned: 1
    BUILD FAILED (total time: 18 seconds)

    Szerk.: igazad van, az instance volt a probléma, kivettem és így már rendesen kiírta. Az átlagot viszont csak vesszővel fogadta el.

    Nagyon köszönöm a gyors segítséget!

    Asszem 6-os de lehet hogy 7-es ota mar az op.rdsz szerinti tizedes-jelet hasznalja (volt is baj a magyar gepeken futtatott, float szamokat vesszovel osszefuzve hasznalo programnal, visszaparse-nal 2x annyi int lett belole...)

  • sztanozs
    veterán

    Sziasztok!

    Adott ez a kód:

    package diakteszt;

    import java.util.Scanner;

    public class Diakteszt {

    String nev;
    int szuletesiEv;
    double atlag;

    public void beker() {
    Scanner sc = new Scanner(System.in);
    Diakteszt bekert = new Diakteszt();
    System.out.println("Kérem a diák nevét!");
    bekert.nev = sc.nextLine();
    System.out.println("Kérem a diák születési évét!");
    bekert.szuletesiEv = sc.nextInt();
    System.out.println("Kérem a diák átlagát!");
    bekert.atlag = sc.nextDouble();
    }

    public void kiir() {
    System.out.println(nev + " (" + szuletesiEv + "; " + atlag + ")");
    }

    public static void main(String[] args) {
    Diakteszt bekert = new Diakteszt();
    bekert.beker();
    bekert.kiir();
    }
    }

    Lefuttatva viszont nem jeleníti meg a bevitt adatokat:

    Kérem a diák nevét!
    Szabó István
    Kérem a diák születési évét!
    1996
    Kérem a diák átlagát!
    3,4
    null (0; 0.0)
    BUILD SUCCESSFUL (total time: 15 seconds)

    Tuti valami kis apróságon csúszok el, de fogalmam sincs, mi lehet vele a probléma. Tudnátok segíteni?

    3,4 (tizedes vesszővel) nem megfelelő double reprezentáció. Ha 3.4-et (tizedes ponttal) adtál volna meg, akkor megjelenítette volna.

    Ja és a nagyobb probléma, hogy beker-ben nem kell új instance, mert nem a jelen instance-ra állítod be a változókat, hanem az újonnan létrehozottra:

    public void beker() {
    Scanner sc = new Scanner(System.in);
    System.out.println("Kérem a diák nevét!");
    nev = sc.nextLine();
    System.out.println("Kérem a diák születési évét!");
    szuletesiEv = sc.nextInt();
    System.out.println("Kérem a diák átlagát!");
    atlag = sc.nextDouble();
    }

  • Lortech
    addikt

    Még csak most ismerkedek a Javaval és rögtön felmerült egy kérdés: mit jelent, hogy a void metódusnak nincs visszatérési értéke? Találtam magyarázatokat, de egyszerűen nem értem. Valaki el tudná magyarázni röviden, érthetően?

    Amikor deklarálsz egy metódust, mindig meg kell adni a visszatérési értékének típusát vagy a voidot.

    Vegyünk két metódust:
    void m1() {
    }

    String m2() {
    return "visszatérési érték";
    }

    m1 void, ami azt jelenti, hogy nincs visszatérési értéke, azaz a metódus hívás nem használható olyan kontextusban, ahol egy értéket várunk.

    pl.
    String x = m1(); //hibás, mert m1 nem tér vissza értékkel.
    System.out.println(m1()); //hibás, mert m1 nem tér vissza értékkel.

    x = m2(); // ok, x értéke "visszatérési érték" lesz

    Ugyanígy m1 metódus törzsében nem adhatsz meg pl. return "xyxy"; utasítást, mert nem térhetünk vissza értékkel, ellenben megadhatunk return; utasítást, amivel jelezzük, hogy adott ponton térjen vissza a metódus (visszatérési érték nélkül).
    pl.
    void m1() {
    return "xyxy"; //hiba
    return; //ok, de nem kötelező, itt felesleges
    }

  • kispx
    addikt

    Sziasztok!

    Szeretnék Java-t tanulni, de előtte természetesen szeretném megtanulni a programozás alapjait, mivel mindenhol azt olvasom, hogy enélkül nem fog menni. Viszont konkrétan nem tudom, hol kezdjem.
    Az Agyhullám Java könyvből meg tudom tanulni az alapokat?
    Visszaolvastam a topicot is, amikor mások is hasonlókat kérdeztek, de nem találtam választ ezekre a kérdésekre. (Vagy csak átsiklottam felettük.)
    Tudnátok ebben segíteni? Akár konkrét könyvekkel, vagy oldalakkal, stb.

    Előre is köszönöm!

Új hozzászólás Aktív témák