Pętle WHILE w Arduino



Pętla WHILE


Pętla while to struktura kontrolna w programowaniu, która powtarza blok kodu, dopóki spełniony jest określony warunek. Jest to szczególnie użyteczne w sytuacjach, gdzie liczba iteracji nie jest znana przed rozpoczęciem pętli lub zależy od dynamicznie zmieniających się danych.

Pętla while kontynuuje wykonanie bloku kodu, dopóki jej warunek jest prawdziwy (true). Warunek ten jest sprawdzany przed każdą iteracją pętli. Jeśli warunek jest fałszywy (false) na samym początku, blok kodu wewnątrz pętli while nie zostanie wykonany ani razu.

Podstawowa składnia pętli while w Arduino wygląda następująco (Kod_001):

Kod_001


Przykład 1

Rozważmy prosty przykład użycia pętli while, w którym chcemy wyświetlić liczby od 0 do 10 (podobnie jak zrobiliśmy dla pętli for) – Symulacja_1:

Symulacja_1

Program tworzy zmienną lokalną i (typu int) i przypisuje jej wartość 0. Następnie działa pętla while, która sprawdza, czy wartość zmiennej i jest mniejsza lub równa 10. Dopóki warunek jest spełniony, wykonywane są instrukcje w środku pętli.

W każdej iteracji wyświetlany jest napis „Numer: ” oraz aktualna wartość zmiennej i, a następnie i zostaje zwiększone o 1. Pętla wykonuje się 11 razy – od i = 0 do i = 10. Gdy i osiągnie wartość 11, warunek nie będzie już spełniony i pętla się zakończy.

Po zakończeniu pętli program nic więcej nie wykonuje, ponieważ funkcja loop() jest pusta.

Efekt działania programu na monitorze portu szeregowego:





Przykład 2 – pętla nieskończona

Podczas korzystania z pętli while, ważne jest, aby zawsze pamiętać o zapewnieniu przemyślanego warunku wyjścia z pętli, aby uniknąć nieskończonych pętli, które mogą zawiesić program.

Nieskończona pętla while może sprawić, że mikrokontroler przestanie wykonywać inne części programu, nie będzie reagował na sygnały wejściowe ani nie zaktualizuje wyjść. W skrajnych przypadkach może to sprawiać wrażenie, że urządzenie się „zawiesiło” lub „zamroziło”, ponieważ cały czas tkwi w pętli bez możliwości jej opuszczenia.

Przykładową pętle nieskończoną zaprezentowano poniższej (Symulacja_2):

Symulacja_2

Program rozpoczyna działanie od inicjalizacji komunikacji szeregowej, a następnie wypisuje tekst: „Wlaczono program”. Tuż po tym wchodzi w nieskończoną pętlę while (1);, która trwa wiecznie i nie zawiera żadnych instrukcji wewnątrz.

Ponieważ program zatrzymuje się w tej pętli, żadna linia znajdująca się po niej nie zostanie nigdy wykonana. Dlatego tekst „Tego program nie wyswietli” nie pojawi się na monitorze szeregowym. Program zatrzymuje się na etapie nieskończonej pętli i nie przechodzi dalej.

Warto dodać, że instrukcje: while(1) i while(true) są w tym kontekście równoważne — obie tworzą nieskończoną pętlę, ponieważ 1 i true są traktowane jako warunki zawsze prawdziwe.



Instrukcja CONTINUE w pętli WHILE

Podobnie jak w pętli for, w pętli while można stosować instrukcję continue, która przerywa bieżącą iterację pętli i natychmiast przechodzi do sprawdzenia warunku pętli, pomijając dalsze instrukcje w danym obiegu. Dzięki temu można selektywnie pominąć pewne przypadki, np. liczby parzyste, nie kończąc całej pętli.

Przykład 3

W poniższym przykładzie (Symulacja_3) wykorzystano instrukcję continue, aby pominąć przetwarzanie liczb parzystych i wypisać tylko liczby nieparzyste:

Symulacja_3

Program zlicza liczby w przedziale od 1 do 11 (ponieważ i jest zwiększane na początku pętli) i sprawdza, czy dana liczba jest parzysta. Jeśli tak, instrukcja continue powoduje pominięcie dalszej części kodu w tej iteracji — dzięki temu liczby parzyste nie są wypisywane.

W rezultacie na monitorze szeregowym wyświetlane są tylko liczby nieparzyste z zakresu od 1 do 11. Instrukcja continue pozwala więc na pomijanie pewnych przypadków bez przerywania całej pętli.

Efekt działania programu na monitorze portu szeregowego:




Instrukcja BREAK w pętli WHILE

Podobnie jak w pętli for, w pętli while można stosować instrukcję break, która natychmiast przerywa działanie pętli, niezależnie od tego, czy warunek pętli jest nadal spełniony. Jest to przydatne w sytuacjach, gdy chcemy zakończyć pętlę po spełnieniu określonego warunku, np. po znalezieniu szukanej wartości.

Przykład 4

W poniższym przykładzie (Symulacja_4) wykorzystano instrukcję break, aby zakończyć działanie pętli while w momencie, gdy zostanie spełniony określony warunek – w tym przypadku znalezienie pierwszej liczby podzielnej przez 7:

Symulacja_4

Program rozpoczyna od przypisania zmiennej i wartości 1. Następnie uruchamiana jest pętla while, która działa dopóki i jest mniejsze lub równe 100. W każdej iteracji sprawdzany jest warunek: czy liczba i jest podzielna przez 7.

Jeśli warunek jest spełniony, program wypisuje tę liczbę i natychmiast przerywa dalsze działanie pętli przy użyciu instrukcji break. Gdy liczba nie spełnia warunku, zmienna i jest zwiększana o 1, a pętla wykonuje kolejną iterację.

Dzięki break pętla kończy się zaraz po znalezieniu pierwszej pasującej liczby, co pozwala zaoszczędzić czas i zasoby programu.

Efekt działania programu na monitorze portu szeregowego:




Sterowanie pętlą WHILE za pomocą flagi logicznej

Flaga logiczna to zmienna typu boolean, która może przyjmować jedynie dwie wartości: true (prawda) lub false (fałsz). Używa się jej często do sterowania logiką programu — na przykład do określenia, kiedy należy zakończyć pętlę.

Przykład 5

W poniższym przykładzie (Symulacja_5) flaga logiczna służy do zmiany warunku działania pętli while w trakcie jej trwania — pętla kończy się dopiero wtedy, gdy flaga zostanie ustawiona na true, czyli po znalezieniu liczby podzielnej przez 5.

Symulacja_5

Na początku flaga znaleziono ma wartość false, więc warunek !znaleziono (czyli „nie znaleziono”) jest spełniony i pętla się wykonuje.

Program sprawdza kolejne liczby zaczynając od 1. W momencie, gdy natrafi na liczbę podzielną przez 5, wypisuje ją na monitorze szeregowym i ustawia flagę znaleziono na true. Zmiana wartości flagi powoduje, że warunek pętli przestaje być spełniony i pętla zostaje zakończona.

Zastosowanie flagi logicznej pozwala w czytelny sposób kontrolować moment zakończenia pętli i jednocześnie daje możliwość sprawdzenia jej stanu po wykonaniu pętli, co może być przydatne w dalszej części programu.

Efekt działania programu na monitorze portu szeregowego:




Pętla DO…WHILE

Pętla do…while jest jednym z podstawowych elementów sterujących przepływem programu i wyróżnia się unikalną cechą w porównaniu do wcześniej omawianej pętli whilezawsze wykonuje blok kodu przynajmniej raz, zanim zostanie sprawdzony warunek kontynuacji. Dzięki temu świetnie nadaje się do sytuacji, w których określona akcja musi zostać wykonana minimum jeden raz, a dalsze powtarzanie zależy od spełnienia konkretnego warunku.

Pętla do…while rozpoczyna się od wykonania bloku kodu, a dopiero potem sprawdzany jest warunek. Jeśli warunek jest spełniony (true), pętla wykonuje się ponownie. Proces ten trwa do momentu, aż warunek stanie się fałszywy (false) i pętla zostaje zakończona.

Kod_002



Przykład 6

W tym przykładzie implementujemy prosty licznik analogiczny do pętli while, który wyświetla liczby od 0 do 10, wykorzystując do tego tym razem pętlę do…while (Symulacja_6):

Symulacja_6

Program tworzy zmienną lokalną i (typu int) i przypisuje jej wartość 0. Następnie uruchamiana jest pętla do…while, która najpierw wykonuje instrukcje wewnątrz pętli, a dopiero później sprawdza warunek zakończenia – czy wartość zmiennej i jest mniejsza lub równa 10.

W każdej iteracji wyświetlana jest aktualna wartość zmiennej i, a następnie zmienna ta zostaje zwiększona o 1. Pętla wykonuje się 11 razy – od i = 0 do i = 10. Gdy zmienna i osiągnie wartość 11, warunek nie będzie już spełniony i pętla zakończy działanie.

Efekt działania programu na monitorze portu szeregowego:




CONTINUE, BREAK, flagi logiczne w pętli DO…WHILE

Podobnie jak w przypadku pętli while, również w pętli do…while można korzystać z instrukcji sterujących takich jak continue i break, które pozwalają odpowiednio pominąć dalsze instrukcje w bieżącej iteracji lub przerwać działanie pętli.

I w tym przypadku można stosować tzw. flagi logiczne do warunkowego kontrolowania zakończenia pętli, a także tworzyć pętle nieskończone, które będą działać bez końca – dopóki nie zostanie spełniony określony warunek lub nie nastąpi ręczne przerwanie.

Instrukcje te stosujemy w identyczny sposób jak w przypadku pętli while.




Porównanie pętli WHILE z pętlą DO…WHILE

W poniższym przykładzie (Symulacja_7) porównano sposób działania pętli while oraz do…while. Obie pętle wypisują kolejne liczby, jednak różnią się momentem sprawdzania warunku.

Przykład 7

Celem programu jest pokazanie, że pętla do…while zawsze wykona swoje instrukcje co najmniej raz, nawet jeśli warunek zakończenia nie jest od początku spełniony — w przeciwieństwie do pętli while, która sprawdza warunek przed wykonaniem pierwszej iteracji.

Symulacja_7

Najpierw pokazane jest działanie pętli while. Zmienna i ma na początku wartość 1. Pętla wykonuje się tak długo, jak i jest mniejsze od 4. W każdej interakcji program wypisuje tekst „Numer:” oraz wartość i, a potem zwiększa jej wartość o 1. Na ekranie pojawią się liczby: 1, 2, 3.

Następnie wstawiona jest pusta linia, która oddziela wyniki obu pętli.

Następnie uruchamiana jest pętla do…while, w której zmienna j również ma początkową wartość 1. W przeciwieństwie do pętli while, tutaj instrukcje w ciele pętli są wykonywane najpierw, a dopiero potem sprawdzany jest warunek zakończenia (j <= 4). Dzięki temu pętla wypisuje liczby: 1, 2, 3, 4.

Efekt działania programu na monitorze portu szeregowego:




Przykład 8

W poniższym przykładzie (Symulacja_8) jeszcze raz zaprezentowano różnicę w działaniu pętli while i do…while, tym razem w sytuacji, gdy warunek początkowy nie jest spełniony.

Symulacja_8

Na początku zmienna i ma wartość 0. Pętla while sprawdza, czy i > 1. Ponieważ ten warunek jest fałszywy już na starcie, pętla nie wykona się ani razu i nic nie zostanie wypisane.

Potem zmienna i znowu zostaje ustawiona na 0, ale tym razem użyta jest pętla do…while. W tym przypadku instrukcje wewnątrz pętli zostaną wykonane raz, a dopiero potem sprawdzony zostanie warunek. Dlatego pojawi się jeden komunikat, mimo że warunek również nie jest spełniony.

Na końcu wyświetlany jest napis “Koniec programu”, który informuje o zakończeniu działania.