Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

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);

}

}

Hire Me For All Your Tutoring Needs
Integrity-first tutoring: clear explanations, guidance, and feedback.
Drop an Email at
drjack9650@gmail.com
Chat Now And Get Quote