Ðåôåðàòû. Ïðîãðàììèðîâàíèå è îñíîâû àëãîðèòìèçàöèè

Ïðîãðàììèðîâàíèå è îñíîâû àëãîðèòìèçàöèè

Ìèíèñòåðñòâî îáðàçîâàíèÿ Ðîññèéñêîé Ôåäåðàöèè

ÞÆÍÎ-ÓÐÀËÜÑÊÈÉ ÃÎÑÓÄÀÐÑÒÂÅÍÍÛÉ ÓÍÈÂÅÐÑÈÒÅÒ

Êàôåäðà Àâòîìàòèêè è óïðàâëåíèÿ

 






Ïîÿñíèòåëüíàÿ çàïèñêà ê êóðñîâîìó ïðîåêòó

Ïî äèñöèïëèíå:

Ïðîãðàììèðîâàíèå è îñíîâû àëãîðèòìèçàöèè

Âàðèàíò ¹ 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)

Äàííûå, ïîëó÷åííûå â ðåçóëüòàòå âû÷èñëåíèé, ñîâïàäàþò ñ òåìè, ÷òî áûëè ïîëó÷åíû â ðåçóëüòàòå âûïîëíåíèÿ ïðîãðàììû.





2012 © Âñå ïðàâà çàùèùåíû
Ïðè èñïîëüçîâàíèè ìàòåðèàëîâ àêòèâíàÿ ññûëêà íà èñòî÷íèê îáÿçàòåëüíà.