Algoritmy BI-PA1 Programování a Algoritmizace I. Ladislav Vagner Katedra teoretické informatiky Fakulta informačních technologíı ČVUT v Praze xvagner@fit.cvut.cz 3. října 2016 a 4. října 2016
Kontakt místnost A 1233, KTI FIT, e-mail: xvagner@fit.cvut.cz, agenda: prosemináře, Progtest. L. Vagner, ČVUT FIT Algoritmy, BI-PA1 2/35
Programovací jazyky a styly Imperativní (procedurální) programování: Pascal, strojový kód,... Funkcionální programování: Haskell, Lisp,... Logické (deklarativní) programování: Prolog, SQL, XSLT,... OO programování: Eiffel, Objective C, Smalltalk,... L. Vagner, ČVUT FIT Algoritmy, BI-PA1 3/35
Programovací jazyky a styly Imperativní (procedurální) programování: Pascal, strojový kód,... Funkcionální programování: Haskell, Lisp,... Logické (deklarativní) programování: Prolog, SQL, XSLT,... OO programování: Eiffel, Objective C, Smalltalk,... Kam patří Java, C++, a C? L. Vagner, ČVUT FIT Algoritmy, BI-PA1 3/35
Algoritmy Vlastnosti algoritmu: Hromadnost (univerzálnost). Jednoznačnost (determinismus). Poskytuje výsledky (resultativnost). Konečnost. Vstupy. Výstupy. Složitost. Zápis algoritmu: textová podoba (pseudokód, programovací jazyk), grafická podoba (vývojový diagram flow chart). L. Vagner, ČVUT FIT Algoritmy, BI-PA1 4/35
Algoritmy Základní elementy při zápisu algoritmu: vstupní bod, koncový bod, větvení, příkaz. Odvozené: smyčky (= větvení + návrat), I/O operace (= speciální typ příkazu), vyvolání jiného algoritmu (= speciální typ příkazu). L. Vagner, ČVUT FIT Algoritmy, BI-PA1 5/35
Algoritmy vývojové diagramy Elementy vývojového diagramu: Vstupní bod Koncový bod Podmínka (větvení) Příkaz I/O operace L. Vagner, ČVUT FIT Algoritmy, BI-PA1 6/35
Algoritmy vývojové diagramy Příklad: algoritmus načte dvě čísla a zobrazí větší z nich. READ A,B + - A > B WRITE A WRITE B END L. Vagner, ČVUT FIT Algoritmy, BI-PA1 7/35
Algoritmy pseudokód Příklad: algoritmus načte dvě čísla a zobrazí větší z nich. ČTI A, B POKUD A > B ZOBRAZ A JINAK ZOBRAZ B L. Vagner, ČVUT FIT Algoritmy, BI-PA1 8/35
Algoritmy kvadratická rovnice Úkol: vymyslet a zapsat algoritmus, který dokáže vyřešit zadanou kvadratickou rovnici. L. Vagner, ČVUT FIT Algoritmy, BI-PA1 9/35
Algoritmy kvadratická rovnice ČTI a, b, c d := b * b - 4 * a * c x1 := (-b + sqrt ( d )) / 2 / a x2 := (-b - sqrt ( d )) / 2 / a ZOBRAZ x1, x2 Je tento algoritmus správný? L. Vagner, ČVUT FIT Algoritmy, BI-PA1 10/35
Algoritmy kvadratická rovnice ČTI a, b, c d := b * b - 4 * a * c x1 := (-b + sqrt ( d )) / 2 / a x2 := (-b - sqrt ( d )) / 2 / a ZOBRAZ x1, x2 Je tento algoritmus správný? Co se stane pro a = 0? L. Vagner, ČVUT FIT Algoritmy, BI-PA1 10/35
Algoritmy kvadratická rovnice ČTI a, b, c d := b * b - 4 * a * c x1 := (-b + sqrt ( d )) / 2 / a x2 := (-b - sqrt ( d )) / 2 / a ZOBRAZ x1, x2 Je tento algoritmus správný? Co se stane pro a = 0? Co se stane pro d < 0? L. Vagner, ČVUT FIT Algoritmy, BI-PA1 10/35
Algoritmy kvadratická rovnice ČTI a, b, c POKUD a = 0 ZOBRAZ "Neni kvadraticka rovnice" d := b * b - 4 * a * c POKUD d < 0 ZOBRAZ "Neexistuje realne reseni" x1 := (-b + sqrt ( d )) / 2 / a x2 := (-b - sqrt ( d )) / 2 / a ZOBRAZ x1, x2 L. Vagner, ČVUT FIT Algoritmy, BI-PA1 11/35
Algoritmy protiletecká obrana Úkol: algoritmus pro řízení obranné rakety určí správné nastavení náměru α d tak, aby raketa sestřelila nepřátelskou střelu. Víme, že obranná střela letí rychlostí v d a odpáĺıme ji se zpožděním t 0. Nepřátelskou střelu musíme zasáhnout ve vzestupné fázi letu. Pokud to nelze splnit, algoritmus na to musí upozornit. Z radaru o nepřátelské střele víme: vzdálenost místa odpálení l, rozdíl nadmořských výšek h, náměr nepřátelské střely α e a rychlost nepřátelské střely v e. v d v e α e α d h L. Vagner, ČVUT FIT Algoritmy, BI-PA1 12/35 l
Algoritmy protiletecká obrana Z fyzikálního popisu dráhy střel získáme následující rovnice: x e = l v e t cos α e y e = h + v e t sin α e gt2 2 x d = v d (t t 0 ) cos α d y d = v d (t t 0 ) sin α d g(t t 0) 2 2 V okamžiku střetu t x platí, že x e = x d a y e = y d : t x = l + t 0 v d cos α d v e cos α e + v d cos α d = 2t 0 v d sin α d + 2h + gt 2 0 2v d sin α d + 2gt 0 2v e sin α e L. Vagner, ČVUT FIT Algoritmy, BI-PA1 13/35
Algoritmy protiletecká obrana Po úpravách vyjde: Kde: α d1 = 2 arctan B + A 2 + B 2 C 2 A C α d2 = 2 arctan B A 2 + B 2 C 2 A C A = gt 2 0v d 2t 0 v d v e sin α e 2hv d B = 2lv d 2t 0 v d v e cos α e C = 2lgt 0 2lv e sin α e 2hv e cos α e gt 2 0v e cos α e L. Vagner, ČVUT FIT Algoritmy, BI-PA1 14/35
Algoritmy protiletecká obrana Derivací určíme, že nepřátelská střela dosáhne vrcholu stoupání v čase: t max = v e sin α e g Pro vypočtené hodnoty úhlu α d musíme vypočítat okamžik střetu: t x1 = t x2 = l + t 0 v d cos α d1 v e cos α e + v d cos α d1 l + t 0 v d cos α d2 v e cos α e + v d cos α d2 Střelu lze sestřelit pouze s nastavením, pro které je t x t max. L. Vagner, ČVUT FIT Algoritmy, BI-PA1 15/35
Algoritmy protiletecká obrana ČTI l, h, t0, ve, vd, ae tmax := ve * sin(ae) / g A := g*t0*t0*vd - 2*t0*vd*ve*sin(ae) - 2*h*vd B := 2*l*vd - 2*t0*vd*ve*cos(ae) C := 2*l*g*t0-2*l*ve*sin(ae) - 2*h*ve*cos(ae) - g*t0*t0*ve*cos(ae) D := A*A + B*B - C*C POKUD D < 0 ZOBRAZ "Nelze zasahnout" tmax := ve * sin(ae) / g ad1 := 2*atan2( A-C, B + sqrt(d) ) tx1 := (l + t0*vd*cos(ad1)) / (ve*cos(ae) + vd*cos(ad1)) POKUD tx1 <= tmax ZOBRAZ "Namer ", ad1 ad2 := 2*atan2( A-C, B - sqrt(d) ) tx2 := (l + t0*vd*cos(ad2)) / (ve*cos(ae) + vd*cos(ad2)) POKUD tx2 <= tmax ZOBRAZ "Namer ", ad2 ZOBRAZ "Nelze zasahnout" L. Vagner, ČVUT FIT Algoritmy, BI-PA1 16/35
Algoritmy minimum, maximum a prostřední číslo Úkol: pro tři zadaná čísla a, b a c (navzájem různá) určit maximum, minimum a prostřední číslo. L. Vagner, ČVUT FIT Algoritmy, BI-PA1 17/35
Algoritmy minimum, maximum a prostřední číslo ČTI a, b, c POKUD a > b POKUD a > c max := a POKUD b > c mid := b min := c JINAK mid := c min := b JINAK max := c mid := a min := b JINAK POKUD b > c max := b POKUD a > c mid := a min := c JINAK mid := c min := a JINAK max := c mid := b min := a ZOBRAZ "Maximum", max ZOBRAZ "Prostredni", mid ZOBRAZ "Minimum", min L. Vagner, ČVUT FIT Algoritmy, BI-PA1 18/35
Algoritmy minimum, maximum a prostřední číslo ČTI a, b, c max := a POKUD b > max max := b POKUD c > max max := c min := a POKUD b < min min := b POKUD c < min min := c mid := a + b + c - min - max ZOBRAZ "Maximum", max ZOBRAZ "Prostredni", mid ZOBRAZ "Minimum", min L. Vagner, ČVUT FIT Algoritmy, BI-PA1 19/35
Algoritmy společný dělitel a násobek Úkol: zapsat algoritmus, který pro zadaná přirozená čísla a a b určí jejich největší společný dělitel a nejmenší společný násobek. L. Vagner, ČVUT FIT Algoritmy, BI-PA1 20/35
Algoritmy společný dělitel a násobek ČTI a, b prod := a * b DOKUD a <> b POKUD a > b a := a - b JINAK b := b - a gcd := a lcm := prod / gcd ZOBRAZ "Nejvetsi spolecny delitel", gcd ZOBRAZ "Nejmensi spolecny nasobek", lcm Je tento algoritmus efektivní? L. Vagner, ČVUT FIT Algoritmy, BI-PA1 21/35
Algoritmy společný dělitel a násobek ČTI a, b prod := a * b DOKUD a <> b POKUD a > b a := a - b JINAK b := b - a gcd := a lcm := prod / gcd ZOBRAZ "Nejvetsi spolecny delitel", gcd ZOBRAZ "Nejmensi spolecny nasobek", lcm Je tento algoritmus efektivní? Pro 60 a 36. L. Vagner, ČVUT FIT Algoritmy, BI-PA1 21/35
Algoritmy společný dělitel a násobek ČTI a, b prod := a * b DOKUD a <> b POKUD a > b a := a - b JINAK b := b - a gcd := a lcm := prod / gcd ZOBRAZ "Nejvetsi spolecny delitel", gcd ZOBRAZ "Nejmensi spolecny nasobek", lcm Je tento algoritmus efektivní? Pro 60 a 36. Pro 1001 a 1. L. Vagner, ČVUT FIT Algoritmy, BI-PA1 21/35
Algoritmy společný dělitel a násobek ČTI a, b prod := a * b POKUD a < b tmp := a a := b b := tmp DOKUD b > 0 tmp := a mod b a := b b := tmp gcd := a lcm := prod / gcd ZOBRAZ "Nejvetsi spolecny delitel", gcd ZOBRAZ "Nejmensi spolecny nasobek", lcm L. Vagner, ČVUT FIT Algoritmy, BI-PA1 22/35
Algoritmy maximum v posloupnosti Úkol: zapsat algoritmus, který pro zadanou posloupnost n navzájem různých celých čísel najde maximum. L. Vagner, ČVUT FIT Algoritmy, BI-PA1 23/35
Algoritmy maximum v posloupnosti ČTI n max := 0 DOKUD n > 0 ČTI x POKUD x > max max := x n := n - 1 ZOBRAZ "Maximum", max Je algoritmus správný? L. Vagner, ČVUT FIT Algoritmy, BI-PA1 24/35
Algoritmy maximum v posloupnosti ČTI n max := 0 DOKUD n > 0 ČTI x POKUD x > max max := x n := n - 1 ZOBRAZ "Maximum", max Je algoritmus správný? Ne pro n = 3 a vstup: -1, -2, -3. L. Vagner, ČVUT FIT Algoritmy, BI-PA1 24/35
Algoritmy maximum v posloupnosti ČTI n POKUD n <= 0 ZOBRAZ "Chyba..." ČTI max n := n - 1 DOKUD n > 0 ČTI x POKUD x > max max := x n := n - 1 ZOBRAZ "Maximum", max L. Vagner, ČVUT FIT Algoritmy, BI-PA1 25/35
Algoritmy druhé největší číslo Úkol: zapsat algoritmus, který pro zadanou posloupnost n navzájem různých celých čísel najde druhé největší číslo. L. Vagner, ČVUT FIT Algoritmy, BI-PA1 26/35
Algoritmy druhé největší číslo ČTI n POKUD n < 2 ZOBRAZ "Chyba..." ČTI m1, m2 POKUD m1 < m2 tmp := m1 m1 := m2 m2 := tmp n := n - 2 DOKUD n > 0 ČTI x POKUD x > m1 m2 := m1 m1 := x n := n - 1 ZOBRAZ "Druhe maximum", m2 Je algoritmus správný? L. Vagner, ČVUT FIT Algoritmy, BI-PA1 27/35
Algoritmy druhé největší číslo ČTI n POKUD n < 2 ZOBRAZ "Chyba..." ČTI m1, m2 POKUD m1 < m2 tmp := m1 m1 := m2 m2 := tmp n := n - 2 DOKUD n > 0 ČTI x POKUD x > m1 m2 := m1 m1 := x n := n - 1 ZOBRAZ "Druhe maximum", m2 Je algoritmus správný? Ne pro n = 3 a vstup: 1, 3, 2. L. Vagner, ČVUT FIT Algoritmy, BI-PA1 27/35
Algoritmy druhé největší číslo ČTI n POKUD n < 2 ZOBRAZ "Chyba..." ČTI m1, m2 POKUD m1 < m2 tmp := m1 m1 := m2 m2 := tmp n := n - 2 Je algoritmus správný? DOKUD n > 0 ČTI x POKUD x > m1 m2 := m1 m1 := x JINAK POKUD x > m2 m2 := x n := n - 1 ZOBRAZ "Druhe maximum", m2 L. Vagner, ČVUT FIT Algoritmy, BI-PA1 28/35
Algoritmy druhé největší číslo ČTI n POKUD n < 2 ZOBRAZ "Chyba..." ČTI m1, m2 POKUD m1 < m2 tmp := m1 m1 := m2 m2 := tmp n := n - 2 Je algoritmus správný? Ano. DOKUD n > 0 ČTI x POKUD x > m1 m2 := m1 m1 := x JINAK POKUD x > m2 m2 := x n := n - 1 ZOBRAZ "Druhe maximum", m2 L. Vagner, ČVUT FIT Algoritmy, BI-PA1 28/35
Algoritmy faktorizace Úkol: zapsat algoritmus, který pro zadané přirozené číslo n určí jeho prvočíselný rozklad (faktorizaci). Např. pro n = 720 je faktorizace: 720 = 5 2 2 2 2 3 3 L. Vagner, ČVUT FIT Algoritmy, BI-PA1 29/35
Algoritmy faktorizace ČTI n i := 2 DOKUD i < n POKUD n mod i = 0 ZOBRAZ i i := i + 1 Je algoritmus správně? L. Vagner, ČVUT FIT Algoritmy, BI-PA1 30/35
Algoritmy faktorizace ČTI n i := 2 DOKUD i < n POKUD n mod i = 0 ZOBRAZ i i := i + 1 Je algoritmus správně? Ne, zobrazí všechny dělitele, ne pouze prvočísla. L. Vagner, ČVUT FIT Algoritmy, BI-PA1 30/35
Algoritmy faktorizace ČTI n i := 2 DOKUD i < n POKUD n mod i = 0 POKUD isprime ( i ) ZOBRAZ i i := i + 1 Je algoritmus správně? L. Vagner, ČVUT FIT Algoritmy, BI-PA1 31/35
Algoritmy faktorizace ČTI n i := 2 DOKUD i < n POKUD n mod i = 0 POKUD isprime ( i ) ZOBRAZ i i := i + 1 Je algoritmus správně? Ne, zobrazí prvočíselné faktory, ale pouze jednou. L. Vagner, ČVUT FIT Algoritmy, BI-PA1 31/35
Algoritmy faktorizace ČTI n i := 2 DOKUD i <= n POKUD n mod i = 0 POKUD isprime ( i ) ZOBRAZ i n := n / i JINAK i := i + 1 Je algoritmus správně? L. Vagner, ČVUT FIT Algoritmy, BI-PA1 32/35
Algoritmy faktorizace ČTI n i := 2 DOKUD i <= n POKUD n mod i = 0 POKUD isprime ( i ) ZOBRAZ i n := n / i JINAK i := i + 1 Je algoritmus správně? Ano, pouze pro n = 1 nezobrazí nic. L. Vagner, ČVUT FIT Algoritmy, BI-PA1 32/35
Algoritmy faktorizace ČTI n i := 2 DOKUD i <= n POKUD n mod i = 0 POKUD isprime ( i ) ZOBRAZ i n := n / i JINAK i := i + 1 Je algoritmus správně? Ano, pouze pro n = 1 nezobrazí nic. Je velmi neefektivní. L. Vagner, ČVUT FIT Algoritmy, BI-PA1 32/35
Algoritmy faktorizace ČTI n i := 2 DOKUD i <= n POKUD n mod i = 0 ZOBRAZ i n := n / i JINAK i := i + 1 Je algoritmus správně? L. Vagner, ČVUT FIT Algoritmy, BI-PA1 33/35
Algoritmy faktorizace ČTI n i := 2 DOKUD i <= n POKUD n mod i = 0 ZOBRAZ i n := n / i JINAK i := i + 1 Je algoritmus správně? Ano, pouze pro n = 1 nezobrazí nic. L. Vagner, ČVUT FIT Algoritmy, BI-PA1 33/35
Algoritmy faktorizace ČTI n i := 2 DOKUD i <= n POKUD n mod i = 0 ZOBRAZ i n := n / i JINAK i := i + 1 Je algoritmus správně? Ano, pouze pro n = 1 nezobrazí nic. Je stále neefektivní. L. Vagner, ČVUT FIT Algoritmy, BI-PA1 33/35
Algoritmy faktorizace ČTI n factorize ( n ) factorize ( n ): i := sqrt ( n ) DOKUD i >= 2 POKUD n mod i = 0 factorize ( i ) factorize ( n / i ) i := i - 1 ZOBRAZ n L. Vagner, ČVUT FIT Algoritmy, BI-PA1 34/35
Dotazy Dotazy... Děkuji za pozornost. L. Vagner, ČVUT FIT Algoritmy, BI-PA1 35/35