Te ćwiczenia są częścią kursu Kotlin dla programistów. Skorzystaj z tego kursu, jeśli będziesz wykonywać kolejno kilka ćwiczeń z programowania. W zależności od Twojej wiedzy możesz mieć dostęp do niektórych sekcji. Ten kurs jest przeznaczony dla programistów, którzy znają język zorientowany na obiekty i chcą się dowiedzieć Kotlina.
Wprowadzenie
W tym ćwiczeniu z podstaw programowania poznasz podstawy języka Kotlin: typy danych, operatory, zmienne, struktury kontrolne oraz wartości null i null. Ten kurs jest przeznaczony dla programistów, którzy znają język zorientowany na obiekty i chcą się nauczyć Kotlina.
Lekcje nie obejmują jednej przykładowej aplikacji, ale mają one na celu pogłębianie wiedzy. Między innymi należy jednak pamiętać o zależności od siebie. W połączeniu wiele z przykładów wykorzystuje motyw akwariowy. A jeśli chcesz zobaczyć pełne informacje o oceanarium, zapoznaj się z kursem Kotlin Bootcamp for Programmers (Ukocity) na platformie Udacity.
Co musisz wiedzieć
- Jak utworzyć projekt w IntelliJ IDEA
- Jak otwierać i uruchamiać kod w REPL (Read-Eval-Print Loop) w IntelliJ IDEA (Tools > Kotlin > Kotlin REPL)
Czego się nauczysz
- Jak używać typów danych, operatorów i zmiennych w Kotlin
- Praca z wartościami logicznymi i warunkami
- Różnica między zmiennymi null i null
- Jak działają tablice, listy i pętle w Kotlinie
Jakie zadania wykonasz:
- Naucz się podstaw Kotlina w Kotlin
W tym zadaniu poznasz operatory i typy w języku programowania Kotlin.
Krok 1. Poznaj operatory liczbowe
- Otwórz IntelliJ IDEA, jeśli jeszcze nie jest otwarty.
- Aby otworzyć Kotlin REPL, wybierz Tools (Narzędzia) > Kotlin > Kotlin REPL.
Tak jak w przypadku innych języków, Kotlin korzysta z atrybutów +
, -
, *
i /
, aby dodać plus, minus, czas i dzielenie. Kotlin obsługuje też różne typy liczb, takie jak Int
, Long
, Double
i Float
.
- Wpisz następujące wyrażenia w REPL. Aby zobaczyć wynik, naciśnij
Control+Enter
(Command+Enter
na Macu) po każdym z nich.
1+1 ⇒ res8: kotlin.Int = 2 53-3 ⇒ res9: kotlin.Int = 50 50/10 ⇒ res10: kotlin.Int = 5 1.0/2.0 ⇒ res11: kotlin.Double = 0.5 2.0*3.5 ⇒ res12: kotlin.Double = 7.0
Pamiętaj, że wyniki operacji zachowują typy operandów, więc 1/2 = 0, ale 1,0/2,0 = 0,5.
- Wypróbuj różne wyrażenia z różnymi kombinacjami liczb całkowitych i dziesiętnych.
6*50 ⇒ res13: kotlin.Int = 300 6.0*50.0 ⇒ res14: kotlin.Double = 300.0 6.0*50 ⇒ res15: kotlin.Double = 300.0
- Wywołaj kilka metod numerów. Kotlin zachowuje liczby jako podstawowe, ale pozwala wywoływać metody wyrażone w postaci obiektów.
2.times(3) ⇒ res5: kotlin.Int = 6 3.5.plus(4) ⇒ res8: kotlin.Double = 7.5 2.4.div(2) ⇒ res9: kotlin.Double = 1.2
Krok 2. Przećwicz użycie typów
Kotlin domyślnie nie konwertuje typów liczb, więc nie możesz przypisać krótkiej wartości bezpośrednio do długiej zmiennej ani Byte
do Int
. Jest to spowodowane częstym błędem w programach. Podczas przesyłania możesz w każdej chwili przypisać wartości do różnych typów.
- Aby zobaczyć możliwe przesyłanie, zdefiniuj zmienną typu
Int
w REPL.
val i: Int = 6
- Utwórz nową zmienną, a potem wpisz nazwę zmiennej widoczną powyżej i ciąg
.to
.
val b1 = i.to
IntelliJ IDEA wyświetla listę możliwych realizacji. To autouzupełnianie działa w przypadku zmiennych i obiektów dowolnego typu.
- Wybierz z listy
toByte()
i wydrukuj zmienną.
val b1 = i.toByte()
println(b1)
⇒ 6
- Przypisz wartość
Byte
do zmiennych różnych typów.
val b2: Byte = 1 // OK, literals are checked statically
println(b2)
⇒ 1
val i1: Int = b2
⇒ error: type mismatch: inferred type is Byte but Int was expected
val i2: String = b2
⇒ error: type mismatch: inferred type is Byte but String was expected
val i3: Double = b2
⇒ error: type mismatch: inferred type is Byte but Double was expected
- Jeśli projekt zwrócił błędy, spróbuj je przesłać.
val i4: Int = b2.toInt() // OK!
println(i4)
⇒ 1
val i5: String = b2.toString()
println(i5)
⇒ 1
val i6: Double = b2.toDouble()
println(i6)
⇒ 1.0
- Aby ułatwić czytanie długich stałych liczbowych, Kotlin umożliwia umieszczanie podkreśleń w cyfrach, gdzie ma to sens. Spróbuj wpisać różne stałe wartości liczbowe.
val oneMillion = 1_000_000 val socialSecurityNumber = 999_99_9999L val hexBytes = 0xFF_EC_DE_5E val bytes = 0b11010010_01101001_10010100_10010010
Krok 3. Poznaj wartość typów zmiennych
Kotlin obsługuje 2 typy zmiennych: zmienne i niezmienne. W aplikacji val
możesz przypisać wartość raz. Jeśli spróbujesz ponownie przypisać coś, pojawi się błąd. Za pomocą wartości var
możesz przypisać wartość, a następnie zmienić ją później w programie.
- Zdefiniuj zmienne za pomocą
val
ivar
, a następnie przypisz do nich nowe wartości.
var fish = 1
fish = 2
val aquarium = 1
aquarium = 2
⇒ error: val cannot be reassigned
Możesz przypisać wartość fish
, a potem ustawić nową wartość, bo jest ona zdefiniowana w var
. Przypisanie nowej wartości do funkcji aquarium
powoduje wyświetlenie błędu, ponieważ jest zdefiniowany za pomocą atrybutu val
.
Typ przechowywany w zmiennej jest określany, gdy kompilator ustali go na podstawie kontekstu. Jeśli chcesz, możesz zawsze określić typ zmiennej, korzystając z notacji dwukropka.
- Zdefiniuj niektóre zmienne i wyraźnie określ typ.
var fish: Int = 12
var lakes: Double = 2.5
Po przypisaniu typu przez Ciebie lub kompilatora nie możesz go zmienić lub wystąpił błąd.
Krok 4. Więcej informacji o ciągach tekstowych
Ciągi znaków w Kotlin działają podobnie do ciągów znaków w dowolnym innym języku programowania. Ciągi tekstowe w języku "
używają tylko znaków, a '
– pojedynczych znaków. Możesz też połączyć ciągi z operatorem +
. Szablony ciągów możesz tworzyć, łącząc je z wartościami. Nazwa $
variable
zostanie zastąpiona tekstem reprezentującym wartość. Jest to tzw. interpolacja zmiennych.
- Utwórz szablon ciągu znaków.
val numberOfFish = 5
val numberOfPlants = 12
"I have $numberOfFish fish" + " and $numberOfPlants plants"
⇒ res20: kotlin.String = I have 5 fish and 12 plants
- Utwórz szablon ciągu znaków z wyrażeniem. Tak jak w przypadku innych języków, wartością może być wyrażenie. Do definiowania wyrażenia użyj nawiasów klamrowych
{}
.
"I have ${numberOfFish + numberOfPlants} fish and plants"
⇒ res21: kotlin.String = I have 17 fish and plants
W tym zadaniu poznasz wartości logiczne i sprawdzasz warunki w języku programowania Kotlin. Podobnie jak inne języki Kotlin ma wartości logiczne i operatory logiczne, np. mniejsze niż, równe, większe itd. (<
, ==
, >
, !=
, <=
, >=
).
- Napisz oświadczenie
if
/else
.
val numberOfFish = 50
val numberOfPlants = 23
if (numberOfFish > numberOfPlants) {
println("Good ratio!")
} else {
println("Unhealthy ratio")
}
⇒ Good ratio!
- Spróbuj podać zakres w instrukcji
if
. Testowany przez Kotlin warunek może używać zakresów.
val fish = 50
if (fish in 1..100) {
println(fish)
}
⇒ 50
- Napisz
if
z wieloma przypadkami. W przypadku bardziej złożonych warunków użyj logicznych i&&
oraz logicznych lub||
. Tak jak w przypadku innych języków, możesz używać wielu przypadków za pomocą funkcjielse if
.
if (numberOfFish == 0) {
println("Empty tank")
} else if (numberOfFish < 40) {
println("Got fish!")
} else {
println("That's a lot of fish!")
}
⇒ That's a lot of fish!
- Wypróbuj oświadczenie
when
. Jest to łatwiejsza metoda zapisu serii instrukcjiif
/else if
/else
w Kotlinie za pomocą instrukcjiwhen
, która wygląda tak samo jak wyrażenieswitch
w innych językach. Warunki mogą też być używane w instrukcjachwhen
.
when (numberOfFish) {
0 -> println("Empty tank")
in 1..39 -> println("Got fish!")
else -> println("That's a lot of fish!")
}
⇒ That's a lot of fish!
W tym zadaniu poznasz zmienne o wartości null i puste. Błędy programowe dotyczące wartości null powodują niezliczone błędy. Kotlin stara się zmniejszyć liczbę błędów, wprowadzając zmienne o wartości null.
Krok 1. Więcej informacji o wartości null
Domyślnie zmienne nie mogą mieć wartości null
.
- Zadeklaruj atrybut
Int
i przypisz do niego elementnull
.
var rocks: Int = null
⇒ error: null can not be a value of a non-null type Int
- Użyj operatora znaku zapytania
?
po typie, by wskazać, że zmienna może być pusta. Zadeklaruj atrybutInt?
i przypisz do niego elementnull
.
var marbles: Int? = null
Jeśli masz złożone typy danych, takie jak lista:
- Możesz dopuścić puste elementy listy.
- Możesz na liście wpisać wartość null, ale jeśli zasada nie jest pusta, jej elementy nie mogą mieć wartości null.
- Zarówno lista, jak i elementy mogą być puste.
Listy i niektóre złożone typy danych zostaną omówione w dalszym zadaniu.
Krok 2. Poznaj operatory ?:
Możesz używać null
do testowania z operatorem ?
, oszczędzając Ci kłopoty związane z tworzeniem instrukcji if
/else
.
- Napisz kod dłużej, aby sprawdzić, czy zmienna
fishFoodTreats
nie jestnull
. Następnie zmniejsz tę zmienną.
var fishFoodTreats = 6
if (fishFoodTreats != null) {
fishFoodTreats = fishFoodTreats.dec()
}
- Spójrz na sposób zapisu słowa Kotlin za pomocą operatora
?
.
var fishFoodTreats = 6
fishFoodTreats = fishFoodTreats?.dec()
- Do łańcucha testów pustych możesz też używać operatora
?:
. Spójrz na ten przykład:
fishFoodTreats = fishFoodTreats?.dec() ?: 0
Jest to skrót , który określa, czy fishFoodTreats
ma wartość inną niż null
, obniż i użyj tej wartości. W przeciwnym razie użyj wartości po ?:
, która wynosi 0." Jeśli fishFoodTreats
ma wartość null
, ocena jest zatrzymana, a metoda dec()
nie jest wywoływana.
Wskazówka na temat pustych wskaźników
Jeśli kochasz NullPointerExceptions
, Kotlin pozwoli Ci je zachować. Operator potwierdzenia o wartości null: !!
(podwójny zbiór) przekształca dowolną wartość na typ inny niż null i tworzy wyjątek, jeśli wartość to null
.
val len = s!!.length // throws NullPointerException if s is null
W tym zadaniu poznasz tablice i listy oraz dowiesz się, jak tworzyć pętle w języku programowania Kotlin.
Krok 1. Utwórz listy
Listy są podstawowym typem w Kotlinie i przypominają listy w innych językach.
- Zadeklaruj listę za pomocą
listOf
i ją wydrukuj. Tej listy nie można zmienić.
val school = listOf("mackerel", "trout", "halibut")
println(school)
⇒ [mackerel, trout, halibut]
- Zadeklaruj listę, którą można zmieniać za pomocą
mutableListOf
. Usuń element.
val myList = mutableListOf("tuna", "salmon", "shark")
myList.remove("shark")
⇒ res36: kotlin.Boolean = true
Metoda remove()
zwraca true
, gdy zostanie usunięty.
Krok 2. Utwórz tablice
Podobnie jak inne języki, Kotlin ma tablice. W przeciwieństwie do list w Kotlinie, które zawierają wersje stałe i zmienne, nie ma wersji Array
z możliwością zmiany. Po utworzeniu tablicy rozmiar jest stały. Nie możesz dodawać ani usuwać elementów, tylko kopiując je do nowej tablicy.
Zasady korzystania z atrybutów val
i var
są takie same jak w przypadku tablic.
- Zadeklaruj tablicę ciągów znaków za pomocą
arrayOf
. Wydrukuj te dane przy użyciu narzędzia tablicyjava.util.Arrays.toString()
.
val school = arrayOf("shark", "salmon", "minnow")
println(java.util.Arrays.toString(school))
⇒ [shark, salmon, minnow]
- Tablica zadeklarowana jako
arrayOf
nie ma typu powiązanego z elementami, więc można zestawiać ze sobą typy, co jest przydatne. Zadeklaruj tablicę o różnych typach.
val mix = arrayOf("fish", 2)
- Tablice możesz też zadeklarować jednym typem dla wszystkich elementów. Zadeklaruj tablicę liczb całkowitych za pomocą funkcji
intArrayOf()
. W przypadku tablic innego typu istnieją odpowiednie kreatory, czyli funkcje tworzenia instancji.
val numbers = intArrayOf(1,2,3)
- Połącz 2 tablice z operatorem
+
.
val numbers = intArrayOf(1,2,3)
val numbers3 = intArrayOf(4,5,6)
val foo2 = numbers3 + numbers
println(foo2[5])
=> 3
- Wypróbuj różne kombinacje zagnieżdżonych tablic i list. Tak jak w przypadku innych języków, możesz zagnieżdżać tablice i listy. Oznacza to, że jeśli umieścisz tablicę w tablicy, masz tablicę tablic, a nie spłaszczony jej blok. Elementy tablicy mogą być też listami, a elementami list mogą być tablicami.
val numbers = intArrayOf(1, 2, 3)
val oceans = listOf("Atlantic", "Pacific")
val oddList = listOf(numbers, oceans, "salmon")
println(oddList)
⇒ [[I@89178b4, [Atlantic, Pacific], salmon]
Pierwszy element, numbers
, to Array
. Gdy nie wydrukusz za pomocą narzędzia tablicy, Kotlin wydrukuje adres zamiast zawartości tablicy.
- Kotlin ma miłą zaletę: możesz inicjować tablice za pomocą kodu, a nie na 0. Skorzystaj z tego przykładu:
val array = Array (5) { it * 2 }
println(java.util.Arrays.toString(array))
⇒ [0, 2, 4, 6, 8]
Kod inicjowania jest między nawiasami klamrowymi: {}
. W kodzie it
odnosi się do indeksu tablicy, zaczynając od 0.
Krok 3. Utwórz pętle
Teraz gdy masz już listy i tablice, pętle elementów działają zgodnie z oczekiwaniami.
- Utwórz tablicę. Użyj pętli
for
, aby iterować przez tablicę i drukować elementy.
val school = arrayOf("shark", "salmon", "minnow")
for (element in school) {
print(element + " ")
}
⇒ shark salmon minnow
- W Kotlin możesz wyświetlać elementy i indeksy w tym samym czasie. Skorzystaj z tego przykładu:
for ((index, element) in school.withIndex()) {
println("Item at $index is $element\n")
}
⇒ Item at 0 is shark Item at 1 is salmon Item at 2 is minnow
- Wypróbuj różne rozmiary i zakresy kroków. Zakres liczb lub znaków może być określony alfabetycznie. Tak jak w przypadku innych języków, nie musisz przechodzić dalej o 1. Aby się cofnąć, użyj
downTo
.
for (i in 1..5) print(i)
⇒ 12345
for (i in 5 downTo 1) print(i)
⇒ 54321
for (i in 3..6 step 2) print(i)
⇒ 35
for (i in 'd'..'g') print (i)
⇒ defg
- Wypróbuj kilka pętli. Podobnie jak inne języki Kotlin zawiera pętle
while
, pętledo...while
oraz operatory++
i--
. Kotlin ma teżrepeat
pętli.
var bubbles = 0
while (bubbles < 50) {
bubbles++
}
println("$bubbles bubbles in the water\n")
do {
bubbles--
} while (bubbles > 50)
println("$bubbles bubbles in the water\n")
repeat(2) {
println("A fish is swimming")
}
⇒ 50 bubbles in the water 49 bubbles in the water A fish is swimmingA fish is swimming
Kotlin bardzo przypomina inne języki, takie jak operatory, listy i pętle, ale występują między nimi istotne różnice.
Te funkcje mogą być inne w Kotlin niż w innych językach:
- Typy Kotlin nie są domyślnie konwertowane – użyj przesyłania.
- Zmienne zadeklarowane za pomocą funkcji
val
można przypisać tylko raz. - Zmienne Kotlin domyślnie nie są puste. Użyj wartości
?
, aby zmienne miały wartość null. - Kotlin umożliwia przeglądanie indeksu i elementów tablicy w tym samym czasie w pętli
for
.
Te konstrukcje programowania Kotlin są podobne do tych w innych językach:
- Tablice i listy mogą mieć jeden typ lub typy mieszane.
- Tablice i listy mogą być zagnieżdżone.
- Pętle możesz tworzyć za pomocą
for
,while
,do
/while
irepeat
. - Instrukcja
when
to wersja instrukcjiswitch
Kotlin, alewhen
jest bardziej elastyczna.
Dokumentacja Kotlin
Jeśli chcesz dowiedzieć się więcej na dowolny temat dotyczący tego kursu lub nie wiesz, co zrobić, wejdź na https://kotlinlang.org.
- Konwersja typów dla pełnoletnich
- Definiowanie zmiennych
- Szablony ciągów
- Dostępne wartości
- Listy
- Tablica
if
,when
,for
,while
- Operator
?:
(Elvis) - Operator
!!
Samouczki Kotlin
Na stronie https://try.kotlinlang.org znajdziesz szczegółowe samouczki o nazwie Kotlin Koans, internetowe narzędzie do tłumaczenia, a także kompletny zestaw dokumentacji referencyjnej z przykładami.
Kurs Udacity
Kurs Udacity na ten temat znajdziesz na kursie Kotlin dla programistów.
IntelLIJ IDEA
Dokumentację IntelliJ IDEA znajdziesz na stronie JetBrains.
Ta sekcja zawiera listę możliwych zadań domowych dla uczniów, którzy pracują w ramach tego ćwiczenia w ramach kursu prowadzonego przez nauczyciela. To nauczyciel może wykonać te czynności:
- W razie potrzeby przypisz zadanie domowe.
- Poinformuj uczniów, jak przesyłać zadania domowe.
- Oceń projekty domowe.
Nauczyciele mogą wykorzystać te sugestie tak długo, jak chcą lub chcą, i mogą przypisać dowolne zadanie domowe.
Jeśli samodzielnie wykonujesz te ćwiczenia z programowania, możesz sprawdzić swoją wiedzę w tych zadaniach domowych.
Odpowiedz na te pytania
Pytanie 1
Który z tych stwierdzeń zawiera listę ciągów znaków, których nie można zmienić?
▢ val school = arrayOf("shark", "salmon", "minnow")
▢ var school = arrayOf("shark", "salmon", "minnow")
▢ val school = listOf("shark", "salmon", "minnow")
▢ val school = mutableListOf("shark", "salmon", "minnow")
Pytanie 2
Jaki będzie wynik tego kodu?for (i in 3..8 step 2) print(i)
▢ 345678
▢ 468
▢ 38
▢ 357
Pytanie 3
Jaki jest cel znaku zapytania w tym kodzie?var rocks: Int? = 3
▢ Typ zmiennej rocks
nie jest stały.
▢ Zmienną rocks
można ustawić na wartość null.
▢ Zmienną rocks
nie można ustawić na wartość null.
▢ Zmienna rocks
nie powinna być od razu inicjowana.
Przejdź do następnej lekcji:
Omówienie kursu, w tym linki do innych ćwiczeń z programowania, znajdziesz w artykule "Kotlin Bootcamp for Programmers: Witamy na kursie."