Pagini recente » Cod sursa (job #2670059) | Cod sursa (job #2616496) | Cod sursa (job #1026841) | Cod sursa (job #1376438) | Cod sursa (job #875094)
Cod sursa(job #875094)
#include <iostream>
#include <fstream>
#include <string.h>
#include <stdio.h>
using namespace std;
char s[2560];
double rezultat[5000];
//char postfix[256][256];
struct stiva
{
int numar;
char operatie;
} postfix[5000];
int Prioritate(char c)
{
if (c=='+' || c=='-') return 2;
if (c=='*' || c=='/') return 3;
if (c=='(' || c==')') return 1;
if (c=='^') return 4;
return 0;
}
void ScrieOperator(int &i, int &j, char c)
{
if (Prioritate(c)<=Prioritate(s[i]))
{
postfix[++j].operatie=s[i];
s[i]=c;
}
else
{
s[++i]=c;
}
}
int main()
{
ifstream f("date.in");
ofstream g("date.out");
char c;
int nr=0;
int i=-1;
int j=-1;
// citire si scriere in forma postfixata
while (!f.eof())
{
f>>c;
if (c>=48 && c<=58)
{
nr=nr*10+c-48;
//postfix[j][++n]=c;
}
else
{
if (nr!=0)
{
postfix[++j].numar=nr;
nr=0;
}
if (c=='(')
{
s[++i]='(';
}
else
{
if (c==')')
{
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;
else
switch(c)
{
case '+': ScrieOperator(i,j,c); break;
case '-': ScrieOperator(i,j,c); break;
case '*': ScrieOperator(i,j,c); break;
case '/': ScrieOperator(i,j,c); break;
case '^': ScrieOperator(i,j,c); break;
}
}
}
}
}
if (nr!=0)
postfix[++j].numar=nr/10;
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();
}