Дана последовательность символов, содержащая от 1 до 30 слов, к каждом из которых от 1 до 10 латинских букв; между соседними словами - запятая, за последним словом тоска. Напечатать текст, составленный из последних литер всех слов, не совпадающих с буквами первого слова.
Lapp
3.06.2010 23:16
Народ, ну помогите девочке, у которой
Цитата(polosatik @ 3.06.2010 22:44)
за последним словом - тоска..
Если я сейчас полезу вспоминать ассемблер, на котором не кодил лет 10 уже - вот это точно будет ТОСКА!!
volvo
4.06.2010 3:02
Как-то вот так (TASM 3.0) :
datasegment
first_len dw 0 ; длина первого слова
count dw 0
s db'one,two,three,four,five,six,sevent.'
len equ$-s
dataendscodesegmentassumecs: code, ds: datastart:
mov ax, data
mov ds, ax; сначала найдем первую запятую, то есть,
; вычислим длину первого слова
mov di, offset s
mov cx, len
loop_01:
cmp byteptr [di], ','je break_L1
inc di
inc first_len
loop loop_01
break_L1:
; теперь в переменной first_len правильная длина первого слова
; идем дальше... Теперь опять проходим по всей строке,
; и опять ищем запятые, но с другой целью: если есть запятая,
; значит перед ней (и перед точкой) - последняя буква слова
mov si, offset s
mov cx, len
loop_02:
cmp byteptr [si], ','; запятая?
je check_prev ; да - идем на check_prev
cmp byteptr [si], '.'; не запятая... Может хотя бы точка?
jne go_next ; нет, и не точка, идем дальше по строке
check_prev:
; Ага... Дошли до точки или запятой. Значит,
; в предыдущем символе, который [si -1] - последняя буква
; и надо проверить, не встречается ли она в first_len
; первых символах строки
; сохраняем старый счетчик цикла, иначе он запортится
push cx
mov count, 0 ; здесь у нас будет число совпавших символов
mov di, offset s
mov cx, first_len
loop_inner:
mov AL, byteptr [si - 1]
cmp byteptr [di], ALjne L1
inc count
L1:
inc diloop loop_inner
cmp count, 0 ; были совпадения?
jne L2 ; да, пойдем заканчивать внутренний цикл
; нет, совпадений не было, надо вывести символ из AL
; там у нас как раз хранится последний символ слова
mov DL, AL
mov ah, 2
int 21h
L2:
pop cx; восстанавливаем старый счетчик
go_next:
inc siloop loop_02
; Все, что надо - сделано, выходим
mov ax, 4C00h
int 21h
codeendsendstart
(особо оптимизировать не стал, так хорошо виден алгоритм)
polosatik
4.06.2010 8:34
Уху!!! Очень спасибо!!!
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.