Преобразовать строку так, чтобы после каждой точки был пробел, и следующая встречающаяся буква была прописная. - Assembler
Формулировка задачи:
Задана строка минимум 30 любых отображаемых символов, содержащая несколько точек. Преобразовать строку так, чтобы после каждой точки был пробел, и следующая встречающаяся буква была прописная.
Элементы строки должны вводиться с клавиатуры. Результат работы – преобразованную строку символов - необходимо вывести на экран. Обмен информацией с пользователем организовать в виде специальных сообщений, каждое из которых следует размещать в отдельной строке экрана.
Решение задачи: «Преобразовать строку так, чтобы после каждой точки был пробел, и следующая встречающаяся буква была прописная.»
textual
Листинг программы
- LOCALS
- .model small
- .stack 100h
- .data
- msgInStr db 'Введите строку, длиной не менее 30 отображаемых символов:', 0Dh, 0Ah, '$'
- msgResStr db 'Строка после обработки:', 0Dh, 0Ah, '$'
- msgShortStr db 'Длина строки должна быть не менее 30 отображаемых символов.', 0Dh, 0Ah, '$'
- CrLf db 0Dh, 0Ah, '$'
- kbdBuf db 80
- StrLen db 0
- String db 81 dup(?)
- .code
- main proc
- mov ax, @data
- mov ds, ax
- ;ввод строки
- @@GetString:
- mov ah, 09h
- lea dx, msgInStr
- int 21h
- mov ah, 0Ah
- lea dx, kbdBuf
- int 21h
- mov ah, 09h
- lea dx, CrLf
- int 21h
- cmp StrLen, 30
- jae @@ProcessString
- mov ah, 09h
- lea dx, msgShortStr
- int 21h
- jmp @@GetString
- @@ProcessString:
- ;обработка строки
- push es
- push ds ;настроить регистр сегмента es для строковых операторов
- pop es
- lea si, String ;ds:si - адрес строки
- lea di, StrLen ;ds:di - адрес байта длины строки
- mov cx, 0 ;cx - длина строки
- mov cl, StrLen
- mov ah, 0 ;признак необходимости преобразования символа к прописному
- @@For:
- lodsb
- cmp al, '.'
- jne @@IsUpCaseRequired
- ;если встретилась точка:
- ; - установить признак, что следующий символ должен быть прописным
- ; - проверить, не последний ли это символ в строке.
- ; - проверить наличие пробела после точки
- ; - если пробела нет - вставить
- mov ah, 1 ;следующий символ необходимо слелать прописным
- cmp cx, 1 ;это последний символ в строке?
- je @@Next
- cmp [si], byte ptr ' ' ;следующий символ - пробел?
- je @@Next
- ;вставка пробела
- ;перемещение строки вправо на 1 символ
- push ax
- push cx
- push si
- push di
- pushf
- add si, cx
- sub si, 2
- mov di, si
- add di, 1
- sub cx, 1
- std
- rep movsb
- popf
- pop di
- pop si
- pop cx
- pop ax
- ;после точки вставить пробел
- mov [si], byte ptr ' '
- ;увеличение длины
- inc byte ptr[di]
- add si, 1 ;пропустить пробел при рассмотрении следующего символв
- jmp @@Next
- @@IsUpCaseRequired:
- test ah, 1 ;если требуется сделать символ прописным
- jz @@Next
- mov ah, 0
- call UpCaseChar
- mov [si-1], al
- @@Next:
- loop @@For
- mov [si], byte ptr '$'
- pop es
- ;вывод результата
- mov ah, 09h
- lea dx, msgResStr
- int 21h
- mov ah, 09h
- lea dx, String
- int 21h
- mov ax, 4C00h
- int 21h
- main endp
- UpCaseChar proc
- cmp al, 'a'
- jb @@Exit
- cmp al, 'z'
- ja @@Exit
- add al, 'A'-'a'
- @@Exit:
- ret
- UpCaseChar endp
- end main
Объяснение кода листинга программы
- Объявляются переменные:
a.
msgInStr
- строка для вывода пользователю с просьбой ввести строку b.msgResStr
- строка для вывода обработанной строки c.msgShortStr
- строка для вывода предупреждения о короткой длине строки d.CrLf
- переменная для перехода на новую строку e.kbdBuf
- буфер для ввода строки f.StrLen
- переменная для хранения длины строки g.String
- массив символов для хранения введенной строки - Процедура
main
начинается: a. Инициализируется сегмент данных и регистр данных b. Ввод строки с проверкой её длины c. Если длина строки менее 30 символов, выводится предупреждение d. Иначе начинается обработка строки - В процедуре обработки строки:
a. Происходит установка сегмента данных и регистра в ES для строковых операций
b. Последовательно для каждого символа проверяется:
i. Если символ - точка, то:
- Флаг устанавливается на необходимость преобразования следующего символа в верхний регистр
- Проверяется, не последний ли это символ в строке
- Проверяется наличие пробела после точки, и если его нет, вставляется
- Длина строки увеличивается ii. Если символ не точка, проверяется, нужно ли его преобразовать в верхний регистр, и если нужно, происходит преобразование
- Выводится обработанная строка
- Процедура
main
завершается - Процедура
UpCaseChar
просто преобразует символ в верхний регистр, если он это уже не так - Программа завершается вызовом функции завершения программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д