Implementace aritmetického stromu pomocí směrníků

Podobné dokumenty
OSTRAVSKÁ UNIVERSITA V OSTRAVĚ Pedagogická fakulta Obor informační technologie ve vzdělávání Kombinované studium

Reprezentace aritmetického výrazu - binární strom reprezentující aritmetický výraz

Předmět: Algoritmizace praktické aplikace

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

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.

Binární vyhledávací strom pomocí směrníků Miroslav Hostaša L06620

Programovací jazyk Pascal

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

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

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

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

Obsah přednášky. programovacího jazyka. Motivace. Princip denotační sémantiky Sémantické funkce Výrazy Příkazy Vstup a výstup Kontinuace Program

Virtuální počítač. Uživatelský program Překladač programovacího jazyka Operační systém Interpret makroinstrukcí Procesor. PGS K.

Binární vyhledávací stromy

Implementace binárního stromu směrníky

2.1 Podmínka typu case Cykly Cyklus s podmínkou na začátku Cyklus s podmínkou na konci... 5

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

Implementace LL(1) překladů

Binární vyhledávací strom. Proč binární? Vyhledávání

TTreeView je ten strom vlevo (vzhled se dá upravovat) a TListView je ten seznam vpravo (včetně volitelných módů zobrazení jako ikony).

Test prvočíselnosti. Úkol: otestovat dané číslo N, zda je prvočíslem

Časová a prostorová složitost algoritmů

Algoritmizace a programování

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

Abstraktní datové typy FRONTA

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

Úvod do programovacích jazyků (Java)

ALGORITMIZACE PRAKTICKÉ

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

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

Příklady: (y + (sin(2*x) + 1)*2)/ /2 * 5 = 8.5 (1+3)/2 * 5 = /(2 * 5) = 1.3. Pavel Töpfer, 2017 Programování 1-3 1

NPRG030 Programování I, 2018/19 1 / :03:07

Činnost: 1) Vyhodnotí se výraz E. 2) Jeho hodnota se uloží do proměnné V.

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

Dynamické datové typy a struktury

Anotace. Dámy na šachovnici dominance a nezávislost. Aritmetické výrazy, notace a převody mezi nimi, nejdelší rostoucí podposloupnost.

Poslední aktualizace: 14. října 2011

Automaty a gramatiky(bi-aag) Formální překlady. 5. Překladové konečné automaty. h(ε) = ε, h(xa) = h(x)h(a), x, x T, a T.

NPRG030 Programování I, 2015/16 1 / :25:32

CZ.1.07/1.5.00/

SEMESTRÁLNÍ PRÁCE Z PŘEDMĚTU MODELOVÁNÍ MATLABEM

Operátory. Základy programování 1 Tomáš Kühr

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

Zápis programu v jazyce C#

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

Object Pascal je přísně typový procedurální jazyk, který umožňuje jak strukturované, tak objektově orientované programování.

Anotace. zpět k rekurzi: teorie her. Martin Pergel,

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

PROGRAMOVACÍ JAZYKY A PŘEKLADAČE LL SYNTAKTICKÁ ANALÝZA DOKONČENÍ, IMPLEMENTACE.

Homer. prvky. délka. přední 0 zadní 4. Použití fronty BUS STOP. 3 Lisa. 2 Bart. 4 Maggie. 1 Marge. Grafické znázornění předchozí animace:

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

NMIN102 Programování /2 Z, Zk

Algoritmizace, základy programování, VY_32_INOVACE_PRG_ALGO_01

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

přetížení operátorů (o)

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

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

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

Cvičení 7: Delphi objekty CheckedBox, Radio- Button, EditBox

Západočeská univerzita v Plzni Dokumentace překladače PL/0 v PHP Předmět KIV/FJP

Algoritmus Minimax. Tomáš Kühr. Projektový seminář 1

Dynamické datové struktury III.

Algoritmizace prostorových úloh

Uplatnění metod na zvolený jazyk

Knihovna XmlLib TXV druhé vydání říjen 2012 změny vyhrazeny

ALGORITMIZACE A PROGRAMOVÁNÍ

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

PROGRAMOVACÍ JAZYKY A PŘEKLADAČE REALIZACE PŘEKLADAČE I

Konečný automat. Jan Kybic.

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

LEKCE 6. Operátory. V této lekci najdete:

Předmluva k aktuálnímu vydání Úvod k prvnímu vydání z roku Typografické a syntaktické konvence... 20

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

Da D to t v o é v ty t py IB111: Datové typy

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

Základní datové struktury III: Stromy, haldy

Slepé prohledávání do šířky Algoritmus prohledávání do šířky Při tomto způsobu prohledávání máme jistotu, že vždy nalezneme koncový stav, musíme ale p

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

Základy programovacího jazyka Turbo Pascal

Knihovna DataBoxLib TXV první vydání prosinec 2010 změny vyhrazeny

LabView jako programovací jazyk II

Prohledávání do šířky = algoritmus vlny

14. Složitější konstrukce

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

Sémantika Tabulka symbolů Intermediální kód Typová kontrola, přetypování Statická a dynamická sémantika. Sémantická analýza.

Úvod do programování

Algoritmizace prostorových úloh

Rekurzivní algoritmy

Komprese dat. Jan Outrata KATEDRA INFORMATIKY UNIVERZITA PALACKÉHO V OLOMOUCI. přednášky

PARADIGMATA PROGRAMOVÁNÍ 2 PŘÍSLIBY A LÍNÉ VYHODNOCOVÁNÍ

Generování vnitřní reprezentace programu

Stromy. Karel Richta a kol. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Karel Richta a kol.

Souhrn Apendixu A doporučení VHDL

Select sort: krok 1: krok 2: krok 3: atd. celkem porovnání. výběr nejmenšího klíče z n prvků vyžaduje 1 porovnání

Základy programování Proměnné Procedury, funkce, události Operátory a podmínková logika Objekt Range a Cells, odkazy Vlastnosti, metody a události

Logo2 operace, rekurze, větvení výpočtu

Texty k Programování na VŠFS. Petr Kučera () Texty k Programování na VŠFS 29. května / 117

53. ročník Matematické olympiády 2003/2004

DUM 06 téma: Tvorba makra pomocí VBA

Konstruktory a destruktory

Transkript:

Implementace aritmetického stromu pomocí směrníků Úvod Aritmetický strom je binární strom, který má ve vnitřních uzlech matematické operátory (+, -, /, *) a v listech (vrcholech) má operandy (např. čísla alebo identifikátory proměnných). Každý jeho uzel má buď dva nebo žádný podřízený uzel (nemůže mít jeden podřízený uzel). Každému aritmetickému výrazu (zcela uzávorkovanému) odpovídá právě jeden aritmetický strom a naopak. Např. strom na obrázku

má následující infixový zápis: (( 7 * 3 ) - ( 15 / 3 )) Aplikace Zpracovaná aplikace ukazuje tři příklady vytvoření aritmetického stromu pomocí směrníků, jeho vykreslení, výpočet hodnoty aritmetického výrazu, zjištění hloubky stromu a funkce pro infixový, prefixový a postfixový zápis. Všechny metody (kromě VYTVORIT a PRIDATUZEL) jsou zároveň ukázkou průchodu stromem. Deklarace type PUzel = ^TUzel; TUzel = record operator:char; // ' ',+,-,*,/ hodnota:integer; levy, pravy:puzel; Metody Procedura VYCISTIT(U) Uvolní paměť obsazenou uzlem U stromu Při volání kořenovým uzlem vyčistí celý strom. procedure Vycistit(Uzel:PUzel); while Uzel^.pravy<>nil do Vycistit(Uzel.pravy); Uzel^.pravy:=nil; while Uzel^.levy<>nil do 2

Vycistit(Uzel.levy); Uzel^.levy:=nil; Dispose(Uzel); Funkce PRIDATUZEL(U,o,h) Vytvoří nový uzel stromu pod uzlem U Funkce vytvoří nový uzel vlevo nebo vpravo podle toho, který směr je ještě volný a nastaví atributy uzlu. function PridatUzel(Otec:PUzel; Operator:Char; Hodnota:Integer):PUzel; New(Result); Result^.operator:=Operator; Result^.hodnota:=Hodnota; Result^.levy:=nil; Result^.pravy:=nil; if Otec<>nil then if Otec^.levy=nil then Otec^.levy:=Result Otec^.pravy:=Result; end Funkce VYPOCITAT(U) Vrátí výsledek výrazu definovaného aritmetickým stromem (počínaje uzlem U) function Vypocitat(Uzel:PUzel):Integer; case Uzel.operator of '+':Result:=Vypocitat(Uzel^.levy)+Vypocitat(Uzel^.pravy); '-':Result:=Vypocitat(Uzel^.levy)-Vypocitat(Uzel^.pravy); '*':Result:=Vypocitat(Uzel^.levy)*Vypocitat(Uzel^.pravy); '/':Result:=Vypocitat(Uzel^.levy) div Vypocitat(Uzel^.pravy); Result:=Uzel^.hodnota; Funkce HLOUBKA(U,h) Vrátí hloubku aritmetického stromu (počínaje uzlem U) v proměnné h. procedure Hloubka(U:PUzel; H:Integer); 3

l,p:integer; l:=1; p:=1; if U^.levy<>nil then Hloubka(U^.levy,l); if U^.pravy<>nil then Hloubka(U^.pravy,p); if l>p then H:=H+l H:=H+p; Funkce PREFIX(U) Vrátí prefixový zápis aritmetického stromu (počínaje uzlem U) function Prefix(Uzel:PUzel):string; if Uzel^.operator=' ' then Result:=IntToStr(Uzel^.Hodnota)+' ' Result:=Uzel^.operator+' '; if Uzel^.levy<>nil then Result:=Result+Prefix(Uzel^.levy); if Uzel^.pravy<>nil then Result:=Result+Prefix(Uzel^.pravy); Funkce POSTFIX(U) Vrátí postfixový zápis aritmetického stromu (počínaje uzlem U) function Postfix(Uzel:PUzel):string; if Uzel^.operator=' ' then Result:=' '+IntToStr(Uzel^.Hodnota) Result:=' '+Uzel^.operator+' '; if Uzel^.pravy<>nil then Result:=Postfix(Uzel^.pravy)+Result; if Uzel^.levy<>nil then Result:=Postfix(Uzel^.levy)+Result; 4

Funkce INFIX(U) Vrátí infixový zápis aritmetického stromu (počínaje uzlem U) function Infix(Uzel:PUzel):string; l,p:string; if Uzel^.operator=' ' then Result:=' '+IntToStr(Uzel^.Hodnota) if Uzel^.levy<>nil then l:=infix(uzel^.levy); if Uzel^.pravy<>nil then p:=infix(uzel^.pravy); Result:='('+l+' '+Uzel^.operator+' '+p+')'; Procedura KRESLI(U,x,y,uroven) Tato procedura je v aplikaci zapouzdřena do metody Vykreslit. Metoda Vykreslit připraví objekty nutné pro vykreslení v rámci programovacího prostředí Borland Delphi a procedura Kresli vykreslí aritmetický strom (počínaje uzlem U). Vstupní parametry x a y udávají počáteční souřadnice pro vykreslování, parametr uroven pak udává kolik uzlů stromu ještě zbývá vykreslit (z důvodů výpočtu souřadnic jednotlivých uzlů v rámci vykreslované úrovně). Konstanta r_uzel udává rozměr vykreslovaného uzlu. procedure TForm1.Vykreslit(Uzel:PUzel); const r_uzel = 24; Bmp:TBitmap; w:integer; procedure Kresli(U:PUzel;x,y,uroven:Integer); R:TRect; xc,yc:integer; with Bmp.Canvas do R:=Rect(x,y,x+r_uzel,y+r_uzel); xc:=x+(r_uzel div 2); yc:=y+(r_uzel div 2); uroven:=uroven div 2; if U^.levy<>nil then MoveTo(xc,yc); LineTo(xc-r_uzel*uroven,yc+r_uzel*2); Kresli(U^.levy,x-r_uzel*uroven,y+r_uzel*2,uroven); 5

if U^.pravy<>nil then MoveTo(xc,yc); LineTo(xc+r_uzel*uroven,yc+r_uzel*2); Kresli(U^.pravy,x+r_uzel*uroven,y+r_uzel*2,uroven); if U^.operator=' ' then Rectangle(R); DrawText(Bmp.Canvas.Handle,PChar(IntToStr(U^.Hodnota)),Length(IntToStr(U^.Hodnota)),R,DT_VCENTER or DT_CENTER or DT_SINGLELINE) end Ellipse(R); DrawText(Bmp.Canvas.Handle,@U^.Operator,1,R,DT_VCENTER or DT_CENTER or DT_SINGLELINE); Image1.Picture.Assign(nil); Bmp:=TBitmap.Create; try w:=0; Hloubka(Uzel,w); Bmp.Height:=w*r_uzel*2; Bmp.Width:=Trunc(Power(2,w-1)*r_uzel)*2; with Bmp.Canvas do Brush.Color:=clWhite; Pen.Color:=clBlack; Pen.Width:=2; Font.Name:='Arial'; Font.Size:=10; Font.color:=clBlack; Font.Style:=[fsBold]; Kresli(Uzel,(Bmp.Width div 2)-(r_uzel div 2),8,Trunc(Power(2,w-1))); Image1.Picture.Assign(Bmp); finally Bmp.Free; 6

Procedura VYTVORITSTROM testovací metoda pro vytvoření, výpočet a vyčištění stromu. Aplikace obsahuje i další dvě ianty jako ukázky dalších aritmetických stromů. procedure TForm1.VytvoritStromClick(Sender: TObject); Strom,U1,U2:PUzel; h:integer; Strom:=PridatUzel(nil,'-',0); U1:=PridatUzel(Strom,'*',0); U2:=PridatUzel(U1,' ',7); U2:=PridatUzel(U1,' ',3); U1:=PridatUzel(Strom,'/',0); U2:=PridatUzel(U1,' ',15); U2:=PridatUzel(U1,' ',3); h:=0; Hloubka(Strom,h); edhloubka.text:=inttostr(h); Vykreslit(Strom); edhodnota.text:=inttostr(vypocitat(strom)); edinfix.text:=infix(strom); edprefix.text:=prefix(strom); edpostfix.text:=postfix(strom); Vycistit(Strom); 7