Глиф Учебники

Урок 3. Ввод с клавиатуры, вывод и строковые шаблоны

Курс «Kotlin» · урок 3 из 10 · 3 минуты чтения

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

Ввод: readln

readln() ждёт, пока человек наберёт строку и нажмёт Enter, и возвращает набранное:

Kotlin
fun main() {
    val name = readln()
    println("Hello, $name!")
}
Ввод
Anna
Вывод
Hello, Anna!

В примерах на этом сайте то, что набирают на клавиатуре, показано в блоке «Ввод», а то, что выводит программа, — в блоке «Вывод». В IntelliJ IDEA ввод набирается прямо в окне Run, где появляется вывод.

Подсказку перед вводом выводят через print — без перехода строки, чтобы ввод шёл сразу за ней:

Kotlin
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() для дробных:

Kotlin
fun main() {
    val a = readln().toInt()
    val b = readln().toInt()
    println("$a + $b = ${a + b}")
}
Ввод
7
5
Вывод
7 + 5 = 12

Если набрать не число, например abc, программа остановится с ошибкой NumberFormatException. Как проверить ввод, не роняя программу, — в справке Как перевести строку в число.

val a = readln().toInt() набрано 7 Enter readln() "7" String — текст .toInt() 7 Int — число abc Enter readln() "abc" String — текст .toInt() NumberFormatException программа остановится
readln() возвращает набранное как строку: "7" после toInt() становится числом 7, а на строке "abc" toInt() останавливает программу с NumberFormatException.

Несколько чисел в одной строке

Часто числа вводят через пробел: 4 8 9. Строку тогда делят на части и каждую переводят в число:

Kotlin
fun main() {
    val (a, b, c) = readln().split(" ").map { it.toInt() }
    println(a + b + c)
    println("Average: ${(a + b + c) / 3.0}")
}
Ввод
4 8 9
Вывод
21
Average: 7.0

Что здесь происходит:

readln() "4 8 9" одна строка .split(" ") "4" "8" "9" список строк .map { it.toInt() } 4 8 9 список чисел val (a, b, c) = … a b c три переменные
Строка "4 8 9" режется split по пробелам на три строки, map переводит каждую в число, и числа 4, 8 и 9 раскладываются по переменным a, b и c.

Если между числами окажется два пробела подряд, split(" ") даст пустую строку, и toInt() на ней упадёт. Как читать ввод надёжнее — в справке Как считать несколько чисел из одной строки.

Строковые шаблоны

В строку можно вставить значение переменной — знак $ перед её именем. Выражение посложнее берут в фигурные скобки: ${...}.

Kotlin
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 "Oleg" apples 3 price 2 шаблон что выводится "$name has $apples apples" Oleg has 3 apples "Total: ${apples * price} rubles" Total: 6 rubles 3 * 2 "Name length: $name.length" Name length: Oleg.length "Name length: ${name.length}" Name length: 4
Шаблон подставляет значения переменных name, apples и price; выражение и свойство берутся в фигурные скобки, без них после имени остаётся текст .length.

Шаблоны удобнее, чем склеивать строки знаком +: меньше кавычек и пробелы видно сразу.

Особые символы

Некоторые символы внутри строки пишутся через обратную косую черту \:

ЗаписьЧто это
\nперевод строки
\tтабуляция
\"двойная кавычка внутри строки
\\сама обратная косая черта
\$знак доллара
Kotlin
fun main() {
    println("Line 1\nLine 2")
    println("He said: \"Hi\"")
    println("C:\\Users")
}
Вывод
Line 1
Line 2
He said: "Hi"
C:\Users

Многострочный текст

Текст в тройных кавычках """ может занимать несколько строк, и особые символы в нём не нужны. trimIndent() убирает общий отступ слева и пустые первую и последнюю строки:

Kotlin
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):

Kotlin
fun main() {
    val x = 10.0 / 3
    println("%.2f".format(x))
}

В системе с русскими настройками вывод будет 3,33 — с запятой, в английской — 3.33. Как получить точку всегда — в справке Как вывести число с двумя знаками после запятой.

Коротко

Проверьте себя

1. Что вернёт readln(), если набрать 25?
2. Что выведет программа?
Kotlin
fun main() {
    val a = 4
    val b = 6
    println("$a + $b = ${a + b}")
}
3. Как вывести строку Path: C:\temp?
4. Как прочитать два целых числа, набранных в одной строке через пробел?