- /*
- Evaluates a parenthesized boolean function of at most 9 variables.
- */
- #include <stdio.h>
- #include <ctype.h>
- #include <stdarg.h>
- #define ANDSYMBOL (char)'*'
- #define ORSYMBOL (char)'+'
- #define XORSYMBOL (char)'@'
- #define NOTSYMBOL (char)'~'
- #define Error -999
- #define MAXVARIABLE 9
- int level1(char *,int *,int *),
- level2(char *,int *,int *),
- level3(char *,int *,int *),
- level4(char *,int *,int *);
- main()
- {
- int cnt1,cnt2,cnt3,cnt4,cnt5,cnt6,cnt7,cnt8,cnt9,cnt10;
- for(cnt1=0;cnt1<2;cnt1++)
- for(cnt2=0;cnt2<2;cnt2++)
- for(cnt3=0;cnt3<2;cnt3++) {
- cnt4=cnt1;
- cnt5=cnt2;
- cnt6=cnt3;
- printf("x=(%d,%d,%d) ",cnt4,cnt5,cnt6);
- for(cnt7=0;cnt7<4;cnt7++) {
- printf("F(X)=%d%d%d ",
- cnt8=evaluate("1+(2*(~3)))",3,cnt4,cnt5,cnt6),
- cnt9=evaluate("1*(~3)",3,cnt4,cnt5,cnt6),
- cnt10=evaluate("2",3,cnt4,cnt5,cnt6));
- cnt4=cnt8;
- cnt5=cnt9;
- cnt6=cnt10;
- }
- puts("");
- }
- }
- /* evaluate returns the answer to the given boolean function of
- complexity n, that is there are n variables. The function uses
- variable argument lists, so n must be included.
- Example :
- evaluate("1+(2*(~3))",3,1,1,0) returns 1+(1*(~0)) = 1 */
- int evaluate(function,n)
- char *function;
- int n;
- {
- int *x,cnt,answer;
- va_list argptr;
- /* Initialize argptr */
- va_start(argptr,n);
- if(n>0&&n<10) {
- /* Allocate space for x. */
- x=(int *)malloc(n*sizeof(int));
- for(cnt=0;cnt<n;cnt++)
- x[cnt]=va_arg(argptr,int);
- cnt=0;
- answer=level1(function,&cnt,x);
- free(x);
- }
- else
- answer=-1;
- /* Close down variable arguments */
- va_end(argptr);
- return answer;
- }
- int level1(str,strpos,x)
- char str[];
- int *strpos,*x;
- {
- int num1,num2;
- if((num1=level2(str,strpos,x))<0)
- return -1;
- if(str[*strpos]==ANDSYMBOL) {
- (*strpos)++;
- if((num2=level2(str,strpos,x))<0)
- return -1;
- num1=(num1&&num2);
- }
- return num1;
- }
- int level2(str,strpos,x)
- char str[];
- int *strpos,*x;
- {
- int num1,num2;
- if((num1=level3(str,strpos,x))<0)
- return -1;
- if(str[*strpos]==XORSYMBOL) {
- (*strpos)++;
- if((num2=level3(str,strpos,x))<0)
- return -1;
- num1=!(num1==num2);
- }
- return num1;
- }
- int level3(str,strpos,x)
- char str[];
- int *strpos,*x;
- {
- int num1,num2;
- if((num1=level4(str,strpos,x))<0)
- return -1;
- if(str[*strpos]==ORSYMBOL) {
- (*strpos)++;
- if((num2=level4(str,strpos,x))<0)
- return -1;
- num1=(num1||num2);
- }
- return num1;
- }
- int level4(str,strpos,x)
- char str[];
- int *strpos,*x;
- {
- int num1;
- switch(str[*strpos]) {
- case NOTSYMBOL :
- (*strpos)++;
- if((num1=!level4(str,strpos,x))<0)
- return -1;
- break;
- case '(' :
- (*strpos)++;
- if((num1=level1(str,strpos,x))<0)
- return -1;
- if(str[*strpos]!=')')
- return -1;
- (*strpos)++;
- break;
- default :
- if(isdigit(str[*strpos]))
- if((int)(str[*strpos]-'0')>0) {
- num1=x[(int)(str[*strpos]-'0')-1];
- (*strpos)++;
- }
- break;
- }
- return num1;
- }