Это команда rpntutorial, которую можно запустить в бесплатном хостинг-провайдере OnWorks, используя одну из наших многочисленных бесплатных онлайн-рабочих станций, таких как Ubuntu Online, Fedora Online, онлайн-эмулятор Windows или онлайн-эмулятор MAC OS.
ПРОГРАММА:
ИМЯ
rpntutorial - Чтение выражений RPN RRDtool от Стива Рейдера
ОПИСАНИЕ
Это руководство должно помочь вам разобраться с выражениями RPN RRDtool, как показано в CDEF.
аргументы графа RRDtool.
Reading сравнение Операторы
Логические операторы LT, LE, GT, GE и EQ RPN не так сложны, как кажется. Эти
операторы воздействуют на два значения в стеке, предшествующем им (слева). Прочтите эти два
значения в стеке слева направо, вставив оператор посередине. Если
результирующий оператор верен, затем замените три значения из стека на "1". Если
утверждение, если ложно, замените три значения на «0».
Например, подумайте о «2,1, GT». Это выражение RPN можно читать как "больше двух
чем один? »Ответ на этот вопрос« Верно ». Таким образом, три значения следует заменить
с «1». Таким образом, выражение RPN 2,1, GT оценивается как 1.
Теперь рассмотрим «2,1, LE». Это выражение RPN можно читать как "на два меньше или равно
one? ". Естественный ответ -" нет ", и, таким образом, выражение RPN 2,1, LE оценивается как 0.
Reading IF оператор
Логический оператор IF RPN также может быть простым. Ключом к чтению операторов ЕСЛИ является
чтобы понять, что условная часть традиционной нотации «если X, чем Y, иначе Z» имеет
* уже * были оценены. Таким образом, оператор IF воздействует только на одно значение в стеке:
третье значение слева от значения ЕСЛИ. Второе значение слева от IF
соответствует истинной («Y») ветви. И первое значение слева от ЕСЛИ
соответствует ложной («Z») ветви. Прочтите выражение RPN "X, Y, Z, IF" слева направо.
вот так: "если X, то Y, иначе Z".
Например, рассмотрим «1,10,100, ЕСЛИ». Мне это кажется странным. Но когда я читаю «если 1, то
10 else 100 "совершенно ясно: 1 верно, поэтому ответ - 10. Обратите внимание, что только ноль
ложный; все остальные значения верны. «2,20,200, ЕСЛИ» («если 2, то 20, иначе 200») оценивается как
20. И «0,1,2, IF» («если 0, то 1, иначе 2) оценивается как 2.
Обратите внимание, что ни один из приведенных выше примеров не моделирует целиком «если X, то Y, иначе Z»
утверждение. Это потому, что компьютерные программисты читают это утверждение как «если бы какое-то условие
затем Y, иначе Z ". Поэтому важно уметь читать операторы IF вместе с LT, LE,
Операторы GT, GE и EQ.
Некоторые Примеры
Хотя составные выражения могут выглядеть слишком сложными, их можно рассматривать элегантно.
просто. Чтобы быстро понять выражения RPN, вы должны знать алгоритм вычисления
Выражения RPN: повторять поиск слева направо в поисках оператора.
Когда он найден, примените этот оператор, вытащив оператор и некоторое количество значений.
(и по определению не операторы) вне стека.
Например, стек «1,2,3, +, +» получает оценку «2,3, +» (как «2 + 3») во время первого
итерация и заменяется на 5. В результате получается стек «1,5, +». Наконец, "1,5, +"
оценивается, что дает ответ 6. Для удобства полезно написать этот набор
операции как:
1) 1,2,3, +, + eval равно 2,3, + = 5 результат 1,5, +
2) 1,5, + eval равно 1,5, + = 6 результат 6
3) 6
Давайте использовать эту нотацию для удобного решения некоторых сложных выражений RPN с несколькими
логические операторы:
1) 20,10, GT, 10,20, IF eval равно 20,10, GT = 1 результат 1,10,20, IF
прочтите eval как pop "20 больше 10", поэтому нажмите 1
2) 1,10,20, ЕСЛИ eval равен 1,10,20, ЕСЛИ = 10 результат равен 10
прочтите pop «если 1, то 10, иначе 20», поэтому нажмите 10. Осталось только 10, поэтому 10 - это ответ.
Давайте прочитаем сложное выражение RPN, в котором также есть традиционный оператор умножения:
1) 128,8, *, 7000, GT, 7000,128,8, *, IF eval 128,8, * результат 1024
2) 1024, 7000, GT, 7000,128,8, *, IF eval 1024,7000, результат GT равен 0
3) 0, 7000,128,8, *, IF eval 128,8, * результат 1024
4) 0, 7000,1024, ЕСЛИ результат 1024
Теперь вернемся к первому примеру с несколькими логическими операторами, но заменим значение
20 с переменной input:
1) input, 10, GT, 10, input, IF eval - input, 10, GT (позвольте назвать это A)
Прочтите eval как «если input> 10, то true» и замените «input, 10, GT» на «A»:
2) A, 10, вход, ЕСЛИ eval - А, 10, вход, ЕСЛИ
читать «если А, то 10 иначе вход». Теперь снова замените A подробным описанием
и - вуаля! - у вас есть легко читаемое описание выражения:
если ввод> 10, то 10 иначе ввод
Наконец, вернемся к первому наиболее сложному примеру и заменим значение 128 на
"Вход":
1) input, 8, *, 7000, GT, 7000, input, 8, *, IF eval input, 8, * результат A
где A "ввод * 8"
2) A, 7000, GT, 7000, input, 8, *, ЕСЛИ eval - A, 7000, результат GT - B
где B - «если ((input * 8)> 7000), то истинно»
3) B, 7000, input, 8, *, IF eval is input, 8, * результат C
где C - "ввод * 8"
4) B, 7000, C, ЕСЛИ
Наконец-то у нас есть удобочитаемая расшифровка сложного выражения RPN с переменной:
if ((input * 8)> 7000) then 7000 else (input * 8)
Упражнения
Упражнение 1:
Вычислите «3,2, *, 1, + и« 3,2,1, +, * »вручную. Перепишите их в традиционных обозначениях.
Объясните, почему у них разные ответы.
Ответ 1:
3 * 2 + 1 = 7 и 3 * (2 + 1) = 9. Эти выражения имеют
разные ответы, потому что изменение плюса и
раз операторы изменяют порядок их вычисления.
Упражнение 2:
Может возникнуть соблазн сократить выражение
вход, 8, *, 56000, GT, 56000, вход, *, 8, ЕСЛИ
убрав избыточное использование "input, 8, *", например:
вход, 56000, GT, 56000, вход, ЕСЛИ, 8, *
Используйте традиционные обозначения, чтобы показать, что эти выражения не совпадают. Напишите выражение
это эквивалентно первому выражению, но использует операторы LE и DIV.
Ответ 2:
if (input <= 56000/8) {input * 8} else {56000}
вход, 56000,8, ДЕЛ, LE, вход, 8, *, 56000, ЕСЛИ
Упражнение 3:
Кратко объясните, почему традиционные математические обозначения требуют использования скобок.
Объясните, почему нотация RPN не требует использования скобок.
Ответ 3:
Традиционные математические выражения оцениваются
сначала умножение и деление, затем сложение и
вычитание. Круглые скобки используются для принудительной оценки
сложение перед умножением (и т. д.). РПН не требует
круглые скобки, потому что порядок объектов в стеке
может принудительно вычислить сложение перед умножением.
Упражнение 4:
Объясните, почему разработчикам RRDtool было желательно реализовать вместо этого нотацию RPN.
традиционных математических обозначений.
Ответ 4:
Алгоритм, реализующий традиционные математические
нотация более сложна, чем алгоритм, используемый для RPN.
Таким образом, внедрение RPN позволило Тобиасу Оетикеру писать меньше
код! (Код также менее сложен и, следовательно, менее
скорее всего будут ошибки.)
Используйте rpntutorial онлайн с помощью сервисов onworks.net