Math 使用除法以MIPS中的百分比计算分数

Math 使用除法以MIPS中的百分比计算分数,math,assembly,mips32,Math,Assembly,Mips32,我正在制作一个小的数学测验程序,向玩家提问基本的数学问题,并记录他们的总分。最后,我想计算并显示他们的总分百分比。这意味着被问问题总数的百分之多少被正确回答。然而,我绞尽脑汁想弄清楚如何正确显示这个百分比。计算百分比的数学运算都是在exit函数中完成的,但是我附加了整个程序作为上下文。它很有名。请告知我能做些什么使最终结果正确 另外,顺便问一下,有没有更好的方法来解决除法问题?目前我唯一能做的就是让答案是没有余数的商。。。这显然是一个糟糕的解决方案 .data startMsg: .

我正在制作一个小的数学测验程序,向玩家提问基本的数学问题,并记录他们的总分。最后,我想计算并显示他们的总分百分比。这意味着被问问题总数的百分之多少被正确回答。然而,我绞尽脑汁想弄清楚如何正确显示这个百分比。计算百分比的数学运算都是在exit函数中完成的,但是我附加了整个程序作为上下文。它很有名。请告知我能做些什么使最终结果正确

另外,顺便问一下,有没有更好的方法来解决除法问题?目前我唯一能做的就是让答案是没有余数的商。。。这显然是一个糟糕的解决方案

.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位字都是整数?