Pagini recente » Cod sursa (job #1825961) | Cod sursa (job #1929738) | Cod sursa (job #2634637) | Cod sursa (job #934313) | Cod sursa (job #875110)
Cod sursa(job #875110)
#include <iostream>
#include <fstream>
#include <string.h>
#include <stdio.h>
using namespace std;
char s[5000];
double rezultat[100000];
struct stiva
{
long numar;
char operatie;
} postfix[100000];
int Prioritate(char v)
{
if (v=='+' || v=='-') return 2;
if (v=='*' || v=='/') return 3;
if (v=='(' || v==')') return 1;
if (v=='^') return 4;
return 0;
}
void ScrieOperator(int &i, int &j, char v)
{
if (Prioritate(v)<=Prioritate(s[i]))
{
postfix[++j].operatie=s[i];
s[i]=v;
}
else
{
s[++i]=v;
}
}
int main()
{
ifstream f("evaluare.in");
ofstream g("evaluare.out");
char c[100000];
int nr=0;
int i=-1;
int j=-1;
// citire si scriere in forma postfixata
//while (!f.eof())
f.get(c,100000);
for (int m=0;m<strlen(c);m++)
{
// f>>c;
if (c[m]>=48 && c[m]<=58)
{
nr=nr*10+c[m]-48;
//postfix[j][++n]=c;
}
else
{
if (nr!=0)
{
postfix[++j].numar=nr;
nr=0;
}
if (c[m]=='(')
{
s[++i]='(';
}
else
{
if (c[m]==')')
{
while (i>=0)
{
if (s[i]=='(') { s[i]=NULL; i--; break; }
else
{
postfix[++j].operatie=s[i];
s[i]=NULL;
i--;
}
}
}
else
{
if (i==-1) s[++i]=c[m];
else
switch(c[m])
{
case '+': ScrieOperator(i,j,c[m]); break;
case '-': ScrieOperator(i,j,c[m]); break;
case '*': ScrieOperator(i,j,c[m]); break;
case '/': ScrieOperator(i,j,c[m]); break;
case '^': ScrieOperator(i,j,c[m]); break;
}
}
}
}
}
if (nr!=0)
postfix[++j].numar=nr;
for (int m=i;m>=0;m--)
postfix[++j].operatie=s[m];
// evaluare expresie in forma postfixata
i=-1;
for (int m=0;m<=j;m++)
{
if (postfix[m].numar!=0)
{
rezultat[++i]=postfix[m].numar;
}
else
{
double a=rezultat[i];
rezultat[i]=0;
i--;
double b=rezultat[i];
//rezultat[i]=0;
switch(postfix[m].operatie)
{
case '+': rezultat[i]=a+b; break;
case '-': rezultat[i]=b-a; break;
case '*': rezultat[i]=a*b; break;
case '/': rezultat[i]=b/a; break;
}
}
}
/*for (int m=0;m<=j;m++)
{
if (postfix[m].numar!=0)
g<<postfix[m].numar<<" ";
else
g<<postfix[m].operatie;
}
g<<endl;*/
g<<rezultat[i];
f.close();
g.close();
}