Програмування та основи алгоритмізації 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 і потім власне вихід з програми.
У процедурі обробці повідомлень, якщо натиснута клавіша «Обчислити», то зчитується значення з поля редагування, перетворюється в числовий формат, виробляються потрібні обчислення і виводиться на екран

Текст програми
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

2. Схема алгоритму




Висновок результату роботи


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

1)
2)
3)
4)
Дані, отримані в результаті обчислень, збігаються з тими, що були отримані в результаті виконання програми.
Додати в блог або на сайт

Цей текст може містити помилки.

Програмування, комп'ютери, інформатика і кібернетика | Практична робота
17.7кб. | скачати


Схожі роботи:
Основи алгоритмізації та програмування
Програмування та основи алгоритмізації
Основи програмування та алгоритмізації 2
Навчання рішенню завдань з розділу Основи алгоритмізації та програмування
Основи програмування в C
Основи програмування
Основи технології програмування
Основи мови програмування Лісп
Основи програмування в середовищі Delphi 7 0
© Усі права захищені
написати до нас