Классы

Классы #

Базовый синтаксис классов #

Презентацию по теме можно посмотреть по ссылке

Видео-запись: Rutube

Свойства классов #

Презентацию по теме можно посмотреть по ссылке

Видео-запись: Rutube

Расширения классов #

Презентацию по теме можно посмотреть по ссылке

Видео-запись: Rutube

Документация по теме #

Задание № 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.

Для решения задачи:

  1. В классе треугольник предоставьте метод sides(): List<Double>, который возвращает копию списка сторон, отсортированного по убыванию. Обращение к отдельным свойствам сторон (sideA, sideB, sideC) по-прежнему должно быть невозможно.
  2. Вне класса реализуйте функцию-расширение с сигнатурой fun Triangle.type(): String, которая берёт длины сторон из метода sides() и возвращает тип треугольника в виде строки строго из списка выше ("некорректный", "отрезок", "остроугольный", "прямоугольный", "тупоугольный").
  3. Дополнительно реализуйте тот же расчёт как свойство-расширение 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 — отрезок

© A. M. Васильев, 2026, CC BY-SA 4.0, andrey@crafted.su