W programowaniu nie raz zdaży się, że będziecie potrzebowali wielokrotnie wykonać dany blok kodu. W największym skrócie, pętle takie wykonywane
są sekwencyjnie, tj. zaczynamy od pierwszej linii kodu w danym bloku, przechodzimy do drugiej, następnej i tak do końca.
Język C# dostarcza różne pętle, które pozwalają na wielokrotne wykonywanie danego bloku kodu.
Pętle takie pozwalają na wielokrotne wykonanie pojedynczych albo całych grup poleceń. Poniżej zostaną omówione pętle wraz z opisem,
składnią oraz przykładami, które lepiej pozwolą zrozumieć istotne różnice pomiędzy wymienionymi konstrukcjami.
Pętla while
Pętla while wykonywana jest wielokrotnie, tak długo jak prawdziwy jest zdefiniowany warunek.
Składnia:
while(warunek)
{
zbior_polecen();
}
W powyższym przykładzie zbior_polecen() może być pojedynczym poleceniem lub blokiem instrukcji do wykonania.
Możemy zdefiniować dowolny warunek a pętla będzie wykonywana dopóki będzie on prawdziwy.
Gdy warunek stanie się fałszywy program automatycznie przejdzie do pierwszej linii kodu bezpośrednio po pętli while.
Przykład:
// Pętla while
int a = 10;
while(a<=20)
{
Console.WriteLine("Liczba to: {0}", a);
// Operator inkrementacji, wartość zostaje zwiększona o jeden
a++;
}
Console.ReadKey();
// Wyniki działania programu jest następujący:
//Liczba to: 10
//Liczba to: 11
//Liczba to: 12
//Liczba to: 13
//Liczba to: 14
//Liczba to: 15
//Liczba to: 16
//Liczba to: 17
//Liczba to: 18
//Liczba to: 19
//Liczba to: 20
Pętla for
Pętla for jest strukturą pozwalającą na definicje pętli, która musi wykonać się określoną ilość razy.
Składnia:
krok inicjalizacji wykonywany jest w pierwszej kolejności, oraz co ważne, wykonywany jest tylko raz.
Krok ten pozwala na zdeklarowanie zmiennej, która steruje działaniem pętli. Miejsce to może również pozostać puste, o ile pojawi się
znak średnika;
kolejny krok to warunek. Jeżeli jest prawdziwy blok kodu wewnątrz pętli zostanie wykonany. Jeżeli nie, program automatycznie przejdzie
do pierwszej linii kodu bezpośrednio po pętli for;
po wykonaniu bloku kodu dochodzi do powrotu do miejsca inkrementacji. W tym miejscu możemy dokonać
aktualizacji wartości, po której iterujemy. Miejsce to może również pozostać puste, o ile pojawi się znak średnika;
w tym miejscu nasz warunek jest sprawdzany ponownie. Jeżeli jest poprawny blok kodu zostaje ponownie wykonany (blok kodu wewnątrz
pęli, potem ponownie dochodzi do aktualizacji wartości inkrementacji, a następnie do ponownego sprawdzenia warunku).
Pętla będzie wykonywana dopóki warunek będzie prawdziwy.
Przykład:
// Pętla for
for (int i = 0; i <= 5; i++)
{
Console.WriteLine("Liczba to: {0}", i);
}
Console.ReadKey();
// Wynik działania programu jest następujący:
//Liczba to: 0
//Liczba to: 1
//Liczba to: 2
//Liczba to: 3
//Liczba to: 4
//Liczba to: 5
Pętla do…while
W przeciwieństwie do pętli while, która sprawdza warunek na początku, pętla do…while
sprawdza warunek na końcu pętli.
Obie pętle są do siebie podobne, z tym, że w przypadku pętli do…while mamy gwarancje, że zostanie ona
wykonana co najmniej jeden raz.
Składnia:
do
{
zbior_polecen();
}
while(warunek)
Warto zwrócić uwagę, że wyrażenie warunkowe znajduje się na końcu pętli, dzięki czemu wiemy, że zbior_polecen()
powinien zostać wykonany raz zanim dojdzie do sprawdzenia warunku.
Jeżeli warunek jest prawdziwy dojdzie do powrotu do pierwszej linii naszej pętli, tj. polecenia do oraz do
ponownego wykonania zbior_polecen(). Proces ten będzie powtarzany tak długo, jak długo warunek będzie prawdziwy.
Przykład:
// Pętla do...while
int i = 3;
do
{
Console.WriteLine("Liczba to: {0}", i);
i++;
}
while (i < 10);
// Wynik działania programu jest następujący:
//Liczba to: 3
//Liczba to: 4
//Liczba to: 5
//Liczba to: 6
//Liczba to: 7
//Liczba to: 8
//Liczba to: 9
Zagnieżdzone pętle
W języku C# mamy możliwość używania jednej pętli w środku drugiej. Poniżej przykłady użycia takich pętli.
Składnia dla pętli for:
Podsumowując, warto pamiętać, że każdy rodzaj pętli może zostać umieszczony wewnątrz innej pętli. Nie ma tutaj żadnych ograniczen.
Przykład:
// Zagnieżdzone pętle for
for (int l1 = 0; l1 < 5; l1++)
{
for (int l2 = 2; l2 > 0; l2--)
{
Console.WriteLine("Liczba l1 to: {0}, Liczba l2 to : {1}", l1, l2);
}
}
Console.ReadKey();
// Wynik działania programu jest następujący
//Liczba l1 to: 0, Liczba l2 to : 2
//Liczba l1 to: 0, Liczba l2 to : 1
//Liczba l1 to: 1, Liczba l2 to : 2
//Liczba l1 to: 1, Liczba l2 to : 1
//Liczba l1 to: 2, Liczba l2 to : 2
//Liczba l1 to: 2, Liczba l2 to : 1
//Liczba l1 to: 3, Liczba l2 to : 2
//Liczba l1 to: 3, Liczba l2 to : 1
//Liczba l1 to: 4, Liczba l2 to : 2
//Liczba l1 to: 4, Liczba l2 to : 1
Polecenie break
Wykonywanie pętli może zostać przerwane na żądanie. Jednym z takich sposobów jest użycie polecenia break. W momencie
warunkowego opuszczania pętli dochodzi do automatycznego usunięcia wszystkich obiektów utworzony wewnątrz pętli.
Polecenie break jest używane do:
natychmiastowego zakończenia pętli;
zakończenia wykonywania instrukcji wyboru.
Przykład:
for (int i = 0; i < 20; i++)
{
// Przerwanie wykonywania pętli gdy liczba jest większa niż 5
if (i > 5)
break;
}
Polecenie continue
Polecenie continue jest w pewnym sensie podobne do działania polecenia break.
Jednakże, zamiast przerywania wykonywania pętli dochodzi do wymuszonego przejścia do kolejnej iteracji.
Przykład:
for (int i = 0; i < 5; i++)
{
// Jeżeli liczba wyniesie 3 przejdziemy do wykonania kolejnej iteracji
// kod obecnej iteracji zostanie pominięty
if (i == 3)
continue;
Console.WriteLine("Liczba i wynosi: {0}", i);
}
// Wynik działania programu
//Liczba i wynosi: 0
//Liczba i wynosi: 1
//Liczba i wynosi: 2
//Liczba i wynosi: 4