Разбор задач для ЭВМ Кроха

advertisement
"Кроха": описание модели
Учебная модель ЭВМ "Кроха" была предложена в 1989
году группой екатеринбургских (тогда свердловских)
авторов в учебнике "Основы информатики и
вычислительной техники". Это была фактически первая
модель ЭВМ, предложенная для целей обучения. На ее
основе можно было легко и просто объяснить, что такое
ячейка памяти, машинная команда, адрес, счетчик
команд, сумматор и многие другие фундаментальные понятия.
"Кроха" является классическим примером трехадресной ЭВМ, т.е. в ее команде
указывается 3 адреса (операнда): для 2 исходных величин и адрес ячейки, куда нужно
записать результат. Общая структура команды имеет вид
К О П
А1
действие
А2
данные
А3
результат
Каждая клеточка данного рисунка есть один двоичный разряд.
Память у "Крохи" действительно крошечная - всего 8 ячеек! Поэтому адрес любой ячейки
кодируется именно тремя двоичными разрядами (Вы, конечно, помните, что 2 3 = 8). "Для
общности" код операции КОП тоже сделан 3-битным. Отсюда автоматически следует, что
"Кроха" различает 8 операций. Вот их полный перечень:
КОД НАЗВАНИЕ ОПЕРАЦИИ СОДЕРЖАНИЕ ОПЕРАЦИИ
000 перепись
A1 ==> A3
001 сложение
A1 + A2 ==> A3
010 деление
A1 / A2 ==> A3
011 вычитание
|A1 - A2| ==> A3
100 условный переход по =
при A1 = A2 переход к A3
101 умножение
A1 * A2 ==> A3
110 условный переход по >
при A1 > A2 переход к A3
111 вывод и стоп
вывод A1, A2, A3; стоп.
Как видно из таблицы, помимо 4 арифметических действий над числами (расположенных
в таблице операций несколько бессистемно), "Кроха" способна вывести все 3 указанных
адреса на экран и, кроме того, осуществить 2 разновидности условного перехода.
Учебная ЭВМ оперирует с целыми положительными числами. Как и команды, числа 12разрядные. Очевидно, что максимальное число, которое еще способна разместить в своей
памяти "Кроха", равняется 2 12 - 1 = 4095. В случае, когда результат получается больше, он
выходит за 12-разрядное машинное слово и не может быть корректно сохранен.
Специалисты называют такое явление переполнением. Переполнение является аварийной
ситуацией и приводит к прекращению выполнения программы.
Поскольку все числа в "Крохе" должны быть целыми, деление всегда производится
нацело и остаток просто отбрасывается. Например, при делении 14 на 3 получается 4, а 3
на 15 - ноль. Кстати, деление на ноль невозможно, что также является причиной
аварийной остановки ЭВМ.
Аналогично чтобы результат при вычитании не стал отрицательным, "Кроха"
корректирует его путем взятия модуля. Например, в результате операции 3 - 5 получается
число +2.
При переписи информация из ячейки с адресом А1 копируется в ячейку А3. Адрес А2 при
этом не имеет значения; его принято заполнять нулями.
При осуществлении условного перехода "Кроха" сравнивает между собой оба
операнда и в случае выполнения условия (равно или больше, в зависимости от КОП)
переходит к А3: проще говоря, следующей командой будет выполняться А3. В
случае невыполнения условия (например, по неравенству в первом случае) переход
игнорируется и выполняется следующая команда программы. Запомните,
пожалуйста, эту логику: именно она лежит в основе всех разветвлений и циклов!
Все современные реальные компьютеры работают по такой логике.
Подробные примеры программ для ЭВМ "Кроха" приведены на отдельной странице.
Здесь только заметим, что "Кроха" всегда начинает выполнение программы с
нулевого адреса.
"Кроха": примеры решения задач для ЭВМ "Кроха"
1. Составить программу вычисления периметра прямоугольника по длинам сторон.
(Задача N 3а из учебника)
РЕШЕНИЕ
Обозначим стороны прямоугольника a и b, а результат - P.
Вычисления будем вести по формулам: P = a + b; P = P + P. Такая последовательность
вычислений обеспечивает наиболее экономичную (с точки зрения использования числа
ячеек памяти) программу, т.к. не требуется отводить специальную ячейку под число 2.
Адрес
Команда
Расшифровка
Комментарий
000
001 110 111 101 (6) + (7) ==> (5)
a + b ==> P
001
001 101 101 101 (5) + (5) ==> (5)
P + P ==> P
010
111 110 111 101 стоп; вывод (6), (7), (5) вывод a, b, P
011
не используется
не используется
100
101
P
результат
110
b
исходные
111
a
данные
2. Составить программу вычисления половины полной поверхности параллелипипеда по
длинам ребер. (Задача N 3в из учебника)
РЕШЕНИЕ
Обозначим ребра параллеллипипеда a, b и c, а результат - s.
Вычисления будем вести по формуле: s = ab + bc + ac = b(a + c) + ac, что уменьшит
количество арифметических действий, а значит и команд. Полученную формулу удобно
разбить на две: r = b(a + c); s = ac + r
Адрес
Команда
Расшифровка
Комментарий
000
001 101 111 000 (5) + (7) ==> (0)
a + c ==> r [ r ]
001
101 110 000 000 (6) * (0) ==> (0)
b * r ==> r [ s ]
010
101 101 111 001 (5) * (7) ==> (1)
a * c ==> s
011
001 000 001 001 (0) + (1) ==> (1)
s + r ==> s
100
111 001 001 001 стоп; вывод (1), (1), (1) вывод s
101
a
исход-
110
b
ные
111
c
данные
Особенностью данной задачи является нехватка ячеек памяти для проведения
вычислений. Поэтому приходится помещать рабочую переменную r и результат s на
место уже отработавших команд программы. Нельзя сказать, что это удобно (перед
каждым запуском первые команды приходится восстанавливать!), но другого способа
решения для памяти из 8 ячеек нет.
3. Написать программу нахождения наибольшего из двух хранящихся в ячейках памяти
чисел. (Задача N 4 из учебника)
РЕШЕНИЕ
Обозначим исходные числа a и b, а результат max.
Адрес
Команда
Расшифровка
Комментарий
000
110 110 111 011 если (6)>(7), перейти к 3 сравнить a и b
001
000 111 000 101 (7) ==> (5)
a ==> max
010
111 111 110 101 стоп; вывод (7), (6), (5)
вывод a, b, max
011
000 110 000 101 (6) ==> (5)
b ==> max
100
111 111 110 101 стоп; вывод (7), (6), (5)
вывод a, b, max
101
max
результат
110
b
исходные
111
a
данные
Примечание. Вместо команды "стоп" по адресу 010 можно выполнить безусловный
переход на команду 100. Казалось бы, команды безусловного перхода у "Крохи" нет. Но
проанализируем команду
100 000 000 100 - если (0) = (0), переход на (100).
Т.к. (0) = (0) всегда, то этот переход тоже будет происходить всегда. Чем не безусловный
переход?
4. Написать программу деления двух чисел с учетом возможности деления на ноль (в
последнем случае отобразить на экране все нули).
РЕШЕНИЕ
Обозначим исходные числа a и b, а результат d.
Адрес
Команда
Расшифровка
Комментарий
000
100 101 111 011 если (5)=(7), перейти к 3 сравнить b с 0
001
010 110 101 100 (6) / (5) ==> (4)
a / b ==> d
010
111 110 101 100 стоп; вывод (6), (5), (4)
вывод a, b, d
011
111 111 111 111 стоп; вывод (7), (7), (7)
вывод 0, 0, 0
100
d
результат
101
b
исходные
110
a
данные
111
000 000 000 000 0
константа 0
5. Заданы два числа a и b. Написать программу, которая большее из них делит на
меньшее.
РЕШЕНИЕ
Обозначим результат d.
Адрес
Команда
Расшифровка
Комментарий
000
110 110 111 011 если (6)>(7), перейти к 3 сравнить a и b
001
010 111 110 101 (7) / (6) ==> (5)
a / b ==> d
010
111 111 110 101 стоп; вывод (7), (6), (5)
вывод a, b, d
011
010 110 111 101 (6) / (7) ==> (5)
b / a ==> d
100
111 111 110 101 стоп; вывод (7), (6), (5)
вывод a, b, d
101
d
результат
110
b
исходные
111
a
данные
6. Написать программу вычисления n!
РЕШЕНИЕ
Обозначим k рабочую переменную, которая является текущим множителем для
факториала и меняется от 1 до n. Начальное значение k придется задавать перед каждым
запуском "вручную", т.к. для команды пересылки константы 1 из ячейки 7 в ячейку 4 уже
не хватает памяти. То же самое можно сказать и про начальное значение n!, которое перед
запуском естественно установить равным 1.
Не забудьте также в ячейку 6 занести значение n + 1, которое является верхней границей
цикла (цикл будет выполняться, пока k < n+1 и, следовательно, завершится после
умножения на n).
Адрес
Команда
Расшифровка
Комментарий
000
101 101 100 101 (5) * (4) ==> (5)
n! * k ==> n!
001
001 100 111 100 (4) + (7) ==> (4)
k + 1 ==> k
010
110 110 100 000 если (6)>(4), перейти к 0 k < n + 1 ?
011
111 101 101 101 стоп; вывод (5),(5),(5)
вывод n!
100
k [задать 1]
рабочая ячейка
101
n! [задать 1]
результат
110
n + 1 [задать]
константа
111
константа 1
000 000 000 001 1
При работе с программой полезно обратить внимание на эффект переполнения, который
для быстрорастущего выражения типа факториал достигается довольно быстро. В самом
деле, как подробно обсуждается в учебнике, максимально допустимое число для 12разрядной "Крохи" равняется 4095. Таким образом, уже попытка вычислить 7! =
1*2*3*4*5*6*7 = 5040 приводит "Кроху" к непреодолимым вычислительным трудностям.
Проверьте, как "Кроха" реагирует на переполнение.
7. Написать программу для вычисления выражения 1+2+3+4+...+n
Эта задача настолько похожа на предыдущую, что тратить силы на набор решения просто
не поднимается рука. Отметим только, что начальное значение суммы (в отличие от
факториала) надо задавать равным 0.
8. Написать программу вычисления выражения X*2n
РЕШЕНИЕ
Для того, чтобы программа поместилась в память "Крохи", придется исходное выражение
преобразовать к виду
X*2*2*...*2
Таким образом, решение задачи теперь свелось к удвоению значения X n раз, что удобно
делать путем циклического сложения ячейки "самой с собой".
Адрес
Команда
Расшифровка
Комментарий
000
001 101 101 101 (5) + (5) ==> (5)
X + X ==> X
001
011 100 110 100 (4) - (6) ==> (4)
n - 1 ==> n
010
110 100 111 000 если (4)>(7), перейти к 0 n > 0 ?
011
111 101 101 101 стоп; вывод (5),(5),(5)
вывод X
100
n
исходные дан-
101
X
ные; результат
110
000 000 000 001 1
константа 1
111
000 000 000 000 0
константа 0
9. Вычислить выражение y=1*2*4*8*...*n
РЕШЕНИЕ
Как нетрудно видеть из формулы для y, программа должна суммировать
последовательные степени числа 2. Обозначим очередную степень s.
Особо отметим, что верхняя граница цикла в ячейке 7 переустанавливается программой.
Вы перед пуском вводите в эту ячейку удобное для Вас значение n. Но машину это
значение "не устраивает": ей требуется, чтобы верхняя граница равнялась 2 * n, только
тогда последний учтенный сомножитель в цикле умножения будет равен n. Поэтому
первой же командой ЭВМ удваивает 7-ю ячейку.
Адрес
Команда
Расшифровка
Комментарий
000
001 111 111 111 (7) + (7) ==> (7)
n + n ==> n
001
101 101 110 110 (5) * (6) ==> (6)
s * y ==> y
010
001 101 101 101 (5) + (5) ==> (5)
s + s ==> s
011
110 111 101 001 если (7)>(5), перейти к 1 s < 2 * n ?
100
111 110 110 110 стоп; вывод (6),(6),(6)
вывод y
101
s [задать 1]
рабочая ячейка
110
y [задать 1]
результат
111
n [задать], 2 * n
граница цикла
10. Вычислить выражение y=1+2+4+8+...+n
Задача решается аналогично. Отметим только, что верхняя граница цикла в ячейке 7
устанавливается равной n+1.
Для проверки правильности результата полезно помнить, что для m слагаемых ответ
может быть вычислен по формуле
y = 2m - 1
11. Задача о самомодифицирующейся программе.
Задано состояние памяти ЭВМ "Кроха" перед пуском (см. ниже). Определить, каков будет
результат выполнения программы.
КОММЕНТАРИЙ к условию. Данная задача представляет не столько практический,
сколько теоретический интерес. Тем не менее, автор ее очень любит и считает важной.
Дело в том, что в этой задаче отчетливо видно, что ЭВМ может сама формировать себе
программу и что содержимое одной и той же ячейки памяти "Крохи" в разные моменты
времени может быть и данными (числом), и командой. Не пожалейте времени на разбор
этой задачи, если Вы действительно хотите глубоко понять принципы работы ЭВМ и
передать свои знания ученикам !!!
Начальное состояние памяти ЭВМ "Кроха" для задачи 11
Адрес
Команда
Расшифровка
Комментарий
000
001 111 110 001
001
не имеет значения
010
не имеет значения
011
001 001 010 011
сумма ячеек (3) и (4) дает
100
110 000 000 000
команду стоп для (3)
101
001 011 100 011
(3) + (4) ==> (3) для (2)
110
000 101 000 000
сумма ячеек (6) и (7) дает
111
000 000 000 010
команду (5) ==> (2) для (1)
формируем (1)
(7) + (6) ==> (1)
РЕШЕНИЕ
Конечное состояние памяти ЭВМ "Кроха" для задачи 11
Адрес
Команда
Расшифровка
Комментарий
000
001 111 110 001 (7) + (6) ==> (1)
формируем (1)
001
000 101 000 010 (5) ==> (2)
формируем (2)
010
001 011 100 011 (3) + (4) ==> (3)
формируем (3)
011
111 001 010 011 стоп; вывод (1), (2), (3) стоп
100
110 000 000 000
константы со-
101
001 011 100 011
храняются без
110
000 101 000 000
изменения кро-
111
000 000 000 010
ме ячейки (3)
В результате выполнения программы на экран ЭВМ будет выведено содержимое ячеек (1),
(2) и (3), сформированное в ходе выполнения программы.
12*. Написать циклическую программу, заносящую 1 в ячейки (4)-(6).
РЕШЕНИЕ
Адрес
Команда
Расшифровка
Комментарий
000
000 111 000 100
(7) ==> (4)
1 ==> ячейку
001
001 111 000 000
(7) + (0) ==> (0)
модиф. адрес
010
110 111 110 000
если (7)>(6), перейти к 0 (6) < 1 ?
011
111 100 101 110
стоп; вывод (4),(5),(6)
100
не имеет значения
101
не имеет значения
запишутся
110
[задать 0]
единицы]
111
000 000 000 001
вывод ячеек
[сюда
1
константа 1
Эта задача не зря помечена звездочкой. Она, по-видимому, самая трудная для понимания.
В значительной мере это объясняется ее некоторой искусственностью в рамках учебной
ЭВМ "Кроха". Тем не менее идея модификации адресов команд на "настоящих" ЭВМ при
работе с массивами реализуется аналогично.
Впрочем, если задача Вам не понравилась, можете смело ее пропустить. Для тех же, кто
"вошел во вкус" или кому в наше нелегкое время посчастливилось иметь дело со
способными учениками (для таких она и предназначается !), небольшой комментарий.
Для проверки окончания цикла используется следующий прием. Перед запуском в ячейку
(6) заносится 0, поэтому при проверке условия в команде (2) переход срабатывает: 1>0.
Так продолжается до записи в ячейку (6) единицы. После этого условие перестает
выполняться и цикл прекращается.
© Е.А.Еремин, 1995
Download