Pagini recente » Cod sursa (job #881699) | Cod sursa (job #2112477) | Istoria paginii utilizator/licffa | Cod sursa (job #1244511) | Cod sursa (job #3335284)
#include<iostream>
#include<fstream>
using namespace std;
int expresie(string&s,int &pozi);
int termen(string&s,int &pozi);
int factor(string&s,int &pozi);
int numar(string&s,int &pozi);
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");
int expresie(string &s,int &pozi){
int semn=1;
int rez=factor(s,pozi);
while(pozi<s.size() &&(s[pozi]=='-'||s[pozi]=='+')){
semn=s[pozi]=='+'?1:-1;
++pozi;
rez+=semn*factor(s,pozi);
}
return rez;
}
int factor(string &s,int &pozi){
int rez=termen(s,pozi);
//cout<<"result is:"<<rez<<endl;
int nr;
bool inm=1;
while(pozi<s.size() &&(s[pozi]=='*'|| s[pozi]=='/')){
inm=s[pozi]=='*'?1:0;
++pozi;
nr=termen(s,pozi);
// cout<<"inm: "<<nr<<endl;
if(inm==1){
rez*=nr;
}else{
rez/=nr;
}
}
return rez;
}
int termen(string &s,int &pozi){
//next
if(s[pozi]=='('){
pozi++;
int nr=expresie(s,pozi);
// cout<<nr<<endl;
++pozi;
return nr;
}else{
return numar(s,pozi);
}
}
int numar(string &s,int &pozi){
int nr=0;
while(pozi<s.size() &&isdigit(s[pozi])){
nr=(10*nr)+(s[pozi]-'0');
pozi++;
}
return nr;
}
int main(){
string s;
fin>>s;
int pozStart=0;
fout<<expresie(s,pozStart);
return 0;
}