Prezentace se nahrává, počkejte prosím

Prezentace se nahrává, počkejte prosím

Úvod do programování 2. hodina RNDr. Jan Lánský, Ph.D. Katedra informatiky a matematiky Fakulta ekonomických studií Vysoká škola finanční a správní 2015.

Podobné prezentace


Prezentace na téma: "Úvod do programování 2. hodina RNDr. Jan Lánský, Ph.D. Katedra informatiky a matematiky Fakulta ekonomických studií Vysoká škola finanční a správní 2015."— Transkript prezentace:

1 Úvod do programování 2. hodina RNDr. Jan Lánský, Ph.D. Katedra informatiky a matematiky Fakulta ekonomických studií Vysoká škola finanční a správní 2015

2 Jan LánskýÚvod do programování 2. hodina2 Umíme z minulé hodiny Obecné informace o předmětu Ukázka: postup řešení problému v přirozeném jazyce a jeho převod do C# Instalace C#, vytvoření projektu, spuštění programu Syntax C# Proměnné Přiřazení, aritmetické operátory (zbytek po celočíselném dělení), výpis na obrazovku Porovnací operátory, podmíněný příkaz (se zápornou větví, vnořený)

3 Jan LánskýÚvod do programování 2. hodina3 Cíle hodiny Syntax Složený příkaz Logické operátory Čtení vstupu z klávesnice Cykly while a for (continue, break), vnořené cykly Algoritmy Prohození hodnot dvou proměnných Ciferný součet, Euklidův algoritmus Prvočíselný rozklad, test prvočíselnosti Základy časové složitosti algoritmů V C# existuje cyklus foreach, ten nebudeme probírat. Mnoho jiných jazyků nemá ekvivalent

4 Jan LánskýÚvod do programování 2. hodina4 Prohození hodnot dvou proměnných V x bude hodnota, která byla původně v y. V y bude hodnota, která byla původně v x. Nejde prohodit atomicky Pomocná proměnná tmp, která uchovává hodnotu x x = 5 y = 3 tmp =3

5 Jan LánskýÚvod do programování 2. hodina5 Podmíněné prohození hodnot dvou proměnných Chceme, aby y>=x Je-li x < y, prohodíme hodnoty x a y Je-li y>=x nebudeme nic prohazovat Prohození (minulý slajd) 3 příkazy Nutný opakovaný test x<y resp. tmp <y x = 5 y = 3 tmp =3 Nejde x<y, protože x má novou hodnotu Musí se vykonat vždy kvůli tmp <y Náročné, jde snadněji ?

6 Jan LánskýÚvod do programování 2. hodina6 Složený příkaz Blok po sobě následujících příkazů, který je považován za jeden příkaz Příkazy uzavřeny ve složených závorkách { (alt + 123), } (alt + 125) Využití V podmíněném příkazu (nebo v cyklu) Ve vnořeném podmíněném příkazu Místo jednoho příkazu se vykoná složený příkaz obsahující několik příkazů

7 Jan LánskýÚvod do programování 2. hodina7 Podmíněné prohození hodnot pomocí složeného příkazu Chceme, aby x >= y Je-li x < y, prohodíme hodnoty x a y Je-li x >= y nebudeme nic prohazovat Jedna podmínka x < y následovaná složeným příkazem provádějícím prohození x = 5 y = 3 tmp =3 začátek konec

8 Jan LánskýÚvod do programování 2. hodina8 Dvojitě zanořený podmíněný příkaz – vynechání else větve Chyba: else patří k vnitřnímu if Správně: složeným příkazem jsme určili, že vnitřní if nemá else

9 Jan LánskýÚvod do programování 2. hodina9 Logické operátory operandy typu bool nejčastěji výsledek porovnávacích operátorů. && Logické AND (alt + 38) || logické OR (alt + 124) Infixní binární operátory Levý operand [logický operátor] pravý operand ! Logická negace Unární prefixní operátor (! operand) Využítí V podmíněném příkazu (a v cyklu)

10 Jan LánskýÚvod do programování 2. hodina10 Interval Syntaktická chyba První porovnání: 0 < a vrací bool Druhé porovnání: nekompatibilní operandy Porovnávací operátory se vykonají dříve než logické operátory, závorky nejsou nutné, ale nevadí pokud je chceme psát

11 Jan LánskýÚvod do programování 2. hodina11 Logické operátory

12 Jan LánskýÚvod do programování 2. hodina12 XOR na 3 způsoby funkce XOR = eXclusive OR true pro 01 nebo 10 (různé) false pro 00 a 11 (shodné) Jde to i jednodušeji Závorky navíc nevadí Pokud si nejsme jisti

13 Jan LánskýÚvod do programování 2. hodina13 Zkrácené vyhodnocování Je-li o výsledku logického výrazu rozhodnuto po vyhodnocení jeho části, zbytek výrazu se nevyhodnocuje Je-li nesplněn levý operand && nevyhodnocuje se pravý Př.: (a != 0) && (x / a > y) Je-li splněn levý operand || nevyhodnocuje se pravý Nedojde k dělení nulou

14 Jan LánskýÚvod do programování 2. hodina14 Vstup z klávesnice Pro uživatele programu příjemnější vstup z klávesnice než změna hodnota ve zdrojovém kódu a kompilace Pokud by to uživatelé vůbec zvládli … Při ladění programu vstup z klávesnice nahradit pevnými hodnotami Ruční zadávání hodnot je ztráta času

15 Jan LánskýÚvod do programování 2. hodina15 Vstup z klávesnice s = Console.Readline() Návratová hodnota řetězec string s x = Convert.ToInt32(s) Vstupní řetězec string převede na celé číslo int x x = Convert.ToInt32(Console.Readline()) Lze volat i vnořeně Není třeba pomocná proměnná

16 Jan LánskýÚvod do programování 2. hodina16 Vstup z klávesnice Uživateli oznámíme, co chceme zadat Načtení řetězce a převod na celé číslo V jednom příkazu Výsledky uložit do x a y

17 Jan LánskýÚvod do programování 2. hodina17 Cyklus while Syntax: while (podmínka) příkaz; Dokud je splněna podmínka opakuj vykonávání (složeného) příkazu Podmínka musí být v závorce a její hodnota musí být datového typu bool Srovnej: podmíněný příkaz opakuj max 1x Dopředu nevíme počet opakování Neprovede se ani jednou – Př.: while (false) Nekonečno opakování – Př.: while (true) Nekonečný cyklus  program nikdy neskončí  musíme program zabít Hlavička cyklu Tělo cyklu Existuje varianta do příkaz while () Nebudeme probírat 1. krok – Podmínka: true (krok 2), false (konec) 2. krok – Příkaz 3. krok – Přejít na krok 1

18 Jan LánskýÚvod do programování 2. hodina18 Ciferný součet Pracuje s y, kopii x, aby x se zachovalo Do cif přičteme poslední cifru čísla y Odstraníme poslední cifru čísla y

19 Jan LánskýÚvod do programování 2. hodina19 Euklidův algoritmus - princip Spočte největšího společného dělitele d dvou čísel m a n. NSD(m,n) = d d dělí m (značení d | m) pokud  k 1  Z: m = k 1 * d NSD(m,n) = Max d { d | m a zároveň d | n } Př.: NSD(490, 75) = 5 Odvození algoritmu: Pokud d | m a zároveň d | n poté d | (m – k * n), kde k  Z m = k 1 * d; n = k 2 * d; m – k * n = (k 1 * d) – k * (k 2 * d) = (k 1 – k * k 2 ) * d NSD(m,n) = NSD(m-k*n,n), kde k je celé NSD(m,n) = n, pokud n | m d | n n % d = 0 Nejstarší algoritmus na světě (300 př. n. l.) Konečnost algoritmu

20 Jan LánskýÚvod do programování 2. hodina20 Euklidův algoritmus - příklad 1. krok NSD(490, 75) 490 = 6*75 + 40 490 % 75 = 40 2. krok NSD (75, 40) 75 = 1*40 + 35 75 % 40 = 35 3. krok NSD(40, 35) 40 = 1*35 + 5 40 % 35 = 5 4. krok NSD (35, 5) 35 = 7*5 + 0 35 % 5 = 0 STOP: n | m

21 Jan LánskýÚvod do programování 2. hodina21 Euklidův algoritmus – I. část Načtení hodnot x a y z klávesnice

22 Jan LánskýÚvod do programování 2. hodina22 Euklidův algoritmus – II. část Dokud menší z čísel y není nula Počítáme zbytek po dělení většího x čísla menším y. Původní menší číslo x se stane větším a zbytek po dělení se stane menším číslem Po první iteraci cyklu platí: x > y Příklad: x = 6; y = 15; zbytek = 6 % 15 // zbytek = 6 x = y = // x = 15 y = zbytek // y = 6; Dokončíme výpis řádku s výsledkem V průběhu výpočtu se změní x a y, musíme vypsat nyní

23 Jan LánskýÚvod do programování 2. hodina23 Cyklus for for (inicializace;podmínka; inkrement) příkaz; 1. krok – Inicializace 2. krok – Podmínka true – krok 3, false konec 3. krok – Příkaz 4. krok – Inkrement 5. krok – Přejdeme na krok 2 i = 0 i < 10 Console.Write(i) i ++ Inicializace; While(Podmínka) { Příkaz; Inkrement; }

24 Jan LánskýÚvod do programování 2. hodina24 Cyklus for Syntax: for (inicializace;podmínka; inkrement) příkaz; Inicializace se provede pouze jednou na začátku cyklu Podmínka (hodnota typu bool) se testuje na začátku každé iterace cyklu. Je-li podmínka splněna iterace cyklu proběhne, je-li podmínka nesplněna cyklus končí. Inkrement se provádí na konci iterace cyklu Iterace cyklu: test podmínky, (složený) příkaz, inkrement Řídící proměnná cyklu – obvykle i, j, k, … Incializace obvykle i=0 Podmínka obvykle i < hodnota Inkrement obvykle i++ NEDĚLAT Změna řídící proměnné cyklu v těle cyklu Hlavička cyklu Tělo cyklu

25 Jan LánskýÚvod do programování 2. hodina25 Výpis čísel 0 až 9 Řídící proměnná cyklu i začne na hodnotě 0. Je-li i < 10 je splněna podmínka a vykoná se tělo cyklu V každé iteraci cyklu se hodnota i vypíše. Na konci každé iterace cyklu se hodnota i zvýší o 1 Po zvýšení hodnoty i na 10 bude podmínka nesplněna a cyklus končí. Tělo cyklu - (složený) příkaz Hlavička cyklu

26 Jan LánskýÚvod do programování 2. hodina26 break a continue break Ukončí (nejvíce zanořený) cyklus Pokračujeme zdrojovým kódem za cyklem continue Ukončí aktuální iteraci (nejvíce zanořeného) cyklu. Provede se inkrement (for cyklus) Pokračuje se další iterací cyklu

27 Jan LánskýÚvod do programování 2. hodina27 Součet pěti čísel - break Ukončení cyklu Zadané číslo nebylo kladné Lidé číslují pořadí od 1, programátoři od 0

28 Jan LánskýÚvod do programování 2. hodina28 Minimum z pěti čísel - continue Kompilátor hlásí chybu (předposlední řádek), pokud není min inicializované. Ale zbytečně. Nekonečný cyklus, pokud budu zadávat samá nekladná čísla Ukončení iterace cyklu Musel být while cyklus, ve for cyklu by se provádělo i++ vždy V první iteraci nové min vždy

29 Jan LánskýÚvod do programování 2. hodina29 Dva vnořené cykly – pyramida Přepisujeme max na jednom místě místo tří Vnější cyklus Vnitřní cyklus Ořezání pravé strany i <= max – j - 1 Ořezání levé strany i <= j Odřádkovat

30 Jan LánskýÚvod do programování 2. hodina30 Test prvočíselnosti Stačí zkoušet dělitele do odmocniny Našli jsme dělitele není prvočíslo Číslo je prvočíslem dokud neprokážeme opak Číslo menší než 2 nejsou prvočísla Prvočíslo má právě dva dělitele 1 a sebe sama. Proto 1 není prvočíslo

31 Jan LánskýÚvod do programování 2. hodina31 Rozklad na prvočísla Nalezen dělitel Jednotlivé dělitele oddělujeme *, ale ne prvního dělitele Musí být else, dělitele mohou být násobné Write(i) nepotřebuji formátovací řetězec

32 Jan LánskýÚvod do programování 2. hodina32 Základy časové složitosti algoritmů V současné době je čas běhu programu důležitější než spotřebovaná paměť. Časová složitost algoritmů se měří v počtu operací nutných ke zpracování vstupu dané délky n Asymptotická složitost algoritmů O(n), O(n log(n)), O(n 2 ), O(n 3 ). O(2 n )

33 Jan LánskýÚvod do programování 2. hodina33 Časová složitost Konstantní - O(1) zvýšení hodnoty čísla o jedna Logaritmická - O(log n) najití prvku v setříděné posloupnosti Lineární - O(n) najití prvku v nesetříděné posloupnosti Lineárnělogaritmická - O(n log(n)) setřídění posloupnosti chytře Kvadratická - O(n 2 ) setřídění posloupnosti hloupě Kubická - O(n 3 ) násobení matic (n řád matice) Exponenciální - O(2 n ) obchodní cestující

34 Jan LánskýÚvod do programování 2. hodina34 Časová složitost a cykly Cyklus procházející vstupní data  O(n) Dva vnořené cykly. V každém z cyklů projdeme celá vstupní data  O(n 2 ) Někdy cyklus proběhne výrazně méněkrát než n vydělené konstantou  složitost algoritmu nutno matematicky spočítat Obvykle to bývá log(n)

35 Jan LánskýÚvod do programování 2. hodina35 Časová složitost - přijatelná Rozdíl mezi O(n 2 ) a O(n log(n)) n = 1 000 000 000 (roky vs sekundy) Kvadratické algoritmy jsou problematická pro velká data. Rozdíl mezi O(n 4 ) a O(2 n ) n = 70 (milisekundy vs tisíce let) Exponenciální algoritmy jsou použitelná jen pro malá data

36 Jan LánskýÚvod do programování 2. hodina36 Zpětná vazba Objevili jste ve slajdech chyby? Včetně pravopisných Nechápete nějaký slajd? Je příliš obtížný, nesrozumitelný? Máte nějaký nápad na vylepšení? Anonymní formulář Odeslání za pár vteřin http://goo.gl/forms/WxkZqBsZLs


Stáhnout ppt "Úvod do programování 2. hodina RNDr. Jan Lánský, Ph.D. Katedra informatiky a matematiky Fakulta ekonomických studií Vysoká škola finanční a správní 2015."

Podobné prezentace


Reklamy Google