ZÁKLADY PROGRAMOVÁNÍ V C

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

Download "ZÁKLADY PROGRAMOVÁNÍ V C"

Transkript

1 ZÁKLADY PROGRAMOVÁNÍ V C poznámky pro Základy programování 2 Petr Osička

2 i Tento text je doplňkovým učebním textem k semináři Základy programování 2 vyučovanému na Katedře informatiky Přírodovědecké fakulty Univerzity Palackého v Olomouci. Nedělá si ambice být úplnou učebnicí programování v jazyce C, pouze zhruba shrnuje, co se říkalo na semináři. Podrobné informace o jazyce C lze najít jinde, například v literatuře na niž se odkazuji na stránce předmětu. Ke čtení textu je potřeba znalost programování v rozsahu kurzu Základy programování 1. Materiál pravděpodobně obsahuje chyby. Prosím laskavého čtenáře, aby mě o chybách, na které narazí, informoval. Petr Osička Olomouc, jaro 2018

3 Obsah 1 Adresování paměti Pointer, operátory reference a dereference Degenerace pole a pointerova aritmetika Pointery a struktury Předávání argumentů funkce odkazem Pointery typu void Úkoly Alokace a dealokace paměti Automatická alokace a dealokace Manuální alokace a dealokace Další funkce pro práci s pamětí Úkoly ii

4 1 1 Adresování paměti 1.1 Pointer, operátory reference a dereference K paměti přistupujeme jako k posloupnosti míst o velikosti jednoho bajtu. Tato posloupnost je očíslována od nuly podobně jako jsou indexována pole. Index místa je jeho adresou. Vše s čím v programu pracujeme je někde v paměti. Je to velmi přirozené, hodnoty proměnných, hodnoty v polích, hodnoty předané funkcím jako argumenty, konstanty apod. si program musí někde pamatovat. Pokud je velikost dané hodnoty více než 1 bajt, ke uložena jako posloupnost za sebou jdoucích bajtů (je tedy v kuse ), v takovém případě je její adresou adresa prvního bajtu této posloupnosti. Díky implementaci virtuální paměti v operačním systému, má běžicí program (který není jádrem os) přístup k celému adresnímu rozsahu na dané platformě. Adresní rozsah je typicky dán velikostí slova na dané platformě. Například pro amd-64 je velikost slova 64 bitů, pomocí kterých můžeme uložit různých adres. Při psaní programu se ovšem o to, na jaké konkrétní adresy hodnoty budeme ukládat, nestaráme (to zajišťuje operační systém a alokátor paměti). Můžeme ovšem: zjistit, na jaké adresa je již existující hodnota uložena zjistit, jaká hodnota je uložena na konkrétní adrese Pro uložení adresy existují v C speciální typy, ke každému existujícímu typu x existuje typ adresa hodnoty typu x. Například k typu int existuje typu adresa hodnoty typu int. Proměnným takového typu (a často samotným adresám) říkáme pointer, nebo česky ukazatel. Hovoříme například o pointeru na int, či ukazateli na int. Pointer definujeme následujícím způsobem. typ *jmeno_promenne; Znak * určuje, že se jedná o pointer. Váže ke jménu proměnné, nikoliv k samotnému typu, a píše se kamkoliv mezi typ a jméno proměnné. Chceme-li například vytvořit pointer na int, pak to provedeme následujícím způsobem int *pt; Chceme-li vytvořit více pointerů na jednom řádku, musíme použít * u každého jména pointeru, jinak vytvoříme obyčejnou proměnnou. * promenne pt a pt2 jsou pointery na int, * promenna h je obycejna promenna typu int. int *pt, *pt2, h; Typ pointer na typ x označujeme jako x *. Typ pointer na int je tedy označován jako int *. Toto označení typu lze použít na místech, na kterých bychom použili jakéholiv jiného

5 2 typu, tedy například při specifikaci typu argumentu funkce, typu návratové hodnoty funkce apod. Velikost pointeru je typicky rovna velikosti slova dané architektury. printf("sizeof(int *): %lu, sizeof(char *): %lu\n", sizeof(int *), sizeof(char *)); K pointeru se váží dvě informace: adresa místa v paměti a informace o typu na který pointer ukazuje. Díky informaci o typu víme, jak danou pamět interpretovat jako hodnotu a kolik bajtů hodnota zabírá. Pokud máme například pointer na int, pak víme že zabírá sizeof(int) bajtů. Je nutno si uvědomit, je že hodnota pointeru je také uložena v paměti. Už víme, že pointer na typ x je typu x *. Na tento typ také můžeme vytvořit pointer, bude to tedy pointer na pointer na x. Označení typu takového pointeru je x **. Pokračováním tohoto argumentu můžeme vytvořit pointer s libovolným počtem *. Všechny definice v následujícím příkladě jsou korektní. int a; int *pt; int **pt2; K základní práci s adresami slouží unární operátor reference (někdy nazýván také jako operátor adresy) & a operátor dereference *. Operátor & umožňuje získat adresu, na které je uložen nějaký objekt (například proměnná). Operátor * umožní přístup k hodnotě, která uložena na dané adrese, takže můžeme hodnotu číst i měnit. Oba operátory dodržují typ: pokud je objekt typu x, operátor & vrací pointer na typ x; operátor *, jehož argumentem je pointer na typ x, umožnuje práci s hodnotou typu x. Více v následujícím příkladu int a = 2; int b = 5; ziskame adresy promennych a,b int *pt_a = &a; int *pt_b = &b; pt_c ukazuje take na a int *pt_c = pt_a; printf("pt_a: na adrese %.8X je hodnota %i\n", pt_a, *pt_a); printf("pt_c: na adrese %.8X je hodnota %i\n", pt_c, *pt_c); * zmenime hodnotu promenne a tak, ze zapiseme na adresu (pointer pt_c), * na ktere je ulozena jeji hodnota. K hodnote promenne b * pristupujeme take pomoci adresy (pointer pt_b). * Prirazeni je ekvivalentni radku * a = b; *pt_c = *pt_b; * Z vypisu by melo byt jasne, ze jsme zmenili hodnotu promenne a tak, * ze jsme prepsali

6 3 printf("--- po prirazeni --- \n"); printf("pt_a: na adrese %.8X je hodnota %i\n", pt_a, *pt_a); printf("pt_c: na adrese %.8X je hodnota %i\n", pt_c, *pt_c); printf("hodnota a je %i\n", a); Je možné, aby pointer obsahoval adresu místa v paměti, které nebylo programu přidělěno (říkáme mu pak neplatný pointer). Dereferencování takového pointeru vede k nedefinovanému chování programu, velmi často dokonce k jeho havárii. V následujícím příkladu se pokoušíme dereferencovat neinicializovaný pointer. int *pt; následujici radek program pravdepodobne shodi printf("%i\n", *pt); Abychom se vyhnuli dereferencování neplatného pointeru, bylo by pěkné mít možnost otestovat, jestli je pointer neplatný. S obecnou hodnotou pointeru to bohužel nelze. Existují ovšem dvě specifické hodnoty, které reprezentují neplatný pointer a které lze testovat. int *pt_1 = 0; int *pt_2 = NULL; test platnosti pointeru pt_1 if (!pt_1) printf("pointer pt_1 obsahujici adresu %.8X je neplatny!\n", pt_1); test platnosti pointeru pt_2 if (!pt_2) printf("pointer pt_2 obsahujici adresu %.8X je neplatny!\n", pt_2); Může se stát, že se NULL ve skutečnosti nerovná 0, nicméně na testování platnosti to nemá žádný vliv (navenek se NULL tváří, jako by bylo rovno 0). 1.2 Degenerace pole a pointerova aritmetika Pole a pointery jsou si v C velmi blízké. Připomeňme, že pokud deklarujeme pole, program si v témže bloku pamatuje jeho velikost. Můžeme tedy provést následující. int array[10]; spocitame pocet prvku pole * sizeof(array) vrati velikost pole v bajtech!!! * sizeof(array[0]) vrati velikost jednoho prvku v bajtech printf("pole ma velikost %lu bajtu a obsahuje %i prvku \n", sizeof(array), sizeof(array)/sizeof(array[0]));

7 4 Program vypíše správnou velikost pole v bajtech i počet jeho prvků. Pokud bychom se ovšem pokusili o stejnou věc ve funkci, jíž bylo pole předáno jako argument, bude se program chovat jinak. void test(int array[]) * Tady sizeof(array) vrati velikost pointeru!!! * Tim padem nasledujici radek vypise nespravne hodnoty. printf("pole ma velikost %lu bajtu a obsahuje %i prvku \n", sizeof(array), sizeof(array)/sizeof(array[0])); int main() int array[10]; funkce(array); return 0; Při překladu předchozího programu překladač pravděpodně vypíše varování, že použití sizeof(array) ve funkci test vrátí velikost int *. Důvodem pro toto chování je mechanismus, kterému říkáme degenerování pole na pointer. Jméno pole je totiž konstantní pointer na typ prvků pole (je-li pole typu x, pak jeho jméno je pointer na x). Konstantní znamená, že jeho hodnotu nemůžeme změnit. K degeneraci pole na pointer dochází i při předání pole jako argumentu funkce. Následující hlavičky funkcí jsou tedy ekvivalentní. void test(int array[]); void test(int *array); Degeneraci pole na pointer ilustruje i následující příklad. int array[10] = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10; int a = 15; pt obsahuje adresu prvního bajtu prvního prvku pole array int *pt = array; int *pt2 = &a; zadny z nasledujich tri radku nelze provest, pointer array je konstantni array = pt2; array = &a; array = 0; vypiseme prvni prvek pole printf("%i\n", *pt); Díky tomu, že pole degeneruje na pointer správného typu, můžeme dereferencí tohoto poin-

8 5 teru získat první prvek pole, jak vidíme na posledním řádku předchozího příkladu. Protože pole je v paměti v souvislém bloku, lze adresu prvku na indexu i získat tak, že adresu začátku pole zvětšíme o i krát velikost jednoho prvku pole. Tím se v paměti posuneme ze začátku pole o i prvků. V programu počet bajtů, o které je nutno se posunout nemusíme počítat, aritmetické operace s pointery to udělají za nás. K pointeru lze totiž přičíst, nebo od něj odečíst, celé kladné číslo. Výsledkem přičtení čísla c k pointeru pt je pointer, který získáme zvětšením pt o c-krát velikost typu, na který pt ukazuje. Pokud by byl například pt pointer na int, tak bychom pt zvětšili o c-krát sizeof(int). Odečítání celého čísla funguje analogicky. Pointerové aritmetiky můžeme využít k přístupu k jednotlivým prvkům pole, pokud máme k dispozici pointer na začátek pole. Dobře si prostudujte následující program a text, který vypíše. void print_array_info(int array[], int size) int i; vypiseme index, adresu a hodnotu kazdeho prvku pole for(i=0; i<size; i++) printf("index: %i \t address: %.8X \t value: %i\n", i, array+i, *(array+i)); int main () int array[5] = 1,2,3,4,5; print_array_info(array, 5); return 0; Vidíme, že k prvku na indexu i v poli array se můžeme dostat i pomocí výpočtu adresy tohoto prvku pomocí pointerové aritmetiky a poté použitím operátoru dereference. Následující dva výrazy jsou tedy ekvivalentní. array[i] *(array + i) Operátor dereference má vyšší prioritu než operátor sčítání, musíme proto použít závorky. Další aritmetickou operací s pointery je rozdíl dvou pointerů stejného typu. Rozdíl pt1 - pt2 je roven počtu hodnot daného typu, které se za sebe vejdou do paměti mezi pt2 a pt1. Dále lze adresy porovnávat pomocí operátorů porovnání, chování těchto operátorů je zde stejné jako u čísel. 1.3 Pointery a struktury Máme-li pointer na strukturu, můžeme k položkám této struktury přistupovat pomocí kombinace operátoru dereference a tečky. Předpokládejme, že máme definovánu následující strukturu. struct my_structure int item_a;

9 6 double item_b; ; typedef struct my_structure my_structure; Potom k položkám můžeme přistoupit následovně my_structure data = 10, 3.2; my_structure *pt = &data; pristoupime k polozkam struktury data pomoci pointeru pt int a = (*pt).item_a; (*pt).item_b = 29.6; Pro kombinaci použití operátoru dereference a tečky k přístupu k položkám struktury přes pointer existuje v C alternativní syntaxe pomocí operátoru ->. Poslední dva řádky bychom tedy mohli nahradit pomocí int a = pt->item_a; pt->item_b = 29.6; Pokud přiřazujeme do instance struktury jinou její instanci, dojde ke zkopírovaní všech položek struktury. Stejně tak tomu je, i když přiřazujeme dereferenci pointeru. my_structure data = 10, 3.2; my_structure *pt = &data; * tady dojde ke zkopirovani hodnot polozek promenne data * do polozek promenne copy my_structure copy = *pt; tato zmena se neprojevi v promenne data copy.item_a = 123; Struktura může jako položky obsahovat jiné struktury, ovšem ne samu sebe. Je to proto, že struktura by pak měla nekonečnou velikost. Struktura ovšem může obsahovat pointer na samu sebe, pointer má totiž konečnou velikost. struct _node int data; struct _node *next; ; Pokud předáváme funkci jako argument strukturu, je vhodné předávat ji pomocí pointeru. Uvnitř funkce máme k položkám struktury přístup v obou případech (tj. při předání hodnotou i odkazem). Použijeme-li pointer vyhneme se při volání funkce kopírování potenciálně velkého kusu paměti, kterou při volání předáme jako argument. misto teto definice funkce double fce (my_structure a)

10 7 pristup k polozkam double result = a.item_a + a.item_b; return result; pouzijeme radsi tuto definici funkce double fce (my_structure *a) pristup k polozkam double result = a->item_a + a->item_b; return result; 1.4 Předávání argumentů funkce odkazem Pokud chceme, aby funkce měnila hodnotu proměnné předané jí jako argument, nepředáváme funkci hodnotu této proměnné, ale její adresu. Říkáme, že argument předáváme odkazem. Samotná adresa je předána hodnotou, to ale nebrání v tom, aby funkce k paměti na této adrese přistupovala a měnila její obsah. Příkladem takového chování je předání pole jako argumentu funkce. Jak jsme diskutovali v předchozích kapitolách, ve skutečnosti funkci předáváme adresu pole. Následující příklad ukazuje jednoduchou funkci, které předáváme třetí argument odkazem. int division(int a, int b, int *remainder) int result = a / b; na adresu remainder ulozime zbytek po deleni *remainder = a % b; return result; int main() int x, y; x = division(13, 5, &y); * v promenne x je 2 * v promenne y je Pointery typu void Speciálním typem pointeru je void pointer, jehož typové označení je void *. Slouží k uložení adresy bez informace o typu. Void pointer nelze dereferencovat. Void pointer je možno přiřadit pointeru jakéhokoliv typu a naopak, pointer jakéhokoliv typu lze přiřadit void pointeru,

11 8 bez nutnosti provádět explicitní přetypování. Void pointer je užitečný například v případě, kdy chceme naprogramovat funkci pracující s pamětí, u které není potřeba znalost o typu. Příkladem takových funkcí jsou například memcpy a malloc (podrobnosti uvidíme v další kapitole). Void pointery mají i další použití, ale to na tomto místě nebudeme rozvádět. Jako příklad použití void pointerů si napíšeme funkci, která vytiskne nějakou část paměti hexadecimálně po bajtech. Připomeňme, že k zachycení obsahu jednoho bajtu potřebujeme dvouciferné hexadecimální číslo. #include <stdio.h> argumenty * mem - adresa pameti, kterou chceme vytisknout * size - pocet bajtu, ktere chceme vytisknout * bytes_per_row - pocet bajtu, ktere chceme vytisknout na jeden radek void dump_memory_on_screen(void *mem, unsigned int size, int bytes_per_row) tady implicitne pretypujeme void pointer na unsigned char unsigned char *bytes = mem; int i; for(i=0; i<size; i+=1) if (i && (i % bytes_per_row == 0)) printf("\n"); tisk obsahu pameti hexadecimalne printf("%.2x ", *bytes); posunu pointer o jeden bajt bytes += 1; printf("\n"); typedef struct int a; int b; float c; my_struct; int main() int a = ; double b = ; my_struct array[3] = 1,2,1.5, 3,7,12.2, 1,1,55.4; printf("dumping integer %i\n", a); dump_memory_on_screen(&a, sizeof(a), 8);

12 9 printf("\ndumping double %f\n", b); dump_memory_on_screen(&b, sizeof(b), 8); printf("\ndumping array of structs\n"); dump_memory_on_screen(array, sizeof(my_struct) * 3, 8); return 0; 1.6 Úkoly 1. Vyzkoušejte všechny příklady kódu z tého kapitoly. Kde to je potřeba, dopište vlastní kód. 2. Naprogramujte vlastní verzi knihovní funkce strcmp. K přístupu k jednotlivým znakům řetězců používejte pointerů a pointerové aritmetiky. Detaily o funkci strcmp najděte v referenční příručce. 3. Naprogramujte funkci, která pro dané pole čísel (můžete zvolit libovolný číselný typ) spočítá průměr a medián. Jeden z výsledků funkce vrátí odkazem. 4. Napište funkce pro převod čísel typu int mezi little endian na big endian reprezentací (viz stránka na wikipedii). 5. Implementujte vlastní verzi knihovní funkce memcpy s hlavičkou void *my_memcpy(void *src, void *dest, unsigned long n); Funkce zkopíruje n za sebou jdoucích bajtů začínajících na adrese src na místo začínající na adrese dest. Funkce vrátí pointer dest. Příklad použití int array[6] = 1, 2, 3, 4, 5, 6; int destination[6] = 0, 0, 0, 0, 0, 0; nasledujici radek zkopiruje obsah pole array do pole destination my_memcpy(array, destination, 6 * sizeof(int));

13 2 Alokace a dealokace paměti Paměť, kterou běžící program využívá, je mu nejdřívě přidělena (alokována). Pokud jí již není potřeba, je paměť uvolněna. Podle použitého mechanismu přidělování a uvolněnování můžeme paměť rozdělit na dva typy. Na paměť, která je přidělována a uvolňována automaticky, a na paměť, jejíž přidělení a uvolnění musí programátor provést manuálně. 2.1 Automatická alokace a dealokace Paměť je automaticky přidělena a uvolněna pro následující objekty: globální a lokální proměnné a pole všech typů (včetně struktur!) statické proměnné a pole ve funkcích (o statických proměnných níže) všech typů Paměť pro globální a statické proměnné a pole je přidělena na začátku běhu programu, předtím než začne běh funkce main. Tato paměť je po přidělení automaticky vynulována. K uvolnění paměti globálních a statických proměnných a polí dochází až na konci běhu programu. Připomeňme, že když program skončí, operační systém uvolní všechnu paměť, kterou program používal, i tu, která není uvolňována automaticky. Lokální proměnné a pole ve funkcích podléhají jinému automatickému mechanismu alokace a uvolňování. V momentu zavolání funkce přidělena paměť pro všechny lokální proměnné, a pro argumenty funkce. Do paměti odpovídající argumentům funkce jsou překopírovány hodnoty skutečně předaných argumentů. Všechna paměť je uvolněna v okamžiku, kdy funkce skončí. Pokud z funkce vracíme adresu (nebo ji přiřazujeme proměnné předané funkci odkazem), měli bychom si být vědomi toho, že pamět na místě, na které adresa ukazuje, bude po skončení funkce uvolněna 1. Následující funkce jsou tedy špatně. int *make_array_up_to_five() int array[10] = 1, 2, 3, 4, 5; chyba, po skonceni funkce je pamet uvolnena return array; int *bar (int c) int k = c * 2; chyba, po skonceni funkce je pamet uvolnena return &k; 1 fyzicky být uvolněna nemusí, nicméně za uvolněnou ji musíme považovat 10

14 11 Proměnnou v těle funkce lze z vyjmout z režimu automatické alokace a dealokace lokálních proměnných a vložit ji do režimu automatické alokace a dealokace globálních proměnných. Dělá se to tak, že proměnnou definujeme jako static. static typ jmeno = pocatecni_hodnota; Pokud proměnnou při definici neinicializujeme, je inicializována na 0, protože paměť, která je alokována pro globální a statické proměnné, je po alokaci vynulována. Statickou proměnnou můžeme inicializovat pouze konstantní hodnotou vyjádřenou literálem (tedy nikoliv hodnotou proměnné, hodnotou získanou zavoláním funkce apod.) V následujícím příkladě vidíme funkci, která počítá kolikrát byla zavolána. void counting() static int called = 0; called += 1; printf("pocet zavolani: %i \n"); int main() int i; vypisi se cisla 1 az 10 for(i = 0; i < 10; i+=1) counting(); return 0; 2.2 Manuální alokace a dealokace void *malloc(size_t memory_size); void *calloc(size_t n, size_t unit_size); void free(void *ptr); void realloc(void *ptr, size_t memory_size); Funkce malloc (jméno je zkratkou sousloví memory allocation) slouží k alokaci paměti. Jejím jediným argumentem je počet bajtů, které chceme alokovat. Funkce alokuje souvislý blok paměti a vrátí adresu jeho prvního bajtu. Pokud se alokace paměti z nějakého důvodu nepovede, vrací funkce hodnotu 0. Není definováno, co alokovaná paměť obsahuje. Pro alokaci paměti slouží i funkce calloc. Bere dva argumenty, počet položek, které chceme alokovat a velikost jedné položky v bajtech. Funkce alokuje blok paměti o velikosti odpovídající součinu argumentů a vrátí adresu jeho prvního bajtu. Pokud se alokace nezdaří, vrací calloc hodnotu 0. Všechny bajty alokované paměti jsou nastaveny na hodnotu 0. Funkce free slouží k uvolnění paměti, kterou jsme předtím manuálně alokovali (a ještě

15 12 jsme ji neuvolnili). Tuto pamět předáváme funkci pomocí adresy jejího prvníhé bajtu. Pokud je argument jiná adresa není chování funkce definováno (program může havarovat, dostat se do nekonzistentního stavu a podobně). Funkce realloc slouží ke změně velikosti alokované paměti. Jejími argumenty jsou adresa již (manuálně) alokované paměti a nová velikost. Funkce provede alokace a dealokace nutné pro změnu velikosti paměti a vrátí adresu začátku daného bloku paměti. Tato adresa se může lišit od adresy předané funkci jako argument, může totiž být potřeba paměť přesunout. Pokud pomocí realloc paměť zmenšujeme, je uvolně od konce (jsou uvolněny bajtů s vyššími adresami). Pokud pomocí realloc paměť zvětšujeme, může se stát, je že ji realloc alokuje na novém místě a obsah původní paměti tam překopíruje a paměť na původním místě je uvolněna. Pokud se alokace na novém místě nezdaří, původní paměť uvolněna není a realloc vrací 0. Následuje několik příkladů použítí výše uvedených funkcí. alokujeme pole o 10 prvcich int *p = malloc(10* sizeof(int)); nasledujici pouziti reallocu neosetruje situaci, kdy je nutno pamet presunout a nepovede se nova alokace, to by vedlo ke dvema chybam 1) p bude rovno 0 a dal v programu se p muzeme pokusit dereferencovat 2) puvodni pamet nebude uvolne a ztratime na ni adresu -> memory leak p = realloc(p, 20 * sizeof(int)); spravne musime realloc pouzit nasledovne int *tmp = realloc(p, 20*sizeof(int)); if (!tmp) tady se rozhodneme, co provest, pokud se alokace nezdari else p = tmp; funkce vytvori pole obsahujici cisla z intervalu a b int *make_interval(int a, int b) int size = b - a; int i;

16 13 int *ret = 0; if (size <= 0) return 0; ret = malloc(size * sizeof(int)); if (!ret) return 0; for(i = 0; i < size; i+= 1) ret[i] = a + i; return ret; bag ~ multimnozina prvku pridavani a odebirani prvku testovani poctu vyskytu daneho prvku #define BAG_START_SIZE 100 typedef struct int *data; int size; int head; bag; bag *create_bag () pamet pro structuru bag bag *result = malloc(sizeof(bag)); ; if(!result) return 0; pamet pro pole pro uchovavani prvku result->data = malloc(sizeof(int) * BAG_START_SIZE); if(!result->data) free(result); return 0; result->size = BAG_START_SIZE; result->head = 0; return result; vraci 1, kdyz se pridani povede vraci 0, kdyz se pridani nepovede

17 14 int add_to_bag (bag *b, int element) if (b->head == b->size) int *tmp; b->size *= 2; tmp = realloc(b->data, b->size * sizeof(int)); if(!tmp) return 0; b->data = tmp; b->data[b->head] = element; b->head += 1; return 1; void delete_from_bag (bag *b, int element) int i; hledam prvek for(i = 0; i < b->head; i += 1) if(b->data[i] == element) break; pokud jsem prvek nasel, tak jej smazu vymenou s poslednim prvekm a snizenim head o 1 if(i!= b->head) b->data[i] = b->data[b->head-1]; b->head -= 1; int occurence_in_bag (bag *b, int element) int i; int occurences = 0; for(i=0; i<b->head; i+=1) if (b->data[i] == element) occurences += 1; return occurences;

18 15 void destroy_bag(bag *b) if (!b) return; if (b->data) free(b-data); free(b); 2.3 Další funkce pro práci s pamětí Ve standardní knihovně se nachází další užitečné funkce pro práci s pamětí. Pro příklad uvedeme tři z nich, další lze najít v referenční příručce ke standardní knihovně. void *memcpy(void *mem1, void *mem2, size_t n); Funkce memcpy zkopíruje n bajtů z adresy mem2 na adresu mem1 a vrátí mem1. Pokud se zdrojová a cílová paměť překrývají, není chování funkce definováno. Funkce předpokládá, že má přístup k potřebné paměti: na adrese mem1 musí být alokována dostatečně velká paměť a na adrese mem2 musí být dostatečně mnoho bajtů pro čtení. V opačném případě je chování funkce nedefinováno a může vést k havárii programu. Příkladem použítí funkce je kopírování pole. kopirovani pole: predpokladejme, ze source a target jsou pole typu int o size prvcich. kopie prvku cyklem int i; for(i=0; i<m; i+=1) target[i] = source[i]; kopie pomoci memcpy memcpy(foo, bar, sizeof(int) * m); Druhou funkcí je memmove. void *memmove(void *mem1, void *mem2, size_t n); memmove funguje obdobně jako memcpy. Rozdíl je v tom, že kopírování proběhne správně i v případě, kdy se zdrojová a cílová pamět překrývají. Funkce memset nastaví obsah všech bajtů paměti na požadovanou hodnotu. void *memset(void *mem, int c, size_t n); Jako parametry se funkci předává adresa začátku paměti, hodnota, na kterou chceme bajty nastavit, a počet bajtů, které chceme nastavit. Cílová hodnota se předává funkci jako int, ve funkci je přetypována na unsigned char. Funkce vrací pointer mem. Často se využívá například k vynulování paměti.

19 16 vynulovani pole: predpokladame, ze array je pole o m prvcich vynulovani cyklem int i; for(i=0; i<m; i+=1) array[i] = 0; vynulovani pomoci memset memset(array, 0, sizeof(int) * m); 2.4 Úkoly 1. Upravte funkci delete_from_bag tak, se velikost struktury v paměti zmenšovala vždy, když je struktura zaplněna z méně než jedné čtvrtiny, současně však musí mít kapacitu nejméně BAG_START_SIZE. 2. Implementujte funkci s hlavičkou char *string_concatenate(char *s1, char *s2); která vytvoří nový řetězec spojením řetězců s1 a s2. Ve funkci využijte standardní funkci memcpy. 3. Implementujte vlastní verzi knihovní funkce memmove. Například tedy funkci s hlavičkou void *my_memmove(void *src, void *dest, unsigned int n); která přesune n bajtů paměti z adresy src na adresu dest. Funkce musí fungovat korektně i pokud se zdrojový a cílový blok paměti překrývají! 4. V podobném duchu, jako je implementována datová struktura bag v příkladu z textu implementujte zásobník a frontu (stačí, budeme-li do nich ukládat int).

Základy programování 2 KMI/ZP2

Základy programování 2 KMI/ZP2 Základy programování 2 KMI/ZP2 Petr Osička KATEDRA INFORMATIKY UNIVERZITA PALACKÉHO V OLOMOUCI Adresování paměti Adresování paměti Posloupnost bajtů očíslovaných od nuly podobně jako pole. Adresa = index

Více

ZÁKLADY PROGRAMOVÁNÍ V C

ZÁKLADY PROGRAMOVÁNÍ V C ZÁKLADY PROGRAMOVÁNÍ V C poznámky pro Základy programování 2 Petr Osička i Tento text je doplňkovým učebním textem k semináři Základy programování 2 vyučovanému na Katedře informatiky Přírodovědecké fakulty

Více

Základy programování (IZP)

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

Pointery II. Jan Hnilica Počítačové modelování 17

Pointery II. Jan Hnilica Počítačové modelování 17 Pointery II 1 Pointery a pole Dosavadní způsob práce s poli zahrnoval: definici pole jakožto kolekce proměnných (prvků) jednoho typu, umístěných v paměti za sebou int pole[10]; práci s jednotlivými prvky

Více

Práce s pamětí a předávání parametrů. Úvod do programování 1

Práce s pamětí a předávání parametrů. Úvod do programování 1 Práce s pamětí a předávání parametrů Úvod do programování 1 Motivace Zatím jsme se setkali s následjícími problémy : Proměnná existje / je dostpná jen v blok, kde vznikla Pole existje v blok, kde bylo

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

Základy programování (IZP)

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

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

Lineární spojový seznam (úvod do dynamických datových struktur)

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

Základy programování (IZP)

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

Práce s polem a pamětí

Práce s polem a pamětí 3 Práce s polem a pamětí Inicializace jednorozměrného pole Jednorozměrné pole lze inicializovat přímo v deklaraci. int array[length] = {1, 5, 8, 9; array1d Prvky pole umístíte do složených závorek a oddělíte

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

Př. další použití pointerů

Př. 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íce

Základy programování (IZP)

Základy programování (IZP) Základy programování (IZP) Páté počítačové cvičení Brno University of Technology, Faculty of Information Technology Božetěchova 1/2, 612 66 Brno - Královo Pole Petr Veigend, iveigend@fit.vutbr.cz 5. týden

Více

Programování v C++, 2. cvičení

Programování v C++, 2. cvičení Programování v C++, 2. cvičení 1 1 Fakulta jaderná a fyzikálně inženýrská České vysoké učení technické v Praze Zimní semestr 2018/2019 Přehled 1 Operátory new a delete 2 3 Operátory new a delete minule

Více

Strukturu lze funkci předat: (pole[i])+j. switch(výraz) velikost ukazatele

Strukturu lze funkci předat: (pole[i])+j. switch(výraz) velikost ukazatele Strukturu lze funkci předat: hodnotou i pomocí ukazatele pouze pomocí ukazatele (reference na strukturu) pouze hodnotou (kopie struktury) (pole[i])+j adresa prvku na souřadnicích i, j adresa i-tého řádku

Více

Struktura programu v době běhu

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

8. lekce Úvod do jazyka C 3. část Základní příkazy jazyka C Miroslav Jílek

8. lekce Úvod do jazyka C 3. část Základní příkazy jazyka C Miroslav Jílek 8. lekce Úvod do jazyka C 3. část Základní příkazy jazyka C Miroslav Jílek 1/41 Základní příkazy Všechny příkazy se píšou malými písmeny! Za většinou příkazů musí být středník (;)! 2/41 Základní příkazy

Více

Spojová implementace lineárních datových struktur

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

Správa paměti. doc. Ing. Miroslav Beneš, Ph.D. katedra informatiky FEI VŠB-TUO A-1007 /

Správa paměti. doc. Ing. Miroslav Beneš, Ph.D. katedra informatiky FEI VŠB-TUO A-1007 / Správa paměti doc. Ing. Miroslav Beneš, Ph.D. katedra informatiky FEI VŠB-TUO A-1007 / 597 324 213 http://www.cs.vsb.cz/benes Miroslav.Benes@vsb.cz Obsah přednášky Motivace Úrovně správy paměti. Manuální

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

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

Aplikace Embedded systémů v Mechatronice. Michal Bastl A2/713a

Aplikace Embedded systémů v Mechatronice. Michal Bastl A2/713a Aplikace Embedded systémů v Mechatronice Michal Bastl A2/713a Aplikace Embedded systémů v Mechatronice Obsah přednášky: Opakování Pointery v C pole a řetězce předání funkci referencí Vlastní datové typy

Více

ZPRO v "C" Ing. Vít Hanousek. verze 0.3

ZPRO v C Ing. Vít Hanousek. verze 0.3 verze 0.3 Hello World Nejjednoduší program ukazující vypsání textu. #include using namespace std; int main(void) { cout

Více

int ii char [16] double dd název adresa / proměnná N = nevyužito xxx xxx xxx N xxx xxx N xxx N

int ii char [16] double dd název adresa / proměnná N = nevyužito xxx xxx xxx N xxx xxx N xxx N Struktura (union) - struktura a union jsou složené typy, které "v sobě" mohou obsahovat více proměnných - struktura obsahuje v každém okamžiku všechny své proměnné, union obsahuje (=je "aktivní") pouze

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

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007 Úvod do programovacích jazyků (Java) Michal Krátký 1 Katedra informatiky VŠB Technická univerzita Ostrava Úvod do programovacích jazyků (Java), 2006/2007 c 2006 Michal Krátký Úvod do programovacích jazyků

Více

Pokroč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++ 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íce

for (int i = 0; i < sizeof(hodnoty) / sizeof(int); i++) { cout<<hodonoty[i]<< endl; } cin.get(); return 0; }

for (int i = 0; i < sizeof(hodnoty) / sizeof(int); i++) { cout<<hodonoty[i]<< endl; } cin.get(); return 0; } Pole Kdybychom v jazyce C++chtěli načíst větší počet čísel nebo znaků a všechny bylo by nutné všechny tyto hodnoty nadále uchovávat v paměti počítače, tak by bylo potřeba v paměti počítače alokovat stejný

Více

Obsah. Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15

Obsah. Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15 Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15 KAPITOLA 1 Úvod do programo vání v jazyce C++ 17 Základní pojmy 17 Proměnné a konstanty 18 Typy příkazů 18 IDE integrované vývojové

Více

Ukazatele, dynamická alokace

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

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

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme: 1. lekce 1. Minimální program do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme: #include #include int main() { printf("hello world!\n"); return 0; 2.

Více

Úvod do programovacích jazyků (Java)

Úvod do programovacích jazyků (Java) Úvod do programovacích jazyků (Java) Michal Krátký Katedra informatiky VŠB Technická univerzita Ostrava Úvod do programovacích jazyků (Java), 2007/2008 c 2006 2008 Michal Krátký Úvod do programovacích

Více

PB071 Programování v jazyce C Jaro 2015

PB071 Programování v jazyce C Jaro 2015 Programování v jazyce C Jaro 2015 Argumenty main(), Typový systém, Dynamická alokace Organizační Polosemestrální test Úterý 7. dubna v 10:00 a 11:00 v D1 20 bodů rozdíl mezi E a C Zdroj: http://www.bugemos.com/?node=342

Více

Pokročilé programování v jazyce C pro chemiky (C3220) Statické proměnné a metody, šablony v C++

Pokročilé programování v jazyce C pro chemiky (C3220) Statické proměnné a metody, šablony v C++ Pokročilé programování v jazyce C pro chemiky (C3220) Statické proměnné a metody, šablony v C++ Globální konstantní proměnné Konstantní proměnné specifikujeme s klíčovým slovem const, tyto konstantní proměné

Více

Úvod do programovacích jazyků (Java)

Úvod do programovacích jazyků (Java) Úvod do programovacích jazyků (Java) Michal Krátký Katedra informatiky VŠB Technická univerzita Ostrava Úvod do programovacích jazyků (Java), 2007/2008 c 2006 2008 Michal Krátký Úvod do programovacích

Více

Mělká a hluboká kopie

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

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

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

Konstruktory a destruktory

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

Ukazatele #2, dynamická alokace paměti

Ukazatele #2, dynamická alokace paměti Ukazatele #2, dynamická alokace paměti BI-PA1 Programování a Algoritmizace 1 Miroslav Baĺık, Ladislav Vagner a Josef Vogel Katedra teoretické informatiky a Katedra softwarového inženýrství Fakulta informačních

Více

Strukturované typy a ukazatele. Úvod do programování 1 Tomáš Kühr

Strukturované typy a ukazatele. Úvod do programování 1 Tomáš Kühr Strukturované typy a ukazatele Úvod do programování 1 Tomáš Kühr Motivace Se základními datovými typy si sice vystačíme Někdy to ale může být nepříjemně nepřehledné Příklady: long double soucet(const long

Více

Výrazy, operace, příkazy

Výrazy, operace, příkazy Výrazy, operace, příkazy Karel Richta a kol. katedra počítačů FEL ČVUT v Praze Přednášky byly připraveny s pomocí materiálů, které vyrobili Ladislav Vágner, Pavel Strnad Karel Richta, Martin Hořeňovský,

Více

Pole a Funkce. Úvod do programování 1 Tomáš Kühr

Pole a Funkce. Úvod do programování 1 Tomáš Kühr Pole a Funkce Úvod do programování 1 Tomáš Kühr (Jednorozměrné) pole u Datová struktura u Lineární u Homogenní = prvky stejného datového typu u Statická = předem určený počet prvků u Pole umožňuje pohodlně

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

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.

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

Základní datové typy, proměnné - deklarujeme předem - C je case sensitive rozlišuje malá a velká písmena v názvech proměnných a funkcí

Základní datové typy, proměnné - deklarujeme předem - C je case sensitive rozlišuje malá a velká písmena v názvech proměnných a funkcí 02 Jazyk C - je imperativní říkáme, co se má udělat, voláme příkazy - další imperativní jazyky: Pascal, Java, C/C++ apod. - na rozdíl od jazyků deklarativních např. Prolog, Haskell, Scheme, Lisp (funkcionální

Více

PB071 Programování v jazyce C Jaro 2017

PB071 Programování v jazyce C Jaro 2017 Programování v jazyce C Jaro 2017 Typový systém, Dynamická alokace Typový systém Typový systém - motivace Celé znaménkové číslo se reprezentuje nejčastěji v dvojkovém doplňkovém kódu ival1 = 5 (dvojkový

Více

BI-PA1 Programování a algoritmizace 1, ZS Katedra teoretické informatiky

BI-PA1 Programování a algoritmizace 1, ZS Katedra teoretické informatiky 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 Ukazatele BI-PA1

Více

Programování v jazyce C pro chemiky (C2160) 3. Příkaz switch, příkaz cyklu for, operátory ++ a --, pole

Programování v jazyce C pro chemiky (C2160) 3. Příkaz switch, příkaz cyklu for, operátory ++ a --, pole Programování v jazyce C pro chemiky (C2160) 3. Příkaz switch, příkaz cyklu for, operátory ++ a --, pole Příkaz switch Příkaz switch provede příslušnou skupinu příkazů na základě hodnoty proměnné (celočíselné

Více

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme: 1. lekce 1. Minimální program do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme: #include #include int main() { printf("hello world!\n"); return 0; 2.

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

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

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

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

8 Třídy, objekty, metody, předávání argumentů metod

8 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

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

Základy programování (IZP)

Základy programování (IZP) Základy programování (IZP) Čtvrté počítačové cvičení Brno University of Technology, Faculty of Information Technology Božetěchova 1/2, 612 66 Brno - Královo Pole Petr Veigend, iveigend@fit.vutbr.cz 4.

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

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

- jak udělat konstantu long int: L long velka = 78L;

- jak udělat konstantu long int: L long velka = 78L; Konstanty (konstatní hodnoty) Např.: - desítkové: 25, 45, 567, 45.678 - osmičkové: 045, 023, 03 vždy začínají 0 - šestnáctkové: 0x12, 0xF2, 0Xcd, 0xff, 0xFF - jak udělat konstantu long int: 245566553L

Více

Dynamická alokace paměti

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

Programování v jazyce C a C++

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

4. Typ ukazatel, strukturované datové typy

4. Typ ukazatel, strukturované datové typy Učební cíle a kompetence Anotace kapitoly Časová náročnost 4. Typ ukazatel, strukturované datové typy Po prostudování této kapitoly studující pochopí datový typ ukazatel, speciální ukazatelové operátory,

Více

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

Algoritmizace a programování

Algoritmizace a programování Algoritmizace a programování Strukturované proměnné Struktura, union Jazyk C České vysoké učení technické Fakulta elektrotechnická A8B14ADP Jazyk C - Strukturované proměnné Ver.1.10 J. Zděnek 20151 Struktura

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

BI-PA1 Programování a algoritmizace 1 Katedra teoretické informatiky

BI-PA1 Programování a algoritmizace 1 Katedra teoretické informatiky 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 Ukazatele BI-PA1

Více

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

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

Základní datové struktury

Základní datové struktury Základní datové struktury Martin Trnečka Katedra informatiky, Přírodovědecká fakulta Univerzita Palackého v Olomouci 4. listopadu 2013 Martin Trnečka (UPOL) Algoritmická matematika 1 4. listopadu 2013

Více

Algoritmizace a programování

Algoritmizace a programování Algoritmizace a programování Strukturované proměnné Pole (array), ukazatele (pointer) Jazyk C České vysoké učení technické Fakulta elektrotechnická Ver.1.10 J. Zděnek 2015 Pole (array) (1) Pole je množina

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

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

PB161 Programování v jazyce C++ Přednáška 4 PB161 Programování v jazyce C++ Přednáška 4 Dynamická alokace Kopírovací konstruktor Přetypování v C++ Nikola Beneš 12. října 2015 PB161 přednáška 4: dynamická alokace, kopírovací konstruktor, casting

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

PB071 Programování v jazyce C Jaro 2013

PB071 Programování v jazyce C Jaro 2013 Programování v jazyce C Jaro 2013 Uživatelské datové typy, dynamické struktury a jejich ladění Organizační Organizační Vnitrosemetrální test 7.4. Dotazník k domácím úkolům informační, nebodovaný, pomáhá

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

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

PB071 Programování v jazyce C

PB071 Programování v jazyce C Programování v jazyce C Argumenty main(), Typový systém, Dynamická alokace Úvod do C, 14.3.2012 1/43 Organizační Úvod do C, 14.3.2012 2/43 Organizační Termíny vypisování dalších domácích úkolů 3. domácí

Více

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

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

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

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

5 Přehled operátorů, příkazy, přetypování 5 Přehled operátorů, příkazy, přetypování Studijní cíl Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně budou uvedeny detaily týkající se operátorů. Doba nutná k nastudování

Více

Např.: // v hlavičkovém souboru nebo na začátku // programu (pod include): typedef struct { char jmeno[20]; char prijmeni[20]; int rok_nar; } CLOVEK;

Např.: // v hlavičkovém souboru nebo na začátku // programu (pod include): typedef struct { char jmeno[20]; char prijmeni[20]; int rok_nar; } CLOVEK; Struktury - složený datový typ. - datový typ jehož položky jsou jiné proměnné: - používá obvykle dohromady s příkazem typedef nechci vypisovat opakovaně složitou deklaraci pomocí typedef udělám nový datový

Více

Programování v C++ 2, 4. cvičení

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

Martin Flusser. Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague. December 7, 2016

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

Výrazy, operace, příkazy

Výrazy, operace, příkazy Výrazy, operace, příkazy Karel Richta a kol. katedra počítačů FEL ČVUT v Praze Přednášky byly připraveny i s pomocí materiálů, které vyrobili Ladislav Vágner, Pavel Strnad Karel Richta, Martin Hořeňovský,

Více

Programovací jazyk Pascal

Programovací jazyk Pascal Programovací jazyk Pascal Syntaktická pravidla (syntaxe jazyka) přesná pravidla pro zápis příkazů Sémantická pravidla (sémantika jazyka) pravidla, která každému příkazu přiřadí přesný význam Všechny konstrukce

Více

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

Lekce 6 IMPLEMENTACE OPERAČNÍHO SYSTÉMU LINUX DO VÝUKY INFORMAČNÍCH TECHNOLOGIÍ JAZYK C Identifikační údaje školy Číslo projektu Název projektu Číslo a název šablony Autor Tematická oblast Číslo a název materiálu Anotace Vyšší odborná škola a Střední škola, Varnsdorf, příspěvková organizace

Více

PB071 Principy nízkoúrovňového programování

PB071 Principy nízkoúrovňového programování Principy nízkoúrovňového programování Typový systém, Dynamická alokace Slidy pro komentáře (děkuji!): https://drive.google.com/open?id=1tnv JzyDVOb_2p9emjqyv-z-7vs80AyYQ Pokus: komentáře ke slidům Komentář

Více

Ukazatele #1, struktury

Ukazatele #1, struktury Ukazatele #1, struktury BI-PA1 Programování a Algoritmizace 1 Miroslav Baĺık, Ladislav Vagner a Josef Vogel Katedra teoretické informatiky a Katedra softwarového inženýrství Fakulta informačních technologíı

Více

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007 Úvod do programovacích jazyků (Java) Michal Krátký Katedra informatiky VŠB Technická univerzita Ostrava Úvod do programovacích jazyků (Java), 2006/2007 c 2006 Michal Krátký Úvod do programovacích jazyků

Více

Úvod do programování 7. hodina

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

Připravil: David Procházka. Vertex Buffer Objects

Připravil: David Procházka. Vertex Buffer Objects 30. září 2013, Brno Připravil: David Procházka Vertex Buffer Objects Počítačová grafika 2 Obsah přednášky Strana 2 / 22 Obsah přednášky 1 Obsah přednášky 2 Vertex Buffer Objects 3 Příklady 4 Shrnutí Obsah

Více

Základy programování (IZP)

Základy programování (IZP) Základy programování (IZP) Osmé 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 20.11.2017,

Více

Programování v jazyce C pro chemiky (C2160) 6. Funkce, struktury

Programování v jazyce C pro chemiky (C2160) 6. Funkce, struktury Programování v jazyce C pro chemiky (C2160) 6. Funkce, struktury Funkce Program v jazyce C je strukturován do funkcí Příkazy jazyka C nelze nikdy uvádět mimo funkce Program začíná funkcí main(), z ní lze

Více

Kolekce, cyklus foreach

Kolekce, cyklus foreach Kolekce, cyklus foreach Jen informativně Kolekce = seskupení prvků (objektů) Jednu již známe pole (Array) Kolekce v C# = třída, která implementuje IEnumerable (ICollection) Cyklus foreach ArrayList pro

Více

Pole a kolekce. v C#, Javě a C++

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