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);
Объяснение кода листинга программы
- Получаем содержимое текстового поля (str1).
- Инициализируем массив myArray, создавая его на основе длины строки str1.
- Проходим по каждому символу строки str1, начиная с 0 и до последнего символа.
- Проверяем, является ли текущий символ пробелом. Если нет, то переводим его в числовой формат и записываем в массив myArray.
- Проверяем, является ли число, полученное из символа, четным или нет.
- Если число нечетное, увеличиваем счетчик count на 1.
- После прохода по всем символам строки str1, выводим значение счетчика count в текстовое поле jTextField2.