-1

I'm trying to create a truth table in c, I have the left side built so i was able to show all the possibilities of the input numbers in a truth table. but i am having trouble getting the right output for the right side of the truth table. What I mean is we ask the user to write 1 or 0 and once we got trough all the row it should print the user's input on the right side of the truth table.

For example:

row 0:1

row 1:0
row 2:0
row 3:0
row 4:1
row 5:1
row 6:0
row 7:0

Output should look like this

0, 0, 0, : 1
0, 0, 1, : 0
0, 1, 0, : 0
0, 1, 1, : 0
1, 0, 0, : 1
1, 0, 1, : 1
1, 1, 0, : 0
1, 1, 1, : 0

As you can see, the input from the user should be on the right side of truth table

#include <stdio.h>


void increment(int truth_table[8][4], int f[8]){


for(int z=0; z<=1; z++){
    
    for(int y=0;y<=1; y++){
        
        for(int x=0; x<=1; x++){
    
            for(int j = 0; j < 1; j = j + 1){
            printf("%d  %d  %d  : %d\n", z,y,x,f[j]);
         }
      }
    }
  }
}


void right_side(int truth_table[8][4], int f[8]){


for(int i = 0; i < 8; i = i + 1) {

  for(int j = 0; j < 1; j = j + 1) {
     printf("row %d:",j);
     scanf(" %d", &f[j]);
   }
 }

  increment(truth_table,f);
}

int main(void) {

 int f[8];

 int truth_table[8][4] = {0};

 right_side(truth_table,f);

 return 0;
}
phuclv
  • 37,963
  • 15
  • 156
  • 475
ally
  • 1
  • 1

2 Answers2

0

The problem is in the last j loop because you are printing just 0 and 1 but you want to print the elements of the array that you have inserted in function void righ-side()

The updated code is here as follows:

#include <stdio.h>


void increment(int truth_table[8][4], 
int f[8]){


for(int z=0; z<=1; z++){

    for(int y=0;y<=1; y++){
    
        for(int x=0; x<=1; x++){

           // for(int j = 0; j < 8; j++){
           printf("%d  %d  %d  : ", z,y,x);
           //  }
           printf("%d\n",f[record]);
           ++record;
    }
    }
 }
}


void right_side(int truth_table[8][4], 
int f[8]){
    for(int i = 0; i < 8; i = i + 1) {
        printf("row %d of F%d output variable:", i,i);
        scanf(" %d", &f[i]);
    }
    increment(truth_table,f);
}

int main(void) {

  int f[8];

  int truth_table[8][4] = {0};

  right_side(truth_table,f);

  return 0;
}
Yash-Sharma2002
  • 89
  • 1
  • 10
0

There's no reason why you need to complicate this and drag in 2D arrays etc. These are bits, not int. I think the function you are looking for should simply be something straight-forward table look-up like this:

bool truthify (bool a, bool b, bool c)
{
  const bool truth_table[] = 
  {
    [0x00] = true,
    [0x01] = false,
    [0x02] = false,
    [0x03] = false,
    [0x04] = true,
    [0x05] = true,
    [0x06] = false,
    [0x07] = false,
  };

  uint8_t index = a<<2 | b<<1 | c<<0;
  return truth_table[index & 0x07];
}

Test code:

#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>

bool truthify (bool a, bool b, bool c)
{
  const bool truth_table[] = 
  {
    [0x00] = true,
    [0x01] = false,
    [0x02] = false,
    [0x03] = false,
    [0x04] = true,
    [0x05] = true,
    [0x06] = false,
    [0x07] = false,
  };

  uint8_t index = a<<2 | b<<1 | c<<0;
  return truth_table[index & 0x07];
}

int main (void)
{
  for(size_t i=0; i<8; i++)
  {
    bool a = i&4;
    bool b = i&2;
    bool c = i&1;

    printf("%d, %d, %d, : %d\n", a, b, c, truthify(a,b,c));
  }
}

Output:

0, 0, 0, : 1
0, 0, 1, : 0
0, 1, 0, : 0
0, 1, 1, : 0
1, 0, 0, : 1
1, 0, 1, : 1
1, 1, 0, : 0
1, 1, 1, : 0

Now simply rewrite that to take some user input and pass the truth table as a parameter to the function and there you go.

Lundin
  • 195,001
  • 40
  • 254
  • 396