Pętla while jest niejako czymś pomiędzy pętlą for i pętlą do while. Cechą, którą ją łączy z pętlą for jest to, że warunek jest sprawdzany na początku pętli, czyli pętla może się nie wykonać ani razu. Jak pamiętasz zapewne, już to jest dużą różnicą w porównaniu z pętlą do while, która zawsze jest wykonywana co najmniej jeden raz.
A co ma wspólnego pętla while z pętlą do while? Poza oczywistym podobieństwem, którym jest słowo "while" w nazwie, podobna jest organizacja pętli oraz podobny sposób zapisu.
Dla mnie podobieństwem jest również to, że obu pętli (while i do while) używam, gdy mam do sprawdzenia złożony warunek logiczny, chociaż, jak już wspominałem, to samo można wykonać za pomocą pętli for.
Pętla while podobnie jak pętla for oraz jak pętla do while umożliwia powtarzanie instrukcji tak długo jak warunek końcowy jest spełniony. Schematycznie pętlę while możemy zapisać następująco:
while (warunekKoncowy)
lista_instrukcji
Przede wszystkim musisz zwrócić uwagę, że w tej pętli nie ma słowa "do" oraz co ważniejsze że warunek jest zapisywany na samym początku pętli - dzięki temu łatwo zapamiętasz, że warunek jest sprawdzany zanim cokolwiek innego zostanie wykonane i w ten sposób, jeśli warunek nie jest spełniony, nic nie zostanie wykonane.
Zwróć dodatkowo uwagę, że nie ma tutaj również nawiasów klamrowych, bowiem nie są one wymagane. Nie są one wymagane, kiedy chcemy wykonać tylko jedną instrukcję (w pętli do while nawiasy klamrowe były wymagane nawet dla jednej instrukcji). Oczywiście tak naprawdę prawie zawsze i tak będziemy musieli użyć nawiasów klamrowych, bowiem raczej nie będziemy nigdy chcieli wykonać tylko jednej instrukcji w treści pętli.
Wartym również zapamiętania jest to, że po nawiasach okrągłych znajdujących się za słowem while, nie ma średnika. Natomiast w przypadku pętli do while, średnik się tam znajdował.
Pozostałe cechy są zbieżne z cechami pętli do while. Warunek może być prosty lub może być znacznie bardziej skomplikowanym wyrażeniem. Podobnie jest z listą instrukcji (co już zasygnalizowałem) - może to być tylko jedna instrukcja, a może być znacznie więcej instrukcji - w tym również zagnieżdżone pętle (zarówno for, while, jak i do while).
#include <iostream>
using namespace std;
int main()
{
int ile=6;
while (ile<5)
cout <<"Jestem w srodku petli while"<<endl;
cout <<endl<<"Nacisnij ENTER aby zakonczyc"<<endl;
getchar();
return 0;
}
program nr 15.1
Od razu zaznaczę, że przykład jest bardzo podobny do przykładu pokazanego w lekcji dotyczącej pętli do while. Jest jednak dość spora różnica - gdy uruchomisz powyższy program, to zobaczysz, że tak naprawdę nie została wykonana żadna instrukcja w pętli.
Wyjaśnienie dlaczego tak się stało, jest dość proste. Otóż przed pojawieniem się pętli zmienna sterująca pętli ile ma przypisaną wartość 6. Teraz pojawia się pętla. Sprawdzany jest warunek pętli. Okazuje się, że warunek jest fałszywy (bo 6<5 jest fałszem), a zatem instrukcje pętli się nie wykonują i program przechodzi do instrukcji znajdujących się za naszą pętlą.
Oto kolejny przykład:
#include <iostream>
using namespace std;
int main()
{
int ile=3;
while (ile<10)
{
cout <<"Pierwsza instrukcja"<<endl;
cout <<"Druga instrukcja"<<endl;
}
cout <<endl<<"Nacisnij ENTER aby zakonczyc"<<endl;
getchar();
return 0;
}
program nr 15.2
Z kolei w powyższym programie zapomnieliśmy o zmianie (zmniejszaniu lub zwiększaniu) wartości zmiennej sterującej pętlą. Warunek końcowy jest zatem zawsze prawdziwy. Aby przerwać działanie programu, wiesz już jak postępować (jeśli nie wiesz, to wróć do dwóch poprzednich lekcji). Przy okazji zwróć uwagę, że tutaj już zastosowaliśmy nawiasy klamrowe (bowiem mamy dwie instrukcje).
Ostatecznie, aby pętla wykonała się zgodnie z naszymi oczekiwaniami, program musi wyglądać następująco:
#include <iostream>
using namespace std;
int main()
{
int ile=3;
while (ile<10)
{
cout <<"Pierwsza instrukcja"<<endl;
cout <<"Druga instrukcja"<<endl;
++ile;
}
cout <<endl<<"Nacisnij ENTER aby zakonczyc"<<endl;
getchar();
return 0;
}
program nr 15.3
Przy okazji chcę wspomnieć, że tutaj, podobnie jak w przypadku pętli do while, należy zmieniać wartość zmiennej sterującej najlepiej na końcu wszystkich instrukcji, bowiem w przeciwnym przypadku uzyskamy nieoczekiwane wyniki (wspominałem już o tym w lekcji dotyczącej pętli do while).
Dla ćwiczenia spróbujemy teraz przekształcić fragmenty kodów, w których użyto pętli do while na kod wykonujący dokładnie to samo zadanie, ale z użyciem pętli while.
Kody będę ponownie przedstawiał parami - najpierw kod z wykorzystaniem pętli do while, a następnie z użyciem pętli while. Zachęcam Cię jednak do samodzielnego napisania i przekształcenia programów. Dzięki temu na pewno znacznie więcej się nauczysz i zrozumiesz.
Przy okazji zwróć uwagę, że to te same programy, które przedstawiłem w poprzedniej lekcji. Kompletując kody z tej lekcji i z poprzedniej, uzyskasz 3 sposoby wykonania tego samego zadania: z wykorzystaniem pętli for, z wykorzystaniem pętli do while i z wykorzystaniem pętli while - taka "ściągawka", może Ci się przydać w przyszłości.
Ponieważ w przypadku wszystkich poniższych przekształceń, nie dzieje się tak naprawdę nic szczególnego, pozwól, że powstrzymam się od zbędnych uwag, komentarzy i wyjaśnień.
Kod 1 z użyciem pętli do while:
#include <iostream>
using namespace std;
int main()
{
int i=1;
do
{
cout <<"Wypisuje po raz "<<i;
cout <<". A to tylko dla testu"<<endl;
++i;
}
while (i<=10);
cout <<endl<<"Nacisnij ENTER aby zakonczyc"<<endl;
getchar();
return 0;
}
program nr 15.4
Kod 1 z użyciem pętli while:
#include <iostream>
using namespace std;
int main()
{
int i=1;
while (i<=10)
{
cout <<"Wypisuje po raz "<<i;
cout <<". A to tylko dla testu"<<endl;
++i;
}
cout <<endl<<"Nacisnij ENTER aby zakonczyc"<<endl;
getchar();
return 0;
}
program nr 15.5
Kod 2 z użyciem pętli do while:
#include <iostream>
using namespace std;
int main()
{
int ktory=1, i=1, j;
do
{
cout <<"Tak bedzie dla i="<<i<<endl;
j=5;
do
{
cout <<ktory<<". raz. i*j="<<i*j<<endl;
++ktory;
--j;
}
while (j>=2);
cout <<"Tak bylo dla i="<<i<<endl;
getchar(); // czekanie na nacisniecie ENTER
i+=2;
}
while (i<=10);
cout <<endl<<"Nacisnij ENTER aby zakonczyc"<<endl;
getchar();
return 0;
}
program nr 15.6
Kod 2 z użyciem pętli while:
#include <iostream>
using namespace std;
int main()
{
int ktory=1, i=1, j;
while (i<=10)
{
cout <<"Tak bedzie dla i="<<i<<endl;
j=5;
while (j>=2)
{
cout <<ktory<<". raz. i*j="<<i*j<<endl;
++ktory;
--j;
}
cout <<"Tak bylo dla i="<<i<<endl;
getchar(); // czekanie na nacisniecie ENTER
i+=2;
}
cout <<endl<<"Nacisnij ENTER aby zakonczyc"<<endl;
getchar();
return 0;
}
program nr 15.7
Kod 3 z użyciem pętli do while:
#include <iostream>
using namespace std;
int main()
{
unsigned int i=1, j;
do
{
j=1;
do
{
cout <<i*j<<' ';
++j;
}
while (j<=i);
cout <<endl;
++i;
}
while (i<=10);
cout <<endl<<"Nacisnij ENTER aby zakonczyc"<<endl;
getchar();
return 0;
}
program nr 15.8
Kod 3 z użyciem pętli while:
#include <iostream>
using namespace std;
int main()
{
unsigned int i=1, j;
while (i<=10)
{
j=1;
while (j<=i)
{
cout <<i*j<<' ';
++j;
}
cout <<endl;
++i;
}
cout <<endl<<"Nacisnij ENTER aby zakonczyc"<<endl;
getchar();
return 0;
}
program nr 15.9
W tej lekcji przedstawiłem Ci ostatnią pętlę języka C++ - pętlę while. Pętla while jest tak samo użyteczna jak dwie pozostałe pętle, dlatego jeśli nadal nie do końca rozumiesz jak ona działa, radzę Ci dokończyć czytanie tej lekcji i przeczytać ją ponownie.
Można powiedzieć, że wiesz już prawie wszystko o pętlach. W tym momencie zamiana pętli i rozumienie ich działania powinno przychodzić Ci już z łatwością. Jeśli tak nie jest, należy jeszcze poćwiczyć, bowiem w przeciwnym przypadku, później będzie Ci bardzo trudno.
Niedługo poznasz jeszcze kilka instrukcji, które przydadzą Ci się w posługiwaniu pętlami i wówczas Twoja wiedza na ten temat będzie naprawdę pełna. Dowiesz się także, w jaki sposób połączyć znajomość pętli z tablicami, co sprawi, że odwoływanie się do elementów tablic będzie bardzo łatwe.
powrót