Vícerozměrná pole. Úvod do programování 2 Tomáš Kühr

Podobné dokumenty
Dynamická vícerozměrná pole. Základy programování 2 Tomáš Kühr

Základy jazyka C. Základy programování 1 Martin Kauer (Tomáš Kühr)

Základy jazyka C. Základy programování 1 Tomáš Kühr

Základy jazyka C. Základy programování 1 Martin Kauer (Tomáš Kühr)

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

Základy jazyka C. Úvod do programování 1 Tomáš Kühr

Základy jazyka C. Úvod do programování 1 Tomáš Kühr

Střední škola pedagogická, hotelnictví a služeb, Litoměříce, příspěvková organizace

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

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

POČÍTAČE A PROGRAMOVÁNÍ

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

6. lekce Úvod do jazyka C knihovny datové typy, definice proměnných základní struktura programu a jeho editace Miroslav Jílek

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

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

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

Funkce pokročilé možnosti. Úvod do programování 2 Tomáš Kühr

Algoritmizace a programování

2 Datové typy v jazyce C

Práce s binárními soubory. Základy programování 2 Tomáš Kühr

Název předmětu: Školní rok: Forma studia: Studijní obory: Ročník: Semestr: Typ předmětu: Rozsah a zakončení předmětu:

11a Dynamické dvourozměrné pole (obdobně vícerozměrné)

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

Vyučovací hodina. 1vyučovací hodina: 2vyučovací hodiny: Opakování z minulé hodiny. Procvičení nové látky

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

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

Základy programování (IZP)

Pole stručný úvod do začátku, podrobně později - zatím statická pole (ne dynamicky) - číslují se od 0

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

Střední škola pedagogická, hotelnictví a služeb, Litoměříce, příspěvková organizace

Základy programování (IZP)

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

Struktura programu v době běhu

Ukazatele #2, dynamická alokace paměti

Práce s polem a pamětí

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

Předměty. Algoritmizace a programování Seminář z programování. Verze pro akademický rok 2012/2013. Verze pro akademický rok 2012/2013

Programování III. Mgr. Monika Pinkasová. Zlepšování podmínek pro využívání ICT ve výuce a rozvoj výuky angličtiny na SPŠei Ostrava

Operační systémy. Cvičení 4: Programování v C pod Unixem

Úvod do programování - Java. Cvičení č.4

Programování v jazyce C pro chemiky (C2160) 11. Vizualizace sekvence proteinů

Ukazatele, dynamická alokace

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

4. Typ ukazatel, strukturované datové typy

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

Reprezentace dat v informačních systémech. Jaroslav Šmarda

Struktury a dynamické proměnné

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

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

Střední škola pedagogická, hotelnictví a služeb, Litoměříce, příspěvková organizace

Algoritmizace a programování. Ak. rok 2012/2013 vbp 1. ze 44

Odvozené a strukturované typy dat

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

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

Jazyk C++, některá rozšíření oproti C

Programování v jazyce C a C++

Koncepce (větších) programů. Základy programování 2 Tomáš Kühr

Pascal. Katedra aplikované kybernetiky. Ing. Miroslav Vavroušek. Verze 7

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

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

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

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

Ukazatele a pole. Chceme-li vyplnit celé pole nulami, použijeme prázdný inicializátor: 207 Čárka na konci seznamu inicializátorů

Práce se soubory. Úvod do programování 2 Tomáš Kühr

int t1, t2, t3, t4, t5, t6, t7, prumer; t1=sys.readint();... t7=sys.readint(); prume pru r = r = ( 1+t 1+t t3+ t3+ t4 t5+ t5+ +t7 +t7 )/ ;

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

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.

Úvod do programování. Lekce 1

ADT/ADS = abstraktní datové typy / struktury

Algoritmizace prostorových úloh

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

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

PROGRAMOVÁNÍ V JAZYCE C V PŘÍKLADECH 11 Dynamické datové struktury 11.1 Spojové struktury Příklad PROG_

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

IAJCE Přednáška č. 8. double tprumer = (t1 + t2 + t3 + t4 + t5 + t6 + t7) / 7; Console.Write("\nPrumerna teplota je {0}", tprumer);

Základy programování (IZP)

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

Objektově orientované programování

- dělají se také pomocí #define - podobné (použitím) funkcím - předpřipravená jsou např. v ctype.h. - jak na vlastní makro:

Algoritmizace a programování

Funkce, intuitivní chápání složitosti

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

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

Úvod do programovacích jazyků (Java)

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

Vysoké učení technické v Brně, Fakulta elektrotechniky a komunikačních technologií Ústav automatizace a měřící techniky. Semestrální projekt

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

Algoritmizace. Cíle předmětu

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

Jazyk C++ 1. Blok 3 Objektové typy jazyka C++ Třída. Studijní cíl. Doba nutná k nastudování. Průvodce studiem

Operátory. Základy programování 1 Martin Kauer (Tomáš Kühr)

Základy programování (IZP)

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

Základy programování (IZP)

Úvod do programování v jazyce Java

Algoritmizace prostorových úloh

Bitové operátory a bitová pole. Úvod do programování 2 Tomáš Kühr

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í

Cykly. Základy programování 1 Martin Kauer (Tomáš Kühr)

Profilová část maturitní zkoušky 2017/2018

Transkript:

Vícerozměrná pole Úvod do programování 2 Tomáš Kühr

Organizační záležitosti Konzultace Pracovna 5.043 Úterý 9.40 11.20 (oficiální) Pátek 8.30 9.40, dle potřeby Emailem tomas.kuhr@upol.cz Web předmětu: http://www.inf.upol.cz/kombinovane-studium/uvod-do-programovani-2 Sbírka úloh http://jazykc.inf.upol.cz/

Literatura Pavel Herout: Učebnice Jazyka C. Kopp, 2007. Brian W. Kernighan, Dennis M. Ritchie: Programovací jazyk C, Computer Press, 2006. Reek Kenneth: Pointers on C. Addison Wesley, 1997. Robert Sedgewick: Algorithms in C. Addison-Wesley Professional, 2001. Jeri R. Hanly, Elliot B. Koffman: Problem Solving and Program Design in C. Addison Wesley, 2006. Eric S. Roberts: Programming Abstractions in C. Addison Wesley, 1997. Eric S. Roberts: The Art and Science of C. Addison Wesley, 1994. a další

Zápočet Vzorné (přehledné a efektivní) vyřešení zadané úlohy Samostatně S možností využít své dříve vytvořené zdrojové soubory S možností využívat elektronickou i tištěnou literaturu Je možné pracovat na školním PC nebo svém notebooku Termíny budou vypsány před zkouškovým obdobím

Jednorozměrná pole připomenutí Definice: int pole[5] = { 1, 2, 3, 4, 5 }; Přístup k prvkům: pole[4] = 3; printf("%i", pole[2]); Vztah ukazatelů a polí: *(pole + i) zcela odpovídá pole[i] Datový typ prvků v poli může být libovolný Nabízí se tedy otázky: Lze vytvořit pole, jehož prvky budou pole? Jak s tímto vícerozměrným polem pracovat?

Vytvoření vícerozměrného pole Bez inicializace: typ identifikátor[velikost1]...[velikostn]; Příklady: int moje_matice[3][4]; float trojrozmerne[3][4][10]; S inicializací: typ identifikátor[v1]...[vn] = {bloky hodnot}; Příklady: int matice[2][3] = {{1, 2, 3}, {4, 5, 6}}; int m[2][3][4] = { {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}}, {{13, 14, 15, 16}, {17, 18, 19, 20}, {21, 22, 23, 24}}};

Práce s polem K prvků přistupujeme pomocí několika operátorů indexu [] Příklad: #define RADKY 3 #define SLOUPCE 4 int pole[radky][sloupce]; for (int i = 0; i<radky; i++) for (int k = 0; k<sloupce; k++) pole[i][k] = 1 + k + i * SLOUPCE; for (int i = 0; i<radky; i++){ for (int k = 0; k<sloupce; k++) printf("%i\t", pole[i][k]); printf("\n"); }

Uložení pole v paměti Prvky pole int x[2][3] jsou v paměti uloženy v pořadí: x[0][0], x[0][1], x[0][2], x[1][0], x[1][1], x[1][2]. Na dvourozměrné pole se lze dívat Jako na jednorozměrné pole jednorozměrných polí daného typu I jako na ukazatel na jednorozměrné pole daného typu Výraz x se vyhodnotí na adresu dvourozměrné pole Tato adresa je typu int[2][3] nebo int(*)[3] Výraz x[0] se vyhodnotí adresa prvního řádku Výraz x[1] pak bude adresa druhého řádku Obě výše uvedené adresy jsou typu int[3] neboli int* Přestože x a x[0] mají stejnou hodnotu Jsou x+1 a x[0]+1 jsou různé adresy

Pole jako parametr funkce Jednorozměrné: int maximum(int cisla[], int pocet){... } int maximum(int *cisla, int pocet){... }... int data[10] = {1, 45, 21, 5, 7, 2, 3, 35, 47, 4}; int max = maximum(data, 10); Dvourozměrné: int maxim(int cisla[][3], int radku){... } int maxim(int(*cisla)[3], int radku){... }... int data[2][3] = {{ 1, 45, 21 }, { 5, 7, 2 }}; int max = maxim(data, 2);

Pole jako parametr funkce Třírozměrné: int maxim(int cisla[][3][4], int prvni){... } int maxim(int(*cisla)[3][4], int prvni){... }... int data[2][3][4] = { {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}}, {{13, 14, 15, 16}, {17, 18, 19, 20}, {21, 22, 23, 24}}}; int max = maxim(data, 2); Parametrem lze zadat vždy jen první rozměr vstupního pole Proto se takto tato vícerozměrná pole obvykle nepoužívají

Statická vícerozměrná pole Příklad definice: int polea[2][3]; Nejjednodušší způsob vytvoření pole Pole je statické oba rozměry se zadávají konstantou Rozměry pole jsou dány již při kompilaci Jednotlivé řádky mají vždy stejnou délku Prvky jsou v paměti uloženy za sebou po jednotlivých řádcích

Dvourozměrné pole jako ukazatel na pole Příklad vytvoření: int(*poleb)[3]; poleb = (int(*)[3])malloc(2 * 3 * sizeof(int)); Přístup k prvkům je stejný jako u statického pole Při kompilaci je nutné znát pouze druhý rozměr pole První rozměr může být vypočítán až za běhu programu Jednotlivé řádky mají vždy stejnou délku Řádky jsou v paměti uloženy za sebou jako u statického pole Pole je ale uloženo v dynamicky alokované paměti

Dvourozměrné pole jako pole ukazatelů Příklad vytvoření: int *polec[2]; polec[0] = (int *)malloc(3 * sizeof(int)); polec[1] = (int *)malloc(3 * sizeof(int)); Přístup k prvkům je stejný jako u předchozích typů polí Při kompilaci je nutné znát pouze první rozměr pole Druhý rozměr pole je možné určit až za běhu programu Velikosti jednotlivých řádků nemusí být stejné Řádky jsou v paměti uloženy samostatně v dynamicky alokované paměti Pole ukazatelů na řádky je ale statické

Dvourozměrné pole jako ukazatel na ukazatel Příklad vytvoření: int **poled; poled = (int **)malloc(2 * sizeof(int *)); poled[0] = (int *)malloc(3 * sizeof(int)); poled[1] = (int *)malloc(3 * sizeof(int)); Přístup k prvkům je stejný jako u předchozích typů polí Oba rozměry mohou být určeny až za běhu programu Řádky jsou uloženy samostatně a nemusí mít stejnou délku Celé pole je uloženo v dynamicky alokované paměti Díky své flexibilitě jeden z nejpoužívanějších způsobů vytvoření vícerozměrného pole Řádky lze samozřejmě vytvářet pomocí cyklu

Shrnutí výhody a nevýhody Paměťové nároky: polea je paměťově nejvýhodnější žádné pomocné ukazatele Ostatní pole vyžadují paměť na uložení ukazatelů Navíc dynamická alokace paměti obvykle spotřebuje další paměť na svou administrativu Rychlost přístupu k prvkům: Obecně je přístup k běžným proměnným na zásobníku je rychlejší než přístup k dynamicky alokované paměti Přístup k prvkům polea je tedy nejrychlejší Naopak nejpomalejší bude pravděpodobně přístup k prvkům poled, kde se jde přes 2 ukazatele do dyn. alokované paměti

Pole textových řetězců Používané relativně často v programech, které pracují s textem Obvykle dvourozměrné pole typu polec nebo poled Příklad: char *texty[3]; texty[0] = "Jedna"; texty[1] = strdup("dva"); texty[2] = (char *)malloc(4 * sizeof(char)); strcpy(texty[2], "Tri"); Pokud použijeme za identifikátorem pole pouze jeden index, pracujeme s celým řetězcem printf("%s\n", texty[1]);

Jak číst (a psát) složitější deklarace? Příklad: int *(*x)[3]; Najdeme identifikátor x a čteme: x je Od identifikátoru čteme doprava, dokud nenarazíme na ) nebo ; ) nás vrací na odpovídající ( Od ní čteme doprava až po již přečtený text: ukazatel na Přeskočíme již zpracovaný text a pokračujeme Opět dokud nenarazíme na ) nebo ; tedy: pole 3 prvků typu Pokud narazíme na ;, přesuneme se na začátek již přečteného textu a čteme doleva: ukazatel na int Celkově: x je ukazatel na pole 3 prvků typu ukazatel na int

Pár příkladů navíc int *pole[2]; int (*pole)[3]; long double *f(int, double); long double *(*f)(); double *(*f[3])(double);

A pro jistotu i řešení int *polex[2]; polex je pole dvou prvků typu ukazatel na int int (*poley)[3]; poley je ukazatel na pole tří prvků typu int double *f(int, double); f je funkce s parametry typu int a double vracející ukazatel na double long double *(*f)(); f je ukzatel na funkci bez parametrů vracející ukazatel na long double double *(*f[3])(double); f je pole tří prvků typu ukazatel na funkci s parametrem typu double vracející ukazatel na double