Потоки данных и коллекции в Kotlin #
Входные и выходные потоки данных #
Презентацию по теме можно посмотреть по ссылке
Видео-запись: Rutube
Работа с null-значениями #
Презентацию по теме можно посмотреть по ссылке
Видео-запись: Rutube
Коллекции в Kotlin #
Презентацию по теме можно посмотреть по ссылке
Видео-запись: Rutube
Задание № 1: Работа с коллекциями #
В рамках данной практической работы реализуйте небольшое консольное приложение на языке Kotlin, решающее следующую задачу.
Пользователь вводит в приложение коэффициенты многочлена произвольной степени
n
. Многочлен степени n
имеет форму
\( a_n * x^n + a_{n−1} *x^{n−1}
+ · · · + a_1 * x + a_0 \)
.
Вычислите значение многочлена в точке x
, указанной пользователем. Вычислите значение производной многочлена в той же точке.
Предлагается следующий подход к решению задачи.
- Реализуйте функцию для получения одного целого числа от пользователя со
стандартного потока ввода. Данная функция может иметь следующую сигнатуру:
fun readInt(prompt: String) : Int { /**/ }
- Аргумент
prompt
должен содержать строку-приглашение, например"Введите целое число> "
, которое должно показываться пользователю перед вводом числа. Приглашение должно показываться перед вводом числа, без переноса строки. Используйте метод print. - Для считывания рекомендуется использовать метод
readLnOrNull
. null
-значение может быть получен в случае, например, в случае окончания потока ввода. В рамках данной программы будем считать, что поток ввода не завершён, и будем пытаться считывать данные со стандартного потока ввода ещё раз в случае полученияnull
-значения.- Метод должен получать строку от пользователя и пытаться преобразовать её к
целому числу. Для преобразования строки к числу можно использовать метод
toInt
. Обратите внимание, что в случае ошибки преобразования будет выброшено исключениеNumberFormatException
. Процесс обработки исключений описан в документации.- Если преобразование выполнено успешно, то его результат надо возвратить в качестве результата работы функции.
- Если преобразование не было успешно, то функция должна повторить запрос на
ввод данных от пользователя. Пользователю необходимо сообщить о возникшей
проблеме, чтобы он не повторил свою ошибку ещё раз.
В качестве альтернативы можно воспользоваться функцией
toIntOrNull
. Но необходимо обязательно обработать ошибочную ситуацию.
- Аргумент
- Реализуйте функцию для получения коэффициентов многочлена. Данная функция
может иметь следующую сигнатуру:
fun readCoefficients() : List<Int> { /**/ }
- Данная функция должна запрашивать степень коэффициента многочлена,
N
, с помощью методаreadInt
. Если было получено отрицательное число, то необходимо запросить ввод данных ещё раз. - Затем функция должна получить
N+1
коэффициентов многочлена. Для этого можно использовать методreadInt
с сохранением результата в изменяемом списке целых чисел.- Для создания динамического списка для хранения чисел используйте
функцию
mutableListOf()
. - Для добавления элемента используйте метод
add()
.
- Для создания динамического списка для хранения чисел используйте
функцию
- Сформированный список коэффициентов многочлена метод должен вернуть в качестве своего значения.
- Созданный изменяемый список, объект интерфейса
MutableList
, может быть возвращён клиентам как объект неизменяемого спискаList
, т.к. интерфейсMutableList
унаследован отList
:Клиентам данного метода нет необходимости получать изменяемый список, т.к. пользователь уже завершил ввод своих данных.interface MutableList<E> : List<E>, MutableCollection<E>
- Удобным форматом для хранения коэффициентов является формат, когда на
первом месте в массиве хранится коэффициент многочлена нулевой степени, на
втором — первой степени и т.д. Для считывания удобно спрашивать у
пользователя коэффициенты, начиная со старшего члена. Перед возвращением
списка коэффициентов пользователю его необходимо развернуть с помощью метода
reversed
.
- Данная функция должна запрашивать степень коэффициента многочлена,
- Используйте функцию
readInt
для считывания точкиx
, в которой необходимо произвести вычисление значения многочлена. - Реализуйте функцию для вычисления коэффициентов производной многочлена.
Данная функция может иметь следующую сигнатуру:
fun calcDerivative(coefs: List<Int>) : List <Int> { /**/ }
- Для вычисления производной удобно расположить коэффициенты многочлена по возрастающей. Т.е. коэффициент многочлена степени 0 должен быть первым, степени 1 - вторым и так далее.
- Производной будет многочлен, у которого:
- Значение новых элементов вычисляется как значение коэффициента оригинального многочлена, умноженного на порядковый номер многочлена.
- Первый элемент отсутствует, т.к. степень производной многочлена меньше степени многочлена на 1.
- Для вычисления производной по индексам можно воспользоваться
диапазонами от 1 до размера
оригинального массива:
for (index in 1 until coefs.size) { coefs[index] }
- Реализовать функцию вычисления значения многочлена в точке. Данная функция
может иметь следующую сигнатуру:
fun polynomValue(coefs: List<Int>, point: Int) : Int { /**/ }
- Используя полученные функции выполнить вычисление значения многочлена и его
производной в точке
x
. - Выведите информацию о многочлене, его производной и их значении в указанной точке с помощью строковых шаблонов.
Задание № 2. Получение данных из аргументов #
Решите предыдущую задачу, только входными данными для приложения должно получать не со стандартного потока данных, а через аргументы приложения.
Предлагается следующая последовательность аргументов:
КОЛИЧЕСТОВО-КОЭФФИЦИЕНТОВ 1-Й-КОЭФФИЦИЕНТ .... N-Й-КОЭФФИЦИЕНТ ТОЧКА
Пример:
3 1 2 -5 -10
-
Добавьте в стартовую функцию main возможность принимать массив строк, аргументы приложения.
-
Настройте передачу аргументов при запуске задачи
run
в IDEA. В список аргументов Gradle после командыrun
добавьте аргументы, которые необходимо передать приложению. Например:run --args="3 1 2 -5 -10"
. -
Создайте новую функцию для получения списка чисел из аргументов. Данная функция может иметь следующую сигнатуру:
fun argumentsToIntsOrNull(arguments: Array<String>): List<Int>? { ... }
Она должна возвращать:
- Либо список целых чисел, если все аргументы содержали строковое представление целых чисел.
- Либо null-значение, если какой-либо элемент содержал не число.
-
Полученный список должен быть обработан в функции main:
- Необходимо проверить на наличие null-значения. В случае проблем с проверкой данных приложение должно завершить работу с ошибочным кодом.
- Если количество переданных коэффициентов не соответствует ожиданиям, то надо сообщить об этом пользователю и завершить работу с ошибочным кодом.
- Во всех остальных случаях можно сформировать коллекцию коэффициентов и значение точки для проверки. Рекомендуются к использованию функции: slice, drop, take, dropLast, takeLast.
-
Передайте полученные данные в существующие функции, чтобы получить нужный результат.