Cod sursa(job #195168)

Utilizator Dr.OptixCristian Dinu Dr.Optix Data 16 iunie 2008 22:09:01
Problema Evaluarea unei expresii Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 2.27 kb
/* ========================================================================== */
/*                                                                            */
/*   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;
}