Cod sursa(job #2788394)

Utilizator iraresmihaiiordache rares mihai iraresmihai Data 25 octombrie 2021 17:16:24
Problema Evaluarea unei expresii Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 2.39 kb
///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;
}