How to resolve the algorithm Truth table step by step in the C programming language
Published on 7 June 2024 03:52 AM
How to resolve the algorithm Truth table step by step in the C programming language
Table of Contents
Problem Statement
A truth table is a display of the inputs to, and the output of a Boolean function organized as a table where each row gives one combination of input values and the corresponding value of the function.
Let's start with the solution:
Step by Step solution about How to resolve the algorithm Truth table step by step in the C programming language
This C program evaluates boolean expressions entered by the user and handles variables, operators, and logical expressions. It provides truth tables for the expressions and allows users to explore different variable combinations. Here's a detailed explanation of the code:
Data Structures:
var
: Structure to represent a variable with a name and a boolean value.stack_of_bool
: Structure to represent a stack of boolean values.
Constant Definitions:
TRUE
andFALSE
: Constants representing true and false.STACK_SIZE
: Size of the boolean stack.BUFFER_SIZE
: Size of the input buffer for expressions.
Stack Operations:
is_full
,is_empty
,peek
,push
, andpop
: Standard stack operations to check fullness, emptiness, get the top element, push an element, and pop an element.make_empty
: Empties the stack by setting the top pointer to -1.elems_count
: Returns the number of elements in the stack.
Expression Evaluation:
is_operator
: Checks if a character is a logical operator (&, |, !, or ^).vars_index
: Gets the index of a variable in thevars
array based on its name.eval_expr
: Evaluates the expression stored inexpr
using the stacksp
and thevars
array:- Push true or false based on the character read from
expr
. - Perform logical operations based on the operators encountered.
- Return the final value from the stack.
- Push true or false based on the character read from
Variable Assignment and Truth Table Generation:
set_vars
: Recursively sets the values of variables in all possible combinations and callseval_expr
to compute the truth table.
Input Processing:
process_expr
: Removes whitespace and converts the expression to uppercase for easier parsing.
Main Function:
- Takes user input for boolean expressions.
- Processes the expression using
process_expr
. - Identifies the variables in the expression and stores them in the
vars
array. - Prints the truth table by calling
set_vars
with different variable combinations.
Usage:
- The program prompts the user to enter boolean expressions.
- The expression can contain variables, operators (&, |, !, or ^), and true/false values (T/F).
- The program evaluates the expression for all possible variable combinations and prints the truth table.
- The user can enter an empty expression to exit the program.
Source code in the c programming language
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
#define STACK_SIZE 80
#define BUFFER_SIZE 100
typedef int bool;
typedef struct {
char name;
bool val;
} var;
typedef struct {
int top;
bool els[STACK_SIZE];
} stack_of_bool;
char expr[BUFFER_SIZE];
int expr_len;
var vars[24];
int vars_len;
/* stack manipulation functions */
bool is_full(stack_of_bool *sp) {
return sp->top == STACK_SIZE - 1;
}
bool is_empty(stack_of_bool *sp) {
return sp->top == -1;
}
bool peek(stack_of_bool *sp) {
if (!is_empty(sp))
return sp->els[sp->top];
else {
printf("Stack is empty.\n");
exit(1);
}
}
void push(stack_of_bool *sp, bool val) {
if (!is_full(sp)) {
sp->els[++(sp->top)] = val;
}
else {
printf("Stack is full.\n");
exit(1);
}
}
bool pop(stack_of_bool *sp) {
if (!is_empty(sp))
return sp->els[(sp->top)--];
else {
printf("\nStack is empty.\n");
exit(1);
}
}
void make_empty(stack_of_bool *sp) {
sp->top = -1;
}
int elems_count(stack_of_bool *sp) {
return (sp->top) + 1;
}
bool is_operator(const char c) {
return c == '&' || c == '|' || c == '!' || c == '^';
}
int vars_index(const char c) {
int i;
for (i = 0; i < vars_len; ++i) {
if (vars[i].name == c) return i;
}
return -1;
}
bool eval_expr() {
int i, vi;
char e;
stack_of_bool s;
stack_of_bool *sp = &s;
make_empty(sp);
for (i = 0; i < expr_len; ++i) {
e = expr[i];
if (e == 'T')
push(sp, TRUE);
else if (e == 'F')
push(sp, FALSE);
else if((vi = vars_index(e)) >= 0) {
push(sp, vars[vi].val);
}
else switch(e) {
case '&':
push(sp, pop(sp) & pop(sp));
break;
case '|':
push(sp, pop(sp) | pop(sp));
break;
case '!':
push(sp, !pop(sp));
break;
case '^':
push(sp, pop(sp) ^ pop(sp));
break;
default:
printf("\nNon-conformant character '%c' in expression.\n", e);
exit(1);
}
}
if (elems_count(sp) != 1) {
printf("\nStack should contain exactly one element.\n");
exit(1);
}
return peek(sp);
}
void set_vars(int pos) {
int i;
if (pos > vars_len) {
printf("\nArgument to set_vars can't be greater than the number of variables.\n");
exit(1);
}
else if (pos == vars_len) {
for (i = 0; i < vars_len; ++i) {
printf((vars[i].val) ? "T " : "F ");
}
printf("%c\n", (eval_expr()) ? 'T' : 'F');
}
else {
vars[pos].val = FALSE;
set_vars(pos + 1);
vars[pos].val = TRUE;
set_vars(pos + 1);
}
}
/* removes whitespace and converts to upper case */
void process_expr() {
int i, count = 0;
for (i = 0; expr[i]; ++i) {
if (!isspace(expr[i])) expr[count++] = toupper(expr[i]);
}
expr[count] = '\0';
}
int main() {
int i, h;
char e;
printf("Accepts single-character variables (except for 'T' and 'F',\n");
printf("which specify explicit true or false values), postfix, with\n");
printf("&|!^ for and, or, not, xor, respectively; optionally\n");
printf("seperated by whitespace. Just enter nothing to quit.\n");
while (TRUE) {
printf("\nBoolean expression: ");
fgets(expr, BUFFER_SIZE, stdin);
fflush(stdin);
process_expr();
expr_len = strlen(expr);
if (expr_len == 0) break;
vars_len = 0;
for (i = 0; i < expr_len; ++i) {
e = expr[i];
if (!is_operator(e) && e != 'T' && e != 'F' && vars_index(e) == -1) {
vars[vars_len].name = e;
vars[vars_len].val = FALSE;
vars_len++;
}
}
printf("\n");
if (vars_len == 0) {
printf("No variables were entered.\n");
}
else {
for (i = 0; i < vars_len; ++i)
printf("%c ", vars[i].name);
printf("%s\n", expr);
h = vars_len * 3 + expr_len;
for (i = 0; i < h; ++i) printf("=");
printf("\n");
set_vars(0);
}
}
return 0;
}
You may also check:How to resolve the algorithm Conditional structures step by step in the Verbexx programming language
You may also check:How to resolve the algorithm Substring/Top and tail step by step in the TorqueScript programming language
You may also check:How to resolve the algorithm Binary search step by step in the Swift programming language
You may also check:How to resolve the algorithm Multiple regression step by step in the Nim programming language
You may also check:How to resolve the algorithm Apply a callback to an array step by step in the Déjà Vu programming language