Kontrola przebiegu programu
Transkrypt
Kontrola przebiegu programu
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 2m 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 D. Makowiec: Programowanie dla I BioInf 2 Instrukcje sterujące Wszystkie obliczenia można wyrazić jako: (1)ciąg zdań, (2)decyzje (3) powtórzenia !!!! Sterowanie przebiegiem programu : Fakt z teorii programowania programowanie strukturalne 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 D. Makowiec: Programowanie dla I BioInf 2013-04-22 Pętla FOR 1. 2. 3. 1. 2. 3. 4 D. Makowiec: Programowanie dla I BioInf 2013-04-22 Pętla for :przykład Zadanie: odwróć kolejność znaków w zadanym łańcuchu 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 D. Makowiec: Programowanie dla I BioInf 2013-04-22 Rozwiązanie najprostsze referencja cpp c 6 D. Makowiec: Programowanie dla I BioInf 2013-04-22 Pętle: składnia 7 D. Makowiec: Programowanie dla I BioInf 2013-04-22 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 (1) while (<warunek>) <polecenie> (2) do rozgałęzienia <polecenie> while (<warunek>) (3) for ( <init>; <warunek> ; <iteracja>) <polecenie> 8 D. Makowiec: Programowanie dla I BioInf 2013-04-22 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 D. Makowiec: Programowanie dla I BioInf 2013-04-22 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 D. Makowiec: Programowanie dla I BioInf 2013-04-22 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 D. Makowiec: Programowanie dla I BioInf 2013-04-22 IF ELSE If else pozwala wykonywać jedną z dwóch instrukcji( bloku instrukcji). Dołączając kolejne instrukcje if else, obsługujemy więcej możliwości wyboru. D. Makowiec: Programowanie dla I BioInf 12 2013-04-22 IF ELSE false false test_expr _1 true 13 D. Makowiec: Programowanie dla I BioInf 2013-04-22 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 D. Makowiec: Programowanie dla I BioInf 2013-04-22 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; } D. Makowiec: Programowanie dla I BioInf wiek_2.cpp 15 2013-04-22 Instrukcje sterujące Wszystkie obliczenia można wyrazić jako: (1)ciąg zdań, (2)decyzje (3) powtórzenia !!!! Sterowanie przebiegiem programu : Fakt z teorii programowania programowanie strukturalne (1) if (2) If else (3) switch podejmowanie decyzji, selekcja powtórzenia, pętle (1) while (<warunek>) <polecenie> (2) do <polecenie> while (<warunek>) rozgałęzienia break continue goto (3) for ( <init>; <warunek> ; <iteracja>) <polecenie> goto 16 D. Makowiec: Programowanie dla I BioInf 2013-04-22 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 D. Makowiec: Programowanie dla I BioInf 2013-04-22 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) D. Makowiec: Programowanie dla I BioInf 18 2013-04-22 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 D. Makowiec: Programowanie dla I BioInf 2013-04-22 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 Złożoność inaczej obliczeniowa: srodek= ( start+koniec)/2 O(log 2N) 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’ 20 D. Makowiec: Programowanie dla I BioInf 2013-04-22 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 D. Makowiec: Programowanie dla I BioInf 2013-04-22