Помощь - Поиск - Пользователи - Календарь
Полная версия: Обработка символьных строк
Форум «Всё о Паскале» > Delphi, Assembler и другие языки. > Assembler
polosatik
Дана последовательность символов, содержащая от 1 до 30 слов, к каждом из которых от 1 до 10 латинских букв; между соседними словами - запятая, за последним словом тоска. Напечатать текст, составленный из последних литер всех слов, не совпадающих с буквами первого слова. blink.gif
Lapp
Народ, ну помогите девочке, у которой
Цитата(polosatik @ 3.06.2010 22:44) *
за последним словом - тоска..
lol.gif
Если я сейчас полезу вспоминать ассемблер, на котором не кодил лет 10 уже - вот это точно будет ТОСКА!! smile.gif
volvo
Как-то вот так (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
Уху!!! Очень спасибо!!! rolleyes.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.