Лабораторная работа: Программирование и основы алгоритмизации 2
Название: Программирование и основы алгоритмизации 2 Раздел: Рефераты по информатике Тип: лабораторная работа |
Министерство образования Российской Федерации ЮЖНО-УРАЛЬСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ Кафедра Автоматики и управления Пояснительная записка к курсовому проекту По дисциплине: Программирование и основы алгоритмизации Вариант № 1 Проверил: доцент кафедры Вставская Е.В. “____”_____________2007г Выполнил: студент группы ПС-164 Лысенко Д.Г. “____”_____________2007г Челябинск 2007 г. Содержание:5. Вывод результата работы.. 14 6. Проверка правильности программы............................................ 14 Даны целые числа
a
,
b
и
n
. Вычислить 1. Метод решенияПодключаем файл windowA.inc, в котором будут содержаться базовые структуры и константы Win32. Затем в процедуре start первоначально вызываем функции Win32 API, после чего происходит регистрация окна (определения класса окна и регистрация его в системе). Затем создаем и отображаем, собственно, само окно. Потом запускается цикл обработки сообщения, которые будут посылаться ОС программе и обрабатываться в отдельной процедуре WindowProc и затем собственно выход из программы. В процедуре обработке сообщений, если нажата клавиша «Вычислить», то считывается значение из поля редактирования, преобразовывается в числовой формат, производятся нужные вычисления и выводится на экран STYLBTNequ 40000000h + 10000000h ;WSCHILD+WS_VISIBLE STYLEDT equ 40000000h + 10000000h + 800000h + 10000h ;Пример каркасного приложения для Win32 .486 locals .model flat,STDCALL include windowA.inc includelib imp32i.lib extrn GetModuleHandleA:PROC ;дескриптор класса окна extrn LoadIconA:PROC ;дескриптор пиктограммы extrn LoadCursorA:PROC ;дескриптор курсора extrn GetStockObject:PROC ;дескриптор кисти extrn RegisterClassExA:PROC ;регистрация класса окна extrn CreateWindowExA:PROC ;создание экземпляра окна extrn ShowWindow:PROC ;отображение окна extrn UpdateWindow:PROC ;перерисовка окна extrn GetMessageA:PROC ;получение сообщения extrn TranslateMessage:PROC ;обнаружение сообщения extrnDispatchMessageA:PROC ;передача сообщения ;оконной функции extrnExitProcess:PROC ;завершение процедуры extrnBeginPaint:PROC ;начало перерисовки extrnEndPaint:PROC ;конец перерисовки extrnTextOutA:PROC ;вывод текста extrn PostQuitMessage:PROC extrn DefWindowProcA:PROC ;обработчик по умолчанию extrn MessageBoxA:PROC extrn SendMessageA:PROC extrn GetDC:PROC extrn ReleaseDC:PROC ;оконной функции public WindowProc .data hwnd dd 0 ; дескриптор экземпляра окна hInst dd 0 ; дескриптор класса окна hdc dd 0 ; hedt1 dd 0 ;дескриптор поля редактирования hbtndd 0 ;дескриптор кнопки hh1 dd 0 hh2 dd 0 hh3 dd 0 hh4 dd 0 hbtn1 dd 0 hbtn2 dd 0 CPBUT db '&Посчитать',0 CPBUT2 db 'В&ыход',0 CLSBTN db 'BUTTON',0 CPEDT db '',0 CLSEDT db 'EDIT',0 TEXT db ' ' TEXTA db ' ' TEXTB db 'результат: ' TEXTLEN = $-TEXT ten dw 10 temp dw 0 a dd ? bdd ? ndd ? wclWNDCLASSEX <?> ;структура для регистрации класса ; окна messageMSG <?> ;структура для регистрации сообщений szClassNamedb 'Приложение Win32',0 szTitleNamedb 'Курсач Лысенко Д. ПС-164',0 MesWindow db 'Введите a,b и n,' MesWindowLen = $-MesWindow ps PAINTSTRUCT <?> .code start proc near ;Получение дескриптора класса окна push 0; call GetModuleHandleA mov hInst,eax WinMain: ;для начала инициализируем поля структуры WndClassEx mov wcl.cbSize,type WNDCLASSEX mov wcl.style, CS_HREDRAW+CS_VREDRAW ;полная перерисовка mov wcl.lpfnWndProc,offset WindowProc mov wcl.cbClsExtra,0 mov wcl.cbWndExtra,0 mov eax,hInst mov wcl.hInstance,eax push IDI_APPLICATION ;стандартное приложение 32512 push 0 call LoadIconA mov wcl.hIcon,eax pushIDC_ARROW ;стандартный курсор стрелка 32512 push 0 call LoadCursorA mov wcl.hCursor,eax ;определим цвет фона окна pushLTGRAY_BRUSH ;1 call GetStockObject mov eax,5 mov wcl.hbrBackground,eax mov dword ptr wcl.lpszMenuName,0 ;без главного меню mov dword ptr wcl.lpszClassName,offset szClassName ;имя класса окна mov wcl.hIconSm,0 ;регистрируем класс окна pushoffsetwcl call RegisterClassExA ;создаем окно: push 0 ;lpParam push hInst ;hInstance push 0 ;menu push 0 ;parent hwnd push 200 ;высота окна push 300 ;ширина окна push 300 ;координата y л.в. угла окна push 300 ;координата x л.в. угла pushWS_OVERLAPPEDWINDOW ;стиль окна pushoffsetszTitleName ;Строка заголовка окна pushoffsetszClassName ;имя класса окна push 0 ;дополнительные стили callCreateWindowExA movhwnd,eax ;hwnd - дескриптор окна ;показать окно: push SW_SHOWNORMAL ;1 push hwnd call ShowWindow ;перерисовываем содержимое окна push hwnd call UpdateWindow ;запускаем цикл сообщений: cycl_msg: push 0 push 0 push NULL push offset message call GetMessageA cmp ax,0 jeend_cycl_msg ;трансляция ввода с клавиатуры push offset message call TranslateMessage ;передача сообщения оконной функции push offset message call DispatchMessageA jmp cycl_msg end_cycl_msg: ;выход из приложения push NULL call ExitProcess start endp ;Оконная функция WindowProc для обработки сообщений WindowProc proc arg @@hwnd:DWORD, @@mes:DWORD, @@wparam:DWORD, @@lparam:DWORD usesebx,edi, esi ; регистры должны сохраняться local @@hdc:DWORD cmp @@mes,WM_DESTROY jewmdestroy cmp @@mes,WM_CREATE jewmcreate cmp @@mes,WM_PAINT je wmpaint cmp @@mes, WM_COMMAND je wmcommand jmp default wmcreate: ;создание окна mov eax,0 ;;;;поле1 push 0 push hInst push 0 push @@hwnd push 20 push 35 push 50 push 10 push STYLEDT push offset CPEDT push offset CLSEDT push 0 call CreateWindowExA mov hh1,eax mov eax,0 ;;; поле2 push 0 push hInst push 0 push @@hwnd push 20 push 35 push 50 push 50 push STYLEDT push offset CPEDT push offset CLSEDT push 0 call CreateWindowExA mov hh2,eax mov eax,0 ;;;;;;3 push 0 push hInst push 0 push @@hwnd push 20 push 35 push 50 push 90 push STYLEDT push offset CPEDT push offset CLSEDT push 0 call CreateWindowExA mov hh3,eax mov eax,0 ;;;;; push 0 push hInst push 0 push @@hwnd push 20 push 80 push 80 push 10 push STYLBTN ;STYLBTN push offset CPBUT push offset CLSBTN push 0 call CreateWindowExA mov hbtn,eax mov eax,0 push 0 push hInst push 0 push @@hwnd push 20 push 80 push 80 push 100 push STYLBTN ;STYLBTN push offset CPBUT2 push offset CLSBTN push 0 call CreateWindowExA mov hbtn2,eax moveax,0 ;возвращаемое значение 0 jmpexit_wndproc wmcommand: mov eax, hbtn cmp @@lparam,eax je calc mov eax, hbtn2 cmp @@lparam,eax je res wmnodestroy: mov eax,0 jmp exit_wndproc res: jmp wmdestroy wmpaint: push offset ps push @@hwnd call BeginPaint mov @@hdc,eax push MesWindowLen push offset MesWindow push 20 push 10 push @@hdc callTextOutA ;освободить контекст push offset ps push @@hdc call EndPaint moveax,0 ;возвращаемое значение 0 jmpexit_wndproc wmdestroy: ;послать сообщение WM_QUIT push 0 callPostQuitMessage moveax,0 ;возвращаемое значение 0 jmpexit_wndproc default: ;обработка по умолчанию push @@lparam push @@wparam push @@mes push @@hwnd call DefWindowProcA jmp exit_wndproc calc: ;считываем поле 1 push offset TEXTA push 150 push WM_GETTEXT push hh1 call SendMessageA push offset TEXTA call StringToDig mov a,eax ;поле 2 push offset TEXTA push 150 push WM_GETTEXT push hh2 call SendMessageA push offset TEXTA call StringToDig mov b,eax ;поле 3 push offset TEXTA push 150 push WM_GETTEXT push hh3 call SendMessageA push offset TEXTA call StringToDig mov n,eax mov ecx,n mov eax,1d repeat: imul a loop repeat imul b aam or ax,3030h mov [TEXTB+12],ah mov [TEXTB+13],al push @@hwnd call GetDC mov @@hdc,eax push 18 push offset TEXTB push 120 push 10 push @@hdc call TextOutA exit_wndproc: ret WindowProc endp StringToDig proc near ARG @@TEXT:DWORD mov esi,@@TEXT mov eax,0 mov edx,0 mov dl,[esi] cmp dl,'-' jne N mov temp,1 inc esi mov dl,[esi] N: cmp dl,'0' jl MRET cmp dl,'9' jg MRET and dl,0Fh ; ASCII->BCD add eax,edx mul ten inc esi mov dl,[esi] cmp dl,'0' jl MDIV cmp dl,'9' jg MDIV ; mul ten and dl,0Fh add eax,edx jmp MRET MDIV: div ten MRET: cmp temp,1 jne n1 imul eax,-1 mov temp,0 n1: ret StringToDig endp end start 2. Схема алгоритма3. Проверка правильности программы1) 2) 3) 4) Данные, полученные в результате вычислений, совпадают с теми, что были получены в результате выполнения программы. |