Brauche Hilfe
-
Guten Tach
Bin noch neu hier, wenn ich falsch gepostet hab bitte flamen.
Bin grad dabei einen Taschenrechner zu schreiben. Man gibt den kompletten Term ein, der wird dann in Zahlen und Rechenoperatoren zerlegt (ich speicher den zerlegten Term in einem String-Vector) und dann brechnet. Der kann soweit +-*/ und Potenzen (kann auch Potenz vor Punkt vor Strich und mit den Potenzen kann man sogar Wurzeln berechnen).
Nun mein Problem: Ich möchte nun Klammern einfügen, doch ich bekomm dann immer die Fehlermeldung "Expression: vector suscript out of range". Ich konnte den Fehler bissher nicht finden. Ich geb immer als Beispiel (2+3)*4 ein (was dann 24 geben sollte).Hier ist mal der ganze Code:#include <iostream> #include <string> #include <vector> #include "math.h" #include <sstream> using namespace std; vector<string> pushback_empty(vector<string> str); string calc(string term); string calc1(string term); string dbltostr(double i); double strtodbl(string str); const double pi=3.1415926536; int main() { START: string term; while(term.empty()) cin>>term; cout<<"="<<calc(term)<<endl <<"________________________________________________________________________________\n"; goto START; } string calc(string term) { vector<string>::size_type size=0; for(string::size_type ix=0;ix!=term.size();++ix){ if(ix!=0){ if(term[ix]=='+'||term[ix]=='*'||term[ix]=='/'||term[ix]=='^'||term[ix]=='-'&&isdigit(term[ix-1])) size+=2; } if(term[ix]=='('||term[ix]==')') ++size; } vector<string> str(++size); vector<string>::size_type iy=0; for(string::size_type ix=0;ix!=term.size();++ix){ if(ix==0&&term[0]=='('){ str[0]=term[0]; ++iy; } if(term[ix]=='('||term[ix]==')'){ str[iy+1]=term[ix]; iy+=2; } if(ix!=0){ if(term[ix]=='+'||term[ix]=='*'||term[ix]=='/'||term[ix]=='^'||term[ix]=='-'&&isdigit(term[ix-1])){ str[iy+1]=term[ix]; iy+=2; } if(ix==1&&term[0]!='(') str[0]=term[0]; if(isdigit(term[ix])||term[ix]=='.'||term[ix]=='-'&&!isdigit(term[ix-1])) str[iy]+=term[ix]; } } size=0; for(vector<string>::size_type ix=0;ix!=str.size();++ix){ if(str[ix]=="(") ++size; } for(vector<string>::size_type ix1=0;ix1!=size;++ix1){ iy=0; vector<string>::size_type iz=0; for(vector<string>::size_type ix=0;ix!=str.size();++ix){ if(str[ix]=="(") iy=ix; if(str[ix]==")"&&!ix) iz=ix; } str[iy]=""; str[iz]=""; string temp=""; for(vector<string>::size_type ix=++iy;ix!=iz;++ix){ temp+=str[ix]; str[ix]=""; } str[iy-1]=calc1(temp); str=pushback_empty(str); } return string(calc1(term)); } string calc1(string term) { vector<string>::size_type size=0; for(string::size_type ix=0;ix!=term.size();++ix){ if(ix!=0){ if(term[ix]=='+'||term[ix]=='*'||term[ix]=='/'||term[ix]=='^'||term[ix]=='-'&&isdigit(term[ix-1])) size+=2; } } vector<string> str(++size); vector<string>::size_type iy=0; for(string::size_type ix=0;ix!=term.size();++ix){ if(ix!=0){ if(term[ix]=='+'||term[ix]=='*'||term[ix]=='/'||term[ix]=='^'||term[ix]=='-'&&isdigit(term[ix-1])){ str[iy+1]=term[ix]; iy+=2; } if(ix==1) str[0]=term[0]; if(isdigit(term[ix])||term[ix]=='.'||term[ix]=='-'&&!isdigit(term[ix-1])) str[iy]+=term[ix]; } } for(vector<string>::size_type ix=0;ix!=str.size();++ix){ if(str[ix]=="^"){ str[ix]=dbltostr(pow(strtodbl(str[ix-1]),strtodbl(str[ix+1]))); str[ix-1]=""; str[ix+1]=""; } } for(vector<string>::size_type ix=0;ix!=str.size();++ix){ if(str[ix]=="*"){ str[ix]=dbltostr(strtodbl(str[ix-1])*strtodbl(str[ix+1])); str[ix-1]=""; str[ix+1]=""; } if(str[ix]=="/"){ str[ix]=dbltostr(strtodbl(str[ix-1])/strtodbl(str[ix+1])); str[ix-1]=""; str[ix+1]=""; } str=pushback_empty(str); } for(vector<string>::size_type ix=0;ix!=str.size();++ix){ if(str[ix]=="+"){ str[ix]=dbltostr(strtodbl(str[ix-1])+strtodbl(str[ix+1])); str[ix-1]=""; str[ix+1]=""; } if(str[ix]=="-"){ str[ix]=dbltostr(strtodbl(str[ix-1])-strtodbl(str[ix+1])); str[ix-1]=""; str[ix+1]=""; } str=pushback_empty(str); } string res; for(vector<string>::size_type ix=0;ix!=str.size();++ix) if(str[ix]!="") res=str[ix]; return string(res); } vector<string> pushback_empty(vector<string> str) { for(vector<string>::size_type ix=0;ix!=str.size();++ix){ if(str[ix].empty()){ for(vector<string>::size_type iy=ix;iy!=str.size()-1;++iy) str[iy]=str[iy+1]; str[str.size()-1]=""; } } return str; } string dbltostr(double i) { ostringstream Str; Str<<i; return string(Str.str()); } double strtodbl(string str) { stringstream Str(str); double i; Str>>i; return i; }Fänd's schön wenn ihr mir helfen könntet. (Falls es relevant ist, wovon ich nicht ausgehe, ich benutze Visual Studio 2008 Professional)
mfg MaSter_MiND_
-
nutz den debugger und benutz hier die cpp-tags anstatt der code-tags
#include "math.h"->#include <cmath>int main() { START: goto START; }nimm halt ne endlosschleife...
string(Str.str());sieht ein wenig sinnlos aus:
http://www.cplusplus.com/reference/iostream/ostringstream/str/
gibt also scho nen string zurück...deinen eigtl. fehler seh ich auf anhieb aber nicht - aber guck halt ma mit dem debugger durch...
bb