Cod sursa(job #2137220)

Utilizator rares1012Rares Cautis rares1012 Data 20 februarie 2018 17:50:55
Problema Bool Scor 50
Compilator c Status done
Runda Arhiva de probleme Marime 2.84 kb
#include <stdio.h>
#include <stdlib.h>

char cuv[6];
char v[1000];
char val[26];
int k;

char v1[4]= {'T','R','U','E'};
char v2[5]= {'F','A','L','S','E'};
char v3[3]= {'N','O','T'};
char v4[3]= {'A','N','D'};
char v5[2]= {'O','R'};

int expresie();
int factor();

int expresie()
{
    int sum=factor();
    while(v[k]=='&' || v[k]=='|')
    {
        if(v[k]=='&')
        {
            k++;
            sum=sum&factor();
        }
        else
        {
            k++;
            sum=sum|factor();
        }
    }
    return sum;
}
int factor()
{
    int vl,semn=1;
    while(v[k]=='!')
    {
        semn*=-1;
        k++;
    }
    if(v[k]=='(')
    {
        k++;
        vl=expresie();
        k++;
        if(semn==1)return vl;
        else return !vl;
    }
    if(v[k]=='t')
    {
        k++;
        if(semn==1)return 1;
        return 0;
    }
    else if(v[k]=='f')
    {
        k++;
        if(semn==1)
            return 0;
        return 1;
    }
    if(v[k]>='A' && v[k]<='Z')
    {
        vl=val[v[k]-'A'];
        k++;
        if(semn==1)return vl;
        return !vl;
    }
}
int vcuv()
{
    int i,x=1;
    for(i=0; i<4; i++)
    {
        if(cuv[i]!=v1[i])x=0;
    }
    if(x==1)return 1;
    x=1;
    for(i=0; i<5; i++)
    {
        if(cuv[i]!=v2[i])x=0;
    }
    if(x==1)return 2;
    x=1;
    for(i=0; i<3; i++)
    {
        if(cuv[i]!=v3[i])x=0;
    }
    if(x==1)return 3;
    x=1;
    for(i=0; i<3; i++)
    {
        if(cuv[i]!=v4[i])x=0;
    }
    if(x==1)return 4;
    x=1;
    for(i=0; i<2; i++)
    {
        if(cuv[i]!=v5[i])x=0;
    }
    if(x==1)return 5;
    return 0;
}

int main()
{
    int len=0,q=0,r,n,i;
    char c;
    FILE*fi,*fo;
    fi=fopen("bool.in","r");
    fo=fopen("bool.out","w");
    c=fgetc(fi);
    while(c!='\n' && c!=EOF)
    {
        while(c>='A' && c<='Z')
        {
            cuv[len]=c;
            len++;
            c=fgetc(fi);
        }
        if(len!=0)
        {
            r=vcuv();
            if(r==1)
            {
                v[q]='t';
                q++;
            }
            else if(r==2)
            {
                v[q]='f';
                q++;
            }
            else if(r==3)
            {
                v[q]='!';
                q++;
            }
            else if(r==4)
            {
                v[q]='&';
                q++;
            }
            else if(r==5)
            {
                v[q]='|';
                q++;
            }
            else
            {
                v[q]=cuv[0];
                q++;
            }
        }
        if(c!=' ')
        {
            v[q]=c;
            q++;
        }
        len=0;
        c=fgetc(fi);
    }
    fscanf(fi,"%d",&n);
    fgetc(fi);
    for(i=0;i<n;i++){
        c=fgetc(fi);
        val[c-'A']=!val[c-'A'];
        k=0;
        fprintf(fo,"%d",expresie());
    }
    fclose(fi);
    fclose(fo);
    return 0;
}