SWiSH Forum
Forum użytkowników programów SWiSH

Podstawy języka skryptowego - Lekcja 21. Instrukcja warunkowa if () else

roland - Sro 28 Wrz, 2005 09:46
Temat postu: Lekcja 21. Instrukcja warunkowa if () else
Jak zapewne zwróciłeś już uwagę w poprzedniej lekcji, instrukcja warunkowa if () jest małe efektywna gdy zachodzi potrzeba sprawdzenia wielu warunków. Wymaga za każdym razem podania nowego warunku do sprawdzenia. Jednak w przypadku pojedynczego warunku, zawsze zachodzi sytuacja, że może on być prawdziwy bądź też nie.
Rozpatrzymy to na przykładzie sprawdzającym, czy wartość zmiennej x wynosi na przykład 1:
Kod:
onLoad () {
    x=1;
    if (x==1) {
        trace("Zmienna x ma wartość 1");
    }
    if (x<>1) {
        trace("Zmienna x ma wartość różną od 1");
    }   
}

Powyższy skrypt dwa razy sprawdza wartość zmiennej x. Za pierwszym razem polecenie trace() zostanie wykonane gdy zmienna x będzie równa 1. Za drugim razem będziemy brali pozostałe przypadki, to znaczy gdy x będzie różne od 1. Zamiast jednak tak jak w powyższym skrypcie dwa razy sprawdzać bardzo podobne warunki, można wykorzystać odmianę infrakcji warunkowej if (), stosując polecenie else, które wykona kod tylko w przypadku gdy warunek okaże się nieprawdziwy.
Oto ten sam przykład, ale z wykorzystaniem else:
Kod:
onLoad () {
    x=1;
    if (x==1) {
        trace("Zmienna x ma wartość 1");
    } else {
        trace("Zmienna x ma wartość różną od 1");
    }
}


Składnia takiej instrukcji warunkowej jest następująca:
if (warunek) {
instrukcjeP
} else {
instrukcjeF
}

gdzie:
    • warunek – jest zapisem warunku który instrukcja sprawdza,
    • instrukcjeP – są instrukcjami do wykonania w przypadku prawdziwego warunku,
    • instrukcjeF – są instrukcjami do wykonania gdy warunek okaże się fałszywy.

Zwróć uwagę, że instrukcja warunkowa if () else wykona zawsze tylko jeden zestaw instrukcji, albo ten dla spełnionego warunku, albo ten dla fałszywego.

Można także zastosować jeszcze inną odmianę instrukcji warunkowej if (), pozwalającej sprawdzić więcej niż jeden warunek. Ogólna konstrukcja wygląda następująco:
if (warunek1) {
instrukcjeP
} else if (warunek2) {
instrukcjeFP
} else {
instrukcjeFF
}

Jeżeli warunek1 zostanie spełniony to zostanie wykonany zestaw instrukcjiP. W przeciwnym razie zostanie sprawdzony warunek2, a gdy ten będzie prawdziwy to zostanie wykonany zestaw instrukcjiFP. InstrukcjeFF zostaną więc wykonane jedynie wtedy, gdy oba warunki okażą się fałszywe.

Przypomnijmy sobie ostatni skrypt z poprzedniej lekcji:
Kod:
on (press) {
    if (Number(Liczba.text)<Losowa) {
        Odpowiedz.text="Za mało";
    }
    if (Number(Liczba.text)>Losowa) {
        Odpowiedz.text="Za dużo";
    }
    if (Number(Liczba.text)==Losowa) {
        Odpowiedz.text="Zgadłeś. Możesz zagrać ponownie";
        Losowa=Math.randomInt(101);
    }
}

Można go zapisać w bardziej uproszczonej postaci:
Kod:
on (press) {
    if (Number(Liczba.text)<Losowa) {
        Odpowiedz.text="Za mało";
    } else if (Number(Liczba.text)>Losowa) {
        Odpowiedz.text="Za dużo";
    } else {
        Odpowiedz.text="Zgadłeś. Możesz zagrać ponownie";
        Losowa=Math.randomInt(101);
    }
}

_Pablo_ - Czw 19 Cze, 2008 11:27

Przepraszam że się wcinam. Można jeszcze szybszy sposób napisać ten skrypt Ale i tak nie ma znaczenia przy tak małych skryptach
Kod:
on (press) {
    if (Number(Liczba.text) != Losowa){
       if (Number(Liczba.text) < Losowa) Odpowiedz.text="Za mało";
       else Odpowiedz.text="Za dużo";
    }   else (Number(Liczba.text) == Losowa) {
        Odpowiedz.text="Zgadłeś. Możesz zagrać ponownie";
        Losowa=Math.randomInt(101);
    }
}

roland - Sob 21 Cze, 2008 09:22

_Pablo_ napisał/a:
Przepraszam że się wcinam.

Bardzo dobrze, że się "wcinasz". Gdyby nigdy nikt się nie "wcinał" nie byłoby pojęcia optymalizacji algorytmów.
_Pablo_ napisał/a:
Można jeszcze szybszy sposób napisać ten skrypt Ale i tak nie ma znaczenia przy tak małych skryptach

I tu się mylisz. Najczęściej największy zysk w wykonywaniu programu uzyskuje się w małych skryptach, ale często wykonywanych (np. Sito Eratostenesa). Dlatego zawsze staram się zwracać uwagę na optymalizację kodu ("Czego Jaś się nie nauczy,...")

W podanym przez Ciebie kodzie był błąd. Podaję ten kod po usunięciu błędu (brakowało if po else):

Kod:
on (press) {
    if (Number(Liczba.text) != Losowa) {
        if (Number(Liczba.text) < Losowa) {
            Odpowiedz.text="Za mało";
        } else {
            Odpowiedz.text="Za dużo";
        }
    } else if (Number(Liczba.text) == Losowa) {
        Odpowiedz.text="Zgadłeś. Możesz zagrać ponownie";
        Losowa=Math.randomInt(101);
    }
}


Jednak nie zgadzam się, aby Twój skrypt był szybszy. W Twoim skrypcie jest 7 poleceń do wykonania (zaznaczam je na czerwono):

on (press) {
if (Number(Liczba.text) != Losowa) {
if (Number(Liczba.text) < Losowa) {
Odpowiedz.text="Za mało";
} else {
Odpowiedz.text="Za dużo";
}
} else if (Number(Liczba.text) == Losowa) {
Odpowiedz.text="Zgadłeś. Możesz zagrać ponownie";
Losowa=Math.randomInt(101);
}
}

W moim skrypcie poleceń jest 6:
on (press) {
if (Number(Liczba.text)<Losowa) {
Odpowiedz.text="Za mało";
} else if (Number(Liczba.text)>Losowa) {
Odpowiedz.text="Za dużo";
} else {
Odpowiedz.text="Zgadłeś. Możesz zagrać ponownie";
Losowa=Math.randomInt(101);
}
}

Ponadto, w moim skrypcie są tylko 3 instrukcje warunkowe (if, else oraz else if), a w Twoim 4

_Pablo_ - Sob 21 Cze, 2008 22:59

Tylko powiedz mi, jak będzie taka sytuacja, że użytkownik poda poprawną liczbę to ile będzie sprawdzać warunków w Twoim algorytmie a w moim??
W Twoim sprawdzi dwa warunki a u mnie tylko jeden.
A przypadku gdy liczba podana przez użytkownika różni się od wylosowanej w moim algorytmie są sprawdzane dwa albo trzy warunki.


A co do błędu który popełniłem to się zgadza nie zauważyłem. Za dużo skopiowałem po else nie może być żadnego warunku.

roland - Pon 23 Cze, 2008 07:44

_Pablo_ napisał/a:
Tylko powiedz mi, jak będzie taka sytuacja, że użytkownik poda poprawną liczbę to ile będzie sprawdzać warunków w Twoim algorytmie a w moim??
W Twoim sprawdzi dwa warunki a u mnie tylko jeden.
A przypadku gdy liczba podana przez użytkownika różni się od wylosowanej w moim algorytmie są sprawdzane dwa albo trzy warunki.


Są trzy warianty (instrukcje warunkowe/warunki):
1. Użytkownik od razu trafił:
u mnie (3/2); u Ciebie (2/2)

2. Użytkownik podał za dużą wartość:
u mnie (2/2); u Ciebie (3/2)

3. Użytkownik podał za małą wartość:
u mnie (1/1); u Ciebie (2/2)

Jedyna przewaga w Twoim kodzie, to wtedy gdy użytkownik poda poprawną wartość. Są wykonywane tylko dwie instrukcje, a nie jak piszesz "tylko jedna":
- pierwsza: if (Number(Liczba.text) != Losowa)
- druga: else if (Number(Liczba.text) == Losowa)

Gdybyś jednak zmodyfikował drugą instrukcję warunkową do zapisu:
else
wtedy miałbyś (2/1), czyli zysk o jeden warunek.
W pozostałych przypadkach, byłoby bez zmian: (3/2) – gdy za dużo – oraz (2/2) – gdy za mało

W tych pozostałych dwóch przypadkach mój algorytm zadziała szybciej. A ilość prób nietrafionych będzie znacznie większa od próby trafionej. Dlatego też w moim algorytmie zaczynam od nich, aby program je szybciej wykonywał.


Powered by phpBB modified by Przemo © 2003 phpBB Group