Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

Rekomendowane odpowiedzi

Opublikowano

Pętle

 

Czasami trzeba w programie powtórzyć jakąś czynność kilkanaście, a nawet kilkaset razy. Pisanie tyle razy tej samej instrukcji było by misją samobójczą, więc wymyślono coś takiego jak pętle. Pętla powtarza blok instrukcji kilka razy lub dotąd, aż jakiś warunek przestanie być spełniany. Zaczniemy od pętli while.

 

 

 

while (warunek) instrukcja;

 

 

 

 

Dopóki warunek jest spełniany [ma wartość logiczną 1], wykonuje się instrukcja. Dopiero gdy warunek przestanie być prawdziwy, pętla zakończy się i instrukcja przestanie być w kółko powtarzana. Pętla ta nie wykona się ani raz, jeśli warunek będzie nieprawdziwy już na początku. Jeśli zależy nam, by instrukcja wykonała się chociaż raz, musimy użyć innej, aczkolwiek bardzo podobnej pętli.

 

 

 

do instrukcja;

while (warunek);

 

 

 

 

W takim przypadku najpierw wykonywana jest instrukcja, a dopiero później jest sprawdzany warunek. Jeśli potrzebujesz, by w pętli wykonało się więcej niż jedna instrukcja, umieść taki blok instrukcji w nawiasach klamrowych.

 

 

 

do {

instrukcja1;

instrukcja2;

} while (warunek);

 

 

 

 

Zauważ że w tym przypadku, podobnie jak przy instrukcji warunkowej, nie daje się już średnika przed while.

Tego rodzaju pętle przydają się np. przy odczycie danych z pliku po jednym bajcie, przy operacjach na tekstach i przy testowaniu czy zaszło już jakieś zdarzenie.

 

Kolejna pętla potrzebuje już zmienną do swego działania. W zmiennej tej przechowuje licznik pętli - ile razy pętla się już wykonała. Dzięki temu pętla ta najbardziej się nadaje do powtarzania jakiejś czynności określoną ilość razy. Oto ta pętla:

 

 

 

for (init; warunek; krok;) instrukcje;

 

 

 

 

Wyrażenie init to wyrażenie inicjujące. Służy głównie do zainicjowania zmiennej-licznika. Zwykle jest to po prostu wpisanie do tej zmiennej jakiejś wartości początkowej. Warunek to wyrażenie logiczne. Określa ono, czy pętla powinna się już zakończyć, czy nie. Tutaj zwykle licznik jest porównywany z jakąś wartością. Wyrażenie krok to wyrażenie obliczające następną wartość dla zmiennej-licznika. Najczęściej po prostu zwiększa się wartość licznika o 1. Przykłady:

 

 

 

//Wypisanie na ekranie: 3, 4, 5, 6, 7,

for (int i=3; i<8; i++) cout << i << ", ";

//Wypisanie na ekranie: 0, 0.2, 0.4, 0.6, 0.8,

for (float a=0.0; a<0.9; a+=0.2) cout << a << ", ";

 

 

 

 

Jak widzisz, pętla for pozwala na wszelkiego rodzaju dziwactwa. Jeśli chcesz zrobić bombę i odliczać od 60 do 0, to też się da. Właśnie dzięki tej dowolności pętla ta jest najczęściej stosowana do odliczania liczb z jakiegoś przedziału. Jest też stosowana do operacji na tablicach.

 

Przyjrzyj się uważnie. Co zostanie, jeśliby użyć tylko wyrażenia warunkowego, a init i krok wywalić zostawiając puste miejsca? Wtedy pętla taka będzie równoznaczna pętli while. Równie dobrze możesz nie inicjować zmiennej-licznika w pętli, a poza nią. W pętli conajwyżej użyjesz już gotowej zmiennej. Pozwala to na wpisanie wartości do tej zmiennej w innej części programu, a w pętli będzie się ją tylko sprawdzać i zwiększać. Patrz na poniższy przykładowy program:

 

 

 

#include <iostream.h>

int main() {

int n;

cout << "Od ilu mam odliczac?\n>";

cin >> n;

for (; n>=0; n--) cout << n << endl;

cout << "BUUUUUM!";

}

 

 

 

 

W tym programie licznik jest ustawiany przez użytkownika, poza pętlą. Pętla używa go do odliczania. Gdy odliczanie się zakończy, bomba wybucha z wielkim hukiem ;-).

 

Umieszczanie zmiennych-liczników w instrukcji pętli jest jednak lepsze, niż korzystanie ze zmiennych spoza pętli. Dlaczego tak mówię? Zmienna znajdująca się wewnątrz pętli "żyje" tylko wewnątrz niej, w czasie jej wykonywania [wyjątek stanowi jedynie kompilator Borland C++, w którym zmienna taka żyje też poza pętlą i nikt nie wie dlaczego :-P]. Gdy pętla się zakończy, zmienna jest zwalniana. Po pierwsze oszczędza to pamięć, a po drugie nazwa takiej zmiennej jest zarezerwowana tylko dla pętli. Poza pętlą zmienna taka już nie istnieje. Jeśli umieścimy dwie zmienne o identycznej nazwie w programie i w pętli, kompilator i tak je rozróżni. Zmienna wewnątrz pętli przysłoni jakby tą zmienną z programu głównego. O takiej zmiennej mówimy, że jest lokalna dla instrukcji pętli. Podobny rodzaj zmiennych można też tworzyć w funkcjach. Tam będziemy o tym mówić dokładniej.

×
×
  • Dodaj nową pozycję...