2. неделя

First Steps with Karel the Robot

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

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

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

Цели

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

Инструкции

Шаг 1: Setup

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

Задача 1.1

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

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

Задача 1.2

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

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

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

Задача 1.3

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

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

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

Комментарий

Если команда wget не распознана, нужно ее установить.

sudo apt install wget

На виртуальной машине WriteCode используйте пароль developer.

Шаг 2: Stairs

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

Задача 2.1

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

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

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

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

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

Задача 2.2

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

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

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

Комментарий

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

Комментарий

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

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

#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() После выполнения всех шагов в программе эта команда обеспечит правильное завершение работы робота Карла

Комментарий

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

Комментарий

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

Задача 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 градусов влево

Комментарий

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

step();
pick_beeper();

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

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

Предупреждение

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

Задача 2.4

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

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

make stairs

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

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

./stairs

Комментарий

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

#include "karel.h"

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

Комментарий

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

:make stairs

запустить:

:!./stairs

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

Задача 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

Комментарий

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

Задача 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

Дополнительные задачи

Задача A.1

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

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

/;

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

Комментарий

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

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

:w

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

:make

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

Задача A.2

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

Задача A.3

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

Задача 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.

Дополнительные источники

  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
  9. ViM Quick Reference Card (.pdf)
  10. Конфигурационный файл для ViM Томаша
  11. Конфигурационный файл для ViM Даниела

Видео