求真值表及主范式

//求真值表
# include "stdio.h"
# include "ctype.h"
# include "string.h"
#include "conio.h"
# include "stdlib.h"
# include "math.h"
# define MAXSIZE 100
typedef char elemtype;
/*定义顺序栈*/
typedef struct{
elemtype data[MAXSIZE];
int top;
}sqstack;

/*创建一个空栈*/
void init_sqsqstack(sqstack*S){
S->top = -1;
}

/*判断是否为空栈*/
int empty_sqstack(sqstack*S){
if (S->top==-1)
return 1;
else
return 0;

}

/*进栈运算*/
void push_sqstack(sqstack*S,elemtype x){
if (S->top==MAXSIZE-1)
printf("栈满!!");
else
S->data[++(S->top)]=x;
}

/*出栈运算*/
void pop_sqstack(sqstack *S,elemtype *x){
if(S->top==-1)
printf("栈已经空!!");
else{
*x = S->data[S->top];
S->top--;
}
}

/*取栈顶元素*/
void top_sqstack(sqstack*S,elemtype*x){
if(S->top==-1)
printf("栈已经空!!");
else
*x = S->data[S->top];
}

/* 运算符优先级比较*/
int cmp(char op){
switch(op){
case '|' : return 2; break;// '|'代表析取
case '&' : return 3; break;// '&' 代表合取
case '^' : // '^'代表双条件
case '-' : return 1; break;// '-' 代表条件
case '~' : return 4; break;// '~' 代表非
case '(' :
case '#' :
default : return 0;
}
}

/*中缀表达式转变为后缀表达式*/
void transform(char pre[],char suffix[]){
sqstack S;
init_sqsqstack(&S);
push_sqstack(&S,'#');
int i=0,j=0;
char ch;
while(pre[i]){
ch=pre[i];
switch(ch){
case '(': push_sqstack(&S,pre[i]);i++;break;
case ')':
while(S.data[S.top]!='('){
pop_sqstack(&S,&ch);
suffix[j++] = ch;
}
pop_sqstack(&S,&ch);
i++;
break;
case '-':
case '^':
case '|':
case '&':
case '~': while(cmp(S.data[S.top])>=cmp(pre[i])){
pop_sqstack(&S,&ch);
suffix[j++]=ch;
}
push_sqstack(&S,pre[i]);i++;break;
default : suffix[j++]=pre[i];i++;


}
}
while (S.data[S.top]!='#'){
pop_sqstack(&S,&ch);
suffix[j++]=ch;
}
suffix[j]='\0';
}

/*后缀表达式的求值*/
char calculate(char suffix[]){
int i=0,m;
char x,x1,x2;
sqstack S;
init_sqsqstack(&S);
while (suffix[i]){
switch(suffix[i]){
case '|' :
pop_sqstack(&S,&x1);
pop_sqstack(&S,&x2);
m=(x1-'0')||(x2-'0');
x=m+'0';
push_sqstack(&S,x); /*将字符型转变为整数型计算完成后再把整型变成字符型并压入栈中*/
i++;break;
case '&' :
pop_sqstack(&S,&x1);
pop_sqstack(&S,&x2);
m=(x1-'0')&&(x2-'0');
x=m+'0';
push_sqstack(&S,x);
i++;break;
case '~' :
pop_sqstack(&S,&x1);
m=!(x1-'0');
x=m+'0';
push_sqstack(&S,x);
i++;break;
case '-' :
pop_sqstack(&S,&x1);
pop_sqstack(&S,&x2);
m=(x1-'0')||!(

x2-'0');
x=m+'0';
push_sqstack(&S,x);
i++;break;
case '^':
pop_sqstack(&S,&x1);
pop_sqstack(&S,&x2);
m=((x1-'0')||!(x2-'0'))&&(!(x1-'0')||(x2-'0'));
x=m+'0';
push_sqstack(&S,x);
i++;break;
default : push_sqstack(&S,suffix[i]);i++;
}
}
if(!empty_sqstack(&S)){ /*栈中只有一个数据*/
pop_sqstack(&S,&x);
if(empty_sqstack(&S))
return x;
else /*栈中有多个数据,出错 */
return 'w';
}
else /* 栈空,出错 */
{//printf("stack is empty !");
return 'e';}

}

int fac(int t) //计算出2的n次方的结果
{
if(t==0)return 1;
if(t==1)return 2;
return 2*fac(t-1);
}
/* 求变量的个数 */
int c_change(char s[]){
int i=0,j=0;
while(s[i]!='\0'){
switch(s[i]){
case '|' :
case '~' :
case '-' :
case '^' :
case '&' : i++; break;
default : j++; i++;
}
}
return j;
}

void S_numf(int n,char s[])//开辟一个二维数组存储真值表的各种赋值情况
{
int row,col,i,j,c,d,k,p,l,t,w=0;
/* 定义一个整形数组存放变量的值(0、1)*/
row=fac(n);
col=n;
l=n+1;
char** S_num=(char **)malloc(sizeof(char*)*row);
for(i=0;i{
S_num[i]=(char *)malloc(sizeof(char)*l);
}
/* 用malloc建立一个动态二维数组 */
for(i=0;ifor(j=0;j<=col;j++)
S_num[i][j]='0';
for(i=0;ifor(k=0,j=fac(i);k{for(p=col-1;p>col-1-i;p--)
S_num[j][p]=S_num[k][p];
S_num[j][p]='1';
}
/* 字符表达式切换为数字表达式 */
char** g=(char **)malloc(sizeof(char*)*row);
char m[20];
char** z=(char **)malloc(sizeof(char*)*row);
for(i=0;i{
z[i]=(char *)malloc(sizeof(char)*l);
}

for(i=0;i{j=0;
w=0;
t=0;
while (s[w]!='\0'){
switch(s[w]){
case '|' :
case '~' :
case '-' :
case '^' :
case '&' : z[i][t]=s[w];t++;w++;break;
default : z[i][t]=S_num[i][j];t++;w++;j++;
}
}
z[i][t]='\0';
}
/*计算表达式的值并放入打印的数组中*/

for(i=0;i{ g[i]=z[i];
transform(g[i],m);
if(calculate(m)=='w')
{printf("\n表达式错误!\n");return;}
if(calculate(m)=='e')
{printf("\n栈已空!\n"); return;}
else
S_num[i][col]=calculate(m);
}
/*求出只含变量的数组 */
int b,a=0,e=0;
b=c_change(s);
char *v= (char *)malloc(sizeof(char *)*b);
while(s[e]!='\0'){
switch(s[e]){
case '|' :
case '~' :
case '-':
case '^' :
case '&' : e++; break;
default : v[a]=s[e];e++;a++;
}
}
/*打印真值表*/
puts("真值表如下:\n");
for(i=0;iprintf("%5c",v

[i]);
printf(" %s",s);

for(i=0;i{printf("\n");
for(j=0;j<=col;j++)
printf("%5c",S_num[i][j]);}
printf("\n");
/* 求主析取范式 */
for(i=0;i{if(S_num[i][col]=='1') c=i;} /*统计为1个数*/
printf("主析取范式为:\n");
for(i=0;i{if(S_num[i][col]=='1'){
for(j=0;jif(S_num[i][j]=='0')
printf("~%c",v[j]);
else
printf("%c",v[j]);
}
if(i!=c)
printf("+");
}
}
printf("\n");
/* 求主合取范式 */
for(i=0;i{if(S_num[i][col]=='0') d=i;} /*统计为0的个数*/
printf("主合取范式为:\n");
for(i=0;i{if(S_num[i][col]=='0'){
printf("(");
for(j=0;jif(S_num[i][j]=='0')
{ if((j{printf("+");}
printf("~%c",v[j]);}
else
{if((j{printf("+");}
printf("%c",v[j]);
}
}
printf(")");
if(i!=d)
printf("*");
}
}
printf("\n");


}
void main(){
char s1[20];
int n;
puts(" *******************************************\n");
puts(" **** 求任意表达式真值表程序 ****\n");
puts(" **** 输出其主析取、合取范式 ****\n");
puts(" *******************************************\n");
puts("用'~'代表非,'|'代表析取,'&'代表合取,'-'代表条件,'^'代表双条件\n");
puts("请输入表达式:\n");
gets(s1);
puts("\n");
printf("您输入的表达式是:%s\n",s1);
n=c_change(s1);
S_numf(n,s1);
getch();
}


相关文档
最新文档