这是我的程序...我需要帮助我如何使用函数CalkaNadmiar for 2:in(case rgMetoda.ItemIndex of)和function CalkaNiedomiar for 3:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
type
fx= function(x:extended):extended;
TForm1 = class(TForm)
Naglowek: TLabel;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
edPrzedzialy: TEdit;
edOd: TEdit;
edDo: TEdit;
pnWynik: TPanel;
Oblicz: TButton;
rgMetoda: TRadioGroup;
rb1: TRadioButton;
rb2: TRadioButton;
rb3: TRadioButton;
function f1(X: Extended): Extended;
function f2(X: Extended): Extended;
function f3(X: Extended): Extended;
procedure ObliczClick(Sender: TObject);
procedure edPrzedzialyExit(Sender: TObject);
procedure edOdExit(Sender: TObject);
procedure edDoExit(Sender: TObject);
private
function CalkaNadmiar (odx,dox:extended; n:integer; f:fx):extended;
function CalkaNiedomiar (odx,dox:extended; n:integer; f:fx):extended;
function Calka (odx,dox:extended; n:integer; f:fx):extended;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
function TForm1.f1(x: Extended): Extended;
begin
Result:=sqr(x)+ 2;
end;
function TForm1.f2(X: Extended): Extended;
begin
Result:=3*x - 8;
end;
function TForm1.f3(X: Extended): Extended;
begin
Result:=sin(x) + Pi;
end;
procedure TForm1.ObliczClick(Sender: TObject);
var Wynik, h, xi: real;
i,n: word;
//h - krok całkowania
// Wynik - chwilowy lub końcowy wynik danej funkcji
//xi - x dla kolejnego kroku całkowania
//n - liczba przedziałów
//i - obsluga pętli
begin
n:=StrToInt(edPrzedzialy.Text);
h:=(StrToFloat(edDo.Text)-StrToFloat(edOd.Text))/n;
Wynik:=0;
case rgMetoda.ItemIndex of
0: begin //obsługa metody prostok±tów z nadmiarem
if rb1.Checked then
begin
for i:=0 to n-1 do
begin
xi:=StrToFloat(edOd.Text)+i*h;
Wynik:= Wynik + f1(xi)*h;
end;
pnWynik.Caption:= FloatToStr(Wynik);
end;
if rb2.Checked then
begin
for i:=0 to n-1 do
begin
xi:=StrToFloat(edOd.Text)+i*h;
Wynik:= Wynik + f2(xi)*h;
end;
pnWynik.Caption:= FloatToStr(Wynik);
end;
if rb3.Checked then
begin
for i:=0 to n-1 do
begin
xi:=StrToFloat(edOd.Text)+i*h;
Wynik:= Wynik + f3(xi)*h;
end;
pnWynik.Caption:=FloatToStr(Wynik);
end;
end;
1: begin //obsługa metody prostok±tów z niedomiarem
if rb1.Checked then
begin
for i:=1 to n do
begin
xi:= StrToFloat(edOd.Text) + i*h;
Wynik:= Wynik + f1(xi)*h;
end;
pnWynik.Caption := FloatToStr(Wynik);
end;
if rb2.Checked then
begin
for i:=1 to n do
begin
xi:=StrToFloat(edOd.Text) + i*h;
Wynik:= Wynik + f2(xi)*h;
end;
pnWynik.Caption:=FloatToStr(Wynik);
end;
if rb3.Checked then
begin
for i:=0 to n-1 do
begin
xi:=StrToFloat(edOd.Text)+i*h;
Wynik:= Wynik + f3(xi)*h;
end;
pnWynik.Caption:=FloatToStr(Wynik);
end;
end;
end;
end;
procedure TForm1.edPrzedzialyExit(Sender: TObject);
begin
if (StrToFloat(edPrzedzialy.Text)<10000) or
(StrToFloat(edPrzedzialy.Text)>100000000)
then
begin
showmessage('Podaj liczbę z przedziału [10000 - 100000000].');
edPrzedzialy.SetFocus;
end;
if Frac(StrToFloat(edPrzedzialy.Text))<>0 then
{sprawdzamy czy została wprowadzona liczba całkowita}
begin
showmessage('Podaj liczbę całkowitą.');
edPrzedzialy.SetFocus;
end;
end;
procedure TForm1.edOdExit(Sender: TObject);
begin
if StrToFloat(edOd.Text)>=StrToFloat(edDo.Text) then
begin
showmessage('Podaj liczbę mniejsz± niż górna granica całkowania.');
edOd.SetFocus;
end;
end;
procedure TForm1.edDoExit(Sender: TObject);
begin
if StrToFloat(edDo.Text)<=StrToFloat(edOd.Text) then
begin
showmessage('Podaj liczbę większą niż dolna granica całkowania.');
edDo.SetFocus;
end;
end;
function TForm1.CalkaNadmiar (odx,dox:extended; n:integer; f:fx):extended; //trapez z nadmiarem
var i:integer; xi,h,Wynik:extended;
begin
Wynik:=0;
h:=(Dox-Odx)/n;
for i:= 0 to n-1 do
begin
Wynik:=f(xi)*h+Wynik;
xi:=xi+h;
end;
Result:=Wynik;
end;
function TForm1.CalkaNiedomiar (odx,dox:extended; n:integer; f:fx):extended; //trapez z niedomiarem
var i:integer; xi,h,Wynik:extended;
begin
Wynik:=0;
h:=(Dox-Odx)/n;
for i:= 1 to n do
begin
Wynik:=f(xi)*h+Wynik;
xi:=xi+h;
end;
Result:=Wynik;
end;
function TForm1.Calka (odx,dox:extended; n:integer; f:fx):extended; //trapez
var i:integer; xi,h,Wynik:extended;
begin
Wynik:=0;
h:=(Dox-Odx)/n;
for i:= 1 to n-1 do
begin
Wynik:=f(xi)+Wynik;
xi:=xi+h;
end;
Wynik:=(f(odx) + f(dox) + Wynik)*h/2;
Result:=Wynik;
end;
end.
答案 0 :(得分:3)
我认为这会对你有所帮助
case ( rgMetoda.ItemIndex ) of
2 : begin CalkaNadmiar; end;
3 : begin CalkaNiedomiar; end;
else begin
//Call other function
end;
end;
答案 1 :(得分:1)
程序类型 TFx 的类型定义与对象的方法不兼容,包括 TForm 。
type
TFx = function(a: extended): extended;
TMx = function(a: extended): extended of object;
TFx 与第一类函数兼容,即在单元级别声明的函数,而不是类的成员/方法。
TMx 与成员方法兼容(即“ of object ”在声明中的含义。
TFx 和 TMx 不兼容类型,因为 TFx 是指向函数的指针, TMx < / strong>实际上是 TWO 指针:指向类方法的指针 AND 指向该类的特定实例的指针。
有了这些信息,我认为你应该能够看到你可能会追求的是什么(为了简洁,只显示与你的代码有显着差异):
type
TFx = function(x: extended): extended of object;
procedure TForm1.ObliczClick(Sender: TObject);
var
Wynik, h, xi: real;
i,n: word;
fn: TFx;
begin
n:=StrToInt(edPrzedzialy.Text);
h:=(StrToFloat(edDo.Text)-StrToFloat(edOd.Text))/n;
Wynik:=0;
if rb1.Checked then fn := f1
else if rb2.Checked then fn := f2
else if rb3.Checked then fn := f3;
for i:=0 to n-1 do
begin
xi:=StrToFloat(edOd.Text)+i*h;
Wynik:= Wynik + fn(xi)*h;
end;
pnWynik.Caption:= FloatToStr(Wynik);
..
end;
或者,因为您的 f1 , f2 和 f3 函数实际上不需要是 TForm (他们不使用任何实例数据)您可以保留 TFx 声明,只需移动 f1 , f2 和<在类之外的strong> f3 ,只需将它们声明为单元实现部分中的第一类函数:
另请注意,在任何一种情况下,实现部分之外都不需要 TFx 类型本身(基于您发布的代码,在更广泛的上下文中可能不是这种情况) ):
实施
type
TFx = function(x: extended): extended of object;
function f1(x: Extended): Extended;
begin
result:=sqr(x)+ 2;
end;
function f2(X: Extended): Extended;
begin
result:=3*x - 8;
end;
function f3(X: Extended): Extended;
begin
result:=sin(x) + Pi;
end;
procedure TForm1.ObliczClick(Sender: TObject);
var
Wynik, h, xi: real;
i,n: word;
fn: TFx;
begin
n:=StrToInt(edPrzedzialy.Text);
h:=(StrToFloat(edDo.Text)-StrToFloat(edOd.Text))/n;
Wynik:=0;
if rb1.Checked then fn := f1
else if rb2.Checked then fn := f2
else if rb3.Checked then fn := f3;
for i:=0 to n-1 do
begin
xi:=StrToFloat(edOd.Text)+i*h;
Wynik:= Wynik + fn(xi)*h;
end;
pnWynik.Caption:= FloatToStr(Wynik);
..
end;