Zamknij komunikat

Nowy Office 2013
Do góry Skomentuj

14. Instrukcje iteracyjne (tzw. pętle) - cz. II

14. Instrukcje iteracyjne (tzw. pętle) - cz. II

Daniel Celeda
9 maja 2006
127 562
Odsłony
Daniel Celeda
9 maja 2006
127 562
Odsłony

Instrukcję „for” wykorzystuje się zazwyczaj wtedy, gdy wiadomo ile iteracji ma się wykonać np. i < 10. Instrukcje „while” oraz „do ... while” zazwyczaj wtedy, gdy większe znaczenie ma prawdziwość warunku, a nie ilość wykonań. Jest to subtelna różnica, którą zaczyna się wyczuwać wraz ze zdobytym doświadczeniem.

Pętla while

Pętla ta ma następującą budowę:

while( warunek )
{
ciało pętli
}

Najpierw sprawdzany jest warunek znajdujący się pomiędzy nawiasami. Jeśli jego wynik jest prawdziwy to wykonują się instrukcje znajdujące się wewnątrz pętli, a więc jej ciało. W przeciwnym wypadku wykonanie programu omija pętle i wykonuje się instrukcja znajdująca się bezpośrednio za pętlą. Wykonywanie pętli jest kontynuowane dopóki warunek jest prawdziwy, tak więc jeśli nie chcemy aby iteracji nie była nieskończona ilość musimy odpowiednio wpłynąć na prawdziwość warunku (w pewnym momencie musi być nieprawdziwy aby instrukcja „while” zakończyła się).

Napiszmy program, który zapyta nas o hasło. Jeśli podamy poprawne (w tym wypadku jest nim wyraz „tajne”) to wyświetli się komunikat powiadamiający nas o tym, w przeciwnym wypadku program zawiadomi nas o błędzie i poprosi o ponowne wprowadzenie hasła. Dopóki nie podamy poprawnego, program będzie powtarzał pytanie w pętli.

class KlasaGlowna
{
    static void Main()
    {
        System.Console.Write("hasło: ");
        string haslo = System.Console.ReadLine();
 
        while (haslo != "tajne")
        {
            System.Console.WriteLine("Podałeś; złe hasło. Spróbuj jeszcze raz.");
            System.Console.Write("hasło: ");
            haslo = System.Console.ReadLine();
        }
        System.Console.WriteLine("Brawo! Podałeś; poprawne hasło.");
        System.Console.Read();
    }

Na początku pobieramy hasło za pomocą instrukcji „ReadLine()” i przypisujemy jego zawartość do zmiennej „haslo”. Następnie w instrukcji „while” sprawdzamy czy podane hasło nie jest równe wyrazowi „tajne”. Warunek jest prawdziwy jeśli podaliśmy niepoprawne hasło, dlatego wykona się ciało pętli. Wewnątrz pętli znowu pobieramy hasło i zanim wykona się następna iteracja, ponownie sprawdzamy prawdziwość warunku. W momencie gdy podamy poprawne hasło, warunek zwróci wartość „false” (nieprawda), następna iteracja nie wykona się i instrukcja „while” zostanie przerwana.

A oto wynik:

Instrukcja „do ... while”

Różnica między „while” a „do ... while” jest niewielka. W zasadzie sprowadza się ona do tego, że w przypadku „while” warunek sprawdzany jest przed wykonaniem iteracji, a w przypadku „do ... while” na końcu. Co nam to daje?
Wykorzystując pętlę „while” musimy spodziewać się tego, że jest szansa, że nie wykona się ani jedna iteracja. Natomiast w przypadku „do ... while” mamy pewność, że wykona się przynajmniej jedna.
Napiszmy program do pobierania hasła jeszcze raz, tym razem używając pętli „do ... while”.

class KlasaGlowna
{
    static void Main()
    {
        string haslo;
        do
        {
            System.Console.Write("hasło: ");
            haslo = System.Console.ReadLine();
        }
        while (haslo != "tajne");
 
        System.Console.WriteLine("Brawo! Podałeś poprawne hasło.");
        System.Console.Read();
    }

Program pyta się nas o hasło, następnie sprawdza prawdziwość warunku. Jeśli jest prawdziwy to wykonuje się następna iteracja, jeśli nie to pętla kończy swoje działanie. Zauważmy także, że w przypadku instrukcji „do ... while” należy umieścić średnik zaraz po nawiasie zamykającym, znajdującym się po warunku.

Działanie tego programu jest trochę inne niż poprzedniego, ponieważ aplikacja nie powiadamia nas o błędnie wprowadzonym haśle. Jeśli chcielibyśmy to zmienić powinniśmy dodać wyświetlanie komunikatu o błędzie i wprowadzić dodatkową instrukcję warunkową.

class KlasaGlowna
{
    static void Main()
    {
        string haslo;
        System.Console.Write("hasło: ");
        haslo = System.Console.ReadLine();
        do
        {
            if (haslo != "tajne")
            {
                System.Console.Write("hasło: ");
                haslo = System.Console.ReadLine();
            }
        }
        while (haslo != "tajne");
 
        System.Console.WriteLine("Brawo! Podałeś poprawne hasło.");
        System.Console.Read();
    }

Powyższe rozwiązanie nie jest idealne, dlatego jeśli chcemy wyświetlać komunikat o błędzie lepiej użyć instrukcji “while”, jeśli nie chcemy “do … while”.

Użycie for oraz while w jednym przykładzie

Powróćmy do przykładu z poprzedniego rozdziału, a więc potęgowania. Poprzedni program obliczał zadanie i kończył swoje działanie. Musieliśmy ponownie go uruchamiać, jeśli chcieliśmy znowu coś obliczyć. Dzięki instrukcjom warunkowym możemy sami decydować kiedy chcemy aby program się zakończył.

class KlasaGlowna
{
    static void Main()
    {
        string koniec;
        do
        {
            System.Console.WriteLine("Podaj podstawę.");
            string podstawa = System.Console.ReadLine();
            System.Console.WriteLine("Podaj wykładnik");
            string wykladnik = System.Console.ReadLine();
            int wynik = 1;
 
            for (int i = 0; i < int.Parse(wykladnik); i++)
            {
                wynik *= int.Parse(podstawa);
            }
            System.Console.WriteLine("Wynik wynosi: " + wynik);
 
            koniec = System.Console.ReadLine();
        }
        while (koniec != "k");
 
        System.Console.WriteLine("Papa!");
        System.Console.Read();
    }

Pętla „do ... while” jest zewnętrzna w stosunku do „for” („for” znajduje się w ciele „do ... while”). Program będzie się wykonywał, czyli będzie obliczał dla nas potęgi, do momentu gdy wprowadzimy „k” z klawiatury.

Istnieje jeszcze pętla „foreach”, jednak z jej omówieniem musimy poczekać do momentu aż poznamy takie typy danych jak tablice czy kolekcje.

Ćwiczenie

Napisz kalkulator umożliwiający dodawanie, odejmowanie, mnożenie, dzielenie, potęgowanie oraz obliczanie silni. Działanie programu ma się kończyć po wciśnięciu klawisza „k”.

class KlasaGlowna
{
      static void Main()
      {
            string koniec;
            do
            {
                  string x;
                  string y;
                  string dzialanie;
                  double wynik = 0;
             
                  System.Console.WriteLine("Wybierz działanie: \n1) Mnożenie \n2) Dzielenie");
                  System.Console.WriteLine("3) Dodawanie \n4) Odejmowanie \n5) Potęgowanie \n6) Silnia");
                  dzialanie = System.Console.ReadLine();
                  if(int.Parse(dzialanie) < 6)
                  {
                        System.Console.WriteLine("Podaj pierwszą liczbę.");
                        x = System.Console.ReadLine();
                        System.Console.WriteLine("Podaj drugą liczbę.");
                        y = System.Console.ReadLine();
 
                        if(dzialanie == "1")
                        {
                              wynik = double.Parse(x) * double.Parse(y);
                        }
                        if(dzialanie == "2")
                        {
                              wynik = double.Parse(x) / double.Parse(y);
                        }
                        if(dzialanie == "3")
                        {
                              wynik = double.Parse(x) + double.Parse(y);
                        }
                        if(dzialanie == "4")
                        {
                              wynik = double.Parse(x) - double.Parse(y);
                        }
                        if(dzialanie == "5")
                        {
                              wynik = 1;
                              for(int i = 0; i < int.Parse(y); i++)
                              {
                                    wynik *= int.Parse(x);
                              }
                        }
                  }
                  else if(dzialanie == "6")
                  {
                        System.Console.WriteLine("Podaj liczbę.");
                        x = System.Console.ReadLine();
 
                        wynik = 1;
                        for(int i = 1; i <= int.Parse(x); i++)
                        {
                              wynik *= i;
                        }
 
                  }
                   System.Console.WriteLine("Wynik wynosi: " + wynik + "\ Jeżeli chcesz zakończyc nacisnij \"k\".");
                   koniec = System.Console.ReadLine();
            }
            while(koniec != "k");
      }
 
}
 

 

Zobacz również

Komentarze

Musze przyznac ze bardzo przyjazny kursik.
Peterson, 29 sierpnia 2006, 18:26
Blad w kodzie programu pytającego o hasło - brak "}" na końcu... Poza tym kursik zajefajny
DISZ, 1 września 2006, 17:24
Błędów jest więcej... "Działanie tego programu jest trochę inne niż poprzedniego, ponieważ aplikacja nie powiadamia nas o błędnie wprowadzonym haśle. Jeśli chcielibyśmy to zmienić powinniśmy dodać wyświetlanie komunikatu o błędzie i wprowadzić dodatkową instrukcję warunkową." Potem następuje kod programu, ale nadal zachowuje się tak samo jak poprzedni (nie wprowadzone zostało to, co autor miał zamiar wprowadzić - przynajmniej nie w 100%). Brakuje linijki: "System.Console.WriteLine("Podałeś; złe hasło. Spróbuj jeszcze raz.");" w zasięgu tego if"a: "if (haslo != "tajne")".
Kot-ek, 19 listopada 2007, 09:59
wystarczy w instrukcji writeline ("haslo:") w petli if zmienic na writeline("podales zlke haslo")
emil, 5 kwietnia 2008, 21:12
potega tez źle działa,

ar, 23 października 2008, 14:04
sorki mój błąd

ar, 23 października 2008, 14:06
I jeszcez jeden błąd po while(warunek) nie może być średnika. Pozdrawiam

Kasia, 7 listopada 2008, 12:13
A nie również mój błąd, przy instrukcji while... do średnika nie ma a przy do... while jest

Kasia, 7 listopada 2008, 12:16
Switch był by lepszym rozwiązaniem zamiast tych if"ów w rozwiązaniu zadania domowego, ale kurs świetny :).
DeathHowk, 19 czerwca 2013, 18:10
Kurs fajny, ale tu bym wrzucił switch
Wierzbno, 4 maja 2016, 07:45
Kurs fajny, ale tu bym wrzucił switch
Wierzbno, 4 maja 2016, 07:45

Dodaj swój komentarz

Zasady publikacji komentarzyZasady publikacji komentarzy

Redakcja CentrumXP.pl nie odpowiada za treść komentarzy publikowanych na stronach Portalu
i zastrzega sobie prawo do usuwania wypowiedzi, które:

  • zawierają słowa wulgarne, obraźliwe, prowokujące i inne naruszające dobre obyczaje;
  • są jedynie próbami reklamowania stron internetowych (spamowanie poprzez umieszczanie linków);
  • przyczyniają się do złamania prawa bądź warunków licencyjnych oprogramowania (cracki, seriale, torrenty itp.);
  • zawierają dane osobowe, teleadresowe, adresy mailowe lub numery GG;
  • merytorycznie nie wnoszą nic do dyskusji lub nie mają związku z tematem komentowanego newsa, artykułu bądź pliku.