Как я могу получить разные результаты, как я положил номер? - PullRequest
0 голосов
/ 03 декабря 2018

Я хочу получить разные результаты в качестве введенного числа.

Например, когда я ставлю 4, я получаю результаты прямоугольника, а когда я ставлю 3, я получаю треугольник.

import java.util.Scanner;

public class Source9_1 {
    Scanner sc = new Scanner(System.in);
    int n = sc.nextInt();
    int x, y; // 클래스 Parameter(내부 변수)

    Point[] v = new Point[n]

    for(int i=0; i <= v.length; i++) {
        v[i] = new Point();
        v[i].

    }
}

class Point {
    int x, y; // 클래스 Parameter (내부 변수)

    public void setPoint(int x, int y) { // Point 세팅
        this.x = x;
        this.y = y;
    }

    public void printPoint() { // Point 출력
        System.out.println("x = " + x + ", y = " + y);
    }
}

class Rectangle extends Point {
    Point[] p = new Point[4];

    Rectangle(Point[] p) {
        this.p = p;
    }
}

class Triangle extends Point {
    Point[] p = new Point[3]; // 3개의 Point인스턴스를 담을 배열 생성

    Triangle(Point[] p) {
        this.p = p;
    }
}

class Shape extends Point { // Point 배열 및 상속을 받아 세팅 후 출력가능한 클래스
    Point coord[10];
    static int s = 0; // 불릴 때마다 값 증가 ???

    public void printShapePoint() { // 배열에 담은 Point 출력

    }

    public void setShapePoint() { // 배열에 담기 위해 Point 증가

    }
}

До сих пор я так кодировал, но я не знаю, что теперь делать.

Как получить другой результат, если я введу число?

Этоэто результат, который я хочу

enter image description here

Ответы [ 2 ]

0 голосов
/ 03 декабря 2018

Ответ от Педро великолепен.У меня есть дополнительное предложение.Использование переключателя или условного выражения для создания различных типов фигур немного пахнет кодом.Я предлагаю использовать для этого абстрактную фабрику.Я привел небольшой пример того, как вы могли бы сделать это здесь .

Вычисление формы из числа точек может быть недостаточным.Например, прямоугольник определяется двумя точками (а не четырьмя), как и линия, даже если вы в настоящее время не моделируете линии.

Я думаю, что было бы более понятно выбрать форму по имени и использоватьфабрика для создания экземпляра из введенных точек.

Обратите внимание, что он формирует иерархию объектов и часто используется для объяснения ориентации объектов.Есть несколько ловушек при проектировании структур классов, подобных этой.См. Например эту статью .Имейте в виду также принцип подстановки Лискова, который легко нарушается, см. эту статью .

0 голосов
/ 03 декабря 2018

Прежде всего, о ваших Rectangle и Triangle классах.Я чувствую, что вы упустили свою точку зрения (каламбур не предназначен), потому что вы поставили оба, расширяя класс Point.Это не имеет особого смысла, так как у вас есть класс Shape, который будет гораздо лучше выполнять роль суперкласса для них.

Итак:

class Rectangle extends Shape {
    ...
}

class Triangle extends Shape {
    ...
}

С этимкстати, что у вас есть:

  1. Вы фиксируете количество точек на входе;
  2. Вы создаете массив такого размера;
  3. Вы создаете и устанавливаете объект Point для каждой позиции массива.

Что нужно сделать дальше:

  1. Захватить координаты точек из входных данных
  2. Установите указанные координаты для объектов Point
  3. Создайте объект Triangle или Rectangle, в зависимости от того, сколько у вас точек.

Итаквнутри вашего оператора for вы захотите сделать:

for (int i=0; i <= v.length; i++) {
    v[i] = new Point();
    x = sc.nextInt(); // Save 'x' value into the variable
    y = sc.nextInt(); // Save 'y' value into the variable
    v[i].setPoint(x, y); // Set both values using the method from Point
}

Тогда, так как Rectangle и Triangle имеют Shape в качестве общего суперкласса, вам разрешено помещать объекты любогоодин из этих классов в переменной Shape.Итак, сразу после оператора for вы захотите сделать:

Shape s; // Create the empty variable here, so it will exist outside the if-else scope
if (n == 3)
    s = new Triangle(v);
else
    s = new Rectangle(v);

Наконец, просто напечатайте ваши очки:

for (int i = 0; i < v.length; i++)
    v[i].printPoint();

И это в значительной степени.

...