Anotace. Pointery. Martin Pergel,

Podobné dokumenty
Anotace. Pointery, dynamické proměnné

NMIN102 Programování /2 Z, Zk

Anotace. Spojové seznamy, haldy. AVL-stromy, A-B stromy. Martin Pergel,

Anotace. Objekt self, Zapouzdření, polymorfismus,

Anotace. Soubory a práce s nimi, rekurze podruhé, struktury (datový typ record), Martin Pergel,

1. D Y N A M I C K É DAT O V É STRUKTUR Y

Dynamické datové typy a struktury

Anotace. Jednotky (tvorba a využití), struktury (typ record),

Programovací jazyk Pascal

Správa paměti. Karel Richta a kol. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Karel Richta, 2016

Implementace seznamů do prostředí DELPHI pomocí lineárního seznamu

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

Konstruktory a destruktory

O datových typech a jejich kontrole

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

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

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

Abstraktní datové typy FRONTA

Inovace a zkvalitnění výuky prostřednictvím ICT Základy programování a algoritmizace úloh Typové a netypové soubory

Ukazatele, dynamická alokace

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

Sdílení dat mezi podprogramy

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

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

NPRG030 Programování I, 2018/19 1 / :25:37

Struktura programu v době běhu

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

Anotace. Dynamické programování, diskrétní simulace.

7. OBJEKTOVĚ ORIENTOVANÉ PROGRAMOVÁNÍ

Lineární datové struktury

Základy programování (IZP)

Je n O(n 2 )? Je n 2 O(n)? Je 3n 5 +2n Θ(n 5 )? Je n 1000 O(2 n )? Je 2 n O(n 2000 )? Cvičení s kartami aneb jak rychle roste exponenciála.

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

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

MATURITNÍ OTÁZKY ELEKTROTECHNIKA - POČÍTAČOVÉ SYSTÉMY 2003/2004 PROGRAMOVÉ VYBAVENÍ POČÍTAČŮ

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

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

Objektově orientované programování

Více o konstruktorech a destruktorech

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

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

Dynamické datové struktury

Vzdělávací oblast: Informatika a informační a komunikační technologie Vzdělávací obor: Programování. Předmět: Programování

Maturitní témata. IKT, školní rok 2017/18. 1 Struktura osobního počítače. 2 Operační systém. 3 Uživatelský software.

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

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.

Programování 2 (NMIN102) Soubory. RNDr. Michal Žemlička, Ph.D.

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

Anotace. Informace o praktiku z programování!!! Direktivy překladače Soubory (textové) Quicksort Metoda rozděl a panuj

Implementace numerických metod v jazyce C a Python

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

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

Datové typy a struktury

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

Svobodná chebská škola, základní škola a gymnázium s.r.o. procvičení a zapamatování počítání a měření úhlů

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

Definice funkcí a procedur. Mnoho operací provozujeme opakovaně, proto je hloupé programovat je při každém použití znovu.

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

Dědění, polymorfismus

Další možnosti inicializace proměnných

Digitální učební materiál

Binární soubory (datové, typované)

Fronta (Queue) Úvod do programování. Fronta implementace. Fronta implementace pomocí pole 1/4. Fronta implementace pomocí pole 3/4

Matematika v programovacích

Závěrečná zkouška z informatiky 2011

V každém kroku se a + b zmenší o min(a, b), tedy vždy alespoň o 1. Jestliže jsme na začátku dostali 2

Úvod do programování

Řešení: PŘENESVĚŽ (N, A, B, C) = přenes N disků z A na B pomocí C

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

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

Programování. Debugging a testování. Martin Urza

Tabulka symbolů. Vazba (binding) Vazba - příklad. Deklarace a definice. Miroslav Beneš Dušan Kolář

1. Implementace funkce počet vrcholů. Předmět: Algoritmizace praktické aplikace (3ALGA)

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

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

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

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ý

Syntaktická analýza. Implementace LL(1) překladů. Šárka Vavrečková. Ústav informatiky, FPF SU Opava

3 Co je algoritmus? Trocha historie Definice algoritmu Vlastnosti algoritmu... 3

- znakové konstanty v apostrofech, např. a, +, (znak mezera) - proměnná zabírá 1 byte, obsahuje kód příslušného znaku

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

Správa paměti. doc. Ing. Miroslav Beneš, Ph.D. katedra informatiky FEI VŠB-TUO A-1007 /

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

Časová a prostorová složitost algoritmů

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

NPRG030 Programování I, 2010/11

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

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

Programování II. Dědičnost změna chování 2018/19

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

dovolují dělení velkých úloh na menší = dekompozice

1. Převeďte dané číslo do dvojkové, osmičkové a šestnáctkové soustavy: a) b)

bfs, dfs, fronta, zásobník, prioritní fronta, halda

Abstraktní datové typy

Programování II. Návrh programu I 2018/19

NPRG030 Programování I, 2016/17 1 / :58:13

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

Rekurze. Pavel Töpfer, 2017 Programování 1-8 1

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

Náznak ukázky syntaxe a sémantiky pro projekt. 1 Syntaktické prvky. Poslední aktualizace: 8.

Transkript:

Anotace Pointery

K čemu jsou dynamické proměnné? K mnoha algoritmům bychom potřebovali pole proměnlivé délky nebo aspoň jinou datovou strukturu proměnlivé délky. Jak implementovat frontu a zásobník? Použijeme pointery.

Pointery alias ukazatele Pamět je organizována lineárně v podobě jednotlivých adres. Na těchto adresách jsou ukládány hodnoty (kód, data). Pamět zpravidla adresujeme přirozenými čísly, která zapisujeme v šestnáctkové soustavě. Na data v paměti si tedy můžeme ukazovat. Pod těmito ukazateli můžeme mít údaje libovolných typů, z čehož vyplývá jisté nebezpečí. Z toho vzplývá jisté nebezpečí a nutnost být obezřetný.

Pointery syntax a sémantika S pointery pracujeme zpravidla tak, že definujeme datový typ ukazatel na něco. Ukazatel na řekneme pomocí operátoru stříšky: type pint=^integer; {ukazatel na integer} Následně definujeme proměnnou příslušného typu: var ukaz:pint; Pod pointer koukneme opět pomocí operátoru stříšky: writeln(ukaz^); Jenže ono to zdaleka není tak snadné!

Organizace paměti s ohledem na program Program sestává z kódu, tzv. statických dat, prostoru zásobníku a oblasti haldy. Kam ukazuje pointer, který si lehkomyslně vyrobíme? Pokud s ním budeme zacházet rozumně, bude ukazovat někam do oblasti haldy, k tomu ale máme ještě daleko. Kam tedy pointer ukazuje? V lepším případě na adresu 0, v horším na náhodně vybraný kus paměti. Pořádek v paměti hĺıdá alokátor, který ví, které části paměti jsou použité a které ne a může nám přidělit prostor.

Alokátor a jeho použití Abychom mohli pod pointer kouknout, musíme ho někam nasměrovat. A to bud to na už existující pointer (var a,b:pint;... naalokuj b;... a:=b;), anebo urafnutím nové paměti: new(a); Funkci new předáváme jako parametr proměnnou typu ukazatel. Funkce new najde v paměti vhodné místo a nasměruje na něj příslušný pointer. Cvičení: Bere new parametr hodnotou nebo referencí? Od chvíle, kdy máme naalokováno, můžeme pod pointer koukat i zapisovat: new(a); a^:=5; writeln(a^); Ale pozor na přesměrování ukazatele!

Pointery a práce s nimi var a,b:pint; new(a); naalokuje místo pro proměnnou typu integer a^:=5; zapíše pod pointer hodnotu 5. b^:=a^; okopíruje pod pointer b hodnotu, na kterou ukazuje pointer a. b:=a; okopíruje pointer (tedy a a b ukazují na stejné místo). Co v kontextu uvedeného kódu udělá b^:=10; writeln(a^);? Pozor, více pointery si můžeme ukazovat na to samé místo!

Dealokace Nepotřebujeme-li už příslušné místo, musíme to říci alokátoru voláním funkce dispose: dispose(a); Tím prohlásíme, že pod dotyčný pointer už nepotřebujeme. Pozor pokud si na totéž místo ukazujeme víckrát, nesmíme provést vícenásobné odalokování! Pokud pointer přesměrujeme bez odalokování (ničím si na dotyčné místo neukazujeme), vzniká tzv. garbage, o které má alokátor za to, že je používaná, my však už nemáme, jak se k dotyčnému kusu paměti dostat (tak ho nemůžeme ani odalokovat). Některé jazyky (Java, C#) takto odalokovávají (přestaneme si na kus paměti ukazovat). Říká se tomu garbage collector, je to nevýchovné a v Pascalu není implementován.

Typičtější použití pointerů Nedávno jsme se učili o strukturách (records). Struktury nám umožňovaly udržovat údaje různých typů spolu souvisejících. Například dvě souřadnice bodu v rovině, údaje o lidech, údaje o knihách... Do recordu se přistupuje operátorem tečky. Typicky se dělají pointery na struktury: Příklad: type tbod=record x,y:integer; end; pbod=^tbod; Stále ještě neřešíme původní problém, co když máme bodů víc a nevíme předem kolik?

Přivřeme do struktury ukazatel na další prvek: type pbod=^tbod; tbod=record x,y:integer; next:pbod; end; Tomu říkáme spojový seznam. Jak poznáme, který ukazatel někam ukazuje? Tak, že nepoužitý pointer okamžitě nasměrujeme na nulu, tedy nil.

Spojový seznam čísel načti a vypiš Příklad datové struktury type pint=^sint; sint=record cislo:integer; next:pint; end; var spojak,pom:pint;

Spojový seznam čísel načti a vypiš Příklad tělo kódu begin spojak:=nil; pom:=nil; while not EOF do begin new(pom); readln(pom^.cislo); pom^.next:=spojak; spojak:=pom; end; while spojak<>nil do begin writeln(spojak^.cislo); pom=spojak; spojak=spojak^.next; dispose(pom); end; end.