16214

СОЗДАНИЕ ПРОСТЕЙШЕЙ ПРОГРАММЫ, ПОДДЕРЖИВАЮЩЕЙ ТЕХНОЛОГИЮ ООП

Лабораторная работа

Информатика, кибернетика и программирование

Лабораторная работа №2 Создание простейшей программы поддерживающей технологию ООП Цель лабораторной работы: изучить принципы построения классов. Постановка задачи: Разработать класс вычисления определенного интеграла четырьмя методами левых правых средни...

Русский

2013-06-20

89 KB

8 чел.

Лабораторная работа №2

Создание простейшей программы, поддерживающей технологию ООП

Цель лабораторной работы: изучить принципы построения классов. Постановка задачи:

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

Краткие теоретические сведения:

Классами в Object Pascal называются специальные типы, которые содержат поля, методы и свойства. Как и любой другой тип, класс служит лишь образцом для создания конкретных экземпляров реализации, которые называются объектами.

Синтаксис объявления класса следующий:

Type

<имя класса> = Class (<имя класса – родителя>)

 public {доступно всем}

  <поля, методы, свойства, события>

 published {видны в Инспекторе Объекта}

  <поля, свойства>

 protected  {доступны только потомками}

  <поля, методы, свойства, события>

 private {доступны только в модуле}

  <поля, методы, свойства, события>

 end;

Объекты являются представителями класса и объявляются в программе в разделе var:

var  <имя переменной>:<имя класса>;

В основе классов лежат три фундаментальных принципа, которые называются инкапсуляция, наследование и полиморфизм.

Под инкапсуляцией понимается скрытие полей объекта с целью обеспечения доступа к ним только посредством методов и свойств класса.

Механизм создания новых классов на основе существующих по средствам добавления полей, свойств и методов к уже существующим классам называется наследованием.

Полиморфизм - это свойство классов решать схожие по смыслу проблемы разными способами (возможность использовать одинаковые имена для методов, входящих в различные классы).

Все классы Object Pascal порождены от единственного родителя класса TObject. Этот класс не имеет полей и свойств, но включает в себя методы самого общего назначения.

Текст программы:

// основная программа

unit UDisplayForm;

interface

uses

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

 Dialogs, Series, ExtCtrls, StdCtrls, TeEngine, TeeProcs, Chart, Buttons, UCalc;

type

 TForm1 = class(TForm)

   Edit2: TEdit;

   Edit1: TEdit;

   MethodSelector: TRadioGroup;

   DisplayChart: TChart;

   SeriesFunction: TLineSeries;

   Label1: TLabel;

   Label2: TLabel;

   Label4: TLabel;

   SeriesPatterned: TAreaSeries;

   FunctionFormula: TImage;

   Label3: TLabel;

   Edit3: TEdit;

   SpeedButton1: TSpeedButton;

   Edit4: TEdit;

   Panel1: TPanel;

   Label5: TLabel;

   Panel2: TPanel;

   CheckBox1: TCheckBox;

   procedure FormCreate(Sender: TObject);

   procedure SomeEditKeyPress(Sender: TObject; var Key: Char);

   procedure SpeedButton1Click(Sender: TObject);

   procedure SomeEditChange(Sender: TObject);

   procedure MethodSelectorClick(Sender: TObject);

   procedure CheckBox1Click(Sender: TObject);

   procedure FormShow(Sender: TObject);

   procedure FormClick(Sender: TObject);

   function f2(x: Extended): Extended;

 private

   { Private declarations }

 public

   { Public declarations }

 end;

var

 Form1: TForm1;

 e1, e2, e3: string;

 p1, p2, p3: integer;

 integ: TIntegral;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);

var b: TBitmap;

begin

 b:=TBitmap.Create;

 b.LoadFromResourceName(hInstance, 'INTEGRAL');

 b.Transparent:=true;

 b.TransparentColor:=clWhite;

 FunctionFormula.Width:=b.Width;

 FunctionFormula.Height:=b.Height;

 FunctionFormula.Canvas.Brush.Color:=$00BAEDEF;

 FunctionFormula.Canvas.FillRect(Rect(0, 0, b.Width, b.Height));

 FunctionFormula.Canvas.StretchDraw(Rect(0, 0, b.Width-1, b.Height-1), b);

 b.Free;

 Panel1.Left:=FunctionFormula.Left+FunctionFormula.Width;

 Panel1.Height:=FunctionFormula.Height;

 Panel1.Top:=FunctionFormula.Top;

 integ:=TIntegral.Create;

 integ.Chart:=DisplayChart;

end;

//Edited

procedure TForm1.SomeEditKeyPress(Sender: TObject; var Key: Char);

begin

 if Sender=Edit3 then

 begin

   p3:=Edit3.SelStart;

   exit;

 end;

 if (Sender=Edit2) then

   p2:=Edit2.SelStart;

 if (Sender=Edit1) then

   p1:=Edit1.SelStart;

end;

procedure TForm1.SpeedButton1Click(Sender: TObject);

begin

 Application.Terminate;

end;

procedure TForm1.SomeEditChange(Sender: TObject);

var r: real;

   s: string;

begin

 if Sender=Edit3 then

 begin

   try

     integ.N:=StrToInt((Sender as TEdit).Text);

     e3:=Edit3.Text;

   except

     on EConvertError do begin

                               Edit3.Text:=e3;

                               Edit3.SelStart:=p3;

                             end;

   end;

 end

 else if ((Sender=Edit1) or (Sender=Edit2)) then

 begin

   if true then

   begin

       try

         r:=StrToFloat((Sender as TEdit).Text);

         e1:=Edit1.Text;

         e2:=Edit2.Text;

       except

         on EConvertError do begin

                               if Sender=Edit1 then

                               begin

                                 (Sender as TEdit).Text:=e1;

                                 (Sender as TEdit).SelStart:=p1;

                               end

                               else if Sender=Edit2 then

                               begin

                                 (Sender as TEdit).Text:=e2;

                                 (Sender as TEdit).SelStart:=p2;

                               end;

                               exit;

                             end;

       end;

       if Sender=Edit2 then

       begin

         integ.B:=r;

         //Application.MessageBox(PChar(floattostr(integ.Res)),'');

         s:=FloatToStr(integ.B);

         FunctionFormula.Canvas.TextRect(Rect(0, 0, 155, 18), 87-FunctionFormula.Canvas.TextWidth(s) div 2, 2, s)

       end

       else

       begin

         integ.A:=r;

         s:=FloatToStr(integ.A);

         FunctionFormula.Canvas.TextRect(Rect(0, 58, 155, 74), 87-FunctionFormula.Canvas.TextWidth(s) div 2, 60, s);

       end;

   end

   else

   begin

       FunctionFormula.Canvas.Font.Size:=10;

       if Sender=Edit2 then

         FunctionFormula.Canvas.TextRect(Rect(0, 0, 155, 18), 87-FunctionFormula.Canvas.TextWidth('') div 2, 2, '')

       else

         FunctionFormula.Canvas.TextRect(Rect(0, 58, 155, 74), 87-FunctionFormula.Canvas.TextWidth('') div 2, 60, '');

   end;

 end;

 if integ.Res=0 then

   Edit4.Text:='Неверные данные!'

 else

   Edit4.Text:=FloatToStr(integ.Res);

end;

procedure TForm1.MethodSelectorClick(Sender: TObject);

begin

 integ.CalcMethod:=MethodSelector.ItemIndex;

 if integ.Res=0 then

   Edit4.Text:='Неверные данные!'

 else

   Edit4.Text:=FloatToStr(integ.Res);

end;

procedure TForm1.CheckBox1Click(Sender: TObject);

begin

 SeriesPatterned.AreaLinesPen.Visible:=(Sender as TCheckBox).Checked;

end;

procedure TForm1.FormShow(Sender: TObject);

begin

 SomeEditChange(Edit1);

 SomeEditChange(Edit2);

end;

procedure TForm1.FormClick(Sender: TObject);

begin

 integ.f:=f2;

end;

function TForm1.f2(x: Extended): Extended;

begin

 Result:=x*x*3;

end;

end.

// модуль, содержащий класс

unit UCalc;

interface

uses Chart;

const funcCount=4;

type

    TValueChangedFunc=procedure (newValue: Extended);

    TF=function (x: Extended): Extended of object;

    TIntegral=class

     private

       FValueMin: Extended;//Нижняя граница

       FValueMax: Extended;//Верхняя граница

       FValueH: Extended; //Ширина шага

       FRes: Extended;    //Результат

       FValueN: Integer;  //Количество шагов

       FCalcMethod: Byte; //Номер выбранного способа подсчёта (0-трап.; 1-лев.прямоуг.; 2-прав.прямоуг.; 3-средн.прямоуг)

       FAutoRedraw: Boolean; //Перерисовывать при изменении хотя бы одного параметра

       FChart: TChart;

       FOnMinChanged: TValueChangedFunc;

       FOnMaxChanged: TValueChangedFunc;

       FOnNChanged: TValueChangedFunc;

       FOnHChanged: TValueChangedFunc;

       FF: TF;          //Функция подынтегральная 

     protected

       procedure SetN(newN: integer); virtual;

       procedure SetH(newH: Extended); virtual;

       procedure SetMin(newMin: Extended); virtual;

       procedure SetMax(newMax: Extended); virtual;

       procedure SetCalcMethod(newMethod: byte); virtual;

       procedure SetChart(newChart: TChart); virtual;

       procedure SetF(newF: TF);

     public

       constructor Create();

       destructor Destroy; override;

       property A: Extended read FValueMin write SetMin;//Нижняя граница

       property B: Extended read FValueMax write SetMax;//Верхняя граница

       property N: integer read FValueN write SetN default 10;//Количество шагов

       property H: Extended read FValueH write SetH;//Ширина одного шага

       property CalcMethod: byte read FCalcMethod write SetCalcMethod default 0;   //Номер выбранного способа подсчёта (0-трап.; 1-лев.прямоуг.; 2-прав.прямоуг.; 3-средн.прямоуг)

       property Chart: TChart read FChart write SetChart;

       property AutoRedraw: boolean read FAutoRedraw write FAutoRedraw default true;//Перерисовывать при изменении хотя бы одного параметра

       property Res: Extended read FRes;

       //События (на изменение каждого из параметров)

       property OnMinChanged: TValueChangedFunc read FOnMinChanged write FOnMinChanged default nil;

       property OnMaxChanged: TValueChangedFunc read FOnMaxChanged write FOnMaxChanged default nil;

       property OnNChanged: TValueChangedFunc read FOnNChanged write FOnNChanged default nil;

       property OnHChanged: TValueChangedFunc read FOnHChanged write FOnHChanged default nil;

       //Подынтегральная функция

       function fDefault(x: Extended): Extended; virtual;

       //

       property f: TF read FF write SetF;

       //Функции подсчёта результата

       procedure ReCalc(); virtual;

       function calc_trapezium: Extended; virtual;

       function calc_rectangle_left: Extended; virtual;

       function calc_rectangle_right: Extended; virtual;

       function calc_rectangle_media: Extended; virtual;

       //Функции вывода информации в компонент TChart

       procedure Redraw(); virtual;

       procedure draw_f; virtual;

       procedure draw_trapezium; virtual;

       procedure draw_rectangle_left; virtual;

       procedure draw_rectangle_right; virtual;

       procedure draw_rectangle_media; virtual;

    end;

implementation

constructor TIntegral.Create();

begin

 inherited Create();

 FValueMax:=1;

 FValueMin:=0;

 FValueH:=0.1;

 FAutoRedraw:=true;

 FF:=fDefault;

 N:=10;

end;

destructor TIntegral.Destroy;

begin

 inherited Destroy;

end;

procedure TIntegral.SetN(newN: integer);

begin

 FValueN:=newN;

 if FValueN<1 then

   FValueN:=1;

 FValueH:=(FValueMax-FValueMin)/FValueN;

 if Assigned(FOnNChanged) then

   FOnNChanged(FValueN);

 if Assigned(FOnHChanged) then

   FOnHChanged(FValueH);

 if (AutoRedraw) then

   Redraw();

 ReCalc();

end;

procedure TIntegral.SetH(newH: Extended);

begin

 FValueN:=round((FValueMax-FValueMin)/newH)+1;

 FValueH:=(FValueMax-FValueMin)/FValueN;

 if Assigned(FOnNChanged) then

   FOnNChanged(FValueN);

 if Assigned(FOnHChanged) then

   FOnHChanged(FValueH);

 if (AutoRedraw) then

   Redraw();

 ReCalc();

end;

procedure TIntegral.SetMin(newMin: Extended);

begin

 FValueMin:=newMin;

 FValueH:=(FValueMax-FValueMin)/FValueN;

 if Assigned(FOnMinChanged) then

   FOnMinChanged(newMin);

 if (AutoRedraw) then

   Redraw();

 ReCalc();

end;

procedure TIntegral.SetMax(newMax: Extended);

begin

 FValueMax:=newMax;

 FValueH:=(FValueMax-FValueMin)/FValueN;

 if Assigned(FOnMaxChanged) then

   FOnMaxChanged(newMax);

 if (AutoRedraw) then

   Redraw();

 ReCalc();

end;

procedure TIntegral.SetChart(newChart: TChart);

begin

 FChart:=newChart;

 if (AutoRedraw) then

   Redraw();

end;

procedure TIntegral.SetCalcMethod(newMethod: byte);

begin

 if (newMethod in [0..3]) then

 begin

   FCalcMethod:=newMethod;

   if (AutoRedraw) then

     Redraw();

   ReCalc();

 end;

end;

procedure TIntegral.SetF(newF: TF);

begin

 if (@newF<>nil) then

 begin

   FF:=newF;

   ReCalc;

   Redraw;

 end;

end;

procedure TIntegral.ReCalc;

begin

   FRes:=0;

   if FValueMin<FValueMax then

   begin

     case FCalcMethod of

     0: FRes:=calc_trapezium();

     1: FRes:=calc_rectangle_left();

     2: FRes:=calc_rectangle_right();

     3: FRes:=calc_rectangle_media();

     end;

   end;

end;

function TIntegral.calc_trapezium: Extended;

var x: extended;

   i: integer;

begin

 Result:=0;

 x:=FValueMin;

 for i:=1 to FValueN do

 begin

   Result:=Result+(f(x)+f(x+FValueH))/2*FValueH;

   x:=x+FValueH;

 end;

end;

function TIntegral.calc_rectangle_left:Extended;

var i:integer;

   x:extended;

begin

 Result:=0;

 x:=FValueMin;

 for i:=1 to n do

   begin

     Result:=Result+FValueH*f(x);

     x:=x+FValueH;

   end;

end;

function TIntegral.calc_rectangle_right:Extended;

var i:integer;

   x:extended;

begin

 Result:=0;

 x:=FValueMin;

 for i:=1 to n do

   begin

     Result:=Result+FValueH*f(x+FValueH);

     x:=x+FValueH;

   end;

end;

function TIntegral.calc_rectangle_media:Extended;

var i:integer;

   x:extended;

begin

 Result:=0;

 x:=FValueMin;

 for i:=1 to n do

   begin

     Result:=Result+FValueH*f(x+FValueH/2);

     x:=x+FValueH;

   end;

end;

procedure TIntegral.Redraw;

begin

 if (Assigned(FChart) and (FValueMin<FValueMax)) then

 begin

   draw_f;

   case FCalcMethod of

   0: draw_trapezium();

   1: draw_rectangle_left();

   2: draw_rectangle_right();

   3: draw_rectangle_media();

   end;

 end

 else if Assigned(FChart) then

 begin

   Chart.Series[0].Clear;

   Chart.Series[1].Clear;

   Chart.LeftAxis.Maximum:=0;

 end;

end;

procedure TIntegral.draw_f;

var rightRange, x, h1: extended;

begin

 if Assigned(FChart) then

 begin

   FChart.Series[1].Clear;

   rightRange:=FValueMax+(FValueMax-FValueMin)*0.1;

   x:=FValueMin-(FValueMax-FValueMin)*0.1;

   h1:=(rightRange-x)/50;

   rightRange:=rightRange+h1;

   while x<=rightRange do

   begin

     FChart.Series[1].AddXY(x, f(x));

     x:=x+h1;

   end;

   Chart.LeftAxis.Maximum:=f(x)*1.05;

 end;

end;

procedure TIntegral.draw_trapezium;

var x: extended;

   i: integer;

begin

 if Assigned(FChart) then

 begin

   draw_f;

   FChart.Series[0].Clear;

   x:=FValueMin;

   for i:=0 to FValueN do

   begin

     FChart.Series[0].AddXY(x, f(x));

     x:=x+FValueH;

   end;

 end;

end;

procedure TIntegral.draw_rectangle_left;

var x: extended;

   i: integer;

begin

 if Assigned(FChart) then

 begin

   draw_f;

   FChart.Series[0].Clear;

   x:=FValueMin;

   for i:=1 to FValueN do

   begin

     FChart.Series[0].AddXY(x, f(x));

     FChart.Series[0].AddXY(x+FValueH, f(x));

     x:=x+FValueH;

   end;

 end;

end;

procedure TIntegral.draw_rectangle_right;

var x: extended;

   i: integer;

begin

 if Assigned(FChart) then

 begin

   draw_f;

   FChart.Series[0].Clear;

   x:=FValueMin;

   for i:=1 to FValueN do

   begin

     FChart.Series[0].AddXY(x, f(x+FValueH));

     FChart.Series[0].AddXY(x+FValueH, f(x+FValueH));

     x:=x+FValueH;

   end;

 end;

end;

procedure TIntegral.draw_rectangle_media;

var x: extended;

   i: integer;

begin

 if Assigned(Chart) then

 begin

   draw_f;

   FChart.Series[0].Clear;

   x:=FValueMin;

   for i:=1 to FValueN do

   begin

     Chart.Series[0].AddXY(x, f(x+FValueH/2));

     Chart.Series[0].AddXY(x+FValueH, f(x+FValueH/2));

     x:=x+FValueH;

   end;

 end;

end;

function TIntegral.fDefault(x: extended): extended;

begin

 Result:=Exp(sqr(x));

end;

end.

Результаты работы программы:

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


 

А также другие работы, которые могут Вас заинтересовать

38196. Засновники геополітики 203.5 KB
  Поняття глобального було введено в науковий обіг у другій половині XX століття американським науковцем Т.Левіттом, який охарактеризував ним феномен злиття ринків окремої продукції як нову тенденцію розвитку світової економіки; згодом це явище було інтерпретоване деякими домінуючими світовими силами в дусі ідеології обєднання світу в єдину економічну,
38198. Воєнна політологія як наука 134.5 KB
  Воєнна політика – частина загальної політики певних соціальних сил і спеціально створених ними інститутів влади, що спрямована на підготовку і використання (навмисне або змушене, військове або невійськове) засобів збройного насильства для досягнення тих або інших класових, національних або загальнолюдських інтересів, мети; для ведення війни або протидії.
38199. Аерократія та ефірократія 36.03 KB
  Мондіалістські центри мали своїх кореспондентів і в Москві. Ключовою постаттю був академік Гвішіані, директор Інституту Системних Досліджень, який був чимось подібним до філіалу “Трілатераля”
38200. Міграційні процеси і екологічний імператив як фактор світової політики 27.04 KB
  З врахуванням триваючої тенденції до росту чисельності населення можна припустити можливість своєрідного демографічного «перевантаження» нашої планети...
38201. Конфлікти та війни сучасності 55.19 KB
  Терміном «Близькосхідний конфлікт» (конфлікт на Близькому Сході) позначається серія міжнародних конфліктів, що протікають із 1940-х років в цьому регіоні. В цих конфліктах брали та досі беруть участь численні арабські держави, Ізраїль, Іран, Туреччина, зовнішні актори – США, СРСР, Росія, ЄС, міжнародні організації. Важливість Близькосхідного конфлікту завжди обумовлюється стратегічним значенням регіону – на Близький Схід
38202. Структура воєнної політики сучасної України 30.84 KB
  Сьогодні українсько-російські відносини перебувають у досить складному, якщо не сказати критичному стані, про що свідчать оцінки експертів (і з російського, і з українського боку). Останнім часом спостерігалося зростання конфліктності в багатьох сферах співробітництва
38204. Актуальні проблеми воєнної політології 108.5 KB
  За такого підходу до предмета â€œВійськової політологіїâ€ відносять військові аспекти окремих галузей знань: філософії політики політичної історії політичної соціології та економіки та ін. Звідси “військову політологію†пропонують вважати не самостійною наукою а комплексною науковою дисципліною на зразок теорії безпеки окремі галузі якої відповідали б різновидам військової політики; 3 третя група політологів зазначає що â€œВійськова політологія†має свій специфічний предмет. Їхня думка зводиться до того що...