Скачиваний:
39
Добавлен:
16.01.2016
Размер:
324.39 Кб
Скачать

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ

ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ

ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ

«Белгородский Государственный Технологический Университет им. В.Г. Шухова»

(БГТУ им. В.Г. Шухова)

ИИТУС, Кафедра ТК

«Информационные технологии»

Лабораторная работа № 3.1

«Исполнители алгоритмов»

Выполнил: студент УС-11

Татаринов А.Е.

Проверил: ст. преподават.

Крюков А.В.

Отметка о выполнении

дата, роспись

Отметка о защите

дата, роспись

Для того чтобы хорошо управлять, порядок и

последовательность нужнее великих дарований.

Оноре Габриэль Рикетти Мирабо

Вариант №12

Цель работы: освоить технологию составления и решения задач для конкретного исполнителя (Робот, Чертежник); получение навыков разработки алгоритмов разветвляющейся и циклической структуры, кодирования полученных алгоритмов, отладки и тестирования программ с разветвлениями и циклами.

ЗАДАЧА 1

Постановка задачи: Напишите для исполнителя «Робот» оптимальный алгоритм (критерий оптимальности – минимальное число шагов исполнителя), предназначенный для закрашивания помеченных клеток (если не сказано иное действие). Робот должен закрасить только клетки, удовлетворяющие данному условию. Примеры начальных и конечных положений исполнителя указаны соответственно через большой желтый квадрат и маленький желтый квадрат соответственно. Детали реализации: важно учесть, что размеры поля и начальное положение исполнителя могут быть произвольными (если не сказано обратное). Отдельные примеры таких случаев заданы на рисунках (см. индивидуальные задания)

Заданные правила: Найти закрашенную клетку и закрасить клетки, находящиеся с ней на одной вертикали и горизонтали:

Решение задачи:

  1. По заданным правилам составим условия:

  • Клетка не закрашена

  • Клетка закрашена

  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.

  1. Запустим программу и проверим правильность выполнения:

ЗАДАЧА 2

Постановка задачи: Закрасить клетки, удовлетворяющие заданным правилам:

Заданные правила:

  1. По заданым правилам составим условие:

  • Клетка находится через 2 клетки после старта

  • Клетка находится через 2 клетки после закрашенной клетки

  1. Составим программу

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.

  1. Проверим правильность выполнения

ЗАДАЧА 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

Для оптимизации кода программы удалим дублирующийся движения робота вниз и вправо и заменим их на одиночные движения.

Программа будет выглядеть следующим образом:

НАЧАЛО

ПОКА <снизу свободно ИЛИ справа свободно>

ЕСЛИ <снизу свободно>

Вниз

ИНАЧЕ

Вправо

КОНЕЦ ЕСЛИ

КОНЕЦ ПОКА

КОНЕЦ

-4-

Соседние файлы в предмете Алгоритмические языки и основы программирования