Cześć! Prawdopodobnie jeszcze nie opadły emocje po walce z ćwiczeniami w wykorzystywaniu pętli, a tu już kolejny post! Wygląda na to, że upały mi sprzyjają i pomagają w produktywnym spędzaniu czasu. Dzisiaj pokażę Ci dwie nowe komendy, które mogą być wykorzystywane w połączeniu z instrukcjami sterującymi – są to instrukcje break i continue. Postaram się, żeby dzisiejszy post był krótki, lekki i przyjemny, ponieważ zdaję sobie sprawę, że post z ćwiczeniami z wykorzystania pętli mógł Cię nieźle wyczerpać! 😉
Instrukcja break
Z instrukcją break spotkaliśmy się już wcześniej, w czasie omawiania instrukcji switch. Używaliśmy jej wtedy na koniec każdego warunku instrukcji switch, aby zapobiec przechodzeniu do wykonywania bloku kodu znajdującego się pod kolejną etykietą. Można więc stwierdzić, że instrukcja break przerywa wykonywanie instrukcji warunkowej i natychmiastowo przenosi nas do następnej linii znajdującej się poza przerywaną instrukcją. Takie same efekty możemy uzyskać stosując komendę break w obrębie pętli.
Wyobraź sobie program, który odczytuje pewną wartość z czujnika, na przykład oświetlenia. Program na podstawie odczytów wykonuje szereg czasochłonnych operacji i wylicza za pomocą pętli pewne skomplikowane wartości. Dodatkowo, pomiary w naszym fikcyjnym programie są uzależnione od poprzednich wartości odczytów, na przykład uśredniane. Teraz wyobraź sobie, że czujnik oświetlenia przez pewien czas przesyła nieprawidłowe wartości. Przewody czujnika mogły być źle zabezpieczone i poranna rosa spowodowała tymczasowe zwarcie, co spowodowało przesyłanie kompletnie nieprawidłowych wartości. Wykonywanie obliczeń na podstawie tych błędnych pomiarów zafałszowałoby wszystkie wyniki i niepotrzebnie zużywało energię. Właśnie w takich scenariuszach przyda Ci się instrukcja break! W ciele pętli, na samym początku możesz umieścić komendę if, która w przypadku wykrycia nieprawidłowej wartości może wywołać instrukcję break. W dobrze napisanym programie spowoduje to pominięcie odczytu i oczekiwanie na kolejne prawidłowe wartości odczytów z czujnika. Opisaną sytuację możesz przeanalizować na poniższym przykładzie uproszczonego kodu.
const int = wartoscMinimalna = 0; const int = wartoscMaksymalna = 1000; int wartoscPomiaru = odczytCzujnika(); for (int x = 0; x < 100000; x++) { if (wartoscPomiaru < wartoscMinimalna || wartoscPomiaru > wartoscMaksymalna) { // Niepoprawna wartosc odczytu z czujnika break; //Przerwij wykonywanie petli i nie wykonuj skomplikowanych operacji! } ... //Dalsze skomplikowane operacje w ciele petli. }
Jak możesz zauważyć, w tym przypadku unikamy wykonywania skomplikowanych operacji, które pętla ponowiłaby 10000 razy!
Instrukcja continue
Komenda continue będziesz miał okazję spotkać nieco rzadziej od instrukcji break, lecz jest również bardzo przydatna! Instrukcja continue umożliwia pominięcie wykonywania dalszych instrukcji w bieżącej iteracji pętli. Oznacza to, że po wywołaniu instrukcji continue w środku pętli przeniesiemy się do etapu sprawdzenia warunku wykonania pętli. Jeżeli zostanie on spełniony, pętla ponownie zacznie wykonywać kod, który umieścisz w jej ciele. Działanie instrukcji continue pomoże Ci zrozumieć poniższy prosty przykład:
for (int x = 0; x <= 255; x++) { if (x > 40 && x < 120) { // Pomin wypisywanie wartosci od 41 do 119 continue; } Serial.println(x); }
Jak widzisz, kiedy zmienna iterująca x przyjmuje wartość od 41 do 119, spełniony zostaje warunek komendy if. Przerywamy wtedy bieżącą iterację pętli, inkrementujemy wartość x i rozpoczynamy kolejną iterację sprawdzeniem, czy x jest mniejsze lub równe 255.
Kilka słów o instrukcjach sterujących bez klamr
W zaproponowanych przeze mnie rozwiązaniach zadań z poprzedniego wpisu mogłeś zauważyć pętle for, które nie miały instrukcji zawartych w nawiasach klamrowych. To nie przypadek, to celowe działanie, niestety zapomniałem o tym wspomnieć pisząc artykuł o pętlach, co musisz mi wybaczyć! 🙂 Otóż jeśli pętla for lub instrukcja if…else mają wykonywać tylko jedną instrukcję, to możemy pozbawić ich nawiasów klamrowych. Wykonywaną instrukcję umieszczamy wtedy zazwyczaj linijkę niżej z dodatkowym tabulatorem, który zwiększa czytelność kodu. Jak się domyślasz, tego typu opuszczenie nawiasów klamrowych nie miałoby sensu w przypadku pętli while oraz do…while.
Podsumowanie
Instrukcje break i continue pełnią bardzo ważną rolę i powinieneś o nich pamiętać, szczególnie projektując układy zasilane bateryjnie. Korzyść z wykorzystania ich odniesiesz również przy implementowaniu skomplikowanych algorytmów, kiedy na wagę złota będzie optymalizacja złożoności obliczeniowej kodu. Już wkrótce usłyszymy się (lub… poczytamy się?) ponownie, tym razem w poście dotyczącym konwersji typów danych, czyli rzutowania. Tymczasem na dziś to koniec, udało mi się napisać najkrótszego do tej pory posta na blogu, mam nadzieję, że taka forma również Ci się podoba, daj znać w komentarzu! Do zobaczenia! 😉
Źródła
Obrazek wyróżniający posta pochodzi ze strony: https://www.flickr.com/photos/donkeyhotey/8422065722