Objektum elvű alkalmazások fejlesztése Kifejezés lengyel formára hozása és kiértékelése

Hasonló dokumentumok
infix kifejezés a+b ab+ +ab postfix kifejezés prefix kifejezés a+b ab+ +ab a+b ab+ +ab Készítette: Szabóné Nacsa Rozália

OAF Gregorics Tibor: Minta dokumentáció a 3. házi feladathoz 1.

117. AA Megoldó Alfréd AA 117.

Aritmetikai kifejezések lengyelformára hozása

Maximum kiválasztás tömbben

Objektum elvű alkalmazások fejlesztése. Verem típus osztály-sablonja

Objektumorientált programozás C# nyelven III.

C# nyelv alapjai. Krizsán Zoltán 1. Objektumorientált programozás C# alapokon tananyag. Általános Informatikai Tanszék Miskolci Egyetem

A C# programozási nyelv alapjai

2. Rekurzió. = 2P2(n,n) 2 < 2P2(n,n) 1

Bánsághi Anna

Mit tudunk már? Programozás alapjai C nyelv 4. gyakorlat. Legnagyobb elem keresése. Feltételes operátor (?:) Legnagyobb elem keresése (3)

Programozás alapjai C nyelv 4. gyakorlat. Mit tudunk már? Feltételes operátor (?:) Típus fogalma char, int, float, double

Programozás BMEKOKAA146. Dr. Bécsi Tamás 2. előadás

Programozás BMEKOKAA146. Dr. Bécsi Tamás 1. Előadás

Globális operátor overloading

Szoftvertervezés és -fejlesztés I.

Programozás II. ATM példa Dr. Iványi Péter

A feladat lényege egy felhasználói típusnak a zsák típusnak a megvalósítása.

Java II. I A Java programozási nyelv alapelemei

Számítástechnika I. BMEKOKAA152 BMEKOKAA119 Infokommunikáció I. BMEKOKAA606. Dr. Bécsi Tamás 2. előadás

Adatszerkezetek és algoritmusok

Számítástechnika I. BMEKOKAA152 BMEKOKAA119 Infokommunikáció I. BMEKOKAA606. Dr. Bécsi Tamás

Programozás II gyakorlat. 4. Öröklődés

A C# PROGRAMOZÁSI NYELV

Informatika terméktervezőknek

Objektum elvű alkalmazások fejlesztése Programozási tételek újrafelhasználása 1. Készítette: Gregorics Tibor

Kifejezések. Kozsik Tamás. December 11, 2016

STL gyakorlat C++ Izsó Tamás május 9. Izsó Tamás STL gyakorlat/ 1

4. Öröklődés. Programozás II

Bevezetés a programozásba II. 5. Előadás: Másoló konstruktor, túlterhelés, operátorok

Programozás Minta programterv a 2. házi feladathoz 1.

C# osztályok. Krizsán Zoltán

1. Alapok. Programozás II

Objektum elvű alkalmazások fejlesztése Programozási tételek újrafelhasználása 1.

Programozás II gyakorlat. 8. Operátor túlterhelés

Objektumok inicializálása

Felhasználó által definiált adattípus

Tervminták a valósidejű gyakorlatban

Programozási alapismeretek :: beadandó feladat. Felhasználói dokumentáció. Molnár Tamás MOTIABT.ELTE

Objektumorientált programozás C# nyelven III.

Programozás alapjai II. (4. ea) C++

Java II. I A Java programozási nyelv alapelemei

Programozás I. 3. gyakorlat. Szegedi Tudományegyetem Természettudományi és Informatikai Kar

Kivételek kezelése (exception handling) Hibakezelés old style. Kivételkezelés

Programozás(A szakirány) II. beadandó feladat Farkas András HP6S15 1. csoport Veszprémi Anna / Hudoba Péter

Programozás C nyelven (3. ELŐADÁS) Sapientia EMTE

osztályok kapcsolata Származtatatás C++ Izsó Tamás március 19. Izsó Tamás Származtatatás/ 1

3. Osztályok II. Programozás II

Bevezetés a C++ programozásba

Szoftvertechnológia alapjai Java előadások

Pál László. Sapientia EMTE, Csíkszereda, 2014/2015

Java Programozás 9. Gy: Java alapok. Adatkezelő 5.rész

A lista eleme. mutató rész. adat rész. Listaelem létrehozása. Node Deklarálás. Létrehozás. Az elemet nekünk kell bef zni a listába

Pénzügyi algoritmusok

Bevezetés Kiíratás Beolvasás Formázás Fájlkezelés Gyakorló feladatok C++ I/O. Bevezetés. Izsó Tamás február 20. Izsó Tamás C++ I/O / 1

C# gyorstalpaló. Készítette: Major Péter

Bánsághi Anna 2014 Bánsághi Anna 1 of 68

BME MOGI Gépészeti informatika 4.

Számítástechnika II. BMEKOKAA Előadás. Dr. Bécsi Tamás

Tervminták II. (Híd, Bejáró, Gyártófüggvény) Halmaz és bejárása Osztály-sablonok

Járműfedélzeti rendszerek II. 1. előadás Dr. Bécsi Tamás

OBJEKTUM ORIENTÁLT PROGRAMOZÁS JAVA NYELVEN. vizsgatételek

Információs Technológia

Adatszerkezetek Adatszerkezet fogalma. Az értékhalmaz struktúrája

128. AA Megoldó Alfréd AA 128.

Programozási tételek újrafelhasználása

Programozás. (GKxB_INTM021) Dr. Hatwágner F. Miklós február 18. Széchenyi István Egyetem, Gy r

INFORMATIKAI ALAPISMERETEK

Algoritmizálás + kódolás C++ nyelven és Pascalban

Pelda öröklődésre: import java.io.*; import java.text.*; import java.util.*; import extra.*;

Programozási nyelvek Java

C++ programozási nyelv Konstruktorok-destruktorok

Objektumorientált programozás C# nyelven

Szövegek C++ -ban, a string osztály

Programozási nyelvek I. 5. előadás (Gregorics Tibor anyagának felhasználásával)

Objektum Orientált Programozás. 11. Kivételkezelés 44/1B IT MAN

Osztály és objektum fogalma

Programozási nyelvek (ADA)

EAF II Feladat dokumentáció IV. feladat 4. házi feladathoz

500. DD Megoldó Alfréd DD 500.

Kivételkezelés, beágyazott osztályok. Nyolcadik gyakorlat

Kifejezések. Kozsik Tamás. December 11, 2016

Programozás II gyakorlat. 6. Polimorfizmus

Bevezetés a programozásba 2

Elemi alkalmazások fejlesztése III.

- 1 - Konstansok használata. Döntsük el, van-e fordítási idejű hiba az alábbi programrészletekben! a) const char * str="zh"; str[0]++;

Számítástechnika II. BMEKOKAA Előadás. Dr. Bécsi Tamás

Java Programozás 4. Gy: Java GUI. Tipper, MVC kalkulátor

Pénzügyi algoritmusok

Bevezetés a Programozásba II 8. előadás. Polimorfizmus Giachetta Roberto

Java Programozás 1. Gy: Java alapok. Ismétlés ++

Helyes-e az alábbi kódrészlet? int i = 1; i = i * 3 + 1; int j; j = i + 1; Nem. Igen. Hányféleképpen lehet Javaban megjegyzést írni?

Programozás BMEKOKAA146. Dr. Bécsi Tamás 3. előadás

Statikus adattagok. Statikus adattag inicializálása. Speciális adattagok és tagfüggvények. Általános Informatikai Tanszék

Abstract osztályok és interface-ek. 7-dik gyakorlat

Algoritmusok és adatszerkezetek II.

Tartalom DCOM. Történeti áttekintés. Történeti áttekintés. Történeti áttekintés. Történeti áttekintés

Objektum elvű alkalmazások fejlesztése 3. beadandó

Elemi Alkalmazások Fejlesztése II.

Átírás:

Objektum elvű alkalmazások fejlesztése Kifejezés lengyel formára hozása és kiértékelése Készítette: Gregorics Tibor Szabóné Nacsa Rozália

Alakítsunk át egy infix formájú aritmetikai kifejezést postfix (lengyel) formájúra, és számoljuk ki az értékét. (11+26)*(43-4) 11 26 + 43 4 - * 1443 Mindkét lépéshez egy-egy vermet használunk, az elsőben a műveleti jeleket és a nyitózárójeleket helyezzük el, a másodikban pedig az operandusokat illetve a részeredményeket.

bemenet: (11+26)*(43-4) Tokenizálás x: ( ) ( ( 11 + 26 ) * ( 43-4 ) ) Lengyelformára hozás 11 + 26 43-4 * y: 11 26 + 43 4 - * Lengyelforma kiértékelése eredmény: 1443

1. Tokenizáljuk a karaktersorozatként megadott infix formájú kifejezést és a tokenek címeit elhelyezzük egy x sorozatban. 2. Lengyel formára alakítjuk az x sorozatbeli kifejezést: azaz a tokenek címét postfix formában soroljuk fel egy y sorozatban. 3. Kiértékeljük az y sorozatbeli lengyel formát. Kell: Különféle tokenek típusai Token és abból származtatott Operandus, Operator, Balzárójel, Jobbzárójel osztályok sorozatok típusa: BiQueue<Token*> vermek típusai: Stack<Token*>, Stack<int>

tokenizáló Token +is_operand() : bool +is_operator() : bool +is_leftp() : bool +is_rightp() : bool +read(stream) : Token* +to_string() : string alternatív szerkezetű típus return false operator >> Operand Operator LeftP RightP - val:int - op:char +is_operand() : bool +to_string() : string +value() : int +is_operator() : bool +to_string() : string +evaluate() : int +priority() : int +is_leftp() : bool +to_string() : string +is_rightp() : bool +to_string() : string return true return true return true return true

A Token osztály: deklaráció class Token { public: class IllegalCharacterException{... ; virtual ~Token(); virtual bool is_leftp() const {return false; virtual bool is_rightp() const {return false; virtual bool is_operand() const {return false; virtual bool is_operator() const {return false; virtual bool is_end() const {return false; ; virtual std::string to_string() const = 0; specifikációban még nem szerepelt friend std::istream& operator>>(std::istream&, Token*&); token.h

Token osztály: deklaráció class Token {... public: class IllegalCharacterException{ private: char _ch; public: IllegalCharacterException(char c) : _ch(c){ char message() const { return _ch; ;... ; token.h

Token osztály: implementáció istream& operator>> (istream &s, Token* &t){ char ch; s >> ch; switch(ch){ case '+': case '-': case '*': case '/': t = new Operator(ch); break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': s.putback(ch); int intval; s >> intval; t = new Operand(intval);break; case '(': t = new LeftP(); break; case ')': t = new RightP(); break; case ';': t = new End(); break; default : if(!s.fail()) throw new Token::IllegalCharacterException(ch); return s; vissza a pufferbe a kifejezést pontosvessző zárja le Csak előjel nélküli egész számok token.cpp

Operand osztály: deklaráció class Operand: public Token { public: Operand(int v) {_val=v; bool is_operand() const {return true; std::string to_string() const { std::ostringstream ss; ss << _val; return ss.str(); konverzió int value() const {return _val; ; protected: int _val; token.h

Operator osztály: deklaráció class Operator: public Token { public: Operator(char o) {_op = o;; bool is_operator() const {return true; std::string to_string() const { string ret; ret = _op; return ret; konverzió int priority() const; int evaluate(int a, int b) const; ; protected: char _op; token.h

Operator osztály: implementáció int Operator::priority() const { switch(_op){ case '+': case '-': return 1; case '*': case '/': return 2; default: return 3; int Operator::evaluate(int a, int b) const { switch(_op){ case '+': return a+b; case '-': return a-b; case '*': return a*b; case '/': return a/b; token.cpp

RightP, LeftP, End osztály: deklaráció + implementáció class RightP: public Token{ public: bool is_rightp() const{ return true; std::string to_string() const{ return ")"; ; class LeftP: public Token{ public: bool is_leftp() const { return true; std::string to_string() const { return "("; ; class End: public Token{ public: bool is_end() const { return true; std::string to_string() const { return ";"; ; token.h

token.h Token Operand Operator Left Right End token.cpp main.cpp biqueue.hpp BiQueue<Item> stack.hpp Stack<Item>

int main() { char ch; do{ cout << "Add meg az aritmetikai kifejezest!\n"; BiQueue<Token*> x; try{ Token *t; cin >> t; while(!t->is_end()){ x.hiext(t); cin >> t; catch(token::illegalcharacterexception *ex){ cout << "Illegális karakter: " << ex->message() << endl; delete ex; goto exit;... tokent olvas csak óvatosan újrefalhasznált gyűjtemény olvasás dobja main.cpp

A bemenő sorozat nyitó zárójeleit és műveleti jeleit egy verembe tesszük (az alacsonyabb precedenciájú műveleti jel mindig helyet cserél az alatta levő magasabb precedenciájúval), minden más jelet közvetlenül a kimenő sorozatba másolunk. Csukó zárójel olvasása esetén illetve a bemenő sorozat feldolgozásának végén kiürítjük a verem tartalmát a leg(f)első nyitózárójeléig a kimenő sorozatba. ( 11 + 26 ) * ( 43-4 )

Megoldás struktogrammja x.first() y:=<> x.end() t = x.current() t is_operand() t is_leftp() t is_rightp() t is_operator() s.empty() y.hiext(t) s.push(t) s.top() is_left() s.top() s_left() s.top() priority() t priority() y.hiext(s.pop()) y.hiext(s.pop()) x.next() s.pop() s.push(t) x.next() s.empty() y.hiext(s.pop())

Megvalósítás... { BiQueue<Token*> y; Stack<Token*> s; BiQueue<Token*>::Enumerator itx = x.createenumerator(); for(itx.first();!itx.end(); itx.next()){ Token *t = itx.current(); if ( else if ( // köv. dia else if ( else if ( while(!s.empty()){ if(s.top()->is_leftp()){ cout << "Szintaktikai hiba!n"; goto exit;... else y.hiext(s.pop()); felsoroló a struktogamm négy-ágú elágazása hiba lehetőség: több nyitó zárójel,mint csukó main.cpp

... if (t->is_operand()) y.hiext(t); else if (t->is_leftp()) s.push(t); else if (t->is_rightp()){ try{ while(!s.top()->is_leftp()) y.hiext(s.pop()); s.pop(); catch(stackexceptions ex){ if(ex==emptystack){ cout << "Szintaktikai hiba!"; goto exit; hiba lehetőség: több a csukó zárójel, mint nyitó static casting : Az s.top()->priority() nem jó, mert Token-ben nincs priority() else if (t->is_operator()) { while(!s.empty() && s.top()->is_operator() && ((Operator*)s.top())->priority() >=((Operator*)t)->priority() ){ y.hiext(s.pop()); s.push(t);... main.cpp

A lengyel forma operandusait (olvasásuk sorrendjében) egy verembe tesszük. Műveleti jel olvasása esetén a verem tetején levő két értéket (csak bináris műveleteink vannak) kivesszük, azokat a szóban forgó művelettel feldolgozzuk, és az eredményt visszatesszük a verembe. A feldolgozás végén a veremben találjuk kifejezés értékét. 11 26 + 43 4 - * 39 1443 37

Megoldás struktogrammja y.first() y.end() t = y.current() t is_operand() v.push(t) v.push (Evaluate (v.pop(), v.pop())) y.next() z:=v.pop()

Kiértékelés... try{ Stack<int> v;... BiQueue<Token*>::Enumerator ity=y.createenumerator(); for(ity.first();!ity.end(); ity.next()){ Token *t = ity.current(); if (t->is_operand()) v.push( ((Operand*)t)->value() ); else v.push( ((Operator*)t)->evaluate statikus konverzió (v.pop(), v.pop()) ); statikus konverzió int r = v.pop(); if(!v.empty()){ cout << "Szintaktikai hiba!"; goto exit; cout << "A kifejezés értéke: " << r << endl; felsoroló hiba lehetőség: több operandus main.cpp

Kivételkezelés... try{... // ld. előző dia catch(stackexceptions ex){ if(ex==emptystack){ cout << "Szintaktikai hiba!"; goto exit; Különböző szintekről ugorunk ide hiba esetén exit: deallocatetoken(x); cout << "\nfolytatod? I/N"; cin >> ch; while(ch!='n' && ch!='n'); hiba lehetőség: kevés operandus felszabadítja az olvasás során végzett helyfoglalásokat return 0; main.cpp

Tokenek felszabadítása void deallocatetoken(biqueue<token*> &x) { felsoroló BiQueue<Token*>::Enumerator itx = x.createenumerator(); for(itx.first();!itx.end(); itx.next()){ delete itx.current(); main.cpp