Instrukcje iteracyjne w C#
Opracował dr Robert Fidytek
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. 
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.
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
(; ;) ;
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);
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(
""
);
}
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ć?
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 i instrukcja2 nie muszą być 
pojedynczą instrukcją. Może być ich kilka, wtedy 
poszczególne instrukcje oddzielamy przecinkami.
Co oznacza 
zapis {0,8:c}?
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.
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++; 
}
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++; 
            }
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)
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.
14
Przykład: Literki
string
str;
do
{
    
Console
.Write(
"Podaj literkę: "
);
str =
Console
.ReadLine();
}
while
(str !=
"k"
);
Console
.WriteLine(
"Koniec pętli do-while"
);
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);
}
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);
        }
    }
}
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
;
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);
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);
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)) ;
21
Zadanie 4
Popraw błędy w poniższym kodzie.
int
i;
        
        
while
(i = 1)
        {
            
Console
.WriteLine(i++);
}