Дана последовательность символов, содержащая от 1 до 30 слов, к каждом из которых от 1 до 10 латинских букв; между соседними словами - запятая, за последним словом тоска. Напечатать текст, составленный из последних литер всех слов, не совпадающих с буквами первого слова.
Lapp
4.06.2010 3:16
Народ, ну помогите девочке, у которой
Цитата(polosatik @ 3.06.2010 22:44)
за последним словом - тоска..
Если я сейчас полезу вспоминать ассемблер, на котором не кодил лет 10 уже - вот это точно будет ТОСКА!!
volvo
4.06.2010 7:02
Как-то вот так (TASM 3.0) :
data segment
first_len dw 0 ; длина первого слова count dw 0
s db 'one,two,three,four,five,six,sevent.' len equ $-s
data ends
code segment assume cs: code, ds: data
start: mov ax, data mov ds, ax
; сначала найдем первую запятую, то есть, ; вычислим длину первого слова mov di, offset s mov cx, len loop_01: cmp byte ptr [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 byte ptr [si], ',' ; запятая? je check_prev ; да - идем на check_prev cmp byte ptr [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, byte ptr [si - 1] cmp byte ptr [di], AL jne L1 inc count L1: inc di loop loop_inner cmp count, 0 ; были совпадения? jne L2 ; да, пойдем заканчивать внутренний цикл
; нет, совпадений не было, надо вывести символ из AL ; там у нас как раз хранится последний символ слова mov DL, AL mov ah, 2 int 21h
L2: pop cx ; восстанавливаем старый счетчик
go_next: inc si loop loop_02
; Все, что надо - сделано, выходим mov ax, 4C00h int 21h code ends end start
(особо оптимизировать не стал, так хорошо виден алгоритм)
polosatik
4.06.2010 12:34
Уху!!! Очень спасибо!!!
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.