Podstawy Informatyki Inżyria Ciepła, I rok Wykład 8 Algorytmy, cd Instrukcja decyzyjna wybierz Zda wybierz służy do wyboru jednej z kilku możliwości Ma ono postać: wybierz przełącznik z wartość_1: zda_1 wartość_n: zda_n akcja awaryjna wybierz p z 1: wykonaj wariant pierwszy : wykonaj wariant drugi : wykonaj wariant trzeci wydrukuj komunikat o błędzie Program cenzurka1 wybierz ocena z : pisz( bardzo dobry ); 4: pisz( dobry ); : pisz( dostateczny ); : pisz( dostateczny ); pisz( blad danych ) Koc Program cenzurka jeżeli ocena = to pisz( bardzo dobry ) jeżeli ocena = 4 to pisz( dobry ) jeżeli ocena = to pisz( dostateczny ) jeżeli ocena = to pisz( dostateczny ) pisz( blad danych ) Blok instrukcji W przypadku, gdy w danej instrukcji, np instrukcji warunkowej, powinna wykonać się więcej niż jedna instrukcja, wówczas stosowany jest blok instrukcji C: { } ; instrukcja; instrukcja; Pascal: begin ; end; instrukcja; instrukcja; Iteracja warunkowadopóki(while) dopóki(wyraże) wykonuj ; wyraże Instrukcja1 może wykonać się ani jeden raz!
Działa pętli: Obliczana jest wartość wyrażenia Jeśli wyraże jest równe fałszywe to jest w ogóle wykonywana Wpp wykonywana jest Ponow obliczana jest wartość wyrażenia i ponow sprawdzana jego prawdziwość itd Jeśli wyraże będzie fałszywe, to działa pętli zosta przerwane Uwaga: oblicze wartości wyrażenia odbywa się przed wykonam instrukcji1 Iteracja warunkowawykonuj aż do (do until ) wykonuj aż do(wyraże) ; wyraże Instrukcja1 musi wykonać się co najmj jeden raz! Działa pętli: Wykonywana jest Obliczana jest wartość wyrażenia Jeśli wyraże jest równe fałszywe to jest wykonywana kolejny raz Ponow obliczana jest wartość wyrażenia i ponow sprawdzana jego prawdziwość itd Jeśli wyraże będzie prawdziwe, to działa pętli zosta przerwane Uwaga: oblicze wartości wyrażenia odbywa się po wykonaniu instrukcji1 Iteracja ograniczonadla(for) dla <zmienna> od <w1<> do <w> (z krokiem <k>) wykonuj ; <zmienna> + <k> <zmienna> <w1> zmienna <w> Instrukcja1 może wykonać się ani jeden raz! Działa pętli: Instrukcje wejścia/wyjścia Wykona instrukcji inicjalizujących pętlę <zmienna> <w1> Sprawdze wyrażenia warunkowego <zmienna> <w> Jeśli fałsz, praca pętli zostaje zakończona, Jeśli prawda, wykonana zosta Wykona instrukcji zwiększ <zmienna> o <k> Uwaga: sprawdze wyrażenia <zmienna> <w> odbywa się przed wykonam Umożliwiają komunikowa się programu z użytkownikiem Umożliwiają czyta danych jak rówż wypisywa komunikatów i wyników prowadzonych obliczeń Np: Pascal - read(a,b); { z klawiatury wprowadzamy : np 1 } writeln(a); {drukujemy na ekra wartość a (np 1) }
Algorytm sprawdzania czy trójkąt jest prostokątny WY: trójkąt jest prostokątny We: a,b,c boki trójkąta N d = a*a + b*b? d=c*c T WY: trójkąt jest prostokątny Algorytm sprawdzania czy trójkąt jest prostokątny Program trojkat prostokatny; a,b,c,d: całkowita; pisz( podaj boki a,b,c); d:=a*a+b*b; jeżeli (d=c*c) to pisz ( trójkąt prostokątny ) pisz ( trójkąt Gdzie tkwi błąd? jest prostokątny ) Jak poprawić ten program? koc Algorytm sprawdzania parzystości liczby Algorytm sprawdzania parzystości liczby WY: x parzyste We: sprawdzana liczba x N y = (x/)*? x=y T WY: x parzyste Program parzystosc; x,y: całkowita; pisz( podaj liczbe x ); czytaj(x); y := x/; y := y*; jeżeli (x=y) to pisz ( liczba x jest parzysta ) pisz ( liczba x jest parzysta ) koc Uwaga: Program ma sens tylko dzięki własności dzielenia liczb całkowitych Sito Erastotenesa Sito Erastotenesa Wyszukiwa liczb pierwszych 1 14 16 4 18 6 0 8 1 10 4 1 1 6 1 1 14 16 4 18 6 0 8 1 10 4 1 1 6 1 Kiedy koc? Dla n
program sito a: tablica [000] elementów całkowitych i,j,n,m,x,y:całkowite pisz 'podaj górną granicę przedziału, max 1000' czytaj n m=int(sqrt(n)) {maksymalny mnoznik pierwiastek z n) dla i=1 do n wykonuj a[i]=i {podstawie kolejnych liczb do tablicy} dla j= do m wykonuj jeśli a[j] <>0 to dla i=j+1 do n wykonuj x=a[i] y=(x/j)*j {sprawdza podzielności} jeśli x=y to a[i]=0 koc koc koc pisz 'w podanym zakresie liczby pierwsze to:' dla i= do n jeśli a[i] <>0 to drukuj a[i] koc Optymalizacja algorytmów Zawsze poszukujemy najlepszego algorytmu ze względu na czas i złożoność obliczeń Wydajność czasowa algorytmu: - funkcja O(n), określająca ile czasu potrzebuje dany algorytm na rozwiąza problemu o rozmiarze n (parametr n zależy od analizowanego zagadnia, np dla sortowania tablicy, n jest liczbą danych do sortowania, itp) Program zliczający sumę elementów tablicy A[n]: Suma :=0 dla i:=0 do i:=n suma := suma + A[i] Złożoność obliczeniowa, cd Program obliczający sumę elementów tablicy dwuwymiarowej A[n,n]: Suma :=0 // 1 dla i:=0 do i:=n //1 dla j:=0 do j:=n //n suma := suma + A[i,j] //n^ Jedna instrukcja wymaga jednej jednostki czasu Złożoność obliczeniowa O(n) = n^ + n + Przyjmujemy, że złożoność obliczeniowa O(n) = n^ + n Jedna instrukcja wymaga jednej jednostki czasu Złożoność obliczeniowa O(n) = n+ Poważ najbardziej znaczącym składnikiem jest n, więc, O(n) = n Czas pracy algorytmów różnych klas c(n) c(n) 10 0 0 40 N 10 0 0 40 N 100 400 00 1600 n 104 10486 104184 1066 N! 68800 *10 18 6*10 *10 Czas działania algorytmu zależy tylko od rozmiaru danych wejściowych, ale rówż od ich wartości lub układu (rozmieszczenia) Skróce czasu obliczeń Wielokrotne mnoże zamiast potęgowania y=x y=x*x*x*x*x jest szybsze i dokładjsze niż: y=x^ gdyż funkcja potęgowania jest rozwijana jako: y=e *ln(x) a dodatkowo, funkcje ln i e x są obliczane jako sumy określonych ciągów Ze zrozumiałych przyczyn zadbuje się dalsze wyrazy ciągu, co zmjsza dokładność Tak więc często otrzymujemy wyniki: ^=6 itp
Obliczenia numeryczne Oblicza pierwiastka kwadratowego - algorytm: Oblicza pierwiastka kwadratowego: Jak obliczyć pierwiastek z x? Metoda Newtona: y+ x y= y x- liczba pierwiastkowana y - wynik pierwiastkowania Program pierwiastek kwadratowy; x,y: i : koc rzeczywista; całkowita; pisz( podaj x); y := 1; dla i:=0 do i:= 0 y:=(y+x/y)/; pisz ( pierwiastek z, x, =, y)