Základy programování 2 KMI/ZP2
|
|
- Hana Navrátilová
- před 5 lety
- Počet zobrazení:
Transkript
1 Základy programování 2 KMI/ZP2 Petr Osička KATEDRA INFORMATIKY UNIVERZITA PALACKÉHO V OLOMOUCI
2 Adresování paměti Adresování paměti Posloupnost bajtů očíslovaných od nuly podobně jako pole. Adresa = index bajtu. Vše v programu je někde v paměti (dokonce i instrukce) a je na nějaké adrese Adresa vícebajtového objektu: adresa prvního bajtu Virtuální paměť: program žije v iluzi toho, že má k dispozici celý adresní prostor, o umisťování do paměti a mapování na fyzickou pamět se stará OS. Adresní rozsah bývá dán velikostí adresy (např. 32 bitů, 64 bitů) Programátor může explicitně zjistit, co je uloženo na dané adrese zjistit, na jaké adrese je daný objekt uložen Osička (Univerzita Palackého v Olomouci) ALS2 LS / 33
3 Typ pro uložení adresy K existujícímu typu x existuje typ adresa hodnoty typu x, např. k typu int existuje typ adresa hodnoty typu int Takovým proměnným říkáme pointer na x, např. pointer na int Typ pointer na typ x označujeme jako x *, typ pointer na int je tedy označován jako int *. Hodnota pointeru je také uložena v paměti, existuje tedy pointer na pointer na x atd. /* * promenne pt a pt2 jsou pointery na int, * promenna h je obycejna promenna typu int. */ int *ptr, *ptr2, h; int a; int *pt1; int **pt2; Osička (Univerzita Palackého v Olomouci) ALS2 LS / 33
4 Operátory adresy a dereference 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; /* 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; Osička (Univerzita Palackého v Olomouci) ALS2 LS / 33
5 Program má přístup pouze k paměti, která mu byla přidělěna int *pt = 10; /* nasledujici radek program pravdepodobne shodi */ printf("%i\n", *pt); int *pt_1 = 0; int *pt_2 = NULL; /* test platnosti pointeru pt_1 */ if (!pt_1) { printf("pointer pt_1 obsahujici adresu %p je neplatny!\n", pt_1); /* test platnosti pointeru pt_2 */ if (!pt_2) { printf("pointer pt_2 obsahujici adresu %p je neplatny!\n", pt_2); Osička (Univerzita Palackého v Olomouci) ALS2 LS / 33
6 Pole degeneruje na pointer Pole alokované automaticky (= tak jsme to doposud dělali) ve stejném bloku ví o své velikosti. Jinde zdegeneruje na konstatní pointer ukazující na první bajt prvního prvku pole 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])); Osička (Univerzita Palackého v Olomouci) ALS2 LS / 33
7 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; Osička (Univerzita Palackého v Olomouci) ALS2 LS / 33
8 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); Osička (Univerzita Palackého v Olomouci) ALS2 LS / 33
9 Pointerová aritmetika K pointeru lze 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í funguje analogicky 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: %p \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; Osička (Univerzita Palackého v Olomouci) ALS2 LS / 33
10 Pointery a struktury struct my_structure { int item_a; double item_b; ; typedef struct my_structure my_structure; /* pak nekde v kodu */ 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; /* alternativni syntaxe pomoci sipky*/ int a = pt->item_a; pt->item_b = 29.6; Osička (Univerzita Palackého v Olomouci) ALS2 LS / 33
11 Kopírování struktur 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; Osička (Univerzita Palackého v Olomouci) ALS2 LS / 33
12 Větší struktury jako parametry funkcí /* misto teto definice funkce */ double fce (my_structure a) { /* 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; Osička (Univerzita Palackého v Olomouci) ALS2 LS / 33
13 Předávání argumentů odkazem int main() { int x, y; x = division(13, 5, &y); /* * v promenne x je 2 * v promenne y je 3 */ Osička (Univerzita Palackého v Olomouci) ALS2 LS / 33 int division(int a, int b, int *remainder) { int result = a / b; /* na adresu remainder ulozime zbytek po deleni */ *remainder = a % b; return result;
14 void pointer a přetypování typové označení void * nelze dereferencovat implicitní přetypování z a na void pointer při přiřazení, předávání argumentů funkcím. využití pro práci s pamětí různých typů, tam kde není potřeba znát typ apod. Osička (Univerzita Palackého v Olomouci) ALS2 LS / 33
15 /* 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; Osička (Univerzita Palackého v Olomouci) ALS2 LS / 33
16 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); 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; Osička (Univerzita Palackého v Olomouci) ALS2 LS / 33
17 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ě. Osička (Univerzita Palackého v Olomouci) ALS2 LS / 33
18 Automatická alokace a dealokace V tomto režimu jsou globální a lokální proměnné a pole všech typů (včetně struktur!) statické proměnné a pole ve funkcích všech typů Princip fungování 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. Lokální proměnné a pole ve funkcích: 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čí. Osička (Univerzita Palackého v Olomouci) ALS2 LS / 33
19 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; Osička (Univerzita Palackého v Olomouci) ALS2 LS / 33
20 Statické lokální proměnné 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. 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. Osička (Univerzita Palackého v Olomouci) ALS2 LS / 33
21 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; Osička (Univerzita Palackého v Olomouci) ALS2 LS / 33
22 Manuální alokace a dealokace Funkce standardni knihovny (alokátor tam implementovaný). void *malloc(size_t memory_size); 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. void *calloc(size_t n, size_t unit_size); Bere dva argumenty, počet položek, které chceme alokovat a velikost jedné položky v bajtech. Všechny bajty alokované paměti jsou nastaveny na hodnotu 0. Jinak se chová jako malloc. Osička (Univerzita Palackého v Olomouci) ALS2 LS / 33
23 void free(void *ptr); slouží k uvolnění paměti, kterou jsme předtím manuálně alokovali 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. void realloc(void *ptr, size_t memmory_size); změna velikosti alokované paměti 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. Osička (Univerzita Palackého v Olomouci) ALS2 LS / 33
24 /* 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)); Osička (Univerzita Palackého v Olomouci) ALS2 LS / 33
25 /* 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; Osička (Univerzita Palackého v Olomouci) ALS2 LS / 33
26 Příklad 1 int *make_interval(int a, int b) { int size = b - a; int i; 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; Osička (Univerzita Palackého v Olomouci) ALS2 LS / 33
27 Příklad 2 /* bag ~ multimnozina prvku pridavani a odebirani prvku testovani poctu vyskytu daneho prvku automaticke zvetsovani, kdyz dojde kapacita */ #define BAG_START_SIZE 100 typedef struct { int *data; int size; int head; bag; Osička (Univerzita Palackého v Olomouci) ALS2 LS / 33
28 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; Osička (Univerzita Palackého v Olomouci) ALS2 LS / 33
29 /* vraci 1, kdyz se pridani povede vraci 0, kdyz se pridani nepovede */ 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; Osička (Univerzita Palackého v Olomouci) ALS2 LS / 33
30 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 prvkem a snizenim head o 1 */ if(i!= b->head){ b->data[i] = b->data[b->head-1]; b->head -= 1; Osička (Univerzita Palackého v Olomouci) ALS2 LS / 33
31 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; Osička (Univerzita Palackého v Olomouci) ALS2 LS / 33
32 Další funkce pro práci s pamětí void *memcpy(void *mem1, void *mem2, size_t n); zkopíruje n bajtů z adresy mem2 na adresu mem1 a vrátí mem1, pamět se nesmí překrývat. 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. /* 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); Osička (Univerzita Palackého v Olomouci) ALS2 LS / 33
33 void *memmove(void *mem1, void *mem2, size_t n); Memmove funguje stejně jako memcpy, ovšem s tím rozdílem, že kopírování proběhne správně i v případě, kdy se zdrojová a cílová pamět překrývají. 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. /* vynulovani pole array o velikosti m a typu int)*/ memset(array, 0, sizeof(int) * m); Osička (Univerzita Palackého v Olomouci) ALS2 LS / 33
34 Pitfalls Memory leaking: alokujeme paměť a pak ji nedealokujeme (a často navíc zapomeneme její adresu). Dvojí dealokace: použijeme free na adresu jiz dealokované paměti int *ptr = 0; /* do stuff... */ if (ptr) { free(ptr); ptr = 0; Zodpovědnost: kdo alokuje a kdo dealokuje, vlastnictví paměti (objektů), životní cyklus paměti atd. Nástroje kontrolující chování paměti za běhu, např. Valgrind Osička (Univerzita Palackého v Olomouci) ALS2 LS / 33
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í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íceZÁ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ícePrá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í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í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ícePrá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í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í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íceSprá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í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ícePB071 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í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í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ícePB071 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í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íceMichal 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í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í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í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íceUkazatele #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ícePB071 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ícePB071 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í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í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í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í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í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í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ícePB161 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í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í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í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í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í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íceAplikace 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íce8. 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í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í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í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í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ícePB přednáška (12. října 2015)
PB161 3. přednáška (12. října 2015) Poznámky k domácímu úkolu Dynamická alokace Statická vs. dynamická alokace statická alokace na zásobníku (stack) deklarace uvnitř bloku (lokální proměnné) automatické
VíceStrukturované 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íceVý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í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í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ícePB071 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íce4. 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íceZá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í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ícePB161 Programování v jazyce C++ Přednáška 5
PB161 Programování v jazyce C++ Přednáška 5 Práce s pamětí Princip RAII Nikola Beneš 16. října 2017 PB161 přednáška 5: práce s pamětí, princip RAII 16. října 2017 1 / 25 Práce s pamětí PB161 přednáška
VícePráce s řetězci. IUJCE Přednáška č. 10. string.h. vrací: délku řetězce str (bez '\0')
Práce s řetězci string.h size_t strlen(const char *str); délku řetězce str (bez '\0') int strcmp(const char *str1, const char *str2); porovná řetězce o
VíceProgramování v jazyce JavaScript
Programování v jazyce JavaScript Katedra softwarového inženýrství Fakulta informačních technologií České vysoké učení technické v Praze Pavel Štěpán, 2011 Anonymní funkce BI-JSC Evropský sociální fond
VíceZá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í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íceSpráva paměti. Ing. Marek Běhálek katedra informatiky FEI VŠB-TUO A-1018 / 597 324 251 http://www.cs.vsb.cz/behalek marek.behalek@vsb.
Správa paměti Ing. Marek Běhálek katedra informatiky FEI VŠB-TUO A-1018 / 597 324 251 http://www.cs.vsb.cz/behalek marek.behalek@vsb.cz Obsah přednášky Motivace Úrovně správy paměti. Manuální a automatická
VíceAlgoritmizace 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í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í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í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í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íceVý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íceZá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íceLekce 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íceZá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íceSpráva paměti. Správa paměti. (c)marek Běhálek, Katedra informatiky FEI VŠB-TU Ostrava 1. Motivace. Úrovně správy paměti. Obsah přednášky.
Motivace Správa paměti Ing. Marek Běhálek katedra informatiky FEI VŠB-TUO A-1018 / 597 324 251 http://www.cs.vsb.cz/behalek marek.behalek@vsb.cz Statické přidělení paměti Známe předem velikost i počet
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í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ícePokroč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ícePB161 Programování v jazyce C++ Přednáška 5
PB161 Programování v jazyce C++ Přednáška 5 Práce s pamětí Princip RAII Lehký úvod do výjimek Nikola Beneš 16. října 2018 PB161 přednáška 5: práce s pamětí, princip RAII, lehce výjimky 16. října 2018 1
VíceProgramovanie v jazyku C - to chce dynamiku
CVIČENIE 8/13 (S7) Programovanie v jazyku C - to chce dynamiku About rozdiel medzi statickou a dynamickou alokaciou pamate pre c objekty, spojkove zoznamy Basic knowledge kazda premenna musi mat pocas
VícePokročilé programování v jazyce C pro chemiky (C3220) Pokročilá témata jazyka C++
Pokročilé programování v jazyce C pro chemiky (C3220) Pokročilá témata jazyka C++ Prostory jmen U programů mohou někdy nastat kolize mezi jmény (tříd, funkcí, globálních proměnných atd.) pokud v různých
Více11a Dynamické dvourozměrné pole (obdobně vícerozměrné)
11a Dynamické dvourozměrné pole (obdobně vícerozměrné) počet hvězdiček == počet rozměrů (dimenze pole) int **p_2d; int radku, sloupcu; printf("zadejte pocet radku a sloupcu pole:"); scanf("%d,%d", &radku,
VíceÚ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íceSpráva paměti. Ing. Marek Běhálek katedra informatiky FEI VŠB-TUO A-1018 /
Správa paměti Ing. Marek Běhálek katedra informatiky FEI VŠB-TUO A-1018 / 597 324 251 http://www.cs.vsb.cz/behalek marek.behalek@vsb.cz Obsah přednášky Motivace Úrovně správy paměti. Manuální a automatická
VíceNapř.: // 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í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íceUkazatele, paměťové třídy, volání funkcí
Ukazatele, paměťové třídy, volání funkcí Jan Faigl Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Přednáška 06 B0B36PRP Procedurální programování Jan Faigl, 2018 B0B36PRP
VíceProgramová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íceStromy. Jan Hnilica Počítačové modelování 14
Stromy Jan Hnilica Počítačové modelování 14 1 Základní pojmy strom = dynamická datová struktura, složená z vrcholů (uzlů, prvků) propojených hranami hrany chápeme jako orientované, tzn. vedou z uzlu A
Více14.4.2010. Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.
Základy programování (IZAPR) Přednáška 7 Ing. Michael Bažant, Ph.D. Katedra softwarových technologií Kancelář č. 229, Náměstí Čs. legií Michael.Bazant@upce.cz Obsah přednášky 7 Parametry metod, předávání
VíceTřídy a struktury v C++
katedra informatiky FEI VŠB-TU Ostrava 7. prosince 2015 Odvozené a strukturované typy dat v C základní datové typy součást normy jazyka, preprocesor použití netypových maker, raději voĺıme konstanty d
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í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íceÚvod do programování - Java. Cvičení č.4
Úvod do programování - Java Cvičení č.4 1 Sekvence (posloupnost) Sekvence je tvořena posloupností jednoho nebo více příkazů, které se provádějí v pevně daném pořadí. Příkaz se začne provádět až po ukončení
Více- 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íceZá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í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íceÚ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íceAlgoritmizace 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í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í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í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íceDistanč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.
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
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í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íceBI-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- dělají se také pomocí #define - podobné (použitím) funkcím - předpřipravená jsou např. v ctype.h. - jak na vlastní makro:
21.4.2009 Makra - dělají se také pomocí #define - podobné (použitím) funkcím - předpřipravená jsou např. v ctype.h - jak na vlastní makro: #define je_velke(c) ((c) >= 'A' && (c)
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íce