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

Узнай цену своей работы

Формулировка задачи:

День добрый. Дано такое условие: Получить новую матрицу путем умножения всех элементов первоначальной на наименьший положительный элемент матрицы. Должен найти минимальный элемент только среди положительных и его расположение (индексы: номер строки и столбца), после нахождения данного числа, должен сформировать новую матрицу путем умножения введённой на найденное минимальное число. Как найти минимальное значения в одномерном массиве, знаю. В двухмерном массиве на Assembler, увы такими навыками не владею.

Решение задачи: «Обработка двумерного массива (матрицы): поиск минимума из положительных значений, новая матрица по условию»

textual
Листинг программы
  1. extrn vvod:near, disp:near
  2. resh segment para public 'data' ; Горенков ПоЗ-11
  3. mas dw 10 dup (?)
  4. mas2 dw 10 dup (?)
  5. n dw ?
  6. min dw ?
  7. minindx dw ?
  8. imin db ?
  9. jmin db ?
  10. mes1 db 'Vvedite n=$'
  11. mes3 db 'mas[$'
  12. mes4 db ',$'
  13. mes5 db ']=$'
  14. mes6 db 'Isxodniy massiv$'
  15. mes7 db 10,13,'$' ; переход на новую строку
  16. mes8 db '_$' ; пробел
  17. mes9 db 'Noviy massiv$'
  18. mes10 db 'Minimal pologitelniy elements $'
  19. mes11 db 'Poziciya minimalnogo elementa, stroka = $'
  20. mes12 db 'Poziciya minimalnogo elementa, stolbez = $'
  21. resh ends
  22. op segment para stack 'stack'
  23. db 100h dup (?)
  24. op ends
  25. bukw segment para public 'code'
  26. osn proc near
  27. assume cs:bukw, ds:resh, ss:op;
  28.         mov ax,resh
  29.         mov ds,ax
  30.         ; ввод вектора
  31.         ; очистка экрана
  32.         mov ax,0002h
  33.         int 10h
  34.         ; ввод размерности массива =n*n
  35.         lea dx,mes1
  36.         mov ax,0900h
  37.         int 21h
  38.         call vvod
  39.         mov n,bx
  40.         ; ввод элементов вектора
  41.         mov cx,n ;число для внешнего цикла по строкам
  42.         mov si,0 ;строки в матрице
  43.         mov bx, offset mas ;строки в матрице (смещение
  44.         ;адреса переменной внутри сегмента)
  45. zikl_i:
  46.         push cx ;сохраняем содержимое р-ра cx в стеке
  47.         mov cx,n ;число для внутреннего цикла
  48.                  ;(по столбцам)
  49.         mov di,0 ;столбцы в матрице
  50. zikl_j:
  51.         lea dx,mes3 ; вывод mas[
  52.         mov ax,0900h
  53.         int 21h
  54.         mov ax,si
  55.         call disp
  56.         lea dx,mes4 ; ,
  57.         mov ax,0900h
  58.         int 21h
  59.         mov ax,di
  60.         call disp
  61.         lea dx,mes5 ; вывод ]=
  62.         mov ax,0900h
  63.         int 21h
  64.         push bx
  65.         call vvod
  66.         mov dx,bx
  67.         pop bx
  68.         mov mas[bx][di],dx
  69.         inc di
  70.         loop zikl_j
  71.         pop cx
  72.         add bx,n ;увеличиваем на кол-во эл-тов в строке
  73.         inc si
  74.     loop zikl_i
  75.     ;вывод элементов массива
  76.         lea dx,mes6 ;исходная матрица
  77.         mov ax,0900h
  78.         int 21h
  79.         lea dx,mes7 ;перевод курсора на начало строки
  80.         mov ax,0900h
  81.         int 21h
  82.         mov cx,n ;число для внешнего цикла по строкам
  83.         mov si,0 ;строки в матрице
  84.         mov bx,offset mas ;строки в матрице (смещение
  85.         ;адреса переменной внутри сегмента)
  86. zikl_i1:
  87.         push cx ;сохраняем содержимое р-ра сx в стеке
  88.         mov cx,n ;число для внутреннего цикла
  89.                  ;(по столбцам)
  90.         mov di,0 ;столбцы в матрице
  91. zikl_j1:
  92.         mov ax,mas[bx][di]
  93.         cbw
  94.         call disp
  95.         lea dx,mes8 ;пробел
  96.         mov ax,0900h
  97.         int 21h
  98.         inc di
  99.         loop zikl_j1
  100.         pop cx
  101.         add bx,n ;увеличиваем на кол-во эл-тов в строке
  102.         inc si
  103.         lea dx,mes7 ;перевод курсора на новую строку
  104.         mov ax,0900h
  105.         int 21h
  106.         loop zikl_i1
  107.         mov cx,n ;число для внешнего цикла по строкам
  108.         mov si,0 ;строки в матрице
  109.         mov bx,offset mas ;строки в матрице (смещение  
  110.                           ;адреса переменной внутри сегмента)
  111. zikl_i2:
  112.         push cx   ;сохраняем содержимое р-ра cx в стеке
  113.         mov cx,n  ;число для внутреннего цикла  
  114.                   ;(по столбцам)
  115.         mov di,0  ;столбцы в матрице
  116.         mov al,0
  117. zikl_j2:
  118.         ;нахождение минимального элемента
  119.         mov cx,n
  120.         xor dx,dx
  121. minimal:
  122.         mov ax,mas[si]
  123.         cmp ax,mas[di]
  124.         jae next
  125.         mov di,si
  126. next:
  127.         inc si
  128.     loop minimal
  129.         mov minindx,di; запись индекса минимального элемента
  130.         mov min,ax; запись значения минимального элемента
  131.     ;нахождение индекса двумерного массива
  132.         mov ax,minindx
  133.     mov bx,n
  134.         div bx      ;ah=остаток(столбец), al=частное(строка)
  135.         cwd
  136.        ;вывод индекса элемента элемента
  137.         mov imin,al
  138.         mov jmin,ah
  139.        ; вывод минимального элемента
  140.         lea dx,mes7 ; переход на новую строку
  141.         mov ax,0900h
  142.         int 21h
  143.         lea dx,mes10 ; минимальный элемент
  144.         mov ax,0900h
  145.         int 21h
  146.         mov ax,min
  147.         cbw
  148.         call disp
  149.         lea dx,mes7 ; переход на новую строку
  150.         mov ax,0900h
  151.         int 21h
  152.         lea dx,mes11; позиция минимального элемента - строка
  153.         mov ax,0900h
  154.         int 21h
  155.         mov al,imin
  156.         lea dx,mes7 ; переход на новую строку
  157.         mov ax,0900h
  158.         int 21h
  159.         lea dx,mes12 ; позиция минимального элемента - столбец
  160.         mov ax,0900h
  161.         int 21h
  162.         mov ah,jmin
  163.         cbw
  164.         call disp
  165.     mov ax,4c00h ;завершение программы
  166.     int 21h
  167. osn endp
  168. bukw ends
  169. 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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы