|
6 / 6 / 1
Регистрация: 04.01.2017
Сообщений: 465
|
||||||
Ввести символы и собрать из них выражение, которое вычислит значение булевой функции28.03.2017, 20:56. Показов 6100. Ответов 40
Коллеги, доброго времени суток!
Нужна ваша помощь. Учусь на 1-м курсе Факультета математики и информатики. По дискретной математике задали лабораторную работу: нужно написать программу, которая выводила бы значение булевой функции заданной выражением, выражение вводится с консоли, ну например - (x'Vy')'^(x+z) (х отрицание дизъюнкция с у отрицанием всё это тоже отрицание конъюнкция с суммой Жигалкина x и z), ну это как пример. Каждую операцию отдельно просчитать для таблицы истинности не проблема, но как просчитать выражение целиком, которое задаётся вводом с консоли? Создал таблицу истинности для x, y, z. Далее решил создать новый массив, в котором прописать все эти стандартные унарные и бинарные операции в соответствии с таблицой истинности, что бы они автоматически просчитывались. Потом думал каким-то образом вводя символы с клавиатуры собирать эти, уже просчитанные и записанные в массив операции и компоновать их в заданное выражение, но как это сделать не представляю. Нас такому на уроках программирования ещё не учили, подобных примеры в литературе не нашёл (( Даже не знаю возможно ли вызывать из консоли функции прописанные в коде программы, что бы задавать им аргументы здесь же и заставлять их выполнять действия? Помогите пожалуйста!
Можно ли вообще в С++ запускать функции из консоли с нужными параметрами? Если да, то как?
0
|
||||||
| 28.03.2017, 20:56 | |
|
Ответы с готовыми решениями:
40
Составить регулярное выражение, которое считывало бы все символы в строке с 13 по 72 |
|
|
|
| 08.04.2017, 10:04 | |
|
После вычисления выражения для конкретных значений x, y,... оно превращается в один символ 0 или 1.
Естественно, вы должны будете сохранить где-то введенное выражение, а потом восстанавливать его, когда надо будет его вычислять для других значений x, y,... По-моему, это самый легкий способ вычисления. Но если он вам не подходит, то делайте по-своему.
0
|
|
|
6 / 6 / 1
Регистрация: 04.01.2017
Сообщений: 465
|
|
| 08.04.2017, 13:57 [ТС] | |
|
0
|
|
|
|
|
| 08.04.2017, 14:52 | |
|
Вы уже видели, что я туда подставлял символ '0' когда значение ложь, и '1', когда истина. Но если вам это так непривычно, то можете подставлять буквы 'Л' и 'И'. Тогда надо соответственно модифицировать дальнейший алгоритм.
0
|
|
|
6 / 6 / 1
Регистрация: 04.01.2017
Сообщений: 465
|
|
| 08.04.2017, 15:17 [ТС] | |
|
Да, дело не в том, что там 0 и 1 или Л и И. Я не пойму как можно в строку циклом подставлять значения переменных из массива int, который содержит значения этих переменных, вместо символов x, y, z, что бы просчитать значение функции для всех сочетаний?
0
|
|
|
Комп_Оратор)
|
||
| 08.04.2017, 18:20 | ||
|
С консоли вы получаете строку. Потом её нужно распарсить. Я бы создал класс talken который мог бы отразить любую сущность в такой строке. В вашем случае их не много. Это символьное имя (переменная bool), символ операции, знаки аллитерации у вас представлены скобками '(' и ')' После парсинга у вас должен получиться список токенов. Далее имеет смысл написать функцию вычисления которая принимает список токенов и возвращает список токенов. Можно принимать по ссылке а возвращать bool ещё например. Каждый вызов - шаг упрощения. Функция ищет пару старшего приоритета ( скобки наибольшей вложенности если они есть ) и выполняя вычисление заменяет тройку токенов типа x&y одним токеном. Скобки если они окружают один токен удаляются. Рекурсия в таком разборе самый простой алгоритм вычисления. То есть вызываете пока в списке не останется один токен результата. Или пока возвращает true (сама проверяет то есть). Если вы никогда не писали чего-то подобного, то лучше перечитайте задание. Вполне может быть, что тема показалась вам намного страшнее чем там требуется. А вообще тема как таковая - интересна. Особенно в постановке анализа выражения с целью определения его логической эквивалентности другому выражению, выраженному синтаксически иначе. Например x && y || z означает то же самое что и z || y && x. Но могут быть и значительно более сложные. Научить прогу понимать, что это одно и тоже (всегда одинаковый результат не зависимо от x,y,z) это несколько сложнее чем просто научить её разбирать и вычислять выражение. И да, если вы собираетесь использовать именованные переменные, то после ввода строки парсер должен уметь запросить значения найденных им переменных, для построения первого выражения. Две константы типа 'true' 'false' тоже не помешают.
0
|
||
|
6 / 6 / 1
Регистрация: 04.01.2017
Сообщений: 465
|
|||||||||||
| 09.04.2017, 11:11 [ТС] | |||||||||||
|
Добавлено через 2 минуты palva, вы имели в виду следующий алгоритм?
0
|
|||||||||||
|
|
||
| 09.04.2017, 11:23 | ||
|
Задание ведь вам дали для того чтобы вы продемонстрировали владение теми средствами, которые у вас были.
0
|
||
|
Комп_Оратор)
|
||||
| 09.04.2017, 11:31 | ||||
|
и поле - перечисление, указывающее кто этот токен в данной ситуации (три значения соответственно). Это полиморфизм "на коленке". Можно наследованием реализовать тоже, но тогда будет список указателей на базовый токен.
0
|
||||
|
6 / 6 / 1
Регистрация: 04.01.2017
Сообщений: 465
|
||
| 09.04.2017, 14:58 [ТС] | ||
|
Иначе плохи мои дела - я не понимаю.
0
|
||
|
Комп_Оратор)
|
||
| 09.04.2017, 15:47 | ||
|
Посмотрел в свои "закрома" и ужаснулся размеру найденного файла. Давно писал. Потом забросил в гугл:
вот сюда взгляните: https://habrahabr.ru/post/50196/ тут арифметика, но булевы операции это же проще будет? Захотите - разберётесь, надеюсь. и вообще пошарьте по данному запросу. Отпишитесь если что найдёте и разберёте.
1
|
||
|
6 / 6 / 1
Регистрация: 04.01.2017
Сообщений: 465
|
|
| 09.04.2017, 16:03 [ТС] | |
|
IGPIGP, спасибо! Постараюсь разобраться.
0
|
|
|
Комп_Оратор)
|
||
| 09.04.2017, 16:08 | ||
|
Не по теме: Если завтра компилятор заставят писать, - заходите. Мне тоже интересно будет посмотреть. Да-а... Сурово нынче с первокурсниками обходятся.
0
|
||
|
6 / 6 / 1
Регистрация: 04.01.2017
Сообщений: 465
|
||||||
| 11.04.2017, 19:08 [ТС] | ||||||
|
Ребята! Пытаюсь адаптировать код обычного калькулятора (выполняет арифметические операции над числами) под свою задачу. Но не могу понять такой момент в этом коде, каким образом в переменную "token" в функции "get_token()" попадает текущая лексема?
Дело в том, что нигде операции присваивания данной переменной нет, а есть только операция temp = token; (но ведь здесь не присвоение переменной "token" значения, а наоборот temp = token (строки 167-187).В течение работы программы token "очищается", то же не понятно, как? Если token постоянно обнуляется, то где хранятся те лексемы, которые мы уже считали? В стеке памяти?
0
|
||||||
|
Комп_Оратор)
|
||||||
| 11.04.2017, 21:26 | ||||||
|
последний метод чего-то делает.
0
|
||||||
|
6 / 6 / 1
Регистрация: 04.01.2017
Сообщений: 465
|
|
| 11.04.2017, 21:52 [ТС] | |
|
Да, но exp_ptr он помещает выражение целиком, а потом постепенно, разбирая его на лексемы, смещается по этому массиву символов как бы, а разобранные лексемы помещает по одной в token, но как не понятно.
И ещё после того как он проверит лексему он обнуляет token и начинает разбирать следующий символ. А куда деваются уже разобранные лексемы и как они потом воспроизводятся, после погружения рекурсии, тоже не пойму. Где хранятся конечные данные, по которым он в делает в конце окончательный расчёт?
0
|
|
|
Комп_Оратор)
|
||
| 12.04.2017, 00:07 | ||
|
В конце чтобы, - нужно дерево разбора строить. Пока это не понятно туда не нужно Вам.
0
|
||
|
6 / 6 / 1
Регистрация: 04.01.2017
Сообщений: 465
|
||
| 12.04.2017, 08:17 [ТС] | ||
|
Понять бы как он меняет token!
0
|
||
|
Комп_Оратор)
|
|||
| 12.04.2017, 08:31 | |||
|
То есть промежуточных данных по большому счёту (не имея ввиду временные локальные переменные) и нет. Мы из строки делаем строку, но каждый раз меньшего размера.
0
|
|||
|
6 / 6 / 1
Регистрация: 04.01.2017
Сообщений: 465
|
||
| 12.04.2017, 09:53 [ТС] | ||
|
0
|
||
| 12.04.2017, 09:53 | |
|
Регулярное выражение, которое пропускает все символы, кроме пробелов Регулярное выражение, которое убирало бы из строки все символы, не являющиеся буквами Ввести символы, формируя из них стек. Удалить минимальный элемент
Ввести символы, формируя из них стек. Найти минимальный элемент и вставить на его место 0 Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
|
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#.
Название изменил на ColorStep.
Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
|
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами:
- ВидТО (СправочникСсылка. ВидыТО);
- ВидГСМ. . .
|
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала.
Ниже прикреплён. . .
|
|
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F
Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU.
Опрашиваются регистры. . .
|
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка:
Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
|
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо
Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
|
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман.
Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
|