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

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

Úvod do programování 7. hodina

Podobné prezentace


Prezentace na téma: "Úvod do programování 7. hodina"— Transkript prezentace:

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

2 Úvod do programování 7. hodina
Umíme z minulé hodiny Syntax Znaky Textové řetězce Algoritmy Lexikografické uspořádání Zřetězení, podřetězec Hledání indexu výskytu znaku, řetězce Vymazání, vložení a nahrazení znaku, řetězce Změna hodnoty znaku na pozici dané indexem Naše vlastní řetězce Vlastní implementace řetězcových algoritmů jsou výborné na procvičení schopností práce s polem Jan Lánský Úvod do programování 7. hodina

3 Úvod do programování 7. hodina
Cíle hodiny Algoritmy Hornerovo schéma Převod mezi číselnými soustavami Dlouhá celá čísla (reprezentace) Součet, rozdíl, součin, podíl Dlouhá reálná čísla (reprezentace) Zlomky (reprezentace) Syntax Konstanty Jan Lánský Úvod do programování 7. hodina

4 Hornerovo schéma - Motivace
Vyhodnocení polynomu pro zadané x – 2x4 +7x3 – 5x2 – 6x + 7 – 2*x*x*x*x + 7*x*x*x – 5*x*x – 6*x + 7 10 násobení, obecně n2 (((– 2*x+7)*x –5)*x –6)*x+7 4 násobení, obecně n Využití: převod čísla z jedné číselné soustavy do druhé Jan Lánský Úvod do programování 7. hodina

5 Hornerovo schéma - Formálně
Polynom: a0 + a1x + … + anxn vyhodnotíme pro zadané x0 bn = an bn-1 = bn*x0+an-1 Výsledek b0 Převod čísla Np (= koeficienty polynomu ai ) zapsaného v číselné soustavě o základu p (=x0) na číslo Nq (=b0) zapsané v číselné soustavě o základu q (v této soustavě vyhodnocujeme aritmetické operace) V praxi se nejčastěji používá pro převod čísel zapsaných v soustavách o základech 2, 8, 16 na čísla zapsaná v soustavácho základu 10 Koeficienty polynomu = číslice Jan Lánský Úvod do programování 7. hodina

6 Příklady: převody čísel do desítkové soustavy
= 8910 (((((1*2+0)*2+1)*2+1)*2+0)*2+0)*2+1 = (((4*8+1)*8+6)*8+7)*8+2 B1D616 = ((11*16+1)*16+13)*16+6 Jan Lánský Úvod do programování 7. hodina

7 Převod řetězce na číslo
Aplikace Hornerova schématu: v řetězci jsou přirozeným způsobem uloženy jednotlivé cifry (= koeficienty polynomu) Převod znaku na číslici. Číslice jsou uspořádány za sebou Obdoba funkce Convert.ToInt32 Jan Lánský Úvod do programování 7. hodina

8 Převod mezi číselnými soustavami
Obecně lze Hornerovo schéma použít na převod mezi libovolnými dvěmi číselnými soustavami, např. 8  11 V praxi se používá na převod z jiné číselné soustavy do desítkové, např. 2  10 Z desítkové do jiné číselné soustavy se používá reverzní postup: Metoda dělení základem. Převod z obecné číselné soustavy do jiné se provádí s mezikrokem desítkovou soustavou (např. 8  10  11) V desítkové soustavě se nám dobře provádí aritmetické operace Jan Lánský Úvod do programování 7. hodina

9 Metoda dělení základem
Reverzní k Hornerově schématu Převod čísla N10 v desítkové soustavě na číslo Nq v soustavě q Operace v desítkové soustavě jdou snadno Postupně číslo N10 celočíselně dělíme q a zapisujeme zbytky po celočíselném dělení. První zbytek je nejméně významná číslice, poslední zbytek je nejvýznamnější číslice. Jan Lánský Úvod do programování 7. hodina

10 Příklady: převody čísel z desítkové soustavy
1310 = 11012 13 = 6 * 2 + 1 6 = 3 * 2 + 0 3 = 1 * 2 + 1 = 2A23B16 = * 10787 = 674 *16 + 3 674 = 42 * 42 = 2 * Jan Lánský Úvod do programování 7. hodina

11 Převod z desítkové soustavy do šestnáctkové I.
Pomocné pole na jednotlivé cifry. Pro jistotu je zbytečné dlouhé, reálně by stačilo 20 Dokud má 16-kový zápis alespoň dvě cifry Dělíme základem soustavy Je nutné převést na 0…9A…F Aktuální cifra, zbytek po dělení Poslední cifra, co zbylo z původního čísla Jan Lánský Úvod do programování 7. hodina

12 Převod z desítkové soustavy do šestnáctkové II.
Pole nutno obrátit. Cifry jsme zapisovali od nejméně významné, potřebujeme je mít od nejvíce významné Jen do půlky pole Měníme prvek od začátku pole se stejně umístěným prvkem od konce pole Vytvoříme řetězec z prvků pole od 0 do počtu cifer. 0 až 9 cifry A až F písmena Využíváme uspořádání za sebou Jan Lánský Úvod do programování 7. hodina

13 Dlouhá celá čísla - Motivace
Vestavěné datové typy umějí počítat s maximální přesností 30 míst (decimal) Kombinatorika: 49! = 6.08e62 Nezachytíme přesně všechny cifry Jiná než dekadická čísla (šestnáctková) Řešení Vlastní datový typ pro práci s dlouhými čísly Operace + - * / Jan Lánský Úvod do programování 7. hodina

14 Dlouhá čísla reprezentace
Použijeme int - je to plýtvání pamětí, ale nejsou třeba přetypování při implementaci Pole cifer datového typu int (případně byte, char, int) 1 prvek pole = 1 cifra nebo více cifer První prvek pole Nejvíce významná cifra Nejméně významná cifra Délka pole Přesně podle počtu cifer Větší, dané konstantou Nejsnazší 1 cifra Big Endian Little Endian Musíme spočítat počet cifer výsledku operace, zbytečně moc náročné Spousta nul navíc, hrozí přetečení. Ale nejsnazší implementace. Lze si pamatovat počet cifer, aby se pro nuly neprováděly operace Jan Lánský Úvod do programování 7. hodina

15 Dlouhá čísla reprezentace
Číslo reprezentováno na 10 cifer Budeme používat na cvičení Big endian – nejvíce významný bit na začátku pole 1 7 2 Little endian – nejméně významný bit na začátku pole Čteme odzadu Budeme používat na přednášce 1 2 7 Jan Lánský Úvod do programování 7. hodina

16 Konstanta Proměnná, která je při deklaraci inicializována hodnotou, která se nemůže změnit. Obvykle má smysl být globální Př.: délka pole pro práci s celými čísly Globální konstanta maxDel Globální konstanty nemají static Jan Lánský Úvod do programování 7. hodina

17 Úvod do programování 7. hodina
Dlouhá čísla - Operace Vytvoření (z řetězce) a výpis (obrazovka) Porovnání – Compare 0, -1, 1 Sčítání Odečítání - menšího čísla od většího Násobení Celočíselné dělení: Vyžaduje Odečítání, Porovnání a PravýPosun PravýPosun: vynásobení mocninou desítky Implementace: podobná jako školní algoritmus "ruční počítání pod sebe" Jan Lánský Úvod do programování 7. hodina

18 Dlouhá čísla: Vytvoření a výpis
Little endian Načítáme cifry odzadu Little endian Vypisujeme cifry odzadu Úvodní nuly skončily Přeskočíme úvodní nuly Jan Lánský Úvod do programování 7. hodina

19 Dlouhá čísla - součet Od nejméně významné cifry po nejvíce významnou cifru Sečteme cifry a přenos z nižšího řádu prenos nabývá hodnot 0 a 1 Z hodnot 0 až 19 uděláme 0 až 9 Jan Lánský Úvod do programování 7. hodina

20 Dlouhá čísla - součet 8 4 6 7 3 1 2 9 5 6 + 2 + 0 = 8 5 + 9 + 0 = 14
= 6 = 7 = 13 = 10 = 10 = = 1 = 0 8 4 6 7 3 1 2 9 5 x+ y = y = x = i Červená došlo k přenosu Zelená bez přenosu Oranžová – úvodní nuly Jan Lánský Úvod do programování 7. hodina

21 Dlouhá čísla - rozdíl Musí platit x>=y
Od nejméně významné cifry po nejvíce významnou cifru Odečteme cifry a započteme případný přenos z nižšího řádu (0, -1) Podtečení: přenos do vyššího řádu a normalizace hodnoty -10 až 9 na 0 až 9 Jan Lánský Úvod do programování 7. hodina

22 Dlouhá čísla - rozdíl 4 6 9 2 5 7 1 3 8 6 - 2 + 0 = 4 5 - 9 + 0 = - 4
= - 6 = 6 = -1 = 0 = 9 = 0 = 0 4 6 9 2 5 7 1 3 8 x - y = y = x = i Červená došlo k přenosu Zelená bez přenosu Oranžová – úvodní nuly Jan Lánský Úvod do programování 7. hodina

23 Dlouhá čísla - součin Školní algoritmus násobí cifrou celé číslo a tyto součiny sčítá. Náš postup je ekvivalentní Vynásobíme každou cifru x s každou cifrou y Pokud není podmínka splněna, jedná se o cifry oblasti přetečení. Neřešíme Jednotlivé součiny sečteme Normalizujeme cifry výsledku do 0 až 10 pomocí přenosu do vyššího řádu. Vzhledem k volbě datového typu int, funkční i pro čísla o 20 mil. cifrách Jan Lánský Úvod do programování 7. hodina

24 Úvod do programování 7. hodina
Dlouhá čísla - součin Oranžová – úvodní nuly zelená – bez přenosu červená - přenos 4 7 9 14 46 33 6 12 42 21 2 3 1 vys[i] vys[i+j] 2 * 2 = 4 2 * 6 = 12 2 * 3 = 6 14+0 = 4 + 1*10 = 7 + 4*10 =7+3*10 0+6+3=9+0*10 0+0+0 = 0+0*10 j = 1 j = 0 7 * 2 = 14 7 * 6 = 42 7 * 3 = 21 y = 27 x = 362 i 362 * 27 = 9774 Jan Lánský Úvod do programování 7. hodina

25 Dlouhá čísla: pravý posun a porovnání
Posuneme doprava cifry na významnější řády. Pro little endiany je to ekvivalent vynásobení mocninou desítky Prvky nejvíce napravo se zahodí. Předpokládáme, že mají hodnotu nula Potřeba pro děleni Analogicky jako lexikografické uspořádání 0 rovnost, -1 první je menší, +1 první je větší Jan Lánský Úvod do programování 7. hodina

26 Dlouhá čísla – pravý posun
Posun o 2 6 5 7 1 2 3 4 8 9 vys = x = 67056 i Červená – vložené nuly Zelená - posun Oranžová – úvodní nuly Jan Lánský Úvod do programování 7. hodina

27 Dlouhá čísla – podíl I. Výpočet posunu
Procházíme úvodní nuly na nejvyšších pozicích y, končíme když narazíme na první nenulový prvek. Sledujeme, zda x má příslušných nejvyšších pozicích také úvodní nuly. Pokud x už úvodní nuly nemá, zvyšuje posun. Potřebujeme spočítat kolik řádů rozdílu je mezi x a y. Sledujeme o kolik má y více úvodních nul na nejvyšších pozicích než x. Jan Lánský Úvod do programování 7. hodina

28 Dlouhá čísla – podíl I. Výpočet posunu
= 0 = 9 = 0 = 0 x 2 1 9 5 7 4 6 3 8 posun y = x = i Červená došlo ke zvýšení Zelená konec cyklu Žlutá nedošlo ke zvýšení Oranžová – úvodní nuly Jan Lánský Úvod do programování 7. hodina

29 Dlouhá čísla – podíl II. Iterativní odečítání
Dokud y nemá více cifer než x. Posuneme y o daný počet míst doprava (Vynásobíme y mocninou desítky) Dokud je x větší než posunuté y, od x odečítáme posunuté y Za každé odečtení zvýšíme hodnotu cifry na příslušném řádu výsledku. Čím byl nutný vyšší posun, tím vyšší řád V další iteraci budeme y posouvat o jedno místo méně. Jan Lánský Úvod do programování 7. hodina

30 Dlouhá čísla – podíl I. Iterativní odečítání
Vnitřní cyklus končí, od x už nejde y odečíst. Dojde ke snížení posunu (z 2 na 1) a proběhne další iterace vnějšího cyklu Výsledek: vys[2] = 2 6 5 8 4 7 2 9 1 3 2. krok 1. krok y = x = i Žlutá – nová hodnota x Zelená – nuly z posunu Oranžová – úvodní nuly Jan Lánský Úvod do programování 7. hodina

31 Dlouhá čísla - ukázka Cca 40 cifer, nešlo by přesně v žádném vestavěném datovém typu Pro testování správnosti funkcí webová aplikace Wolfram alfa Jan Lánský Úvod do programování 7. hodina

32 Reprezentace dlouhých reálných čísel
Postupy pro operace podobné jako u celých čísel Struktura Znaménko, pole cifer, a exponent Přetečení nejvyššího řádu – zvýšení exponentu a posun cifer doleva Doposud jsme ignorovali Podtečení nejvyššího řádu – snížení exponentu a posun cifer doprava Doposud nemohlo nastat Implementace na cvičení Jan Lánský Úvod do programování 7. hodina

33 Dlouhá reálná čísla – ukázka reprezentace
5 6 8 7 -52 + 2 9 4 - -3 785605e-55 256.2e5 Cifry little endian Exponent znaménko Jan Lánský Úvod do programování 7. hodina

34 Reprezentace (dlouhých) zlomků
Umožňuje udržovat racionální čísla v nezaokrouhleném stavu. Struktura Znaménko, čitatel a jmenovatel reprezentované pomocí (dlouhého) celého čísla Operace + - * / Postupy jako při ručním počítání Na konci jednotlivých operacích pomocí Euklidova algoritmu převést zlomek na základní tvar. Implementace na cvičení Jan Lánský Úvod do programování 7. hodina

35 Úvod do programování 7. hodina
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 Jan Lánský Úvod do programování 7. hodina


Stáhnout ppt "Úvod do programování 7. hodina"

Podobné prezentace


Reklamy Google