Kontrola przebiegu programu Wykład 9 Instrukcje sterujące: pętle rozgałęzienia skoki
PRZYPOMINAJKA Zadanie : Zaprojektuj rekurencyjny przepis na wyznaczenie największej takiej liczby m, że 2 m jest podzielnikiem danego n Max2Podzielnik(n; m): Jeśli n mod 2 == 1 to 0 inaczej Max2Podzielnik(n/2 ; m ): m = 1 +m W języku C++: int Max2Podzielnik( int n) { if (n%2 == 1) return 0; else return 1+Max2Podzielnik(n/2); 2013-03-25 2
Instrukcje sterujące Sterowanie przebiegiem programu : Fakt z teorii programowania programowanie strukturalne Wszystkie obliczenia można wyrazić jako: (1)ciąg zdań, (2)decyzje (3) powtórzenia!!!! podejmowanie decyzji, selekcja Pętla: powtórzenia, pętle rozgałęzienia kontrolowane powtarzanie instrukcji while (<warunek>) <polecenie> do <polecenie> while (<warunek>) for ( <init>; <warunek> ; <iteracja>) <polecenie> 3
Pętla FOR 1. 2. 3. 1. 2. 3. 4
Zadanie: odwróć kolejność znaków w zadanym łańcuchu Pętla for :przykład Dane: łańcuch znaków s Wynik: łańcuch znaków s z odwróconą kolejnością elementów i=dlugosc(s) -1 j=0 dopóki (i>j) wykonuj znak=s[i] s[i]=s[j] s[j]=znak i =i-1 j=j+1 5
Rozwiązanie najprostsze referencja cpp c 6
Pętle: składnia 7
Instrukcje sterujące Sterowanie przebiegiem programu : Fakt z teorii programowania programowanie strukturalne Wszystkie obliczenia można wyrazić jako: (1)ciąg zdań, (2)decyzje (3) powtórzenia!!!! podejmowanie decyzji, selekcja powtórzenia, pętle rozgałęzienia (1) while (<warunek>) <polecenie> (2) do <polecenie> while (<warunek>) (3) for ( <init>; <warunek> ; <iteracja>) <polecenie> 8
Przykład Zadanie: Znajdź wśród zadanych liczb liczbę nieparzystą, której suma cyfr jest 7. Zakładamy, że liczba jest dwucyfrowa. Dane: tablica A[N] zadanych liczb Wynik: liczba z tablicy, która jest nieparzysta a suma jej cyfr jest 7 int znajdz( int *liczby, int N) { int i; for (i = 0; i < N; ++i) { int dig1, dig2; if (liczby[i]%2 == 0) continue; // pomiń resztę pętli dig2 = liczby[i]%10; dig1 = liczby[i]/10; if (dig1 + dig2 == 7) break; // zakończ pętle return liczby[i]; 9
Dziwne użycie pętli? Puste warunki z założenia są spełnione for(;i<30;) { I++; //do something Zadanie domowe: Które z tych pętli są sobie równoważne? 10
Instrukcje sterujące Sterowanie przebiegiem programu : programowanie strukturalne podejmowanie decyzji, selekcja (1) if (2) If else (3) switch powtórzenia, pętle rozgałęzienia 11
IF ELSE Ifelse pozwala wykonywać jedną z dwóch instrukcji( bloku instrukcji). Dołączając kolejne instrukcje if else, obsługujemy więcej możliwości wyboru. 12
IF ELSE false test_expr _1 true false 13
Przykład: if else Zadanie: Pobrać wiek klienta i skomentować go następująco: jeśli wiek <20 to wyświetlić mlodziak z Ciebie! jeśli 20 <= wiek <40 to wyświetlić " jestes juz dorosly! jeśli 40 <= wiek <60 to wyświetlić "to masz bole i zgryzoty! jeśli 60 <= wiek <80 to wyświetlić "brawo: osiagnales wiek zloty!"; Natomiast jeśli wiek >80 to poprosić o potwierdzenie. Pierwszy test Drugi test Test złożony: konuinkcja warunków if (wiek < 20) cout<< " mlodziak z Ciebie!"; else if (wiek < 40) cout <<" jestes juz dorosly! "; else if (wiek < 60) cout<<"to masz bole i zgryzoty!"; else if (wiek < 80) cout <<"brawo: osiagnales wiek zloty!"; else { char naprawde; cout <<"naprawde masz " << wiek <<" (T/t)?\n"; cin>> naprawde; if (naprawde == 'T' naprawde == 't') cout << " to gratulacje!"; else cout<<"wiedzialam, ze nie jestes taki stary!"; 14
Ogólna postac wyrażenia switch #include <iostream> using namespace std; int main(){ int wiek; char naprawde; cout <<"Podaj swoj wiek: "; cin >> wiek; switch switch(wyrażenie_o_wartościach_calkowitych) { case etykieta1: instrukcja1; break; case etykieta2: instrukcja2; break; default: intstrukcja 3; switch(wiek/20){ case 0: cout<< " mlodziak z Ciebie!"; break; case 1: cout <<" jestes juz dorosly! "; break; case 2: cout<<"to masz bole i zgryzoty!"; break; case 3: cout << "brawo: osiagnales wiek zloty!"; break; default: cout <<"naprowde masz " << wiek <<" (T/t)?\n"; cin>> naprawde; if (naprawde == 'T' naprawde == 't') cout << " to gratulacje!"; else cout<<"wiedzialam, ze nie jestes taki stary!"; return 0; wiek_2.cpp 15
Instrukcje sterujące Sterowanie przebiegiem programu : Fakt z teorii programowania programowanie strukturalne podejmowanie decyzji, selekcja powtórzenia, pętle Wszystkie obliczenia można wyrazić jako: (1)ciąg zdań, (2)decyzje (3) powtórzenia!!!! (1) while (<warunek>) <polecenie> (1) if (2) If else (3) switch break continue goto rozgałęzienia (2) do <polecenie> while (<warunek>) (3) for ( <init>; <warunek> ; <iteracja>) <polecenie> goto 16
Przykład użycia goto char ch; Cin >> ch; if (ch == P ) goto paryz; cout <<.. Skok do etykiety paryz. paryz: cout << Witaj w Paryzu! ; Uważa się, że użycie instrukcji skoku goto jest nieeleganckim rozwiązaniem 17
o wydajności programu decydują pętle Zadanie: Zaproponuj algorytm wyznaczający pozycje zadanej wartości w tablicy liczb uporządkowanych rosnąco Rozwiązanie 1: Dane: tab[n] tablica N liczb całkowitych uporządkowanych rosnąco szukaj poszukiwana wartość Wynik: gdzie = -1 jeśli w tablicy nie ma poszukiwanej wartości = pozycja w tablicy jeśli w tablicy dana wartość występuje. Zmienna pomocnicza: k Złożoność obliczeniowa algorytmu: N* ( czas wykonania 1 testu) = O(N) 18
Przykład: #include <iostream> using namespace std; int szukaj( int tab[], int, int ); int main(){ const int rozmiar=8; int tablica[rozmiar]={ 2,5,6,7,12,13,15,21; int szukam, czy_jest=0, gdzie=-1; cout << "podaj liczbe do wyszukania "; cin >> szukam; gdzie=szukaj( tablica,rozmiar-1, szukam); if ( gdzie >-1 ) cout <<"\nliczba "<< szukam << " to tab[ " << gdzie <<" ]" ; else cout<< "\n nie ma podanej liczby w tablicy" ; return 0; int szukaj ( int tab[], int N, int szukam){ int k ; for (k=0; k<n ; ++k) if ( tab[k] == szukam) break; return (k==n)? -1: k ; 19
Przykład: Zadanie: Zaproponuj algorytm wyznaczający pozycje zadanej wartości w tablicy liczb uporządkowanych rosnąco Rozwiązanie 2: Szukaj_Bin(szukaj, tab[n], start, koniec; gdzie) Jeśli( start >= koniec) to jeśli ( szukaj== tab[start] ) to gdzie = start inaczej gdzie = -1 inaczej srodek= ( start+koniec)/2 jeśli ( szukaj== tab[srodek] ) to gdzie = srodek inaczej jeśli ( szukaj < tab[srodek] ) to Szukaj_Bin(szukaj, tab[n], start, srodek-1;gdzie ) gdzie = gdzie inaczej Szukaj_Bin(szukaj, tab[n], srodek+1, koniec; gdzie ) gdzie = gdzie Złożoność obliczeniowa: O(log 2 N) 20
Przykład: int szukaj_bin ( int tab[], int start, int koniec, int szukam){ int srodek; if ( start >= koniec) return ( szukam == tab[start] )? start: -1; else { srodek=(koniec+start)/2; if ( szukam == tab[srodek]) return srodek; else if (szukam <tab[srodek]) return szukaj_bin(tab, start, srodek-1,szukam); else return szukaj_bin( tab, srodek+1, koniec, szukam); szukaj_bin.cpp 21