Nhập dữ liệu từ Bàn phím trong Kotlin
1. Giới thiệu
Trong Kotlin, để nhập dữ liệu từ bàn phím (console), chúng ta sử dụng hàm readln() hoặc readLine().
So sánh với Python:
- Python:
input() - Kotlin:
readln()hoặcreadLine()
2. Hàm readln() - Đọc một dòng
2.1. Cú pháp cơ bản
fun main() {
println("Nhập tên của bạn:")
val name = readln()
println("Xin chào, $name!")
}Giải thích:
readln()đọc một dòng văn bản từ console- Kết quả trả về là kiểu
String - Chương trình sẽ dừng lại chờ người dùng nhập và nhấn Enter
2.2. Nhập và hiển thị thông tin
fun main() {
print("Nhập tên: ")
val name = readln()
print("Nhập tuổi: ")
val age = readln()
println("\n--- Thông tin ---")
println("Tên: $name")
println("Tuổi: $age")
}3. Chuyển đổi kiểu dữ liệu
3.1. Chuyển sang số nguyên (Int)
readln() luôn trả về String, nên cần chuyển đổi kiểu:
fun main() {
print("Nhập tuổi của bạn: ")
val ageString = readln()
val age = ageString.toInt() // Chuyển String sang Int
println("Năm sau bạn ${age + 1} tuổi")
}Cách viết ngắn gọn:
fun main() {
print("Nhập tuổi: ")
val age = readln().toInt() // Chuyển đổi trực tiếp
println("Năm sau bạn ${age + 1} tuổi")
}3.2. Các hàm chuyển đổi kiểu
| Hàm | Chuyển sang | Ví dụ |
|---|---|---|
toInt() | Int | "123".toInt() → 123 |
toLong() | Long | "999999".toLong() |
toDouble() | Double | "3.14".toDouble() → 3.14 |
toFloat() | Float | "2.5".toFloat() → 2.5f |
toBoolean() | Boolean | "true".toBoolean() → true |
print("Nhập chiều cao (m): ")
val height = readln().toDouble()
print("Nhập cân nặng (kg): ")
val weight = readln().toDouble()
val bmi = weight / (height * height)
println("Chỉ số BMI: %.2f".format(bmi))4. Xử lý lỗi khi nhập dữ liệu
4.1. Xử lý NumberFormatException
Khi người dùng nhập sai định dạng, sẽ gây ra lỗi:
// Code này sẽ lỗi nếu nhập chữ thay vì số
val age = readln().toInt() // NumberFormatException!Giải pháp: Sử dụng try-catch
fun main() {
print("Nhập tuổi: ")
try {
val age = readln().toInt()
println("Tuổi của bạn: $age")
} catch (e: NumberFormatException) {
println("Lỗi: Vui lòng nhập số hợp lệ!")
}
}4.2. Sử dụng toIntOrNull()
Thay vì throw exception, trả về null nếu không hợp lệ:
fun main() {
print("Nhập tuổi: ")
val age = readln().toIntOrNull()
if (age != null) {
println("Tuổi: $age")
} else {
println("Dữ liệu không hợp lệ!")
}
}Sử dụng Elvis operator:
print("Nhập tuổi: ")
val age = readln().toIntOrNull() ?: 0 // Mặc định là 0 nếu lỗi
println("Tuổi: $age")5. Hàm readLine() - Nullable
readLine() trả về String? (nullable), cần xử lý null:
fun main() {
println("Nhập tên:")
val name: String? = readLine()
if (name != null) {
println("Xin chào, $name")
} else {
println("Không nhận được dữ liệu")
}
}Sử dụng safe call và Elvis:
val name = readLine() ?: "Guest"
println("Xin chào, $name")Khuyến nghị:
- Sử dụng
readln()(Kotlin 1.6+) - đơn giản hơn, không nullable - Sử dụng
readLine()nếu cần xử lý null
6. Nhập nhiều giá trị trên một dòng
6.1. Sử dụng split()
fun main() {
println("Nhập hai số (cách nhau bởi dấu cách):")
val input = readln().split(" ")
val a = input[0].toInt()
val b = input[1].toInt()
println("Tổng: ${a + b}")
}6.2. Destructuring declaration
println("Nhập tên và tuổi (cách nhau bởi dấu cách):")
val (name, ageStr) = readln().split(" ")
val age = ageStr.toInt()
println("Tên: $name, Tuổi: $age")6.3. Map và chuyển đổi
println("Nhập 3 số (cách nhau bởi dấu cách):")
val numbers = readln().split(" ").map { it.toInt() }
println("Tổng: ${numbers.sum()}")7. Vòng lặp nhập liệu
7.1. Nhập cho đến khi hợp lệ
fun main() {
var age: Int? = null
while (age == null) {
print("Nhập tuổi: ")
age = readln().toIntOrNull()
if (age == null) {
println("Vui lòng nhập số hợp lệ!")
}
}
println("Tuổi của bạn: $age")
}7.2. Nhập danh sách
fun main() {
println("Nhập số lượng sinh viên:")
val n = readln().toInt()
val students = mutableListOf<String>()
repeat(n) { i ->
print("Nhập tên sinh viên ${i + 1}: ")
students.add(readln())
}
println("\nDanh sách sinh viên:")
students.forEachIndexed { index, name ->
println("${index + 1}. $name")
}
}8. Ví dụ thực tế
Ví dụ 1: Tính tổng hai số
fun main() {
print("Nhập số thứ nhất: ")
val a = readln().toInt()
print("Nhập số thứ hai: ")
val b = readln().toInt()
val sum = a + b
println("$a + $b = $sum")
}Ví dụ 2: Tính chỉ số BMI
fun main() {
print("Nhập chiều cao (cm): ")
val heightCm = readln().toDouble()
val heightM = heightCm / 100
print("Nhập cân nặng (kg): ")
val weight = readln().toDouble()
val bmi = weight / (heightM * heightM)
println("Chỉ số BMI của bạn: %.2f".format(bmi))
when {
bmi < 18.5 -> println("Bạn gầy")
bmi < 25.0 -> println("Bạn bình thường")
bmi < 30.0 -> println("Bạn thừa cân")
else -> println("Bạn béo phì")
}
}Ví dụ 3: Kiểm tra số chẵn lẻ
fun main() {
print("Nhập một số nguyên: ")
val number = readln().toIntOrNull()
if (number == null) {
println("Dữ liệu không hợp lệ!")
return
}
if (number % 2 == 0) {
println("$number là số chẵn")
} else {
println("$number là số lẻ")
}
}9. So sánh với Python
| Tính năng | Kotlin | Python |
|---|---|---|
| Nhập chuỗi | readln() | input() |
| Nhập số | readln().toInt() | int(input()) |
| Nhập số thực | readln().toDouble() | float(input()) |
| Xử lý lỗi | toIntOrNull() | try-except |
| Tách chuỗi | split(" ") | split() |
10. Best Practices
- Sử dụng
readln()thay vìreadLine()(Kotlin 1.6+) - Xử lý lỗi với
toIntOrNull()hoặctry-catch - Hiển thị prompt rõ ràng để người dùng biết nhập gì
- Validate dữ liệu trước khi xử lý
- Sử dụng
trim()để loại bỏ khoảng trắng thừa
// Good practice
print("Nhập tuổi của bạn: ")
val age = readln().trim().toIntOrNull()
if (age != null && age > 0 && age < 150) {
println("Tuổi hợp lệ: $age")
} else {
println("Tuổi không hợp lệ!")
}📝 Tóm tắt
readln(): Đọc một dòng từ console (Kotlin 1.6+)readLine(): Đọc một dòng, trả về nullableString?- Chuyển đổi kiểu:
toInt(),toDouble(),toFloat(),toBoolean() - Xử lý lỗi: Sử dụng
toIntOrNull()hoặctry-catch - Tách chuỗi: Sử dụng
split()để nhập nhiều giá trị - Validation: Luôn kiểm tra dữ liệu đầu vào
- Elvis operator:
readln().toIntOrNull() ?: 0cho giá trị mặc định
Last updated on