13. Instrukcje iteracyjne (tzw. pętle) - cz. I

13. Instrukcje iteracyjne (tzw. pętle) - cz. I

 Daniel Celeda
Daniel Celeda
00:00
03.05.2006
109527 wyświetleń

Zacznijmy od wyjaśnienia pojęcia iteracja. Można powiedzieć, że jest to jedno wykonanie wielokrotnie powtarzającej się czynności. Wyobraźmy sobie sytuację, w której musimy napełnić 3 kufle piwem. Wykonując  to zadanie powtórzymy 3 razy te same czynności:

  1. - przygotować kufel,
    - otworzyć butelkę,
    -
    nalać piwo do kufla,
  2. - znowu przygotować kufel,
    -
    ...

Nasze zadanie składa się, więc z 3 iteracji.

Co mają wspólnego iteracje z programowaniem? Bardzo dużo, ponieważ instrukcje iteracyjne pozwalają nam zmniejszyć ilość kodu źródłowego oraz wykonać zadania, w których dopiero podczas działania programu wiadomo ile instrukcji wymagają.

Instrukcje iteracyjnie potocznie nazywa się pętlami.

Potęgowanie

Potęgowanie może być dobrym przykładem instrukcji iteracyjnej.

Bez instrukcji iteracyjnych nie jest łatwo napisać metodę potrafiącą potęgować (należałoby skorzystać z rekurencji, której nie poznaliśmy). Jednak używając pętli oraz operatorów „+” oraz „*” możemy osiągnąć ten cel.

Algorytm wyglądałby mniej więcej tak:

  • podajemy podstawę potęgi,

  • podajemy wykładnik,

  • korzystając z pętli mnożymy podstawę przez siebie tyle razy ile wynosi wykładnik pomniejszony o 1.

Pętla for

Jest to prawdopodobnie najczęściej stosowana instrukcja warunkowa. Jej budowa (składnia) wygląda następująco:

for( liczba całkowita ; warunek logiczny ; instrukcja)
{
    ciało pętli
}

„for” to słowo kluczowe rozpoczynające pętle. Wewnątrz nawiasów znajdują się trzy części oddzielone średnikami. Pierwsza zawiera instrukcje wykonującą się na początku każdej iteracji. Zazwyczaj deklaruje się w niej liczbę, która będzie nam służyła jako indeksator iteracji, czyli w uproszczeniu określi ile razy ciało pętli ma się wykonać. Druga będąca warunkiem logicznym decyduje o zakończeniu wykonania pętli, jeśli warunek jest prawdziwy rozpocznie się następna iteracja w przeciwnym wypadku pętla zakończy się. Trzecia ostatnia część to instrukcja wykonująca się na końcu każdej iteracji. Zazwyczaj zmieniana jest tam wartość indeksatora.

Czas na prosty przykład. Napiszmy program wypisujący na ekranie trzy liczby od 1 do 3 na dwa sposoby: bez użycia oraz z użyciem instrukcji iteracyjnych.

class KlasaGlowna
{
    static void Main()
    {
        int a = 1;
        int b = 2;
        int c = 3;
 
        System.Console.WriteLine(a);
        System.Console.WriteLine(b);
        System.Console.WriteLine(c);
        System.Console.Read();
   
}
}

Wynik wykonania:

Teraz użyjmy instrukcji “for”.

class KlasaGlowna
{
    static void Main()
    {
        for (int indeksator = 1; indeksator <= 3; indeksator++)
        {
            System.Console.WriteLine(indeksator);
        }
 
        System.Console.Read();
   
}
}

Wynik będzie identyczny jak po wykonaniu poprzedniego programu. Ktoś może się spytać po co, więc używać instrukcji warunkowych jeśli poradziliśmy sobie bez nich. Po pierwsze to nie zawsze jest to możliwe, a po drugie co wtedy jeśli mielibyśmy wypisać tysiąc kolejnych liczb?

@STRONA@

Należy wiedzieć, że pętla „for” nie musi zawierać wszystkich trzech części wewnątrz nawiasów. Dozwolona jest na przykład taka konstrukcja:

class KlasaGlowna
{
    static void Main()
    {
        for (; ; )
        {
            System.Console.WriteLine("Hello");
       
}
    }
}

Wynik niestety nie będzie zbyt sensowny, ponieważ w nieskończoność wypisywane na ekranie będzie słowo “Hello”.

 

Za to poniższy kod jest jak najbardziej poprawny:

class KlasaGlowna
{
    static void Main()
    {
        int indeksator = 1;
 
        for (; indeksator <= 3; indeksator++)
        {
            System.Console.WriteLine(indeksator);
        }
 
        System.Console.Read();
   
}
}

Wynik będzie taki sam jak podczas wykonania programów z początku rozdziału,  a więc wypisane zostaną trzy kolejne liczby od 1 do 3.

Jednak powinno się unikać takich konstrukcji i używać pętli „for” w standardowy sposób.

Przejdźmy teraz do potęgowania.

class KlasaGlowna
{
    static void Main()
   
{
        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);
        System.Console.Read();
    }
}
 

Najpierw podajemy dwie liczby będące podstawą i wykładnikiem. Następnie określamy wynik jako „1”. W pętli wynik mnożymy przez podstawę tyle razy ile wynosi wykładnik. Jeśli wykładnik wynosi „0” to nie wykona się żadna iteracja pętli i wynik będzie wynosił „1”, czyli tyle ile powinien (liczba podniesiona do potęgi „0” daje nam „1”). Zmienne „podstawa” oraz „wykladnik” są typu string, ponieważ pobieramy ich wartości za pomocą metody „WriteLine()”, która zwraca typ tekstowy jako wynik. Dlatego w dalszej części programu musimy konwertować te zmienne z typu tekstowego na całkowitoliczbowy za pomocą metody „Parse()”. A oto wynik działania naszego programu:

Ćwiczenie

Za pomocą instrukcji „for” napisz program obliczający silnię.

class KlasaGlowna
{
    static void Main()
   
{
        System.Console.WriteLine("Podaj liczbę.");
        string
liczba = System.Console.ReadLine();
       
int wynik = 1;
 
        for (int i = 1; i <= int.Parse(liczba); i++)
        {
            wynik *= i;
        }
 
        System.Console.WriteLine("Wynik wynosi: " + wynik);
        System.Console.Read();
    }
}


Spodobał Ci się ten artykuł? Podziel się z innymi!

Źródło:

Polecamy również w kategorii Kurs C#, cz. I