background image

Instrukcje iteracyjne w C#

Opracował dr Robert Fidytek 

background image

2

Pętle

Często mamy do czynienia z sytuacją, że 
pewną instrukcję lub grupę instrukcji należy 
wykonać pewną określoną liczbę razy lub aż 
zostanie spełniony pewien warunek. 

W takich sytuacjach z pomocą przychodzą nam 
pętle, które nazywane są również instrukcjami 
iteracyjnymi. Wyróżniamy następujące rodzaje 
pętli:

for

while

do - while 

foreach

W przypadku pętli istnieje niebezpieczeństwo, że się zapętli. Instrukcje są wykonywane 
w nieskończonej pętli z powodu podania złego warunku wyjścia z pętli. 

background image

3

Pętla for

Postać pętli:

for

 (

instrukcja1

warunek

instrukcja2

      

Instrukcja3

;

Schemat działania:

Na początku wykonywana jest instrukcja1. Jest ona 
wykonywana tylko raz, podczas rozpoczęcia działania 
pętli. Następnie jest sprawdzana wartość wyrażenia 
logicznego warunek. Gdy warunek ma wartość false 
wykonanie pętli zostaje zakończone.Gdy warunek ma 
wartość true, to program przechodzi do wykonania 
instrukcji instrukcja3, a dopiero potem wykonuje 
instrukcję instrukcja2. Po wykonaniu instrukcji 
instrukcja2 ponownie przechodzimy do sprawdzenia 
wartości wyrażenia logicznego warunek i w zależności 
od jego wartości kontynuujemy wykonanie pętli lub nie.

Proszę zauważyć, że instrukcja1 nie jest wykonywana 
ponownie.

Uwaga: instrukcja1 najczęściej inicjuje licznik pętli, a 
instrukcja2 definiuje sposób zmiany licznika pętli.

background image

4

„Wybrakowana” pętla for ???

for

 (

instrukcja1

warunek

instrukcja2

      

instrukcja3

;

for

 

(

instrukcja1

;

 

warunek

;

 

instrukcja2

{
      

instrukcja3

;

}

for

 

(

instrukcja1

;

 

warunek

;

 

instrukcja2

{

      

instrukcja3_1

;

      

instrukcja3_2

;

      ...

      

instrukcja3_n

;

}

for

 (; 

warunek

instrukcja2

      

Instrukcja3

;

for

 (

instrukcja1

warunek

;) 

      

instrukcja3

;

for

 (; 

warunek

instrukcja2

) ;

for

 (; 

warunek

;) 

      

instrukcja3

;

for

 (; 

warunek

; ) ;

for

 (; ;) ;

background image

5

Proste użycie pętli for

int

 i;

for

 (i = 1; i <= 10; i++)

   

Console

.Write(

"{0}, "

,i);

int

 i;

for

 (i = 10; i >= 1; i--)

   

Console

.Write(

"{0}, "

,i);

int

 i;

for

 (i = 10; i >= 1; i-=3)

   

Console

.Write(

"{0}, "

,i);

background image

6

Zagnieżdżanie pętli for

//rysowanie prostokąta

   

int

 a = 3, b = 10, i, j;

for

 (i = 1; i <= a; i++)

{

    

for

 (j = 1; j <= b; j++)

        

Console

.Write(

"*"

);

    

Console

.WriteLine(

""

);

}

//tabliczka mnożenia

int

 i, j;

for

 (i = 1; i <= 10; i++)

{

    

for

 (j = 1; j <= 10; j++)

        

Console

.Write(

"{0,3} "

,i*j);

    

Console

.WriteLine(

""

);

}

background image

7

Przykład: Obliczanie silni

int

 silnia = 1, i, n;

Console

.Write(

"Podaj n = "

);

n=

Convert

.ToInt32(

Console

.ReadLine());

for

 (i = 1; i <= n; i++) 

    silnia *= i;

Console

.WriteLine(

"{0}!={1}"

,n,silnia);

n!=1*2*3*4*...*n

Czy program dobrze 
liczy wartość silni dla 
ujemnych wartości 
liczby n?

Jak to naprawić?

background image

8

Instrukcje oddzielone przecinkami ?!

int

 i, j;

for

 (i = 1

,

 j = 1; i <= 10; i += 2

,

 j += 3)

    

Console

.WriteLine(

"{0,8:c} + {1,8:c} = {2,8:c}"

, i, j, i + j);

for

 (

instrukcja1

warunek

instrukcja2

      

Instrukcja3

;

Instrukcje instrukcja1 instrukcja2 nie muszą być 
pojedynczą instrukcją. Może być ich kilka, wtedy 
poszczególne instrukcje oddzielamy przecinkami.

Co oznacza 
zapis {0,8:c}?

background image

9

Pętla while

Postać pętli:

while

 (

warunek

)

   

 instrukcja

;

lub

while

 (

warunek

)

{
    

instrukcja1

;

     ...
    

instrukcjan

;

}

Schemat działania:

Na początku sprawdzana jest wartość logiczna 
wyrażenia warunek. Gdy warunek ma wartość false 
wykonanie pętli zostaje zakończone.Gdy warunek ma 
wartość true, to program przechodzi do wykonania 
wykonania instrukcji. Następnie następuje ponowne 
sprawdzenie wartości logicznej wyrażenia warunek.

Uwaga: Wykonywane instrukcje powinny wpływać na 
wartość logiczną wyrażenia warunek, w przeciwnym 
razie pętla się zapęli i nigdy się nie zakończy.

background image

10

Przykład: Wielokrotne wypisywanie 

tekstu

int

 i = 1, ile = 100;

while

 (i <= ile)

{
    

Console

.WriteLine(

"Nie będę używał komórki na wykładzie."

);

    i++; 
}

background image

11

Przykład: Rysowanie trójkąta 

równoramiennego z gwiazdek

  
            

int

 i = 1, j = 1, n = 24;

            

while

 (i <= n)

            {
                j=1;
                

while

 (j <= i)

                {
                    

Console

.Write(

"*"

);

                    j++;
                }
                

Console

.WriteLine(

""

);

                i++; 
            }

background image

12

Przykład: Ciąg Fibonacciego

int

 a=0, b=1, c=1, i=0;

Console

.WriteLine(

"F({0,2}) = {1,5}"

,i++,a);

Console

.WriteLine(

"F({0,2}) = {1,5}"

,i++,b);

Console

.WriteLine(

"F({0,2}) = {1,5}"

,i++,c);

while

 (c <= 10000)

{
    a = b; b = c; c = a + b;
    

Console

.WriteLine(

"F({0,2}) = {1,5}"

,i,c);

    i++;
}

int

 a=0, b=1, c=1;

Console

.Write(

"{0}\n{1}\n"

, a, b);

Console

.Write(

"{0}\n"

, c);

 

while

 (c <= 10000)

{
    a = b; b = c; c = a + b;
    

Console

.WriteLine(c);

}

Wzór:

F(0)=0, F(1)=1, F(n) = F(n-1) + F(n-2)

  

background image

13

Pętla do - while

Postać pętli:

do

{
   

 instrukcje

;

while 

(

warunek

);

Schemat działania:

Najpierw wykonywane są instrukcje pętli. Po ich 
wykonaniu sprawdzane jest wyrażenie logiczne 
warunek. Jeżeli ma wartość true, to instrukcje pętli 
zostaną wykonane ponownie. Jeżeli wyrażenie 
warunek ma wartość false, to wykonanie pętli 
zostanie przerwane.

W przypadku pętli do - while mamy pewność, że 
instrukcje pętli zawesze zostaną wykonanie co 
najmniej raz.

background image

14

Przykład: Literki

string

 str;

do

{
    

Console

.Write(

"Podaj literkę: "

);

    str = 

Console

.ReadLine();

while

 (str != 

"k"

);

Console

.WriteLine(

"Koniec pętli do-while"

);

background image

15

Przykład: Średnia ocen

int

 ocena, suma=0, ilosc=0;

do

{
    

Console

.Write(

"Podaj ocene (0 konczy wprowadzanie): "

);

    ocena=

Convert

.ToInt32(

Console

.ReadLine());

    

if

 ((ocena >= 2) && (ocena <= 5)) 

    {
        suma += ocena;
        ilosc++;
    }

while

 (ocena != 0);

if

 (ilosc > 0)

{
    

Console

.WriteLine(

"Ilość wprowadzonych ocen: {0}"

,ilosc);

    

Console

.WriteLine(

"Srednia ocen: {0} "

,(

double

)suma/ilosc);

}

background image

16

Przykład: Odliczanie

using

 System;

using System.Threading;

namespace

 ConsoleApplication9

{
    

class

 

Program

    {
        

static

 

void

 Main(

string

[] args)

        {
            

int

 n=10;

            

while

 (n >= 1)

            {
                

Console

.WriteLine(n--);

                

Thread.Sleep(500);

 

//opóźnienie 500 ms = 0,5 s

            }
            

Console

.WriteLine(

"\nBUM !!!"

);

            

Console

.ReadKey(true);

        }
    }
}

background image

17

Pętla: foreach

Pętla foreach przechodzi dokładnie raz przez 
każdy element tablicy.

Pojęcia tablicy i składnia pętli foreach zostaną 
omówione na innym wykładzie.

int a=1

;

background image

18

Zadanie 1

Popraw błędy logiczne w poniższym programie obliczającym sumę 
ciągu arytmetycznego 1+2+3+4+...+100.

int

 i=1, suma=0;

for

 (; i >= 100; ++i) ;

    suma += i;

Console

.WriteLine(suma);

background image

19

Zadanie 2

Który z poniższych programów wypisze większą liczbę na ekranie?

//program 1

int

 wynik=1;

for

 (

int

 i=1; i <= 5; ++i) wynik *= 2;

Console

.WriteLine(wynik);

//program 2

int

 j = 0, licz = 0;

++licz;

while

 (j++ < 5) licz = 2 * licz;

Console

.WriteLine(licz);

background image

20

Zadanie 3

Poniższy kod zapisany przy pomocy pętli for zapisz 
przy pomocy pętli while.

for

 (

int

 i = 13; i > 2; i -= 2, 

Console

.WriteLine(i)) ;

background image

21

Zadanie 4

Popraw błędy w poniższym kodzie.

        

int

 i;

        
        

while

 (i = 1)

        {
            

Console

.WriteLine(i++);

        }


Document Outline