Category Archives: 03.Cấu trúc điều khiển

Bài 11-Biểu thức when trong Kotlin


Với Kotlin, biểu thức switch đã được thay thế bởi biểu thức when. When hoạt động rất mạnh mẽ, đa năng, đáp ứng được nhiều trường hợp xử lý cho lập trình viên. Hi vọng với 6 ví dụ chi tiết trong bài này sẽ giúp các bạn nắm chắc về cách thức hoạt động của when, có thể áp dụng nhuần nhuyễn vào các bài thực tế khác phức tạp hơn.

Cú pháp tổng quát của when:

when(<expression>){

<value 1> ->   <statement 1>

<value 2> ->   <statement 2>

 else           ->   <statement else>

}

when lấy giá trị trong <expression>, đem so sánh với các <value> bên trong , nếu trùng khớp với value nào thì <statement> đó sẽ được thực thi. Nếu tất cả <value> đều không khớp với <expression> thì else sẽ được thực hiện.

Lưu đồ của when có thể được hoạt động như hình dưới đây:

Ví dụ 1:


fun main(args: Array) {
var value:Int=2
when(value)
{
1->println("Hello Obama")
2->println("Hello Putin")
3->println("Hello Kim Jong Un")
else-> println("Hello Everyone!")
}
}

Khi chạy đoạn coding trên thì dòng “Helo Putin” sẽ được xuất ra màn hình.

Ví dụ 2: Viết chương trình cho phép nhập vào 2 số a , b và 1 phép toán +,-,*,/. Xuất kết quả tương ứng với phép toán


fun main(args: Array) {
var a:Double=0.0;
var b:Double=0.0;
var pheptoan:String?
println("Nhập a:")
var sa=readLine()
if(sa!=null)
a= sa.toDouble()
println("Nhập b:")
var sb=readLine()
if(sb!=null)
b= sb.toDouble()
println("Nhập phép toán(+,-,*,/):")
pheptoan= readLine()
when(pheptoan)
{
"+"-> println(a.toString()+" + "+b.toString()+"="+(a+b))
"-"-> println(a.toString()+" - "+b.toString()+"="+(a-b))
"*"-> println(a.toString()+" * "+b.toString()+"="+(a*b))
"/"->
if(b==0.0)
println("mẫu số phải khác 0")
else
println(a.toString()+"/"+b.toString()+"="+(a/b))
else-> println("bạn nhập lụi")
}
}

Kotlin cũng cho phép ta gom nhóm nhiều điều kiện trong biểu thức when nếu như các giá trị này cùng giải quyết một vấn đề nào đó bằng cách dùng dấu phẩy , để ngăn cách các giá trị:

Ví dụ 3: Nhập vào một tháng bất kỳ, hỏi tháng này thuộc quý mấy trong năm. Biết rằng tháng 1,2,3 là quý 1; tháng 4,5,6 là quý 2; tháng 7,8,9 là quý 3; tháng 10,11,12 là quý 4.


fun main(args: Array) {
var month:Int=0
println("Nhập tháng:")
var s:String?= readLine()
if(s!=null)
month=s.toInt()
when(month)
{
1,2,3-> println("Tháng "+month+" thuộc quý 1")
4,5,6-> println("Tháng "+month+" thuộc quý 2")
7,8,9->println("Tháng "+month+" thuộc quý 3")
10,11,12->println("Tháng "+month+" thuộc quý 4")
else-> println("Tháng "+month+" ko hợp lệ")
}
}

Cấu trúc when của Kotlin rất mạnh mẽ, nó còn cho phép ta kiểm tra theo vùng dữ liệu liên tục:

Ví dụ 4:


fun main(args: Array) {
var tuoi:Int=0
println("Nhập tuoi:")
var s:String?= readLine()
if(s!=null)
tuoi=s.toInt()
when(tuoi)
{
in 1..5-> println("Tuổi thiếu nhi")
in 6..9-> println("Tuổi nhi đồng")
in 10..15-> println("Tuổi thiếu niên")
in 16..28-> println("Tuổi thanh niên")
!in 1..100-> println("Ko biết tuổi gì")
else->println("Tuổi già khú đế")
}
}

ở trên bạn thấy Tui để in 1..5 là cú pháp mà tuoi nằm trong đoạn từ 1 tới 5

!in 1..100 là cú pháp nếu tuoi không nằm trong đoạn 1 tới 100

Như vậy nếu các bạn muốn kiểm tra biến thuộc một vùng dữ liệu liên tục nào đó thì có thể dùng cú pháp ở trên, Tui thấy nó rất hay trong trường hợp này. Ta có thể áp dụng tốt vào các giải thuật so khớp.

Ngoài ra when còn là một biểu thức trả về kết quả, cách viết linh động như sau:

Ví  dụ 5:


fun main(args: Array) {
var x:Int=8
var kq=when(x)
{
in 1..10->x+100
in 20..30->x-1000
else -> x
}
println(kq)
}

Chạy lên ta sẽ có kq=108. Vì cách viết trên sẽ gán kết quả vào cho biến kq, khi x=8 thì thủa vùng 1..10 suy ra kết quả kq=8+100=108

Cuối cùng when có thể hoạt động như chuỗi biểu thức if-else if:

Ví dụ 6:


fun main(args: Array) {
var x:Int=100
when
{
x%2==0-> println("X là số chẵn")
x%2!=0->println("X là số lẻ")
}
}

Lệnh trên chính là if else, chạy lên sẽ xuất X là số chẵn. Ta có thể viế when như trên để thay thế cho các if else.

Với biến x ở ví dụ trên(hoặc biến bất kỳ), nếu bạn muốn xuất giá trị của biến cùng với chuỗi thì nên dùng ký tự Đô La đằng trước biến, ví dụ: $x thì Kotlin sẽ tự tìm tới tên biến để xuất giá trị của nó ra, ta có thể viết lại lệnh trên như sau:


fun main(args: Array) {
var x:Int=100
when
{
x%2==0-> println("$x là số chẵn")
x%2!=0->println("$x là số lẻ")
}
}

Khi chạy ta sẽ có kết quả: 100 là số chẵn

Như vậy tới đây Tui đã hướng dẫn xong cấu trúc when 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 biệt nắm được lưu đồ hoạt động, cách viết theo dạng when khác nhau.

Các bạn có thể tải source code bài này ở đây: http://www.mediafire.com/file/6mxazxl8726t1df/HocWhen.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 10- Cấu trúc điều khiển if else trong Kotlin


Với Kotlin thì if, else ngoài việc đóng vai trò là một tập lệnh điều kiện (cấu trúc truyền thống), nó còn là một biểu thức trả về giá trị khá thú vị.

1)Ta vào cấu trúc if truyền thống, cú pháp:

if  (<expression> )

{

<statement>

}

Cấu trúc if ở trên chỉ quan tâm tới điều kiện đúng, khi <expression> trong if đúng thì sẽ thực hiện các lệnh <statement> ở bên trong if.

Lưu đồ hoạt động:

Ví dụ, kiểm tra điểm Trung bình >=5 thì ghi đậu:


fun main(args: Array) {
var dtb:Double=8.0;
if(dtb>=5)
{
println("Đậu")
}
}

2)Ta vào cấu trúc if và else truyền thống, cú pháp:

if  (< expression > )

{

< statement 1>

}

else

{

< statement 2>

}

Cấu trúc if else quan tâm tới điều kiện đúng và sai. Nếu <expression> đúng thì nội dung <statement 1> của if sẽ được thực hiện, nếu <expression> sai thì nội dung <statement 2> của else sẽ được thực hiện. Đây là một trong những cấu trúc phổ biến nhất được sử dụng rất nhiều trong quá trình kiểm tra điều kiện.

Lưu đồ hoạt động:

Ví dụ, kiểm tra điểm Trung bình >=5 thì ghi đậu, <5 thì rớt:


fun main(args: Array) {
var dtb:Double=4.0;
if(dtb>=5)
{
println("Đậu")
}
else
{
println("Cáo phó")
}
}

3)Ta có thể lồng ghép các if else vào với nhau:

Ví dụ: Nhập vào một điểm Trung bình [0..10], kiểm tra điểm này đậu hay rớt:


fun main(args: Array) {
var dtb:Double=0.0;
println("Mời bạn nhập điểm trung bình:")
var s:String?= readLine()
if(s!=null)
{
dtb=s.toDouble()
if(dtb>=0 && dtb= 5)
{
println("Đậu")
}
else
{
println("Rớt")
}
}
else
{
println("Thím phải nhập điểm [0...10]")
}
}
else
{
println("Thím nhập lụi")
}
}

Như vậy ở trên ta đã học được cách tiếp cận if else theo phương pháp truyền thống (như là một biểu thức điều kiện). Bây giờ Tui sẽ trình bày điểm mới if else trong Kotlin đó là nó hoạt động như một biểu thức trả về kết quả:

Ví dụ: cho 2 số a và b, tìm số lớn nhất:

Cách viết theo biểu thức
Cách viết truyền thống

fun main(args: Array) {
var a:Int=10
var b:Int=15
var max:Int
max=if (a>b) a else b
println("Số lớn nhất ="+max)
}


fun main(args: Array) {
var a:Int=10
var b:Int=15
var max:Int
if(a>b)
max=a
else
max=b
println("Số lớn nhất ="+max)
}

Chú ý khi viết if với dạng biểu thức trả về kết quả thì bắt buộc phải có else

Ngoài ra biểu thức if else cũng cho phép viết dạng block lệnh {}, dòng lệnh cuối cùng trong mỗi block đó chính là kết quả trả về, ví dụ:


fun main(args: Array) {
var a:Int=10
var b:Int=15
var max = if (a > b) {
println("Choose a")
a
} else {
println("Choose b")
b
}
println("max ="+max)
}

Đoạn lệnh trên khi chạy sẽ ra kết quả:

Choose b
max =15

Giá trị a ở cuối if, giá trị b ở cuối else là kết quả trả về và gán vào cho biến max.

Như vậy tới đây Tui đã hướng dẫn xong cấu trúc điều khiển if, else 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 biệt nắm được lưu đồ hoạt động, cách viết theo dạng biểu thức của if else

Các bạn có thể tải source code bài này ở đây: http://www.mediafire.com/file/6c5swjx84rl9edp/HocIfElse.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/)

%d bloggers like this: