⌨️ 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.
💡 Khái niệm
Phần tiêu đề “💡 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:BumbiiXin chào, Bumbii!📝 readln() - Hàm đọc input cơ bản
Phần tiêu đề “📝 readln() - Hàm đọc input cơ bản”Cú pháp
Phần tiêu đề “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ố
Phần tiêu đề “🔢 Đọc và parse số”Parse Int
Phần tiêu đề “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
Phần tiêu đề “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
Phần tiêu đề “🎯 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
Phần tiêu đề “📊 Đọc nhiều giá trị từ một dòng”Split by space
Phần tiêu đề “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 2010 + 20 = 30Destructuring declaration
Phần tiêu đề “Destructuring 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
Phần tiêu đề “⚡ Đọc nhiều dòng”While loop
Phần tiêu đề “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
Phần tiêu đề “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
Phần tiêu đề “🛠️ 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
Phần tiêu đề “📱 Lưu ý cho Android”// 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
Phần tiêu đề “⚠️ Lưu ý quan trọng”✅ Checklist - Tự kiểm tra
Phần tiêu đề “✅ 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