2013-08-22 3 views
0

Я пытаюсь найти AVG этого массива: 1742,1065, -67, -2988, -796, -1000,31, -67, -100,1180 Я верю своему методу изменить номер из POS к НЭГ. Мне нужна прога, чтобы вычислить вышеприведенный массив, а затем распечатать massege, если AVG является NEG или POS, и он всегда печатает, что AVG - это POS, даже если это не так. вот мой код до сих пор:Должен ли я нормализовать признаки моего ввода при вычислении среднего?

; lab56.asm 
; 
    .MODEL SMALL 
    .STACK 100h 
    .DATA 
AVG_NEG DB 'THE AVG IS NEG',13,10,'$' 
AVG_POS DB 'THE AVG IS POS',13,10,'$' 
INDEX DB 'Numbers that are larger than the average are in indexes:',13,10,'$' 
RES  DB '      ','$' 
ARR  DW 1742,1065,-67,-2988,-796,-1000,31,-67,-100,1180 
Ten  DW 10 
AVG  DW 0 
temprint DB '  ','$' 
;Program start here: 
    .CODE 
    MOV AX,@DATA ; DS can be written to only through a register 
    MOV DS,AX  ; Set DS to point to data segment 
    LEA SI, ARR 
; 
; SUMUP 
    MOV CX,10  ;10 variables in array 
Sum: 
    MOV AX,[SI] 
    CMP AX,0 
    JG Pos_label 
    XOR AX,0000000000000000b 
    ADD AX,0000000000000001b 
Pos_label: 
    ADD AVG,AX 
    ADD SI,2  ;move to the next number 
LOOP Sum 
; Divided by 10 to get the AVG 
    CWD    ; AX -> DX:AX 
    IDIV Ten 
    MOV AVG,AX 
; print 

; Check if NEG or POS 
    CMP AVG,0 
    JG Avg_label 
    MOV AH,9  ; Set print option for int 21h 
    MOV DX,OFFSET AVG_NEG  ; Set DS:DX to point to AVG_NEG 
    INT 21h 
    JMP continue 
Avg_label: 
    MOV AH,9  ; Set print option for int 21h 
    MOV DX,OFFSET AVG_POS  ; Set DS:DX to point to AVG_POS 
    INT 21h 
continue: 
; 

;Program end's here: 

    MOV AH,4Ch  ; Set terminate option for int 21h 
    INT 21h  ; Return to DOS (terminate program) 
    END

ответ

1

Если изменить знак всех входов, прежде чем добавить их вместе, то вы, очевидно, всегда получите тот же знак суммы (за исключением переполнения), и, таким образом, для среднего. Кроме того, вычисленное среднее значение будет неправильным, потому что вы будете усреднять величины вместо фактических значений.

Ваш метод изменения знаков действительно ошибочен, поэтому не делайте этого. Просто вычислите среднее значение так же, как вы учились в начальной школе: добавьте числа и разделите их на счет.

+0

Я изменил свою первую часть на это: ; SUMUP \t MOV CX, 10 \t \t; 10 переменных в массиве \t MOV AX, 0 Сумма: \t MOV AX, [SI] \t ADD SI, 2 \t \t; перейти к следующему номеру \t ADD AVG, AX LOOP Sum , тогда я напечатал свою сумму, и я получил 64541, это похоже на то, что он не читает цифры neg. –

+1

Вам нужно выполнить некоторую отладку. Как вы знаете, сумма, которую вы ищете, составляет -1000. Как это относится к 64541? Не забудьте рассмотреть значение целых чисел с подписью и без знака; спросите своего инструктора, если вы не знаете, что это значит. –

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