SWiSH Forum Strona Główna SWiSH Forum
Forum użytkowników programów SWiSH

FAQFAQ  SzukajSzukaj  UżytkownicyUżytkownicy  GrupyGrupy  StatystykiStatystyki
RejestracjaRejestracja  ZalogujZaloguj  DownloadDownload

Poprzedni temat «» Następny temat
Lekcja 21. Instrukcja warunkowa if () else
Autor Wiadomość
roland 
Site Admin
Roland Zimek



Wersja SWiSH: Max4
Pomógł: 31 razy
Wiek: 58
Dołączył: 21 Sty 2005
Posty: 424
Skąd: Opole
Wysłany: Sro 28 Wrz, 2005 08:46   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_ 
Bywalec


Dołączył: 05 Maj 2007
Posty: 11
Skąd: Mstów
Wysłany: Czw 19 Cze, 2008 10: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);
    }
}
_________________
http://www.nissanklub.pl/
 
     
roland 
Site Admin
Roland Zimek



Wersja SWiSH: Max4
Pomógł: 31 razy
Wiek: 58
Dołączył: 21 Sty 2005
Posty: 424
Skąd: Opole
Wysłany: Sob 21 Cze, 2008 08: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_ 
Bywalec


Dołączył: 05 Maj 2007
Posty: 11
Skąd: Mstów
Wysłany: Sob 21 Cze, 2008 21: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.
_________________
http://www.nissanklub.pl/
 
     
roland 
Site Admin
Roland Zimek



Wersja SWiSH: Max4
Pomógł: 31 razy
Wiek: 58
Dołączył: 21 Sty 2005
Posty: 424
Skąd: Opole
Wysłany: Pon 23 Cze, 2008 06: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ł.
 
     
Wyświetl posty z ostatnich:   
Odpowiedz do tematu
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Nie możesz załączać plików na tym forum
Możesz ściągać załączniki na tym forum
Dodaj temat do Ulubionych
Wersja do druku

Skocz do:  


Powered by phpBB modified by Przemo © 2003 phpBB Group
Nowe zasady dotyczące cookies. Wykorzystujemy pliki cookies, aby nasz serwis lepiej spełniał Państwa oczekiwania. Można zablokować zapisywanie cookies, zmieniając ustawienia przeglądarki.
         
Strona wygenerowana w 0.59 sekundy. Zapytań do SQL: 13