首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >输出序列

输出序列
EN

Stack Overflow用户
提问于 2020-10-28 19:52:04
回答 2查看 381关注 0票数 0

对于小人电脑 (LMC)模拟器,我有以下任务:

您的代码必须接受介于1到15之间的数字。在显示新的总计之前,它必须将数字2(添加到提交的数字)中。必须重复此过程,直到最终总数达到14或15。此时,程序必须结束。注意:您的最终代码不能输出任何负数。

因此,应该以2,4,6,8,10,12,14或3,5,7,9,11,13,15顺序显示输出。

我面临的问题是,无论我输入的数字介于1到15之间,它只是将数字单独乘以并输出。

到目前为止,我的代码如下:

代码语言:javascript
复制
INP
STA 11
ADD 11
OUT
ADD 11
OUT
ADD 11
OUT
HLT

2

我做错了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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助记符:

代码语言:javascript
复制
DAT 2

如果您这样做了,值2将存储在邮箱10中。但是即使这样,您也不会在代码中访问该邮箱,因此在执行过程中的任何阶段都不会添加2。

相反,您可以将输入存储在邮箱11 (这是可以的),然后将邮箱11添加到邮箱11中,这实际上会导致该数字的两倍。再重复两次,输出三倍这个数字,四倍这个数字。

您应该使用标签而不是对邮箱的数字引用(就像对11的引用一样)。所以你应该有这样的东西:

代码语言:javascript
复制
two DAT 2
sum DAT

然后按以下方式使用这些标签:

代码语言:javascript
复制
    INP
    STA sum ; instead of 11
    ADD two ; this will add 2

有人能帮我解决我做错的事吗?

除了上面提到的点,您的尝试缺少一个条件循环。它应该在某个地方验证累积的总和还没有达到极限(14或15),如果是的话--而且只有那时--它应该继续再加2,然后输出它。

您可以通过执行减法来有条件地重复代码,并在BRP中检查结果不为负值。因此,根据减法结果,您可以让循环中的代码继续执行,或者让它退出该循环。如果循环,它最终会再次到达这个点,在那里它将重复减法和检查。在某个时候,减法结果会有一个不同的符号,BRP的反应也会不同。这样你就可以脱离循环了。

解决方案

下面是您可以在这里运行的实现(运行代码段来组装LMC代码,然后单击新显示的run按钮来实际运行组装的代码)。

代码语言:javascript
复制
#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>

票数 1
EN

Stack Overflow用户

发布于 2020-10-29 18:27:14

所以简单地说,

  1. 输入一个数字
  2. 如果分支小于零,则中止(分支到末端)
  3. 如果为零,则中止(分支到结束)
  4. 如果大于14,则中止(分支到末端)
  5. 加2
  6. 打印
  7. 分支机构改为4处

您的代码正在读取一个数字,然后将其添加到自身中三次,然后在每个数字之后打印(如果操作得当,也应该使用一个循环)。

因为这是一项任务,所以我将由您来研究如何用实际的LMC代码来编写它。定义常量(如2)的操作码是DAT,使用这个原始指令集,比较两个数字的方法是减去它们。然后使用“分支如果为零或正”操作码来决定是否回循环。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64580342

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档