Pagini recente » Cod sursa (job #2841413) | Cod sursa (job #401216) | Cod sursa (job #3245924) | Cod sursa (job #73603) | Cod sursa (job #2788394)
///rezolvare cu varianta 1
#include <stdio.h>
#include <string.h>
#define MAXCH 100000
char list_sg[MAXCH];
char s[MAXCH];
int list_nr[MAXCH];
int loc, nr_sg, nr_nr;
int factor() {
int nr;
nr = 0;
while ( s[loc] >= '0' && s[loc] <= '9' ) {
nr = nr * 10 + s[loc] - '0';
loc++;
}
return nr;
}
void addSign(char ch) {
if ( ch == '+' || ch == '-' || ch == '*' || ch == '/' || ch == '(' || ch == ')' ){
list_sg[nr_sg] = ch;
nr_sg++;
}
}
char lastSign() {
return list_sg[nr_sg - 1];
}
int lastNumber() {
return list_nr[nr_nr - 1];
}
void addNumber(int n) {
list_nr[nr_nr] = n;
nr_nr++;
}
int popNumber() {
nr_nr--;
return list_nr[nr_nr];
}
char popSign() {
nr_sg--;
return list_sg[nr_sg];
}
int operation(int a, int b, char sg) {
if ( sg == '*' ) {
return a * b;
}
if ( sg == '/' )
return a / b;
if ( sg == '+' )
return a + b;
return a - b;
}
int main() {
FILE *fin, *fout;
int n, result, resultParanthesis;
fin = fopen("evaluare.in", "r");
fgets(s, MAXCH, fin);
n = strlen(s) - 1;
fclose(fin);
loc = 0;
nr_sg = 0;
nr_nr = 0;
addSign('+');
while ( loc <= n ) {
while ( s[loc] == '(' ) {
addSign(s[loc]);
addSign('+');
loc++;
}
printf(" ");
if (lastSign() == '*' || lastSign() == '/'){
addNumber(operation(popNumber(), factor(), popSign()));
} else if ( lastSign() == '+' || lastSign() == '-') {
addNumber(factor());
}
while ( lastSign() == ')' ) {
popSign();
resultParanthesis = 0;
while ( lastSign() != '(' ) {
resultParanthesis += operation(0, popNumber(), popSign());
}
popSign();
addNumber(resultParanthesis);
if ( lastSign() == '*' || lastSign() == '/' ) {
addNumber(operation(popNumber(), popNumber(), popSign()));
}
}
addSign(s[loc]);
loc++;
}
result = 0;
while ( nr_sg > 0 ) {
result += operation(0, popNumber(), popSign());
}
fout = fopen("evaluare.out", "w");
fprintf(fout, "%d", result);
fclose(fout);
return 0;
}