Były już instrukcje, przyszedł teraz czas na pętle. Pętle różnią się od instrukcji tym, że instrukcje sprawdzają warunek i podejmują działanie, pętle działają jeśli warunek jest spełniony spełniony, opuszczamy pętle dopiero gdy warunek nie zostanie spełniony. Omówimy sobie pętle while… i pętle do…while… .
Podstawowa różnica jest taka, że do-while, najpierw wykonuje instrukcję, a potem sprawdza warunek, natomiast while najpierw sprawdza warunek, następnie wykonuje instrukcję (jeśli jest spełniony).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
int x = 1; string str = "teskt"; do { Console.WriteLine(str); } while (x == 0); while (x == 0) { Console.WriteLine(str); } //Wyświetli //tekst |
W powyższym kodzie warunkiem jest (x == 0), w pierwszej pętli, najpierw wyświetlony jest tekst, a następnie sprawdzany warunek (1 == 0), który jest fałszywy, powoduje to wyjście z pętli. W drugiej pętli najpierw sprawdzany jest warunek (1 == 0) który jest fałszywy, więc instrukcja nie jest wykonana, a konsekwencją jest wyjście z pętli. W pętlach szeroko wykorzystywane są operatory przyrostów. Automatycznie zwiększają wartość zmiennej warunku:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
int x = 0; Console.WriteLine("Pętla while..."); while (x <= 4) { Console.WriteLine(x); x++; // to samo co x=x+1 } Console.WriteLine("Pętla do...while..."); do { x--; // to samo co x=x-1 Console.WriteLine(x); } while (x >= 1); //Wyświetli: //Pętla while... //0 //1 //2 //3 //4 //Pętla do...while... //4 //3 //2 //1 //0 |
Taki zabieg powoduje kontynuowanie pętli do momentu spełnienia warunku. Niestety zła konstrukcja warunku, może spowodować zapętlenie, nasza pętla nie zostanie nigdy opuszczona i program będzie powtarzał instrukcję do momentu wyłączenia programu. Pętle można opuścić, również wykorzystując słowo klucz „break”.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
int x = 0; Console.WriteLine("Pętla while..."); while (true) { Console.WriteLine(x); x++; // to samo co x=x+1 if (x == 5) break; } Console.WriteLine("Pętla do...while..."); do { x--; // to samo co x=x+1 Console.WriteLine(x); if (x == 0) break; } while (true); //Wyświetli //Pętla while... //0 //1 //2 //3 //4 //Pętla do...while... //4 //3 //2 //1 //0 |
Pętla działa identycznie jak poprzednia, warunek „} while (true);” gwarantuje, że zawsze będzie spełniony. Momentem wyjścia z pętli jest spełnienie warunku instrukcji if (if (x == 0) break;) i użycie klucza break do jej zatrzymania i wyjścia. Do wyjścia z pętli możemy również wykorzystać skok i etykietę:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
int x = 0; Console.WriteLine("Pętla while..."); while (true) { Console.WriteLine(x); x++; // to samo co x=x+1 if (x == 5) goto EndWhile; } EndWhile:; Console.WriteLine("Pętla do...while..."); do { x--; // to samo co x=x+1 Console.WriteLine(x); if (x == 0) goto EndDoWhile; } while (true); EndDoWhile:; //Wyświetli //Pętla while... //0 //1 //2 //3 //4 //Pętla do...while... //4 //3 //2 //1 //0 |
Efekt będzie identyczny, zalecam jednak, abyście korzystali z pierwszej metody konstrukcji pętli. Nie każdy język programowania wykorzystuje „goto” i nie każdy musi korzystać z etykiet, ale pętle do..while… i while…do… zawiera każdy język programowania. Dlatego warto, jest tak konstruować warunki, aby nie wyskakiwać z pędzącej pętli (jeśli się da). Poniższy kod zmusza użytkownika do wpisania imienia:
1 2 3 4 5 6 7 8 9 10 11 12 |
Console.WriteLine("Jak masz na imię?"); string imie; do { imie = Console.ReadLine(); if (imie.Length == 0) { Console.WriteLine("Nic nie wpisałeś, postaraj się."); } } while (imie.Length == 0 ); Console.WriteLine("Witaj "+ imie); |
Powyższy kod powtarza się ,dopóki użytkownik czegoś nie wpisze, niekoniecznie musi to być imię, ponieważ sprawdzenie, czy jest to imię, wymagałoby połączenia większej ilości instrukcji sprawdzających wpisany tekst.