Cod sursa(job #1643398)
Utilizator | Data | 9 martie 2016 18:43:04 | |
---|---|---|---|
Problema | Bool | Scor | 70 |
Compilator | c | Status | done |
Runda | Arhiva de probleme | Marime | 4.86 kb |
#include<stdio.h>
FILE *in, *out;
int poz, val[30];
char v[700];
int termen();
int factor();
int expresie()
{
int r;
printf("expre poz = %d\n", poz);
r = termen();
while(v[poz] == '|') {
poz++;
r = r | termen();
}
//poz++;
return r;
}
int termen()
{
int r;
printf("termen poz = %d\n", poz);
r = factor();
while(v[poz] == '&') {
poz++;
r = r & factor();
}
//poz++;
return r;
}
int factor()
{
int r;
printf("factor poz = %d\n", poz);
if(v[poz] == '!') {
poz++;
if(v[poz] == '(') {
//poz++;
r = expresie();
} else {
//if(v[poz] != 0 && v[poz] != 1)
r = val[v[poz] - 'A'];
}
r = (r + 1) % 2;
} else {
if(v[poz] == '(') {
//poz++;
r = expresie();
} else {
r = val[v[poz] - 'A'];
}
}
poz++;
poz++;
return r;
}
int main ()
{
char c;
int lung, i, ture;
in = fopen("bool.in", "r");
out = fopen("bool.out", "w");
poz = 0;
c = fgetc(in);
while(c != '\n') {
switch(c) {
case '(':
case ')':
v[poz] = c;
poz++;
break;
case 'A':
c = fgetc(in);
if(c != 'N') {
v[poz] = 'A';
poz++;
if(c == ')') {
v[poz] = c;
poz++;
}
} else {
v[poz] = '&';
poz++;
fgetc(in);
fgetc(in);
}
break;
case 'N':
c = fgetc(in);
if(c == 'O') {
fgetc(in);
v[poz] = '!';
poz++;
} else {
v[poz] = 'N';
poz++;
if(c == ')') {
v[poz] = c;
poz++;
}
}
break;
case 'O':
c = fgetc(in);
if(c == 'R') {
v[poz] = '|';
poz++;
fgetc(in);
} else {
v[poz] = 'O';
poz++;
if(c == ')') {
v[poz] = c;
poz++;
}
}
break;
case 'T':
c = fgetc(in);
if(c == 'R') {
v[poz] = 'A' + 27;
poz++;
fgetc(in);
fgetc(in);
} else {
v[poz] = 'T';
poz++;
if(c == ')') {
v[poz] = c;
poz++;
}
}
break;
case 'F':
c = fgetc(in);
if(c == 'A') {
v[poz] = 'A' + 26;
poz++;
fgetc(in);
fgetc(in);
fgetc(in);
} else {
v[poz] = 'F';
poz++;
if(c == ')') {
v[poz] = c;
poz++;
}
}
break;
case ' ':
break;
default:
v[poz] = c;
poz++;
break;
}
c = fgetc(in);
}
lung = poz;
//*
for(i = 0; i < lung; i++) {
printf("%c", v[i]);
}
printf("\n");
//*/
fscanf(in, "%d", &ture);
fgetc(in);
val[26] = 0;
val[27] = 1;
for(i = 0; i < ture; i++) {
c = fgetc(in);
val[c - 'A'] = (val[c - 'A'] + 1) % 2;
/*
for(poz = 0; poz < 26; poz++) {
printf("%d ", val[poz]);
}
*/
//printf("\n");
poz = 0;
fprintf(out, "%d", expresie());
}
fclose(in);
fclose(out);
return 0;
}