Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.74/43: Рейтинг темы: голосов - 43, средняя оценка - 4.74
35 / 40 / 15
Регистрация: 25.10.2011
Сообщений: 175
1

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

05.03.2012, 22:15. Показов 8319. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Пусть есть 4 переменых типа bool (x1, x2, x3 ,x4) и логическая функция (y = !x1 x3 + x2!x4) как записать таблицы истинности даной функции используя цыкл?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.03.2012, 22:15
Ответы с готовыми решениями:

Как записать и считать двумерный массив bool используя QTextStream из файла?
Как записать и считать двумерный массив bool используя QTextStream из файла?Необходимо определить...

Можно ли сделать бесконечный цикл с while, используя тип bool?
... bool f; f=false; while(f=false) { ... ... ... if(....)//какое-то условие f=true;//цикл...

Как, используя FileStream, записать в переменные данные в заданном виде...
В документе "in" содержатся данные в таком виде: Как, используя Stream, записать в переменные...

1.Используя таблицы истинности, доказать следующие эквивалентности
фото эквивалентности в вложениях

15
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
05.03.2012, 22:36 2
C++
1
for ( int i = 0 ; i < 16 ; ++i )
0
277 / 150 / 25
Регистрация: 05.11.2011
Сообщений: 429
Записей в блоге: 1
05.03.2012, 23:00 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 |
2
35 / 40 / 15
Регистрация: 25.10.2011
Сообщений: 175
06.03.2012, 01:34  [ТС] 4
не подскажите что делает 11 -14 строка и оператор >> ?
0
5705 / 2296 / 466
Регистрация: 20.11.2009
Сообщений: 7,720
Записей в блоге: 1
06.03.2012, 03:28 5
Цитата Сообщение от (SkyNet) Посмотреть сообщение
не подскажите что делает 11 -14 строка и оператор >> ?
оператор сдвига битов вправо
на
0
1
2
3
битов соответственно
1
3528 / 2686 / 334
Регистрация: 11.03.2009
Сообщений: 6,168
06.03.2012, 04:13 6
Xind, логическое ИЛИ и И перепутаны.
1
277 / 150 / 25
Регистрация: 05.11.2011
Сообщений: 429
Записей в блоге: 1
06.03.2012, 15:20 7
Цитата Сообщение от kazak Посмотреть сообщение
логическое ИЛИ и И перепутаны.
Да, действительно. Подзабыл эти все обозначения.
В таком случае, строка 16 должна быть такой
C++
1
y = !x1 && x3 || x2 && !x4;
0
35 / 40 / 15
Регистрация: 25.10.2011
Сообщений: 175
15.03.2012, 02:03  [ТС] 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;
}
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
15.03.2012, 02:07 9
Цитата Сообщение от (SkyNet) Посмотреть сообщение
Вопрос почему для 3 не работает?
Используйте другую маску.
0
277 / 150 / 25
Регистрация: 05.11.2011
Сообщений: 429
Записей в блоге: 1
15.03.2012, 11:03 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;
1
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
15.03.2012, 11:08 11
Я бы так сделал
Для трех
https://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/... 5781c89f02
Код
 | 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
1
Эксперт С++
5043 / 2622 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 1
15.03.2012, 11:23 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/... f621754904

Код
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
1
15 / 15 / 21
Регистрация: 18.04.2015
Сообщений: 73
18.04.2015, 17:51 13
Здравствуйте, я использовал первый метод построения таблицы истинности, но только включил это всё в switch, то есть в зависимости от количества логических переменных, строится соответствующий размер таблицы. Для 1, 2, 3 переменных нормально, работает, но вот для 4 и больше таблица строится, и выводится ошибка о завершении программы.
0
3528 / 2686 / 334
Регистрация: 11.03.2009
Сообщений: 6,168
18.04.2015, 19:36 14
BaktybekovK, Вы бы код показали, по звездам гадать как-то не с руки.
0
15 / 15 / 21
Регистрация: 18.04.2015
Сообщений: 73
19.04.2015, 15:33 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;
}
0
3528 / 2686 / 334
Регистрация: 11.03.2009
Сообщений: 6,168
19.04.2015, 19:43 16
Цитата Сообщение от BaktybekovK Посмотреть сообщение
но вот для 4 и больше таблица строится, и выводится ошибка о завершении программы
Видимо, у Вас что-то не в порядке в функциями BoolVar4() и BoolVar5().
0
19.04.2015, 19:43
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.04.2015, 19:43
Помогаю со студенческими работами здесь

Используя таблицы истинности, проверить эквивалентность булевых формул. Определить существенные и фиктивные переменны
1. Используя таблицы истинности, проверить эквивалентность булевых формул. Определить существенные...

Построение таблицы истинности по заданной логической функции
Помогите, пожалуйста)) 1.Построение таблицы истинности по заданной логической функции...

Таблицы истинности и логические функции, очень интересно
Доброго времени суток! Изначально у меня были таблицы истинности и названия схем.. Мне дали...

Как достать из массива char переменные типа double, int, bool
Имеется массив char temp. в этот массив записана переменная double (начинается ,например, с temp),...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru