Jazykové konštrukcie: Výrazy Rekurzívne algoritmy

Podobné dokumenty
PODPROGRAMY. Vyčlenenie podprogramu a jeho pomenovanie robíme v deklarácii programu a aktiváciu vykonáme volaním podprogramu.

Základy algoritmizácie a programovania

Zvyškové triedy podľa modulu

Programovanie v jazyku C - ti to zratam...

Metóda vetiev a hraníc (Branch and Bound Method)

Úroveň strojového kódu procesor Intel Pentium. Adresovanie pamäte

Pascal základné pojmy

Programovanie I. Úvod do programovania Mgr. Stanislav Horal, Katedra informatiky, FPV, UCM

M úlohy (vyriešené) pre rok 2017

Prevody z pointfree tvaru na pointwise tvar

Algoritmizace a programování

Matematika Postupnosti

Riešenie cvičení z 3. kapitoly

7.1 Návrhové zobrazenie dotazu

U N I V E R Z I N S K Á I T A I L V E R E N L N T A S O

Štruktúry údajov a algoritmy

značky spájame spojnicami, šípka musí byť ak ...

8. Relácia usporiadania

VECIT 2006 Tento materiál vznikol v rámci projektu, ktorý je spolufinancovaný Európskou úniou. 1/4

Operačný systém Úvodná prednáška

Programovanie v jazyku C - pole treba poorat...

Navýšenie (brutácia) nepeňažného príjmu v programe Mzdy a personalistika

Teória grafov. Stromy a kostry 1. časť

nastavenie a realizácia vzájomných zápočtov v Money S4 / Money S5

Objektovo orientované programovanie v C# ERIK KUČERA METÓDY VÝPOČTOVEJ INTELIGENCIE PREDNÁŠKA 3

Funkcia - priradenie (predpis), ktoré každému prvku z množiny D priraďuje práve jeden prvok množiny H.

5 Přehled operátorů, příkazy, přetypování

MATLAB (1) - úvod do programovania vedeckých problémov. LS 2017, 8.predn.

Pracovné prostredie MS EXCEL 2003.

Návod na používanie súboru na vyhodnotenie testov všeobecnej pohybovej výkonnosti

ONLINE POBOČKA. pre zamestnávateľov MANUÁL

15. Príkazy vetvenia

Kompilátory. Cvičenie 4: Syntaktická analýza v ANTLR4 (1. časť) Peter Kostolányi. 7. novembra 2017

Dell S2718H/S2718HX/S2718HN/ S2718NX Dell Display Manager Návod na obsluhu

Ak stlačíme OK, prebehne výpočet a v bunke B1 je výsledok.

Pozičné číselné sústavy. Dejiny. Číselná sústava je spôsob, akým sú zapisované čísla pomocou znakov (nazývaných cifry).

rozpoznanie jednoduchého aritmetického výrazu a jeho preklad do postfixového tvaru kalkulátor pre pascalovské výrazy - prvky interpretera

Iracionálne rovnice = 14 = ±

Úvod do programovacích jazyků (Java)

UČEBNÉ ŠTÝLY U ŠTUDENTOV INFORMATIKY A PODPORNÉ A VÝUČBOVÉ ŠTÝLY

Aritmetické operácie v rôznych číselných sústavách. Ľudmila MACEKOVÁ, KEMT-FEI-TUKE, sep. 2017

RIEŠENIE NIEKTORÝCH ÚLOH LINEÁRNEJ ALGEBRY V PROSTREDÍ MS EXCEL. 1. Zadáme prvky matice A a B do buniek pracovného hárku zošita MS Excel

Štruktúra údajov pre kontajner XML údajov 1. Dátové prvky pre kontajner XML údajov

ZÁKLADY TEÓRIE GRAFOV

Technická univerzita v Košiciach

Programovanie v jazyku C - struktury a polia

Limita funkcie. Čo rozumieme pod blížiť sa? y x. 2 lim 3

Kontrola väzieb výkazu Súvaha a Výkaz ziskov a strát Príručka používateľa

Manuál na prácu s databázou zmlúv, faktúr a objednávok Mesta Martin.

ČÍSELNÉ RADY. a n (1) n=1

Autorské práva na softvér a licencie

UČEBNÉ OSNOVY do ŠkVP

Import Excel Univerzál

Pravdepodobnosť. Rozdelenia pravdepodobnosti

Programovanie v jazyku C - to chce dynamiku

MOCNINY A ODMOCNINY Eva Zummerová

Verifikácia a falzifikácia

Strojový kód, assembler, emulátor počítača

Obsah. Reprezentácia údajov v počítači. Digitalizácia číselnej informácie. Digitalizácia znakov a textovej informácie.

Výrazy a operátory. Operátory Unární - unární a unární + Např.: a +b

Matice. Matica typu m x n je tabuľka s m riadkami a n stĺpcami amn. a ij. prvok matice, i j udáva pozíciu prvku

Množiny, relácie, zobrazenia

Zápis programu v jazyce C#

je zmena operácie ktorou z nelineárneho systému môže spraviť lineárny. Týmto krokom sme získali signál ktorý môžeme spracovať pomocou LDKI sústavy.

Pracovnoprávny vzťah závislá práca

Programy vzdelávania: Vzdelávanie s interaktívnou tabuľou

Práca s výkazmi v prostredí BEx Analyzer

Operátory, výrazy. Tomáš Pitner, upravil Marek Šabo

Operátory. Základy programování 1 Tomáš Kühr

KOMBINATORICKÉ PRAVIDLO SÚČINU

JCDwin - prechod na EURO

Úplný zápis každého desiatkového čísla môžeme zapísať pomocou polynómu:

3 Determinanty. 3.1 Determinaty druhého stupňa a sústavy lineárnych rovníc

DIZAJN MANUÁL KULT MINOR LOGO MANUÁL. Fond na podporu kultúry národnostných menšín

Úvod do programování. Lekce 1

Čo ak program potrebuje pamäť, ktorej veľkosť závisí od konkrétneho vstupu?

Racionální čísla, operátory, výrazy, knihovní funkce

Textový editor WORD. Práca s obrázkami a automatickými tvarmi vo Worde

TELCO PH 578. telefónny prístroj. Návod na obsluhu Návod na obsluhu Návod na obsluhu VLASTNOSTI:

Kvadratické funkcie, rovnice, 1

DANE A DAŇOVÝ SYSTÉM V SR

Centrálny GIS MV SR. Ing. Kamil FAKO, PhD. OA, SITB MV SR

Základy štatistiky. Charakteristiky štatistického znaku

Šifrovanie, kódovanie, bit a byte, digitálne informácie. Kódovanie informácií v PC binárna (dvojková) číselná sústava

OCHRANA INOVÁCIÍ PROSTREDNÍCTVOM OBCHODNÝCH TAJOMSTIEV A PATENTOV: DETERMINANTY PRE FIRMY EURÓPSKEJ ÚNIE ZHRNUTIE

OBOZNÁMTE SA S VAŠÍM TELEFÓNOM

RIZIKO V PODNIKU. Prípadová štúdia 2. Ing. Michal Tkáč, PhD.

Racionální čísla, operátory, výrazy, knihovní funkce

KORUNOVAČNÁ BRATISLAVA MANUÁL LOGA VER. 1/2017

ŠTATISTIKA V EXCELI 2007

Spoločnosť Wüstenrot monitoruje všetky bezpečnostné informácie a udalosti v informačnom systéme

Návrh postupu pre stanovenie počtu odborných zástupcov na prevádzkovanie verejných vodovodov a verejných kanalizácií v správe vodárenských spoločnosti

POSTUP GENEROVANIA ŽIADOSTI O KVALIFIKOVANÝ CERTIFIKÁT POMOCOU PROGRAMU COMFORTCHIP.

OBOZNÁMTE SA S VAŠÍM TELEFÓNOM

F akulta B aníctva, E kológie, R iadenia a G eotechnológií. Mozilla Firefox. Ing. Anna Grejtáková SPP D FBERG 2011

Jún ver aktualizácia textu: 10. júna 2016

PRIEMYSELNÁ INFORMATIKA DISKRÉTNE LINEÁRNE RIADENIE

Microsoft Outlook. Stručný prehľad základných funkcií. Ing.Anna Grejtáková, SPP DFBERG

Moderné vzdelávanie pre vedomostnú spoločnosť/projekt je spolufinancovaný zo zdrojov EÚ. Grafy

Ďalší spôsob, akým je možné vygenerovať maticu je použitie zabudovaných funkcií na generovanie elementárnych matíc.

Transkript:

Jazykové konštrukcie: Výrazy Rekurzívne algoritmy 1. Výrazy v programovacom jazyku C údajové objekty a l-hodnota operátory, priorita a asociatívnosť aritmetické výrazy logické výrazy relačné výrazy bitové operácie 2. Rekurzívne algoritmy vlastnosti, priama a nepriama rekurzia výhody použitia resp. nepoužitia rekurzie príklad rýchleho triedenia (quicksort) Programovanie - prednáška č. 5 1 Výrazy v programovacom jazyku C Prostriedok pre vyjadrenie spôsobu výpočtu údajových objektov Stupne abstrakcie vyjadrenie výpočtu na strojovej úrovni číslicového počítača vyjadrenie výpočtu na vyššej úrovni (aritmetické, logické, relačné výrazy) Syntax výrazu presne definovaná postupnosť operandov a operátorov (a = b + 2) Sémantika výrazu presne definovaný spôsob výpočtu údajových objektov na základe použitých operátorov, typov operandov a štruktúry výrazu (k hodnote premennej b pripočítaj číslo 2 a výsledok ulož do premennej a) Programovanie - prednáška č. 5 2

Údajové objekty ako operandy Operandom výrazu je údajový objekt Každý údajový objekt má adresu miesto jeho uloženia v pamäti hodnotu údaj uložený na príslušnej adrese podľa typu údajového objektu Pri výpočte výrazu môžeme ako operand použiť priamo hodnotu údajového objektu a = b + 1 nepriamo adresu na hodnotu údajového objektu (použitie smerníka na údajový objekt) scanf( %d, &a) (Pri použití adresy údajového objektu môžeme navyše pracovať s touto adresou ako s hodnotou) Programovanie - prednáška č. 5 3 L-hodnota Prístup k hodnote údajového objektu je pomocou jeho adresy L-hodnota je výraz vyjadrujúci údajový objekt, s ktorého hodnotou môžeme manipulovať pre každý výraz, ktorý je l-hodnota vieme určiť adresu a pomocou nej manipulovať s jeho hodnotou pre výraz, ktorý nie je l-hodnota nevieme určiť adresu, poznáme iba jeho hodnotu, ktorú nemôžeme meniť Použitie l-hodnoty súvisí s výrazom priradenia (napr. a = 1) na ľavej strane priradenia musí byť vždy l-hodnota Programovanie - prednáška č. 5 4

L-hodnota (príklady) a = 10 a je l-hodnota (vieme určiť adresu premennej) a 10 nie je l-hodnota (nevieme určiť adresu konštanty) a + b výraz nie je l-hodnota (nevieme určiť adresu hodnoty vypočítanej súčtom hodnôt premenných a a b) a + 1 = 5 výraz je nesprávny, pretože výraz a + 1 nie je l-hodnota (nevieme určiť adresu hodnotu vypočítanej súčtom hodnoty premennej a a konštanty 1) a nemôže byť na ľavej strane priradenia &(a + 1) výraz je nesprávny, pretože výraz a + 1 nie je l-hodnota (viď vyššie) a nemôžeme použiť operátor & pre získanie adresy tohoto výrazu 3 = a výraz je nesprávny, pretože konštanta 3 nie je l-hodnota Programovanie - prednáška č. 5 5 Implicitná konverzia typov operandov Vo výraze sa môžu vyskytovať hodnoty operandov rôznych typov (a = 1 + 0.5) Pri výpočte výrazu sa tieto hodnoty rôznych typov automaticky (implicitne) konvertujú na jeden z použitých typov Konverzia pre výraz priradenia typ pravej strany sa konvertuje na typ ľavej strany int = char char = int char, int = long int = float float = double s rozšírením znamienka alebo bez (vec implementácie) orezanie vyšších rádov orezanie vyšších rádov zanedbanie desatinnej časti zaokrúhlenie Konverzia pre ostatné výrazy operand s nižším typom sa prevedie na vyšší typ iného opernadu vo výraze int unsigned long double char, short float Programovanie - prednáška č. 5 6

Operátory a ich vlastnosti Operátory určujú druh operácie nad operandmi Stupeň operátora unárny viaže sa s jedným operandom (napr. negácia) binárny viaže sa s dvoma operandmi (napr. sčítanie) ternárny viaže sa s troma operandmi (napr. podmienka) Priorita poradie vykonávania operátora vo výraze vzhľadom k ostatným operátorom vo výraze priorita môže byť explicitne vyjadrená pomocou zátvoriek ( ) Komutatívnosť možnosť zmeny poradia operandov Asociatívnosť poradie vykonávania operátorov vo výraze s operátormi rovnakej priority a + b + c * d / e + f sa vypočíta takto (((a + b) + ((c * d) / e)) + f) a = b = c = 1 sa vypočíta takto (a = (b = (c = 1))) a + b >> 3 sa vypočíta takto ((a + b) >> 3) f = fopen() == NULL sa vypočíta takto (f = (fopen() == NULL)) Programovanie - prednáška č. 5 7 Rozdelenie operátorov aritmetické (súčet, rozdiel, súčin, podiel, zvyšok po delení, unárne mínus) + - * / % - relačné (menší, menší alebo rovný, rovný, rôzny, väčší alebo rovný, väčší) < <= ==!= >= > logické (logický súčin, logický súčet, negácia) &&! bitové (súčin, súčet, neekvivalencia, jednotkový doplnok, posuv doľava, doprava) & ^ ~ << >> inkrementačný operátor ++ dekrementačný operátor -- priraďovacie (aktualizácia hodnoty pripočítaním, odpočítaním, atď.) = += -= *= /= %= &= = ^= <<= >>= operátor výpočtu adresy & operátor indexácie prvku poľa [ ] operátor podmieneného výrazu? : operátor zmeny typu (typ) operátor zistenia veľkosti údajového typu alebo premennej sizeof() operátor čiarka (operátor zabudnutia, zániku hodnoty), operátor nepriameho prístupu (indirekcie, nepriamej adresácie, dereferencie) * operátory sprístupnenia zložky štruktúry (kvalifikácia a nepriama kvalifikácia). -> Programovanie - prednáška č. 5 8

Prehľad priorít a asociatívnosti operátorov Priorita Operátor Asociatívnosť 15 ( ) [ ] ->. zátvorky, indexy, kvalifikácia 14! ~ ++ -- - unárne operátory (typ) * & sizeof() 13 * / % multiplikatívne operátory 12 + - aditívne operátory 11 << >> posuvy 10 < <= > >= relačné operátory 9 ==!= relačné operátory: rovný, rôzny 8 & logický súčin po bitoch 7 ^ neekvivalencia po bitoch 6 logický súčet po bitoch 5 && logický súčin 4 logický súčet 3? : podmienkový operátor 2 = += -= *= /= %= &= priraďovacie operátory = ^= <<= >>= 1, operátor čiarka Programovanie - prednáška č. 5 9 Aritmetické výrazy Súčet +, rozdiel -, súčin *, podiel /, zvyšok po delení %, negácia - Problém komutatívnosti výsledok výrazu a + b + c je z matematického hľadiska rovnaký ako výsledok výrazu b + c + a int a = 32000; int b = 10000; int c = -20000; výpočet výrazu a + b + c je problém (nastane pretečenie), ale výpočet výrazu b + c + a je v poriadku Problém poradia vyhodnotenia operandov vo výraze a + b nie je zaručené poradie vyhodnotenie výrazov a a b ak vo výraze x = a + f() volanie funkcie f() ovplyvňuje premennú a, potom a + f() nie je to isté ako f() + a (je lepšie použiť dva výrazy b = f() a x = a + b) Podiel celočíselných výrazov ak a, b sú celé čísla, potom výraz a / b bude tiež celé číslo (aj ak tento výraz priradíme reálnej premennej) Programovanie - prednáška č. 5 10

Logické výrazy Logický súčet, logický súčin &&, negácia! V jazyku C neexistuje typ pre logické hodnoty (pravda, nepravda) a používa sa typ celé čísla (int) hodnota 0 je nepravda a ostatné nenulové hodnoty sú pravda výsledkom logického výrazu je vždy hodnota 0 (nepravda) resp. 1 (pravda) a b a && b a b!a!b 0 0 0 0 1 1 0 N 0 1 1 0 N 0 0 1 0 1 N N 1 1 0 0 je zameniteľné s b = = 0 N nenulová hodnota Logiský výraz sa vyhodnocuje zľava doprava a vyhodnotenie sa zastaví, ak je známa logická hodnota výsledku, t.j. nemusia sa vyhodnotiť všetky operandy logického výrazu (vyhodnocovanie je závislé od priebehu výpočtu) Programovanie - prednáška č. 5 11 Relačné výrazy Menší <, menší alebo rovný <=, väčší >, väčší alebo rovný >=, rovný ==, nerovný!= Výsledkom relačného výrazu je vždy logická hodnota (pravda resp. nepravda), pričom tá je v jazyku C stále reprezentovaná celým číslo (0 resp. 1) Je potrebné dávať pozor pri používaní relačných výrazov s reálnymi číslami (v číslicovom počítači sú vždy reprezentované iba s určitou presnosťou) double a = 0.0; double a = 0.0; do { do {...... a = a + 0.1; a = a + 0.1; } while (a!= 1.0); } while (a <= 1.0); môže nastať problém správne riešenie Programovanie - prednáška č. 5 12

Operátory inkrementácie a dekrementácie Inkrementácia ++, dekrementácia -- Tieto operátory sa používajú na efektívnejší a bezpečnejší zápis výrazov a = a + 1 resp. a = a - 1 spôsobom a++ (alebo ++a) resp. a-- (alebo --a) Spôsob použitia prefixný ++a resp. --a úprava hodnoty premennej a sa vykoná ešte pred začatím vyhodnocovania výrazu (vo výraze sa pracuje už so zmenenou hodnotou) postfixný a++ resp. a-- úprava hodnoty premennej a sa vykoná až po vyhodnotení celého výrazu (vo výraze sa pracuje ešte s pôvodnou hodnotou) Programovanie - prednáška č. 5 13 Priraďovacie operátory Priradenie = zabezpečí priradenie hodnoty výrazu na pravej strane priradenia do výrazu na ľavej strane priradenia ľavá strana výrazu priradenia musí byť l-hodnota Priradenie OP= OP môže byť jeden z binárnych operátorov +, -, *, /, %, <<, >>, &,, ^ výraz x OP= y je ekvivalentný výrazu x = (x) OP (y) efektívnejší a bezpečnejší zápis výrazu priradenia, kde výraz na ľavej strane sa vyskytuje aj vo výraze na pravej strane priradenia ľavá strana výrazu priradenia musí byť l-hodnota Programovanie - prednáška č. 5 14

Operátor podmieneného výrazu Podmienený výraz e 1? e 2 : e 3 ak výraz e 1 je nenulový, potom výsledkom výrazu je výraz e 2, v opačnom prípade výsledkom výrazu je výraz e 3 Používa sa na zjednodušenie zápisu príkazu vetvenia napr. if (a > b) max = a; else max = b; môžeme nahradiť výrazovým príkazom max = a > b? a : b; Programovanie - prednáška č. 5 15 Operátor spojenia výrazov Spojenie výrazov e 1, e 2 spája rôzne výrazy e 1 a e 2 do jedného výrazu výsledkom spojenia výrazov je výraz e 2 na pravej strane spojeného výrazu Používa sa pre zjednodušenie zápisu postupnosti viacerých výrazov, napr. a = (b = 10, c = 20, b + c); predstavuje vykonanie nasledovných výrazových príkazov b = 10; c = 20; a = b + c; Pozor, symbol, sa používa aj ako oddeľovač iných jazykových konštrukcií (definície premenných, zoznam parametrov funkcie, zoznam prvkov poľa atď.) Programovanie - prednáška č. 5 16

Operátor pretypovania Pretypovanie (typ) Operátor pretypovania slúžni na explicitnú konverziu typu výrazu výraz (typ) e zmení používanie hodnoty výrazu e na základe uvedeného typu typ Používa sa tam, kde je implicitná konverzia typu nevyhovujúca, napr. int a; float b; a = 5; b = (float) a / 2; umožní správny výpočet hodnoty reálnej premennej b z celočíselnej hodnoty premennej a a celočíselnej konštanty 2 pretypovaním výrazu Programovanie - prednáška č. 5 17 Rekurzívne algoritmy Prvok je rekurzívny, ak sa čiastočne skladá, alebo je definovaný pomocou samého seba Rekurzia je silným nástrojom najmä pri matematických definíciách napr. prirodzené čísla, stromové štruktúry, funkcie (faktoriál, Fibonacciho čísla, atď.) Rekurzia umožňuje definovať nekonečnú množinu prvkov konečným príkazom a podobne možno nekonečný počet výpočtov opísať pomocou konečného rekurzívneho programu Rekurzívne algoritmy sú najvhodnejšie pri riešení problémov a pri výpočtoch funkcií alebo spracovaní takých štruktúr údajov, ktoré už samy osebe sú definované rekurzívnym spôsobom Programovanie - prednáška č. 5 18

Rekurzívna funkcia Schému rekurzívneho algoritmu môžeme vyjadriť vzťahom P P(S, P) ktorý predstavuje program P ako kompozíciu P príkazov S (neobsahujúcich P) a samotného P Prostriedkom pre vyjadrenie rekurzie v programoch je podprogram (funkcia), ktorej identifikátor slúži na rekurzívnu aktiváciu jeho tela Programovanie - prednáška č. 5 19 Priama a nepriama rekurzia Ak podprogram P obsahuje priamy odkaz na seba, tak o ňom hovoríme, že je priamo rekurzívny Ak podprogram P obsahuje odkaz na iný podprogram Q, ktorý obsahuje (priamy alebo nepriamy) odkaz na P, tak P je nepriamo rekurzívny Použitie rekurzie preto nemusí byť vždy priamo zrejmé z textu samotného podprogramu Programovanie - prednáška č. 5 20

Problém ukončenia rekurzie Rekurzívne funkcie dávajú možnosť nekonečných výpočtov a je potrebné riešiť problém ukončenia výpočtu Rekurzívne volanie funkcie P musí byť riadené podmienkou B, ktorá môže byť za určitých okolností nesplnená P P(S, ak B potom P) Dôkazom konečnosti rekurzívneho programu je preukázanie konečnej hĺbky rekurzie, tzn. každé volanie P znižuje počet ďalších volaní P Často je dôležité poukázať nielen na konečnosť rekurzie, ale aj na malú hĺbku tejto rekurzie, pretože každé volanie rekurzívnej funkcie vyžaduje pridelenie určitého množstva pamäti Programovanie - prednáška č. 5 21 Kedy používať a kedy nepoužívať rekurziu Rekurzívny program je vhodný, ak riešený problém alebo používané údaje sú definované rekurzívne Použitie rekurzie nezaručuje, že algoritmus predstavuje najlepšie riešenie problému Vo všeobecnosti sa schéma P P(S, ak B potom P) dá transformovať na nerekurzívny (iteratívny) tvar P P(nech x = x 0, pokiaľ B opakuj S) Každý rekurzívny program možno transformovať na iteratívny tvar (pomocou cyklov) Pri zložitejších rekurzívnych schémach je však transformácia na iteratívny tvar veľmi nepraktická Programy, ktoré sú svojou podstatou rekurzívne (skôr než iteratívne) majú byť implementované pomocou rekurzívnych funkcií Programovanie - prednáška č. 5 22

Príklady rekurzívnych algoritmov Výpočet faktoriálu Faktoriál n! pre celé číslo n 0: 0! = 1 ak n > 0, tak n! = n(n 1)! Výpočet Fibonacciho čísel Fibonacciho číslo f(n) pre celé číslo n > 0 f(1) = 1 a f(2) = 1 ak n > 2, tak f(n) = f(n 1) + f(n 2) Rýchle triedenie (Quicksort) vybrať ľubovoľný prvok x z triedeného poľa a; prehľadať prvky zľava, pokiaľ sa nenájde prvok a i > x; prehľadať prvky sprava, pokiaľ sa nenájde a j < x; vymeniť prvky a i a a j ; pokračovať v prehľadávaní a výmene, kým sa ľavé a pravé prehľadávania nestretnú v strede poľa 1 1 1 1 = n x n M ( n x + 1) = n x= 1 n 6 6n C = nlog n M = n log n 6 v najhoršom prípade je rádu n 2 a rozhodujúcim krokom je výber prvku x Programovanie - prednáška č. 5 23