Cod sursa(job #1732074)

Utilizator serbanmaria15Serban Maria-Catalina serbanmaria15 Data 20 iulie 2016 18:40:52
Problema Evaluarea unei expresii Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.67 kb
#include<stdio.h>
#define MAX_CARACTERE 100001

char sir[MAX_CARACTERE], *cursor=sir;

long produs();
long subexpresie();

//adunare() apeleza produs(), care apeleaza suexpresie(), care apeleaza adunare() => recursivitate indirecta
long adunare()
{
	long rez=produs();
	while((*cursor == '+') || (*cursor == '-'))
	{
		switch(*cursor)
		{
			case '+':
				++cursor; //deplasam cursorul sa treaca peste caraterul +
				rez+=produs();
				break;
			case '-':
				++cursor; //deplasam cursorul sa treaca peste caracterul -
				rez-=produs();
				break;
		}
	}
	return rez;
}

long produs()
{
	long rez=subexpresie();
	while((*cursor == '*') || (*cursor == '/'))
	{
		switch(*cursor)
		{
			case '*':
				++cursor; //deplasam cursorul sa treaca peste caracterul *
				rez*=subexpresie();
				break;
			case '/':
				++cursor; //deplasam cursorul sa treca peste caracterul /
				rez/=subexpresie();
				break;
		}
	}
	return rez;
}

long subexpresie() //o subexpresie poate fi o paranteza sau un numar
{
	long rez=0;//initializare rezultat
	if( *cursor == '(' )
	{
		++cursor; //deplasam cursorul sa treca peste caracterul (
		 rez=adunare();
		 ++cursor; //deplasam cursorul sa treaca peste caracterul )
	}
	else //avem un numar format din cifre
	{
		while((*cursor >= '0') && (*cursor <='9'))
		{
			rez=rez*10 + *cursor - '0';
			++cursor;//trece la urmatoarea cifra
		}
	}
	return rez;
}

int main()
{
	FILE *inputFile, *outputFile;
	inputFile=fopen("evaluare.in", "r");
	outputFile=fopen("evaluare.out", "w");

	fgets(sir,MAX_CARACTERE,inputFile);

	fprintf(outputFile, "%ld", adunare());

	return 0;
}