Урок 3. Ввод с клавиатуры, вывод и строковые шаблоны
Программа, которая только печатает заранее известный текст, мало что умеет. В этом уроке она научится спрашивать данные у человека: читать строки и числа с клавиатуры, — и красиво вставлять значения в выводимый текст.
Ввод: readln
readln() ждёт, пока человек наберёт строку и нажмёт Enter, и возвращает набранное:
fun main() {
val name = readln()
println("Hello, $name!")
}AnnaHello, Anna!В примерах на этом сайте то, что набирают на клавиатуре, показано в блоке «Ввод», а то, что выводит программа, — в блоке «Вывод». В IntelliJ IDEA ввод набирается прямо в окне Run, где появляется вывод.
Подсказку перед вводом выводят через print — без перехода строки, чтобы ввод шёл сразу за ней:
fun main() {
print("What is your name? ")
val name = readln()
println("Hello, $name!")
}На экране это выглядит так (имя набрано с клавиатуры):
What is your name? Anna
Hello, Anna!В старых примерах встречается readLine() — так читали строку до Kotlin 1.6. Она возвращает «строку или ничего» (String?), и с ней нужны лишние проверки. В новых программах берите readln().
Числа с клавиатуры
readln() всегда возвращает строку. Даже если набрать 5, программа получит текст "5". Чтобы считать с ним, строку переводят в число — toInt() для целых и toDouble() для дробных:
fun main() {
val a = readln().toInt()
val b = readln().toInt()
println("$a + $b = ${a + b}")
}7
57 + 5 = 12Если набрать не число, например abc, программа остановится с ошибкой NumberFormatException. Как проверить ввод, не роняя программу, — в справке Как перевести строку в число.
Несколько чисел в одной строке
Часто числа вводят через пробел: 4 8 9. Строку тогда делят на части и каждую переводят в число:
fun main() {
val (a, b, c) = readln().split(" ").map { it.toInt() }
println(a + b + c)
println("Average: ${(a + b + c) / 3.0}")
}4 8 921
Average: 7.0Что здесь происходит:
split(" ")делит строку по пробелам и даёт список строк:"4","8","9";map { it.toInt() }переводит каждую из них в число (it— очередной элемент; подробно — в уроке Коллекции);val (a, b, c) = …раскладывает первые три элемента списка по трём переменным.
Если между числами окажется два пробела подряд, split(" ") даст пустую строку, и toInt() на ней упадёт. Как читать ввод надёжнее — в справке Как считать несколько чисел из одной строки.
Строковые шаблоны
В строку можно вставить значение переменной — знак $ перед её именем. Выражение посложнее берут в фигурные скобки: ${...}.
fun main() {
val name = "Oleg"
val apples = 3
val price = 2
println("$name has $apples apples")
println("Total: ${apples * price} rubles")
println("Name length: ${name.length}")
println("Price: \$$price")
}Oleg has 3 apples
Total: 6 rubles
Name length: 4
Price: $2$name— подставляет значение переменной;${apples * price}— считает выражение и подставляет результат;${name.length}— фигурные скобки нужны и здесь: без них$name.lengthподставит имя, а за ним — текст.length;\$— сам знак доллара, без подстановки.
Шаблоны удобнее, чем склеивать строки знаком +: меньше кавычек и пробелы видно сразу.
Особые символы
Некоторые символы внутри строки пишутся через обратную косую черту \:
| Запись | Что это |
|---|---|
\n | перевод строки |
\t | табуляция |
\" | двойная кавычка внутри строки |
\\ | сама обратная косая черта |
\$ | знак доллара |
fun main() {
println("Line 1\nLine 2")
println("He said: \"Hi\"")
println("C:\\Users")
}Line 1
Line 2
He said: "Hi"
C:\UsersМногострочный текст
Текст в тройных кавычках """ может занимать несколько строк, и особые символы в нём не нужны. trimIndent() убирает общий отступ слева и пустые первую и последнюю строки:
fun main() {
val menu = """
1. New game
2. Load
3. Exit
""".trimIndent()
println(menu)
}1. New game
2. Load
3. ExitЧисла с нужным числом знаков
Дробное число println выводит целиком: 10.0 / 3 даст 3.3333333333333335. Чтобы оставить два знака после запятой, есть "%.2f".format(x):
fun main() {
val x = 10.0 / 3
println("%.2f".format(x))
}В системе с русскими настройками вывод будет 3,33 — с запятой, в английской — 3.33. Как получить точку всегда — в справке Как вывести число с двумя знаками после запятой.
Коротко
readln()читает строку с клавиатуры и всегда возвращаетString.- Число из ввода —
readln().toInt()илиreadln().toDouble(). - Несколько чисел в строке —
readln().split(" ").map { it.toInt() }. - Шаблоны:
"$name"— переменная,"${a + b}"— выражение. - Перевод строки —
\n, кавычка —\", доллар —\$; многострочный текст — в""".