Karel gets fit

Собственные функции, ветвление, логические циклы, бесконечный цикл

Тема лабораторной

На этом занятии вам предстоит продолжать работать с роботом Карлом. Вы будете создавать для Карла простые программы, с помощью которых вы познакомитесь с другими командами и сенсорами робота. Также вы создадите бесконечный цикл.

Objectives

  • Освоить возможность управления роботом с помощью всех доступных команд и сенсоров.
  • Как можно больше использовать собственные функции, if else ветвления и логические циклы.
  • Познакомиться с работой бесконечных циклов
  • Продолжать работать в редакторе Vim

Postup

Step 1: Setup

Task 1.1

Создайте каталог ~/labs/lab03.

Task 1.2

В каталог ~/labs/lab03 скопируйте файл, нужный для компиляции программы робота Карла: Makefile.

У вас в распоряжении следующие команды:

  • cp копирует файлы
  • cp -r копирует не только файлы, но и каталоги (включая и подкаталоги)
  • ls выписать содержимое каталога
  • mkdir _название_ создать каталог
  • cd _название_каталога_ изменить текущий каталог на другой
  • rm -r_название_ стирает все (включая подкаталоги)

Warning

С помощью rm -r nazov можно удалить и то, что вы не хотели. Именно поэтому рекомендуем перед удалениями ввести команду ls в каталоге, чтобы вы были уверены в том, что будет удалено. В командной строке Корзины нет.

Comment

Файл Makefile можете найти в каталоге с прошлого занятия ~/labs/lab02. Не забудьте о том, что его следует скопировать в каталог ~/labs/lab03.

Step 2: Eternal

На этом этапе вы познакомитесь с другими командами и сенсорами робота Карла, а также создадите бесконечный цикл.

Task 2.1

Создайте файл eternal.c, в котором робот будет постоянно ходить меж противоположных стен. Код протестируйте на карте empty.kw.

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

Для увеличения скорости робота можете использовать команду setStepDelay(). Чем меньше значения, тем у Карла более высокая скорость. Изначальная скорость робота - setStepDelay(1000).

Если хотите несколько раз выполнить определенную операцию, вы можете использовать команду loop(), напр.:

loop( 2 ){
    turnLeft();
}

Task 2.2

Измените код eternal так, чтобы Карл постоянно передвигался с севера на юг и обратно, несмотря на то, в какую сторону он смотрел изначально.

В начале программы нужно робота повернуть на юг. Для этого можете использовать такие команды:

  • facingEast() возвращает 1, если робот направляется на восток, в противном случае, возвращает 0
  • notFacingEast() возвращает 1, если робот не направляется na восток, в противном случае, возвращает 0
  • facingWest() возвращает 1, если робот направляется на запад, в противном случае, возвращает 0
  • notFacingWest() возвращает 1, если робот не направляется na запад, в противном случае, возвращает 0
  • facingNorth() возвращает 1, если робот направляется на север, в противном случае, возвращает 0
  • notFacingNorth() возвращает 1, если робот не направляется na север, в противном случае, возвращает 0
  • facingSouth() возвращает 1, если робот направляется на юг, в противном случае, возвращает 0
  • notFacingSouth() возвращает 1, если робот не направляется na юг, в противном случае, возвращает 0

Step 3: Training

Робот Карл хочет принять участие в олимпиаде для роботов (так называемая робоолимпиада). Одна из дисциплин, в которой можно принять участие, это бег с препятствиями. Создайте для Карла программу, с помощью которой он сможет преодолеть трассу с препятствиями. training.kw.

Task 3.1

Создайте программу training.c и сохраните файл карты training.kw.

Task 3.2

Для успешного забега на трассе создайте собственную функцию jumpOver(), с помощью которой робот преодолеет именно одно препятствие. Карл будет перескакивать случайное количество барьеров, пока не достигнет значка на карте.

Начальная позиция

 CORNER  FACING  BEEP-BAG  BEEP-CORNER
 (1, 1)   EAST       0         0
ST.+-----------------------+
 2 | .   .   .   .   .   . |
   |   +   +   +   +   +   |
 1 | > | . | . | . | 1 | . |
   +-----------------------+
     1   2   3   4   5   6   AVE.

Конечная позиция

 CORNER  FACING  BEEP-BAG  BEEP-CORNER
 (5, 1)   EAST       0         1
ST.+-----------------------+
 2 | .   .   .   .   .   . |
   |   +   +   +   +   +   |
 1 | . | . | . | . | > | . |
   +-----------------------+
     1   2   3   4   5   6   AVE.

Step 4: Olympics

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

Task 4.1

Создайте программу olympics.c, которая будет копией training.c.

Можете использовать для этой цели команду:

cp training.c olympics.c

Task 4.2

Измените код программы olympics так, чтобы Карл смог перейти препятствия, которые находятся на случайном расстоянии друг от друга. Карл должен остановиться, когда обнаружит под собой значок. Свой код тестируйте на карте olympics.kw.

Начальная позиция

 CORNER  FACING  BEEP-BAG  BEEP-CORNER
 (1, 1)   EAST       0         0
ST.+---------------------------------------+
 6 | .   .   .   .   .   .   .   .   .   . |
   |                                       |
 5 | .   .   .   .   .   .   .   .   .   . |
   |                                       |
 4 | .   .   .   .   .   .   .   .   .   . |
   |                                       |
 3 | .   .   .   .   .   .   .   .   .   . |
   |                                       |
 2 | .   .   .   .   .   .   .   .   .   . |
   |   +   +       +       +       +   +   |
 1 | > | . | .   . | .   . | 1   . | . | . |
   +---------------------------------------+
     1   2   3   4   5   6   7   8   9   10  AVE.

Конечная позиция

 CORNER  FACING  BEEP-BAG  BEEP-CORNER
 (7, 1)   EAST       0         1
ST.+---------------------------------------+
 6 | .   .   .   .   .   .   .   .   .   . |
   |                                       |
 5 | .   .   .   .   .   .   .   .   .   . |
   |                                       |
 4 | .   .   .   .   .   .   .   .   .   . |
   |                                       |
 3 | .   .   .   .   .   .   .   .   .   . |
   |                                       |
 2 | .   .   .   .   .   .   .   .   .   . |
   |   +   +       +       +       +   +   |
 1 | . | . | .   . | .   . | >   . | . | . |
   +---------------------------------------+
     1   2   3   4   5   6   7   8   9   10  AVE.

Comment

Не забудьте указать правильный файл карты в функции turnOn().

Task 4.3

Измените код программы olympics таким образом, чтобы робот смог преодолевать случайновысокие барьеры. Свой код тестируйте на картах olympics2.kw и olympics3.kw.

Начальная позиция

 CORNER  FACING  BEEP-BAG  BEEP-CORNER
 (1, 1)   EAST       0         0
ST.+---------------------------------------+
 6 | .   .   .   .   .   .   .   .   .   . |
   |               +                       |
 5 | .   .   .   . | .   .   .   .   .   . |
   |               |       +               |
 4 | .   .   .   . | .   . | .   .   .   . |
   |               |       |           +   |
 3 | .   .   .   . | .   . | .   .   . | . |
   |   +           |       |       +   |   |
 2 | . | .   .   . | .   . | .   . | . | . |
   |   |   +       |       |       |   |   |
 1 | > | . | .   . | .   1 | .   . | . | . |
   +---------------------------------------+
     1   2   3   4   5   6   7   8   9   10  AVE.

Конечная позиция

 CORNER  FACING  BEEP-BAG  BEEP-CORNER
 (6, 1)   EAST       0         1
ST.+---------------------------------------+
 6 | .   .   .   .   .   .   .   .   .   . |
   |               +                       |
 5 | .   .   .   . | .   .   .   .   .   . |
   |               |       +               |
 4 | .   .   .   . | .   . | .   .   .   . |
   |               |       |           +   |
 3 | .   .   .   . | .   . | .   .   . | . |
   |   +           |       |       +   |   |
 2 | . | .   .   . | .   . | .   . | . | . |
   |   |   +       |       |       |   |   |
 1 | . | . | .   . | .   > | .   . | . | . |
   +---------------------------------------+
     1   2   3   4   5   6   7   8   9   10  AVE.

Comment

Не забудьте указать правильный файл карты в функции turnOn().

Task 4.4

Измените код программы olympics так, чтобы Карл смог преодолевать на этот раз случайноширокие барьеры. Код тестируйте на картах olympics4.kw и olympics5.kw.

Начальная позиция

 CORNER  FACING  BEEP-BAG  BEEP-CORNER
 (1, 1)   EAST      10         0
ST.+---------------------------------------+
 6 | .   .   .   .   .   .   .   .   .   . |
   |               +                       |
 5 | .   .   .   . | .   .   .   .   .   . |
   |               |       +-------+       |
 4 | .   .   .   . | .   . | .   . | .   . |
   |               |       |       |   +   |
 3 | .   .   .   . | .   . | .   . | . | . |
   |   +---+       |       |       |   |   |
 2 | . | . | .   . | .   . | .   . | . | . |
   |   |   |       |       |       |   |   |
 1 | > | . | .   . | .   . | .   . | 1 | . |
   +---------------------------------------+
     1   2   3   4   5   6   7   8   9   10  AVE.

Конечная позиция

 CORNER  FACING  BEEP-BAG  BEEP-CORNER
 (9, 1)   EAST      10         1
ST.+---------------------------------------+
 6 | .   .   .   .   .   .   .   .   .   . |
   |               +                       |
 5 | .   .   .   . | .   .   .   .   .   . |
   |               |       +-------+       |
 4 | .   .   .   . | .   . | .   . | .   . |
   |               |       |       |   +   |
 3 | .   .   .   . | .   . | .   . | . | . |
   |   +---+       |       |       |   |   |
 2 | . | . | .   . | .   . | .   . | . | . |
   |   |   |       |       |       |   |   |
 1 | . | . | .   . | .   . | .   . | > | . |
   +---------------------------------------+
     1   2   3   4   5   6   7   8   9   10  AVE.

Comment

Не забудьте указать правильный формат карты в функции turnOn().

Additional tasks

Task A.1

Измените код программы olympics так, чтобы Карл "прыгал" через барьеры слева направо, если с начала он смотрел на восток, а если на запад, то наоборот - справа налево. Имплементацию проверьте на карте olympics6.kw.

Начальная позиция

 CORNER  FACING  BEEP-BAG  BEEP-CORNER
 (10, 1)   WEST       0         0
ST.+---------------------------------------+
 6 | .   .   .   .   .   .   .   .   .   . |
   |                   +                   |
 5 | .   .   .   .   . | .   .   .   .   . |
   |                   |   +-------+       |
 4 | .   .   .   .   . | . | .   . | .   . |
   |                   |   |       |       |
 3 | .   .   .   .   . | . | .   . | .   . |
   |   +-----------+   |   |       |   +   |
 2 | . | .   .   . | . | . | .   . | . | . |
   |   |           |   |   |       |   |   |
 1 | . | .   .   . | 1 | . | .   . | . | < |
   +---------------------------------------+
     1   2   3   4   5   6   7   8   9   10  AVE.

Конечная позиция

 CORNER  FACING  BEEP-BAG  BEEP-CORNER
 (5, 1)   WEST       0         1
ST.+---------------------------------------+
 6 | .   .   .   .   .   .   .   .   .   . |
   |                   +                   |
 5 | .   .   .   .   . | .   .   .   .   . |
   |                   |   +-------+       |
 4 | .   .   .   .   . | . | .   . | .   . |
   |                   |   |       |       |
 3 | .   .   .   .   . | . | .   . | .   . |
   |   +-----------+   |   |       |   +   |
 2 | . | .   .   . | . | . | .   . | . | . |
   |   |           |   |   |       |   |   |
 1 | . | .   .   . | < | . | .   . | . | . |
   +---------------------------------------+
     1   2   3   4   5   6   7   8   9   10  AVE.

Task A.2

Дорога, ведущая на территорию Технического университета, за многие года уже успела испортиться и определяется большим (а иногда и меньшим) количеством дыр на ней. Создайте программу road так, чтобы Карл обозначил значком каждую яму, которая еще не обозначена. Дороги, по которым Карлу еще только предстоит пройти: road.kw, road2.kw.

Начальная позиция

 CORNER  FACING  BEEP-BAG  BEEP-CORNER
 (1, 2)   EAST       2         0
ST.+-------------------+
 2 | >   .   .   .   . |
   |---+   +---+   +---|
 1 | . | 1 | . | . | . |
   +-------------------+
     1   2   3   4   5   AVE.

Конечная позиция

 CORNER  FACING  BEEP-BAG  BEEP-CORNER
 (5, 2)   EAST       1         0
ST.+-------------------+
 2 | .   .   .   .   > |
   |---+   +---+   +---|
 1 | . | 1 | . | 1 | . |
   +-------------------+
     1   2   3   4   5   AVE.

Task A.3

Создайте программу stairsbuilder, при помощи которой Карл построит лестницу. Сначала перед Карлом стоит столбик, построенный из значков, количество которых >1. Заданием Карла является построить справа от этого стобика лестницу из значков, при этом на каждой ступеньке количество значков будет всегда на один меньше, чем на предыдущей. Вначале Карлу всегда хватает значков на постройку лестницу, для строительства которой справа от робота всегда есть место. После постройки лестницы Карл должен оказаться на самой верхней ступеньке. Имплементацию опробуйте на картах: stairsbuilder.kw и stairsbuilder2.kw.

Начальная позиция

 CORNER  FACING  BEEP-BAG  BEEP-CORNER
 (1, 3)   NORTH     99         0
ST.+---------------------------+
 6 | .   .   .   .   .   .   . |
   |                           |
 5 | .   .   .   .   .   .   . |
   |                           |
 4 | 5   .   .   .   .   .   . |
   |                           |
 3 | ^   .   .   .   .   .   . |
   |                           |
 2 | .   .   .   .   .   .   . |
   |                           |
 1 | .   .   .   .   .   .   . |
   +---------------------------+
     1   2   3   4   5   6   7   AVE.

Конечная позиция

 CORNER  FACING  BEEP-BAG  BEEP-CORNER
 (1, 4)    WEST     89         5
ST.+---------------------------+
 6 | .   .   .   .   .   .   . |
   |                           |
 5 | .   .   .   .   .   .   . |
   |                           |
 4 | <   4   3   2   1   .   . |
   |                           |
 3 | .   .   .   .   .   .   . |
   |                           |
 2 | .   .   .   .   .   .   . |
   |                           |
 1 | .   .   .   .   .   .   . |
   +---------------------------+
     1   2   3   4   5   6   7   AVE.

Comment

Сутью задания является испытать ваше алгоритмическое мышление. Поэтому, вам нужно решить данную задачу без использования переменных (в том случае, если вы уже с ними знакомы).

Task A.4

В нижнем ряду карты для робота Карла находятся значки в любом количестве. Сперва робот стоит на начале нижнего ряда (дома). Создайте программу mirror, с помощью которой Карл воссоздаст на ряду выше зеркальное отражение нижнего ряда. То есть, количество значков, находящееся слева снизу, будет соответствовать количеству справа вверху и т.д. При этом правдиво, что на нижнем ряду на каждой позиции находится, как минимум, один значок. Решение проверьте на картах: mirror.kw и mirror2.kw.

Начальная позиция

 CORNER  FACING  BEEP-BAG  BEEP-CORNER
 (1, 1)   EAST       0         1
ST.+---------------------------+
 3 | .   .   .   .   .   .   . |
   |                           |
 2 | .   .   .   .   .   .   . |
   |                           |
 1 | >   2   3   4   5   6   7 |
   +---------------------------+
     1   2   3   4   5   6   7   AVE.

Конечная позиция

 CORNER  FACING  BEEP-BAG  BEEP-CORNER
 (1, 2)   WEST       0         1
ST.+---------------------------+
 3 | .   .   .   .   .   .   . |
   |                           |
 2 | <   6   5   4   3   2   1 |
   |                           |
 1 | .   .   .   .   .   .   . |
   +---------------------------+
     1   2   3   4   5   6   7   AVE.

Comment

Сутью задания является испытать ваше алгоритмическое мышление. Поэтому, вам нужно решить данную задачу без использования переменных (в том случае, если вы уже с ними знакомы).

Task A.5

Рутинное занятие программиста состоит из бесконечного редактирования кода и его компиляции. Каждой программе для компиляции нужен свой свод параметров для последующей сборки. Постоянно повторять команду для компиляции непрактично. Повторяющейся сборкой занимается система make, которая знает, какие параметры для сборки программы на самом деле нужны. Напишите свои собственные параметры для сборки в файл Makefile.

Создайте файл Makefile:

vim Makefile

В файл запишите (перейдите в режим вставки с помощью клавиши i):

eternal: eternal.c
    gcc -std=c11 -Wall -Werror eternal.c -lkarel -lcurses -o eternal

Warning

Используйте TAB (не пробелы). В противном случае система make будет выписывать ошибки.

Comment

Некоторые редакторы без предупреждения вместо TAB записывают 4 пробела, что сложно определить сразу. ViM редактор должен опознать работу в Makefile, тем самым предупредив эту проблему. Вы можете заставить редактор ViM писать именно TAB вместо пробелов с помощью команды :set noexpandtab. Все четыре пробелы в начале файла можете заменить командой: bash :%s/^ /\t/g

Смысл 1-2 строк в Makefile следующий:

  • Первая строка - это название цели. Часть перед двоеточием - это название цели (компонент, который должен создаться).
  • Часть после двоеточия - это завимости (компоненты, от которых вы будете отталкиваться).
  • Вторая строка описывает команды, с помощью которой вы получаете цель из зависимостей.

Значение отдельных параметров:

  • -std=c11 Мы будем использовать версию языка С 2011го года
  • -Wall Поскольку, нам интересно вас научить не "только" писать работающий код, а код грамотный, мы хотим получать от компилятора все предупреждения (warnings). Код может работать, несмотря на то, что компилятор выписывает всяческие предупреждения
  • -Werror опция, благодаря которой все предупреждения приобретают статус ошибок, что не позволит получить исполняемый файл
  • eternal.c название файла с кодом, который нужно скомпилировать
  • -o eternal название исполняемого файла на выходе (не обязан иметь расширение .exe)

Comment

В Makefile добавьте цели и для других файлов training.c и olympics.c. Их сборка будет осуществляться с помощью команд make training и make olympics.

Comment

Для копирования строк в редакторе ViM можете перейти в режим выделения (Ctrl+Shift+V). Выделите и скопируйте строки клавишей y, вставьте клавишей p. Совершив ошибку, верните изменения клавишей u.

Comment

Редактор ViM облегчает процесс нахождения ошибок и сборки программы. Программу можно скомпилировать прямо внутри редактора ViM, также сразу перейдя на место возможной ошибки при её появлении.

Additional Resources

  1. Karel Language Reference
  2. Here you can find the original library of Karel the Robot, including the library installation instructions.
  3. Rudolf Pecinovský: Základy algoritmizace - глава 10
  4. Pavel Herout: Učebnice jazyka C (1. díl) - глава 5.1, 5.4, 5.5
  5. Заголовочный файл робота Карла karel.h
  6. Библиотека робота Карла для Windows, для Linux (32bit) и для Linux (64bit)
  7. Библиотека curses для Windows: pdcurses.dll, pdcurses.lib и заголовочные файлы: curses.h, panel.h
  8. Файл для компиляции программ для Карла Makefile
  9. GNU Make Tutorial
  10. ViM Quick Reference Card (.pdf)
  11. Конфигурационный файл Томаша для ViM
  12. Конфигурационный файл Даниела для ViM

Video

Инструкции break и continue с Сюзанной

Ошибка Implicit declaration of function с Эмой

Ошибка Conflicting types for function c Юраем