6. Pętle – Jeden ze sposobów skrócenia powtarzalności kodu (for, foreach, while, do..while, break, continue, pętle zagnieżdżone)
6. Pętle – Jeden ze sposobów skrócenia powtarzalności kodu (for, foreach, while, do..while, break, continue, pętle zagnieżdżone)
Punkty w nagraniu:
- Czym jest pętla?
- Pętla for
- Pętla while
- Pętla do..while
- Pętla foreach
- Słowa kluczowe break i continue
- Pętle zagnieżdżone
- Przykłady z poziomu kodu
Linki:
- Projekt do pobrania: Link
1. Czym jest pętla?

Pętla jak sama nazwa wskazuje, pozwala powtórzyć daną czynność konkretną ilość razy. W powyższym przykładzie mamy utworzoną tablicę z elementami liczb całkowitych, gdzie do każdego elementu, ręcznie przypisujemy wartości. Poniżej użyto pętlę for, która pozwala zredukować liczbę linii kodu do dwóch 🙂
2. Pętla for

Pętlę for zaczynamy od słowa kluczowego for, w nawiasach zazwyczaj podajemy trzy elementy
inicjalizacja
- inicjalizacja – zazwyczaj jest to zmienna typu int, która zaczyna się od 0, ustawiamy tutaj od którego indeksu/numeru ma się rozpocząć działanie pętli, np. jeśli chcemy zacząć od 0 to piszemy 0 i potem zwiększamy o 1, więc pierwsza iteracja będzie miała numer 0, druga numer 1 itd. 0, 1, 2, 3, 4.. n+1
- warunek – warunek, który musi zostać spełniony żeby pętla przeszła do kolejnej iteracji i żeby wykonała kod wewnątrz niej
- inkrementacja – zwiększany numer iteracji, zazwyczaj jest to zwykła inkrementacja np. i++, czyli zwiększanie wartości o 1
for (int i = 0; i < 20; i++)
Console.WriteLine(i);
Podana pętla wykona się 20 razy wyświetlając wartość zmiennej i, czyli 0, 1, 2, 3, 4…
for (int i = 0; i < 20;)
Console.WriteLine(i++);
Sytuacja podobna do powyższej z taką różnicą, że pominięto trzeci człon w pętli, mianowicie przeniesiono inkrementację zmiennej i do miejsca wyświetlania w konsoli.
int inicjalizacja = 0;
for (; inicjalizacja < 20;)
Console.WriteLine(inicjalizacja++);
Podobnie jak powyżej tylko tym razem jeszcze pominięto lewą część i zostawiono jedynie warunek do spełnienia
// Ręczne podejście
int[] ints = { 1, 2, 3, 4, 5, 6 };
ints[0] = 1;
ints[1] = 2;
ints[2] = 3;
ints[3] = 4;
ints[4] = 5;
ints[5] = 6;
// Powyższa czynność zrealizowana przy pomocy pętli
for (int i = 0; i < ints.Length; i++)
ints[i] = i + 1;
Prosty przykład korzyści płynącej z korzystania z pętli. Mamy tablicę liczb całkowitych z 6 elementami, chcemy przypisać wartości od 1 do 6, gdybyśmy ręcznie to robili to zajęłoby to 6 linii kodu. Gdy skorzystamy z pętli, ilość kodu zostaje zredukowana tylko do dwóch linii:)
3. Pętla while

int number = 0;
while (number < 5)
Console.WriteLine(number++);
// Zwróci
// 1
// 2
// 3
// 4
// 5
W podanym przykładzie, pętla będzie wykonywana aż zmienna number będzie miała wartość <5. Dodatkowo żeby kod wewnątrz pętli został wykonany, warunek przynajmniej raz musi zostać spełniony.
4. Pętla do..while

int number = 5;
do
Console.WriteLine(number++);
while (number < 5);
// Zwróci tylko jedną wartość
5
// lub z klamrami
do
{
Console.WriteLine(number++);
}
while (number < 5);
W podanym przykładzie wyświetli liczbę 5 i dopiero sprawdzi warunek, drugiego podejścia nie będzie, ponieważ zmienna number, będzie miała już wartość 5. Gdyby to była pętla while z identycznym sprawdzeniem to ani razu by nie wykonało kodu i nie wyświetliło wartości ze zmiennej number.
5. Pętla foreach

// Przykładowe dane
List<MyVeryLongNamedClass> items = new List<MyVeryLongNamedClass>()
{
new MyMyVeryLongNamedClass("Tajko"),
new MyMyVeryLongNamedClass("Goku"),
new MyMyVeryLongNamedClass("Naruto"),
new MyMyVeryLongNamedClass("Rias"),
}
foreach (MyMyVeryLongNamedClass item in items)
Console.WriteLine(item.Name);
// lub skrócona wersja podawania typu elementu z listy
foreach (var item in items)
Console.WriteLine(item.Name);
Pętla foreach jest świetna przy pracy przy kolekcjach. Pozwala w bardzo przyjemny sposób iterować po elementach bez potrzeby sprawdzania indeksów i martwienia się czy indeks nie wyjdzie poza tablicę / kolekcję. Dodatkowo nie trzeba dodawać żadnego warunku sprawdzającego.
W podanym przykładzie mamy listę z czterema elementami klasy MyVeryLongNamedClass. W pierwszej pętli, jako typ elementy podajemy nazwę klasy, gdybyśmy mieli klasę z jeszcze większą nazwą to średnio by to wyglądało. W drugiej pętli korzystamy ze słowa kluczowego var, pętla dalej działa tak samo, ponieważ visualka z automatu rozpozna typ tego elementu na podstawie tego jakie elementy są w kolekcji po której będzie iterować
6. Słowa kluczowe break i continue

Słowo kluczowe break i continue można wykorzystać w trakcie działania pętli w momencie, gdy będziemy chcieli przerwać działanie pętli lub pominąć dalsze wykonywanie iteracji i przejść do kolejnej iteracji. W powyższym przykładzie mamy tablicę liczb całkowitych (int), pętla normalnie wykonywałaby się tyle razy ile elementów jest w tablicy. Dodałem instrukcję warunkową sprawdzającą czy zmienna i == 4 to ma przejść do kolejnej iteracji, natomiast jeśli trafi na wartość 8 to ma całkowicie przerwać wykonywanie pętli. Innymi słowy utrzymamy wartości od 1 do 8 bez 4, więc 9 i 10 będzie pominięte .


7. Pętle zagnieżdżone
Pętla zagnieżdżona jak sama nazwa wskazuje, jest to pętla w pętli. Może wydawać się skomplikowanie, ale w rzeczywistości jest to dość prosta rzecz, trzeba jedynie rozkminić i wiedzieć po co chce się mieć taką pętlę zagnieżdżoną.
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 10; j++)
{
Console.WriteLine($"{i} + {j} = {i + j}");
if (j > 8)
{
Console.WriteLine("...");
break;
}
}
break;
}

Console.WriteLine("Prosta tabliczka mnożenia: ");
for (int y = 1; y <= 10; y++)
{
for (int x = 1; x <= 10; x++)
Console.Write($"{x * y}".PadRight(4));
Console.WriteLine();
}

Podsumowując jak widzisz, mamy dość sporo rodzajów pętli, każda może przydać się do czegoś innego. Natomiast jeśli chodzi o pętle zagnieżdżone to tutaj nie ma ograniczenia co do typów, więc nie jest powiedziane, że tylko pętla for może być w pętli for, albo while tylko w pętli while, można je dowolnie ze sobą łączyć, zależnie od potrzeb:)
