30.09.2011, 20:17
общий
это ответ
Здравствуйте, Дмитрий!
Вот Вам программа, решающая Вашу задачу.
Программа считает словами последовательности из цифр, английских (больших и малых),
кириллицы (больших и малых, и с учетом дополнительных буковок украинского и белорусского алфавита)
Все остальное считается разделителями.
Будут вопросы - милости просим в мини-форум.
[code h=207] .model small
.stack 100h
.data
sEnter db 'Enter string: $'
sWCnt db 0ah,'Words count = '
sNum db 8 dup (0) ;сюда запишем число слов
sPress db 0ah,'Press any key$'
buf label byte ; буфер для приема строки с клавиатуры (по ф-и 0ah)
max db 128 ; максимальная длина строки
len db 0 ; реальная длина введенной строки
string db 128 dup (?) ; сама строка
.code
main proc
mov ax, @DATA ;настроим сегментные регистры
mov ds, ax ;на сегмент данных
mov es, ax
lea dx, sEnter
mov ah, 9
int 21h ; приглашение ввести строку
lea dx, buf
mov ah, 0ah
int 21h ; вводим строку
xor bx, bx ; bh - флаг наличия слова, bl - число слов
lea si, string ; сама строка
main_loop: ; основной цикл
lodsb ; очередной символ
cmp al, 0dh ; конец строки ?
je print_result ; на конец обработки
cmp al, '0' ; цифры ?
jb separ_found ; меньше - разделитель
cmp al, '9'
jbe word_found ; часть слова
cmp al, 'A' ; большие латинские ?
jb separ_found ; меньше - разделитель
cmp al, 'Z'
jbe word_found ; часть слова
cmp al, 'a' ; малые латинские ?
jb separ_found ; меньше - разделитель
cmp al, 'z'
jbe word_found ; часть слова
cmp al, 80h ; кириллица А-п
jb separ_found ; меньше - разделитель
cmp al, 0afh
jbe word_found ; часть слова
cmp al, 0e0h ; кириллица р-я,Ё,ё,украинские,белорусские буковки
jb separ_found ; меньше - разделитель
cmp al, 0f7h
jbe word_found ; часть слова
separ_found: ; найден разделитель
cmp bh, 0 ; было ли перед этим слово
je main_loop ; повтор разделителей
mov bh, 0 ; сбросим флаг слова
inc bl ; увеличим счетчик слов
jmp main_loop ; на основной цикл
word_found: ; слово
mov bh, 1 ; установим флаг
jmp main_loop ; на чтение очередного символа
print_result: ; встретили конец строки
add bl, bh ; посчитаем самое последнее слово (если оно есть)
;преобразуем число слов в строку
mov al, bl ; число слов
lea di, sNum ; адрес строки
call itoa ; преобразуем
lea dx, sWCnt
mov ah, 9
int 21h ; выведем число слов
lea dx, sPress
mov ah, 9
int 21h
mov ah, 0
int 16h ; чтобы сразу не убегало с экрана
mov ax, 4c00h
int 21h
main endp
itoa proc ; преобразование числа из al в строку
xor cx, cx ; счетчик цифр
mov bl, 10 ; будем делить на 10
div_loop:
mov ah, 0 ; сбросим предыдущий остаток
div bl ; делим ax/bl
push ax ; сохраним остаток ah в стеке
inc cx ; посчитаем
cmp al, 0 ; делим, пока al не 0
jnz div_loop
pr_loop: ; цикл вывода
pop ax ; восстановим из стека очередную цифру
mov al, ah ; в al
or al, '0' ; сделаем из числа символ
stosb ; запишем по адресу [di++]
loop pr_loop
mov ax, 0a0dh ; перевод строки
stosw
mov al, '$' ; для 9 функции
stosb
ret
itoa endp
end main
[/code]
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен