老师让我门编一个用接口和继承的知识编一个程序用来求一般三角形,等要三角形,等边三角形,矩形,正方形的面积和周厂,圆住的体积,用接口和类来做,还有处理异常,比如三角形的三条边问题
我写了一个下午,还有错,找书要么是没有,要么是太少关于着方面的知识,所以请大家帮忙,我的思路对不对,老师要用接口因为有的有面积有的图形有体积。我的程序有错?也帮我改易下??
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.
我写了一个下午,还有错,找书要么是没有,要么是太少关于着方面的知识,所以请大家帮忙,我的思路对不对,老师要用接口因为有的有面积有的图形有体积。我的程序有错?也帮我改易下??
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.
使用面向对象的相关思想和技术,设计并实现一个类层次的体系结构,将矩形,正方形,三角形,等腰三角形,正三角形,圆形,立方体,正方体,圆柱体,球体等等图形包括在其中,并能计算周长、面积。
下面是我今天又花了一个上午的时间写的,运行是可以的,但不知我的面向对象的方法对不对,或者说思路,大家只要在窗体上放几个按钮就能运行我的程序。接口我不会用,异常也不会,大家帮我添一下。大家帮帮我,指出不规范的地方,或者根本就是错误的地方。
下面是我新改的程序。
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;
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.
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;
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.