Programowanie proceduralne w języku C++ Pętle, tablice Mirosław Głowacki 1 1 Akademia Górniczo-Hutnicza im. Stanisława Staszica w Ktrakowie Wydział Inżynierii Metali i Informatyki Stosowanej Katedra Informatyki Stosowanej i Modelowania Wrzesień 2015 Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2015 1 / 43
Spis treści 1 Pętle 2 Pętla do... while 3 Pętla while 4 Pętla for 5 Instrukcje break and continue 6 Jednowymiarowe tablice statyczne 7 Jednowymiarowe tablice dynamiczne Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2015 2 / 43
Spis treści 1 Pętle 2 Pętla do... while 3 Pętla while 4 Pętla for 5 Instrukcje break and continue 6 Jednowymiarowe tablice statyczne 7 Jednowymiarowe tablice dynamiczne Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2015 3 / 43
Przeznaczenie pętli Pętla w największym uproszczeniu służy do powtarzania ciągu instrukcji. Pozwala to na wykonanie fragmentu kodu więcej niż raz bez konieczności ich wielokrotnego pisania. Operacja powtarzania wielokrotnego wybranych fragmentów kodu jest do tego stopnia istotna w programowaniu, że język C++ udostępnia nam aż trzy rodzaje pętli: pętla do... while, pętla while, pętla for. Pętle, które poznamy niebawem różnią się szczegółami, jednak ich idea jest ta sama - powtarzać wybrane fragmenty kodu. Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2015 4 / 43
Spis treści 1 Pętle 2 Pętla do... while 3 Pętla while 4 Pętla for 5 Instrukcje break and continue 6 Jednowymiarowe tablice statyczne 7 Jednowymiarowe tablice dynamiczne Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2015 5 / 43
Pętla do... while Pętle są potężnym narzędziem w ręku programisty. Dzięki pętlom możemy pisać kod krótszy, czytelniejszy i łatwiejszy w utrzymaniu. Zobaczmy jak wygląda pierwszy z wymienionych rodzajów pętli: C++: do... while do instrukcja; // lub {...blok instrukcji... } while ( warunek konczacy ); pętla do... while rozpoczyna się słowem kluczowym do, po nim następuje blok instrukcji, które mają być wielokrotnie powtarzane, na koniec słowo kluczowe while poprzedzające umieszczony w nawiasach okrągłych warunek zakończenia pętli. Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2015 6 / 43
Pętla do... while Liczba powtórzeń instrukcji umieszczonych w bloku pętli jest zależna od warunku kończącego pętlę. Pętla do... while zakończy się gdy warunek umieszczony w nawiasach zaokrąglonych zwróci wartość false. Istotną cechą tej pętli jest fakt, że kod zawarty między słowami kluczowymi do... while wykona się co najmniej jeden raz, np.: #include <iostream> int main() { int ilerazy; std::cout << "Ile razy? "; std::cin >> ilerazy; do { std::cout << "ilerazy = " << ilerazy << std::endl; ilerazy--; } while( ilerazy > 0 ); return 0; } Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2015 7 / 43
Pętla while Jeśli zmienna ilerazy przyjmie wartość 3, to na ekranie komputera pojawi się tekst: Okno konsoli Ile razy? 3 ilerazy = 3 ilerazy = 2 ilerazy = 1 Natomiast jeśli ilerazy przyjmie warość początkową 0: Okno konsoli Ile razy? -3 ilerazy = -3 Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2015 8 / 43
Spis treści 1 Pętle 2 Pętla do... while 3 Pętla while 4 Pętla for 5 Instrukcje break and continue 6 Jednowymiarowe tablice statyczne 7 Jednowymiarowe tablice dynamiczne Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2015 9 / 43
Pętla while Dobrym punktem wyjściowym będzie zapoznanie się ze składnią pętli while : C++: while while( warunek konczacy petle ) { powtarzany blok instrukcji } pętla ta w przeciwieństwie do do... while rozpoczyna się słowem kluczowym while wraz z umieszczonym po nim w nawiasach okrągłych warunkiem zakończenia pętli. następnie następuje blok instrukcji, które mają być wielokrotnie powtarzane, zamiast bloku instrukcji może być oczywiście umieszczona pojedyncza instrukcja. Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2015 10 / 43
Pętla while Podobnie jak dla do... while liczba powtórzeń instrukcji bloku pętli jest zależna od warunku kończącego pętlę. Tym jednak razem warunek może być fałszywy na wstępie i pętla while nie zostanie wykonana ani raz. Jest to w sumie jedyna, ale istotna różnica w stosunku do pętli do... while. Przykładowo: #include <iostream> int main() { int ilerazy; std::cout << "Ile razy? "; std::cin >> ilerazy; while( ilerazy > 0 ) { std::cout << "ilerazy = " << ilerazy << std::endl; ilerazy--; } return 0; } Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2015 11 / 43
Pętla while Co prawda jeśli tym razem zmienna ilerazy przyjmie wartość 3, to na ekranie komputera pojawi się tekst identyczny z tym jaki wygenerowała pętla do... while : Okno konsoli Ile razy? 3 ilerazy = 3 ilerazy = 2 ilerazy = 1 Ale jeśli ilerazy przyjmie warość początkową 0, to strumień wyjściowy będzie następujący: Okno konsoli Ile razy? 0 i nic więcej. Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2015 12 / 43
Zastosowanie pętli while w praktyce Pętlę while w praktyce stosuje się zawsze tam, gdzie mamy potrzebę przetwarzania nieokreślonej z góry liczby danych, np: należy wczytać dane do tablicy, ale ich liczbę podaje np. użytkownik programu; należy zakończyć pętlę gdy tylko zostanie wciśnięty określony klawisz klawiatury, itp. Podsumowując, while nie jest w niczym lepsza od innych pętli - w praktyce można sprawnie używać każdej z nich, jednak różnorodność narzędzi pozwala pisać kod krótszy i czytelniejszy. Przykład pętli o nieznanej z góry liczbie iteracji. Wyznaczyć taką najmniejszą liczbę naturalną, że suma liczb od niej mniejszych i podzielnych przez 7 jest większa od założonej wartości. Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2015 13 / 43
Przykład działania pętli while int main() { int var, varmin; cout << "Podaj liczbe "; cin >> varmin; int suma = 0; int i = 1; while (suma < varmin){ if (i % 7 == 0) { suma += i; var = i; cout << "Dodaje do sumy liczbe = " << i << endl; } i++; } cout << "Wyznaczona liczba = " << ++var << endl; cout << "Suma = " << suma << endl; return 0; } Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2015 14 / 43
Przykład działania pętli while Widoczne w kodzie programie zastosowanie instrukcji while jest typowe i charakterystyczne dla tej pętli. Zamiast while można użyć oczywiście do... while. W wyniku działania programu otrzymano strumień wyjściowy: Podaj liczbe 40 Dodaje do sumy liczbe = 7 Dodaje do sumy liczbe = 14 Dodaje do sumy liczbe = 21 Wyznaczona liczba = 22 Suma = 42 Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2015 15 / 43
Spis treści 1 Pętle 2 Pętla do... while 3 Pętla while 4 Pętla for 5 Instrukcje break and continue 6 Jednowymiarowe tablice statyczne 7 Jednowymiarowe tablice dynamiczne Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2015 16 / 43
Pętla for Składnia pętli for jest następująca: C++: for for( inicjalizacja licznika; warunek; zmiana licznika ) instrukcja; // lub {... blok instrukcji... } inicjalizacja licznika, to zdefiniowanie zmiennej sterującej pętlą for - jest to typowa deklaracja zmiennej typu liczbowego i jej inicjalizacja. warunek to typowe wyrażenie logiczne, podobnie jak dla innych pętli - jego brak oznacza pętlę nieskończoną zmiana licznika oznacza inkrementację (lub dekrementację) licznika lub inną metodę jego zmiany. blok instrukcji jest wykonywany w każdej iteracji pętli - może to być pojedyncza instrukcja. Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2015 17 / 43
Pętla for Przykładowy program wykorzystujący pętlę for : C++: for #include <iostream> using namespace std; int main() { int maxrazy; cout << "Ile razy? "; cin >> maxrazy; for (int ilerazy = maxrazy; ilerazy > 0 ; ilerazy--) cout << "ilerazy = " << ilerazy << endl; return 0; } Tym razem zmienna ilerazy pełni rolę zmiennej sterującej pętlą. Natomiast zmienna maxrazy wyznacza z góry znaną liczbę iteracji. Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2015 18 / 43
Pętla for I tym razem jeśli zmienna ilerazy przyjmie wartość początkową 3, to na ekranie komputera pojawi się tekst identyczny z tymi jakie generowały pętle do... while i while : Ile razy? 3 ilerazy = 3 ilerazy = 2 ilerazy = 1 Jeśli natomiast ilerazy przyjmie warość początkową 0, to strumień wyjściowy będzie taki sam jak dla pętli while, a nie taki jak dla pętli do... while : Ile razy? 0 Oznacza to, że pętla nie została wykonana nawet jeden raz. Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2015 19 / 43
Zastosowanie pętli for w praktyce Pętlę for stosuje się zawsze tam, gdy znamy liczbę iteracji, np: znamy liczbę danych, jaką należy wczytać, wypisać lub zmienić, chcemy policzyć średnią z określonej liczby danych, mamy za zadanie wczytać znaną liczbę danych z pliku lub wypisać określoną liczbę danych na ekran, itd. Należy zauważyć, że w języku C++ możliwe jest utworzenie tymczasowej zmiennej, która będzie widoczna tylko i wyłącznie wewnątrz pętli for tak, jak zmienna ilerazy z naszego przykładu. Wspomniana własność jest bardzo wygodna dla programisty i korzystanie z niej jest praktycznie rzecz biorąc na porządku dziennym. Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2015 20 / 43
Silnia - przykład działania pętli for #include <iostream> using namespace std; int main() { int nsil; cout << "Podaj liczbe "; cin >> nsil; int silnia = 1; for (int i = 2; i <= nsil ; i++){ cout << "Mnoze zmienna silnia przez = " << i << endl; silnia *= i; } cout << "Silnia liczby " << nsil << " wynosi: " << silnia << endl; return 0; } Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2015 21 / 43
Silnia - przykład działania pętli for Przedstawione w programie zastosowanie instrukcji for jest typowe i charakterystyczne. Zamiast for można użyć każdego innego rodzaju pętli, ale for jest w tym przypadku bardzo wygodna. W wyniku działania programu otrzymano strumień wyjściowy: Podaj liczbe 5 Mnoze zmienna silnia przez = 2 Mnoze zmienna silnia przez = 3 Mnoze zmienna silnia przez = 4 Mnoze zmienna silnia przez = 5 Silnia liczby 5 wynosi: 120 Takie operacje jak sumowanie czy obliczanie silni to jedne z najczęściej używanych zastosowań pętli for. Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2015 22 / 43
Spis treści 1 Pętle 2 Pętla do... while 3 Pętla while 4 Pętla for 5 Instrukcje break and continue 6 Jednowymiarowe tablice statyczne 7 Jednowymiarowe tablice dynamiczne Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2015 23 / 43
Instrukcje break i continue W pętlach, instrukcja break kończy wykonywanie najbliższej otaczającej instrukcji do, for lub while. Jak już wiemy dotyczy ona także instrukcji switch. Sterowanie przechodzi do instrukcji następującej po zakończonej pętli, jeśli taka istnieje. W obrębie zagnieżdżonych pętli, instrukcja break kończy tylko tę pętlę, która bezpośrednio ją obejmuje. Podobnie działa instrukcja continue, ale tylko dla pętli. Nie kończy ona jednak wykonywania najbliższej otaczającej pętli, a jedynie bieżącą iterację. W przypadku pętli do lub while następna iteracja rozpoczyna się od ponownej oceny warunku kontrolującego instrukcji. W przypadku pętli for wykonywane są: aktualizacja licznika, ponowne sprawdzenie warunku oraz, w zależności od wyniku, przejście do kolejnej iteracji. Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2015 24 / 43
Przykład działania instrukcji continue #include <iostream> using namespace std; int main() { int zakrmin, zakrmax; cout << "Podaj zakres liczb " << endl; cout << "od: "; cin >> zakrmin; cout << "do: "; cin >> zakrmax; int suma = 0; for (int i = zakrmin; i <= zakrmax ; i++){ if (i % 2!= 0) continue; cout << "Dodaje do sumy liczbe = " << i << endl; suma += i; } cout << "Suma liczb parzystych = " << suma << endl; return 0; } Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2015 25 / 43
Przykład działania instrukcji continue Zastosowanie instrukcji continue oraz dzielenia i % 2, jako warunku w pętli if spowodowało sumowanie jedynie liczb parzystych. W wyniku działania programu otrzymano strumień wyjściowy: Podaj zakres liczb od: 1 do: 7 Dodaje do sumy liczbe = 2 Dodaje do sumy liczbe = 4 Dodaje do sumy liczbe = 6 Suma liczb parzystych = 12 Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2015 26 / 43
Przykład działania instrukcji break #include <iostream> using namespace std; int main() { int var, varmin; cout << "Podaj liczbe "; cin >> varmin; int suma = 0; for(int i = 1;;i++) if (i % 7 == 0) { suma += i; var = i; cout << "Dodaje do sumy liczbe = " << i << endl; if (suma>varmin) break; } cout << "Wyznaczona liczba = " << ++var << endl; cout << "Suma = " << suma << endl; return 0; } Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2015 27 / 43
Przykład działania instrukcji break W wyniku działania programu otrzymano strumień wyjściowy identyczny z tym jaki wygenerował program używający pętli while : Podaj liczbe 40 Dodaje do sumy liczbe = 7 Dodaje do sumy liczbe = 14 Dodaje do sumy liczbe = 21 Wyznaczona liczba = 22 Suma = 42 Konieczne było jednak zastosowanie pętli nieskończonej for(int i = 1; ;i++) i instrukcji break. Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2015 28 / 43
Instrukcje break and continue Podsumowanie działania instrukcji break i continue można przedstawić w następującej tablicy: Instrukcja Zastosowanie Działanie break continue do while for switch do while for Pętla jest natychmiast przerywana, a sterowanie przechodzi do instrukcji występującej bezpośrednio za pętlą. Instrukcja break powoduje opuszczenie jedynie pętli ją zawierającej. Wymusza wykonanie kolejnej iteracji z pominięciem fragmentu programu między instrukcją, a warunkiem testującym. Dalsze działanie pętli powoduje przejście do kolejnej iteracji pętli. Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2015 29 / 43
Spis treści 1 Pętle 2 Pętla do... while 3 Pętla while 4 Pętla for 5 Instrukcje break and continue 6 Jednowymiarowe tablice statyczne 7 Jednowymiarowe tablice dynamiczne Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2015 30 / 43
Tablice Do tej pory mówiąc o zmiennych stwierdziliśmy, że każda zmienna ma swoją nazwę. Zastanówmy się jednak na dwoma pytaniami: Dlaczego wprowadzono tablice zmiennych? Co powoduje, że pojęcie tablicy jest zbieżne z pojęciem pętli? Aby odpowiedzieć na powyższe pytania rozważmy problem tworzenia listy studentów: każdy student może być określony za pomocą imienia i nazwiska, ale student może być określony również za pomoca numeru albumu co jest bardziej jednoznaczne - w grupie może być np. dwóch Janów Kowalskich Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2015 31 / 43
Tablice Grupa studentów może liczyć nawet kilkaset osób i wpisywanie ich na listę kolejno nie ma większego sensu. Kod programu: int main() { string im1, nazw1; int nralb1; cout << " Imie studenta nr 1: "; cin >> im1; cout << " Nazwisko studenta nr 1: "; cin >> nazw1; cout << "Nr albumu studenta nr 1: "; cin >> nralb1; string im2, nazw2; int nralb2; cout << " Imie studenta nr 2: "; cin >> im2; cout << " Nazwisko studenta nr 2: "; cin >> nazw2; cout << "Nr albumu studenta nr 2: "; cin >> nralb2; return 0; } Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2015 32 / 43
Tablice Dostarcza strumienia wyjściowego: Imie studenta nr 1: Jan Nazwisko studenta nr 1: Kowalski Nr albumu studenta nr 1: 123321 Imie studenta nr 2: Anna Nazwisko studenta nr 2: Nowak Nr albumu studenta nr 2: 234234 Zapewnia on wczytanie jedynie dwóch pierwszych osób. Wczytane dana zostały umieszczone w sześciu różnych zmiennych. Dla dziesięciu osób kod programu byłby już mało czytelny. Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2015 33 / 43
Tablice Rozwiązaniem, które samo się nasuwa jesta zastosowanie pętli i instrukcji switch. Kod programu mógłby tym razem wyglądać następująco: int main() { string im1, nazw1, im2, nazw2; int nralb1, nralb2; for (int i = 1; i <= 2; i++) switch (i) { case 1: cout << " Imie studenta nr 1: "; cin >> im1; cout << " Nazwisko studenta nr 1: "; cin >> nazw1; cout << "Nr albumu studenta nr 1: "; cin >> nralb1; break; Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2015 34 / 43
Tablice case 2: cout << " Imie studenta nr 2: "; cin >> im2; cout << " Nazwisko studenta nr 2: "; cin >> nazw2; cout << "Nr albumu studenta nr 2: "; cin >> nralb2; break; } return 0; } Rozwiązanie okazało się niesatysfakcjonujące. Kod został rozbudowany, a instrukcji przybyło. Wina leży tu bowiem po stronie samych zmiennych gromadzących dane. I tu z pomocą przychodzą tablice jednowymiarowe Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2015 35 / 43
Tablice Tablice to po prostu indeksowane zmienne. W znaczący sposób potrafią ulepszyć kody programów: int main() { string im[4], nazw[4]; int nralb[4]; for (int i = 0; i < 4; i++){ cout << " Imie studenta nr " << i+1 << ": "; cin >> im[i]; cout << " Nazwisko studenta nr " << i+1 << ": "; cin >> nazw[i]; cout << "Nr albumu studenta nr " << i+1 << ": "; cin >> nralb[i]; } return 0; } Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2015 36 / 43
Tablice Przykładowy strumień wyjściowy dla przedstawionego kodu: Imie studenta nr 1: Jan Nazwisko studenta nr 1: Kowalski Nr albumu studenta nr 1: 123321 Imie studenta nr 2: Anna Nazwisko studenta nr 2: Nowak Nr albumu studenta nr 2: 234234 Imie studenta nr 3: Marek Nazwisko studenta nr 3: Malinowski Nr albumu studenta nr 3: 131313 Imie studenta nr 4: Marcin Nazwisko studenta nr 4: Kowalski Nr albumu studenta nr 4: 432121 Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2015 37 / 43
Jednowymiarowe tablice zmiennych Z przedstawionego przykładu jasno wynika, że tworzenie jednowymiarowych tablic zmiennych jest bardzo proste. Wystarczy, że za deklaracją zwykłej zmiennej podamy liczbę jej elementów ujętą w nawiasy kwadratowe: typ nazwa [ rozmiar ] Tworząc tablicę za pomocą powyższego zapisu - tzw. tablice statyczne - należy pamiętać, że: rozmiar musi być wartością stałą, musi być ona znana w chwili kompilacji programu. Oznacza to, że użytkownik nie może określać rozmiaru tablicy statycznej w trakcie działania aplikacji. cin >> rozm; double dbl[rozm]; Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2015 38 / 43
Tablice, a stabilność aplikacji UWAGA Indeks pierwszego element tablicy w języku C++ wynosi 0, natomiast ostatni element ma indeks rozmiar - 1 Najczęstszym błędem, jaki jest popełniany przez początkujących programistów (również i tych bardziej doświadczonych) jest wychodzenie poza zakres tablicy. Przykładowo: double dbl[10]; dbl[10] = 1.23; // Odwolanie do 11 elementu tablicy Może to spowodować przykre konsekwencje - modyfikacji ulegają wartości innych zmiennych lub kodu maszynowego. W efekcie może również nastąpić uszkodzenie programu co prowadzi do błędu krytycznego. Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2015 39 / 43
Przykład użycia tablicy Programy z użyciem tablic i pętli są zwięzłe: int main() { int in[15]; for (int i = 0; i < 15; i++) in[i] = i; cout << "Suma liczb: "; for (int i = 0; i < 15; i++) cout << in[i] << " "; int suma = 0; for (int i = 0; i < 15; i++) suma += in[i]; cout << endl << " wynosi: " << suma; return 0; } Suma liczb: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 wynosi: 105 Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2015 40 / 43
Spis treści 1 Pętle 2 Pętla do... while 3 Pętla while 4 Pętla for 5 Instrukcje break and continue 6 Jednowymiarowe tablice statyczne 7 Jednowymiarowe tablice dynamiczne Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2015 41 / 43
Jednowymiarowe tablice dynamiczne Istnieje również możliwość tworzenie jednowymiarowych tablic dynamicznych, o których rozmiarze można zadecydować w trakcie wykonywania programu Używamy do tego celu instrukcji: new. typ *nazwa = new typ [ rozmiar ] Gdy przestaje być potrzebna tablica taka powinna być kasowana instrukcją delete : delete [ ] nazwa Pozwala to uniknąć tzw. wycieków pamięci. Na razie nie będziemy rozwijać tematu - do instrukcji new będziemy jeszcze wracać. Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2015 42 / 43
Przykład użycia tablicy dynamicznej Programy z użyciem tablic i pętli są zwięzłe: int main() { int rozm; cout << "Rozmiar tablicy: "; cin >> rozm; int *in = new int[rozm]; // Utworzenie tablicy for (int i = 0; i < rozm; i++) in[i] = i; cout << "Suma liczb: "; for (int i = 0; i < rozm; i++) cout << in[i] << " "; int suma = 0; for (int i = 0; i < rozm; i++) suma += in[i]; cout << endl << "wynosi: " << suma; delete [] in; // Zwolnienie pamieci return 0; } Rozmiar tablicy: 12 Suma liczb: 0 1 2 3 4 5 6 7 8 9 10 11 wynosi: 66 Mirosław Głowacki (AGH, UJK) Programowanie w języku C++ 2015 43 / 43