2. týždeň

First Steps with Karel the Robot

Собственные функции, ветвления if-else, логические циклы

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

Вы познакомитесь с роботом Карлом и миром, в котором он находится. Создадите для Карла простые программы, с помощью которых освоите его базовые команды.

Objectives

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

Postup

Step 1: Setup

Поддерживайте порядок в ваших каталогах. Файлы, созданные на этом занятии, сохраните в каталоге ~/labs/lab02, где ~ это специальный символ, означающий домашний каталог.

Task 1.1

Подключитесь к серверу zap.kpi.fei.tuke.sk или запустите виртуальную среду.

Вспомните, как работать с файлами. С помощью команды history посмотрите, какие команды вы использовали на прошлом занятии и попробуйте вспомнить, что делает каждая из команд.

Task 1.2

Создайте каталог ~/labs/lab02, в который вы будете сохранять прогресс на занятии и перейдите в него.

Можете использовать следующие команды:

  • ls содержимое каталога
  • mkdir название_каталога создаст новый каталог с именем название_каталога
  • cd название_каталога изменит текущую директорию (в данном случае, на каталог с именем название_каталога)

Task 1.3

Сохраните файл Makefile для Карла. Он нужен, чтобы успешно скомпилировать и собрать программу.

Для загрузки используйте утилиту wget:

wget http://kurzy.kpi.fei.tuke.sk/zap/resources/lib/Makefile

Step 2: Stairs

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

Task 2.1

Сохраните файл карты для Карла stairs.kw.

Для загрузки используйте утилиту wget:

wget http://kurzy.kpi.fei.tuke.sk/zap/resources/worlds/stairs.kw

Командой ls проверьте, все ли нужные файлы доступны:

  • stairs.kw : файл с изначальной позицией Карла
  • Makefile : файл с инструкциями для компиляции программы

Task 2.2

Создайте файл stairs.c со скелетом программы для Карла.

Используйте текстовый редактор ViM:

vim stairs.c
  • В режим ввода перейдите с помощью i или A.
  • Сохраните программу с помощью :w, закрыть и сохранить :wq или Shift+Z+Z.
  • Команды после : можете автодополнять с TAB и вызывать историю команд с помощью стрелочек.

Comment

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

Comment

Удостоверьтесь, что используете английскую раскладку. Написание специальных знаков очень неудобно на русской клавиатуре.

Скелет программы:

#include <karel.h>

int main() {
    turn_on("stairs.kw");

    // your code goes here

    turn_off();

    return 0;
}
  • #include <headerfile.h> Подключение файла заголовка (должен быть в каждой программе)
  • int main() Главная функция программы (в каждой программе должна быть только одна)
  • return 0 Окончание работы функции с возвращаемым значением (в данном случае - окончание программы)
  • turn_on("world.kw") Команда, которая запустит Карла. Команда имеет один обязательный параметр, который является путем к файлу мира, в котором Карл будет выполнять свое задание (должна быть в начале каждой программы робота Карла)
  • turn_off() После выполнения всех шагов в программе эта команда обеспечит правильное завершение работы робота Карла

Comment

Ваша программа будет находиться между строками 4-8.

Comment

В языке программирования C, так, как в большинстве ЯП, названия чувствительны к регистру. Поэтому важно, чтобы имя каждой функции точно соответствовало примеру, например, функция turn_on().

Task 2.3

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

Исходная позиция

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

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

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

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

  • step() Двигает Карла на одну позицию вперед, в зависимости от того, куда смотрит Карл. Если Карл пытается двигаться в том направлении, в котором он не может (препятствие на краю света), программа завершается
  • pick_beeper() Если робот Карл стоит на позиции, на которой есть значок, Карл его подберет и положит себе в рюкзачок
  • put_beeper() Если у Карла в ранце есть значки, он выложит один под собой
  • turn_left() Карл поворачивается на 90 градусов влево

Comment

В редакторе ViM применяется правило: вам не нужно писать одно и то же дважды. Фрагменты кода можно эффективно копировать с помощью буфера обмена редактора ViM. Нажатием i перейдите в режим ввода и напишите, например:

step();
pick_beeper();

С помощью ESC можно перейти в командный режим и тогда копировать:

  • Передвиньте курсор на step(). Для перехода на определенную строку используйте :4 (переход на 4. riadok).
  • Команда dd удалит целую строку. Теперь строка находится в буфере обмена, который впоследствии можно использовать с помощью p или P.
  • Скопируйте команд для Карла столько, сколько вам нужно.

Warning

Буфер обмена ViM не соответсвует буферу обмена вашей локальной системы.

Task 2.4

Скомпилируйте программу с помощью make, затем запустите.

Поскольку в каталоге имеется Makefile, программу скомпилируйте следующим образом:

make stairs

В случае успешной компиляции, в каталоге должен появится испольнительный файл stairs. Если возникла ошибка - прочитайте ошибки, которые выдал компилятор и исправьте их.

Запустите исполняемый файл:

./stairs

Comment

В случае, если компилятор выдает ошибку karel.h: No such file or directory, скачайте файл заголовка karel.h и измените первую строку в коде:

#include "karel.h"

Таким образом, компилятор будет искать заголовочный файл не только в каталогах стандартных, но и в рабочем каталоге (там, где программа находится).

Comment

Компиляция может осуществляться и внутри редактора ViM:

:make stairs

запустить:

:!./stairs

За восклицательным знаком может быть введена любая команда командной строки. Не забывайте про историю и автодополнение.

Task 2.5

Измените код так, чтобы Карл поднимался на самую высокую ступень (любое количество ступеней) stairs2.kw. Испытайте свое решение.

Скачайте файл карты Карла:

wget http://kurzy.kpi.fei.tuke.sk/zap/resources/worlds/stairs2.kw

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

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

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

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

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

  • beepers_present() Возвращает true, если Карл стоит на позиции, где есть хотя бы один значок, и, соответсвенно, false, если ни одного значка под ним нет
  • beepers_in_bag() Возвращает true, если в ранце у Карла есть значки, false, если ранец пуст
  • front_is_clear() Возвращает true, если Карл может идти вперед (нет стены перед ним), иначе false

Comment

Если вы хотите выделить текст, перейдите в режим выделения с помощью v или V (для выделения целых строк). Командой y потом скопируйте текст, x текст переносит в буфер обмена. Если вы ошиблись, верните изменение с помощью команды u, назад: Ctrl+R.

Task 2.6

Измените код так, чтобы Карл поднимался на наивысшую ступеньку (любое количество ступенек) по пути собирая значки только там, где они есть. Используйте stairs3.kw. Решение испытайте.

Скачайте файл карты:

wget http://kurzy.kpi.fei.tuke.sk/zap/resources/worlds/stairs3.kw

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

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

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

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

Если нужно, роботу можно прописать другие сенсоры:

  • right_is_clear() Возвращает true, если справа от робота нет стены, иначе false
  • right_is_blocked() Возвращает true, если справа от робота стена есть, иначе false
  • left_is_clear() Возвращает true, аналогично, если слева от Карла нет стены, иначе false
  • left_is_blocked() Возвращает true, если справа от Карла стена, иначе false

Additional Tasks

Task A.1

Скомпилируйте и запустите программу внутри редактора ViM. Редактор ViM включает в себя свойства и опции, которые вам облегчают процесс написания кода и программирования в целом.

Нарочно допустите в коде stairs.c ошибку: сотрите точку с запятой. В командном режиме редактора ViM найдите точку с запятой:

/;

Удалите её с помощью x.

Comment

Команда / используется для поиска. После / вводите текст для поиска. Командой n и N передвигайтесь между результатами. Подобным образом, команда * находит актуальное слово. Естественно, можете использовать и другие методы перемещения по тексту, напр. команда wWbB (передвинет каретку на следующее - предыдущее слово).

Сохраните файл:

:w

Передвиньте каретку с на начало файла: gg. На конец файла: GG. Скомпилируйте файл в редакторе:

:make

Должна была высветиться ошибка и каретка перейдет сразу на место с ошибкой. Исправьте код, сохраните файл и скомпилируйте. Используйте историю, чтобы не нужно было снова писать команду для компиляции.

Task A.2

Ознакомьтесь с файлами карт и создайте вашу собственную карту stairs4.kw так, чтобы ступеньки были разной широты. Помощь. Исправьте код так, чтобы робот мог подняться по разношироким лестницам.

Task A.3

Создайте программу marker, с помощью которой Карл пометит значками все углы произвольно большого мира. При этом пусть робот помечает только те углы, которые еще не помечены значками. Решение испытайте на картах marker.kw и marker2.kw.

Task A.4

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

Голос считается правильным только тогда, когда графа для голосования заполнена на всех трех позициях по одному значку. Каждое поле опроса (их различное число) находится на четных позициях, а ширина мира всегда имеет нечетное число позиций. Протестируйте свой код на карте ballot.kw и придумайте, как минимум, еще 2 свои карты.

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

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

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

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

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 - глава 6.1
  4. Pavel Herout: Učebnice jazyka C (1. díl) - глава 9.2
  5. Заголовочный файл робота Карла karel.h
  6. Файл для компиляции программы для Карла Makefile
  7. GNU Make Tutorial
  8. ViM Quick Reference Card (.pdf)
  9. Конфигурационный файл для ViM Томаша
  10. Конфигурационный файл для ViM Даниела

Video