Определить наиболее длинную последовательность одинаковых символов, входящих в строку - Assembler

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

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

Дана строка. Определить наиболее длинную последовательность одинаковых символов, входящих в нее.

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

textual
Листинг программы
.486
.model flat, stdcall
option casemap :none
 
        include d:\masm32\include\windows.inc
 
        include d:\masm32\include\user32.inc
        include d:\masm32\include\kernel32.inc
        include d:\masm32\include\masm32.inc
 
        includelib d:\masm32\lib\user32.lib
        includelib d:\masm32\lib\kernel32.lib
        includelib d:\masm32\lib\masm32.lib
.data
        aszPressLeftAlt db      0Dh, 0Ah, 0Dh, 0Ah, "Press Left Alt to exit", 0
        aszMsgResult    db      'Result: ', 0
 
        aszForProcess   db      '//////tyvnbvghhhknxz@@@@@@@76767676****', 0
 
        Result          dd      ?
 
        hConsoleOutput  HANDLE  ?
        hConsoleInput   HANDLE  ?
        Buffer          db      1024 dup(?)
        BufLen          dd      ?
 
.code
start:
 
        ; получение описателей ввода и вывода консоли
        invoke  GetStdHandle,   STD_INPUT_HANDLE
        mov     hConsoleInput,  eax
        invoke  GetStdHandle,   STD_OUTPUT_HANDLE
        mov     hConsoleOutput, eax
        ;очистка экрана
        invoke  ClearScreen
 
 
        lea     esi,    [aszForProcess]
        mov     ecx,    0               ;длина текущей последовательности
        mov     ebx,    0               ;длина максимальной последовательности
        mov     al,     [esi]           ;
        not     al
 
        jmp     @@WhileCondition
        @@While:
 
        @@TestSequence:
                cmp     al,     ah
                jne     @@NewSequence
                inc     ecx
                jmp     @@TestMaxLen
        @@NewSequence:
                mov     ecx,    1
 
        @@TestMaxLen:
                cmp     ecx,    ebx             ;ebx=max(ebx, ecx)
                jbe     @@WhileCondition
                mov     ebx,    ecx
        @@WhileCondition:
                mov     ah,     al
                lodsb
                or      al,     al
        jnz     @@While
 
        mov     [Result],       ebx
 
 
        ;вывод результата
        invoke  WriteConsole, hConsoleOutput, ADDR aszMsgResult,\
                LENGTHOF aszMsgResult - 1, ADDR BufLen, NULL
        invoke  ltoa, [Result], ADDR Buffer
        invoke  StrLen, ADDR Buffer
        mov     [BufLen],       eax
        invoke  WriteConsole, hConsoleOutput, ADDR Buffer,\
                BufLen, ADDR BufLen, NULL
 
        ;ожидание нажатия Left Alt
        invoke  WriteConsole, hConsoleOutput, ADDR aszPressLeftAlt,\
                LENGTHOF aszPressLeftAlt - 1, ADDR BufLen, NULL
        @@WaitForLAlt:
                invoke  GetAsyncKeyState, VK_LMENU
                and     eax,    8000h
        jz      @@WaitForLAlt
 
        invoke  ExitProcess, 0
 
end     start

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

  1. Определение наиболее длинной последовательности одинаковых символов, входящих в строку Код выполняет данную задачу путем поиска наибольшей возможной последовательности одинаковых символов в строке aszForProcess. Для этого используется цикл, который сравнивает текущий символ с предыдущим и, если они совпадают, увеличивает счетчик длины последовательности. Когда находится новый символ, счетчик сбрасывается, и цикл продолжается. В конце выводится результат.
  2. Остальные действия кода
    • Код получает дескрипторы стандартного ввода и вывода консоли с помощью функции GetStdHandle.
    • Затем он очищает экран с помощью функции ClearScreen.
    • Далее он ожидает, пока пользователь не нажмет клавишу Left Alt, и выводит результат.
    • В конце код вызывает функцию ExitProcess для завершения работы программы.

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


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

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

15   голосов , оценка 3.8 из 5
Похожие ответы