java实现真值表(附完整源码)
时间: 2023-10-17 11:08:58 浏览: 80
下面是一个简单的Java程序,可以生成给定布尔表达式的真值表:
```java
import java.util.*;
public class TruthTableGenerator {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("Enter the boolean expression: ");
String expression = sc.nextLine();
System.out.println("Truth table:");
System.out.println(generateTruthTable(expression));
}
public static String generateTruthTable(String expression) {
String[] variables = getVariables(expression);
int numVariables = variables.length;
int numRows = (int) Math.pow(2, numVariables);
StringBuilder sb = new StringBuilder();
// Print header row
for (int i = 0; i < numVariables; i++) {
sb.append(variables[i]).append("\t");
}
sb.append(expression).append("\n");
// Print truth table rows
for (int i = 0; i < numRows; i++) {
boolean[] values = getVariableValues(i, numVariables);
for (int j = 0; j < numVariables; j++) {
sb.append(values[j] ? "T" : "F").append("\t");
}
boolean result = evaluateExpression(expression, values);
sb.append(result ? "T" : "F").append("\n");
}
return sb.toString();
}
private static String[] getVariables(String expression) {
Set<String> variables = new HashSet<>();
for (int i = 0; i < expression.length(); i++) {
char c = expression.charAt(i);
if (Character.isLetter(c)) {
variables.add(Character.toString(c));
}
}
return variables.toArray(new String[0]);
}
private static boolean[] getVariableValues(int row, int numVariables) {
boolean[] values = new boolean[numVariables];
for (int i = 0; i < numVariables; i++) {
int bit = (row >> (numVariables - i - 1)) & 1;
values[i] = (bit == 1);
}
return values;
}
private static boolean evaluateExpression(String expression, boolean[] values) {
String[] variables = getVariables(expression);
for (int i = 0; i < variables.length; i++) {
String variable = variables[i];
int index = expression.indexOf(variable);
while (index >= 0) {
char c = (values[i] ? 'T' : 'F');
expression = expression.substring(0, index) + c + expression.substring(index + 1);
index = expression.indexOf(variable, index + 1);
}
}
return evaluateExpression(expression);
}
private static boolean evaluateExpression(String expression) {
Stack<Boolean> stack = new Stack<>();
for (int i = 0; i < expression.length(); i++) {
char c = expression.charAt(i);
if (c == 'T' || c == 'F') {
stack.push(c == 'T');
} else if (c == '&') {
boolean b2 = stack.pop();
boolean b1 = stack.pop();
stack.push(b1 && b2);
} else if (c == '|') {
boolean b2 = stack.pop();
boolean b1 = stack.pop();
stack.push(b1 || b2);
} else if (c == '!') {
boolean b = stack.pop();
stack.push(!b);
}
}
return stack.pop();
}
}
```
该程序先从用户输入获取一个布尔表达式,然后生成真值表并将其打印出来。它使用了一个`getVariables`方法来获取表达式中的变量,使用了一个`getVariableValues`方法来获取给定行的变量值,使用了一个`evaluateExpression`方法来计算表达式的值,最后使用`StringBuilder`来构建真值表的字符串表示。
这个程序使用了一些位操作技巧来生成真值表。例如,`getVariableValues`方法将一个整数行解释为二进制位,并将每个位映射到一个变量。`evaluateExpression`方法使用字符串替换来将变量替换为其对应的布尔值。