Обработка двумерного массива (матрицы): поиск минимума из положительных значений, новая матрица по условию - 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
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д