Cod sursa(job #1815889)

Utilizator 1475369147896537415369Andrei Udriste 1475369147896537415369 Data 25 noiembrie 2016 21:25:46
Problema Bool Scor 10
Compilator c Status done
Runda Arhiva de probleme Marime 3.41 kb
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<ctype.h>

replace(char firstString[], char secondString[], char thirdString[]);

char expression[1001], copyExp[1001];
int boolVar[26];

int main(){

FILE *file1, *file2;
int i=-1, j=0, k=0, nChanges;
char ch[2], val[2], letters[101];

file1 = fopen("bool.in", "r");
file2 = fopen("bool.out", "w");

while(1){
    expression[++i] = fgetc(file1);
        if(expression[i]=='\n'){
            expression[i] = '\0';
            break;
        }
}
fscanf(file1, "%d", &nChanges);
fscanf(file1, "%s", letters);

replace("TRUE", "1", expression);
replace("FALSE", "0", expression);
replace("AND", "&", expression);
replace("OR", "|", expression);
replace("NOT", "-", expression);
replace(" ", "", expression);

strcpy(copyExp, expression);

while(nChanges){

    strcpy(expression, copyExp);
    boolVar[letters[j++] - 'A'] = 1 - boolVar[letters[j] - 'A'];

        for(i=0; i<strlen(copyExp); i++){
            if(isalpha(copyExp[i])){
                ch[0] = copyExp[i]; ch[1] = '\0';
                val[0] = (boolVar[copyExp[i] - 'A'] + '0'); val[1] = '\0';
                replace(ch, val, expression);
            }
        }
        while(1){

            replace("-0", "1", expression);
            replace("-1", "0", expression);
//printf("%s\n", expression);
            replace("0&0", "0", expression);
            replace("0&1", "0", expression);
            replace("1&0", "0", expression);
            replace("1&1", "1", expression);
//printf("%s\n", expression);
            replace("0|0", "0", expression);
            replace("0|1", "1", expression);
            replace("1|0", "1", expression);
            replace("1|1", "1", expression);
//printf("%s\n", expression);
            replace("(1)", "1", expression);
            replace("(0)", "0", expression);
//printf("%s\n", expression);
            if(strlen(expression)==1)
                break;
        }
    fprintf(file2, "%c", expression[0]);
    nChanges--;
}

return 0;
}

replace(char firstString[], char secondString[], char thirdString[]){

char newString[1000];
int i, j, k, len1, len2, len3, result=-1;

len1 = strlen(firstString);
len2 = strlen(secondString);
len3 = strlen(thirdString);

for(i=0; i<=len3-len1; i++){
    if(thirdString[i]==firstString[0]){
        for(j=0; j<len1; j++){
            if(firstString[j]!=thirdString[i+j])
                break;
        }
        if(j==len1){
                result = i;
        }
    }
}
if(result!=-1){

    while(result!=-1){

            for(i=0; i<result; i++){
                newString[i] = thirdString[i];
            }
            for(j=0; j<len2; j++){
                newString[i++] = secondString[j];
            }
            for(k=result+len1; k<len3+abs(len2-len1); k++){
                newString[i++] = thirdString[k];
            }

        newString[i] = '\0';
        strcpy(thirdString, newString);
        result = -1;

            for(i=0; i<=len3-len1; i++){
                if(thirdString[i]==firstString[0]){
                    for(j=0; j<len1; j++){
                        if(firstString[j]!=thirdString[i+j])
                            break;
                    }
                    if(j==len1){
                        result = i;
                    }
                }
            }
    }
    strcpy(expression, thirdString);
}
}