Cod sursa(job #1294298)

Utilizator fluture.godlikeGafton Mihnea Alexandru fluture.godlike Data 17 decembrie 2014 11:11:09
Problema Evaluarea unei expresii Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.99 kb
//FP
#include <stdio.h>
#include <string.h>
#define NMAX 100000
FILE *fin, *fout;
char OP[NMAX], a;
int temp, p1 = 1, p2, FP[NMAX], ex[NMAX], p3;
bool check1[NMAX], check2[NMAX];
int main()
{
	fin = fopen("evaluare.in", "r");
	fout = fopen("evaluare.out", "w");
	OP[0] = '(';
	while(!feof(fin))
	{
		fscanf(fin, "%c", &a);
		if(a <= '9' && a >= '0')
		{
			temp += a - '0';
			temp*=10;
			continue;
		}
		else
		{
			if(temp)
			{
				ex[p3] = temp/10;
				temp = 0;
				p3++;
			}
			ex[p3] = a;
			check2[p3] = 1;
			p3++;
		}
	}	
	for(int i = 0; i< p3; i++)
	{
		if(!check2[i])
		{
			FP[p2] = ex[i];
			p2++;
			continue;
		}
		if(ex[i] == '(')
		{
			OP[p1] = '(';
			p1++;
			continue;
		}
		if(ex[i] == '*' || ex[i] == '/')
		{
			while(OP[p1-1] == '*' || OP[p1-1] == '/')
			{
				FP[p2] = OP[p1-1];
				check1[p2] = 1;
				p1--;
				p2++;
			}
			OP[p1] = ex[i];
			p1++;
			continue;
		}
		if(ex[i] == '+' || ex[i] == '-')
		{
			while(OP[p1-1] == '*' || OP[p1-1] == '/')
			{
				FP[p2] = OP[p1-1];
				check1[p2] = 1;
				p1--;
				p2++;
			}
			OP[p1] = ex[i];
			p1++;
		}
		if(ex[i] == ')')
		{
			while(OP[p1-1] != '(')
			{
				FP[p2] = OP[p1-1];
				check1[p2] = 1;
				p1--;
				p2++;
			}
			p1--;
		}
	}
	while(OP[p1-1] != '(')
	{
		FP[p2] = OP[p1-1];
		check1[p2] = 1;
		p1--;
		p2++;
	}
	p1--;
	/*for(int i = 0; i< p2; i++)
	{
		if(check1[i]) fprintf(fout, "%c.", FP[i]);
		else fprintf(fout, "%d.", FP[i]);
	}
	fprintf(fout, "\n");*/
	for(int i = 0; i < p2; i++)
	{
		if(check1[i])
		{
			if(FP[i] == '+')
			{
				FP[i] = FP[i-1] + FP[i-2];
				if(i-3 >= 0) FP[i-1] = FP[i-3];
				continue;
			}
			if(FP[i] == '-')
			{
				FP[i] = FP[i-2] - FP[i-1];
				if(i-3 >= 0) FP[i-1] = FP[i-3];
				continue;
			}
			if(FP[i] == '*')
			{
				FP[i] = FP[i-1] * FP[i-2];
				if(i-3 >= 0) FP[i-1] = FP[i-3];
				continue;
			}
			if(FP[i] == '/')
			{
				FP[i] = FP[i-2] / FP[i-1];
				if(i-3 >= 0) FP[i-1] = FP[i-3];
				continue;
			}
		}
	}
	fprintf(fout, "%d\n", FP[p2-1]);
	fclose(fin);
	fclose(fout);
	return 0;
}