W i n d o w s - приложение на M A S M - е - Assembler

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

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

Здравствуйте! Задача следующая: нужно ввести натуральное число n в текст. поле, и ввести последовательность натур. чисел a(1), .., a(n) во второе. После нажатия на кнопку нужно вывести в третье текстовое поле

количество

нечетных членов последовательности. Есть следующий метод:
.data
entr    db  'Enter array size:',0
tptd    db  '%d',0
enum    db  'Enter A[%d]:',0
res db  'Odd elements : %d',0
cnt dd  0
.data?
_len    dd  ?
buf dd  ?
.code    
start:  
        invoke  crt_printf, ADDR entr
    invoke  crt_scanf, ADDR tptd, ADDR _len
    mov edi, eax
    mov ecx, [_len]
    mov ebx, 1
 
@@: push    ecx
    push    ebx
        invoke  crt_printf, ADDR enum, ebx
    invoke  crt_scanf, ADDR tptd, ADDR buf
    pop ebx
    pop ecx
    inc ebx
    mov eax, [buf]
    bt  eax,0
    adc [cnt],0
    loop    @B
        invoke  crt_printf, ADDR res, [cnt]
    invoke  crt_exit, 0
    end start
и его нужно вставить в указанное место в главном коде:
   .386
    .model flat,stdcall
    option casemap:none
    include \masm32\include\windows.inc
    include \masm32\include\user32.inc
    include \masm32\include\kernel32.inc
    includelib \masm32\lib\user32.lib
    includelib \masm32\lib\kernel32.lib
 
    WinMain proto :DWORD,:DWORD,:DWORD,:DWORD
 
    .data
      ClassName         db "SimpleWinClass",0
      AppName           db "Программа",0
 
      CommandLine       dd 0
      hInstance         dd 0
      
      ButtonClassName   db "button",0
      ButtonText        db "Показать",0
      hwndButton        dd 0
 
      LabelClassName    db "static",0
      LabelText1        db "  Введите натур. число n ",0 
      LabelText2        db "  Введите последов. натур. чисел ",0
      LabelText3        db "  Нечетные члены ",0
      hwndLabel1        dd 0
      hwndLabel2        dd 0 
      hwndLabel3        dd 0 

      EditClassName     db "edit",0
      hwndEdit1         dd 0
      hwndEdit2         dd 0
       hwndEdit3         dd 0
 
      bytesWritten      DD 0
      buffer                db 512 dup(?)

      buffer1           db 512 dup(?)
      buffer2           db 512 dup(?)
      bytesWritten1      DD 0
      bytesWritten2      DD 0
 
    .const
        ButtonID  equ 1
        EditID1   equ 2
        EditID2   equ 3
        LabelID1  equ 4
        LabelID2  equ 5
        
        EditID3   equ 6 
        LabelID3  equ 7

    .code
start:
    invoke GetModuleHandle, NULL
    mov    hInstance,eax
    invoke GetCommandLine
    invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT
    invoke ExitProcess,eax
 
WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
    
      LOCAL wc:WNDCLASSEX
    LOCAL msg:MSG
    LOCAL hwnd:HWND
 
    mov   wc.cbSize,SIZEOF WNDCLASSEX
    mov   wc.style, CS_HREDRAW or CS_VREDRAW
    mov   wc.lpfnWndProc, OFFSET WndProc
    mov   wc.cbClsExtra,NULL
    mov   wc.cbWndExtra,NULL
    push  hInst
    pop   wc.hInstance
    mov   wc.hbrBackground,COLOR_WINDOW-2

      mov   wc.lpszMenuName,NULL

    mov   wc.lpszClassName,OFFSET ClassName
    invoke LoadIcon,NULL,IDI_APPLICATION
    mov   wc.hIcon,eax
    mov   wc.hIconSm,eax
    invoke LoadCursor,NULL,IDC_ARROW
    mov   wc.hCursor,eax
    invoke RegisterClassEx, addr wc
 
    INVOKE CreateWindowEx,WS_EX_CLIENTEDGE,ADDR ClassName,
                            ADDR AppName,WS_OVERLAPPEDWINDOW,
                            CW_USEDEFAULT,CW_USEDEFAULT,
                            CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,\
                            hInst,NULL
    mov   hwnd,eax
    INVOKE ShowWindow, hwnd,SW_SHOWNORMAL
    INVOKE UpdateWindow, hwnd
 
    StartLoop:
        invoke GetMessage, ADDR msg, NULL, 0,0
        cmp eax, 0
        je ExitLoop
        invoke TranslateMessage, ADDR msg
        invoke DispatchMessage, ADDR msg
        jmp StartLoop
    ExitLoop:
        mov eax, msg.wParam
        ret
 
WinMain endp
 
WndProc proc hWin:HWND, 
             uMsg:UINT,
             wParam:WPARAM,
             lParam:LPARAM

    cmp uMsg, WM_CREATE
    jne next_1
    invoke CreateWindowEx,WS_EX_CLIENTEDGE, ADDR LabelClassName,NULL,\
                          WS_CHILD or WS_VISIBLE or WS_BORDER or ES_LEFT or\
                          ES_AUTOHSCROLL,\
                          20,35,260,25,hWin,LabelID1,hInstance,NULL
    mov  hwndLabel1,EAX
 
    invoke CreateWindowEx,WS_EX_CLIENTEDGE, ADDR LabelClassName,NULL,\
                          WS_CHILD or WS_VISIBLE or WS_BORDER or ES_LEFT or\
                          ES_AUTOHSCROLL,\
                          20,65,260,25,hWin,LabelID2,hInstance,NULL
    mov  hwndLabel2,EAX
 
    invoke CreateWindowEx,WS_EX_CLIENTEDGE, ADDR LabelClassName,NULL,\
                          WS_CHILD or WS_VISIBLE or WS_BORDER or ES_LEFT or\
                          ES_AUTOHSCROLL,\
                          20,125,260,25,hWin,LabelID3,hInstance,NULL
    mov  hwndLabel3,EAX
 
    invoke CreateWindowEx,WS_EX_CLIENTEDGE, ADDR EditClassName,NULL,\
                          WS_CHILD or WS_VISIBLE or WS_BORDER or ES_LEFT or\
                          ES_AUTOHSCROLL,\
                          290,35,200,25,hWin,EditID1,hInstance,NULL
    mov  hwndEdit1,eax
    
    invoke CreateWindowEx,WS_EX_CLIENTEDGE, ADDR EditClassName,NULL,\
                         WS_CHILD or WS_VISIBLE or WS_BORDER or ES_LEFT or\
                         ES_AUTOHSCROLL,\
                         290,65,200,25,hWin,EditID2,hInstance,NULL
    mov  hwndEdit2,eax
 
    invoke CreateWindowEx,WS_EX_CLIENTEDGE, ADDR EditClassName,NULL,\
                         WS_CHILD or WS_VISIBLE or WS_BORDER or ES_LEFT or\
                         ES_AUTOHSCROLL,\
                         310,125,50,25,hWin,EditID3,hInstance,NULL
    mov  hwndEdit3,eax
     
    invoke CreateWindowEx,NULL, ADDR ButtonClassName,ADDR ButtonText,\
                          WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON,\
                          140,95,130,25,hWin,ButtonID,hInstance,NULL
    mov  hwndButton,eax
    
    invoke SetFocus, hwndEdit1
    invoke SetWindowText,hwndLabel1,ADDR LabelText1 
    invoke SetWindowText,hwndLabel2,ADDR LabelText2
    invoke SetWindowText,hwndLabel3,ADDR LabelText3
 
    ret 
 
next_1:
   cmp uMsg, WM_COMMAND
   jne next_2
   mov EAX,wParam
   cmp lParam, 0
   je  ex_wmcom
   cmp AX, ButtonID 
   jne ex_wmcom
   shr EAX, 16
   cmp AX, BN_CLICKED
   jne ex_wmcom
   invoke GetWindowText,hwndEdit1,ADDR buffer1,512  
   mov bytesWritten1, EAX    
 
      invoke GetWindowText,hwndEdit2,ADDR buffer2,512
      mov bytesWritten2, EBX
 
   call ReplaceSpace
   invoke SetWindowText,hwndEdit3,ADDR buffer1 
ex_wmcom:
   ret  
next_2:
   cmp uMsg, WM_DESTROY
   jne next_3
   push NULL
   call PostQuitMessage
   xor eax, eax                   
   ret                           
next_3:
   push lParam
   push wParam
   push uMsg
   push hWin
   call DefWindowProc
   ret
 
WndProc endp
;________________________Beginning_of_MyProc____________________
MyProc proc
                  ;______________Realisation_of_procedure_____
MyProc endp
;___________________________________The_end_of_the_MyProc_____
end start

Решение задачи: «W i n d o w s - приложение на M A S M - е»

textual
Листинг программы
String str1 = jTextField1.getText();//получаем содержимое текстового поля
        int count = 0;
        int[] myArray = new int[str1.length()];
        
        for (int i = 0; i < str1.length(); i++) {
            if(str1.charAt(i) != ' ')
            {
                myArray[i]=Integer.parseInt(String.valueOf(str1.charAt(i)));
                //получаем символ из строки по его номеру
                //и записываем его как элемент массива
                if (myArray[i] % 2 != 0)
                {
                    count++;
                }
            }
            else {continue;}
        }
jTextField2.setText("k = " + count);

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

  1. Получаем содержимое текстового поля (str1).
  2. Инициализируем массив myArray, создавая его на основе длины строки str1.
  3. Проходим по каждому символу строки str1, начиная с 0 и до последнего символа.
  4. Проверяем, является ли текущий символ пробелом. Если нет, то переводим его в числовой формат и записываем в массив myArray.
  5. Проверяем, является ли число, полученное из символа, четным или нет.
  6. Если число нечетное, увеличиваем счетчик count на 1.
  7. После прохода по всем символам строки str1, выводим значение счетчика count в текстовое поле jTextField2.

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

7   голосов , оценка 3.429 из 5