Gyakorlati alapok

Dönteni kell! (if - else)

 

A számítógép nemcsak számolni képes, hanem dönteni is és ez óriási lehetőségeket nyitott meg az informatikában. Erről részletesen írok Az algoritmus fogalma című fejezetben.

 

Mindennapi életünk során napjában rengetegszer kell döntenünk. Például ha piros a lámpa, várakoznom kell és csak zöld lámpa esetén léphetek le a járdáról. Nézzük meg ezt a döntési kényszert pszeudokód formájában:

 

HA(lámpa == piros){

    várakozás();

    }

    MÁSKÉNT

            séta();

 

A döntés kényszerét néha mindannyian átérezzük: ennek során válaszutak elé érkezünk, ahonnan többféle (de minimum 2) út vezet tovább:

 

www.informatika-programozas.hu

 

A döntés kényszere során feltételek merülnek fel, valójában ezen feltételek határozzák meg, hogy melyik utat választjuk (nevezik ágaknak is).

 

www.informatika-programozas.hu - Ezt most meg kell tanulni!

 

A választás után csakis az egyik úton-ágon mehetünk tovább. Programozás-technikailag ekkor csakis az egyik ág kerül végrehajtásra.

 

Mindez a Java-nyelvben nagyon egyszerűen megfogalmazható:

 

if(feltételek){

        akkor ez történik;

     }

    else

        ez történik;

 

Programozás-technikailag sok, további lehetőségünk van. Például több feltételből válogathatunk...

 

if(1. feltétel){

        akkor ez történik;

     }

else if(2. feltétel){

        akkor ez történik;

     }

else if(3. feltétel){

        akkor ez történik;

     }

    else

        ez történik;

 

...ám ebben az esetben valójában több választási utunk-águnk keletkezik.

 

www.informatika-programozas.hu

 

Gyakran nemcsak 1 feltétel, hanem 2 vagy több egyidejű feltétel teljesülése szükséges a döntéshez. Például a fenti, gyalogátkelős döntési mechanizmust csak naiv gyalogosok futtatják le magukban, a tapasztaltak önmaguk védelmében további feltételeket is beiktatnak (zöldben is körülnéznek, hogy nem jön-e autó):

 

HA(lámpa == piros){

    várakozás();

    }

MÁSKÉNT HA(lámpa == zöld ÉS láthatóAutó != 0){

    várakozás();

    }

MÁSKÉNT

            séta();

 

Ezzel szemben mit csinál a felelőtlen diák?

 

HA(láthatóAutó != 0 ÉS láthatóRendőr != 0){

    várakozás();

    }

MÁSKÉNT

            futás();

 

Elméletileg bármennyi else if águnk lehet, de ne felejtsük el, hogy ekkor mindegyikhez feltételt is kell hozzárendelnünk, ami adott mennyiség után roppant számításigényes vagy egyszerűen értelmetlen. Az alábbi, félkész, valójában jó, de önmagában NEM futtatható Java-kódban 12 db else if ágat láthatunk, amely kód része egy készülő zenei projektnek:

 

public static int [] KonverterToBinary(String hangNev){
//0c, 1c#, 2d, 3d#, 4e, 5f, 6f#, 7g, 8g#, 9a, 10a#, 11h
int [] tomb = new int[12];

for(int i = 0; i < tomb.length; i++){
    tomb[i] = 0;
}

for(int i = 0; i < hangNev.length(); i++){
    int j = i;
    if (hangNev.length() > (i+1)) {
        j = i+1;
    }

    char karakter = hangNev.charAt(i);
    char karakterNext = hangNev.charAt(j);

    if(karakter == 'c' && karakterNext == '#'){
        tomb[1] = 1;
    }
    else if(karakter == 'c'){
        tomb[0] = 1;
    }

    else if(karakter == 'd' && karakterNext == '#'){
        tomb[3] = 1;
    }
    else if(karakter == 'd'){
        tomb[2] = 1;
    }

    if(karakter == 'e' && karakterNext == '#'){
        tomb[5] = 1;
    }
    else if(karakter == 'e'){
        tomb[4] = 1;
    }

    else if(karakter == 'f' && karakterNext == '#'){
        tomb[6] = 1;
    }
    else if(karakter == 'f'){
        tomb[5] = 1;
    }

    else if(karakter == 'g' && karakterNext == '#'){
        tomb[8] = 1;
    }
    else if(karakter == 'g'){
        tomb[7] = 1;
    }

    else if(karakter == 'a' && karakterNext == '#'){
        tomb[10] = 1;
    }
    else if(karakter == 'a'){
        tomb[9] = 1;
    }

    else if(karakter == 'h'){
        tomb[11] = 1;
        }
    }

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

    return tomb;
}
 

Demonstrációképpen az alábbi, futtatható Java-kódban egy többszörös feltétel leprogramozását tanulmányozhatjuk. A szökőév kiszámítása ugyanis több, egyidejű feltétel teljesülését kívánja meg:

 

www.informatika-programozas.hu - Futtatható Java-kód!

 

 

 

 

 

 

 

 

import java.util.Scanner;
 
public class Main {
public static void main(String[] args) {
    int ev = 0;
    Scanner scanner = new Scanner (System.in);
    System.out.println ("Kérem, hogy adja meg az évszámot!");
    String elem = scanner.nextLine();
    ev = Integer.parseInt(elem);
    if ((ev > 1582) && (ev % 4 == 0) && (ev % 100 != 0) || (ev % 400 == 0)){
        System.out.println ("Az év szökőév.");
    }
    else
        System.out.println ("Az év NEM szökőév.");
    }
}

 

Végül fontos kihangsúlyoznunk, hogy a feltételek megszabásának nyilvánvalóan belső logikát kell tükröznie. Például ha nem szeretünk repülni, mert félünk a lezuhanástól, akkor ez egy emberileg érthető és logikus feltétel:

 

HA(halálFélelem == TRUE){

    UtazásVonattal();

    }

    MÁSKÉNT

            UtazásRepülővel();

 

Ha azonban azért nem szállunk repülőgépre, mert cipőméretünk nagyobb 44-nél, akkor a súlyos belső logikátlanságon felül őrültek is vagyunk, ugyanis csakis ők mondanak ilyeneket:

 

HA(cipőMéret > 44){

    UtazásVonattal();

    }

    MÁSKÉNT

            UtazásRepülővel();

 

www.informatika-programozas.hu - Házi feladat

 

Házi feladat I. - A Boolean című fejezetben ismertetett alkonykapcsoló analógiájára "építsünk" egy egyszerű esőérzékelőt!

 

A megoldás fejezete a képre kattintva érhető el.

 

 

www.informatika-programozas.hu - Házi feladat

 

Házi feladat II. - Adott egy egyszerű int típusú szám. Állapítsuk meg, hogy a szám pozitív, negatív vagy 0!

 

A megoldás fejezete a képre kattintva érhető el.