Bỏ qua để đến nội dung

⌨️ Nhập dữ liệu (readln)

🎯 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.


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!

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")
}
}

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ệ!")
}
}
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ệ!")
}
}

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")
}

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 = 30
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}")
}

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()}")
}
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")
}

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}")
}

// 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
}
}
}


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