Определить столбец в матрице сумма элементов, которого максимальна. заменить элементы этого столбца на 0 - Assembler

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

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

Задать с клавиатуры матрицу размером 4х4 Определить столбец сумма элементов, которого максимальна. Заменить элементы этого столбца на 0. Предусмотреть: 1 - Приглашение к вводу матрицы 2 - Проверку на разрядность вводимых элементов матрицы, разрядность не больше 2. 3 - Вывод новой матрицы

Решение задачи: «Определить столбец в матрице сумма элементов, которого максимальна. заменить элементы этого столбца на 0»

textual
Листинг программы
model small
.486
LOCALS @@
.stack  256
.data
 
Rows            equ    4                ;максимальное количество строк
Columns         equ    4                ;максимальное количество столбцов
iSize           equ    Rows*Columns     ;максимальный размер матрицы
 
m               dw     Rows             ;текущее количество строк
n               dw     Columns          ;текущее количество столбцов
 
Matrix          dw     iSize dup(?)     ;матрица
 
asCR_LF         db      0dh, 0ah, '$'   ;"перевод строки"
asTitle0        db      'Input matrix', '$'
asTitle1        db      'Current matrix', '$'
asTitle2        db      'Result matrix', '$'
asPrompt1       db      'a[ ', '$'      ;строка приглашения
asPrompt2       db      ',  ', '$'
asPrompt3       db      ']= ', '$'
 
kbMaxLen        equ     6+1             ;буфер ввода с клавиатуры Fn 0ah
kbInput         db      kbMaxLen, 0, kbMaxLen dup(0)
 
.code
 
; преобразования строки в число
; на входе:
; ds:[si] - строка с числом
; ds:[di] - адрес числа
; на выходе
; ds:[di] - число
; CY - флаг переноса (при ошибке - установлен, иначе - сброшен)
Str2Num PROC
        push    ax
        push    bx
        push    cx
        push    dx
        push    ds
        push    es
        push    si
 
        push    ds
        pop     es
 
        mov     cl, ds:[si]
        xor     ch, ch
 
        inc     si
 
        mov     bx, 10
        xor     ax, ax
 
        ;если в строке первый символ '-'
        ; - перейти к следующему
        ; - уменьшить количество рассматриваемых символов
        cmp     byte ptr [si], '-'
        jne     @@Loop
        inc     si
        dec     cx
@@Loop:
        mul     bx         ; умножаем ax на 10 ( dx:ax=ax*bx )
        mov     [di], ax   ; игнорируем старшее слово
        cmp     dx, 0      ; проверяем, результат на переполнение
        jnz     @@Error
 
        mov     al, [si]   ; Преобразуем следующий символ в число
        cmp     al, '0'
        jb      @@Error
        cmp     al, '9'
        ja      @@Error
        sub     al, '0'
        xor     ah, ah
        add     ax, [di]
        jc      @@Error    ; Если сумма больше 65535
        cmp     ax, 8000h
        ja      @@Error
        inc     si
 
        loop    @@Loop
 
        pop     si         ;проверка на знак
        push    si
        inc     si
        cmp     byte ptr [si], '-'
        jne     @@Check    ;если должно быть положительным
        neg     ax         ;если должно быть отрицательным
        jmp     @@StoreRes
@@Check:                   ;дополнительная проверка, когда при вводе положительного числа получили отрицательное
       or       ax, ax     ;
       js       @@Error
@@StoreRes:                ;сохранить результат
        mov     [di], ax
        clc
        pop     si
        pop     es
        pop     ds
        pop     dx
        pop     cx
        pop     bx
        pop     ax
        ret
@@Error:
        xor     ax, ax
        mov     [di], ax
        stc
        pop     si
        pop     es
        pop     ds
        pop     dx
        pop     cx
        pop     bx
        pop     ax
        ret
Str2Num ENDP
 
; выводит число из регистра AX на экран
; входные данные:
; ax - число для отображения
Show_AX proc
        push    ax
        push    bx
        push    cx
        push    dx
        push    di
 
        mov     cx, 10
        xor     di, di          ; di - кол. цифр в числе
 
        ; если число в ax отрицательное, то
        ;1) напечатать '-'
        ;2) сделать ax положительным
        or      ax, ax
        jns     @@Conv
        push    ax
        mov     dx, '-'
        mov     ah, 2           ; ah - функция вывода символа на экран
        int     21h
        pop     ax
 
        neg     ax
 
@@Conv:
        xor     dx, dx
        div     cx              ; dl = num mod 10
        add     dl, '0'         ; перевод в символьный формат
        inc     di
        push    dx              ; складываем в стэк
        or      ax, ax
        jnz     @@Conv
        ; выводим из стэка на экран
@@Show:
        pop     dx              ; dl = очередной символ
        mov     ah, 2           ; ah - функция вывода символа на экран
        int     21h
        dec     di              ; повторяем пока di<>0
        jnz     @@Show
 
        pop     di
        pop     dx
        pop     cx
        pop     bx
        pop     ax
        ret
Show_AX endp
 
; На входе
;m     - количество строк
;n     - количество столбцов
;ds:dx - адрес матрицы
ShowMatrix PROC FAR
        pusha
        mov     si, 0  ; строка
        mov     di, 0  ; столбец
        mov     bx, dx
 
@@ShowRow:
        mov     ax, [bx]
        call    Show_AX
 
        mov     ah,     02h
        mov     dl,     ' '
        int     21h
 
        add     bx,     2
 
        inc     di
 
        cmp     di, n
        jb      @@ShowRow
 
        mov     dx, OFFSET asCR_LF
        mov     ah, 09h
        int     21h
 
        mov     di, 0
 
        inc     si
 
        cmp     si, m
        jb      @@ShowRow
 
        popa
        ret
ShowMatrix ENDP
 
; На входе
;ds:dx - адрес матрицы
InputMatrix PROC
        pusha
        ;bx - адрес очередного элемента матрицы
        mov     bx,     dx
        ;Вывод на экран приглашения ввести матрицу
        mov     ah, 09h
        mov     dx, OFFSET asTitle0
        int     21h
 
        mov     ah, 09h
        mov     dx, OFFSET asCR_LF
        int     21h
 
        mov     si, 1  ; строка (индекс)
        mov     di, 1  ; столбец (индекс)
@@InpInt:
        ;вывод на экран приглашения 'a[  1,  1]='
        lea     dx, asPrompt1
        mov     ah, 09h
        int     21h
        mov     ax,     si
        call    Show_AX
        lea     dx, asPrompt2
        mov     ah, 09h
        int     21h
        mov     ax,     di
        call    Show_AX
        lea     dx, asPrompt3
        mov     ah, 09h
        int     21h
 
        ;Ввод строки
        mov     ah, 0ah
        mov     dx, OFFSET kbInput
        int     21h
 
        ;Преобразование строки в число
        push    di
        push    si
        mov     si, OFFSET kbInput+1
        mov     di, bx
        call    Str2Num
        pop     si
        pop     di
        jc      @@InpInt  ; если ошибка преобразования - повторить ввод
        ;проверка введенного числа на количество разрядов не более 2
        cmp     word ptr [bx],  100
        jle     @@YetTest
        jmp     @@InpInt
@@YetTest:
        cmp     word ptr [bx],  -100
        jge     @@Ok
        jmp     @@InpInt
@@Ok:
        ;на экране - перейти к следующей строке
        mov     dx, OFFSET asCR_LF
        mov     ah, 09h
        int     21h
        ;перейти к следующему элементу матрицы
        add     bx,     2
 
        inc     di
 
        cmp     di, n
        jbe     @@InpInt
 
        mov     di, 1
 
        inc     si
 
        cmp     si, m
        jbe     @@InpInt
 
        popa
        ret
InputMatrix ENDP
 
Main    PROC    FAR
        mov     dx, @data
        mov     ds, dx
 
        mov     dx, OFFSET Matrix
        call    InputMatrix
 
        mov     ah, 09h
        mov     dx, OFFSET asTitle1
        int     21h
 
        mov     ah, 09h
        mov     dx, OFFSET asCR_LF
        int     21h
 
        mov     dx, OFFSET Matrix
        call    ShowMatrix
 
        ;поиск столбца с максимальным значением суммы элементов
        mov     ax,     8000h   ;максимальное значение суммы в матрице
        mov     di,     0       ;номер столбца с максимальной суммой
        mov     dx,     n       ;приращение смещения адреса для перехода
        shl     dx,     1       ;к следующему элементу столбца
        mov     cx,     n
        lea     si,     Matrix
@@ForJ:                         ;цикл по строкам
        mov     bx,     0       ;сумма элементов столбца
        push    cx
        mov     cx,     m       ;количество элементов в
        push    si
        @@ForI:
                add     bx,     [si]
                add     si,     dx
                loop    @@ForI
        pop     si
        pop     cx
 
        cmp     ax,     bx
        jge     @@Next
        mov     ax,     bx
        mov     di,     n       ;di - номер столбца с максимальной суммой
        sub     di,     cx
@@Next:
        add     si,     2
        loop    @@ForJ
 
        ;замена элементов столбца с максимальной суммой элементов, на нули
        lea     bx,     Matrix
        mov     ax,     di
        shl     ax,     1
        add     bx,     ax
        mov     cx,     m
        mov     ax,     0
@@@ForI:
        mov     [bx],   ax
        add     bx,     dx
        loop    @@@ForI
 
        ;Вывод результатов на экран
        mov     ah, 09h
        mov     dx, OFFSET asTitle2
        int     21h
 
        mov     ah, 09h
        mov     dx, OFFSET asCR_LF
        int     21h
 
        mov     dx, OFFSET Matrix
        call    ShowMatrix
 
        mov     ax, 4c00h
        int     21h
Main    ENDP
 
END     Main

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

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