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

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

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

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











	

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

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

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

Вариант № 1









		

		Проверил:

доцент кафедры

Вставская Е.В.

			“____”_____________2007г

		Выполнил:

	студент группы ПС-164

			Лысенко Д.Г.

	“____”_____________2007г



	Челябинск

			2007 г.


Содержание:



			1.	Постановка задачи	3

			2.	Метод решения	3

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

			4.	Схема алгоритма	12

			5.	Вывод результата работы	14

			6.	Проверка правильности программы	14

		

	
Постановка задачи

	Даны целые числа a, b и n. Вычислить.

	

		Метод решения

	

	Подключаем файл windowA.inc, в котором будут содержаться базовые структуры и константы Win32. Затем в процедуре start первоначально вызываем функции Win32 API, после чего происходит регистрация окна (определения класса окна и регистрация его в системе). Затем создаем и отображаем, собственно, само окно. Потом запускается цикл обработки сообщения, которые будут посылаться ОС программе и обрабатываться в отдельной процедуре WindowProc и затем собственно выход из программы.

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

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

	

	STYLBTN	equ	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		;обнаружение сообщения

	extrn	DispatchMessageA:PROC		;передача сообщения

									;оконной функции

	extrn	ExitProcess:PROC			;завершение процедуры

	

	extrn	BeginPaint:PROC			;начало перерисовки

	extrn	EndPaint:PROC			;конец перерисовки

	extrn	TextOutA: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	;дескриптор поля редактирования

	hbtn	dd	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	?	

	b	dd	?

	n	dd	?

	

	

	wcl	WNDCLASSEX	<?>	;структура для регистрации класса

							; окна

	message	MSG	<?>	;структура для регистрации сообщений

	

	szClassName	db	'Приложение Win32',0

	szTitleName	db	'Курсач Лысенко Д. ПС-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	

	

		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_msg

	end_cycl_msg:

	

	;выход из приложения

		push		NULL

		call		ExitProcess

	start		endp

	

	;Оконная функция WindowProc для обработки сообщений

	WindowProc	proc 

	arg @@hwnd:DWORD, @@mes:DWORD, @@wparam:DWORD, @@lparam:DWORD

	uses 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	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

		mov	eax,0

	

				;возвращаемое значение 0

		jmp	exit_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

		call		TextOutA

	

	;освободить контекст 

	 push		offset ps

	 push		@@hdc

	 call		EndPaint

	 mov	eax,0	;возвращаемое значение 0

	 jmp	exit_wndproc

	

	

	

	wmdestroy: ;послать сообщение WM_QUIT

		push		0

		call		PostQuitMessage

		mov	eax,0	;возвращаемое значение 0

		jmp	exit_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

		
Схема алгоритма

	

	

	
Вывод результата работы











		Проверка правильности программы



1) 

2) 

3) 

4) 

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







2