1. Текст файла Lab16_V1.f90:
! Lab16_V1.f90
! FUNCTIONS:
! WinMain() - Entry point for the application
! displays the main window processes the message loop
! Lab16_V1Sub() - Callback routine for the main dialog box
! Lab16_V1Apply()- Callback routine for the APPLY button
!****************************************************************************
! FUNCTION: WinMain(hInstance, hPrevInstance, lpszCmdLine, nCmdShow)
! PURPOSE: Entry point for the application
! COMMENTS: Displays the main window and processes the message loop
!****************************************************************************
integer*4 function WinMain(hInstance, hPrevInstance, lpszCmdLine, nCmdShow)
!DEC$ IF DEFINED(_X86_)
!DEC$ ATTRIBUTES STDCALL, ALIAS: '_WinMain@16':: WinMain
!DEC$ ELSE
!DEC$ ATTRIBUTES STDCALL, ALIAS: 'WinMain':: WinMain
!DEC$ ENDIF
use user32
use kernel32
use dflogm
use Lab16_V1Globals
implicit none
integer*4 hInstance
integer*4 hPrevInstance
integer*4 lpszCmdLine
integer*4 nCmdShow
include 'resource.fd'
external Lab16_V1Sub
external Lab16_V1Apply
! Variables
type (T_MSG) mesg
integer*4 ret
logical*4 lret
!*** передача начальных значений исходных данных строкам
write(text_a,'(f5.2)') a
write(text_b,'(f5.2)') b
write(text_lamb,'(f5.2)') lamb
write(text_eps,'(e8.1)') eps
ghInstance = hInstance
ghModule = GetModuleHandle(NULL)
ghwndMain = NULL
lret = DlgInit(IDD_LAB16_V1_DIALOG, gdlg)
if (lret ==.FALSE.) goto 99999
lret = DlgSetSub(gdlg, IDD_LAB16_V1_DIALOG, Lab16_V1Sub)
lret = DlgSetSub(gdlg, IDM_APPLY, Lab16_V1Apply)
!*** выводим строки в соответствующие окна редактирования
|
|
lret = DlgSet(gdlg, IDC_EDIT_A, trim(text_a))
lret = DlgSet(gdlg, IDC_EDIT_B, trim(text_b))
lret = DlgSet(gdlg, IDC_EDIT_EPS, trim(text_eps))
lret = DlgSet(gdlg, IDC_EDIT_LAMB, trim(text_lamb))
lret = DlgModeless(gdlg, nCmdShow)
if (lret ==.FALSE.) goto 99999
! Read and process messsages
do while(GetMessage (mesg, NULL, 0, 0))
if (DlgIsDlgMessage(mesg).EQV..FALSE.) then
lret = TranslateMessage(mesg)
ret = DispatchMessage(mesg)
end if
end do
call DlgUninit(gdlg)
WinMain = mesg.wParam
return
99999 &
ret = MessageBox(ghwndMain, "Error initializing application Lab16_V1"C, &
"Error"C, MB_OK)
WinMain = 0
end
!****************************************************************************
! FUNCTION: Lab16_V1Sub (dlg, id, callbacktype)
! PURPOSE: Dialog box callback for initialization and destroy
! COMMENTS:
!****************************************************************************
SUBROUTINE Lab16_V1Sub(dlg, id, callbacktype)
!DEC$ ATTRIBUTES DEFAULT:: Lab16_V1Sub
use user32
use dflogm
implicit none
type (dialog) dlg
integer id, callbacktype
if (callbacktype == dlg_destroy) then
call PostQuitMessage(0)
endif
END SUBROUTINE Lab16_V1Sub
!****************************************************************************
! FUNCTION: Lab16_V1Apply (dlg, id, callbacktype)
! PURPOSE: Dialog box callback for APPLY button
! COMMENTS:
!****************************************************************************
SUBROUTINE Lab16_V1Apply(dlg, id, callbacktype)
!DEC$ ATTRIBUTES DEFAULT:: Lab16_V1Apply
use dflogm! получаем доступ к диалоговым процедурам
use Lab16_V1Globals! подключаем глобальные переменные
implicit none! обязательное обявление имен
include 'resource.fd'! получаем доступ к ресурсным данным
type (dialog) dlg! производный тип для диалога
integer id! имя элемента управления, пославшего сообщение
integer callbacktype! показывает тип сообщения Windows
logical*4 lret! результат диалоговой функции
real &! локальные переменные, необходимые для расчета корня
Xnew, &! новое значение Х
Xold! значение Х на предыдущей итерации
real F! заданная функция
!------------------------
if (callbacktype == dlg_clicked) then
! обработка сообщения "щелчок мышью"
! считать значения текстовых переменных из окон редактироания
lret = dlgget(dlg, IDC_EDIT_A, text_a)
lret = dlgget(dlg, IDC_EDIT_B, text_b)
|
|
lret = dlgget(dlg, IDC_EDIT_EPS, text_eps)
lret = dlgget(dlg, IDC_EDIT_LAMB, text_lamb)
! обменяться данными между текстовыми и расчетными переменными
read(text_a, "(f5.2)") a
read(text_b, "(f5.2)") b
read(text_eps, *) eps
!*** расчет корня методом итераций
Xnew=(a+b)/2! начальное значение Х
do
Xold=Xnew! переназначение Х для следующей итерации
Xnew= Xold - lamb*F(Xold)! новая итерация по Х
iter=iter+1! увеличиваем число итераций
if(abs(Xnew - Xold)<eps)exit! проверка на завершение поиска
enddo
kor=(Xnew + Xold)/2! приближенное значение корня
!-------------------------------------
write(text_kor,'(f11.6)') kor! корень
write(text_Iter,'(i5)') iter! число итераций
!*** выводим строки в соответствующие окна редактирования
lret = DlgSet(gdlg, IDC_EDIT_KOR, trim(text_kor))
lret = DlgSet(gdlg, IDC_EDIT_ITER, trim(text_Iter))
endif
END SUBROUTINE Lab16_V1Apply
!****************************************************************************
! заданная функция
real function F(x)
real x
F=x**3-2.8*x**2-6.2*x+3.7
end function F
!****************************************************************************
2. Файл модуля глобальных данных.
!****************************************************************************
! Global data, parameters, and structures
!****************************************************************************
module Lab16_V1Globals
use dflogm
implicit none
! Parameters
integer*4, parameter, public:: SIZEOFAPPNAME = 100
! Global data
integer ghInstance
integer ghModule
integer ghwndMain
type (dialog) gdlg
!--- объявление и инициализация глобальных переменных
real::a=-2.0! левая граница интервала изоляции корня
real::b=-1.0! правая граница интервала изоляции корня
real::eps=1e-5! точность вычислений
real::lamb=0.1! итерационный коэффициент
real kor! искомый корень уравнения
integer iter! число итераций поиска корня
!--- строки для обмена с текстовыми окнами
character(5)::text_a='',text_b='',text_iter='',text_lamb=''
character(8)::text_eps=''
character(12)::text_kor=''
end module
3. Окно приложения с результатами расчета.
4. Работа в MathCad.
5. Работа в Excel.
6. Выводы:
· освоены навыки приближенного нахождения корней алгебраических трансцендентных уравненийметодом итераций в различных средах программирования;
· закреплены приемы реализации вычислительного процесса с помощью приложения Windows диалогового типа в среде Fortran.