【问题标题】:Show how many positive and negative numbers were input显示输入了多少正数和负数
【发布时间】:2019-11-19 20:13:26
【问题描述】:

我正在尝试编写一个小人计算机程序,输出我有多少正数和多少负数,但它也将负数视为正数。

这是我目前所拥有的:

LOOP IN 
     STO NUM
     BRZ END
     BRP POS
POS  LDA ZERO 
     ADD UN 
     STO ZERO 
END  LDA ZERO
     OUT 
     BR LOOP
     HLT
NUM  DAT 000
UN   DAT 001
ZERO DAT 000

【问题讨论】:

标签: algorithm loops little-man-computer


【解决方案1】:

规范不支持为 LMC 提供负输入。 LMC 存储单元只能保存 0 到 999 之间的值(来源:Wikipedia)。 “否定”的唯一概念由 LMC 的 negative 标志表示。该标志ADDSUB的执行设置,而不是由INP/INLDASTA设置/STO(拼写不同)。另见伊恩的these notes! D. Allen 在那里讨论了这个令人困惑的概念。

这实际上意味着您的 BRP 指令将始终分支到提供的标签。

您可能会发现实际上允许负输入的模拟器,但这将是对原始规范的扩展。

现在,您的代码也有这个BRP POS 指令的问题,因为它只是跳转到下一行(标记为POS),所以实际上BRP 是否会分支并没有任何区别:这是一个无操作。

类似的练习

由于 LMC 中实际上并不存在负值,让我们做一些不同的练习:考虑 10 的补码中呈现的输入,因此 500..999 将被视为负值(即 -500... -1)。或者,当您执行INP 时,签名的输入值实际上将存储在 10 的补码中。然后计算小于 500(正数)和非 500 的输入数(因为这些在解释为 10 的补码时为负数)。

LOOP    INP
        BRZ FINISH
        SUB COMPARE
        BRP ELSE
        LDA LESS
        ADD ONE
        STA LESS
        BRA LOOP
   ELSE LDA NOTLESS
        ADD ONE
        STA NOTLESS
        BRA LOOP
 FINISH LDA LESS
        OUT
        LDA NOTLESS
        OUT
        HLT
   LESS DAT
NOTLESS DAT
COMPARE DAT 500
    ONE DAT 1
    
<script src="https://cdn.jsdelivr.net/gh/trincot/lmc@v0.6/lmc.js"></script>

确保为程序提供最终的 0 值以输出结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-02
    相关资源
    最近更新 更多