16214
СОЗДАНИЕ ПРОСТЕЙШЕЙ ПРОГРАММЫ, ПОДДЕРЖИВАЮЩЕЙ ТЕХНОЛОГИЮ ООП
Лабораторная работа
Информатика, кибернетика и программирование
Лабораторная работа №2 Создание простейшей программы поддерживающей технологию ООП Цель лабораторной работы: изучить принципы построения классов. Постановка задачи: Разработать класс вычисления определенного интеграла четырьмя методами левых правых средни...
Русский
2013-06-20
89 KB
9 чел.
Создание простейшей программы, поддерживающей технологию ООП
Цель лабораторной работы: изучить принципы построения классов. Постановка задачи:
Разработать класс вычисления определенного интеграла четырьмя методами (левых, правых, средних прямоугольников и трапеций). В классе предусмотреть методы графического отображения подинтегральной функции на расширенном интервале и геометрического смысла интеграла.
Краткие теоретические сведения:
Классами в 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 для вычисления определенного интеграла четырьмя методами (левых, правых, средних прямоугольников и трапеций). В классе предусмотрены методы графического отображения подынтегральной функции. В процессе выполнения работы были рассмотрены возможности объектно-ориентированного программирования, изучены способы создания полей, методов и свойств классы и способы обращения к ним.
А также другие работы, которые могут Вас заинтересовать | |||
52834. | Конструювання та розвязання економічних задач в середовищі табличного процесору Microsoft Excel | 108.5 KB | |
Раціональність вибору вказаних класів пояснюється тим, що разом з наочно-образним мисленням, що допомагає цілісно бачити обєкти, в учнів у цьому віці активно розвивається асоціативне мислення, сприяюче засвоєнню різних абстрактних понять. | |||
52835. | ЛОКАЛЬНІ ЕКСТРЕМУМИ ФУНКЦІЇ ДВОХ ЗМІННИХ | 182 KB | |
Викладено методику проведення лекційного заняття з використанням інтерактивних форм навчання з теми Локальні екстремуми функції двох змінних Для викладачів вищої математики вищих навчальних закладів 12 рівнів акредитації. 10 Додатки: Додаток А Текст лекції Локальні екстремуми функції двох змінних 18 Додаток Б Приклади задач економічного характеру. Група: БО 27 Тема: Локальні екстремуми функції двох змінних Мета заняття: Методична: показати методику проведення лекції із застосуванням техніки зворотного... | |||
52836. | Графики нагрузок промыленных установок | 243.5 KB | |
Цеховые электрические сети напряжением до 1000 В являются составной частью систем электроснабжения промышленного предприятия и служат для распределения электроэнергии внутри цехов а также для питания некоторых электроприемников расположенных за пределами цеха на территории предприятия. Схема внутрицеховой сети определяется технологическим процессом производства планировкой помещений цеха взаимным расположением источника питания подстанций и приемников электроэнергии их единичной установленной... | |||
52837. | Электричество. Учись быть бережливым | 307 KB | |
Даже страшно подумать об этом Что случилось бы если бы исчез свет Ответы детей. Если б солнечный свет вдруг бы взял и пропал Мир бы сразу угрюмым и темным весь стал Тьма покрыла бы всё на планете Даже звезды с луною не светят. Солнце звезды запомните это Называют естественными источниками света. И без них день бы в ночь превратился навек Разве сможет без света прожить человек А животные птицы растенья цветы. | |||
52840. | Впровадження елементів проектного навчання у роботі з автентичною художньою літературою на уроках англійської мови в старшій школі | 111 KB | |
Маючи вищу педагогічну освіту методичний та педагогічний досвіт роботи з учнями автор ставить завдання пошуку нових ефективних шляхів навчання комунікативної компетенції які б були достатніми для здійснення спілкування у певних комунікативних сферах та розвитку творчої ініціативи здібностей пізнавальних інтересів учнів. Групове та колективне розвязування навчальних завдань стимулює пізнавальну та творчу діяльність учнів. Робота з віршованими текстами формує творчі здібності критичне та логічне мислення сприяє виявленню в... | |||
52841. | Элементы истории математики на уроках в общеобразовательной школе | 299 KB | |
Решением неопределенных уравнений занимались в древности китайцы греки и индийцы. В Арифметике Диофанта приведено много задач решаемых им с помощью неопределенных уравнений разных степеней при этом он допускает в качестве решений любые положительные дробные или целые числа. Из 1 следует неопределенное уравнение первой степени x y=... | |||
52842. | «Літературний елементаль» як метод актуалізації і узагальнення вивченого з української літератури | 36.5 KB | |
Досвід попередніх років показує що навчальні компетенції учнів з української мови відрізняються від компетенцій з української літератури й на жаль не на користь останньої. Специфіка ж тестів ДПА та ЗНО з української літератури передбачає достатньо глибоке знання саме цих особливостей літературних творів що входять до шкільної програми. Саме тому пропоную один з методів роботи на уроках української літератури який допоможе учням безпосередньо перед тестуванням відновити у памяті потрібну інформацію про той чи інший твір літератури. | |||