Pagini recente » Cod sursa (job #2024200) | Cod sursa (job #2009278) | Cod sursa (job #215427) | Cod sursa (job #1881837) | Cod sursa (job #2241666)
#include <iostream>
#include <fstream>
#include <cstring>
#include <cmath>
using namespace std;
char a[100];
ifstream f("evaluare.in");
ofstream g("evaluare.out");
int VerifParanteze(int st, int dr)
{
int v = 0;
for(int i=st; i<=dr; i++)
{
if(a[i] == '(')
v++;
else if(a[i] == ')')
{
v--;
if(v < 0) return 0;
}
}
return v == 0;
}
int CautaSemne(char s1, char s2, int st, int dr)
{
int v = 0;
for(int i=dr; i>=st; i--)
{
if(a[i] == '(')
v++;
else if(a[i] == ')')
v--;
if((a[i] == s1 || a[i] == s2) && v == 0)
return i;
}
return -1;
}
float Transform(int st, int dr)
{
float nr = 0;
for(int i=st; i<=dr; i++)
nr = nr * 10 + (a[i] - '0');
return nr;
}
float Operation(float x, float y, char op)
{
switch(op)
{
case '+':
return x+y;
case '-':
return x-y;
case '*':
return x*y;
case '/':
return x/y;
case '^':
return pow(x, y);
}
}
float DivEtImp(int st, int dr)
{
while(a[st] == '(' && a[dr] == ')' && VerifParanteze(st+1, dr-1))
{
st++;
dr--;
}
int p = CautaSemne('+', '-', st, dr);
if(p == -1)
p = CautaSemne('*', '/', st, dr);
if(p == -1)
p = CautaSemne('^', '^', st, dr);
if(p == -1)
return Transform(st, dr);
return Operation(DivEtImp(st, p-1), DivEtImp(p+1, dr), a[p]);
}
void citire()
{
f.getline(a, 100);
}
int main()
{
citire();
g<<DivEtImp(0, strlen(a)-1);
return 0;
}