среднее число 10 марс мипс

Ниже я читаю от пользователя массив из 10 целых чисел и сортирую его в порядке возрастания.

 .data
 array:  .space 40  
 prompt: .asciiz "Enter a number: " 
 spacee: .asciiz " "
 output: .asciiz "The numbers are: "
 .text

 main:
 li $t1,10         #load 10 into $t1
  la $a1,array      #load a pointer to array into $a1

 loop:
  addi $t1,$t1,-1   #subtract 1 from $t1, save to $t1
  li $v0,4          #load 4 into $v0 (print string)
  la $a0,prompt     #load prompt text into $a
  syscall           #display prompt
  li $v0,5          #load 5 into $v0 (read integer)
  syscall           #prompt for input
  sw $v0,0($a1)     #store input int to array
  addi $a1,$a1,4    #add 4 to $a1, save to $a1
  bnez $t1,loop     #if $t1 isn't zero,goto loop
  li $t1,9          #if $t1 is zero, load 9 into $t1
  li $t2,9          #and load 9 into $t2
  la $a1,array      #load array pointer into $a1

 loop1:
  beqz $t2,here     #if $t2 is zero, goto here
  addi $t2,$t2,-1   #subtract 1 from $t2, save to $t2
  lw $t5,0($a1)     #load an input int into $t5
  lw $t6,4($a1)     #load the next one into $t6
  addi $a1,$a1,4    #add 4 to $a1, save to $a1
  ble $t5,$t6,loop1 #if $t5 <= $t6, goto loop1
  sw $t5,0($a1)     #else, store $t5 in $a1
  sw $t6,-4($a1)     #and store $t6 in $a1-4 (swapping them)
  bnez $t2,loop1    #if $t2 is not zero, to go loop1

 here:
  la $a1,array      #load array into $a1
  addi $t1,$t1,-1   #subtract 1 from $t1, save to $t1
  add $t2,$t2,$t1   #add $t2 to $t1, save to $t2
  bnez $t1,loop1    #if $t1 isn't zero, goto loop1
  li $v0,4          #load 4 into $v0 (print string)
  la $a0,output     #load 'the numbers are' into $a0
  syscall           #display message to screen
  la $a1,array      #load array pointer into $a1
  li $t1,10         #load 10 into $t1

 loop2:
  li $v0,1          #load 1 into $v0 (print int)
  lw $a0,0($a1)     #load $a1 into $a0
  syscall           #print first number to screen
  li $v0,4          #load 4 into $v1 (print string)
  la $a0,spacee     #load ' ' into $a0
  syscall           #print ' ' to screen
  addi $a1,$a1,4    #add 4 to $a1, save to $a1
  addi $t1,$t1,-1   #subtract 1 from $t1, save to $t1
  bnez $t1,loop2    #if $t1 isn't zero, goto loop2

  li $v0,10              #exit

     syscall

Как я могу рассчитать среднее значение для этого массива, не меняя порядок? Я имею в виду, где я могу поместить другой код для среднего?


person Sara Salem    schedule 20.03.2017    source источник


Ответы (1)


После окончания loop2 [перед syscall 10] вы можете добавить еще один цикл для вычисления суммы. Это было бы похоже на [и проще, чем] ваш цикл печати, за исключением отсутствия кода печати.

Но вы также можете вычислить сумму в loop2 во время печати. В любом случае метод будет аналогичным

Перед loop2: инициализировать другой регистр нулем: (например, li $t2,0) для хранения суммы.

Затем после lw вставьте

    add     $t2,$t2,$a0             # calculate sum of array

После bnez $t1,loop2 добавить следующее:

    li      $t1,10                  # get the count
    div     $t2,$t1                 # avg = sum / count
    mflo    $t2                     # get quotient

Теперь вы можете просто распечатать значение в $t2

person Craig Estey    schedule 20.03.2017