Základy programování (IZP)

Podobné dokumenty
Základy programování (IZP)

Základy programování (IZP)

Základy programování (IZP)

Základy programování (IZP)

Základy programování (IZP)

Základy programování (IZP)

Základy programování (IZP)

Základy programování (IZP)

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

Základy programování (IZP)

Základy programování (IZP)

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

Základy programování (IZP)

Základy programování (IZP)

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

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

Základy programování 2 KMI/ZP2

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

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ý

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

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

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

Základy programování (IZP)

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

Základy programování (IZP)

Více o konstruktorech a destruktorech

Základy programování (IZP)

PREPROCESOR POKRAČOVÁNÍ

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

Mělká a hluboká kopie

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

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

PB071 Programování v jazyce C Jaro 2013

ADT/ADS = abstraktní datové typy / struktury

PB071 Programování v jazyce C Jaro 2015

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

Odvozené a strukturované typy dat

Ukazatele, dynamická alokace

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

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

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

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

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;

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

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

Práce s polem a pamětí

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

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

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

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

Základy programování (IZP)

Opakování programování

Úvod Třídy Rozhraní Pole Konec. Programování v C# Hodnotové datové typy, řídící struktury. Petr Vaněček 1 / 39

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

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

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

Ukazatele #1, struktury

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

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

Generické programování

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ápis programu v jazyce C#

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

Konstruktory a destruktory

Úvod do programovacích jazyků (Java)

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

9. lekce Úvod do jazyka C 4. část Funkce, rekurze Editace, kompilace, spuštění Miroslav Jílek

Martin Flusser. December 15, 2016

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

ZÁKLADY PROGRAMOVÁNÍ V C

Struktura programu v době běhu

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

Programování v jazyce C a C++

4. Typ ukazatel, strukturované datové typy

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

Třídy a struktury v C++

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

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

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

Programování v jazyce C a C++

IB111 Programování a algoritmizace. Objektově orientované programování (OOP)

PROGRAMOVÁNÍ V C++ CVIČENÍ

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

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

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

Obsah přednášky. Postup při vytváření objektů. Postup při vytváření objektů. Alokace paměti. Inicializace hodnot atributů

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

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

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

Pokročilé programování v jazyce C pro chemiky (C3220) Třídy v C++

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

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

Šifrování/Dešifrování s použitím hesla

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

PB přednáška (12. října 2015)

for (i = 0, j = 5; i < 10; i++) { // tělo cyklu }

PA152. Implementace databázových systémů

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

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

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

Transkript:

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 2016/2017

Důležité informace Můj profil: http://www.fit.vutbr.cz/~inecasova/ Kancelář: A221 Konzultační hodiny: po domluvě emailem Karta Výuka odkaz na osobní stránky: IZP 2016/2017 Cvičení Materiály Komunikace: email prosím používejte předmět: IZP - <předmět emailu> IZP cvičení 9 2

Obsah cvičení Seznámení se zadáním třetího projektu Práce s ukazateli Opakování, reference, dereference, datový typ pole Struktury, vlastní datové typy Praktické příklady Struktury (datový typ Object) Pole (datový typ Array) IZP cvičení 9 3

SEZNÁMENÍ SE TŘETÍM PROJEKTEM IZP cvičení 9 4

Seznámení se zadáním třetího projektu Shluková analýza (max 10 bodů) Obhajoba: 5.12.2016 Odevzdání: 11.12.2016, 23:59:59 do WISu Název: proj3.c (stáhněte si kostru projektu, doplnit TODO sekce) Vstupy/výstupy: Vstup: textový soubor Výstup: standardní výstup (stdout) Chyby: standardní chybový výstup (stderr) Překlad: opět nutný lm (výpočet vzdálenosti obj.) gcc -std=c99 -Wall -Wextra -Werror -DNDEBUG proj3.c -o proj3 -lm IZP cvičení 9 5

Syntaxe spuštění a formát souboru Syntax spuštění./proj3 SOUBOR [N] SOUBOR vstupní soubor s daty N nepovinný argument, cílový počet shluků, default:1 Formát vstupního souboru count=n počet objektů, ostatní ignorovat OBJID X Y Podmínky: N > 0 (int) ID objektu a jeho souřadnice 0 <= X <= 1000, 0 <= Y <= 1000 (float) IZP obhajoba třetího projektu 6

2. podúkol základní funkce 2. podúkol: základní funkce void init_cluster(struct cluster_t *c, int cap); void clear_cluster(struct cluster_t *c); void append_cluster(struct cluster_t *c, struct obj_t obj); int load_clusters(char *filename, struct cluster_t **arr); IZP obhajoba třetího projektu 7

3. podúkol další funkce 3. podúkol: další funkce void merge_clusters(struct cluster_t *c1, struct cluster_t *c2); int remove_cluster(struct cluster_t *carr, int narr, int idx); float obj_distance(struct obj_t *o1, struct obj_t *o2); float cluster_distance(struct cluster_t *c1, struct cluster_t *c2); void find_neighbours(struct cluster_t *carr, int narr, int *c1, int *c2); IZP obhajoba třetího projektu 8

Poznámky Aplikace na vizualizaci shluků (online) Nakopírovat výstupy vašeho programu Pozor: každý řádek musí být končen znakem konce řádku Wiki - stránka 3. projektu: http://www.fit.vutbr.cz/study/courses/izp/public/cluster.php IZP cvičení 9 9

PRÁCE S UKAZATELI IZP cvičení 9 10

Ukazatel, reference, dereference Ukazatele Velikost ukazatele Adresa proměnné Hodnota z adresy NULL IZP cvičení 9 11

Ukazatel, reference, dereference Ukazatele proměnné uchovávají adresu, která ukazuje do paměti počítače Velikost ukazatele Adresa proměnné Hodnota z adresy NULL IZP cvičení 9 12

Ukazatel, reference, dereference Ukazatele proměnné uchovávají adresu, která ukazuje do paměti počítače Velikost ukazatele závisí na tom, kolika bitový máme procesor/překladač (16, 32, 64 bitů) Adresa proměnné Hodnota z adresy NULL IZP cvičení 9 13

Ukazatel, reference, dereference Ukazatele proměnné uchovávají adresu, která ukazuje do paměti počítače Velikost ukazatele závisí na tom, kolika bitový máme procesor/překladač (16, 32, 64 bitů) Adresa proměnné referenční operátor & Hodnota z adresy NULL IZP cvičení 9 14

Ukazatel, reference, dereference Ukazatele proměnné uchovávají adresu, která ukazuje do paměti počítače Velikost ukazatele závisí na tom, kolika bitový máme procesor/překladač (16, 32, 64 bitů) Adresa proměnné referenční operátor & Hodnota z adresy dereferenční operátor * NULL IZP cvičení 9 15

Ukazatel, reference, dereference Ukazatele proměnné uchovávají adresu, která ukazuje do paměti počítače Velikost ukazatele závisí na tom, kolika bitový máme procesor/překladač (16, 32, 64 bitů) Adresa proměnné referenční operátor & Hodnota z adresy dereferenční operátor * NULL používá se pro inicializaci ukazatelů říká, že ukazatel nikam neukazuje IZP cvičení 9 16

Ukazatel, reference, dereference IZP cvičení 9 17

Ukazatel, reference, dereference int i = 10; int *p; //? p = &i; //? *p = 20; //? printf("hodnota promenne i: %d\n", i); //? IZP cvičení 9 18

Ukazatel, reference, dereference int i = 10; int *p; // ukazatel p není inicializován! p = &i; *p = 20; printf("hodnota promenne i: %d\n", i); IZP cvičení 9 19

Ukazatel, reference, dereference int i = 10; int *p; // ukazatel p není inicializován! p = &i; // ukazatel p ukazuje na i *p = 20; printf("hodnota promenne i: %d\n", i); IZP cvičení 9 20

Ukazatel, reference, dereference int i = 10; int *p; // ukazatel p není inicializován! p = &i; // ukazatel p ukazuje na i *p = 20; // pomocí p jsme změnili hodnotu i printf("hodnota promenne i: %d\n", i); IZP cvičení 9 21

Ukazatel, reference, dereference int a = 0, b = 42; int* p; // p --> p = &b; // p --> p = &a; // p --> (*p) ++; // p --> *p ++; // p --> IZP cvičení 9 22

Ukazatel, reference, dereference int a = 0, b = 42; int* p; // p --> nedefinováno p = &b; // p --> p = &a; // p --> (*p) ++; // p --> *p ++; // p --> IZP cvičení 9 23

Ukazatel, reference, dereference int a = 0, b = 42; int* p; // p --> nedefinováno p = &b; // p --> 42 = b p = &a; // p --> (*p) ++; // p --> *p ++; // p --> IZP cvičení 9 24

Ukazatel, reference, dereference int a = 0, b = 42; int* p; // p --> nedefinováno p = &b; // p --> 42 = b p = &a; // p --> 0 = a (*p) ++; // p --> *p ++; // p --> IZP cvičení 9 25

Ukazatel, reference, dereference int a = 0, b = 42; int* p; // p --> nedefinováno p = &b; // p --> 42 = b p = &a; // p --> 0 = a (*p) ++; // p --> 1 (operace přičtení 1) *p ++; // p --> IZP cvičení 9 26

Ukazatel, reference, dereference int a = 0, b = 42; int* p; // p --> nedefinováno p = &b; // p --> 42 = b p = &a; // p --> 0 = a (*p) ++; // p --> 1 (operace přičtení 1) *p ++; // p --> neznámý výsledek // k adrese a se přičte // sizeof(int) IZP cvičení 9 27

DATOVÝ TYP POLE IZP cvičení 9 28

Datový typ pole Skutečná adresa 1634 1635 1636 1637 1638 1639 Index 0 1 2 3 4 5 Hodnota 10 20 30 40 50 60 IZP cvičení 3 29

Datový typ pole Skutečná adresa 1634 1635 1636 1637 1638 1639 Index 0 1 2 3 4 5 Hodnota 10 20 30 40 50 60 Pole: prvky stejného typu, spojité místo v paměti IZP cvičení 3 30

Datový typ pole Skutečná adresa 1634 1635 1636 1637 1638 1639 Index 0 1 2 3 4 5 Hodnota 10 20 30 40 50 60 Pole: prvky stejného typu, spojité místo v paměti Deklarace staticky: int moje_pole[6]; IZP cvičení 3 31

Datový typ pole Skutečná adresa 1634 1635 1636 1637 1638 1639 Index 0 1 2 3 4 5 Hodnota 10 20 30 40 50 60 Pole: prvky stejného typu, spojité místo v paměti Deklarace staticky: int moje_pole[6]; Velikost pole: operátor sizeof() velikost v bajtech U polí vrací součet velikostí jeho položek IZP cvičení 3 32

Datový typ pole Skutečná adresa 1634 1635 1636 1637 1638 1639 Index 0 1 2 3 4 5 Hodnota 10 20 30 40 50 60 Pole: prvky stejného typu, spojité místo v paměti Deklarace staticky: int moje_pole[6]; Velikost pole: operátor sizeof() velikost v bajtech U polí vrací součet velikostí jeho položek Velikost moje_pole: int velikost = 6*sizeof(int); IZP cvičení 3 33

Datový typ pole Skutečná adresa 1634 1635 1636 1637 1638 1639 Index 0 1 2 3 4 5 Hodnota 10 20 30 40 50 60 Pole: prvky stejného typu, spojité místo v paměti Deklarace staticky: int moje_pole[6]; Velikost pole: operátor sizeof() velikost v bajtech U polí vrací součet velikostí jeho položek Velikost moje_pole: int velikost = 6*sizeof(int); Pozor: velikost datového typu záleží na procesoru sizeof(int) může být 2, 4 nebo 8 IZP cvičení 3 34

STRUKTURY, VLASTNÍ DATOVÉ TYPY IZP cvičení 9 35

Pole x Struktura Pole Struktura IZP cvičení 9 36

Pole x Struktura Pole Homogenní Musí obsahovat položky stejného datového typu Struktura Heterogenní Může obsahovat položky různého datového typu IZP cvičení 9 37

Struktury Klíčové slovo struct struct person { }; char* name; // jmeno char* surname; // prijmeni int pay; int main() { struct person test; test.pay = 1000; // plat test.name = "Pepa"; //podobne surname printf("pay: %d\n", test.pay); printf("name: %s\n", test.name); } IZP cvičení 9 38

Struktury vlastní datový typ Nový datový typ klíčové slovo typedef typedef struct person { char* name; // jmeno char* surname; // prijmeni int pay; }TPerson; int main() { Tperson test; test.pay = 1000; // plat test.name = "Pepa"; //podobne surname printf("pay: %d\n", test.pay); printf("name: %s\n", test.name); } IZP cvičení 9 39

Struktury demo: jak to vypadá v paměti Velikosti datových typů závisí na architektuře IZP cvičení 9 40

Struktury demo: alokace paměti typedef struct person { char* name; // jmeno char* surname; // prijmeni int pay; // plat }TPerson; int main() { Tperson test; test.name = // jak naalokujeme paměť? } IZP cvičení 9 41

Struktury demo: alokace paměti typedef struct person { char* name; // jmeno char* surname; // prijmeni int pay; }TPerson; int main() { } Tperson test; test.name = // plat malloc((strlen("pepa")+1)*sizeof(char); // jak ověříme, že je alokace OK? IZP cvičení 9 42

Struktury demo: alokace paměti typedef struct person { char* name; // jmeno char* surname; // prijmeni int pay; }TPerson; int main() { } Tperson test; test.name= // plat malloc((strlen("pepa")+1)*sizeof(char); if(test.name == NULL) { fprintf(stderr, "Chyba alokace! ); return -1; } IZP cvičení 9 43

Struktury přístup k prvkům Operátor. nebo -> -> (šipka) pokud předáváme strukturu (složený datový typ) jako ukazatel void setpay(tperson* p) { } //?. (tečka) jindy TPerson setpay(tperson p) { } //? IZP cvičení 9 44

Struktury přístup k prvkům Operátor. nebo -> -> (šipka) pokud předáváme strukturu (složený datový typ) jako ukazatel void setpay(tperson* p) { } p->pay = 1000;. (tečka) jindy TPerson setpay(tperson p) { } p.pay = 10; return p; IZP cvičení 9 45

PŘÍKLADY IZP cvičení 9 46

Příklady Stáhněte si připravené kostry programů: Budete pouze doplňovat části kódu V přiloženém ZIP archivu se nachází soubor.c a.h a také Makefile http://www.fit.vutbr.cz/~inecasova/web/cv11.zip Možnosti práce se soubory Windows Code::Blocks: vytvořit nový projekt, pravým tlačítkem klik na projekt Add files Linux terminál: překlad pomocí Makefile (případně samozřejmě též Code::Blocks) Kontrola práce s pamětí valgrind --leak-check=full./main IZP cvičení 9 47

STRUKTURY IZP cvičení 9 48

Typ Object Budeme používat strukturovaný datový typ Object typedef struct { int id; char* name; } Object; // ID // jmeno Vašim úkolem bude implementovat konstruktor, který bude objekt inicializovat destruktor, který bude uvolňovat použitou paměť funkci, která vymění obsah dvou objektů funkci, která zkopíruje obsah objektu Kostry jsou v souboru struct.c IZP cvičení 9 49

Typ Object několik rad K alokaci paměti pro řetězec použijte funkci malloc() Po alokaci kontrolujte, jak dopadla: int* pole = malloc(2*sizeof(int)); if (pole == NULL) { } fprintf(stderr, "Chyba alokace!\n"); return -1; Pro záměnu dat objektů budete potřebovat nějaký pomocný objekt Ve funkci item_copy() je možné použít konstruktor object_ctor() IZP cvičení 9 50

POLE STRUKTUR IZP cvičení 9 51

Práce s polem Nyní vytvoříme pole objektů typu Object typedef struct { unsigned size; // velikost pole Object* items; // pole objektu } Array; Vašim úkolem bude implementovat Konstruktor a destruktor Funkci pro vložení objektu na daný index Funkci pro nalezení jména/id Kostry jsou v souboru array.c Ostatní funkce za DÚ IZP cvičení 9 52

Pole struktur ilustrace Pole objektů: Object* items; Na každém indexu pole je struktura Object IZP cvičení 9 53

Pole struktur ilustrace Pole objektů: Object* items; Na každém indexu pole je struktura Object Array items pole objektů size = 3 IZP cvičení 9 54

Děkuji Vám za pozornost! IZP cvičení 9 55