代码:
#include<stdio.h>
#include<math.h>
#define LEN 666 //定义数组长度
int arr[LEN]; //用来存放2^n次方个字符,n表示变量个数
int brr[LEN][4+10]; //brr用来存放真值表
int beg = 80; //字符P对应的ASCII码
int sta1 = 0, sta2 = 0; //sta1表示真值为1的个数,sta2表示真值为0的个数
int main()
{
int num; //变量个数
printf("请输入变量个数 : ");
scanf("%d",&num);
int sum = pow(2, num); //2^n
printf("请输入 %d 个真值(以(p->q)->r为例) : ",sum); //输入(p->q)->r的真值,例子可自由更改
for(int i = 1; i <= sum; i++)
{
scanf("%d",&arr[i]);
if(arr[i] == 1)
sta1++; //sta1表示真值为T的个数
else
sta2++; //sta2表示真值为F的个数
}
printf("\n");
//处理真值表
int cnt1 = 0, cnt2 = 1;
for(int i = sum-1; i >= 0; i--) //二进制实现真值表的赋值
{
cnt1 = 0;
int val=i;
while(cnt1 < num)
{
cnt1++;
brr[cnt2][cnt1] = val%2;
val = val/2;
}
cnt2++;
}
printf("输出公式对应的真值表 :\n");
for(int i = 1; i <= num ;i++)
{
printf("%c\t",beg++);
}
printf("(p->q)->r\n");
beg = 80;
for(int i = 1; i <= sum; i++)
{
for(int j = num; j >= 1; j--)
{
printf("%d\t",brr[i][j]);
}
printf("%d\n",arr[i]);
}
printf("\n");
int k = 0;
printf("输出主析取范式:\n");
for(int i = 1; i <= sum; i++)
{
if(arr[i] == 1)
{
k++;
printf(" ( ");
for(int j = num; j >= 1; j--)
{
if(brr[i][j] == 1)
printf("%c",beg++);
else
printf("┓ %c",beg++);
if(j != 1)
printf(" ∧ ");
}
printf(" ) ");
if(k < sta1)
printf(" ∨ ");
}
beg = 80;
}
printf("\n\n");
k=0;
printf("输出主合取范式:\n");
for(int i = 1; i <= sum; i++)
{
if(arr[i] == 0)
{
k++;
printf(" ( ");
for(int j = num; j >= 1; j--)
{
if(brr[i][j] == 0)
{
printf("%c",beg++);
}
else
{
printf("┓ %c",beg++);
}
if(j != 1)
printf(" ∨ ");
}
printf(" ) ");
if(k < sta2)
printf(" ∧ ");
}
beg = 80;
}
printf("\n\n");
return 0;
}
样例
运行结果: