微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

输出序列 解决方案

如何解决输出序列 解决方案

对于Little Man Computer(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

我在做什么错了?

[![LMC运行图片] [2]] [3]

解决方法

关于您所写内容的一些评论:

因此它应该将输出显示为序列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添加到该邮箱中,这实际上是该数字的两倍。然后再精确重复2次,这样就输出了该数字的三倍和该数字的四倍。

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

two DAT 2
sum DAT

,然后按如下所示使用这些标签:

    INP
    STA sum ; instead of 11
    ADD two ; this will add 2

有人可以帮我解决我做错的事情吗?

除了上述要点外,您的尝试还没有条件循环。它应该在某个地方验证累计的总和未达到限制(14或15),如果是-并且只有那时-才应继续将总和再加上2并输出。

您可以通过减法有条件地重复代码,并用BRP检查结果是否为负。因此,根据减法结果,可以让执行在循环中继续执行代码,也可以让其退出该循环。如果循环,最终它将再次到达该点,在该点将重复减法和检查。在某些时候,减法结果将具有不同的符号,并且BRP将有不同的反应。这样您就可以摆脱循环。

解决方案

这是一个可以在此处运行的实现(运行代码片段以汇编LMC代码,然后单击新显示的“运行”按钮以实际运行汇编的代码)。

#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. 输入号码
  2. 中止(分支到结尾)如果小于零
  3. 中止(分支到结尾)是否为零
  4. 中止(分支到结尾),如果大于14
  5. 添加2
  6. 打印
  7. 分支到4

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

由于这是一项任务,因此我将留给您了解如何在实际的LMC代码中编写此代码。定义一个类似2的常量的操作码是DAT,并且使用此原始指令集,比较两个数字的方法是将它们相减。然后使用“如果为零或为正则分支”操作码来决定是否回送。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。