М
Молодежь
К
Компьютеры-и-электроника
Д
Дом-и-сад
С
Стиль-и-уход-за-собой
П
Праздники-и-традиции
Т
Транспорт
П
Путешествия
С
Семейная-жизнь
Ф
Философия-и-религия
Б
Без категории
М
Мир-работы
Х
Хобби-и-рукоделие
И
Искусство-и-развлечения
В
Взаимоотношения
З
Здоровье
К
Кулинария-и-гостеприимство
Ф
Финансы-и-бизнес
П
Питомцы-и-животные
О
Образование
О
Образование-и-коммуникации
elvira2020
elvira2020
07.08.2022 23:58 •  Информатика

Нужна ! ( или хотя бы объясните, как из обычной получить постфиксную форму. вот, , которые нужно переделать в постфиксной форме: 1. (a+b)*(c+2*d) 2.(2*a-3*d)*c+2*b 3.(a+b+2*c)*d 4. 3*a - (2*b+c) * d

👇
Ответ:
лунтик56
лунтик56
07.08.2022
Постфиксная (она же - обратная польская запись, польская - потому что введена польским математиком Яном Лукашевичем) - это запись, в которой сначала следуют операнды, а затем знаки операций. Удобна для организации вычислений, потому что не требует для записи скобок и может вычисляться по мере считывания. Для преобразования обычной записи в польскую удобно использовать логическую структуру, называемую стеком (stack).
Поскольку нам не надо составлять алгоритм, а только перевести привычную запись в постфиксную, при переводе будем просто рассуждать.
1. (a+b)*(c+2*d)
Первая операция - a+b. Её постфиксная запись (далее - ПЗ) выглядит как ab+
и понимается так: "взять а, взять b, сложить"
Следующая операция 2*d, в ПЗ это 2d*. Т.е по сути мы меняем местами знак операции и второй операнд.
Третья операция - вычисление c+2*d. В ПЗ мы запишем (с учетом предыдущего) 2d*c+. У нас уже была операция 2d*, теперь мы прибавляем к результату c.
Содержимое обоих скобок вычислено, осталось выполнить умножение.
Получаем в ПЗ: ab+2d*c+*
Как это будет вычисляться?
Считываем a. Считываем b. Считываем знак операции +. Выполняем операцию, получая a+b. Обозначим результат R и тогда текущее состояние вычисляемого выражения будет R2d*c+*
Считываем 2. Считываем d. Считываем знак операции * (заметим, что читать надо, пока не встретим знак операции). Перемножаем два операнда, предшествующие операции. Получаем S=2*d. Текущее состояние вычисляемого выражения будет RSc+*
Считываем операнд с. Считываем знак операции +. Складываем два операнда, предшествующие операции. Получаем S=S+c. Почему не вводим новой переменной? Потому что один из операндов - временная переменная, следовательно её прежнее значение не нужно. Текущее состояние вычисляемого выражения будет RS*
Считываем знак операции *. Перемножаем два операнда, предшествующие операции. Получаем R=R*S. Все выражение просмотрено, следовательно вычисление завершено.
Второй пример не будем столь подробно разбирать.
2. (2*a-3*d)*c+2*b
Тут операции в ПЗ будут 2a*, 3d*, 2a*3d*- (первая скобка), далее 2a*3d*-с*, 2b* и окончательно 2a*3d*-c*2b*+
Читаем: 2 и a умножить, 3 и d умножить, из первого произведения вычесть второе, результат и с умножить, 2 и b умножить и два последних результат сложить. Все верно.
3. (a+b+2*c)*d
ab+, 2c*, вся скобка ab+2c*+, окончательно ab+2c*+d*
4. 3*a-(2*b+c)*d
В ПЗ: 3a*2b*c+d*-
Проверим: 3 и a умножить, запомнить, 2 и b умножить, с прибавить, на d умножить, из запомненного вычесть. Все верно.
4,8(39 оценок)
Открыть все ответы
Ответ:
raisa55555555
raisa55555555
07.08.2022
Если на C++, то вот процедуры:
если с библиотеки graphics.h
x и y нужно передавать левого верхнего угла буквы

#include <graphics.h>
#include <stdio.h>
#include <conio.h>
int x=50,y=50;
void M(int x,int y)
{ // длина буквы 44, высота тоже 44
x+=50;
line(x,y,x,y+44);
line(x,y,x+22,y+44);
line(x+22,y+44,x+44,y);
line(x+22,y+44,x+44,y+44);
}
void I(int x,int y)
{ // длина буквы 22, высота тоже 44
x+=28;
line(x,y,x,y+44);
line(x,y+44,x+22,y);
line(x+22,y,x+22,y+44);
}
void R(int x,int y)
{ // длина буквы 22, высота тоже 44
x+=28;
line(x,y,x,y+44);
line(x,y,x+22,y);
line(x,y+22,x+22,y+22);
line(x+22,y,x+22,y+22);
}

main()
{
initwindow(800,600);
M(x,y); I(x,y); R(x,y);
x=50;y=100;
R(x,y); I(x,y); M(x,y);
x=50;y=150;
M(x,y); I(x,y); M(x,y);
getch();
closegraph();
}

P.S. я старался
4,8(91 оценок)
Ответ:
Если на C++, то вот процедуры:
если с библиотеки graphics.h
x и y нужно передавать левого верхнего угла буквы

#include <graphics.h>
#include <stdio.h>
#include <conio.h>
int x=50,y=50;
void M(int x,int y)
{ // длина буквы 44, высота тоже 44
x+=50;
line(x,y,x,y+44);
line(x,y,x+22,y+44);
line(x+22,y+44,x+44,y);
line(x+22,y+44,x+44,y+44);
}
void I(int x,int y)
{ // длина буквы 22, высота тоже 44
x+=28;
line(x,y,x,y+44);
line(x,y+44,x+22,y);
line(x+22,y,x+22,y+44);
}
void R(int x,int y)
{ // длина буквы 22, высота тоже 44
x+=28;
line(x,y,x,y+44);
line(x,y,x+22,y);
line(x,y+22,x+22,y+22);
line(x+22,y,x+22,y+22);
}

main()
{
initwindow(800,600);
M(x,y); I(x,y); R(x,y);
x=50;y=100;
R(x,y); I(x,y); M(x,y);
x=50;y=150;
M(x,y); I(x,y); M(x,y);
getch();
closegraph();
}

P.S. я старался
4,5(61 оценок)
Это интересно:
Новые ответы от MOGZ: Информатика
logo
Вход Регистрация
Что ты хочешь узнать?
Спроси Mozg
Открыть лучший ответ