C a C++ Algoritmy v jazyku. Jiří Prokop
|
|
- Ivana Vacková
- před 8 lety
- Počet zobrazení:
Transkript
1 Algoritmy v jazyku C a C++ Jiří Prokop Seznámení s jazykem C a úvod do C++ Vyhledávání a třídění Datové struktury a práce s grafy Algoritmy z numerické matematiky Kryptologické algoritmy
2
3 Algoritmy v jazyku C a C++ Jiří Prokop
4 Upozornění pro čtenáře a uživatele této knihy Všechna práva vyhrazena. Žádná část této tištěné či elektronické knihy nesmí být reprodukována a šířena v papírové, elektronické či jiné podobě bez předchozího písemného souhlasu nakladatele. Neoprávněné užití této knihy bude trestně stíháno. Algoritmy v jazyku C a C++ 2., rozšířené a aktualizované vydání Jiří Prokop Vydala Grada Publishing, a.s. U Průhonu 22, Praha 7 jako svou publikaci Odpovědný redaktor Pavel Němeček Sazba Tomáš Brejcha Počet stran 176 První vydání, Praha 2012 Grada Publishing, a.s., 2012 V knize použité názvy programových produktů, firem apod. mohou být ochrannými známkami nebo registrovanými ochrannými známkami příslušných vlastníků. Vytiskly Tiskárny Havlíčkův Brod, a. s. Husova ulice 1881, Havlíčkův Brod ISBN (tištěná verze) ISBN (elektronická verze ve formátu PDF) ISBN (elektronická verze ve formátu EPUB)
5 Obsah Úvod Jazyk C 1.1 Stručný přehled jazyka C Deklarace Výrazy a přiřazení Priorita a asociativita operátorů Příkazy a bloky Preprocesor Funkce Vstup a výstup Ukazatele Adresní aritmetika Ukazatele a funkce Pole Ukazatele a pole Řetězce znaků Vícerozměrná pole Jednoduché algoritmy Vyhledání minimálního prvku v nesetříděném poli Vyhledání zadaného prvku v nesetříděném poli Určení hodnoty Ludolfova čísla pomocí rozvoje pi=4(1-1/3+1/5-1/7+1/9+ ) Mzdová výčetka Největší společný dělitel dvou čísel Pascalův trojúhelník Kalendář Permutace Násobení permutací Inverzní permutace Rekurze 2.1 Hanojské věže W-křivky Fibonacciho čísla Algoritmy pro třídění 3.1 Třídění výběrem (selectsort) Třídění vkládáním (insertsort) Bublinkové třídění (bubblesort) Časová a paměťová složitost Obsah 5
6 3.5 Třídění slučováním (mergesort) Třídění rozdělováním (quicksort) Shellův algoritmus Třídicí algoritmy obecněji Metoda Rozděl a panuj Datové struktury 4.1 Dynamické datové struktury Lineární spojový seznam Lineární spojový seznam setříděný Setřídění vytvořeného lineárního seznamu Zásobník a fronta Nerekurzivní verze quicksortu Práce s grafy 5.1 Úvod do teorie grafů Topologické třídění Minimální kostra grafu Bipartitní graf Práce se soubory dat Datové proudy Proudy a vstup/výstup znaků Proudy a vstup/výstup řetězců Formátovaný vstup/výstup z/do proudu Proudy a blokový přenos dat Další užitečné funkce Vzdálenosti v grafu Hledání nejkratší (nejdelší) cesty v acyklickém orientovaném grafu Vyhledávací algoritmy 6.1 Binární hledání v setříděném poli Binární vyhledávací strom Vynechání vrcholu v binárním vyhledávacím stromu Procházení stromem AVL stromy Transformace klíče Halda Využití haldy pro třídění heapsort Algoritmy v jazyku C a C++
7 Reprezentace aritmetického výrazu binárním stromem 7.1 Vyhodnocení výrazu zadaného v postfixové notaci Převod infixové notace na postfixovou Převod postfixové notace na binární strom Průchod stavovým prostorem 8.1 Prohledávání do šířky Prohledávání s návratem (backtracking) Osm dam na šachovnici Sudoku Hry pro 2 hráče Kryptologické algoritmy 9.1 Základní pojmy Jednoduchá (monoalfabetická) substituční šifra Playfairova šifra Vigenèrova šifra Transpoziční šifry Jednorázová tabulka (Vernamova šifra) Moderní šifrování Úvod do C Nové možnosti jazyka Objektové datové proudy Objektově orientované programování Šablony Algoritmy numerické matematiky 11.1 Řešení nelineární rovnice f(x)= Hornerovo schéma Metoda půlení intervalu (bisekce) Metoda tětiv (regula falsi) Newtonova metoda (metoda tečen) Interpolace Newtonův interpolační vzorec Lagrangeova interpolace Soustavy lineárních rovnic Gaussova eliminační metoda Iterační (Jacobiova) metoda Gauss-Seidelova metoda Numerické integrování Obsah 7
8 Dynamické programování Vyhledání znakového řetězce v textu 13.1 Naivní algoritmus Zjednodušený Boyer-Mooreův algoritmus Karp-Rabinův algoritmus Literatura Rejstřík Algoritmy v jazyku C a C++
9 Úvod V roce 2002, kdy jsem začal na Gymnáziu Christiana Dopplera vést seminář Programování v jazyku C, neexistovala na našem knižním trhu učebnice, která by se věnovala algoritmům a používala jazyk C. Algoritmy byly po řadu let prezentovány téměř výlučně v jazyku Pascal, např. [Wir89] a [Top95]. Musel jsem tedy během šesti let algoritmy pro účely výuky naprogramovat, a tak vznikl základ této knihy. Kniha nechce být učebnicí jazyka C, i když může být k užitku všem, kteří jazyk právě studují. Dobrých učebnic jazyka je dostatek, doporučit lze např. [Her04] nebo [Ka01], pro C++ [Vi02], [Vi97]. Jestliže jsem přesto zařadil do knihy alespoň stručný přehled jazyka C a také úvod do C++, je to proto, aby čtenář měl při studiu knihy vše potřebné pro porozumění zdrojovým textům algoritmů a nemusel hledat informace jinde. Kdo je s jazykem C seznámen do té míry, že zná nejdůležitější operátory, výrazy a přiřazení, příkazy pro řízení programu, příkazy vstupu a výstupu, funkce a vedle jednoduchých datových typů ještě pole, stačí mu to už ke studiu jednoduchých algoritmů. Takový přehled jazyka obsahuje právě první kapitola, a pak lze studovat druhou, věnovanou rekurzi, a třetí, která se zabývá třídicími algoritmy. Teprve pro studium datových struktur je nutno v kapitole 4 rozšířit zatím popsanou podmnožinu jazyka o struktury a dynamické přidělování paměti. Tyto znalosti jsou pak potřebné i pro pochopení algoritmů na grafech a pro vyhledávání pomocí binárních stromů. Stromy se využívají také k reprezentaci aritmetických výrazů a pro počítačové řešení hlavolamů a her. Popsaná podmnožina jazyka je v těchto kapitolách dále rozšiřována podle potřeby. Algoritmy z kapitol 1 až 8 jsou napsány v jazyku C, teprve kapitola 9 je úvodním popisem C++, a algoritmy v dalších kapitolách jsou v C++. Z tohoto stručného průvodce obsahem knihy vyplývá samozřejmé doporučení studovat jednotlivé kapitoly postupně, bez přeskakování, protože v každé kapitole se už počítá s tím, co si čtenář osvojil z kapitol předchozích. Výjimkou jsou odstavce přidané ve druhém vydání této knihy, ty je možno při prvním čtení přeskočit. Jedná se o odstavec 1.3 Permutace, odstavec 6.5 AVL stromy, kapitolu 9 Kryptologické algoritmy a odstavec 11.4 Numerické integrování. Dalším doporučením je studium aktivní, usnadňuji ho tím, že všechny algoritmy rozdělené podle kapitol knihy lze najít na webových stránkách www. grada.cz. Zdrojové texty tedy nemusí nikdo pracně vkládat, čtenář může provádět v programech úpravy, mnohde k tomu zdrojový text přímo vybízí tím, že části zdrojového textu jsou ukryty v komentářích. Často lze algoritmus snáze pochopit, zobrazíme-li si některé mezivýsledky. Aktivní způsob studia je kromě toho určitě mnohem zajímavější. Algoritmy jsou ověřeny s použitím kompilátoru Dev C++, některé i kompilátoru Microsoft Visual C++. Čtenář, který by měl ke knize jakékoli připomínky, může je sdělit na ovou adresu Jiri.Prokop40@seznam.cz. Na závěr přeji svým čtenářům mnoho úspěchů v jejich studiu. Úvod 9
10
11 1. Jazyk C 1.1 Stručný přehled jazyka C Jazyk C rozlišuje velká a malá písmena. Prog, prog a PROG jsou tedy tři různé identifikátory. Identifikátory sestávají z písmen, číslic a podtržítka, číslice nesmí být na prvním místě. Pro oddělování klíčových slov, identifikátorů a konstant slouží oddělovače (tzv. bílé znaky ). Všude tam, kde mohou být oddělovače, může být komentář. /* toto je komentar */ Struktura programu: direktivy preprocesoru, deklarace, definice, funkce. V každém programu je právě jedna funkce hlavní (main), která se začne po spuštění programu vykonávat Deklarace Deklarace jsou povinné. Deklaraci jednoduché proměnné tvoří specifikátor typu a jméno (identifikátor proměnné) int a; /* deklarace celočíselné proměnné a */ int b=1; /* definice proměnné b */ Podle umístění dělíme deklarace na globální (na začátku programu) a lokální (v těle funkce). Lokální proměnné nejsou implicitně inicializovány a obsahují náhodné hodnoty. Specifikátory typu pro celá čísla: int, char, short int (nebo jen short), long int (nebo jen long). Každý z nich může být signed (se znaménkem) nebo unsigned (bez znaménka), implicitně je signed. Specifikátory typu pro racionální proměnné: float (32 bytů), double (64), long double (80). U konstant je typ dán způsobem zápisu. Pomocí klíčového slova const můžeme deklarovat konstantní proměnnou, jejíž obsah nelze později měnit: const float pi= ; Výrazy a přiřazení Výrazy jsou v jazyce C tvořeny posloupností operandů a operátorů. Operátory dělíme podle arity (počet operandů) na unární, binární a ternární, podle funkce na aritmetické: +, -, *, /, % pro zbytek po dělení (operátor / má význam reálného nebo celočíselného dělení podle typů operandů), relační: >, <, >=, <=, == (rovnost),!= (nerovnost), logické: (log. součet), && (log. součin),! (negace). Jazyk C nezná logický typ, nenulová hodnota představuje true, nulová false. Podmíněný operátor? (jediný ternární operátor) x=(a<b)? a:b; má stejný význam jako if (a<b) x=a; else x=b; Jazyk C 11
12 Obecně: v1? v2 : v3 v1 je výraz, jehož hodnota je po vyhodnocení považována za logickou. Je-li true, vyhodnotí se výraz v2 a vrátí se jeho hodnota, je-li false, pak se vyhodnotí v3 a vrátí se jeho hodnota. v2 a v3 jsou jednoduché výrazy. Operátory přiřazení: a=a+b; a+=b; /* má význam a=a+b; */ na místě + může být -, *, /, %, & a další, o nichž zatím nebyla řeč. Operátory inkrementace a dekrementace a++; /* postfixová verze */ --a; /* prefixová verze */ Příklad: a=10; x=++a; /* x bude mít hodnotu 11, a taky */ y=a--; /* y=11, a=10 */ Unární operátory: adresní operátor &, operátor dereference *, unární +, unární -, logická negace! a prefixová inkrementace ++ a dekrementace --. K postfixovým operátorům patří operátor přístupu k prvkům pole [ ], operátor volání funkce ( ), postfixová inkrementace ++ a dekrementace -- a operátory přístupu ke členům struktury, jimž se budu věnovat později. Operátor přetypování ukáži na příkladu (i1 a i2 jsou celočíselné proměnné, ale chci reálné dělení): f=(float) i1/i2; Operátor sizeof pro zjištění velikosti: argumentem operátoru může být jak název typu, tak identifikátor proměnné Priorita a asociativita operátorů Priorita Operátory Vyhodnocuje se 1 ( ) [ ] -> postfix zleva doprava 2! - pref (typ) * & sizeof zprava doleva 3 * / % (multiplikativní oper.) zleva doprava (aditivní operátory) zleva doprava 5 << >> (operátory posunů) zleva doprava 6 < <= > >= (relační operátory) zleva doprava 7 ==!= (rovnost, nerovnost) zleva doprava 8 & (operátor bitového součinu) zleva doprava 9 ^ (exklusivní nebo) zleva doprava 10 (operátor bitového součtu) zleva doprava 11 && (operátor logického součinu) zleva doprava 12 (operátor logického součtu) zleva doprava 13?: (ternární podmínkový operátor) zprava doleva 14 = += -= *= /= %= >>= &= = ^= zprava doleva 15, (operátor čárky) zleva doprava 12 Algoritmy v jazyku C a C++
13 1.1.4 Příkazy a bloky Napíšeme-li za výraz středník, stává se z něj příkaz, jako je tomu v následujících příkladech: float x,y,z; x=0; a++; x=y=z; y=z=(f(x)+3); /* k hodnotě vrácené funkcí f je přičtena hodnota 3. */ /* Součet je přiřazen jak proměnné z, tak y. */ Příkazy v jazyce C můžeme sdružovat do tzv. bloků nebo složených příkazů. Blok může obsahovat deklarace proměnných na svém počátku a dále pak jednotlivé příkazy. Začátek a konec bloku je vymezen složenými závorkami. Složené příkazy používáme tam, kde smí být použit pouze jeden příkaz, ale potřebujeme jich více. Za uzavírací složenou závorku se nepíše středník. Příkaz if má dvě podoby: if (výraz) příkaz nebo if výraz příkaz1 else příkaz2; Složitější rozhodovací postup můžeme realizovat konstrukcí if else if. Každé else se váže vždy k nejbližšímu předchozímu if. Příkaz switch a break switch(výraz) case konst_výraz1: /* příkazy, které se provedou, když výraz=výraz1 */ break; case konst_výraz2: /* příkazy, které se provedou, když výraz=výraz2 */. break; default: /* příkazy, které se provedou, není-li výraz roven žádnému z předchozích konstantních výrazů */ Příkaz break říká, že tok programu nemá pokračovat následujícím řádkem, nýbrž prvním příkazem za uzavírající složenou závorkou příkazu case. V těle příkazu switch budou provedeny všechny vnořené příkazy počínaje tím, na který bylo předáno řízení, až do konce bloku (pokud některý z příkazů nezpůsobí něco jiného např. break). Tím se switch značně liší od pascalského case. Příkaz while while (výraz) příkaz; Jazyk C 13
14 Výraz za while představuje podmínku pro opakování příkazu. Není-li podmínka splněna už na začátku, nemusí se příkaz provést ani jednou. Je-li splněna, příkaz se provede a po jeho provedení se znovu testuje podmínka pro opakování cyklu. Příkaz do-while Zajistí aspoň jedno provedení těla cyklu, protože podmínka opakování se testuje na konci cyklu. do příkaz while (výraz); Příkaz for Nejčastější podoba příkazu je for (i=0;i<n;i++), kde i je proměnná cyklu, inicializační výraz jí přiřadí počáteční hodnotu 0, opakování cyklu bude probíhat s hodnotou proměnné zvýšenou o 1 tak dlouho, dokud bude i < n. Obecný tvar příkazu for vypadá následovně: for(inicializační_výraz;podmíněný výraz;opakovaný výraz) příkaz je ekvivalentní zápisu: inicializační výraz; while (podmíněný výraz) příkaz opakovaný výraz Inicializační výraz může být vypuštěn, zůstane po něm však středník. Stejně může být vynechán i podmíněný výraz a opakovaný výraz. Příkaz continue je možno použít ve spolupráci se všemi uvedenými typy cyklů. Ukončí právě prováděný průchod cyklem a pokračuje novým průchodem. Podobně i příkaz break může být použit ve všech typech cyklů k jejich ukončení. Příkaz goto a návěští Příkaz goto přenese běh programu na místo označené návěštím (identifikátor ukončený dvojtečkou). Jsou situace, kdy může být výhodný, např. chceme-li vyskočit z vnitřního cyklu z více vnořených cyklů. Prázdný příkaz ; Použití všude tam, kde je prázdné tělo Preprocesor Preprocesor zpracuje zdrojový text programu před překladačem, vypustí komentáře, provede záměnu textů, např. identifikátorů konstant za odpovídající číselné hodnoty a vloží texty ze specifikovaných souborů. Příkazy pro preprocesor začínají znakem # a nejsou ukončeny středníkem. Nejdůležitějšími příkazy jsou #define a #include. #define ID hodnota Říká, že preprocesor nahradí všude v textu identifikátor ID specifikovanou hodnotou, např. #define PI #include <stdio.h> znamená příkaz vložit do zdrojového textu funkce vstupu a výstupu ze systémového adresáře. 14 Algoritmy v jazyku C a C++
15 #include "filename" znamená, že preprocesor vloží text ze specifikovaného souboru v adresáři uživatele. Některé standardní knihovny: stdio.h stdlib.h string.h math.h time.h funkce pro vstup a výstup obecně užitečné funkce práce s řetězci matematické funkce v přesnosti double práce s datem a časem Funkce Každá funkce musí mít definici a: má určeno jméno, pomocí kterého se volá; může mít parametry, v nichž předáme data, na kterých se budou vykonávat operace; může mít návratovou hodnotu poskytující výsledek; má tělo složené z příkazů, které po svém vyvolání vykoná. Příkazy jsou uzavřeny ve složených závorkách. Příkaz return vyraz; vypočte hodnotu vyraz, přiřadí ji jako návratovou hodnotu funkce a funkci ukončí. Příklad: int max(int a, int b) /* hlavička */ if (a>b) return a; return b; Nevrací-li funkce žádnou hodnotu, píšeme v místě typu návratové hodnoty void. Nepředáváme-li data, uvádíme jen kulaté závorky nebo void. Neznáme-li definici funkce, a přesto ji chceme použít, musíme mít deklaraci funkce (prototyp), která určuje jméno funkce, paměťovou třídu a typy jejích parametrů. Na rozdíl od definice funkce již neobsahuje tělo a je vždy ukončena středníkem. int max(int a, int b); nebo jen int max(int,int); Pokud neuvedeme paměťovou třídu, je automaticky přiřazena třída extern. Je-li funkce definována v paměťové třídě extern (explicitně nebo implicitně), můžeme definici funkce umístit do jiného zdrojového souboru. Funkce je společná pro všechny moduly, ze kterých se výsledný program skládá a může být v libovolném modulu volána. Je-li deklarována ve třídě static, musí její definice následovat ve stejné překladové jednotce a je dostupná pouze v jednotce, ve které je deklarována a definována. Volání funkcí: výraz(seznam skutečných parametrů); Nemá-li funkce žádné parametry, musíme napsat (). Parametry se vždy předávají hodnotou, jsou tedy následně překopírovány do formálních parametrů funkce. Rekurzivní funkce jsou v C dovoleny. Jazyk C 15
16 1.1.7 Vstup a výstup Standardní vstup a výstup: stdin, stdout Standardní vstup a výstup znaků int getchar(void); /* načte 1 znak */ int putchar(int znak); /* výstup 1 znaku */ Pro načtení a výstup celého řádku znaků char *gets(char *radek); int puts(const char *radek); Funkce gets načte znaky ze standardního vstupu, dokud není přechod na nový řádek. Ten už není do pole zapsán. Návratovou hodnotou je ukazatel předaný funkci jako parametr. Když došlo k nějaké chybě, má hodnotu NULL. Na řádku nesmíme zadat více znaků než je velikost pole. Funkce puts vypíše 1 řádek textu, za který automaticky přidá přechod na nový řádek. Řetězec samotný nemusí tento znak obsahovat. V případě, že výstup dopadl dobře, vrátí funkce nezápornou hodnotu, jinak EOF. Formátovaný vstup a výstup Funkce printf a scanf s následujícími deklaracemi: int printf(const char *format, ); int scanf(const char *format, ); Obě funkce mají proměnný počet parametrů, který je určen prvním parametrem formátovacím řetězcem. Formátovací řetězec funkce printf může obsahovat dva typy informací. Jednak jde o běžné znaky, které budou vytištěny, dále pak speciální formátovací sekvence znaků začínající % (má-li být % jako obyčejný znak, musím jej zdvojit). K tisknutelným znakům patří také escape sekvence, např. \n. scanf se liší tím, že formátovací řetězec smí obsahovat jen formátovací sekvence, a tím, že druhým a dalším parametrem je vždy ukazatel na proměnnou (adresa proměnné). Formátovací sekvence (printf) %[příznak] [šířka] [přesnost] [F] [N] [h] [l] [L] typ typ d,i znaménkové decimální číslo typu int o neznam. oktalové číslo typu int u neznam. decimální číslo typu int x,x neznam.hexadecimální číslo typu int, pro x tištěno a, b, c, d, e, f, pro X pak A, B, C f znam.racionální číslo formátu [-]dddd.dddd e,e znam. rac. č. v exp.formátu [-d]d.ddde[+ -]ddd g,g znam. rac. č. ve formátu bez exponentu nebo s exponentem (v závislosti na velikosti čísla) c jednoduchý znak s ukazatel na pole znaků ukončené nulovým znakem p tiskne argument jako ukazatel n ukazatel na číslo typu int, do kterého se uloží počet vytištěných znaků příznak - výstup zarovnán zleva a doplněn zprava mezerami + u čísel vždy znaménko mezera kladné číslo mezera, záporné minus # závisí na typu 16 Algoritmy v jazyku C a C++
17 šířka n alespoň n znaků se vytiskne doplněno mezerami 0n je vytištěno alespoň n znaků doplněných zleva nulami * šířka dána následujícím parametrem přesnost (nic) je různá podle části typ.0 stand.n n des. míst * přesnost dána následujícím parametrem h argument funkce chápán jako short int - pouze pro d, i, o, u, x, X l long int L long double Formátovací sekvence (scanf) %[*][šířka][f A][h l L]typ typ d celé číslo u celé číslo bez znaménka o oktalové x hexadecimální i celé číslo (s předponou o - oktalové, 0x hexadecimální a počet přečtených znaků do aktuální chvíle e, f, g racionální čísla typu float, lze modifikovat pomocí l, L s řetězec znaků na vstupu oddělený mezerou od ostatních znaků c jeden znak * přeskočení dané položky vstupu šířka max. počet znaků vstupu pro danou proměnnou sprintf a sscanf realizují formátovaný vstup a výstup z paměti. Potřebují textový řetězec, který se bude chovat jako standardní vstup / výstup int sprintf(char *buffer,const char *format, ); int sscanf(char *buffer,const char *format, ); Ukazatele Ukazatel je proměnná, jejíž hodnota je adresa jiné proměnné nebo funkce. Deklarace ukazatele se skládá z uvedení typu, na který ukazujeme, a jména ukazatele, doplněného zleva hvězdičkou. int *pcelecis; float *preal1, *preal2; /* může ukazovat na libovolné místo, kde je uložena proměnná typu int */ /* ukazatelé na libovolné proměnné typu float */ Ukazatel po svém založení neukazuje na žádnou platnou proměnnou a označujeme jej neinicializovaný ukazatel. S hodnotou neinicializovaného ukazatele nesmíme nikdy pracovat. Inicializaci ukazatele můžeme provést např. pomocí operátoru &, který slouží k získání adresy objektu. int Cislo=7; int *pcislo; pcislo=&cislo; Jazyk C 17
18 * Jakmile ukazatel odkazuje na smysluplné místo v paměti, můžeme s ním pracovat. K tomu potřebujeme ještě operátor *, kterému říkáme operátor dereference. int x, y=8; int *pint; pint=&y; x=*pint; /* v x je 8 */ y=*pint+20; /* do y se uloží součet obsahu proměnné, na kterou ukazuje pint, a konstanty 20 */ Adresní aritmetika Význam aritmetických operací s ukazateli spočívá ve zvýšení přehlednosti a zrychlení chodu programu. Aritmetika ukazatelů je omezena na operace sčítání, odčítání, porovnání a unární operace inkrementace a dekrementace. Jestliže p je ukazatel, p++ inkrementuje p tak, že zvýší jeho hodnotu nikoli o jedničku, nýbrž o počet bytů představující velikost typu, na který ukazatel p ukazuje. y=*(pint+50); /* tady zvětšuji hodnotu ukazatele o 50*sizeof(int) */ Ukazatele a funkce Má-li funkce vrátit více než jednu hodnotu, použijeme ukazatele: void vymen(int *px, int *py) int pom; pom=*px; *px=*py; *py=pom; int a=7,b=4; vymen(&a, &b); /* tím vlastně dosáhnu předání odkazem */ Ukazatel na funkci a funkce jako parametry funkcí Definice double (*pf)(); definuje pf jako ukazatel na funkci vracející hodnotu typu double. Dvojice prázdných závorek je nezbytná, jinak by pf byl ukazatel na double. Závorky kolem jména proměnné jsou také nutné, protože double *pf() znamená deklaraci funkce pf, která vrací ukazatel na double. Přiřadíme-li ukazateli pf jméno funkce, můžeme tuto funkci vyvolat příkazem pf(); i (*pf)();. Jméno funkce je tedy adresou funkce podobně jako jméno pole je adresou pole. Ukazatel, jemuž jsme přiřadili jméno funkce, může být také předán jako parametr jiné funkci. Příklad užitečného využití této možnosti uvidíme v odstavci Pole Pole je datová struktura složená z prvků stejného datového typu. Deklarace pole vypadá obecně takto: typ id_pole [pocet]; V hranatých závorkách musí být konstantní výraz, který udává počet prvků pole. Pole v jazyku C začíná vždy prvkem s indexem nula a nejvyšší hodnota indexu je počet-1. Jazyk C zásadně nekontroluje meze polí! K prvkům pole přistupujeme pomocí indexu, např. id_pole[0] pro první prvek pole. Indexem může být výraz. Pole můžeme při jeho deklaraci inicializovat konstantami, uvedenými mezi složenými závorkami a oddělovanými čárkou: int pole[5]=6,7,8,9,10 18 Algoritmy v jazyku C a C++
19 Počet inicializátorů by měl být menší nebo roven počtu prvků pole. Má-li pole být parametrem funkce, bude formální parametr tvořen typem a identifikátorem pole následovaným prázdnými hranatými závorkami, např. double pole[]. Jako skutečný parametr stačí jméno pole, tedy adresa začátku pole. Pole se tedy předává na rozdíl od jednoduchých proměnných odkazem. Pole nemůže být typem návratové hodnoty funkce (i když struktura obsahující pole jím být může). S polem jako celkem není možné provádět žádné operace s výjimkou určení velikosti pole operátorem sizeof a určení adresy pole operátorem &. int b[8]; int i=sizeof(b); /* 8*sizeof(int) */ Ukazatele a pole int x[12]; /* deklarace pole o 12 prvcích, indexy jsou 0 až 11 */ &x[i] = adresa pole x + i * sizeof(typ) int *pdata; pdata=&data[0]; /* není totéž jako pdata=&data */ for(i=0;i<12;i++) (pdata+i)=0; /* nulování pole - přičítá se i-násobek délky typu -adresní aritmetika */ Inicializaci ukazatele pdata můžeme zapsat i takto: pdata=data; což je stejné jako pdata=&data[0]; Máme-li deklaraci int i, *pi, a[n]; /* a[0] je totéž jako &a[0], a, anebo a+0 */ a+i je totéž jako &a[i], *(a+i) je totéž jako a[i] Je-li N=100 a přiřadíme-li pi=a; mají výrazy uvedené níže stejný význam: a[i], *(a+i), pi[i], *(pi+i) Řetězce znaků Řetězec je jednorozměrné pole znaků ukončené specielním znakem '\0', který má funkci zarážky. Řetězcové konstanty píšeme mezi dvojici uvozovek, uvozovky v řetězcové konstantě musíme uvést zpětným lomítkem. "abc" je konstanta typu řetězec délky 3+1 znak, "a" je rovněž řetězcovou konstantou délky 1+1, 'a' je znaková konstanta délky 1. Překopírování textového řetězce: void strcpy(char cil[ ],char zdroj[ ]) je potřebné #include <string.h> */ int i; for (i=0; zdroj[i]!='\0'; i++) cil[i]=zdroj[i]; cil[i]='\0'; nebo: void strcpy(char *cil, char *zdroj) while(*cil++ = *zdroj++); /* pro funkci strcpy Jazyk C 19
20 Nejdříve dojde k přiřazení odpovídajících buněk polí, oba ukazatele jsou pak posunuty a výsledek přiřazení je také chápán jako logická hodnota. Nastal-li konec řetězce, cyklus dále nepokračuje Vícerozměrná pole Jazyk C zná pouze jednorozměrné pole. Prvky pole mohou ovšem být libovolného typu, tedy např. opět pole, a to umožňuje pracovat s vícerozměrnými poli. Příklad deklarace dvojrozměrného pole: int pole2d [10][20]; Uložení v paměti je po řádcích. Ve funkcích, kde je pole parametrem, nemusíme předat nejvyšší rozměr, všechny ostatní ano. Práci s vícerozměrným polem demonstrujme na příkladu: máme překlopit čtvercovou matici podle hlavní diagonály, tedy vyměnit vzájemně prvky a ij a a ji pro všechna i různá od j. void Preklop(float m[][3]) /* preklopeni ctvercove matice 3 x 3 podle hlavni diagonaly */ int i,j; float pom; for(i=0;i<2;i++) for(j=1;j<2;j++) pom=m[i][j]; m[i][j]=m[j][i]; m[j][i]=pom; V hlavním programu jsou deklarace float a[3][3]; int pocet = 3; a funkce je volána příkazem Preklop(a); Nedostatkem je, že může být překlopena jen matice 3x3. Následující funkce je obecnější, využívá toho, že matice je uložena po řádcích, a dovoluje překlopení matice nxn: void Preklop(float *m, int n) /* preklopeni ctvercove matice n x n podle hlavni diagonaly */ int i,j; float pom; for(i=0;i<n-1;i++) for(j=i+1;j<n;j++) pom=m[i*n+j]; m[i*n+j]=m[j*n+i]; m[j*n+i]=pom; V hlavním programu může být deklarace např. float a[4][4]; int pocet=4; a funkce se volá příkazem Preklop(a,pocet); 20 Algoritmy v jazyku C a C++
21 1.2 Jednoduché algoritmy Algoritmus je konečná posloupnost kroků, po jejichž provedení dojdeme k určitému předem vytčenému cíli. Musí splňovat následující vlastnosti: musí být konečný, tzn. skončit po konečném počtu kroků (to je sice požadavek velmi samozřejmý, ale všichni, kdo mají již zkušenost s praktickým programováním, dobře vědí, jak snadno lze udělat chybu, která způsobí uváznutí v nekonečné smyčce). Jednotlivé kroky algoritmu musí být definovány jednoznačně. Proto je nejlepším popisem algoritmu jeho zápis v programovacím jazyce, kde je význam příkazů přesně definován. Často se setkáváme s popisem v přirozeném jazyce, ale zde je nutno na jednoznačnost dávat větší pozor. Každý algoritmus má nějaké vstupy (hodnoty, z nichž vychází) a výstupy, které jsou jeho výsledkem. Požadavek konečnosti musíme z praktických důvodů zesílit a chtít, aby algoritmus skončil v rozumně krátkém čase. Proto má velký význam efektivita algoritmu, které se budeme podrobněji věnovat v odstavci 3.4. Konečně, při zápisu algoritmu v programovacím jazyce bychom měli myslet na to, že čtenářem může být nejen počítač, ale i člověk, a dbát čitelnosti a srozumitelnosti zápisu. Dosáhneme toho jednak dodržováním určitých zvyklostí (např. každý příkaz na jednom řádku) charakteristických pro daný jazyk, a také vhodným využíváním komentářů. Než se pustíme do složitějších algoritmů, procvičme znalosti jazyka C na jednoduchých příkladech: Vyhledání minimálního prvku v nesetříděném poli int hledej(p[ ],n] int i,min,imin; min=p[0]; imin=0; for(i=1;i<n,i++) if (p[i]<min) min=p[i]; imin=i; return imin; /* vracím index prvku s minimální hodnotou */ Vyhledání zadaného prvku v nesetříděném poli int najdi(p[ ],n,x) int i; for(i=0;i<n;i++) if (x==p[i]) return i; return 1; /* hledaný prvek v poli není */ Určení hodnoty Ludolfova čísla pomocí rozvoje pi=4(1-1/3+1/5-1/7+1/9+ ) Asi nás nejdříve napadne uchovávat v paměti poslední dvě aproximace, abychom porovnáním jejich rozdílu s požadovanou přesností 0, zjistili, máme-li pokračovat výpočtem další aproximace. Pak bude zdrojový text vypadat následovně: #include <stdio.h> #include <conio.h> int main() Jazyk C 21
22 double pi1,pi2,a,b,c,q; a=4; b=3; c=-1; pi1=4; pi2= /3.0; while (fabs(pi1-pi2)> ) /* funkce fabs vrací absolutní hodnotu racionálního argumentu */ pi1=pi2; c=-c; b+=2.0; pi2=pi1+c*a/b; printf ("vypoctena hodnota pi je %f\n",pi2); getch(); Pokud se ale zamyslíme, zjistíme, že stačí, budeme-li v paměti uchovávat pouze poslední aproximaci. S požadovanou přesností můžeme srovnávat člen 4/b, o který se liší poslední aproximace od předchozí. Ušetříme použití funkce pro absolutní hodnotu, operaci přiřazení a místo pro 2 proměnné. Program bude navíc jednodušší: /* určení hodnoty Ludolfova čísla */ #include <conio.h> #include <stdio.h> int main() double pi,b,c; b=1; c=1; pi=4; while (4/b> ) c=-c; b+=2; pi+=c*4/b; printf("vypočtená hodnota pi je %fl\n",pi); getch(); Mzdová výčetka Dnes, v době bezhotovostních plateb, se tento algoritmus používá méně často, ale svůj význam tak docela neztratil. Má-li pokladník za úkol vyplatit řadě lidí nějaké částky v hotovosti, musí do banky pro celkovou sumu a musí mít rozpis, v jakých bankovkách resp. mincích mu má banka celkovou částku dát, aby byl schopen všechny částky vyplatit bez problémů s rozměňováním peněz. Předložené řešení, kde zadáváme i platidla, je odolné i vůči případným změnám měny. /* mzdová výčetka */ #include <stdio.h> #include <conio.h> int main() int i,j,castka,soucet; int platidla[12]=5000,2000,1000,500,200,100,50,20,10,5,2,1; int pocet[12]; soucet=0; for (i=0;i<12;i++) 22 Algoritmy v jazyku C a C++
23 pocet[i]=0; printf ("Zadejte castky k vyplate(pro konec -1):\n"); do scanf("%d",&castka); if(castka>0) soucet=soucet+castka; for (i=0;i<12;i++) while (castka>=platidla[i]) castka=castka-platidla[i]; pocet[i]++; while(castka>=0); printf ("soucet: %d\n",soucet); for (i=0;i<12;i++) printf("%d %d\n",platidla[i],pocet[i]); getch(); return 0; Největší společný dělitel dvou čísel Zde použijeme Euklidův algoritmus: od většího z dvojice čísel odečítáme menší tak dlouho, dokud menší není rovno nule. Větší je pak největším společným dělitelem původně zadaných čísel: int nsd(int a,int b) if((a<=0) (b<=0)) return 0; while(a>0) if (a>b) a-=b; else b-=a; if(b==0)return a; return 0; Užitečnost funkcí si uvědomíme, když si uložíme další úkoly: chceme určit nejmenší společný násobek dvou čísel a dále funkci, která upraví zlomek, zadáme-li jí čitatele a jmenovatele. V obou případech se nám hodí funkce pro určení největšího společného dělitele. Oba úkoly přenechám jako cvičení čtenáři Pascalův trojúhelník Máme za úkol zobrazit Pascalův trojúhelník, jehož n-tý řádek představuje koeficienty rozvoje (a+b) n. Aby trojúhelník vypadal jak má, musíme nejprve uvážit rozměr obrazovky, abychom určili, Jazyk C 23
24 kolik řádků můžeme zobrazit a jaká bude největší hodnota zobrazeného koeficientu, protože z té vyplyne, na kolik míst máme koeficienty zobrazovat. Jednoduché řešení, které nás jistě napadne, vypadá takto: /* pascal.c - zobrazí 12 řádků Pascalova trojúhelniku */ #include <stdio.h> #include <conio.h> int main() int p1[13]; int p2[13]; /* hodnoty koeficientů ve dvou po sobě jdoucích řádcích */ int i,j; p1[0]=1; p1[1]=1; /* hodnoty prvního řádku */ for(i=1;i<12;i++) for(j=12;j>=i;j--) printf(" "); for(j=0;j<i;j++) printf("%3d ",p1[j]); printf("\n"); p2[0]=1; for(j=0;j<i;j++) p2[j+1]=p1[j]+p1[j+1]; /* hodnoty řádku počítám z řádku předchozího */ p2[i]=1; for(j=0;j<i+1;j++) p1[j]=p2[j]; getch(); return 0; I zde ovšem zjistíme po hlubším zamyšlení, že hodnoty dalšího řádku mohou být postupujeme-li odzadu vypočteny ve stejném řádku a jedno pole je tedy možno ušetřit. Program je zároveň kratší a jednodušší: /* pascal.c - zobrazi 12 řádků Pascalova trojúhelniku */ #include <stdio.h> #include <conio.h> int main() int radek[13]; int i,j; radek[0]=1; radek[1]=1; for(i=1;i<12;i++) for(j=12;j>=i;j--) printf(" "); for(j=0;j<=i;j++) printf("%3d ",radek[j]); printf("\n"); for(j=i;j>0;j--) radek[j]=radek[j]+radek[j-1]; radek[i+1]=1; getch(); return 0; 24 Algoritmy v jazyku C a C++
25 1.2.7 Kalendář Chceme-li vytvořit počítačem kalendář, potřebujeme především funkci, která pro zadané datum (tedy den, měsíc, rok) určí, který je to den týdne. O to se nyní budeme snažit. Nejprve si zopakujme, co k tomu potřebujeme vědět: od roku 1584 platí u nás gregoriánský kalendář, ve kterém je každý rok dělitelný čtyřmi a nedělitelný stem přestupný. Výjimku představuje rok dělitelný 400, který je přestupný, i když je také dělitelný stem naposledy to byl rok Únor má v přestupném roce 29, v nepřestupném 28 dní, duben, červen, září a listopad mají po 30 dnech, ostatní měsíce 31 dní. Spokojíme-li se s tím, že naše funkce bude použitelná od roku 1600 a prozradíme-li, že byla neděle (kdybychom to nevěděli, bude stačit, víme-li, jaký den je dnes), vytvoříme nejprve funkci, která je schopna určit počet dní mezi dvěma daty. Pomocí ní určíme počet dnů mezi datem a datem, pro který určujeme den týdne. Tento počet modulo sedm udává den týdne. Funkce DenRoku vrací pro zadané datum pořadové číslo dne v roce, a hodí se nám pro vytvoření funkce PocDni, která vrací počet dnů mezi dvěma daty. #include <stdio.h> short y,m,d; int DenRoku(int y, int m, int d); long PocDni(int y1,int m1,int d1,int y2, int m2,int d2); short DenTydne(int y,int m, int d); int DenRoku(int y, int m, int d) int k; k=((m-1)* ) +d; /* počet dnů, které mají dohromady měsíce 1 az m -1 plus den */ if (m>2) k=k-2; /* oprava vypočteného počtu dnů s ohledem na únor */ if ((y%4==0) && (y%100!=0) (y%400==0)) k++; /* zvětšit k pro přestupný rok */ return k; long PocDni(int y1,int m1,int d1,int y2, int m2,int d2) long k; k=365*(y2-y1); /* zhruba počet dnů */ k=k+denroku(y2,m2,d2)-denroku(y1,m1,d1); /* zpřesnění pomocí pořadových čísel */ y2--; y1--; k=k+y2/4-y2/100+y2/400-y1/4+y1/100-y1/400; /* zpřesnění s ohledem na přestupné roky */ return k; short DenTydne(int y,int m, int d) return PocDni(1599,12,26,y,m,d)%7; int main() printf("zadej rok,mesic,den\n"); scanf("%d%d%d",&y,&m,&d); Jazyk C 25
26 switch (DenTydne(y,m,d)) case 0: printf("nedele\n"); break; case 1: printf("pondeli\n"); break; case 2: printf("utery\n"); break; case 3: printf("streda\n"); break; case 4: printf("ctvrtek\n"); break; case 5: printf("patek\n"); break; case 6: printf("sobota\n"); scanf("%d",&m); Pro praktické používání našich funkcí bychom ale měli ještě zajistit, že zadané parametry pro rok, měsíc a den opravdu představují správné datum. Mohli bychom třeba vytvořit funkci, která to ověří. Smysl by také měly některé další funkce, např. pro dané datum a daný počet dnů určit datum, které bude po uplynutí těchto dnů (resp. bylo před). Kalendářní funkce jsou velmi důležité v informačních systémech pojišťoven, bank, ale i výrobních podniků. Možná si čtenáři pamatují problémy, které vznikly v roce 2000 a které měly pouze dvě příčiny: jednak je rok 2000 výjimkou, s jakou se setkáváme jednou za 400 let, za druhé ve starších informačních systémech se šetřilo na nesprávném místě a jako rok se uvádělo pouze poslední dvojčíslí letopočtu. Dnes takové šetření není nutné, vždy uvádějte rok čtyřmi číslicemi! 1.3 Permutace Permutací rozumíme změnu uspořádání prvků a můžeme ji zapsat do dvouřádkové notace (1) Zápis znamená, že prvek 2 zaujme místo prvku 1, prvek 4 zaujme místo prvku 2, prvek 6 místo prvku 3 atd. Je zřejmé, že v tomto zápisu můžeme libovolně měnit pořadí sloupců, aniž by se změnil význam. Můžeme také použít cyklickou notaci, v níž lze permutaci (1) zapsat jako (1 2 4) (3 6) (2) což opět znamená, že z 1 se stane 2, z 2 bude 4, ze 4 bude1. Ze 3 se stane 6 a z 6 bude 3. 5 zůstane na místě, což můžeme, ale nemusíme zapsat. Stejný význam jako (2) ale mají i zápisy (3 6) (1 2 4), (6 3)(2 4 1) a řada dalších. Někdy proto může být vhodné použít kanonickou formu cyklické notace, která jednoznačná je. Dostaneme ji následujícím způsobem: zapíšeme explicitně všechny jednoprvkové cykly; v každém cyklu bude na prvním místě nejmenší prvek; cykly seřadíme v klesajícím pořadí jejich prvních prvků. 26 Algoritmy v jazyku C a C++
27 1.3.1 Násobení permutací Násobení permutací není komutativní. Cykly však můžeme zaměnit, tedy místo (1 2 4)(3 6) napsat (3 6)(1 2 4), jsou-li množiny prvků v cyklech disjunktní. Vynásobíme-li permutaci (1 2 4)(3 6) permutací (1 3 6)(4 5), dostaneme ( ). Součin (1 2 4)(3 6)(1 3 6)(4 5) určujeme následovně: 1 přejde na 2 2 přejde na 4, 4 na 5 3 přejde na 6, 6 na 1 4 přejde na 1, 1 na 3 5 přejde na 4 6 přejde na 3, 3 na 6, tedy 6 zůstane na místě, a konečný výsledek je tedy ( ). Pro tento postup můžeme napsat program zde je: /* nasob_permut1.c */ /* násobení permutací */ /* neprovádí se kontrola vstupu */ #include <stdio.h> #include <conio.h> #define DELKA 18 /* délka zápisu */ int main() char *zapis="(124)(36)(136)(45)"; int i,j,k,m,jeste; int q; /* pro mzv */ char znak,current,start; char oznac[delka]; char vstup[delka]; char vystup[delka]; j=delka; for(i=0;i<j;i++) oznac[i]='0'; vstup[i]=zapis[i]; for(i=0;i<j;i++) if(vstup[i]=='(') oznac[i]='1'; znak=vstup[i+1]; else if(vstup[i]==')') vstup[i]=znak; oznac[i]='1'; /* otevření */ i=0; jeste=1; k=0; while(jeste==1) while(i<j) jeste=0; if (oznac[i]=='0') jeste=1; Jazyk C 27
28 start=vstup[i]; vystup[k]='('; k++; vystup[k]=vstup[i]; oznac[i]=1; for(q=0;q<=k;q++) printf("%c",vystup[q]); /* mzv */ printf("\n"); /* getch(); */ i++; current=vstup[i]; m=i+1; L: while(m<j) if(vstup[m]==current) oznac[m]='1'; m++; current=vstup[m]; m++; if(current!=start) k++; vystup[k]=current; m=0; for(q=0;q<k;q++) printf("%c",vystup[q]); /* mezivýsledky */ printf("\n"); goto L; else k++; vystup[k]=')'; for(q=0;q<k;q++) printf("%c",vystup[q]); /* mezivýsledky */ printf("\n"); k++; i++; for(q=0;q<k;q++) printf("%c",vystup[q]); /* mezivýsledky */ printf("\n"); getch(); Nevýhodou tohoto algoritmu ale je, že zápisem součinu permutací musíme v jeho průběhu projít vícekrát. Algoritmus je také složitý a nepřehledný. Existuje ale algoritmus, který vystačí s jediným průchodem. Zobrazuje jej následující tabulka: ( ) ( 3 6 ) ( ) ( 4 5 ) ) ) ) ) ) ) ) 1 1 ) ) ) Algoritmy v jazyku C a C++
29 Sloupec pod každým znakem cyklické notace uvádí, jakou permutaci představují částečné cykly vpravo od něj; například sloupec pod nejpravější číslicí 6 vyjadřuje permutaci ? Tabulku je možno vytvořit tak, že začneme s identickou permutací vpravo a budeme postupovat zprava doleva. Sloupec pod číslicí x se liší od sloupce vpravo jen v řádku x. Nová hodnota v řádku x je ta, která v předchozí změně zmizela. Program je na první pohled jednodušší, když v něm odstraníme komentář ukrývající tisk mezivýsledků, zobrazí se výše uvedená tabulka. /* nasob_permut2.c */ /* násobení permutací */ /* neprovádí se kontrola vstupu */ #include <stdio.h> #include <conio.h> #define ZAPIS 17 #define PRVKU 7 int main() char *vstup="(124)(36)(136)(45)"; int pom,z,i,j,k; int t[prvku]; for(k=1;k<prvku;k++) t[k]=k; for(i=1;i<prvku;i++) printf("%d",t[i]); printf("\n"); for(k=zapis;k>=0;k--) if (vstup[k]==')') z=0; else if (vstup[k]=='(') t[j]=z; else pom=z; z=t[vstup[k]-48]; t[vstup[k]-48]=pom; if (pom==0) j=vstup[k]-48; /* printf("%2d ",k); for(i=1;i<prvku;i++) printf("%d",t[i]); printf("\n"); */ /* zobraz vystup */ for(i=1;i<prvku;i++) printf("%d",t[i]); printf("\n"); printf("stisknete libovolnou klavesu pro ukonceni\n"); getch(); return 0; Jazyk C 29
30 1.3.2 Inverzní permutace Inverzní permutace P -1 k permutaci P je takové uspořádání, které vrací zpět účinky P. Součin P.P -1 je roven identické permutaci. V [Kn08] můžeme najít dva algoritmy pro nalezení inverzní permutace k permutaci zadané dvouřádkovou notací. Zde upřednostníme úlohu praktičtější: mějme dvě pole, z nichž jedno obsahovalo klíče tvořené očíslováním přirozenými čísly, druhé nějaká data. Podle těchto dat jsme obě pole setřídili a nyní bychom rádi obnovili původní stav. To samozřejmě můžeme provést novým setříděním podle klíčů, ale vzhledem k tomu, že klíče tvoří řada přirozených čísel, je to možné provést jednodušeji a v kratším čase. Jde vlastně rovněž o inverzní permutaci, jen jinak zadanou: /* poradi.c ( inverzní permutace ) */ #define DIM 7 #include <stdio.h> int klice[dim]=3,5,7,1,4,2,6; int data[dim]=2,4,7,8,10,11,13; void vymen(int *x,int*y) int pom; pom=*x; *x=*y; *y=pom; int main() int i; for (i=0; i<dim-1; i++) while (i+1!=klice[i]) vymen (&data[i],&data[klice[i]-1]); vymen (&klice[i],&klice[klice[i]-1]); printf("vysledek:\n"); for (i=0;i<dim;i++) printf("%3d ",klice[i]); printf("\n"); for (i=0;i<dim;i++) printf("%3d ",data[i]); printf("\n"); getch(); return 0; 30 Algoritmy v jazyku C a C++
31 2. Rekurze Funkce je rekurzivní, jestliže obsahuje volání sebe sama (v tomto případě je to přímá rekurze). Jestliže funkce p volá funkci q, a v té je obsaženo volání funkce p, jde o nepřímou rekurzi. Rekurze se vyskytuje často v matematických definicích; příkladem může být definice faktoriálu: a) 0!=1 b) je-li n>0, je n!=n.(n-1)! Všude tam, kde už samotný objekt je definován rekurzivně, je pro práci s ním vhodná rekurze. U rekurze je nutno dbát na to, aby algoritmus byl konečný, v rekurzivní funkci musí existovat větev, která rekurzivní volání neobsahuje, a musí být jisté, že nastane stav, kdy se do této větve dostaneme. 2.1 Hanojské věže Obrázek 2.1: Hanojské věže pro n=4 Klasickou úlohou pro použití rekurze je hlavolam zvaný Hanojské věže. Je tvořen třemi tyčemi, na jedné z nich je navlečeno n kotoučů různých průměrů tak, že hořejší kotouč má vždy menší průměr než kotouč pod ním. Úkolem je přesunout celou věž kotoučů na třetí tyč (s využitím druhé jako pomocné) tak, abychom vždy přemisťovali jeden kotouč, a nikdy ho neumístili na kotouč s průměrem menším. I když jde o hlavolam, je pomocí rekurze snadno řešitelný. Pro n=1 je řešení nasnadě, prostě přemístíme kotouč. Pro n>1 použijeme rekurzi. Označíme-li tyče A, B, C a úkolem je přemístění věže z A na C, je postup následující: 1. Přenes věž o n-1 kotoučích z tyče A na tyč B s využitím tyče C jako pomocné. 2. Přenes nejspodnější kotouč z tyče A na tyč C. 3. Přenes věž o n-1 kotoučích z tyče B na tyč C s využitím tyče A jako pomocné. Nyní by měl zápis algoritmu být srozumitelný až na smysl proměnné counter. Ta slouží ke zjištění hloubky rekurze, tedy počtu rekurzivních volání. Musí být deklarována s atributem static. Statické proměnné nejsou umístěny v zásobníku, ale v datové oblasti programu, a toto místo je společné všem vnořeným rekurzím funkce. Proměnná nemusí být inicializována, statické proměnné inicializuje nulou překladač. Rekurze 31
32 #include <stdio.h> #include <conio.h> int PVez(int vyska,int odkud,int kam,int pomoci) static int counter; counter++; if (vyska > 0) PVez((vyska-1),odkud,pomoci,kam); printf("prenes kotouc z %i na %i\n", odkud,kam); PVez((vyska-1),pomoci,kam,odkud); return counter; int main() int n; int cnt; printf ("Zadej pocet kotoucu: \n"); scanf("%i",&n); cnt=pvez(n,1,2,3); printf ("Pocet volani: %i\n",cnt); getch(); return 0; 2.2 W-křivky Tento odstavec můžete vynechat, aniž byste si tím znesnadnili studium dalšího textu. Vynechání lze dokonce doporučit, pokud nemáte k dispozici knihovnu graphics.h a nemůžete tedy sami experimentovat. Ve Wirthově knize [Wir89] jsou popsány algoritmy pro zobrazení Hilbertovy křivky a Sierpiňského křivky. Zde popíši algoritmus pro zobrazení W-křivky, který je tam zadán jako cvičení. Z funkcí pro grafiku vystačíme se dvěma: moveto(x,y) nastaví počáteční bod se souřadnicemi (x,y) a funkce linerel(a,b) nakreslí úsečku vedoucí z aktuálního bodu (x,y) do bodu (x+a,y+b). Více vědět nemusíme, příkazy na začátku hlavního programu jsou ve všech programech používajících grafiku stejné. W: D C B A D : D C A D C : C B D C B : B A C B A : A D B A Obrázek 2.2: W-křivka 4. řádu Na obrázku 2.2 vidíme W-křivku 4. řádu, na obrázcích 2.4, 2.5, 2.6 W-křivky 1., 2. a 3. řádu. Křivka je uzavřená, tedy základní rekurzivní schéma bude vyjádřeno křivkou otevřenou a 4 části budou spojeny čarami, které nejsou součástí rekurzivního obrazce (na dalších obrázcích jsou znázorněny plnější 32 Algoritmy v jazyku C a C++
C a C++ Algoritmy v jazyku. Jiří Prokop
Algoritmy v jazyku C a C++ Jiří Prokop Seznámení s jazykem C a úvod do C++ Vyhledávání a třídění Datové struktury a práce s grafy Algoritmy z numerické matematiky Kryptologické algoritmy Ukázka knihy z
Ukázka knihy z internetového knihkupectví www.kosmas.cz
Ukázka knihy z internetového knihkupectví www.kosmas.cz U k á z k a k n i h y z i n t e r n e t o v é h o k n i h k u p e c t v í w w w. k o s m a s. c z, U I D : K O S 1 8 0 5 9 6 4 ALGORITMY V JAZYKU
Algoritmy v jazyku C a C++
4 ALGORITMY V JAZYKU C A C++ Algoritmy v jazyku C a C++ praktický průvodce Jiří Prokop Vydala Grada Publishing, a.s. U Průhonu 22, Praha 7 jako svou 3473. publikaci Odpovědný redaktor Zuzana Malečková
Algoritmy v jazyku C a C++
4 ALGORITMY V JAZYKU C A C++ Algoritmy v jazyku C a C++ praktický průvodce Jiří Prokop Vydala Grada Publishing, a.s. U Průhonu 22, Praha 7 jako svou 3473. publikaci Odpovědný redaktor Zuzana Malečková
C a C++ Algoritmy v jazyku. Jiří Prokop
Algoritmy v jazyku C a C++ Jiří Prokop Seznámení s jazykem C a úvod do C++ Vyhledávání a třídění Datové struktury a práce s grafy Algoritmy z numerické matematiky Kryptologické algoritmy Algoritmy v jazyku
C a C++ Algoritmy v jazyku. Jiří Prokop
Algoritmy v jazyku C a C++ Jiří Prokop Seznámení s jazykem C a úvod do C++ Vyhledávání a třídění Datové struktury a práce s grafy Algoritmy z numerické matematiky Kryptologické algoritmy Algoritmy v jazyku
Jazyk C Program v jazyku C má následující strukturu: konstanty nebo proměnné musí Jednoduché datové typy: Strukturované datové typy Výrazy operátory
Jazyk C Program v jazyku C má následující strukturu: Direktivy procesoru Globální definice (platné a známé v celém programu) Funkce Hlavička funkce Tělo funkce je uzavřeno mezi složené závorky { Lokální
Algoritmy v jazyku.
Kniha obsahuje tato témata: Algoritmy pro třídění a vyhledávání Binární vyhledávací stromy, AVL stromy Algoritmy numerické matematiky Algoritmy na grafech, toky v sítích Dynamické programování Kniha vám
Algoritmy v jazyku.
Kniha obsahuje tato témata: Algoritmy pro třídění a vyhledávání Binární vyhledávací stromy, AVL stromy Algoritmy numerické matematiky Algoritmy na grafech, toky v sítích Dynamické programování Kniha vám
Algoritmizace a programování
Algoritmizace a programování Výrazy Operátory Výrazy Verze pro akademický rok 2012/2013 1 Operace, operátory Unární jeden operand, operátor se zapisuje ve většině případů před operand, v některých případech
Algoritmy v jazyku. www.grada.cz
Kniha obsahuje tato témata: Algoritmy pro třídění a vyhledávání Binární vyhledávací stromy, AVL stromy Algoritmy numerické matematiky Algoritmy na grafech, toky v sítích Dynamické programování Kniha vám
9.3.2010 Program převod z desítkové na dvojkovou soustavu: /* Prevod desitkove na binarni */ #include <stdio.h>
9.3.2010 Program převod z desítkové na dvojkovou soustavu: /* Prevod desitkove na binarni */ #include int main(void) { int dcislo, kolikbcislic = 0, mezivysledek = 0, i; int vysledek[1000]; printf("zadejte
1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:
1. lekce 1. Minimální program do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme: #include #include int main() { printf("hello world!\n"); return 0; 2.
Obsah. Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15
Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15 KAPITOLA 1 Úvod do programo vání v jazyce C++ 17 Základní pojmy 17 Proměnné a konstanty 18 Typy příkazů 18 IDE integrované vývojové
8. lekce Úvod do jazyka C 3. část Základní příkazy jazyka C Miroslav Jílek
8. lekce Úvod do jazyka C 3. část Základní příkazy jazyka C Miroslav Jílek 1/41 Základní příkazy Všechny příkazy se píšou malými písmeny! Za většinou příkazů musí být středník (;)! 2/41 Základní příkazy
1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:
1. lekce 1. Minimální program do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme: #include #include int main() { printf("hello world!\n"); return 0; 2.
- jak udělat konstantu long int: L long velka = 78L;
Konstanty (konstatní hodnoty) Např.: - desítkové: 25, 45, 567, 45.678 - osmičkové: 045, 023, 03 vždy začínají 0 - šestnáctkové: 0x12, 0xF2, 0Xcd, 0xff, 0xFF - jak udělat konstantu long int: 245566553L
Programovací jazyk Pascal
Programovací jazyk Pascal Syntaktická pravidla (syntaxe jazyka) přesná pravidla pro zápis příkazů Sémantická pravidla (sémantika jazyka) pravidla, která každému příkazu přiřadí přesný význam Všechny konstrukce
for (i = 0, j = 5; i < 10; i++) { // tělo cyklu }
5. Operátor čárka, - slouží k jistému určení pořadí vykonání dvou příkazů - oddělím-li čárkou dva příkazy, je jisté, že ten první bude vykonán dříve než příkaz druhý. Např.: i = 5; j = 8; - po překladu
Formátové specifikace formátovací řetězce
27.2.2007 Formátové specifikace formátovací řetězce - je to posloupnost podle které překladač pozná jaký formát má výstup mít - posloupnosti začínají znakem % a určující formát vstupu/výstupu - pokud chcete
Funkce, intuitivní chápání složitosti
Příprava studijního programu Informatika je podporována projektem financovaným z Evropského sociálního fondu a rozpočtu hlavního města Prahy. Praha & EU: Investujeme do vaší budoucnosti Funkce, intuitivní
Výrazy a operátory. Operátory Unární - unární a unární + Např.: a +b
Výrazy a operátory i = 2 i = 2; to je výraz to je příkaz 4. Operátory Unární - unární a unární + Např.: +5-5 -8.345 -a +b - unární ++ - inkrement - zvýší hodnotu proměnné o 1 - unární -- - dekrement -
Racionální čísla, operátory, výrazy, knihovní funkce
Příprava studijního programu Informatika je podporována projektem financovaným z Evropského sociálního fondu a rozpočtu hlavního města Prahy. Praha & EU: Investujeme do vaší budoucnosti Racionální čísla,
5 Přehled operátorů, příkazy, přetypování
5 Přehled operátorů, příkazy, přetypování Studijní cíl Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně budou uvedeny detaily týkající se operátorů. Doba nutná k nastudování
Čtvrtek 8. prosince. Pascal - opakování základů. Struktura programu:
Čtvrtek 8 prosince Pascal - opakování základů Struktura programu: 1 hlavička obsahuje název programu, použité programové jednotky (knihovny), definice konstant, deklarace proměnných, všechny použité procedury
Úvod do programovacích jazyků (Java)
Úvod do programovacích jazyků (Java) Michal Krátký Katedra informatiky VŠB Technická univerzita Ostrava Úvod do programovacích jazyků (Java), 2007/2008 c 2006 2008 Michal Krátký Úvod do programovacích
Test prvočíselnosti. Úkol: otestovat dané číslo N, zda je prvočíslem
Test prvočíselnosti Úkol: otestovat dané číslo N, zda je prvočíslem 1. zkusit všechny dělitele od 2 do N-1 časová složitost O(N) cca N testů 2. stačí zkoušet všechny dělitele od 2 do N/2 (větší dělitel
Úvod do jazyka C. Ing. Jan Fikejz (KST, FEI) Fakulta elektrotechniky a informatiky Katedra softwarových technologií
1 Fakulta elektrotechniky a informatiky Katedra softwarových technologií 12. října 2009 Organizace výuky Přednášky Teoretické základy dle normy jazyka C Cvičení Praktické úlohy odpřednášené látky Prostřední
Operátory. Základy programování 1 Tomáš Kühr
Operátory Základy programování 1 Tomáš Kühr Operátory a jejich vlastnosti Základní konstrukce (skoro) každého jazyka Z daných operandů vytvoří výsledek, který je možné dále využívat Arita udává počet operandů
Racionální čísla, operátory, výrazy, knihovní funkce
Evropský sociální fond Praha & EU: Investujeme do vaší budoucnosti Racionální čísla, operátory, výrazy, knihovní funkce BI-PA1 Programování a algoritmizace 1 Katedra teoretické informatiky Miroslav Balík
Paměť počítače. alg2 1
Paměť počítače Výpočetní proces je posloupnost akcí nad daty uloženými v paměti počítače Data jsou v paměti reprezentována posloupnostmi bitů (bit = 0 nebo 1) Připomeňme: paměť je tvořena řadou 8-mi bitových
EVROPSKÝ SOCIÁLNÍ FOND. Úvod do PHP PRAHA & EU INVESTUJEME DO VAŠÍ BUDOUCNOSTI
EVROPSKÝ SOCIÁLNÍ FOND Úvod do PHP PRAHA & EU INVESTUJEME DO VAŠÍ BUDOUCNOSTI Úvod do PHP PHP Personal Home Page Hypertext Preprocessor jazyk na tvorbu dokumentů přípona: *.php skript je součást HTML stránky!
Programování v jazyce C pro chemiky (C2160) 3. Příkaz switch, příkaz cyklu for, operátory ++ a --, pole
Programování v jazyce C pro chemiky (C2160) 3. Příkaz switch, příkaz cyklu for, operátory ++ a --, pole Příkaz switch Příkaz switch provede příslušnou skupinu příkazů na základě hodnoty proměnné (celočíselné
6 Příkazy řízení toku
6 Příkazy řízení toku Studijní cíl Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně bude věnována pozornost příkazům pro řízení toku programu. Pro všechny tyto základní
Úvod do programování. Lekce 1
Úvod do programování Lekce 1 Základní pojmy vytvoření spustitelného kódu editor - psaní zdrojových souborů preprocesor - zpracování zdrojových souborů (vypuštění komentářů atd.) kompilátor (compiler) -
IUJCE 07/08 Přednáška č. 4. v paměti neexistuje. v paměti existuje
Konstanty I možnosti: přednostně v paměti neexistuje žádný ; o preprocesor (deklarace) #define KONSTANTA 10 o konstantní proměnná (definice) const int KONSTANTA = 10; příklad #include v paměti
Pole a Funkce. Úvod do programování 1 Tomáš Kühr
Pole a Funkce Úvod do programování 1 Tomáš Kühr (Jednorozměrné) pole u Datová struktura u Lineární u Homogenní = prvky stejného datového typu u Statická = předem určený počet prvků u Pole umožňuje pohodlně
Vektory a matice. Obsah. Aplikovaná matematika I. Carl Friedrich Gauss. Základní pojmy a operace
Vektory a matice Aplikovaná matematika I Dana Říhová Mendelu Brno Obsah 1 Vektory Základní pojmy a operace Lineární závislost a nezávislost vektorů 2 Matice Základní pojmy, druhy matic Operace s maticemi
Úvod do programování. Lekce 5
I N V E S T I C E D O R O Z V O J E V Z D Ě L Á V Á N Í Inovace a zvýšení atraktivity studia optiky reg. č.: CZ.1.07/2.2.00/07.0289 Úvod do programování Lekce 5 Tento projekt je spolufinancován Evropským
Algoritmizace a programování. Ak. rok 2012/2013 vbp 1. ze 44
Algoritmizace a programování Ak. rok 2012/2013 vbp 1. ze 44 Vladimír Beneš Petrovický K101 katedra matematiky, statistiky a informačních technologií vedoucí katedry E-mail: vbenes@bivs.cz Telefon: 251
Zápis programu v jazyce C#
Zápis programu v jazyce C# Základní syntaktická pravidla C# = case sensitive jazyk rozlišuje velikost písmen Tzv. bílé znaky (Enter, mezera, tab ) ve ZK překladač ignoruje každý příkaz končí ; oddělovač
VÝUKOVÝ MATERIÁL. Bratislavská 2166, 407 47 Varnsdorf, IČO: 18383874 www.vosassvdf.cz, tel. +420412372632 Číslo projektu
VÝUKOVÝ MATERIÁL Identifikační údaje školy Vyšší odborná škola a Střední škola, Varnsdorf, příspěvková organizace Bratislavská 2166, 407 47 Varnsdorf, IČO: 18383874 www.vosassvdf.cz, tel. +420412372632
Základní pojmy. Úvod do programování. Základní pojmy. Zápis algoritmu. Výraz. Základní pojmy
Úvod do programování Michal Krátký 1,Jiří Dvorský 1 1 Katedra informatiky VŠB Technická univerzita Ostrava Úvod do programování, 2004/2005 Procesor Procesorem je objekt, který vykonává algoritmem popisovanou
Lekce 9 IMPLEMENTACE OPERAČNÍHO SYSTÉMU LINUX DO VÝUKY INFORMAČNÍCH TECHNOLOGIÍ JAZYK C
Identifikační údaje školy Číslo projektu Název projektu Číslo a název šablony Autor Tematická oblast Číslo a název materiálu Anotace Vyšší odborná škola a Střední škola, Varnsdorf, příspěvková organizace
Ukazka knihy z internetoveho knihkupectvi www.kosmas.cz
Ukazka knihy z internetoveho knihkupectvi www.kosmas.cz Upozornění pro čtenáře a uživatele této knihy Všechna práva vyhrazena. Žádná část této tištěné či elektronické knihy nesmí být reprodukována a šířena
Operátory. Základy programování 1 Martin Kauer (Tomáš Kühr)
Operátory Základy programování 1 Martin Kauer (Tomáš Kühr) Organizační poznámky Formátujte kód přehledně! Pomůžete sobě i mně. Spusťte si vaše programy a zkuste různé vstupy! Pokud program nedává správné
Řídicí struktury. alg3 1
Řídicí struktury Řídicí struktura je programová konstrukce, která se skládá z dílčích příkazů a předepisuje pro ně způsob provedení Tři druhy řídicích struktur: posloupnost, předepisující postupné provedení
Programovací jazyk C++ Hodina 1
Programovací jazyk C++ Hodina 1 Používané překladače Bloodshed Dev C++ http://www.bloodshed.net/devcpp.html CodeBlocks http://www.codeblocks.org pokud nemáte již nainstalovaný překladač, stáhněte si instalátor
Základy jazyka C. Základy programování 1 Martin Kauer (Tomáš Kühr)
Základy jazyka C Základy programování 1 Martin Kauer (Tomáš Kühr) Organizační záležitosti Konzultace Pracovna 5.076 Úterý 15:00 16:30 Emailem martin.kauer@upol.cz Web předmětu http://tux.inf.upol.cz/~kauer/index.php?content=var&class=zp1
KAPITOLA 9 - POKROČILÁ PRÁCE S TABULKOVÝM PROCESOREM
KAPITOLA 9 - POKROČILÁ PRÁCE S TABULKOVÝM PROCESOREM CÍLE KAPITOLY Využívat pokročilé možnosti formátování, jako je podmíněné formátování, používat vlastní formát čísel a umět pracovat s listy. Používat
Operátory, výrazy. Tomáš Pitner, upravil Marek Šabo
Operátory, výrazy Tomáš Pitner, upravil Marek Šabo Operátor "Znaménko operace", pokyn pro vykonání operace při vyhodnocení výrazu. V Javě mají operátory napevno daný význam, nelze je přetěžovat jako v
Algoritmizace a programování. Ak. rok 2012/2013 vbp 1. ze 44
Algoritmizace a programování Ak. rok 2012/2013 vbp 1. ze 44 Vladimír Beneš Petrovický K101 katedra matematiky, statistiky a informačních technologií vedoucí katedry E-mail: vbenes@bivs.cz Telefon: 251
PROGRAMOVÁNÍ V JAZYCE C V PŘÍKLADECH 11 Dynamické datové struktury 11.1 Spojové struktury... 11-1 11.2 Příklad PROG_11-01... 11-2 11.
David Matoušek Programování v jazyce C v pøíkladech Praha 2011 David Matoušek Programování v jazyce C v pøíkladech Bez pøedchozího písemného svolení nakladatelství nesmí být kterákoli èást kopírována nebo
Algoritmizace a programování
Algoritmizace a programování Řídicí struktury jazyka Java Struktura programu Příkazy jazyka Blok příkazů Logické příkazy Ternární logický operátor Verze pro akademický rok 2012/2013 1 Struktura programu
6. Příkazy a řídící struktury v Javě
6. Příkazy a řídící struktury v Javě Příkazy v Javě Příkazy v Javě Řídicí příkazy (větvení, cykly) Přiřazovací příkaz = Řízení toku programu (větvení, cykly) Volání metody Návrat z metody - příkaz return
Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 21.
Vyhledávání doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava Prezentace ke dni 21. září 2018 Jiří Dvorský (VŠB TUO) Vyhledávání 242 / 433 Osnova přednášky
Logické operace. Datový typ bool. Relační operátory. Logické operátory. IAJCE Přednáška č. 3. může nabýt hodnot: o true o false
Logické operace Datový typ bool může nabýt hodnot: o true o false Relační operátory pravda, 1, nepravda, 0, hodnoty všech primitivních datových typů (int, double ) jsou uspořádané lze je porovnávat binární
1.1 Struktura programu v Pascalu Vstup a výstup Operátory a některé matematické funkce 5
Obsah Obsah 1 Programovací jazyk Pascal 1 1.1 Struktura programu v Pascalu.................... 1 2 Proměnné 2 2.1 Vstup a výstup............................ 3 3 Operátory a některé matematické funkce 5
Základy programování (IZP)
Základy programování (IZP) Páté počítačové cvičení Brno University of Technology, Faculty of Information Technology Božetěchova 1/2, 612 66 Brno - Královo Pole Petr Veigend, iveigend@fit.vutbr.cz 5. týden
2 Datové typy v jazyce C
1 Procedurální programování a strukturované programování Charakteristické pro procedurální programování je organizace programu, který řeší daný problém, do bloků (procedur, funkcí, subrutin). Původně jednolitý,
7 Formátovaný výstup, třídy, objekty, pole, chyby v programech
7 Formátovaný výstup, třídy, objekty, pole, chyby v programech Studijní cíl Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně bude věnována pozornost formátovanému výstupu,
Základy programování (IZP)
Základy programování (IZP) Čtvrté počítačové cvičení Brno University of Technology, Faculty of Information Technology Božetěchova 1/2, 612 66 Brno - Královo Pole Petr Veigend, iveigend@fit.vutbr.cz 4.
Maturitní otázky z předmětu PROGRAMOVÁNÍ
Wichterlovo gymnázium, Ostrava-Poruba, příspěvková organizace Maturitní otázky z předmětu PROGRAMOVÁNÍ 1. Algoritmus a jeho vlastnosti algoritmus a jeho vlastnosti, formy zápisu algoritmu ověřování správnosti
Proměnná. Datový typ. IAJCE Cvičení č. 3. Pojmenované místo v paměti sloužící pro uložení hodnoty.
Proměnná Pojmenované místo v paměti sloužící pro uložení hodnoty. K pojmenování můžeme použít kombinace alfanumerických znaků, včetně diakritiky a podtržítka Rozlišují se velká malá písmena Název proměnné
2 Základní funkce a operátory V této kapitole se seznámíme s použitím funkce printf, probereme základní operátory a uvedeme nejdůležitější funkce.
Vážení zákazníci, dovolujeme si Vás upozornit, že na tuto ukázku knihy se vztahují autorská práva, tzv copyright To znamená, že ukázka má sloužit výhradnì pro osobní potøebu potenciálního kupujícího (aby
Funkce pokročilé možnosti. Úvod do programování 2 Tomáš Kühr
Funkce pokročilé možnosti Úvod do programování 2 Tomáš Kühr Funkce co už víme u Nebo alespoň máme vědět... J u Co je to funkce? u Co jsou to parametry funkce? u Co je to deklarace a definice funkce? K
for (int i = 0; i < sizeof(hodnoty) / sizeof(int); i++) { cout<<hodonoty[i]<< endl; } cin.get(); return 0; }
Pole Kdybychom v jazyce C++chtěli načíst větší počet čísel nebo znaků a všechny bylo by nutné všechny tyto hodnoty nadále uchovávat v paměti počítače, tak by bylo potřeba v paměti počítače alokovat stejný
Programování v C++, 2. cvičení
Programování v C++, 2. cvičení 1 1 Fakulta jaderná a fyzikálně inženýrská České vysoké učení technické v Praze Zimní semestr 2018/2019 Přehled 1 Operátory new a delete 2 3 Operátory new a delete minule
Programovací jazyk C(++) C++ area->vm_mm->locked_vm -= len >> PAGE_SHIFT;
Programovací jazyk C(++) static struct vm_area_struct * unmap_fixup(struct mm_struct *mm, struct vm_area_struct *area, unsigned long addr, size_t len, struct vm_area_struct 1. *extra) Základy { struct
Správné vytvoření a otevření textového souboru pro čtení a zápis představuje
f1(&pole[4]); funkci f1 předáváme hodnotu 4. prvku adresu 4. prvku adresu 5. prvku hodnotu 5. prvku symbolická konstanta pro konec souboru je eof EOF FEOF feof Správné vytvoření a otevření textového souboru
Jak v Javě primitivní datové typy a jejich reprezentace. BD6B36PJV 002 Fakulta elektrotechnická České vysoké učení technické
Jak v Javě primitivní datové typy a jejich reprezentace BD6B36PJV 002 Fakulta elektrotechnická České vysoké učení technické Obsah Celočíselný datový typ Reálný datový typ Logický datový typ, typ Boolean
Strukturu lze funkci předat: (pole[i])+j. switch(výraz) velikost ukazatele
Strukturu lze funkci předat: hodnotou i pomocí ukazatele pouze pomocí ukazatele (reference na strukturu) pouze hodnotou (kopie struktury) (pole[i])+j adresa prvku na souřadnicích i, j adresa i-tého řádku
Proměnná a její uložení v paměti
Proměnná a její uložení v paměti Počítačová paměť - řada buněk uložených za sebou, každá buňka má velikost 1 bajt (byte, B) - buňky jsou očíslovány, tato čísla se nazývají adresy Proměnná - data, se kterými
Algoritmizace prostorových úloh
INOVACE BAKALÁŘSKÝCH A MAGISTERSKÝCH STUDIJNÍCH OBORŮ NA HORNICKO-GEOLOGICKÉ FAKULTĚ VYSOKÉ ŠKOLY BÁŇSKÉ - TECHNICKÉ UNIVERZITY OSTRAVA Algoritmizace prostorových úloh Datové struktury Daniela Szturcová
II. Úlohy na vložené cykly a podprogramy
II. Úlohy na vložené cykly a podprogramy Společné zadání pro příklady 1. - 10. začíná jednou ze dvou možností popisu vstupních dat. Je dána posloupnost (neboli řada) N reálných (resp. celočíselných) hodnot.
Programování v C++ 1, 1. cvičení
Programování v C++ 1, 1. cvičení opakování látky ze základů programování 1 1 Fakulta jaderná a fyzikálně inženýrská České vysoké učení technické v Praze Zimní semestr 2018/2019 Přehled 1 2 Shrnutí procvičených
Jednoduché cykly 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45.
Jednoduché cykly Tento oddíl obsahuje úlohy na první procvičení práce s cykly. Při řešení každé ze zde uvedených úloh stačí použít vedle podmíněných příkazů jen jediný cyklus. Nepotřebujeme používat ani
Začínáme vážně programovat. Řídící struktury Přetypování Vstupně výstupní operace Vlastní tvorba programů
Začínáme vážně programovat Řídící struktury Přetypování Vstupně výstupní operace Vlastní tvorba programů Podmínky a cykly Dokončení stručného přehledu řídících struktur jazyka C. Složený příkaz, blok Pascalské
Formátová specifikace má tvar (některé sekce nemají smysl pro načítání) %
vstup a výstup na konzolu - vstupním zařízením je klávesnice, výstupním monitor (přístup jako k sériovým zařízením) - spojení s konzolami je nastaveno automaticky na začátku programu - ke konzole je možné
Operační systémy. Cvičení 4: Programování v C pod Unixem
Operační systémy Cvičení 4: Programování v C pod Unixem 1 Obsah cvičení Řídící struktury Funkce Dynamická alokace paměti Ladění programu Kde najít další informace Poznámka: uvedené příklady jsou dostupné
Operační systémy. Cvičení 3: Programování v C pod Unixem
Operační systémy Cvičení 3: Programování v C pod Unixem 1 Obsah cvičení Editace zdrojového kódu Překlad zdrojového kódu Základní datové typy, struktura, ukazatel, pole Načtení vstupních dat Poznámka: uvedené
Opakování programování
Opakování programování HW návaznost - procesor sběrnice, instrukční sada, optimalizace rychlosti, datové typy, operace (matematické, logické, podmínky, skoky, podprogram ) - paměti a periferie - adresování
VZORCE A VÝPOČTY. Autor: Mgr. Dana Kaprálová. Datum (období) tvorby: září, říjen 2013. Ročník: sedmý
Autor: Mgr. Dana Kaprálová VZORCE A VÝPOČTY Datum (období) tvorby: září, říjen 2013 Ročník: sedmý Vzdělávací oblast: Informatika a výpočetní technika 1 Anotace: Žáci se seznámí se základní obsluhou tabulkového
C++ Akademie SH. 2. Prom nné, podmínky, cykly, funkce, rekurze, operátory. Michal Kvasni ka. 20. b ezna Za áte níci C++
C++ Akademie SH 2. Prom nné, podmínky, cykly, funkce, rekurze, operátory Za áte níci C++ 20. b ezna 2011 Obsah 1 Prom nné - primitivní typy Celá ísla ƒísla s pohyblivou desetinnou árkou, typ bool 2 Podmínka
Algoritmizace prostorových úloh
INOVACE BAKALÁŘSKÝCH A MAGISTERSKÝCH STUDIJNÍCH OBORŮ NA HORNICKO-GEOLOGICKÉ FAKULTĚ VYSOKÉ ŠKOLY BÁŇSKÉ - TECHNICKÉ UNIVERZITY OSTRAVA Algoritmizace prostorových úloh Algoritmus Daniela Szturcová Tento
Prohledávání do šířky = algoritmus vlny
Prohledávání do šířky = algoritmus vlny - souběžně zkoušet všechny možné varianty pokračování výpočtu, dokud nenajdeme řešení úlohy průchod stromem všech možných cest výpočtu do šířky, po vrstvách (v každé
int ii char [16] double dd název adresa / proměnná N = nevyužito xxx xxx xxx N xxx xxx N xxx N
Struktura (union) - struktura a union jsou složené typy, které "v sobě" mohou obsahovat více proměnných - struktura obsahuje v každém okamžiku všechny své proměnné, union obsahuje (=je "aktivní") pouze
Lekce 6 IMPLEMENTACE OPERAČNÍHO SYSTÉMU LINUX DO VÝUKY INFORMAČNÍCH TECHNOLOGIÍ JAZYK C
Identifikační údaje školy Číslo projektu Název projektu Číslo a název šablony Autor Tematická oblast Číslo a název materiálu Anotace Vyšší odborná škola a Střední škola, Varnsdorf, příspěvková organizace
Algoritmizace prostorových úloh
INOVACE BAKALÁŘSKÝCH A MAGISTERSKÝCH STUDIJNÍCH OBORŮ NA HORNICKO-GEOLOGICKÉ FAKULTĚ VYSOKÉ ŠKOLY BÁŇSKÉ - TECHNICKÉ UNIVERZITY OSTRAVA Algoritmizace prostorových úloh Algoritmus Daniela Szturcová Tento
ZPRO v "C" Ing. Vít Hanousek. verze 0.3
verze 0.3 Hello World Nejjednoduší program ukazující vypsání textu. #include using namespace std; int main(void) { cout
Ukazatel (Pointer) jako datový typ - proměnné jsou umístěny v paměti na určitém místě (adrese) a zabírají určitý prostor (počet bytů), který je daný
Ukazatel (Pointer) jako datový typ - proměnné jsou umístěny v paměti na určitém místě (adrese) a zabírají určitý prostor (počet bytů), který je daný typem proměnné - ukazatel je tedy adresa společně s
Výrazy, operace, příkazy
Výrazy, operace, příkazy Karel Richta a kol. katedra počítačů FEL ČVUT v Praze Přednášky byly připraveny s pomocí materiálů, které vyrobili Ladislav Vágner, Pavel Strnad Karel Richta, Martin Hořeňovský,
Maticí typu (m, n), kde m, n jsou přirozená čísla, se rozumí soubor mn veličin a jk zapsaných do m řádků a n sloupců tvaru:
3 Maticový počet 3.1 Zavedení pojmu matice Maticí typu (m, n, kde m, n jsou přirozená čísla, se rozumí soubor mn veličin a jk zapsaných do m řádků a n sloupců tvaru: a 11 a 12... a 1k... a 1n a 21 a 22...
Náplň. v.0.03 16.02.2014. - Jednoduché příklady na práci s poli v C - Vlastnosti třídění - Způsoby (algoritmy) třídění
Náplň v.0.03 16.02.2014 - Jednoduché příklady na práci s poli v C - Vlastnosti třídění - Způsoby (algoritmy) třídění Spojení dvou samostatně setříděných polí void Spoj(double apole1[], int adelka1, double
Data, výrazy, příkazy
Data, výrazy, příkazy Karel Richta a kol. katedra počítačů FEL ČVUT v Praze Přednášky byly připraveny s pomocí materiálů, které vyrobili Ladislav Vágner, Pavel Strnad, Martin Hořeňovský, Aleš Hrabalík
24-2-2 PROMĚNNÉ, KONSTANTY A DATOVÉ TYPY TEORIE DATUM VYTVOŘENÍ: 23.7.2013 KLÍČOVÁ AKTIVITA: 02 PROGRAMOVÁNÍ 2. ROČNÍK (PRG2) HODINOVÁ DOTACE: 1
24-2-2 PROMĚNNÉ, KONSTANTY A DATOVÉ TYPY TEORIE AUTOR DOKUMENTU: MGR. MARTINA SUKOVÁ DATUM VYTVOŘENÍ: 23.7.2013 KLÍČOVÁ AKTIVITA: 02 UČIVO: STUDIJNÍ OBOR: PROGRAMOVÁNÍ 2. ROČNÍK (PRG2) INFORMAČNÍ TECHNOLOGIE
1. Převeďte dané číslo do dvojkové, osmičkové a šestnáctkové soustavy: a) 759 10 b) 2578 10
Úlohy- 2.cvičení 1. Převeďte dané číslo do dvojkové, osmičkové a šestnáctkové soustavy: a) 759 10 b) 2578 10 2. Převeďte dané desetinné číslo do dvojkové soustavy (DEC -> BIN): a) 0,8125 10 b) 0,35 10
Pointery II. Jan Hnilica Počítačové modelování 17
Pointery II 1 Pointery a pole Dosavadní způsob práce s poli zahrnoval: definici pole jakožto kolekce proměnných (prvků) jednoho typu, umístěných v paměti za sebou int pole[10]; práci s jednotlivými prvky
Algoritmy I. Cvičení č. 2, 3 ALGI 2018/19
Algoritmy I Cvičení č. 2, 3 1 ALG I, informace Cvičící RNDr. Eliška Ochodková, Ph.D., kancelář EA439 eliska.ochodkova@vsb.cz www.cs.vsb.cz/ochodkova Přednášející doc. Mgr. Jiří Dvorský, Ph.D., kancelář
Ukazatele a pole. Chceme-li vyplnit celé pole nulami, použijeme prázdný inicializátor: 207 Čárka na konci seznamu inicializátorů
Ukazatele a pole 204 Deklarace jednorozměrného pole s inicializací Chceme-li pole v deklaraci inicializovat, zapíšeme seznam inicializátorů jednotlivých prvků do složených závorek: #define N 5 int A[N]