Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.64/14: Рейтинг темы: голосов - 14, средняя оценка - 4.64
ruTwit
6 / 6 / 5
Регистрация: 04.10.2013
Сообщений: 92
1

Построение таблицы истинности

23.01.2014, 13:06. Просмотров 2655. Ответов 28
Метки нет (Все метки)

Нужно построить таблицу истинности. Таблицу программа вроде строит, но строит только до: при n=3 и 2^n=8, а если уже будет 4 и 16, выдает ошибку. Помогите найти.
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
#include "stdafx.h"
#include <iostream>
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{
    int m=8, n=3;
    int a[8][3];
    int k=1,i,j,p,p1=n,N=2,p3=1,t;
    for(i=1;i<=n;i++)
        p3=N*p3;
    
    cout<<endl<<p3<<endl;
 
 
    for(i=0;i<m;i++)
        for(j=0;j<n;j++)
            a[i][j]=0;
 
 
 
    for(j=p1-1;j>=0;j--)
    {
        for(i=0+k;i<p3;i++)
        {
            for(t=0;t<k;t++)
            {
                a[i][j]=1;
                i++;
            }
            
        }
            k*=2;
    }
 
 
    for(i=0;i<m;i++)
    {
        for(j=0;j<n;j++)
            cout<<a[i][j]<<" ";
        cout<<endl;
    }
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.01.2014, 13:06
Ответы с готовыми решениями:

Построение таблицы истинности
Здравствуйте. Задание такое: Построить таблицу истинности булевой функции....

Построение таблицы истинности булевой функции от нескольких переменных
Перечитал весь форум, но так и не нашел решения данной задачи, помогите...

Заполнение таблицы истинности
Подскажите пожалуйста, как можно, используя матрицу, заполнить таблицу...

Таблицы истинности булевых функций
Всем добрый день! В данный момент времени пишу программу для реализации...

Построить таблицы истинности следующих высказываний
1) Построить таблицы истинности следующих высказываний: а) A || B, б) A &amp;&amp; B ||...

28
Ev_Hyper
Заблокирован
23.01.2014, 13:17 2
ruTwit, выкладывайте код, который выдает ошибку

C++
1
2
    for(i=1;i<=n;i++)
        p3=N*p3;
for тут не нужен.

Могу предположить, что ошибка связана с тем что вы выходите за границы массива.

Добавлено через 2 минуты
Виноват, for все таки нужен.
0
ValeryS
Модератор
7277 / 5530 / 693
Регистрация: 14.02.2011
Сообщений: 18,734
23.01.2014, 13:20 3
Цитата Сообщение от Ev_Hyper Посмотреть сообщение
Виноват, for все таки нужен.
зачем?
чтобы возвести в степень 2?
C++
1
p3=1<<n;
0
ruTwit
6 / 6 / 5
Регистрация: 04.10.2013
Сообщений: 92
23.01.2014, 13:22  [ТС] 4
Ev_Hyper, ошибка вот здесь, нашел, но как она получается не понимаю. В этом цикле не используется m, при этом после окончания цикла m уменьшается до 1, хотя с ней не работали.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
for(j=p1-1;j>=0;j--)
    {
        for(i=0+k;i<p3;i++)
        {
            for(t=0;t<k;t++)
            {
                a[i][j]=1;
                i++;
            }
            
        }
            k*=2;
            cout<<m<<" "<<n<<endl;
    }
 
    cout<<m<<" "<<n<<endl;
Добавлено через 1 минуту
Цитата Сообщение от ValeryS Посмотреть сообщение
Код C++
1
p3=1<<n;
Да, чтобы возвести в степень n
0
Ev_Hyper
Заблокирован
23.01.2014, 13:24 5
C++
1
2
3
    int n, a[256][8];
    cin>>n;
    int m = pow(2,n);
будет работать до n=7. При желании можно еще расширить

Добавлено через 1 минуту
Цитата Сообщение от ValeryS Посмотреть сообщение
зачем?
чтобы возвести в степень 2?
ну да, я сразу и подумал что он не нужен. А потом сообразил, что это - такое возведение в степень
0
ValeryS
Модератор
7277 / 5530 / 693
Регистрация: 14.02.2011
Сообщений: 18,734
23.01.2014, 13:26 6
Цитата Сообщение от Ev_Hyper Посмотреть сообщение
будет работать до n=7.
27=128
что больше int не поддерживает?
Цитата Сообщение от ruTwit Посмотреть сообщение
Да, чтобы возвести в степень n
ну так я тебе показал
Цитата Сообщение от ValeryS Посмотреть сообщение
C++
1
p3=1<<n;
Добавлено через 1 минуту
Цитата Сообщение от Ev_Hyper Посмотреть сообщение
int m = pow(2,n);
нарвешься на ошибку что pow для целочисленных не определен, нужно приводить
1
Ev_Hyper
Заблокирован
23.01.2014, 13:28 7
Цитата Сообщение от ValeryS Посмотреть сообщение
27=128
что больше int не поддерживает?
конечно поддерживает, но читать такую ТИ с консоли? Смысла нет. Поэтому и остановился на 7.

Добавлено через 1 минуту
Цитата Сообщение от ValeryS Посмотреть сообщение
нарвешься на ошибку что pow для целочисленных не определен, нужно приводить
могу ошибаться, но разве компилятор, в данном случае,не приводит к правильному виду сам?
0
ruTwit
6 / 6 / 5
Регистрация: 04.10.2013
Сообщений: 92
23.01.2014, 13:30  [ТС] 8
Всем спасибо большое за разъяснения, но у меня немного другой вопрос. В этом цикле не используется m, при этом после окончания цикла m уменьшается до 1, хотя с ней не работали и она должна быть равна 16 при n=4 и m=16. Почему так?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
for(j=p1-1;j>=0;j--)
    {
        for(i=0+k;i<p3;i++)
        {
            for(t=0;t<k;t++)
            {
                a[i][j]=1;
                i++;
            }
            
        }
            k*=2;
            cout<<m<<" "<<n<<endl;
    }
 
    cout<<m<<" "<<n<<endl;
0
Ev_Hyper
Заблокирован
23.01.2014, 13:34 9
Цитата Сообщение от ruTwit Посмотреть сообщение
Всем спасибо большое за разъяснения, но у меня немного другой вопрос. В этом цикле не используется m, при этом после окончания цикла m уменьшается до 1, хотя с ней не работали и она должна быть равна 16 при n=4 и m=16. Почему так?
Вы исправили на мой вариант?
Кликните здесь для просмотра всего текста

Код
4

16
16 4
16 4
16 4
16 4
0 0 0 0
0 0 0 1
0 0 1 0
0 0 1 1
0 1 0 0
0 1 1 1
0 1 1 0
0 1 0 1
1 0 1 0
1 1 1 1
1 1 0 0
1 1 1 1
1 1 1 0
1 0 0 1
1 1 1 0
1 1 1 1
Для продолжения нажмите любую клавишу . . .
0
ValeryS
Модератор
7277 / 5530 / 693
Регистрация: 14.02.2011
Сообщений: 18,734
23.01.2014, 13:36 10
Цитата Сообщение от Ev_Hyper Посмотреть сообщение
могу ошибаться, но разве компилятор, в данном случае,не приводит к правильному виду сам?
нет
потому что есть для double и для float и он не знает к чему приводить
Цитата Сообщение от ruTwit Посмотреть сообщение
В этом цикле не используется m, при этом после окончания цикла m уменьшается до 1,
потому что выходишь за границы массива и затираешь значение m
Показать где или найдешь?
2
Ev_Hyper
Заблокирован
23.01.2014, 13:37 11
Цитата Сообщение от ValeryS Посмотреть сообщение
потому что есть для double и для float и он не знает к чему приводить
Вот так будет правильно?

C++
1
int m = pow(2.0,(double)n);
0
ValeryS
Модератор
7277 / 5530 / 693
Регистрация: 14.02.2011
Сообщений: 18,734
23.01.2014, 13:40 12
Цитата Сообщение от Ev_Hyper Посмотреть сообщение
Вот так будет правильно?
да
но второе мог и не приводить
2.0 по умолчанию double
для флоата специальную буковку можно ставить
0
ruTwit
6 / 6 / 5
Регистрация: 04.10.2013
Сообщений: 92
23.01.2014, 13:45  [ТС] 13
ValeryS, вроде понял, но лучше покажите

Добавлено через 2 минуты
из-за k?
0
Ev_Hyper
Заблокирован
23.01.2014, 13:50 14
ruTwit,
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
int main()
{
    int n, a[256][8];
    cin>>n;
    int m = pow(2.0,(double)n);
    int k=1,i,j,t;
 
 
    for(i=0;i<m;i++)
        for(j=0;j<n;j++)
            a[i][j]=0;
 
   for(j=n-1;j>=0;j--)
    {
        for(i=0+k;i<m;i++)
        {
            for(t=0;t<k;t++)
            {
                a[i][j]=1;
                i++;
            }
            
        }
            k*=2;
            cout<<m<<" "<<n<<endl;
    }
 
    for(i=0;i<m;i++)
    {
        for(j=0;j<n;j++)
            cout<<a[i][j]<<" ";
        cout<<endl;
    }
    return 0;
}
1
ruTwit
6 / 6 / 5
Регистрация: 04.10.2013
Сообщений: 92
23.01.2014, 13:55  [ТС] 15
Ev_Hyper, но при n>2, числа некоторые повторяются(
0
Ev_Hyper
Заблокирован
23.01.2014, 14:04 16
я сам алгоритм построения ТИ не проверял.
0
ValeryS
Модератор
7277 / 5530 / 693
Регистрация: 14.02.2011
Сообщений: 18,734
23.01.2014, 14:06 17
Цитата Сообщение от ruTwit Посмотреть сообщение
но лучше покажите
смотри
Цитата Сообщение от ruTwit Посмотреть сообщение
C++
1
int a[8][3];
Цитата Сообщение от ruTwit Посмотреть сообщение
C++
1
2
3
for(j=p1-1;j>=0;j--)
  {
   for(i=0+k;i<p3;i++)
а что такое p3?
это 2n
и вот при 3 у тебя p3 равно 8 укладываемся в размер массива
а при 4 p3 равно 16 уже вылазим
или делай массив динамический
или как Ev_Hyper, зафигачь очень большой
Цитата Сообщение от Ev_Hyper Посмотреть сообщение
C++
1
int n, a[256][8];

Цитата Сообщение от ruTwit Посмотреть сообщение
C++
1
int k=1,i,j,p,p1=n,N=2,p3=1,t;
вот это разнеси по разным строчкам
не разберешь где инициализированные переменные где нет
времена экранов 25х80 уже прошли
0
Alex5
1123 / 784 / 232
Регистрация: 12.04.2010
Сообщений: 2,012
23.01.2014, 14:06 18
Цитата Сообщение от ruTwit Посмотреть сообщение
C++
1
2
int m=8, n=3;
 int a[8][3];
ruTwit, возможная причина ошибки: одну восьмёрку поменяем на 16, а вторую забудем. Лучше сразу написать
C++
1
2
const int m=8, n=3;
int a[m][n];
8 == ( 2 в степени 3 ). Верно ли, что должно быть m == ( 2 в степени n ) ? Если так, то можно написать
C++
1
2
3
const int n = 3;
const int m = 1 << n; // 2 в степени n 
int a[m][n];
0
Ev_Hyper
Заблокирован
23.01.2014, 14:12 19
Цитата Сообщение от Alex5 Посмотреть сообщение
Верно ли, что должно быть m == ( 2 в степени n ) ?
Это же ТИ. Конечно верно.

Цитата Сообщение от ValeryS Посмотреть сообщение
вот это разнеси по разным строчкам
не разберешь где инициализированные переменные где нет
большая часть из которых избыточна
0
ValeryS
Модератор
7277 / 5530 / 693
Регистрация: 14.02.2011
Сообщений: 18,734
23.01.2014, 14:16 20
Цитата Сообщение от Ev_Hyper Посмотреть сообщение
большая часть из которых избыточна
а вот когда разнесет
увидит что половина это дубли
например
Цитата Сообщение от ruTwit Посмотреть сообщение
p1=n

Не по теме:

Цитата Сообщение от Ev_Hyper Посмотреть сообщение
Это же ТИ.
я кстати таки не врубился что за ТИ
какой функции?

0
23.01.2014, 14:16
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.01.2014, 14:16

Программа для построения таблицы истинности булевой функции
Нужно написать программу на C++ для построения таблицы истинности по введённой...

Bool переменные - как записать таблицы истинности функции, используя цикл
Пусть есть 4 переменых типа bool (x1, x2, x3 ,x4) и логическая функция (y = !x1...

построение таблицы
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;cmath&gt; #include &lt;iomanip&gt;...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru