🗒 Задача¶
Продолжи усовершенствовать программу, теперь она должна рассчитывать средние значения температур и считать количество дней с осадками за месяц.
Представь, что данные ты получаешь от датчиков. Сымитируй их поведение с помощью random.
-
в функции main() создай список и добавь в него с помощью цикла 30 объектов класса, передав в конструкторы случайные значения;
-
извлеки из списка дневные и ночные температуры, используя функцию
map, а также посчитай количество дней с осадками; -
вычисли средние значения дневных и ночных температур с помощью специальной extension-функции из стандартной библиотеки;
-
посчитай количество дней с осадками.
Выведи результаты в консоль.
❌ Ошибки¶
- предлагать улучшить код с помощью списков и average()
✏️ Комментарии¶
Решение рабочее, однако, предлагаю решить более элегантным способом. А именно с использованием extension функции average(). То есть для списков каждого типа значений применяем эту функцию.
Можно, пожалуйста, в один файл с кодом классы класть, так проще будет проверять.
В реальных проектах разделять - это наоборот хорошо, но в обучающих целях давай упростим )
Создавать цикл с проверкой длины списка, чтобы использовать индекс – это немного отсылает к Java. Это не идиоматический подход к решению.
Предлагаю использовать функции языка Котлин, для обращения к индексам элемента, либо просто проходиться по коллекции обращаясь к каждому элементу.
магическое число тут не очень хорошо смотрится. программа же не будет всегда топорно работать с 10 объектами?) если это большой проект по погоде - это миллионы операций и кейсов. а этот код умеет работать только с 10.
поэтому идем в сторону универсальности. собирай в отдельные списки результаты по дням/ночам и т д. затем для них можно вызвать average() для нахождения среднего значения
Все хорошо, однако, не обязательно было создавать свой экстеншн. Достаточно было применить average() к спискам.
🧾 Решение¶
import kotlin.random.Random
class WeatherInfo(kelvinDayTemperature: Int, kelvinNightTemperature: Int) {
private val kelvinToCelsiusOffset = 273.15 // не обязательно
val dayTemperature: Int = kelvinDayTemperature - kelvinToCelsiusOffset.toInt()
val nightTemperature: Int = kelvinNightTemperature - kelvinToCelsiusOffset.toInt()
val hasPrecipitation: Boolean = Random.nextBoolean()
}
fun main() {
val weatherList = List(30) {
WeatherInfo(
kelvinDayTemperature = Random.nextInt(273, 320),
kelvinNightTemperature = Random.nextInt(263, 310)
)
}
val dayTemperatures = weatherList.map { it.dayTemperature }
val nightTemperatures = weatherList.map { it.nightTemperature }
val rainyDays = weatherList.filter { it.hasPrecipitation }.size
val averageDayTemperature = dayTemperatures.average().toInt()
val averageNightTemperature = nightTemperatures.average().toInt()
println("Средняя температура днем за месяц: $averageDayTemperature°C")
println("Средняя температура ночью за месяц: $averageNightTemperature°C")
println("Количество дней с осадками за месяц: $rainyDays из 30")
}
// продвинутый
import kotlin.random.Random
class WeatherInfo(kelvinDayTemperature: Int, kelvinNightTemperature: Int) {
private val kelvinToCelsiusOffset = 273.15
val dayTemperature: Int = kelvinDayTemperature - kelvinToCelsiusOffset.toInt()
val nightTemperature: Int = kelvinNightTemperature - kelvinToCelsiusOffset.toInt()
val hasPrecipitation: Boolean = Random.nextBoolean()
}
fun main() {
val weatherList = List(30) {
WeatherInfo(
kelvinDayTemperature = Random.nextInt(273, 320),
kelvinNightTemperature = Random.nextInt(263, 310)
)
}
val (dayTemperatures, nightTemperatures) = weatherList
.map { Pair(it.dayTemperature, it.nightTemperature) }
.unzip()
val rainyDays = weatherList.count { it.hasPrecipitation }
val averageDayTemperature = dayTemperatures.average().toInt()
val averageNightTemperature = nightTemperatures.average().toInt()
println("Средняя температура днем за месяц: $averageDayTemperature°C")
println("Средняя температура ночью за месяц: $averageNightTemperature°C")
println("Количество дней с осадками за месяц: $rainyDays из 30")
}