I'm trying to print some truth tables as part of a school assignment. How can I generate a dynamic size truth table in Java?
So that printTruthTable(1)
prints:
0
1
printTruthTable(3)
prints:
0 0 0
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
1 1 1
And so on. I have been trying to implement it using recursion, but I just can't get it right.
here's my take on your problem, all written nice and tight in a small class, just copy/paste
notice how I used modulo2 (the % sign) to get 0's and 1's from the loop indices
public class TruthTable {
private static void printTruthTable(int n) {
int rows = (int) Math.pow(2,n);
for (int i=0; i<rows; i++) {
for (int j=n-1; j>=0; j--) {
System.out.print((i/(int) Math.pow(2, j))%2 + " ");
}
System.out.println();
}
}
public static void main(String[] args) {
printTruthTable(3); //enter any natural int
}
}
This is not a truth table - rather, it's a table of binary numbers. You can use Java's Integer.toBinaryString
method to generate the zeros and ones that you need; inserting spaces should be trivial.
int n = 3;
for (int i = 0 ; i != (1<<n) ; i++) {
String s = Integer.toBinaryString(i);
while (s.length() != 3) {
s = '0'+s;
}
System.out.println(s);
}
The magic of recursion:
public static void main(String args[]) {
int size = 3;
generateTable(0, size, new int[size]);
}
private static void generateTable(int index, int size, int[] current) {
if(index == size) { // generated a full "solution"
for(int i = 0; i < size; i++) {
System.out.print(current[i] + " ");
}
System.out.println();
} else {
for(int i = 0; i < 2; i++) {
current[index] = i;
generateTable(index + 1, size, current);
}
}
}
If you look at what you're generating, it appears to be counting in binary. You're going to be counting to 2^(n) - 1 in binary and spitting out the bits.
the truth table is base on the binary representation of the number but without removing leading zero's so what you would do is to loop from 0 to (1<
public void generate(int n){
for (int i=0 ;i!=(1<<n);i++) {
String binaryRep = Integer.toBinaryString(i);
while (s.length() != n) {
binaryRep = '0'+binaryRep;
}
System.out.println(s);
}
}
you can make that using recursion also :
public void generateRecursively(int i , int n){
if(i==(1<<n))
return;
else{
String temp = Integer.toBinaryString(i);
while(temp.length()<n){
temp = '0'+temp;
}
System.out.println(temp);
generateRecursively(i+1,n);
}
}
A longer take to your problem
import java.util.Scanner;
public class tt{
boolean arr[][];
boolean b=false;
boolean[][] printtt(int n){
for(int i=0;i<n;i++){
for(int j=0;j<(Math.pow(2,n));j++){
if(j<Math.pow(2,n-1)){
arr[j][i]=b;
}
else{
arr[j][i]=!b;
}
}
}
return(arr);
}
public static void main(String args[]){
Scanner sc=new Scanner(System.in);
System.out.println("Input values count");
tt ob=new tt();
int num=sc.nextInt();int pownum=(int)Math.pow(2,num);
boolean array[][]=new boolean[pownum][num];
array=ob.printtt(num);
for(int i=0;i<num;i++){
for(int j=0;j<(Math.pow(2,num));j++){
System.out.println(array[j][i]);
}
}
}
}
I had to do something similar recently except the project was to generate a truth table for a given logical expression. This is what I came up with for assigning independent variables their truth values.
column = 0;
while (column < numVariables)
{
state = false;
toggle = (short) Math.pow(2, numVariables - column - 1);
row = 1;
while (row < rows)
{
if ((row -1)%toggle == 0)
state = !state;
if (state)
truthTable[row][column] = 'T';
else
truthTable[row][column] = 'F';
row++;
}
column++;
}
This is assuming your first row is populated with variable names and sub-expressions. The math might change slightly if you want to start with row 0.
This bit....
if ((row -1)%toggle == 0)
would become....
if (row%toggle == 0)
来源:https://stackoverflow.com/questions/10723168/generating-truth-tables-in-java