資源簡介
* 顯示合適公式的真值表
* 提供將一個中綴合適公式的真值表輸出到某一PrintStream流中的功能
* 以單個大寫字母表示變量(支持26個變量)
* 以字符0或者1表示值
* 以 ~ ^ & > - 分別表示 非 析取 合取 條件 雙條件 連接詞
* 支持 ( )(括號)
* 如果公式中有錯誤將不會輸入真值表(將會輸出錯誤信息)
說明:以 ~ ^ & > - 分別表示 非 析取 合取 條件 雙條件 連接詞
以單個大寫字母表示變量(支持26個變量)
以字符0或者1表示值,式子中的T與F
支持 ( )(括號)
如果公式中有錯誤將不會輸入真值表(將會輸出錯誤信息)
注意:輸出的結果會同時顯示到屏幕與該程序的同目錄下的“真值表結果.txt”文件中
直接按回車鍵(輸入為空)則會退出程序
例如:輸入 A^B-(1&C)則會顯示
該合適公式是 A^B-(1&C)
A B C Key
0 0 0 0
1 0 0 0
0 1 0 0
1 1 0 1
0 0 1 0
1 0 1 0
0 1 1 0
1 1 1 1
代碼片段和文件信息
/**
?*?顯示合適公式的真值表
?*?chishaxie
?*/
import?java.io.BufferedReader;
import?java.io.FileOutputStream;
import?java.io.InputStreamReader;
import?java.io.PrintStream;
import?java.util.Stack;
/**
?*?真值表類(abstract抽象類)
?*?提供將一個中綴合適公式的真值表輸出到某一PrintStream流中的功能
?*?以單個大寫字母表示變量(支持26個變量)
?*?以字符0或者1表示值
?*?以?~?^?&?>?-?分別表示?非?析取?合取?條件?雙條件?連接詞
?*?支持?(?)(括號)
?*?如果公式中有錯誤將不會輸入真值表(將會輸出錯誤信息)
?*?@author?chishaxie
?*/
abstract?class?TruthTable{
/**
?*?邏輯連接詞優先級判斷
?*?定義左括號和棧底字符的優先級為0
?*?定義條件與雙條件運算的優先級為1
?*?定義合取運算的優先級為2
?*?定義析取運算的優先級為3
?*?定義非運算的優先級為4
?*?@param?op?連接詞(char?字符形式)
?*?@return?表示優先級的數字(0~4)
?*/
private?static?int?Precedence(char?op)
{
switch?(op)?{
case?‘-‘:
case?‘>‘:
return?1;
case?‘&‘:
return?2;
case?‘^‘:
return?3;
case?‘~‘:
return?4;
case?‘(‘:
case?‘=‘:
default:
return?0;
}
}
/**
?*?將合適公式的中綴形式轉化為后綴形式
?*?支持的字符有?大寫字母(表示變量)?~?^?&?>?-(表示連接詞)?(?)(括號)
?*?@param?str?適合公式的中綴形式(String字符串形式,字符串應該以=結尾)
?*?@return?適合公式的后綴形式(String字符串形式,字符串以=結尾)
?*?@throws?Exception?合適公式中含有錯誤時
?*/
private?static?String?toSuffix(String?str)?throws?Exception?{
StringBuffer?strBuf?=?new?StringBuffer();
Stack?stack?=?new?Stack();
stack.push(‘=‘);//壓入棧底字符
int?i?=?0;
char?ch?=?str.charAt(i);
while?(ch!=‘=‘)?{
if?(ch?==?‘?‘)
;//忽略空格
else?if?(ch?==?‘(‘)?
stack.push(‘(‘);
else?if?(ch?==?‘)‘)?{
while?(stack.peek()?!=?‘(‘)?{
if?(stack.peek()?==?‘=‘)
throw?new?Exception(“括號不匹配(可能是缺少“(”)“);
strBuf.append(stack.pop());
}
stack.pop();
}?else?if?(ch?==?‘^‘?||?ch?==?‘&‘?||?ch?==?‘~‘?||?ch?==?‘-‘?||?ch?==?‘>‘)?{
char?w?=?stack.peek();
while?(Precedence(w)?>=?Precedence(ch))?{
strBuf.append(w);
stack.pop();
w?=?stack.peek();
}
stack.push(ch);
}?else?{
if?(!((ch?>=?‘A‘?&&?ch?<=?‘Z‘)?||?ch==‘0‘?||?ch==‘1‘))
throw?new?Exception(“出現不支持的符號(可能是括號等出現全角模式)“);
strBuf.append(ch);
}
ch=str.charAt(++i);
}
ch?=?stack.pop();
while?(ch?!=?‘=‘)?{
if?(ch?==?‘(‘)
throw?new?Exception(“括號不匹配(可能是缺少“)”)“);
else?{
strBuf.append(ch);
ch?=?stack.pop();
}
}
strBuf.append(‘=‘);
//System.out.println(strBuf);
return?strBuf.toString();
}
/**
?*?計算出適合公式的值(后綴形式)
?*?以字符0或者1表示變量的值
?*?以?~?^?&?>?-?分別表示?非?析取?合取?條件?雙條件?連接詞
?*?@param?str?后綴形式的合適公式(String字符串形式,需要以=結尾)
?*?@return?計算的結果(boolean形式,false表示0,ture表示1)
?*?@throws?Exception?合適公式中含有錯誤時
?*/
private?static?boolean?runSuffix(String?str)?throws?Exception
{
Stack?stack=new?Stack();
int?i=0;
Boolean?num1num2;
while(str.charAt(i)!=‘=‘)
{
if(str.charAt(i)==‘0‘)
stack.push(false);
else?if(str.charAt(i)==‘1‘)
stack.push(true);
else?if(str.charAt(i)==‘^‘)
{
if(stack.size()<2)
throw?new?Exception(“合適公式出現錯誤(可能是缺少變量)“);
num1=stack.pop();
num2=stack.pop();
if(num1.equals(true)?
- 上一篇:數據庫課程設計(教學管理系統)( java實現)
- 下一篇:FlappyBird
評論
共有 條評論