04-Jack és Jane a kocsmában

Eddig már nagyon sok rizsát olvastál az OOP-ről, itt az idő kipróbálni a gyakorlatban! Gondolom, ilyen pár soros "számoljuk ki a téglalap kerületét-területét" programok nem okoznak meglepetést. De vajon hogyan oldanád meg a következő feladatot?

Jack és Jane elmentek a kocsmába. Mindegyik iszogat: sört, bort, pálinkát, amiknek más-más alkohol koncentrációja (azaz erőssége van). Jack ha már annyit ivott, hogy összesen 1.2 deci nyers alkohol került a szervezetébe, kidől. Hasonlóképpen Jane 1 deci nyers alkohol fogyasztása után helyezkedik órás-pozícióba.

Ki fog előbb kidőlni, ha isznak mindenféle sorrendben, pld:

Mi ebben a nehéz?

Gondolom most azért picit kényelmetlenül érzed magad. Emberként a fent vázolt folyamatot tökéletesen megérted, el tudod képzelni. Eddig programokat is csináltál. De vajon miért nem lehet könnyen programként megfogalmazni a feladatot?

Elárulom a titkot: eddig nagyon triviális dolgokat programoztunk. Az SOS-ező led triviális dolog, hiszen ott csak egymás után kell írni, hogy mi történjen. A téglalap kerület-terület meg azért triviális, mert egy egszerű matek képletet kell leírni.

Azonban, nincs egyszerű matek képlet a kocsmázásra.

Most gondolkodni kell.

Például, egy sör az 5 deci, és általában 5% alkohol tartalma van, tehát egy sör megivása után 5*0.05 deci alkohol kerül Jack-be. Lehetne Jack egy változó, hiszen csak arra vagyunk kíváncsiak, hogy mennyit ivott.

Emlékszel még a változókra és a változó típusokra, igaz? Az int egész számokat tartalmaz, míg a double tud tört számokkal is számolni. Mivel itt sok sok tizedes jegyünk lesz, ezért double-t használunk.

Csinálj egy új projektet és egy Kocsma nevű osztályt, és akkor próbáljuk meg matematikai módon megoldani a problémát!

public class Kocsma {

    public static void main(String[] args) {
        double jack=0;
        double jane=0;

        jack+=5*0.05; // egy sör
        jack+=5*0.05; // második sör
        jane+=0.5*0.40; // egy pálinka
        jack+=0.5*0.40; // egy pálinka
        jack+=0.5*0.40; // még pálinka
        jane+=1*0.12; // egy bor

        System.out.println("Jack "+jack+" deci alkoholt tartalmaz.");
        System.out.println("Jane "+jane+" deci alkoholt tartalmaz.");
    }

}

Őőő, hát izé. Valamit számolunk, és a végén ki tudjuk írni, hogy ki hol tart, oké.

De vajon hogyan lehet kitalálni, hogy mikor dőltek ki? Ehhez minden ivás után ellenőrizni kellene az alkohol szintjüket!

public class Kocsma {

    public static void main(String[] args) {
        double jack=0;
        double jane=0;

        jack+=5*0.05; // egy sör
        if (jack > 1.2) {
            System.out.println("Jack kidőlt!");
        }

        jack+=5*0.05; // második sör
        if (jack > 1.2) {
            System.out.println("Jack kidőlt!");
        }

        jane+=0.5*0.40; // egy pálinka
        if (jane > 1) {
            System.out.println("Jane kidőlt!");
        }

        jack+=0.5*0.40; // egy pálinka
        if (jack > 1.2) {
            System.out.println("Jack kidőlt!");
        }

        jack+=0.5*0.40; // még pálinka
        if (jack > 1.2) {
            System.out.println("Jack kidőlt!");
        }

        jane+=1*0.12; // egy bor
        if (jane > 1) {
            System.out.println("Jane kidőlt!");
        }

        System.out.println("Jack "+jack+" deci alkoholt tartalmaz.");
        System.out.println("Jane "+jane+" deci alkoholt tartalmaz.");
    }

}

Jóó, de mi van, ha nem csak ketten isznak, hanem mondjuk Jim is csatlakozik?

Akkor mindezt újra meg kell csinálni, új változó, új szorzások, új ellenőrzések.

Vajon meg tudjuk csinálni ezt egy egész karácsonyi buli méretben? Mondjuk 400 emberrel? Hááát, lesz egy kis gépelési gyakorlat, az biztos!

No és mi van, ha egy picit csavarunk még a feldataton? A játéknak akkor is vége, ha valaki túl sok folyadékot ivott, és emiatt pisilnie kell menni. 1 liter folyadék után pisiszünet. Na ezt hogyan fogjuk lekódolni? Ekkor már minden emberhez két változó kell, egyik az alkoholt, a másik a folyadékot tárolja, és az egész kódot 400-szor le kell írni, 400 x 2, azaz 800 változó használatával a karácsonyi buli mérethez...

Nos, ez így nem fog menni. Más hozzáállásra van szükségünk.