Тема лабораторной
Вы познакомитесь с роботом Карлом и миром, в котором он находится. Создадите для Карла простые программы, с помощью которых освоите его базовые команды.
Цели
- Освоить возможность управления роботом Карлом с помощью базовых команд и сенсоров.
- Научиться создавать собственные функции (свои команды).
- Освоить возможности ветвлений (условие
if
,if-else
). - Научиться создавать простые логические циклы (
while
,do-while
). - Продолжать практиковаться в редакторе 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.
Дополнительные источники
- Karel Language Reference
- Here you can find the original library of Karel the Robot, including the library installation instructions.
- Rudolf Pecinovský: Základy algoritmizace - глава 6.1
- Pavel Herout: Učebnice jazyka C (1. díl) - глава 9.2
- Заголовочный файл робота Карла karel.h
- Файл для компиляции программы для Карла Makefile
- GNU Make Tutorial
- Наше руководство по VIM
- ViM Quick Reference Card (.pdf)
- Конфигурационный файл для ViM Томаша
- Конфигурационный файл для ViM Даниела