Ky programi:
Kodi PHP:
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#define BUCKET_SIZE 100
#define NOT_USED(c) (Characters[c] = -1)
#define PUT_VALUE(c,x) (Characters[c] = (x))
#define GET_VALUE(c) (Characters[c])
#define IS_NOT_USED(c) (Characters[c] == -1)
char *The_Formula;
int Characters[128];
calculate(operator,left_value,right_value)
{
switch (operator)
{
case '&' : return(left_value && right_value); break;
case '|' : return(left_value || right_value); break;
case '>' : return(!left_value || right_value); break;
case '=' : return(left_value == right_value); break;
}
}
int parse(char *s) /* consumes the WFPLF, leaves now at the unconsumed character */
{
register int current_char;
int left_value,right_value,operator;
static char *now;
if (s!=NULL) now = s; /* else now remains as it is => presumably it is a recursive call */
current_char = *now;
now++; /* immediatelly consume this char:may be further recursive parse() will occur*/
if (islower(current_char)) return GET_VALUE(current_char);
else
switch (current_char)
{
case '-' : return (!parse(NULL)); break;
case '(' : left_value = parse(NULL);
operator = *now++; /* consume the operator */
right_value = parse(NULL);
now++; /* consume the ')' */
return(calculate(operator,left_value,right_value)); break;
}
}
char *read_in_WFPLF(void)
{
int c;
char *formula=NULL;
char *position;
int counter=0;
long int mem_size_now=0;
while ((c=getchar())!=EOF)
{
if (!isspace(c))
{ if (!counter) { mem_size_now += BUCKET_SIZE; /* the following statement may change */
formula = (char *) realloc(formula,mem_size_now); /* content of formula*/
position = formula + (mem_size_now - BUCKET_SIZE);
counter = BUCKET_SIZE-1; }
*position = c;
position++;
counter--; }
}
*position = 0;
return formula;
}
int preprocess_WFPLF(char *s) /* finds the used letters in WFPLF stores them with 0, returns */
{ /* count of letters */
int i;
int letter_count=0;
for(i='a'; i<='z'; i++) NOT_USED(i);
for (; *s; s++) if (islower(*s) && IS_NOT_USED(*s))
{ PUT_VALUE(*s,0);
letter_count++; }
return letter_count;
}
void set_instance(long int n,int letter_count)
{
int i='z';
for (; letter_count; letter_count--, n >>=1) /* >> can be subst. by (/2) */
{ for(; IS_NOT_USED(i); i--); /* Find next used character */
PUT_VALUE(i,n&1); // printf("[%c:%d]",i,n&1);
i--; } /* we have used this character */
}
void print_heading()
{
int i;
for (i='a'; i<='z'; i++) if (!IS_NOT_USED(i)) printf("%c ",i);
printf("R\n");
}
void print_truth_value(int i)
{
printf("%c ", i ? 'T' : 'F');
}
void print_instance()
{
int i;
for (i='a'; i<='z'; i++) if (!IS_NOT_USED(i)) print_truth_value(GET_VALUE(i));
}
main(void)
{
int letter_count;
long int instance;
The_Formula = read_in_WFPLF();
letter_count = preprocess_WFPLF(The_Formula);
// For debug: printf("%s << contains %d vars\n",The_Formula,letter_count);
print_heading();
for (instance = (1<<letter_count)-1; instance >= 0; instance--) /* << can be subst. by (2*) */
{ set_instance(instance,letter_count);
// For debug: printf("%ld.",instance);
print_instance();
print_truth_value(parse(The_Formula));
printf("\n"); }
return(0);
}
Krijoni Kontakt