我正在课堂上实验室,我完全理解这里的概念,但我想我在某个地方犯了一个小错误,很可能是在第二个子程序中。我很难调试这个,希望有人可以指出我正确的方向。另外,要清楚,它正确编译和接受输入,它与我的计算有关。它输出错误的总成本。 谢谢!
路线&样本输出:
为杂货店编写一个程序来计算客户的总费用。
主要:
您的程序应该询问客户他/她正在购买的商品数量,并且应该检查它是否小于或等于
20
商品,那么您的程序应该通过而不是数字{{1}子例程并调用FillPriceArray
子例程。
FillPriceArray
子程序填充数组,累积价格并将总和返回FillPriceArray
。在
main
中,您可以获得用户的优惠券数量(应与商品数量相同),并将优惠券号码传递给main
子,并致电FillCouponArray
填写FillCouponArray
。
CouponArray
sub获取优惠券金额。优惠券应低于商品价格,如果优惠券超过商品价格或超过FillCouponArray
,则优惠券不得超过$10
,然后您$10
放入0
对于那张优惠券。此外,CouponArray
子会累积优惠券并将其返回FillCouponArray
。最后,您的
main
计划应该通过从总折扣优惠券中减去总价来计算总费用,然后在屏幕上显示总费用并附上感谢信息。示例输出:
main
到目前为止我的代码:
Please enter the number of item you are purchasing(should be less than or equal to 20)
21
Sorry too many items to purchase!! Please enter number of items you are purchasing
3
Please enter the price of item 1
10
Please enter the price of item 2
10
Please enter the price of item 3
20
Please enter the number of coupons that you want to use.
4
Too many Coupons!! Please enter the number of coupons that you want to use.
3
Please enter the amount of coupon 1
15
This coupon is not acceptable
Please enter the amount of coupon 2
$5
Please enter the amount of coupon 3
$5
Your total charge is: $30
Thank you for shopping with us.
答案 0 :(得分:2)
所以,问题在于FillCouponArray
。其中有一些无关的代码可以简化,但这不是主要问题。您的代码未能保留适当的累计金额。
让我们看看最后一部分:
li $v0, 5 #loads integer into $v0
syscall
add $t3, $v0, $0 #adds input to t3
bgt $t3, $t0, error3 #if input is > 10, go to error
bgt $t3, $t5, error3 #if input is > price number
sw $t3, 0($s1) #stores the integer into array1
add $t3, $t3, $v0 #adds number to sum
在阅读优惠券价值后,您将其存储在$v0
中。然后,将其存储在$t3
中。起初看起来很好。这两个错误检查也很好,也很花哨。将它保存到阵列也是正常的。
然而,最后一行是它首次崩溃的地方。 add $t3, $t3, $v0
等同于$t3 = $t3 + $v0
。因此,对于9
的输入,如果所有检查都通过,$t3 = 9 + 9 = 18
。不行。你的累积金额已经翻倍了。
但这是一个两阶段的失败。当循环返回到下一个输入时,add $t3, $v0, $0
为$t3 = $v0 + 0
。您现在用新输入覆盖$t3
,销毁累积总和。
最后,您最有可能看到的是您的项目总数减去最后一张优惠券的两倍。你可能不想要的。
我写MIPS已经3年了,因为这是一项任务,我认为最快的方法是替换$t3
中的累积和跟踪器add $t3, $t3, $v0
与另一个可用的寄存器,并返回该寄存器。
如果你想更多地清理它,我会建议一些改变:
无需将$v0
移至$t3
。您可以使用$v0
进行检查。
如果您正在使用输入进行简单的累加,那么不需要数组。
就是这样。希望它有效。