Pesquise

25 de mar. de 2012

Cálculo de tabelas-verdade utilizando C [atualizado]

Apresento-lhes um programa bem básico para cálculo de tabelas-verdade, a partir de uma expressão lógica dada, bastante útil para a parte de Circuitos Lógicos. Segue o código (desenvolvido no Dev-C++):

/*****************************************************

  Construtor de tabelas-verdade
  http://yzcoding.blogspot.com
  25/03/2012

******************************************************/

#include <stdio.h>
#include <stdlib.h>

int main(void) {
  int entrada, saida;
  int A, B, C, D;    // variáveis de entrada
  int n = 4;         // quantidade de variáveis
  
  printf("\n  (A . ~B . C) + (A . ~D) + (~A . B . D)\n\n");
  
  printf("  A B C D | S\n ---------+---\n");
  
  //                          2^n - quantidade de linhas da tabela
  for(entrada = 0; entrada < (pow(2, n)); entrada++) {
      
      A = (entrada & 8)?1:0;         // x ? a:b <=> if(x) a; else b;
      B = (entrada & 4)?1:0;         // inline if
      C = (entrada & 2)?1:0;
      D = (entrada & 1)?1:0;
      
      saida = (A & !B & C) | (A & !D) | (!A & B & D);      // expressão
      
      printf("  %d %d %d %d | %d\n", A, B, C, D, saida);     // saída
      }
      
  getchar();
  return 0;
} // main end


Este código foi feito, inicialmente, para 4 variáveis de entrada (A, B, C e D). A parte mais importante está na variável saida, onde temos a expressão a ser calculada. "&" corresponde à operação AND (e), "|" corresponde à OR (ou), e "!A" representa o complemento de A. Assim, basta reescrever sua operação lógica utilizando esses operadores, e rodar o programa.

Segue um screenshot desse código compilado:


Para aumentar ou diminuir o número de variáveis, faz-se necessário mudar várias partes do programa. Para evitar isso, estou trabalhando numa solução. Já tentei pensar numa solução para isso, mas nada tão simples, ou prático.


Portanto, para aumentar ou diminuir o número de variáveis, alteram-se as seguintes partes:
  1. Declaração de variáveis;
  2. Atribuição dos valores para entrada, dentro do for; no caso, adicionar ou remover uma das atribuições, sempre começando da primeira (A) (exemplo abaixo);
  3. Exibições em geral (printf)

Por exemplo, caso sejam 5 variáveis, ficaria assim (partes principais):

      A = (entrada & 16)?1:0;
      B = (entrada &  8)?1:0;
      C = (entrada &  4)?1:0;
      D = (entrada &  2)?1:0;
      E = (entrada &  1)?1:0;

      ...

      printf("  %d %d %d %d %d | %d\n", A, B, C, D, E, saida);     // saída

Bem, é isso. Qualquer dúvida, é só postar nos comentários. Até mais!

2 comentários:

  1. Muito Obrigado esse comando "?1:0" me ajudou muito
    VLW!!!

    ResponderExcluir
  2. Olá de novo tenho uma duvida sim!
    Para fazer isso inserindo em uma matriz
    não consigo estipular a dimensão da matriz (qualquer que seja o tamanho)e inserir somente na coluna 0 ou 1 ou 2 ...
    Só funcionou se colocar a dimensão da matriz na declaração por exemplo tab[4][2] para duas variaveis.
    segue o código abaixo:

    #include
    #include
    #include
    #include

    int main(){
    setlocale(LC_ALL,"Portuguese");
    int tab[4][2],i=0,j=0;
    for(i=0;i<4;i++){
    for(j=0;j<2;j++){
    tab[i][0]=(i&2)?1:0;
    tab[i][1]=(i&1)?1:0;
    }
    }
    printf("\n");
    for(i=0;i<4;i++){
    printf("\t");
    for(j=0;j<2;j++){
    printf("%d\t",tab[i][j]);
    }
    printf("\n\n");
    }
    getchar();
    getchar();
    return 0;
    }

    O código que tá dando problema é esse abaixo:

    #include
    #include
    #include
    #include

    int main(){
    setlocale(LC_ALL,"Portuguese");
    int pos=0,var=0,i=0,j=0,tab[pos][var]; //numero de variaveis e possibilidades//
    printf("Informe o número de variáveis:\n");
    scanf("%d%*C",&var);
    pos=pow(2,var);
    printf("%d||%d\n\n",var,pos);
    for(i=0;i<pos;i++){
    for(j=0;j<var;j++){
    tab[i][0]=(i&2)?1:0;
    tab[i][1]=(i&1)?1:0;
    }
    }



    printf("\n"); //imprimindo matriz//
    for(i=0;i<pos;i++){
    printf("\t");
    for(j=0;j<var;j++){
    printf("%d\t",tab[i][j]);
    }
    printf("\n\n");
    }
    getchar();
    getchar();
    return 0;
    }

    Vê se possível colocar a tabela verdade em uma matriz de dimensão variável?
    Desde já Obrigado!!!

    ResponderExcluir