Can anyone help me with the problem below: I am using the following expression i
ID: 3548696 • Letter: C
Question
Can anyone help me with the problem below:
I am using the following expression in my expression text file.
((~a & b) || (^c)) && (d | ~e)
Given a logic (boolean) expression, write a program in Java to compute the truth table for it.
The expression (which will be read from the text file "expression.txt") may contain only:
- one letter lower case [input] variables (a, b, c, etc.)
- logical operators: AND, OR, NOT, XOR denoted as in C/Java by &, |, ~, ^ respectively
- parantheses: ( )
All operators have the same priority and the expression is evaluated from left to right.
The truth table (to be written in the "truthtable.txt" file) is computed by evaluating the expression for all true/false (T/F) combinations of its input variables.
Example:
Explanation / Answer
LogicAnalyzer.java
import java.util.ArrayList;
import java.util.Arrays;
public class LogicAnalyzer {
private Integer i = 0; // current position in String
private String logicString;
private Character[][] left;
private Character[][] right;
private Character operator;
public LogicAnalyzer(String logicString) {
this.logicString = logicString;
}
public Character[][] getTruthTable() {
// Don't want to mess with uppercase vs. lowercase
logicString = logicString.toLowerCase();
for(i = 0; i < logicString.length(); i++) {
char character = logicString.charAt(i);
if(character == ' ') {
continue;
}else if(character == '(') {
Character[][] parensTable = handleParenthesis();
if(parensTable != null) {
if(left == null) {
left = parensTable;
}else {
right = parensTable;
}
}else {
return null;
}
}else if(character == '^' || character == 'v' || character == '>') {
// And / Or
if(left == null) return null;
operator = character;
}else if(character == '!') {
// Not
if(++i < logicString.length()) {
if(isVariable(logicString.charAt(i))) {
Character[][] minitable = new Character[3][2]; // 3 rows, 2 columns
minitable[0][0] = logicString.charAt(i);
minitable[0][1] = '-';
minitable[1][0] = '1';
minitable[1][1] = '0';
minitable[2][0] = '0';
minitable[2][1] = '1';
if(left == null) {
left = minitable;
}else {
right = minitable;
}
}else if(logicString.charAt(i) == '(') {
Character[][] parensTable = invert(handleParenthesis());
if(parensTable != null) {
if(left == null) {
left = parensTable;
}else {
right = parensTable;
}
}else {
return null;
}
}
}else {
return null;
}
}else if(isVariable(character)) {
Character[][] minitable = new Character[3][2]; // 3 rows, 2 columns
minitable[0][0] = character;
minitable[0][1] = '-';
minitable[1][0] = '1';
minitable[1][1] = '1';
minitable[2][0] = '0';
minitable[2][1] = '0';
if(left == null) {
left = minitable;
}else {
right = minitable;
}
}
if(left != null && right != null) {
// It's go time.
return createTruthTable();
}
}
if(left != null) {
return left;
}else {
return null;
}
}
private Character[][] handleParenthesis() {
int start = i+1;
int end = -1;
int parensCount = 0;
for(i++; i < logicString.length(); i++) {
if(logicString.charAt(i) == ')' && parensCount == 0) {
end = i;
return new LogicAnalyzer(logicString.substring(start, end)).getTruthTable();
}else if(logicString.charAt(i) == ')') {
parensCount--;
}else if(logicString.charAt(i) == '(') {
parensCount++;
}
}
return null;
}
public Character[][] createTruthTable() {
ArrayList<Character> variables = new ArrayList<Character>();
for(int c = 0; c < left[0].length; c++) {
if(isVariable(left[0][c]) && !variables.contains(left[0][c]))
variables.add(left[0][c]);
}
for(int c = 0; c < right[0].length; c++) {
if(isVariable(right[0][c]) && !variables.contains(right[0][c]))
variables.add(right[0][c]);
}
int size = variables.size();
Character[][] truthTable = new Character[(int)Math.pow(2, size)+1][size+1];
for(int i = 0; i < size; i++) {
truthTable[0][i] = variables.get(i);
}
truthTable[0][size] = '-';
for(int row = 1; row < Math.pow(2, size)+1; row++) {
char[] temp = Integer.toBinaryString((row-1) * 2).toCharArray();
for(int index = 0; index < truthTable[row].length; index++) {
truthTable[row][index] = '0';
}
int length = truthTable[row].length;
for(int index = length-1; temp.length - (length - index) >= 0; index--) {
truthTable[row][index] = temp[temp.length - (length-index)];
}
}
for(int row = 1; row <= (Math.pow(2, size)); row++) {
truthTable[row][size] = booleanToChar(mergeTableRow(truthTable[0], truthTable[row], left, right, operator));
}
return truthTable;
}
public static Character[][] invert(Character[][] input) {
int rowLength = input[0].length;
for(int i = 0; i < input.length; i++) {
if(input[i][rowLength-1] == '0') {
input[i][rowLength-1] = '1';
}else {
input[i][rowLength-1] = '0';
}
}
return input;
}
public static boolean mergeTableRow(Character[] header, Character[] row, Character[][] left, Character[][] right, char op) {
boolean leftResult = findResult(header, row, left) == '1';
boolean rightResult = findResult(header, row, right) == '1';
if(op == 'v') {
return leftResult || rightResult;
}else if(op == '^') {
return leftResult && rightResult;
}else if(op == '>') {
return !leftResult || (leftResult && rightResult);
}else {
return false;
}
}
public static char findResult(Character[] header, Character[] row, Character[][] lookup) {
boolean[] rowLookup = new boolean[lookup.length-1];
Arrays.fill(rowLookup, true);
for(int i = 0; i < header.length-1; i++) {
Character headChar = header[i];
for(int in = 0; in < lookup[0].length-1; in++) {
if(lookup[0][in].equals(headChar)) {
for(int lookupRow = 1; lookupRow < lookup.length; lookupRow++) {
if(!lookup[lookupRow][in].equals(row[i])) {
rowLookup[lookupRow-1] = false;
}
}
break;
}
}
}
for(int i = 1; i < lookup.length; i++) {
if(rowLookup[i-1]) {
return lookup[i][lookup[i].length-1];
}
}
return '0';
}
public static char booleanToChar(boolean b) {
if(b) {
return '1';
}else {
return '0';
}
}
public static boolean isVariable(char c) {
return (c >= 'a' && c <= 'z' && c != 'v');
}
}
MainGUI.java
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Arrays;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;
public class MainGUI extends JPanel {
private JTextField logicField;
private JTable truthTable;
public MainGUI() {
JPanel topPanel = new JPanel();
topPanel.add(new JLabel("String:"));
logicField = new JTextField(20);
logicField.addActionListener(new GenerateListener());
topPanel.add(logicField);
JPanel tablePanel = new JPanel();
truthTable = new JTable(5, 3);
truthTable.setEnabled(false);
JScrollPane scrollPane = new JScrollPane(truthTable);
tablePanel.add(scrollPane);
setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
add(topPanel);
add(tablePanel);
}
class GenerateListener implements ActionListener {
public void actionPerformed(ActionEvent ev) {
try {
Character[][] tableData = new LogicAnalyzer(logicField.getText()).getTruthTable();
if(tableData != null) {
Character[] tableHeaders = tableData[0];
tableData = Arrays.copyOfRange(tableData, 1, tableData.length);
truthTable.setModel(new DefaultTableModel(tableData, tableHeaders));
}else {
JOptionPane.showMessageDialog(null, "Error Interpreting String");
}
}catch(Exception ex) {
JOptionPane.showMessageDialog(null, "Error Interpreting String");
ex.printStackTrace();
}
}
}
public static void main(String[] args) {
JFrame frame = new JFrame("Truth Table Generator");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(new MainGUI());
frame.pack();
frame.setVisible(true);
}
}
Related Questions
drjack9650@gmail.com
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.