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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 5.00
ruTwit
6 / 6 / 1
Регистрация: 04.10.2013
Сообщений: 92
23.01.2014, 13:06     Построение таблицы истинности #1
Нужно построить таблицу истинности. Таблицу программа вроде строит, но строит только до: при 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;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ev_Hyper
 Аватар для Ev_Hyper
1806 / 1627 / 435
Регистрация: 15.12.2013
Сообщений: 5,786
23.01.2014, 13:17     Построение таблицы истинности #2
ruTwit, выкладывайте код, который выдает ошибку

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

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

Добавлено через 2 минуты
Виноват, for все таки нужен.
ValeryS
Модератор
6376 / 4842 / 442
Регистрация: 14.02.2011
Сообщений: 16,045
23.01.2014, 13:20     Построение таблицы истинности #3
Цитата Сообщение от Ev_Hyper Посмотреть сообщение
Виноват, for все таки нужен.
зачем?
чтобы возвести в степень 2?
C++
1
p3=1<<n;
ruTwit
6 / 6 / 1
Регистрация: 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
Ev_Hyper
 Аватар для Ev_Hyper
1806 / 1627 / 435
Регистрация: 15.12.2013
Сообщений: 5,786
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?
ну да, я сразу и подумал что он не нужен. А потом сообразил, что это - такое возведение в степень
ValeryS
Модератор
6376 / 4842 / 442
Регистрация: 14.02.2011
Сообщений: 16,045
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 для целочисленных не определен, нужно приводить
Ev_Hyper
 Аватар для Ev_Hyper
1806 / 1627 / 435
Регистрация: 15.12.2013
Сообщений: 5,786
23.01.2014, 13:28     Построение таблицы истинности #7
Цитата Сообщение от ValeryS Посмотреть сообщение
27=128
что больше int не поддерживает?
конечно поддерживает, но читать такую ТИ с консоли? Смысла нет. Поэтому и остановился на 7.

Добавлено через 1 минуту
Цитата Сообщение от ValeryS Посмотреть сообщение
нарвешься на ошибку что pow для целочисленных не определен, нужно приводить
могу ошибаться, но разве компилятор, в данном случае,не приводит к правильному виду сам?
ruTwit
6 / 6 / 1
Регистрация: 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;
Ev_Hyper
 Аватар для Ev_Hyper
1806 / 1627 / 435
Регистрация: 15.12.2013
Сообщений: 5,786
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
Для продолжения нажмите любую клавишу . . .
ValeryS
Модератор
6376 / 4842 / 442
Регистрация: 14.02.2011
Сообщений: 16,045
23.01.2014, 13:36     Построение таблицы истинности #10
Цитата Сообщение от Ev_Hyper Посмотреть сообщение
могу ошибаться, но разве компилятор, в данном случае,не приводит к правильному виду сам?
нет
потому что есть для double и для float и он не знает к чему приводить
Цитата Сообщение от ruTwit Посмотреть сообщение
В этом цикле не используется m, при этом после окончания цикла m уменьшается до 1,
потому что выходишь за границы массива и затираешь значение m
Показать где или найдешь?
Ev_Hyper
 Аватар для Ev_Hyper
1806 / 1627 / 435
Регистрация: 15.12.2013
Сообщений: 5,786
23.01.2014, 13:37     Построение таблицы истинности #11
Цитата Сообщение от ValeryS Посмотреть сообщение
потому что есть для double и для float и он не знает к чему приводить
Вот так будет правильно?

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

Добавлено через 2 минуты
из-за k?
Ev_Hyper
 Аватар для Ev_Hyper
1806 / 1627 / 435
Регистрация: 15.12.2013
Сообщений: 5,786
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;
}
ruTwit
6 / 6 / 1
Регистрация: 04.10.2013
Сообщений: 92
23.01.2014, 13:55  [ТС]     Построение таблицы истинности #15
Ev_Hyper, но при n>2, числа некоторые повторяются(
Ev_Hyper
 Аватар для Ev_Hyper
1806 / 1627 / 435
Регистрация: 15.12.2013
Сообщений: 5,786
23.01.2014, 14:04     Построение таблицы истинности #16
я сам алгоритм построения ТИ не проверял.
ValeryS
Модератор
6376 / 4842 / 442
Регистрация: 14.02.2011
Сообщений: 16,045
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 уже прошли
Alex5
883 / 618 / 81
Регистрация: 12.04.2010
Сообщений: 1,552
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];
Ev_Hyper
 Аватар для Ev_Hyper
1806 / 1627 / 435
Регистрация: 15.12.2013
Сообщений: 5,786
23.01.2014, 14:12     Построение таблицы истинности #19
Цитата Сообщение от Alex5 Посмотреть сообщение
Верно ли, что должно быть m == ( 2 в степени n ) ?
Это же ТИ. Конечно верно.

Цитата Сообщение от ValeryS Посмотреть сообщение
вот это разнеси по разным строчкам
не разберешь где инициализированные переменные где нет
большая часть из которых избыточна
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.01.2014, 14:16     Построение таблицы истинности
Еще ссылки по теме:

Заполнение таблицы истинности C++
Построение таблицы значений для функции с разбиением отрезков C++
Построение таблицы истинности C++

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

Или воспользуйтесь поиском по форуму:
ValeryS
Модератор
6376 / 4842 / 442
Регистрация: 14.02.2011
Сообщений: 16,045
23.01.2014, 14:16     Построение таблицы истинности #20
Цитата Сообщение от Ev_Hyper Посмотреть сообщение
большая часть из которых избыточна
а вот когда разнесет
увидит что половина это дубли
например
Цитата Сообщение от ruTwit Посмотреть сообщение
p1=n

Не по теме:

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

Yandex
Объявления
23.01.2014, 14:16     Построение таблицы истинности
Ответ Создать тему
Опции темы

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