Category Archives: 04.Cấu trúc lặp

Bài 14-Vòng lặp do while trong Kotlin


bài 13 chúng ta đã hiểu được cấu trúc lặp while, trong bài này chúng ta qua một cấu trúc tương tự đó là do…while

Cú pháp vòng lặp do…while:

do

  statement

}

while(expression)

Các bước thực hiện:

−B1:Statement được thực hiện

−B2:Expression được định trị.

−Nếu expression là true thì quay lại bước 1

−Nếu expression là false thì thoát khỏi vòng lặp.

Để thoát vòng lặp: dùng break

Để di chuyển sớm qua lần lặp tiếp theo : dùng continue

Lưu ý: Lệnh trong do…while chắc chắn được thực hiện ít nhất một lần.

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

Ví dụ 1: Viết chương trình tính 5 giai thừa


fun main(args: Array) {
var n:Int = 5
var gt:Int=1
var i:Int = 1
do
{
gt *= i
i++
}while (i<=n)
println("$n! =$gt")
}

Giải thích chi tiết quá trình chạy:

Khởi tạo: n=5; gt=1, i=1

Lần 1: gt=gt*i=1*1=1

i++=> i=i+1=1+1=2

Kiểm tra i<=n <=>2<=5=>đúng

Lần 2: gt=gt*i=1*2=2

i++=>i=i+1=2+1=3

Kiểm tra i<=n <=> 3<=5=>đúng

Lần 3: gt=gt*i=2*3=6

i++=>i=i+1=3+1=4

Kiểm tra i<=n <=> 4<=5=>đúng

Lần 4: gt=gt*i=6*4=24

i++=>i=i+1=4+1=5

Kiểm tra i<=n <=> 5<=5=>đúng

Lần 5: gt=gt*i=24*5=120

i++=>i=i+1=5+1=6

Kiểm tra i<=n <=> 6<=5=>sai=>ngừng do while

Kết thúc chương trình ta được giai thừa =120

Tương tự như các vòng lặp khác, do..while cũng có thể kết hợp lồng ghép các vòng lặp với nhau:

Ví dụ 2: Viết chương trình kiểm tra 1 năm bất kỳ có phải năm nhuần hay không (Năm nhuần là năm chia hết cho 4 nhưng không chia hết cho 100 hoặc chia hết cho 400). Chương trình bắt buộc phải nhập năm >=0, nếu nhập sai bắt nhập lại cho tới khi nào nhập đúng, kết thúc chương trình cho phép người dùng lựa chọn tiếp tục hay không:


fun main(args: Array) {
var year:Int=0
var s:String?
println("Chương trình kiểm tra năm nhuần:")
do
{
println("Nhập 1 năm:")
s= readLine()
while (s==null || s.toInt()<0)
{
println("Nhập sai năm, nhập lại:")
s= readLine()
}
year=s.toInt()
if(year%4==0&&year%100!=0 || year%400==0)
{
println("Năm $year là năm nhuần")
}
else
{
println("Năm $year ko phải là năm nhuần")
}
print("Tiếp không?(c/k):")
s= readLine()
if(s=="k")
break;
}while (true)
println("Tạm biệt")
}

Chạy chương trình và nhập các giá trị sau để xem kết quả:

Chương trình kiểm tra năm nhuần:
Nhập 1 năm:
-4
Nhập sai năm, nhập lại:
2000
Năm 2000 là năm nhuần
Tiếp không?(c/k):c
Nhập 1 năm:
2015
Năm 2015 ko phải là năm nhuần
Tiếp không?(c/k):kTạm biệt

Như vậy tới đây Tui đã hướng dẫn xong vòng lặp do…while 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 cách thức vận hành của do..while để 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/zehz2biw992vxeh/HocDoWhile.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 13-Vòng lặp while trong Kotlin


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:

while(expression)

{

  statement

}

Các bước thực hiện:

  • B1: Expression được định trị
  • B2: Nếu kết quả là true thì statement thực thi và quay lại B1
  • B3: Nếu kết quả là false thì thoát khỏi vòng lặp while.

Để thoát vòng lặp: dùng break

Để di chuyển sớm qua lần lặp tiếp theo : dùng continue

Lưu ý: Lệnh trong while có thể không được thực hiện lần nào do ngay từ đầu expression không thỏa

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

Ví dụ 1: Viết chương trình tính 5 giai thừa


fun main(args: Array) {
var n:Int = 5
var gt:Int=1
var i:Int = 1
while (i <= n)
{
gt *= i
i++
}
println("$n! =$gt")
}

Giải thích chi tiết quá trình chạy:

Khởi tạo n=5, gt=1, i=1

Lần 1: kiểm tra i<=n <=>1<=5=>đúng => làm body while:

gt=gt*i=1*1=1

i++=>i=i+1=1+1=2

Lần 2: kiểm tra i<=n <=> 2<=5 => đúng => làm body while:

gt=gt*i=1*2=2

i++=>i=i+1= 2+1=3

Lần 3: kiểm tra i<=n <=> 3 <=5 => đúng => làm body while:

gt=gt*i=2*3=6

i++=>i=i+1=3+1=4

Lần 4: Kiểm tra i<=n <=> 4<=5 => đúng => làm body while:

gt=gt*i=6*4=24

i++=>i=i+1=4+1=5

Lần 5: Kiểm tra i<=n <=> 5<=5 => đúng => làm body while:

gt=gt*i=24*5=120

i++=>i=i+1=5+1=6

Lần 6: kiểm tra i<=n <=> 6<=5 => sai => ngừng while

Kết thúc chương trình ta được giai thừa =120

Ta có thể kết hợp các vòng lặp khác nhau lại, ví dụ có thể kết hợp vòng while và for, ví dụ dưới đây sẽ minh họa việc kết hợp này:

Ví dụ 2: Viết chương trình Kiểm tra một số bất kỳ có phải là số nguyên tố hay không(số nguyên tố là số chỉ chia hết cho 1 và chính nó, số 0 và số 1 không phải là số nguyên tố), chương trình cho phép hỏi người dùng có muốn tiếp tục nữa hay không?


fun main(args: Array) {
var n:Int=0
var s:String?
println("Chào mừng đến với Chương trình kiểm tra số Nguyên Tố")
while (true)
{
println("Nhập số nguyên:")
s= readLine()
if(s!=null)
n=s.toInt()
var dem:Int=0
for(i in 1..n)
{
if(n%i==0)
dem++
}
if(dem==2)
println("$n là số nguyên tố")
else
println("$n ko phải là số nguyên tố")
print("Tiếp không?(c/k):")
s= readLine()
if(s=="k")
break;
}
println("Chào tạm biệt")
}

Chạy chương trình và nhập các giá trị sau để xem kết quả:

Chào mừng đến với Chương trình kiểm tra số Nguyên Tố
Nhập số nguyên:
5
5 là số nguyên tố
Tiếp không?(c/k):c
Nhập số nguyên:
7
7 là số nguyên tố
Tiếp không?(c/k):c
Nhập số nguyên:
6
6 ko phải là số nguyên tố
Tiếp không?(c/k):k
Chào tạm biệt

Như vậy tới đây Tui đã hướng dẫn xong vòng lặp while 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 cách thức vận hành của while để 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/gv9pj5v721374qr/HocWhile.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 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) {
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) {
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) {
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) {
    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) {
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) {
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) {
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/)

%d bloggers like this: