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)

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)

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

Základy programování 2 KMI/ZP2

Základy programování (IZP)

Základy programování (IZP)

Základy programování (IZP)

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

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

Základy programování (IZP)

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ý

Základy programování (IZP)

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

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

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

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

Práce s polem a pamětí

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

Více o konstruktorech a destruktorech

PB071 Programování v jazyce C Jaro 2015

Ukazatele, dynamická alokace

PB071 Programování v jazyce C Jaro 2013

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

Mělká a hluboká kopie

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

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

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

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

PREPROCESOR POKRAČOVÁNÍ

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

Opakování programování

ZÁKLADY PROGRAMOVÁNÍ V C

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

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

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

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

Ukazatele #1, struktury

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

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

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

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

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

Konstruktory a destruktory

Odvozené a strukturované typy dat

Martin Flusser. December 15, 2016

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

ADT/ADS = abstraktní datové typy / struktury

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

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

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

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

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;

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

4. Typ ukazatel, strukturované datové typy

Zápis programu v jazyce C#

Generické programování

Základy programování (IZP)

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 a C++

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

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í

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

Programovanie v jazyku C - to chce dynamiku

Programování v jazyce C a C++

Ukazatele #2, dynamická alokace paměti

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

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

Úvod do programovacích jazyků (Java)

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

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

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

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

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

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

C++ Akademie SH. 2. Prom nné, podmínky, cykly, funkce, rekurze, operátory. Michal Kvasni ka. 20. b ezna Za áte níci C++

Maturitní otázky z předmětu PROGRAMOVÁNÍ

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

Struktura programu v době běhu

Dynamická alokace paměti

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

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

V dalších letech se pak začaly objevovat první normy pro jazyk C++ (ISO/IEC 14882:1998; ISO/IEC 9899:1999; ISO/IEC 14882:2003; ISO/IEC 14882:2011).

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

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

Výrazy, operace, příkazy

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.

PB071 Programování v jazyce C Jaro 2017

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

Třídy a struktury v C++

Transkript:

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, 11. týden

Důležité informace Můj profil: http://www.fit.vutbr.cz/~iveigend/ Kancelář: A221 Konzultační hodiny: po domluvě emailem Karta Výuka odkaz na osobní stránky Komunikace: email prosím používejte předmět: IZP - <předmět emailu> IZP cvičení 11 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í 11 3

2. projekt výsledky V případě zájmu konzultace ve čtvrtek, viz mail IZP cvičení 11 4

SEZNÁMENÍ SE TŘETÍM PROJEKTEM IZP cvičení 11 5

Seznámení se zadáním třetího projektu Shluková analýza (max 10 bodů) Obhajoba: 4.12.2017 Odevzdání: 10. 12. 2017, 23:59:59 do WISu Název: proj3.c (stáhněte si kostru projektu, doplnit pouze TODO) Vstupy/výstupy: Vstup: textový soubor Výstup: standrdní výstup (stdout) Chyby: standaardní 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í 11 6

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ů, >N ignorovat OBJID X Y Podmínky: N > 0 (int) ID objektu a jeho souřadnice 0 <= X <= 1000, 0 <= Y <= 1000 (float) IZP cvičení 11 7

Podúkoly 2. podúkol: základní funkce pro práci s objekty a shluky 3. podúkol: zbytek funkcí, které provádí shlukování IZP cvičení 11 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í 11 9

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

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

Ukazatel, reference, dereference IZP cvičení 11 12

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

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í 11 14

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í 11 15

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í 11 16

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

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í 11 18

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í 11 19

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í 11 20

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í 11 21

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í 11 22

DATOVÝ TYP POLE IZP cvičení 11 23

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í 11 24

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í 11 25

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í 11 26

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í 11 27

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í 11 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 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í 11 29

STRUKTURY, VLASTNÍ DATOVÉ TYPY IZP cvičení 11 30

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í 11 31

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í 11 32

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í 11 33

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

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 alokujeme paměť? } IZP cvičení 11 35

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í 11 36

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í 11 37

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í 11 38

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í 11 39

PŘÍKLADY IZP cvičení 11 40

Příklady Stáhněte si kostru programu Budete pouze doplňovat části kódu označené TODO V přiloženém ZIP archivu se nachází soubor.c a.h a také Makefile Možnosti práce se soubory Linux terminál: překlad pomocí Makefile (případně samozřejmě též Code::Blocks) Kontrola práce s pamětí Je vhodné překládat s ladícími informacemi: -g valgrind --leak-check=full./main kde main je název binárního souboru (např. proj3) IZP cvičení 11 41

Typ Object Budeme používat strukturovaný datový typ Object typedef struct { int id; // ID char* name; // jmeno } Object; 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 IZP cvičení 11 42

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í 11 43

Práce s polem 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 A další funkce Co nestihnete zde, doma IZP cvičení 11 44

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

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í 11 46

Typ Array několik rad Při alokaci je nutné alokovat místo pro pole objektů a inicializovat jednotlivé objekty (destruktor inverzně) Při změně velikosti pole Použijte funkci realloc (man 3 realloc) Pokud je vyžadovaná velikost menší než aktuální, je nutné položky uvolnit destruktorem Bubble sort, Select sort viz wiki IZP cvičení 11 47

Děkuji Vám za pozornost! IZP cvičení 11 48