Хостинг портала RFpro.ru: Московский хостер Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64 РАССЫЛКИ ПОРТАЛА RFPRO.RU Лучшие эксперты данной рассылки Номер выпуска: | 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 (Россия) | Еще номера » | Оценить выпуск » Нам очень важно Ваше мнение об этом выпуске рассылки! Скажите "спасибо" эксперту, который помог Вам! Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА на короткий номер 1151 (Россия) Номер ответа и конкретный текст СМС указан внизу каждого ответа. Полный список номеров » * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов) ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются. *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании. |
Комментариев нет:
Отправить комментарий