【离散数学】Java语言实现利用真值表法求主析取范式和主合取范式

C++版本的看这个链接:

【离散数学】C++语言实现利用真值表法求主析取范式和主合取范式_zhtstar的博客-CSDN博客https://blog.csdn.net/weixin_56319483/article/details/128489182?spm=1001.2014.3001.5501

Python版本的看这个链接:

【离散数学】Python语言实现利用真值表法求主析取范式和主合取范式https://blog.csdn.net/weixin_56319483/article/details/128488744?spm=1001.2014.3001.5501

实验内容:

针对给定的包含任意个变量的真值表,编程实现用真值表法求取其所对应的主析取范式和主合取范式。

实验要求:

能够掌握通过真值表求取相应主析取和主合取范式的方法及原理。

先复习一下基本概念:或者直接跳到下面看源代码

1.主合取范式:若干个极大项的合取(交集)。例如:

2.主析取范式:若干个极小项的析取(并集)。例如:

3.极大项:就是包含全部数目的命题变元的析取表达式。例如:p∨¬q∨r

4.极小项:包含全部数目的命题变元的合取表达式。例如:¬p∧¬q∧r

Java实现 源代码如下:
 

package P3;
import java.util.Scanner;
public class 离散数学01 {
    public static void main(String[] args) {
        int length = 150;
        char[] arr = new char[length];
        int[][] brr = new int[length][14];
        int beg=80, sta1=0, sta2=0;
        int num = 0;
        System.out.print("输入变量的个数:");
        Scanner sc = new Scanner(System.in);
        num = sc.nextInt();
        int sum = (int)Math.pow(2,num);
        System.out.print("请输入"+sum+"个字符(用T或F表示):");
        for (int i = 1; i <= sum; i++)
        {
            arr[i] = sc.next().charAt(0);
            if (arr[i] == 'T')
                sta1++;
            else
                sta2++;
        }

        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++;
        }
        int h = 0;
        for(int i[]:brr){
            for(int j:i){
                h++;
                System.out.print(j+" ");
                if(h%14==0)
                    System.out.println();
            }
        }
        System.out.println("输出公式对应的真值表 :");
        for (int i = 1; i <= num; i++)
        {
            System.out.print((char)(beg++)+"      ");
        }
        System.out.println('A');

        System.out.println("----------------------");
        beg = 80;
        for (int i = 1; i <= sum; i++)
        {
            for (int j = num; j >= 1; j--)
            {
                if (brr[i][j] == 1)
                    System.out.print('T' + "      ");
                else
                    System.out.print('F' + "      ");
            }
            System.out.print(arr[i]);
            System.out.println();
        }
        System.out.println();

        int k=0;

        System.out.println("输出主析取范式:");
        for (int i = 1; i <= sum; i++)
        {
            if (arr[i] == 'T')
            {
                k++;
                System.out.print('(');
                for (int j = num; j >= 1; j--)
                {
                    if (brr[i][j] == 1)
                    {
                        System.out.print((char)(beg++));
                    }
                    else
                    {
                        System.out.print("¬" + (char)(beg++));
                    }
                    if (j != 1)
                        System.out.print("∧");
                }
                System.out.print(')');
                if (k < sta1)
                    System.out.print("∨");
            }
            beg = 80;
        }
        System.out.println();

        k=0;

        System.out.println("输出主合取范式:");
        for (int i = 1; i <= sum; i++)
        {
            if (arr[i] == 'F')
            {
                k++;
                System.out.print('(');
                for (int j = num; j >= 1; j--)
                {
                    if (brr[i][j] == 0)
                    {
                        System.out.print((char) (beg++));
                    }
                    else
                    {
                        System.out.print("¬" + (char)(beg++));
                    }
                    if (j != 1)
                        System.out.print("∨");
                }
                System.out.print(')');
                if (k < sta2)
                    System.out.print("∧");
            }
            beg = 80;
        }

        System.out.println();

    }
}

运行结果截图:

分析与总结:

本次的实验任务已完成,在本次实验中主要使用变量length定义数组长度,使用一维数组arr用来存放2^n次方个字符,其中n表示变量个数;使用二维数组brr用来存放真值表,使用变量beg并赋初值80,此为P的ASCII码,用来记录PQR。使用sta1, sta2 分别记录输入的‘T’与‘F’的个数。

在读取到输入的字符个数后提示用户输入相应数量的字符,获取字符后存入数组中,并分别记录‘T’和‘F’的个数。之后在二维数组中处理真值表,先给真值表赋初值0或1,在输出真值表时判断相应位置上的字符,如果是1,输出‘T’;否则输出‘F’。并在对应位置上输出获取到了字符。

在输出析取范式时,对arr数组各位进行遍历,如果为‘T’,则输出主析取范式;如果为‘F’,则输出主合取范式。此时要结合brr数组对应位置的数值,确定输出的合取或析取符号,以及否定符号。

  • 2
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值