Помогите, пожалуйста, справиться с одной небольшой задачей: имеется небольшой фрагмент кода; необходимо определить его предназначение и принцип работы.
ИПA - выбор числа из ячейки памяти А
ИПB - выбор числа из ячейки памяти B
* - произведение вышеназванных чисел
|x| - получение абсолютного значения произведения
ПC - сохранение числа в ячейке С
Формула 1: C=|A*B| (буквы соответствуют названиям ячеек)
ИПA - выбор числа из ячейки памяти А
ИПB - выбор числа из ячейки памяти B
/ - деление числа из ячейки A на число из ячейки B
П9 - сохранение полученного числа в ячейке 9
Формула 2: 9=|A/B| (буквы и цифры соответствуют названиям ячеек)
КИП9 - косвенное извлечение памяти, однако похоже команда используется не для основного назначения, а для получения целого числа из дробного. поэтому преобразовав формулу 2 получим:
Формула 3: 9=INT|A/B| (буквы и цифры соответствуют названиям ячеек)
ИПA - выбор числа из ячейки памяти А
ИПB - выбор числа из ячейки памяти B
ПА - сохранение полученного числа B в ячейке А
ИП9 - выбор числа из ячейки памяти 9
* - произведение чисел из ячеек B и 9
- - вычитание из числа А названного произведения.
ПB - сохранение полученного числа в ячейке B
Формула 4: B=B*9-A
Если значение на индикаторе равно 0 (вышенайденное значение B) то переход к команде под номером 05 иначе продолжение
ПC - сохранение полученного числа в ячейке C
<-> - неизвестная мне команда, возможно обозначает обмен значений между регистрами X и Y. Если моя догадка верна, то далее следует:
/ - деление числа из ячейки C на число из ячейки B
С/П - остановка (конец программы)
Еще очень важно знать для какого именно калькулятора написана эта программа, судя по синтаксису для Б3-34, но полной уверенности нет. Кроме этого к программе обычно прилагается инструкция в которой говориться о необходимом стартовом содержании ячеек памяти.
Последний раз редактировалось Dimon012; 17.02.2013 в 09:33.
Еще очень важно знать для какого именно калькулятора написана эта программа, судя по синтаксису для Б3-34, но полной уверенности нет.
Что касается калькулятора, то это, скорее, уже третье поколение (МК-61 и т. д.), на что намекает команда |x| - у Б3-34 её ещё не было. Но тогда вопрос насчёт КИП9 - ведь есть же команда [x] для взятия целой часть, зачем так изощряться? Такие приёмы обычно и делают код нечитаемым, хотя зачастую позволяют его сократить и повысить быстродействие программы.
Кроме этого к программе обычно прилагается инструкция в которой говориться о необходимом стартовом содержании ячеек памяти.
Да, как-то забыл про них написать. Два числа (a и b) вводятся в регистры РA и РB (об этом намекают и первые две команды), результат работы - РX (на индикаторе). Хотя не уверен, что программа безошибочна: прогоняю по эмулятору, почему-то выдаёт ошибку.
Если значение на индикаторе равно 0 (вышенайденное значение B) то переход к команде под номером 05 иначе продолжение
Скорее, наоборот. Название команды - "проверка условия", т. е. если оно не выполняется, уходим, иначе идём дальше.
обозначает обмен значений между регистрами X и Y
Именно так.
Судя по вводимым значениям, программа ищет какое-то общее для двух чисел них значение, типа НОД или какого-нибудь среднего.
Всё-таки противоречие. У двухместных операций на первом месте стоит Y, на втором X. Когда перемножились РB и Р9, результат остался в иксе, а значение РA - в игреке (съехало в него после умножения). Соответственно, при вычитании именно оно будет уменьшаемым, а полученное произведение - вычитаемым. Поэтому здесь верен первый вариант (А-В*9).
Попробую собрать приведённые Вами формулы до кучи, представив алгоритм более наглядно.
А вот с последним участком интереснее. Скорее всего, в команде ПС и лежит ошибка, ведь мы до этого никогда к регистру РC не обращались, хотя значение в нём уже есть. Очевидно, имелось в виду извлечение из него, а не запись, т. е. ИПC. Тогда ещё возникает вопрос: зачем тут команда обмена X и Y (<->), если значения можно просто извлечь в обратном порядке и разделить?
В таком случае предположим, что имеем дело с такой программой (послали, куда следует, кастрацию дроби при помощи КИПа, а также абсолютно никчёмный обмен регистрами):
Что касается калькулятора, то это, скорее, уже третье поколение (МК-61 и т. д.), на что намекает команда |x| - у Б3-34 её ещё не было. Но тогда вопрос насчёт КИП9 - ведь есть же команда [x] для взятия целой часть,
Ну как же не было, модуль числа это святое дело он еще в Б3-21 был, даже на клавиатуре можно видеть, только палки косые "/-/". А вот команды получения целого числа, у Б3-21 и Б3-34, не было отсюда и КИП9.
Сообщение от Русский
...зачем так изощряться? Такие приёмы обычно и делают код нечитаемым, хотя зачастую позволяют его сократить и повысить быстродействие программы.
Ну о читаемости кода никогда разговоров не было, да и какая читаемость, если команд всего 61 (у Б3-21) и 98 (у Б3-34), наоборот применялись всякие ухищьрения для уменьшения длины кода!
Сообщение от Русский
Да, как-то забыл про них написать. Два числа (a и b) вводятся в регистры РA и РB (об этом намекают и первые две команды), результат работы - РX (на индикаторе). Хотя не уверен, что программа безошибочна: прогоняю по эмулятору, почему-то выдаёт ошибку.
Надо в пошаговом режиме погонять, найти в каком месте баг.
Сообщение от Русский
Скорее, наоборот. Название команды - "проверка условия", т. е. если оно не выполняется, уходим, иначе идём дальше.
Всё-таки противоречие. У двухместных операций на первом месте стоит Y, на втором X. Когда перемножились РB и Р9, результат остался в иксе, а значение РA - в игреке (съехало в него после умножения). Соответственно, при вычитании именно оно будет уменьшаемым, а полученное произведение - вычитаемым. Поэтому здесь верен первый вариант (А-В*9).
При перемножании в игреке ничего не остается, точнее стек поднимается т.е. при бинарной операции, например умножении x умножается на y и результат пишется в x, в y поднимается значение из z в z из т. см. диаграмму работы стека F(x,y)[Ссылки могут видеть только зарегистрированные пользователи. ], при вычитании происходит y-x, а не на оборот, иначе ручной ввод нелогичен, а именно <уменьшаемое, стрелка (сдвиг стека), вычитаемое, минус>, при вычислениях по программе все так же как и при ручном вводе!
Ну как же не было, модуль числа это святое дело он еще в Б3-21 был
Где? "/-/" - это просто смена знака числа.
При перемножании в игреке ничего не остается, точнее стек поднимается т.е. при бинарной операции, например умножении x умножается на y и результат пишется в x, в y поднимается значение из z в z из т. см. диаграмму работы стека F(x,y)[Ссылки могут видеть только зарегистрированные пользователи. ], при вычитании происходит y-x, а не на оборот, иначе ручной ввод нелогичен, а именно <уменьшаемое, стрелка (сдвиг стека), вычитаемое, минус>, при вычислениях по программе все так же как и при ручном вводе!
Так я именно об этом и написал, указав, что в Y съехало значение, прежде засунутое в стек, а вычитание происходит X из Y.
Надо в пошаговом режиме погонять, найти в каком месте баг.
Именно на последнем участке, деление на ноль, я так понял. Изменив код, как я написал выше, вроде бы всё работает.
а еще в Б3-34, была такая фича:
чтобы иметь возможность его останавливать, допустим раз в час или когда захочется, ставишь условие на синус какого либо угла, а в процессе вычислений переключаешь положение градусы-радианы и тогда программа корректно останавливается! А далее оказалось, что этот переключатель можно ставить и в среднее положение, тогда он считает грады!!! Короче была возможность динамически воздействовать на работу программы!!!!!