Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/15: Рейтинг темы: голосов - 15, средняя оценка - 4.73
2 / 2 / 1
Регистрация: 19.09.2012
Сообщений: 106

Вычисление значения логического выражения, состоящего из натуральных чисел, скобок и поразрядных операций

20.03.2013, 15:56. Показов 3221. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Дорогие друзья, помогите написать программу, не могу понять как и даже с чего начать. Можете дать, пожалуйста, код и написать в комментариях что к чему, буду очень благодарен!!! А вот собственно говоря задание:
Написать программу на языке C++ вычисления значения логического выражения, состоящего из натуральных чисел, скобок и поразрядных операций ‘–’ (“не”), ‘&’ (“и”), ‘|’ (“или”). Приоритет у ‘–’ самый высокий, далее идет ‘&’. Самый низкий приоритет у операции ‘|’. Применить стеки для вычисления этого значения.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.03.2013, 15:56
Ответы с готовыми решениями:

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

Найдите значение выражения, состоящего из чисел и операций.
Найдите значение выражения, состоящего из чисел и операций +,-,*. Пример работы программы: 12+2-7-3*4+1 -4 ...

Вычисление значения логического выражения
Написать программу для вычисления значения логического выражения для заданных переменных a=false, b=true, c=false, d=true; а)...

14
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
20.03.2013, 16:14
Вот Вам примерчик:
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
 
int main() {
   
   bool b = ~(1 & (2 | 3));
   
   std::cout << std::boolalpha << b << std::endl;
   
   return 0;
}
Комментарии по Вашему заданию:
1. Не понятно почему при вычислении логического выражения требуется использовать поразрядные операции (а не логические).
2. Побитовая операция дополнения пишется как "~" (тильда).
3. Что значит :
Цитата Сообщение от Eliceyka Посмотреть сообщение
Применить стеки для вычисления этого значения
?
0
2 / 2 / 1
Регистрация: 19.09.2012
Сообщений: 106
20.03.2013, 17:12  [ТС]
Вот Вам примерчик:
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
 
int main() {
   
   bool b = ~(1 & (2 | 3));
   
   std::cout << std::boolalpha << b << std::endl;
   
   return 0;
}
А если нам нужно задавать самим с клавиатуры свои A,B,C как я уже сделал, а еще нам нужно самим задавать формулу по которой считать будем, и еще вопросик. Почему он всегда выводит true, сколько не старался false не добился я???

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#pragma argsused
#include <iostream.h>
#include <conio.h>
 
int main() {
int A,B,C;
cout << "Vvedite peremenie dlya virajeniya (A & (B | C))";
cout << "\nVvedite A\n";
cin >> A;
cout << "Vvedite B\n";
cin >> B;
cout << "Vvedite C\n";
cin >> C;
 
   bool b = ~(A & (B | C));
 
   std::cout << std::boolalpha << b << std::endl;  //Если верно выводим true
 
   getch();
}
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
20.03.2013, 17:27
Цитата Сообщение от Eliceyka Посмотреть сообщение
Почему он всегда выводит true, сколько не старался false не добился я
Попробуйте -1 для всех переменных. Это просто может быть не совсем удачный пример я написал
1
2 / 2 / 1
Регистрация: 19.09.2012
Сообщений: 106
20.03.2013, 17:30  [ТС]
Я понимаю что вы и так много для меня сделали, но все же, если вам не трудно помогите пожалуйста закончить с этой программой, нужно чтобы мы сами вводили выражение логическое, как быть? и как это сделать? и не употребили одну операцию "НЕ (-)"
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
20.03.2013, 17:57
Цитата Сообщение от Eliceyka Посмотреть сообщение
Вот Вам примерчик:
Цитата Сообщение от Eliceyka Посмотреть сообщение
bool b = ~(1 & (2 | 3));
а причем здесь bool ?
ты привел побитовую арифметику а не логическую
смотрим(для char)
2|3=3 (00000010 | 00000011= 00000011)
1&3=1 (00000001&00000011=00000001)
~1=-2 (~00000001=11111110)
для побитовой арифметики существуют 4 действия
& "И"
| "ИЛИ"
~ "НЕ" инверсия 0 в 1 1 в 0
^ "исключающие ИЛИ"
есть еще <<сдвиг влево >> сдвиг вправо
для логической арифметики существует 3 действия
&& "И"
|| "ИЛИ"
! "НЕ"
разница между ними в том что побитовая действует над каждым битом, а логическая над всем числом и оперирует двумя значениями "истина"(true !=0) "ложь"(false ==0)
http://cppstudio.com/uchebniki... peracii-c/
http://cppstudio.com/uchebniki... -i-ili-ne/
0
 Аватар для Venzo
127 / 125 / 16
Регистрация: 03.07.2011
Сообщений: 354
20.03.2013, 18:06
В вашей задачи операции обозначаются одним символом (& вместо &&) для удобства - положить на стек символ или массив символов/строку и сравнивать естественно символ или массив символов/строку.
Посмотрите в сторону польской нотации, можно перевести выражение в постфиксную/префиксную форму и вычислить.
0
2 / 2 / 1
Регистрация: 19.09.2012
Сообщений: 106
20.03.2013, 18:07  [ТС]
Цитата Сообщение от Venzo Посмотреть сообщение
В вашей задачи операции обозначаются одним символом (& вместо &&) для удобства - положить на стек символ или массив символов/строку и сравнивать естественно символ или массив символов/строку.
Посмотрите в сторону польской нотации, можно перевести выражение в постфиксную/префиксную форму и вычислить.
Я вот и не понимаю как можно эту задачу объеденить и стек((((
0
 Аватар для Venzo
127 / 125 / 16
Регистрация: 03.07.2011
Сообщений: 354
20.03.2013, 18:13
перевод в постфиксную/префиксную форму с помощью стека (в стеке хранятся операции), вычисление выражения - тоже (в стеке хранятся значения).
0
2 / 2 / 1
Регистрация: 19.09.2012
Сообщений: 106
20.03.2013, 18:15  [ТС]
А есть пример какой-либо??? я бы не прочь глянуть, а то так не совсем понимаю
0
 Аватар для Venzo
127 / 125 / 16
Регистрация: 03.07.2011
Сообщений: 354
20.03.2013, 18:22
На примере арифметических операций.
3 + 4 * 5
в постфиксной форме выглядит так: 3 4 5 * +
вычисляем выражение (идем слева направо)
1. встретили 3 - положили на стек
2. встретили 4 - положили на стек
3. встретили 5 - положили на стек
4. встретили операцию * - вытащили 2 верхних элемента из стека
выполнили над ними операцию *, результат положили на стек
5. встретили операцию + - вытащили 2 верхних элемента из стека
выполнили над ними операцию +, результат положили на стек
6. конец выражения - результат выражения в стеке.

как переводить в постфиксную форму можете поискать, алгоритм найти легко)
0
2 / 2 / 1
Регистрация: 19.09.2012
Сообщений: 106
20.03.2013, 18:27  [ТС]
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
#include <stdio.h>
 int main()
 {
     int stack[1000];  
     // sp = индекс ячейки, куда будет push-иться очередное число
     int sp =0;      // (sp-1) = индекс ячейки, являющейся вершиной стека
     while ( !feof(stdin) ) {
         int c = getchar();
         int x;
         switch (c) {
             case  ' ':
             case '\n':
                 break;
             case '=':
                 printf("Result = %d\n", stack[sp - 1]);  sp--;
                 break;
             case '+':
                stack[sp-2] = stack[sp-2] + stack[sp-1];  sp--;
                break;
             case '-':
                stack[sp-2] = stack[sp-2] - stack[sp-1];  sp--;
                break;
             case '*':
                stack[sp-2] = stack[sp-1] * stack[sp-2];  sp--;
                break;
             case '/':
               stack[sp-2] = stack[sp-2] / stack[sp-1];   sp--;
                break;
             default:
                 ungetc (c, stdin); // вернуть символ обратно в поток
                 if (scanf("%d", &x) != 1) {
                     fprintf(stderr, "Can't read integer\n");
                     return -1;
                 } else {
                     stack[sp] = x;                       sp++;
                 }
         }
     }
     printf("Result = %d\n",stack[sp-1]);
     return 0;
 }
Как его можно переделать под моё задание? чтобы было "НЕ" "ИЛИ" "И"
0
 Аватар для Venzo
127 / 125 / 16
Регистрация: 03.07.2011
Сообщений: 354
20.03.2013, 18:52
меняете знаки + на |, * на && и так далее
1
2 / 2 / 1
Регистрация: 19.09.2012
Сообщений: 106
20.03.2013, 19:01  [ТС]
Спасибо, уже сделал, только про отрицание....ставлю ~ а он выдает ошибку........как еще можно отрицание задать, ведь просто ставя минус это ведь не правильно(((
0
0 / 0 / 1
Регистрация: 13.05.2014
Сообщений: 9
13.05.2014, 11:25
! знак отрицание

Добавлено через 3 минуты
можешь скинуть код, если исправил эту задачу
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.05.2014, 11:25
Помогаю со студенческими работами здесь

Вычисление значения логического выражения
Дорогие друзья, помогите написать программу, не могу понять как и даже с чего начать. Можете дать, пожалуйста, код и написать в...

Вычисление значения логического выражения КНФ
Добрый день! Помогите, пожалуйста. Нужно решить задачу: Написать программу вычисления значения логического выражения в конъюнктивной...

Вычислить точно значение арифметического выражения, состоящего из целых чисел и констант и знаков операций
Вычислить точно значение арифметического выражения ,состоящего из целых чисел и констант и знаков операций ' + - *^ например :...

Работа со стеком. Вычисление значения логического выражения
:работа со стеком: Задача:::В текстовом файле записано без ошибок логическое выражение следующего вида: &lt;лог.выр.&gt;::=true | false...

Вычисление значения логического выражения, заданного в виде строки
Нужно преобразовать строку в логическое выражение. Можно ли это сделать? Вот например это обычная строка: not b or a and b or not c,...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru