Консультация № 188442
16.12.2015, 22:52
0.00 руб.
0 15 1
Здравствуйте, уважаемые эксперты!
Помогите пожалуйста сделать задачу на Ассемблере.

Даны три массива(которые задаются адресом первого элемента и длиной).Нужно написать программу для нахождения максимального отрицательного элемента в каждом массиве и вывести среднее арифметическое этих элементов.
Программируем мы в программе под названием CompModel. Думаю, вы о такой знаете.

В качестве примера, приведу в приложении программу для нахождения среднего арифметического максимальных элементов этих матриц...

Заранее - большое спасибо.


Приложение:
Вот основная программа

RD #85
WR R1
RD #14
WR R2
CALL M
WR R6
RD #100
WR R1
RD #4
WR R2
CALL M
WR R7
RD #110
WR R1
RD #9
WR R2
CALL M
ADD R7
ADD R6
DIV #3
OUT
HLT

А вот подпрограмма

M: RD @R1
WR R3
L2: RD @R1+
WR R4
SUB R3
JS L1
MOV R3,R4
L1: JRNZ R2,L2
RD R3
RET

Обсуждение

давно
Посетитель
7438
7205
16.12.2015, 23:02
общий
Адресаты:
Здравствуйте!
А самостоятельно не пробовали написать?
Кидайте - посмотрим, подправим.
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
17.12.2015, 00:23
общий
это ответ
Здравствуйте, podopitnijantiboy!
Добавил проверку, найдены ли вообще отрицательные числа
И если их нет, то возвращается 0, которым все и завершается!
В самой функции поиска ищем сначала отрицательные, а затем
из них - максимальный
[code h=200]
RD #85
WR R1
RD #14
WR R2
CALL MN
JZ O
WR R6
RD #100
WR R1
RD #4
WR R2
CALL MN
JZ O
WR R7
RD #110
WR R1
RD #9
WR R2
CALL MN
JZ O
ADD R7
ADD R6
DIV #3
O:OUT
HLT

MN: RD @R1+
js L1
jrnz r2,MN
rd #0
ret
L1: WR R3
jrnz r2,L2
jmp L4
L2: RD @R1+
jns L3
WR R4
SUB R3
JS L3
MOV R3,R4
L3: JRNZ R2,L2
L4: RD R3
RET
[/code]
5
Все было выполнено очень быстро и корректно. Спасибо за помощь
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
399312
19
17.12.2015, 13:50
общий
Лысков Игорь Витальевич, спасибо, что так быстро ответили. Я пробовала написать программу сама, но там все очень ужасно получается Но благодаря Вам, программа работает идеально. СПАСИБО ВАМ ОГРОМНОЕ У меня правда только один вопрос: программа будет выводить наибольший отрицательный результат в качестве суммы (если, как в примере, (-4+(-17)+(-7))/3=-28/3=-9), не так ли?
Прикрепленные файлы:
4ae7739ba289ef03a335ace54db16db7.docx
давно
Посетитель
7438
7205
17.12.2015, 14:03
общий
Адресаты:
Так-так Выводится среднее арифметическое трех максимальных отрицательных.
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
17.12.2015, 14:07
общий
Адресаты:
Кстати, незачем было слать всем экспертам раздела.
Вы же мне хотели написать, а не всем, не так ли?
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
17.12.2015, 14:12
общий
17.12.2015, 14:13
Адресаты:
Если есть желание, можете показать свой "очень ужасный" исходник.
Разберу "по косточкам", скажу, где неправильно, как сделать, чтобы было правильно
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
399312
19
17.12.2015, 14:16
общий
Адресаты:
Ой,простите, еще не научилась правильно работать с форумом. Да, среднее арифметическое трех максимальных отрицательных элементов... Я имела ввиду то, что в Acc записался результат 100009 (=-9), а не 100010 (=-10), так всегда будет в спорных вопросах, когда сумма максимальных отрицательных не будет кратна 3?
давно
Посетитель
7438
7205
17.12.2015, 14:23
общий
Адресаты:
Ну да, при делении осуществляется округление к ближайшему, причем рассматривается модуль числа.
Т.е. и 100028 / 3 = 100009 (-28/3 = -9), и 000028 / 3 = 000009 (28/3 = 9)
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
399312
19
17.12.2015, 14:25
общий
Адресаты:
Почему-то не сохранились последние изменения, но в отчете начала составлять программу, после изменять блок-схему, снова программу и т.д. В итоге ничего не работало
Прикрепленные файлы:
6a838a2bea41247b308f39a3f38b12ed.docx
давно
Посетитель
7438
7205
17.12.2015, 14:44
общий
Адресаты:
Главная проблема - неправильная работа подпрограммы поиска максимального отрицательного
(остальное - в общем-то, одинаковое у всех)
1) Надо искать среди отрицательных, поэтому неотрицательные надо пропускать,
одновременно корректно учитывать счетчик массива
2) Поэтому в начале надо найти сначала первый отрицательный, только потом искать
максимального из всех остальных.
3) Команда js(jns) проверяет знак числа в аккумуляторе, поэтому нет необходимости
предварительно что-то там отнимать. Это не ошибка, просто лишнее
4) Что-то надо делать, если не будет найдено ни одного отрицательного.
Я в своей программе просто пишу в аккумуляторе 0 и больше ничего не делается...

Программа в ДОКе практически ничем не отличается от примера

M: RD@R1
WR R3
SUB R9
JNS L2 ; получается, что идет дальше при неотрицательных значениях, что неправильно
WR R3 ;а отрицательное сохраняет

И сравнение с последующими не выполняет поставленную задачу, т.к. надо сначала искать отрицательные

Мой код понятен?
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
399312
19
17.12.2015, 14:50
общий
Адресаты:
да, код Вашей программы абсолютно ясен СПАСИБО ЗА ПОМОЩЬ
давно
Посетитель
7438
7205
17.12.2015, 14:57
общий
17.12.2015, 15:00
Адресаты:
Держите прокомментированный код
Код:

MN: RD @R1+ ;читаем очередное значение, начиная с первого
js L1 ;отрицательное?
jrnz r2,MN ;нет, уменьшаем счетчик, проверяем на 0, если не 0 - на начало
rd #0 ;прошли весь массив, отрицательных не нашлм, возвращаем 0
ret
L1: WR R3 ;нашли отрицательное, соханим в r3, считаем его максимальным
jrnz r2,L2 ;уменьшаем счетчик, если не 0 - продолжаем поиск
jmp L4 ;счетчик = 0 - имеем одно отрицательное значение,
;которое последнее в массиве, и которое будет максимальным
L2: RD @R1+ ;читаем очередное значение
jns L3 ;не отрицательное - на уменьшение счетчика
WR R4 ;нашли очередное отрицательное, сохраним его в r4
SUB R3 ;сравним с максимальным
JS L3 ;< - максимальный не меняется - идем на уменьшение счетчика
MOV R3,R4 ;>= - получаем нового максимального
L3: JRNZ R2,L2 ;уменьшаем счетчик, если не 0 - на продолжение поиска
L4: RD R3 ;массив пройден, возвращаем максимального отрицательного
RET
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
399312
19
17.12.2015, 15:00
общий
Адресаты:
Спасибо-спасибо, но код, правда, был ясен
давно
Посетитель
7438
7205
17.12.2015, 15:01
общий
Адресаты:
Ну, хорошо, удачи!
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
399312
19
17.12.2015, 15:15
общий
Адресаты:
Спасибо
Форма ответа