Èíôîðìàòèêà, ïðîãðàììèðîâàíèå: Ïðîãðàììèðîâàíèå è îñíîâû àëãîðèòìèçàöèè, Ëàáîðàòîðíàÿ ðàáîòà

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

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

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

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

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

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

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

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


Åùå èç ðàçäåëà Èíôîðìàòèêà, ïðîãðàììèðîâàíèå:


 Ýòî èíòåðåñíî
 Ðåêëàìà
 Ïîèñê ðåôåðàòîâ
 
 Àôîðèçì
Ïîñàäèëè ñîáàêó îõðàíÿòü ìàøèíó. Óòðîì ïðèøëè – êîëåñ íåò. Íà ñòåêëå çàïèñêà: «Ñîáàêó íå ðóãàéòå, îíà ëàÿëà».
 Ãîðîñêîï
Ãîðîñêîïû
 Ñ÷¸ò÷èêè
bigmir)net TOP 100