wykład 5 Agata Półrola Wydział Matematyki i Informatyki UŁ sem. zimowy 2016/2017
Zadanie o kotach z poprzedniego wykładu # include < iostream > using namespace std ; int main (){ int rozmiar_ rodzinki, pokolenie, liczba_mlodych, g; cout << " Program liczy po ilu pokoleniach kocia rodzina moze osiagnac podana liczebnosc. "; cout << " Podaj te liczebnosc : "; cin >> g; rozmiar_ rodzinki = 1; pokolenie = 1; while ( rozmiar_ rodzinki < g) { pokolenie = pokolenie + 1; liczba_ mlodych = 6 * rozmiar_ rodzinki ; rozmiar_ rodzinki = rozmiar_ rodzinki + liczba_ mlodych ; } cout << " Rodzinka osiagnie podany rozmiar w " << pokolenie << " pokoleniu \ n"; cout << "( dokladnie mozemy miec wtedy " << rozmiar_ rodzinki << " kotow )"; return 0; }
Pętle wykonujące się podaną liczbę razy Jeśli chcemy wykonać pewien fragment programu określoną liczbę razy, możemy użyć jednej z pętli poznanych wcześniej Przykład (Trzykrotne wykonanie pewnych instrukcji) int L; int L;...... L=1; L=1; while (L<=3) do { { instrukcje instrukcje L=L+1; L=L+1; } } while (L<=3);
... ale istnieją specjalne pętle które mogą być użyte w takich przypadkach
... ale istnieją specjalne pętle które mogą być użyte w takich przypadkach Idea Musimy z góry znać liczbę powtórzeń (przebiegów) pętli liczba ta nie musi być znana w momencie pisania programu, może też być podana przez użytkownika w trakcie jego wykonywania W pętli funkcjonuje pewna zmienna, zwana licznikiem pętli, pamiętająca ile razy pętla została wykonania
Postać w C++ for (inicjalizacje ; warunek; modyfikacje) instrukcja // być może złożona
Postać w C++ for (inicjalizacje ; warunek; modyfikacje) instrukcja // być może złożona Przykłady for (int i=1 ; i<=3 ; i++) cout << i << endll; ----------------------------- for (int i=3 ; i>=1 ; i--) cout << i << endll;
inicjalizacje wykonywane są jednokrotnie przed rozpoczęciem wykonywania pętli. Zazwyczaj slużą do nadania wartości początkowych licznikowi ( licznikom ) pętli, możliwe jest także zdefiniowanie tych liczników (istnieją wtedy tylko wewnątrz pętli) warunek jest sprawdzany przed każdym obiegiem pętli; jeśli ma wartość true to ciało pętli jest wykonywane modyfikacje wykonywane są po każdym wykonaniu pętli, zazwyczaj służą do zmiany wartości licznika (liczników)
zmienne występujące w roli liczników nie muszą być całkowite, ale jeśli są definiowane w inicjalizacjach, to wszystkie muszą być tego samego typu (liczniki zdefiniowane przed pętlą mogą być różnych typów) inicjalizacje i modyfikacje mogą składać się z kilku członów, poszczególne ich części są wtedy oddzielane przecinkami jeśli warunek ma się składać z kilku elementów, wskazane jest połączenie ich spójnikami logicznymi można opuścić niektóre (lub wszystkie) elementy spośród inicjalizacji, warunków i modyfikacji, ale średniki wewnątrz nawiasów pętli są mimo to wymagane
Przykłady for (float i=3.5 ; i>=1 ; i=i/2 ) // licznik rzeczywisty cout << i << endl; ----------------------------- // dwa liczniki definiowane w pętli for (int i=10, a=1 ; i>=1 && a<=2 ; i=i/2, a++) cout << "i = " << i << " a = " << a << endl; ------------------------------ int a; // dwa liczniki różnego typu float i; for ( i=10.5, a=1 ; i>=1 && a<=2 ; i=i/2, a++) cout << "i = " << i << " a = " << a << endl; ------------------------------ for (;;) cout << " \\ * " ; // pętla nieskończona
Przykład użycia (suma 5 liczb) # include < iostream > using namespace std ; int main () { int a, sum =0; for ( int i =1; i <=5; i ++) { cout << " podaj liczbe "; cin >> a; sum = sum +a; } cout << " suma liczb wynosi " << sum << endl ; } return 0;
Przykład użycia (suma podanej liczby liczb) # include < iostream > using namespace std ; int main () { int a, sum =0, ile ; cout << " ile liczb podasz? "; cin >> ile ; for ( int i =1; i <= ile ; i ++) { cout << " podaj liczbe "; cin >> a; sum = sum +a; } cout << " suma liczb wynosi " << sum << endl ; return 0; }
Zadania, czyli wymyślanie algorytmów Zadanie 1 Grupa osób - Jacek, Anka, Magda, Piotr, Tomek, Kamil, Adam, Paweł, Ewa - ma wybrać spośród siebie dwuosobowy zespół. Napisać program wypisujący: wszystkie możliwe składy zespołów w których jedna osoba jest szefem a druga podwładnym, oraz informację na ile sposobów można wybrać taki zespół, wszystkie możliwe składy zespołów złożonych z dwóch równoprawnych członków, oraz informację na ile sposobów można wybrać taki zespół. (osobom przypisujemy numery od 1 do 9 i posługujemy się przy wypisywaniu tymi numerami)
Pary nierównorzędne (pary uporządkowane)
Pary nierównorzędne (pary uporządkowane)
Pary nierównorzędne (pary uporządkowane)
Pary nierównorzędne (pary uporządkowane) schemat postępowania:
Pary nierównorzędne (pary uporządkowane) schemat postępowania: wybieramy szefa
Pary nierównorzędne (pary uporządkowane) schemat postępowania: wybieramy szefa tworzymy wszystkie możliwe pary: ten szef + podwładny (podwładnym może być każda inna osoba w grupie)
Pary nierównorzędne (pary uporządkowane) schemat postępowania: wybieramy szefa tworzymy wszystkie możliwe pary: ten szef + podwładny (podwładnym może być każda inna osoba w grupie) implementacja: for (int szef=1; szef<=9; szef++) for (int podwladny=1; podwladny <=9; podwladny++) if (szef!=podwladny) { // wypisz pare }
Przykład (zad 1 - część 1) # include < iostream > using namespace std ; int main (){ int ilepar =0, ileosob ; cout << " ile jest osob w grupie? " ; cin >> ileosob ; for ( int szef =1; szef <= ileosob ; szef ++) for ( int podwl =1; podwl <= ileosob ; podwl ++) if ( szef!= podwl ){ cout << " szef : " << szef << ", podwladny : " << podwl << endl ; ilepar ++; } cout << " par bylo " << ilepar << endl ; return 0; }
Pary równorzędne (pary nieuporządkowane)
Pary równorzędne (pary nieuporządkowane)
Pary równorzędne (pary nieuporządkowane)
Pary równorzędne (pary nieuporządkowane) schemat postępowania:
Pary równorzędne (pary nieuporządkowane) schemat postępowania: wybieramy pierwszą osobę pary (A)
Pary równorzędne (pary nieuporządkowane) schemat postępowania: wybieramy pierwszą osobę pary (A) dobieramy do niej drugą osobę (B), przy czym należy pominąć te osoby, które były już w roli A (bo para z tych dwóch osób już była, a pary Kowalski+Nowak i Nowak+Kowalski to to samo)
Pary równorzędne (pary nieuporządkowane) schemat postępowania: wybieramy pierwszą osobę pary (A) dobieramy do niej drugą osobę (B), przy czym należy pominąć te osoby, które były już w roli A (bo para z tych dwóch osób już była, a pary Kowalski+Nowak i Nowak+Kowalski to to samo) implementacja: for (int osoba1=1; osoba1<=9; osoba1++) for (int osoba2 =osoba1; osoba2<=9; osoba2++) if (osoba1!=osoba2 ){ // wypisz pare }
Przykład (zad 1 - część 2) # include < iostream > using namespace std ; int main (){ int ilepar =0, ileosob ; cout << " ile jest osob w grupie? " ; cin >> ileosob ; for ( int osoba1 =1; osoba1 <= ileosob ; osoba1 ++) for ( int osoba2 = osoba1 ; osoba2 <= ileosob ; osoba2 ++) if ( osoba1!= osoba2 ){ cout << " osoba1 : " << osoba1 << ", osoba2 : " << osoba2 << endl ; ilepar ++; } cout << " par bylo " << ilepar << endl ; return 0; }
Zadanie 2 Napisać progam pobierający liczby całkowite do momentu pobrania zera i wypisujący największą z podanych liczb (końcowe zero nie jest brane pod uwagę)
elementy schematu postępowania: pobieranie liczb do momentu podania 0:
elementy schematu postępowania: pobieranie liczb do momentu podania 0: while(true){ cout << "podaj liczbe: "; cin >> liczba; if (liczba==0) break; // tu coś robimy z liczbą }
elementy schematu postępowania: pobieranie liczb do momentu podania 0: while(true){ cout << "podaj liczbe: "; cin >> liczba; if (liczba==0) break; // tu coś robimy z liczbą } szukanie maksimum: potrzebujemy zmiennej przechowującej dotychczasowe maksimum (Max) jeśli wprowadzona liczba jest większa niż dotychczasowa wartość Max to zmieniamy Max uwaga - po podaniu pierwszej liczby Max musi stać się równe tej liczbie (trzeba albo dobrać odpowiednią wartość początkową, albo zauważyć pierwsze wprowadzenie wartości)
elementy schematu postępowania: pobieranie liczb do momentu podania 0: while(true){ cout << "podaj liczbe: "; cin >> liczba; if (liczba==0) break; // tu coś robimy z liczbą } szukanie maksimum: potrzebujemy zmiennej przechowującej dotychczasowe maksimum (Max) jeśli wprowadzona liczba jest większa niż dotychczasowa wartość Max to zmieniamy Max uwaga - po podaniu pierwszej liczby Max musi stać się równe tej liczbie (trzeba albo dobrać odpowiednią wartość początkową, albo zauważyć pierwsze wprowadzenie wartości) wypisywany wynik musi być poprawny nawet jeśli użytkownik od razu podał 0
Przykład (zad 2 - wersja 1) # include < iostream > # include < limits > using namespace std ; int main (){ int a, max ; bool czy_ byly_ liczby ; czy_ byly_ liczby = false ; // na poczatku nie bylo max = std :: numeric_limits <int >:: min (); while ( true ) { cout << " podaj liczbe : "; cin >> a; if ( a ==0) break ; czy_ byly_ liczby = true ; // byla jakas liczba if (a>max ) max =a; } if ( czy_byly_liczby == true ) cout << " najwieksza liczba to " << max << endl ; else cout << " nie bylo liczb, nie ma najwiekszej "; return 0; }
Przykład (zad 2 - wersja 2) # include < iostream > using namespace std ; int main (){ int a,max, ile ; ile =0; while ( true ) { cout << " podaj liczbe "; cin >> a; if (a ==0) break ; ile ++; if ( ile ==1) max = a; else { if (a>max ) max = a; } } if ( ile > 0) cout << " najwieksza liczba to " << max << endl ; return 0; }