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

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

20.03.2013, 15:56. Показов 3203. Ответов 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
Модератор
Эксперт по электронике
8979 / 6745 / 921
Регистрация: 14.02.2011
Сообщений: 23,858
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
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru