Консультация № 168439
28.05.2009, 11:03
0.00 руб.
0 3 0
Уважаемые эксперты, помогите пожалуйста...
Задание : Ввести строку символов. Заменить одинаковые символы, стоящие рядом (сколько бы их не было) на один такой символ.

Обсуждение

давно
Посетитель
7438
7205
28.05.2009, 11:14
общий
Вам случайно не знаком автор вот этого вопроса?
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
28.05.2009, 11:26
общий
Цитата: Лысков Игорь Витальевич
нет не знаком))), спасибо за ссылочку на ответ....
Неизвестный
28.05.2009, 19:09
общий
Ну и еще вариант могу показать:
Код:
.model tiny
.386
JUMPS
.code
org 100h
start:
mov ax, 3
int 10h
lea dx, msg_input
mov ah, 9
int 21h
lea dx, buf
mov ah, 0Ah
int 21h
; запишем в DХ фактическую длину ввода
lea si, buf
inc si
mov dl, [si]
xor dh, dh
inc si
add si, cx ; в конец запишем 0 = индикатор конца строки. Там сейчас 13 = ENTER
mov byte ptr [si], 0
dec cx ; последний символ обрабатывать не надо
or dx, dx
jz @@_exit

mov al, 13 ; переход на новую строку
int 29h
mov al, 10
int 29h
; собственно, удаление
lea si, buf
add si, 2
cld
@@1:
lodsb
or al, al
jz @@_show
@@2:
cmp al, [si] ; SI теперь указывает на следующий символ
jne @@3
; вот оно удаление - нас самом деле сдвиг влево на один символ
push si ; сохраняем то, что будет изменено
mov cx, dx
; REP изменит СХ, так что его нужно обновлять
mov di, si
inc si
REP MOVSB
pop si
jmp @@2
@@3:
dec dx
jmp @@1

@@_show:
; покажем новую строку
lea si, buf
add si, 2 ; пропустили байты длины
cld ; буду использовать строковые инструкции - установим флаг направления
@@_next:
lodsb
or al, al
jz @@_exit
int 29h ; это прерывание умеет делать только одно: выводить содержимое AL на экран
jmp @@_next

@@_exit:
lea dx, msg_press
mov ah, 9
int 21h
xor ax, ax
int 16h
int 20h
msg_input db 'Введите строку символов длиной не более 80:',13,10,'$'
msg_press db 13,10,'Press any key ...$'
buf db 80, 80 dup (?) ; место для строки
end start

Форма ответа