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