资源简介

* 显示合适公式的真值表 * 提供将一个中缀合适公式的真值表输出到某一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) 

评论

共有 条评论