Pagini recente » Cod sursa (job #1740807) | Cod sursa (job #2510696) | Cod sursa (job #471955) | Cod sursa (job #2547448) | Cod sursa (job #594929)
Cod sursa(job #594929)
#include <stdio.h>
#include <string.h>
#define file_input "bool.in"
#define file_output "bool.out"
#define MAX_LINE_LENGTH 1002
#define VAR_LEN 'Z'-'A'+1
int N, V[VAR_LEN];
char *p;
enum teokens {OR=2,AND=3,NOT=4,OPEN_B=5,CLOSED_B=6,TRUE=7,FALSE=8};
int eval_expr();
int get_next_token () {
while ( *p == ' ' ) p++;
if (*p == 0) return -1;
//printf("[%c]\n", *p);
if(*p>='A' && *p<='Z' && ( *(p+1) < 'A' || *(p+1) > 'Z' ) ) {
p++;
//printf("value:%c - %d\n", *(p-1) , V[*(p-1) - 'A']);
return V[*(p-1) - 'A'];
}
switch(*p) {
case 'O' :
p+=strlen("OR");
return OR;
case 'A' :
p+=strlen("AND");
return AND;
case 'N' :
p+=strlen("NOT");
return NOT;
case '(' :
p+=strlen("(");
return OPEN_B;
case ')' :
p+=strlen(")");
return CLOSED_B;
case 'T' :
p+=strlen("TRUE");
return TRUE;
case 'F' :
p+=strlen("FALSE");
return FALSE;
}
return -1;
}
int eval_fact () {
//printf("%s\n", p);
int token = get_next_token();
//printf("eval_fact tok:%d\n", token);
if (token == OPEN_B) return eval_expr();
if (token == NOT) return ~eval_fact();
if (token == TRUE) return 1;
if (token == FALSE) return 0;
if (token <= 1) return token;
return -1;
}
int eval_term (int *token) {
int res = 1;
while (1) {
res &= eval_fact();
//printf("%d\n", res);
*token = get_next_token();
if (*token != AND) break;
}
//printf("%d\n", res);
return res;
}
int eval_expr () {
//printf("ONE\n");
int res = 0;
int token;
while (1) {
res |= eval_term(&token);
// printf("GIGI:%d\n", token);
if (token != OR) break;
}
return res;
}
int main ( void ) {
FILE* fin = fopen(file_input,"r");
FILE* fout = fopen(file_output,"w");
char expr[MAX_LINE_LENGTH], vars[MAX_LINE_LENGTH];
fgets(expr,MAX_LINE_LENGTH-1,fin);
expr[strlen(expr)-1] = 0;
fscanf(fin,"%d", &N);
int i;
char c;
//printf("[%s]\n", vars);
for(i=0;i<N;++i) {
while ( c = fgetc(fin) )
if ( 'A' <=c && c<='Z') break;
int idx = c - 'A';
V[idx] = ~V[idx];
p = expr;
fprintf(fout,"%d",eval_expr ());
}
fprintf(fout,"\n");
fclose(fin);
fclose(fout);
return 0;
}