Cod sursa(job #2790468)

Utilizator LucaMihaiLM10Luca Ilie LucaMihaiLM10 Data 29 octombrie 2021 00:59:43
Problema Bool Scor 100
Compilator c-64 Status done
Runda Arhiva de probleme Marime 1.98 kb
#include <stdio.h>
#include <ctype.h>

#define MAX_LEN 1000
#define ALFA 26

int len, i;
char v[MAX_LEN];
int val[ALFA];

int expresie();

int factor() {
    i++;
    if ( v[i - 1] == '(' )
        return expresie();
    if ( v[i - 1] == '!' )
        return !factor();
    if ( isdigit( v[i - 1] ) )
        return v[i - 1] - '0';
    return val[v[i - 1] - 'A'];
}

int termen() {
    int rez;

    rez = 1;
    while ( i < len && v[i] != ')' && v[i] != '|' ) {
        rez = rez & factor();
        if ( v[i] == '&' )
            i++;
    }
    if ( i < len && v[i] != ')' )
        i++;

    return rez;
}

int expresie() {
    int rez;

    rez = 0;
    while ( i < len && v[i] != ')' )
        rez = rez | termen();
    i++;

    return rez;
}

int main() {
    FILE *fin, *fout;
    char prev, crt;
    int n;

    fin = fopen( "bool.in", "r" );
    fout = fopen( "bool.out", "w" );

    len = 0;
    prev = 0;
    crt = fgetc( fin );
    while ( crt != '\n' ) {
        if ( prev == 'O' && crt == 'T' ) { // NOT
            len--;
            v[len - 1] = '!';
        } else if ( prev == 'N' && crt == 'D' ) { // AND
            len--;
            v[len - 1] = '&';
        } else if ( prev == 'O' && crt == 'R' )  // OR
            v[len - 1] = '|';
        else if ( prev == 'U'  && crt == 'E' ) { // TRUE
            len -= 2;
            v[len - 1] = '1';
        } else if ( prev == 'S'  && crt == 'E' ) { // FALSE
            len -= 2;
            v[len - 1] = '0';
        } else if ( crt != ' ' ) {
            v[len] = crt;
            len++;
        }
        prev = crt;
        crt = fgetc( fin );
    }

    for ( i = 0; i < ALFA; i++ )
        val[i] = 0;
    fscanf( fin, "%d", &n );
    fgetc( fin );
    while ( n-- ) {
        crt = fgetc( fin ) - 'A';
        val[crt] = !val[crt];
        i = 0;
        fprintf( fout, "%d", expresie() );
    }

    fclose( fin );
    fclose( fout );

    return 0;
}