日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

NJUPT南邮 | 离散数学_实验一

發布時間:2023/12/20 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 NJUPT南邮 | 离散数学_实验一 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

利用真值表法求取主析取范式以及主合取范式

  • 內容:
    編程實現用真值表法求取含n個變元的合式公式所對應的主析取范式和主合取范式。
    要求:
    能夠列出合式公式的真值表并給出相應主析取和主合取范式。

  • 實驗代碼:

  • import jdk.swing.interop.SwingInterOpUtils;import java.util.*; import java.util.regex.Pattern;public class Truetable {private static HashMap<Character,Boolean> map = new HashMap<>();//用鍵值對存放命題的真假private static List<Character> Alpha = new ArrayList<>();//命題字符的列表private static int alphaSize = 0;private static String infixSentence; //中綴表達式private static char[] suffixSentence = new char[100];//后綴表達式private static Boolean res;private static List<Boolean[]> trueList = new ArrayList<>(); //真值序列private static List<Boolean[]> falseList = new ArrayList<>();//假值序列public static void main(String[] args) {init();Scanner scanner = new Scanner(System.in);String inputAlpha;System.out.println("請輸入命題個數");alphaSize = scanner.nextInt();System.out.println("請輸入合式公式(英文輸入):析取:“|” 合取:“&” 非:“!” 單條件運算符:“->” 雙條件運算:“<>”");do {scanner.nextLine();inputAlpha = scanner.nextLine();scanner.close();} while (!Pattern.matches("^[A-Za-z-><!|&()]+$", inputAlpha));//判斷是是否符合輸入要求StringBuilder sb = new StringBuilder(inputAlpha);infixSentence = standardExpression(inputAlpha);infixToSuffix(infixSentence);//調用中綴轉換為后綴函數for (int i = 0; i < Alpha.size(); i++) {System.out.print(Alpha.get(i) + "\t");}System.out.println(inputAlpha);printTrueTable(0);//調用打印真值表函數printAns();//打印結果}private static void printAns() {disjunctiveForm();//主析取范式conjunctiveForm();//主合取范式}private static void conjunctiveForm() {int i = 0, j = 0;int k;String ans = "";for (Boolean[] falsearray : falseList) {StringBuilder stringBuilder = new StringBuilder(ans);stringBuilder.append("(");for (i = 0; i < Alpha.size(); i++) {if (i == Alpha.size() - 1) {if (falsearray[i]) {stringBuilder.append("?").append(Alpha.get(i));} else {stringBuilder.append(Alpha.get(i));}} else {if (falsearray[i]) {stringBuilder.append("?").append(Alpha.get(i)).append("∨");} else {stringBuilder.append(Alpha.get(i)).append("∨");}}}stringBuilder.append(")").append("∧");ans = stringBuilder.toString();}try {ans = ans.substring(0, ans.length() - 1);System.out.print("主合取范式為: ");System.out.println(ans);}catch (StringIndexOutOfBoundsException e){System.out.println("永真式 T");}}private static void disjunctiveForm() {int i = 0, j = 0;int k;String ans = "";for (Boolean[] truearray : trueList) {StringBuilder stringBuilder = new StringBuilder(ans);stringBuilder.append("(");for (i = 0; i < Alpha.size(); i++) {if (i == Alpha.size() - 1) {if (truearray[i]) {stringBuilder.append(Alpha.get(i));} else {stringBuilder.append("?").append(Alpha.get(i));}} else {if (truearray[i]) {stringBuilder.append(Alpha.get(i)).append("∧");} else {stringBuilder.append("?").append(Alpha.get(i)).append("∧");}}}stringBuilder.append(")").append("∨");ans = stringBuilder.toString();}try {ans = ans.substring(0, ans.length() - 1);System.out.print("主析取范式為: ");System.out.println(ans);}catch (StringIndexOutOfBoundsException e){System.out.println("永假式 F");}}//打印真值表private static void printTrueTable(int cur) {Boolean[] bs = new Boolean[alphaSize];if (cur == Alpha.size()) {checkCal(); //語句的真假值for (Character character : Alpha) {if (map.get(character)) {System.out.print("T" + "\t");} else {System.out.print("F" + "\t");}}if (res) {//用來求主析取范式System.out.println("T");for (int i = 0; i < Alpha.size(); i++) {bs[i] = map.get(Alpha.get(i));}trueList.add(bs);} else {//用來求主合取范式System.out.println("F");for (int i = 0; i < Alpha.size(); i++) {bs[i] = map.get(Alpha.get(i));}falseList.add(bs);}return;}/* 遞歸打印真值表*/map.put(Alpha.get(cur), true);printTrueTable(cur + 1);map.put(Alpha.get(cur), false);printTrueTable(cur + 1);}//利用堆棧來計算表達式的真假值private static void checkCal() {Stack<Boolean> s = new Stack<>();char ch;int j = 0;Boolean b1, b2;ch = suffixSentence[j];while (!(ch == '#') && (ch != 0)) {ch = suffixSentence[j++];if (Character.isAlphabetic(ch)) {s.push(map.get(ch));} else {if (ch == '!') { //取反運算b1 = s.lastElement();s.pop();s.push(!b1);} else if (ch == '&') { //合取運算b1 = s.lastElement();s.pop();b2 = s.lastElement();s.pop();s.push(b1 && b2); //析取運算} else if (ch == '|') {b1 = s.lastElement();s.pop();b2 = s.lastElement();s.pop();s.push(b1 || b2);} else if (ch == '>') { //單條件運算b2 = s.lastElement();s.pop();b1 = s.lastElement();s.pop();s.push(!b1 || b2);} else if (ch == '<') { //雙條件運算b1 = s.lastElement();s.pop();b2 = s.lastElement();s.pop();s.push((b1 && b2) || (!b1 && !b2));}}}res = s.lastElement();//取出棧頂的元素}/*** 中綴表達式轉換為后綴表達式* @param infixSentence 中綴表達式*/private static void infixToSuffix(String infixSentence) {int i = 0, j = 0;Stack<Character> s = new Stack<>();s.push('#');char ch, operator;char[] alphas = infixSentence.toCharArray();ch = alphas[j];while (ch != '#') {if (Character.isAlphabetic(ch)) {suffixSentence[i++] = ch;if (!Alpha.contains(ch)) {Alpha.add(ch);}} else if (ch == ')') {for (operator = s.lastElement(), s.pop();operator != '(';operator = s.lastElement(), s.pop()) {suffixSentence[i++] = operator;}} else {for (operator = s.lastElement(), s.pop();icp(ch) <= isp(operator);operator = s.lastElement(), s.pop()) {suffixSentence[i++] = operator;}s.push(operator);s.push(ch);}ch = alphas[++j];}while (!s.isEmpty()) {operator = s.lastElement();s.pop();if (operator != '#') {suffixSentence[i++] = operator;}}}//棧內運算優先級private static int isp(char operator) {if (operator == '#') return 0;if (operator == '(') return 1;if (operator == '!') return 11;if (operator == '&') return 9;if (operator == '|') return 7;if (operator == '>') return 5;if (operator == '<') return 3;if (operator == ')') return 12;return 0;}//棧外運算優先級private static int icp(char ch) {if (ch == '#') return 0;if (ch == '(') return 12;if (ch == '!') return 10;if (ch == '&') return 8;if (ch == '|') return 6;if (ch == '>') return 4;if (ch == '<') return 2;if (ch == ')') return 1;return 0;}/*** 規范輸入的表達式* @param Sentence 輸入的合式* @return 規范后的合式*/private static String standardExpression(String Sentence) {Sentence = Sentence.replaceAll("->", ">").replaceAll("<>", "<").replaceAll(" ", "") + "#";//在其末尾追加一個#return Sentence;}/*** 初始化*/private static void init() {map.clear();Alpha.clear();}}

    總結

    以上是生活随笔為你收集整理的NJUPT南邮 | 离散数学_实验一的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。