15 / 15 / 21
Регистрация: 18.04.2015
Сообщений: 73
1

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

18.04.2015, 18:08. Показов 8739. Ответов 16
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте.
Задание такое:
Построить таблицу истинности булевой функции. Функция вводится пользователем.
Это часть программы.
BoofStrOpnd - строка из логических переменных (без знаков)
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
switch (VarNum)
    { 
        case 4:
            
                 cout<<"+---------------+\n"
                     <<"| "<<BoofStrOpnd[0]<<" | "<<BoofStrOpnd[1]<<" | "<<BoofStrOpnd[2]<<" | "<<BoofStrOpnd[3]<<" |\n"
                     <<"|_______________|\n";
                 for(int i = 0; i < pow(2,VarNum); i++)
                {
                arr[VarNum-1] =  i          & 0xF1;
                    arr[VarNum-2] = (i >> 1) & 0xF1;
                    arr[VarNum-3] = (i >> 2) & 0xF1;
                    arr[VarNum-4] = (i >> 3) & 0xF1;
                    cout<<"| "<<arr[VarNum-4]<<" | "<<arr[VarNum-3]<<" | "<<arr[VarNum-2]<<" | "<<arr[VarNum-1]<<" |"<<endl;
                }   
                cout<<"+---------------+\n"; 
                break;
        case 3:
                 cout<<"+-----------+\n"
                     <<"| "<<BoofStrOpnd[0]<<" | "<<BoofStrOpnd[1]<<" | "<<BoofStrOpnd[2]<<" |\n"
                     <<"|___________|\n";
                 for(int i = 0; i < pow(2,VarNum); i++)
                {
                    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;
    }
Вопрос такой. Почему для 4х переменных булевой функции программа, построив и заполнив таблицу, завершает программу из-за ошибки. А вот для 3х всё нормально. Ошибка думаю в switch'е, так как протестировав вне него программа работает. Помогите пожалуйста!!!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.04.2015, 18:08
Ответы с готовыми решениями:

Построение таблицы истинности
Нужно построить таблицу истинности. Таблицу программа вроде строит, но строит только до: при n=3 и...

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

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

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

16
11 / 11 / 9
Регистрация: 16.04.2015
Сообщений: 28
18.04.2015, 18:44 2
Здравствуйте.

Как Вы объявляете массив arr ?
0
7785 / 6553 / 2983
Регистрация: 14.04.2014
Сообщений: 28,617
18.04.2015, 18:45 3
arr как объявлен?
0
Эксперт PHP
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
18.04.2015, 20:44 4
BaktybekovK, немного не относится к решению проблемы, но я бы еще на Вашем месте повторяющиеся части вынес за switch.
0
15 / 15 / 21
Регистрация: 18.04.2015
Сообщений: 73
18.04.2015, 20:49  [ТС] 5
arr объявлен как bool. Да, но вынести нечего
0
11 / 11 / 9
Регистрация: 16.04.2015
Сообщений: 28
18.04.2015, 20:55 6
BaktybekovK, покажите строчку кода, где объявляется arr
0
15 / 15 / 21
Регистрация: 18.04.2015
Сообщений: 73
19.04.2015, 15:22  [ТС] 7
C++
1
bool arr[VarNum],y; // Массив для таблицы истинности, VarNum - кол-во переменных, у - булеан
0
11 / 11 / 9
Регистрация: 16.04.2015
Сообщений: 28
19.04.2015, 18:51 8
BaktybekovK, вроде, всё хорошо. Возможно, Вы не правильно выделили память под BoofStrOpnd. Почему бы Вам не поделиться с нами всем кодом, в частности, меня теперь интересует массив BoofStrOpnd. Возможно, Вы выделили память под 3 элемента, а пытаетесь обратиться к четвертому.
0
15 / 15 / 21
Регистрация: 18.04.2015
Сообщений: 73
19.04.2015, 19:10  [ТС] 9
Не до конца. Код немного примитивен. Что-то заполнил методом "вручную".
В коде исключено(пока что), что пользователь введёт неверную функцию, или специально протестирует программу на ошибку.
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
#include <iostream>
#include <cstring>
#include <cctype>
#include <cmath>
using namespace std;
const int N = 15;
int Multyp(int a, int b);
void BoolVar4(void);
void BoolVar5(void);
int VarNum, n;
string BoofStrOpnd,s;
int main()
{
    
    setlocale(LC_ALL, "Russian");
    int OprtNum;
    char ch,LogOprt[N]; 
    bool arr[VarNum],y;
    cout<<"\tвведи функцию\n";;
    cin>>LogOprt;
    cout<<"\n\Ваша функция - y = "<<LogOprt<<endl;
    BoofStrOpnd="";
    for (int i = 0; i < strlen(LogOprt); i++)
    {
        if (isalpha(LogOprt[i])) 
        {
            BoofStrOpnd += LogOprt[i];
            VarNum++;
        }
    }
    for (int i = 0; i < strlen(LogOprt); i++)
    {
        if (!isalpha(LogOprt[i])) 
        {
            BoofStrOprt += LogOprt[i];
            OprtNum++;
        }
    }
    cout<<endl<<endl<<endl;
    switch (VarNum)
    { 
        case 5: 
                BoolVar5();
                break;
        case 4:
                BoolVar4();         
                break;
            
        case 3:
                 cout<<"+-----------+\n"
                     <<"| "<<BoofStrOpnd[0]<<" | "<<BoofStrOpnd[1]<<" | "<<BoofStrOpnd[2]<<" |\n"
                     <<"|___________|\n";
                 for(int i = 0; i < pow(2,VarNum); i++)
                {
                    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;
                    switch (OprtNum)
                    {
                        case 1:
                                if (BoofStrOprt[0] == '&') y = arr[VarNum-2] && arr[VarNum-1];
                                if (BoofStrOprt[0] == '+') y = arr[VarNum-2] || arr[VarNum-1];
                                if (BoofStrOprt[0] == '>') y = !arr[VarNum-2] || arr[VarNum-1];
                                if (BoofStrOprt[0] == '~') y = (!arr[VarNum-2] || arr[VarNum-1]) && (arr[VarNum-2] || !arr[VarNum-1]);
                                if (BoofStrOprt[0] == '@') y = (!arr[VarNum-2] && arr[VarNum-1]) || (arr[VarNum-2] && !arr[VarNum-1]);
                                if (BoofStrOprt[0] == '|') y = !(arr[VarNum-2] && arr[VarNum-1]);
                    }
                    cout<<"| "<<arr[VarNum-2]<<" | "<<arr[VarNum-1]<<" | "<<y<<"  | "<<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;
                    if (OprtNum) y = !arr[VarNum-1]; else y = arr[VarNum-1];
                    cout<<"| "<<arr[VarNum-1]<<" |  "<< y <<"  |"<<endl;
                }
                cout<<"+---------+\n";
                break;
        default: cout<<"Ñëèøêîì áîëüøîå âûñêàçûâàíèå";
    }
}
int Multyp(int a,int b)
{
    return a*b;
}
void BoolVar4(void)                                              //процедура вывода таблицы ист для 4 переменных(без функции)
{
    bool arr4[4];   
    cout<<VarNum<<endl;
    cout<<"+---------------+\n"
        <<"| "<<BoofStrOpnd[0]<<" | "<<BoofStrOpnd[1]<<" | "<<BoofStrOpnd[2]<<" | "<<BoofStrOpnd[3]<<" |\n"
        <<"|_______________|\n";
    for(int i = 0; i < pow(2,VarNum); i++)
    {
        arr4[VarNum-1] = i        & 0xF1;
        arr4[VarNum-2] = (i >> 1) & 0xF1;
        arr4[VarNum-3] = (i >> 2) & 0xF1;
        arr4[VarNum-4] = (i >> 3) & 0xF1;
        cout<<"| "<<arr4[VarNum-4]<<" | "<<arr4[VarNum-3]<<" | "<<arr4[VarNum-2]<<" | "<<arr4[VarNum-1]<<" |"<<endl;
    }   
    cout<<"+---------------+\n"; 
}
void BoolVar5(void)                                                             //процедура вывода таблицы ист для 5 переменных(без функции)
{
    bool arr5[5];
    cout<<"+-------------------+\n"
        <<"| "<<BoofStrOpnd[0]<<" | "<<BoofStrOpnd[1]<<" | "<<BoofStrOpnd[2]<<" | "<<BoofStrOpnd[3]<<" | "<<BoofStrOpnd[4]<<" |\n"
        <<"|___________________|\n";
    for(int i = 0; i < 32; i++)
    {
        arr5[VarNum-1] = i        & 0xF1;
        arr5[VarNum-2] = (i >> 1) & 0xF1;
        arr5[VarNum-3] = (i >> 2) & 0xF1;
        arr5[VarNum-4] = (i >> 3) & 0xF1;
        arr5[VarNum-5] = (i >> 4) & 0xF1;
        cout<<"| "<<arr5[VarNum-5]<<" | "<<arr5[VarNum-4]<<" | "<<arr5[VarNum-3]<<" | "<<arr5[VarNum-2]<<" | "<<arr5[VarNum-1]<<" |"<<endl;
    }   
    cout<<"+-------------------+\n";
}
0
7785 / 6553 / 2983
Регистрация: 14.04.2014
Сообщений: 28,617
19.04.2015, 19:15 10
Откуда берётся значение VarNum?
Вообще это нестандарт, задавать размер массива не константой. Надо new использовать.
0
15 / 15 / 21
Регистрация: 18.04.2015
Сообщений: 73
19.04.2015, 19:17  [ТС] 11
Она зависит от длины строки кол-ва переменных. Т.е. если, функция y = x&y+z. То строка переменных BoofStrOpnd = 'xyz' , а её длина и есть VarNum
0
7785 / 6553 / 2983
Регистрация: 14.04.2014
Сообщений: 28,617
19.04.2015, 19:25 12
Вот самое начало программы. Какого размера будет массив?
C++
1
2
3
4
5
6
7
8
int VarNum, n;
string BoofStrOpnd,s;
int main()
{
    setlocale(LC_ALL, "Russian");
    int OprtNum;
    char ch,LogOprt[N]; 
    bool arr[VarNum],y;
0
15 / 15 / 21
Регистрация: 18.04.2015
Сообщений: 73
19.04.2015, 19:29  [ТС] 13
То есть вы предлагаете, объявить булевский массив после определения VarNum'a?
Перед непосредственным использованием ? Тогда и будет определён размер.
0
11 / 11 / 9
Регистрация: 16.04.2015
Сообщений: 28
19.04.2015, 19:58 14
Что-то я не пойму, как эта программа у Вас, BaktybekovK, смогла выдать правильный результат. Вы объявляете глобальную переменную VarNum, которая инициализируется начальным значением 0. Затем Вы резервируете память под массив arr, состоящий из 0 элементов. После чего Вы обращаетесь к несуществующим элементам массива.

Или я что-то упустил?
0
7785 / 6553 / 2983
Регистрация: 14.04.2014
Сообщений: 28,617
19.04.2015, 20:05 15
К моменту объявления VarNum должна содержать корректное значение.
0
15 / 15 / 21
Регистрация: 18.04.2015
Сообщений: 73
19.04.2015, 21:58  [ТС] 16
Ладно, с этим разобрался, помогите мне теперь с функцией. Как функцию лучше записать(функция любая)? Будет ли лучше, если я считаю всю введённую строку и начну её посимвольно разбирать и затем начну в зависимости от символов писать функцию или же есть другой путь.
0
45 / 21 / 6
Регистрация: 28.02.2013
Сообщений: 194
20.04.2015, 11:51 17
Мне кажется эта брошурка как рас об этом.
http://www.rogp.hec.ulg.ac.be/... /PartI.pdf

Добавлено через 13 минут
не, отбой. книга может и хорошая, но в оглавлении под 1000стр, а в пдфе только 80

Добавлено через 2 минуты
вот интересные алгоритмы на русском
http://algolist.manual.ru/syntax/parsear.php

Добавлено через 1 минуту
точнее на уровень выше
http://algolist.manual.ru/syntax/
0
20.04.2015, 11:51
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.04.2015, 11:51
Помогаю со студенческими работами здесь

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

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

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

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


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

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

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