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

Обсуждение

Неизвестный
03.12.2010, 14:01
общий
То есть, надо рассмотреть случаи четного и нечетно числа N?
И надо написать подпрограмму на ассемблере? Или просто использовать "тамошний" TASM?
Неизвестный
03.12.2010, 20:18
общий
да нужно рассмотреть случаи для чётного и нечётного числа N
должен быть файл .pas .asm
pas выглядит примерно так
Код:
{$L obr.obj}
uses crt;
const n=3; m=4;
type mas = array [1..n,1..m] of integer;
var x:mas;
i,j,sr1,sr2:integer;
procedure sozd;
begin
randomize;
for i:= 1 to n do begin
for j:= 1 to m do
x[i,j]:= random(100)-50;
end;end;

procedure viv;
begin
for i:= 1 to n do begin
writeln; writeln;
for j:= 1 to m do

write(x[i,j]:4);
end; end;

procedure obr(var x:mas; var max,nommaxstr,sr:integer; n,m:integer); external;
BEGIN
clrscr;
sozd;
obr(x,max,nommaxstr,sr,n,m);
writeln('nom max stroki=',nommaxstr);
writeln('max=',max);
viv;
writeln; writeln;
writeln('srednee znachenie= ',sr);
end.
давно
Посетитель
7438
7205
04.12.2010, 00:07
общий
Вы уж определитесь...
То Вы пишете: "Предпочтителен ассемблер, встроенный в turbo pascal 7", что предполагает ассемблерные вставки...
Сейчас пишете: "должен быть файл .pas .asm", что означает создание отдельного модуля на ассемблере...
Ну и что именно Вам требуется?
Можете не отвечать... Судя из приведенной программы, требуется отдельный модуль на ассемблере.
Зато ответьте на другие вопросы:
О каком номере максимальной строки можно вести речь?
Максимальное - это максимальное из двух средних арифметических?
И что такое среднее значение?
Похоже, Вы списали с какой-то другой программы, не вникая в суть...
Вот подумайте и скажите, что Вы хотите получить от данной подпрограммы...
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
7438
7205
04.12.2010, 02:41
общий
Короче, предлагаю ограничиться:
procedure obr(var x:mas; n,m:integer); external;
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
04.12.2010, 11:07
общий
ну да это был пример похожей программы, я показал как он должен выглядеть
давно
Посетитель
7438
7205
04.12.2010, 11:34
общий
это ответ
Здравствуйте, Посетитель - 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[code h=200];
; Подключение {$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 ;число половины столбцов
mov 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[/code]
5
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
04.12.2010, 16:53
общий
мне нужна адресация типа [bx+номер по стеку],то есть перменные из паскаля вызывать напрямую нельзя, нужно заменить в асме n,m,x(эти перменный нужно записать в форме с bx)
давно
Посетитель
7438
7205
04.12.2010, 19:18
общий
Уважаемый, чему соответствует команда?
mov cx, n
Оказывается-то
mov cx, [bp+6]
Другими словами, ассемблер преобразовывает параметр n в адрес параметра в стеке
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа