Wczytywanie danych z konsoli
Do tej pory program tylko wypisywał gotowe dane. Teraz nauczysz się je
wczytywać od użytkownika: poznasz readln(), dowiesz się,
jak zamienić wpisany tekst na liczbę (toInt() i bezpieczne
toIntOrNull()) i zbudujesz program według wzorca
„pobierz – przelicz – wypisz”.
readln() – wczytanie linii tekstu
Funkcja readln() czeka, aż użytkownik wpisze coś z klawiatury
i naciśnie Enter, a następnie zwraca wpisaną linię jako tekst
(String).
fun main() { print("Jak masz na imię? ") // print – kursor zostaje w tej samej linii val imie = readln() // czekamy na wpis i Enter println("Cześć, $imie!") }
Przed wczytaniem warto wypisać pytanie funkcją print (bez przejścia
do nowej linii) – wtedy użytkownik wpisuje odpowiedź zaraz obok pytania. To czysto
kosmetyczne, ale wygląda dużo lepiej.
Gdzie uruchamiać programy z wczytywaniem
Kotlin Playground świetnie sprawdza się do kodu, który tylko coś
wypisuje. Nie udostępnia jednak pola, w które użytkownik mógłby
wpisać dane w trakcie działania programu. Dlatego programy
z readln() uruchamiaj w IntelliJ IDEA – tam okno
konsoli na dole przyjmuje tekst wpisywany z klawiatury.
W IntelliJ uruchom program zieloną strzałką obok main, a następnie
kliknij w okno konsoli i wpisuj dane, zatwierdzając każde Enterem.
Wczytane dane to zawsze String
To kluczowa sprawa: readln() zawsze zwraca tekst –
nawet gdy użytkownik wpisze cyfry. Tekst "5" to nie liczba 5.
Jeśli spróbujesz na nim liczyć, dostaniesz nieoczekiwany wynik.
val a = readln() // użytkownik wpisuje 5 -> "5" (tekst) val b = readln() // użytkownik wpisuje 3 -> "3" (tekst) println(a + b) // "53" – sklejone teksty, a nie 8!
Żeby móc liczyć, trzeba wczytany tekst najpierw zamienić na liczbę – i tym zajmiemy się w następnej sekcji.
Konwersja wejścia: toInt() i toDouble()
Znasz już metody to...() z lekcji o typach. Tutaj wykorzystamy je do
zamiany wczytanego tekstu na liczbę:
print("Podaj wiek: ") val wiek = readln().toInt() // tekst -> Int println("Za rok będziesz mieć ${wiek + 1} lat") print("Podaj wzrost (m): ") val wzrost = readln().toDouble() // tekst -> Double println("Twój wzrost to $wzrost m")
Jeśli użytkownik wpisze coś, co nie jest liczbą (np. "abc" albo zostawi
puste pole), toInt() przerwie program błędem.
Tak samo toInt() na tekście z przecinkiem ("3.5") – do liczb
z przecinkiem służy toDouble(). Bezpieczniejsze rozwiązanie poznasz
w następnej sekcji.
Bezpieczne wczytywanie: toIntOrNull()
Metoda toIntOrNull() działa jak toInt(), ale gdy tekst
nie jest poprawną liczbą, zamiast przerwać program zwraca specjalną
„pustą” wartość null (czyli „brak liczby”). Dzięki temu program nie
pada – ty decydujesz, co zrobić w razie błędnych danych.
| Wpisany tekst | toInt() | toIntOrNull() |
|---|---|---|
"42" | 42 | 42 |
"abc" | ❌ błąd, program pada | ✅ null (brak liczby) |
| puste pole | ❌ błąd | ✅ null |
print("Podaj wiek: ") val wiek = readln().toIntOrNull() // Int albo null if (wiek == null) { println("To nie była poprawna liczba.") } else { println("Za rok będziesz mieć ${wiek + 1} lat.") }
Powyższy przykład używa instrukcji if oraz wartości null.
Oba tematy rozłożymy dokładnie później: if w bloku o sterowaniu
przepływem, a null w osobnym bloku o bezpieczeństwie null. Na razie
zapamiętaj samą zasadę: toIntOrNull() nie wywala programu.
Wzorzec: pobierz – przelicz – wypisz
Większość prostych programów konsolowych ma ten sam szkielet w trzech krokach:
| Krok | Co robimy |
|---|---|
| 1. Pobierz | Wypisz pytanie i wczytaj dane (readln() + konwersja). |
| 2. Przelicz | Wykonaj obliczenia na wczytanych wartościach. |
| 3. Wypisz | Pokaż wynik użytkownikowi (println + szablon). |
fun main() { // 1. POBIERZ print("Podaj szerokość: ") val szerokosc = readln().toInt() print("Podaj wysokość: ") val wysokosc = readln().toInt() // 2. PRZELICZ val pole = szerokosc * wysokosc val obwod = 2 * (szerokosc + wysokosc) // 3. WYPISZ println("Pole: $pole") println("Obwód: $obwod") }
Częste błędy
❌ Błąd 1: liczenie na wczytanym tekście bez konwersji
❌ Sklejanie zamiast dodawania
val a = readln() val b = readln() println(a + b) // wpisując 5 i 3 -> "53"
✅ Najpierw toInt()
val a = readln().toInt() val b = readln().toInt() println(a + b) // wpisując 5 i 3 -> 8
❌ Błąd 2: toInt() na danych, które mogą nie być liczbą
❌ Program pada na „abc”
val n = readln().toInt() // wpisując "abc" program // przerywa się błędem
✅ Bezpieczne toIntOrNull()
val n = readln().toIntOrNull() // "abc" -> null, // program nie pada
❌ Błąd 3: toInt() dla liczby z przecinkiem
❌ „3.5” nie jest Int
val x = readln().toInt() // wpisując 3.5 -> błąd!
✅ Liczby ułamkowe: toDouble()
val x = readln().toDouble() // wpisując 3.5 -> 3.5
❌ Błąd 4: średnia wczytanych liczb bez Double
❌ Dzielenie całkowite
val a = readln().toInt() val b = readln().toInt() println((a + b) / 2) // 5 i 8 -> 6 (nie 6.5!)
✅ Konwersja na Double
val a = readln().toInt() val b = readln().toInt() println((a + b) / 2.0) // 5 i 8 -> 6.5
Podsumowanie
readln()wczytuje linię od użytkownika i zwraca ją jako tekst (String).- Programy z wczytywaniem uruchamiaj w IntelliJ IDEA – Playground nie ma pola na dane.
- Aby liczyć, wczytany tekst trzeba skonwertować:
readln().toInt()lubreadln().toDouble(). toInt()przerywa program, gdy tekst nie jest liczbą;toIntOrNull()zwraca wtedynulli program działa dalej.- Typowy szkielet programu: pobierz → przelicz → wypisz.
- Pamiętaj o dzieleniu: aby uzyskać wynik z przecinkiem, użyj
Double(np./ 2.0).
Zadania do wykonania
Zadania uruchamiaj w IntelliJ IDEA (wymagają wczytywania danych).
Poproś użytkownika o imię (readln()) i przywitaj go pełnym zdaniem,
używając szablonu, np. „Miło Cię poznać, Anna!”.
Wczytaj dwie liczby całkowite (pamiętaj o toInt()) i wypisz ich sumę,
różnicę i iloczyn.
Według wzorca pobierz – przelicz – wypisz napisz program, który wczyta rok urodzenia i wyliczy przybliżony wiek (odejmując rok od bieżącego roku, który możesz wpisać na sztywno).
Napisz przelicznik ceny netto na brutto: wczytaj cenę netto jako Double
(toDouble()), dolicz 23% VAT i wypisz cenę brutto. Dla ambitnych:
spróbuj wczytać cenę przez toDoubleOrNull() i obsłużyć sytuację,
gdy użytkownik wpisze coś, co nie jest liczbą.