2014-02-27 2 views
0

Так что я пишу программу, которая должна иметь следующие требования:Печати из пяти знаков после запятой, используя MIPS число команд

Напишите программу сборки, которая считывает ряд целых чисел от консоли. Допустимые значения: от -110 до 120 (включительно). Если запись недействительна, запись отклоняется и на экран выводится сообщение об ошибке. Чтение останавливается при вводе -467. После ввода -467 программа отображает количество записей, сумму записей и среднее значение записей до 5 знаков после запятой, используя только команды MIPS Integer. Будет не менее 3 подпрограмм. Первый «read_int», который не принимает аргументов и возвращает общее количество и количество действительных чисел, считанных в соответствующих регистрах. Второй «print_count_total», который получает в качестве аргументов аргументы, возвращаемые первой подпрограммой, и не содержит аргументов. Он выводит счет и общее количество, помеченное на экране. Третий «print_average», который получает в качестве аргументов аргументы, возвращенные первой подпрограммой, и не имеет аргументов. Он выводит среднее число чисел, считанных в 5 десятичных знаков, используя только целые команды.

У меня все работает, но как бы напечатать целое число до пяти знаков после запятой? Как, например:

enter image description here

Целочисленное среднее должно быть напечатано, как 71. .

Это мой код:

########################################################### 
#  Program Description 
# 
# 
# Reads integers from the keyboard and displays the total 
# number of entries, sum, and integer average 
# Reads until -1 is entered 
# Only accepts values between 10 and 99 (inclusive) 
# 
# 
# t0 = 0  # Total 
# t1 = 0  # Count 
# t2 = -110  # Min 
# t3 = 120  # Max 
# t4 = -467  # Stop 
# 
########################################################### 
#  Register Usage 
# $t0 Running total 
# $t1 Entry count 
# $t2 Minimum value 
# $t3 Maximum value 
# $t4 Stop value 
# $t5 Entry (from user) 
########################################################### 
     .data 
enter_p: .asciiz "Enter a value between -110 and 120 (inclusive): " 
invalid_p: .asciiz "Invalid value\n\n" 
count_p: .asciiz "\n\nNumber of entries: " 
total_p: .asciiz "\nTotal: " 
average_p: .asciiz "\nInteger average: " 
noentry_p: .asciiz "\n\nNo valid values entered\n" 

########################################################### 
     .text 
main: 
    # Initialize values 
    li $t0, 0  # Total 
    li $t1, 0  # Count 
    li $t2, -110  # Min value 
    li $t3, 120  # Max value 
    li $t4, -467  # Stop value 

readLoop: 
    # Get value 
    li $v0, 4 
    la $a0, enter_p 
    syscall   # Prompt for value 
    li $v0, 5 
    syscall   # Read entry 

    # Validate value 
    beq $v0, $t4, getResults 
    blt $v0, $t2, entryInvalid 
    bgt $v0, $t3, entryInvalid 

    # If program gets here, the entry is valid 
    add $t0, $t0, $v0 # Add entry to total 
    addiu $t1, $t1, 1 # Increment counter 

    b readLoop   # Loop 

entryInvalid: 
    li $v0, 4 
    la $a0, invalid_p 
    syscall   # Print error message 

    b readLoop  # Go back and read more 

getResults: 
    beqz $t1, zeroEntries # Prevent divide by 0 

    # Display number of entries 
    li $v0, 4 
    la $a0, count_p 
    syscall   # Print 'count' string 
    li $v0, 1 
    move $a0, $t1 
    syscall   # Print count 

    # Display total 
    li $v0, 4 
    la $a0, total_p 
    syscall   # Print 'total' string 
    li $v0, 1 
    move $a0, $t0 
    syscall   # Print total 

    # Calculate and display average 
    li $v0, 4 
    la $a0, average_p 
    syscall   # Print 'average' string 
    li $v0, 1 
    div $a0, $t0, $t1 # Put results directly into $a0 
    syscall   # Print average 

    b mainEnd  # Done 

zeroEntries: 
    li $v0, 4 
    la $a0, noentry_p 
    syscall   # Print 'no entries' message 

mainEnd: 
    li $v0, 10  # End Program 
    syscall 
########################################################### 

Любая помощь очень ценится.

ответ

2

Чтобы распечатать дробную часть, умножьте остаток деления на 10^5 = 100000 и разделите снова. Распечатайте его после десятичной точки, заботясь о том, чтобы использовать соответствующее количество нулевого заполнения.

+0

Благодарим вас за это, Шут. Я понимаю ваш алгоритм, но как это будет выглядеть в реальном коде? А где в моей программе должен быть размещен этот код? Я предполагаю, что он должен быть размещен где-то там в блоке кода, где I * # Вычислить и отобразить среднее значение *. Спасибо вам за помощь. – zokiboi

+0

Это довольно простые шаги, которые могут быть выполнены с помощью инструкций, которые вы уже знаете. Какая часть вызывает головную боль? – Jester

+0

Я вполне уверен, что знаю инструкции, которые будут выполнять предложенный вами алгоритм, но выполнение необходимых шагов в правильном порядке - это то, что у меня возникли проблемы с пониманием. Остается ли остаток дивизиона в регистр HI или LO? Еще раз спасибо, Шут. – zokiboi

Смежные вопросы