Обработка двумерного массива (матрицы): поиск минимума из положительных значений, новая матрица по условию - Assembler
Формулировка задачи:
День добрый. Дано такое условие: Получить новую матрицу путем умножения всех элементов первоначальной на наименьший положительный элемент матрицы.
Должен найти минимальный элемент только среди положительных и его расположение (индексы: номер строки и столбца), после нахождения данного числа, должен сформировать новую матрицу путем умножения введённой на найденное минимальное число.
Как найти минимальное значения в одномерном массиве, знаю. В двухмерном массиве на Assembler, увы такими навыками не владею.
Решение задачи: «Обработка двумерного массива (матрицы): поиск минимума из положительных значений, новая матрица по условию»
textual
Листинг программы
extrn vvod:near, disp:near resh segment para public 'data' ; Горенков ПоЗ-11 mas dw 10 dup (?) mas2 dw 10 dup (?) n dw ? min dw ? minindx dw ? imin db ? jmin db ? mes1 db 'Vvedite n=$' mes3 db 'mas[$' mes4 db ',$' mes5 db ']=$' mes6 db 'Isxodniy massiv$' mes7 db 10,13,'$' ; переход на новую строку mes8 db '_$' ; пробел mes9 db 'Noviy massiv$' mes10 db 'Minimal pologitelniy elements $' mes11 db 'Poziciya minimalnogo elementa, stroka = $' mes12 db 'Poziciya minimalnogo elementa, stolbez = $' resh ends op segment para stack 'stack' db 100h dup (?) op ends bukw segment para public 'code' osn proc near assume cs:bukw, ds:resh, ss:op; mov ax,resh mov ds,ax ; ввод вектора ; очистка экрана mov ax,0002h int 10h ; ввод размерности массива =n*n lea dx,mes1 mov ax,0900h int 21h call vvod mov n,bx ; ввод элементов вектора mov cx,n ;число для внешнего цикла по строкам mov si,0 ;строки в матрице mov bx, offset mas ;строки в матрице (смещение ;адреса переменной внутри сегмента) zikl_i: push cx ;сохраняем содержимое р-ра cx в стеке mov cx,n ;число для внутреннего цикла ;(по столбцам) mov di,0 ;столбцы в матрице zikl_j: lea dx,mes3 ; вывод mas[ mov ax,0900h int 21h mov ax,si call disp lea dx,mes4 ; , mov ax,0900h int 21h mov ax,di call disp lea dx,mes5 ; вывод ]= mov ax,0900h int 21h push bx call vvod mov dx,bx pop bx mov mas[bx][di],dx inc di loop zikl_j pop cx add bx,n ;увеличиваем на кол-во эл-тов в строке inc si loop zikl_i ;вывод элементов массива lea dx,mes6 ;исходная матрица mov ax,0900h int 21h lea dx,mes7 ;перевод курсора на начало строки mov ax,0900h int 21h mov cx,n ;число для внешнего цикла по строкам mov si,0 ;строки в матрице mov bx,offset mas ;строки в матрице (смещение ;адреса переменной внутри сегмента) zikl_i1: push cx ;сохраняем содержимое р-ра сx в стеке mov cx,n ;число для внутреннего цикла ;(по столбцам) mov di,0 ;столбцы в матрице zikl_j1: mov ax,mas[bx][di] cbw call disp lea dx,mes8 ;пробел mov ax,0900h int 21h inc di loop zikl_j1 pop cx add bx,n ;увеличиваем на кол-во эл-тов в строке inc si lea dx,mes7 ;перевод курсора на новую строку mov ax,0900h int 21h loop zikl_i1 mov cx,n ;число для внешнего цикла по строкам mov si,0 ;строки в матрице mov bx,offset mas ;строки в матрице (смещение ;адреса переменной внутри сегмента) zikl_i2: push cx ;сохраняем содержимое р-ра cx в стеке mov cx,n ;число для внутреннего цикла ;(по столбцам) mov di,0 ;столбцы в матрице mov al,0 zikl_j2: ;нахождение минимального элемента mov cx,n xor dx,dx minimal: mov ax,mas[si] cmp ax,mas[di] jae next mov di,si next: inc si loop minimal mov minindx,di; запись индекса минимального элемента mov min,ax; запись значения минимального элемента ;нахождение индекса двумерного массива mov ax,minindx mov bx,n div bx ;ah=остаток(столбец), al=частное(строка) cwd ;вывод индекса элемента элемента mov imin,al mov jmin,ah ; вывод минимального элемента lea dx,mes7 ; переход на новую строку mov ax,0900h int 21h lea dx,mes10 ; минимальный элемент mov ax,0900h int 21h mov ax,min cbw call disp lea dx,mes7 ; переход на новую строку mov ax,0900h int 21h lea dx,mes11; позиция минимального элемента - строка mov ax,0900h int 21h mov al,imin lea dx,mes7 ; переход на новую строку mov ax,0900h int 21h lea dx,mes12 ; позиция минимального элемента - столбец mov ax,0900h int 21h mov ah,jmin cbw call disp mov ax,4c00h ;завершение программы int 21h osn endp bukw ends end osn
Объяснение кода листинга программы
- Объявление внешних функций
vvod
иdisp
. - Объявление сегмента данных
resh
и переменных:mas
- двумерный массив размером 10x10, заполненный в начале неопределенными значениями;mas2
- второй двумерный массив размером 10x10;n
- размерность массива;min
- минимальное положительное значение в массиве;minindx
- индекс минимального значения в массиве;imin
- строка минимального значения в массиве;jmin
- столбец минимального значения в массиве;mes1
- строка для вывода просьбы ввести размерность массива;mes3
- строка для выводаmas[
;mes4
- строка для вывода,
;mes5
- строка для вывода]=
;mes6
- строка для выводаИсходный массив
;mes7
- строка для перехода на новую строку;mes8
- строка для вывода пробела;mes9
- строка для выводаНовый массив
;mes10
- строка для выводаМинимальные положительные элементы
;mes11
- строка для выводаПозиция минимального элемента, строка =
;mes12
- строка для выводаПозиция минимального элемента, столбец =
.
- Объявление сегмента стека
op
и резерва памяти для стека. - Объявление сегмента кода
bukw
. - Объявление процедуры
osn
. - Назначение сегментов данных и кода для соответствующих регистров.
- Ввод размерности массива с помощью функции
vvod
. - Сохранение размерности массива в переменную
n
. - Ввод элементов для каждой ячейки массива с помощью вложенных циклов
zikl_i
иzikl_j
:- Вывод предупреждения
mes3
и номера строкиsi
; - Вывод символа
,
; - Вывод номера столбца
di
; - Вывод символа
]=
; - Ввод значения элемента с помощью функции
vvod
; - Сохранение значения элемента в массиве
mas
.
- Вывод предупреждения
- Вывод исходного массива с помощью циклов
zikl_i1
иzikl_j1
:- Вывод значения элемента;
- Вывод пробела.
- Поиск минимального элемента и его позиции в массиве с помощью циклов
zikl_i2
иzikl_j2
:- Сравнение текущего элемента с минимальным;
- Обновление минимального элемента и его индекса при необходимости.
- Вывод минимального элемента и его позиции с помощью операций вывода строк и чисел.
- Завершение программы с помощью системного вызова
int 21h
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д