Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
KpiYap.docx
Скачиваний:
0
Добавлен:
16.02.2020
Размер:
117.51 Кб
Скачать

54. Отсортировать слова в строке (по длине слова, по алфавиту).

.model small;

.stack 100h;

.data;

i dw 0h

String db 'Enter a line: $'

Stg db 100h dup(0h); Массив для строки

.code;

mov ax, @data;

mov ds, ax;

mov ah, 00h; Очистка экрана

mov al, 2h;

int 10h

mov ah, 09h

Lea dx, String

int 21h

mov ah, 1h; Ф-я ввода символа

mov si, 0h

mov bx, 0h

Input: ;Ввод массива

int 21h

mov cx, si

mov Stg[bx], cl; Длина слова

cmp al, 32; Проверка на пробел

jne Skip1

mov si, 0h

add bx, 10h; Начало следующего слова

jmp Input

Skip1:

inc si

mov Stg[bx+si], al; Помещение символа в массив

cmp al, 13

jne Input

mov Stg[bx+si], 0h; Удаление Enter'а

mov i, bx; Кол-во слов

mov bx, 0h

Sort1: ;Выборочная сортировка

mov di, bx; Индекс минимальной длины

mov ax, bx

add ax, 10h

Sort2:

mov si, ax

mov cl, Stg[si]

cmp cl, Stg[di]

jae Skip2

mov di, si; Если меньше

Skip2:

add ax, 10h

cmp ax, i

jbe Sort2

mov si, 0h

Sort3:

moV cl, Stg[bx+si]; Смена слов

mov al, Stg[di]

mov Stg[bx+si], al

mov Stg[di], cl

inc si

inc di

cmp si, 10h

jb Sort3

add bx, 10h

cmp bx, i

jb Sort1

mov ah, 02h; Ф-я установки позиции курсора:

mov bh, 0h; № Страницы

mov dh, 2h; № строки

mov dl, 0h; № столбца

int 10h

mov bx, 0h

mov si, 0h

mov ah, 2h; Ф-я вывода символа

Output: ;Вывод массива

inc si

mov dx, word ptr Stg[bx+si]

cmp dx, 0h

jne Skip3

cmp bx, i

je Exit

mov si, 0h

add bx, 10h

mov dx, ' '

Skip3:

int 21h

cmp bx, i

jbe Output

Exit:

mov ah, 4ch;

int 21h

End

55. Удалить из строки заданное слово.

.MODEL small

.STACK 100h

.DATA

msg1 DB "Enter string: $"

msg2 DB 0Ah, 0Dh, "Enter substring to delete: $"

msg3 DB 0Ah, 0Dh, "Result: $"

str1ml DB 200

str1l DB '$'

str1 DB 200 dup('$')

str2ml DB 200

str2l DB '$'

str2 DB 200 dup('$')

.CODE

begin:

mov ax, @data

mov ds, ax

mov es,ax

xor ax,ax

lea dx, msg1 ;вывод приглашения msg1

call strout

lea dx, str1ml ;ввод строки str1

call strin

lea dx, msg2 ;вывод приглашения msg2

call strout

lea dx, str2ml ;ввод строки str2

call strin

xor cx, cx

mov cl, str1l ;устанавливается кол-во повторений

sub cl, str2l

inc cl

cld ;обход вперёд

lea di, str2 ;в di - строка, которую надо найти

lea si, str1 ;в si - строка, в которой ищем

xor ax, ax

all_string: ;повторяется для str1 до конца строки минус длина str2

call sub_search

inc si

loop all_string

call nextstr

;xor dx, dx

;mov dl, al

;add dl, 30h

;mov ah, 02h

;int 21h

lea dx, msg3

call strout

lea dx, str1

call strout

_end:

mov ah, 4ch ;канэц, просто канэц какой-та

int 21h

;*****************Процедуры***********************

nextstr proc

push dx

push ax

mov dl, 0Dh ;перевод на другую строку

mov ah, 02h

int 21h

mov dl, 0Ah

mov ah, 02h

int 21h

pop ax

pop dx

ret

nextstr endp

;*************************************************

strin proc

mov ah, 0Ah

int 21h

ret

strin endp

;*************************************************

strout proc

mov ah, 09h

int 21h

ret

strout endp

;*************************************************

sub_search proc

push cx

push di

push si

mov bx, si

mov cl, str2l

repe cmpsb

je _eq

jne _neq

_eq:

;di указывает на строку 2, si указывает на конец слова, которое надо удалить

call delete

inc al

_neq:

pop si

pop di

pop cx

ret

sub_search endp

;*************************************************

delete proc

push bx

push di

push si

mov di, bx ;в di - адрес начала удаляемого слова

xor cx, cx

mov cl, str1l

repe movsb

pop si

pop di

pop bx

ret

delete endp

end begin

.MODEL small

.STACK 100h

.DATA

msg1 DB "Enter string: $"

msg2 DB 0Ah, 0Dh, "Enter symbol: $"

msg3 DB 0Ah, 0Dh, "Result: $"

str1ml DB 200

str1l DB '$'

str1 DB 200 dup('$')

symbol DB ?

.CODE

begin:

mov ax, @data

mov ds, ax

mov es,ax

xor ax,ax

lea dx, msg1

call strout

lea dx, str1ml

call strin

lea dx, msg2

call strout

mov ah, 01h

int 21h

mov [symbol], al

xor cx, cx

mov cl, str1l

xor si, si

xor di, di

xor bx, bx

mov di, offset str1

mov si, offset str1

mov bl, [symbol]

cld

main_loop:

cmp [si], ' ' ;esli probel

je cont ;propuskaem

cmp [si], 13 ;esli konec

je end_main_loop ;vyvodim stroku

cmp [si], bl

jne cont ;esli ne sovpalo

in_loop:

inc si

cmp [si], ' ' ;esli probel

je stop ;stop

cmp [si], 13 ;esli konec

je stop ;stop

dec cx

jmp in_loop

stop:

call delete ;udalyaem

cont:

mov di, si

inc si

loop main_loop

end_main_loop:

lea dx, msg3

call strout

lea dx, str1

call strout

_end:

mov ah, 4ch ;vyhod

int 21h

;*****************Процедуры***********************

nextstr proc

push dx

push ax

mov dl, 0Dh

mov ah, 02h

int 21h

mov dl, 0Ah

mov ah, 02h

int 21h

pop ax

pop dx

ret

nextstr endp

;*************************************************

strin proc

mov ah, 0Ah

int 21h

ret

strin endp

;*************************************************

strout proc

mov ah, 09h

int 21h

ret

strout endp

;*************************************************

;v si - index nachala podstroki

;v di - index konca

delete proc

push bx

push di

push si

push cx

xor cx, cx

mov cl, str1l

repe movsb

pop cx

pop si

pop di

pop bx

ret

delete endp

end begin

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]