Я нахожусь в классе, ориентированном на c #, и у меня есть эти два простых класса

#c#

#c#

Вопрос:

Я нахожусь в классе, ориентированном на c #, и у меня есть эти два простых класса, но выходные данные для периметра и области продолжают выводиться равными нулю, я попробовал два разных способа и не могу понять, вероятно, это легко исправить, любая помощь была бы оценена, спасибо!

 class Rectangle { 

   int width; 
   int length;

   public int perimeter;
   public int area;

    public Rectangle()
    {
        width = 1;
        length = 1;
    }
    public Rectangle(int w, int l)
    {
        set_values(w, l);
    }
    public void set_values(int w, int l)
    {
        width = w;
        length = l;
    }
    public Rectangle get_values()
    {
        return this;
    }
    public void calc_perimeter(int width, int length)
    {
        perimeter = 2 * width   2 * length;
    }
    public void calc_area(int width, int length)
    {
        area = width * length;
    }
    public void display_values()
    {
        Console.WriteLine("Width is {0}, and Lenght is {1}", width, length);
    }
    public void display_perimeter()
    {
        Console.WriteLine("The perimeter of the rectangle is {0}", perimeter);
    }
    public void display_area()
    {
        Console.WriteLine("The area of the rectangle is {0}", area);
    }

}

class Circle
{
    double radius;

    public double perimeter;
    public double area;


    public Circle()
    {
        radius = 1;

    }
    public Circle(double r)
    {
        set_values(r);
    }
    public void set_values(double r)
    {
        radius = r;

    }
    public Circle get_values()
    {
        return this;
    }
    public double calc_perimeter(double radius)
    {
        perimeter = 2*Math.PI*radius;
        return perimeter;
    }
    public double calc_area(double radius)
    {
        area = Math.PI*radius*radius;
        return area;
    }
    public void display_values()
    {
        Console.WriteLine("Radius is {0}", radius);
    }
    public void display_perimeter()
    {
        Console.WriteLine("The perimeter of the cirlce is {0}", perimeter);
    }
    public void display_area()
    {
        Console.WriteLine("The area of the circle is {0}", area);
    }

}
  

Комментарии:

1. Не могли бы вы показать код, который вызывает эти классы?

2. Вы сначала вызывали calc_perimeter?

3. Обратите внимание, что для обоих классов методы calc_area и calc_perimeter, вероятно, не должны иметь параметров — тогда они будут вычислять значения для значений, установленных в полях экземпляров класса.

Ответ №1:

Поскольку это явно вопрос домашнего задания, я не собираюсь публиковать полный код в ответе — потому что, если я напишу код для вас, вы ничему из него не научитесь.
Вместо этого я собираюсь объяснить на словах, что вы сделали неправильно в своих классах и как вы должны это исправить.

Периметр и площадь фигуры зависят от размера фигуры — ширины и длины прямоугольника или радиуса окружности.
Поэтому имеет смысл вычислить его, как только размер изменится.

Обычно вы используете общедоступные свойства, доступные только для чтения, чтобы получить периметр и площадь — как только вы это сделаете, у вас будет выбор, хотите ли вы вычислять их внутри средства получения свойств, то есть каждый раз, когда кто-то их вызывает, или вы хотите вычислять их при установке значений размера — что также следует выполнять через свойства.
Этот выбор должен зависеть от частоты изменения размера в зависимости от частоты использования периметра и области — для домашнего задания оба варианта должны быть достаточно хорошими.

Итак, что вы делаете, это что-то вроде этого (в прямоугольнике):

 private int width;
public int Width
{
    get {return width;}
    set {width = value; SetSize();}
}

private int height;
public int Height
{
    get {return height;}
    set {height = value, SetSize();}
}

// be sure to also call this method in the constructors!
private void SetSize()
{
    // calculate perimeter and area in here.
}

public int Perimeter {get; private set;}
public int Area {get; private set;}