Pagini recente » Cod sursa (job #64244) | Cod sursa (job #5366) | Cod sursa (job #1104755) | Cod sursa (job #1057318) | Cod sursa (job #195260)
Cod sursa(job #195260)
/* ========================================================================== */
/* */
/* 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. */
/* I followed the idea from this source: */
/* http://infoarena.ro/job_detail/145387?action=view-source */
/* */
/* ========================================================================== */
#include <cstdio>
const long MAX = 100010;
char S[MAX], *p=S;
long eval();
long termen();
long factor();
int main() {
FILE *fin=fopen("evaluare.in", "r");
FILE *fout=fopen("evaluare.out", "w");
fgets(S, MAX, fin);
fprintf(fout, "%ld\n", eval());
return 0;
}
long eval() {
long r = termen();
while ( *p=='+' || *p=='-' ) {
switch ( *p ) {
case '+':
++p; // trec peste "+"
r += termen();
break;
case '-':
++p; // trec peste "-"
r -= termen();
break;
}
}
return r;
}
long termen() {
long r = factor();
while ( *p=='*' || *p=='/' ) {
switch ( *p ) {
case '*' :
++p;
r *= factor();
break;
case '/':
++p;
r /= factor();
break;
}
}
return r;
}
long factor() {
long r=0;
if ( *p == '(' ) { // subexpresie
++p; // trec peste '('
r = eval();
++p; // trec peste ')'
} else {
while ( *p>='0' && *p<='9' ) { // numar
r = r*10 + *p - '0';
++p;
}
}
return r;
}