Определить сколько слов содержат хотя бы одну букву "В" - Assembler
Формулировка задачи:
Ввести строку символов. Группы символов в ней, разделенные пробелом, считаются словами. Определить сколько слов содержат хотя бы одну букву "В"? Исходную строку и количество слов с буквой "В" вывести на экран.
Решение задачи: «Определить сколько слов содержат хотя бы одну букву "В"»
textual
Листинг программы
- LOCALS
- .model small
- .stack 100h
- .data
- DelimChar db ' ' ;символ, разделитель слов
- String db 'THE IONIZATION PROBE IS NOT PROTECTED AGAINST ELECTRIC SHOCK HAZARD', '$'
- Len dw $-String-1
- CrLf db 0Dh, 0Ah, '$'
- Char db 'B' ;искомый символ
- msgSourceString db 'Исходная строка: ', 0Dh, 0Ah, '$'
- msgFoundedWords db 'Слов, содержащих искомый символ: ', '$'
- CountWords dw ? ;количество слов, длиной содержащих хотя бы один раз искомый символ
- .code
- main proc
- mov ax, @data
- mov ds, ax
- mov ah, 09h
- lea dx, msgSourceString
- int 21h
- mov ah, 09h
- lea dx, String
- int 21h
- mov ah, 09h
- lea dx, CrLf
- int 21h
- lea si, String
- mov cx, Len
- mov CountWords, 0
- ;пропускаем все разделители
- @@WhileDelimiter:
- mov al, [si]
- cmp al, DelimChar
- jne @@NewWord
- inc si
- loop @@WhileDelimiter
- jcxz @@Finish ;если строка закончилась - выйти
- ;найдено новое слово
- @@NewWord:
- mov dx, 0 ;количество искомых символов в очередном слове пока равно 0
- ;пропускаем все буквы слова до разделителя
- @@WhileWord:
- mov al, [si]
- cmp al, DelimChar
- je @@Break
- cmp al, Char
- jne @@Skip
- inc dx ;выставляем признак присутствия искомой буквы в слове
- @@Skip:
- inc si ;переходим к следующему символу
- loop @@WhileWord
- @@Break:
- cmp dx, 0 ;в слове присутствовала искомая буква?
- je @@SkipIncrement
- inc CountWords ;увеличиваем счётчик слов на 1
- @@SkipIncrement:
- jcxz @@Finish
- jmp @@WhileDelimiter
- @@Finish:
- ;вывод результатов
- ;общее количество слов в строке
- mov ah, 09h
- lea dx, msgFoundedWords
- int 21h
- mov ax, CountWords
- call OutInt
- mov ah, 09h
- lea dx, CrLf
- int 21h
- ;завершение программы
- mov ax, 4C00h
- int 21h
- main endp
- ;вывод числа в диапазоне 0...99 на экран
- ;на входе
- ; ax - выводимое число
- OutInt proc
- push ax
- push dx
- aam
- add ax, '00'
- mov dl, ah
- mov dh, al
- mov ah, 02
- int 21h
- mov dl, dh
- int 21h
- pop dx
- pop ax
- ret
- OutInt endp
- end main
Объяснение кода листинга программы
- Объявление и инициализация переменных
DelimChar
(символ, разделитель слов) - значение: пробел' '
String
(строка для обработки) - значение: текстLen
(длина строки) - значение: длина указанной строкиCrLf
(переменная для перехода на новую строку) - значение:0Dh, 0Ah, '$'
Char
(искомый символ) - значение:'B'
msgSourceString
(сообщениеИсходная строка
) - значение:'Исходная строка: ', 0Dh, 0Ah, '$'
msgFoundedWords
(сообщениеСлов, содержащих искомый символ
) - значение:'Слов, содержащих искомый символ: ', '$'
CountWords
(количество слов, содержащих искомый символ) - значение: не инициализировано
- Основная логика программы
- Вывод исходной строки на экран
- Подсчёт слов, содержащих по крайней мере один раз искомый символ
- Вывод количества найденных слов на экран
- Завершение программы
- Завершение программы
- Процедура
OutInt
для вывода числа в диапазоне 0...99 на экран- Вывод числа на экран Программа принимает строку, ищет слова, содержащие искомый символ и выводит количество найденных слов.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д