Abstraktní datový typ



Podobné dokumenty
Abstraktní datové typy, moduly

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

Algoritmizace a programování

Datové struktury. Obsah přednášky: Definice pojmů. Abstraktní datové typy a jejich implementace. Algoritmizace (Y36ALG), Šumperk - 12.

Příkazy preprocesoru - Před překladem kódu překladačem mu předpřipraví kód preprocesor - Preprocesor vypouští nadbytečné (prázdné) mezery a řádky -

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

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

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

Odvozené a strukturované typy dat

Preprocesor a koncepce (větších) programů. Úvod do programování 2 Tomáš Kühr

Preprocesor. Karel Richta a kol. katedra počítačů FEL ČVUT v Praze. Karel Richta, Martin Hořeňovský, Aleš Hrabalík, 2016

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

Úvod do programovacích jazyků (Java)

Paměť počítače. alg2 1

Algoritmizace prostorových úloh

Programovací jazyk C++ Hodina 1

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

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

Programovací jazyk Pascal

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

Abstraktní třídy, polymorfní struktury

Programovací jazyk C(++) C++ area->vm_mm->locked_vm -= len >> PAGE_SHIFT;

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

Datové struktury. alg12 1

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

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

Racionální čísla, operátory, výrazy, knihovní funkce

2 Datové typy v jazyce C

Racionální čísla, operátory, výrazy, knihovní funkce

Základní datové struktury

Třídy a struktury v C++

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

Mělká a hluboká kopie

Abstraktní datové typy

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

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

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

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

Algoritmizace a programování

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

1.1 Struktura programu v Pascalu Vstup a výstup Operátory a některé matematické funkce 5

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

Algoritmizace prostorových úloh

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

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

ADT/ADS = abstraktní datové typy / struktury

PROGRAMOVACÍ JAZYKY A PŘEKLADAČE LEXIKÁLNÍ ANALÝZA

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

Algoritmizace a programování

Algoritmizace a programování

Algoritmizace a programování

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

Opakování programování

Jazyk C++ I. Šablony

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í

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

Algoritmizace a programování

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

Výrazy a operátory. Operátory Unární - unární a unární + Např.: a +b

Algoritmizace a programování

Algoritmizace a programování

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

PREPROCESOR POKRAČOVÁNÍ

Úvod do programování. Lekce 1

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

Rozklad problému na podproblémy, rekurze

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

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

int => unsigned int => long => unsigned long => float => double => long double - tj. bude-li:

- speciální symboly + - * / =., < > <> <= >= a další. Klíčová slova jsou chráněnými útvary, které nelze použít ve významu identifikátorů.

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

Struktura programu v době běhu

Programovací jazyk. - norma PASCAL (1974) - implementace Turbo Pascal, Borland Pascal FreePascal Object Pascal (Delphi)

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

PŘETĚŽOVÁNÍ OPERÁTORŮ

Logické operace. Datový typ bool. Relační operátory. Logické operátory. IAJCE Přednáška č. 3. může nabýt hodnot: o true o false

Data, výrazy, příkazy

2 Základní funkce a operátory V této kapitole se seznámíme s použitím funkce printf, probereme základní operátory a uvedeme nejdůležitější funkce.

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

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

Assembler - 5.část. poslední změna této stránky: Zpět

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

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

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

Zápis programu v jazyce C#

Ukazka knihy z internetoveho knihkupectvi

Obsah přednášky. 12. Dokumentace zdrojového kódu Tvorba elektronické dokumentace UML. Co je diagram tříd. Ing. Ondřej Guth

- jak udělat konstantu long int: L long velka = 78L;

Java reprezentace dat, výrazy. A0B36PR1-Programování 1 Fakulta elektrotechnická České vysoké učení technické

type Obdelnik = array [1..3, 1..4] of integer; var M: Obdelnik;

Rozklad problému na podproblémy, rekurze

Výrazy, operace, příkazy

Základy programování (IZP)

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

IUJCE Přednáška č. 11. další prvky globální proměnné, řízení viditelnosti proměnných, funkcí

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

Algoritmizace a programování

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

Základy programování (IZP)

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;

Transkript:

Evropský sociální fond Praha & EU: Investujeme do vaší budoucnosti Abstraktní datový typ BI-PA1 Programování a algoritmizace 1 Katedra teoretické informatiky Miroslav Balík Fakulta informačních technologií České vysoké učení technické v Praze

Téma zopakování datových typů abstraktní datové typy příklad: typ Complex Obsah modulární realizace typu Compex sdílení proměnných mezi moduly více o předprocesoru a ještě něco k popisům typu 2/38

Datové struktury Klasická kniha o programování prof. Wirtha má název Algorithms + Data structures = Programs Datová struktura (typ) = množina dat + operace s těmito daty Abstraktní datový typ - formálně definuje data a operace s nimi, např. Fronta (Queue) Zásobník (Stack) Pole (Array) Tabulka (Table) Seznam (List) Strom (Tree) Množina (Set) 3/38

Abstraktní datový typ je množina druhů dat (hodnot) a příslušných operací, které jsou přesně specifikovány, a to nezávisle na konkrétní implementaci. operace Definovat lze Matematicky signatura a axiomy Hodnoty typu Jako rozhraní (knihovna v C) s popisem operací Rozhraní poskytuje Funkce pro vytvoření a práci s daným ADT operace, které akceptují odkaz jako argument a které mají přesně definovaný účinek na data signatura 4/38

Příklad1: ADT - popis matematicky I Syntaxe popisuje, jak správně vytvořit logický výraz: 1. true, false jsou logické výrazy, 2. if x,y jsou logické výrazy, pak i.! (x), negace ii. (x & y), logický součin, and iii. (x y), logický součet, or iv. (x==y), (x!=y), relační operátory jsou logické výrazy. Pokud nechceme u každé operace psát závorky, musíme definovat priority operátorů. Sémantika popisuje význam jednotlivých operací. Lze definovat pomocí axiomů: 1)!(true) = false 2)!(false) = true 3) x & false = false 4) x & true = x 5) x & y = y & x 6) x true = true 7) x false = x 8) x y = y x Datový typ boolean 5/38

Příklad1: ADT - popis matematicky II Datový typ boolean Sémantika, pokračování 9) true == true = true 10) true == false = false 11) false == false = true 11) false == true = false nebo lépe(vhodnější pro úpravy): 9) true == x = x 10) false == x =!x 11) x==y = y==x dále by následovala sémantika pro!= 6/38

Datové typy V programovacích jazycích jako je C je každý datový objekt (proměnná nebo konstanta) nějakého datového typu Připomeňme, že datový typ: specifikuje množinu možných hodnot specifikuje množinu operací s hodnotami Datové typy se dělí na: jednoduché (hodnoty jsou z hlediska operací atomické) strukturované (hodnoty se skládají ze složek) ukazatele (hodnotami jsou adresy) V jazyku C je: definováno několik standardních jednoduchých datových typů, které mají svá jména (dána klíčovými slovy), např. int, float, char atd. stanoveno, jak deklarovat datový objekt typu pole nebo struktura, a jaké operace jsou pro takové datové objekty povoleny (jaké?) stanoveno, jak deklarovat datový objekt typu ukazatel, a jaké operace jsou pro takové operace povoleny (jaké?) 7/38

Abstraktní datové typy Příklad: potřebujeme napsat program, který pracuje s komplexními čísly, se kterými se budou provádět operace sčítání, odčítání, absolutní hodnota a výpis. Komplexní číslo je reprezentovatelná dvojicí reálných čísel a takový typ s požadovanými operacemi v jazyku C není. Zavedeme identifikátor typu Complex a požadované operace budeme realizovat pomocí funkcí. Pak se rozhodneme, zda typ budeme implementovat pomocí pole nebo struktury. 8/38

Abstraktní datové typy typedef... Complex; Complex plus(complex, Complex); Complex minus(complex, Complex); float absc(complex); void printc(complex); v deklaracích funkcí nemusí být uvedena jména parametrů Zavedli jsme abstraktní datový typ Complex 9/38

Použití ADT - prog13-prikl1.c int main(void) { Complex x = {1,1, y = {2,2, z; float a; printf("x="); vypisc(x); printf("\n"); printf("y="); vypisc(y); printf("\n"); z = plus(x, y); printf("x+y="); vypisc(z); printf("\n"); z = minus(x, y); printf("x-y="); vypisc(z); printf("\n"); a = absc(x); printf("abs(x)=%f\n", a); return 0; 10/38

Implementace abstraktního datového typu V jazyku C nejčastěji pomocí struktury Implementace typu Complex: typedef struct { float re; float im; Complex; Otázka: proč jsme typ Complex implementovali pomocí struktury a ne pomocí pole? 11/38

Operace s typem Complex Complex plus(complex x, Complex y) { Complex res; res.re = x.re+y.re; res.im = x.im+y.im; return res; Complex minus(complex x, Complex y) { Complex res; res.re = x.re-y.re; res.im = x.im-y.im; return res; 12/38

Operace s typem Complex float absc(complex x) { return sqrt(x.re*x.re+x.im*x.im); void vypisc(complex x) { printf("(%f,%f)", x.re, x.im); 13/38

Moduly Složitější programy je obvykle třeba rozdělit do více souborů Modulem se v programování rozumí část programu, která poskytuje určité prostředky ostatním částem programu Modul se skládá ze dvou částí: specifikační části, ve které jsou deklarovány prostředky, které modul poskytuje (např. datový typ a procedury a funkce realizující operace s datovým typem) implementační části, ve které jsou poskytované prostředky implementovány 14/38

Moduly V některých programovacích jazycích je modul zaveden jako programová jednotka (např. units Object Pascalu firmy Borland v systému Delphi) V jazyku C modul realizujeme dvojicí souborů: specifikačním souborem typu.h, ve kterém jsou deklarace typů a funkcí implementačním souborem typu.c, ve kterém jsou definice funkcí 15/38

Modul pro typ Complex Specifikační soubor: /* complex.h */ typedef struct { float re; float im; Complex; Complex plus(complex, Complex); Complex minus(complex, Complex); float absc(complex); void printc(complex); 16/38

Modul pro typ Complex Implementační soubor: /* complex.c */ #include "complex.h" #include <stdio.h> #include <math.h> Complex plus(complex x, Complex y) { Complex res; res.re = x.re + y.re; res.im = x.im + y.im; return res;... vložení specifikačního souboru 17/38

Modul pro typ Complex Implementační soubor, 2.část: Complex minus(complex x, Complex y) { Complex res; res.re = x.re - y.re; res.im = x.im - y.im; return res; float absc(complex x) { return sqrt(x.re * x.re + x.im * x.im); void printc(complex x) { printf("(%f,%f)", x.re, x.im); 18/38

Modul pro typ Complex - použití /* main.c */ #include "complex.h" #include <stdio.h> vložení specifikačního #include <stdlib.h> souboru /* hlavni funkce */ int main(void) { Complex x = {1,1, y = {2,2, z; float a; printf("x="); printc(x); printf("\n"); printf("y="); printc(y); printf("\n"); z = plus(x, y); printf("x+y="); printc(z); printf("\n"); z = minus(x, y); printf("x-y="); printc(z); printf("\n"); a = absc(x); printf("abs(x)=%f\n", a); return 0; 19/38

Projekt v NetBeans, Dev-C++ V prostředí IDE je třeba program složený z několika souborů vyvíjet v rámci projektu Vytvoření nového projektu: v menu vybrat Soubor/Nový/Projekt v okně Nový projekt vybrat Console Application nebo Empty Project, zaškrtnout C Projekt a zadat Jméno projektu, pak OK v okně Create new project zadat jméno souboru.dev, ve kterém bude popis projektu, a adresář, do kterého se soubor uloží Do projektu lze vkládat nové zdrojové soubory nebo již existující zdrojové soubory 20/38

Projekt v NetBeans, Dev-C++ Cílový program vytvoříme funkcí Spustit/Překompilovat vše každý.c soubor se přeloží do.o souboru, který se uloží do adresáře, v němž je.c soubor z.o souborů (a z knihoven) se sestaví cílový (spustitelný) program.exe, který se uloží do adresáře, v němž je soubor projektu.dev Příklad: vytvořme nový projekt a vložme do něj soubory main.c, complex.c a complex.h z adresáře prednasky\priklady\p13\complex 21/38

Překlad zdrojových souborů Každý zdrojový program typu.c je nejprve zpracován předprocesorem (definice maker, náhrada maker, vložení souborů atd.) a pak je překladačem přeložen do souboru.o, který je tvořen posloupností strojových instrukcí s relativními adresami operandů (a dalšími informacemi, které jsou potřeba pro následující sestavení) Potom je ze souborů.o a z knihovních souborů sestavovacím programem (linker) sestaven cílový program.exe...h...h...h...c...c...c...o...o...o...exe...lib předprocesor překladač sestavovací program 22/38

Sdílení proměnných mezi moduly Proměnná deklarovaná na úrovni souboru může být použita v jiném souboru Jinými slovy: modul v jazyku C může proměnnou v něm deklarovanou poskytnout pro použití v jiných modulech Příklad: modulárně napíšeme program, který: přečte počet prvků pole, dynamicky ho vytvoří a pak přečte prvky pole pole vypíše pole vzestupně seřadí seřazené pole vypíše Program bude tvořen: soubory pole.h a pole.c, které budou tvořit modul s proměnnými pole (ukazatel na dynamicky vytvořené pole) a pocet (počet prvků pole) a funkcemi pro čtení pole a výpis pole soubory razeni.h a razeni.c, které budou tvořit modul pro seřazení pole souborem main.c, který bude obsahovat hlavní funkci soubory jsou v adresáři prednasky\priklady\pole 23/38

Příklad se sdílenými proměnnými /* main.c */ #include "pole.h" #include "razeni.h" #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { ctipole(); printf("zadane pole\n"); vypispole(); seradpole(); printf("serazene pole\n"); vypispole(); return 0; soubor s hlavní funkcí ve specifikačním souboru se proměnné deklarují jako extern /* pole.h */ extern int *pole, pocet; void ctipole(void); void vypispole(void); specifikační soubor modulu pole /* razeni.h */ void seradpole(void); specifikační soubor modulu razeni 24/38

Příklad se sdílenými proměnnými /* pole.c */ #include "pole.h" #include <stdio.h> /* pole.h */ int *pole, pocet; void ctipole(void); void vypispole(void); void ctipole(void) { int i; printf("zadej pocet prvku pole: "); scanf("%d", &pocet); pole = (int*) malloc(pocet*sizeof(int)); printf("zadej %d celych cisel\n", pocet); for (i = 0; i < pocet; i++) scanf("%d", &pole[i]); void vypispole(void) { int i; for (i=0; i<pocet; i++) printf("%d\n", pole[i]); extern int *pole, pocet; 25/38

Příklad se sdílenými proměnnými /* razeni.c */ #include "razeni.h" #include "pole.h" void seradpole(void) { int i, imin, min, j, n = pocet-1; for (i = 0; i < n; i++) { imin = i; min = pole[i]; for (j = i+1; j <= n; j++) if (pole[j]<min) { imin = j; min = pole[j]; if (imin!= i) { pole[imin] = pole[i]; pole[i] = min; 26/38

Shrnutí.h souborů V souborech typu.h (header soubory, hlavičkové soubory) uvádíme: deklarace typů deklarace funkcí extern deklarace proměnných Do souborů typu.h nikdy nepíšeme definice funkcí Když do.h souboru vložíme definici funkce a tento soubor vložíme pomocí direktivy include do několika souborů, nastane chyba při sestavení programu (prednasky\priklady\p13\funkce) 27/38

Ještě něco k předprocesoru Řádky začínající znakem # jsou direktivy předprocesoru Pomocí direktiv se zajišťuje: vkládání jiných souborů #include <stdio.h> #include "stack.h #include SOUBOR definice maker #define _STACK_ #define TRUE 1 #define MAX(x,y) ((x)>(y)?(x):(y)) podmíněný překlad #ifdef _DEBUG_ #else #endif... a další 28/38

Makra bez parametrů: #define ident nahrazující-text preprocesor v dalším textu nahradí každý výskyt identifikátoru makra nahrazujícím textem končí-li řádek nahrazujícího textu znakem \, zahrne se do nahrazujícího textu i další řádek je-li v nahrazujícím textu nalezeno makro, znovu se rozvine jména maker se nehledají v komentářích, řetězcích a mezi znaky < a > v direktivě #include makro platí až do konce souboru nebo do výskytu direktivy #undef ident Standardní makra: DATE datum začátku zpracování souboru TIME čas začátku zpracování FILE jméno zpracovávaného souboru atd. + implementačně závislá makra 29/38

#define SQR(x) ((x)*(x)) Makra s parametry #define MAX(x,y) ((x)>(y)?(x):(y)) V místě výskytu musí být v závorkách uveden odpovídající počet skutečných parametrů, které se textově dosadí za parametry v nahrazujícím textu zdrojový text a = SQR(b) a = SQR(a+1) a = MAX(b,c+1); výsledný text a = ((b)*(b)) a = ((a+1)*(a+1)) a = ((b)>(c+1)?(a):(c+1)); 30/38

Makra s parametry a operátory ## a # V nahrazujícím textu makra lze použít operátory ## a #: include<stdio.h> // x##y slepí elementy x a y // #x k x přilepí uvozovky #define DVE(x) x##1,x##2 #define PRINT(x) printf(#x"=%d\n",x) a1 =8 DVE(a) =8 int main(){ int DVE(a); a1 = 8; PRINT(a1); PRINT(DVE(a)); return 0; //int a1,a2; //printf( a1 =%d,a1); //printf( DVE(a) =%d,a1,a2); 31/38

Podmíněný překlad Pro omezení úseků zdrojového textu, které mají být překládány podmíněně, slouží direktivy: V konstantním výrazu může být pro test, zda identifikátor je definován (direktivou #define) použit operátor defined #ifdef _DEBUG_ printf( a=%d\a, a); #endif je totéž co #if defined _DEBUG_ printf( a=%d\a, a); #endif 32/38

Podmíněný překlad Pro omezení úseků zdrojového textu, které mají být překládány podmíněně, slouží direktivy: #if konstantni-vyraz... #endif #ifdef ident... #endif #ifndef ident... #elif konstantni-vyraz... #else... #endif 33/38

A ještě něco k popisům typu Výčtový typ Typ union Struktura s bitovými poli Struktura s otevřeným polem 34/38

Popis výčtového typu Syntaxe: enum značka { seznam literálů Příklad: enum Color {Red, Blue, Green; Literály jsou synonyma celočíselných hodnot /* Red = 0, Blue = 1, Green = 2 */ Literálu lze explicitně přiřadit hodnotu enum Masky { Nula, Jedna, Dva, Ctyri = 4, Osm = 8; /* Dva = 2, Ctyri = 4, Osm = 8 */ enum Sign { Minus = -1, Zero, Plus; /* Minus = -1, Zero = 0, Plus = 1 */ enum { E1, E2, E3 = 5, E4, E5 = E4 + 10, E6; /* E4 = 6, E5 = 16, E6 = 17 */ Pro výčtové typy jsou definovány stejné operace, jako pro celočíselné typy Vnitřní reprezentace proměnných výčtových typů je stejná jako vnitřní reprezentace proměnných typu int (velikost 4B ve 32 bitovém prostředí) 35/38

Popis typu union Syntaxe stejná jako u struktury, místo struct je union Položky se nekladou za sebe, ale přes sebe union { x; int cislo; unsigned char byty[4]; x int main(){ int i,cislo; unsigned char pole[4]; x.cislo = 0x00112233; for (i=0; i<4; i++) printf("%x ", x.byty[i]); return 0; vypíše 33 22 11 0 36/38

Bitová pole V popisu struktury lze pro položku typu signed nebo unsigned stanovit počet bitů vnitřní reprezentace #include<stdio.h> #pragma pack(1) struct { bp; unsigned p1:4; unsigned p2:4; int main(){ printf("velikost promenne bp: %d\n", sizeof(bp)); return 0; 37/38

Struktura s otevřeným polem Poslední položkou struktury může být pole bez zadaného počtu prvků #include <stdio.h> #include<stdlib.h> typedef struct { int pocet; int pole[]; OtevrenePole; OtevrenePole *vytvor(int pocet) { OtevrenePole *p; p = (OtevrenePole*) malloc(sizeof (*p) + pocet * sizeof (int)); p->pocet = pocet; return p; int main(void) { OtevrenePole *p = vytvor(10); int i; for (i = 0; i < p->pocet; p->pole[i++] = i); for (i = 0; i < p->pocet; printf("%d ", p->pole[i++])); printf("\n"); free(p); return 0; uvolní alokovanou paměť 38/38