дискретка_все_практики / дискретка / Razdel_4_Praktika_8
.docРаздел 4. Элементы математической логики и теория алгоритмов
ПРАКТИЧЕСКАЯ РАБОТА №8
АЛГОРИТМИЧЕСКИЕ СИСТЕМЫ.
ПОСТРОЕНИЕ ЭМУЛЯТОРА МАШИНЫ ПОСТА.
1. ОБЩИЕ СВЕДЕНИЯ
1.1. «Внешний вид» машины Поста
Машина Поста не есть реально существующее, сделанное кем-то устройство. Она представляет собой мысленную конструкцию.
Машина Поста состоит из ленты и каретки. Лента бесконечна и разделена на секции одинакового размера. Порядок в котором расположены секции ленты, подобен порядку, в котором расположены все целые числа. Поэтому принято рассматривать ленту, как «целочисленную систему координат» (рис.1).
Рис.1
В каждой секции ленты может быть либо ничего не записано (пустая секция), либо записана метка V. Информация о том, какие секции пусты, а какие отмечены, образует состояние ленты.
Каретка может передвигаться вдоль ленты влево и вправо. Когда она неподвижна, она стоит ровно против секции ленты; говорят, что каретка обозревает эту секцию, или держит ее в поле зрения.
Информация о том, какие секции пусты, а какие отмечены и где стоит каретка, образует состояние машины Поста.
За единицу времени (шаг) каретка может сдвинуться на одну секцию влево или вправо. Кроме того, каретка может поставить или уничтожить (стереть) метку в той секции, против которой она стоит, а также распознать, стоит или нет метка в обозреваемой ею секции.
1.2 Программа машины Поста
Работа машины Поста состоит в том, что каретка передвигается вдоль ленты и печатает или стирает метки. Эта работа происходит согласно программе.
Каждая программа машины Поста состоит из команд. Существует шесть видов команд (буквы i, j, j1, j2 означают натуральные числа):
-
Команда движения вправо. i j
-
Команда движения влево. i j
-
Команда печатания метки. i v j
-
Команда стирания метки. i j
-
Команда передачи управления.
j1 если секция пуста
i ?
j2 если секция отмечена
-
Команда остановки. ! стоп.
Число i, стоящее в начале команды, называется номером команды. Число j, стоящее в конце команды—отсылка. У команды остановки нет отсылки.
Программа машины Поста—конечный непустой список команд машины Поста, обладающий следующими двумя свойствами:
-
на первом месте в этом списке стоит команда с номером 1, на втором месте- команда с номером 2 и т.д.; вообще на k- том месте стоит команда с номером k;
-
отсылка любой из команд списка совпадает с номером некоторой (другой или той же самой) команды списка.
2. ЦЕЛЬ И ПОРЯДОК РАБОТЫ
Цель работы—получить первичные знания об алгоритмических системах, ознакомиться с работой машины Поста, овладеть навыками написания программ для машины Поста.
Работу следует выполнять в таком порядке:
-
изучить описание работы;
-
написать программы для реализации основных задач на машине Поста;
-
написать эмулятор машины Поста на языке Turbo Pascal;
-
по индивидуальному заданию написать программу машины Поста, затем выполнить ее на созданном эмуляторе;
-
оформить отчет.
-
ЗАДАНИЯ
-
Написать пять программ машины Поста и осуществить их реализацию на существующем эмуляторе.
-
На ленте имеется машинная запись числа N, представленная в виде массива из N+1 меток. Каретка находится против самого левого элемента массива. Требуется записать число N+1, добавив метку справа к массиву.
-
Дан массив из 2*N-1 меток. Каретка находиться слева от массива. Требуется стереть среднюю метку.
-
Дан массив из 2*N меток. Каретка находится слева от массива. Требуется раздвинуть две половины массива на одну секцию.
-
Дано два массива, расположенных на произвольном расстоянии друг от друга. Каретка находится слева от массивов. Требуется сложить массивы.
-
На ленте имеется машинная запись числа N (массив N+1 меток). Требуется записать число N+1. Положение каретки произвольно. [УКАЗАНИЕ. Необходимо рассмотреть два случая: каретка расположена над заполненной секцией, тогда задача сводится к первой из предложенных; каретка расположена над пустой секцией, тогда нужно осуществить поиск массива]
3.2.На языке программирования Turbo Pascal написать простейший эмулятор машины Поста.
3.3.Согласно варианту выбрать задание и написать программу машины Поста. Реализацию программы осуществить на разработанном эмуляторе.
-
Разделить заданное число на два.
-
Разделить заданное число на три.
-
Разделить заданное число на четыре.
Примечание. Каретка слева от массива. Начальное состояние ленты -
машинная запись делимого; конечное состояние - частное.
Пояснение. Под делением понимается нахождение частного или неполного частного, так что результат деления 7 на 3 будет 2.
-
Разделить одно число на другое.
Примечание. Каретка слева от массивов. Начальное состояние ленты -
машинная запись делимого и делителя; конечное состояние - частное.
Пояснение. Под делением понимается нахождение частного или неполного частного, так что результат деления 7 на 3 будет 2.
5) Вычесть одно число из другого.
Примечание. Каретка слева от массивов. Начальное состояние ленты -два массива, расположенных на произвольном расстоянии (причем первый слева массив- уменьшаемое, второй-вычитаемое); конечное состояние- разность.
Пояснение. Если вычитание невозможно (вычитаемое больше уменьшаемого), программа не должна приводить к результативной остановке.
-
Умножить заданное число на два.
-
Умножить заданное число на три.
-
Умножить заданное число на четыре.
Примечание. Каретка слева от массива. Начальное состояние ленты-машинная запись умножаемого; конечное состояние - произведение
9) Перемножить два числа.
Примечание. Каретка слева от массивов. Начальное состояние ленты -
машинная запись двух чисел; конечное состояние - произведение.
10)Найти НОД (наибольший общий делитель) двух чисел.
Примечание. Каретка слева от массивов. Начальное состояние ленты -
машинная запись двух чисел; конечное состояние - НОД.
11) Найти сумму двух чисел.
Примечание. Положение каретки произвольно. Начальное состояние ленты -два массива, расположенных на произвольном расстоянии; конечное состояние- сумма.
Пояснение. Необходимо предусмотреть поиск массивов, т.к. неизвестно ни положение каретки, ни расположение массивов относительно друг друга.
-
Найти выражение (a+b)*c.
Примечание. Каретка слева от массивов. Начальное состояние ленты -первый массив слева -число a, второй массив- число b, третий массив- число с; конечное состояние- результат.
13) Перемножить два числа.
Примечание. Положение каретки произвольно. Начальное состояние ленты -два массива, расположенных на произвольном расстоянии; конечное состояние- произведение.
Пояснение. Необходимо предусмотреть поиск массивов, т.к. неизвестно ни положение каретки, ни расположение массивов относительно друг друга.
-
Возвести число в квадрат.
-
Возвести число в куб.
Примечание. Каретка слева от массива. Начальное состояние ленты -машинная запись числа; конечное состояние- результат.
-
МЕТОДИЧЕСКИЕ УКАЗАНИЯ
4.1. Создание эмулятора машины Поста.
Эмулятор должен представлять собой ленту с расположенными на ней метками и каретку, находящуюся напротив определенной секции.
Рекомендуется для описания состояния ленты использовать массив булевых элементов (например 100 элементов. Ограничение ленты упрощает работу). При этом в начале работы каретка находится напротив нулевой секции ( 50-тый элемент массива). В эмуляторе каретка всегда остается на месте, а передвигаются лента, программно это означает перерисовывание меток.
Проще рисовать эмулятор в текстовом режиме, используя символы ASCII для рисования таблиц.
Программу для машины Поста удобнее генерировать в файле, т.о. отпадает необходимость вводить ее каждый раз с клавиатуры.
Примерные фрагменты процедур
Процедура вывода рамки ленты и каретки
procedure lenta_wid;
begin
textcolor (7);
gotoxy (1,6);
{Рисование заголовка (верхняя треть) ленты}
write (#194);
for i:=1 to 39 do
write (#196,#194);
write (#196);
{Середина ленты}
for i:=1 to 40 do
write (#179,#32);
{Подвал ленты}
write (#193);
for i:=1 to 39 do
write (#196,#193);
write (#196);
{Изображение каретки}
gotoxy (40,5);
textcolor (14);
write (c00);
end;
Процедура работы с клавиатурой
procedure key;
begin
b:=false; gotoxy (40,5);
c:=readkey;
while keypressed do
c:=readkey; {Очистка буфера}
case c of
#32 :ln[n]:=not (ln[n]); {Пробел - поставить/стереть метку}
#75 :if n<>0
then n:=n-1
else {Курсор вправо - сдвиг ленты}
begin
gotoxy (5,10);
write ('Конец ленты')
end;
#77 :if n<>100 then n:=n+1
else {Курсор влево - сдвиг ленты}
begin
gotoxy (5,10);
write ('Конец ленты')
end;
#27,#13 : b:=true; {Esc,Enter - окончание редактирования ленты}
else b:=false
end
end;
Процедура вывода состояния текущего участка ленты
procedure obraz;
var i00 :integer;
begin
for i:=1 to 40 do
begin {Проход всего видимого участка ленты}
gotoxy (2*i,7); {Перевод курсора в ячейку}
i00:=n-20+i;
if (i00>=0) and (i00<=100)
then {Определение границ}
{Если границы соответствуют и метка есть вывести символ метки, иначе забить предыдущий символ данной ячейки}
if ln[i00] then write (c01)
else write (' ');
gotoxy (38,9);
write (' ',n-50,' ')
end
end;
Основная же часть программы создания эмулятора машины Поста предлагается на собственное усмотрение.
5. СОДЕРЖАНИЕ ОТЧЕТА
Отчет должен содержать:
-
наименование работы;
-
текст пяти обязательных программ в тетради;
-
программу создания эмулятора машины Поста (в электронном виде);
-
текст программы машины Поста по индивидуальному заданию.
-
КОНТРОЛЬНЫЕ ВОПРОСЫ
-
Что представляет собой машина Поста?
-
Что называют состоянием ленты, а что - состоянием машины Поста?
3. Для чего предназначена каретка?
4. Какие команды могут быть использованы в программе машины Поста?
5.Объяснить алгоритм поиска массива меток, используемый в пятом обязательном задании.
7. ЛИТЕРАТУРА
1.Успенский В.А. Машина Поста.-2-е изд.,испр.-М..:Наука.2007.-96 с.