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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
Eliceyka
1 / 1 / 0
Регистрация: 19.09.2012
Сообщений: 88
#1

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

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

Дорогие друзья, помогите написать программу, не могу понять как и даже с чего начать. Можете дать, пожалуйста, код и написать в комментариях что к чему, буду очень благодарен!!! А вот собственно говоря задание:
Написать программу на языке C++ вычисления значения логического выражения, состоящего из натуральных чисел, скобок и поразрядных операций ‘–’ (“не”), ‘&’ (“и”), ‘|’ (“или”). Приоритет у ‘–’ самый высокий, далее идет ‘&’. Самый низкий приоритет у операции ‘|’. Применить стеки для вычисления этого значения.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.03.2013, 15:56
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Вычисление значения логического выражения, состоящего из натуральных чисел, скобок и поразрядных операций (C++):

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

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

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

Использование поразрядных операций - C++
Здравствуйте! поразрядные операции отказываются работать в моей системе. Что нужно сделать, чтобы они перестали сопротивляться?

Программирование поразрядных операций - C++
Здравствуйте, у меня есть следующее задание: "Составить две программы, первая из которых вводит составные части структуры данных,...

Вычислить значения логического выражения - C++
Помоги пожалуйста решить. Вычислить значения логического выражения.

14
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
20.03.2013, 16:14 #2
Вот Вам примерчик:
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
Eliceyka
1 / 1 / 0
Регистрация: 19.09.2012
Сообщений: 88
20.03.2013, 17:12  [ТС] #3
Вот Вам примерчик:
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
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
20.03.2013, 17:27 #4
Цитата Сообщение от Eliceyka Посмотреть сообщение
Почему он всегда выводит true, сколько не старался false не добился я
Попробуйте -1 для всех переменных. Это просто может быть не совсем удачный пример я написал
1
Eliceyka
1 / 1 / 0
Регистрация: 19.09.2012
Сообщений: 88
20.03.2013, 17:30  [ТС] #5
Я понимаю что вы и так много для меня сделали, но все же, если вам не трудно помогите пожалуйста закончить с этой программой, нужно чтобы мы сами вводили выражение логическое, как быть? и как это сделать? и не употребили одну операцию "НЕ (-)"
0
ValeryS
Модератор
6652 / 5061 / 470
Регистрация: 14.02.2011
Сообщений: 16,924
20.03.2013, 17:57 #6
Цитата Сообщение от 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/yazyk...ie-operacii-c/
http://cppstudio.com/uchebniki/yazyk...ii-c-i-ili-ne/
0
Venzo
125 / 123 / 4
Регистрация: 03.07.2011
Сообщений: 354
20.03.2013, 18:06 #7
В вашей задачи операции обозначаются одним символом (& вместо &&) для удобства - положить на стек символ или массив символов/строку и сравнивать естественно символ или массив символов/строку.
Посмотрите в сторону польской нотации, можно перевести выражение в постфиксную/префиксную форму и вычислить.
0
Eliceyka
1 / 1 / 0
Регистрация: 19.09.2012
Сообщений: 88
20.03.2013, 18:07  [ТС] #8
Цитата Сообщение от Venzo Посмотреть сообщение
В вашей задачи операции обозначаются одним символом (& вместо &&) для удобства - положить на стек символ или массив символов/строку и сравнивать естественно символ или массив символов/строку.
Посмотрите в сторону польской нотации, можно перевести выражение в постфиксную/префиксную форму и вычислить.
Я вот и не понимаю как можно эту задачу объеденить и стек((((
0
Venzo
125 / 123 / 4
Регистрация: 03.07.2011
Сообщений: 354
20.03.2013, 18:13 #9
перевод в постфиксную/префиксную форму с помощью стека (в стеке хранятся операции), вычисление выражения - тоже (в стеке хранятся значения).
0
Eliceyka
1 / 1 / 0
Регистрация: 19.09.2012
Сообщений: 88
20.03.2013, 18:15  [ТС] #10
А есть пример какой-либо??? я бы не прочь глянуть, а то так не совсем понимаю
0
Venzo
125 / 123 / 4
Регистрация: 03.07.2011
Сообщений: 354
20.03.2013, 18:22 #11
На примере арифметических операций.
3 + 4 * 5
в постфиксной форме выглядит так: 3 4 5 * +
вычисляем выражение (идем слева направо)
1. встретили 3 - положили на стек
2. встретили 4 - положили на стек
3. встретили 5 - положили на стек
4. встретили операцию * - вытащили 2 верхних элемента из стека
выполнили над ними операцию *, результат положили на стек
5. встретили операцию + - вытащили 2 верхних элемента из стека
выполнили над ними операцию +, результат положили на стек
6. конец выражения - результат выражения в стеке.

как переводить в постфиксную форму можете поискать, алгоритм найти легко)
0
Eliceyka
1 / 1 / 0
Регистрация: 19.09.2012
Сообщений: 88
20.03.2013, 18:27  [ТС] #12
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
125 / 123 / 4
Регистрация: 03.07.2011
Сообщений: 354
20.03.2013, 18:52 #13
меняете знаки + на |, * на && и так далее
1
Eliceyka
1 / 1 / 0
Регистрация: 19.09.2012
Сообщений: 88
20.03.2013, 19:01  [ТС] #14
Спасибо, уже сделал, только про отрицание....ставлю ~ а он выдает ошибку........как еще можно отрицание задать, ведь просто ставя минус это ведь не правильно(((
0
mock
0 / 0 / 0
Регистрация: 13.05.2014
Сообщений: 9
13.05.2014, 11:25 #15
! знак отрицание

Добавлено через 3 минуты
можешь скинуть код, если исправил эту задачу
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.05.2014, 11:25
Привет! Вот еще темы с ответами:

Где почитать про перегрузку поразрядных логических операций (|, &, ^) - C++
Здравствуйте. Подскажите пособие, где как можно подробно описывается перегрузка поразрядных логических операций (|, &amp;, ^).

Из простых элементов исходного неупорядоченного массива, состоящего из натуральных чисел, сформировать новый упорядоченный массив. - C++
Ребята нужна помощь!!! Задача такая, нужно разработать программу в процедурном, классовом или модульном виде. 1.Из простых элементов...

Вычисление НОД ряда натуральных чисел - C++
Даны натуральные числа m, n1,...,nm (m&gt;=2). Вычислить НОД (n1,...,nm), воспользовавшись для этого соотношением...

Вычисление значения выражения - C++
Только начал осваивать с++,практически 0 уровень,дали решить задачу,условие: B=sqrt(10*(x^(1/3) + x^(y+2)) * (arcsin^2(z) - |x-y|) ...


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

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

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