【问题标题】:Boolean Truth Table C++布尔真值表 C++
【发布时间】:2018-09-25 19:17:54
【问题描述】:

(p -> q) [( r ​​^ t ) v (not) s]

这个等式是我的老师给我们的,供我们编写一个真值表。我已经由老师对此进行了检查,但是在尝试填充数组时遇到了问题:

bool p[32] = { false };
bool q[32] = { false }; 
bool r[32] = { false };
bool s[32] = { false };
bool t[32] = { false };

我知道我正在尝试通过以下方式分配未预留的内存(获取“围绕变量 'p' 的堆栈已损坏”):

for (int i = 0; i < counter; i++)           
    {
        toTrue[i] = true;
        for (int j = (counter * 2); j < (counter * 3); j++)     
        {
            toTrue[j] = true;
            for (int k = (counter * 4); k < (counter * 5); k++)     
            {
                toTrue[k] = true;
                for (int l = (counter * 6); l < (counter * 7); l++)     
                {
                    toTrue[l] = true;
                    for (int m = (counter * 8); m < (counter * 9); m++)     
                    {
                        toTrue[m];
                    }
                }
            }
        }
    }

这只是基于基本真值表,其中会产生一个基本的 2 变量 OR 真值表:

a b    c
1 1    1
1 0    1
0 1    1
0 0    0

我不确定如何在不使用向量的情况下解决此问题,我对此知之甚少,因此不能 100% 有信心走这条路。我的另一个想法是尝试创建多种方法来填充 p,然后是 q,然后是 r 等。但是我的老师之前已经告诉我,我扩展代码的程度超出了我的需要,我想做多种方法,例如这会导致他说同样的话。有什么建议吗?

【问题讨论】:

  • 我不知道你的循环试图做什么,toTrue[m]; 行只是增加了关于代码意图的混乱。
  • 您是否尝试过使用调试器单步执行代码?它应该有助于阐明情况。
  • 为什么不使用整数作为 0 到 32 的计数器,其中每个位代表 p,q,r,s,t 的真值,通过掩码计算和打印得到它们。
  • @Cameron 是正确的 95% 的我打算在这里提出的问题从未被问到,因为我是在调试它们。 Bailey,如果你还不知道调试器,它是你最好的朋友。
  • 如果所有五个循环都从 0 迭代到 1,然后在内部循环中将所有这些位组合成一个值,您的代码将更加简单和清晰更容易理解,隐藏错误的地方更少。

标签: c++ truthtable


【解决方案1】:

另一种简单的方法。

#include<iostream>

using namespace std;

bool getBit(unsigned int uint, int position) { // !!! no range check  !!! 
     return (uint >> position) & 0x1;
}

int main( int argc, char* argv[]) {

    bool p,q,r,s,t;
    
    cout << "p  q  r  s  t  (p -> q) <-> [( r ^ t ) v (not) s] \n";
    for ( unsigned int i = 0 ; i < 32 ; i++ ) {
             
        cout << getBit(i,0) << "  ";
        cout << getBit(i,1) << "  ";
        cout << getBit(i,2) << "  ";
        cout << getBit(i,3) << "  ";
        cout << getBit(i,4) << "  ";
        
        cout  << ((!p || q)  == (( r ^ t ) ||  !s));
        
        cout << endl;
    }
    return 0;
}

【讨论】:

    猜你喜欢
    • 2015-04-02
    • 1970-01-01
    • 1970-01-01
    • 2016-09-28
    • 2017-03-15
    • 2018-03-29
    • 2020-02-10
    • 1970-01-01
    • 2019-01-25
    相关资源
    最近更新 更多