Консультация № 168846
03.06.2009, 13:14
0.00 руб.
0 23 1
Здравствуйте уважаемые эксперты
Подскажите пожалуйста как написать программу:
расчета среднего арифметического значения положительных элементов в одномерном массиве, имеющих четные индексы.
задачка на автомат, буду очень благодарна

Обсуждение

Неизвестный
03.06.2009, 13:28
общий
а как расматривать массив с 0 индексируется или с 1
давно
Посетитель
7438
7205
03.06.2009, 14:05
общий
Airyashov:
Полагаю, в ассемблере массив всегда адресуется с 0, т.о. четные индексы - 0, 2, ...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
03.06.2009, 14:06
общий
Otherside, подобные вопросы лучше задавать в Решебник.
Неизвестный
03.06.2009, 14:27
общий
Airyashov:
массив начинается с 0
Неизвестный
03.06.2009, 16:30
общий
lupus campestris:
то есть здесь мне помощи уже не ждать?
Неизвестный
03.06.2009, 17:01
общий
А среднее - целочисленное?
давно
Посетитель
7438
7205
03.06.2009, 17:09
общий
И, кстати, массив байтов, слов, двойных слов?
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
03.06.2009, 17:46
общий
Лысков Игорь Витальевич:
скорее всего массив байтов
Неизвестный
03.06.2009, 17:46
общий
Boriss:
да целочисленное
Неизвестный
03.06.2009, 18:37
общий
Otherside:
Можете ждать.Это просто как рекомендация на будущее.
Неизвестный
03.06.2009, 18:47
общий
lupus campestris:
спасибочки, подожду
Неизвестный
03.06.2009, 21:49
общий
это ответ
Здравствуйте, Otherside.
Вот, посмотрите, я правильно понял задание?
Пример окна программы:
Код:
-7  -115  49  37  -87  -3  97  21  89  109
Среднее арифметическое равно: 78
Press any key ...


Приложение:
; среднее арифметическое положительных четных
.model tiny ; COM-файл нежно получить
.386
.code
org 100h
start:
mov ax, 3
int 10h

; Не написали, как вводить массив - заполню псевдослучайными (на автомат!!)
; прочитаем текущие тики в качестве затравки
; получается типа RANDOMIZE в Паскале

mov CX, 50 ; будем использовать цикл - настроим СХ
push es
push 040h
pop es
mov DX, es:[6ch]
pop es

; заполнение
lea si, ar
mov cx, ar_len
fill_random:
imul DX, 4e35h
mov [si], dl
inc SI
LOOP fill_random
; покажем, воспринимая числа как знаковые
lea si, ar
mov cx, ar_len
cld
@@_show_next:
lodsb
cbw ; я написал процедуру для слов, а здесь байты -> Convert Byte to Word
CALL WriteWordDEC_signed
; два пробела для разделения
mov al, ' '
int 29h
int 29h
LOOP @@_show_next

; вычисление суммы
lea si, ar
mov cx, ar_len
shr cx, 1 ; эффективное деление на 2
xor bx, bx ; будет сумма
@@_next:
lodsb
or al, al
js negative ; знак устновлен - отрицательное
cbw
add summ, ax
inc bx
negative:
lodsb ; прочитываем зря нечетное
LOOP @@_next

or bx, bx
jnz mid
lea dx, msg_no_pos
mov ah, 9
int 21h
jmp @@_exit
mid:
lea dx, msg_mid
mov ah, 9
int 21h

mov ax, summ
xor dx, dx
idiv bx
CALL WriteWordDEC_signed

@@_exit:
lea dx, PressKey
mov ah,9
int 21h

xor ax, ax
int 16h

int 20h

writeWordDEC proc near
; вывод на экран слова в AX, воспринимается как беззнаковое
push ax
push bx
push dx
push cx
mov bx, 10
xor cx, cx
@@1:
xor dx, dx
div bx
push dx
inc cx
or ax, ax
jnz @@1
@@2:
pop ax
add al, '0'
int 29h
LOOP @@2
pop cx
pop dx
pop bx
pop ax
ret
writeWordDEC endp

WriteWordDEC_signed proc
; вывод на экран слова в AX как знакового
or ax, ax
jns @@_no_sign
push ax
mov al, '-'
int 29h
pop ax
neg ax ; изменение знака на +
@@_no_sign:
CALL writeWordDEC
ret
WriteWordDEC_signed endp

PressKey db 13,10,'Press any key ...$'
msg_mid db 13,10,'Среднее арифметическое равно: $'
msg_no_pos db 13,10,'Положительных с четным индексом нет$'

summ dw 0 ; размер больше байта для суммы
ar_len equ 10 ; так объявляются константы - здесь длина массива
ar db ar_len dup (?)
end start
5
огромное вам спасибо:)
Неизвестный
03.06.2009, 21:56
общий
Boriss:
задание правильно поняли, только я видимо считать не умею, почему получилось 78?
(37+21+109)/3=55,6
Неизвестный
03.06.2009, 22:11
общий
Давайте считать:
Код:

Массив : -7 -115 49 37 -87 -3 97 21 89 109
Номера: 0 1 2 3 4 5 6 7 8 9

Сумма №0 + №2 + №4 + №6 + №8 = 235. 3 штуки, значит, 235 / 3= 78,33333 и целая часть = 78
Зачеркнуты отрицательные
Неизвестный
03.06.2009, 22:13
общий
Что-то цифры разбежались, но, надеюсь, поймете
давно
Старший Модератор
31795
6196
03.06.2009, 22:13
общий
Вы саминаписали:
сегодня, 13:27 :: Otherside, Посетитель
Airyashov:
массив начинается с 0

Перед Вашим постом было:
сегодня, 13:05 :: Лысков Игорь Витальевич, Младший модератор
Airyashov:
Полагаю, в ассемблере массив всегда адресуется с 0, т.о. четные индексы - 0, 2, ...

Но Вы этот пост не опровергли:
отсюда и такой результат:
-7 -115 49 37 -87 -3 97 21 89 109
Все что красное не зачеркнутое Ваше.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Неизвестный
03.06.2009, 22:14
общий
Зенченко Константин Николаевич:
все поняла, затупила
Неизвестный
03.06.2009, 22:15
общий
Boriss:
спасибо вам огромадное вы мне уже не в первый раз помогаете
Неизвестный
03.06.2009, 22:36
общий
Приятно прочитать. К Вашим услугам
Неизвестный
03.06.2009, 22:38
общий
Boriss:
у меня еще есть одна задача, если не надоело помогать посмотрите;) она уже написана здесь, тоже с массивом
Неизвестный
03.06.2009, 22:57
общий
Не говорите загадками: где "здесь"?
Неизвестный
03.06.2009, 22:59
общий
Boriss:
вот произвести попарные перестановки элементов одномерного массива : первый элемент поменять местами с последним, второй с предыдущим, и так все остальные. Тип элементов в массиве байтовый.
Неизвестный
08.06.2009, 11:37
общий
Boriss:
здравствуйте еще раз! Вы не могли бы подсказать как можно переделать вот эту программу для моей задачи со средним арифметическим? Препод мне сказал что нужно именно с использованием этой основы, а я не понимаю
.model small

.stack 256

print macro str
push ax
push dx
mov ah,9
lea dx,str
int 21h
pop dx
pop ax
endm

.data
cr = 0dh
lf = 0ah
string db 255, 0, 255 dup (?)
errmsg db 'error: illegal symbol'
crlf db cr,lf,'$'
negflag dw ?

msga db cr,lf,'a=$'
msgn db cr,lf,'n=$'
msgc db cr,lf, 'c=$'

a dw 100 dup(?)
n dw ?
c dw ?

.code

IntegerOut proc
push ax
push bx
push cx
push dx
xor cx,cx
mov bx,10
cmp ax,0
jge om
neg ax
push ax
mov ah,2
mov dl,'-'
int 21h
pop ax
om: inc cx
xor dx,dx
div bx
push dx
or ax,ax
jnz om
om1: pop dx
add dx,'0'
mov ah,2
int 21h
loop om1
pop dx
pop cx
pop bx
pop ax
ret
IntegerOut endp

IntegerIn proc
push dx
push si
mov ah,0ah
lea dx,string
int 21h
xor ax,ax
lea si,string+2
mov negflag,ax
cmp byte ptr [si],'-'
jne im2
not negflag
inc si
jmp im3
im2: cmp byte ptr [si],'+'
jne im3
inc si
im3: cmp byte ptr [si],cr
je iex1
cmp byte ptr [si],'0'
jb ier
cmp byte ptr [si],'9'
ja ier
mov bx,10
mul bx
sub byte ptr [si],'0'
add al,[si]
adc ah,0
inc si
jmp im3
ier: lea dx,errmsg
mov ah,9
int 21h
jmp IntegerIn
iex1: cmp negflag,0
je iex
neg ax
iex: push ax
mov ah,9
lea dx,crlf
int 21h
pop ax
pop si
pop dx
ret
IntegerIn endp

start: mov ax,@data
mov ds,ax

print msgn
call IntegerIn
mov n,ax

print msga ;ввод массива
mov cx,n ;сюда размер массива
lea si,a
m1: push cx
push si
call IntegerIn ;процедура ввода массива
pop si
pop cx
mov [Si],ax
add si,4 ;увеличиваем на 4 байта наш массив
Loop m1



print msga
Mov Cx,n
m2: lea si,a
mov Ax,[Si]
jns M3
M3 add si,4
add Es,[Ax]
Mov Es,[Ax]
loop M2
вот это все и надо поменять



Print msga ;вывод массива

mov Cx,n
Lea Si,a
m5: mov Ax,[si]
Push Cx
Push Si
Call integerOut
Pop Si
Pop Cx
Add Si,2
Loop m5


mov ah,4ch ;завершение программы
int 21h
end start
Форма ответа