Учебник по DCPU-16. Часть 2: Условные операторы
В прошлом уроке мы рассмотрели с вами базовые арифметические операции, доступные в DCPU-16 и посмотрели, какие регистры находятся в нашем распоряжении. Теперь приступим к самой «вкусной» и, несомненно, важной теме практически в любом языке программирования – условным операторам.
[cut]
Условные операторы позволяют создавать ветвления в алгоритмах.
Пример:
Пояснение: Пусть нам даны некоторые переменные A, B и C и мы не знаем, чему они равны, да и не особо как-то хочется. Однако, мы точно знаем, что если сумма первых двух будет больше десяти, то нам необходимо быстро и решительно присвоить третьей значение 8, в противном же случае – оставить всё как есть. Для этого служит блок условия “A + B > 10?”: если это утверждение истинно, то мы переходим по левому плечу и выполняем операцию присвоения значения. Иначе – идём в конец программы.
В языке DCPU-16 для обработки разветвлений используются следующие команды:
Код
Команда
Пояснение
0xC
IFE a, b
Следующая после этой команда будет выполнена только если a равняется b
0xD
IFN a, b
Следующая после этой команда будет выполнена только если a не равняется b
0xE
IFG a, b
Следующая после этой команда будет выполнена только если a больше b
Знающим английский запомнить, где какая команда, будет проще:
- IFE– If Equal To (Если равняются…)
IFN– If Not Equal To (Если не равняются…)
IFG– If Greater Than (Если больше, чем…)
Теперь о каждой по порядку.
IFE
Команда IFEпозволяет проверить, равняются ли значения указанных в аргументах регистров.
Приведём следующий пример:
:init
set a, 2
set b, 6
set i, a
add i, b
ife i, 16
set c, 4
ife i, 8
set c, 8
:loop
set PC, loop
- Заметки на полях
Привыкайте делать отступы и вообще следить за красотой кода. Во-первых, вы не будете выглядеть, как перевыпивший Снусмумрик, а во-вторых, такой код будет удобно читать. В DCPU-16 принято делать дополнительные отступы для команд, следующих за условными операторами (посмотрите, как выровнены ifeи следующая за ней set).
Мы устанавливаем значения A и B равными 2 и 6 соответственно. После этого мы суммируем их и результат сохраняем в регистре i. Следом идут две команды разветвлений IFE:
- ■ Первая (ife i, 16) проверяет, равна ли сумма 16. Если равна, то записывает 4 в регистр C.
■ Вторая (ife i, 8) проверяет, равна ли сумма 8. Если равна, то записывает 8 в регистр C.
Несложно сообразить, что после выполнения программы содержимым регистра C окажется число 8 (так как A + B = 8).
* * * * * *
IFN
Команда IFNпозволяет проверить, не равняются ли значения указанных в аргументах регистров.
Замените в прошлом примере IFEна IFNи запустите программу. После завершения исполнения, в регистре C будет находиться число 4.
* * * * * *
IFG
Команда IFGпозволяет проверить, больше ли значение первого указанного в аргументах регистра, чем второго. Важно запомнить порядок: IFGвыполнит следующую за ней командутогда и только тогда, когда A > B.
Решим задачу, о которой шла речь в начале поста:
:init
set a, 1
set b, 4
set c, a
add c, b
ifg c, 10
set c, 8
:loop
set PC, loop
После выполнения программы в регистре будет число 5, поскольку A + B < 10, команда присвоения не выполняется. Теперь измените значение второго регистра на 12 и вновь запустите программу. В регистре будет храниться число 8, хотя сумма A + B равна 13, но поскольку мы использовали IFG, сработала команда set c, 8, которая и изменила значение регистра С.
Пример использования: Ограничение значения
Позже, когда мы будем работать с вводом с клавиатуры, нам может потребоваться ограничивать вводимое пользователем значение.
Предположим, что значение, которое требуется ограничить, записано в регистре А. Нам необходимо, что введённое число было больше 50, но меньше 200. Напишем программу, которая будет это реализовывать:
:init
set a, 150
ifg a, 200
set a, 200
ifg 50, a
set a, 50
:loop
set PC, loop
- Заметки на полях
Если нужно проверить A < B, достаточно просто переставить местами названия регистров. Так,ifg 50, a будет проверять условие 50 > a, то есть меньше ли значение регистра А числа 50.
Запускайте программу. После исполнения кода, в регистре А будет храниться число 150, то есть то, которое было изначально. Это логично, согласитесь: 50 < 150 < 200.
Поиграйтесь с установкой первоначального значения регистром А: поставьте 300 или 25 и увидите, что после того, как программа отработает, в первом случае, в нём будет храниться число 200, а во втором – 50.
За сим разрешите откланяться, удачных сражений с кодом. fr4ntic out.