Strona główna » Kursy » Kurs C# » Pętla While
 

Pętla While

Wstęp

Pętla while to podstawowa pętla, która pozwala przeprowadzić te same operacje dla każdego elementu danych, albo pozwala na wykonywanie tych samych instrukcji nieskończoną ilość razy. Dzięki nim działanie programów można dostosować do wprowadzonych danych i pozwoli to zaoszczędzić czasm ponieważ nie trzeba będzie pisać tego samego fragmentu kodu wiele razy.

Definicja

Instrukcja while musi mieć podany warunek zapisany w nawiasach okrągłych, a następnie zestaw instrukcji zapisany w bloku instrukcji (albo bez bloku, wtedy do pętli należy tylko następna instrukcja). Program będzie wykonywał wtedy podane do pętli instrukcje tak długo, aż warunek będzie spełniony. Oto szkic wyglądu funkcji:

  1. while ([warunek]) {
  2.   [instrukcje];
  3. }

W miejsce warunku można dodać porównanie liczb, wartość logiczną, albo wyrażenie złożone z porównań i operatorów logicznych. Dla bloku instrukcji nie są nałożone jakiekolwiek ograniczenia.

Zastosowanie

Wypisywanie Liczb od 1 do 10

Napiszemy teraz program, który wypisze kolejne liczby naturalne od 1 do 10. Można to osiągnąć jeśli poza pętlą zostanie zadeklarowana dodatkowa zmienna, która będzie zwiększana w każdej iteracji. Iteracją nazywamy pojedyncze wywołanie pętli. Warunkiem zatrzymania będzie osiągnięcie maksymalnej wartości 10 przez licznik. Kod będzie następujący:

  1. int i = 1;
  2. while(i <= 10) {
  3.   Console.Write("{0} ", i);
  4.   i++;
  5. }
  6. Console.ReadKey();

(1.) Na początku przypisujemy licznikowi i wartość 1 czyli wartość od której rozpoczynamy wypisywanie. Potem w pętli (2.) dajemy warunek, że i musi być mniejsze bądź równe 10. Jeśli warunek jest spełniony to (3.) wypisujemy aktualną wartość i (4.) zwiększamy wartość licznika i o 1.

Po uruchomieniu program wypisze na ekran:

  1. 1 2 3 4 5 6 7 8 9 10

Wypisywanie Liczb od 1 do n

W warunku wykonujemy porównanie arytmetyczne, ale jak wiadomo może ono dotyczyć dwóch zmiennych, a nie tylko zmiennej i pewnej stałej wartości. Przed pętlą możemy wczytać od użytkownika pewną wartość n, a następnie dopóki i nie będzie większej od tej wartości to wypisywać kolejne liczby. Kod wymaga dopisania jednej linijki i zmiany warunku:

  1. int n = Convert.ToInt32(Console.ReadLine());
  2. int i = 1;
  3. while (i <= n) {
  4.   Console.Write("{0} ", i);
  5.   i++;
  6. }
  7. Console.ReadKey();

Od teraz program może wypisać dowolną ilość liczb w zakresie od 1 do n (oczywiście należy pamiętać, że zmienne mają pewną pojemność). Przykładowo jeśli użytkownik wpisze, że n = 5 to program wyświetli tylko pierwsze pięć liczb naturalnych:

  1. 1 2 3 4 5

Sumowanie wartości

Innym przykładem zastosowania pętli while jest warunek zwycięstwa. Otóż wewnątrz pętli można wczytywać kolejne wartości tak długo, aż suma liczb będzie odpowiednio duża. Przypuśćmy, że gracz najpierw wpisuje wartość do osiągnięcia, a następnie podaje liczby tak długo, aż ich suma przekroczy wartość początkową.

  1. Console.WriteLine("Podaj wartość do osiągnięcia");
  2. int wartosc = Convert.ToInt32(Console.ReadLine());
  3. int suma = 0;
  4. Console.WriteLine("Wpisuj kolejne liczby:");
  5. while (suma < wartosc) {
  6.   int liczba = Convert.ToInt32(Console.ReadLine());
  7.   suma += liczba;
  8. }
  9. Console.WriteLine("Suma przekroczyła {0}!", wartosc);

W powyższym programie (2.) wczytujemy od użytkownika wartość, którą chcemy wysumować oraz (3.) ustawiamy początkową wartość sumy na 0. Potem (5.) dopóki wartość sumy jest mniejsza od wartości górnej to: (6.) wczytujemy liczbę i (7.) dodajemy ją do aktualnej sumy. Na koniec (9.) program podaje użytkownikowi informację, że wartość górna została przekroczona.

Instrukcja brake

Przypuśćmy, że chcemy opuścić pętle szybciej niż zakłada to warunek. Przykładem może być dokonywanie kilku etapów operacji matematycznych i w pewnym momencie możemy śmiało już stwierdzić, ze dalej pętla nie musi być wywoływana. Wtedy w kodzie można zapisać instrukcję break;, która zakończony wykonywanie pętli.

Przykładowo program, który wypisuje liczby od 1 do n może mieć zastosowaną funkcję break;, aby zatrzymać wypisywanie danych.

  1. int n = Convert.ToInt32(Console.ReadLine());
  2. int i = 1;
  3. while (true) {
  4.   Console.Write("{0} ", i);
  5.   i++;
  6.   if (i > n)
  7.     break;
  8. }

(7.) Warunek użyty do zatrzymania nieskończonej pętli jest inny niż poprzednio użyty, ponieważ teraz chcemy wykryć kiedy wartość i przekroczy wartość n. Do tej pory sprawdzaliśmy kiedy wartość i nie przekroczy wartości n.

Błędy implementacji

Chociaż działanie programu zależy tylko od programisty to należy wystrzegać się pisania pętli nieskończonych takich jak:

  1. while(true);

Bardziej typowym błędem, szczególnie dla osób dopiero uczących się jest zapomnienie, że wartość licznika warunkującego zakończenie pętli należy modyfikować. Poniższa pętla jest również pętlą nieskończoną:

  1. int i = 1;
  2. while(i < 10){
  3.   Console.WriteLine("{0} ", i);
  4. }

W tym przypadku jest jeszcze możliwe, aby wykryć ten błąd, ponieważ program cały czas na konsolę będzie wypisywać wartość "1". Jednak, gdyby program wynik zapisywał do pliku lub wewnątrz pętli wykonywane były operacje arytmetyczne to znalezienie takiego rodzaju błędu byłoby trudne do uchwycenia.

Podsumowanie

Pętla while pozwala na pisanie bardziej złożonych programów, które określone czynności mogą powtarzać odpowiednią ilość razy, albo dopóki nie zostanie konkretny warunek. Należy jednak używać jej z rozwagą, ponieważ może się okazać, że napisana pętla okaże się nieskończoną pętlą ..

Zadania

Zadanie 1

Napisz program, który wczyta od użytkownika dwie liczby a i b, a następnie wypisze na ekran wszystkie liczby całkowite, które należą do zakresu [a, b]. Należy przyjąć, że podany zakres danych podany przez użytkownika będzie poprawny.

Przykładowo jeśli użytkownik poda a = 10 i b = 15 to program wypisze:

  1. 10 11 12 13 14 15

Zadanie 2

Napisz program, który wypisze wszystkie liczby nieparzyste w zakresie od 1 do n, gdzie n jest liczbą wczytaną od użytkownika.

Przykładowo jeśli użytkownik poda n = 8 to program wypisze:

  1. 1 3 5 7

Zadanie 3

Napisz program, który najpierw wartość docelową, a następnie będzie tak długo wczytywał liczbę, aż suma będzie równa wartości docelowej. Jednak tym razem przyjmujemy, że dopóki suma jest mniejsza od wartości docelowej to wczytaną liczbę dodajemy, a w przeciwnym wypadku odejmujemy.

Przykładowo jeśli użytkownik poda w = 10 to program skończy pracę po wpisaniu kolejno:

  1. 5 6 4 3

Wyjaśnienie przykładu: początkowo suma jest zwiększana o 5 do 5, potem o 6 do 11. Jej wartość jest większa od docelowej wartości 10, więc następna wartość zmniejsza 11 o 4 do 7. Teraz wartość jest ponownie mniejsza od 10, więc wczytaną liczbę 3 dodajemy i uzyskujemy wartość równą docelowej. Program kończy działanie.