IPB
ЛогинПароль:

> ПРАВИЛА РАЗДЕЛА!!!

1. Заголовок или название темы должно быть информативным
2. Все тексты программ должны помещаться в теги [CODE=asm] [/CODE]
3. Прежде чем задавать вопрос, см. "FAQ",если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно, такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Ассемблера. Исключение только с согласия модератора.
5. НЕ используйте форум для личного общения! Все, что не относиться к обсуждению темы - на PM!
6. Проверяйте программы перед тем, как выложить их на форум!!

 
 Ответить  Открыть новую тему 
> Обработка символьных строк
сообщение
Сообщение #1


Бум!


Группа: Пользователи
Сообщений: 4
Пол: Женский
Реальное имя: Даша

Репутация: -  0  +


Дана последовательность символов, содержащая от 1 до 30 слов, к каждом из которых от 1 до 10 латинских букв; между соседними словами - запятая, за последним словом тоска. Напечатать текст, составленный из последних литер всех слов, не совпадающих с буквами первого слова. blink.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Народ, ну помогите девочке, у которой
Цитата(polosatik @ 3.06.2010 22:44) *
за последним словом - тоска..
lol.gif
Если я сейчас полезу вспоминать ассемблер, на котором не кодил лет 10 уже - вот это точно будет ТОСКА!! smile.gif


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Гость






Как-то вот так (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


(особо оптимизировать не стал, так хорошо виден алгоритм)
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Бум!


Группа: Пользователи
Сообщений: 4
Пол: Женский
Реальное имя: Даша

Репутация: -  0  +


Уху!!! Очень спасибо!!! rolleyes.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 




- Текстовая версия 20.02.2018 9:02
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"