Определение процентного вклада величин в общую сумму


Главная / ЭКВМ / Программы для ЭКВМ / Математика

Предположим, что у нас имеется ряд чисел, и требуется найти, какую часть составляет каждое в процентах от общей суммы. Приведенная программа разработана московским инженером А.Б. Бойко и была опубликована в [1] и в одном из номеров журнала Наука и Жизнь.

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

  x0 x1 x2 x3 x4 x5 x6 x7 x8 x9
0x Cx ПD ПС ИПD С/П В↑ - Fx≠0 25
1x KПD ИПС + ПС 1 1 ИПD 1 +
2x ПD - F√ БП 03 ИПС 2 F 10x ÷ ПС
3x ИПD 1 - ПD КИПD ИПС КПD ИПD Fx=0 30
4x С/П                

Для работы с программой следует нажать "В/О", "С/П". После этого ввести очередное число и нажать клавишу "С/П". Количество введённых чисел выводится в RX перед вводом очередного числа. Для окончания ввода следует набрать число π: "Fπ", "С/П". После окончания расчёта на индикатор также выводится это число. Процентный вклад чисел находится в регистрах от R0 до RC.

В связи с ограниченным числом регистров памяти в микрокалькуляторах МК-61, МК-52 (далее - ПМК), для которых была разработана приведенная программа, обработать в ней можно не более 11 чисел. Хотя для решения большинства практических задач и этого достаточно.

В адресах 00-04 происходит очистка регистров RC и RD и вывод счетчика в RX. В адресах 05-09 введённое число сравнивается с π. В случае равенства происходит переход к адресу 25. В 10-14 введенное число косвенно через счётчик RD заносится в регистр памяти от R0 до RB. Сумма введённых чисел накапливается в RC. В 15-24 происходит увеличение счётчика на единицу и сравнение его с числом 11. В случае превышения допустимого количества введённых чисел возникает ошибка при вычислении квадратного корня от отрицательного значения. Иначе программа переходит к адресу 03 для ввода очередного числа. В адресах 25-29 накопленная сумма делится на 100 для получения долей в процентах. В 30-39 происходит пересчет содержимого регистров в доли. Цикл организован при помощи уменьшения счётчика на единицу и последующего сравнения с нулём. В 40-41 вывод числа π и останов.

Эта программа будет корректно исполняться на ПМК и в большинстве случаев на клавишных ЭВМ "Электроника МК-152" и "Электроника МК-161" (далее - ЭКВМ). Но при вводе двенадцатого числа, не равного π, на ЭКВМ программа будет работать не так, как задумал автор.

В программе для обработки этой ситуации использована особенность работы ПМК. После аварийного останова в результате выполнения некорректной операции выполнение программы продолжается не с того места, в котором она была остановлена. Один шаг программы пропускается. Поэтому в ПМК после вывода сообщения "ERROR" по адресу 22 исполнение будет продолжено с адреса 24. При этом в стек заносится число 3 (код этой команды 03h соответствует адресу перехода). Это число не влияет на выполнение дальнейшей части программы по адресам 25-41.

В ЭВМ программа продолжает выполнение со следующей команды без каких-либо пропусков. Что, вообще говоря, гораздо правильнее. Но это приведёт к тому, что в программе переход на адрес 03 будет выполнен в любом случае и счетчик в регистре RD будет увеличен на единицу. В дальнейшем это вызовет ошибки, независимо от того, будет ввод чисел продолжен далее или завершён. Для устранения различия с ПМК на ЭКВМ после останова с выдачей сообщения "ERROR" следует нажать клавишу "ШГ вправо". Это вызовет пропуск одного шага программы, что и требуется.

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

Перепишем программу так, чтобы ошибок при выполнении на ЭКВМ не возникало. Воспользуемся наличием большого количества регистров памяти для расширения возможностей программы. Увеличим максимальное количество обрабатываемых чисел до 47. Для окончания ввода вместо числа π будем использовать отрицательное значение. Заодно будет запрещён ввод отрицательных чисел, что в рассмотренной программе не предусмотрено.

  x0 x1 x2 x3 x4 x5 x6 x7 x8 x9
0x 1 П0 Сх РП 99 Cx B↑ B↑ ИП0 С/П
1x F≥0 28 РКП 00 РИП 99 + РП 99 ИП0
2x 1 + П0 4 8 - F≥0 05 КИП0 ИП0
3x Fx≠0 05 РП 98 РИП 99 2 F10x ÷ РП
4x 99 РКИП 00 РИП 99 ÷ ПП 77 РКП
5x 50 КИП0 ИП0 Fx=0 41 1 П0 ПП 77 Cx
6x ИП0 РКИП 00 РКИП 50 С/П ИП0 1 + П0
7x РИП 98 - Fx≥0 57 БП 00 ИП0 5 0
8x + РП 50 В/О            

Для работы с программой следует нажать клавиши "В/О", "С/П". После этого поочерёдно вводить числа и нажимать клавишу "С/П". Номер вводимого числа выводится в RX. После ввода сорок седьмого по счёту или отрицательного числа происходит расчёт долей. После расчёта на каждое нажатие "С/П" на индикатор выводится: в RZ - номер числа, в RY - введённое значение и в RX - доля в процентах. Можно и не пролистывать всю память, а считать нужные значения прямо из регистров, что более удобно делать в режиме просмотра из главного меню ЭКВМ.

Для накопления суммы используются регистр памяти R99. Регистр R0 выполняет роль счетчика. В регистрах R1-R47 сохраняются введённые значения. В R51-R97 вычисленные значения долей в процентах. Регистры R50 и R98 служат для временного хранения значений счетчика.

Программа получилась вдвое большего размера, но для ЭКВМ это большого значения не имеет. В адресах 00-09 происходит инициализация начальных значений и вывод на индикатор номера очередного вводимого числа. Команды 10-11 требуются для проверки ввода отрицательного значения. В адресах 12-27 происходит косвенная запись в регистры R1-R47, подсчёт суммы в R99 и проверка на превышение допустимого количества введённых чисел. В 28-31 происходит проверка ввода хотя бы одного числа. В 32-40 проводится подготовка к расчёту долей. В 41-54 организован цикл в котором искомые доли вычисляются и записываются в регистры R51-R97. В адресах 55-76 происходит циклический вывод на индикатор сохранённых и расчитанных величин. Расчёт и вывод организованы в разных циклах для того, чтобы можно было не пролистывать все вычисленные значения долей, а считать их непосредственно из регистров. Кроме того, командами "БП 55", "С/П" вывод можно повторить заново. В 77-83 расположена подпрограмма, которая помещает в R50 для последующего косвенного обращения значение R0+50.

Команды "РП ММ", "РИП ММ", "РКП ММ" и "РКИП ММ" выполняют прямую и косвенную запись и чтение из регистров памяти от R0 до R99. Команда "КИП0" по адресу 28 используется в программе для вычитания единицы из R0. Команда "РКИП 00" не уменьшает содержимое регистра R0 на единицу. В остальном действие этих команд аналогично.

Эта возможность ЭКВМ напоминает использование недокументированных команд "КП↑" и "КИП↑" калькулятора Б3-34, которые обращались косвенно через R0 без вычитания из него единицы. Они были утрачены в моделях МК-61 и МК-52 с появлением пятнадцатого регистра памяти RE.

Изменение назначения команд с кодами 4Eh и 6Eh вызвало в своё время необходимость адаптирования некоторых программ калькулятора Б3-34 к модели МК-61. Один из возможных способов, это замена упомянутых команд на последовательность "ИП0", "ПЕ", "FO", "КИПЕ" (или "КПЕ"), что занимает четыре шага программы и уничтожает содержимое регистров стека RT и RX1.

Перенести в ЭКВМ программу Б3-34 с командами "КП↑" и "КИП↑" несколько проще. Для этого достаточно использовать команды "РКП 00" и "РКИП 00", которые занимают всего два шага и ничего лишнего не изменяют.

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




Литература

  1. Данилов И.Д. Секреты программируемого микрокалькулятора. - М.: Наука. Гл. ред. физ.-мат. лит., 1986. - 160 с. - (Б-чка "Квант". Вып. 55.)


НПП "СЕМИКО" (383) 271-01-25 (многоканальный)