Найти слова, в которых заданный символ встречается наибольшее количество раз - Assembler

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

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

Доброе время суток еще раз Нужна помощь в написании программы на Асемблере. Буду благодарен за помощь. Задано символ и текст, слова в котором разделены пробелами и знаками препинания. Разработать программу, которая находит и выводит все слова содержащие заданный символ наибольшее количество раз.

Решение задачи: «Найти слова, в которых заданный символ встречается наибольшее количество раз»

textual
Листинг программы
  1. LOCALS
  2.  
  3. .model small
  4.  
  5. .stack 1000h
  6.  
  7. .data
  8.         ;строка для исследования
  9.         String                  db      'Mateusz Viste writes: DWOL is '
  10.                                 db      'a tiny tool that computes and '
  11.                                 db      'sends "Wake-on-LAN" packets. '
  12.                                 db      'Wake-on-LAN (WOL) is an Ethernet '
  13.                                 db      'standard that allows a computer to '
  14.                                 db      'be turned on by a network message.', '$'
  15.         Len                     dw      $-String
  16.         ;искомый символ
  17.         Char                    db      'e'
  18.  
  19.         ;символы разделители слов
  20.         DelimChars              db      '.,!?;:"() ', "'"
  21.         LenDelimChars           dw      $-DelimChars
  22.         ;переменные
  23.         CrLf                    db      0Dh, 0Ah, '$'   ;перевод троки
  24.         MaxChars                dw      ?               ;максимальное количество искомых символов в слове
  25.         CountWords              dw      ?       ;общее количество слов
  26. .code
  27.  
  28. main    proc
  29.         mov     ax,     @data
  30.         mov     ds,     ax
  31.  
  32.         lea     si,     String
  33.         mov     cx,     Len
  34.         mov     CountWords,     0
  35.         mov     MaxChars,       1       ;значение не нулевое для того, чтобы
  36.                                         ;при отсутствии символа в строке слова не выводились
  37.         ;пропускаем все разделители
  38. @@WhileDelimiter:
  39.         mov     al,     [si]
  40.         call    IsDelimChar
  41.         cmp     ah,     0
  42.         je      @@NewWord
  43.         inc     si
  44.         loop    @@WhileDelimiter
  45.  
  46.         jcxz    @@Finish        ;если строка закончилась - выйти
  47.         ;найдено новое слово
  48. @@NewWord:
  49.         mov     dx,     0       ;длина очередного слова пока равна 0
  50.         inc     CountWords      ;увеличиваем счётчик слов на 1
  51.         mov     di,     0       ;количество искомых символов в очередном слове
  52.         push    si              ;сохраняем в стеке адрес начала слова
  53.         ;пропускаем все буквы слова до разделителя
  54. @@WhileWord:
  55.         mov     al,     [si]
  56.         call    IsDelimChar
  57.         cmp     ah,     0
  58.         jne     @@Break
  59.         cmp     al,     Char
  60.         jne     @@NextChar
  61.         inc     di
  62. @@NextChar:
  63.         inc     dx              ;увеличиваем длину слова
  64.         inc     si              ;переходим к следующему символу
  65.         loop    @@WhileWord
  66. @@Break:
  67.         push    dx              ;сохраняем в стеке длину слова
  68.         push    di              ;сохраняем в стеке количество искомых символов в слове
  69.         cmp     di,     MaxChars
  70.         jbe     @@Next
  71.         mov     MaxChars,       di
  72. @@Next:
  73.         jcxz    @@Finish
  74.         jmp     @@WhileDelimiter
  75.  
  76. @@Finish:
  77.  
  78.         ;вывод результатов
  79.         ;общее количество слов в строке
  80.  
  81.         mov     cx,     CountWords
  82. @@ShowWords:
  83.         pop     ax
  84.         pop     si
  85.         pop     dx
  86.  
  87.         cmp     ax,     MaxChars
  88.         jne     @@SkipShow
  89.         call    ShowWord
  90. @@SkipShow:
  91.         loop    @@ShowWords
  92.  
  93.  
  94.         mov     ax,     4C00h
  95.         int     21h
  96. main    endp
  97.  
  98. ;Определяет, принадлежит ли символ в al разделителям слов
  99. ;на входе
  100. ; al - символ
  101. ;на выходе
  102. ; ah -  0 (не разделитель), 1 (разделитель)
  103. IsDelimChar     proc
  104.         mov     ah,     0
  105.         pushf
  106.         push    si
  107.         push    di
  108.         push    cx
  109.         push    es
  110.  
  111.         push    ds
  112.         pop     es
  113.         lea     di,     DelimChars
  114.         mov     cx,     LenDelimChars
  115.         cld
  116.         repne   scasb
  117.         jcxz    @@Skip
  118.         jnz     @@Skip
  119.         mov     ah,     1
  120. @@Skip:
  121.         pop     es
  122.         pop     cx
  123.         pop     di
  124.         pop     si
  125.         popf
  126.         ret
  127. IsDelimChar     endp
  128.  
  129. ShowWord        proc
  130.         push    ax
  131.         push    cx
  132.         mov     ah,     40h
  133.         mov     bx,     1
  134.         mov     cx,     si
  135.         mov     dx,     dx
  136.         int     21h
  137.         mov     al,     ' '
  138.         int     29h
  139.         pop     cx
  140.         pop     ax
  141.         ret
  142. ShowWord        endp
  143.  
  144. end     main

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

  1. Создание переменных:
    • String - строка для исследования
    • Len - длина строки
    • Char - искомый символ
    • DelimChars - символы-разделители слов
    • LenDelimChars - длина DelimChars
    • CrLf - перевод строки
    • MaxChars - максимальное количество искомых символов в слове
    • CountWords - общее количество слов
  2. Инициализация сегмента данных и регистров.
  3. Начало цикла, проход по строке:
    • Проверка всех символов строки и определение начала нового слова или его окончания, считывание и сохранение найденных слов и искомых символов.
  4. Поиск длины и количества искомых символов в каждом слове.
  5. Вывод результатов:
    • Вывод всех слов, в которых искомый символ встречается наибольшее количество раз.
    • Завершение программы.

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


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

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

11   голосов , оценка 3.636 из 5

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

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

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