Pagini recente » Cod sursa (job #453184) | Cod sursa (job #1000157) | Cod sursa (job #266632) | Cod sursa (job #2679828) | Cod sursa (job #195168)
Cod sursa(job #195168)
/* ========================================================================== */
/* */
/* Evaluarea unei expresii.cpp */
/* (c) 2008 Dr.Optix (Cristian Dinu) */
/* */
/* This program take an arithmetic expresion as input from a file and */
/* return the result. */
/* ========================================================================== */
#include <stdio.h>
#include <stdlib.h>
//definitions
#define ExprMaxLen 100001
//global variables
char expr[ExprMaxLen];
long result;
//function prototypes
long ParseAtom(char*& expr);
long ParseFactors(char*& expr);
long ParseSummands(char*& expr);
long EvaluateTheExpression(char* expr);
//The Main Core
int main()
{
FILE *fin=fopen("evaluare.in","r");
//read the data
fgets (expr , ExprMaxLen , fin);
fprintf(fopen("evaluare.out", "w"), "%ld\n", EvaluateTheExpression(expr));
return 0;
}
long EvaluateTheExpression(char* expr){
return ParseSummands(expr);
}
// Parse addition and subtraction
long ParseSummands(char*& expr) {
double num1 = ParseFactors(expr);
for(;;) {
char op = *expr;
if(op != '-' && op != '+')
return num1;
expr++;
double num2 = ParseFactors(expr);
if(op == '-')
num1 -= num2;
else
num1 += num2;
}
}
// Parse multiplication and division
long ParseFactors(char*& expr) {
double num1 = ParseAtom(expr);
for(;;) {
// Save the operation
char op = *expr;
if(op != '/' && op != '*')
return num1;
expr++;
double num2 = ParseAtom(expr);
// Perform the saved operation
if(op == '/')
num1 /= num2;
else
num1 *= num2;
}
}
long ParseAtom(char*& expr){
// Read the number from string
char* end_ptr;
double res = strtod(expr, &end_ptr);
// Advance the pointer and return the result
expr = end_ptr;
return res;
}