Pagini recente » Cod sursa (job #1238294) | Cod sursa (job #3190960) | Cod sursa (job #336793) | Cod sursa (job #616072) | Cod sursa (job #270532)
Cod sursa(job #270532)
/*
Acest program transforma o expresie aritmetica cu paranteze,
adunari, scaderi, inmultiri, impartiri in forma poloneza postfixata.
Forma poloneza postfixata are urmatoarele reguli :
1. exp1 oper exp2 devine exp1 exp2 operator;
2. (exp) devine exp
Dupa aceea o evalueaza pe baza valorilor constantelor din fifier.
*/
#include<fstream.h>
#include<string.h>
#include<stdlib.h>
ifstream fin("evaluare.in");
ofstream fout("evaluare.out");
void termen(char &b);
void factor(char &c);
char exp[100001];
int poz=0;
long stiva[100001];
//char mat[101][10],n;
char citire()
{char q;
fin.get(q);
if(q!='\n');
return q;
}
void expresie(char &a)
{char op;
termen(a);
while(a=='+' || a=='-')
{op=a;
a=citire();
termen(a);
exp[poz]=op;
poz++;
}
}
void termen(char &b)
{char op;
factor(b);
while(b=='*' || b=='/')
{op=b;
b=citire();
factor(b);
exp[poz]=op;
poz++;
}
}
void factor(char &c)
{if(c>='a' && c<='z' || c>='0' && c<='9')
{exp[poz]=c;
poz++;
c=citire();
while(c>='0' && c<='9')
{exp[poz]=c;
c=citire();poz++;
}
if(c=='+' || c=='-' || c=='*' || c=='/')
if(exp[poz-1]>='0' && exp[poz-1]<='9') {exp[poz]=',';poz++;}
}
else if(c=='(')
{c=citire();
expresie(c);
c=citire();
}
}
void calculare()
{long i=0,j,p,q,nr,semn;
char numar[8];
for(j=0;j<strlen(exp);j++)
/* if(exp[j]>='a' && exp[j]<='z')
{for(p=0;p<=n;p++)
if(exp[j]==mat[p][0])
{nr=0;
q=2; semn=0;
if(mat[p][q]=='-') {semn=1;q++;}
for(; mat[p][q]>='0' && mat[p][q]<='9';q++,nr++)
numar[nr]=mat[p][q];
numar[nr]='\0';
stiva[i]=atof(numar);
if(semn==1) stiva[i]=stiva[i]*(-1);
i++;
break;
}
}
else */ if(exp[j]>='0' && exp[j]<='9')
{nr=0;
for(q=j;exp[q]>='0' && exp[q]<='9';q++,nr++)
numar[nr]=exp[q];
numar[nr]='\0';
stiva[i]=atol(numar);
i++;j=q-1;
}
else
if(exp[j]=='+') {stiva[i-2]=stiva[i-2]+stiva[i-1];
i--;
}
else if(exp[j]=='-') {stiva[i-2]=stiva[i-2]-stiva[i-1];
i--;
}
else if(exp[j]=='*')
{stiva[i-2]=stiva[i-2]*stiva[i-1];
i--;
}
else if(exp[j]=='/')
{stiva[i-2]=stiva[i-2]/stiva[i-1];
i--;
}
fout<<stiva[0];
}
int main()
{char c=citire();
expresie(c);
/*int i=0;
while(!fin.eof())
{fin>>mat[i];
i++;
}
n=i-1; */
exp[poz]='\0';
calculare();
fin.close();
fout.close();
return 0;
}