2017-01-25 4 views
0

Я пытаюсь решить или указать направление в правильном направлении. У меня возникли трудности с определением, где разместить формулу Area в классе треугольников (а не в основном). Область может иметь только «get», а не «set».C# Расчет треугольного типа и расчет площади

Следующая проблема - это идентификация типа треугольника на основе входной стороны, и если это «правильный» треугольник, добавление «типа» с «прямым», например (равнобедренный-правый). У меня есть перечисление для типов треугольников.

Я не ищу прямого ответа решить эту проблему, а какая-то помощь и коучинг, чтобы помочь лучше построить мои навыки

Вот класс структуры я генерироваться до сих пор в C#, пожалуйста, имейте в виду, не является полным.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using TriangleCheck; 

namespace TriangleCheck 
{ 
    public class Triangle 
    { 
     private StringBuilder _ErrorMsg; 
     private int[] _Sides; 
     private const int _nSides = 3; 
     private int _Area; 

     public Triangle(int[] Sides) 
     { 
      //Track amunt of errors recieved. 
      int nErrors = 0; 

      //Make sure ErrorMsg is cleared 
      _ErrorMsg = new StringBuilder(); 

      //Did I get _nSides? If not, append to ErrorMsg and throw exception 
      if(Sides.Length != _nSides) 
      { 
       _ErrorMsg.Append(string.Format("Expected {0} sides but recieved {1}", _nSides, Sides.Length)); 
       nErrors += 1; 
      } 

      //Is each side positive? If not, append to ErrorMsg and throw exception 
      for (int i = 0; i < Sides.Length; i++) 
      { 
       if (Sides[i] <= 0) 
       { 
        _ErrorMsg.Append(string.Format("{0} side is not a postive integer", Sides[i])); 
        nErrors += 1; 
       } 
      } 

      //Set input from user to private property _Sides 
      _Sides = Sides; 
      _Area = Area; 
     } 

     public int Area 
     { 
      get { return _Area; } 
      private set 
      { 
       int parameter = 
      } 
     } 


     public string ErrorMsg 
     { 
      get 
      { return ErrorMsg.ToString();} 
     } 

     public bool IsRight 
     { 
      get 
      { 
       return ; 
      } 
     } 

     public int Sides 
     { 
      get 
      { return _Sides; } 

      set 
      { 
       if (value > 0) 
       { 
        _Sides = value; 
       } 
       else 
        throw new ArgumentOutOfRangeException("Value must be postive!"); 
      } 
     } 

     public TriangleTypes TriangleTypes 
     { 
      get 
      { 
       throw new System.NotImplementedException(); 
      } 

      set 
      { 
      } 
     } 

     public void ScaleUp(int[] ScaleFactor) 
     { 
      throw new System.NotImplementedException(); 
     } 

     public override string ToString() 
     { 
      return "A Triangle with sides " + _Sides + " is Type: " + TriangleTypes + " with Area:" + Area; 
     } 
    } 
} 
+0

Эх, что, если я предоставляю ** 4 ** стороны или ** 2 ** единицы? 'new Triangle (new int [] {1, 2, 3, 4, 5});' –

+0

Вы также должны проверить, что сумма двух более коротких сторон больше самой длинной. – juharr

+1

область: 'Math.Sqrt (p * (p - _Sides [0]) * (p - _Sides [1]) * (p - _Sides [2]))' где 'p = (_Sides [0] + _ Sides [ 1] + _ Sides [2])/2.0' –

ответ

0

Вы сказали, что вы не можете установить свойство Area ... это выглядит, как вы пытаетесь обеспечить соблюдение, что, сделав private set, но почему бы не просто исключить set оставляя его только для чтения имущество?

Формула зоны может идти в пару мест; ключ заключается в том, что он происходит от сторон, но имеет значение только тогда, когда кто-то просит его. Таким образом, вы могли бы разумно:

  • применить формулу и обновить внутреннее состояние каждый раз, когда стороны изменения
  • применить формулу и возвращает значение каждый раз, когда кто-то делает get операцию по зоне

Помните точку функции getter и setter - это то, что они могут содержать логику для выполнения (чтобы полностью обновить внутреннее состояние в setter или вычислить значение свойства, доступного только для чтения).

Более сложные шаблоны существуют, если результаты расчета площади были очень тревожными, но я бы не стал в этом разбираться.

Что касается определения правильности треугольника ... если это так, то какая сторона должна быть гипотенузой? Какое отношение вы знаете между длиной гипотенузы и длинами других сторон, если треугольник прав?

0
using System; 

namespace ConsoleApp 
{ 
    class Program 
    { 
     static void Main() 
     { 
      var t = new Triangle(2, 3, 5); 

      //var Triangle = new Triangle(2);   // won't compile as no Triangle constructor can be found that takes 1 integer 
      //var Triangle = new Triangle(2, 3, 5, 7); // won't compile as no Triangle constructor can be found that takes 4 integers 
      //var Triangle = new Triangle(2, -3, 5); // won't compile as the 2nd value is negative - and we've asked for unsigned for all 3 values 

      Console.WriteLine("The triangle ({0}, {1}, {2}) has an area of {3}.", t.A, t.B, t.C, t.area()); 

      Console.ReadKey(); 
     } 
    } 

    public class Triangle 
    { 
     public uint A { get; set; } 
     public uint B { get; set; } 
     public uint C { get; set; } 

     public Triangle(uint a, uint b, uint c) 
     { 
      this.A = a; 
      this.B = b; 
      this.C = c; 
     } 

     public uint area() 
     { 
      return A * B * C; // this needs fixing ... 
     } 
    } 
} 

Разве это примерно то, что вы пытаетесь достичь с помощью класса Triangle - способ остановить его используют неправильно слишком мало или неправильных типов аргументов. Это позволяет только 3 положительных (uint) целых числа. Ничто другое не будет завершено - это то, что вы хотите. Извините, если я неправильно понял.

Смежные вопросы