Форум программистов, компьютерный форум CyberForum.ru

Bool переменные - как записать таблицы истинности функции, используя цикл - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 29, средняя оценка - 4.93
(SkyNet)
 Аватар для (SkyNet)
22 / 40 / 6
Регистрация: 25.10.2011
Сообщений: 175
05.03.2012, 22:15     Bool переменные - как записать таблицы истинности функции, используя цикл #1
Пусть есть 4 переменых типа bool (x1, x2, x3 ,x4) и логическая функция (y = !x1 x3 + x2!x4) как записать таблицы истинности даной функции используя цыкл?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.03.2012, 22:15     Bool переменные - как записать таблицы истинности функции, используя цикл
Посмотрите здесь:

C++ Как правильно записать цикл for?
C++ как правильно понять тип bool ? bool true(const string &str) и что дает это значение ?
C++ Используя цикл с постусловием, составить программу табулирования функции F(x)=sin(x)-cos(x) на отрезке [a, b] с шагом h
Выяснить, к чему приводятся переменные типа bool в арифметических выражениях C++
C++ Распечатать таблицы значений функций cox (x) и на отрезке [a; b] с шагом h, развив функции в ряд Тейлора и используя указатели на функции
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
05.03.2012, 22:36     Bool переменные - как записать таблицы истинности функции, используя цикл #2
C++
1
for ( int i = 0 ; i < 16 ; ++i )
Xind
275 / 148 / 7
Регистрация: 05.11.2011
Сообщений: 425
Записей в блоге: 1
05.03.2012, 23:00     Bool переменные - как записать таблицы истинности функции, используя цикл #3
Цитата Сообщение от go Посмотреть сообщение
C++
1
for ( int i = 0 ; i < 16 ; ++i )
Продолжу...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
 
using namespace std;
 
int main()
{
   bool x1, x2, x3, x4, y;
   
   for (int i = 0; i < 16; i++)
   {
      x1 =  i     & 0xF1;
      x2 = (i>>1) & 0xF1;
      x3 = (i>>2) & 0xF1;
      x4 = (i>>3) & 0xF1;
      
      y = !x1 || x3 && x2 || !x4;
      
      cout << " | " << x4 << " " << x3 << " " << x2 << " " << x1 << " | " << y << " | " << endl;
   }
   
   return 0;
}
Код
Execution output:
 | 0 0 0 0 | 1 | 
 | 0 0 0 1 | 1 | 
 | 0 0 1 0 | 1 | 
 | 0 0 1 1 | 1 | 
 | 0 1 0 0 | 1 | 
 | 0 1 0 1 | 1 | 
 | 0 1 1 0 | 1 | 
 | 0 1 1 1 | 1 | 
 | 1 0 0 0 | 1 | 
 | 1 0 0 1 | 0 | 
 | 1 0 1 0 | 1 | 
 | 1 0 1 1 | 0 | 
 | 1 1 0 0 | 1 | 
 | 1 1 0 1 | 0 | 
 | 1 1 1 0 | 1 | 
 | 1 1 1 1 | 1 |
(SkyNet)
 Аватар для (SkyNet)
22 / 40 / 6
Регистрация: 25.10.2011
Сообщений: 175
06.03.2012, 01:34  [ТС]     Bool переменные - как записать таблицы истинности функции, используя цикл #4
не подскажите что делает 11 -14 строка и оператор >> ?
Arcor
 Аватар для Arcor
4766 / 1767 / 153
Регистрация: 20.11.2009
Сообщений: 5,583
Записей в блоге: 1
06.03.2012, 03:28     Bool переменные - как записать таблицы истинности функции, используя цикл #5
Цитата Сообщение от (SkyNet) Посмотреть сообщение
не подскажите что делает 11 -14 строка и оператор >> ?
оператор сдвига битов вправо
на
0
1
2
3
битов соответственно
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
06.03.2012, 04:13     Bool переменные - как записать таблицы истинности функции, используя цикл #6
Xind, логическое ИЛИ и И перепутаны.
Xind
275 / 148 / 7
Регистрация: 05.11.2011
Сообщений: 425
Записей в блоге: 1
06.03.2012, 15:20     Bool переменные - как записать таблицы истинности функции, используя цикл #7
Цитата Сообщение от kazak Посмотреть сообщение
логическое ИЛИ и И перепутаны.
Да, действительно. Подзабыл эти все обозначения.
В таком случае, строка 16 должна быть такой
C++
1
y = !x1 && x3 || x2 && !x4;
(SkyNet)
 Аватар для (SkyNet)
22 / 40 / 6
Регистрация: 25.10.2011
Сообщений: 175
15.03.2012, 02:03  [ТС]     Bool переменные - как записать таблицы истинности функции, используя цикл #8
Вопрос почему для 3 не работает?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include "stdafx.h"
#include <iostream>
 
using namespace std;
 
int main()
{
    bool a, b, c, y;
 
    for(int i = 0; i < 8; i++)
    {
        a = i        & 0xF1;
        b = (i >> 1) & 0xF1;
        c = (i >> 2) & 0xF1;
 
        y = !((b && c) || a) || a;
 
        cout << "| " << a << " " << b << " " << c << " | " << y << endl; 
    }
 
    cin.get();
    return 0;
}
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
15.03.2012, 02:07     Bool переменные - как записать таблицы истинности функции, используя цикл #9
Цитата Сообщение от (SkyNet) Посмотреть сообщение
Вопрос почему для 3 не работает?
Используйте другую маску.
Xind
275 / 148 / 7
Регистрация: 05.11.2011
Сообщений: 425
Записей в блоге: 1
15.03.2012, 11:03     Bool переменные - как записать таблицы истинности функции, используя цикл #10
Цитата Сообщение от (SkyNet) Посмотреть сообщение
Вопрос почему для 3 не работает?
Работает. Только вы перепутали порядок битов.

У вас c - это аргумент a, и наоборот a - c
Проверте так:
C++
1
cout << "| " << c << " " << b << " " << a << " | " << y << endl;
а тут y = !((b && c) || a) || a; должно быть так
C++
1
y = !((b && a) || c) || c;
Смотрите
В цикле применяется i типа int если посмотреть ее битовое представление, то
при i = 0 станет <много нулей> 0000 0000
i = 1 => <много нулей> 0000 0001
i = 2 => <много нулей> 0000 0010
и т.д.

в самой первой программе было предложено представлять порядок битов так
x1 - самый правый бит
x2 - второй бит справа
x3 - третий бит справа
x4 - четвертый бит справа

сделав такой вывод
C++
1
cout << " | " << x4 << " " << x3 << " " << x2 << " " << x1 << " | " << y << " | " << endl;
мы и получаем картинку
Код
 | 0 0 0 0 | 1 | 
 | 0 0 0 1 | 1 | 
 | 0 0 1 0 | 1 | 
 | 0 0 1 1 | 1 | 
 | 0 1 0 0 | 1 | 
. . .
теперь сравните
C++
1
cout << "| " << a << " " << b << " " << c << " | " << y << endl;
с
C++
1
cout << "| " << c << " " << b << " " << a << " | " << y << endl;
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
15.03.2012, 11:08     Bool переменные - как записать таблицы истинности функции, используя цикл #11
Я бы так сделал
Для трех
http://www.cyberforum.ru/cgi-bin/latex.cgi?\bar{x1}x3 + x1\bar{x2}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
 
#define MASK1 0x01 /* 0001 */ 
#define MASK2 0x02 /* 0010 */
#define MASK3 0x04 /* 0100 */
 
int main()
{
   bool x1, x2, x3;
   const std::size_t MAX_COUNT = 8;
   
   for ( std::size_t i = 0 ; i < MAX_COUNT ; ++i )
   {
      x1 = i & MASK1;
      x2 = i & MASK2;
      x3 = i & MASK3;
      
      std::cout << " | " << x1 << " | " << x2 << " | " << x3 << " | \t" << ((!x1 && x3) || (x1 && !x2)) << std::endl;
   }
   
}
http://liveworkspace.org/code/4a7f65...6de95781c89f02
Код
 | 0 | 0 | 0 | 	0
 | 1 | 0 | 0 | 	1
 | 0 | 1 | 0 | 	0
 | 1 | 1 | 0 | 	0
 | 0 | 0 | 1 | 	1
 | 1 | 0 | 1 | 	1
 | 0 | 1 | 1 | 	1
 | 1 | 1 | 1 | 	0
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
15.03.2012, 11:23     Bool переменные - как записать таблицы истинности функции, используя цикл #12
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от go Посмотреть сообщение
так сделал
Обновил:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <algorithm>
#include <iostream>
#include <iterator>
#include <array>
 
bool foo(const std::array<bool, 3> values)
{
   return ((!values[0] && values[2]) || (values[0] && !values[1]));
}
 
int main()
{
   std::array<bool, 3> values;
   
   for (std::size_t i = 0; i < (1U << values.size()); ++i)
   {
      for (std::size_t j = 0; j < values.size(); ++j)
         values[j] = i & (1U << j);
 
      std::copy(std::begin(values), std::end(values), std::ostream_iterator<bool>(std::cout, " | "));
      std::cout << foo(values) << std::endl;
   }
}
http://liveworkspace.org/code/0ca42e...12b5f621754904

Код
0 | 0 | 0 | 0
1 | 0 | 0 | 1
0 | 1 | 0 | 0
1 | 1 | 0 | 0
0 | 0 | 1 | 1
1 | 0 | 1 | 1
0 | 1 | 1 | 1
1 | 1 | 1 | 0
Добавлено через 5 минут
Для четырех соответственно меняем размер массива и добавляем перегруженную функцию:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <algorithm>
#include <iostream>
#include <iterator>
#include <array>
 
bool foo(const std::array<bool, 3> values)
{
   return ((!values[0] && values[2]) || (values[0] && !values[1]));
}
 
bool foo(const std::array<bool, 4> values)
{
   return ((!values[0] && values[2]) || (values[1] && !values[3]));
}
 
int main()
{
   std::array<bool, 4> values;
   
   for (std::size_t i = 0; i < (1U << values.size()); ++i)
   {
      for (std::size_t j = 0; j < values.size(); ++j)
         values[j] = i & (1U << j);
 
      std::copy(std::begin(values), std::end(values), std::ostream_iterator<bool>(std::cout, " | "));
      std::cout << foo(values) << std::endl;
   }
}
Код
0 | 0 | 0 | 0 | 0
1 | 0 | 0 | 0 | 0
0 | 1 | 0 | 0 | 1
1 | 1 | 0 | 0 | 1
0 | 0 | 1 | 0 | 1
1 | 0 | 1 | 0 | 0
0 | 1 | 1 | 0 | 1
1 | 1 | 1 | 0 | 1
0 | 0 | 0 | 1 | 0
1 | 0 | 0 | 1 | 0
0 | 1 | 0 | 1 | 0
1 | 1 | 0 | 1 | 0
0 | 0 | 1 | 1 | 1
1 | 0 | 1 | 1 | 0
0 | 1 | 1 | 1 | 1
1 | 1 | 1 | 1 | 0
BaktybekovK
14 / 14 / 11
Регистрация: 18.04.2015
Сообщений: 72
18.04.2015, 17:51     Bool переменные - как записать таблицы истинности функции, используя цикл #13
Здравствуйте, я использовал первый метод построения таблицы истинности, но только включил это всё в switch, то есть в зависимости от количества логических переменных, строится соответствующий размер таблицы. Для 1, 2, 3 переменных нормально, работает, но вот для 4 и больше таблица строится, и выводится ошибка о завершении программы.
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
18.04.2015, 19:36     Bool переменные - как записать таблицы истинности функции, используя цикл #14
BaktybekovK, Вы бы код показали, по звездам гадать как-то не с руки.
BaktybekovK
14 / 14 / 11
Регистрация: 18.04.2015
Сообщений: 72
19.04.2015, 15:33     Bool переменные - как записать таблицы истинности функции, используя цикл #15
VarNum - Количество булевых переменных.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
switch (VarNum)
{ 
    case 5: 
     BoolVar5();       //Процедура вывода таблицы истинности для 5 переменных
     break;                   
    case 4:
      BoolVar4();            //Процедура вывода таблицы истинности для 4 переменных
      break;                            // Для 5-4 переменных программа вылетает.Вне Switch'а работает.
                              // поэтому для 4-5 переменных оформил в виде процедуры, так работает.
    case 3:
     cout<<"+-----------+\n"
          <<"| "<<BoofStrOpnd[0]<<" | "<<BoofStrOpnd[1]<<" | "<<BoofStrOpnd[2]<<" |\n"  
          <<"|___________|\n";                         //строка из переменных, т е , если функция y=!a&b+c, то
     for(int i = 0; i < pow(2,VarNum); i++)       //то BoofStrOpnd = 'abc'
     {
      arr[VarNum-1] = i        & 0xF1;
      arr[VarNum-2] = (i >> 1) & 0xF1;
          arr[VarNum-3] = (i >> 2) & 0xF1;
          cout<<"| "<<arr[VarNum-3]<<" | "<<arr[VarNum-2]<<" | "<<arr[VarNum-1]<<" | "<<endl;
    }   
    cout<<"+-----------+\n"; 
    break; 
   case 2:
    cout<<"+--------+\n"
    <<"| "<<BoofStrOpnd[0]<<" | "<<BoofStrOpnd[1]<<" | f="<<LogOprt<<" |\n"
    <<"|_________|\n";
    for(int i = 0; i < pow(2,VarNum); i++)
    {
      arr[VarNum-1] = i        & 0xF1;
      arr[VarNum-2] = (i >> 1) & 0xF1;  
          cout<<"| "<<arr[VarNum-2]<<" | "<<arr[VarNum-1]<<" |"<<endl;
    }  
    cout<<"+---------+\n";
    break;
   case 1:
    cout<<"+---------+\n"
         <<"| "<<BoofStrOpnd[0]<<" | f="<<LogOprt<<"|\n"
         <<"|___|_____|\n";
    for(int i = 0; i < pow(2,VarNum); i++)
    {
      arr[VarNum-1] = i        & 0xF1;
          cout<<"| "<<arr[VarNum-1]<<" |  "<< y <<"  |"<<endl;
    }
    cout<<"+---------+\n";
    break;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.04.2015, 19:43     Bool переменные - как записать таблицы истинности функции, используя цикл
Еще ссылки по теме:

C++ Создать программу обработки массивов структур используя структурные переменные и переменные типа объеденения
Переменные типа bool C++
Цикл и переменная типа bool C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
19.04.2015, 19:43     Bool переменные - как записать таблицы истинности функции, используя цикл #16
Цитата Сообщение от BaktybekovK Посмотреть сообщение
но вот для 4 и больше таблица строится, и выводится ошибка о завершении программы
Видимо, у Вас что-то не в порядке в функциями BoolVar4() и BoolVar5().
Yandex
Объявления
19.04.2015, 19:43     Bool переменные - как записать таблицы истинности функции, используя цикл
Ответ Создать тему
Опции темы

Текущее время: 19:18. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru