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

  • Вид работы:
    Практическое задание
  • Предмет:
    Информатика, ВТ, телекоммуникации
  • Язык:
    Русский
    ,
    Формат файла:
    MS Word
    289,99 kb
  • Опубликовано:
    2008-10-21
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!

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

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

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

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

 




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

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

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

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

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

         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)

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


Не нашли материал для своей работы?
Поможем написать уникальную работу
Без плагиата!