🗒 Задача¶
Объяви переменную с количеством секунд, которые Гагарин провел в космосе.
-
Переведи в коде количество секунд в целые минуты и целые часы, сохраняя остаток секунд и минут в новые переменные;
-
Выведи в консоль время, проведенное в космосе в формате [часы:минуты:секунды], например так: 01:30:09;
-
Значения часов, минут и секунд отображать двумя цифрами.
❌ Ошибки¶
-
в конечном выводе у секунд нет нулей или один ноль
-
не соблюден формат вывода — аргументируем так, что данный в ТЗ формат требует сервер
-
используют методы там, где не нужно (код из chatGPT)
✏️ Комментарии¶
Форматирование использовано верно, но так как это задачка повышенной сложности, доведем вывод до более оптимального состояния.
- можно отформатировать в одну строку
- можно сразу использовать интерполяцию при выводе
Вот так:
`println("%02d:%02d:%02d".format(hours, minutes, seconds))`
Отлично!) можно даже еще аккуратнее сделать:
`println("%02d:%02d:%02d".format(hours, minutes, seconds))`
Так как это 5 задача ("со звездочкой") не по уровню урока, то предлагаю использовать более элегантное решение). (может потребовать дополнительного ресерча). Для корректного вывода нуля вначале попробуй посмотреть в сторону String.format().
Так как это 5 задача ("со звездочкой") не по уровню урока, то и решение должно быть более продвинутым (может потребовать дополнительного ресерча). В данном случае нужно получить часы, минуты и секунды программно. То есть высчитать кодом. Если сразу эта задача не дается – можно вернуться к ней позже)
Формат вывода был описан как `[часы:минуты:секунды]`. Будь внимательнее к требованиям.
В реальных проектах, даже если тебе кажется что правильно по-твоему, лучше сделать как в требованиях. В идеале, кончено, на этапе получения задачки от заказчика нужно уточнить корректность, но в нашем случае необязательно, так как ошибки нам только на пользу.
Для красоты кода предлагаю отделить переменную с общим количеством секунд от других переменной с вычислениями пустой строкой, чтобы код не казался таким монолитным.
Хоть и языком не запрещено объявлять функцию внутри другой функции - это все таки не очень распространенная практика в продакшене и я так делать не рекомендую. Такая вложенность плохо влияет на читабельность, особенно, когда будет большой объем кода.
Чтобы снизить риск ошибок, предлагаю все “голые” числа вынести в константу. Кроме того это [магические числа](https://ru.wikipedia.org/wiki/%D0%9C%D0%B0%D0%B3%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5_%D1%87%D0%B8%D1%81%D0%BB%D0%BE_(%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5)#%D0%9F%D0%BB%D0%BE%D1%85%D0%B0%D1%8F_%D0%BF%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%BA%D0%B0_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F), что тоже не является хорошей практикой.
Нейминг констант отличен от обычных переменных. В [документации по ссылке](https://developer.android.com/kotlin/style-guide#constant_names) есть более полное описание стайл гайда
Чтобы снизить риск ошибок, предлагаю еще вынести 60 в константу. Кроме того это [магическое число](https://ru.wikipedia.org/wiki/%D0%9C%D0%B0%D0%B3%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5_%D1%87%D0%B8%D1%81%D0%BB%D0%BE_(%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5)#%D0%9F%D0%BB%D0%BE%D1%85%D0%B0%D1%8F_%D0%BF%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%BA%D0%B0_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F), что тоже не является хорошей практикой.
Функция форматирования используется для модернизации строки по определенному шаблону. В ее параметры мы передаем так называемые строковые спецификаторы. они пришли из Java.
Спецификаторы имеют строгую типизацию. например, `%d` как использовали мы означает, что в эту "переменную" будем передавать Int. табличка с другими спецификаторами есть тут [https://hr-vector.com/java/formatirovanie-chisel-strok](https://hr-vector.com/java/formatirovanie-chisel-strok).
Форматировать таким образом можно что угодно. от простых чисел до сложно формата даты.
Работает это так примерно:
`String.format("сегодня СПЕЦ_1 число и сейчас СПЕЦ_2 градусов", ДАТА_СПЕЦ_1, ГРАДУСЫ_СПЕЦ_2)`
Вывод будет: `сегодня 13 число и сейчас 20 градусов`.
То есть последовательно перечисляем спецификаторы в строке, потом передаем переменные.
Теперь про то, почему 02. это такая хитрая конструкция, чтобы выполнить условия ТЗ
2 - минимальное количество выводимых символов. если их меньше двух, то подставится то, что стоит перед двойкой. В нашем случае 0, таким образом однозначные числа секунд, например, будут выводиться с нулем в начале.
🧾 Решение¶
fun main() {
val seconds = 6480
val minutes = seconds / SECONDS_IN_HOUR
val hours = minutes / SECONDS_IN_HOUR
val remainingMinutes = minutes % SECONDS_IN_HOUR
val remainingSeconds = seconds % SECONDS_IN_HOUR
println("%02d:%02d:%02d".format(hours, remainingMinutes, remainingSeconds))
}
const val SECONDS_IN_HOUR = 60