离散数学编程实现真值表赋值

代码:

#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;
}

样例
在这里插入图片描述
运行结果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_45937795/article/details/106802818