Построчный разбор программы «Управление символом» на goto-ориентированном C++

Исходный код программы состоит всего из 15 строк:

1 int m = 15; 2 int n = 6; 3 aaa: 4 At(m, n); 5 Print(" "); 6 if (IsKey(4)) { 7 m = m - 1; 8 } 9 if (IsKey(5)) { 10 m = m + 1; 11 } 12 At(m, n); 13 Print("+"); 14 Show(); 15 goto aaa;

Блок-схему программы "Управление символом" можно представить следующим образом:

Построчный разбор программы «Управление символом» на goto-ориентированном C++

Рассмотрим что делает каждая строка программы:

1 int m = 15;

Объявляется переменная под названием m. Этой переменной присваивается занчение 15.

2 int n = 6;

Еще одна переменная объявляется, имя новой переменной - n. Ей присваивается значение 6.

3 aaa:

Строка 3 ничего не делает, но в этой строке стоит метка с именем aaa. На эту метку можно переходить при помощи goto.

4 At(m, n);

Курсор перемещается в знакоместо расположенное в столбце m и строке y.

5 Print(" ");

В текущее положение курсора выводится пробел. Если в этом знакоместе до этого был какой-либо текст, он будет заменен на пробел.

6 if (IsKey(4)) {

Сначала вызывается функция IsKey(4), принимающая в качестве аргумента код кнопки и возвращающая значение "истина", если кнопка с этим кодом была нажата между предпоследним и последним вызовами функции Show(). Код 4 соответствует кнопке со стрелкой "налево". Если результат вызова - "истина", то выполняется блок заключенный в фигурные скобки (между 6 и 8 строками).

7 m = m - 1;

Из значения переменной m вычитается 1 и результат снова заносится в переменную m. Но выполняется 7 строка только в случае, если выражение записанное в круглых скобках после ключевого слова if в 6 строке имеет значение "истина".

8 }

Эта строка ничего не делает сама по себе, она содержит лишь закрывающуюся фигурную скобку, обозначающую конец блока кода, начавшегося в конце строки 6.

9 if (IsKey(5)) {

Условный оператор if в строке 9 работает следующим образом: если выражение в круглых скобках имеет значение "ложно" или 0, то блок заключенный в фигурные скобки (открывающаяся в конце 9 строки, закрывающаяся в 11 строке) выполняться не будет и выполнение программы продолжится с 12 строки. Если же выражение в круглых скобках имеет занчение "истина" или отлично от 0, то выполнение продолжится с 10 строки. Вызов IsKey(5) возвращает значение "истина" если за прошлый кадр была нажата кнопка "направо".

10 m = m + 1;

Новое значение переменной m вычисляется как старое плюс один.

11 }

Заканчивается блок кода, начавшийся в строке 9.

12 At(m, n);

Курсор перемещается в знакоместо расположенное в столбце m и строке y. Если за прошлый кадр были нажаты клавиши "налево" или "направо", значение переменной m изменилось после установки курсора в строке 4.

13 Print("+");

В текущее положение курсора выводится плюсик. Если в этом знакоместе до этого был какой-либо текст, он будет заменен на плюсик.

14 Show();

Функция Show() выводит на экран подготовленное изображение и получает в программу обновленное состояние клавиатуры и мышки.

15 goto aaa;

Эта команда безусловного перехода на метку aaa приводит к тому, что выполнение программы продолжается с того места, в котором стоит метка aaa, то есть со строки 3.

Сама по себе программа не очень интересная, но она демонстрирует важный принцип, которым можно пользоваться для перемещения персонажей в играх. Рекомендуется расширить эту программу, добавив возможность перемещения плюсика не только влево-вправо но и вверх-вниз. Коды клавиш со стрелками "вверх" и "вних" - 6 и 7 соответственно.

А если объединить эту программу и программу "муха", то получится уже игра, целью которой может быть поймать муху.

1K1K показов
340340 открытий
57 комментариев

Не пойму: нах ты так цепляешься за этот гоуту? Окей, опустим все его плюсы и минусы, но он совсем не вписывается в стандарт индустрии. Тебя любой лид, в лучшем случае, по рукам за него отпиздит

Ответить

Ты приписываешь мне некое "цепляешься", а я ничего подобного не делаю. if и goto входят в наиболее естественный базис, близкий к тому как работают современные процессоры. Если человек понимает как работает goto, то ему очень легко понять и как работает процессор и как работают for, switch, while и do while, break и continue. А вот обратное не верно.

Ответить

А чем while не устраивает? Просто против системы идёшь?

Ответить

Против какой системы?
Вместо того чтобы придумывать любой алгоритм и просто его превращать в код, отказ от goto требует преодоления дополнительных сложностей, требующих выражения придуманного алгоритма ограниченными средствами. Если задача при этом в том, чтобы научиться создавать правильные алгоритмы, то она просто становится сложнее. А дальше начинаются совсем странные вещи: люди вместо того, чтобы нормально обучать программированию на С++ начинают выдумывать новые языки программирования, на которых программы работают в сотни раз медленнее, специально чтобы было проще учиться, и мы получаем толпы людей, которые вроде как умеют программировать, а вроде как их программы нельзя использовать там где нужна высокая производительность, например в играх.

Ответить

@Splatt чё скажешь?

Ответить

Минус goto - это отсутствие гарантированной проверки, нужно ли делать цикл снова.

Ответить

А преимущество в том что можно передать поток управления в произвольную точку кода, получив не только циклы, а вообще произвольные конструкции

Ответить