Ten artykuł nie jest skończony. Możesz pomóc w jego ukończeniu edytując tą stronę.
Pętle
W tej lekcji każemy programowi wykonywać wielokrotnie dany kod, czyli skorzystamy z pętli.
Motywacja
Pętle mają wiele zastosowań, oto kilka z nich:
- 👾 dodanie np. 10 nowych przeciwników do planszy w grze
- 🖥 wyświetlenie każdego elementu z tablicy
- ➗ wielokrotne wykonanie obliczeń (np. liczenie silni, ciąg fibonacciego)
W lekcji o wektorach pokazaliśmy już jedną pętlę, która wyświetlała wszystkie elementy tablicy:
for (int n : numbers)
{
std::cout << n << ' ';
}
Jest to najprostsza wersja pętli w C++. W następnych sekcjach poznasz więcej ich rodzajów.
Rodzaje pętli
W C++ mamy następujące pętle:
for
- wersja dla zasięgów (range-based for)
- wersja podstawowa
while
do ... while
Najczęściej używana jest for
oraz while
i o nich powiemy w tej lekcji.
Jeśli chcesz poczytać o pętli do ... while
to zapoznaj się z artykułem:
Pętla do ... while
.
Iteracja - pojedynczy obieg pętli.
Wytłumaczenie
Pętla for
(range-based)
Ten rodzaj pętli jest najczęściej stosowany do pracy z tablicami, choć może być użyty też w inny sposób.
SchematW przykładzie pokazanym w sekcji Motywacja znajduje się właśnie
pętla range-based for, czyli wersja pętli for
dla tzw. zasięgów.
Tablica w rozumieniu C++ również jest takim zasięgiem, więc możemy śmiało z niej skorzystać.
Najprostszy przykład:
std::vector<int> numbers = { 13, 42, -1, 0, -3, -5 };
for (int n : numbers)
{
std::cout << n << ' ';
}
Ta pętla kolejno przechodzi przez każdy element tablicy numbers
i zapisuje go do
zmiennej n
. Następnie wykonywany jest blok kodu zawarty w nawiasie klamrowym.
W tym wypadku jest to wyświetlenie liczby.
Zwróć uwagę, że po nazwie zmiennej n
znajduje się dwukropek (:
), nie średnik (;
)!
Nie używamy w tym zapisie żadnego znaku równości (=
), bo wartość każdego elementu po
kolei będzie automatycznie przypisywana do n
.
Pętla while
Schemat
Celowo przechodzimy teraz do pętli while
, zamiast do zwykłego for
, ponieważ ułatwi to wyjaśnienia.
Pętla while
wykonuje ciało pętli dopóki warunek jest spełniony:
int number = 0;
while (number <= 3)
{
std::cout << number << ' ';
number++;
}
0 1 2 3
Warunek zostanie sprawdzony przed każdym obiegiem pętli i tak długo jak jest on spełniony,
czyli w tym wypadku tak długo jak number
jest mniejsza lub równa 3
, to będzie wykonywane ciało:
- wyświetlenie
number
- zwiększenie
number
o 1
Po ostatnim obiegu pętli, wartość number
będzie równa 4
, więc warunek nie będzie spełniony,
przez co pętla się zakończy i komputer przejdzie do wykonywania następnych instrukcji.
Pętla for
Schemat
Ta pętla jest uproszczeniem pewnego bardzo często powtarzającego się schematu i jest ona zazwyczaj używana do krokowego przejścia przez pewien zakres (np. liczbowy).
Zacznijmy od przykładu:
for (int i = 0; i < 10; i++)
{
std::cout << i << ' ';
}
Powyższa pętla wyświetla liczby od 0 do 9. Nawias okrągły przy for
składa się z trzech części,
oddzielonych średnikami:
Fragment | Opis |
---|---|
int i = 0 | instrukcja początkowa (zazwyczaj utworzenie zmiennej) |
i < 10 | warunek |
i++ | wyrażenie iteracji |
Gdy program zaczyna wykonywać pętlę for
, jednorazowo wykonuje instrukcję początkową - w naszym wypadku
tworzy zmienną i nadaje jej wartość 0
.
Program następnie:
- sprawdzi warunek
- niespełniony: wyjdź z pętli
- spełniony: idź do punktu 2
- wykona ciało pętli
- wykona wyrażenie iteracji i przejdzie do pkt. 1
Powyższa pętla for
jest równoznaczna z:
int i = 0;
while (i < 10)
{
std::cout << i << ' ';
i++;
}
Iteracja po tablicach
Pętli for
bardzo często używamy do iterowania po tablicach, w sytuacji gdy
albo potrzebujemy mieć dostęp do numeru iteracji lub gdy nie chcemy iterować
po całym zakresie.
std::vector<int> numbers = {10, 13, 15, 18, 60};
for (int i = 0; i < numbers.size(); i++)
{
std::cout << "numbers[" << i << "]: " << numbers[i] << '\n';
}
std::vector<int> numbers = {10, 13, 15, 18, 60};
for (int i = 0; i < numbers.size() / 2; i++)
{
std::cout << "numbers[" << i << "]: " << numbers[i] << '\n';
}
Pusty nawias
Kod podawany w nawiasie pętli for
jest opcjonalny. Średniki są wymagane.
for ( ; ; )
{
// kod
}
Powyższy zapis sprawi, że pętla for
będzie wykonywała się w nieskończoność (ze względu na pusty warunek),
chyba że przerwiemy ją manualnie...
Przerwanie pętli
Pętlę możemy przerwać w dowolnym momencie za pomocą instrukcji break
:
for (int i = 0; i < 10; i++)
{
if (i == 5)
break;
std::cout << i << ' ';
}
Ta pętla wyświetli liczby od 0 do 4, ponieważ przy i
równym 5
wykonanie pętli zostanie przerwane.
W ten sam sposób możemy przerwać pętlę while
.