|
SWiSH Forum
Forum użytkowników programów SWiSH
|
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ł. |
|
|
|
|
|
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
|
|
|
|
|
|
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.17 sekundy. Zapytań do SQL: 13 |
|
|