Консультация № 168385
27.05.2009, 13:51
0.00 руб.
0 5 2
Уважаемые Эксперты.Подскажите пожалуйста ответ на такой вопрос.
Ввести строку символов. Заменить одинаковые символы, стоящие рядом (сколько бы их не было) на один такой символ.

Обсуждение

давно
Старший Модератор
31795
6196
27.05.2009, 14:02
общий
Вам под dos или windows?
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Неизвестный
27.05.2009, 14:04
общий
Под dos
давно
Старший Модератор
31795
6196
27.05.2009, 15:02
общий
это ответ
Здравствуйте, Ink0git0.

Смотрите в приложении.
Введенная строка проверяется с помощью индексных регистров SI и DI.
Первый указывает на проверяемый символ, второй на последний удовлетворяющий условию.
Цитата: команды компилятора
tasm prog
tlink prog /t

Удачи!

Приложение:
;
model tiny
.186
.code
org 100h
;переходим в текстовый режим
begin: mov ax,3
int 10h
;выводим приглашение к вводу
mov ah,09h
mov dx,offset dbEnter
int 21h
;вводим строку
mov ah,0ah
mov dx,offset dbStringMax
int 21h
;настраиваем индексные регистры
mov si,offset dbString
mov di,si
lodsb
;определяем длину введенной строки
mov cl,dbStringSize
xor ch,ch
;считываем очередной символ
isLoop: lodsb
cmp al,[di]
jz noSave
;записываем не оинаковый символ
inc di
mov [di],al
noSave:
loop isLoop
;записываем маркер конца строки
mov al,'$'
stosb
;записываем пробелы
mov al,20h
mov dbStringMax,al
mov dbStringSize,al
;выводим результат
mov ah,09;
mov dx,offset dbResult
int 21h
;ожидаем любую клавишу
xor ax,ax
int 16h
;выход в дос
ret
dbResult db 10,13,'Result:'
dbStringMax db 200
dbStringSize db ?
dbString db 200 dup(?)
dbEnter db 10,13,'Enter string:$'
end begin
3
Огромное Вам спасибо.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
7438
7205
27.05.2009, 15:19
общий
это ответ
Здравствуйте, Ink0git0.
Эх, опередил меня Зенченко Константин Николаевич...
Но все равно привожу, как еще один вариант.
Отличие то, что символы выводятся на экран сразу, и предыдущий символ хранится в DH

Приложение:
; Делаем COM-файл:
; tasm name.asm
; tlink name /t

.model tiny

.data
sInput db 'Enter string: $'
sResult db 0dh, 0ah, 'Result string: $'
sPress db 0dh, 0ah, 'Press any key$'

buf label byte ; буфер для приема строки с клавиатуры (по ф-и 0ah)
max db 128 ; максимальная длина строки
len db 0 ; реальная длина введенной строки
string db 128 dup (?) ; сама строка

.code
.startup

lea dx, sInput
mov ah, 9
int 21h ; приглашение на экран

lea dx, buf
mov ah, 0ah
int 21h ; вводим строку

lea dx, sResult
mov ah, 9
int 21h ; Result string

lea si, string ; адрес строки
mov dh, 0 ; предыдущий символ
MLoop:
lodsb ; очередной
cmp al, 0dh ; введенная строка заканчивается кодом 0dh
je exit
cmp al, dh ; совпадает с предыдущим?
je MLoop
mov dh, al ; сохраним
int 29h ; и выведем
jmp MLoop

exit:
lea dx, sPress
mov ah, 9
int 21h ; press any key

mov ah, 0 ; ждем нажатие клавиши, чтобы не ушло сразу
int 16h

mov ax, 4c00h
int 21h

end
5
Спасибо большое, так как на форуме первый день поставил оценку 3 которая стоит по умолчанию, Зенченко Константину Николаевичу,исправьте на 5 :)<br>
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
27.05.2009, 17:28
общий
Всем сказал спасибо еще немножко материально
Форма ответа