How to resolve the algorithm Truth table step by step in the C programming language

Published on 7 June 2024 03:52 AM
#C

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 and FALSE: 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, and pop: 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 the vars array based on its name.
  • eval_expr: Evaluates the expression stored in expr using the stack sp and the vars 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.

Variable Assignment and Truth Table Generation:

  • set_vars: Recursively sets the values of variables in all possible combinations and calls eval_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