Прототипы всех приведённых ниже программ (кроме "Угадай цифру"), только более простые и предназначенные для старых программируемых микрокалькуляторов, были опубликованы в книге "Пять вечеров с микрокалькулятором" И.Д. Данилова и Г.В. Славина. Игра "Угадай цифру" также давно существует в варианте для старых ПМК.
По идее, эти программы предназначены для того, чтобы помочь освоить детям числа и арифметические действия с ними. Но скорее эти программки пригодятся в качестве примера взрослым, желающим научиться программировать на МК-152. На их примере можно научиться:
- объединять несколько программ в одну;
- создавать для этой объединённой программы элементарное меню [вывод поясняющего текста и переход на нужные адреса с записанными программами в зависимости от нажатой клавиши].
Также в некоторых из этих программ введённые пользователем данные подробно проверяются на корректность. Способы этих проверок тоже могут кому-нибудь пригодиться.
Программа "Палочки"
Смысл этой незатейливой программы в том, что она при вводе пользователем числа вида 11…1 считает количество единиц ("палочек") и выводит его в регистр Х, а при вводе целого числа от 1 до 8 выводит «палочки» - число вида 11…1, количество разрядов в котором равно введённому пользователем числу. Если же пользователь введёт некорректное число, то программа ничего не выводит, просит ввести данные снова.
После того, как программа выведет "палочки" или их количество, следует нажать С/П перед следующим вводом, иначе она проигнорирует ввод.
Контрольная сумма для этой программы Sарифм=9939; S(2)=219.
|
x0 |
x1 |
x2 |
x3 |
x4 |
x5 |
x6 |
x7 |
x8 |
x9 |
0x |
0 |
7 |
0 |
РР П |
90 |
26 |
0 |
B↑ |
B↑ |
B↑ |
1x |
С/П |
П 0 |
F x≥0 |
00 |
F x≠0 |
00 |
K {x} |
F x=0 |
00 |
ИП 0 |
2x |
9 |
- |
F x<0 |
40 |
ИП 0 |
1 |
- |
П 0 |
Cx |
ИП 0 |
3x |
F 10x |
+ |
F L0 |
29 |
1 |
+ |
С/П |
БП |
00 |
FFh |
4x |
ИП 0 |
F lg |
П 1 |
ИП 0 |
1 |
0 |
÷ |
K {x} |
0 |
, |
5x |
1 |
- |
F x=0 |
00 |
F L1 |
43 |
ИП 0 |
F lg |
K [x] |
1 |
6x |
+ |
С/П |
БП |
00 |
|
|
|
|
|
|
7x |
82h |
A2h |
A5h |
E1h |
E2h |
A8h |
20h |
E6h |
A8h |
E4h |
8x |
E0h |
E3h |
20h |
A8h |
ABh |
A8h |
22h |
AFh |
A0h |
ABh |
9x |
AEh |
E7h |
AAh |
A8h |
22h |
FFh |
|
|
|
|
Структура программы "Палочки"
Адрес |
Выполняемые действия |
00-10 |
Подготовка к работе: вывод сообщения в строке комментариев, заполнение нулями стека, останов программы для ввода. |
11-23 |
Проверка введённого числа. Если число равно нулю, отрицательное и/или дробное, то возвращаемся к началу программы. Далее, если оно больше 8, то для дальнейшей проверки переходим на адрес 40, если нет, идём дальше. |
24-38 |
Создаём число 10^(введённое число - 1), по циклу прибавляем к нему 10^(введённое число - 2), …, 10^1. По завершении цикла торжественно прибавляется единица и по остановке программы пользователь видит "палочки". Когда он на них наглядится и нажмёт С/П, переходим в начало программки. |
40-57 |
Проверка каждого знака числа на равенство его единице. Если какой-то знак не равен единице, переходим в начало – неправильный ввод. |
58-63 |
Если мы убедились, что число пользователя состоит из единиц, выводим округленный логарифм числа из П0, прибавляем 1 – получаем количество этих самых единиц-«палочек». Останов для просмотра результата, по нажатии С/П – переходим в начало. |
70-95 |
Текст, выводящийся в строке комментариев. |
Программа "Повтори число"
Эта программа очень проста. Она заставляет пользователя вводить показанные машинкой случайные трёхзначные числа, при совсем небольших изменениях можно делать и n-значные, n≤8. Если пользователь повторяет число калькулятора в точности, выводится сообщение в строке комментариев "Молодец". Если же он ошибается, выводится сообщение в регистре Х "ERROR".
Контрольная сумма для этой программы: Sарифм=19216; S(2)=248.
|
x0 |
x1 |
x2 |
x3 |
x4 |
x5 |
x6 |
x7 |
x8 |
x9 |
0x |
Cx |
B↑ |
B↑ |
К СЧ |
1 |
ВП |
3 |
× |
K [x] |
С/П |
1x |
- |
F x=0 |
23 |
0 |
3 |
0 |
РР П |
90 |
26 |
Cx |
2x |
С/П |
БП |
00 |
K - |
БП |
00 |
FFh |
|
|
|
3x |
8Ch |
AEh |
ABh |
AEh |
A4h |
A5h |
E6h |
21h |
FFh |
|
Структура программы "Повтори число"
Адрес |
Выполняемые действия |
00-09 |
Очистка регистров, создание n-значного СЧ (n вводится на шагах 6-7 и может быть изменено), останов для ввода числа пользователем. |
10-12 |
Проверка равенства Х=У (числа калькулятора и числа пользователя). При неравенстве переход на шаг 23, иначе идём дальше. |
13-22 |
Вывод сообщения "Молодец", останов программы. После нажатия пользователем С/П переходим в начало. |
23-25 |
Вызов ошибки оператором К-. |
30-38 |
Сообщение "Молодец". |
Программа "Угадай цифру"
Калькулятор "загадывает" случайную цифру, за 4 попытки [при правильной игре этого достаточно для отгадывания любой цифры] пользователь пытается отгадать её. Если введенная пользователем цифра слишком мала, выводится сообщение "мало", велика – "много". При выигрыше и проигрыше выводятся соответствующие сообщения в строке комментариев.
Контрольная сумма для этой программы: Sарифм=34258; S(2)=224.
|
x0 |
x1 |
x2 |
x3 |
x4 |
x5 |
x6 |
x7 |
x8 |
x9 |
0x |
К СЧ |
0 |
1 |
0 |
× |
K[x] |
П 0 |
0 |
9 |
5 |
1x |
РР П |
90 |
26 |
4 |
П 3 |
ПП |
60 |
С/П |
ИП 0 |
- |
2x |
F x≠0 |
50 |
F x<0 |
40 |
0 |
9 |
0 |
РР П |
90 |
26 |
3x |
F L3 |
15 |
1 |
2 |
0 |
РР П |
90 |
26 |
С/П |
FFh |
4x |
0 |
8 |
4 |
РР П |
90 |
26 |
БП |
30 |
|
|
5x |
0 |
6 |
8 |
РР П |
90 |
26 |
Cx |
С/П |
БП |
00 |
6x |
0 |
B↑ |
B↑ |
B↑ |
В/О |
|
|
|
E3h |
A3h |
7x |
A0h |
A4h |
A0h |
ADh |
AEh |
2Dh |
A2h |
EBh |
A8h |
A3h |
8x |
E0h |
EBh |
E8h |
FFh |
ACh |
ADh |
AEh |
A3h |
AEh |
FFh |
9x |
ACh |
A0h |
ABh |
AEh |
FFh |
E3h |
A3h |
A0h |
A4h |
A0h |
10x |
A9h |
20h |
E6h |
A8h |
E4h |
E0h |
E3h |
20h |
5Bh |
34h |
11x |
20h |
AFh |
AEh |
AFh |
EBh |
E2h |
AAh |
A8h |
5Dh |
FFh |
12x |
AFh |
E0h |
AEh |
A8h |
A3h |
E0h |
EBh |
E8h |
FFh |
|
Структура программы "Угадай цифру"
Адрес |
Выполняемые действия |
00-06 |
Создание целого СЧ от 0 до 9 [изменив содержимое шагов 1,2,3 с 010, например, на 100, получим программу "Угадай число от 0 до 99"] и занесение его в память. |
07-17 |
Вывод сообщения, занесение числа попыток [шаг 13, можно изменять] в память, очистка стека и ожидание реакции пользователя. |
18-23 |
Запоминаем число пользователя и если оно равно числу калькулятора, переходим на обработку ситуации выигрыша (50), если больше – на адрес 40. Если меньше, идём дальше. |
24-29 |
Выводим сообщение "мало" |
30-31 |
Цикл: если число попыток не равно нулю, переходим на очистку стека и ввод числа, если попытки кончились, идём дальше. |
35-38 |
Выводим сообщения о проигрыше |
40-47 |
Выводим сообщения "много", переход на цикл 30 |
50-59 |
Выводим сообщения о выигрыше, переход в начало. |
60-64 |
Подпрограмма, очищающая стек |
68-128 |
Тексты сообщений |
Программа "Примеры"
Калькулятор предлагает пользователю совершить арифметическое действие с числами от 0 до 9 и проверяет правильность решения. После решения всех примеров выводится оценка от 1 до 5. Количество примеров может составлять от 5 до 100, и вводится самим пользователем в начале выполнения программы.
В данном образце программы в качестве арифметического действия выбрано умножение, но программа легко переделывается под вычитание и сложение. Также ниже будет показано, как, незначительно изменив код программы, увеличить диапазон чисел, с которыми нужно совершить действие, или изменить допустимое число примеров.
Контрольная сумма для этой программы: Sарифм=28964; S(2)=242.
|
x0 |
x1 |
x2 |
x3 |
x4 |
x5 |
x6 |
x7 |
x8 |
x9 |
0x |
0 |
8 |
0 |
РР П |
90 |
26 |
Cx |
B↑ |
B↑ |
B↑ |
1x |
С/П |
П 0 |
П 1 |
0 |
5 |
- |
F x≥0 |
00 |
9 |
6 |
2x |
- |
F x<0 |
00 |
K {x} |
F x=0 |
00 |
Cx |
П 2 |
К СЧ |
1 |
3x |
0 |
× |
K [x] |
К СЧ |
1 |
0 |
× |
K [x] |
1 |
0 |
4x |
0 |
РР П |
90 |
26 |
Cx |
С/П |
F O |
F O |
× |
- |
5x |
F x=0 |
56 |
ИП 2 |
1 |
+ |
П 2 |
Cx |
F L0 |
28 |
ИП 2 |
6x |
ИП 1 |
÷ |
5 |
× |
K [x] |
F x=0 |
69 |
1 |
+ |
1 |
7x |
1 |
0 |
РР П |
90 |
26 |
Cx |
+ |
С/П |
БП |
00 |
8x |
8Ah |
AEh |
ABh |
2Dh |
A2h |
AEh |
20h |
AFh |
E0h |
A8h |
9x |
ACh |
A5h |
E0h |
AEh |
A2h |
20h |
2Dh |
20h |
3Fh |
FFh |
10x |
5Ah |
20h |
78h |
20h |
59h |
20h |
3Dh |
20h |
3Fh |
FFh |
11x |
82h |
A0h |
E8h |
A0h |
20h |
AEh |
E6h |
A5h |
ADh |
AAh |
12x |
A0h |
21h |
FFh |
|
|
|
|
|
|
|
Теперь о том, как изменить программу, чтобы она предлагала примеры на:
Сложение – в адресе 48 изменить "х" на "+"; в адресе 102 изменить "78h" на "2Bh"
Вычитание – в адресе 48 изменить "х" на "-"; в адресе 102 изменить "78h" на "2Dh"
Структура программы "Примеры"
Адрес |
Выполняемые действия |
00-10 |
вывод сообщение, очистка стека, ожидание реакции пользователя. |
11-25 |
проверка введённого пользователем числа примеров. По адресам 13-14 находится минимальное число примеров, по адресам 18-19 – (максимальное число - 4). Если пользователь ввёл недопустимое число, переходим в начало. |
26-45 |
установка 0 в качестве числа решённых примеров, создание двух случайных чисел. Изменяя содержимое адресов 34-35, где по умолчанию стоит 10, можно изменять диапазон предлагаемых чисел. Затем вывод сообщения и остановка. |
46-51 |
проверяем правильность решения пользователя. Неправильно – переходим к адресу 56, правильно – идём дальше. |
52-55 |
прибавляем 1 к числу правильно решённых примеров |
56-58 |
очищаем регистр Х и зацикливаемся на переход к генерированию новых СЧ, пока не обнулится число оставшихся примеров. Если примеры кончились – идём дальше. |
59-77 |
рассчитываем оценку: делим число решённых примеров на общее число примеров, получившийся коэффициент умножаем на пять. При получении нуля оценку считаем равной 1. Выводим сообщение "Ваша оценка" и совершаем остановку. |
78-79 |
Переход на начало программы. |
80-122 |
Текст выводимых сообщений |
Программа "Меню"
Эта программа поможет объединить все вышеизложенные программы в одну, о чём будет подробнее рассказано ниже. Она выводит на экран названия наших программ и рядом с каждой – номер 1,2,3,4. Нажав после этого на клавишу 1,2,3 или 4 соответственно, мы и попадём затем на нужную программу.
Контрольная сумма для этой программы: Sарифм=37027; S(2)=187.
|
x0 |
x1 |
x2 |
x3 |
x4 |
x5 |
x6 |
x7 |
x8 |
x9 |
0x |
9 |
ВП |
3 |
П 4 |
3 |
П 0 |
ИП 0 |
К П 4 |
F L0 |
06 |
1x |
Cx |
РР П |
90 |
10 |
4 |
П 0 |
ИП 0 |
1 |
- |
1 |
2x |
5 |
× |
0 |
РР П |
90 |
00 |
↔ |
4 |
5 |
+ |
3x |
РР П |
90 |
21 |
F L0 |
16 |
К ГРФ |
РР ИП |
90 |
29 |
5 |
4x |
- |
F x<0 |
36 |
БП |
99 |
31h |
8Fh |
A0h |
ABh |
AEh |
5x |
E7h |
AAh |
A8h |
FFh |
|
|
|
|
|
|
6x |
32h |
8Fh |
AEh |
A2h |
E2h |
AEh |
E0h |
A8h |
E7h |
A8h |
7x |
E1h |
ABh |
AEh |
FFh |
|
33h |
93h |
A3h |
A0h |
A4h |
8x |
A0h |
A9h |
20h |
E7h |
A8h |
E1h |
ABh |
AEh |
FFh |
FFh |
9x |
34h |
8Fh |
E0h |
A8h |
ACh |
A5h |
E0h |
EBh |
FFh |
5 |
10x |
+ |
2 |
0 |
0 |
× |
П А |
К БП А |
|
|
|
Структура программы "Меню"
Адрес |
Выполняемые действия |
00-05 |
Занесение в память числа 9000 и 3 – для счётчика цикла П0 |
06-09 |
Циклическое занесение в память с адресом 9001, 9002, 9003 значений 3,2,1 соответственно. |
10-15 |
Занесение в П0 нового числа 4, очистка графического экрана |
16-34 |
Циклическое задание начальных координат выводимых строчек и адресов, по которым они считываются |
35-44 |
Переходим в графический режим, ожидаем нажатия пользователем клавиши. Если нажимает клавишу с кодом больше 5, ожидаем нового нажатия. Если нет – идём на адрес 99. |
45-98 |
Текст меню |
99-106 |
В зависимости от нажатой клавиши формируем адрес, куда нужно переходить программе. |
Объединение программ
Если вы хотите объединить теперь все эти программы, можно сохранить их по отдельности на электронном диске А[постоянном] или В [съёмном], а затем загрузить поочерёдно в память со следующими параметрами:
"Меню" - на 0 страницу;
"Палочки" - на 2 страницу;
"Повтори число" - на 4 страницу;
"Угадай цифру" - на 6 страницу;
"Примеры" - на 8 страницу.
После этого для правильного вывода сообщений в программах нужно изменить содержание следующих адресов:
0200 - с "0" на "2";
0413 - с "0" на "4";
0607 - с "0" на "6";
0624 - с "0" на "6";
0632 - с "1" на "7";
0640 - с "0" на "6";
0650 - с "0" на "6";
0800 - с "0" на "8";
0838 - с "1" на "9";
0869 - с "1" на "9".
Полученную программу можно смело сохранить под новым именем (Не забудьте, что она состоит из целых 10 страниц). Теперь после запуска большой программы можно выбирать, какую из её составных частей требуется запустить, а не загружать каждую маленькую программу по отдельности.
Автор - Кушнарёва Л.
E-mail - K.Lidia(AT)list.ru
Опубликовано - http://mk_152.livejournal.com/2081.html
|