#divide #little-man-computer
#разделить #маленький человек-компьютер
Вопрос:
Это то, что у меня есть до сих пор, но я не могу заставить его работать. Мне нужно, чтобы он вводил дивиденд и делитель и выводил результат вместе с остатком. Пример: если на входе 33, за которым следует 6, на выходе будет 5, за которым следует 3, поскольку 33/6 равно 5, остаток 3.
00 INP //ask the user
01 BRZ QUIT // halt the execution if input zero
02 STA DIVIDEND // store in dividend variable
03 INP // input dividor
04 BRZ QUIT // halt the execution if input zero
05 STA DIVISOR // store in divider variable
06 LDA DIVIDEND // load into acc
07 LOOP STA RESULT // store the temp result
08 LDA RESULT // load the result
09 SUB DIVISOR // subtract the dividor to acc BRP
10 BRP LOOP //loop if acc is positive or zero
11 LDA RESULT // load the result into acc
12 OUT // display the result
13 QUIT HLT // halt if zero
14 HLT // halt the execution
15 DIVIDEND DAT //declare variable
16 DIVISOR DAT
17 RESULT DAT
Комментарии:
1. Он отображает только остаток. Но мне это нужно для отображения обоих
Ответ №1:
В настоящее время вы правильно получаете входные данные, вычисляете остаток и выводите его. Вы просто пропускаете ту часть, где вы вычисляете частное и выводите его. Фактор — это действительно количество раз, когда вы возвращаетесь к началу цикла. Итак, увеличивайте счетчик на каждой итерации цикла. Затем, когда вы выйдете из цикла, вы посчитаете слишком много, поэтому для частного вы выведете на единицу меньше этого значения.
Другие замечания:
- Нет необходимости выполнять
LDA RESULT
, если это следует немедленноSTA RESULT
, поскольку это значение все еще находится в накопителе — нет необходимости его перезагружать. - Нет необходимости иметь
HLT
followed byHLT
. Эта вторая никогда не будет выполнена. - В комментариях бесполезно указывать, что делает инструкция LMC… Например, «спросить пользователя» не является полезным комментарием рядом с
INP
. Комментарии должны объяснить что-то еще — что-то специфичное для этой программы. Большинство ваших комментариев просто говорят о том, что кто-то может посмотреть в спецификации языка LMC. Это не цель комментариев.
Итак, вот ваш код с дополнительным счетчиком для получения частного и с учетом приведенных выше замечаний. Вы можете запустить его здесь.
#input: 19 9
INP // Input the dividend
BRZ QUIT // Zero is not considered a valid input
STA DIVIDEND
INP // Input divisor
BRZ QUIT // Division by zero is not allowed
STA DIVISOR
LDA ZERO // Initialise quotient
STA QUOTIENT
LDA DIVIDEND // Let dividend be the initial value of the remainder
// Repeat as long as remainder would be non-negative:
LOOP STA REMAINDER
LDA QUOTIENT // Increment quotient
ADD ONE
STA QUOTIENT
LDA REMAINDER // Reduce remainder
SUB DIVISOR
BRP LOOP
// Output the results
LDA QUOTIENT // quotient is one too great now
SUB ONE
OUT
LDA REMAINDER
OUT
QUIT HLT
// constants:
ZERO DAT 0
ONE DAT 1
// variables:
DIVIDEND DAT
DIVISOR DAT
QUOTIENT DAT
REMAINDER DAT
<script src="https://cdn.jsdelivr.net/gh/trincot/lmc@v0.813/lmc.js"></script>
Комментарии:
1. Божественно! Спасибо!