podstprog06


Wykłady z podstaw programowania f& Język C/C++
6. Instrukcje iteracyjne
Wiele problemów algorytmicznych rozwiązywanych jest przez
powtarzanie operacji wykonywanych na zbiorze danych. Dwie podstawowe
metody z tym związane to: iteracja oraz rekurencja.
Iteracja oznacza sekwencyjne powtarzanie przez program tych samych
czynności, przy czym podstawową konstrukcją języka tu stosowaną jest
instrukcja pętli.
Instrukcja while
Instrukcja pętli while (tzn. dopóki) powoduje powtarzanie zawartej w
niej podrzędnej instrukcji lub bloku instrukcji na podstawie podanego w jej
nagłówku wyrażenia.
Ogólna postać tej instrukcji jest następująca:
wersja prosta:
while ( wyrażenie )
instrukcja;
wersja blokowa:
while ( wyrażenie )
{
instrukcja_1;
instrukcja_2;
. . .
instrukcja_N;
}
1
PDF created with pdfFactory Pro trial version www.pdffactory.com
Wykłady z podstaw programowania f& Język C/C++
Pętla while wykonywana jest tak długo, jak długo podane wyrażenie
(logiczne lub relacja) jako warunek kontynuacji pętli pozostaje prawdziwe (tzn.
posiada wartość true lub wartość różną od zera).
W każdym kroku pętli wykonywana jest podana instrukcja (lub blok
instrukcji_1,2..N), po czym następuje powrót do początku pętli i ponowne
sprawdzenie warunku kontynuacji pętli.
W momencie, gdy wyrażenie staje się fałszywe (false lub równe zero),
pętla jest przerywana i zostaje wykonana następna instrukcja podana po pętli.
W przypadku, gdy wartość wyrażenia od razu będzie fałszywa, podana
instrukcja nie będzie wykonywana.
Jeśli wyrażenie nigdy nie przyjmie wartości false, instrukcja będzie się
wykonywać nieskończoną ilość razy, np.:
while (true) instrukcja;
Przykład:
// suma liczb od 1 do n:
int n, i, suma;
cin >> n;
suma = 0;
i = 1;
while (i <= n) {
suma += i;
i=i+1;
}
Kod wykonuje sumowanie liczb od 1 do 0. Wynik jest
przechowywany we zmiennej suma  jest to zmienna
akumulacyjna typu addytywnego, stąd wymagane jest
zainicjowanie zerem. Dla n < 1 sumowanie daje w
wyniku zero, stąd instrukcje w p/w bloku będą pominięte.
2
PDF created with pdfFactory Pro trial version www.pdffactory.com
Wykłady z podstaw programowania f& Język C/C++
Warunek sprawdzany w pętli while może być nie tylko prostą relacja,
ale również dowolnym złożonym zadniem logicznym, tak jak w przypadku
instrukcji warunkowej if-else.
Instrukcja do-while
Istnieje możliwość, że ciało pętli while nigdy nie zostanie wykonane.
Instrukcja while sprawdza swój warunek przed wykonaniem którejkolwiek z
zawartych w niej instrukcji, a gdy ten warunek nie jest spełniony, całe ciało
pętli jest pomijane.
Pętla do-while (tzn. wykonuj-dopóki) wykonuje ciało pętli przed
sprawdzeniem warunku, dzięki czemu instrukcje w pętli zostaną wykonane co
najmniej raz. Poza tym instrukcja ta wykonuje się podobnie jak pętla while .
Składnia instrukcji do-while jest następująca:
wersja prosta:
do
instrukcja;
while ( wyrażenie );
wersja blokowa:
do
{
instrukcja_1;
instrukcja_2;
. . .
instrukcja_N;
}
while ( wyrażenie );
3
PDF created with pdfFactory Pro trial version www.pdffactory.com
Wykłady z podstaw programowania f& Język C/C++
Przykład:
int n, i = 1, suma = 0;
cin >> n;
do { // suma liczb dodatnich od 1 do n, suma>=1
suma+=i;
i++;
} while (i <= n);
double x = 1.0/suma;
Sumowanie w pętli jest zawsze wykonywane, nawet jeżeli zmienna n
przyjmuje wartość mniejszą od 1, stąd po wykonaniu pętli zmienna suma
będzie większa od 1 dla dowolnej wartości n. Wobec tego w ostatniej
instrukcji p/w kodu nigdy nie wystąpi błąd dzielenia przez zero.
Instrukcja for
W najczęściej występujących postaciach pętli while stosuje się jedną
zmienną całkowitą przeznaczoną do kontrolowania przebiegu iteracji (np.
licznik kroków pętli). Przed wykonaniem pętli podawana jest wartość
początkowa zmiennej kontrolującej, następnie sprawdzany jest w nagłówku
pętli while warunek zależny od zmiennej, po czym w każdym kroku pętli
zmiennej przypisuje się kolejną wartość (np. poprzez inkrementowanie).
Pętla for (tzn. dla) łączy powyższe trzy etapy w jedną konstrukcję. W
nagłówku tej pętli wewnątrz nawiasów znajdują się trzy oddzielone średnikami
części.
Pierwsza część nagłówka jest instrukcją służącą do tworzenia i
inicjowania zmiennej kontrolującej przebieg pętli.
Drugą częścią jest wyrażenie stanowiące warunek kontynuacji pętli,
podobnie jak w przypadku pętli while.
Trzecia część jest instrukcją, w wyniku której wartość zmiennej
kontrolującej jest zwiększana lub zmniejszana.
4
PDF created with pdfFactory Pro trial version www.pdffactory.com
Wykłady z podstaw programowania f& Język C/C++
W ogólności pierwsza część nagłówka może być dowolną instrukcją
prostą lub deklaracją, druga musi być wyrażeniem zwracającym wartość
numeryczną, natomiast trzecia część również może być dowolną instrukcją
prostą.
Instrukcja for posiada następującą składnię:
wersja prosta:
for ( instrukcja_A ; wyrażenie ; instrukcja_C )
instrukcja_B;
wersja blokowa:
for ( instrukcja_A ; wyrażenie ; instrukcja_C )
{
instrukcja_B1;
instrukcja_B2;
. . .
instrukcja_BN;
}
Uwaga: Podane ogólne postacie pętli for można zawsze zastąpić równoważnymi
konstrukcjami while, stąd dla wersji prostej otrzymujemy:
instrukcja_A;
while ( wyrażenie )
{
instrukcja_B;
instrukcja_C;
}
podobnie dla wersji blokowej:
instrukcja_A;
while ( wyrażenie )
{
instrukcja_B1; instrukcja_B2; ... instrukcja_BN;
instrukcja_C;
}
5
PDF created with pdfFactory Pro trial version www.pdffactory.com
Wykłady z podstaw programowania f& Język C/C++
Zgodnie z podaną definicją instrukcja_A jest zawsze wykonywana i to
tylko raz przed rozpoczęciem pętli.
Natomiast instrukcja_C jest wykonywana w każdym kroku pętli tuż po
wykonaniu właściwego ciała pętli.
Przykład:
int n, suma = 0;
cin >> n;
for (int i=1; i <= n; i++) // suma liczb od 1 do n
suma+=i;
Uwaga: Dowolny składnik nagłówka pętli for można pominąć, pozostawiając jednak
odpowiedni średnik, np.
for ( ; wyrażenie ; instrukcja_C )
Jeśli wszystkie trzy składniki nagłówka są puste, tzn.
for (;;) instrukcja; // rownowazne: for (;true;)
to otrzymujemy bezwarunkową pętlę (nieskończoną). Z drugiej strony można w nagłówku
pętli umieszczać inicjowanie lub modyfikację więcej niż jednej zmiennej kontrolującej,
oddzielając poszczególne dodatkowe części przecinkami, np.
for (int i=1, j=10; i <= j; i++, j--)
Uwaga: Deklaracja zmiennej kontrolującej podana bezpośrednio w nagłówku pętli for jest
możliwa jedynie w języku C++. W poprzednich wersjach języka C++ zakres zmiennych
zadeklarowanych w nagłówku rozciągał się także na blok zewnętrzny, np.:
for (int i = 0; i < 5; i++)
{
// ....
}
int i = 10; // błąd: kolizja nazw zmiennych
6
PDF created with pdfFactory Pro trial version www.pdffactory.com
Wykłady z podstaw programowania f& Język C/C++
Obecny standard C++98 ograniczył ten zakres do bloku pętli for, dzięki czemu na
zewnątrz pętli można zadeklarować zmienną o tej samej nazwie:
for (int i = 0; i < 5; i++)
{
// ....
}
int i = 10; // poprawne jedynie w ISO
Aby uniknąć problemów z przenośnością kodu, należy oczywiście stosować zmienne o
różnych nazwach:
for (int i = 0; i < 5; i++)
{
// ....
}
int j = 10; // zawsze poprawne
Instrukcja continue oraz break
Czasami zdarza się, że przed wykonaniem całego ciągu instrukcji w
kroku pętli zachodzi konieczność powrotu do początku pętli. Służy do tego
instrukcja continue (tzn. kontynuuj).
Instrukcja ta może wystąpić tylko wewnątrz dowolnej instrukcji pętli.
Powoduje zakończenie bieżącego kroku pętli i przejście do następnego, tj. do
sprawdzania warunku kontynuacji pętli.
Przykład:
double x,iloczyn=1;
for (int i = 0; i < 10; i++) // iloczyn odwrotności
{ // podanych liczb
cin >> x;
if (x == 0) continue; // kontynuułuj, aby uniknąć
iloczyn*=1/x; // dzielenia przez zero
}
7
PDF created with pdfFactory Pro trial version www.pdffactory.com
Wykłady z podstaw programowania f& Język C/C++
W pewnych przypadkach istnieje również potrzeba wyjścia z pętli
jeszcze przed spełnieniem warunku jej końca. Instrukcja break (tzn. przerwij)
powoduje natychmiastowe wyjście z najbardziej zagnieżdżonej pętli i
przeniesienie wykonywania do następnej instrukcji występującej po pętli.
Instrukcja break może wystąpić tylko wewnątrz pętli lub instrukcji wyboru
switch-case.
Przykład:
double x,iloczyn=1;
for (int i = 0; i < 10; i++) // iloczyn odwrotności
{ // podanych liczb
cin >> x;
if (x == 0) break; // przerwij, aby uniknąć
iloczyn*=1/x; // dzielenia przez zero
}
Uwaga: Instrukcja break jest na ogół używana w pętlach bezwarunkowych
(nieskończonych) o postaci:  while(true) lub  for(;;) . Na przykład pętla
int i,suma=0;
for (;;) // lub while(true)
{
cin >> i;
if (i <= 0) break;
suma+=i;
}
będzie sumować bezwarunkowo podane liczby dodatnie, jednakże w przypadku podania
liczby niedodatniej pętla jest natychmiast zakończona.
Pętle zagnieżdżone
Pętle mogą być zagnieżdżone, tj. pętla może znajdować się w ciele innej
pętli. Pętla wewnętrzna jest wykonywana wielokrotnie, przy każdym
wykonaniu pętli zewnętrznej.
8
PDF created with pdfFactory Pro trial version www.pdffactory.com
Wykłady z podstaw programowania f& Język C/C++
Przykład:
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 10; j++) cout << '*';
cout << endl;
}
Program wyświetla 10 linii zawierających 10 znaków '*' , czyli tworzy na
ekranie kwadrat z gwiazdek.
Uwaga: Liczba kroków pętli wewnętrznej nie musi być stała. W pewnych przypadkach
liczba ta może być zależna od numeru kroku pętli zewnętrznej. Na przykład jeżeli w p/w
kodzie liczba kroków pętli wewnętrznej rośnie od 1 do 10, to na ekranie powstanie trójkąt
prostokątny złożony z gwiazdek.
9
PDF created with pdfFactory Pro trial version www.pdffactory.com


Wyszukiwarka

Podobne podstrony:
w08 PodstPrzy roznor
KOMUNIKACJA PODSTPSYCH WYK2
podstprog01
w02 PodstPrzy zycie
podstprog02
podstpr
w04 PodstPrzy proddekomp
w07 PodstPrzy krajobrazy
podstprog07
podstprog04
podstprog10
podstprog09
w05 PodstPrzy cykle
w06 PodstPrzy klimat

więcej podobnych podstron