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

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ć ilości 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ć 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" była fałszywa:

int i = 0;

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

Częstszy zapis w postaci osadzenia preinkrementacji w warunku wygląda tak (zwróć 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 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 metoda 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 (nieZnalezionoDrogiDoWyjscia())
{
    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.

PĘTLA "WHILE" - ZASTOSOWANIE

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ę jednokierunkową
  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ę.

PĘTLA "WHILE" - PRZYKŁADY

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 <stdio.h>
#include <stdlib.h>
#include <time.h>

#define RANGE 50
#define NUMBER 25

int main(void)
{
	int randomizedNumber;
	
	srand(time(NULL));
	
	while ((randomizedNumber = (rand() % RANGE) + 1) != NUMBER)
	{
		printf("Sprawdzam liczbe %d. To nie jest ta...\n", randomizedNumber);
	}
	
	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.


Na dzisiejszy wieczór przyszykuję trzecią i ostatnią część dotyczącą pętli. Pętla "do while" będzie teraz rozpatrywana.