今天去面试,碰到如上面试题,求解!
小弟已经写了一部分了(如下),直角三角形类里面怎么更好的继承,并且加上是直角三角形的判断.
1 public class Triangel 2 { 3 public double a; 4 public double b; 5 public double c; 6 public Triangel(double a, double b, double c) 7 { 8 Boolean result1 = a > 0 && b > 0 && c > 0; 9 Boolean result2 = a + b > c && a + c > b && b + c > a; 10 Boolean result3 = Math.Abs(a - b) < c && Math.Abs(a - c) < b && 11 Math.Abs(b - c) < a; 12 if (result1 && result2 && result3) 13 { 14 this.a = a; 15 this.b = b; 16 this.c = c; 17 } 18 else 19 { 20 throw new Exception("构造三角形的参数非法~!"); 21 } 22 } 23 24 public double GetZhouchang() 25 { 26 return a + b + c; 27 } 28 } 29 30 public class RightAngelTrigel : Triangel 31 { 32 public RightAngelTrigel(double a, double b, double c) 33 : base(a, b, c)//基类不包含零个参数的构造函数. 34 { 35 } 36 public double GetMianji() 37 { 38 double max = GetMax(a, b, c); 39 if (max == a) 40 { 41 return b * c / 2; 42 } 43 else if (max == b) 44 { 45 return a * c / 2; 46 } 47 else 48 { 49 return a * b / 2; 50 } 51 } 52 53 public double GetMax(double a, double b, double c) 54 { 55 double max = 0; 56 if (a > max) 57 { 58 max = a; 59 } 60 if (b > max) 61 { 62 max = b; 63 } 64 if (c > max) 65 { 66 max = c; 67 } 68 return max; 69 } 70 71 }
先贴我的写法:
class Triangle { public Triangle(decimal a, decimal b, decimal c) { SortedEdges = new[] { a, b, c }; Array.Sort(SortedEdges); if (SortedEdges[0] <= 0 || SortedEdges[0] + SortedEdges[1] <= SortedEdges[2]) { throw new ArgumentException("invalid edge length for a triangle"); } } public decimal[] SortedEdges { get; private set; } public decimal GetPerimeter() { return SortedEdges.Sum(); } } class RightAngledTriangle : Triangle { public RightAngledTriangle(decimal a, decimal b, decimal c) : base(a, b, c) { if (SortedEdges[0] * SortedEdges[0] + SortedEdges[1] * SortedEdges[1] != SortedEdges[2] * SortedEdges[2]) { throw new ArgumentException("invalid edge length for a triangle"); } } public decimal GetArea() { return 0.5m * SortedEdges[0] * SortedEdges[1]; } }
最大的改动就是我先对3条边的长度做了排序,你可以发现排序之后原本复杂的逻辑变的很简单,例如:
(1)只要检查最短的边是否大于0
(2)只要检查是否2条较短边相加大于最长边
(3)判断直角三角形时很容易知道哪2条是直角边
另外,我用了decimal而不是double,原因是double在这里更容易因为浮点数问题带来困扰(具体浮点数原理自行google)。另外要说的是,面积和周长这种,最好写成属性,而不是一个GetXXX方法。我这里写成方法是因为题目明确要求写成方法(虽然很怀疑出题的人是随手写的压根没考虑这么多)。还有就是一些细节:当参数不正确时抛出ArgumentException而不是粗略的Exception,以及英文拼写等等细节。
public class Triangel { protected double a { get; set; } protected double b { get; set; } protected double c { get; set; } public Triangel(double a, double b, double c) { 验证三角形... } public double GetZhouchang() { return a + b + c; } public virtual double GetMianji()//virtual 关键 { ... } } public class RightAngelTrigel : Triangel { public RightAngelTrigel(double a, double b): base(a,b,Math.Sqrt(Math.Pow(a,2)+Math.Pow(b,2)))//关键 { } public override double GetMianji() { return a * b / 2;//关键 } }
楼上的都能实现