1 / 1 / 0
Регистрация: 05.11.2015
Сообщений: 7
1

Программа для построения таблицы истинности булевой функции

22.04.2016, 12:18. Показов 6228. Ответов 3

Author24 — интернет-сервис помощи студентам
Нужно написать программу на C++ для построения таблицы истинности по введённой функции, минимум 4 переменные.
Для четырех логических операций: конъюнкция, дизъюнкция, отрицание, импликация
Имеется код JS из методички. Нужен аналог на C++.

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

Пытаюсь писать на классах, но мало смыслю в C++, (и в программировании в общем).
Пока написал только функцию проверки на ошибки.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
for (int i=0; i<this->n; i++){
        //Проверка количества и правильности скобок
        if('('==this->func[i])
            bOpen++;
        if(')'==this->func[i])
            bClose++;
        if(((this->func[i]=='(' && this->func[i+1]==')'))||((this->func[i]==')')&&(this->func[i+1]=='(')))
            this->err = true;
        if(this->func[i]==this->func[i+1]) // Повтор символов
            this->err = true;
    }
    if(this->bOpen!=this->bClose)
        this->err = true;
   return this->err;
Мои наработки на данный момент

logic.h
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
#ifndef LOGIC
#define LOGIC
 
 
class Logic{
private:
    char func[128] = "";
    char solved[128] = "";
    const char symb[4]={'A','B','C','D'};
    const char OP[4]={'&','+','-','!'};
    int bOpen = 0;
    int bClose = 0;
    bool err = 0;
    int n;
    int table[16][4];
public:
    void input();
 
    char solve(int *n1, int *n2);
 
    char output();
 
    bool errors();
};
 
#endif // LOGIC
logic.cpp
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
#include <string.h>
#include <iostream>
#include "logic.h"
 
 
void Logic::input(){
    system("cls");
    strcpy(func, "");
    strcpy(solved, "");
    bOpen = 0;
    bClose = 0;
    err = 0;
    printf("Input function:\n");
    gets(this->func);
    this->n = strlen(this->func);
}
 
bool Logic::errors(){
    for (int i=0; i<this->n; i++){
        //Проверка количества и правильности скобок
        if('('==this->func[i])
            bOpen++;
        if(')'==this->func[i])
            bClose++;
        if(((this->func[i]=='(' && this->func[i+1]==')'))||((this->func[i]==')')&&(this->func[i+1]=='(')))
            this->err = true;
        if(this->func[i]==this->func[i+1]) // Повтор символов
            this->err = true;
    }
    if(this->bOpen!=this->bClose)
        this->err = true;
   return this->err;
}
main.cpp
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>
#include <windows.h>
#include "logic.h"
 
using namespace std;
 
int main()
{
    Logic x;
    for(;;){
    x.input();
 
    if(x.errors()==true){
        system("cls");
        printf("Invalid input\n");
        Sleep(1500);
        continue;
    }
    getchar();
    }
    return 0;
}


Интерфейс к JS:
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
<style>.s1 {font-size:8pt;font-family:Tahoma;}</style>
<body class="s1" onload="f()" TOPMARGIN=0>
<hr><b>Построение таблицы истинности</b>
<br>&copy;  2007  Савченко  Н.В.,  кафедра  СИ,  КИТ-факультет,  НТУ 
"ХПИ" <hr>Логическое выражение ("И" –"&&", "ИЛИ" –"||", "НЕ" –
"!")
<br>f  =  <input  type="text"  name="txt1"  value="a&&b||a&&c||b&&c" 
size=40 class="s1" onchange="f()">&nbsp;
<input  type="button"  name="b1"  value="Вычислить"  onclick="f()" 
class="s1"><br><table border=0 class="s1"><tr>
<td align=center valign=top><span ID="res">&nbsp;</span></td>
</tr></table></body>
Как и обещал, пример из методички на JS:
Javascript
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
<script language="JavaScript">
var maxlname=50, tlname;
var lname = Array (maxlname);
 
function f()
{var i,j,si;
s=document.all.txt1.value;
fncol(s);
sres="<table  border=0  class='s1'  cellspacing=0  cellpadding=3 
style='border:0 thin solid;'>";
sres+="<tr>";
for (i=0;i<tlname;i++) sres+="<td>"+lname[i]+"</td>";
sres+="<td> f </td></tr>";
tlname2=Math.pow(2,tlname);
for (i=0;i<tlname2;i++)
{sres+="<tr>";
z=flog(i,tlname);
dz=z.split("|");
for (j=0;j<tlname;j++) 
{dzj="0"; if (dz[j]=="true") dzj="1";
sres+="<td>"+dzj+"</td>"; 
eval(lname[j]+"="+dz[j]);}
si="0"; if (eval(s)) si="1";
sres+="<td>"+si+"</td></tr>";}
sres+="</table>";
document.all.res.innerHTML=sres;}
 
function  fncol(s)  // Определяем  количество  булевых  переменных  и  их имена
{var sum="",n=s.length;
var i,j,si,flag,ns=0;
for (i=0;i<n;i++)
{si=s.charAt(i);
if ( si=="&" || si=="|" || si=="!" || si=="(" || si==")")
sum+=" ";
else
sum+=si;}
dsum=sum.split(" ");
tlname=0;
for (i=0;i<dsum.length;i++)
if (dsum[i]!="") 
{flag=true;
for (j=0;j<tlname;j++)
if (lname[j]==dsum[i]) {flag=false; break;}
if (flag) {lname[tlname]=dsum[i]; tlname++}}}
 
function  flog(t,z) //  Вычисляем  булево  выражение  при  конкретных
//значениях булевых переменных
{var sum1="",t1,z1=0,i;
t1=t; 
while (t1!=0)
{if (t1%2==0)
sum1="false|"+sum1;
else
sum1="true|"+sum1;
t1=Math.floor(t1/2);
z1++;}
for (i=0;i<(z-z1);i++) sum1="false|"+sum1;
return sum1;}
</script>
Казалось бы всего лишь 59 строк, нужно лишь переписать на плюсы, но не понимаю кода.
Смотрел код одногруппника, немного подсказывал по проверкам. Так у него олучился говнокод на 13тыс строк. Копировал-вставил для каждой переменной и т.д. Понял что хотел писать так-же, и усомнился в правильности выбора
0
22.04.2016, 12:18
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.04.2016, 12:18
Ответы с готовыми решениями:

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

Написать программу для построения таблицы истинности логической функции
Написать программу для построения таблицы истинности логической функции F - ABC Pascal Нужно, чтобы пользователь сам вводил функцию, а...

Написать программу для построения таблицы истинности логической функции F
Выручайте, ребята! Написать программу для построения таблицы истинности логической функции F. Логическая функция должна быть...

3
 Аватар для avgoor
1550 / 875 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
22.04.2016, 13:23 2
Цитата Сообщение от deltaforsing Посмотреть сообщение
Казалось бы всего лишь 59 строк
На C++ так не получится. Нет здесь ничего похожего на eval(). Но 13 тыс строк, это конечно перебор.
0
1 / 1 / 0
Регистрация: 05.11.2015
Сообщений: 7
22.04.2016, 14:16  [ТС] 3
Цитата Сообщение от avgoor Посмотреть сообщение
Нет здесь ничего похожего на eval()
Если я верно понял, eval() считает заданное в строке выражение. В плюсах придётся делать это вручную? Аналога нет?
0
 Аватар для avgoor
1550 / 875 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
22.04.2016, 15:56 4
Цитата Сообщение от deltaforsing Посмотреть сообщение
Аналога нет?
Такое есть только в интерпретируемых языках. В случае с C++, для этого пришлось бы прикладывать к каждой программе компилятор...
0
22.04.2016, 15:56
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.04.2016, 15:56
Помогаю со студенческими работами здесь

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

Написать программу для построения таблицы истинности для нахождения переменной F
Уважаемы знатоки! Помогите пожалуйста не знаю как реализовать в паскале таблицу истинности для нахождения переменной F (B&amp;А⇒А)⊕(C+D). ...

Написать таблицу истинности булевой функции
1. Написать таблицу истинности булевой функции f(x,y,z), заданной формулой. 2. Найти фиктивные переменные данной функции. 3....

Составить таблицу истинности булевой функции
Добрый день! Пожалуйста, помогите разобраться с двумя задачами. 1. Для заданной булевой функции f(x1,x2,x3,x4)=V(0,2,4,5,6,9,11)...

Построить таблицу истинности, найти носитель функции, СДНФ и СКНФ и многочлен Жигалкина булевой функции


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

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

Редактор формул (кликните на картинку в правом углу, чтобы закрыть)
Опции темы

Новые блоги и статьи
Отключение отслеживания файла, занесенного в .gitignore в Git
hw_wired 10.02.2025
Git помогает следить за изменениями в проекте, но иногда требуется исключить определенные файлы из системы контроля версий. Это могут быть конфигурационные файлы с локальными настройками, временные. . .
Что такое use strict в JavaScript
hw_wired 10.02.2025
Директива use strict - способ перевода JavaScript-кода в строгий режим работы, который делает язык более безопасным и предсказуемым. Она появилась в ECMAScript 5 как ответ на многочисленные проблемы,. . .
Как в jQuery проверить, что элемент скрыт
hw_wired 10.02.2025
jQuery предоставляет несколько эффективных способов определить, скрыт элемент или отображается на странице. Самый простой метод использует специальные селекторы :hidden и :visible. Селектор :hidden. . .
Как проверить (check out) ветку Git в удаленном репозитории
hw_wired 10.02.2025
Проверка удаленной ветки в Git требует понимания нескольких базовых концепций и точного выполнения определенной последовательности действий. Для начала необходимо получить актуальную информацию о. . .
chucknorris в HTML и другие обозначения цветов
hw_wired 10.02.2025
HTML, как основной язык разметки веб-страниц, прошел длинный путь развития в плане работы с цветами. На заре развития веб-технологий разработчики могли использовать только базовый набор из 16. . .
Стек и куча: отличия и назначение
hw_wired 10.02.2025
Управление памятью - ключевой элемент работы любой программы. В современных языках программирования память делится на две основные области: стек и кучу. Каждая из них обладает уникальными. . .
Комментарии в JSON
hw_wired 10.02.2025
JSON - текстовый формат обмена данными, построенный на основе синтаксиса JavaScript. Этот формат отличается простотой, читаемостью и широкой поддержкой во всех современных языках программирования. . . .
Перезаписываем локальные файлы с помощью git pull
hw_wired 10.02.2025
Git pull - незаменимая команда для синхронизации локального репозитория с удаленным. При работе над проектом в команде разработчиков часто возникает необходимость получить актуальные изменения,. . .
Оператор --> в C++
hw_wired 10.02.2025
Оператор --> (называемый "spaceship operator" или оператор космического корабля) - важное нововведение в стандарте C++20, упрощающее реализацию операций сравнения в пользовательских типах данных. . . .
Отмена git add до коммита
hw_wired 10.02.2025
Git предлагает несколько методов для отмены индексации файлов перед созданием коммита. Разработчики часто сталкиваются с ситуацией, когда нужно убрать файлы из индекса, не теряя внесенные изменения в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru