Pętla for
Treści prezentowane w wykładzie zostały oparte o:
● S. Prata, Język C++. Szkoła programowania. Wydanie VI, Helion, 2012
● www.cplusplus.com
● Jerzy Grębosz, Opus magnum C++11, Helion, 2017
● B. Stroustrup, Język C++. Kompendium wiedzy. Wydanie IV, Helion, 2014
Wstęp do informatyki- wykład 7
Instrukcje iteracyjne - pętla while
Pętla do...while...
Pętla while - przykład
Napisz program, który wyznaczy pierwszą liczbę naturalną postaci 2n, która jest większa od losowo wybranej liczby lim:
int main() {
int lim = rand(); //liczba losowa z [0, RAND_MAX]
cout<<"wylosowana granica to: "<<lim<<endl;
int liczba = 1;
while ( liczba <= lim )//dopóki nie przekroczymy lim
liczba *= 2;//liczymy kolejną potegę liczby 2
cout << "Szukana liczba to:" << liczba << endl;
return 0;
}
Pętla do...while -przykład – petla zaporowa
Napisz program, który będzie wczytywał dane od użytkownika aż do chwili, gdy poda on liczbę z przedziału [5, 100]
#include <iostream>
using namespace std;
int main() {
int n;
do {
cout << "Podaj liczbe z przedziału [5, 100]";
cin >> n;
}while (n < 5 || n > 100);
cout << "Liczba z przedziału wynosi:" << n << endl;
return 0;
Pętle – przykład – liczba cyfr liczby - pętla do-while
#include <iostream>
#include <cmath> //bo używamy funkcji abs using namespace std;
int main() { int n;
cout << "Podaj liczbe calkowita ";
cin >> n;
int rob = abs(n);//można rob=n; bo tylko liczymy cyfry
int il = 0; //zmienna - licznik ilości cyfr do
{ il++; //il = il+1; il += 1; zwiększamy licznik //bo mamy pierwszą lub kolejna cyfrę liczby
rob /= 10; //n = n/10;
} while (rob != 0);
cout << "Liczba cyfr liczby " << n << " to " << il ; return 0;
Pętla for
Pętla for (ang. for – dla) oznacza: dla takich warunków wykonuj...:
for(instr_inicjalizująca; wyr_warunkowe; instr_kroku) treść_pętli ;
● instr_inicjalizująca – jest to instrukcja inicjalizująca zmienne używane w pętli. Wykonana jest jednokrotnie, na początku zanim zostanie wykonana właściwa praca pętli.
● wyr_warunkowe – jest to wyrażenie, które obliczane jest przed każdym obiegiem pętli. Jeśli jest prawdziwe, to wykonywane
zostają instrukcje będące treścią pętli, jeżeli nie, przerywana jest dalsza praca pętli.
● instr_kroku – to instrukcja kroku pętli, wykonywana na
zakończenie każdego obiegu (kroku) pętli. Jest to jakby ostatnia instrukcja, wykonywana bezpośrednio przed obliczeniem wartości
Pętla for
for(instr_inicjaliz; wyr_warunkowe; instr_kroku) treść_pętli ;
Praca pętli for:
(1) Najpierw wykonuje się instrukcje instr_inicjaliz inicjalizujące pracę pętli.
(2) Obliczana jest wartość wyrażenia warunkowego wyr_warunkowe:
· Jeżeli ma wartość false praca pętli jest przerywana.
· Jeżeli zaś ma wartość true, wówczas wykonywane zostają instrukcje będące treścią pętli.
(3) Po wykonaniu treści pętli wykonana zostaje instrukcja kroku pętli (instr_kroku), a następnie wracamy do (2).
Pętla for
Pętla for -przykład
for(instr_inicjaliz; wyr_warunkowe; instr_kroku) treść_pętli ;
int main() {
cout << "Stewardzie, ilu leci pasazerów ? ";
int ile; // liczba pasażerów cin >> ile;
for(int i = 1 ; i <= ile ; i++ ) {
cout << "Pasazer nr " << i
<< " prosze zapiac pasy ! \n";
}
cout << "Wszyscy zapieli pasy, to ladujemy. ";
}
Pętla for -przykład
Jeśli stewart odpowie 3, to na ekranie pojawi się:
Stewardzie, ilu leci pasazerów ? 3 Pasazer nr 1 prosze zapiac pasy ! Pasazer nr 2 prosze zapiac pasy ! Pasazer nr 3 prosze zapiac pasy ! Wszyscy zapieli pasy, to ladujemy.
instr_inicjaliz: int i = 1 – definicja zmiennej z
przypisaniem, tworzymy i ustawiamy licznik obiegów pętli i na 1 wyr_warunkowe: i <= ile - Jeżeli i jest mniejsze lub równe ile, wówczas wykonywana zostaje instrukcja będąca treścią pętli (czyli wypisanie tekstu z prośbą do i-tego pasażera o zapięcie
pasów )
instr_kroku:i++ - zwiększenie wartości licznika – zmiennej i o
Pętla for -zakres istnienia zmiennych
for(int i = 1 ; i <= ile ; i++ )i- licznik obiegów pętli
W wyrażeniu inicjalizacyjnym zmiennej o nazwie i nadajemy wartość 1, po czym przy każdym obiegu pętli wartość tego licznika rośnie. Licznik i jest zmienną, której potrzebujemy tylko na użytek tej pętli, dlatego tworzymy go w instrukcji inicjalizacyjnej.
Obiekt zdefiniowany w instrukcji inicjalizacyjnej pętli for
istnieje (jest do dyspozycji) tylko w ramach tej instrukcji for.
To znaczy w tej linii, w której go napisaliśmy, a także w
instrukcjach stanowiących treść pętli. Po zakończeniu pracy pętli – tak zdefiniowany obiekt staje się niedostępny
(przestaje istnieć).
Pętla for
for(instr_inicjaliz; wyr_warunkowe; instr_kroku) treść_pętli ;
Pętla for jest najczęściej stosowaną formą instrukcji iteracyjnej.
Jest szczególnie wygodna, jeśli z góry wiadomo, ile będzie powtórzeń instrukcji stanowiącej ciało pętli (instrukcja
treść_pętli).
Zwykle w części inicjalizacyjnej instr_inicjaliz nadajemy odpowiednie wartości zmiennym używanym w ciele pętli, a w części instr_kroku dokonujemy ich zmiany po każdym
przebiegu pętli.
Pętle – przykład – pętla z licznikiem
Napisz program, który oblicza sumę 1/1+1/2 +1/3+...+1/n ,
gdzie n jest liczbą >0 podaną przez użytkownika (pętla zaporowa).
#include <iostream>
using namespace std;
int main() {
int n; //n ma być liczbą >0 do
{
cout << "Podaj liczbe calkowita";
cin >> n;
} while (n<=0);//(!(n>0))
Pętle – przykład – while i for – pętla z licznikiem
// 1/1 + 1/2 +1/3 + … + 1/ndouble s = 0.0; //suma odwrotności l.rzeczywista int k = 1; //licznik przechodzący
//po kolejnych mianownikach od 1 do n while(k <= n) //dopóki są jeszcze odwrotnosci {
s += 1.0/k;//do sumy dodajemy kolejne składnik k++; //przechodzimy do kolejnej odwrotnosci }
s = 0.0; //zmienna na sume wyzerowana na poczatku for (int k=1; k <= n; k++)
s += 1.0/k;
cout << "Suma odwrotnosci wynosi" << s << endl;
}
Pętle – przykład - for– pętla z licznikiem
Wyświetlić 10 początkowych liczb parzystych >0./*1 sposób: wyswietlamy liczby 2,4,...,20, idziemy w pętli poczynając od 2 i przesuwamy się o 2*/
for(int i=2; i<=20; i+=2) {
cout<<i<<endl;
}
//2-gi sposób- kolejne liczby parzyste są równe // 2i, i=1,..,10
for(int i=1; i<=10; i++ ) cout<<2*i<<endl;
Pętle – przykład - for– pętla z licznikiem
//odliczanie od 10 w dół do 0int main() {
for (int i = 10; i>=0; i--) //petla od 10 do 0 cout << "i = " << i << "\n";
cout << "Start\n";
}
Pętla - for – uwagi
● instr_inicjaliz nie musi być tylko jedną instrukcją.
Może być ich kilka oddzielonych przecinkami (operator przecinkowy). Podobnie w przypadku instrukcji kroku pętli (instr_kroku).
● Zauważmy, że nie jest możliwe zadeklarowanie w instr_inicjaliz zmiennych różnych typów (gdyż
wymagałoby to więcej niż jednej instrukcji deklaracyjnej i ;)
● Można natomiast zadeklarować więcej niż jedną zmienną tego samego typu; na przykład prawidłowa jest konstrukcja for (int i = 0, k = size-1; i < k; i++, k--) {
// OK }
Pętla - for – uwagi
● Poszczególne elementy: instr_inicjaliz,
wyr_warunkowe, instr_kroku nie muszą wystąpić.
Dowolny z nich można opuścić, zachowując jednak średnik oddzielający go od sąsiada.
● Opuszczenie wyrażenia warunkowego traktowane jest tak, jakby stało tam wyrażenie zawsze prawdziwe (warunek
spełniony true).
● Tak więc pętla for( ; ; ) {
// treść pętli }
jest pętlą nieskończoną.
Pętle – break
● Zapoznaliśmy się już z działaniem instrukcji break,
polegającym na przerwaniu wykonywania instrukcji switch.
● Podobne działanie ma break w stosunku do instrukcji pętli:
for, while, do...while.
● Instrukcja break powoduje natychmiastowe przerwanie wykonywania tych pętli.
● Jeśli mamy do czynienia z kilkoma pętlami, zagnieżdżonymi jedna wewnątrz drugiej, to instrukcja break powoduje
przerwanie tylko tej pętli, w której bezpośrednio tkwi. Jest to więc jakby przerwanie z wyjściem tylko o jeden poziom
wyżej.
Pętla – break - przykład
for (int i = 1; i < 10; i++) {
cout << i << '\n';
if (i == 4) break;
}
W rezultacie wykonania tego fragmentu programu na ekranie pojawi się:
1 2 3