2011-02-09 54 views
1

这是我的计划。我需要帮助,我怎么可以使用功能CalkaNadmiar 2:在(时rgMetoda.ItemIndex)和3个功能CalkaNiedomiar:case..of与功能

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

这是什么编程语言?帕斯卡?德尔福? Modula 2?标签将是好的... – 2011-02-09 13:49:01

回答

3

我认为这将有助于你的程序类型的

case (rgMetoda.ItemIndex) of 
    2 : begin CalkaNadmiar; end; 

    3 : begin CalkaNiedomiar; end; 

    else begin    
    //Call other function 
    end; 
end; 
1

你的类型定义位TFx是与对象的方法,包括TForm的不兼容。

type 
    TFx = function(a: extended): extended; 
    TMx = function(a: extended): extended of object; 

位TFx是与第一类函数兼容的,即在单元级别声明,而不是作为一类的成员/方法的功能。

的TMx与成员方法兼容(这就是“对象的”的声明意味着。

位TFx的TMx是不兼容的类型,因为同时一个位TFx是一个指向函数的指针,一个指针指向一个函数,一个指针指向一个函数,一个指针指向一个特定的指针这个阶级的勇气。

有了这些信息,我想你应该能够看到,你可能以后是一样的东西(从您的代码只显示显著差异,为了简洁):

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; 

或者,因为你的F1F2F3功能实际上并不需要成为成员方法TForm的(他们并不使用任何实例数据的),你可以离开位TFx声明,因为它是和只需移动F1F2F3类的外部,并且简单地声明它们作为单元实现部分第一类函数:

还要注意,在两种情况下,位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;