我的MARIE程序中的逻辑错误在哪里?

问题描述 投票:0回答:1

我正在尝试编写一个 MARIE 程序,打印出“Grade”一词,然后用户输入考试分数,然后输入你的
程序显示该字母。
因此,用户将启动您的程序,“Grade”一词出现在输出窗口中。输入框转动
粉红色,用户输入 79,字母 C 被附加到输出窗口,显示:“Grade C”
确保输入框设置为 Dec,输出框设置为 No Linefeeds(还有一个明确的
选项)。但我在实现比较逻辑以及使用相应的输入分数打印正确的成绩时遇到了麻烦。

我认为我的 MARIE 程序的问题在于我使用 SUBT 指令比较分数的方式。我认为当你用较小的值减去较大的值时,结果将为负数,并且 SKIPCOND 指令不会按预期跳过下一条指令。所以这就是我试图修复它的方法:

  1. 颠倒了比较顺序,从最低等级(F)到最高等级(A)。

  2. 删除了 PrintGrade 部分中 OUTPUT 指令之前的 LOAD OutputChar 指令。

    完成此操作后,我现在认为,程序将根据输入分数正确分配适当的成绩字母,并将其与“Grade”字符串一起输出。

    实际结果:无论用户输入什么,等级“F”都是我得到的唯一输出。

    这是迄今为止我的代码:

    ORG 100
    
    Start, OUTPUT / Output "Grade " string
    INPUT / Read the exam score
    STORE Score / Store the input score
    
    LOAD Score / Load the score
    SUBT Sixty / Check if score is < 60
    SKIPCOND 400 / If result is negative (score < 60), skip next
    JUMP OutputF / Jump to output F
    
    LOAD Score / Reload score for next check
    SUBT Seventy / Check if score is < 70
    SKIPCOND 400 / If result is negative (score < 70), skip next
    JUMP OutputD / Jump to output D
    
    LOAD Score / Reload score for next check
    SUBT Eighty / Check if score is < 80
    SKIPCOND 400 / If result is negative (score < 80), skip next
    JUMP OutputC / Jump to output C
    
    LOAD Score / Reload score for next check
    SUBT Ninety / Check if score is < 90
    SKIPCOND 400 / If result is negative (score < 90), skip next
    JUMP OutputB / Jump to output B
    
    JUMP OutputA / If none above, output A
    
    OutputA, LOAD LetterA
    STORE OutputChar
    JUMP PrintGrade
    
    OutputB, LOAD LetterB
    STORE OutputChar
    JUMP PrintGrade
    
    OutputC, LOAD LetterC
    STORE OutputChar
    JUMP PrintGrade
    
    OutputD, LOAD LetterD
    STORE OutputChar
    JUMP PrintGrade
    
    OutputF, LOAD LetterF
    STORE OutputChar
    
    PrintGrade, LOAD OutputChar
    OUTPUT
    HALT / End program
    
    Score, DEC 0
    Ninety, DEC 90
    Eighty, DEC 80
    Seventy, DEC 70
    Sixty, DEC 60
    LetterA, HEX 41 / ASCII for 'A'
    LetterB, HEX 42 / ASCII for 'B'
    LetterC, HEX 43 / ASCII for 'C'
    LetterD, HEX 44 / ASCII for 'D'
    LetterF, HEX 46 / ASCII for 'F'
    OutputChar, DEC 0
    
    Grade, HEX 47 / 'G'
          HEX 72 / 'r'
          HEX 61 / 'a'
          HEX 64 / 'd'
          HEX 65 / 'e'
          HEX 20 / ' '
          HEX 0 / null terminator
    
    END
    
assembly architecture marie
1个回答
0
投票

If result is negative (score < 60), skip next
但这意味着如果分数 >= 60,你
JUMP OutputF
所以当然会输出
F
。更糟糕的是,
SKIPCOND 400
等于 0,因此除了 60 之外,您将为所有内容输出
F
,您应该得到
D

解决方法是在任何地方都使用

SKIPCOND 800
,这样如果分数大于或等于正在测试的成绩,你就可以跳过。另外,请确保您知道如何处理边界情况(例如,
90
是否已经是
A
?)

© www.soinside.com 2019 - 2024. All rights reserved.