ТЕСТОВЫЕ ВЫЗОВЫ ПРОГРАММЫ
Ниже приведены примеры тестовых вызовов программы: рисунок 18 - пример отображения графика первого интеграла с переменным верхним пределом, рисунок 19 - примеры расчета первого и второго интеграла с заданными параметрами точности вычислений. На рисунке 20 представлен пример исключительной ситуации, вызванной неверным задание границ интегрирования. На рисунке 21 - пример вызова API-функции GetSystemInfo, отображающей информацию о текущей системе.
Рисунок 18 - Построение графика интеграла
Рисунок 19 - Примеры расчета интегралов
Рисунок 20 - Тестовый вызов исключительной ситуации
Рисунок 21 - Тестовый вызов API-функции GetSystemInfo
Для проверки правильности выполненных расчетов интегралов, представленных на рисунке 19, и отображения графика первого интеграла с переменным верхним пределом приведем пример вычисления интеграла и расчета графика выполненных в программе Mathcad Professional 2000, представленном на рисунке 22. Рисунок 22 - Решение задачи в Mathcad
Как видно из рисунка, значения интегралов рассчитанных в разрабатываемой программе и в программе Mathcad Professional 2000 практически сходятся, что говорит правильности решения поставленной задачи. ОПИСАНИЕ РАЗРАБОТКИ СПРАВОЧНОЙ СИСТЕМЫ Для создания справочной системы я использовал программу DotCHM. Эта программа на лету создает справочные системы нескольких стандартов: 16-разрядная справка, 32-разрядная справка, chm-справка и справка для Windows CE. В DotCHM можно создавать полностью рабочий справочный файл, с поиском, обзором и содержанием, за считанные минуты. Все, что требуется это набрать текст справки. Создав новый проект справочной системы, создаю стандартное содержание. Затем создаю список разбиений справки на пункты, заполняю эти пункты, добавляю нужные изображения, ссылки и т.д. Связываю все разделы с содержанием и компилирую.
Рисунок 23 – Пример вызова справки ЗАКЛЮЧЕНИЕ
Разработанная программа предоставляет возможности по вычислению интегралов с помощью численных методов с достаточно большой степенью точности, что подтверждается проведением аналогичных расчетов в профессиональной математической программе Mathcad Professional 2000. Кроме того, программа предоставляет возможность ввода произвольных функций, вычисления их интегралов и построения графиков функций. Данная программа может быть использована в учебных целях. При разработке данной программы были приобретены навыки: - разработки программ в среде программирования Delphi - использования методики смешанного программирования - использования динамической компоновки dll-библиотек - программной реализации численных методов для вычисления определенных интегралов - написания 16-ти разрядного Help-а под Windows ПЕРЕЧЕНЬ ССЫЛОК
1. Турчак Л.И. Основы численных методов: Учеб. пособие. - М.: Наука, Гл. ред. физ. -мат. лит., 2002. - 320 с 2. Стив Т., Ксавье П. Delphi6 руководство разработчика.-М.: Вильямс, 2005г.- 1112с. 3. Дан Эпплман. Win32 API и Visual Basic для профессионалов.-М.: Питер, 2001г.- 1256с. ПРИЛОЖЕНИЕ А
Листинг dll-библиотеки integrals.dll
library integrals; uses SysUtils, Classes; {$R *.res} type IntegralFunction= function (x: real; var y: real): boolean; function Simpson(MainFunction: IntegralFunction;a,b:real;n: integer; var Res: real): boolean; var s, h, x,y: real; i: integer; begin Result:=true; try s:=0; h:=(b-a)/n; for i:=0 to n do begin x:=a+h*i; if (i=0) or (i=n) then if MainFunction(x,y) then s:=s+y else Result:=false else if i mod 2 = 0 then if MainFunction(x,y) then s:=s+2*y else Result:=false else if MainFunction(x,y) then s:=s+4*y else Result:=false; end; except Simpson:=false; end; Res:=s*h/3; end; function CountTrap(MainFunction: IntegralFunction; a,b, eps: real; var Res: real): boolean; function PTrap(MainFunction: IntegralFunction; a,b:real; DivNo: Integer; var Res: real): boolean; var x1, x2,y1,y2,y3,dx,sum: real; i: integer; begin PTrap:=true; try sum:=0; dx:=(b-a)/DivNo; for i:=1 to DivNo-1 do begin x1:=a+dx*i; if MainFunction(x1,y1) then sum:=sum+y1 else Raise EAbort.Create(''); end; sum:=sum*2; if MainFunction(a,y1) and MainFunction(b,y2) then sum:=sum+y1+y2 else Raise EAbort.Create(''); Res:=sum*dx/2; except PTrap:=False; end; end; {-----} var T: integer; i1, i2: real; begin countTrap:=true; try if PTrap(MainFunction,a,b,2,i1) and PTrap(MainFunction,a,b,4,i2) then begin T:=4; while abs(i1-i2)>eps do begin if PTrap(MainFunction,a,b,t,i1) and PTrap(MainFunction,a,b,t*2,i2) then t:=t*2 else EAbort.Create(''); T:=T*2; end; end else EAbort.Create(''); Res:=(i1+i2)/2; except CountTrap:=false; end; end; exports Simpson index 1; exports CountTrap index 2; begin end. ПРИЛОЖЕНИЕ Б
Листинг dll-библиотеки functions.dll
library functions; uses SysUtils, Classes; {$R *.res} function Integral1Function(x: real; var y: real):boolean; begin Result:=true; try y:=1/sqrt(2+0.5*x*x) except result:=false; end; end; function Integral2Function(x: real; var y: real):boolean; begin Result:=true; try y:=sin(2*x)/sqr(x) except result:=false; end; exports Integral1Function; exports Integral2Function; begin end. ПРИЛОЖЕНИЕ В
Листинг модуля chart.pas
unit Chart; interface uses Graphics, SysUtils, Classes; const BorderTop=10; BorderBottom=40; BorderLeft=40; BorderRight=10; type GraphFunction = function(x: real; var y: real): boolean; TChartFunction = class private MainFunction: GraphFunction; FColor: TColor; FShow: boolean; public constructor Create(f: GraphFunction); published property Color: TColor read FColor write FColor; property Show: boolean read FShow write FShow; end; TChart = class private functions: TStringList; ChartBitmap: TBitmap; MainCanvas: TCanvas; bgBrush: TBrush; gridPen: TPen; AxisPen: TPen; Width: integer; Height: integer; FScale: real; FStep: real; FShowGrid: boolean; xx0, yy0: integer; nsteps: integer; x0, y0: integer; procedure DrawGrid; procedure DrawFunction(funct: TChartFunction); procedure DrawFunctions; procedure PutPixel(x,y: integer; Color: TColor); procedure OutTextCenter(s: string; x, y: integer); public constructor Create(Canvas: TCanvas); procedure AddFunction(f: TChartFunction; Ident: String); function DelFunction(s: string): boolean; procedure ReDraw; procedure ShiftHor(value: integer); procedure ShiftVer(value: integer); procedure Rescale(xvalue, yvalue: integer; Maximize: boolean); procedure GetXY(x,y: integer; var x1,y1: real); procedure SaveToFile(filename: string); published property ShowGrid: boolean read FShowGrid write FShowGrid; end; implementation { TChart } constructor TChart.Create(Canvas: TCanvas); begin functions:=TStringList.Create; MainCanvas:=Canvas; ChartBitmap:=TBitmap.Create; bgBrush:=TBrush.Create; bgBrush.Color:=clWhite; gridPen:=TPen.Create; gridPen.Style:=psDot; AxisPen:=TPen.Create; AxisPen.Width:=2; AxisPen.Style:=psInsideFrame; AxisPen.Color:=clRed; Width:=MainCanvas.ClipRect.Right-MainCanvas.ClipRect.Left; Height:=MainCanvas.ClipRect.Bottom-MainCanvas.ClipRect.Top; ChartBitmap.Width:=Width; ChartBitmap.Height:=Height; FShowGrid:=true; xx0:=40+trunc((width-50)/2); yy0:=10+trunc((height-50)/2); x0:=xx0; y0:=yy0; NSteps:=20; FScale:=20; FStep:=(width/fscale)/nsteps; ReDraw; end; procedure TChart.DrawFunction(funct: TChartFunction); var x, y: real; x1,y1,x2,y2: integer; a,b: boolean; f: GraphFunction; begin x:=-(x0/FScale); a:=false; f:=funct.MainFunction; while (x0+x*FScale)<(Width-BorderRight) do begin if f(x,y) then begin x1:=round(x0+x*FScale); y1:=round(y0-y*FScale); if (x1>BorderLeft) and (x1<width-BorderRight) and (y1>BorderTop) and (y1<height-BorderBottom) then begin PutPixel(x1,y1, funct.Color); end; end; x:=x+0.01; end; end; procedure TChart.OutTextCenter(s: string; x, y: integer); begin x:=x-round(MainCanvas.TextWidth(s)/2); y:=y-round(MainCanvas.TextHeight(s)/2); MainCanvas.TextOut(x,y,s); end; procedure TChart.DrawGrid; var x, y: integer; k: real; s: string; begin With MainCanvas do begin Brush.Assign(bgBrush); FillRect(ClipRect); begin if FShowGrid then Pen.Assign(GridPen) else Pen.Style:=psClear;; x:=x0 mod trunc(FScale*FStep); while x<(width-BorderRight) do end; procedure TChart.ReDraw; begin DrawGrid; DrawFunctions; end; procedure TChart.ShiftHor(value: integer); begin x0:=x0+value; ReDraw; end; procedure TChart.ShiftVer(value: integer); begin y0:=y0+value; ReDraw; end; procedure TChart.AddFunction(f: TChartFunction; Ident: String); begin functions.AddObject(Ident,f); ReDraw; end; procedure TChart.DrawFunctions; var i: integer; begin for i:=0 to functions.Count-1 do if TChartFunction(functions.Objects[i]).Show then DrawFunction(TChartFunction(functions.Objects[i])); end; begin if x>BorderLeft then begin MoveTo(x,BorderTop); LineTo(x, Height-BorderBottom); k:=(x-x0)/FScale; s:= FloatToStrF(k,ffGeneral,4,2); OutTextCenter(s, x, height-round(BorderBottom/2)); end; x:=x+trunc(FStep*FScale); end; y:=y0 mod trunc(FScale*FStep); while y<(height-BorderBottom) do begin if y>BorderTop then begin MoveTo(BorderLeft,y); LineTo(Width-BorderRight, y); k:=(y0-y)/FScale; s:= FloatToStrF(k,ffGeneral,4,2); OutTextCenter(s,round(BorderLeft/2), y); end; y:=y+trunc(FStep*FScale); end; end; // юЄЁшёютър ъююЁфшэрЄэ√ї юёхщ Pen.Assign(AxisPen); if (x0>BorderLeft) and (x0<(width-BorderRight)) then begin MoveTo(x0, BorderTop); lineto(x0, height-BorderBottom-1); end; if (y0>BorderTop) and (y0<(Height-BorderBottom)) then begin Moveto(BorderLeft,y0); lineTo(width-BorderRight-1, y0); end; Pen.Assign(gridPen); Pen.Style:=psSolid; Brush.Style:=bsClear; Rectangle(40, 10, Width-10, height-40); Brush.Style:=bsSolid; end; end; procedure TChart.PutPixel(x, y: integer; Color: TColor); var i, j: integer; begin with MainCanvas do for i:=x to x+1 do for j:=y to y+1 do MainCanvas.Pixels[i,j]:=Color; function TChart.DelFunction(s: string): boolean; label 1; var i: integer; begin result:=false; for i:=0 to functions.Count-1 do if functions.Strings[i]=s then begin result:=true; functions.Delete(i); goto 1; end; 1: end; procedure TChart.Rescale(xvalue, yvalue: integer; Maximize: boolean); var mx, my: Real; begin if xvalue*yvalue<>0 then begin mx:=(width-borderleft-borderright)/xvalue; my:=(height-bordertop-borderbottom)/yvalue; if Maximize then if mx<my then FScale:=FScale*mx else FScale:=FScale*my else if mx<my then FScale:=FScale/mx else FScale:=FScale/my; FStep:=(width/FScale)/NSteps; ReDraw; end; end; procedure TChart.GetXY(x, y: integer; var x1, y1: real); begin x1:=(x-x0)/FScale; y1:=(y0-y)/FScale; end; procedure TChart.SaveToFile(filename: string); var temporary: TPicture; begin temporary:=TPicture.Create; temporary.Bitmap.Width:=width; temporary.Bitmap.Height:=height; Temporary.Bitmap.Canvas.CopyRect( Temporary.Bitmap.Canvas.ClipRect, MainCanvas, MainCanvas.ClipRect); Temporary.SaveToFile(filename); temporary.Destroy; end; { TChartFunction } constructor TChartFunction.Create(f: GraphFunction); begin MainFunction:=f; Show:=true;end;end.
Популярное: Почему человек чувствует себя несчастным?: Для начала определим, что такое несчастье. Несчастьем мы будем считать психологическое состояние... Почему люди поддаются рекламе?: Только не надо искать ответы в качестве или количестве рекламы... ©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (245)
|
Почему 1285321 студент выбрали МегаОбучалку... Система поиска информации Мобильная версия сайта Удобная навигация Нет шокирующей рекламы |