лаба 3.1
.docx
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ «Белгородский Государственный Технологический Университет им. В.Г. Шухова» (БГТУ им. В.Г. Шухова) ИИТУС, Кафедра ТК |
|||
«Информационные технологии» |
|||
Лабораторная работа № 3.1 «Исполнители алгоритмов» |
|||
|
|||
Выполнил: студент УС-11 Татаринов А.Е. Проверил: ст. преподават. Крюков А.В.
|
Отметка о выполнении
дата, роспись |
Отметка о защите
дата, роспись |
Для того чтобы хорошо управлять, порядок и
последовательность нужнее великих дарований.
Оноре Габриэль Рикетти Мирабо
Вариант №12
Цель работы: освоить технологию составления и решения задач для конкретного исполнителя (Робот, Чертежник); получение навыков разработки алгоритмов разветвляющейся и циклической структуры, кодирования полученных алгоритмов, отладки и тестирования программ с разветвлениями и циклами.
ЗАДАЧА 1
Постановка задачи: Напишите для исполнителя «Робот» оптимальный алгоритм (критерий оптимальности – минимальное число шагов исполнителя), предназначенный для закрашивания помеченных клеток (если не сказано иное действие). Робот должен закрасить только клетки, удовлетворяющие данному условию. Примеры начальных и конечных положений исполнителя указаны соответственно через большой желтый квадрат и маленький желтый квадрат соответственно. Детали реализации: важно учесть, что размеры поля и начальное положение исполнителя могут быть произвольными (если не сказано обратное). Отдельные примеры таких случаев заданы на рисунках (см. индивидуальные задания)
Заданные правила: Найти закрашенную клетку и закрасить клетки, находящиеся с ней на одной вертикали и горизонтали:
Решение задачи:
-
По заданным правилам составим условия:
-
Клетка не закрашена
-
Клетка закрашена
-
Далее составим программу:
uses
Robot;
var
a: integer;
begin
Task('mix5');
var k: byte := 0;
while not CellIsPainted and not wallFromRight do
begin
right;
end;
while not cellIsPainted and not WallFromUp do
begin
Up;
end;
repeat
while not cellIsPainted and not wallFromLeft do
begin
while freefromleft and not cellIsPainted do
begin
left;
end;
if not cellIsPainted then
begin
down;
end;
end;
while not CellIsPainted and not WallFromRight do
begin
while not cellIsPainted and not wallFromRight do
begin
right;
end;
if not cellIsPainted then
begin
down;
end;
end;
until not cellIsFree;
if cellIsPainted then begin
while not WallFromDown do
begin
down;
paint;
inc(k);
end;
for var i := 1 to k do up;
a := 0;
while not WallFromLeft do
begin
k := 0;
left;
paint;
a := a + 1
end;
for var i := 1 to a do right;
a := 0;
while not WallFromRight do
begin
right;
paint;
a := a + 1;
end;
for var i := 1 to a do left;
a := 0;
while not WallFromUp do
begin
up;
paint;
a := a + 1;
end;
for var i := 1 to a do down;
end;
end.
-
Запустим программу и проверим правильность выполнения:
ЗАДАЧА 2
Постановка задачи: Закрасить клетки, удовлетворяющие заданным правилам:
Заданные правила:
-
По заданым правилам составим условие:
-
Клетка находится через 2 клетки после старта
-
Клетка находится через 2 клетки после закрашенной клетки
-
Составим программу
uses
Robot;
begin
Task('count15');
while not wallFromRight do
begin
paint;
right;
if freeFromRight then
begin
right;
if freeFromRight then
begin
right;
paint;
end;
end;
end;
end.
-
Проверим правильность выполнения
ЗАДАЧА 3
Постановка задачи: Напишите для исполнителя «Чертежник» оптимальный алгоритм (критерий оптимальности – минимальное число шагов исполнителя), предназначенный для построения данного чертежа (все параметры и размеры данного чертежа постоянны). Детали реализации: в конце программы перо «Чертежника» должно быть поднято и находиться в начале координат.
Решение задачи: для выполнения задачи чертежник должен из заранее выбранной точки (в данном случае 0;0) перейти в точку на другой границе графика, с каждым шагом поднимаясь выше на одну клетку, когда он дойдет до наивысшей точки, начальная точка должна переместиться на 1 вверх, и так должно продолжаться, пока исходная и конечная точки не окажутся в наивысших положениях.
Составим програму:
uses
Drawman;
begin
Task('cc15');
for var j := 0 to 8 do
for var i := 0 to 8 do
begin
ToPoint(0, j);
PenDown;
OnVector(10, i - j);
PenUp;
end;
PenUp;
ToPoint(0, 0);
end.
Запустим программу и проверим результат:
ЗАДАЧА 4
Постановка задачи: Для исполнителя «Робот» задана программа (на алгоритмическом языке). Размеры поля постоянны. Если исполнитель начнёт движение в сторону находящейся рядом с ним стены, то он разрушится, и программа прервётся.
А) Сколько клеток лабиринта соответствуют требованию, что, начав движение в ней и выполнив предложенную программу, исполнитель уцелеет и остановится в закрашенной клетке? Найдите все такие клетки.
Б) Существуют ли такие клетки, что, начав движение в ней, исполнитель разрушится при выполнении указанной программы? Найдите все такие клетки. Как изменить программу, чтобы оставив неизменным общую логику движения исполнителя, не было случаев его разрушения.
Заданные условия:
Рассмотрим задачу А. Проанализируем данный алгоритм и выясним, что робот будет выполнять движение если свободно либо справа, либо снизу. Т.к. первый будет выполняться условие с двойным шагом вниз, из определенной точки поля робот будет двигаться до упора вниз, затем будет выполняться условие для двойного шага вправо.
Рассмотрев данное поле, определим, что стартуя из следующих точек:
робот разрушится, так как при выполнении либо первой, либо второй части условия, робот будет врезаться в стену, в остальных клетках робот выполнит все условия и придет к закрашенной точке.
Следовательно, оставшиеся точки будут удовлетворять заданному условию:
Количество точек: 7.
Рассмотрим задачу В.
Точки, начав движение из которых, исполнитель самоуничтожиться существуют. Количество этих точек = 24
Для оптимизации кода программы удалим дублирующийся движения робота вниз и вправо и заменим их на одиночные движения.
Программа будет выглядеть следующим образом:
НАЧАЛО
ПОКА <снизу свободно ИЛИ справа свободно>
ЕСЛИ <снизу свободно>
Вниз
ИНАЧЕ
Вправо
КОНЕЦ ЕСЛИ
КОНЕЦ ПОКА
КОНЕЦ
-