Category Archives: 02.Kiểu dữ liệu Kotlin

Bài 9- Nhập dữ liệu từ bàn phím với Kotlin


Chào các bạn đến với bài học Nhập dữ liệu từ bàn phím với Kotlin, trong bài học này Tui sẽ hướng dẫn các bạn cách thức nhập dữ liệu từ bàn phím như thế nào.

Với Kotlin, để nhập dữ liệu từ bàn phím ta dùng hàm readLine(), hàm này nằm trong thư viện mặc định kotlin.io

Hàm readLine() sẽ trả về một chuỗi dữ liệu được nhập vào từ bàn phím hoặc là giá trị null nếu như không có dữ liệu.

Từ chuỗi kết quả này ta có thể ép kiểu dữ liệu về bất kỳ kiểu nào mà ta mong muốn ứng với giá trị nhập vào cho phù hợp.

Ví dụ để nhập một chuỗi:


fun main(args: Array) {
println("Bồ nhí bạn tên gì?:")
var ten:String?= readLine()
println("Bạn nhập tên:")
println(ten)
}

Bạn để ý ở trên Tui khai báo String? tức là kiểu dữ liệu có dạng nullable, đây là một cách thức khai báo mới trong Kotlin. Tương tự cho Int?, Double?

Với một số có định dạng chuỗi trong Kotlin ta luôn luôn chuyển được kiểu dữ liệu về đúng dạng thức ban đầu. String trong Kotlin được hỗ trợ tập các phương thức:

Hàm Mô tả Ví dụ
toBoolean()  Chuyển chuỗi về Boolean  “true”.toBoolean()
toByte()  Chuyển chuỗi về Byte “3”.toByte()
toShort()  Chuyển chuỗi về Short “30”.toShort()
toInt()  Chuyển chuỗi về Int “15”.toInt()
toLong()  Chuyển chuỗi về Long “100”.toLong()
toFloat()  Chuyển chuỗi về Float “15.5”.toFloat()
toDouble()  Chuyển chuỗi về Double “15.5”.toDouble()

Ví dụ Coding:


fun main(args: Array) {
var x1:Boolean="true".toBoolean()
println(x1)

var x2:Byte="3".toByte()
println(x2)

var x3:Short="30".toShort()
println(x3)

var x4:Int="15".toInt()
println(x4)

var x5:Long="100".toLong()
println(x5)

var x6:Float="15.5".toFloat()
println(x6)

var x7:Double="15.5".toDouble()
println(x7)
}

Chạy đoạn code trên ta sẽ có các kết quả:

true
3
30
15
100
15.5
15.5

Ví dụ viết chương trình giải phương  trình Bậc 1, bài này Tui sẽ áp dụng readLine() nhập liệu từ bản phím để giải phương trình bậc 1, tuy nhiên Tui sẽ không giải thích cách thức hoạt động của If, Else mà bài sau Tui mới đi vào chi tiết:


fun main(args: Array) {
var a:Double=0.0
var b:Double=0.0
println("Nhập a:")
var s= readLine()
if(s!=null)
a=s.toDouble()
println("Nhập b:")
s= readLine()
if(s!=null)
b=s.toDouble()
if(a==0.0 && b==0.0)
{
println("Phương trình vô số nghiệm")
}
else if(a==0.0 && b!=0.0)
{
println("Phương trình vô nghiệm")
}
else
{
var x=-b/a
println("No x="+x)
}
}

Chạy đoạn code trên ta sẽ có các kết quả:

Nhập a:
3
Nhập b:
7
No x=-2.3333333333333335

Như vậy tới đây Tui đã hướng dẫn xong cách nhập dữ liệu từ bàn phím trong Kotlin, các bạn chú ý học kỹ và hiểu được nó thông qua các ví dụ ở trên nhé.

Các bạn có thể tải source code bài này ở đây: http://www.mediafire.com/file/4456wayewzewxa1/HocNhapLieu.rar

Hẹn gặp các bạn ở những bài tiếp theo

Chúc các bạn thành công!

Trần Duy Thanh (http://ssoftinc.com/)

Bài 8 – Các toán tử quan trọng trong Kotlin


Mỗi một ngôn ngữ lập trình đều có một tập các toán tử quan trọng để giúp ta tạo các biểu thức trong mã lệnh để giải quyết một số vấn đề liên quan nào đó, và các toán tử này cũng được Kotlin Override thành các phương thức(ta có thể sử dụng các Operator thuần túy và cũng có thể dùng bằng các phương thức):

  1. Toán tử một ngôi
  2. Toán tử số học cơ bản
  3. Toán tử gán
  4. Toán tử So sánh
  5. Toán tử Logic
  6. Toán tử tăng dần giảm dần
  7. Độ ưu tiên toán tử

Bây giờ ta đi chi tiết vào từng loại toán tử:

1. Toán tử một ngôi:

Toán tử Mô tả Phương thức Ví dụ
 +  Số dương a.unaryPlus() var a:Int=-8
var b=a.unaryPlus()
 –  Số âm a.unaryMinus() var a:Int=-8
var b=a.unaryMinus()

Ví dụ:


fun main(args: Array) {
var a:Int=-8
var b=a.unaryPlus()
var c=a.unaryMinus()
println("a="+a)
println("b="+b)
println("c="+c)
}

Chạy đoạn code trên ta sẽ có các kết quả:

a=-8
b=-8
c=8

Chú ý bản thân unaryPlus và unaryMinus không làm thay đổi giá trị nội tại của biến, mà nó trả về một giá trị, ta cần có biến để lưu lại giá trị này.

2. Toán tử số học cơ bản:

Toán tử Mô tả Phương thức Ví dụ
 +  Cộng a.plus(b)  8 + 5 => 13

8.plus(5) =>13

 –  Trừ a.minus(b) 8-5 =>3

8.minus(5) =>3

 *  Nhân times  8*5 =>40

8.times(5) =>40

 /  Chia div  8/5  => 1

8.div(5) => 1

 %  Chia lấy phần dư rem  8 % 5 => 3

8.rem(5) =>3

Ví dụ:


fun main(args: Array) {
var a:Int=8
var b:Int=5
println("Phép cộng cách 1:"+a+"+"+b+"="+(a+b))
println("Phép cộng cách 2:"+a+"+"+b+"="+(a.plus(b)))
println("Phép trừ cách 1:"+a+"-"+b+"="+(a-b))
println("Phép trừ cách 2:"+a+"-"+b+"="+(a.minus(b)))
println("Phép nhân cách 1:"+a+"*"+b+"="+(a*b))
println("Phép nhân cách 2:"+a+"*"+b+"="+(a.times(b)))
println("Phép chia cách 1:"+a+"/"+b+"="+(a/b))
println("Phép chia cách 2:"+a+"/"+b+"="+(a.div(b)))
println("Lấy dư cách 1:"+a+"/"+b+"="+(a%b))
println("Lấy dư cách 2:"+a+"/"+b+"="+(a.rem(b)))
println(8.plus(9))
}

Chạy đoạn code trên ta sẽ có các kết quả:

Phép cộng cách 1:8+5=13
Phép cộng cách 2:8+5=13
Phép trừ cách 1:8-5=3
Phép trừ cách 2:8-5=3
Phép nhân cách 1:8*5=40
Phép nhân cách 2:8*5=40
Phép chia cách 1:8/5=1
Phép chia cách 2:8/5=1
Lấy dư cách 1:8/5=3
Lấy dư cách 2:8/5=3
17

3. Toán tử gán:

Toán tử Mô tả Ví dụ Tương đương với
 =  Phép gán giá trị bên phải cho biến bên trái dấu bằng  x=5
 +=  Cộng và gán x=2

x+=5

==>x=7

 x=x+5
 -=  Trừ và gán x=2

x-=5

==>x=-3

 x=x-5
 *=  Nhân và gán x=2

x*=5

==>x=10

 x=x*5
 /=  Chia và gán x=7

x/=5

==>x=1

 x=x/5
%=  Chia lấy dư x=7

x%=5

==>x=2

x=x%5

Ví dụ:


fun main(args: Array) {
var x:Int=5
x+=2
println("x="+x)
x-=2
println("x="+x)
x*=2
println("x="+x)
x/=2
println("x="+x)
x=7
x%=3
println("x="+x)
}

Chạy đoạn code trên ta sẽ có các kết quả:

x=7
x=5
x=10
x=5
x=1

4. Toán tử So sánh:

Toán tử Mô tả Phương thức Ví dụ
== So sánh bằng a.equals(b) 5 == 5 => kết quả True
!= So sánh không bằng !a.equals(b) 5 != 5  => kết quả False
< So sánh nhỏ hơn a.compareTo(b) < 0 5 < 5  => kết quả False
<= So sánh nhỏ hơn hoặc bằgg a.compareTo(b) <= 0 5 <= 5 => kết quả True
> So sánh lớn hơn a.compareTo(b) > 0 5 > 5.5 => kết quả False
>= So sánh lớn hơn hoặc bằng a.compareTo(b) >= 0 113>= 5 => kết quả True

Ví dụ:

fun main(args: Array) {
    var a:Int=8
    var b:Int=5
    println(a==b)
    println(a.equals(b))
    println(!a.equals(b))
    println(a.compareTo(b))
    println(3.compareTo(3))
    println(3.compareTo(5))
    println(5.compareTo(3))
}

Chạy đoạn code trên ta sẽ có các kết quả:

false
false
true
1
0
-1
1

5. Toán tử Logic:

Toán tử Mô tả Phương thức Ví dụ
 && Toán tử Và: Nếu cả hai điều kiện là True thì kết quả sẽ là True a.and(b) x=false

y=true

x&&y==>false

 || Toán tử Hoặc: Chỉ cần một điều kiện True thì nó True, tất cả điều kiện False thì nó False a.or(b) x=false
y=truex||y==>true

Ví dụ:


fun main(args: Array) {
var x:Boolean=true
var y:Boolean=false
var z:Boolean=false
println("x="+x)
println("y="+y)
println("z="+z)
println("x&&y="+(x&&y))
println("x.and(y)="+x.and(y))
println("x || y ="+(x || y))
println("x.or(y)="+x.or(y))
println("x || z ="+(x || z))
println("x.or(z)="+x.or(z))
println("x && z ="+(x && z))
println("x.and(z)="+x.and(z))
println("y || z ="+(y || z))
println("y.or(z)="+y.or(z))
println("y && z ="+(y && z))
println("y.and(z)="+y.and(z))
println("x && y && z ="+(x && y && z))
println("x.and(y).and(z)="+x.and(y).and(z))
println("x|| y||z ="+(x|| y||z))
println("x.or(y).or(z)="+x.or(y).or(z))
}

Chạy đoạn code trên ta sẽ có các kết quả:

x=true
y=false
z=false
x&&y=false
x.and(y)=false
x || y =true
x.or(y)=true
x || z =true
x.or(z)=true
x && z =false
x.and(z)=false
y || z =false
y.or(z)=false
y && z =false
y.and(z)=false
x && y && z =false
x.and(y).and(z)=false
x|| y||z =true
x.or(y).or(z)=true

6. Toán tử tăng dần giảm dần

Toán tử Mô tả Phương thức Ví dụ
 ++ Tăng nội tại biến lên một đơn vị a.inc() x=5

x++

=>x=6

 — giảm nội tại biến xuống một đơn vị a.dec() x=5
x–==>x=4

Chú ý bản thân hàm inc() và dec() sẽ không làm thay đổi(tăng hay giảm) giá trị nội tại của biến, ta cần có biến khác để lưu giá trị bị thay đổi.

Với toán tử tăng dần và giảm dần này thì việc đặt ++ hay — đằng trước và đằng sau biến có ý nghĩa khác nhau trong một biểu thức phức tạp, thông thường nó sẽ hoạt động theo nguyên tắc (có một số trường hợp đặc biệt phá vỡ nguyên tắc này ta không xét tới vì nó vô cùng hiếm gặp, chủ yếu do Testing Problem):

  • Bước 1: Ưu tiên xử lý Prefix trước (các ++ hay — đặt trước biến)
  • Bước 2: Tính toán các phép toán còn lại trong biểu thức
  • Bước 3: Gán giá trị ở bước 2 cho biến lưu trữ kết quả ở bên trái dấu bằng
  • Bước 4: Xử lý Post fix (các ++ hay — đặt sau biến)

Ví dụ:


fun main(args: Array) {
var a:Int=5
var b:Int=8
var c:Int=2
a--
b++
var z=a++ + ++b - --c + 7
println("a="+a)
println("b="+b)
println("c="+c)
println("z="+z)
}

Chạy đoạn code trên ta sẽ có các kết quả:

a=5
b=10
c=1
z=20

Các bạn tự giải thích vì sao ra kết quả ở trên nhé, Tui Busy và cũng chủ ý không giải thích, bạn hãy làm theo 4 bước ở trên thì sẽ ra được kết quả

7. Độ ưu tiên toán tử:

Kotlin có ràng buộc thứ tự ưu tiên của các toán tử. Tuy nhiên tốt nhất là các bạn hay điều khiển nó bằng cách dùng cặp ngoặc tròn ( ) để nó rõ nghĩa hơn. Bảng dưới đây để tham khảo độ ưu tiên từ cao xuống thấp (tuy nhiên có thể quên nó đi mà hãy dùng ngoặc tròn () để chỉ định rõ).

Thứ tự ưu tiên Toán tử Miêu tả
1 * / % Phép nhân, chia, lấy phần dư
2 + – Toán tử Cộng, Trừ
3 <= < > >= Các toán tử so sánh
4 <> == != Các toán tử so sánh
5 = %= /=  -= += *= Các toán tử gán
6 && , || Các toán tử logic

Như vậy tới đây Tui đã hướng dẫn xong các toán tử thường dùng nhất trong Kotlin, các bạn chú ý học kỹ và hiểu được nó thông qua các ví dụ ở trên nhé.

Các bạn có thể tải source code bài này ở đây: http://www.mediafire.com/file/ty4wjwe0bor55o0/HocToanTu.rar

Hẹn gặp các bạn ở những bài tiếp theo

Chúc các bạn thành công!

Trần Duy Thanh (http://ssoftinc.com/)

Bài 7 – Ép kiểu dữ liệu trong Kotlin


Trong bài 6 ta đã nắm rõ về các kiểu dữ liệu cũng như cách khai báo biến, trong bài này chúng ta qua phần Ép kiểu dữ liệu trong Kotlin.

Vì sao phải ép kiểu?

Trong quá trình tính toán đôi khi kết quả trả về không còn giống với kiểu dữ liệu chỉ định ban đầu nên ta cần ép kiểu

Khi ép kiểu thường ta gặp 2 trường hợp:

Ép kiểu rộng

Đưa từ kiểu có vùng lưu trữ nhỏ lên kiểu có vùng lưu trữ lớn==>không sợ mất mát dữ liệu.

Ví dụ: Byte=>Short=>Int=>Long=>Float=>Double

Ép kiểu hẹp

Đưa từ kiểu có vùng lưu trữ lớn về kiểu có vùng lưu trữ nhỏ==>có thể bị mất mát dữ liệu

Ví dụ:  Double=>Float=>Long=>Int=>Short=>Byte

Vậy thì Ép như thế nào?

Trong Kotlin, bất kỳ kiểu dữ liệu number nào cũng có sẵn các phương thức :

  • toByte(): Byte
  • toShort(): Short
  • toInt(): Int
  • toLong(): Long
  • toFloat(): Float
  • toDouble(): Double
  • toChar(): Char

Các phương thức trên thường được gọi là ép kiểu tường minh (chỉ đích danh kiểu dữ liệu nào sẽ được ép về), còn gọi tiếng anh cho nó sang miệng là Explicit Conversion.

Ta thử chạy đoạn ép kiểu sau:


var X:Int=10
var D:Double=X.toDouble()

println("X="+X)
println("D="+D)

Kết quả X =10, và D là 10.0 vì 10 được đưa về số Double là 10.0

Trường hợp này là ép kiểu rộng ==> Đưa từ kiểu có vùng lưu trữ nhỏ hơn lên kiểu dữ liệu có vùng lưu trữ lớn hơn

Xét tiếp ví dụ sau:

var F:Double=10.5
var Y:Int = F.toInt()
println("F="+F)
println("Y="+Y)

Kết quả F=10.5 và Y=10 ==> bị mất mát dữ liệu, trường hợp này chính là Ép hẹp, đưa từ kiểu dữ liệu có vùng lưu trữ lớn hơn == > về kiểu dữ liệu có vùng lưu trữ nhỏ hơn . Việc Ép Hẹp này rất nguy hiểm vì nó làm mất mát dữ liệu, đặc biệt các bài toán liên quan tới sai số yêu cầu tối thiểu, hay chuyển khoản ngân hàng. Cần tránh trường hợp này.

Ngoài ra Kotlin còn hỗ trợ một trường hợp là Ép kiểu không tường minh (gọi sang miệng bên tiếng anh làm Implicit Conversion), tức là Kotlin tự nội suy ra kiểu dữ liệu để gán cho biến, thường do các phép toán số học tạo ra, ví dụ:

var t=13L+1
println(t)

13L có kiểu LONG, 1 có kiểu Int ==> Kotlin tự lấy kiểu dữ liệu lớn nhất làm chuẩn và gán cho t==>t có kiểu Long

Như vậy Tui đã trình bày xong cách ép kiểu trong Kotlin, bài này rất quan trọng. Chúng ta cần nắm chắc quy tắc ép kiểu để lựa chọn giải pháp ép kiểu cho đúng. Và chắc chắn trong quá trình lập trình ta phải gặp thường xuyên với các trường hợp ép kiểu.

Soure code : http://www.mediafire.com/file/g6bp1c7og2sqzee/HocEpKieu.rar

Hẹn gặp lại các bạn ở bài tiếp theo

Chúc các bạn thành công

Trần Duy Thanh (http://ssoftinc.com/)

Bài 6-Kiểu dữ liệu và cách khai báo biến trong Kotlin


Mỗi một ngôn ngữ lập trình đều cung cấp một số kiểu dữ liệu có sẵn để ta lưu trữ xử lý. Kotlin cũng vậy, nó cung cấp hàng loạt kiểu dữ liệu như số thực, số nguyên, ký tự, chuỗi, luận lý và mảng… Có điều là mọi kiểu dữ liệu trong Kotlin đều là hướng đối tượng. Việc nắm chắc ý nghĩa của từng kiểu dữ liệu giúp ta lựa chọn cách khai báo biến có kiểu phù hợp, giúp tối ưu hóa hệ thống.

Dưới đây là hình Tui vẽ  tổng quan lại các kiểu dữ liệu được xây dựng sẵn trong Kotlin:

Số thực sẽ có 2 loại đó là Double và Float, Nếu có hằng số để xác định nó là số thực nào thì ta có thể thêm ký tự f hoặc F đằng sau hằng số đó:

ví dụ: 113.5 –>số Double , còn 113.5F hoặc 113.5f –>số Float

Số nguyên có 4 loại : Long, Int, Short, Byte . Ta chú ý trường hợp hằng số của Long và Int bằng cách thêm ký tự L

ví dụ: 113–>số Int, còn 113L –> số Long (không dùng l thường)

Ta có thể khai báo biến cho các kiểu dữ liệu này như sau:

var tên_biến  : Kiểu_Dữ_Liệu=Giá_Trị_Mặc_Định

ví dụ:

var x:Long=100L
var y:Double=113.5
var f:Float=113.5f
var i:Int =113
var s:Short=8
var b:Byte=1

Ta để ý với Kotlin thì không cần thêm dấu chấm phẩy khi kết thúc lệnh

Kiểu ký tự dùng để lưu trữ một ký tự nằm trong nháy đơn:


var c:Char='c'

Kiểu chuỗi dùng để lưu tập các ký tự được để trong cặp nháy đôi, dùng đối tượng String để khai báo:


var ten:String="Trần Duy Thanh-0987773061-http://ssoftinc.com/"

Ngoài ra ta có thể khai báo chuỗi trên nhiều dòng bằng cách để trong cặp 3 dấu nháy kép:


fun main(args: Array) {
var ten:String="Trần Duy Thanh-0987773061-http://ssoftinc.com/"
var address:String="""
số 24 đường 7, khu phố X
phường 5, Quận 9
TP.HCM
"""
println(address)
}

Kiểu luận lý dùng đối tượng Boolean để khai báo, Kiểu dữ liệu này sẽ lưu trữ 2 giá trị true hoặc false, kiểu này rất quan trọng, được sử dụng nhiều trong việc kiểm tra các điều kiện:


var kq:Boolean=true

Với các kiểu dữ liệu Mảng, Kotlin cung cấp cho ta 8 loại mảng ứng với 8 kiểu dữ liệu được built-in trong Kotlin (ngoại trừ String).

Để khai báo và sử dụng kiểu dữ liệu ta làm như sau:

var Tên_Mảng: Kiểu_Dữ_Liệu_Mảng=XXXArrayOf(giá trị 1, giá trị 2,…, giá trị n)

Với XXX là 8 kiểu dữ liệu tương ứng(viết thường ký tự đầu), ví dụ:

var arrX:IntArray= intArrayOf(1,2,3,5)
println(arrX[1])
var arrY:DoubleArray= doubleArrayOf(1.5,2.6,9.0,10.3)
println(arrY[3])
var arrC:CharArray= charArrayOf('a','b','c')
println(arrC[0])

Ngoài ra nếu muốn khai báo hằng số thì ta dùng val thay vì var. var cho phép thay đổi giá trị của biến, còn val không cho phép. Ta thường nói mutable khi khai báo var, readonly khi khai báo val.


val PI:Double =3.14
PI=3.15//không được phép vì PI là readonly

Như vậy tới đây Tui đã trình bày xong các kiểu dữ liệu và cách khai báo biến trong Kotlin, các bạn nhớ làm lại bài này nhé để hiểu rõ hơn về kiểu dữ liệu trong Kotlin nhé, cần so sánh sự khác biệt về kiểu dữ liệu cũng như cách khai báo biến so với java.

Hẹn gặp lại các bạn ở những bài sau!

Source code bài này: http://www.mediafire.com/file/2zdwn1pp2e74gc5/HocKieuDuLieu.rar

Chúc các bạn thành công

Trần Duy Thanh (http://ssoftinc.com/)

%d bloggers like this: