Постановка задачи: В заданном массиве A[n] (n>2) найти 3 максимальных элемента. Сжать массив, удалив эти максимальные элементы.
Идеи:
Код | .MODEL SMALL .STACK 64 .DATA N=5 FRST DW ? MAXN DW ? MAXQ DW 3 A DW N DUP(?)
.CODE EXTRN WRITER: NEAR EXTRN READ: NEAR
.STARTUP
MOV SI,0 ;чистим индексный регистр MOV CX,N ;запоминаем для цикла размер массива R: CALL READ ; MOV A[SI],AX ; INC SI ;читаем массив INC SI ; LOOP R ; Z: MOV SI,0 ;чистим индексный регистр MOV AX,A[SI] ;предполагаем, что первый элемент - первый максимальный MOV FRST,AX MOV MAXN,0 ;номер максимального элемента, предположительно, = 0 MOV CX,N ;запоминаем для цикла размер массива MOV AX, MAXQ ;проверяем, удалили ли мы все 3 максимальных элемента CMP AX, 0 ;если нет, то ищем максимальный элемент и удаляем его JE OUTPUT ;иначе выводим полученный массив на экран LP1: MOV AX,A[SI] ;берём элемент массива CMP AX,FRST ;сравниваем с максимальным JNG NEXT ;если меньше - идем дальше MOV MAXN,SI ;иначе - запоминаем номер максимального MOV AX,A[SI] ;запоминаем и его значение MOV FRST,AX DEC MAXQ ;вычетаем единицу из счетчика максимальных элементов
NEXT: INC SI ; INC SI ;следующий виток цикла LOOP LP1 ;
MOV AX,FRST CALL WRITER CALL READ
REMV: DEC CX ;уменьшаем количество шагов на один для последнего элемента MOV SI,MAXN LP: MOV AX,A[SI+2] ;берём следующий элемент MOV A[SI],AX ;заменяем его INC SI INC SI LOOP LP MOV DI,N ;берём номер последнего элемента массива DEC DI ;вычитаем единицу ввиду нумерации не с нуля SHL DI,1 ;умножаем на два для получения адреса MOV A[DI],0 ;обнуляем последний элемент
JMP Z ;возвращаемся наверх
OUTPUT: MOV SI,0 ;чистим индексный регистр MOV CX,N ;запоминаем для цикла размер массива F: MOV AX,A[SI] ; CALL WRITER ; INC SI ;выводим массив INC SI ; LOOP F ; call read
.EXIT END
|
Что получается:- ввод массива
- поиск и вывод максимального элемента 3 раза
- вывод "измененного" массива
Что не получается:- удаление элемента путем смещения
- освободившиеся элементы массива заменить нулем
|