Math 使用除法以MIPS中的百分比计算分数
我正在制作一个小的数学测验程序,向玩家提问基本的数学问题,并记录他们的总分。最后,我想计算并显示他们的总分百分比。这意味着被问问题总数的百分之多少被正确回答。然而,我绞尽脑汁想弄清楚如何正确显示这个百分比。计算百分比的数学运算都是在exit函数中完成的,但是我附加了整个程序作为上下文。它很有名。请告知我能做些什么使最终结果正确 另外,顺便问一下,有没有更好的方法来解决除法问题?目前我唯一能做的就是让答案是没有余数的商。。。这显然是一个糟糕的解决方案Math 使用除法以MIPS中的百分比计算分数,math,assembly,mips32,Math,Assembly,Mips32,我正在制作一个小的数学测验程序,向玩家提问基本的数学问题,并记录他们的总分。最后,我想计算并显示他们的总分百分比。这意味着被问问题总数的百分之多少被正确回答。然而,我绞尽脑汁想弄清楚如何正确显示这个百分比。计算百分比的数学运算都是在exit函数中完成的,但是我附加了整个程序作为上下文。它很有名。请告知我能做些什么使最终结果正确 另外,顺便问一下,有没有更好的方法来解决除法问题?目前我唯一能做的就是让答案是没有余数的商。。。这显然是一个糟糕的解决方案 .data startMsg: .
.data
startMsg: .asciiz "Hello, welcome to MathQuiz, here is your first problem:\nEnter -100 to exit\n"
qf1: .asciiz "What is "
qf2: .asciiz "? "
a1: .asciiz "Correct!\n"
a2: .asciiz "Incorrect!\n"
emf1: .asciiz "You solved "
emf2: .asciiz " math problems and got "
emf3: .asciiz " correct and "
emf4: .asciiz " incorrect, for a score of "
emf5: .asciiz "%.\nThanks for playing!"
operator1: .asciiz " + "
operator2: .asciiz " - "
operator3: .asciiz " * "
operator4: .asciiz " % "
totalCount: .word -1
correctCount: .word 0
incorrectCount: .word 0
scoreCalc: .word 0
correctAnswer: .word 0
wrongAnswer: .word 0
derp: .word 0
.text
.globl main
main:
li $v0, 4 # greet the user
la $a0, startMsg
syscall
calc:
# the primary function that handles most of the calculations.
li $s5, -100 #use register s5 as the exit program value.
# operator reference table
li $t2, 0
li $t3, 1
li $t4, 2
li $t5, 3
li $a1, 21 # set range for random number to 0-20
li $v0, 42 # generate random number, saved in $a0
syscall
move $s1, $a0 # Move random number to register s1
li $a1, 21 # set range for random number to 0-20
li $v0, 42 # generate random number, saved in $a0
syscall
move $s2, $a0 # Move random number to register s2
li $a1, 4 # set range for random number to 0-3
li $v0, 42 # generate random number, saved in $a0
syscall
move $t1, $a0 # Move random number to register s2
# operator table
beq $t1, $t2, addition
beq $t1, $t3, subtraction
beq $t1, $t4, multiplication
beq $t1, $t5, division
addition:
li $v0,4 # output an ascii string
la $a0, qf1 # load the ascii string qf1 for output to screen
syscall
li $v0,1 # output an int
move $a0, $s1
syscall
li $v0,4 # output an ascii string
la $a0, operator1 # load the ascii string qf1 for output to screen
syscall
li $v0,1 # output an int
move $a0, $s2
syscall
li $v0,4 # output an ascii string.
la $a0, qf2 # load the ascii string qf2 for output to screen.
syscall
li $v0, 5 # read an integer from the command line, result saved in $v0.
syscall
move $s4, $v0 # move the user input to a register for comparison.
add $s3, $s1, $s2 # perform the addition of the 2 random numbers.
lw $t1, totalCount # load the current value of totalCount into a register.
add $t2, $t1, 1 # add 1 to the value in the register for totalCount.
sw $t2, totalCount # save the iterated value of totalCount back to the memory space of the variable.
beq $s4, $s5, exit # if the user input matches -1, jump to "exit" function.
beq $s4, $s3, correct # if user input matches the correct answer, jump to the "correct" function.
j incorrect # if the answer is wrong AND not "-1", jump to the "incorrect" function.
subtraction:
li $v0,4 # output an ascii string
la $a0, qf1 # load the ascii string qf1 for output to screen
syscall
li $v0,1 # output an int
move $a0, $s1
syscall
li $v0,4 # output an ascii string
la $a0, operator2 # load the ascii string qf1 for output to screen
syscall
li $v0,1 # output an int
move $a0, $s2
syscall
li $v0,4 # output an ascii string.
la $a0, qf2 # load the ascii string qf2 for output to screen.
syscall
li $v0, 5 # read an integer from the command line, result saved in $v0.
syscall
move $s4, $v0 # move the user input to a register for comparison.
sub $s3, $s1, $s2 # perform the subtraction of the 2 random numbers.
lw $t1, totalCount # load the current value of totalCount into a register.
add $t2, $t1, 1 # add 1 to the value in the register for totalCount.
sw $t2, totalCount # save the iterated value of totalCount back to the memory space of the variable.
beq $s4, $s5, exit # if the user input matches -1, jump to "exit" function.
beq $s4, $s3, correct # if user input matches the correct answer, jump to the "correct" function.
j incorrect # if the answer is wrong AND not "-1", jump to the "incorrect" function.
multiplication:
li $v0,4 # output an ascii string
la $a0, qf1 # load the ascii string qf1 for output to screen
syscall
li $v0,1 # output an int
move $a0, $s1
syscall
li $v0,4 # output an ascii string
la $a0, operator3 # load the ascii string qf1 for output to screen
syscall
li $v0,1 # output an int
move $a0, $s2
syscall
li $v0,4 # output an ascii string.
la $a0, qf2 # load the ascii string qf2 for output to screen.
syscall
li $v0, 5 # read an integer from the command line, result saved in $v0.
syscall
move $s4, $v0 # move the user input to a register for comparison.
mul $s3, $s1, $s2 # perform the addition of the 2 random numbers.
lw $t1, totalCount # load the current value of totalCount into a register.
add $t2, $t1, 1 # add 1 to the value in the register for totalCount.
sw $t2, totalCount # save the iterated value of totalCount back to the memory space of the variable.
beq $s4, $s5, exit # if the user input matches -1, jump to "exit" function.
beq $s4, $s3, correct # if user input matches the correct answer, jump to the "correct" function.
j incorrect # if the answer is wrong AND not "-1", jump to the "incorrect" function.
division:
li $v0,4 # output an ascii string
la $a0, qf1 # load the ascii string qf1 for output to screen
syscall
li $v0,1 # output an int
move $a0, $s1
syscall
li $v0,4 # output an ascii string
la $a0, operator4 # load the ascii string qf1 for output to screen
syscall
li $v0,1 # output an int
move $a0, $s2
syscall
li $v0,4 # output an ascii string.
la $a0, qf2 # load the ascii string qf2 for output to screen.
syscall
li $v0, 5 # read an integer from the command line, result saved in $v0.
syscall
move $s4, $v0 # move the user input to a register for comparison.
div $s1, $s2 # perform the addition of the 2 random numbers.
mflo $s3
lw $t1, totalCount # load the current value of totalCount into a register.
add $t2, $t1, 1 # add 1 to the value in the register for totalCount.
sw $t2, totalCount # save the iterated value of totalCount back to the memory space of the variable.
beq $s4, $s5, exit # if the user input matches -1, jump to "exit" function.
beq $s4, $s3, correct # if user input matches the correct answer, jump to the "correct" function.
j incorrect # if the answer is wrong AND not "-1", jump to the "incorrect" function.
correct:
# produce the incorrect answer response and adjust counter.
li $v0,4 # output an ascii string.
la $a0, a1 # load the ascii string qf1 for output to screen.
syscall
lw $t1, correctCount # load the value of the correctCount variable into a register.
add $t2, $t1, 1 # add 1 to the value for correctCount in the register.
sw $t2, correctCount # save the iterated value of correctCount back into the memory space of the variable.
j calc # jump back to the calc function to ask another question.
incorrect:
# produce the incorrect answer response and adjust counter.
li $v0,4 # output an ascii string.
la $a0, a2 # load the ascii string qf1 for output to screen.
syscall
lw $t1, incorrectCount # load the value of the incorrectCount variable into a register.
add $t2, $t1, 1 # add 1 to the value for incorrectCount in the register.
sw $t2, incorrectCount # save the iterated value of incorrectCount back into the memory space of the variable.
j calc # jump back to the calc function to ask another question.
exit:
# perform the calculations needed to produce the final output to the user.
lw $t1, totalCount # load the totalCount value into a register
lw $t2, correctCount # load the correctCount value into the register
li $t5, 100 # set a register to 100 for use in the percentage conversion process.
div $t2, $t1 # calculate the players total correct score percentage using division.
mflo $t3 # move the lo register value to $t3 for further calculations.
mul $t6, $t3, $t5 # multiply the score value by 100 to convert to a whole number for output.
# Assemble the output
li $v0, 4 # output an ascii string
la $a0, emf1 # load end message fragment 1 into the registr for output.
syscall
lw $a0, totalCount # load the value of totalCount to register a0 for output.
li, $v0, 1 # output an int
syscall
li $v0, 4 # output an ascii string
la $a0, emf2 # load end message fragment 2 into the registr for output.
syscall
lw $a0, correctCount # load the value of correctCount to register a0 for output.
li, $v0, 1 # output an int
syscall
li $v0, 4 # output an ascii string
la $a0, emf3 # load end message fragment 3 into the registr for output.
syscall
lw $a0, incorrectCount # load the value of incorrectCount to register a0 for output.
li, $v0, 1 # output an int
syscall
li $v0, 4 # output an ascii string
la $a0, emf4 # load end message fragment 4 into the registr for output.
syscall
move $a0, $t6
li, $v0, 1 # output an int
syscall
li $v0, 4 # output an ascii string
la $a0, emf5 # load end message fragment 5 into the registr for output.
syscall
li $v0, 10 #exits the program on syscall
syscall
当你做整数除法时,你总是得到0。随后乘以100无法恢复丢失的分数。最简单的解决办法是先乘以100,然后再除以 要四舍五入到最接近的整数百分比,请将正确的数字乘以100,将问题数的一半相加,然后除以问题数。例如,如果有12个问题,8个是正确的,(8 x 100+6)/12=67%
如果您想要一个百分比的分数,例如66.7%,那么可以只使用整数运算,但使用浮点可能更简单。忘了提到,我使用的是MARSIt's,不清楚您期望的输出。如果你想要小数,你可以使用定点或浮点。最后给出一个总结,并给出正确答案的百分比。我无法得到正确的值。哈哈,你很好地解决了这个问题。先相乘再除法给了我一个完美的结果。为了将来的参考,写“我不能得到正确的结果”远不如写“结果总是0”我唯一不明白的是如何确定我要乘以的值是一个int。在除法词部分,它说它除法一个int,但没有指定返回类型。默认情况下是否所有32位字都是整数?