Podstawowe elementy programu Zestaw komend stojący do dyspozycji programisty zależy od języka programowania; jest ograniczony; jestnatylebogaty,żedajesięznichzłożyć(jakzklocków)sensowne programy Umiejętność programowania jest sztuką odpowiedniego układania tych klocków Do typowych komend należą: patrz: następne 2 slajdy Wykład 2 INSTRUKCJE I NIEZMIENNIKI, str 2 Podstawowe elementy programu Komendy proste: SCHEMAT C przypisanie wartości zmiennej zmienna wartość zmienna = wartość;
Podstawowe elementy programu Komendy złożone(strukturalne): pętla rozgałęzienie SCHEMAT warunek warunek ciało warunek warunek instrukcja 1 instrukcja 2 C while(warunek) { ciało if(warunek) { instrukcja 1 else { instrukcja 2 Rozgałęzienie warunkowe Wykład 2 INSTRUKCJE I NIEZMIENNIKI, str 4 pełne uproszczone warunek warunek instrukcja 1 instrukcja 2 warunek warunek instrukcja 1 if(warunek) { instrukcja 1 else { instrukcja 2 if(warunek) { instrukcja 1
Budowa prostych programów Zagnieżdżanie instrukcji: war 1 war 1 war 2 war 2 instr 1 instr 2 while(war 1 ) { if(war 2 ) { instr 1 else { instr 2 schemat C Wykład 2 INSTRUKCJE I NIEZMIENNIKI, str 6 Przykład programu: największy wspólny dzielnik a=a; b=b; while(a!=b) { if(a>b) a=a-b; else b=b-a; A B a b 180 48 180 48 180 48 180 48 132 48 180 48 84 48 180 48 36 48 180 48 36 12 180 48 24 12 180 48 12 12!= oznaczenie relacji nierówne w języku C
Przykład programu: NWD wielu liczb nwd(a 1,a 2,a 3,a 4 )=nwd (nwd ( ) ) nwd(a 1,a 2 ),a 3,a4 nwd(a 1,a 2,,a n )=nwd(nwd(nwd(a 1,a 2 ),),a n ) wczytaj a;ilewczyt=1; while(ilewczyt<n){ wczytaj b;ilewczyt=ilewczyt+1; while(a!=b) { if(a>b) a=a-b; else b=b-a; Poprawność algorytmów Wykład 2 INSTRUKCJE I NIEZMIENNIKI, str 8 Przykład: (potęgowanie przez wielokrotne mnożenie) M wynik 1;w wykładnik w>0 w=0 wynik wynik podstawa wynik podstawa w =podstawa wykladnik wynik podstawa podstawa w 1 = =podstawa wykladnik w w 1 wynik podstawa w 1 =podstawa wykladnik wynik=podstawa wykladnik
Metoda niezmienników DEFINICJA: MNiezmiennik pętli while(war) instr dowolna własność P zmiennych programu taka, że jeśli przed wykonaniem instr spełnione jest P& war, to po wykonaniu instr spełnione jest P TWIERDZENIE: MJeśli P jest niezmiennikiem pętli while(war) instr i po inicjalizacji pętlijestspełniony,tonawyjściuzpętlijestspełnionep& war Wykład 2 INSTRUKCJE I NIEZMIENNIKI, str 10 Niezmienniki spoza informatyki 2m/sek 12m???m/sek 10m energia=energiakinetyczna+energiapotencjalna= mv2 2 +mgh jest stała (2m/sek) 2 2 v2 +10m/sek 2 12m= 2 +10m/sek2 10m v = 44m/sek 663m/sek
Metoda niezmienników W trakcie obliczeń pętli wartości zmiennych stale się zmieniają, ale pozostaje w mocy pewien związek między nimi niezmiennik Z tego faktu wynikają własności pętli A inicjalizacja B warunek warunek C ciało D A założenia wstępne B niezmiennik C niezmiennik + warunek D stanwynikowy Trzeba zbadać: 1przejścieprzezinicjalizacjęzAdoB, 2przejścieprzezciałozCdoB, 3implikacjęB&warunek C, 4implikacjęB& warunek D Co liczy dany program? n 500000;a 0;b 0;c 1;d 6 B b+c n b+c>n a a+1;b b+c c c+d d d+6 Wykład 2 INSTRUKCJE I NIEZMIENNIKI, str 12 Ręczna symulacja: wartości zmiennych w B w kilku pierwszych obrotach pętli: a b c d 0 0 1 6 1 1 7 12 2 8 19 18 3 27 37 24 4 64 61 30 5 125 91 36 6 216 127 42 7 343 169 48 Zależności między wartościami zmiennych: b=a 3 d=6 (a+1) c=(a+1) 3 a 3 =3a 2 +3a+1
Co liczy dany program? n 500000;a 0;b 0;c 1;d 6 b=a 3 &d=6(a+1) B &c=3a 2 +3a+1 b+c n b+c>n a a+1;b b+c c c+d d d+6 Czy B jest niezmiennikiem? zmienne nieprimowane przed przejściem przez ciało pętli zmienne primowane po przejściu przez ciało pętli Wiemy: oraz b=a 3 &d=6(a+1)& c=3a 2 +3a+1&b+c n a =a+1 c =c+d b =b+c d =d+6 Stąd wnioskujemy: b? =a 3 &d? =6(a +1)& c? =3a 2 +3a +1 Co liczy dany program? Wykład 2 INSTRUKCJE I NIEZMIENNIKI, str 14 n 500000;a 0;b 0;c 1;d 6 b=a 3 &d=6(a+1) B &c=3a 2 +3a+1 b+c n b+c>n a a+1;b b+c c c+d D b=a3 &d=6(a+1)& c=3a 2 +3a+1&b+c>500000 D &a 3 500000<(a+1) 3 D &a 3 500000<a+1 Program oblicza a= = 3 500000 = 7937 =79 d d+6 D &a= 3 500000 x część całkowita liczby rzeczywistej
Przykłady programów /*A:m 1*/ k=0; p=1; q=2; /*B:p=3 k m&q=2 3 k */ while(p+q<=m) { k=k+1; p=p+q; q=p+p; /*D:k= log 3 m */ Dowieść(zmienne primowane oznaczają nowe wartości): 1m 1&k =0&p =1&q =2 p =3 k m&q =2 3 k? 2p=3 k m&q=2 3 k &p+q m& k =k+1&p =p+q&q =p +p? p =3 k m&q =2 3 k 3p=3 k m&q=2 3 k &p+q>m? k= log 3 m Wykład 2 INSTRUKCJE I NIEZMIENNIKI, str 16 Przykład programu: największy wspólny dzielnik /*A>0&B>0*/ a=a; b=b; /*a>0&b>0&nwd(a,b)=nwd(a,b)*/ while(a!=b) { if(a>b) a=a-b; else b=b-a; /*a=nwd(a,b)*/
Przykłady programów Dzielenie całkowite z resztą: Dzielenie dokładne: q jest ilorazem n przez k k q=n Dzieleniezresztą: qjestilorazemcałkowitymarjestresztąnprzezk k q+r=n&0 r<k Dzielenie z resztą łatwo zorganizować przez wielokrotne odejmowanie: znaleźćjakiekolwiekqirspełniającek q+r=n&0 r, tak długo odejmować dzielnik k od r, aż dodatkowo będzie spełnione r<k(zakładamyk>0) Przykłady programów Wykład 2 INSTRUKCJE I NIEZMIENNIKI, str 18 Dzielenie całkowite z resztą(zał: k > 0): B A q 0;r n B k q+r=n&0 r k r r<k C k q+r=n&0<k r C k (q+1)+(r k)=n&0 r k r r k E q q+1 n 0&k>0 k (q+1)+r=n&0 r k q+r=n&0 r D k q+r=n&0 r<k 1 Przejście odadob 2 Wynikanie B&k r C 3 Przejście odcdob (przez E) 4 Wynikanie B&r<k D
Przykłady programów Dzielenie całkowite z resztą: /*n 0&k>0*/ q=0;r=n; /*n=k q+r &0 r*/ while(r>=k) { q=q+1;r=r-k; /*n=k q+r &0 r<k*/ Dla poprawności należy sprawdzić: 1jeślin 0&k>0,topowykonaniu q=0;r=n; jestn=k q +r &0 r 2jeślin=k q+r &0 r &r k,topowykonaniu q=q+1;r=r-k; jestn=k q +r &0 r 3jeślin=k q+r &0 r &r<k, ton=k q +r &0 r <k Wykład 2 INSTRUKCJE I NIEZMIENNIKI, str 20 Przykład programu: pierwiastek kwadratowy Napisaćalgorytm,którydladanejliczbynaturalnejnoblicza n,czyli część całkowitą pierwiastka kwadratowego z n /*n 0*/ a=0; h=1; while(n>=h*h) h=2*h; /*h 1&a 2 n<(a+h) 2 */ while(h>1) { h=h/2; if(n>=(a+h)*(a+h)) a=a+h; /*a 2 n<(a+1) 2 */ /*a= n */ a 2 n<(a+1) 2 a= n h 1& a 2 n<(a+h) 2 & h 1 a 2 n<(a+1) 2 Niezmiennik pętli: h 1&a 2 n<(a+h) 2
Przykład: pierwiastek kwadratowy Napisaćalgorytm,którydladanejliczbynaturalnejnoblicza n,czyli część całkowitą pierwiastka kwadratowego z n /*n 0*/ a=0; h=1; while(n>=h*h) h=2*h; /*h 1&a 2 n<(a+h) 2 */ while(h>1) { h=h/2; if(n>=(a+h)*(a+h)) a=a+h; /*a 2 n<(a+1) 2 */ /*a= n */ Żeby nie podnosić sumy do kwadratu w każdym obrocie pętli, wprowadzamy nowe zmienne:x=a 2,y=a h,z=h 2 Wtedy: (a+h) (a+h) =x+2 y+z Nowy niezmiennik pętli: h 1&a 2 n<(a+h) 2 &x=a 2 &y=a h &x z=y 2 Wykład 2 INSTRUKCJE I NIEZMIENNIKI, str 22 Przykład: pierwiastek kwadratowy Napisaćalgorytm,którydladanejliczbynaturalnejnoblicza n,czyli część całkowitą pierwiastka kwadratowego z n /*n 0*/ a=0; x=0; y=0; h=1; z=1; while(n>=h*h) { h=2*h;z=4*z; /*h 1&a 2 n<(a+h) 2 &x=a 2 &y=a h&z=h 2 &x z=y 2 */ while(h>1) { h=h/2;y=y/2;z=z/4; if(n>=x+2*y+z) { a=a+h;x=x+2*y+z;y=y+z; /*a 2 n<(a+1) 2 */ /*a= n */
Przykład: pierwiastek kwadratowy Napisaćalgorytm,którydladanejliczbynaturalnejnoblicza n,czyli część całkowitą pierwiastka kwadratowego z n /*n 0*/ a=0; x=0; y=0; h=1; z=1; while(n>=h*h) { h=2*h;z=4*z; /*h 1&a 2 n<(a+h) 2 &x=a 2 &y=a h&z=h 2 &x z=y 2 */ while(h>1) { h=h/2;y=y/2;z=z/4; if(n>=x+2*y+z) { a=a+h;x=x+2*y+z;y=y+z; /*a 2 n<(a+1) 2 */ /*a= n */ Przy takim niezmienniku: n h 2 n z h 1 z 1 h=1 y=a więczmienneaihjuż nie są potrzebne Wykład 2 INSTRUKCJE I NIEZMIENNIKI, str 24 Przykład: pierwiastek kwadratowy Napisaćalgorytm,którydladanejliczbynaturalnejnoblicza n,czyli część całkowitą pierwiastka kwadratowego z n /*n 0*/ a=0; x=0; y=0; h=1; z=1; while(n>=z) { h=2*h;z=4*z; /*z 1&x n<x+2 y+z&x=a 2 &y=a h&z=h 2 &x z=y 2 */ while(z>1) { h=h/2;y=y/2;z=z/4; if(n>=x+2*y+z) { a=a+h;x=x+2*y+z;y=y+z; /*y n<(y+1) 2 */ /*y= n */
Przykład: pierwiastek kwadratowy Napisaćalgorytm,którydladanejliczbynaturalnejnoblicza n,czyli część całkowitą pierwiastka kwadratowego z n /*n 0*/ x=0; y=0; z=1; while(n>=z) z=4*z; /*z 1&x n<x+2 y+z &x z=y 2 */ while(z>1) { y=y/2; z=z/4; if(n>=x+2*y+z) { x=x+2*y+z;y=y+z; /*y n<(y+1) 2 */ /*y= n */ Nowy program z dowodem poprawności, nadal liczący część całkowitą pierwiastka kwadratowego n x y z 35 0 0 1 4 16 64 16 16 16 8 4 4 1 25 5 Wykład 2 INSTRUKCJE I NIEZMIENNIKI, str 26 Jak pisać programy z dowodami? Z tego, że asercje rozmieszczone w programie są niezmiennikami, wnioskujemy o jego poprawności Np w powyższym programie z niezmienniczościasercjin 0nawejściuwynikaniezmienniczośćasercji a= n nawyjściu,czylifakt,żeprogramliczyczęśćcałkowitąpierwiastkazn Konstruując program najpierw piszemy odpowiednie asercje; potem tak dobieramy komendy, żeby te asercje były niezmiennicze Program powstaje więc razem z dowodem swojej poprawności; dowód zawsze o pół kroku wcześniej Asercje mogą również pomóc w kontrolowanym transformowaniu programu do innej postaci