Zamknij komunikat

Nowy Office 2013
Do góry Skomentuj

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

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

Daniel Celeda
3 maja 2006
107 673
Odsłony
Daniel Celeda
3 maja 2006
107 673
Odsłony

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?

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();
    }
}

Zobacz również

Komentarze

for(;;) wcale nie jest takie bezsensowne -- fajnie w ten sposob mozna zrobic menu, ktore bedzie sie w kolko pojawialo :)
Gość, 2 września 2006, 17:33
"Wewnątrz nawiasów znajdują się trzy części oddzielone średnikami. Pierwsza zawiera instrukcje wykonującą się na początku każdej iteracji." - Chyba na początku pierwszej iteracji albo nawet przed...
Magik, 17 czerwca 2007, 23:12
Kurs jest naprawde fajny. Umiem juz C i C++ ale musze przyswoic C# wiec czytam, jednak natknalem sie na dosc spory blad! Daniuelu. Piszesz ze "Pierwsza zawiera instrukcje wykonującą się na początku każdej iteracji" a tak na prawde ona wykonuje sie tylko raz po wejsciu do petli przed pierwsza iteracja. Gdyby bylo tak jak piszesz to petla for(x=0;x<10;x++) nie skonczylaby sie wcale bo po kazdym x++ x wracaloby ze swoja wartoscia do zera wiec warunek x<10 bylby prawdziwy zawsze
Maciek, 1 lipca 2007, 15:37
"Zmienne „podstawa” oraz „wykladnik” są typu string, ponieważ pobieramy ich wartości za pomocą metody „WriteLine()”, która zwraca typ tekstowy jako wynik." - co to za głupota? Najpierw z pętlą for, teraz z metodami... Zamiast WriteLine() powinno być ReadLine(). Ciekawe, czy autor czytał swój artykuł? Ale nawet jakby nie przeczytał, to nic by się nie stało - wystarczyło by potem na komentarze spojrzeć... po dacie komentarzy wnioskuje, że tego nie robi (we wcześniejszych rozdziałach byłu uwagi dotyczące kursu z poprzednich wakacji - 2006). Na koniec pochwalę autora - idea napisania kursu jest dobra, a jej realizacja chwalebna... tylko te parę poprawek nanieść - zgłaszanych przez użytkowników. PS: W żadnym rozdziale jak do tej pory nie działa mi "Pokaż rozwiązanie", albo funkcja JavaScript znajdująca się pod tym odnośnikiem nic nie robi.
Kot-ek, 19 listopada 2007, 09:46
Dziala w IE
T, 4 grudnia 2007, 00:22
i dziala pod opera...
HideYoshi, 17 stycznia 2008, 16:27
:)calkiem, calkiem...da się zakumać:)
misia, 28 stycznia 2008, 19:45
Najbardziej nie lubie ludzi czepiajacych sie banalow typu "Napisales WriteLine zamiast ReadLine", ten kurs wymaga troche od Ciebie :) zebys pomyslal.
Jacek, 11 lutego 2008, 14:14
kocham informatykę i wszystko co jest z nią związane traktuję jako przyjemnosc ;))
evv, 4 marca 2008, 18:13
aby w firefoxie wyczaic jakie jest rozwiazanie zadania wystarczy wejsc w zrodlo strony, wyszukac slowo "cwiczenie" (jak w js) i skopiowac czesc ktora odpowiada za tresc kodu (czesc ponizej). Wtedy ladnie wrzuca sie do pliku .html na lokalnym serwerze (IIE ,apache) i widzimy kod rozwiazania zadania:) Daj palec to chcą rekę... ;> :P
DzIkI, 9 kwietnia 2008, 16:27
ps. sorka, nie trzeba uruchamiac na serwerze. wystarczy tak zapisany plik uruchomic w przegladarce. to tak z pospiechu :D, pzdr
DzIkI, 9 kwietnia 2008, 16:29
Ja używam przeglądarki wbudowanej w C# studio i chodzi idealnie. W darmowej wersji zdaje się jest ta sama przeglądarka, więc nie ma się co rzucac. A i tak pracujecie chyba w C#Studio, więc po co mie włączoną jeszcze przeglądarkę, hę?
zebra!, 28 kwietnia 2008, 16:20
?

nieaktualne, 6 listopada 2008, 11:33
Szkoda tylko, że konsola mieści tylko 299 linii
 

Domints, 16 listopada 2008, 18:00
Mi też nie wyświetlają się rozwiązania pod firefoxem i jest to troche uciążliwe, a możnaby wyświatlać te rozwiązania zwyczanie bez skryptów js. Niestety nie używam też C# studio, tylko linuxowego odpowiednika MonoDevelop w którym nie mam przeglądarki internetowej :(
Poza tym kurs jest super, poza tymi kilkoma wpadkami autora, które jadnak można jakoś przeżyć :)

Marker, 23 stycznia 2009, 19:04
Ja tak robiłem ekwipunek w RPG Makerze Xp.
Xevo, 30 maja 2011, 18:49
20 do potęgi 20 wyszło 0 ale taki mały szczegół :)
Carlos, 12 kwietnia 2012, 14:47

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.