Найти слова, в которых заданный символ встречается наибольшее количество раз - Assembler
Формулировка задачи:
Доброе время суток еще раз
Нужна помощь в написании программы на Асемблере. Буду благодарен за помощь.
Задано символ и текст, слова в котором разделены пробелами и знаками препинания. Разработать программу, которая находит и выводит все слова содержащие заданный символ наибольшее количество раз.
Решение задачи: «Найти слова, в которых заданный символ встречается наибольшее количество раз»
textual
Листинг программы
- LOCALS
- .model small
- .stack 1000h
- .data
- ;строка для исследования
- String db 'Mateusz Viste writes: DWOL is '
- db 'a tiny tool that computes and '
- db 'sends "Wake-on-LAN" packets. '
- db 'Wake-on-LAN (WOL) is an Ethernet '
- db 'standard that allows a computer to '
- db 'be turned on by a network message.', '$'
- Len dw $-String
- ;искомый символ
- Char db 'e'
- ;символы разделители слов
- DelimChars db '.,!?;:"() ', "'"
- LenDelimChars dw $-DelimChars
- ;переменные
- CrLf db 0Dh, 0Ah, '$' ;перевод троки
- MaxChars dw ? ;максимальное количество искомых символов в слове
- CountWords dw ? ;общее количество слов
- .code
- main proc
- mov ax, @data
- mov ds, ax
- lea si, String
- mov cx, Len
- mov CountWords, 0
- mov MaxChars, 1 ;значение не нулевое для того, чтобы
- ;при отсутствии символа в строке слова не выводились
- ;пропускаем все разделители
- @@WhileDelimiter:
- mov al, [si]
- call IsDelimChar
- cmp ah, 0
- je @@NewWord
- inc si
- loop @@WhileDelimiter
- jcxz @@Finish ;если строка закончилась - выйти
- ;найдено новое слово
- @@NewWord:
- mov dx, 0 ;длина очередного слова пока равна 0
- inc CountWords ;увеличиваем счётчик слов на 1
- mov di, 0 ;количество искомых символов в очередном слове
- push si ;сохраняем в стеке адрес начала слова
- ;пропускаем все буквы слова до разделителя
- @@WhileWord:
- mov al, [si]
- call IsDelimChar
- cmp ah, 0
- jne @@Break
- cmp al, Char
- jne @@NextChar
- inc di
- @@NextChar:
- inc dx ;увеличиваем длину слова
- inc si ;переходим к следующему символу
- loop @@WhileWord
- @@Break:
- push dx ;сохраняем в стеке длину слова
- push di ;сохраняем в стеке количество искомых символов в слове
- cmp di, MaxChars
- jbe @@Next
- mov MaxChars, di
- @@Next:
- jcxz @@Finish
- jmp @@WhileDelimiter
- @@Finish:
- ;вывод результатов
- ;общее количество слов в строке
- mov cx, CountWords
- @@ShowWords:
- pop ax
- pop si
- pop dx
- cmp ax, MaxChars
- jne @@SkipShow
- call ShowWord
- @@SkipShow:
- loop @@ShowWords
- mov ax, 4C00h
- int 21h
- main endp
- ;Определяет, принадлежит ли символ в al разделителям слов
- ;на входе
- ; al - символ
- ;на выходе
- ; ah - 0 (не разделитель), 1 (разделитель)
- IsDelimChar proc
- mov ah, 0
- pushf
- push si
- push di
- push cx
- push es
- push ds
- pop es
- lea di, DelimChars
- mov cx, LenDelimChars
- cld
- repne scasb
- jcxz @@Skip
- jnz @@Skip
- mov ah, 1
- @@Skip:
- pop es
- pop cx
- pop di
- pop si
- popf
- ret
- IsDelimChar endp
- ShowWord proc
- push ax
- push cx
- mov ah, 40h
- mov bx, 1
- mov cx, si
- mov dx, dx
- int 21h
- mov al, ' '
- int 29h
- pop cx
- pop ax
- ret
- ShowWord endp
- end main
Объяснение кода листинга программы
- Создание переменных:
String
- строка для исследованияLen
- длина строкиChar
- искомый символDelimChars
- символы-разделители словLenDelimChars
- длинаDelimChars
CrLf
- перевод строкиMaxChars
- максимальное количество искомых символов в словеCountWords
- общее количество слов
- Инициализация сегмента данных и регистров.
- Начало цикла, проход по строке:
- Проверка всех символов строки и определение начала нового слова или его окончания, считывание и сохранение найденных слов и искомых символов.
- Поиск длины и количества искомых символов в каждом слове.
- Вывод результатов:
- Вывод всех слов, в которых искомый символ встречается наибольшее количество раз.
- Завершение программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д