|
Программирование и основы алгоритмизации
Программирование и основы алгоритмизации
23 Министерство образования Российской Федерации ЮЖНО-УРАЛЬСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ Кафедра Автоматики и управления Пояснительная записка к курсовому проекту По дисциплине: Программирование и основы алгоритмизации Вариант № 1 Проверил: доцент кафедры Вставская Е.В. “____”_____________2007г Выполнил: студент группы ПС-164 Лысенко Д.Г. “____”_____________2007г Челябинск 2007 г. Содержание:1. Постановка задачи 3- 2. Метод решения 3
- 3. Текст программы 4
- 4. Схема алгоритма 12
- 5. Вывод результата работы 14
- 6. Проверка правильности программы 14
- Постановка задачи
- Даны целые числа a, b и n. Вычислить.
1. Метод решенияПодключаем файл windowA.inc, в котором будут содержаться базовые структуры и константы Win32. Затем в процедуре start первоначально вызываем функции Win32 API, после чего происходит регистрация окна (определения класса окна и регистрация его в системе). Затем создаем и отображаем, собственно, само окно. Потом запускается цикл обработки сообщения, которые будут посылаться ОС программе и обрабатываться в отдельной процедуре WindowProc и затем собственно выход из программы.В процедуре обработке сообщений, если нажата клавиша «Вычислить», то считывается значение из поля редактирования, преобразовывается в числовой формат, производятся нужные вычисления и выводится на экранТекст программыSTYLBTN equ 40000000h + 10000000h;WSCHILD+WS_VISIBLESTYLEDT equ 40000000h + 10000000h + 800000h + 10000h;Пример каркасного приложения для Win32.486locals .model flat,STDCALL include windowA.inc includelib imp32i.libextrn 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 ;обнаружение сообщенияextrn DispatchMessageA:PROC ;передача сообщения ;оконной функцииextrn ExitProcess:PROC ;завершение процедурыextrn BeginPaint:PROC ;начало перерисовкиextrn EndPaint:PROC ;конец перерисовкиextrn TextOutA:PROC ;вывод текстаextrn PostQuitMessage:PROCextrn DefWindowProcA:PROC ;обработчик по умолчаниюextrn MessageBoxA:PROCextrn SendMessageA:PROCextrn GetDC:PROCextrn ReleaseDC:PROC ;оконной функцииpublic WindowProc.datahwnd dd 0 ; дескриптор экземпляра окнаhInst dd 0 ; дескриптор класса окнаhdc dd 0;hedt1 dd 0 ;дескриптор поля редактированияhbtn dd 0 ;дескриптор кнопкиhh1 dd 0hh2 dd 0hh3 dd 0hh4 dd 0hbtn1 dd 0hbtn2 dd 0CPBUT db '&Посчитать',0CPBUT2 db 'В&ыход',0CLSBTN db 'BUTTON',0CPEDT db '',0CLSEDT db 'EDIT',0TEXT db ' 'TEXTA db ' 'TEXTB db 'результат: 'TEXTLEN = $-TEXTten dw 10temp dw 0a dd ? b dd ?n dd ?wcl WNDCLASSEX <?> ;структура для регистрации класса ; окнаmessage MSG <?> ;структура для регистрации сообщенийszClassName db 'Приложение Win32',0szTitleName db 'Курсач Лысенко Д. ПС-164',0MesWindow db 'Введите a,b и n,'MesWindowLen = $-MesWindowps PAINTSTRUCT <?>.codestart proc near;Получение дескриптора класса окна push 0; call GetModuleHandleA mov hInst,eaxWinMain:;для начала инициализируем поля структуры 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 push IDC_ARROW ;стандартный курсор стрелка 32512 push 0 call LoadCursorA mov wcl.hCursor,eax ;определим цвет фона окна push LTGRAY_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;регистрируем класс окна push offset wcl 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 л.в. угла push WS_OVERLAPPEDWINDOW ;стиль окна push offset szTitleName ;Строка заголовка окна push offset szClassName ;имя класса окна push 0 ;дополнительные стили call CreateWindowExA mov hwnd,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 je end_cycl_msg;трансляция ввода с клавиатуры push offset message call TranslateMessage;передача сообщения оконной функции push offset message call DispatchMessageA jmp cycl_msgend_cycl_msg:;выход из приложения push NULL call ExitProcessstart endp;Оконная функция WindowProc для обработки сообщенийWindowProc proc arg @@hwnd:DWORD, @@mes:DWORD, @@wparam:DWORD, @@lparam:DWORDuses ebx,edi, esi ; регистры должны сохранятьсяlocal @@hdc:DWORD cmp @@mes,WM_DESTROY je wmdestroy cmp @@mes,WM_CREATE je wmcreate cmp @@mes,WM_PAINT je wmpaint cmp @@mes, WM_COMMAND je wmcommand jmp defaultwmcreate: ;создание окна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 mov eax,0 ;возвращаемое значение 0 jmp exit_wndprocwmcommand:mov eax, hbtn cmp @@lparam,eax je calcmov eax, hbtn2 cmp @@lparam,eax je res wmnodestroy: mov eax,0 jmp exit_wndprocres: jmp wmdestroywmpaint: push offset ps push @@hwnd call BeginPaint mov @@hdc,eax push MesWindowLen push offset MesWindow push 20 push 10 push @@hdc call TextOutA;освободить контекст push offset ps push @@hdc call EndPaint mov eax,0 ;возвращаемое значение 0 jmp exit_wndprocwmdestroy: ;послать сообщение WM_QUIT push 0 call PostQuitMessage mov eax,0 ;возвращаемое значение 0 jmp exit_wndprocdefault:;обработка по умолчанию push @@lparam push @@wparam push @@mes push @@hwnd call DefWindowProcA jmp exit_wndproccalc:;считываем поле 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,1drepeat: 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 TextOutAexit_wndproc: retWindowProc endpStringToDig proc nearARG @@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 MRETMDIV: div tenMRET:cmp temp,1jne n1imul eax,-1mov temp,0 n1: retStringToDig endpend start2. Схема алгоритмаВывод результата работы3. Проверка правильности программы1) 2) 3) 4) Данные, полученные в результате вычислений, совпадают с теми, что были получены в результате выполнения программы.
|
|