Distanční opora předmětu: Programování v jazyce C Tématický blok č. 6: Dynamická alokace paměti, typové konstrukce Autor: RNDr. Jan Lánský, Ph.D.
|
|
- Filip Čech
- před 8 lety
- Počet zobrazení:
Transkript
1 Distanční opora předmětu: Programování v jazyce C Tématický blok č. 6: Dynamická alokace paměti, typové konstrukce Autor: RNDr. Jan Lánský, Ph.D. Obsah kapitoly 1 Dynamická alokace paměti 2 Organizace paměti procesu 3 Statické proměnné 4 Struktury 5 Typové konstrukce 5.1 Kombinace typových konstrukcí 5.2 Ukazatel na funkci 5.3 Typedef Studijní cíle Cíle nutné k zahájení studia dalšího tématického bloku Další cíle Znát klíčové pojmy tohoto tématického bloku (alespoň pasivní znalost je podmínkou pro studium dalších bloků). Podle slovního zadání umět napsat a odladit jednoduchý program. Program pracuje se vstupem získaným z parametrů, které byly programu předány z příkazové řádky při jeho zavolání. Použít dynamicky alokovanou paměť, pokud je to pro daný program nezbytné. Umět dynamicky alokovat a uvolnit paměť, umět rozlišit v jakých situacích je dynamická alokace paměti nezbytná. Znalost struktur a přístupu k jejich položkám. Schopnost určit, o jakou typovou konstrukci se jedná, z její definice. Znalost organizace paměti v procesu, včetně určení, co se nachází v jednotlivých částech paměti po spuštění ukázkového zdrojového kódu. Znalost statických proměnných. Znalost ukazatelů na funkce a schopnost je použít. Znalost klíčové slova typedef a schopnost ho použít. Čas potřebný ke studiu 2-4 hodiny na prostudování výukových textů + zodpovězení otázek k rekapitulaci 3-8 hodin na vypracování modelových úloh na PC + POT hodiny na praktické zopakování učiva na PC ( v jiný den) 30 min - 1 hodina na (znovu)zodpovězení otázek k rekapitulaci (v jiný den) Časy jsou hodně individuální a jsou závislé na míře znalostí z předmětu Úvod do programování a Programování a případných programátorských zkušenostech z jiných jazyků.
2 Úvod V tomto bloku probereme následující témata. Na ukázkovém příkladu si vysvětlíme k čemu je užitečná dynamicky alokovaná paměť. Vysvětlíme si, jaké jsou rozdíly při práci s dynamicky alokovanou pamětí oproti paměti staticky alokované. Probereme funkce malloc a free. Vysvětlíme si jak je organizována paměť procesu, jaká data se nacházejí v jeho jednotlivých částech. Vysvětlíme si statické proměnné a jejich použití. Probereme deklaraci struktur a přístup k jejich datovým položkám. Zopakujeme si základní typové konstrukce a naučíme se rozpoznávat složitější kombinace typových konstrukcí. Vysvětlíme se ukazatele na funkce a jejich použití. Probereme používání klíčového slova typedef. Výkladová část Vysvětlivky Červený text Porušením nebo opomenutím takto označených pravidel vznikají těžko odladitelné chyby (zejména pro začínající programátory). Modrý text Doporučení jak programovat v praxi. Často prevence závažných chyb. 1 Dynamická alokace paměti Představme si program, do kterého zadáme jako vstupní parametr jméno souboru, ve kterém jsou uložena celá čísla. Na každém řádku je jedno číslo, první řádek udává počet čísel v souboru. Cílem programu je setřídit tato čísla a tuto setříděnou posloupnost čísel zapsat do jiného souboru. Program bude pracovat následujícím způsobem. Nejprve si z prvního řádku zjistí počet čísel v souboru, a poté ze souboru načte jednotlivá čísla do pole. Pole setřídí a čísla uložená v tomto setříděném poli postupně (v pořadí v jakém se nacházejí v poli) uloží do výstupního souboru. V současné době umíme vytvořit pouze staticky alokované pole (tématicky blok č. 4), jehož velikost musí být známa v době kompilace zdrojových kódů programu. Pokud velikost pole není známá v době kompilace, jedná se o syntaktickou chybu, a program nejde zkompilovat. Při psaní programu, bychom museli tedy odhadnout maximální počet čísel, které budeme umět ze souboru načíst a setřídit. Pokud zvolíme velikost pole malou, třeba 100, nebudeme moci naším programem setřídit soubory, které obsahují více než sto čísel. Pokud naopak zvolíme velikost pole velmi velkou, třeba , bude náš program spotřebovávat pro třídění malých souboru, zbytečně velké množství paměti. Navíc pomocí něj nesetřídíme soubor obsahující například čísel. Naším cílem je využít informaci z prvního řádku souboru, kde je uveden počet čísel v souboru. Chceme vytvořit pole přesně dané velikosti. Statickou alokaci pole nemůžeme
3 použít, protože tuto velikost neznáme v době kompilace zdrojových kódů programu. Využijeme mechanizmus nazvaný dynamická alokace paměti, který nám umožní vytvořit pole požadované délky za běhu programu. Oproti staticky alokované paměti se u dynamicky alokované paměti musíme starat o několik věcí navíc. Při přidělení dynamicky alokované paměti obdržíme ukazatel na její začátek (první byte). Pokud o tento ukazatel nějakým způsobem přijdeme (například necháme ho ukazovat na naprosto jiný kus paměti) a zároveň se jedná o poslední ukazatel na tuto paměť, stává se tato paměť nedostupná až do konce běhu celého programu, kdy je paměť celého programu operačním systémem uvolněna pro použití jinými programy. Ve chvíli, kdy danou dynamicky alokovanou paměť už nepotřebujeme, měli by jsme ji uvolnit pro další použití v rámci našeho programu. Pro uvolnění paměti potřebujeme opět znát ukazatel na její začátek. Pokud máme ukazatel pouze do jejího prostředku (prováděli jsme na něm třeba operaci ++), při pokusu o uvolnění paměti reprezentované tímto ukazatelem dojde k poškození interních datových struktur programu, ve kterých se uchovávají informace o dynamicky přidělené paměti a při dalším pokusu o novou alokaci paměti může dojít k běhové chybě programu. V jazyku C existují dvě funkce pro práci s dynamicky alokovanou pamětí. První z funkcí malloc nám umožňuje dynamicky alokovat (získat od správce paměti) kus paměti požadované velikosti. Ve chvíli kdy s takto získaným blokem paměti už nechceme dále pracovat, uvolníme ho (vrátíme správci paměti) pomocí funkce free. Obě tyto funkce se nacházejí v knihovně malloc.h, kterou nesmíme zapomenout vložit pomocí direktivy #include. V jazyku C++, který budeme probírat příští semestr, je dynamická alokace řešena pomocí operátorů new a delete. Funkce malloc má pouze jeden parametr typu celé číslo, který udává jak velký kus paměti chceme získat. Pokud chceme dynamicky alokovat například pole datového typu int o velikosti 20 prvků, musíme nejprve spočítat jeho předpokládanou velikost a o takto velký kus paměti požádat pomocí funkce malloc. Velikost datového typu zjistíme pomocí operátoru sizeof. Jak víme z tématického bloku č. 3, velikost datových typů se může měnit v závislosti na typu překladače. Jedinou výjimkou je datový typ char, u něhož si můžeme být jistí jeho velikostí 1 byte. Velikost pole získáme vynásobením velikosti datového typu jednotlivého prvku pole s počtem prvků v poli. Na slajdu č. 76 napravo nahoře vidíme zdrojový kód pro dynamickou alokaci pole 20 prvků typu int. Funkce malloc vrací návratovou hodnotu typu void *, ukazatel na kus paměti, která nemá svůj typ. V jazyku C při použití ukazatele na typ void na pravé straně přiřazovacího příkazu se tento ukazatel automaticky přetypuje na ukazatel na konkrétní datový typ daný proměnnou na levé straně přiřazení. Protože však používáme kompilátor jazyka C++, ve kterém se tato automatická konverze neprovádí, musíme provést přetypování explicitně, jak je znázorněno v bublině uprostřed slajdu č. 76. Vrácená dynamicky alokovaná paměť je vždy neinicializovaná, obsahuje neznámé náhodné hodnoty. Návratovou hodnotou funkce malloc je ukazatel na dynamicky alokovaný kus paměti. Dostupná paměť však není neomezená, a může se nám stát, že jsme již veškerou paměť určenou operačním systémem pro náš program vyčerpali a další nám nebude přidělena. Představme si cyklus ve kterém opakovaně požadujeme paměť o velikosti 1 GB. V případě, že se alokace nepovedla, a paměť nám nebyla přidělena, je návratovou hodnotou nulový ukazatel. Po každém zavolání funkce malloc bychom měli testovat jí vrácený ukazatel na jeho nenulovost. V případě vrácení nulového ukazatele se můžeme pokusit uvolnit některou
4 nepoužívanou dynamicky alokovanou paměť a poté se znovu pokusit o opětovnou alokaci. Nejčastějším řešením této situace u menších aplikací bývá vypsáním chybové hlášky o nedostatku paměti na obrazovku a ukončení programu. Funkce free slouží k uvolnění dynamicky alokované paměti. Funkce nemá žádnou návratovou hodnotu a má jeden parametr typu ukazatel na typ void. Ukazatel na libovolný datový typ se na automaticky na přetypuje na ukazatel na typ void. Každou dynamicky alokovanou paměť (pomocí funkce malloc), kterou již nechceme používat bychom měli uvolnit pomocí funkce free. K uvolnění paměti by mělo dojít i těsně před skončením programu, zejména z kontrolních důvodů. Při uvolňování paměti se mohou projevit chyby, které jsem v programu způsobili někdy dříve (například přepsání místa v paměti těsně za koncem polem). Na slajdu č. 76 dole vidíme zdrojový kód ve které dynamicky alokujeme paměť velikosti 20 bytů, kterou budeme chápat jako pole znaků. Na třetím řádku zdrojového kódu si všimněme testu na nulovost ukazatele. Pokud je ukazatel nulový, zavolá se uživatelsky definovaná funkce error (její tělo je nutno dopsat). S dynamicky alokovanou pamětí lze dále pracovat stejně jako se staticky alokovanou. Na čtvrtém řádku do ní okopírujeme řetězec "ahoj" a na pátém řádku první znak tohoto řetězce přepíšeme na hodnotu 'X'. V příkladu chybí uvolnění paměti pomocí funkce free. Příklad je graficky znázorněn na slajdu vpravo dole. Na slajdu č. 77 vidíme další příklad na využití dynamicky alokované paměti. Zatímco minulý příklad by šel přepsat i s použitím pouze statických alokací, tento již nejde. V příkladu si vytvoříme pole přesně takové délky, abychom do něj mohli zřetězit první a druhý parametr programu, předané mu z příkazové řádky při jeho spuštění. Jedná se o parametry s indexy 1 a 2, protože parametr s indexem 0 je název programu včetně plné cesty. Po dynamické alokaci paměti provedeme test na nulovost ukazatele na právě alokovanou paměť. Následně se do dynamicky alokované paměti nakopíruje první parametr programu předaný z příkazové řádky a za něj se připojí druhý parametr. Ve zdrojovém kódu opět chybí uvolňování paměti pomocí funkce free. 2 Organizace paměti procesu Po zkompilování zdrojových kódů získáme program. Program můžeme spustit. Z hlediska operačního systému se běžící program nazývá proces. V našich studijních materiálech jsme zatím tyto pojmy nerozlišovaly a oba dva nazývali programem, případně proces nazývali běžícím programem. Každý proces má svoji paměť, kterou má přidělenou od operačního systému, ve které jsou uchovány všechny data nutná pro běh procesu. Ostatní procesy operačního systému nemohou z této paměti číst ani do ní zapisovat. Paměť je přidělena při startu procesu, ale v jeho průběhu se může její velikost zvětšovat. Při ukončení procesu je všechna paměť vrácena opět operačnímu systému. Tato paměť se dělí na čtyři části: kódový segment, datový segment, heap a zásobník. Na slajdu č. 78 vidíme jejich vzájemné uspořádání. Kódový a datový segment mají pevnou velikost danou už při startu programu. Zásobník a heap mají proměnlivou velikost, soupeří spolu o stejnou volnou paměť, rostou proti sobě. Kódový segment (slajd č. 79) je připraven kompilátorem při překladu zdrojových kódů programu a je součástí spustitelného souboru. Je zde uložen (přeložený) kód uživatelských a knihovních funkcí. Tato část paměti (na rozdíl od zbylých tří částí paměti) bývá obvykle
5 chráněna proti zápisu. Pokud je kódový segment chráněn proti zápisu a nějaký neinicializovaný ukazatel náhodou ukazuje na data z kódového segmentu, při pokusu o přepsání těchto dat pomocí tohoto ukazatele dojde k běhové chybě programu. Kódový segment (slajd č. 80) je (stejně jako kódový segment) připraven kompilátorem při překladu zdrojových kódů programu a je součástí spustitelného souboru. Jsou zde uloženy explicitně nebo implicitně (nulami) inicializované globální proměnné. Dále se zde nachází řetězcové konstanty použité kdekoliv v programu. Nachází se zde i data knihoven. V příkladu uvedeném dole na slajdu se v datovém segmentu nachází globální proměnná bigpole a řetězcová konstanta "ahoj". Heap (slajd č. 81), neboli halda, je vytvořen startovacím modulem knihoven. Z této části paměti se přidělují kusy paměti při dynamické alokaci, volná paměť je spravována pomocí spojového seznamu. Po zavolání funkce malloc je z této části paměti přidělen blok paměti požadované velikosti (ve spojovém seznamu se najde volný blok stejné nebo větší velikosti) a ukazatel na jeho první byte je vrácen jako návratová hodnota funkce malloc. Po zavolání funkce free je tento blok připojen do seznamu volných bloků paměti, případně může navíc dojít ke sloučení sousedních volných bloků. Zásobník (slajd č. 82), neboli stack, je připraven operačním systémem. Ukládají se zde aktivační záznamy funkcí, které obsahují parametry funkce, návratovou hodnotu, hodnoty lokálních proměnných, včetně pomocných proměnných generovaných kompilátorem. Dále se zde ukládají návratové adresy (ukazatel do kódu volající funkce, kam se máme vrátit po skončení volané funkce). V příkladu uvedeném dole na slajdu se v zásobníku nachází lokální proměnné pole, s a x. Dále jsou zde dočasné proměnné, které kompilátor vyrobí pro spočtení výrazu 1+2*3. 3 Statické proměnné Statickou proměnnou deklarujeme uvedením klíčového slova static před nebo za datový typ proměnné. Je velký rozdíl mezi tím, zda toto slovo použijeme u globální proměnné nebo u lokální proměnné. Statická globální proměnná není viditelná z jiných modulů, můžeme v nich mít globální proměnnou stejného jména. Lokální statická proměnná se chová jako (nestatická) globální proměnná (je uložena v datovém segmentu) s tím rozdílem, že lokální statická proměnná je viditelná pouze z funkce, ve které je lokální proměnnou. Hodnota lokální statické proměnné zůstává zachována i po skončení funkce, ve které je tato statická lokální proměnná definována. Po opětovném zavolání této funkce má tato statická lokální proměnná stejnou hodnotu, jakou měla po skončení předchozího volání této funkce. Pokud je lokální statická proměnná inicializována na konkrétní hodnotu, tato inicializace se provádí pouze jednou (v jazyku C před vstupem do funkce main, v jazyku C++ před prvním průchodem funkce, ve které se tato proměnná nachází). Lokální statické proměnné se občas používají jako čítače počtů zavolání dané funkce. Na slajdu č. 83 je zdrojový kód s globální statickou proměnnou x a lokální statickou proměnnou y.
6 4 Struktury Struktura je složený datový typ, který se používá k reprezentaci více spolu souvisejících prvků (položek struktury), které mohou být různých datových typů. Struktura se definuje pomocí klíčového slova struct následovaného názvem struktury a složenými závorkami, ve kterých jsou středníky oddělené jednotlivé dvojice datový typ a název položky struktury. Za definicí struktury následuje vždy středník. Na slajdu č. 85 je definována struktura osoba, které má čtyři položky jmeno, prijmeni, rok_narozeni a pohlavi. Na prvním řádku pod definicí struktury deklarujeme tři proměnné. Proměnnou os typu osoba, proměnnou po typu ukazatel na osobu a pole osob zam. Na dalším řádku deklarujeme proměnnou beda typu osoba a inicializujeme jí ve složených závorkách uzavřeným seznamem hodnot jednotlivých položek navzájem oddělených čárkami. Obdobné jako lze inicializovat pole. K jednotlivým položkám struktury přistupujeme pomocí operátoru tečky. Na 3. řádku pod definicí struktury nakopírujeme do položky jmeno u proměnné os hodnotu "Venca". Na dalším řádku prvku s indexem 3 v poli zam do položky rok_narozeni přiřadíme hodnotu Následně do ukazatele po uložíme adresu prvku s indexem 3 v poli zam. Na dalším řádku do položky pohlavi u proměnné typu osoba, na kterou ukazuje ukazatel po uložíme hodnotu 1. Použijeme operátor ->, který přistoupí k položce struktury na kterou ukazuje ukazatel. Zápis po->pohlavi je nahrazením nepohodlného zápisu (*po).pohlavi, který obsahuje dva operátory a jedny závorky. Závorka je v zápisu (*po).pohlavi nutná, protože postfixní operátory mají vyšší prioritu než prefixní operátory a my chceme provést nejdříve dereferenci a až poté přístup k položce. 5 Typové konstrukce Na slajdu č. 86 vidíme v tabulce přehled základních typových konstrukcí, které by jsme měli již znát. Ignorovat můžeme modré řádky, což nejsou konstrukce z jazyka C, ale z jazyka C++. Písmeno A zastupuje datový typ, písmeno x jméno identifikátoru (proměnné, funkce). U některých konstrukcí jsou červeně zobrazeny operace, které s nimi nelze provádět, zeleně jsou naopak zobrazeny operace, které s nimi provádět lze. První dva řádky ukazují různé způsoby definice pole. Definici pole bez udání jeho velikosti uvedená na druhém řádku lze použít jen v některých případech, například když po ní následuje inicializace pole. Na třetím řádku je definován ukazatel na konkrétní datový typ, na čtvrtém řádku ukazatel na neručený datový typ. Na pátém řádku jsou dva možné zápisy ukazatele na konstantní hodnotu daného typu. Při deklaraci je důležité, že slovo const se nachází před hvězdičkou. Nemůžeme měnit hodnotu, na kterou ukazatel ukazuje, můžeme ji pouze číst. Tento typ ukazatele má své využití například u funkcí pro práci s řetězci, které nemají modifikovat své parametry. Na šestém řádku je konstantní ukazatel. Při deklaraci je důležité, že slovo const se nachází za hvězdičkou. Můžeme měnit hodnotu, na kterou ukazatel ukazuje, ale nemůžeme měnit místo na které ukazatel ukazuje. Bude vždy ukazovat na to samé místo. Pokud se ve zdrojovém kódu vyskytne pole na pozici, na které nemůže být, automaticky se přetypovává na ukazatel na první prvek. Takto vzniklý ukazatel je konstantní.
7 Můžeme vytvořit i konstantní ukazatel na konstantní hodnotu, ale kvůli jeho nepraktičnosti pro běžném programovaní není v tabulce uveden. Pro jeho deklaraci stačí uvést slovo const jednou před a jednou za hvězdičku. Na posledních čtyřech řádcích jsou různé varianty funkcí, bez parametrů, s parametry, bez návratové hodnoty. 5.1 Kombinace typových konstrukcí Na slajdu č. 87 vidíme kombinaci jednoduchých typových konstrukcí z předchozího slajdu. Písmeno A zastupuje datový typ, písmeno x jméno identifikátoru (proměnné, funkce). Červené označené řádky jsou syntakticky zakázané. Fialové řádky jsou povolené, ale nepoužívají se, protože pole se automaticky přetypovává na ukazatel na jeho první prvek. Podrobně si vysvětlíme pouze černé řádky, které se v programech běžně používají. Porozumět některým složitějším zápisům může být na první pohled těžké. Vysvětlíme si jednoduché pravidlo jak takovéto zápisy číst. V zápisu najdeme identifikátor (v našem případě x) a od něj postupně směrem doprava čteme typové konstrukce. Když vyčerpáme všechny konstrukce napravo od identifikátoru, tak postupujeme od identifikátoru směrem doleva. Situaci mohou zkomplikovat kulaté závorky určující prioritu typových konstrukcí (pozor na záměnu s voláním funkce). Výraz v závorkách se vyhodnotí přednostněji. Na prvním řádku je pole ukazatelů. Zkusíme zápis přečíst pomocí našeho pravidla. Nalezneme identifikátor x a napravo od něj se nacházejí hranaté závorky obsahující hodnotu 10. Identifikátor x je pole desíti prvků. Napravo se již žádné konstrukce nenacházejí, postupujeme tedy od x směrem doleva. První nalevo je hvězdička, tedy ukazatel. Identifikátor x je pole desíti ukazatelů. Před hvězdičkou je A, což je nějaký typ. Identifikátor x je pole desíti ukazatelů na typ A. Na třetím řádku je funkce vracející ukazatel. Zkusíme zápis přečíst pomocí našeho pravidla. Nalezneme identifikátor x a napravo od něj se nacházejí kulaté závorky, které by mohli případně obsahovat i parametry oddělené čárkou. Identifikátor x je funkce. Napravo se již žádné konstrukce nenacházejí, postupujeme tedy od x směrem doleva. První nalevo je hvězdička, tedy ukazatel. Identifikátor x je funkce vracející ukazatel. Před hvězdičkou je A, což je nějaký typ. Identifikátor x je funkce vracející ukazatel na typ A. Na čtvrtém řádku je ukazatel na funkci. Oproti zápis z předchozího řádku zde přibyli pouze jedny kulaté závorky určující prioritu jednotlivých konstrukcí. Zkusíme zápis přečíst pomocí našeho pravidla. Nalezneme identifikátor x a napravo od něj se nachází pravá kulatá závorka, pravou stranu jsme dočasně vyčerpali. Postupujeme od x směrem doleva. První nalevo je hvězdička, tedy ukazatel. Identifikátor x je ukazatel. Další nalevo je levá kulatá závorka párová k pravé kulaté závorce, na kterou jsme již narazili. Postup nalevo dočasně zastavíme. Postupujeme od pravé kulaté závorky (u které jsme před chvílí přerušili náš postup směrem napravo) směrem napravo. Nalezneme kulaté závorky, které by mohli případně obsahovat i parametry oddělené čárkou. Identifikátor x je ukazatel na funkci. Napravo se již žádné konstrukce nenacházejí, postupujeme směrem nalevo od posledního místa, kde jsme nalevo skončili. Nachází se zde A, což je nějaký typ. Identifikátor x je ukazatel na funkci vracející typ A.
8 Na šestém řádku je pole ukazatelů na funkci. Zkusíme zápis přečíst pomocí našeho pravidla. Nalezneme identifikátor x a napravo od něj se nacházejí hranaté závorky obsahující hodnotu 10. Identifikátor x je pole desíti prvků. Dále napravo se nachází pravá kulatá závorka, pravou stranu jsme dočasně vyčerpali. Postupujeme od x směrem doleva. První nalevo je hvězdička, tedy ukazatel. Identifikátor x je pole desíti ukazatelů. Další nalevo je levá kulatá závorka párová k pravé kulaté závorce, na kterou jsme již narazili. Postup nalevo dočasně zastavíme. Postupujeme od pravé kulaté závorky (u které jsme před chvílí přerušili náš postup směrem napravo) směrem napravo. Nalezneme kulaté závorky, které by mohli případně obsahovat i parametry oddělené čárkou. Identifikátor x je pole desíti ukazatelů na funkci. Napravo se již žádné konstrukce nenacházejí, postupujeme směrem nalevo od posledního místa, kde jsme nalevo skončili. Nachází se zde A, což je nějaký typ.. Identifikátor x je pole desíti ukazatelů na funkci vracející typ A. 5.2 Ukazatel na funkci Ukazatel na funkci je druh ukazatele, který obsahuje adresu (z kódového segmentu) nějaké funkce. Pomocí tohoto ukazatele můžeme funkci, na kterou ukazuje zavolat (musíme ji předat požadované parametry). Jak deklarovat ukazatele na funkci jsme si představili na slajdu č. 87 na 4. řádku. Nyní se tuto problematiku ukážeme na praktickém příkladu. Například zápis int (* fce) (int a, int b) deklaruje ukazatel na funkci fce, která má dva parametry typu int a má návratovou hodnotu typu int. Mějme v programu dvě funkce secti a odecti, které mají oba dva parametry typu int a návratovou hodnotu také typu int. Do proměnné fce můžeme přiřadit buďto hodnotu secti nebo odecti. Použít lze jak zápis fce=secti tak i fce=§i. Pokud x je proměnná typu celé číslo, mohu do ní uložit výsledek volání funkce fce pomocí zápisu x=fce(2,5), zavolá se funkce secti na kterou ukazatel fce ukazuje a výsledkem bude číslo 7. Nyní si vysvětlíme, k čemu mohou být ukazatelé na funkci užitečné. Představme si, že kromě funkcí secti a odecti máme v programu ještě deset dalších funkcí se stejnými parametry a návratovou hodnotou. Na začátku programu si jednu z těchto funkcí zvolíme, například podle vstupu od uživatele. Tuto zvolenou funkci aplikujeme v programu na více místech. Pokud použijeme ukazatele na funkce, problém, jak převést uživatelův požadavek na konkrétní funkci, řešíme pouze jednou na začátku programu. Dále v programu se volá funkce pomocí proměnné, která obsahuje ukazatel na ni. Pokud ukazatele na funkce nepoužijeme, musíme řešit převod požadavku uživatele na danou funkci na každém místě programu znova. 5.3 Typedef Pomocí konstrukce typedef můžeme zpřehlednit zdrojový kód, pokud se v něm opakovaně vyskytují složitější typové konstrukce. Rovněž ho lze použít pro vytvoření vlastním názvů pro standardní datové typy. Například zápisem typedef int delka definujeme datový typ delka, který bude odpovídat typu int. Pokud se v tomto případě rozhodneme časem, že typ delka by měl odpovídat typu long, stačí změnu provést na jednom místě v programu. Příklad použití pro ukazatele na funkce nalezneme na slajdu č. 88 dole.
9 Klíčové pojmy dynamicky alokovaná paměť (malloc a free) kódový segment, datový segment, heap, zásobník. aktivační záznam funkce statické proměnné (globální a lokální) pole ukazatelů, funkce vracející ukazatel, ukazatel na funkci, pole ukazatelů na funkci typedef Otázky k rekapitulaci Upozornění: odpovědi na některé zde uvedené otázky nelze najít ve studijním textu tohoto tématického bloku. Lze je získat vlastním experimentováním se zdrojovými kódy nebo studiem doporučené literatury. V jakých situacích si nevystačíme se staticky alokovanou pamětí a musíme použít paměť dynamicky alokovanou. Pomocí jaké funkce získáme dynamicky alokovanou paměť? Jaká má tato funkce parametry, návratovou hodnotu? Musí se dynamická alokace pokaždé úspěšně provést? Jak se tato situace řeší? Z jakého důvodu je vhodné dynamicky alokovanou paměť uvolňovat a pomocí jaké funkce ho provádíme? Jaký je rozdíl mezi programem a procesem? Na jaké části dělíme paměť procesu? Jaká data se v jednotlivých částech nacházejí? Co obsahuje aktivační záznam funkce? Na slajdu č. 84 je kus zdrojového kódu. Jaká data se budou nacházet v jednotlivých částech paměti procesu (kódový segment, datový segment, heap, zásobník) při spuštění a běhu procesu vzniklého spuštěním tohoto zkompilovaného zdrojového kódů? Co je to globální statické proměnné? Co je to lokální statická proměnná? Jak se liší od normální lokální proměnné a jak se liší od globální proměnné? K čemu jsou užitečné struktury a jak se definují? Na co nesmíme zapomenout při definici struktury? Dají neproměnné typu struktura inicializovat při deklaraci? K čemu slouží operátor ->, jak ho lze nahradit? Jaké základní typové konstrukce známe? Jaké se používá pravidlo pro čtení typových konstrukcí? Jaké kombinace základních typových konstrukcí jsou běžně používané? Co je to ukazatel na funkci a k čemu je užitečný? Co znamená zápis na slajdech č. 88 a 89? K čemu se používá klíčové slovo typedef? Své odpovědi zdůvodněte. Můžete přidat i syntaktické zápisy tam, kde je to vhodné.
10 Doporučené příklady k naprogramování 1. Napište funkci, která dynamicky alokuje prostor pro matici celých čísel n*m. Nápověda: Výsledná struktura vypadá podobně jako argv. 2. Napište funkce, které spočtou nejmenší společný násobek (nsn) a největší společný dělitel (nsd) dvou čísel. Nápověda: použijte Euklidův algoritmus. 3. Napište funkci, která jako své parametry má matici M a její rozměry a ukazatel na funkci F se dvěmi parametry typu int vracející int. Do každého prvku matice M bude uložen výsledek funkce F. Funkce je volána s parametry x a y, které určují pozice daného prvku v matici.. 4. Napište program s parametry "{-nsn -nsd } [-f output] n [m]", který spočte nsd nebo nsn pro všechny uspořádané dvojice čísel [x,y] takových že x je z 1..n a y je z 1..m. Pokud m není zadáno, bude mít stejnou hodnotu jako n. Výsledky těchto výpočtů se ukládají do matice získané z příkladu č.1. pomocí funkce z příkladu č Obsah matice z příkladu č. 4 bude vypsán na obrazovku 6. Obsah matice z příkladu č. 4 bude vypsán do souboru, pokud je soubor zadán pomocí -f. Nápověda: zápis do souboru se probírá v tématickém bloku č. 7. Studijní literatura Výklad často odkazuje na slajdy (ve formátu.ppt), které je vhodné si vytisknout. Je vhodné si pořídit nějakou knihu o programování v C nebo C++. Uvedené příklady knih berte pouze jako inspirativní. Miroslav Virius: Programování v C++ (ČVUT, 2. vydání 2004) Jesse Liberty, Bradley L. Jones: Naučte se C++ za 21 dní (Computer Press, 2. vydání, 2007) Knihu je dobré číst postupně a vlastním tempem, můžete mít i mírné zpoždění oproti našemu výkladu. Pořadí kapitol v knize neodpovídá úplně přesně pořadí, v jakém učivo probíráme. Tento tématický blok se zaměřte na dynamicky alokovanou paměť, struktury, ukazatele na funkce. Miroslav Virius: Pasti a propasti jazyka C++ (Brno, 2. vydání 2005) Kapitola 11 Správa paměti (Je psána pro C++, ale principy jsou podobné jako v C.)
Distanční opora předmětu: Programování v jazyce C Tématický blok č. 4: Pole a ukazatele Autor: RNDr. Jan Lánský, Ph.D.
Distanční opora předmětu: Programování v jazyce C Tématický blok č. 4: Pole a ukazatele Autor: RNDr. Jan Lánský, Ph.D. Obsah kapitoly 1 Pole 1.1 Přístup k prvkům pole 1.2 Vícerozměrné pole 1.3 Inicializace
VíceDistanční opora předmětu: Programování v jazyce C Tématický blok č. 8: Dynamické datové struktury, ladění programů Autor: RNDr. Jan Lánský, Ph.D.
Distanční opora předmětu: Programování v jazyce C Tématický blok č. 8: Dynamické datové struktury, ladění programů Autor: RNDr. Jan Lánský, Ph.D. Obsah kapitoly 1 Dynamické datové struktury 1.1 Příklad:
VícePokroč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íceStruktura programu v době běhu
Struktura programu v době běhu Miroslav Beneš Dušan Kolář Struktura programu v době běhu Vztah mezi zdrojovým programem a činností přeloženého programu reprezentace dat správa paměti aktivace podprogramů
Více24-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íceVí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ícePole a kolekce. v C#, Javě a C++
Pole a kolekce v C#, Javě a C++ C# Deklarace pole typ_prvku_pole[] jmeno_pole; Vytvoření pole jmeno_pole = new typ_prvku_pole[pocet_prvku_pole]; Inicializace pole double[] poled = 4.8, 8.2, 7.3, 8.0; Java
VíceSprá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íceUkazatele, dynamická alokace
Ukazatele, dynamická alokace 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 Mazanec Karel Richta,
Více7 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íceProgramování v jazyce C a C++
Programování v jazyce C a C++ Richter 1 Petyovský 2 1. března 2015 1 Ing. Richter Miloslav, Ph.D., UAMT FEKT VUT Brno 2 Ing. Petyovský Petr, UAMT FEKT VUT Brno C++ Stručná charakteristika Nesdíĺı normu
VíceDistanční opora předmětu: Programování v jazyce C Tématický blok č. 5: Řetězce, parametry programu Autor: RNDr. Jan Lánský, Ph.D.
Distanční opora předmětu: Programování v jazyce C Tématický blok č. 5: Řetězce, parametry programu Autor: RNDr. Jan Lánský, Ph.D. Obsah kapitoly 1 Řetězce 1.1 Deklarace a inicializace řetězcové proměnné
VíceKoncepce (větších) programů. Základy programování 2 Tomáš Kühr
Koncepce (větších) programů Základy programování 2 Tomáš Kühr Parametry a návratová hodnota main Již víme, že main je funkce A také tušíme, že je trochu jiná než ostatní funkce v programu Funkce main je
VíceUkazatel (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ícePointery 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
VícePokročilé programování v jazyce C pro chemiky (C3220) Třídy v C++
Pokročilé programování v jazyce C pro chemiky (C3220) Třídy v C++ Třídy v C++ Třídy jsou uživatelsky definované typy podobné strukturám v C, kromě datových položek (proměnných) však mohou obsahovat i funkce
VíceObsah. 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é
VíceMaturitní 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íceProgramová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
Více1. 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.
Více1. 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.
VíceSpráva paměti. Karel Richta a kol. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Karel Richta, 2016
Správa paměti Karel Richta a kol. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Karel Richta, 2016 Objektové modelování, B36OMO 10/2016, Lekce 2 https://cw.fel.cvut.cz/wiki/courses/xxb36omo/start
VíceALGORITMIZACE 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íceDUM 06 téma: Tvorba makra pomocí VBA
DUM 06 téma: Tvorba makra pomocí VBA ze sady: 03 tematický okruh sady: Tvorba skript a maker ze šablony: 10 Algoritmizace a programování určeno pro: 4. ročník vzdělávací obor: 18-20-M/01 Informační technologie
VíceÚ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íceProgramovací 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
VíceZáklady programování (IZP)
Základy programování (IZP) Šesté 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 6. týden
Víceint 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
Vícefor (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ý
VíceStřední škola pedagogická, hotelnictví a služeb, Litoměříce, příspěvková organizace
Střední škola pedagogická, hotelnictví a služeb, Litoměříce, příspěvková organizace Předmět: Vývoj aplikací Téma: Pole Vyučující: Ing. Milan Káža Třída: EK3 Hodina: 14 Číslo: V/5 Programování v jazyce
VíceKonstruktory a destruktory
Konstruktory a destruktory Nedostatek atributy po vytvoření objektu nejsou automaticky inicializovány hodnota atributů je náhodná vytvoření metody pro inicializaci, kterou musí programátor explicitně zavolat,
VíceDUM 07 téma: Proměnné, konstanty a pohyb po buňkách ve VBA
DUM 07 téma: Proměnné, konstanty a pohyb po buňkách ve VBA ze sady: 03 tematický okruh sady: Tvorba skript a maker ze šablony: 10 Algoritmizace a programování určeno pro: 4. ročník vzdělávací obor: vzdělávací
VíceVícerozměrná pole. Úvod do programování 2 Tomáš Kühr
Vícerozměrná pole Úvod do programování 2 Tomáš Kühr Organizační záležitosti Konzultace Pracovna 5.043 Úterý 9.40 11.20 (oficiální) Pátek 8.30 9.40, dle potřeby Emailem tomas.kuhr@upol.cz Web předmětu:
VíceČ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ícePř. další použití pointerů
Př. další použití pointerů char *p_ch; int *p_i; p_ch = (char *) p_i; // konverze int * na char * 8 int i = 5; int *p_i; p_i = &i; POZOR!!!! scanf("%d", p_i); printf("%d", *p_i); Obecný pointer na cokoliv:
VíceZáklady C++ I. Jan Hnilica Počítačové modelování 18
Základy C++ I 1 Přechod z C na C++ jazyk C++ je nadmnožinou jazyka C z hlediska syntaxe se jedná o velmi podobné jazyky, spolu s dalšími jazyky "céčkovské" rodiny, jako je např. C# každý platný program
VíceDynamická vícerozměrná pole. Základy programování 2 Tomáš Kühr
Dynamická vícerozměrná pole Základy programování 2 Tomáš Kühr Statická pole připomenutí Příklad definice: int polea[2][3]; Nejjednodušší způsob vytvoření pole Pole je statické oba rozměry se zadávají konstantou
VíceIUJCE 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íceLineární spojový seznam (úvod do dynamických datových struktur)
Lineární spojový seznam (úvod do dynamických datových struktur) Jan Hnilica Počítačové modelování 11 1 Dynamické datové struktury Definice dynamické struktury jsou vytvářeny za běhu programu z dynamicky
VíceZnalost výčtových typů. Aktivní znalost kombinovaných (zkrácených přiřazení). Znalost bitových operací. Znalost operátoru sekvence.
Distanční opora předmětu: Programování v jazyce C Tématický blok č. 3: Datové typy a operátory Autor: RNDr. Jan Lánský, Ph.D. Obsah kapitoly 1 Datové typy 1.1 Celočíselné typy 1.2 Logické typy 1.3 Znakový
Více2 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íce1. D Y N A M I C K É DAT O V É STRUKTUR Y
1. D Y N A M I C K É DAT O V É STRUKTUR Y Autor: Petr Mik Abychom se mohli pustit do dynamických datových struktur, musíme se nejdřív podívat na datový typ ukazatel. 1. D AT O V Ý TYP U K A Z AT E L Datové
VícePB161 Programování v jazyce C++ Přednáška 4
PB161 Programování v jazyce C++ Přednáška 4 Přetěžování funkcí Konstruktory a destruktory Nikola Beneš 9. října 2017 PB161 přednáška 4: přetěžování funkcí, konstruktory, destruktory 9. října 2017 1 / 20
VíceVyučovací hodina. 1vyučovací hodina: 2vyučovací hodiny: Opakování z minulé hodiny. Procvičení nové látky
Vyučovací hodina 1vyučovací hodina: Opakování z minulé hodiny Nová látka Procvičení nové látky Shrnutí 5 min 20 min 15 min 5 min 2vyučovací hodiny: Opakování z minulé hodiny Nová látka Procvičení nové
VíceDistanční opora předmětu: Programování v jazyce C Tématický blok č. 2: Proměnná, výraz, příkaz, podmínka, cyklus Autor: RNDr. Jan Lánský, Ph.D.
Distanční opora předmětu: Programování v jazyce C Tématický blok č. 2: Proměnná, výraz, příkaz, podmínka, cyklus Autor: RNDr. Jan Lánský, Ph.D. Obsah kapitoly 1 Proměnné 1.1 Deklarace a inicializace proměnných
VíceProgramování v C++ 2, 4. cvičení
Programování v C++ 2, 4. cvičení statické atributy a metody, konstruktory 1 1 Fakulta jaderná a fyzikálně inženýrská České vysoké učení technické v Praze Zimní semestr 2018/2019 Přehled Přístupová práva
VíceDynamická alokace paměti
Dynamická alokace paměti doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava Prezentace ke dni 13. března 2017 Jiří Dvorský (VŠB TUO) Dynamická alokace
VícePráce s binárními soubory. Základy programování 2 Tomáš Kühr
Práce s binárními soubory Základy programování 2 Tomáš Kühr Binární soubory Mohou mít libovolnou strukturu Data jsou uložena ve stejné podobě jako v paměti za běhu programu Výhody: Pro uložení je potřeba
VíceIUJCE 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íceFunkce, 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íceÚvod do programování 6. hodina
Úvod do programování 6. hodina RNDr. Jan Lánský, Ph.D. Katedra informatiky a matematiky Fakulta ekonomických studií Vysoká škola finanční a správní 2015 Umíme z minulé hodiny Algoritmy Třídění pole: Selection
VícePolymorfismus. Časová náročnost lekce: 3 hodiny Datum ukončení a splnění lekce: 30.března
Polymorfismus Cíle lekce Cílem lekce je vysvětlit význam pojmu polymorfismus jako základní vlastnosti objektově orientovaného programování. Lekce objasňuje vztah časné a pozdní vazby a jejich využití.
VíceStřední škola pedagogická, hotelnictví a služeb, Litoměříce, příspěvková organizace
Programování v jazyce C a C# část I. Střední škola pedagogická, hotelnictví a služeb, Litoměříce, příspěvková organizace Předmět: Algoritmizace a programování Téma: Programování Vyučující: Ing. Milan Káža
Vícetype Obdelnik = array [1..3, 1..4] of integer; var M: Obdelnik;
Vícerozměrné pole type Obdelnik = array [1..3, 1..4] of integer; var M: Obdelnik; M[2,3] := 3145; - počet indexů není omezen (v praxi obvykle nejvýše tři) - více indexů pomalejší přístup k prvku (počítá
Více6. lekce Úvod do jazyka C knihovny datové typy, definice proměnných základní struktura programu a jeho editace Miroslav Jílek
6. lekce Úvod do jazyka C knihovny datové typy, definice proměnných základní struktura programu a jeho editace Miroslav Jílek 1/73 https://en.cppreference.com internetová stránka s referencemi https://gedit.en.softonic.com/download
VícePaměť 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íceZáklady programování (IZP)
Základy programování (IZP) Devá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 27.11.2017,
VíceC++ přetěžování funkcí a operátorů. Jan Hnilica Počítačové modelování 19
C++ přetěžování funkcí a operátorů 1 Přetěžování funkcí jazyk C++ umožňuje napsat více funkcí se stejným názvem, těmto funkcím říkáme přetížené přetížené funkce se musí odlišovat typem nebo počtem parametrů,
VíceOdvozené 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ícePreprocesor a koncepce (větších) programů. Úvod do programování 2 Tomáš Kühr
Preprocesor a koncepce (větších) programů Úvod do programování 2 Tomáš Kühr Práce s preprocesorem Preprocesor Zpracovává zdrojový kód ještě před překladačem Provádí pouze záměny textů (např. identifikátor
VíceNMIN102 Programování /2 Z, Zk
NMIN102 Programování 2 --- 2/2 Z, Zk Pavel Töpfer Katedra softwaru a výuky informatiky MFF UK MFF Malostranské nám., 4. patro, pracovna 404 pavel.topfer@mff.cuni.cz http://ksvi.mff.cuni.cz/~topfer Pavel
VíceAlgoritmizace 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ícePole stručný úvod do začátku, podrobně později - zatím statická pole (ne dynamicky) - číslují se od 0
Pole stručný úvod do začátku, podrobně později - zatím statická pole (ne dynamicky) - číslují se od 0 int policko[100]; // tj. pole je od 0 do 99!!! policko[5] = 7; // pozor je to 6. prvek s indexem 5
VíceFunkč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ícepř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íceOperač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íceMartin Flusser. Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague. December 7, 2016
ZPRO cvičení 8 Martin Flusser Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague December 7, 2016 Outline I 1 Outline 2 Dynamické alokování paměti 3 Dynamická alokace
VíceZáklady programování (IZP)
Základy programování (IZP) Jedenácté počítačové cvičení Brno University of Technology, Faculty of Information Technology Božetěchova 1/2, 612 66 Brno - Královo Pole Gabriela Nečasová, inecasova@fit.vutbr.cz
VíceÚvod do programování 7. hodina
Úvod do programování 7. hodina RNDr. Jan Lánský, Ph.D. Katedra informatiky a matematiky Fakulta ekonomických studií Vysoká škola finanční a správní 2015 Umíme z minulé hodiny Syntax Znaky Vlastní implementace
VíceDistanční opora předmětu: Databázové systémy Tématický blok č. 8: Transact SQL Autor: RNDr. Jan Lánský, Ph.D.
Distanční opora předmětu: Databázové systémy Tématický blok č. 8: Transact SQL Autor: RNDr. Jan Lánský, Ph.D. Obsah kapitoly 1 Motivace 2 Základy syntaxe 3 Procedury a Funkce 4 Kurzory 5 Výjimky Studijní
VíceMAXScript 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ícePřetěžování operátorů
Přetěžování operátorů Cíle lekce Cílem lekce je seznámit se s mechanizmem přetížení operátorů a s použitím tohoto mechanizmu při návrhu a implementaci programů. Po absolvování lekce budete: umět využívat
VíceAssembler - 5.část. poslední změna této stránky: Zpět
1 z 5 19.2.2007 7:52 Assembler - 5.část poslední změna této stránky: 9.2.2007 1. Pseudoinstrukce a direktivy Zpět Kromě instrukcí můžete v Assembleru psát také další konstrukce, které se obšem nepřekládají
Více8 Třídy, objekty, metody, předávání argumentů metod
8 Třídy, objekty, metody, předávání argumentů metod 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 třídám a objektům, instančním
VíceÚ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) -
VíceZPRO 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
VíceMělká a hluboká kopie
Karel Müller, Josef Vogel (ČVUT FIT) Mělká a hluboká kopie BI-PA2, 2011, Přednáška 5 1/28 Mělká a hluboká kopie Ing. Josef Vogel, CSc Katedra softwarového inženýrství Katedra teoretické informatiky, Fakulta
VíceUkazatele 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íce2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.
Informatika 10. 9. 2013 Jméno a příjmení Rodné číslo 1) Napište algoritmus pro rychlé třídění (quicksort). 2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus
VíceProgramujeme 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íceAlgoritmizace 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ícePole 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ě
VíceProgramová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
Více9.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íce02. HODINA. 2.1 Typy souborů a objektů. 2.2 Ovládací prvky Label a TextBox
02. HODINA Obsah: 1. Typy souborů a objektů 2. Ovládací prvky Label a TextBox 3. Základní příkazy a vlastnosti ovládacích prvků 4. Práce s objekty (ovládací prvky a jejich vlastnosti) 2.1 Typy souborů
Vícezapište obslužnou metodu události Click tlačítka a vyzkoušejte chování polevýsledek.text = polečíslo1.text + polečíslo2.text;
Typy a proměnné zapište obslužnou metodu události Click tlačítka a vyzkoušejte chování polevýsledek.text = polečíslo1.text + polečíslo2.text; Typy Hodnoty, kterých mohou nabývat vlastnosti prvků nejsou
VíceMQL4 COURSE. By Coders guru -8- Proměnné
MQL4 COURSE By Coders guru www.forex-tsd.com -8- Proměnné Vítejte v lekci proměnné mého MQL 4 kurzu. Doufám, že se vám předchozí lekce líbily a že jste připraveni na boj s proměnnými: Doporučuji, abyste
Více5 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í
VíceProgramování II. Návrh programu I 2018/19
Programování II Návrh programu I 2018/19 Osnova přednášky Co víme? Objektový návrh programu. Příklad. Co víme? Třída Třída je popisem objektů se společnými vlastnostmi. class private:
VíceČtvrtek 3. listopadu. Makra v Excelu. Obecná definice makra: Spouštění makra: Druhy maker, způsoby tvorby a jejich ukládání
Čtvrtek 3. listopadu Makra v Excelu Obecná definice makra: Podle definice je makro strukturovanou definicí jedné nebo několika akcí, které chceme, aby MS Excel vykonal jako odezvu na nějakou námi definovanou
VíceSada 1 - Základy programování
S třední škola stavební Jihlava Sada 1 - Základy programování 06. Proměnné, deklarace proměnných Digitální učební materiál projektu: SŠS Jihlava šablony registrační číslo projektu:cz.1.09/1.5.00/34.0284
VíceSpojová implementace lineárních datových struktur
Spojová implementace lineárních datových struktur doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava Prezentace ke dni 13. března 2017 Jiří Dvorský (VŠB
VíceÚvod do jazyka C. Ing. Jan Fikejz (KST, FEI) 28. prosince Fakulta elektrotechniky a informatiky Katedra softwarových technologií
9 Fakulta elektrotechniky a informatiky Katedra softwarových technologií 28. prosince 2009 Struktury Struktury heterogenní struktura položky mohou být různých datových typů vystupuje jako jediný objekt
Více09. Memory management. ZOS 2006, L.Pešička
09. Memory management ZOS 2006, L.Pešička Správa paměti paměťová pyramida absolutní adresa relativní adresa počet bytů od absolutní adresy fyzický prostor adres fyzicky k dispozici výpočetnímu systému
VíceStrukturu 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
VíceOperač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íceIII/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íce2 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íceFunkce 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
Vícekonstruktory a destruktory (o)
konstruktory a destruktory (o) - slouží k ovlivnění vzniku (inicializace) a zániku (úklid) objektu - základní myšlenkou je, že proměnná by měla být inicializována (nastavena do počátečního stavu) a zároveň
Více