Техника - молодёжи 1985-06, страница 43

Техника - молодёжи 1985-06, страница 43

12. Вот где пригодилось допущенное «излишество» (команды 08 и 09). Теперь мы сэкономили вызов величины Ci и перемену местами содержимого регистров X и У. Кроме того, чтобы вызвать величину Ci из адресуемого регистра, ее надо было бы предварительно туда записать. Мы же обходимся пока без записи величины Си Она к нашим услугам прямо в стеке.

13—14 Вычисления по ветви 3—4 закончены Вызываем в регистр X сообщение Е01 из регистра 3, останавливаем программу, чтобы его можно было прочесть. Иначе говоря, реализуем блок «Вывод «Один корень».

15—16. После нажатия клавиши С/П отрабатываем «Вывод Xi». Величина корня — на индикаторе.

17—18. Эта команда замыкает ветвь 3—4, управление передается последней команде программы (блоку «Конец»), все остальные ветви обходятся, и работа программы заканчивается.

19—22 Сюда мы попадаем только в том случае, если а=0 и Ь=0. Вычислений проводить не надо. Просто выводим на экран сообщение Е00, что означает «Корней нет», и замыкаем ветвь, подобно предыдущей.

23—34. Ветвь 7—8.

23. Если мы уж попали на эту команду, значит, уравнение невырожденное. Надо вычислять дискриминант, а потом корни по одной из двух ветвей. Кстати, вас не смущает, что командой 12 мы вроде бы распрощались с величиной Ci? Ведь она в адресуемый регистр так и не записана... Но не волнуйтесь, все в порядке. Если мы и попадаем на адрес 23, то обязательно сразу после команды по адресу 07, а все промежуточные команды не выполняются. Поэтому и содержимое стека такое же, как и до команды перехода. Все готово для умножения ась Вот после этой команды величина Ci потеряна для нас навсегда. Но она больше и не нужна.

24. Выдвигаем величину b на первый план. Она теперь — объект работы нескольких команд.

25—27. Вводим в регистр X число 2, делим на него b и запоминаем результат в регистре В.

28—29. Величина В возведена в квадрат, дискриминант вычислен. Однако прежде чем перейти к его анализу, нужно получить величину хг, так как она понадобится нам в обеих ветвях.

30. Извлекаем величину В из ее хранилища — регистра В.

31. Для деления нужна величина а. Проще всего вызвать се в стек заново

32—34. Теперь все вычисления по ветви 7—8 закончены. Величина хг отправлена на хранение в регистр 1, можно переходить к анализу величины d, благо она рядо*м.

35—37. Делаем последнее сравнение в программе. Если d>0, то корни действительные и надо перейти на ветвь И—12 (команда 48). Если же d<0, то корни комплексные, надо вычислять их по формулам ветви 9—10.

38—47. Ветвь 9—10.

38—39. Так как величина d меньше нуля, то, чтобы вычислить корни, нужно сначала изменить ее знак.

40. Для вычисления xjm нужна величина а. Проще всего опять-таки вызвать ее из регистра А.

41. Величина xim вычислена и находится в регистре X.

42—43. Все готово для вывода результата. Можно останавливать ПМК и считывать xim и хг с индикатора, но мы еще не вывели на индикатор сообщения о том, что за величины получены. Приходится отодвигать готовые результаты и переносить в регистр X шифрованное сообщение: Г. — -«Корни комплексные».

44—45. Сообщение прочитано. Возвращаем результаты вычислений на старое место и останавливаем программу, чтобы считать их.

46—47. Ветвь 9—10 замкнута.

48—60. Последняя ветвь 11—12.

48. Поскольку d находится в регистре X (как и после команды 35), то сразу же извлекаем квадратный корень.

49—50. Вычисляем вспомогательную величину •

51. Получаем^ первый корень Xi. Величина j/"— перешла в регистр

предыдущего результата XI.

52—54. Вычисляем второй корень хг. Расчеты закончены.

55—58. Вывод результатов организуется так же, как и в предыдущей ветви.

69—60. Вот и последние команды, реализация блока «Конец». Они подготавливают программу для приема новой информации, передавая управление на начало. Можно вводить новые данные и повторять расчет.

Вернемся к распределению памяти. Окончательная картина такова:

а b-*B; хг-> 1; ^г» Xi Y; xim» Хг X.

«Итак, три регистра удалось сэкономить. Если бы нам понадобилось ввести в оставшуюся часть программной памяти еще одну программу, то «лишние.» регистры очень бы пригодились

Теперь, как и было обещано, о получении шифрограмм. Сообщение Е00 получается, если в режиме вычислений выполнить следующие действия. Сначала набрать 100 ВП 99. На индикаторе, естественно, загорается ЕГГОГ. Не смущаясь, продолжаем: ВП t . На индикаторе то, что надо: Е00. Нажимаем ПО — и

шифрограмма отправляется на хранение в регистр 0.

Е01 и Е02 получаются аналогично, только вместо числа 100 нужно набрать соответственно 101 или 102. Алгоритм же для получения сообщения Г. другой: Сх f -s- (здесь, конечно, опять ЕГГОГ, ведь делится ноль на ноль), ВП Bnt. На индикаторе — то, что нужно. Можно теперь записать Г. в регистр 5.

Программа закончена. Не слишком ли она велика? Ведь уравнение, казалось бы, элементарное... Но фактически написаны четыре разные программы, каждая из которых рассматривает отдельный вариант уравнения, плюс еще одна, которая выбирает нужную из этой четверки. Это не так уж мало. Впрочем, программу можно действительно сократить. Как это делать, мы еще расскажем.

С другой стороны, работа еще не закончена. Специфика ПМК проявляется в том, что решение любой задачи на нем автоматизировано не полностью, оно реализуется совместными усилиями человека и микрокалькулятора. Программу для ПМК мы написали, а вот инструкцию, «программу для человека», пока еще нет. Такая инструкция необходима. Вот как она может выглядеть.

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

2. Установить режим вычислений (F АВТ).

3. Ввести шифры:

100 ВП 99 ВП f ПО

101 ВП 99 ВП f ПЗ

102 ВП 99 ВП t П4

Сх f -s- ВП ВП t П 5

4. Очистить программный указатель (В/О).

5. Ввести исходные данные: а С/П; b С/П; с С/П.

6. Вывод: после первого останова на индикаторе появляется сообщение:

Е00 — корней нет;

Е01—уравнение линейное, корень только один;

Е02 — два действительных корня;

Г. — корни комплексные.

7. Если корней нет, то для продолжения расчетов перейти к п. 5. Если корни есть, то нажать С/П. После останова на индикаторе — значение первого корня (если корни действительные) или мнимой части комплексных. Для чтения другого корня или действительной части нажать

ху:

8. Для продолжения расчетов перейти к п. 5.

Контрольный пример:

Ввод: а = 2; Ь = 5; с=3 а=1; Ь——4; с=5 а=0; Ь = 8; с=3 а=0; b = 0; c=J

Вывод: Е02; —1; —1,5 Г; I; 2 Е01; —3,75 • 10—1 Е00

41