Nhập dữ liệu từ Bàn phím trong Kotlin
🎯 Mục tiêu: Học cách nhận input từ người dùng qua console với
readln()và xử lý an toàn.
💡 Khái niệm
Trong console application, bạn cần nhận dữ liệu từ người dùng. Kotlin cung cấp hàm readln() (read line) để đọc một dòng input.
fun main() {
println("Nhập tên của bạn:")
val name = readln()
println("Xin chào, $name!")
}Console:
Nhập tên của bạn:
Bumbii
Xin chào, Bumbii!📝 readln() - Hàm đọc input cơ bản
Cú pháp
val input: String = readln()readln() luôn trả về String. Nếu người dùng không nhập gì và nhấn Enter, trả về chuỗi rỗng "".
fun main() {
print("Nhập thông tin: ") // Không xuống dòng
val input = readln()
if (input.isBlank()) {
println("Bạn chưa nhập gì!")
} else {
println("Bạn đã nhập: $input")
}
}🔢 Đọc và parse số
Parse Int
fun main() {
print("Nhập tuổi: ")
val ageInput = readln()
val age = ageInput.toIntOrNull()
if (age != null) {
println("Bạn $age tuổi, năm sau bạn ${age + 1} tuổi")
} else {
println("Tuổi không hợp lệ!")
}
}Parse Double
fun main() {
print("Nhập cân nặng (kg): ")
val weight = readln().toDoubleOrNull() ?: 0.0
print("Nhập chiều cao (m): ")
val height = readln().toDoubleOrNull() ?: 0.0
if (weight > 0 && height > 0) {
val bmi = weight / (height * height)
println("BMI của bạn: ${"%.2f".format(bmi)}")
} else {
println("Dữ liệu không hợp lệ!")
}
}🎯 Pattern: Loop until valid input
fun main() {
var age: Int? = null
while (age == null) {
print("Nhập tuổi (số nguyên dương): ")
age = readln().toIntOrNull()?.takeIf { it > 0 }
if (age == null) {
println("❌ Vui lòng nhập số nguyên dương!")
}
}
println("✅ Tuổi của bạn là: $age")
}📊 Đọc nhiều giá trị từ một dòng
Split by space
fun main() {
print("Nhập 2 số (cách nhau bởi dấu cách): ")
val input = readln()
val parts = input.split(" ")
val a = parts.getOrNull(0)?.toIntOrNull() ?: 0
val b = parts.getOrNull(1)?.toIntOrNull() ?: 0
println("$a + $b = ${a + b}")
}Console:
Nhập 2 số (cách nhau bởi dấu cách): 10 20
10 + 20 = 30Destructuring declaration
fun main() {
print("Nhập 3 số (cách nhau bởi dấu cách): ")
val (a, b, c) = readln().split(" ").map { it.toInt() }
println("Tổng: ${a + b + c}")
println("Trung bình: ${(a + b + c) / 3.0}")
}⚡ Đọc nhiều dòng
While loop
fun main() {
println("Nhập các số (nhập 'done' để kết thúc):")
val numbers = mutableListOf<Int>()
while (true) {
val input = readln()
if (input == "done") break
input.toIntOrNull()?.let { numbers.add(it) }
}
println("Các số đã nhập: $numbers")
println("Tổng: ${numbers.sum()}")
}Repeat
fun main() {
print("Nhập số lượng học sinh: ")
val count = readln().toIntOrNull() ?: 0
val names = mutableListOf<String>()
repeat(count) { index ->
print("Nhập tên học sinh ${index + 1}: ")
names.add(readln())
}
println("Danh sách: $names")
}🛠️ Thực hành
Bài tập 1: Máy tính đơn giản
fun main() {
// TODO: Nhập 2 số và phép tính (+, -, *, /)
// TODO: Tính và in kết quả
}Lời giải:
fun main() {
print("Nhập số thứ nhất: ")
val a = readln().toDoubleOrNull() ?: 0.0
print("Nhập phép tính (+, -, *, /): ")
val operator = readln()
print("Nhập số thứ hai: ")
val b = readln().toDoubleOrNull() ?: 0.0
val result = when (operator) {
"+" -> a + b
"-" -> a - b
"*" -> a * b
"/" -> if (b != 0.0) a / b else Double.NaN
else -> Double.NaN
}
if (result.isNaN()) {
println("Phép tính không hợp lệ!")
} else {
println("Kết quả: $a $operator $b = $result")
}
}Bài tập 2: Đăng ký tài khoản
fun main() {
// TODO: Nhập username, password, confirm password
// TODO: Validate:
// - Username: 4-20 ký tự
// - Password: >= 8 ký tự
// - Confirm password phải khớp
}Lời giải:
fun main() {
println("=== ĐĂNG KÝ TÀI KHOẢN ===")
print("Username (4-20 ký tự): ")
val username = readln()
print("Password (>= 8 ký tự): ")
val password = readln()
print("Xác nhận password: ")
val confirmPassword = readln()
val errors = mutableListOf<String>()
if (username.length !in 4..20) {
errors.add("Username phải từ 4-20 ký tự")
}
if (password.length < 8) {
errors.add("Password phải có ít nhất 8 ký tự")
}
if (password != confirmPassword) {
errors.add("Password xác nhận không khớp")
}
if (errors.isEmpty()) {
println("✅ Đăng ký thành công!")
} else {
println("❌ Lỗi:")
errors.forEach { println(" - $it") }
}
}Bài tập 3: Quiz game
fun main() {
// TODO: Hỏi 3 câu hỏi
// TODO: Tính điểm (mỗi câu đúng được 1 điểm)
}Lời giải:
fun main() {
data class Question(val text: String, val answer: String)
val questions = listOf(
Question("Thủ đô của Việt Nam là gì?", "hanoi"),
Question("1 + 1 = ?", "2"),
Question("Kotlin do công ty nào phát triển?", "jetbrains")
)
var score = 0
println("=== QUIZ GAME ===\n")
questions.forEachIndexed { index, question ->
print("Câu ${index + 1}: ${question.text}\nTrả lời: ")
val answer = readln().lowercase().trim()
if (answer == question.answer) {
println("✅ Đúng!\n")
score++
} else {
println("❌ Sai! Đáp án: ${question.answer}\n")
}
}
println("=== KẾT QUẢ ===")
println("Điểm của bạn: $score/${questions.size}")
}📱 Lưu ý cho Android
[!NOTE] Trong Android, bạn không sử dụng
readln(). Thay vào đó, dữ liệu được nhập qua các UI components nhưEditText.
// Android - không dùng readln()
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val nameEditText = findViewById<EditText>(R.id.nameEditText)
val submitButton = findViewById<Button>(R.id.submitButton)
submitButton.setOnClickListener {
val name = nameEditText.text.toString().trim()
// Xử lý input ở đây
}
}
}⚠️ Lưu ý quan trọng
[!WARNING]
readlnOrNull()vsreadln():// readln() - throw exception nếu EOF val input = readln() // Có thể crash nếu không có input // readlnOrNull() - trả về null nếu EOF (an toàn hơn) val safeInput = readlnOrNull() ?: ""
[!TIP] Luôn trim input:
val input = readln().trim() // Loại bỏ khoảng trắng đầu/cuối
✅ Checklist - Tự kiểm tra
Sau bài học này, bạn có thể:
- Sử dụng
readln()để đọc input từ console - Parse input thành số với
toIntOrNull(),toDoubleOrNull() - Xử lý input không hợp lệ với Elvis operator
?: - Đọc nhiều giá trị với
split() - Tạo vòng lặp để nhận input cho đến khi hợp lệ
- Validate input trước khi sử dụng
Tiếp theo: Các toán tử số học
Last updated on