/*************************************************************************/ /* Seminarni prace - vedecka kalkulacka, Jan Dvorak 19 PRIKLAD.CPP */ /*************************************************************************/ #ifndef _PRIKLAD_CPP #define _PRIKLAD_CPP /*************************************************************************/ #include #include using namespace std; #include "priklad.h" //deklarace tridy (hlavicky) #include "format.cpp" //polymorfni tridy pro upravu formatu #include "vyhodnot.cpp" //trida pouzivajici polymorfniho stromu /*************************************************************************/ void Priklad::ostatniCLS(void) { //vymaze vystup na konzoli if(system("clear") == 1)system("cls"); } /*************************************************************************/ Priklad::Priklad(string nazev) { pi = 3.1415926535897932384626433832795; eul = 2.718281828459045235360287471352; vyresZadani(nazev); } /*************************************************************************/ Priklad::Priklad() { pi = 3.1415926535897932384626433832795; eul = 2.718281828459045235360287471352; uspech=false; zadani="//"; } /*************************************************************************/ string Priklad::vratVysledek(void) { if(uspech) return vysledek; else return "Chyba v zadani!"; } /*************************************************************************/ string Priklad::vratZadani(void) { return zadani; } /*************************************************************************/ string Priklad::vratStrojovyKod(void) { if(uspech) return strojovyKod; else return "Chyba v zadani!"; } /*************************************************************************/ void Priklad::zobrazChybu(string zprava) { //Zobrazeni chybove hlasky, ukonceni vypoctu uspech = false; cerr << "\n\nChyba:\n" << zprava << "\n\n"; } /*************************************************************************/ void Priklad::otevriSoubor(string nazev) { prikladZeSouboru(nazev, 0); } /*************************************************************************/ void Priklad::otevriSoubor(string nazev, int radek) { if(radek >= 1) prikladZeSouboru(nazev, radek); } /*************************************************************************/ void Priklad::prikladZeSouboru(string nazev, int radek) { //otevreni souboru, nacteni po radcich string s; int cradky = 0; unsigned int i; ifstream soubor; char nazevS[255]; for(i = 0; i < nazev.length(); i++) nazevS[i] = nazev[i]; nazevS[nazev.length()] = '\0'; soubor.open(nazevS); if(!soubor)cerr << "\nSoubor " << nazev << " nelze otevrit!\n";else { while(!soubor.eof()) { getline(soubor, s); cradky++; if(radek == 0 || radek == cradky)//vypis vsech || nebo vypsani urciteho vybraneho { vyresZadani(s); cout << *this; } } } soubor.close(); } /*************************************************************************/ ostream& operator <<(ostream& os,Priklad& p) { os << "\nReseni prikladu:\n----------------" << "\nZadani: " << p.vratZadani() << "\nStrojovy kod: " << p.vratStrojovyKod() << "\nReseni: " << p.vratVysledek() << endl << endl; return os; } /*************************************************************************/ void Priklad::about() { cout << "Informace o tride Priklad:\n" << "--------------------------\n" << "Nazev: Priklad\nNaprogramoval: Jan Dvorak 19\n" << "E - mail: dvorkaman@centrum.cz\n\n"; //vypsani souboru manual string s; ifstream soubor; soubor.open("manual.txt"); if(!soubor)cerr << "\nSoubor manual.txt nelze otevrit!\n";else { while(!soubor.eof()) { getline(soubor, s); cout << s << endl; } } soubor.close(); } /*************************************************************************/ void Priklad::vyresZadani(string zadani) { uspech = true; this->zadani = zadani; //preformatovani zadani pomoci polymorfnich trid string x=zadani; Format format; x = format.NahradAlias(x); x = format.OdstranPrebytky(x); x = format.DoplnZnaky(x); strojovyKod = x; uspech = (strojovyKod != "//"); // if(uspech) vysledek = vypocti("(" + strojovyKod + ")"); //vypocteni vysledku } /*************************************************************************/ Priklad::Priklad(const Priklad &pr) { zadani = pr.zadani; strojovyKod = pr.strojovyKod; vysledek = pr.vysledek; } /*************************************************************************/ string Priklad::vypocti(string x) { //rekurzivni algoritmus na vypocet zadani if(!uspech)return "//"; //pokud je chyba v zad�n� nepokra�ujem // string v = "0.0", q = ""; //vyhledani podzavorek string::size_type a = 0; string::size_type b = 0; string::size_type c = 0; while((a = x.find(")", a)) != string::npos) { b = c = 0; while((b = x.find("(",b)) != string::npos) { if(b >= a)break; c = b; b++; } if(c != 0) { //nahrazeni zavorky vysledkem; x.replace(c, a - c + 1, vypocti(x.substr(c, a - c + 1))); a = c-1; if(a < 0)a = 0; }else{ //vypocet zadaneho nejkratsiho podretezce (zavorky) //vytvoreni binarbiho stromu a jeho vypocet x = x.substr(1, x.length()-2); zavorka.zmenZadani(x); v = naString(zavorka.vysledek()); } // a++; } // return v; } /*************************************************************************/ string Priklad::naString(double x) { stringstream a; a<