Pagini recente » Cod sursa (job #1050851) | Cod sursa (job #1658935) | Cod sursa (job #2360533) | Cod sursa (job #2529953) | Cod sursa (job #2790423)
#include <stdio.h> ///Va prezint: FrankenBool!
#include <stdlib.h> /// Programul era la inceput destul de elegant, dar apoi l am tot peticit, asa ca acum...
#define AZ 26 ///Este o opera de arta presupun
#define LSIRMAX 1001 ///O sa fiu foarte mandru daca functioneaza
#define SPACESOR 2
char s[LSIRMAX], v[AZ];
int si,sl;
int or();
int factor(){
if(s[si] == ' ')
si++;
int auxi = si;
while(s[si] >= 'A' && s[si] <= 'Z')
si ++;
if(si - auxi == 1)
return v[s[auxi] - 'A'];
else{ ///Nu este variabila
if(s[auxi] == 'T') /// TRUE este 1
return 1;
else if(s[auxi] == 'F') /// FALSE este 0
return 0;
else if(s[auxi] == 'N') /// NOT este -1
return -1;
else if(s[auxi] == 'A') /// AND este -2
return -2;
else if(s[auxi] == 'O') /// OR este -3
return -3;
else
return -4; /// Am dat de o paranteza inchisa )
}
}
int not(){
int r=0,nr = 0;
if(s[si] == ' ')
si++;
if(s[si] == '('){
si ++;
r = or();
si ++;
} else
while((r = factor()) == -1)
nr++;
if(nr%2 == 1)
return 1-r;
return r;
}
int and(){
int r,t,semn = 0;
r = not();
semn = factor();
while (semn == -2){
t = not();
if(t != 1)
r = 0;
semn = factor();
}
if(semn == -3) ///Aici l am peticit pe cazul in care ne vine OR in loc de AND. Frumos? Nu. Functional? Sa speram!
si -= SPACESOR;
return r;
}
int or(){
int r,t;
r = and();
while (factor() == -3){
t = and();
if(t == 1)
r = 1;
}
return r;
}
int main(){
int n,i;
char c;
FILE *fin, *fout;
fin = fopen("bool.in","r");
si = 0;
s[0] = fgetc(fin);
while(s[si]!='\n'){
si ++;
s[si] = fgetc(fin);
}
sl = si;
si = 0;
fscanf(fin,"%d",&n);
fout = fopen("bool.out","w");
fgetc(fin);
for(i=0;i<n;i++){
c = fgetc(fin);
v[c-'A'] = 1- v[c - 'A'];
fprintf(fout,"%d",or());
si = 0;
}
fprintf(fout,"\n");
fclose(fout);
fclose(fin);
return 0;
}