/*************************************************************************/ /* Seminarni prace - vedecka kalkulacka, Jan Dvorak 1 VYHODNOT.CPP */ /*************************************************************************/ #ifndef _VYHODNOT_CPP #define _VYHODNOT_CPP /*************************************************************************/ #include #include using namespace std; #include "vyhodnot.h" /*************************************************************************/ Vyhodnot::Vyhodnot(string zadani) { p = 0; zmenZadani(zadani); } /*************************************************************************/ void Vyhodnot::zmenZadani(string zadani) { if(p != 0){delete p; p = 0;} //odstranime puvodni strom zad = zadani; p = strom(zad); vysl = p->vratHodnotu(); } /*************************************************************************/ Prvek* Vyhodnot::strom(string z) { //rekurzivni algoritmus //najdeme v retezci operator s nejvysi prioritou //a retezec pak rozpůlime na 1 nebo 2 casti a v nich se rekurzivne bude pokracovat... if(z.length() == 0) return 0; //nulova strana unsigned int i; char zz; string l,p; //plus minus for(i = z.length() - 1; i >= 0; i--) { zz = z[i]; if( (zz == 'p') || (zz == 'm')) { l = z.substr(0, i); p = z.substr(i + 1); } if(zz == 'p')return new Plus( strom(l), strom(p) ); else if(zz == 'm')return new Minus( strom(l), strom(p) ); if(i == 0)break; } //krat, deleno for(i = z.length() - 1; i >= 0; i--) { zz = z[i]; if( (zz == '*') || (zz == '/')) { l = z.substr(0, i); p = z.substr(i + 1); } if(zz == '*')return new Krat( strom(l), strom(p) ); else if(zz == '/')return new Deleno( strom(l), strom(p) ); if(i == 0)break; } //permutace, kombinace for(i = z.length() - 1; i >= 0; i--) { zz = z[i]; if( (zz == 'P') || (zz == 'K')) { l = z.substr(0, i); p = z.substr(i + 1); } if(zz == 'P')return new Permutace( strom(l), strom(p) ); else if(zz == 'K')return new Kombinace( strom(l), strom(p) ); if(i == 0)break; } //x na y,y-tá odmocnina z x for(i = z.length() - 1; i >= 0; i--) { zz = z[i]; if( (zz == '^') || (zz == 'i')) { l = z.substr(0, i); p = z.substr(i + 1); } if(zz == '^')return new XnaY( strom(l), strom(p) ); else if(zz == 'i')return new YodmocninaX( strom(l), strom(p) ); if(i == 0)break; } for(i = 0; i < z.length(); i++) { zz = z[i]; if( (zz == 'o') || (zz == 'r') || (zz == 'l') || (zz == 'n') || (zz == 'd') || (zz == 'u') || (zz == 's') || (zz == 'c') || (zz == 't') || (zz == 'g') || (zz == 'S') || (zz == 'C') || (zz == 'T') || (zz == 'G') ) { p = z.substr(i + 1); } if(zz == 'o')return new Odmocnina( strom(p) ); else if(zz == 'r')return new TretiOdmocnina( strom(p) ); else if(zz == 'l')return new Log10( strom(p) ); else if(zz == 'n')return new LogE( strom(p) ); else if(zz == 'd')return new DesetNaX( strom(p) ); else if(zz == 'u')return new EnaX( strom(p) ); else if(zz == 's')return new Sin( strom(p) ); else if(zz == 'c')return new Cos( strom(p) ); else if(zz == 't')return new Tan( strom(p) ); else if(zz == 'g')return new Cotan( strom(p) ); else if(zz == 'S')return new ASin( strom(p) ); else if(zz == 'C')return new ACos( strom(p) ); else if(zz == 'T')return new ATan( strom(p) ); else if(zz == 'G')return new ACotan( strom(p) ); } //x!, x O, x q, x h, x v for(i = z.length() - 1; i >= 0; i--) { zz = z[i]; if( (zz == '!') || (zz == 'O') || (zz == 'q') || (zz == 'h') || (zz == 'v')) { l = z.substr(0, i); } if(zz == '!')return new Faktorial( strom(l) ); else if(zz == 'O')return new Stupen( strom(l) ); else if(zz == 'q')return new NaDruhou( strom(l) ); else if(zz == 'h')return new NaTreti( strom(l) ); else if(zz == 'v')return new NaMinusPrvou( strom(l) ); if(i == 0)break; } //konstanta return new Cislo(naDouble(z)); } /*************************************************************************/ double Vyhodnot::naDouble(string x) { double v=0.0; stringstream a; a << x; a >> v; return v; } /*************************************************************************/ #endif