2011-02-09 52 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;