Приветствуем, геймер! Ты можешь или
16+
Gamerru_avatar_tali_28122011_3

Плюсатор random 38

173

Учебник по DCPU-16. Часть 2: Условные операторы

В прошлом уроке мы рассмотрели с вами базовые арифметические операции, доступные в DCPU-16 и посмотрели, какие регистры находятся в нашем распоряжении. Теперь приступим к самой «вкусной» и, несомненно, важной теме практически в любом языке программирования – условным операторам.

Условные операторы позволяют создавать ветвления в алгоритмах.

Пример:

Учебник по DCPU-16. Часть 2: Условные операторы
0x10c - Учебник по DCPU-16. Часть 2: Условные операторыУчебник по DCPU-16. Часть 2: Условные операторы

Пояснение: Пусть нам даны некоторые переменные 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.

173
Еще в блоге
Интересное на Gamer.ru

6 комментариев к «Учебник по DCPU-16. Часть 2: Условные операторы»

    Загружается
Чат