Bài 12-Vòng lặp for trong Kotlin


Với mọi ngôn ngữ lập trình thì các cấu trúc vòng lặp rất là quan trọng, đặc biệt là vòng for rất là phổ biến và hầu như trong mọi phần mềm đều chắc chắn sử dụng để giải quyết những công việc lặp đi lặp lại một cách có quy luật.

Kotlin cung cấp khoảng 5+ cách thức làm việc với vòng lặp for rất đa dạng, các kỹ thuật này Tui sẽ trình bày chi tiết thông qua việc giải thích lý thuyết cũng như các ví dụ minh họa, hi vọng các bạn sẽ hiểu thật chắc Vòng lặp for trong Kotlin.

1) Loại for thứ 1 – Duyệt tuần tự hết giá trị trong danh sách (closed range)

for (i in a..b)
{
Xử lý biến i
}

Với cú pháp ở trên thì biến i thực ra là biến bước nhảy, nó tự động tăng dần từ a cho tới b. Ta có thể thay tên biến i thành tên biến bất kỳ

Ví dụ 1: Viết chương trình tính giai thừa của một số nguyên dương n:


fun main(args: Array<String>) {
var gt:Int=1
val n:Int=5
for (i in 1..n)
{
gt *= i
}
println("$n!=$gt")
}

Ở đoạn lệnh trên, i sẽ chạy tuần tự từ 1 tới n (với n=5). Mỗi lần chạy nó sẽ nhân dồn i cho biến gt. Kết thúc vòng lặp ta sẽ được giai thừa của n.

Chi tiết quá trình chạy tính giai thừa theo thuật giải ở trên:

Lần lặp
Giá Trị Biến i Giá Trị Biến gt
0 gt=1
1 1 gt*=i=>gt=1*1=1
2 2 gt*=i=>gt=1*2=2
3 3 gt*=i=>gt=2*3=6
4 4 gt*=i=>gt=6*4=24
5 5 gt*=i=>gt=24*5=120

Sau đó lệnh:

println("$n!=$gt")

Được thực hiện, với kết quả: 5!=120

2) Loại for thứ 2 – Duyệt tuần tự gần hết giá trị trong danh sách (half-open range)

for (i in a until b)
{
Xử lý biến i
}

Với cú pháp ở trên thì biến i thực ra là biến bước nhảy, nó tự động tăng dần từ a cho tới gần b. Ta có thể thay tên biến i thành tên biến bất kỳ

Ví dụ 2: Viết chương trình tính tổng từ 1 tới gần số nguyên dương n:


fun main(args: Array<String>) {
var sum:Int=0
val n:Int=5
for (i in 1 until n)
{
sum += i
}
println("Tổng=$sum")
}

Chi tiết quá trình tính tổng:

lần lặp Giá Trị Biến i Giá Trị Biến sum
0 sum=0
1 1 sum+=i=>sum=0+1=1
2 2 sum+=i=>sum=1+2=3
3 3 sum+=i=>sum=3+3=6
4 4 sum+=i=>sum=6+4=10

Chú ý là chỉ chạy tới 4, vì theo cú pháp của until là chạy tới gần bằng. Do đó ở trên until n tức là gần bằng n, ở đây n=5 => i  chạy tới 4.

Sau đó lệnh:

println("Tổng=$sum")

Được thực hiện, với kết quả: Tổng=10

3) Loại for thứ 3 – Điều hướng bước nhảy step

for (i in a .. b step x)
{
Xử lý biến i
}

Với cú pháp ở trên thì biến i thực ra là biến bước nhảy, nó tự động tăng dần từ a cho tới b, nhưng mỗi lần duyệt nó tăng theo x đơn vị. Ta có thể thay tên biến i thành tên biến bất kỳ

Ví dụ 3: Viết chương trình tính tổng các số chẵn nhỏ hơn hoặc bằng số nguyên dương n:


fun main(args: Array<String>) {
var sum:Int=0
var n:Int=10
for (i in 2 .. n step 2)
sum+=i
println("Tổng chẵn=$sum")
}

Chi tiết quá trình tính tổng chẵn:

lần lặp Giá Trị Biến i Giá Trị Biến sum
0 sum=0
1 2 sum+=i =>sum=0+2=2
2 4 sum+=i =>sum=2+4=6
3 6 sum+=i =>sum=6+6=12
4 8 sum+=i =>sum=12+8=20
5 10 sum+=i =>sum=20+10=30

Chương trình chạy mỗi lần tăng i lên 2 đơn vị, ta khởi tạo i chạy từ 2 nên nó sẽ tự động tăng thành các số chẵn, gặp 10 thì nó thực hiện và kết thúc vòng lặp.

Sau đó lệnh:

println("Tổng chẵn=$sum")

Được thực hiện, với kết quả: Tổng chẵn =30

4) Loại for thứ 4 – Điều hướng bước nhảy downTo

for (i in b downTo a)
{
Xử lý biến i
}

Với cú pháp ở trên thì biến i thực ra là biến bước nhảy, nó tự động giảm dần từ b cho tới a, nhưng mỗi lần duyệt nó giảm 1 đơn vị. Ta có thể thay tên biến i thành tên biến bất kỳ

hoặc

for (i in b downTo a step x)
{
Xử lý biến i
}

Với cú pháp ở trên thì biến i thực ra là biến bước nhảy, nó tự động giảm dần từ b cho tới a, nhưng mỗi lần duyệt nó giảm x đơn vị. Ta có thể thay tên biến i thành tên biến bất kỳ

Ví dụ 4: Viết chương trình tính Ước số chung lớn nhất của 2 số bất kỳ


fun main(args: Array<String>) {
    var a:Int=9
    var b:Int=6
    var ucscln=1
    var min=if (a>b) b else a
    for (i in min downTo 1)
    {
        if(a%i==0 && b%i==0)
        {
            ucscln=i
            break
        }
    }
    println("USCL của $a và $b = $ucscln")
}

Chi tiết quá trình tìm ước số chung lớn nhất:

trước khi vào vòng lặp for thì ta được các thông tin sau:

a=9, b=6, ucscln=1, min=6 (ta phải tìm min vì với 2 số thì may ra nó chỉ chia hết cho số nhỏ hơn)

Lần lặp
Giá Trị Biến i Giá Trị Biến ucscln
0 a=9, b=6, ucscln=1, min=6
1 6 if (a%i==0 && b%i==0)

<=>if (9%6==0 && 6%6==0)

=>không thỏa

2 5 if (a%i==0 && b%i==0)

<=>if (9%5==0 && 6%5==0)

=>không thỏa

3 4 if (a%i==0 && b%i==0)

<=>if (9%4==0 && 6%4==0)

=>không thỏa

4 3 if (a%i==0 && b%i==0)

<=>if (9%3==0 && 6%3==0)

=>thỏa điều kiện

=>thực hiện ucscln=i=>ucscln=3

=>break =>thoát khỏi vòng lặp for

Tới lần lặp thứ 4 thì lúc này cả a và b điều chia hết cho i (i=3)  nên nội dung if sẽ được thực hiện, lúc này ucscln=3 và lệnh break ngay sau đó thực hiện ngừng vòng lặp

Sau đó lệnh:

println("USCL của $a và $b = $ucscln")

Được thực hiện, với kết quả: USCL của 9 và 6 = 3

5) Loại for thứ 5 – Lặp tập đối tượng

for (item in collection)

{

println(item)

}

Cấu trúc for trên sẽ duyệt từng đối tượng trong một tập đối tượng

Ví dụ 5: Duyệt danh sách tên sản phẩm


fun main(args: Array<String>) {
var dsSanPham= arrayOf("kotlin","java","c#","python","R")
for (item in dsSanPham)
println(item)
}

Đoạn code trên, chương trình sẽ duyệt tuần tự từng phần tử trong mảng dsSanPham và xuất tên của chúng ra.

Ngoài ra ta cũng có thể duyệt theo vị trí, từ vị trí này ta có thể xuất ra giá trị như sau:


fun main(args: Array<String>) {
var dsSanPham= arrayOf("kotlin","java","c#","python","R")

for (i in dsSanPham.indices)
println("Sản phẩm thứ $i có tên "+dsSanPham[i])
}

Cuối cùng kotlin cũng hỗ trợ vừa lấy vị trí vừa lấy giá trị theo cách sau:


fun main(args: Array<String>) {
var dsSanPham= arrayOf("kotlin","java","c#","python","R")
for ((index,value) in dsSanPham.withIndex())
{
println("Sản phẩm thứ $index có tên $value")
}
}

Như vậy tới đây Tui đã hướng dẫn xong vòng lặp for 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 5 cách thức vận hành của for để có thể áp dụng tốt vào các dự án thực tế của mình.

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

3 responses

  1. […] bài 12 chúng ta đã nắm chắc được cách thức hoạt động của vòng lặp for, trong bài […]

  2. […] Ở bài 12 chúng ta đã nắm chắc được cách thức hoạt động của vòng lặp for, trong bài này Tui sẽ hướng dẫn các bạn cấu trúc lặp với while. Đây cũng là một trong những cấu trúc lặp khá phổ biến trong các ngôn ngữ lập trình không riêng gì Kotlin, cú pháp: […]

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: