W poprzednim poście Zmienne typu logicznego poznaliśmy zmienne i operatory logiczne. Dziś dowiemy się, jak za ich pomocą sterować przebiegiem wykonania naszego programu komputerowego. Porozmawiamy trochę o tak zwanych instrukcjach sterujących.

Jako programiści mamy do dyspozycji kilka instrukcji sterujących przebiegiem wykonania naszego programu. Jeżeli porównamy program komputerowy do biegania, to każdy bieg początek i koniec. Program komputerowy także ma swój początek, musi się gdzieś rozpocząć i gdzieś zakończyć. I do tej pory nasze przykładowe programy wyglądały jak krótki sprint: od startu do mety biegliśmy po linii prostej.

Untitled Diagram (4)
Wykonanie programu bez (po lewej) oraz z (po prawej) wykorzystaniem instrukcji sterujących

Za pomocą instrukcji sterujących możemy zamienić nasz program ze sprintu w bieg na orientację z różnymi zakrętami, skrzyżowaniami oraz pętlami. Przyznasz, że dzięki nim przebieg naszego programu staje się ciekawszy 🙂 Poniżej przedstawiłem przegląd dostępnych instrukcji sterujących wraz z krótkim opisem.

Dla różnych języków programowania składnia poszczególnych instrukcji może się trochę różnić, ale ogólna zasada ich działania jest taka sama.

Wcześniejsze przykłady były w języku Java, dziś przechodzimy na język JavaScript. Różni się on trochę od języka Java. Na przykład definicja zmiennej odbywa się za pomocą słówka „var”, od angielskiego variable czyli „zmienna”.

Instrukcja warunkowa IF (ang. jeżeli):

Dzięki niej możemy spowodować, że pewna część naszego programu wykona się tylko jeżeli spełniony jest pewien warunek. Jeżeli jest on spełniony, część programu znajdująca się wewnątrz instrukcji warunkowej IF wykona się. Jeżeli warunek ten jest niespełniony, kod ten się nie wykona.

var liczba = 4;
if(liczba == 4)
{
    console.log('liczba jest rowna 4');
};

Jak widzimy mamy instrukcję IF, która sprawdza wartość zmiennej „liczba”. I tylko jeśli zmienna „liczba” ma wartość 4 zostanie wykonana zawartość instrukcji IF i zostanie wyświetlony napis „liczba jest rowna 4”.

Jest to najprostsza forma instrukcji IF. Możemy ją trochę rozbudować i wykonać inną operację (inny kawałek kodu) w sytuacji przeciwnej, gdy warunek NIE zostanie spełniony. Do tego służy instrukcja ELSE (ang. w przeciwnym wypadku).

    var liczba = 5;
    if(liczba == 4)
    {
        console.log('liczba jest rowna 4');
    }
    else
    {
        console.log('to nie jest 4');
    };

Teraz wartość zmiennej „liczba” jest różna od 4, więc zostanie wyświetlony napis „to nie jest 4”. Czyli instrukcja ELSE jest wykonywana jeżeli warunek jest niespełniony. Co więcej, możemy sprytnie łączyć ze sobą kilka instrukcji IF i w każdej sprawdzać inny warunek. Na końcu zaś wykonać kod, który jest przeznaczony dla wszystkich innych (nie uwzględnionych przez nas) przypadków. Ważne jest żeby ELSE było na samym końcu naszej złożonej instrukcji.

    var liczba = 5;
    if(liczba == 4)
    {
        console.log('liczba jest rowna 4');
    }
    else if(liczba == 5)
    {
        console.log('liczba jest rowna 5');
    }
    else
    {
        console.log('to jakas inna liczba');
    };

Zostanie wykony kod, który znajduje się w pierwszym spełnionym warunku a wszystkie inne warunki w danej instrukcji sterującej zostaną pominięte. Także należy pamiętać, że ważna tutaj jest kolejność sprawdzanych warunków i dobrze jest trzymać się zasady, żeby najpierw pisać te najbardziej szczegółowe warunki, które nas interesują.

Jeżeli chcemy jednak, aby spełnione zostały dwa warunki, możemy jeden z nich przenieść do kolejnej instrukcji IF.

Instrukcja warunkowa SWITCH (ang. przełącznik):

Bardzo podobną instrukcją do IF jest SWITCH. Dzięki niej również możemy wykonać kod w zależności od spełnienia konkretnych warunków. Ma jednak inną składnię.

    var liczba = 4;
    switch(liczba)
    {
        case 4:
            console.log('liczba to 4');
            break;
        case 5:
            console.log('liczba to 5');
            break;
        default:
            console.log('jakas inna liczba');
    };

Widzimy, że na samym początku określamy którą zmienną będziemy sprawdzać. Sprawdzany jest warunek równości („==”) i rozważamy różne przypadki (ang. CASE). Jeżeli dany warunek zostanie spełniony, kod poniżej zostanie wykonany. Na samym końcu (gdy nie zostanie spełniony żaden warunek) zostanie wykonany przypadek domyślny (ang. DEFAULT). Czyli to taki ELSE dla SWITCHa.

Tutaj również ważna jest kolejność sprawdzanych warunków oraz instrukcja BREAK (ang. przerwij), która mówi że należy już wyjść z tej instrukcji (SWITCH). Jeżeli zapomnimy gdzieś dodać na końcu BREAK, to będą wykonane kolejne instrukcje aż do domyślnego (albo do pierwszego napotkanego BREAK). Czasami jednak takie zachowanie jest prawidłowe, bo np. chcemy wykonać ten sam kod dla kilku różnych warunków:

    var liczba = 4;
    switch(liczba)
    {
        case 4:
        case 5:
            console.log('liczba to 4 lub 5');
            break;
        default:
            console.log('jakas inna liczba');
    };

W instrukcji SWITCH możemy sprawdzać różne zmienne, ale różne języki programowania mogą mieć różne ograniczenia na typ zmiennych. Dodatkowo instrukcja SWITCH nie jest dostępna w każdym języku programowania. Na przykład język Python jej nie posiada. Pamiętaj, że każdą instrukcję typu SWITCH możesz zastąpić instrukcją typu IF > ELSE IF > ELSE 🙂

Pętla FOR (ang. dla):

Ta instrukcja pozwoli nam wykonać jeden kawałek kodu wielokrotnie. W pętli. Jest to bardzo przydatna instrukcja i ma ciekawą składnię. Są 3 części, rozdzielone średnikiem („;”). Część pierwsza to zainicjowanie zmiennych, których będziemy używać w naszej pętli. Zwykle jest to licznik, który informuje nas, które to już powtórzenie. Część druga to warunki końcowe. Jeżeli po wykonaniu kroku pętli warunek ten zostanie spełniony, to pętla zostaje przerwana. Zwykle sprawdza się tutaj stan licznika i określa dokładną liczbę powtórzeń. Część trzecia to kod, który wykona się na naszych zmiennych PO danym kroku pętli. Zwykle zwiększa się tutaj licznik (żeby był licznikiem, bo bez zwiększania byłaby to pętla nieskończona).

    for(var i = 0; i < 10; i++)
    {
        console.log('To jest krok: ' + i);
    }

Widzimy tutaj program, który wypisuje na ekran 10 razy napis „To jest krok: ” wraz z obecnym numerem licznika. W części pierwszej definiujemy zmienną licznika. Będzie to „i” z początkową wartością równą „0”. W części trzeciej zwiększamy licznik o 1 („i++”), ale nic nie stoi na przeszkodzie żeby była to inna wartość (np. „i += 2”, wtedy moglibyśmy na przykład wypisać tylko parzyste liczby).

Należy zwracać uwagę na warunek końcowy, czyli część druga („i < 10”). Musimy upewnić się, że nasza pętla kiedyś się zakończy. Czasami może się zdarzyć, że nasz warunek końcowy będzie błędny i nigdy nie zostanie spełniony. Wtedy mamy do czynienia z nieskończoną pętlą a nasz program „się zawiesi” i nie będzie reagował. Poniżej pokazałem taką nieskończoną pętlę.

    // petla nieskonczona, zmienna "i" przeskoczy z 9 na 11
    // warunek koncowy nigdy nie zostanie spelniony !
    for(var i = 1; i == 10; i += 2)
    {
        console.log('To jest krok: ' + i);
    }

Warunek końcowy jest bardzo podobny do tego z poprzedniego programu, ale tutaj pętla zakończyłaby się gdyby licznik był równy 10, a my zaczynamy od 1 i dodajemy 2 po każdej pętli, także nigdy „i” nie będzie równe 10 i pętla będzie trwała w nieskończoność.

Pętla DO (ang. wykonuj) / WHILE (ang. dopóki):

Te dwie instrukcje są do siebie bardzo podobne i również umożliwiają wykonanie danego kawałka kodu wielokrotnie. Różnią się one od siebie tym, że w pętli DO warunek jest sprawdzany po wykonaniu kroku pętli, a w instrukcji WHILE warunek jest sprawdzany przed. Także w pętli DO nasz kod wykona się przynajmniej jeden raz, a w pętli WHILE może się tak zdarzyć, że nasz kod nie wykona się wcale.

    var i = 2;
    do
    {
        console.log('Krok: ' + i);
        i++;
    }
    while(i < 2);

Pętla wykona się dokładnie jeden raz. Ponieważ warunek końcowy („i<2”) jest niespełniony od samego początku, ale w pętli DO kod wykona się przynajmniej raz.

    var i = 2;
    while(i < 2)
    {
        console.log('Krok: ' + i);
        i++;
    }

Pętla nie wykona się ani razu, ponieważ warunek końcowy („i<2”) jest sprawdzany na samym początku i program nie wchodzi w pętlę.

Instrukcje CONTINUE (ang. kontynuuj) / BREAK (ang. przerwij):

Instrukcje CONTINUE oraz BREAK stosuje się głównie w pętlach. Chociaż BREAK wystąpił również w instrukcji SWITCH. Pozwalają ona „wyskoczyć” czy też zakończyć daną instrukcję.

Jeżeli zastosujemy instrukcję BREAK w pętlach FOR / DO / WHILE to wyskoczymy z niej i tym samym zakończymy instrukcję sterującą niezależnie od warunków końcowych i tego czy są spełnione czy nie.

Z instrukcją CONTINUE jest podobne, z tym że kończy ona dany krok pętli. Nie wyskakuje z pętli całkowicie, a tylko z jednego kroku pętli, następne wykonają się już normalnie.

    var liczba = 1;
    for(;;liczba++)
    {
        if(liczba % 2 == 0) continue;
        if(liczba % 9 == 0) break;
    }
    console.log('Znaleziona liczba to: ' + liczba);

Na poniższym przykładzie widzimy oba zastosowania. Szukamy liczby, która dzieli się przez 9 bez reszty i gdy ją znajdziemy to kończymy nasz program. Dodatkowo sprawdzamy, czy liczba nie dzieli się przez 2, bo jeżeli jest parzysta to nie ma potrzeby sprawdzania czy nie dzieli się przez 9.

Dla liczb parzystych zostanie wykonana instrukcja CONTINUE (przejście do następnego kroku pętli) a dla liczby podzielnej przez 9 zostanie wykonana instrukcja BREAK (zakończenie pętli).

Widzimy tutaj też ciekawą modyfikację pętli FOR. Otóż część pierwsza i druga są puste (rozdzielone tylko średnikiem). Oznacza to, że nasza pętla nie definiuje nowych zmiennych (część pierwsza) oraz nie ma warunku końcowego (część druga). Dlatego gdyby nie było instrukcji CONTINUE / BREAK powstałaby pętla nieskończona.

Kończąc…

Chciałbym Ci zwrócić uwagę i jeszcze raz przypomnieć, że używając pętli bardzo ważne są dwie rzeczy:

  1. Musi następować iteracja (czyli zwiększamy licznik, bo czasami można zapomnieć o instrukcji typu „licznik++”)
  2. Warunek końcowy musi być poprawny (czyli upewniamy się, że pętla kiedyś się zakończy)

Jak widzisz instrukcje sterujące są bardzo przydatne i dzięki nim możemy napisać naprawdę fajne programy. Tak jak wspomniałem na początku, różne języki programowania mogą mieć różną składnię dla tych instrukcji, ale zasada działania jest taka sama.

Na „Drodze programisty” już niedługo nauczymy się je wykorzystywać do pisania coraz ciekawszych programów.

3 uwagi do wpisu “Instrukcje sterujące

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Wyloguj /  Zmień )

Zdjęcie na Google

Komentujesz korzystając z konta Google. Wyloguj /  Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Wyloguj /  Zmień )

Zdjęcie na Facebooku

Komentujesz korzystając z konta Facebook. Wyloguj /  Zmień )

Połączenie z %s