Контрольная работа по предмету "Информатика"


Программирование и основы алгоритмизации 2

Министерство образования Российской Федерации


ЮЖНО-УРАЛЬСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ


Кафедра Автоматики и управления


Пояснительная записка к курсовому проекту


По дисциплине:


Программирование и основы алгоритмизации


Вариант № 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 и затем собственно выход из программы.


В процедуре обработке сообщений, если нажата клавиша «Вычислить», то считывается значение из поля редактирования, преобразовывается в числовой формат, производятся нужные вычисления и выводится на экран



Текст программы


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)


Данные, полученные в результате вычислений, совпадают с теми, что были получены в результате выполнения программы.



Не сдавайте скачаную работу преподавателю!
Данную контрольную работу Вы можете использовать для выполнения своих заданий.

Поделись с друзьями, за репост + 100 мильонов к студенческой карме :