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

Объяснение кода листинга программы

  1. Объявление внешних функций vvod и disp.
  2. Объявление сегмента данных resh и переменных:
    • mas - двумерный массив размером 10x10, заполненный в начале неопределенными значениями;
    • mas2 - второй двумерный массив размером 10x10;
    • n - размерность массива;
    • min - минимальное положительное значение в массиве;
    • minindx - индекс минимального значения в массиве;
    • imin - строка минимального значения в массиве;
    • jmin - столбец минимального значения в массиве;
    • mes1 - строка для вывода просьбы ввести размерность массива;
    • mes3 - строка для вывода mas[;
    • mes4 - строка для вывода ,;
    • mes5 - строка для вывода ]=;
    • mes6 - строка для вывода Исходный массив;
    • mes7 - строка для перехода на новую строку;
    • mes8 - строка для вывода пробела;
    • mes9 - строка для вывода Новый массив;
    • mes10 - строка для вывода Минимальные положительные элементы;
    • mes11 - строка для вывода Позиция минимального элемента, строка =;
    • mes12 - строка для вывода Позиция минимального элемента, столбец =.
  3. Объявление сегмента стека op и резерва памяти для стека.
  4. Объявление сегмента кода bukw.
  5. Объявление процедуры osn.
  6. Назначение сегментов данных и кода для соответствующих регистров.
  7. Ввод размерности массива с помощью функции vvod.
  8. Сохранение размерности массива в переменную n.
  9. Ввод элементов для каждой ячейки массива с помощью вложенных циклов zikl_i и zikl_j:
    • Вывод предупреждения mes3 и номера строки si;
    • Вывод символа ,;
    • Вывод номера столбца di;
    • Вывод символа ]=;
    • Ввод значения элемента с помощью функции vvod;
    • Сохранение значения элемента в массиве mas.
  10. Вывод исходного массива с помощью циклов zikl_i1 и zikl_j1:
    • Вывод значения элемента;
    • Вывод пробела.
  11. Поиск минимального элемента и его позиции в массиве с помощью циклов zikl_i2 и zikl_j2:
    • Сравнение текущего элемента с минимальным;
    • Обновление минимального элемента и его индекса при необходимости.
  12. Вывод минимального элемента и его позиции с помощью операций вывода строк и чисел.
  13. Завершение программы с помощью системного вызова int 21h.

Оцени полезность:

8   голосов , оценка 4 из 5
Похожие ответы