老师让我门编一个用接口和继承的知识编一个程序用来求一般三角形,等要三角形,等边三角形,矩形,正方形的面积和周厂,圆住的体积,用接口和类来做,还有处理异常,比如三角形的三条边问题
我写了一个下午,还有错,找书要么是没有,要么是太少关于着方面的知识,所以请大家帮忙,我的思路对不对,老师要用接口因为有的有面积有的图形有体积。我的程序有错?也帮我改易下??
unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Button2: TButton;
    Button3: TButton;
    Edit4: TEdit;
    Edit5: TEdit;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
  type I1=interface
  //['{'GUID'}']
  function getArea:Double;
  function getPerimiter:Integer;
  end;
  type I2=interface
  function getVolume:Double;
  end;  type TRectangleShape=class(Tobject)
  function getArea(i, j, k: Double):Double;virtual;abstract;
  function getPerimiter(i, j, k: Double):Double;virtual;abstract;
  end;
type TSanjiao=class(TRectangleShape)
  a:Double;
  b:Double;
  c:Double;
  constructor create(i, j, k: Double);
  function getArea(i, j, k: Double):double;override;
  function getPerimiter(i, j, k: Double):Double;override;
end;
type
    TRectangle=class(TRectangleShape)
    width:Double;
    height:Double;
    constructor create(i,j: Double);
    function getArea(i, j: Double):Double;override;
    function getPerimiter(i, j: Double):Double;override;
 end;
var
  Form1: TForm1;implementation
 uses QDialogs;
{$R *.dfm}{ TRectangleShape }
{ TSanjiao }constructor TSanjiao.create(i, j, k: Double);
  begin
  a:=i;
  b:=j;
  c:=k;
  end;
function TSanjiao.getArea(i, j, k: Double):Double;
var
s:Double;
begin
s:=(1/2)*(a+b+c);
getArea:=sqrt(s*(s-a)*(s-b)*(s-c));
end;function TSanjiao.getPerimiter(i, j, k: Double): Double;
var
s:Double;
begin
getPerimiter:=a+b+c;
end;procedure TForm1.Button1Click(Sender: TObject);
var
Sanjiao:TSanjiao ;
s:double;
t:double;
k:Double;
begin
Sanjiao:=TSanjiao.create(strtoFloat(Edit1.text),strtoFloat(edit2.Text),strtoFloat(Edit3.Text));
t:=Sanjiao.getArea(strtoFloat(Edit1.text),strtoFloat(edit2.Text),strtoFloat(Edit3.Text));
k:=Sanjiao.getPerimiter(strtoFloat(Edit1.text),strtoFloat(edit2.Text),strtoFloat(Edit3.Text));
ShowMessage(FloattoStr(t)+'     '+FloattoStr(k));
end;procedure TForm1.Button2Click(Sender: TObject);
var
Dengbian:TSanjiao ;
s:double;
t:double;
k:Double;
begin
Dengbian:=TSanjiao.create(strtoFloat(Edit1.text),strtoFloat(edit2.Text),strtoFloat(Edit3.Text));
t:=Dengbian.getArea(strtoFloat(Edit1.text),strtoFloat(edit2.Text),strtoFloat(Edit3.Text));
k:=Dengbian.getPerimiter(strtoFloat(Edit1.text),strtoFloat(edit2.Text),strtoFloat(Edit3.Text));
ShowMessage(FloattoStr(t)+'     '+FloattoStr(k));
end;
{ TRectangle }constructor TRectangle.create(i, j: Double);
begin
width:=i;
height:=j;
end;function TRectangle.getArea(i, j: Double): double;
begin
 getArea:=i*j;
end;function TRectangle.getPerimiter(i, j: Double): Double;
begin
getPerimiter:=2*(i+j);
end;procedure TForm1.Button3Click(Sender: TObject);
var
CommonRectangle:TRectangle;
s:Double;
t:Double;
begin
CommonRectangle:=TRectangle.create(strtoFloat(Edit4.text),strtoFloat(edit5.Text));
s:=CommonRectangle.getArea(strtoFloat(Edit4.text),strtoFloat(edit5.Text));
t:=CommonRectangle.getPerimiter(strtoFloat(Edit4.text),strtoFloat(edit5.Text));
end;end.

解决方案 »

  1.   

    老师的完整题目是:
    使用面向对象的相关思想和技术,设计并实现一个类层次的体系结构,将矩形,正方形,三角形,等腰三角形,正三角形,圆形,立方体,正方体,圆柱体,球体等等图形包括在其中,并能计算周长、面积。
    下面是我今天又花了一个上午的时间写的,运行是可以的,但不知我的面向对象的方法对不对,或者说思路,大家只要在窗体上放几个按钮就能运行我的程序。接口我不会用,异常也不会,大家帮我添一下。大家帮帮我,指出不规范的地方,或者根本就是错误的地方。
    下面是我新改的程序。
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        Button2: TButton;
        Button3: TButton;
        Button4: TButton;
        Button5: TButton;
        Button6: TButton;
        Button7: TButton;
        Button8: TButton;
        Button9: TButton;
        Button10: TButton;
        Button11: TButton;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure Button3Click(Sender: TObject);
        procedure Button4Click(Sender: TObject);
        procedure Button5Click(Sender: TObject);
        procedure Button6Click(Sender: TObject);
        procedure Button7Click(Sender: TObject);
        procedure Button8Click(Sender: TObject);
        procedure Button9Click(Sender: TObject);
        procedure Button10Click(Sender: TObject);
        procedure Button11Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
      type I1=interface
      //['{'GUID'}']
      function getArea:Double;
      function getPerimiter:Integer;
      end;
      type I2=interface
      function getVolume:Double;
      end;  type TRectangleShape=class(Tobject)           //二维图形抽象类
      function getArea:Double;virtual;abstract;
      function getPerimiter:Double;virtual;abstract;
      end;
    type TSanjiao=class(TRectangleShape)           //三角形类
      a:Double;
      b:Double;
      c:Double;
      constructor create(i, j, k: Double);
      function getArea(i, j, k: Double):double;overload;
      function getPerimiter(i, j, k: Double):Double;overload;
    end;
    type
        TRectangle=class(TRectangleShape)     //矩形类
        width:Double;
        height:Double;
        constructor create(i,j: Double);
        function getArea(i, j: Double):Double;overload;
        function getPerimiter(i, j: Double):Double;overload;
     end; TCircle=class(TRectangleShape)                                //circle类
     R:Double;
      constructor create(Radius:Double);
      function getArea(Radius: Double):Double;overload;
      function getPerimiter(Radius: Double):Double;overload;
      end;  Type TThree_Demo=class                                            // 三维物体抽象类
      function getVolume:Double;virtual;abstract;
      end;  type  TBox=class(TThree_Demo)
      width,height,length:double;                                      //立方体类
      constructor create(i,j,k:double);
      function getVolume(i,j,k:double):Double;overload;
      end;  type
      TCylinder=class(TThree_Demo)                              //圆柱类
      R,Height:double;
      constructor create(i,j:double);
      function getVolume(i,j:double):Double;overload;
      end;
      type
      TSphere=class(TThree_Demo)         //球体类
      R:double;
      constructor create(i:double);
      function getVolume(i:double):Double;overload;
      end;  var
      Form1: TForm1;implementation
     uses QDialogs;
    {$R *.dfm}{ TRectangleShape }
    { TSanjiao }constructor TSanjiao.create(i, j, k: Double);
      begin
      a:=i;
      b:=j;
      c:=k;
      end;
    function TSanjiao.getArea(i, j, k: Double):Double;
    var
    s:Double;
    begin
    s:=(1/2)*(a+b+c);
    getArea:=sqrt(s*(s-a)*(s-b)*(s-c));
    end;function TSanjiao.getPerimiter(i, j, k: Double): Double;
    begin
    getPerimiter:=a+b+c;
    end;procedure TForm1.Button1Click(Sender: TObject);           //一般三角形
    var
    Sanjiao:TSanjiao ;
    t:double;
    k:Double;
    m,n,l:double;
    begin
    m:=InputBox('输入框','请输入边长a',1.0);
    n:=InputBox('输入框','请输入边长b',2.0);
    l:=InputBox('输入框','请输入边长c',3.0);
    Sanjiao:=TSanjiao.create(m,n,l);
    t:=Sanjiao.getArea(m,n,l);
    k:=Sanjiao.getPerimiter(m,n,l);
    ShowMessage('面积为'+FloattoStr(t)+'周长为'+#13+#10+FloattoStr(k));
    end;procedure TForm1.Button2Click(Sender: TObject);
    var
    Dengbian:TSanjiao ;            //等边三角形
    s:double;
    t:double;
    k:Double;
    m:double;
    begin
    m:=InputBox('输入框','请输入等边三角形的边长',1.0);
    Dengbian:=TSanjiao.create(m,m,m);
    t:=Dengbian.getArea(m,m,m);
    k:=Dengbian.getPerimiter(m,m,m);
    ShowMessage('面积为'+FloattoStr(t)+'周长为'+#13+#10+FloattoStr(k));
    end;
      

  2.   

    接着上面
    procedure TForm1.Button6Click(Sender: TObject);
    var                                                              //等腰三角形
    Dengyao:TSanjiao;
    area,perimeter,s,t:Double;
    begin
    s:=InputBox('输入框','请输入等腰三角形的腰',1.0);
    t:= InputBox('输入框','请输入等腰三角形的底',1.0);
    Dengyao:=TSanjiao.create(s,s,t);
    area:=Dengyao.getArea(s,s,t);
    perimeter:=Dengyao.getPerimiter(s,s,t);
    ShowMessage('面积为'+FloatToStr(area)+#13+#10+'周长为'+FloatToStr(perimeter));
    end;
    constructor TRectangle.create(i, j: Double);
    begin
    width:=i;
    height:=j;
    end;function TRectangle.getArea(i, j: Double): double;       //矩形面积
    begin
     getArea:=i*j;
    end;function TRectangle.getPerimiter(i, j: Double): Double;      //矩形周长
    begin
    getPerimiter:=2*(i+j);
    end;procedure TForm1.Button3Click(Sender: TObject);
    var
    CommonRectangle:TRectangle;
    s:Double;
    t:Double;
    m,n:Double;
    begin
    m:=InPutbox('输入框','请输入矩形边长a',1.0);
    n:=InPutbox('输入框','请输入矩形边长b',1.0);
    CommonRectangle:=TRectangle.create(m,n);   //一般矩形
    s:=CommonRectangle.getArea(m,n);
    t:=CommonRectangle.getPerimiter(m,n);
    ShowMessage('面积为'+FloattoStr(s)+'周长为'+#13+#10+FloattoStr(t));
    end;procedure TForm1.Button4Click(Sender: TObject);
    var
    ZhengRectangle:TRectangle; //正方形
    s,t,m:Double;
    begin
     s:=InputBox('输入框','请输入正方形边长a',2.0);
     ZhengRectangle:=Trectangle.create(s,s);
     t:=ZhengRectangle.getArea(s,s);
     m:=ZHengRectangle.getPerimiter(s,s);
     ShowMessage('面积为'+FloatToStr(t)+#13+#10+'周长为'+FloatToStr(m));end;{ TCircle }constructor TCircle.create(Radius:Double);
    begin                                         //circle类的构造函数
    R:=Radius;
    end;function TCircle.getArea(Radius: Double): Double;
    begin                                                       // circle类面积的方法
     getArea:=Radius*Radius;
    end;function TCircle.getPerimiter(Radius: Double): Double;
    begin                                                              // circle类周长的方法
    getPerimiter:=2*Pi*Radius;
    end;procedure TForm1.Button5Click(Sender: TObject);
    var Circle:TCircle;
    s,area,perimiter:Double;
    begin
    s:=InputBox('输入框','请输入圆半径',1.0);
    Circle:=TCircle.create(s);
    area:=Circle.getArea(s);
    perimiter:=Circle.getPerimiter(s);
    ShowMessage('面积为'+FloatToStr(area)+#13+#10+'周长为'+FloatToStr(perimiter));
    end;
    { TBox }constructor TBox.create(i, j, k: double);
    begin
    length:=i;
    width:=j;
    height:=k;
    end;function TBox.getVolume(i, j, k: double): Double;
    begin
    getVolume:=i*j*k;
    end;procedure TForm1.Button7Click(Sender: TObject);   //一般立方体
    var Box:TBox;
    volume:Double;
    m,n,l:double;
    begin
    m:=InputBox('输入框','请输入立方体的边长a',1.0);
    n:=InputBox('输入框','请输入立方体的边长b',1.0);
    l:=InputBox('输入框','请输入立方体的边长c',1.0);
    Box:=TBox.create(m,n,l);
    volume:=Box.getVolume(m,n,l);
    ShowMessage('体积为'+FloatToStr(volume));
    end;procedure TForm1.Button8Click(Sender: TObject);
    var
    ZhengBox:TBox;
    volume,m:Double;
    begin
    m:=InputBox('输入框','请输入正方体的边长',1.0);
    ZhengBox:=TBox.create(m,m,m);
    volume:=ZhengBox.getVolume(m,m,m);
    ShowMessage('体积为'+FloatToStr(volume));end;{ TCylinder }constructor TCylinder.create(i, j: double);
    begin
    R:=i;
    height:=j;
    end;function TCylinder.getVolume(i, j: double): Double;
    begin
    getVolume:=pi*R*R*height;
    end;procedure TForm1.Button9Click(Sender: TObject);
    var Cylinder:TCylinder;
    m,n,l:double;
    begin
    m:=InputBox('输入框','请输入圆柱的半径',1.0);
    n:=InputBox('输入框','请输入圆柱的高',1.0);
    Cylinder:=TCylinder.create(m,n);
    l:=Cylinder.getVolume(m,n);
    ShowMessage('体积为'+FloatToStr(l));
    end;{ TSphere }constructor TSphere.create(i: double);
    begin
    R:=i;
    end;function TSphere.getVolume(i: double): Double;
    begin
    getVolume:=(3/4)*Pi*R*R*R;
    end;procedure TForm1.Button10Click(Sender: TObject);
    var
    sphere:TSphere;
    m:Double;
    volume:Double;
    begin
    m:=InputBox('输入框','请输入球体的半径',1.0);
    sphere:=Tsphere.create(m);
    volume:=sphere.getVolume(m);
    ShowMessage('体积为'+FloatToStr(volume));
    end;procedure TForm1.Button11Click(Sender: TObject);
    begin
    close;
    end;end.
      

  3.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      //图形接口
      IShape = interface
      ['{7E404882-23E9-402E-97D9-2B2D9EBBE416}']
        function GetArea:double;
        function GetVolume : double;
        function GetPerimeter : double;
        procedure FreeObject;//释放对象
      end;  //二维图形基类,初象类,不允许实例化
      T2DimeShape = class(TInterfacedObject,IShape)
        public
          function GetArea:double;virtual;abstract;
          function GetPerimeter : double;virtual;abstract;
          procedure FreeObject;
          constructor Destroy;virtual;//释放对象缺省实现.
          //提供对获取体积请求得处理
          function GetVolume:double;
      end;
      //普通三角形
      TAngleShape = class(T2DimeShape)
        private
          Fa,Fb,Fc:double;//边.
        public
          function GetArea : double;override;
          function GetPerimeter : double;override;
          constructor Create;overload;virtual;
          constructor Create(A,b,c:double);overload;virtual;
      end;
      //正三角
      TAngleShape1 = class(TAngleShape)
        public
          constructor Create(A:double);
      end;
      //等腰三角
      TAngleShape2 = class(TAngleShape)
        public
          constructor Create(A,B:double);
      end;
      //矩形
      TRectShape = class(T2DimeShape)
        private
          FWidth : double;
          FLength : double;
        public
          constructor Create(w:double=0;l:double=0);
          function GetArea : double;override;
          function GetPerimeter : double;override;
      end;
      //三维图形基类,初象类,不允许实例化
      T3DimeShape = class(TInterfacedObject,IShape)
        public
          function GetVolume:double;virtual;abstract;
          procedure FreeObject;
          constructor Destroy;virtual;//释放对象缺省实现.      //实现对图形面积、周长计算请求的处理
          function GetArea:double;
          function GetPerimeter :double;
      end;
      //圆柱形
      TCylinder = class(T3DimeShape)
        private
          FRadius : double;//半径
          FHeight : double;//高
        public
          constructor Create(FR:double=0;FH:double=0);
          function GetVolume : double;override;
      end;
      TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
      

  4.   

    var
      Form1: TForm1;implementation{$R *.dfm}{ T3DimeShape }constructor T3DimeShape.Destroy;
    begin
       inherited Destroy;
    end;procedure T3DimeShape.FreeObject;
    begin
       Destroy;
    end;function T3DimeShape.GetArea: double;
    begin
      Raise Exception.Create('三维图形不能计算面积');
    end;function T3DimeShape.GetPerimeter: double;
    begin
      Raise Exception.Create('三维图形不能计算周长');
    end;{ T2DimeShape }constructor T2DimeShape.Destroy;
    begin
      inherited destroy;
    end;procedure T2DimeShape.FreeObject;
    begin
      Destroy;
    end;function T2DimeShape.GetVolume: double;
    begin
      Raise Exception.Create('二维图形不能计算体积');
    end;{ TAngleShape }constructor TAngleShape.Create;
    begin
       Fa := 0;
       Fb := 0;
       Fc := 0;
    end;constructor TAngleShape.Create(A, b, C: double);
    begin
       Fa := a;
       Fb := b;
       Fc := c;
    end;function TAngleShape.GetArea: double;
    var
      s : double;
    begin
       s := (Fa+Fb+Fc) / 2;
       result := Sqrt(s*(s-Fa)*(s-fb)*(s-fc));
    end;function TAngleShape.GetPerimeter: double;
    begin
      Result := Fa+Fb+Fc;
    end;{ TAngleShape1 }constructor TAngleShape1.Create(A: double);
    begin
      inherited Create(a,a,a);
    end;{ TAngleShape2 }constructor TAngleShape2.Create(A, B: double);
    begin
      inherited Create(A,A,B);
    end;{ TRectShape }constructor TRectShape.Create(w, l: double);
    begin
      FWidth := w;
      FLength := l;
    end;function TRectShape.GetArea: double;
    begin
      result :=  FWidth * FLength;
    end;function TRectShape.GetPerimeter: double;
    begin
      result :=  (FWidth +FLength)*2;
    end;{ TCylinder }constructor TCylinder.Create(FR: double; FH: double);
    begin
      FRadius := FR;
      FHeight := FH;
    end;function TCylinder.GetVolume: double;
    begin
      Result :=  PI * FRadius * FRadius * FHeight / 2;
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
      shape : IShape;
    begin
      //三角形
      shape := TAngleShape.Create(10,20,30);
      Showmessage(floattostr(shape.GetPerimeter));
      Showmessage(floattostr(shape.GetArea));
      Shape.FreeObject;
      //矩形
      shape := TRectShape.Create(10,20);
      Showmessage(floattostr(shape.GetPerimeter));
      Showmessage(floattostr(shape.GetArea));
      Shape.FreeObject;
       //矩形
      shape := TCylinder.Create(10,20);
      Showmessage(floattostr(shape.GetVolume));
      //下面的调用会出现异常
      try
        Showmessage(floattostr(shape.GetArea));
      except
        on e : exception do
        begin
          Showmessage(e.Message);
        end;
      end;
      Shape.FreeObject;
    end;
    end.