
Pętle służą do powtarzania poleceń w programie.
Pętla ta sprawdza czy warunek jest spełniony, jeżeli tak, to wykonuje polecenia w pętli, następnie, znowu sprawdza ten warunek, i jeżeli nadal jest spełniony, to znowu wykonuje te polecenia, i tak cały czas, dopóki warunek nie będzie spełniony lub sami nie przerwiemy wykonywania pętli.
Wzór pętli:
Gdy mamy kilka instrukcji do wykonania, to jak zwykle bierzemy je w klamrę:
Oto przykładowy programik, który wypisze kolejne liczby, a my podamy mu, od jakiej ma zacząć i na jakiej ma skończyć:
Program spowoduje wypisanie kolejnych liczb. Na początku deklarujemy dwie zmienne, pierwsza mówiąca, od której wartości program ma zacząć wypisywać, a druga mówiąca, do której ma wypisywać. Kiedy dochodzimy do pętli, program porównuje te zmienne. Załóżmy, że podaliśmy jako pierwszą 3, a drugą 5. Pętla najpierw sprawdza warunek, czyli 3<=5, wychodzi prawda, więc pętla wykonuje pierwszy obieg, czyli wykonuje polecenia w niej. Jak widać pierwszą instrukcją w pętli, mamy wypisanie wartości poczatek, czyli 3. Następną instrukcją w pętli jest podwyższenie o 1 zmiennej poczatek, tu pierwszy obieg pętli się kończy. Teraz pętla sprawdza znowu warunek, czyli 4<=5, bo teraz zmienna początek wynosi 4, gdyż w obiegu ją podwyższyliśmy. Prawda, więc pętla wchodzi w drugi obieg instrukcji, wyświetlamy wartość zmiennej początek, czyli 4 i drugą instrukcją podnosimy ją o 1, czyli od tego moment będzie wynosić 5. Drugi obieg się skończył, pętla znowu sprawdza warunek, czyli 5<=5, wychodzi prawda, więc pętla wchodzi w trzeci obieg instrukcji. W trzecim obiegu wypisujemy wartość początek, czyli 5 i podwyższamy go o 1, czyli teraz początek wynosi 6. Koniec trzeciego obiegu, Teraz pętla sprawdza warunek, czy może wykonać czwarty obieg. Warunek w tym momencie wynosi 6<=5, co już jest nieprawdą, więc obieg czwarty się nie wykona i pętla kończy swoje działanie. Program znowu wykonuje to, co jest pod pętlą, czyli system("PAUSE");
Przeanalizowałem, pracę tej pętli, już chyba wiesz, na czym ona polega. Zasada jest taka, sprawdzamy warunek, jeżeli prawda, to wykonujemy instrukcje w pętli, po wykonaniu instrukcji(pełnym obiegu pętli), znowu sprawdzamy warunek i tak, aż warunek nie zostanie spełniony. Jeżeli warunek nie jest spełniony to program opuszcza pętlę i kontynuuje wykonywanie programu.
Teraz zastanów, co się stanie, gdy pierwszą liczbę podamy większą niż drugą? Odp.: Pętla najzwyczajniej sprawdzi warunek, ale nie będzie on spełniony, bo od razu pierwsza liczba będzie większa, więc pętla nie wykona się ani razu.
A co jakbyśmy nie napisali w obiegu pętli, że zmienna początek, co obieg ma się powiększyć o 1? Pętla wyglądałaby tak:
Najzwyczajniej obie wartości cały czas by wynosiły 3 i 5, więc warunek, co każdy obieg pętli byłby taki sam, czyli 3<=5, więc pętla nigdy by się nie zakończyła! Pętla wykonywałaby się cały czas, bo warunek byłby zawsze spełniony. Jest to jedna z pułapek stosowania pętli. Może czasem spotykasz się ze zjawiskiem, że program przestał odpowiadać i nie da się go inaczej zakończyć, jak przez "zakończ zadanie". Jedną z przyczyn może być właśnie, rozpoczęcie wykonywania nieskończonej pętli. Program cały czas wykonuje jakąś pętlę i nie może jej zakończyć, więc przestaje wysyłać i odbierać komunikaty z systemu Windows.
Pętla ta jest podobna, do pętli while, z tą różnicą, że najpierw są wykonywane instrukcje w pętli, a dopiero potem sprawdzany jest warunek, pętla będzie wykonywana aż do niespełnienia warunku lub zatrzymania jej.
Wzór pętli:
lub jeżeli mamy kilka instrukcji:
Jak widać najpierw funkcja wykonuje jakieś operacje, a dopiero po wykonaniu ich, sprawdza warunek. W pętli while obieg składał się z sprawdzenia warunku i wykonania instrukcji, jeżeli warunek jest spełniony. W pętli do, obieg wygląda tak, że najpierw wykonywane są operacje(instrukcje pętli), a dopiero po nich następuje sprawdzenie warunku, i kontynuacja kolejnego obiegu, jeżeli warunek jest spełniony. W ten sposób mamy pewność, że pętla "do" wykona się przynajmniej raz, nawet, gdy warunek, nie będzie spełniony.
Każdą pętlę można w dowolnym momencie przerwać i opuścić ją. Służy do tego słówko break. Zmodyfikujmy poprzedni program, aby nie pozwalał na wypisywanie wartości większych niż np. 10:
Program, różni się od poprzedniego tylko tym, że pierwszą instrukcją pojedynczego obiegu pętli jest warunek, że jeżeli zmienna poczatek będzie większa niż 10 to przerywamy wykonywanie pętli i przechodzimy poza pętlę. Dzięki temu, jeżeli zmienna początek będzie większa niż 10 to działanie pętli zakończy się, spowoduje to, że program nie będzie mógł wypisać wartości większych niż 10.
Słówko "continue" służy do przerywania danego obiegu pętli. Jeżeli pętla napotka na swojej drodze "continue", zakończy wykonywanie poleceń w tym obiegu pętli, i rozpocznie nowy obieg. Tutaj warto pod uwagę wziąć różnicę pętli, w pętli "do", nowy obieg rozpoczyna się od wykonania instrukcji, natomiast natomiast w while nowy obieg rozpoczyna się sprawdzeniem warunku.
Pętla for jest troszkę bardziej rozbudowana niż jej poprzedniczki. Ma w sobie dodatkową zmienną kontrolną, która jest deklarowana(tworzona) tylko podczas działania pętli, tzn. tylko wtedy możemy jej używać. W praktyce pętli for używa się chyba najczęściej, bo najczęściej potrzebna nam jest zmienna, która będzie odmierzać ilość wykonanych pętli. Oto jej wzór:
lub
Działanie tej pętli wytłumaczę na przykładzie. Program wypisze 10 liczb od 1 do 10:
Pierwsza instrukcja wypisuje informację. Dalej program wchodzi w pętlę for. Podczas wejścia w pętlę, program tworzy zmienną kontrolną. W pierwszej części nawiasu nadajemy jej typ int, ale może być to dowolny typ liczby (np. char, int, long int, unsigned short int, double, float ,itd.). Nadaję jej nazwę "i" i odrazu musimy zainicjować jej wartość, w przykładzie jest 1, ale może to być jakakolwiek wartość, np. innej zmiennej. Po zainicjowaniu dajemy średnik i rozpoczynamy drugą część nawiasu. Jest tam warunek. Warunek jest na takiej samej zasadzie jak w pętli while. Pętla jest wykonywana dopóki warunek jest spełniany. Sprawdzenie warunku następuje przed instrukcjami tak jak w pętli while. W przykładzie warunkiem jest i<=10, czyli podczas wykonywania pętli zmienna kontrolna "i" musi być mniejsza bądź równa 10. Trzecią częścią nawiasu jest krok, który ma być wykonywany, co obieg pętli. W naszym przypadku jest to podwyższenie zmiennej kontrolnej "i" o 1, ale możemy wpisać każdy inny krok, np. zwiększenie o 2, zmniejszenie o 3, itd. Pętla for jest w działaniu podobna do pętli while, po utworzeniu zmiennej kontrolnej "i", sprawdzany jest warunek(druga część nawiasu) jeżeli wychodzi prawda, to wykonuje instrukcje, w przykładzie wypisuje wartość zmiennej kontrolnej "i". Co obieg pętli wykonuje się krok, czyli taka jakby instrukcja przejścia pomiędzy obiegami, w przykładzie zmienną kontrolną "i", podwyższamy o 1, co właśnie spowoduje, że co obieg i będzie o 1 większe, jakbyśmy w kroku(trzecia część nawiasu) wpisali i+=2(powiększ zmienną "i" o 2), to pokazałyby się liczby co 2, bo co krok, i zwiększałoby się o 2. I tak pętla będzie się wykonywać, aż warunek przestanie być spełniony. Oczywiście w pętli for można stosować break i continue, tak jak w pętli while.
Przykład poprzedniego programu wypisującego kolejne liczby z użyciem pętli for:
Początek programu jest identyczny. Różni się tylko pętla. W Pętli użyta jest zmienna sterująca "i", nadajemy jej wartość zmiennej poczatek, więc od teraz zmienna poczatek jest tak jakby zastąpiona zmienną sterującą "i", warunek jest taki sam jak w poprzednim programie, z tym, że skoro w pętli zastąpiliśmy zmienną poczatek na zmienna "i", to w warunku musimy też to uwzględnić i napisać zamiast poczatek nazwę zmiennej sterującej "i". W instrukcjach obiegu nie musimy uwzględniać podnoszenia zmiennej o 1, gdyż mamy to już w kroku pętli. Instrukcjach wystarczy tylko uwzględnić wypisanie zmiennej "i" na ekranie i gotowe :-)