使用除法将分数计算为 MIPS 中的百分比

问题描述

我正在制作一个小数学测验程序,询问玩家基本的数学问题并记录他们的总分。最后,我想计算并以百分比形式显示他们的总分。意思是回答正确的问题占总问题的百分比。但是,我绞尽脑汁想弄清楚如何正确显示该百分比。计算百分比的数学运算都在退出函数中完成,但我将整个程序附加到上下文中。其备受关注。请告知我可以做些什么来使最终结果正确。

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

.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,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,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,operator1 # load the ascii string qf1 for output to screen
    syscall
    
    li $v0,$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,operator2 # load the ascii string qf1 for output to screen
    syscall
    
    li $v0,$v0 # move the user input to a register for comparison.
    
    sub $s3,$s2 # perform the subtraction of the 2 random numbers.
    
    lw $t1,jump to the "incorrect" function.
    
multiplication:
    
    li $v0,operator3 # load the ascii string qf1 for output to screen
    syscall
    
    li $v0,$v0 # move the user input to a register for comparison.
    
    mul $s3,jump to the "incorrect" function.
    
division:
    
    li $v0,operator4 # load the ascii string qf1 for output to screen
    syscall
    
    li $v0,$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,jump to the "incorrect" function.

correct:
    # produce the incorrect answer response and adjust counter.
    
    li $v0,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,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,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,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,$t5 # multiply the score value by 100 to convert to a whole number for output.
    
    # Assemble the output
    li $v0,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,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,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,emf4 # load end message fragment 4 into the registr for output.
    syscall
    
    move $a0,$t6
    li,emf5 # load end message fragment 5 into the registr for output.
    syscall
    
    li $v0,10 #exits the program on syscall
    syscall

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)