Перейти к содержанию

🗒 Задача

Продолжи усовершенствовать программу, теперь она должна рассчитывать средние значения температур и считать количество дней с осадками за месяц.

Представь, что данные ты получаешь от датчиков. Сымитируй их поведение с помощью random.

  • в функции main() создай список и добавь в него с помощью цикла 30 объектов класса, передав в конструкторы случайные значения;

  • извлеки из списка дневные и ночные температуры, используя функцию map, а также посчитай количество дней с осадками;

  • вычисли средние значения дневных и ночных температур с помощью специальной extension-функции из стандартной библиотеки;

  • посчитай количество дней с осадками.

Выведи результаты в консоль.

❌ Ошибки

  • предлагать улучшить код с помощью списков и average()

✏️ Комментарии

Решение рабочее, однако, предлагаю решить более элегантным способом. А именно с использованием extension функции average(). То есть для списков каждого типа значений применяем эту функцию.
Можно, пожалуйста, в один файл с кодом классы класть, так проще будет проверять.
В реальных проектах разделять - это наоборот хорошо, но в обучающих целях давай упростим )
Создавать цикл с проверкой длины списка, чтобы использовать индекс – это немного отсылает к Java. Это не идиоматический подход к решению.

Предлагаю использовать функции языка Котлин, для обращения к индексам элемента, либо просто проходиться по коллекции обращаясь к каждому элементу.
Для рандомизации Boolean есть еще такой экстеншн `Random.nextBoolean()`
магическое число тут не очень хорошо смотрится. программа же не будет всегда топорно работать с 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")
}