Классы #
Базовый синтаксис классов #
Презентацию по теме можно посмотреть по ссылке
Видео-запись: Rutube
Свойства классов #
Презентацию по теме можно посмотреть по ссылке
Видео-запись: Rutube
Расширения классов #
Презентацию по теме можно посмотреть по ссылке
Видео-запись: Rutube
Документация по теме #
- Классы и наследование.
- Свойства.
- Расширения.
- Модификаторы доступа.
toDoubleOrNull.- Сортировка коллекций.
sortedDescending.- Объекты и вспомогательные объекты.
String.format.sqrtиabs.exitProcess.
Задание № 1: Класс Triangle
#
Создайте класс Triangle. Основной конструктор класса принимает 3 аргумента
типа Double — длины трёх сторон: sideA, sideB и sideC. Объявите их
как приватные неизменяемые свойства (private val), чтобы доступ к
отдельным сторонам извне класса был невозможен.
Класс должен предоставлять функции, которые возвращают:
- Длину самой большой стороны.
- Периметр треугольника.
- Площадь треугольника по формуле Герона (см.
занятие 1, «Задание № 3»).
Для извлечения квадратного корня используйте
sqrt(). Проверять, существует ли треугольник с такими сторонами, на этом этапе не нужно: для невозможных длин площадь окажется равнойNaN, это допустимый результат. Классификация сторон выполняется в задании № 3. - Текстовое представление треугольника, в котором длины сторон отсортированы
по убыванию, разделены одиночным пробелом и выведены с двумя знаками после
разделителя, например
"5.00 4.00 3.00"(реализуется переопределениемtoString()).
Для сортировки по убыванию используйте
sortedDescending().
Число типа Double печатается по умолчанию как 5.0, поэтому формат
задавайте явно через
String.format
с указанием локали Locale.US: в локали ru_RU разделителем дробной части
станет запятая и вывод перестанет соответствовать ожидаемому.
import java.util.Locale
val text = String.format(Locale.US, "%.2f", 5.0) // "5.00"Доступ к конкретным сторонам треугольника извне класса не должен быть
предоставлен: не объявляйте публичные свойства sideA, sideB, sideC и
не добавляйте для них геттеры.
Создайте список из трёх треугольников (List<Triangle>). Исходные длины
сторон получайте из аргументов приложения: первые три аргумента — стороны
первого треугольника, следующие три — второго, последние три — третьего.
Корректный аргумент — строковое представление вещественного числа с точкой,
например 2 или 3.5. Если приложению передано не ровно девять аргументов
или хотя бы один аргумент не является вещественным числом, выведите
сообщение об ошибке в стандартный поток вывода (например,
println("Ошибка: аргумент с номером 4 не является вещественным числом")) и
завершите работу приложения с ненулевым кодом возврата
exitProcess(1).
Для разбора аргумента используйте
toDoubleOrNull()
и обработайте null-результат. Приёмы работы с аргументами приложения
разобраны в
занятии 2.
Задание № 2: Определение вычисляемых свойств #
В созданном на предыдущем этапе классе Triangle преобразуйте функции
«длина самой большой стороны», «периметр» и «площадь» в вычисляемые свойства
maxSide, perimeter и area типа Double: у каждого свойства должен быть
пользовательский геттер (get()), который вычисляет значение по текущим
длинам сторон. Отдельные функции для этих значений оставлять не нужно.
Для преобразования к строке не надо вводить свойство, оставьте переопределение
стандартной функции toString().
Задание № 3: Расширение класса #
Реализуйте возможность определения типа треугольника в форме расширения класса. Тип треугольника определяется следующим образом:
- некорректный (наибольшая сторона больше суммы двух других; сюда же относятся наборы, в которых есть сторона с длиной меньше либо равной нулю)
- отрезок (наибольшая сторона равна сумме двух других)
- остроугольный (квадрат наибольшей стороны меньше суммы квадратов двух других)
- прямоугольный (квадрат наибольшей стороны равен сумме квадратов двух других)
- тупоугольный (квадрат наибольшей стороны больше суммы квадратов двух других)
Проверяйте типы в порядке перечисления: сначала «некорректный», затем «отрезок», затем сравнение квадратов сторон.
Стороны имеют тип Double, поэтому сравнение на равенство выполняйте с
допуском: abs(a - b) <= eps. Для сравнения длин сторон возьмите
eps = 1e-9, для сравнения их квадратов — eps = 1e-6, так как возведение в
квадрат увеличивает абсолютную погрешность. Функцию
abs()
импортируйте из пакета kotlin.math.
Для решения задачи:
- В классе треугольник предоставьте метод
sides(): List<Double>, который возвращает копию списка сторон, отсортированного по убыванию. Обращение к отдельным свойствам сторон (sideA,sideB,sideC) по-прежнему должно быть невозможно. - Вне класса реализуйте функцию-расширение с сигнатурой
fun Triangle.type(): String, которая берёт длины сторон из методаsides()и возвращает тип треугольника в виде строки строго из списка выше ("некорректный","отрезок","остроугольный","прямоугольный","тупоугольный"). - Дополнительно реализуйте тот же расчёт как свойство-расширение
val Triangle.typeName: String get() = ...и убедитесь, что оба варианта дают одинаковый результат. Перечисления (enum) для типов треугольника на этом занятии использовать не нужно: они разбираются в занятии 5.
Для списка треугольников из задания № 1 выведите на стандартный поток вывода
по одной строке на каждый треугольник: текстовое представление
треугольника, затем символ «тире» (—), окружённый одиночными пробелами,
затем тип треугольника. Пример запуска и вывода для аргументов
3 4 5 3 3 3 5 3 2:
$ gradle run --args="3 4 5 3 3 3 5 3 2"
5.00 4.00 3.00 — прямоугольный
3.00 3.00 3.00 — остроугольный
5.00 3.00 2.00 — отрезок