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

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

Adatszerkezetek és algoritmusok

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

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

117. AA Megoldó Alfréd AA 117.

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

228. AA Default Konstruktor AA 228.

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

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

500. CC Megoldó Alfréd CC 500.

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

Programozás C++ -ban 2007/4

Aritmetikai kifejezések lengyelformára hozása

Maximum kiválasztás tömbben

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

STL. Algoritmus. Iterátor. Tároló. Elsődleges komponensek: Tárolók Algoritmusok Bejárók

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

500. DD Megoldó Alfréd DD 500.

Rekurzió. Horváth Gyula.

Programozás C++ -ban

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

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

PROGRAMOZÁSI NYELVEK - CPP. GYAKORLAT JEGYZET

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

1. Alapok. Programozás II

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

128. AA Megoldó Alfréd AA 128.

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

Bevezetés a C++ programozásba

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

500. AA Megoldó Alfréd AA 500.

Programozás II. 2. Dr. Iványi Péter

Objektumorientált programozás C# nyelven III.

Bevezetés a programozásba I.

PROGRAMOZÁSI NYELVEK - CPP. GYAKORLAT JEGYZET

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

503.AA Megoldo Arisztid 503.A

Szoftvertervezés és -fejlesztés I.

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

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

Körkörös listák. fej. utolsó. utolsó. fej

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

.AA Megoldó Alfréd AA.

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

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ási nyelvek I. 5. előadás (Gregorics Tibor anyagának felhasználásával)

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

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

Programozás alapjai C nyelv 5. gyakorlat. Írjunk ki fordítva! Írjunk ki fordítva! (3)

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

0. Megoldó Manó 0. Programozás alapjai 2. (inf.) pót zárthelyi gyak. hiányzás: 2 n/kzhp: n/11,5. ABCDEF IB.028/2.

feladat pont min elért

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

Elemi alkalmazások fejlesztése II. 2. Beadandó feladat Juhász Ádám

C++ Gyakorlat jegyzet 7. óra

Globális operátor overloading

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

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

A C# programozási nyelv alapjai

mul : S T N 1 ha t S mul(s, t) := 0 egyébként Keresés Ezt az eljárást a publikus m veletek lenti megvalósításánál használjuk.

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

Bevezetés a programozásba 2

Pénzügyi algoritmusok

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

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

Informatikai Kar. 3. fejezet. alapismeretek. Giachetta Roberto

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

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

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

INFORMATIKAI ALAPISMERETEK

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

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

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

félstatikus adatszerkezetek: verem, várakozási sor, hasítótábla dinamikus adatszerkezetek: lineáris lista, fa, hálózat

Osztály és objektum fogalma

Bevezetés a programozásba I.

List<String> l1 = new ArrayList<String>(); List<Object> l2 = l1; // error

Programozás II. 4. Dr. Iványi Péter

Programozás. C++ típusok, operátorok. Fodor Attila

Alkalmazott modul: Programozás 9. előadás. Strukturált programozás: dinamikus adatszerkezetek

1000.AA Megoldo Alfréd 1000.A

Objektumok inicializálása

Mit ír ki? feladatok megoldásokkal

Elemi alkalmazások fejlesztése III.

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

A szemantikus elemzés helye. A szemantikus elemzés feladatai. A szemantikus elemzés feladatai. Deklarációk és láthatósági szabályok

Az alábbi példában a Foo f(5); konstruktor hívása után mennyi lesz f.b értéke? struct Foo { int a, b; Foo(int c):a(c*2),b(c*3) {} };

Bevezetés a Programozásba II 12. előadás. Adatszerkezetek alkalmazása (Standard Template Library)

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

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

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

Programozás II gyakorlat. 6. Polimorfizmus

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

- 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]++;

Tervminták a valósidejű gyakorlatban

Fejlett programozási nyelvek C++ Sablonok és adatfolyamok

1. Template (sablon) 1.1. Függvénysablon Függvénysablon példányosítás Osztálysablon

Tartalomjegyzék. Általános Információ! 2. Felhasználói dokumentáció! 3. Feladat! 3. Környezet! 3. Használat! 3. Bemenet! 3. Példa!

Bevezetés a programozásba Előadás: Objektumszintű és osztályszintű elemek, hibakezelés

Bevezetés a C++ programozási nyelvbe

Átírás:

infix kifejezés a+b ab+ +ab Készítette: Szabóné Nacsa Rozália nacsa@inf.elte.hu postfix kifejezés prefix kifejezés a+b ab+ +ab a+b ab+ +ab 4

Lengyelforma J. Lukasewitz lengyel matematikus használta el ször. Példa: infix kifejezés a+bc-d ab+ +ab postfix kifejezés ab+cd- postfix kifejezés prefix kifejezés 5 6 El n A m veleti jelek olyan sorrendben követik egymást, amilyen sorrendben végre kell hajtani azokat. El n A m veleti jel operátor közvetlenül az operandusok után áll. infix forma: a+bc-d Infix forma a+bc-d Lengyelforma ab+cd- a b + op op m v c d - op op m v op op m v 7 8

Feladat: A standard bemeneten megadott, pontosveszz vel lezárt, szintaktikusan helyes, infix aritmetikai kifejezést alakítsunk át postfix kifejezésre lengyelformára. Példa: +-4 + 4 - sorozat sorozat verem + - 4 Az Az átalakításhoz két két sorozatot, és és egy vermet használunk. 9 0 sorozat sorozat verem + - 4 + - 4 verem Az x sorozatot balról jobbra haladva dolgozzuk fel. A sorozat végét ; jelzi. A következ szimbólum nyitózárójel. Tegyük a verembe!

+ - 4 + - 4 A következ szimbólum operandus. Írjuk ki! ki! A következ szimbólum operátor... Legfeljebb a nyitózárójelig kivesszük a veremb l l az az operátornál kisebb prioritású operátorokat és és kiírjuk azokat, 4 + - 4 + - 4 + + A következ szimbólum operátor... Legfeljebb a nyitózárójelig kivesszük a veremb l l az az operátornál kisebb prioritású operátorokat, és és kiírjuk azokat, majd majd.. ezt ezt az az operátort betesszük a verembe. A következ szimbólum operandus. Írjuk ki! 5 6 4

+ - 4 + - 4 + + + A következ szimbólum csukózárójel... Írjuk Írjuk ki ki a verem tetején lév lév elemeket egészen a nyitózárójelig,.... A következ szimbólum csukózárójel:. Írjuk ki a verem tetején lév elemeket egészen a nyitózárójelig, majd. vegyük ki a verem tetejér l a nyitózárójelet. 7 8 + - 4 + - 4 + + A következ szimbólum operátor:. Legfeljebb a nyitózárójelig kivesszük a veremb l az operandusnál kisebb prioritású operandusokat, és kiírjuk azokat,... 9 A következ szimbólum operátor:. Legfeljebb a nyitózárójelig kivesszük a veremb l az operandusnál kisebb prioritású operandusokat, és kiírjuk azokat, majd. Ezt az operandust betesszük a verembe. 0 5

+ - 4 + - 4 + + A következ szimbólum nyitózárójel. Tegyük a verembe! A következ szimbólum operandus. Írjuk ki! + - 4 + - 4 + + - A következ szimbólum operátor.. Legfeljebb a nyitózárójelig kivesszük a veremb l az operátornál kisebb prioritású operátorokat, és kiírjuk azokat,... A következ szimbólum operátor:. Legfeljebb a nyitózárójelig kivesszük a veremb l az operátornál kisebb prioritású operátorokat, és kiírjuk azokat, majd. ezt az operátort betesszük a verembe. 4 6

+ - 4 + - 4 + 4 + 4 - - - A következ szimbólum operandus. Írjuk ki! A következ szimbólum csukózáróje.. Írjuk ki a verem tetején lév elemeket egészen a nyitózárójelig,... 5 6 + - 4 + - 4 ; + 4 - + 4 - A következ szimbólum csukózárójel:. Írjuk ki a verem tetején lév elemeket egészen a nyitózárójelig, majd. vegyük ki a verem tetejér l a nyitózárójelet. Elértük a kifejezés végét. Írjuk ki a veremben lév összes elemet. 7 8 7

Feladat: Határozzuk meg egy sorozatban elhelyezett, postfix lengyelformára hozott kifejezs értékét. + 4 - + 4 - példa - A szimbólum operandus. Tegyük a verembe! 9 0 + 4 - + 4 - A következ szimbólum operandus. Tegyük a verembe! A következ szimbólum operator.. Vegyük ki a veremb l a második operandust,... 8

+ 4 - + 4 - A következ szimbólum operator:. Vegyük ki a veremb l a második operandust, majd. vegyük ki a veremb l az els operandust,... A következ szimbólum operator:. Vegyük ki a veremb l a második operandust, majd. vegyük ki a veremb l az els operandust, majd. Számítsuk ki az adott m veleti jellel a kifejezés értékét,... 4 + 4 - + 4 - A következ szimbólum operator:. Vegyük ki a veremb l a második operandust, majd. vegyük ki a veremb l az els operandust, majd. számítsuk ki az adott m veleti jellel a kifejezés értékét, majd 4. az így kapott eredményt tegyük a verembe. A következ szimbólum operandus. Tegyük a verembe! 5 6 9

+ 4 - + 4-4 4 4 A következ szimbólum operandus. Tegyük a verembe! A következ szimbólum operator.. Vegyük ki a veremb l a második operandust,... 7 8 + 4 - + 4-4 4 - A következ szimbólum operator.. Vegyük ki a veremb l a második operandust, majd. vegyük ki a veremb l az els operandust,... A következ szimbólum operator.. Vegyük ki a veremb l a második operandust, majd. vegyük ki a veremb l az els operandust, majd. számítsuk ki az adott m veleti jellel a kifejezés értékét,... 9 40 0

+ 4 - + 4-4 - - - A következ szimbólum operator.. Vegyük ki a veremb l a második operandust, majd. vegyük ki a veremb l az els operandust, majd. számítsuk ki az adott m veleti jellel a kifejezés értékét, majd 4. az így kapott eredményt tegyük a verembe. A következ szimbólum operator.. Vegyük ki a veremb l a második operandust,... 4 4 + 4 - + 4 - - - - A következ szimbólum operator:. Vegyük ki a veremb l a második operandust, majd. vegyük ki a veremb l az els operandust,... A következ szimbólum operator:. Vegyük ki a veremb l a második operandust, majd. vegyük ki a veremb l az els operandust, majd. számítsuk ki az adott m veleti jellel a kifejezés értékét,... 4 44

+ 4 - + 4 - ; - - Elértük a kifejezés végét - - A következ szimbólum operator.. Vegyük ki a veremb l a második operandust, majd. vegyük ki a veremb l az els operandust, majd. számítsuk ki az adott m veleti jellel a kifejezés értékét, majd 4. az így kapott eredményt tegyük a verembe. Az eredmény a verem tetején van. 45 46 Kifejezés lengyelformára hozása Lengyelforma kiértékelése sx,dx,read; =0; creates; pushs,dx hiextdx sx = norm dx = operandus x = x = x = operator tops tops prectops precdx is_emptys hiextpops hiextpops sy,dy,read; z:=0; createv; sy = norm pushv,dy dy = operandus op = popv op = popv push v, op dy op sx,dx,read is_emptys hiextpops pops pushs,dx 47 sy,dy,read z:hiextpopv 48

sorozat sorozat verem v: verem + - 4 49 50 + - 4 sorozat Az x sorozat elemei szimbólumok és számok. sorozat + - 4 sorozat verem v: verem Az y sorozat elemei szimbólumok és számok. Az x sorozat elemei szimbólumok és számok. A v veremben csak számok vannak. Token Operandus Operator ; 5 5

Token + - 4... operator >>... operator << virtual...is_operand virtual...is_operator virtual...to_string Token Operand Operator Operandus Operator ; 5... is_operand...... evaluateint op, int op... is_operator...... value... 54 Token Operand... is_operand......value Token... operator >>... operator << virtual...is_operand virtual...is_operator virtual...to_string Operator... is_operator...... evaluateint op, int op.. 55 A Token osztál deklaráció class Token Token.h friend std::ostream& operator<<std::ostream&, Token&; friend std::istream& operator>>std::istream&, Token&; public: virtual ~Tokenvoid; virtual bool is_leftp return false;; virtual bool is_rightp return false;; virtual bool is_operand return false;; virtual bool is_operator return false;; virtual bool is_end return false;; virtual int priority return 0;; virtual string to_stringreturn "";; virtual string class_namereturn "Token:";; protected: Token; ; 56 4

Token osztál implementáció includes A Token osztál implementáció - kiíró operátor #include<iostream> #include <string> using namespace std; #include "Token.h" #include "LEFTP.h" #include "RIGHTP.h" #include "END.h" #include "Operand.h" #include "Operator.h" Token.cpp ostream& operator <<ostream& s, Token& t s << t->to_string; ; return s; Virtuális függvény Token.cpp 57 58 Token osztál implementáció beolvasó operátor - istream& operator >> istream& s, Token& t char ch; int intval; s >> ch; switchch case '+': case '-':case '': case '/': t=new Operatorch; break; case '': t=new LEFTP; break; case '': t=new RIGHTP; break; case ';': t=new END; break; Token.cpp 59 Token osztál implementáció - beolvasó operátor - case '0':... case '9': s.putbackch; s >> intval; t=new Operandintval; break; default: cout << "Illegal element: " << ch << endl; s >> ch; return s; Token.cpp 60 5

Operandus Operand... is_operand...... value Token... operator >>... operator << virtual...is_operand virtual...is_operator virtual...to_string Operator... is_operator...... evaluateint op, int op.. Operand osztál deklaráció class Operand: public Token public: Operandint v val=v;; int value return val;; bool is_operand return true; ; string to_string; string class_name return "Operand: "; ; protected: int val; ; Operand.h 6 6 Operand osztál implementáció #include <string> using namespace std; #include "Token.h" #include "Operand.h" #include "Stack.h" string Operand::to_String string digit[0]="0","","","","4","5","6","7","8","9"; string s; Stack<string> v; ifval==0 v.push"0"; forint i=val;i!=0;i=i/0 v.pushdigit[i%0]; for;!v.empty;s=s+v.pop return s; ; Operand.cpp 6 Operator Operand... is_operand...... value Token... operator >>... operator << virtual...is_operand virtual...is_operator virtual...to_string Operator... is_operator...... evaluateint op, int op.. 64 6

Operator osztál deklaráció Operator osztál tostring class Operator: public Token public: Operatorchar o op=o;; bool is_operator return true; ; int priority; int evaluateconst int,const int; string to_string; string class_name return "Operator: "; ; Operator.h string Operator::to_String string ret; ret=op; return ret; ; Operator.cpp protected: char op; ; 65 66 Operator osztál priority Operator osztál evaluate int Operator::priority switchop case'+': case'-': return ; case'': case'/': return ; default: return ; ; Operator.cpp int Operator::evaluateconst int a,const int b switchop case'+': returna+b; case'-': returna-b; case'': returnab; case'/': returna/b; Operator.cpp 67 68 7

RIGHTP osztál deklaráció + implementáció LEFTP osztál deklaráció + implementáció class RIGHTP: public Token public: bool is_rightp return true; ; string to_stringreturn ""; ; string class_name return "Right parenthesi"; ; ; RIGHTP.h class LEFTP: public Token public: bool is_leftp return true; ; string to_stringreturn ""; ; string class_name return "Left parenthesi"; ; ; LEFTP.h 69 70 END osztál deklaráció + implementáció A Stack sablon osztály - class END: public Token public: bool is_end return true;; string to_stringreturn ";"; ; string class_name return "End of expression:"; ; ; END.h template <class Element> class Stack public: enum ExceptionsEMPTYSTACK; Stack:_top0; ~Stack; void pushconst Element&; Element top; Element pop; bool empty return _top == 0; Stack.h 7 7 8

A Stack sablon osztály - A Sequence sablon osztály - private: Stack.h Stackconst Stack<Element>&; Stack& operator=const Stack<Element>&; struct Node Element val; Node next; Nodeconst Element &v, Node n:valv,nextn ; Node _top; ; 7 template <class Element> class Sequence public: enum ExceptionsEMPTYSEQUENCE; Sequence:_first0,_last0,_current0 ; ~Sequence; void hiextconst Element&; Element lopop; void first _current = _first; void next _current = _current->next; Element current return _current->val; bool eol return _current == 0; bool empty return _first == 0; void print; Sequence.h 74 A Sequence sablon osztály - Modulszerkezet Token.h private: Sequenceconst Sequence<Element>&; Sequence.h Sequence& operator=const Sequence<Element>&; struct Node Element val; Node next; Node prev; Nodeconst Element &v, Node n, Node p:valv,nextn, prevp ; Node _first; Node _last; Node _current; ; LEFTP.h Operand.h Sequence.h Poland.cpp ENDP.h RIGHTP.h Stack.h Operator.h 75 76 9

Modulszerkezet LEFTP.h Operand.h Sequence.h TEMPLATE Token.h Poland.cpp ENDP.h RIGHTP.h Operator.h Stack.h TEMPLATE main.cpp - includes #include <string> using namespace std; #include "Token.h" #include "LEFTP.h" #include "RIGHTP.h" #include "END.h" #include "Operand.h" #include "Operator.h" #include "Stack.h" #include "Sequence.h" Token next_token; int main 77 78 main.cpp kifejezés beolvasása //Egy szintaktikusan helyes infix kifejezés elemeinek beolvasása Sequence<Token> x; Sequence<Token> y; Stack<Token> s; Token t; t=next_token; while!t->is_end x.hiextt; t=next_token; main.cpp: átalakítás //A kifejezés átalakítása lengyelformára x.first; while!x.eol t=x.current; ciklusmag x.next; for;!s.empty;y.hiexts.pop y.print; x.print; 79 80 0

main.cpp: átalakítás - ciklusmag ift->is_operand y.hiextt; else if t->is_leftp s.pusht; else ift->is_rightp while!s.top->is_leftp y.hiexts.pop; s.pop; main.cpp: átalakítás - ciklusmag else if t->is_operator while!s.empty && s.top->priority <= t->priority &&!s.top->is_leftp y.hiexts.pop; s.pusht; else cout << "Szintaktikai hiba?" << endl; 8 8 main.cpp: kiértékelés //A lengyelforma kiértékelése Stack<int> v; y.first; while!y.eol t=y.current; if t->is_operand v.pushdynamic_cast<operand>t->value; else v.pushdynamic_cast<operator>t->evaluatev.pop,v.pop; y.next; cout << "A kifejezes erteke: " << v.pop << endl; main.cpp: tárterület felszabadítása //A dinamikusan lefoglalt tárterület felszabadítása for x.first;!x.eol; x.next delete x.current; 8 84

+ - 4 + - 4 85 86 main.cpp: next_token + - 4 Token next_token char ch; int intval; cin >> ch; Token t; switchch 87 88

main.cpp:next_token case '+': case '-': case '': case '/': t=new Operatorch; break; case '': t=new LEFTP; break; case '': t=new RIGHTP; break; case ';': t=new END; break; main.cpp:next_token case '0': case '':... case '9': cin.putbackch; cin >> intval; t=new Operandintval; break; default: cout << "Illegal element: " << ch << endl; cin >> ch; return t; 89 90