Таблица логической истины C ++

(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];
                    }
                }
            }
        }
    }

Это просто основано на базовых таблицах истинности, в результате которых может получиться базовая таблица истинности с двумя переменными ИЛИ:

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

Я не уверен, как решить эту проблему без использования векторов, о которых у меня очень ограниченные знания, поэтому я не уверен на 100%, идя по этому пути. Другая идея, которая у меня была, заключалась в том, чтобы попытаться создать несколько методов для заполнения p, затем q, затем r и т. Д. Но мой учитель уже сказал мне ранее, что я расширяю код больше, чем мне нужно, и я чувствую, что использую несколько методов, например это привело бы к тому, что он сказал бы то же самое. Любой совет?


person Bailey0314    schedule 25.09.2018    source источник
comment
Я понятия не имею, что пытаются делать ваши циклы, а строка toTrue[m]; только добавляет путаницы относительно намерения кода.   -  person François Andrieux    schedule 25.09.2018
comment
Вы пробовали выполнить код с помощью отладчика? Это должно помочь пролить свет на ситуацию.   -  person Cameron    schedule 25.09.2018
comment
почему бы не использовать целое число в качестве счетчика от 0 до 32, где каждый бит представляет значение истинности для p, q, r, s, t, получить их, маскируя вычисление и печать.   -  person kelalaka    schedule 25.09.2018
comment
@Cameron прав. 95% вопросов, которые я планирую задать здесь, никогда не задаются, потому что вместо этого я их отлаживаю. Бейли, если вы еще не знакомы с отладчиком, это ваш лучший друг.   -  person Mawg says reinstate Monica    schedule 25.09.2018
comment
Ваш код будет намного проще и понятнее, если все ваши пять циклов будут повторяться от 0 до 1, каждый, а затем внутри внутреннего цикла вы объедините все эти биты в одно значение Намного яснее, намного проще для понимания и меньше мест для ошибки, которые нужно скрыть.   -  person Sam Varshavchik    schedule 25.09.2018


Ответы (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;
}
person kelalaka    schedule 25.09.2018