Knihovna kombinatorických funkcí

Rozměr: px
Začít zobrazení ze stránky:

Download "Knihovna kombinatorických funkcí"

Transkript

1 MASARYKOVA UNIVERZITA FAKULTA INFORMATIKY Knihovna kombinatorických funkcí BAKALÁŘSKÁ PRÁCE Jiří Smejkal Brno, jaro 2010

2 Prohlášení Prohlašuji, že tato bakalářská práce je mým původním autorským dílem, které jsem vypracoval samostatně. Všechny zdroje, prameny a literaturu, které jsem při vypracování používal nebo z nich čerpal, v práci řádně cituji s uvedením úplného odkazu na příslušný zdroj. Vedoucí práce: RNDr. Aleš Zlámal ii

3 Poděkování Na tomto místě bych rád poděkoval vedoucímu této práce panu RNDr. Aleši Zlámalovi za vstřícnost a trpělivost. Dále pak mé rodině za podporu ve studiu a všem, kteří se se mnou podílili o své rady a zkušenosti. iii

4 Klíčová slova funkce, knihovna, kombinatorika, permutace, variace, kombinace, jazyk C iv

5 Shrnutí Cílem bakalářské práce je vytvořit kombinatorickou knihovnu pro programovací jazyk C, jejíž funkce mohou sloužit k programování problémů kombinatorické povahy. v

6 Obsah 1 Úvod Konvence pro pojmenování funkcí v jazyce C Popis problematiky Analýza stávajícího systému pojmenování funkcí Trigonometrické funkce Exponenciální a logaritmické funkce Aritmetické funkce Tvorba názvů funkcí pro kombinatorickou knihovnu Tvoření názvů podle funkcionality Zkratky pro typy parametrů a návratové hodnoty Způsob řazení zkratek za sebe Funkce kombinatorické knihovny Permutace Alokace permutace Délka permutace Inicializace permutace typu int Inicializace permutace typu char Typ permutace Tisk permutace Tisk permutace na standardní výstup Tisk permutace do proudu Generování následující permutace Získání permutace podle pořadí Kopírování permutace Porovnání permutací Skládání permutací Cyklický posuv permutace Znaménko permutace Dealokace permutace Bitové permutace Variace a kombinace Počet všech variací, kombinací Alokace variace, kombinace vi

7 3.2.3 Parametry variace, kombinace Inicializace variace, kombinace typu int Inicializace variace, kombinace typu char Tisk variace, kombinace na standardní výstup Tisk variace, kombinace do proudu Generování následující variace Generování následující kombinace Kopírování variace, kombinace Dealokace variace, kombinace Praktické ukázky Problém obchodního cestujícího Výpočet determinantu matice Šifrování komunikace Závěr Literatura vii

8 Kapitola 1 Úvod Knihovny v programovacích jazycích jsou jejich velice důležitou součástí, nebot obsahují velké množství funkcí [1], které jsou programátorovi k dispozici. Ten nemusí vymýšlet algoritmy a funkce, které před ním již někdo vymyslel a implementoval, ale stačí je vyhledat v knihovně a nahrát do svého programu. Samotné nahrání je velice snadné, vystačíme si jediným příkazem a potřebné funkce jsou následně volně přístupné k použití. Mezi standardní knihovny zatím nebyla zařazena kombinatorická knihovna. Dávám si tedy za cíl vytvořit knihovnu, která bude ulehčovat práci s permutacemi, variacemi, kombinacemi a bude obsahovat některé funkce potřebné k programování úloh kombinatorické povahy. Za pomoci známých algoritmů implementuji funkce, které uživatel může použít a u nichž bude mít zaručenou jejich korektnost, nebot naprogramované funkce budou otestovány. Ve druhé kapitole se nachází popis již existujícího modelu standardní knihovny jazyka C, hlavně konvence pro pojmenování funkcí. V novějších jazycích je povoleno přetěžování funkcí (funkce dělající významově totéž, ale s jinými typy parametrů mající stejný název). Uživatel použije jeden název pro funkci, již volá a překladač rozhodne, který typ funkce se zavolá. Rozhodnutí je založeno v tomto případě na typech parametrů. V jazyce C je takováto shoda jmen nepřípustná [2]. Vyskytuje se tedy problém, jak utvořit názvy významově podobných funkcí. Název funkcí vznikne spojením zkratek z následujících věcí: funkcionality, vstupních parametrů a návratové hodnoty funkce. Zřetězením těchto zkratek dává někdy nejasný význam. Největším problémem je však nejednotnost systému, například jednou je typ vstupního parametru na začátku slova, kdežto jindy na konci. Proto zde analizuji starý systém pro kombinatorickou knihovnu a navrhuji nový, který je jednotný a zároveň se příliš neodlišuje od toho, na co už jsou uživatelé zvyklí. Tento kompromis je v ní použit. Třetí kapitola obsahuje výčet všech funkcí, které se nachází v naší kombinatorické knihovně. U každé z funkcí je popsáno k čemu slouží, jaké jsou parametry funkce a návratové hodnoty. Použití funkce je názorně ukázáno na krátkém programu využívající její funkcionalitu. Ve čtvrté kapitole se věnuji ukázkám, jak lze funkce z naší knihovny využít na praktických příkladech a závěr obsahuje celkové hodnocení knihovny s jejím možným rozšířením. 1

9 Kapitola 2 Konvence pro pojmenování funkcí v jazyce C 2.1 Popis problematiky Funkce v programovacích jazycích mají jména, která označují pamět ová místa a pomocí nichž uživatel k daným funkcím přistupuje, aniž by musel používat jejich adresy. V mnohých moderních jazycích je možné definovat několik funkcí se stejným jménem, pokud mají rozdílnou množinu parametrů (alespoň co se jejich množství a typů týče). Této vlastnosti se říká přetěžování funkcí. Když je zavolána přetížená funkce, překladač vybere správnou funkci podle počtu, typů a pořadí argumentů volané funkce [3]. Příklad přetížení funkcí: int fun(int a, int b) return 1; int fun(int a) return 2; int fun(double a) return 3; potom při volání funkce fun tímto způsobem: int x = fun(2, 3); se použije první definice fun kvůli volání funkce s dvěma argumenty, oběma typu int a při volání int x = fun(4.3); se použije třetí definice funkce fun, protože argument přetížené funkce je typu double. V jazyce C je takovéto kolizní pojmenování funkcí nepřípustné a proto je nutné názvy funkcí od sebe odlišit přidáním nějakých znakových řetězců, aby bylo zajištěno jejich různé pojmenování. Předchozí funkce by mohly vypadat v jazyce C třeba takto: int fun2i(int a, int b) return 1; int funi(int a) return 2; int fund(double a) return 3; kde i značí, že argument má být typu int, číslo 2 signalizuje požadavek dvou argumentů, zatímco d značí použití funkce s argumentem typu double. U takto vytvořených názvů funkcí je důležité, aby jejich používání bylo intuitivní a proto by měl v pojmenování funkcí být určitý systém. 2

10 2.2. ANALÝZA STÁVAJÍCÍHO SYSTÉMU POJMENOVÁNÍ FUNKCÍ Při vytváření názvů funkcí se budeme řídit těmito pravidly: vytvoření názvů podle funkcionality určení zkratky pro datové typy argumentů umístění zkratek označující datové typy argumentů zvolení implicitního typu argumentů 2.2 Analýza stávajícího systému pojmenování funkcí Cílem není vytvořit úplně nový a odlišný systém pojmenování, ale aby byl jednotný pro celou knihovnu a přesto se příliš nelišil od stávajících modelů, na které jsou uživatelé používající jazyk C zvyklí. Toho docílíme studií názvů existujících funkcí a odhalením jejich nedostatků se zaměřením hlavně na matematickou knihovnu <math.h> Trigonometrické funkce Ve standardní knihovně jazyka C existují funkce sin, cos, tan, acos, asin, atan, atan2. Všechny jsou pouze ve verzích s datovým typem double. Jejich rozšíření o práci s datovými typy float a long double jsou funkce z knihovny glibc. double sin (double x) Z názvu funkce je na první pohled zřejmé, že funkce počítá sin úhlu x vyjádřeného v radiánech. Výchozí typ parametru a návratové hodnoty je double, pokud není specifikováno jinak. float sinf (float x) Přidání f označuje, že se jedná o funkci pracující s datovým typem float. Analogicky výskyt zkratky l značí práci s datovým typem long double. Zkratka f je přidána na konec názvu funkce. 3

11 2.2. ANALÝZA STÁVAJÍCÍHO SYSTÉMU POJMENOVÁNÍ FUNKCÍ Exponenciální a logaritmické funkce double exp (double x) Zkratka exp je běžně používána v matematické literatuře pro označení exponenciální funkce. Výchozí typ parametru a návratové hodnoty je double, takže zkratka doznačující datový typ double se neuvádí. float expf (float x) Zkratka f značí float a je umístěn na konci názvu, nic se tedy neliší od předchozí funkce sin. float logf (float x) Funkce logaritmu, která pracuje s typem float, což je specifikováno taktéž na konci Aritmetické funkce Ve standardní knihovně nalezneme pro výpočet absolutní hodnoty funkce: abs, labs a fabs pracující s typy int, long int a double, chybí pouze verze s float. int abs (int number) Funkce vrací absolutní hodnotu čísla zadaného jako parametr, proto zkratka abs (absolute). Výchozím typem je int. long int labs (long int number) Zkratka l značí long int právě kvůli výchozímu typu int, což je změna oproti předchozím funkcím, které měli výchozí typ double a proto l znamenalo long double. Výchozím typem je int. double fabs (double number) Oproti ostatním funkcím, které označují f jako float, zde f značí typ double. Tím nastává problém, jak označit float, viz následující funkce. Řešení: dabs nebo raději absd. 4

12 2.3. TVORBA NÁZVŮ FUNKCÍ PRO KOMBINATORICKOU KNIHOVNU float fabsf (float number) Kvůli nevhodnému použití f pro double u funkce fabs je přidáno ještě jedno f na konec. Takovéto řešení není příliš uživatelsky příjemné, bylo by vhodnější použít absf pro float a zároveň absd pro double. Příznak typu je lepší umístit za významové slovo abs, protože například u funkce cabsf, s prototypem float cabsf (complex float z), má tento příznak také na konci. 2.3 Tvorba názvů funkcí pro kombinatorickou knihovnu Po zanalyzovaní funkcí z matematické knihovny a vypozorování určitých vzorů, můžeme nyní pojmenovat funkce naší kombinatorické knihovny, čemuž se věnujeme v této podkapitole Tvoření názvů podle funkcionality Z názvu funkce musí být na první pohled patrný její význam, skládá se proto ze zkratky významového slova. Neuvádí se celý název, aby programátor nebyl nucen vypisovat dlouhý název funkce, ale pouze zkratka vystihující danou funkcionalitu. Podle prefixu každé funkce poznáme, zda funkce pracuje s permutacemi, variacemi nebo kombinacemi. U variací je zvolena předpona var (variation), která může být chápána jako proměnná (variable). Předpona var však nikdy nebude samotná, takže k záměně s variable nedojde. Permutace Variace Kombinace Faktoriál perm var comb fact Tabulka 2.1: Tabulka základních zkratek funkcí Zkratky pro typy parametrů a návratové hodnoty K jednoznačnému označení funkce se do názvu přidávají informace identifikující datový typ, s kterým daná funkce pracuje. Permutace, variace nebo kombinace mohou obsahovat hodnoty s typem int, short int, long int, char a k nim ještě bez znaménkově chápané datové typy, jejichž hodnoty nenabývají záporných hodnot (unsigned int, unsigned short int, unsigned long int, 5

13 2.3. TVORBA NÁZVŮ FUNKCÍ PRO KOMBINATORICKOU KNIHOVNU Inicializace Alokace paměti Dealokace paměti Kopírování Výpis Zjištění velikosti Následující n-tice init alloc free copy print sizeof next Tabulka 2.2: Tabulka zkratek pro specifikace funkcí unsigned char). Reálné datové typy (float, double, long double) nebudeme v kombinatorické knihovně vůbec používat, vystačíme s typy celočíselnými. Jako intuitivní řešení se nabízí vzít počáteční písmena z datového typu. Například pro char by byla zkratka c, pro unsigned int zkratka ui a pro unsigned long int zkratka uli. Pokud jsou operandy typu char nebo int uvedeny bez typového specifikátoru signed nebo unsigned, předpokládá se použití typu signed char, resp. signed int. V případě kompilátoru ANSI C je potřeba ověřit, zda implicitně reprezentuje typ char jako signed char nebo unsigned char [4]. V naší kombinatorické knihovně je vhodnější použít všechny typy implicitně jako unsigned, jelikož permutace, variace nebo kombinace jsou v této knihovně inicializovány bud od nuly nebo od jedné a žádné záporné hodnoty tak nemohou obsahovat. Pro úplnost jsou implementovány i funkce se znaménkovými typy, které obsahují ve zkratce navíc písmeno s od klíčového slova signed. Z důvodu přehlednosti se vynechává uvádění implicitního datového typu int. Stejně jako se neuvádí u trigonometrické funkce sin zkratka pro double, nebo u aritmetické funkce pro výpočet absolutní hodnoty zkratka pro int, tak i zde se vynechává písmeno i pro funkce pracující s datovým typem int. V kombinatorické knihovně se přidávají do názvu funkce zkratky, které jsou znázorněny v tabulce Způsob řazení zkratek za sebe Otázkou je, jak seřadit zkratky za sebe, aby takto vytvořený název byl přehledný a bylo na první pohled zřejmé o jaký druh funkce se jedná. Ke zvýraznění a oddělení zkratek je možné použít způsob zápisu tzv. camelcase, který je používán jako konvence psaní různých identifikátorů v jazyce Java, PHP nebo Ruby. V jazyce C ovšem není tento způsob tvoření názvů používán, stejně jako použití podtržítka. Výsledný název tedy vznikne zřetězením významového slova (viz tabulka 2.1), bližší 6

14 2.3. TVORBA NÁZVŮ FUNKCÍ PRO KOMBINATORICKOU KNIHOVNU Datový typ Zkratka Poznámka int s signed (int) unsigned int short int sh signed short (int) unsigned short int h long int sl signed long (int) unsigned long int l char sc signed char unsigned char c Tabulka 2.3: Tabulka datových typů a jejich zkratek specifikace funkce (tabulka 2.2) a zkratky pro typ parametru funkce (tabulka 2.3). Například inicializace permutace tvořené bezznaménkovými znaky bude vypadat takto: perm + init + c. 7

15 Kapitola 3 Funkce kombinatorické knihovny V této kapitole jsou popsány všechny funkce kombinatorické knihovny, která má název comb.c. Funkce jsou děleny do tří sekcí: funkce pro permutace, variace a kombinace. Většina funkcí je naprogramována v 8 variantách, liší se datovým typem prvků v permutaci, které mohou být typu unsigned int, int, unsigned char, char, unsigned short, short, unsigned long a nebo long. Při použití každé z funkcí si můžeme vybrat mezi objektově orientovanou variantou nebo její alternativou v podobě klasického přístupu. Objektový přístup má uschovanou velikost permutace před samotnou permutací a přístup k ní je řešen funkcí permsizeof, kdežto u klasického přístupu je velikost permutace zadána jako další parametr funkce a do názvu funkce je pro odlišení přidáno písmeno n, které značí nutnost zadání délky permutace (například permninit). Popis funkce se skládá z obecného popisu, kde je uvedeno k čemu funkce slouží, případně obsahuje technické údaje k objasnění, jak je funkce implementována. Dále je uveden prototyp funkce, z něhož je patrný název, jsou popsány parametry a návratová hodnota funkce. K lepšímu pochopení je uvedena názorná ukázka v podobě krátkého programu s jeho výstupem. Při práci s permutacemi, variacemi nebo kombinacemi v jejich objektové variantě je nutné nejprve přidělit pamět funkcemi permalloc, varalloc a comballoc, dále inicializovat vzniklý objekt pomocí funkcí perminit, varinit, případně combinit a teprve potom s nimi lze manipulovat. 3.1 Permutace Permutací z n-prvkové množiny M nebo n-člennou permutací nazýváme každou uspořádanou n-tici navzájem různých prvků, vytvořenou z množiny prvků M. Počet všech permutací z n prvků: P(n) = n = n! [5]. 8

16 3.1. PERMUTACE Nebo můžeme permutace obecněji definovat tímto způsobem: Permutací množiny M nazýváme každé prosté zobrazení množiny M na množinu M. Faktoriálem čísla n nazýváme funkci F na množině všech nezáporných celých čísel, definovanou takto: F(0) = 1, F(n + 1) = (n + 1) F(n) (n N 0 ) Místo F(n) píšeme n!. Pro n 1 je n! = (n - 1) n [5] Alokace permutace Permutace je v paměti reprezentována jako jednorozměrné pole, k jehož alokaci využíváme funkce ze standardní knihovny jazyka C calloc. Alokovaný blok funkcí permalloc má velikost o jedna větší než je požadovaná velikost permutace zadaná jediným vstupním parametrem. První prvek pole je vyhrazen pro uložení velikosti permutace a všechny ostatní pro samotnou permutaci. Vrácen je ukazatel na první prvek permutace, který ve skutečnosti ukazuje až na druhý prvek alokovaného pole. Všechny bity alokovaného pole jsou inicializovány na nulu, jen první prvek pole obsahuje velikost permutace. U funkce permnalloc je pouze dynamicky alokováno pole s velikostí rovnou n. Velikost alokované permutace je omezena datovým typem prvků, které obsahuje, což znázorňuje tabulka 3.1, která udává ke každé funkci maximální počet prvků permutace. U permutací typu unsigned int nebo unsigned long je ještě snížen rozsah na polovinu kvůli použití vstupního parametru typu int, resp long. Alokovat větší permutace stejně není zatím fyzicky možné, protože takovéto permutace by vyžadovaly až 17 GB operační paměti. Při požadavku o alokaci větší permutace než je povoleno, nedochází k přidělení paměti, ale dojde k nastavení externí proměnné errno [6] na hodnotu ERANGE. Název funkce: unsigned int *permalloc(int n) unsigned int *permnalloc(int n) Parametry: Parametr n je celočíselná hodnota, která určí velikost alokované permutace. 9

17 Návratová hodnota: 3.1. PERMUTACE Ukazatel na blok alokované paměti, typ ukazatele záleží na použité funkci (například permalloc vrací ukazatel na unsigned int, permallocsl zase ukazatel na long int). Není-li z nějakého důvodu možné pamět přidělit, funkce vrací nulový ukazatel. #include<stdio.h> #include "comb.h" int main() unsigned int *permutace, n = 10, size = 0; permutace = permalloc(n); size = permsizeof(permutuce); printf("velikost permutace je %d a zabira v pameti %d B.\n", size,1+size*sizeof(unsigned int)); permfree(permutace); return 0; Příklad 3.1.1: Příklad použití funkce permalloc Funkce Prvky datového typu Maximální počet prvků permutace permalloc unsigned int nebo permallocs int nebo permallocc unsigned char 256 permallocsc char 128 permallocl unsigned long permallocsl long int permalloch unsigned short permallocsh short int permnalloc unsigned int nebo permnallocs int nebo permnallocc unsigned char 256 permnallocsc char podle architektury 2B nebo 4B 10

18 3.1. PERMUTACE Funkce Prvky datového typu Maximální počet prvků permutace permnallocl unsigned long permnallocsl long int permnalloch unsigned short permnallocsh short int Tabulka 3.1: Omezení velikosti permutace datovým typem Délka permutace Funkce permsizeof slouží k zjištění velikosti permutace. Velikost je uložena před prvním prvkem permutace, takže je možné délku permutace zpřístupnit indexem -1. Tento přístup se nedoporučuje kvůli reprezentaci největší možné velikosti permutace uložené na tomto místě. Všechny typy bez znaménka používají přímou binární notaci, bez ohledu na to, zda typy bez znaménka používají dvojkovou doplňkovou notaci, jedničkovou doplňkovou notaci nebo přímou notaci. Znaménkový bit se považuje za normální datový bit. To znamená, že slovo o n bitech může reprezentovat celá čísla od 0 do 2 n -1 [6]. Pro uložení velikosti permutace 2 n tam, kde je povoleno zapsat slovo maximálně o velikosti 2 n -1 se využije hodnoty 0, která je funkcí permalloc nastavena pouze v případě hodnoty 2 n. Funkce permsizeof nulu automaticky reprezentuje jako číslo o jedna větší než je horní hranice rozsahu daného typu. Například pole datového typu char může obsahovat pouze hodnoty v rozmezí 0 až 255. Pro velikost permutace 256, kterou není možné v proměnné daného typu zobrazit, značí nula v poli na indexu -1 právě velikost permutace rovnou 256. Název funkce: int permsizeof(unsigned int *perm) Parametry: Parametr perm je ukazatel na první prvek permutace. Návratová hodnota: Funkce permsizeof vrací počet prvků permutace, která byla vytvořena funkcí permalloc. Pokud má permutace nulovou délku nebo vstupní parametr má hodnotu nulového ukazatele, je vrácena 0. 11

19 3.1. PERMUTACE Inicializace permutace typu int Alokované místo v paměti funkcí permalloc obsahuje prvky pole rovné nule. K nastavení počátečních hodnot permutace slouží funkce perminit, která vytvoří identickou permutaci. Pro matematické účely je k dispozici funkce perminit1, ta nastaví identickou permutaci od jedné, kdežto u funkce perminit je počátečním prvkem permutace nula. Pro inicializaci permutace od nuly lze použít její modifikaci perminitex (jako exclusive), u které dojde k vytknutí vybraného prvku permutace a k celkovému zmenšení velikosti o jedna. Funkce má dva parametry, první je ukazatel na permutaci a druhý je vyjmutý prvek n n n n Název funkce: void perminit(unsigned int *perm) void permninit(unsigned int *perm, int n) void perminit1(unsigned int *perm) void permninit1(unsigned int *perm, int n) void permninitex(unsigned int *perm, int t) void permninitex(unsigned int *perm, int t, int n) Parametry: Parametr perm je ukazatel na permutaci, která má být inicializována. Parametr t je prvek, který bude z permutace vytknut. Návratová hodnota: Žádná Inicializace permutace typu char Permutace obsahující znaky lze nastavit pomocí libovolného znaku. Ten pak bude prvním prvkem permutace a na ostatních pozicích permutace budou znaky s ordinální hodnotou o jedna větší než má jeho předchůdce. Název funkce: void perminitc(unsigned char *perm, char init) void permninitc(unsigned char *perm, char init, int n) 12

20 3.1. PERMUTACE Parametry: Parametr perm je ukazatel na permutaci, která má být inicializována. Znaková konstanta init je počátečním prvkem permutace. Návratová hodnota: Žádná. #include<stdio.h> #include "comb.h" int main() unsigned char *permutace, n = 8; permutace = permallocc(n); printf("znakova permutace zacinajici znakem a : \n"); perminitc(permutace, a ); permprintc(permutace); printf("\nznakova permutace zacinajici znakem H : \n"); perminitc(permutace, H ); permprintc(permutace); permfreec(permutace); return 0; Příklad 3.1.2: Příklad použití funkce perminitc Výstup ukázkového příkladu: Znakova permutace zacinajici znakem a : [a, b, c, d, e, f, g, h] Znakova permutace zacinajici znakem H : [H, I, J, K, L, M, N, O] Typ permutace Tato pomocná funkce nám zjistí hodnotu nejmenšího prvku, který se v dané permutaci vyskytuje. Po alokovaní místa v paměti pro uložení permutace a následném nastavení 13

21 3.1. PERMUTACE hodnot, může permutace obsahovat prvky od jedné nebo od nuly. Typem permutace se zde rozumí právě toto nastavení. Název funkce: int permtype(unsigned int *perm) int permntype(unsigned int *perm, int n) Parametry: Parametr perm je ukazatel na první prvek permutace. Návratová hodnota: Funkce permtype vrací hodnotu 0, pokud je permutace inicializována od nuly, hodnotu 1 v případě inicializace permutace od jedné. V ostatních případech vrací funkce hodnotu Tisk permutace Permutaci lze vypsat přímo na standardní výstup nebo je možné ji zapsat do specifikovaného proudu. Formát výpisu číselné permutace je dán jednou ze tří funkcí: permprint2line, permprint nebo permprintcycle. Pro výpis znakové permutace existuje pouze jedna varianta, která vypisuje permutaci jako sekvenci prvků (funkce permprintc). Zápis permutace tabulkou: Funkce permprint2line zobrazuje permutaci konečné množiny S jako tabulku se dvěma řádky tak, jak se to obvykle v matematice píše. V prvním je seznam elementů množiny S a na druhém se nachází obrazy každého z elementů Permutace reprezentovaná polem: Alternativní zobrazení permutace je zjednodušením předchozího výpisu, kde jsou vypsány pouze obrazy elementů (druhý řádek tabulky). Tato reprezentace permutace znázorňuje způsob uložení elementů permutace v poli. První řádek tabulky (vzory elementů permutace) je skryt pod indexy prvků pole. [ ]

22 3.1. PERMUTACE Zápis permutace pomocí nezávislých cyklů: Další způsob zápisu permutací je pomocí nezávislých cyklů. Cykly jsou uzavřeny v kulatých závorkách a vzniknou následujícím způsobem: začneme výběrem některého elementu x z S takového, že π(x) x a zapisujeme sekvenci (x π(x) π(π(x))...) následných obrazů π, dokud obraz nebude x. Množina zapsaných hodnot tvoří orbit elementu x a uzávorkovaný výraz nám udává odpovídající cyklus. Dále pokračujeme výběrem elementu y z S, který nebyl doposud zapsán v žádném z orbitů a zároveň π(y) y, zapíšeme odpovídající cyklus, a tak dále dokud všechny elementy z množiny S nepatří do nějakého cyklu, nebo nejsou pevnými body 1. Definice. Každou permutaci π S n lze rozložit na součin nezávislých cyklů délky alespoň 2. Tento rozklad je až na pořadí činitelů jednoznačný. Zápis výše uvedené permutace pomocí nezávislých cyklů: ( ) ( ) 3 6 Poznámka: v cyklu nejdříve vypisujeme jeho minimální prvek Tisk permutace na standardní výstup Zapíše permutaci v daném formátu na standardní výstup (stdout). Název funkce: void permprint2line(unsigned int *perm) void permnprint2line(unsigned int *perm, int n) void permprint(unsigned int *perm) void permnprint(unsigned int *perm, int n) void permprintcycle(unsigned int *perm) void permnprintcycle(unsigned int *perm, int n) Parametry: Parametr perm je ukazatel na permutaci, která má být vytištěna na standardní výstup. Návratová hodnota: Žádná. 1. elementy permutace, které zůstávají na místě (π(x) = x) 15

23 3.1. PERMUTACE #include<stdio.h> #include "comb.h" int main() unsigned int *permutace, n = 8; permutace = permget(n,4433); // vytvoreni permutace: [0,7,1,6,4,5,3,2] printf("vypis permutace tabulkou: \n"); permprint2line(permutace); printf("\nzjednoduseny vypis permutace: \n"); permprint(permutace); printf("\npermutace vypsana pomoci nezavislych cyklu: \n"); permprintcycles(permutace); permfree(permutace); return 0; Příklad 3.1.3: Příklad použití funkce permprint Výstup ukázkového příkladu: Vypis permutace tabulkou: ( ) ( ) Zjednoduseny vypis permutace: [0, 7, 1, 6, 4, 5, 3, 2] Permutace vypsana pomoci nezavislych cyklu: (1 7 2)(3 6) Tisk permutace do proudu Funkce umožňující uživateli zápis permutace do specifikovaného proudu. Mimo permutace lze do proudu zapsat i textový řetězec, který bude umístěn před výpis permutace. 16

24 3.1. PERMUTACE Název funkce: int permfprint2line(file * stream, char * text, unsigned int *perm) int permfprint(file * stream, char * text, unsigned int *perm) int permfprintcycle(file * stream, char * text, unsigned int *perm) int permnfprint2line(file * stream, char * text, unsigned int *perm, int n) int permnfprint(file * stream, char * text, unsigned int *perm, int n) int permnfprintcycle(file * stream, char * text, unsigned int *perm, int n) Parametry: První parametr stream je ukazatel na objekt FILE, který identifikuje proud pro výpis permutace. Druhý parametr text tvoří uvozovací textový řetězec před výpisem permutace. Parametr perm je ukazatel na permutaci, která má být vytištěna do určeného proudu. Návratová hodnota: Počet znaků, které se posílají do výstupního proudu, pokud nenastane chyba. V případě výskytu chyby je vrácena hodnota EOF, která má ve většině tradičních implementacích hodnotu Generování následující permutace Funkce permnext změní obsah permutace zadané jako jediný parametr tak, že výsledná permutace je lexikograficky větší. Zároveň neexistuje permutace, která by byla větší než původní, ale menší než nově vytvořená. Tato vlastnost nám umožní generovat všechny možné permutace v případě volání funkce na jednotkovou permutaci. Permutace jsou vytvářeny dokud funkce nevrátí hodnotu nula (neexistuje už žádná větší permutace). Řešením, jak vytvořit všech n! permutací se zabýval Trotter [7], který uspořádal jednotlivé transpozice do sekvence tak, aby každé dva prvky, které mají být transponovány byly sousedící. Jiný přístup zvolil Wells, jeho metoda spočívá ve vytvoření nové permutace z předchozí. Stejného principu využívám i v této práci s tím rozdílem, že vytvořené permutace jsou lexikograficky uspořádané. K vytvoření minimálního lexikografického následníka je potřeba nalézt dva prvky, které zaměníme a seřadit určitou podmnožinu prvků permutace. Časová složitost problému seřazení posloupnosti o n prvcích je Θ(n log n). Když ale využijeme skutečnosti, že 17

25 3.1. PERMUTACE #include<stdio.h> #include "comb.h" int main() unsigned int *permutace, n = 8; FILE * pfile = NULL; pfile = fopen("permfprint_example.txt","w"); permutace = permalloc(n); perminit(permutace); permfprint(pfile,"identicka permutace: ", permutace); permfprint(pfile,"", permutace); fclose(pfile); permfree(permutace); return 0; Příklad 3.1.4: Příklad použití funkce permfprint řazená posloupnost je již seřazena sestupně, dosáhneme rychlejších výsledků. K obrácenému seřazení totiž stačí provést reverzi, což znamená prohodit první prvek s posledním, druhý s předposledním atd. Tím se nám časová složitost sníží na n/2. Stále je však otázkou, jak nalézt prvky, které mají být prohozeny. Řešení tohoto problému je popsáno v sekci: Popis algoritmu. Název funkce: int permnext(unsigned int *perm) int permnnext(unsigned int *perm, int n) 18

26 Parametry: 3.1. PERMUTACE Parametr perm je ukazatel na permutaci, ze které se bude vytvářet následující permutace. Návratová hodnota: Pokud existuje lexikograficky větší permutace, než která byla zadána jako vstupní parametr, je vrácena hodnota 1, v opačném případě hodnota 0. Zdrojový kód: int permnext(unsigned int *p) int i, dm, hm, pos, ord = 1; if( p == NULL) return 0; for( pos = permsizeof(p) - 1; pos > 0; pos-- ) for( i = pos - 1; i >= 0 && ord; i-- ) if( p[i] < p[pos] ) /* swap */ p[i] ^= p[pos]; p[pos] ^= p[i]; p[i] ^= p[pos]; /* reverse */ hm = permsizeof(p) - 1; for( dm = i + 1; dm < hm; dm++,hm-- ) p[hm] ^= p[dm]; p[dm] ^= p[hm]; p[hm] ^= p[dm]; return 1; else if( p[i] < p[i+1] ) ord = 0; ord = 1; return 0; 19

27 3.1. PERMUTACE Použité proměnné: Proměnná pos je index prvku pole, jenž má být prohozen s jiným prvkem tak, aby došlo k přechodu na následující permutaci. Pod indexem i hledáme v poli menší prvek než je na pozici pos. Při nalezení této dvojice jsou prvky s indexy i a pos vzájemně prohozeny. Indexy dm a hm označují počáteční a koncový úsek pole, který bude seřazen vzestupně. Hodnota proměnné ord udává, že posloupnost prvků za pozicí s indexem i je sestupně uspořádaná a tudíž můžeme prvky na indexech i a pos prohodit, aniž by došlo k vzniku nesprávné permutace. Popis algoritmu: K vzniku nové permutace hledáme dvojici prvků, které prohodíme. Aby vznikl lexikografický následník, zaměníme větší prvek umístěný v pozici blíže ke konci, s prvkem menším v pozici blíže začátku. Nalezení dvojice prohazovaných prvků probíhá následujícím způsobem: Začínáme porovnávat od posledního prvku s jeho předchůdci. Při hledání menšího prvku si kontrolujeme, zda se za ním nachází sestupně seřazená posloupnost. Pokud tomu tak není, prohození nelze provést, protože by došlo k přeskočení několika možností a při generování všech n! permutací by výsledkem byla jen určitá podmnožina z celkového počtu. Tuto situaci názorně ilustruje následující obrázek, ve kterém nedochází k prohození prvku 4 s prvním menším prvkem 3 (5 < 6 > 4), nebot bychom přeskočili menší permutace: [1, 2, 3, 6, 4, 5] a [1, 2, 3, 6, 5, 4]. Prvek 3 na této pozici můžeme zaměnit s prvkem 4 až v okamžiku, kdy je splněna podmínka seřazené sekvence prvků (6 > 5 > 4) viz obrázek. 20

28 3.1. PERMUTACE Pokud nemůžeme provést prohození prvků at už z důvodu neexistence menšího prvku nebo kvůli neseřazené posloupnosti prvků za nalezeným menším prvkem, posuneme se o jednu pozici doleva a opakujeme porovnávání s předchůdci prvku na této nové pozici. Jakmile můžeme prvky bez problému prohodit, učiníme tak a uspořádáme sekvenci následovanou za menším z nalezených dvou prvků (prvek v pozici blíže začátku). Tato sekvence v případě prohození bude vždy sestupně uspořádaná, jinak nelze prvky prohodit. K setřídění posloupnosti tedy stačí provést reverzi prvků a výsledkem je minimální lexikografický následník zadané permutace. Časová složitost: Počet porovnání je v nejhorším případě roven n 1 i=1 (n i) kde n 1. Nejvíce záměn prvků nastane v případě prohození prvku na první pozici s jakýmkoliv jiným prvkem, pak je seřazena celá posloupnost následovaná za prvním prvkem. Počet prohození je tedy: 1 + (n 1) / 2. #include<stdio.h> #include "comb.h" int main() unsigned int *permutace, n = 4; permutace = permalloc(n); perminit1(permutace); do permprint(permutace); while( permnext(permutace) ); return 0; Příklad 3.1.5: Příklad použití funkce permnext Výstup ukázkového příkladu: [1, 2, 3, 4] [2, 1, 3, 4] [3, 1, 2, 4] [4, 1, 2, 3] [1, 2, 4, 3] [2, 1, 4, 3] [3, 1, 4, 2] [4, 1, 3, 2] [1, 3, 2, 4] [2, 3, 1, 4] [3, 2, 1, 4] [4, 2, 1, 3] [1, 3, 4, 2] [2, 3, 4, 1] [3, 2, 4, 1] [4, 2, 3, 1] 21

29 3.1. PERMUTACE [1, 4, 2, 3] [2, 4, 1, 3] [3, 4, 1, 2] [4, 3, 1, 2] [1, 4, 3, 2] [2, 4, 3, 1] [3, 4, 2, 1] [4, 3, 2, 1] Získání permutace podle pořadí K získání permutace, která je vytvořena podle lexikografického uspořádání v požadovaném pořadí slouží funkce permget. K výpočtu je využita funkce permnext, která generuje permutace do té doby, než je vytvořena správná permutace. Název funkce: unsigned int *permget(int n, int s) unsigned int *permnget(int n, int s) Parametry: Parametr n udává velikost požadované permutace. Podle parametru s se vygeneruje v pořadí s-tá permutace. Návratová hodnota: Ukazatel na nově vytvořenou permutaci Kopírování permutace V případě potřeby vytvořit kopii permutace lze využít funkce permcopy. Při jejím zavolání dojde k alokaci paměti, zkopírování všech prvků původní permutace do nově alokovaného bloku a následně je vrácena adresa zkopírované permutace. Název funkce: unsigned int *permcopy(unsigned int *perm) unsigned int *permncopy(unsigned int *perm, int n) Parametry: Parametr perm je ukazatel na permutaci, z níž se bude vytvářet kopie. Návratová hodnota: Ukazatel na nově vytvořenou kopii původní permutace. 22

30 3.1. PERMUTACE #include<stdio.h> #include "comb.h" int main() unsigned int *permutace, *kopie, n = 8; permutace = permalloc(n); perminit(permutace); kopie = permcopy(permutace); // zaloha permutace permnext(permutace); // vytvoreni nasledujici permutace printf("nove vytvorena permutace (naslednik puvodni): \n"); permprint(permutace); printf("\npredchudce nove vytvorene permutace: \n"); permprint(kopie); permfree(permutace); permfree(kopie); return 0; Příklad 3.1.6: Příklad použití funkce permcopy Výstup ukázkového příkladu: Nove vytvorena permutace (naslednik puvodni): [0, 1, 2, 3, 4, 5, 7, 6] Predchudce nove vytvorene permutace: [0, 1, 2, 3, 4, 5, 6, 7] Porovnání permutací Pro porovnání permutací zavedeme pojem lexikografického uspořádání (slovníkové řazení). Jde o matematický pojem z oboru teorie uspořádání, který formalizuje vlastnosti uspořádání "podle abecedy"[8]. Definice: Lexikografické uspořádání na uspořádáné n-tici X n = [a 1,a 2,...,a n ] : a i X je definováno vztahem [a 1,a 2,...,a n ] Le [b 1,b 2,..., b n ] (a 1 b 1 ) (a 1 = b 1 a 2 b 2 ) (a 1 = b 1 a 2 = b 2 a 3 b 3 )... (a 1 = b 1 a 2 = b 2... a n-1 = b n-1 a n b n ) 23

31 3.1. PERMUTACE Název funkce: int permcmp(unsigned int *p, unsigned int *q) int permncmp(unsigned int *p, unsigned int *q, int n) Parametry: Parametr p a q jsou ukazatele na porovnávané permutace. Návratová hodnota: Číslo -1, 0, 1, je-li p lexikograficky menší, rovno, větší než q Skládání permutací Násobení permutací není v obecném případě komutativní operace, proto rozlišujeme mezi skládáním zleva, či zprava. Ke složení dvou permutací zleva slouží funkce permcompl, permutace lze složit i zprava funkcí permcompr. U komutativních permutací nezáleží, kterou z výše uvedených funkcí použijeme. Zjištění komutativity permutací provádí funkce permiscommutative. Název funkce: int *permcompl(unsigned int *l, unsigned int *r) int *permncompl(unsigned int *l, unsigned int *r, int n) int *permcompr(unsigned int *l, unsigned int *r) int *permncompr(unsigned int *l, unsigned int *r, int n) Parametry: Parametry l a r jsou ukazatele na skládané permutace. Návratová hodnota: Ukazatel na permutaci, která vznikla jako součin dvou permutací. Pokud nelze složit zadané permutace, je vrácen nulový ukazatel. 24

32 3.1. PERMUTACE #include<stdio.h> #include "comb.h" int main() unsigned int *P = NULL, *Q = NULL, n = 8; unsigned int *S_zleva = NULL, *S_zprava = NULL; P = permget(n,9157); Q = permget(n,32859); printf("\np: \n"); permprint2line(p); printf("\nq: \n"); permprint2line(q); S_zleva = permcompl(p, Q); printf("\ns = P * Q : \n"); permprint2line(s_zleva); S_zprava = permcompr(p, Q); printf("\ns = Q * P : \n"); permprint2line(s_zprava); permfree(p); permfree(q); permfree(s_zleva); permfree(s_zprava); return 0; Příklad 3.1.7: Příklad použití funkce permcompl a permcompr Výstup ukázkového příkladu: P: Q: ( ) ( ) ( ) ( ) S = P * Q : ( ) ( ) S = Q * P : ( ) ( ) 25

33 3.1. PERMUTACE Cyklický posuv permutace Zavoláním funkce permshiftl na permutaci dojde k cyklickému posunu prvků o k pozic doleva. Pro cyklický posuv elementů permutace doprava slouží funkce permshiftr. Obrázek níže ilustruje posouvání prvků v permutaci naší funkcí. Jak už z názvu vyplývá, jde o cyklické posuny. Na obrázku cyklicky posouváme osmiprvkovou posloupnost o dvě místa doprava a při tom potřebujeme vykonat dva nezávislé cyklické posuny. Při každém z nich si do cyklu zakomponujeme pomocnou proměnnou, aby nedošlo ke ztrátě informace o jednom z prvků. Tento algoritmus je efektivnější, než kdybychom si vytvořili celou kopii permutace, a její prvky pak vkládali na ty správné pozice. Vyžadovalo by to dvojnásobnou pamět, n přiřazení do kopírované permutace a následných n vložení zpátky. My zde potřebujeme pouze jednu pomocnou proměnnou, do které přiřazujeme prvky pouze tolikrát, kolik je potřeba vykonat cyklů. U permutací délky 2, 3, 5, 7, 11, 13, atd. (velikosti jsou prvočísla) tvoří posun o libovolný počet vždy jen jeden cyklus a tedy jedno přiřazení navíc, celkový počet přiřazení je v tomto případě rovno n + 1. Název funkce: void permshiftl(unsigned int *perm, int k) void permnshiftl(unsigned int *perm, int k, int n) void permshiftr(unsigned int *perm, int k) void permnshiftr(unsigned int *perm, int k, int n) Parametry: Parametr perm je ukazatel na permutaci, kterou cyklicky posuneme o určitý počet míst doleva, či doprava. Parametr k specifikuje počet míst, o kolik se posune každý prvek permutace. Návratová hodnota: Žádná. 26

34 3.1. PERMUTACE #include<stdio.h> #include "comb.h" int main() unsigned int *permutace = NULL, n = 8, k = 1; permutace = permalloc(n); perminit1(permutace); printf("posun o %d misto doprava: \n",k); permprint(permutace); permshiftr(permutace, k); permprint(permutace); perminit1(permutace); printf("\nposun o %d misto doleva: \n",k); permprint(permutace); permshiftl(permutace, k); permprint(permutace); permfree(permutace); return 0; Příklad 3.1.8: Příklad použití funkce permshiftl a permshiftr 27

35 3.1. PERMUTACE Výstup ukázkového příkladu: Posun o 1 misto doprava: [1, 2, 3, 4, 5, 6, 7, 8] [8, 1, 2, 3, 4, 5, 6, 7] Posun o 1 misto doleva: [1, 2, 3, 4, 5, 6, 7, 8] [2, 3, 4, 5, 6, 7, 8, 1] Znaménko permutace Říkáme, že permutace množiny U n = 1, 2,..., n má inverzi, právě když existují takové indexy i, j (i < j), že k i > k j (i, j U n ). Označíme-li v(p) počet všech inverzí v permutaci P, pak permutaci P nazýváme sudou, resp. lichou, právě když v(p) je sudé, resp. liché číslo. Znaménko [ signum ] permutace P je číslo z(p) = ( 1) v(p) [5]. Příklad: Inverze permutace [3, 1, 2, 5, 4] jsou vyznačeny obloučkem. Název funkce: int permsgn(unsigned int *perm) int permnsgn(unsigned int *perm, int n) Parametry: Parametr perm je ukazatel na permutaci, u které zkoumáme její znaménko. Návratová hodnota: Je-li permutace sudá, je vrácena hodnota 1, v případě lichosti permutace je vrácena hodnota -1. Výstup ukázkového příkladu: Znamenko permutace: [1, 2, 3, 4, 5] je +1. Znamenko permutace: [1, 2, 3, 5, 4] je

36 3.1. PERMUTACE #include<stdio.h> #include "comb.h" int main() unsigned int *permutace = NULL, n = 5; permutace = permalloc(n); perminit1(permutace); printf("znamenko permutace: [1, 2, 3, 4, 5] je %+d.\n", permsgn(permutace)); permnext(permutace); printf("znamenko permutace: [1, 2, 3, 5, 4] je %+d.\n", permsgn(permutace)); return 0; Příklad 3.1.9: Příklad použití funkce permsgn Dealokace permutace Funkce permfree uvolní pamět, která byla přidělena funkcí permalloc. Při volání obyčejné funkce free na alokovanou permutaci se neuvolní kus paměti (obsahující údaj o velikosti permutace), který je umístěn před polem. Název funkce: void permfree(unsigned int *perm) Parametry: Parametr perm je ukazatel na permutaci, která má být z paměti uvolněna. Návratová hodnota: Žádná Bitové permutace Mezi permutace můžeme zařadit i ty bitové, kde dochází k permutaci jednotlivých bitů, kdežto u obyčejných permutací jsou permutovány celé prvky pole. K tomuto účelu slouží funkce bitperm, která bere jako první vstupní parametr prvek, jehož bity budou následně permutovány permutací zadanou jako druhý parametr. Funkce bitpermb nám vrátí permutovaný prvek funkcí bitperm do původní podoby. 29

37 3.1. PERMUTACE Pro permutování bitů se využívá dvou bitových operátorů, bitového součinu (AND) a bitové nonekvivalence (XOR). Pomocí bitového součinu se namapujeme postupně na každý bit vstupních dat a ten pak bitovou nonekvivalencí změníme, pokud je to možné (nemůže nám vzniknou bitový vzorek s jiným počtem jedniček a nul, než jaký byl u původního vzorku). Bity, které budou změněny, udává rozdíl každé dvojice sousedících prvků ze zadané permutace a pozice jedniček a nul v původním vzorku. Název funkce: int bitperm(int b, int *perm) int bitpermn(int b, int *perm, int n) int bitpermb(int b, int *perm) int bitpermbn(int b, int *perm, int n) Parametry: Parametr b je prvek, jehož bity chceme permutovat. Parametr perm je ukazatel na permutaci, podle které jsou bity prvku b permutovány. Pokud chceme permutovat všechny bity vstupního údaje, musí mít permutace stejné množství prvků jako je počet bitů prvku b. Přístupné velikosti permutace datového typu int jsou: 8, 16, 24 a 32. Podle těchto velikostí dojde k permutaci spodních 8, 16, 24 nebo všech 32 bitů vstupního prvku. Při jiných velikostech nedochází k žádné permutaci bitů. Návratová hodnota: Prvek b po permutaci jeho bitů. Výstup ukázkového příkladu: Permutace p1 = [3, 7, 2, 6, 1, 5, 0, 4] Permutaci bitu cisla 164 ( ) pomoci p1 vzniklo cislo 52 ( ). Permutace p2 = [7, 5, 3, 1, 6, 4, 2, 0] Permutaci bitu cisla 164 ( ) pomoci p2 vzniklo cislo 25 ( ). 30

38 3.2. VARIACE A KOMBINACE #include<stdio.h> #include "comb.h" int main() int p1[]=3,7,2,6,1,5,0,4; int p2[]=7,5,3,1,6,4,2,0; unsigned int b, n =8; printf("permutace p1 = "); permnprints(p1,n); b = 164; printf("permutaci bitu cisla %d ( ) pomoci p1 vzniklo cislo %d ( ).\n", b, bitpermn(b, p1, n)); printf("\npermutace p2 = "); permnprints(p2,n); printf("permutaci bitu cisla %d ( ) pomoci p2 vzniklo cislo %d ( ).\n", b, bitpermn(b, p2, n)); return 0; Příklad : Příklad použití funkce bitpermn 3.2 Variace a kombinace Variace i kombinace jsou k-tice vybírané z n prvků. Jejich struktura v paměti se liší jen nepatrně, u kombinací jde o jednorozměrné pole obsahující k prvků, kdežto u variací je do pole zařazeno i zbylých n-k nevybraných prvků, umístěných v poli až za vybranou k-ticí. Základní operace s nimi mají stejnou implementaci, ale používají rozdílná jména funkcí (prefix var pro práci s variacemi, prefix comb jde-li o kombinace). Dvojí pojmenování je zvoleno kvůli tomu, aby bylo na první pohled zřejmé o jakou formu k-tice jde (zda-li v ní záleží na pořadí, či nikoliv). Variací k-té třídy z n-prvkové množiny nebo variací k-té třídy z n-prvků nazýváme každou uspořádanou k-tici navzájem různých prvků, vytvořenou z n-prvkové množiny, tj. každý prvek z daných n prvků se v jedné variaci může vyskytnout právě jednou. Počet všech variací k-té třídy z n-prvkové množiny: V(k, n) = n(n 1) (n 2)...(n k + 1) = n! / (n k)!. Kombinací k-té třídy z n-prvkové množiny nebo kombinací k-té třídy z n prvků nazýváme každou k-prvkovou podmnožinu z n-prvkové množiny, tj. u kombinace nepřihlížíme k uspořádání prvků a každý prvek z daných n prvků se v jedné kombinaci může vyskytnout nejvýše jednou. 31

39 3.2. VARIACE A KOMBINACE Počet všech kombinací k-té třídy z n prvků: C(k, n) = n! / k!(n k)! [5] Počet všech variací, kombinací Funkce varcount počítá podle definice celkový počet všech variací. Funkce combcount počítá podle definice celkový počet všech variací. Výpočet však neprobíhá přes výpočet faktoriálů tak, že prvně se spočítá n! a poté dojde k dělení jmenovatelem, ale průběžně se krátí zlomek největším společným dělitelem. Kdyby se neprovádělo krácení ihned, už při velikosti n = 13 by došlo k přetečení datového typu long int a výsledky by byly správné jen pro malé vstupní hodnoty n. I tak jsme ale schopni vrátit jen počet možností menší než , což je omezení dané návratovým typem long int. Název funkce: long varcount(int k, int n) long combcount(int k, int n) Parametry: Parametr k je celočíselná hodnota, která určuje velikost k-tice. Hodnota n značí velikost množiny, ze které lze vybírat prvky. Návratová hodnota: Celkový počet variací (kombinací) řádu k z n prvků. Výstup ukázkového příkladu: Celkovy pocet vsech kombinaci radu 3 ze 6 prvku je 20. Celkovy pocet vsech variaci radu 3 ze 6 prvku je 120. Celkovy pocet vsech kombinaci radu 5 ze 10 prvku je 252. Celkovy pocet vsech variaci radu 5 ze 10 prvku je Max. pocet variaci, ktery lze vypocitat: V(10, 13) = Max. pocet kombinaci, ktery lze vypocitat: K(15, 34) =

40 3.2. VARIACE A KOMBINACE #include<stdio.h> #include "comb.h" int main() int k, n; k = 3; n = 6; printf("celkovy pocet vsech kombinaci radu %d ze %d prvku je %ld.\n", k, n, combcount(k,n)); printf("celkovy pocet vsech variaci radu %d ze %d prvku je %ld.\n\n", k, n, varcount(k,n)); k = 5; n = 10; printf("celkovy pocet vsech kombinaci radu %d ze %d prvku je %ld.\n", k, n, combcount(k,n)); printf("celkovy pocet vsech variaci radu %d ze %d prvku je %ld.\n\n", k, n, varcount(k,n)); k = 10; n = 13; printf("max. pocet variaci, ktery lze vypocitat: V(%d, %d) = %ld.\n", k, n, varcount(k,n)); k = 15; n = 34; printf("max. pocet kombinaci, ktery lze vypocitat: K(%d, %d) = %ld.\n", k, n, combcount(k,n)); return 0; Příklad 3.2.1: Příklad použití funkce varcount a combcount Alokace variace, kombinace Variace k-té třídy z n prvků je v paměti uložena jako pole o velikosti n + 2. U kombinací je velikost alokovaného pole pouze k + 2. Před každou k-ticí jsou umístěny charakteristické informace (počet vybíraných prvků a celková velikost vybírané množiny) a u variací jsou ještě navíc za k-ticí umístěny zbylé prvky, které nebyly zahrnuty do variace. K údajům o velikostech lze přistoupit pomocí funkcí sizeofn a sizeofk s určitým prefixem, které vrací velikost n, resp. velikost k. Název funkce: unsigned int *varalloc(int k, int n) unsigned int *varknalloc(int k, int n) 33

41 3.2. VARIACE A KOMBINACE unsigned int *comballoc(int k, int n) unsigned int *combknalloc(int k, int n) Parametry: Parametr k je celočíselná hodnota, která určuje velikost k-tice. Hodnota n značí velikost množiny, ze které lze vybírat prvky. Návratová hodnota: Ukazatel na blok alokované paměti. Typ ukazatele záleží na použité funkci (například varalloc vrací ukazatel na unsigned int, varallocsl zase ukazatel na long int). Není-li z nějakého důvodu možné pamět přidělit, funkce vrací nulový ukazatel Parametry variace, kombinace Parametry variace se rozumí třída variace (k) a velikost množiny prvků (n), ze které vybíráme její podmnožinu. K zisku velikosti k a n slouží funkce varsizeofk (combsizeofk) resp. varsizeofn (combsizeofn). Parametry k-tic jsou nastaveny při alokaci paměti funkcemi varalloc a comballoc, takže v případě volání funkcí na jinak vytvořené pole budou vráceny nesmyslné výsledky. Název funkce: int varsizeofk(unsigned int *var) int varsizeofn(unsigned int *var) int combsizeofk(unsigned int *comb) int combsizeofn(unsigned int *comb) Parametry: Parametr var (comb) je ukazatel na první prvek k-tice. Návratová hodnota: Funkce varsizeofk a combsizeofk vrací velikost k-tice, neboli počet vybíraných prvků z celkového množství n. Funkce varsizeofn a combsizeofn vrací velikost počáteční množiny n, ze které jsou k-tice vybírány. Pokud má k-tice nulovou délku nebo vstupní parametr má hodnotu nulového ukazatele, je vrácena 0. 34

42 3.2. VARIACE A KOMBINACE Inicializace variace, kombinace typu int Kombinace i variace jsou nastaveny tak, že obsahují nejmenších k-prvků, kde výchozí nejmenší prvek je roven nule, při inicializaci od jedné je možné použít funkci varinit1 nebo combinit1. U variací je kromě k-tice inicializováno i nevybraných n-k prvků. Název funkce: void varinit(unsigned int *var) void varkninit(unsigned int *var, int k, int n) void combinit(unsigned int *comb) void combkninit(unsigned int *comb, int k, int n) Parametry: Parametr var (comb) je ukazatel na variaci (kombinaci), která má být inicializována. Návratová hodnota: Žádná Inicializace variace, kombinace typu char Variace (kombinace) obsahující znaky lze nastavit pomocí libovolného znaku. Ten pak bude prvním prvkem k-tice a na ostatních pozicích budou znaky s ordinální hodnotou o jedna větší než má jeho předchůdce. Název funkce: void varinitc(unsigned char *var, char init) void varkninitc(unsigned char *var, char init, int k, int n) void combinitc(unsigned char *comb, char init) void combkninitc(unsigned char *comb, char init, int k, int n) Parametry: Parametr var (comb) je ukazatel na variaci (kombinaci), která má být inicializována. Znaková konstanta init je počátečním prvkem variace (kombinace). 35

43 3.2. VARIACE A KOMBINACE Návratová hodnota: Žádná. #include<stdio.h> #include "comb.h" int main() unsigned char *variace, n = 8, k = 5; variace = varallocc(k,n); printf("znakova variace zacinajici znakem a : \n"); varinitc(variace, a ); varprintc(variace); printf("\nznakova variace zacinajici znakem H : \n"); varinitc(variace, H ); varprintc(variace); varfreec(variace); return 0; Příklad 3.2.2: Příklad použití funkce varinitc Výstup ukázkového příkladu: Znakova variace zacinajici znakem a : [a, b, c, d, e] Znakova variace zacinajici znakem H : [H, I, J, K, L] Tisk variace, kombinace na standardní výstup Zapíše k-tici na standardní výstup (stdout). Variace jsou vypsány v hranatých závorkách, kdežto prvky kombinace jsou uzavřeny ve složených množinových závorkách, aby se zdůraznilo, že nezáleží na pořadí prvků. Název funkce: void varprint(unsigned int *var) void varknprint(unsigned int *var, int k, int n) void combprint(unsigned int *comb) void combknprint(unsigned int *comb, int k, int n) 36

44 Parametry: 3.2. VARIACE A KOMBINACE Parametr var (comb) je ukazatel na k-tici, která má být vytištěna na standardní výstup. Návratová hodnota: Žádná. #include<stdio.h> #include "comb.h" int main() unsigned int *variace, *kombinace, k = 5, n = 8; variace = varalloc(k,n); varinit(variace); printf("\nvypis variace, kde zalezi na poradi prvku: \n"); varprint(variace); kombinace = comballoc(k,n); combinit(kombinace); printf("\nvypis kombinace, kde nezalezi na poradi prvku: \n"); combprint(kombinace); varfree(variace); combfree(kombinace); return 0; Příklad 3.2.3: Příklad použití funkce varprint a combprint Výstup ukázkového příkladu: Vypis variace, kde zalezi na poradi prvku: [0, 1, 2, 3, 4] Vypis kombinace, kde nezalezi na poradi prvku: 0, 1, 2, 3, Tisk variace, kombinace do proudu Funkce umožňující uživateli zápis k-tice do specifikovaného proudu. Mimo k-tice lze do proudu zapsat i textový řetězec, který bude umístěn před ní. 37

45 3.2. VARIACE A KOMBINACE Název funkce: int varfprint(file * stream, char * text, unsigned int *var) int combfprint(file * stream, char * text, unsigned int *comb) int varknfprint(file * stream, char * text, unsigned int *var, int k, int n) int combknfprint(file * stream, char * text, unsigned int *comb, int k, int n) Parametry: První parametr stream je ukazatel na objekt FILE, který určuje proud pro výpis k-tice. Druhý parametr text tvoří uvozovací textový řetězec před výpisem k-tice. Parametr var (comb) je ukazatel na k-tici, která má být vytištěna do určeného proudu. Návratová hodnota: Počet znaků, které se posílají do výstupního proudu, pokud nenastane chyba. V případě výskytu chyby je vrácena hodnota EOF, která má ve většině tradičních implementacích hodnotu -1. #include<stdio.h> #include "comb.h" int main() unsigned int *variace, k = 5, n = 8; FILE * pfile = NULL; pfile = fopen("varfprint_example.txt","w"); variace =varalloc(k,n); varinit(variace); permfprint(pfile,"nejmensi variace: ", variace); permfprint(pfile,"", variace); fclose(pfile); varfree(variace); return 0; Příklad 3.2.4: Příklad použití funkce varfprint 38

46 3.2. VARIACE A KOMBINACE Obsah souboru varfprint_example.txt: nejmensi variace: [0, 1, 2, 3, 4] [0, 1, 2, 3, 4] Generování následující variace Funkce varnext vytvoří na adrese, která byla zadaná jako jediný vstupní parametr, minimálního lexikografického následníka k dané variaci. Opakovanou aplikací funkce lze generovat všechny lexikograficky uspořádané variace. Další variace vznikne transpozicí dvou prvků. Bud jsou oba prohazované prvky součástí k-tice a nacházejí se ve variaci, nebo se jeden z nich vyskytuje v k-tici (menší prvek) a druhý se tam nevyskytuje (větší prvek). Pak je menší prvek z variace odstraněn a naopak větší prvek zařazen mezi vybranou k-tici. Prvky, které nebyly zahrnuty do variace se nachází na indexech k až n 1 (dále jen za variací), kdežto vybrané prvky tvořící k-tici jsou v poli na indexech 0 až k 1 (dále jen ve variaci). Samotnou transpozicí vznikne lexikograficky větší variace, minimálního zvětšení dosáhneme pomocí vzestupného seřazení prvků od pozice nalezeného menšího prvku až do konce. Podrobnější popis seřazení i nalezení transpozice se nachází v sekci popis algoritmu. Název funkce: int varnext(unsigned int *var) int varknnext(unsigned int *var, int k, int n) Parametry: Parametr var je ukazatel na variaci, ze které se bude vytvářet její následník. Návratová hodnota: Pokud existuje lexikograficky větší variace, než která byla zadána jako vstupní parametr, je vrácena hodnota 1, v opačném případě je vrácena hodnota 0. 39

47 3.2. VARIACE A KOMBINACE Zdrojový kód: int varnext(unsigned int *p) int i, pos, k = varsizeofk(p); for( i = k-1; i >= 0 ; i--) /*zvetseni variace o prvek, ktery je za variaci*/ for( pos = k; pos < varsizeofn(p); pos++) if( (p[i] < p[pos]) ) swap_and_sort(p, i, pos); return 1; /* nepodarilo se zvetsit variaci prvkem za variaci */ /* zkousime ji tedy zvetsit prvkem ve variaci */ for( pos = k-1; pos > i; pos--) if( (p[i] < p[pos]) ) swap_and_sort(p, i, pos); return 1; /* zadna dalsi variace neexistuje, je vracena 0 */ return 0; void swap_and_sort(unsigned int *p, int i, int pos) int dm, hm; /* swap */ p[i] ^= p[pos]; p[pos] ^= p[i]; p[i] ^= p[pos]; /* reverse prvku za variaci*/ 40

48 3.2. VARIACE A KOMBINACE hm = varsizeofn(p)-1; for( dm = varsizeofk(p); dm < hm; dm++,hm--) p[hm] ^= p[dm]; p[dm] ^= p[hm]; p[hm] ^= p[dm]; /* reverse vsech prvku od pozice mensiho prvku az do konce */ hm = varsizeofn(p)-1; for( dm = i+1; dm < hm; dm++,hm--) p[hm] ^= p[dm]; p[dm] ^= p[hm]; p[hm] ^= p[dm]; Použité proměnné: Proměnná pos je index prvku pole, jenž má být prohozen s jiným prvkem tak, aby došlo ke zvětšení variace. Pod indexem i hledáme v poli menší prvek než je na pozici pos. Při nalezení této dvojice jsou prvky s indexy i a pos vzájemně prohozeny. V poli pod indexem k je umístěn první prvek, který nebyl vybrán a tedy se ve variaci nevyskytuje. Indexy dm a hm označují počáteční a koncový úsek pole, který bude seřazen. Popis algoritmu: Nejprve se snažíme zvětšit pozici posledního prvku ve variaci záměnou s vetším prvkem za variací. Prvky za variací jsou uspořádány vzestupně, takže porovnávání probíhá postupně od indexu k do n-1. Pokud nelze provést žádnou záměnu, posuneme se o jednu pozici doleva na předposlední prvek ve variaci a ten opět porovnáváme s prvky za variací. Zde už při neexistenci většího prvku za variací zkoušíme provést záměnu i s prvky nacházející se ve variaci za ním (v tomto případě pouze s posledním prvkem) viz následující obrázek. Tento postup opakujeme dokud nenalezneme dva prvky, které lze prohodit. U maximální variace se už žádné takové dva prvky nenacházejí a proto nedojde ke změně a algoritmus končí. 41

49 3.2. VARIACE A KOMBINACE Jakmile nalezneme správnou dvojici prvků, prohodíme je a seřadíme sekvenci za menším z nalezených prvků (prvek na indexu i). K tomu slouží pomocná funkce swap_and_sort, jejíž druhý a třetí parametr obsahuje indexy prohazovaných prvků. Řazení probíhá nadvakrát, nejprve seřadíme prvky za variací tak, aby byla sekvence sestupná místo vzestupná. A poté následuje vzestupné řazení všech prvků od indexů i+1 až n-1. Seřazením jsem dosáhli vytvoření nejmenšího lexikografického následníka původní variace. Časová složitost v nejhorším případě: Časová složitost pomocné funkce swap_and_sort je 1 + (n k)/2 + (n 1)/2. Počet porovnání je (n k + i) kde 0 i k 1. 42

Algoritmizace a programování

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

Více

9.3.2010 Program převod z desítkové na dvojkovou soustavu: /* Prevod desitkove na binarni */ #include

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

Více

Paměť počítače. alg2 1

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

Více

for (i = 0, j = 5; i < 10; i++) { // tělo cyklu }

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

Více

7 Formátovaný výstup, třídy, objekty, pole, chyby v programech

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,

Více

přetížení operátorů (o)

přetížení operátorů (o) přetížení operátorů (o) - pro vlastní typy je možné přetížit i operátory (tj. definovat vlastní) - pro definici slouží klíčové slovo operator následované typem/znakem operátoru - deklarace pomocí funkčního

Více

Čtvrtek 8. prosince. Pascal - opakování základů. Struktura programu:

Č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

Více

Úvod do jazyka C. Ing. Jan Fikejz (KST, FEI) Fakulta elektrotechniky a informatiky Katedra softwarových technologií

Ú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í

Více

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í 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

Více

Data v počítači. Informační data. Logické hodnoty. Znakové hodnoty

Data v počítači. Informační data. Logické hodnoty. Znakové hodnoty Data v počítači Informační data (elementární datové typy) Logické hodnoty Znaky Čísla v pevné řádové čárce (celá čísla) v pohyblivé (plovoucí) řád. čárce (reálná čísla) Povelová data (instrukce programu)

Více

Základní pojmy. Úvod do programování. Základní pojmy. Zápis algoritmu. Výraz. Základní pojmy

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

Více

Jednoduché cykly 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45.

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

Více

Základy programování. Úloha: Eratosthenovo síto. Autor: Josef Hrabal Číslo: HRA0031 Datum: 28.11.2009 Předmět: ZAP

Základy programování. Úloha: Eratosthenovo síto. Autor: Josef Hrabal Číslo: HRA0031 Datum: 28.11.2009 Předmět: ZAP Základy programování Úloha: Eratosthenovo síto Autor: Josef Hrabal Číslo: HRA0031 Datum: 28.11.2009 Předmět: ZAP Obsah 1 Zadání úkolu: 3 1.1 Zadání:............................... 3 1.2 Neformální zápis:.........................

Více

7. Datové typy v Javě

7. Datové typy v Javě 7. Datové typy v Javě Primitivní vs. objektové typy Kategorie primitivních typů: integrální, boolean, čísla s pohyblivou řádovou čárkou Pole: deklarace, vytvoření, naplnění, přístup k prvkům, rozsah indexů

Více

Algoritmizace a programování

Algoritmizace a programování Algoritmizace a programování Typy Základní (primitivní) datové typy Deklarace Verze pro akademický rok 2012/2013 1 Typy v jazyce Java Základní datové typy (primitivní datové typy) Celočíselné byte, short,

Více

- znakové konstanty v apostrofech, např. a, +, (znak mezera) - proměnná zabírá 1 byte, obsahuje kód příslušného znaku

- znakové konstanty v apostrofech, např. a, +, (znak mezera) - proměnná zabírá 1 byte, obsahuje kód příslušného znaku Znaky - standardní typ char var Z, W: char; - znakové konstanty v apostrofech, např. a, +, (znak mezera) - proměnná zabírá 1 byte, obsahuje kód příslušného znaku - v TP (často i jinde) se používá kódová

Více

Pokročilé programování v jazyce C pro chemiky (C3220) Operátory new a delete, virtuální metody

Pokročilé programování v jazyce C pro chemiky (C3220) Operátory new a delete, virtuální metody Pokročilé programování v jazyce C pro chemiky (C3220) Operátory new a delete, virtuální metody Dynamická alokace paměti Jazyky C a C++ poskytují programu možnost vyžádat si část volné operační paměti pro

Více

KAPITOLA 9 - POKROČILÁ PRÁCE S TABULKOVÝM PROCESOREM

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

Více

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.

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

Více

2 Datové typy v jazyce C

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ý,

Více

Algoritmus. Přesné znění definice algoritmu zní: Algoritmus je procedura proveditelná Turingovým strojem.

Algoritmus. Přesné znění definice algoritmu zní: Algoritmus je procedura proveditelná Turingovým strojem. Algoritmus Algoritmus je schematický postup pro řešení určitého druhu problémů, který je prováděn pomocí konečného množství přesně definovaných kroků. nebo Algoritmus lze definovat jako jednoznačně určenou

Více

Cykly a pole 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116.

Cykly a pole 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. Cykly a pole Tato část sbírky je tvořena dalšími úlohami na práci s cykly. Na rozdíl od předchozího oddílu se zde již v řešeních úloh objevuje více cyklů, ať už prováděných po sobě nebo vnořených do sebe.

Více

Funkce, podmíněný příkaz if-else, příkaz cyklu for

Funkce, podmíněný příkaz if-else, příkaz cyklu for Funkce, podmíněný příkaz if-else, příkaz cyklu for Definice funkce Funkce je pojmenovaná část programu, kterou lze dále zavolat v jiné části programu. V Pythonu je definována klíčovým slovem def. Za tímto

Více

MAXScript výukový kurz

MAXScript výukový kurz MAXScript výukový kurz Díl čtvrtý jazyk MAXScript, část I. Jan Melichar, březen 2008 Jan Melichar (aka JME) strana 1 OBSAH ÚVOD... 4 ZÁKLADNÍ PŘÍKAZY... 5 OPERÁTORY... 6 PROMĚNNÉ... 6 POLE... 7 ZÁVĚREM...

Více

Algoritmizace a programování

Algoritmizace a programování Algoritmizace a programování Řídicí struktury, standardní metody Problematika načítání pomocí Scanner Některé poznámky k příkazům Psaní kódu programu Metody třídy Math Obalové třídy primitivních datových

Více

Maturitní otázky z předmětu PROGRAMOVÁNÍ

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

Více

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ý 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íce

VÝUKOVÝ MATERIÁL. Bratislavská 2166, 407 47 Varnsdorf, IČO: 18383874 www.vosassvdf.cz, tel. +420412372632 Číslo projektu

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

Více

Standardní algoritmy vyhledávací.

Standardní algoritmy vyhledávací. Standardní algoritmy vyhledávací. Vyhledávací algoritmy v C++ nám umožňují vyhledávat prvky v datových kontejnerech podle různých kritérií. Také se podíváme na vyhledávání metodou půlením intervalu (binární

Více

VÝUKOVÝ MATERIÁL. Bratislavská 2166, 407 47 Varnsdorf, IČO: 18383874 www.vosassvdf.cz, tel. +420412372632 Číslo projektu

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

Více

14.4.2010. Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

14.4.2010. Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod. Základy programování (IZAPR) Přednáška 7 Ing. Michael Bažant, Ph.D. Katedra softwarových technologií Kancelář č. 229, Náměstí Čs. legií Michael.Bazant@upce.cz Obsah přednášky 7 Parametry metod, předávání

Více

Testování prvočíselnosti

Testování prvočíselnosti Dokumentace zápočtového programu z Programování II (NPRG031) Testování prvočíselnosti David Pěgřímek http://davpe.net Úvodem V různých oborech (například v kryptografii) je potřeba zjistit, zda je číslo

Více

Odvozené a strukturované typy dat

Odvozené a strukturované typy dat Odvozené a strukturované typy dat Petr Šaloun katedra informatiky FEI VŠB-TU Ostrava 14. listopadu 2011 Petr Šaloun (katedra informatiky FEI VŠB-TU Ostrava) Odvozené a strukturované typy dat 14. listopadu

Více

Více o konstruktorech a destruktorech

Více o konstruktorech a destruktorech Více o konstruktorech a destruktorech Více o konstruktorech a o přiřazení... inicializovat objekt lze i pomocí jiného objektu lze provést přiřazení mezi objekty v původním C nebylo možné provést přiřazení

Více

Ahoj mami. Uložení dat v počítači. Příklady kódování dat. IAJCE Přednáška č. 4

Ahoj mami. Uložení dat v počítači. Příklady kódování dat. IAJCE Přednáška č. 4 Uložení dat v počítači Data = užitečné, zpracovávané informace Kódování (formát) dat = způsob uložení v počítači (nutno vše převést na čísla ve dvojkové soustavě) Příklady kódování dat Text každému znaku

Více

LEKCE 6. Operátory. V této lekci najdete:

LEKCE 6. Operátory. V této lekci najdete: LEKCE 6 Operátory V této lekci najdete: Aritmetické operátory...94 Porovnávací operátory...96 Operátor řetězení...97 Bitové logické operátory...97 Další operátory...101 92 ČÁST I: Programování v jazyce

Více

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 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é

Více

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 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é

Více

Lekce 9 IMPLEMENTACE OPERAČNÍHO SYSTÉMU LINUX DO VÝUKY INFORMAČNÍCH TECHNOLOGIÍ JAZYK C

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

Více

Programy na PODMÍNĚNÝ příkaz IF a CASE

Programy na PODMÍNĚNÝ příkaz IF a CASE Vstupy a výstupy budou vždy upraveny tak, aby bylo zřejmé, co zadáváme a co se zobrazuje. Není-li určeno, zadáváme přirozená čísla. Je-li to možné, používej generátor náhodných čísel vysvětli, co a jak

Více

Dotazy tvorba nových polí (vypočítané pole)

Dotazy tvorba nových polí (vypočítané pole) Téma 2.4 Dotazy tvorba nových polí (vypočítané pole) Pomocí dotazu lze také vytvářet nová pole, která mají vazbu na již existující pole v databázi. Vznikne tedy nový sloupec, který se počítá podle vzorce.

Více

Algoritmizace a programování

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

Více

Datové typy strana 29

Datové typy strana 29 Datové typy strana 29 3. Datové typy Jak již bylo uvedeno, Java je přísně typový jazyk, proto je vždy nutno uvést datový typ datového atributu, formálního parametru metody, návratové hodnoty metody nebo

Více

Výčtový typ strana 67

Výčtový typ strana 67 Výčtový typ strana 67 8. Výčtový typ V této kapitole si ukážeme, jak implementovat v Javě statické seznamy konstant (hodnot). Příkladem mohou být dny v týdnu, měsíce v roce, planety obíhající kolem slunce

Více

1. Programování proti rozhraní

1. Programování proti rozhraní 1. Programování proti rozhraní Cíl látky Cílem tohoto bloku je seznámení se s jednou z nejdůležitější programátorskou technikou v objektově orientovaném programování. Tou technikou je využívaní rozhraní

Více

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 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

Více

Základy algoritmizace a programování

Základy algoritmizace a programování Základy algoritmizace a programování Přednáška 1 Olga Majlingová Katedra matematiky, ČVUT v Praze 21. září 2009 Obsah Úvodní informace 1 Úvodní informace 2 3 4 Organizace předmětu Přednášky 1. 5. Základní

Více

Zadání druhého zápočtového projektu Základy algoritmizace, 2005

Zadání druhého zápočtového projektu Základy algoritmizace, 2005 Zadání druhého zápočtového projektu Základy algoritmizace, 2005 Jiří Dvorský 2 května 2006 Obecné pokyny Celkem je k dispozici 8 zadání příkladů Každý student obdrží jedno zadání Vzhledem k tomu, že odpadly

Více

Výhody a nevýhody jednotlivých reprezentací jsou shrnuty na konci kapitoly.

Výhody a nevýhody jednotlivých reprezentací jsou shrnuty na konci kapitoly. Kapitola Reprezentace grafu V kapitole?? jsme se dozvěděli, co to jsou grafy a k čemu jsou dobré. rzo budeme chtít napsat nějaký program, který s grafy pracuje. le jak si takový graf uložit do počítače?

Více

DSL manuál. Ing. Jan Hranáč. 27. října 2010. V této kapitole je stručný průvodce k tvorbě v systému DrdSim a (v

DSL manuál. Ing. Jan Hranáč. 27. října 2010. V této kapitole je stručný průvodce k tvorbě v systému DrdSim a (v DSL manuál Ing. Jan Hranáč 27. října 2010 V této kapitole je stručný průvodce k tvorbě v systému DrdSim a (v současné době krátký) seznam vestavěných funkcí systému. 1 Vytvoření nového dobrodružství Nejprve

Více

IMPLEMENTACE OPERAČNÍHO SYSTÉMU LINUX DO VÝUKY INFORMAČNÍCH TECHNOLOGIÍ JAZYK C

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

Více

Algoritmy I, složitost

Algoritmy I, složitost A0B36PRI - PROGRAMOVÁNÍ Algoritmy I, složitost České vysoké učení technické Fakulta elektrotechnická v 1.01 Rychlost... Jeden algoritmus (program, postup, metoda ) je rychlejší než druhý. Co ta věta znamená??

Více

Naproti tomu gramatika je vlastně soupis pravidel, jak

Naproti tomu gramatika je vlastně soupis pravidel, jak 1 Kapitola 1 Úvod V přednášce se zaměříme hlavně na konečný popis obecně nekonečných množin řetězců symbolů dané množiny A. Prvkům množiny A budeme říkat písmena, řetězcům (konečným posloupnostem) písmen

Více

45 Plánovací kalendář

45 Plánovací kalendář 45 Plánovací kalendář Modul Správa majetku slouží ke tvorbě obecných ročních plánů činností organizace. V rámci plánu je třeba definovat oblasti činností, tj. oblasti, ve kterých je možné plánovat. Každá

Více

Zápis programu v jazyce C#

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íce

Správné vytvoření a otevření textového souboru pro čtení a zápis představuje

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

Více

1 PRVOCISLA: KRATKY UKAZKOVY PRIKLAD NA DEMONSTRACI BALIKU WEB 1

1 PRVOCISLA: KRATKY UKAZKOVY PRIKLAD NA DEMONSTRACI BALIKU WEB 1 1 PRVOCISLA: KRATKY UKAZKOVY PRIKLAD NA DEMONSTRACI BALIKU WEB 1 1. Prvocisla: Kratky ukazkovy priklad na demonstraci baliku WEB. Nasledujici program slouzi pouze jako ukazka nekterych moznosti a sluzeb,

Více

IUJCE 07/08 Přednáška č. 4. v paměti neexistuje. v paměti existuje

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

Více

Množina v C++ (set, multiset).

Množina v C++ (set, multiset). Množina v C++ (set, multiset). Množina je datová struktura, ve které jsou uloženy nějaké prvky. V množině nesmí být dva stejné prvky. Naopak multimnožina může obsahovat i stejné prvky. Nad množinou lze

Více

Projektč.3dopředmětuIZP. Maticové operace

Projektč.3dopředmětuIZP. Maticové operace Projektč.3dopředmětuIZP Maticové operace 17. prosince 2006 Kamil Dudka, xdudka00@stud.fit.vutbr.cz Fakulta informačních technologií Vysoké Učení Technické v Brně Obsah 1 Úvod 1 2 Analýza problému 1 2.1

Více

PHP tutoriál (základy PHP snadno a rychle)

PHP tutoriál (základy PHP snadno a rychle) PHP tutoriál (základy PHP snadno a rychle) Druhá, vylepšená offline verze. Připravil Štěpán Mátl, http://khamos.wz.cz Chceš se naučit základy PHP? V tom případě si prostuduj tento rychlý průvodce. Nejdříve

Více

ALGORITMIZACE A PROGRAMOVÁNÍ

ALGORITMIZACE A PROGRAMOVÁNÍ Metodický list č. 1 Algoritmus a jeho implementace počítačovým programem Základním cílem tohoto tematického celku je vysvětlení pojmů algoritmus a programová implementace algoritmu. Dále je cílem seznámení

Více

Příklad : String txt1 = new String( Ahoj vsichni! ); //vytvoří instanci třídy String a přiřadí ji vnitřní hodnotu Ahoj vsichni!

Příklad : String txt1 = new String( Ahoj vsichni! ); //vytvoří instanci třídy String a přiřadí ji vnitřní hodnotu Ahoj vsichni! Java práce s řetězci Trochu povídání.. Řetězce jsou v Javě reprezentovány instancemi tříd StringBuffer a String. Tyto třídy jsou součástí balíčku java.lang, tudíž je možno s nimi pracovat ihned bez nutného

Více

KOMBINATORIKA (4.ročník I.pololetí DE, 2.ročník I.pololetí NS)

KOMBINATORIKA (4.ročník I.pololetí DE, 2.ročník I.pololetí NS) KOMBINATORIKA (4.ročník I.pololetí DE,.ročník I.pololetí NS) Kombinatorika je část matematiky, zabývající se uspořádáváním daných prvků podle jistých pravidel do určitých skupin a výpočtem množství těchto

Více

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT Číslo a název šablony Číslo didaktického materiálu Druh didaktického materiálu Autor Jazyk Téma sady didaktických materiálů Téma didaktického materiálu Vyučovací předmět Cílová skupina (ročník) Úroveň

Více

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) 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

Více

Základy algoritmizace a programování

Základy algoritmizace a programování Základy algoritmizace a programování Přednáška 1 Olga Majlingová Katedra matematiky, ČVUT v Praze 19. září 2011 Obsah Úvodní informace 1 Úvodní informace 2 3 4 Doporučená literatura web: http://marian.fsik.cvut.cz/zapg

Více

IUJCE 07/08 Přednáška č. 6

IUJCE 07/08 Přednáška č. 6 Správa paměti Motivace a úvod v C (skoro vždy) ručně statické proměnné o datový typ, počet znám v době překladu o zabírají paměť po celou dobu běhu programu problém velikosti definovaných proměnných jak

Více

PŘETĚŽOVÁNÍ OPERÁTORŮ

PŘETĚŽOVÁNÍ OPERÁTORŮ PŘETĚŽOVÁNÍ OPERÁTORŮ Jazyk C# podobně jako jazyk C++ umožňuje přetěžovat operátory, tj. rozšířit definice některých standardních operátorů na uživatelem definované typy (třídy a struktury). Stejně jako

Více

DATABÁZE MS ACCESS 2010

DATABÁZE MS ACCESS 2010 DATABÁZE MS ACCESS 2010 KAPITOLA 5 PRAKTICKÁ ČÁST TABULKY POPIS PROSTŘEDÍ Spuštění MS Access nadefinovat název databáze a cestu k uložení databáze POPIS PROSTŘEDÍ Nahoře záložky: Soubor (k uložení souboru,

Více

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.

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

Více

Universita Pardubice Fakulta elektrotechniky a informatiky. Mikroprocesorová technika. Semestrální práce

Universita Pardubice Fakulta elektrotechniky a informatiky. Mikroprocesorová technika. Semestrální práce Universita Pardubice Fakulta elektrotechniky a informatiky Mikroprocesorová technika Semestrální práce Jméno: Chmelař Pavel Datum: 14. 5. 2008 Úkol: Příklad č. 1 V paměti dat je uložen blok 8 b čísel se

Více

Nový způsob práce s průběžnou klasifikací lze nastavit pouze tehdy, je-li průběžná klasifikace v evidenčním pololetí a školním roce prázdná.

Nový způsob práce s průběžnou klasifikací lze nastavit pouze tehdy, je-li průběžná klasifikace v evidenčním pololetí a školním roce prázdná. Průběžná klasifikace Nová verze modulu Klasifikace žáků přináší novinky především v práci s průběžnou klasifikací. Pro zadání průběžné klasifikace ve třídě doposud existovaly 3 funkce Průběžná klasifikace,

Více

Funkční objekty v C++.

Funkční objekty v C++. Funkční objekty v C++. Funkční objekt je instance třídy, která má jako svou veřejnou metodu operátor (), tedy operátor pro volání funkce. V dnešním článku si ukážeme jak zobecnit funkci, jak používat funkční

Více

Gymnázium Vysoké Mýto nám. Vaňorného 163, 566 01 Vysoké Mýto

Gymnázium Vysoké Mýto nám. Vaňorného 163, 566 01 Vysoké Mýto Gymnázium Vysoké Mýto nám. Vaňorného 163, 566 01 Vysoké Mýto Registrační číslo projektu Šablona Autor Název materiálu / Druh CZ.1.07/1.5.00/34.0951 III/2 INOVACE A ZKVALITNĚNÍ VÝUKY PROSTŘEDNICTVÍM ICT

Více

Datové typy a struktury

Datové typy a struktury atové typy a struktury Jednoduché datové typy oolean = logická hodnota (true / false) K uložení stačí 1 bit často celé slovo (1 byte) haracter = znak Pro 8-bitový SII kód stačí 1 byte (256 možností) Pro

Více

Postupy práce se šablonami IS MPP

Postupy práce se šablonami IS MPP Postupy práce se šablonami IS MPP Modul plánování a přezkoumávání, verze 1.20 vypracovala společnost ASD Software, s.r.o. dokument ze dne 27. 3. 2013, verze 1.01 Postupy práce se šablonami IS MPP Modul

Více

Architektury počítačů a procesorů

Architektury počítačů a procesorů Kapitola 3 Architektury počítačů a procesorů 3.1 Von Neumannova (a harvardská) architektura Von Neumann 1. počítač se skládá z funkčních jednotek - paměť, řadič, aritmetická jednotka, vstupní a výstupní

Více

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. 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]

Více

Algoritmizace a programování

Algoritmizace a programování Algoritmizace a programování Vyhledávání, vkládání, odstraňování Vyhledání hodnoty v nesetříděném poli Vyhledání hodnoty v setříděném poli Odstranění hodnoty z pole Vkládání hodnoty do pole Verze pro akademický

Více

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT Číslo a název šablony Číslo didaktického materiálu Druh didaktického materiálu Autor Jazyk Téma sady didaktických materiálů Téma didaktického materiálu Vyučovací předmět Cílová skupina (ročník) Úroveň

Více

EXCELentní tipy a triky pro mírně pokročilé. Martina Litschmannová

EXCELentní tipy a triky pro mírně pokročilé. Martina Litschmannová EXCELentní tipy a triky pro mírně pokročilé Martina Litschmannová Obsah semináře definování názvu dynamicky měněné oblasti, kontingenční tabulky úvod, kontingenční tabulky násobné oblasti sloučení, převod

Více

2. úkol MI-PAA. Jan Jůna (junajan) 3.11.2013

2. úkol MI-PAA. Jan Jůna (junajan) 3.11.2013 2. úkol MI-PAA Jan Jůna (junajan) 3.11.2013 Specifikaci úlohy Problém batohu je jedním z nejjednodušších NP-těžkých problémů. V literatuře najdeme množství jeho variant, které mají obecně různé nároky

Více

Programování v jazyce C pro chemiky (C2160) 5. Čtení dat ze souboru

Programování v jazyce C pro chemiky (C2160) 5. Čtení dat ze souboru Programování v jazyce C pro chemiky (C2160) 5. Čtení dat ze souboru Čtení dat ze souboru FILE *f = NULL; char str[10] = ""; float a = 0.0, b = 0.0; Soubor otevíráme v režimu pro čtení "r" f = fopen("/home/martinp/testdata/test1.txt",

Více

Souhrn Apendixu A doporučení VHDL

Souhrn Apendixu A doporučení VHDL Fakulta elektrotechniky a informatiky Univerzita Pardubice Souhrn Apendixu A doporučení VHDL Práce ke zkoušce z předmětu Programovatelné logické obvody Jméno: Jiří Paar Datum: 17. 2. 2010 Poznámka k jazyku

Více

1. Téma 03 - Rozhodování

1. Téma 03 - Rozhodování 1. Téma 03 - Rozhodování Cíl látky Seznámit se a prakticky si vyzkoušet zápis rozhodování v jazyce Java 1.1. Úvod Jednou z nejčastěji používanou konstrukcí při programování je rozhodování. Právě této problematice

Více

Popis ovládání. Po přihlášení do aplikace se objeví navigátor. Navigátor je stromově seřazen a slouží pro přístup ke všem oknům celé aplikace.

Popis ovládání. Po přihlášení do aplikace se objeví navigátor. Navigátor je stromově seřazen a slouží pro přístup ke všem oknům celé aplikace. Popis ovládání 1. Úvod Tento popis má za úkol seznámit uživatele se základními principy ovládání aplikace. Ovládání je možné pomocí myši, ale všechny činnosti jsou dosažitelné také pomocí klávesnice. 2.

Více

Microsoft Excel kopírování vzorců, adresování, podmíněný formát. Mgr. Jan Veverka Střední odborná škola sociální Evangelická akademie

Microsoft Excel kopírování vzorců, adresování, podmíněný formát. Mgr. Jan Veverka Střední odborná škola sociální Evangelická akademie Microsoft Excel kopírování vzorců, adresování, podmíněný formát Mgr. Jan Veverka Střední odborná škola sociální Evangelická akademie Kopírování vzorců v mnoha případech je třeba provést stejný výpočet

Více

Programujeme v softwaru Statistica

Programujeme v softwaru Statistica Programujeme v softwaru Statistica díl druhý Newsletter Statistica ACADEMY Téma: Programování, makra, skripty Typ článku: Návody V tomto článku si ukážeme další možnosti při psaní maker v softwaru Statistica.

Více

Složitost algoritmů. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava

Složitost algoritmů. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava Složitost algoritmů doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava Prezentace ke dni 27. prosince 2015 Jiří Dvorský (VŠB TUO) Složitost algoritmů

Více

PB161 Programování v jazyce C++ Přednáška 9

PB161 Programování v jazyce C++ Přednáška 9 PB161 Programování v jazyce C++ Přednáška 9 Právo friend Přetěžování operátorů Nikola Beneš 16. listopadu 2015 PB161 přednáška 9: friend, přetěžování operátorů 16. listopadu 2015 1 / 30 Reklama PB173 Tematicky

Více

Čísla, reprezentace, zjednodušené výpočty

Čísla, reprezentace, zjednodušené výpočty Čísla, reprezentace, zjednodušené výpočty Přednáška 4 A3B38MMP kat. měření, ČVUT - FEL, Praha J. Fischer A3B38MMP, 2014, J.Fischer, ČVUT - FEL, kat. měření 1 Čísla 4 bitová dec bin. hex. 0 0000 0 1 0001

Více

1 2 3 4 5 6 součet cvičení celkem. známka. Úloha č.: max. bodů: skut. bodů:

1 2 3 4 5 6 součet cvičení celkem. známka. Úloha č.: max. bodů: skut. bodů: Úloha č.: max. bodů: skut. bodů: 1 2 3 4 5 6 součet cvičení celkem 20 12 20 20 14 14 100 známka UPOZORNĚNÍ : a) Písemná zkouška obsahuje 6 úloh, jejichž řešení musí být vepsáno do připraveného formuláře.

Více

IUJCE 07/08 Přednáška č. 1

IUJCE 07/08 Přednáška č. 1 Úvod do předmětu Literatura Záznamy přednášek a vaše poznámky Harbison, S. P., Steele, G. L.: Referenční příručka jazyka C Herout, P.: Učebnice jazyka C Kernighan, B. W., Ritchie, D. M.: The C Programming

Více

Teoretická informatika Tomáš Foltýnek foltynek@pef.mendelu.cz. Algebra Struktury s jednou operací

Teoretická informatika Tomáš Foltýnek foltynek@pef.mendelu.cz. Algebra Struktury s jednou operací Teoretická informatika Tomáš Foltýnek foltynek@pef.mendelu.cz Algebra Struktury s jednou operací Teoretická informatika 2 Proč zavádíme algebru hledáme nástroj pro popis objektů reálného světa (zejména

Více

Čísla a číselné soustavy.

Čísla a číselné soustavy. Čísla a číselné soustavy. Polyadické soustavy. Převody mezi soustavami. Reprezentace čísel. Tomáš Bayer bayertom@natur.cuni.cz Katedra aplikované geoinformatiky a kartografie, Přírodovědecká fakulta UK.

Více

1 Linearní prostory nad komplexními čísly

1 Linearní prostory nad komplexními čísly 1 Linearní prostory nad komplexními čísly V této přednášce budeme hledat kořeny polynomů, které se dále budou moci vyskytovat jako složky vektorů nebo matic Vzhledem k tomu, že kořeny polynomu (i reálného)

Více

Algebraické struktury s jednou binární operací

Algebraické struktury s jednou binární operací 16 Kapitola 1 Algebraické struktury s jednou binární operací 1.1 1. Grupoid, pologrupa, monoid a grupa Chtěli by jste vědět, co jsou to algebraické struktury s jednou binární operací? No tak to si musíte

Více