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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
gluchovv
0 / 0 / 0
Регистрация: 27.04.2011
Сообщений: 14
#1

Битовые операции. Консольные формулы - C++

21.07.2014, 14:02. Просмотров 549. Ответов 17
Метки нет (Все метки)

Добрый день. Столкнулся с проблемой перевода формулы к примеру: a^b|a&(a^b), с коннсоли. Если считывать и преобразовывать то компилятор считает коды a и b. Мне надо чтобы это было как формула. т.е. задавать значения а и b и чтобы он по этой формуле выводил результат. Сделать подобие таблицы истиннсти для функции.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.07.2014, 14:02
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Битовые операции. Консольные формулы (C++):

Битовые операции, битовые поля. - C++
Здравствуйте! Еслть 4 диапазона чисел: 0-100, 0-100, 0-6000, 0-3. Сделать в виде битовых операций. Записать в unsigned int. Использовать...

Битовые операции и операции смещения языка С - C++
Доброго времени суток господа,помогите пожалуйста.Есть 2 кода к задаче,первый работает верно(переводит обычные числа в 16-ти ричные),а...

Битовые операции - C++
Помогите, пожалуйста, написать код на C++! Дана последовательность из 8 байт: unsigned char n =...

Битовые операции - C++
помогите написать программу в консоли... я вообще не знаю эту тему и не знаю ка делать... вот, задача.. Создайте программу,...

Битовые операции - C++
Есть код signed int a = 10; a = !a; cout << a; Выводит 0, объясните, почему??

Битовые операции - C++
Доброго времени суток . Вот такая вот задачка : в числе А установить в единицу n битов влево от позиции p, заменить ими m битов числа В,...

17
zss
Модератор
Эксперт С++
6403 / 5969 / 1945
Регистрация: 18.12.2011
Сообщений: 15,384
Завершенные тесты: 1
21.07.2014, 14:56 #2
C++
1
2
3
4
bool a,b;
cin>>a>>b;
bool result=a^b|a&(a^b);
cout<<result;
1
gluchovv
0 / 0 / 0
Регистрация: 27.04.2011
Сообщений: 14
21.07.2014, 15:21  [ТС] #3
да это понятно. мне надо другое. мне надо что-то наподобие таблицы истинности:
через case задаю различные значения для a b. а в консоли не значения a b а саму формулу. которая записывается в массив char. а вот как ее оттуда обрабатывать чтобы она вычислялась. и, bool не сойдет. ~true ~false не false true а -1 -2.

если делать через char то описывать как

C++
1
2
3
4
char a=0, b=0;
char c;
cin>>c; //только в с он запишет не формулу для вычисления, а массив символов...
//вот и как этот массив вычислить?
точнее говоря, я пишу класс вычисления формулы для VCC++, где в TextBox она будет вводиться, далее с массива преобразовываться, вычисляться и на label выводиться результат. на label ~bool выводится как отрицательное значение
0
scripter51
0 / 0 / 0
Регистрация: 21.07.2014
Сообщений: 4
21.07.2014, 15:35 #4
Вам нужно считать массив символов, разделить его на операции и переменные, вручную задать приоритет операций. Я бы разбил на дерево и вычислял так. Автоматом компьютер ничего не заменит).
0
Psilon
Master of Orion
Эксперт .NET
5896 / 4793 / 634
Регистрация: 10.07.2011
Сообщений: 14,407
Записей в блоге: 5
Завершенные тесты: 4
21.07.2014, 15:49 #5
zss, ему нужно распарсить выражение и написать для него таблицу истинности, насколько я понял.

gluchovv, если таК, то это долго и упорно писать свой парсер, разбирать строку на токены. Причем если там есть еще и переменные, то все еще веселее. А у вас они, судя по всему, есть.
0
gluchovv
0 / 0 / 0
Регистрация: 27.04.2011
Сообщений: 14
21.07.2014, 16:03  [ТС] #6
Да, есть, знания лишними не бывают. Можно подробнее?
0
ForEveR
В астрале
Эксперт С++
7978 / 4737 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
21.07.2014, 16:08 #7
gluchovv, Пишем свой интерпретатор языка BASIC почитайте. Там конечно сложнее, но знания ж лишними не бывают.
1
zss
Модератор
Эксперт С++
6403 / 5969 / 1945
Регистрация: 18.12.2011
Сообщений: 15,384
Завершенные тесты: 1
21.07.2014, 16:52 #8
А так
C++
1
2
3
4
5
6
7
int a,b;
for(a=0;a<=1;a++)
for(b=0;b<=1;b++)
{
    bool result=a^b|a&(a^b);
    cout<<a<<'\t'<<b<<'\t'<<result<<endl;
}
1
gluchovv
0 / 0 / 0
Регистрация: 27.04.2011
Сообщений: 14
22.07.2014, 10:35  [ТС] #9
"получение таблицы истиности по логической функции (2, 3, 4 переменные), проверка соответствия заданой таблицы истиности логической функции" - вот задание. я не через цикл, я собирался делать через case. сначала с экрана запрос(осуществлял уже): сколько переменных? в зависимости от ответа будет вызываться разный case, скорее всего напишу функцию принимающее различное кол-во переменных (2, 3 и 4 соответственно). и через case в эту функцию буду генерировать переменные. НО, сама логическая функция вводится в консоли. я не могу заранне её в программе забивать. Нужно из строки её вытаскивать. там может быть любая функция.

Добавлено через 1 минуту
а то что таблица истинности так выводится, знаю. поразрядные операции уже рассматривал. но вот как функцию писать на экране, учитывая что она там в строковом типе, а потом из этой строки в main делать формулу

Добавлено через 17 часов 32 минуты
Ребят, еще чем-нибудь можете помочь? с чего начать хотябы
0
aLarman
642 / 563 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
22.07.2014, 10:43 #10
скапитаню, читаете в стрингу и парсите, нашли соимол, &, |, ^, ~, ищете аргументы, если аргумент содержит еще символ операции то остатки аргумента так же парсите(рекурсия получается, до тех пор пока не получите аргумент), лучше неверное начать с приоритетных операций(поиск их в строке)

Добавлено через 51 секунду
+ учтите что "(" и ")" могут изменить полседовательность выполнения операция, получается даже с поиска скобок надо начать
0
Psilon
Master of Orion
Эксперт .NET
5896 / 4793 / 634
Регистрация: 10.07.2011
Сообщений: 14,407
Записей в блоге: 5
Завершенные тесты: 4
22.07.2014, 10:47 #11
gluchovv, стандартный подход:
берете строку, переводите в обратную польскую нотацию (алгоритм).
затем проходим по полученной записи и вычисляем значение (алгоритм).
1
gluchovv
0 / 0 / 0
Регистрация: 27.04.2011
Сообщений: 14
22.07.2014, 12:12  [ТС] #12
я подобное делал для простой формулы. там мнного текстаа было изза разного расположения символов. в целом, я этот вариант рассматривал, один его минус, оочень много придется делать изза того что 4 разряда, т.е. на входе может быть сумма из 16 произведений аргументов...
0
Psilon
Master of Orion
Эксперт .NET
5896 / 4793 / 634
Регистрация: 10.07.2011
Сообщений: 14,407
Записей в блоге: 5
Завершенные тесты: 4
22.07.2014, 12:23 #13
gluchovv, ну других вариантов нет как бы. Разве что пользоваться сторонней либой, которая будет то же самое делать, но внутри.

То есть ваша задача: получить запись в ОПН, после этого по записи построить дерево операций, а потом просто прогнать его для всех значений переменных.
1
IIARTEMII
20 / 20 / 3
Регистрация: 14.06.2012
Сообщений: 95
Завершенные тесты: 1
22.07.2014, 12:28 #14
Не хочу нудить, но есть такая книженция: "Компиляторы. Принципы, технологии и инструменты"
Там так же и приведён метод постфиксной записи, как сказал Psilon. А ещё там есть простой интерпретатор того, что Вам нужно, только там для + - / *, просто чуток модифицируете это под & | ^ и будет Вам счастье) Да и вообще там очень много интересного - советую почитать)
То, что Вам нужно, реализуется не более, чем в 30 строк кода (не считая ввода и вывода)
2
scripter51
0 / 0 / 0
Регистрация: 21.07.2014
Сообщений: 4
22.07.2014, 13:45 #15
Программа разбора и вычисления значения арифметического выражения
Тут реализация по польской нотации алгебраических выражений. У вас почти то же самое, но нужно реализовать логические операции.

Добавлено через 16 минут
Так же можно с помощью дерева реализовать, на мой взгляд это проще
http://devwiki.beloblotskiy.com/inde...B5%D0%B2%D0%B0
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.07.2014, 13:45
Привет! Вот еще темы с ответами:

Битовые операции - C++
Помогите, пожалуйста с заданием. Никак не могу понять, что да как... Составить две программы, первая из которых вводит составные...

Битовые операции - C++
Добрый день! Помогите пожалуйста написать программу. Дано короткое целое неотрицательное число(2 байта). Выполнить инверсию ...

Битовые операции - C++
Дано задание : Ввести последовательность из 8-ми символов. Если сумма единиц в представлении символа нечетная, то заменить 2 старших бита...

Битовые операции. - C++
подскажите пожалуйста как сделать обратное преобразование после выполнения такого кода st=1; st = (st &gt;&gt; 16) &amp; 0x7fff; как...


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

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
22.07.2014, 13:45
Ответ Создать тему
Опции темы

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