Сформировать одномерный массив, состоящий из отрицательных элементов двумерного массива - Assembler

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

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

Как сформировать одномерный массив состоящий из отрицательных элементов двумерного массива?

Решение задачи: «Сформировать одномерный массив, состоящий из отрицательных элементов двумерного массива»

textual
Листинг программы
NewStr macro        ;макрос новой строки
        mov ah,2    ;вывод символа
    mov dl,10   ;новая строка
    int 21h
endm
stacks segment para stack 'stack'
    db 256 dup(?)
stacks ends
    data segment para 'data'
    nRw db 0 ;количество строк в массиве
    nCl db 0 ;количество колонок в массиве
    rBt db 0 ;область считывания из файла
    Sz  dw 0 ;nRw*nCl=количество элементов
    nNum dw ?;nNum=Sz для работы
    hF  dw ? ;описатель исходного файла
    sEl db '   $';строка для вывода элемента
    nEl db ?     ;количество элементов в строке nEl=nCl для работы
    flA db 'C:\Array.txt',0;исходный файл
    flN db 'C:\NegArr',0   ;файл отрицательных
    flS db 'C:\SortArr',0  ;файл отсортированных
    fNeg db 0 ;флаг отрицательного
    fNum db 0 ;флаг числа
    fEnd dw ? ;флаг конца файла
    aNeg db 81 dup(0);массив отрицательных, вдруг все 9*9 отрицательные
    nNeg dw 0 ;количество отрицательных
    ;заголовки:
    sA db 'Array  x ',10,'$'   ;массива чисел
    sN db 10,'Negative:',10,'$';массива отрицательных
    Sr db 'Sorting:',10,'$'    ;массива отсортированных
data ends
code segment para 'code'
    assume cs: code, ds: data, ss: stacks
count   PROC FAR
     mov ax, data
     mov ds, ax   
 
     mov ah,3dh    
     lea dx,flA   ;открываем исходный файл
     mov al, 0
     int 21h
     mov hF,ax    ;запомнили его описатель  
 
 go0:mov ah,3fh   ;считываем из файла
     lea dx,rBt   ;область считывания
     mov cx,1     ;один байт
     mov bx,hF    ;описатель файла
     int 21h
     mov fEnd,ax  ;закончился ли файл
     mov si,dx
     mov al,[si]  ;считанный байт в AL
     cmp al,' '
     jne go8
     jmp go4      ;если пробел пропускаем
 go8:cmp al,13
     jne go9
     jmp go4      ;если возврат каретки пропускаем
 go9:cmp al,10
     jne goA
     jmp go4      ;если новая строка пропускаем
 goA:cmp al,'-'
     jne go3
     mov byte ptr fNeg,1 ;нашли минус, устанавливаем его флаг
     jmp go4
 go3:cmp al,'0' ;возможно цифра
     jb go1
     cmp al,'9'
     ja go1
     mov byte ptr fNum,1  ;точно цифра, устанавливаем ее флаг
     cmp byte ptr nRw,0   ;если число строк не заполнено
     ja go5
     lea si,sA    ;адрес заголовка
     mov [si+6],al;записали число строк
     sub al,48    ;цифру перевели в число
     mov nRw,al   ;записали его
     mov byte ptr fNum,0;скинули флаг
     jmp go4
 go5:cmp byte ptr nCl,0;если число колонок не установлено
     ja go1
     lea si,sA
     mov [si+8],al;записали его в строку
     sub al,48    ;перевели в число
     mov nEl,al   ;элементов в строке
     mov nCl,al
     mul byte ptr nRw
     mov Sz,ax
     mov nNum,ax  ;всего элементов
     mov ah,9
     lea dx,sA
     int 21h      ;вывели строку про массив
     mov byte ptr fNum,0 ;сбросили флаг
     jmp go4
 go1:lea si,sEl;адрес строки элемента
     mov dx,si
     mov word ptr[si],2020h;забиваем пробелы в строку
     cmp byte ptr fNeg,1;вдруг ранее был минус
     jne go2
     mov bl,al
     sub bl,48;цифру в число
     neg bl   ;переводим в отрицательное
     lea di, aNeg;адрес отрицательного массива
     add di,nNeg;адрес текущего элемента
     mov [di],bl;записали элемент
     inc word ptr nNeg;увеличили счетчик минусов
     mov byte ptr[si],'-';проставили минус
     inc si
 go2:cmp byte ptr fNum,1;число?
     jne go4
     mov [si],al;вписали цифру
     mov ah, 9
     int 21h    ;вывели строку элемента
     dec byte ptr nEl
     jnz go7 ;ширина массива закончилась?
     NewStr  ;да, новая строка
     mov al,nCl
     mov nEl,al ;для следующей строки
 go7:mov byte ptr fNeg,0;сбрасываем флаги 
     mov byte ptr fNum,0
     dec byte ptr nNum
     jz go6
 
 
 go4:cmp word ptr fEnd,0;не закончился ли исходный файл
     je go6
     jmp go0
 
 go6:NewStr
     mov ah,3eh   ;закроем исходный файл
     mov bx,hF
     int 21h  
 
     cmp byte ptr nNeg,0;есть ли вообще отрицательные
     je goG
     ;готовимся к выводу отрицательных
     lea dx,flN ;имя файла C:\NegArr
     lea si,sN  ;адрес заголовка Negative:
     call PrintA;вывели массив на экран и в файл
     call SortA ;отсортировали массив
     ;готовимся к выводу отсортированных
     lea dx,fls ;имя файла C:\SortArr
     lea si,Sr  ;адрес заголовка Sorting:
     call PrintA;вывели массив на экран и в файл
 
 goG:mov ah,8      ;ждем нажатия клавиши
     int 21h
     mov ah, 4ch   ;выход
     int 21h
endp
;сортировка методом пузырька
SortA proc
     mov bx,nNeg
 goF:dec bx
     jz goC
     lea si,aNeg;начало массива
     mov cx,bx
 goE:mov al,[si]
     cmp al,[si+1];сравнивает со следующим
     jge goD
     xchg al,[si+1];меняет местами
     mov [si],al;больший в [SI]
 goD:inc si
     loop goE
     jmp goF
 goC:ret
 
endp
;вывод и запись массива в файл
PrintA proc
     ;создаем файл
     mov ah,3ch    
     xor cx,cx
     int 21h
     mov bx,ax    ;запомнили его описатель
 
     mov ah,9
     mov dx,si
     int 21h    ;вывели заголовок
     lea si,sEl
     mov byte ptr[si],'-';они все отрицательные
     mov dx, si
     mov cx,nNeg ;всего отрицательных
     lea di,aNeg ;начало их массива
 goB:mov al,[di] ;текущий элемент
     neg al      ;в положительный
     add al,48   ;в цифру
     mov [si+1],al;в строку
     mov ah,9
     int 21h ;вывели строку
     push cx ;сохранили счетчик
     mov ah,40h
     mov cx,3;3 символа в файл
     int 21h ;записали строку в файл
     pop cx  ;восстановили счетчик
     
     inc di  ;адрес следующего элемента
     loop goB
     NewStr
 
     mov ah,3eh   ;закроем файл
     int 21h 
 
     ret
endp
code ENDS
   END count

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

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