Pagini recente » Cod sursa (job #2592902) | Cod sursa (job #614103) | Cod sursa (job #2543680) | Cod sursa (job #1252347) | Cod sursa (job #875763)
Cod sursa(job #875763)
#include <cstdio>
#include <cstring>
using namespace std;
FILE *inFile = fopen("evaluare.in","r");
FILE *outFile = fopen("evaluare.out","w");
void citire();
char exp[100000];
struct nod
{
nod* left;
nod* right;
char info[255];
}*r;
void eval(char exp[],nod *&r)
{
if(exp[0] =='(' && exp[strlen(exp)-1] == ')')
{
int nrP =0;
for(int i =0 ; i < strlen(exp); i++)
{
if(exp[i] == '(')
nrP ++;
if(exp[i] == ')')
nrP--;
}
if( nrP == 0 )
{
exp[strlen(exp)-1] =0;
eval(exp+1,r);
}
return;
}
int nrP = 0;
for(int i = strlen(exp)-1; i > 0; i--)
{
if(exp[i] == '(')
nrP ++;
if(exp[i] == ')')
nrP--;
if((exp[i] == '+' || exp[i] == '-') && nrP == 0)
{
r = new nod();
r->left = NULL;
r->right = NULL;
r->info[0] = exp[i];
char aux[255];
strncpy(aux,exp,i);
aux[i] = 0;
eval(aux,r->left);
strcpy(aux,exp+i+1);
eval(aux,r->right);
return;
}
}
nrP = 0;
for(int i = strlen(exp)-1; i > 0; i--)
{
if(exp[i] == '(')
nrP ++;
if(exp[i] == ')')
nrP--;
if((exp[i] == '*' || exp[i] == '/') && nrP == 0)
{
r = new nod();
r->left = NULL;
r->right = NULL;
r->info[0] = exp[i];
char aux[255];
strncpy(aux,exp,i);
aux[i] = 0;
eval(aux,r->left);
strcpy(aux,exp+i+1);
eval(aux,r->right);
return;
}
}
char num[255];
strcpy(num,exp);
r = new nod();
strcpy(r->info,num);
r->left = NULL;
r->right = NULL;
return;
}
void inFix(nod *r)
{
printf("%s",exp);
}
void preFix(nod *r)
{
if(r==NULL)
return;
printf("%s",r->info);
preFix(r->left);
preFix(r->right);
}
void postFix(nod *r)
{
if(r==NULL)
return;
postFix(r->left);
postFix(r->right);
printf("%s",r->info);
}
int getNumber(nod *r)
{
char s[255];
strcpy(s,r->info);
int x = 0;
int p =1;
for(int i = 0 ;i <strlen(s); i++)
{
x = r->info[i]-'0' + x * 10;
}
return x;
}
int resultat(nod *r)
{
if(r==NULL)
return 0;
if(!strchr("+-/*",r->info[0]))
return getNumber(r);
if(strcmp(r->info,"+") == 0 && r->left != NULL && r->right != NULL)
return resultat(r->left) + resultat(r->right);
if(strcmp(r->info,"-") == 0 && r->left != NULL && r->right != NULL)
return resultat(r->left) - resultat(r->right);
if(strcmp(r->info,"*") == 0 && r->left != NULL && r->right != NULL)
return resultat(r->left) * resultat(r->right);
if(strcmp(r->info,"/") == 0 && r->left != NULL && r->right != NULL)
return resultat(r->left) / resultat(r->right);
}
int main(){
citire();
eval(exp,r);
//inFix(r);
//printf("\n");
//preFix(r);
//printf("\n");
//postFix(r);
//printf("\n");
printf("%d",resultat(r));
return 0;
}
void citire(){
fgets(exp,255,inFile);
exp[strlen(exp)-1] = 0;
for(int i = 0; i < strlen(exp);i++)
if(exp[i] == ' ')
{
strcpy(exp+i, exp+i+1);
}
}