Визуальная среда разработки программ DELPHI



Реализация алгоритмов вычислительной математики на языках программирования в визуальной среде DELPHI. Алгоритмы решения уравнений и систем уравнений, квадратурные формулы.

 

Цель работы:

Ознакомиться с приемами работы в визуальной среде программирования Turbo DELPHI, с разделами меню, с основными компонентами визуального программирования. Реализовать алгоритмы решения уравнений и приближенного вычисления определенных интегралов в визуальной среде.

 

1. Ознакомиться с основными компонентами стандартной закладки компонент среды Turbo DELPHI, с технологией разработки простых программ в визуальной среде.

2. Запустить оболочку, ознакомиться с пунктами главного меню, с установкой компонент на форму, с настройкой первоначальных свойств компонентов и с их изменением в процессе работы программы.

3. Ознакомиться со структурой модуля формы, с интерфейсной частью модуля. Расположить вызываемые процедуры, реализующие алгоритмы в исполняемой части, описать все переменные.

4. Освоить отладку программы в процессе трансляции.

5. Написать программу решения уравнения, левая часть которого задана функцией, алгоритмом половинного деления.

6. Построить на основе этого алгоритма метод касательных, добавив процедуру вычисления производной.

7. Построить процедуру вычисления определенного интеграла функции на заданном отрезке методом средних прямоугольников.

 

Образец выполнения задания:

Программа решения уравнения методом половинного деления.

Установить на форму компоненты Button 1, ListBox 1, Label 1 , расположив их примерно так, как указано на рисунке. Двойным щелчком на объекте Button 1 попадаем в редактор кода для набора операторов, соответствующих событию «нажатие кнопки»: procedure TForm1.Button1Click(Sender: TObject);

 

Вид формы с установленными компонентами.

Часть работы по написанию кода программы берет на себя редактор кода визуальной среды. По мере установки компонент на форму редактор кода добавляет в интерфейсную часть создаваемого модуля описания компонент и используемых свойств и событий. Заголовки процедур, соответствующие обрабатываемым событиям, также создаются редактором кода.

Набираем текст процедуры, соответствующей нажатию кнопки и выделенный ниже прямым жирным шрифтом. Далее, в раздел implementation модуля вводим текст процедур и деклараций, напечатанный жирным курсивом. Отлаживаем работу программы (с учетом ошибок набора) и добиваемся правильного выполнения программы. Тестируем программу на нескольких вариантах уравнений. Сохраняем проект и модуль в отдельной папке.

 

Текст модуля :

 

unit koren;

 interface

 uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls;

type

TForm1 = class(TForm)

Button1: TButton;

Label1: TLabel;

Label2: TLabel;

ListBox1: TListBox;

procedure Button1Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

{$R *.dfm}

Const

a=0;b=3;

eps=0.000001;

function f(t:real):real;

Begin

f:=t*t*t*t*t-8*t-1;

end;

procedure root(a,b:real; var x:real);

Var

ya,yb:real;

y:real;

s1,s2:string;

Begin

ya:=f(a);

yb:=f(b);

if ya*yb<0 then

Begin

Repeat

  x:=(b+a)/2;

   y:=f(x);

   str(x:6:3,s1);

   str(y:8:4,s2);

   form1.listbox1.Items.Add(s1+' '+s2);

  if y*ya<0 then

     b:=x else

     a:=x;

until b-a<eps;

End

Else

showmessage ('корня на этом отрезке нет');

end;

procedure TForm1.Button1Click(Sender: TObject);

Var

x:real;

begin

form1.Caption:=' Решение уравнения ';

root(a,b,x);

label1.Caption:=floattostr(x);

end;

end.


Практическая работа 4

Визуальная среда разработки программ DELPHI

Реализация алгоритмов вычислительной математики на языках программирования в визуальной среде Turbo DELPHI. Методы Эйлера и Рунге-Кутты решения задачи Коши.

 

Цель работы:

Ознакомиться с графическими компонентами визуальной среды программирования DELPHI. Реализовать алгоритмы решения численного интегрирования дифференциальных уравнений ( задача Коши) методом Эйлера и методами второго порядка (по средней производной и в средней точке).

 

1. Ознакомиться с графическим классом канва (Canvas) и его свойствами, предназначенными для рисования на канве пикселами.

2. Ознакомиться с учебной программой рисования графика сигнала с учетом масштабирования.

3. На основе процедуры интегрирования по методу Эйлера написать процедуру интегрирования методом средней производной. Выполнить процедуру для заданного дифференциального уравнения ( по вариантам) с начальными условиями (задача Коши).

4. Построить график полученного решения.

 

Образец выполнения задания:

 

Создавать графические элементы можно на любом объекте, имеющем свойство Canvas . Этим свойством обладает, в частности, сама форма. Зададим значения свойств формы (как на рисунке ниже):

Caption = график сигнала;

Color = clWhite (либо другой по выбору из имеющегося списка).

Далее, переключимся в инспекторе объектов на вкладку Events и на событии OnPaint выполним двойной щелчок в поле значения этого события, в результате чего будет создана процедура перерисовки, в теле которой зададим оператор вызова процедуры построения графика сигнала:

procedure TForm1.FormPaint(Sender: TObject);

Begin

grafik ;

end ;

В раздел implementation модуля поместим текст (выделенный ниже жирным курсивом) процедур построения графика и описания используемых переменных.

 

 

unit signal;

 

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs;

 

type

TForm1 = class(TForm)

procedure FormPaint(Sender: TObject);

procedure FormResize(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

 

implementation

 

{$R *.dfm}

 

procedure grafik;

Const

omega_r=50;

omega_h=5*omega_r;

T=1/700;

N=1000;{ число точек графика }

Type

dann= array[0..N] of real;

Var

L,R,W,H: integer;

X: dann;

Y: dann;

k:integer;

ymin,ymax:real;

Mx,My:real;

x0,y0: integer;

function signal(j:integer):real;

Begin

X[j]:=sin(j*omega_r*T/(2*Pi))+

    cos(j*omega_r*T/Pi)+sin(j*omega_h*T/Pi)/5;

signal:=X[j];

end;

procedure min_max(Y:dann; var min, max:real);

Var

k: integer;

Begin

min:=Y[0];max:=Y[0];

for k := 1 to N do

if Y[k]> max then

    max:=Y[k]

    else if Y[k]< min then

    min:=Y[k];

end;

Begin

L:=10;

R:=form1.clientHeight-10;

W:=form1.Width-50;

H:=form1.clientheight-20;

for k:=0 to N do

signal(k);

min_max(X,ymin,ymax);

Mx:=W/N;

My:=H/(ymax-ymin);

x0:=L;

y0:=R-abs(Round(ymin*My));

With form1.Canvas do

Begin

for k:=0 to N do

form1.Canvas.Pixels[x0+round(k*Mx),y0-round(X[k]*My)]:=clRed;

  Moveto(L,R);lineto(L,R-H);

  moveto(x0,y0);lineto(x0+W,y0);

  textout(x0+W,y0,'x');

     textout(L+10, R-10, floattostrF (ymin,

 ffGeneral, 6, 3));

end;

end;

{=================================================}

procedure TForm1.FormPaint(Sender: TObject);

begin

grafik ;

end;

Перед выполнением и отладкой программы сохраним проект в отдельной папке. Выполним запуск программы и обнаружим, что при изменении размеров формы график искажается. Добавим к проекту процедуру перерисовки графика с предварительной очисткой новой канвы. Для этого в поле значения события OnResize (на вкладке инспектора объектов) выполним двойной щелчок и в появившейся заготовке соответствующей процедуры наберем операторы очистки канвы и перерисовки графика:

 

procedure TForm1.FormResize(Sender: TObject);

begin

form1.Canvas.FillRect(rect(0,0,clientwidth,clientheight));

grafik;

end;

end.{конец модуля}

После запуска программы при изменении размеров формы (окна программы) и при развертывании на весь экран (максимизация размеров окна) график перерисовывается заново.

 

Решение задачи Коши методом Эйлера реализуется следующим модулем:

 

unit difur;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, ExtCtrls;

 

type

TForm1 = class(TForm)

Button1: TButton;

Label1: TLabel;

Image1: TImage;

Button2: TButton;

Button3: TButton;

ListBox1: TListBox;

Button4: TButton;

procedure Button1Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

procedure Button3Click(Sender: TObject);

procedure Button4Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

 

var

Form1: TForm1;

 

implementation

{$R *.dfm}

 

Const

h=0.1;

Var

Koeff:real;

U:array[0..50] of real;

ib,ik:array[0..50] of real;

ik2:array[0..50] of real;

maU,miU:real;

function f(t:real):real;

Begin

if t<0 then

    f:=0

Else

   f:= sin(Pi*t);

end;

function Fs(t,tau:real):real;

Var

z:real;

Begin

z:=frac(t/tau);

Fs:=f(z);

end;

function polin(x:real):real;forward;

{=********************************************************=}

function koren(x0,h:real):real;

Var

a,b:real;

ya,y:real;

x:real;

Begin

a:=0;b:=3;

ya:=polin(a);

Repeat

x:=(a+b)/2;

y:=polin(x);

if (y*ya>0) then

a:=x else

b:=x;

 { writeln(a,b);}

 { readkey;}

until b-a<0.00001;

Koren:=x;

end;

function polin(x:real):real;

Begin

    polin:=2*x*x*x*x-x*x*x-8;

    end;

procedure Euiler(x0,y0,h:real;var y:real);

Var

y1:real;

Begin

y1:=0.01*(cos(4*x0+y0)-2*1.56*y0+fs(x0,1)) ;

y:=y0+h*y1;

end;

{=************************************************************=}

procedure TForm1.Button1Click(Sender: TObject);

Var

s1:string[10];

begin

 Koeff:=koren(0,0.000001);

str(Koeff:8:5,s1);

Label1.Caption:=' корень ='+chr(13)+s1;

end;

 

procedure TForm1.Button2Click(Sender: TObject);

Var

 i:integer;

 y:integer;

 z:real;

begin

  canvas.pen.Color:=clblue;

image1.canvas.moveto(1,100);

image1.canvas.lineto(500,100);

image1.canvas.Pixels[41,41]:=clred;

for i:= 1 to 500 do

Begin

  z:=100-fs(i/200,1)*100;

  y:=round(z);

  image1.canvas.Pixels[i,y]:=clred;

end;

end;

 

procedure TForm1.Button3Click(Sender: TObject);

Var

 y0:real;

 x:real;

 y:real;

 i:integer;

 s1:string[3];

 s2:string[10];

begin

    y0:=0.1;

maU:=y0;MiU:=y0;

U[0]:=y0;

for i:=1 to 50 do

Begin

x:=i*h;

Euiler(x,y0,h,y);

y0:=y;

str(i:3,s1);

str(y:8:4,s2);

listbox1.Items.Add(s1+s2);

{writeln(rf,x:6:2,' ',y:14:-28);}

U[i]:=y;

if maU<y then maU:=y;

if miU>y then miU:=y;

end;

str(maU:8:2,s1);

end;

 

 

procedure TForm1.Button4Click(Sender: TObject);

Var

 i:integer;

 y:integer;

 z:real;

begin

image1.Refresh;

image1.canvas.Refresh;

canvas.pen.Color:=clblue;

image1.canvas.moveto(1,100);

image1.canvas.lineto(500,100);

for i:= 0 to 50 do

Begin

    z:=(U[i]-miU)*200/(maU-miU);

    y:=round(z);

   image1.canvas.Pixels[i*10,y]:=clred;

end ;

end;

 

end.

 

Процедуры соответствуют командным кнопкам, изображенным на рисунке

 

 


Практическая работа 5


Дата добавления: 2018-10-27; просмотров: 289; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!