Jason. Cała informatyka w jednym miejscu!

Oto druga część z trzech na temat pętli. Tak jak obiecałem, teraz pętla "while". Układ będzie taki sam. Najpierw krótkie wyjaśnienie, następnie przykłady zastosowań, a na koniec dwa przykłady. Jak ktoś przegapił pierwszą część, niech klika tutaj i nadrabia zaległości.

PĘTLA "WHILE". WYJAŚNIENIE OD PODSZEWKI

Pętla "while" - oto kolejna z wykorzystywanych pętli w programowaniu. Ona również charakteryzuje się omawianym wcześniej "warunkiem wejścia", czyli tutaj również pętla może się nie wykonać ani razu z powodu wcześniejszego weryfikowania spełnienia warunku. W przeciwieństwie jednak do pętli "for", zawiera tylko część dotyczącą decydowania o kontynuowaniu pętli. Oznacza to, że nadaje się zdecydowanie bardziej do wszelkich operacji, przy których nie jesteśmy w stanie przewidzieć liczby koniecznych powtórzeń. Nie posiada inicjalizacji zmiennych ani aktualizacji. Musimy o to zadbać samodzielnie, aby nie doszło do nieskończonej pętli. Częstym zapisem u programistów jest stosowanie preinkrementacji zmiennej służącej za licznik (jeżeli uzależniamy działanie od licznika). Najczęściej spotykana postać obowiązująca m.in. w języku C, prezentuje się następująco:

while (warunek)
{
    instrukcje;
}

Aby zapobiec nieskończonemu działaniu, należy samodzielnie zadbać o modyfikację licznika w taki sposób, aby któregoś razu pętla "while" miała fałszywy warunek zakończenia:

int i = 0;

while (i < 10)
{
    instrukcje;
    ++i;
}

Częstszy zapis w postaci osadzenia preinkrementacji w warunku wygląda tak (zwróćcie uwagę na to, że licznik został ustawiony na -1, ponieważ najpierw zwiększany jest licznik, a dopiero potem następuje sprawdzenie):

int i = -1;

while (++i < 10)
{
    instrukcje;
}

Jak wspomniałem na początku, pętla ta dużo lepiej sprawdzi się przy operacjach, które nie wiadomo kiedy mogą się skończyć. Poniżej jest prosty przykład lepszego jej zastosowania. Abstrakcyjna funkcja sprawdzająca co każdą iterację czy znaleziono drogę do wyjścia (sytuacja, która może wymagać dziesięciu, stu czy jeszcze więcej iteracji):

while (notFoundExitYet())
{
    instrukcje;
}

Oto streszczenie działania pętli "while".

Pętla "while"

Pętla "while" składa się jedynie z warunku wejścia i nadaje się dużo lepiej do sytuacji, gdy nie możemy przewidzieć ile razy ma się wykonać dany blok instrukcji.

PRZYKŁADOWE ZASTOSOWANIA

Powyższa pętla sprawdzi się dużo lepiej w przypadkach, kiedy nie mamy zielonego pojęcia ile razy będzie musiała przejść. Poniższe przykłady zastosowań powinny pomóc to sobie uzmysłowić:

  1. działanie pętli gry,
  2. przechodzenie przez listę dynamiczną,
  3. znajdowanie najkrótszej ścieżki ("pathfinding"),
  4. wylosowanie konkretnej liczby z określonego zbioru.

Mam nadzieję, że pomoże to Wam zrozumieć różnicę. Na koniec, dwa proste przykłady zastosowań w języku C, u których ta odmiana sprawdzi się lepiej niż "for" (co nie znaczy, że to nie jest możliwe):

#include <stdio.h>

int main(void)
{
    int x, sum = 0;
    
    printf("Sumator liczb\nWprowadzaj po kolei liczby calkowite, aby uzyskac sume.\n");
    
    while (scanf("%d", &x) == 1)
    {
        sum += x;
    }
    
    printf("Suma podanych liczb wynosi %d.\n", sum);
    getchar();
    getchar();
    
    return 0;
}

Oto drugi przykład związany z losowaniem liczb:

#include <time.h>
#include <stdio.h>
#include <stdlib.h>

#define RANGE 50
#define NUMBER 25

int main(void)
{
	int randomNumber;
	
	srand(time(NULL));
	
	while ((randomNumber = (rand() % RANGE) + 1) != NUMBER)
	{
		printf("Sprawdzam liczbe %d. To nie jest ta...\n", randomNumber);
	}
	
	printf("Trafiona!");
	getchar();
	
	return 0;
}

Te dwa przykłady prezentują jak działa pętla "while". Może się to wykonać sto razy, tysiąc razy albo tylko jeden raz. Jeżeli wiecie ile razy ma się coś wykonać, to WTEDY stosujcie pętlę "for". Wyjdzie Wam to o wiele czytelniej.


Trzecia część prezentuje charakterystykę pętli "do while", klikajcie tutaj.

PODOBNE ARTYKUŁY