对于小人电脑 (LMC)模拟器,我有以下任务:
您的代码必须接受介于1到15之间的数字。在显示新的总计之前,它必须将数字2(添加到提交的数字)中。必须重复此过程,直到最终总数达到14或15。此时,程序必须结束。注意:您的最终代码不能输出任何负数。
因此,应该以2,4,6,8,10,12,14或3,5,7,9,11,13,15顺序显示输出。
我面临的问题是,无论我输入的数字介于1到15之间,它只是将数字单独乘以并输出。
到目前为止,我的代码如下:
INP
STA 11
ADD 11
OUT
ADD 11
OUT
ADD 11
OUT
HLT
2我做错了什么?
发布于 2020-10-30 11:44:37
关于你写的东西的一些评论:
因此,应该以2,4,6,8,10,12,14或3,5,7,9,11,13,15顺序显示输出。
指令使得不可能得到以2开头的输出,因为最小输入值被认为是1,程序应该在第一个输出之前添加2。因此,这意味着输出的第一个值至少为3。
由于输入可以是更大的值(最多为15),输出序列可以比所指示的更短。例如,如果输入为10,则输出应该仅为12,14。
这也意味着,如果用户输入14或15,程序将根本不会产生任何输出。
我面临的问题是,无论我输入的数字介于1到15之间,它只是将数字单独乘以并输出。
代码中使用2的行是什么都不做,就像在LMC语言中一样,常量值需要附带一个DAT助记符:
DAT 2如果您这样做了,值2将存储在邮箱10中。但是即使这样,您也不会在代码中访问该邮箱,因此在执行过程中的任何阶段都不会添加2。
相反,您可以将输入存储在邮箱11 (这是可以的),然后将邮箱11添加到邮箱11中,这实际上会导致该数字的两倍。再重复两次,输出三倍这个数字,四倍这个数字。
您应该使用标签而不是对邮箱的数字引用(就像对11的引用一样)。所以你应该有这样的东西:
two DAT 2
sum DAT然后按以下方式使用这些标签:
INP
STA sum ; instead of 11
ADD two ; this will add 2有人能帮我解决我做错的事吗?
除了上面提到的点,您的尝试缺少一个条件循环。它应该在某个地方验证累积的总和还没有达到极限(14或15),如果是的话--而且只有那时--它应该继续再加2,然后输出它。
您可以通过执行减法来有条件地重复代码,并在BRP中检查结果不为负值。因此,根据减法结果,您可以让循环中的代码继续执行,或者让它退出该循环。如果循环,它最终会再次到达这个点,在那里它将重复减法和检查。在某个时候,减法结果会有一个不同的符号,BRP的反应也会不同。这样你就可以脱离循环了。
解决方案
下面是您可以在这里运行的实现(运行代码段来组装LMC代码,然后单击新显示的run按钮来实际运行组装的代码)。
#input: 1
INP
STA sum
loop SUB n14 ; compare sum with 14
BRP end ; stop when sum is equal or greater...
LDA sum
ADD two
STA sum
OUT
BRA loop ; repeat
end HLT
two DAT 2
n14 DAT 14
sum DAT
<script src="https://cdn.jsdelivr.net/gh/trincot/lmc@v0.78/lmc.js"></script>
发布于 2020-10-29 18:27:14
所以简单地说,
您的代码正在读取一个数字,然后将其添加到自身中三次,然后在每个数字之后打印(如果操作得当,也应该使用一个循环)。
因为这是一项任务,所以我将由您来研究如何用实际的LMC代码来编写它。定义常量(如2)的操作码是DAT,使用这个原始指令集,比较两个数字的方法是减去它们。然后使用“分支如果为零或正”操作码来决定是否回循环。
https://stackoverflow.com/questions/64580342
复制相似问题