Участник клуба
Регистрация: 15.05.2009
Сообщений: 1,222
|
Опять сортировки
Ребят помогите, нужна сортировка методом улучшеного пузырька и выбором.
По первой ничего не написала, а вот насчет второй есть наработки
Код:
.model tiny
.code
org 100h
main:
;============================================================================
;ввод
mov cx,5
xor si,si
;xor di,di
input:
xor bp,bp
xor ax,ax
xor dx,dx
xor bx,bx
xor di,di
push cx
push si
mov ah,0ah
mov dx,offset buff ; адрес буфера
int 21h
;перевести строку
mov dl,0ah
mov ah,02;
int 21h
; обрабатываем содержимое буфера
mov si,offset buff+2 ;адрес начала строки
cmp byte ptr[si]," "
je _prop
cmp byte ptr [si],"-" ; если первый символ минус
jnz _poloz ;в противном случае перейти на обработку положительных
mov di,1 ; устанавливаем флаг
_prop:
inc si ; переходим на следующее
_poloz:
xor ax,ax
mov bx,10 ; основание системы счисления
_perevod:
mov cl,[si] ; берем символ из буфера
cmp cl,0dh ; проверям равен ли символ переводу строки
jz _endin ;перейти на конец обработки
; если символ не последний, то проверяем его на правильность
cmp cl,30h ; если введен неверный символ <0
jl _err
cmp cl,39h ; если введен неверный символ >9
ja _err
sub cl,30h ; делаем из символа число
mul bx ; умножаем на 10
add ax,cx ; прибавляем к остальным
inc si ; переходим на следующее число
inc bp
cmp bp,4
ja _err
jmp _perevod ; повторяем
; если была ошибка, то выводим сообщение об этом и выходим
_err:
mov dx, offset error
mov ah,09
int 21h
int 20h
; все символы из буфера обработаны число находится в ax
_endin:
cmp di,1 ; если установлен флаг, то
jnz _endp
neg ax ; делаем число отрицательным
_endp:
;возвращаем значения регистров
pop si
pop cx
mov word ptr arr[si],ax
add si,2
loop input
;============================================================================
;сортировка методом простого выбора
mov cx,4
mov di,8
mov v,0
cyc:
sub di,v
call maks
add v,2
loop cyc
;==================================================================
;вывод
mov cx,5
xor si,si
xor ax,ax
xor dx,dx
output:
push cx
mov ax, word ptr arr [si]
;; Проверяем число на знак.
test ax, ax
jns @oi1
;; Если оно отрицательное, выведем минус и оставим его модуль.
push ax
mov ah, 02h
mov dl, '-'
int 21h
pop ax
neg ax
;; Количество цифр будем держать в CX.
@oi1:
xor cx, cx
mov bx, 10
@oi2:
;cwd
xor dx,dx
div bx
; Делим число на десять. В остатке получается последняя цифра.
; Сразу выводить её нельзя, поэтому сохраним её в стэке.
push dx
inc cx
; А с частным повторяем то же самое, отделяя от него очередную
; цифру справа, пока не останется ноль, что значит, что дальше
; слева только нули.
test ax, ax
jnz @oi2
; Теперь приступим к выводу.
mov ah, 02h
@oi3: pop dx
; Извлекаем очередную цифру, переводим её в символ и выводим.
add dl, 30h
int 21h
; Повторим ровно столько раз, сколько цифр насчитали.
loop @oi3
add si,2
pop cx
mov dx," "
mov ah,02h
int 21h
loop output
ret
;================================================
;процедура нахождения макс и мин и обмен их местами
maks proc near
push cx
dec cx
xor si,si
xor ax,ax
xor dx,dx
xor bx,bx
mov i,0
mov bx,offset arr
mov ax,word ptr[bx]
_cyc:
add si,2
cmp si,8
je _end
cmp word ptr[bx+si],ax
jng _no ;если макс больше то выходим на метку no
mov ax,word ptr [bx+si]
mov i,si
_no:
loop _cyc
mov si,i
mov ax,word ptr[bx+si]
mov dx, word ptr[bx+di] ;получили последний элемент в текущей размерности
mov word ptr[bx+di],ax
mov word ptr[bx+si],dx
_end:
pop cx
ret
maks endp
;================================================
arr dw 5 dup (?)
error db "Введено не число$"
buff db 6,7 dup(?)
i dw 0
v dw ?
end main
Единственное, что ограничивает полет мысли программиста-компилятор
|