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

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

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

Odvozené a strukturované typy dat

Zápis programu v jazyce C#

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

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

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

Ukazatele, dynamická alokace

ADT/ADS = abstraktní datové typy / struktury

Třídy a struktury v C++

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

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

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

Programovací jazyk C++ Hodina 1

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

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

Výrazy, operace, příkazy

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

Základy C++ I. Jan Hnilica Počítačové modelování 18

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

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

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

Algoritmizace a programování

Algoritmizace a programování

Algoritmizace a programování

Algoritmizace prostorových úloh

DUM 07 téma: Proměnné, konstanty a pohyb po buňkách ve VBA

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

Opakování programování

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

Data, výrazy, příkazy

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

Úvod do programovacích jazyků (Java)

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

Řešení sady 1. Úvod do programování 1 Tomáš Kühr

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

Programovací jazyk Pascal

Výrazy, operace, příkazy

Sada 1 - Základy programování

Pseudonáhodná čísla = algoritmicky generovaná náhrada za náhodná čísla

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

Základy jazyka C# Obsah přednášky. Architektura.NET Historie Vlastnosti jazyka C# Datové typy Příkazy Prostory jmen Třídy, rozhraní

O datových typech a jejich kontrole

Základy programování (IZP)

Prezentace a vysvětlení programového prostředí NXC

Základy programování (IZP)

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

Algoritmizace prostorových úloh

Jazyk C++ I. Šablony

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

Úvod do programovacích jazyků (Java)

Jazyk C# a platforma.net

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;

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

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

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 V PŘÍKLADECH 11 Dynamické datové struktury 11.1 Spojové struktury Příklad PROG_

2 Strukturované datové typy Pole Záznam Množina... 4

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

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

Datové typy v Javě. Tomáš Pitner, upravil Marek Šabo

Programování C++ Lukáš Tomášek. verze

Ing. Igor Kopetschke TUL, NTI

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

Proměnná. Datový typ. IAJCE Cvičení č. 3. Pojmenované místo v paměti sloužící pro uložení hodnoty.

NPRG030 Programování I, 2017/18 1 / :22:16

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

Program převod z desítkové na dvojkovou soustavu: /* Prevod desitkove na binarni */ #include <stdio.h>

Algoritmizace a programování

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

Základy programování (IZP)

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

PROMĚNNÉ, KONSTANTY A DATOVÉ TYPY TEORIE DATUM VYTVOŘENÍ: KLÍČOVÁ AKTIVITA: 02 PROGRAMOVÁNÍ 2. ROČNÍK (PRG2) HODINOVÁ DOTACE: 1

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

Algoritmizace prostorových úloh

7. Datové typy v Javě

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

Algoritmizace a programování

Elementární datové typy

Struktura programu, proměnné, konstanty, výrazy v jazycích C a C#

OBJECT DEFINITION LANGUAGE. Jonáš Klimeš NDBI001 Dotazovací Jazyky I 2013

typová konverze typová inference

6 Příkazy řízení toku

Mělká a hluboká kopie

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

2 Datové typy v jazyce C

Jazyk C++ I. Polymorfismus

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ý

Inovace a zkvalitnění výuky prostřednictvím ICT Základy programování a algoritmizace úloh. Ing. Hodál Jaroslav, Ph.D. VY_32_INOVACE_25 09

Větvení a cykly. Úvod do programování 1 Tomáš Kühr

Objektově orientované programování

Algoritmizace a programování

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

Jazyk C Program v jazyku C má následující strukturu: konstanty nebo proměnné musí Jednoduché datové typy: Strukturované datové typy Výrazy operátory

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

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

Základy programování (IZP)

IUJCE Přednáška č. 1. programování v C na vyšší úrovni základy objektově orientovaného programovaní v (C++, C#)

Algoritmizace a programování

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

Transkript:

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 double data[], int delka); int test_splnen; if (test(data)>10) test_splnen = 1; else test_splnen = 0; int dnes[3]; // datum dnes[0] = 5; dnes[1] = 11; dnes[2] = 2014; char jmeno_osoba[] = "Petr"; int narozen_osoba[3] = {30, 4, 1995}; 2

Vlastní datové typy Definujeme pomocí konstrukce typedef Definice typu obecně: typedef zápis_ve_tvaru_definice_proměnné; Příklady definice typu: typedef int cele_cislo; typedef int pole_deseti_cisel[10]; typedef unsigned long ULong; typedef const ULong CULong; typedef char string[]; Příklady použití typu (definice proměnné): cele_cislo pocet; pole_deseti_cisel moje_cisla; ULong velke_cislo; string jmeno = "Ales"; 3

Výčtové datové typy Definujeme obvykle pomocí typedef a enum Používá se pro definici spolu souvisejících celočíselných konstant Definice typu obecně: typedef enum{ jmeno1 = hodnota1,... jmenon = hodnotan } jmeno_typu; Příklad definice: typedef enum{ TRUE = 1, FALSE = 0 } boolean; Příklad použití typu: boolean vysledek = TRUE; 4

Příklady výčtové typy typedef enum{ FALSE, TRUE } boolean; typedef enum{ Po, Ut, St, Ct, Pa, So = 10, Ne } den; boolean splneno; boolean splneno = 1; boolean splneno = TRUE; den ZP1 = St; splneno = ZP1 * 5 - TRUE + Ut * So; 5

Strukturované datové typy Definujeme obvykle pomocí typedef a struct Uložení více souvisejících hodnot do 1 proměnné Hodnoty mohou být různých typů (rozdíl od pole) Definice strukturovaného typu obecně: typedef struct { typ1 jmeno_clenu1;... typn jmeno_clenu1; } jmeno_typu; Příklad definice: typedef struct { char den; char mesic; short rok; } datum; 6

Příklady strukturované typy Strukturované proměnné definujeme obvyklým způsobem: datum narozen; datum narozen = { 24, 3, 1972 }; Přístup ke členům proměnné pomocí operátoru tečka: datum muj_den, narozen, dnes; int vek; muj_den.den = 24; muj_den.mesic = 1 + (muj_den.mesic + 5) % 12; vek = dnes.rok - narozen.rok; 7

Struktury vs. pole Struktury mohou obsahovat položky různých datových typů Používáme je pro uložení různých informací o nějakém celku Struktury lze kopírovat přiřazením: narozen = dnes; Pole mohou obsahovat pouze položky jediného typu Používáme je pro uložení více datových položek, se kterými chceme pracovat jednotným způsobem Pole nelze kopírovat přiřazením: int cisla[] = { 2, 5, 11, 17, 23 }; int data[5]; data = cisla; 8

Složitější struktury Členem struktury může být jakýkoli datový typ Včetně polí, výčtových a strukturovaných datových typů: typedef struct { char jmeno[20]; datum narozen; } osoba; osoba teta = { "Eva", { 12, 3, 1989 } }; teta.jmeno[1] = 'm'; teta.narozen.den = 11; Členem struktury nemůže být ta samá struktura: typedef struct { char jmeno[20]; osoba partner; } osoba; Lze obejít použitím ukazatelů 9

Ukazatele Víme, že proměnné jsou za běhu programu uloženy v paměti Zatím nás ale nezajímalo kde Ukazatele = proměnné, které obsahují adresu (jiné proměnné) V literatuře se vyskytuje i anglický ekvivalent pointery Příklad: char znak = '!'; int cislo = 1073741824; 10

Vytvoření ukazatele Ukazatel je potřeba před použitím definovat V jazyku C rozlišujeme ukazatele pro práci s různými datovými typy (např. ukazatel na int, ukazatel na double, ukazatel na ukazatel na char) Typ ukazatele určuje, s jakými typy hodnot umí ukazatel pracovat Ukazatele jsou obvykle uloženy na 4/8 bytech (což není v ilustracích v této prezentaci dodržováno) Definice obecně: typ *identifikátor = inicializační_adresa; Příklady: char *adresa_znaku; double *adresa_cisla; long *adresa_celeho_cisla; int **adresa_adresy_cisla; char *retezec = "Ahoj svete"; 11

Práce s ukazateli Adresu proměnné zjistíme pomocí operátoru adresy & char znak = '!'; int cislo = 1073741824; char *adresa = &znak; scanf("%i", &cislo); Hodnotu na dané adrese zjistíme pomocí operátoru dereference * printf("%c %c\n", znak, *adresa); Správně to funguje pouze při použití odpovídajícího typu ukazatele 12

Dereference a typ ukazatele Dereference získá obsah paměti od dané adresy Jejíž velikost odpovídá typu ukazatele Příklady: char* adresaz = &znak; *adresaz = '?'; int* adresac; adresac = &cislo; *adresac = 666; printf("%c, %i\n", znak, cislo); 13

Aritmetika ukazatelů S ukazateli lze provádět pouze některé aritmetické operace: Přičtení nebo odečtení celého čísla Rozdíl dvou ukazatelů (stejného typu) Příklady: char p[] = { 2, 4, 8 }; short c[] = { 500, 600 }; char *ukp = &p[0]; short *ukc = &c[0]; printf("%i\n", *(ukp + 1)); // 4 printf("%i\n", *(ukc + 1)); // 600, deref. ukc+(1*sizeof(short)) 14

Aritmetika ukazatelů příklad int data[] = { 10, 20, 15, 30, 45, 0}; int hledane = 30; int *pom; pom = &data[0]; while (*pom) { printf("%i, ", *pom); if (*pom == hledane) break; pom++; } printf("nalezeno %d na indexu %d.\n", *pom, pom - &data[0]); 15

Ukazatele a pole Pole je konstantní ukazatel na svůj první prvek S poli a ukazateli na paměť zaplněnou daty daného typu se pracuje téměř stejně Příklad: char p[] = { 2, 4, 8, 16, 32 }; char *st = p; printf("%i, %i, %i\n", p[2], *(p + 2), *(st + 2)); // Vypise: 8, 8, 8 16

Ukazatele a pole příklad Práce s polem s použitím a bez použití operátoru indexu char str[] = "Ahoj Svete!"; char *pom; for (int i = 0; i<(int)strlen(str); i++) printf("%c, ", str[i]); for (int i = 0; i<(int)strlen(str); i++) printf("%c, ", *(str+i)); pom = str; while (*pom!= '\0') { printf("%c, ", *pom); pom++; } 17

Ukazatele a struktury Pro přístup ke členu struktury pomocí ukazatele na strukturu používáme -> typedef struct { char jmeno[20]; int vek; } osoba; osoba lide[5]; (*(lide + 2)).vek = 5; (lide + 2)->vek = 5; Vytvoření struktury, která má jako člen sama sebe typedef struct os{ char jmeno[20]; struct os *partner; } osoba; osoba zamestnanec = { "Adam", NULL }; osoba manzelka = { "Eva", NULL }; manzelka.partner = &zamestnanec; manzelka.partner->partner = &manzelka; 18