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