Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Ассемблер? Это просто! Учимся программировать


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты данной рассылки

Boriss
Статус: Академик
Рейтинг: 2573
∙ повысить рейтинг »
Абаянцев Юрий Леонидович aka Ayl
Статус: Профессионал
Рейтинг: 2115
∙ повысить рейтинг »
vladisslav
Статус: 8-й класс
Рейтинг: 1328
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Программирование / Assembler (Ассемблер)

Номер выпуска:1393
Дата выхода:08.12.2010, 09:30
Администратор рассылки:Лысков Игорь Витальевич (Старший модератор)
Подписчиков / экспертов:223 / 66
Вопросов / ответов:1 / 1

Вопрос № 181079: Здравствуйте, уважаемые эксперты! Прошу Вас ответить на следующий вопрос: В матрице A[1..N,1..M] определить среднее арифметическое значение чисел в столбцах, находящихся до среднего столбца (SR1) и среднее арифметическое значение чисел, находящихс...



Вопрос № 181079:

Здравствуйте, уважаемые эксперты! Прошу Вас ответить на следующий вопрос:
В матрице A[1..N,1..M] определить среднее арифметическое значение чисел в столбцах, находящихся до среднего столбца (SR1) и среднее арифметическое значение чисел, находящихся после среднего столбца (SR2). Если средний столбец есть, то его не включать в вычисление средних арифметических. Если SR1<SR2, то переставить столбцы местами (первый столбец - с последним, второй - с предпоследним и т.д.). Предпочтителен ассемблер, встроенный в turbo pascal 7.

Отправлен: 03.12.2010, 09:10
Вопрос задал: Посетитель - 349179 (Посетитель)
Всего ответов: 1
Страница вопроса »


Отвечает Лысков Игорь Витальевич (Старший модератор) :
Здравствуйте, Посетитель - 349179!
Примерно так...
Единственно хочу заметить, что нет необходимости различать чет-нечет для числа столбцов
разделив на 2, получив все автоматом, например:
6/2=3 - 3 слева и 3 справа
7/3 =3 - тоже 3 слева и 3 справа, средний не рассматривается
Код:
procedure obr(var x:mas; n,m:integer); external;
BEGIN
clrscr;
sozd;
obr(x,n,m);
viv;
end.
obr.asm
Код:
;
; Подключение {$L obr} { подключение файла obr.obj }
; Описание procedure obr(var x:mas; n,m:integer); external;
; Вызов Obr(x,n,m);
.model large,pascal

.code
.286

;параметры - адрес массива, число строк и столбцов
public Obr
Obr proc near px:dword,n:word,m:word
push ds ;сохраним сегментный регистр данных Паскаля
;посчитаем среднее арифметическое слева от центра
;сначала посчитаем сумму
lds bx, px ;адрес матрицы
xor ax, ax ;здесь будем накапливать сумму
mov cx, n ;число строк
row_left_loop: ;цикл по строкам
push cx ;сохраним счетчик строк
mov cx, m ;число столбцов
shr cx, 1 ;пополам
mov di, bx ;сохраним адрес начала строки
col_left_loop: ;цикл по столбцам
add ax, [bx] ;складываем
inc bx ;на следующий элемент в строке
inc bx
loop col_left_loop ;по всем элементам половины ст олбцов матрицы
mov bx, di ;восстановим адрес начала строки
add bx, m ;на следующую строку
add bx, m
pop cx ;востановим число строк
loop row_left_loop ;по всем строкам
;AX - сумма
push ax ;сохраним
mov ax, m ;посчитаем число элементов, как поизведение число строк
shr ax, 1
mul n ;на число столбцов
mov cx, ax
pop ax
cwd ;подготовим DX:AX к делению на число сложенных элементов
idiv cx ;делим на число элементов
mov dx, cx ;сохраним на будущее число элементов
mov si, ax ;в итоге получили среднее арифметическое SR1, сохраним в si

;посчитаем среднее арифметическое для правой части
lds bx, px ;адрес матрицы
mov ax, m
dec ax
shl ax, 1 ;смещение последнего элемента в строке
add bx, ax ;адрес последнего элемента в строке
xor ax, ax ;сумма
mov cx, n ;число строк
row_right_loop: ;цикл по строкам
push cx
mov cx, m
shr cx, 1 ;число половины столбцов
mo v di, bx ;сохраним адрес последнего элемента в строке
col_right_loop: ;цикл по колонкам
add ax, [bx] ;складываем
dec bx ;на предыдущий элемент в строке
dec bx
loop col_right_loop ;по всем колонкам
mov bx, di ;восстановим адрес последнего элемента в строке
add bx, m ;на следующую строку
add bx, m
pop cx
loop row_right_loop ;по всем строкам второй половины
;в AX - сумма
mov cx, dx ;раннее найденное число элементов
cwd ;подготовим DX:AX к делению на число сложенных элементов
idiv cx ;AX = SR2 ср арифм правой части

cmp si, ax ;сравним SR1 и SR2
jge Obr_ret ;если SR1 >= SR2, то ничего не делаем
;иначе меняем местами столбцы
lds bx, px ;адрес начала матрицы
mov si, bx ;найдем адрес последнего элемента в строке
mov ax, m
dec ax
shl ax, 1 ;смещение последнего элемента в строке
add si, ax ;адрес последнего элемента в стороке
mov cx, m
shr cx, 1 ;число столб цов, которые будем менять
mov dx, m
shl dx, 1 ;длина строки (для удобства перехода на след строку)
xchg_col_loop: ;цикл по с толбцам
push cx ;сохраним число столбцов
push bx ;адрес столбца в первой строке (левая половина)
push si ;адрес столбца в первой строке (правая половина)
mov cx, n ;число строк
xchg_row_loop:
mov ax, [bx] ;меняем местами элемент слева и справа
xchg ax, [si]
mov [bx], ax
add bx, dx ;переходим на строку ниже
add si, dx
loop xchg_row_loop ;по всем строкам
pop si
dec si ;справа сдвигаемся на позицию влево
dec si
pop bx
inc bx ;слева сдвигаемся на позицию вправо
inc bx
pop cx
loop xchg_col_loop ;по всем столбцам

Obr_ret:
pop ds
ret
endp
end

-----
Люби своего ближнего, как самого себя

Ответ отправил: Лысков Игорь Витальевич (Старший модератор)
Ответ отправлен: 04.12.2010, 11:34
Номер ответа: 264519
Украина, Кировоград
Тел.: +380957525051
ICQ # 234137952
Mail.ru-агент: igorlyskov@mail.ru

Оценка ответа: 5

Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 264519 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:


  • Оценить выпуск »
    Нам очень важно Ваше мнение об этом выпуске рассылки!

    Задать вопрос экспертам этой рассылки »

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров »

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.


    © 2001-2010, Портал RFPRO.RU, Россия
    Авторское право: ООО "Мастер-Эксперт Про"
    Автор: Калашников О.А. | Программирование: Гладенюк А.Г.
    Хостинг: Компания "Московский хостер"
    Версия системы: 2010.6.24 от 30.11.2010

    В избранное