对三个输入数字进行排序
Sort three input numbers
我正在看这个作业:
Write a program that takes three inputs and outputs them in ascending order.
我使用过以下 LMC 模拟器:https://www.101computing.net/LMC/#
这就是我到目前为止所做的:
INP 901 Input num1
STA 318 Store num1 in address 18
INP 901 Input num2
STA 319 Store num2 in address 19
INP 901 Input num3
STA 320 Store num3 in address 20
SUB 219 Subtract num2 from num3
BRP 810 Jump to address 10 if it is zero or positive (J1)
LDA 519 Load num2 from address 19
STA 320 Store num3 in address 20
LDA 520 Load num3 from address 20 (J1)
SUB 218 Subtract num1 from num3
BRP 815 Jump to address 18 if it is zero or positive (J2)
LDA 518 Load num1 from address 18
STA 320 Store num3 in address 20
LDA 520 Load num3 from address 20 (J2)
OUT 902 Output result
HLT 000 Stop program
DAT Data num1
DAT Data num2
DAT Data num3
我只找到了最大的数,不知道怎么升序排列。
我怎样才能以正确的顺序输出其他两个值?
首先对您提供的代码进行一些评论:
- 该代码无法在您链接的模拟器上解析。这是因为您将助记符(3 位字母代码)与指令代码(3 位数字)组合在一起。你应该只使用助记符。例如,写
INP
,而不是 INP 901
。
- 使用标签。因此,例如,不要写
STA 318
,根据前一点,它实际上应该是 STA 18
,而是写 STA num1
,并在相应的 DAT
行定义该标签: num1 DAT
。请注意,您链接到的模拟器甚至不接受没有标签的 DAT
。
- 在评论的开头使用分隔符(如
#
或 ;
)。虽然一些 模拟器不会介意你只写注释而没有这样的分隔符,但最好还是使用它。另外,您链接的模拟器似乎不支持评论。
- 当您发表评论时,请发表超越说明说明的评论。例如,将
Stop program
作为注释放在 HLT
旁边是没有用的。这应该是显而易见的。相反,发表评论来解释算法中指令的更高目的。例如“num3 是否大于 num2?”在第一个 BRP
. 会是很好的评论
因此,将上述更改应用于您的代码,您将得到:
#input: 3 2 1
INP
STA num1
INP
STA num2
INP
STA num3
comp23 LDA num3 # is num2 <= num3?
SUB num2
BRP sorted23 # yes
LDA num2 # no: copy it to num3
STA num3
sorted23 LDA num3 # is num1 <= num3?
SUB num1
BRP output # yes: we're done
LDA num1 # no: copy it to num3
STA num3
output LDA num3 # output the greatest
OUT
HLT
num1 DAT
num2 DAT
num3 DAT
<script src="https://cdn.jsdelivr.net/gh/trincot/lmc@v0.815/lmc.js"></script>
这将打印输入中的最大值。现在要排序 输入,您需要交换 对值。对于交换,您可以使用第四个变量 (temp
)。例如,要将 num2
与 num3
交换,您可以这样写:
LDA num3
STA temp # temporary save num3 here
LDA num2
STA num3 # now both are the same value
LDA temp # but we still have a copy...
STA num2
您可以对 3 个数字进行排序,最多进行 3 次交换。如果涉及第三次交换,它将与第一次交换相同。
这是如何工作的:
#input:3 2 1
INP
STA num1
INP
STA num2
INP
STA num3
comp23 LDA num3 # is num2 <= num3?
SUB num2
BRP sorted23 # yes
LDA num3 # no: swap num2 and num3
STA temp
LDA num2
STA num3
LDA temp
STA num2
sorted23 LDA num2 # is num1 <= num2
SUB num1
BRP sorted123 # yes: we're done
LDA num2 # no: swap num1 and num2
STA temp
LDA num1
STA num2
LDA temp
STA num1
BRA comp23 # repeat once
sorted123 LDA num1 # output the sorted list
OUT
LDA num2
OUT
LDA num3
OUT
HLT
num1 DAT
num2 DAT
num3 DAT
temp DAT # used for swapping
<script src="https://cdn.jsdelivr.net/gh/trincot/lmc@v0.815/lmc.js"></script>
我认为您指出的模拟器不是最好的。我在这个答案中使用的那个可用 here -- 我是它的作者。
我正在看这个作业:
Write a program that takes three inputs and outputs them in ascending order.
我使用过以下 LMC 模拟器:https://www.101computing.net/LMC/#
这就是我到目前为止所做的:
INP 901 Input num1
STA 318 Store num1 in address 18
INP 901 Input num2
STA 319 Store num2 in address 19
INP 901 Input num3
STA 320 Store num3 in address 20
SUB 219 Subtract num2 from num3
BRP 810 Jump to address 10 if it is zero or positive (J1)
LDA 519 Load num2 from address 19
STA 320 Store num3 in address 20
LDA 520 Load num3 from address 20 (J1)
SUB 218 Subtract num1 from num3
BRP 815 Jump to address 18 if it is zero or positive (J2)
LDA 518 Load num1 from address 18
STA 320 Store num3 in address 20
LDA 520 Load num3 from address 20 (J2)
OUT 902 Output result
HLT 000 Stop program
DAT Data num1
DAT Data num2
DAT Data num3
我只找到了最大的数,不知道怎么升序排列。
我怎样才能以正确的顺序输出其他两个值?
首先对您提供的代码进行一些评论:
- 该代码无法在您链接的模拟器上解析。这是因为您将助记符(3 位字母代码)与指令代码(3 位数字)组合在一起。你应该只使用助记符。例如,写
INP
,而不是INP 901
。 - 使用标签。因此,例如,不要写
STA 318
,根据前一点,它实际上应该是STA 18
,而是写STA num1
,并在相应的DAT
行定义该标签:num1 DAT
。请注意,您链接到的模拟器甚至不接受没有标签的DAT
。 - 在评论的开头使用分隔符(如
#
或;
)。虽然一些 模拟器不会介意你只写注释而没有这样的分隔符,但最好还是使用它。另外,您链接的模拟器似乎不支持评论。 - 当您发表评论时,请发表超越说明说明的评论。例如,将
Stop program
作为注释放在HLT
旁边是没有用的。这应该是显而易见的。相反,发表评论来解释算法中指令的更高目的。例如“num3 是否大于 num2?”在第一个BRP
. 会是很好的评论
因此,将上述更改应用于您的代码,您将得到:
#input: 3 2 1
INP
STA num1
INP
STA num2
INP
STA num3
comp23 LDA num3 # is num2 <= num3?
SUB num2
BRP sorted23 # yes
LDA num2 # no: copy it to num3
STA num3
sorted23 LDA num3 # is num1 <= num3?
SUB num1
BRP output # yes: we're done
LDA num1 # no: copy it to num3
STA num3
output LDA num3 # output the greatest
OUT
HLT
num1 DAT
num2 DAT
num3 DAT
<script src="https://cdn.jsdelivr.net/gh/trincot/lmc@v0.815/lmc.js"></script>
这将打印输入中的最大值。现在要排序 输入,您需要交换 对值。对于交换,您可以使用第四个变量 (temp
)。例如,要将 num2
与 num3
交换,您可以这样写:
LDA num3
STA temp # temporary save num3 here
LDA num2
STA num3 # now both are the same value
LDA temp # but we still have a copy...
STA num2
您可以对 3 个数字进行排序,最多进行 3 次交换。如果涉及第三次交换,它将与第一次交换相同。
这是如何工作的:
#input:3 2 1
INP
STA num1
INP
STA num2
INP
STA num3
comp23 LDA num3 # is num2 <= num3?
SUB num2
BRP sorted23 # yes
LDA num3 # no: swap num2 and num3
STA temp
LDA num2
STA num3
LDA temp
STA num2
sorted23 LDA num2 # is num1 <= num2
SUB num1
BRP sorted123 # yes: we're done
LDA num2 # no: swap num1 and num2
STA temp
LDA num1
STA num2
LDA temp
STA num1
BRA comp23 # repeat once
sorted123 LDA num1 # output the sorted list
OUT
LDA num2
OUT
LDA num3
OUT
HLT
num1 DAT
num2 DAT
num3 DAT
temp DAT # used for swapping
<script src="https://cdn.jsdelivr.net/gh/trincot/lmc@v0.815/lmc.js"></script>
我认为您指出的模拟器不是最好的。我在这个答案中使用的那个可用 here -- 我是它的作者。