Задание #2. Формула Герона

Java объектно-ориентированный язык. В каждом исходном файле .java  может быть объявлен один класс. Класс можно назвать шаблоном для создания объектов. Ниже показан код простого класса, который описывает точку в двумерном пространстве:

/**
 * Точка в двумерном пространстве.
 **/
public class Point2d {

    /** Координата X точки **/
    private double xCoord;

    /** координата Y точки **/
    private double yCoord;

    /** Конструктор инициализирующий начальное значение координат точки (x, y). **/
    public Point2d(double x, double y) {
        xCoord = x;
        yCoord = y;
    }
 
    /** конструктор без аргументов:  по умолчанию точка ставится в начало координат. **/
    public Point2d() {
       // Вызываем конструктор с двумя аргументами для инициализации позиции.
        this(0, 0);
    }

    /** Возвращает координату X точки. **/
    public double getX() {
        return xCoord;
    }

    /** Возвращает координату Y точки. **/
    public double getY() {
        return yCoord;
    }

    /** Изменяет координату X точки. **/
    public void setX(double val) {
        xCoord = val;
    }

    /** Изменяет координату Y точки. **/
    public void setY(double val) {
        yCoord = val;
    }
}

Этот код должен храниться в файле с именем Point2d.java, по правилам именования классов и файлов принятым в языке Java. Копия этого файла нужна вам для выполнения этой лабораторной работы. Перепишите ее на ваш компьютер.

Напомним, что экземпляр класса создается с помощью конструктора в любом месте кода:

Point2d myPoint = new Point2d();            // создает точку в (0,0)
Point2d myOtherPoint = new Point2d(5,3);    // создает точку в (5,3)
Point2d aThirdPoint = new Point2d();

Будьте внимательны: myPoint != aThirdPoint, даже если их значения одинаковы! Это происходит потому что оператор сравнения == (и обратный ему оператор !=) проверяют равенство двух ссылок на объекты. Иначе говоря, == возвращает true если две ссылки указывают на один и тот же объект. В этом примере, переменные myPoint и aThirdPoint  указывают на разные экземпляры класса Point2d, следовательно, myPoint == aThirdPoint возвращает false, даже если координаты точек одинаковы!

Для проверки равенства значений а не ссылок, в классе Point2d  нужен метод equals, который получает через аргумент другой объект (Object), и выполняет нужную проверку на равенство. Напомним, что типы сравниваемых объектов должны совпадать.

Перед тем отдавать свой код...

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

К сожалению, осознание важности хорошего стиля программирования часто приходит только через болезненный опыт... Но курс, CS11 дает возможность изучить хороший стиль программирования и попрактиковаться в нем. Перед тем как приступить к работе, просмотрите  руководство по стилю написания программ на языке Java. Имеется также программа проверки стиля, которая печатает замечания по стилю программирования вашего кода.

Ваша задача:

Создать новый класс Point3d который описывает, как вы вероятно уже догадались, точку в трехмерном евклидовом пространстве. Этот класс должен обеспечивать следующий функционал:

Внутренние поля объекта Point3d  должны быть недоступны напрямую.

Далее, добавьте новый метод distanceTo, который получает другой объект типа Point3d как аргумент, вычисляет расстояние по прямой до этого объекта, и возвращает это расстояние, используя тип double.

Создайте второй класс с именем Lab1, который нужен главным образом для объявления статического метода main. Вспомните, что метод main должен иметь модификатор доступа public, иметь тип возвращаемого значения void , и иметь один аргумент – массив элементов типа Strings. Добавьте в класс следующий функционал:

Пользовательский ввод трех троек значений, каждое из которых задает координаты одной точки в трехмерном пространстве. Создайте из этих входных данных объекты Point3d. (Пока что, будем считать, что пользователь всегда вводит корректные данные.)

Если вы не знаете, как получить данные от пользователя, найдите нужную функцию в этом файле. Сделайте из этой функции метод класса Lab1. Заметим, что этот метод использует классы из пакета java.io, который не виден вашему коду по умолчанию. Добавьте в начало вашего файла:

import java.io.*;

Эта строчка добавит классы из пакета java.io к коду класс Lab1. (Это не требуется делать для классов из пакета java.lang потому что он добавляется к вашему коду автоматически)

Напишите второй статический метод computeArea который получает три точки Point3d's и вычисляет площадь треугольника ограниченного этими точками. (Возможно, вам потребуется для этого Формула Герона.) Верните эту площадь в значении типа double.

Перед вызовом computeArea, однако, проверьте на равенство значений все три точки Point3d's. Если в какой либо паре точки “одинаковы”, сообщите об этом пользователю и не вычисляйте площадь.

Откомпилируйте вместе оба ваши файла:

javac Point3d.java Lab1.java

и запустите вашу программу Lab1. Протестируйте ее несколькими простыми треугольниками.


Copyright (C) 2015, California Institute of Technology. All rights reserved.