Преобразовать строку так, чтобы после каждой точки был пробел, и следующая встречающаяся буква была прописная. - Assembler

Узнай цену своей работы

Формулировка задачи:

Задана строка минимум 30 любых отображаемых символов, содержащая несколько точек. Преобразовать строку так, чтобы после каждой точки был пробел, и следующая встречающаяся буква была прописная. Элементы строки должны вводиться с клавиатуры. Результат работы – преобразованную строку символов - необходимо вывести на экран. Обмен информацией с пользователем организовать в виде специальных сообщений, каждое из которых следует размещать в отдельной строке экрана.

Решение задачи: «Преобразовать строку так, чтобы после каждой точки был пробел, и следующая встречающаяся буква была прописная.»

textual
Листинг программы
  1. LOCALS
  2.  
  3. .model small
  4.  
  5. .stack 100h
  6.  
  7. .data
  8.         msgInStr        db      'Введите строку, длиной не менее 30 отображаемых символов:', 0Dh, 0Ah, '$'
  9.         msgResStr       db      'Строка после обработки:', 0Dh, 0Ah, '$'
  10.         msgShortStr     db      'Длина строки должна быть не менее 30 отображаемых символов.', 0Dh, 0Ah, '$'
  11.         CrLf            db      0Dh, 0Ah, '$'
  12.  
  13.         kbdBuf          db      80
  14.         StrLen          db      0
  15.         String          db      81 dup(?)
  16. .code
  17.  
  18. main    proc
  19.         mov     ax,     @data
  20.         mov     ds,     ax
  21.  
  22.         ;ввод строки
  23. @@GetString:
  24.         mov     ah,     09h
  25.         lea     dx,     msgInStr
  26.         int     21h
  27.         mov     ah,     0Ah
  28.         lea     dx,     kbdBuf
  29.         int     21h
  30.         mov     ah,     09h
  31.         lea     dx,     CrLf
  32.         int     21h
  33.         cmp     StrLen, 30
  34.         jae     @@ProcessString
  35.         mov     ah,     09h
  36.         lea     dx,     msgShortStr
  37.         int     21h
  38.         jmp     @@GetString
  39.  
  40. @@ProcessString:
  41.         ;обработка строки
  42.         push    es
  43.         push    ds              ;настроить регистр сегмента es для строковых операторов
  44.         pop     es
  45.         lea     si,     String  ;ds:si - адрес строки
  46.         lea     di,     StrLen  ;ds:di - адрес байта длины строки
  47.         mov     cx,     0       ;cx - длина строки
  48.         mov     cl,     StrLen
  49.         mov     ah,     0       ;признак необходимости преобразования символа к прописному
  50. @@For:
  51.         lodsb
  52.         cmp     al,     '.'
  53.         jne     @@IsUpCaseRequired
  54.         ;если встретилась точка:
  55.         ; - установить признак, что следующий символ должен быть прописным
  56.         ; - проверить, не последний ли это символ в строке.
  57.         ; - проверить наличие пробела после точки
  58.         ; - если пробела нет - вставить
  59.         mov     ah,     1       ;следующий символ необходимо слелать прописным
  60.         cmp     cx,     1       ;это последний символ в строке?
  61.         je      @@Next
  62.         cmp     [si],   byte ptr ' '    ;следующий символ - пробел?
  63.         je      @@Next
  64.         ;вставка пробела
  65.         ;перемещение строки вправо на 1 символ
  66.         push    ax
  67.         push    cx
  68.         push    si
  69.         push    di
  70.         pushf
  71.  
  72.         add     si,     cx
  73.         sub     si,     2
  74.         mov     di,     si
  75.         add     di,     1
  76.         sub     cx,     1
  77.         std
  78.         rep     movsb
  79.  
  80.         popf
  81.         pop     di
  82.         pop     si
  83.         pop     cx
  84.         pop     ax
  85.         ;после точки вставить пробел
  86.         mov     [si],   byte ptr ' '
  87.         ;увеличение длины
  88.         inc     byte ptr[di]
  89.         add     si,     1       ;пропустить пробел при рассмотрении следующего символв
  90.         jmp     @@Next
  91.  
  92. @@IsUpCaseRequired:
  93.         test    ah,     1       ;если требуется сделать символ прописным
  94.         jz      @@Next
  95.         mov     ah,     0
  96.         call    UpCaseChar
  97.         mov     [si-1], al
  98. @@Next:
  99.         loop    @@For
  100.  
  101.         mov     [si],   byte ptr '$'
  102.         pop     es
  103.  
  104.         ;вывод результата
  105.         mov     ah,     09h
  106.         lea     dx,     msgResStr
  107.         int     21h
  108.         mov     ah,     09h
  109.         lea     dx,     String
  110.         int     21h
  111.  
  112.         mov     ax,     4C00h
  113.         int     21h
  114. main    endp
  115.  
  116. UpCaseChar      proc
  117.         cmp     al,     'a'
  118.         jb      @@Exit
  119.         cmp     al,     'z'
  120.         ja      @@Exit
  121.         add     al,     'A'-'a'
  122. @@Exit:
  123.         ret
  124. UpCaseChar      endp
  125.  
  126. end     main

Объяснение кода листинга программы

  1. Объявляются переменные: a. msgInStr - строка для вывода пользователю с просьбой ввести строку b. msgResStr - строка для вывода обработанной строки c. msgShortStr - строка для вывода предупреждения о короткой длине строки d. CrLf - переменная для перехода на новую строку e. kbdBuf - буфер для ввода строки f. StrLen - переменная для хранения длины строки g. String - массив символов для хранения введенной строки
  2. Процедура main начинается: a. Инициализируется сегмент данных и регистр данных b. Ввод строки с проверкой её длины c. Если длина строки менее 30 символов, выводится предупреждение d. Иначе начинается обработка строки
  3. В процедуре обработки строки: a. Происходит установка сегмента данных и регистра в ES для строковых операций b. Последовательно для каждого символа проверяется: i. Если символ - точка, то:
    • Флаг устанавливается на необходимость преобразования следующего символа в верхний регистр
    • Проверяется, не последний ли это символ в строке
    • Проверяется наличие пробела после точки, и если его нет, вставляется
    • Длина строки увеличивается ii. Если символ не точка, проверяется, нужно ли его преобразовать в верхний регистр, и если нужно, происходит преобразование
  4. Выводится обработанная строка
  5. Процедура main завершается
  6. Процедура UpCaseChar просто преобразует символ в верхний регистр, если он это уже не так
  7. Программа завершается вызовом функции завершения программы.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 4.167 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы