今天离散数学老师让我们尝试用编程来实现真值表,自己做了一个但是限制有点多,希望有大佬能指点一下。
Test类
import java.util.Scanner;public class Test {public static void main(String[] args) {System.out.println("规则: 1,每个步骤必须有括号 2,输入的字母必须从a开始(例a,b,c,d)");System.out.println("输入命题公式吧");Scanner input = new Scanner(System.in);String str = input.nextLine(); //获取字符串char[] arr = new char[20];int[] arr2 = new int[30];int count = 0; //计数器int j = 0;for (int i = 0; i < str.length(); i++) {char a = str.charAt(i);if (Character.isLetter(a)){arr[j] = a;j++;}}for (int i = 0; i < j; i++) {char w = arr[i];arr2[w-'a']+=1;}for (int i = 0; i < arr2.length; i++) {if(arr2[i]!=0){count++;arr2[i]=0;}}System.out.println(count);boolean[] Boolean = new boolean[count];TruthTable truthTable = new TruthTable();truthTable.setArr(str);truthTable.create(Boolean,0);}}
TruthTable
import java.util.ArrayDeque;
import java.util.Queue;
import java.util.Stack;public class TruthTable {public String getArr() {return str;}public void setArr(String arr) {this.str = arr;}private String str;public void create(boolean[] Boolean,int index){if(Boolean.length==index){display(Boolean);Judge(Boolean,str);//这里--------System.out.println();//未打印return;}Boolean[index] = false;create(Boolean,index+1);Boolean[index] = true;create(Boolean,index+1);}public void display(boolean[] Boolean){for (int i = 0; i < Boolean.length; i++) {if(Boolean[i] == true){System.out.print(1 + " ");}else {System.out.print(0 + " ");}}}Stack<Character> stack = new Stack<>();//括号Stack<Boolean> stack2 = new Stack<>();//010101//∨ ∧ ↔ → ¬//char az =public void Judge(boolean[] Boolean,String str){//((p→((¬p→q)∧r))∨q)stack.clear();stack2.clear();boolean w=false;boolean a=false;boolean b=false;int j = 0;for (int i = 0; i < str.length(); i++) {char c = str.charAt(i);if(c=='('){stack.push(c);}if(Character.isLetter(c)){if(c=='a'){stack2.push(Boolean[0]);}else if(c=='b'){stack2.push(Boolean[1]);} else if (c=='c') {stack2.push(Boolean[2]);} else if (c=='d') {stack2.push(Boolean[3]);}else if (c=='e') {stack2.push(Boolean[4]);} else if (c=='f') {stack2.push(Boolean[5]);}else if (c=='g') {stack2.push(Boolean[6]);}else if (c=='h') {stack2.push(Boolean[7]);}else if (c=='i') {stack2.push(Boolean[8]);} else if (c=='j') {stack2.push(Boolean[9]);}//_________________________________________________这块}if(c=='∨' || c=='∧' || c=='↔' || c=='→' || c=='¬'){stack.push(c);}if(c==')'){while (stack.peek()!='('){if (!stack2.isEmpty()){a = stack2.pop();//先出的在右边}if (!stack2.isEmpty()){b = stack2.pop();}if(stack.peek()=='∧'){if(a==true && b==true){System.out.print(" " + 1);w = true;} else{System.out.print(" " + 0);w = false;}stack2.push(w);stack.pop();}if (stack.peek()=='∨'){if(a==true || b==true){System.out.print(" " + 1);w = true;} else{System.out.print(" " + 0);w = false;}stack2.push(w);stack.pop();}if (stack.peek()=='↔'){if(a==b){System.out.print(" " + 1);w = true;} else{System.out.print(" " + 0);w= false;}stack2.push(w);stack.pop();}if(stack.peek()=='→'){if(b==false){System.out.print(" " + 1);w = true;}else if(b==true && a==true){System.out.print(" " + 1);w = true;}else if(b==true && a==false){System.out.print(" " + 0);w = false;}//System.out.print(b + " " + a);stack2.push(w);stack.pop();}if(stack.peek()=='¬'){stack2.push(b);boolean t = !a;System.out.print(" " + (t ? 1 : 0));stack2.push(t);stack.pop();}}stack.pop();}}}
}