[离散数学]真值表法求主析、合取范式(Java实现)

离散数学这门课的实践作业,为什么要用Java给自己徒增难度呢?

题目实例如下:

主类:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        //第一部分:
        //处理输入的数据以及交互界面

        //输入变量个数的交互:
        System.out.print("请输入变量个数:");
        int varNum;//定义输入的变量
        Scanner scanner  = new Scanner(System.in);
        varNum = scanner.nextInt();
        int lineNum = (int)Math.pow(2,varNum);

        //将元素读入一个String
        System.out.println("请输入"+lineNum+"个元素数目<用T,F表示>:");
        Scanner scannerItem = new Scanner(System.in);
        String items = scannerItem.nextLine();

        //将刚读入的String转换成char数组,方便之后同二维表联动
        char[] itemChar =new char[lineNum] ;
        int counts =lineNum-1;
        for (int i = 0; i < items.length(); i++) {
            if (items.charAt(i)=='T'||items.charAt(i)=='F'){
                itemChar[counts] = items.charAt(i);
                counts-=1;
            }
        }

        //第二部分:
        //用另一个类处理逻辑部分

        //首先将用户的输入使用构造函数载入类中
        TheTurevalueTable theTurevalueTable = new TheTurevalueTable(varNum,itemChar);
        theTurevalueTable.FillTheLine();//初始化一个二维表类型为boolen
        theTurevalueTable.PrintTable();//打印整个真值表
        theTurevalueTable.PrintMinItem();//输出极小项
        theTurevalueTable.PrintMaxItem();//输出极大项
    }
}

逻辑处理类:

public class TheTurevalueTable {
    private int varNum;
    //求出真值表的行数
    private int lineNum;
    Boolean[][] line;
    char[] item;
    char[] varname = { 'P','Q','R','S','D','M','N','L','J','K' };
    public TheTurevalueTable(int varNum,char[] item){
        this.varNum = varNum;//将变量个数传递到类的里面
        this.lineNum= (int) Math.pow(2,varNum);
        //设置整体的数据结构,一张Bollen表
        this.line = new Boolean[lineNum][varNum];
        this.item = item;
    }
    public void FillTheLine(){
        int counts = lineNum;
        System.out.println("输出真值表:");
        for (int i = 0;i<lineNum;i+=1){
            int TrueOrFalse = i;
            for (int j=varNum-1;j>=0;j-=1){
                int TestTrueOrFalse = TrueOrFalse%2;
                if (TestTrueOrFalse==1){
                    line[i][j] = true;
                }else {
                    line[i][j] = false;
                }
                TrueOrFalse/=2;
            }
        }
    }
    public void PrintTable(){
        for (int i = 0; i < varNum; i++) {
            System.out.print(varname[i]+"     ");
        }
        System.out.println("A");
        for (int i = 0; i < varNum; i++) {
            System.out.print("------");
        }
        System.out.println("");
        int counts =0;
        for (int i = 0; i < lineNum; i++) {
            for (int j = 0; j < varNum; j++) {
                if (line[i][j]){
                    System.out.print("T     ");
                }else {
                    System.out.print("F     ");
                }
            }
            System.out.print(item[counts]);
            System.out.println("");
            counts++;
        }
    }

    public void PrintMinItem(){
        System.out.println("输出主析取范式:");
        for (int i = 0; i < lineNum; i+=1) {
            if (item[i]=='T'){
                if (i!=0) System.out.print("∨ ");
                System.out.print("<");
                for (int j = 0; j < varNum; j++) {
                    if (line[i][j]) {
                        System.out.print(" "+varname[j]);
                    } else {
                        System.out.print(" ┐" + varname[j]);
                    }
                    if (j != varNum - 1) {
                        System.out.print("∧");
                    }
                }
                System.out.print("> ");
                //if (i!=lineNum-1) System.out.print("∨ ");
            }
        }
        System.out.println("");
    }
    public void PrintMaxItem(){
        System.out.println("输出合取范式:");
        for (int i = 0; i < lineNum; i+=1) {
            if (item[i]=='F'){
                if (i!=0) System.out.print("∧ ");
                System.out.print("<");
                for (int j = 0; j < varNum; j++) {
                    if (line[i][j]) {
                        System.out.print(" ┐"+varname[j]);
                    } else {
                        System.out.print(" " + varname[j]);
                    }
                    if (j != varNum - 1) {
                        System.out.print("∨");
                    }
                }
                System.out.print("> ");
            }
        }
    }
}

 唯一的难点在于什么时侯输出负号,解决办法是放在上一句末尾输出符号,这样特判就有了条件

if (i!=0) System.out.print("∧ ");
if (i!=lineNum-1) System.out.print("∨ ");
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值