11/08/2018, 23:07

2-4 Lặp lại

Trong phần này tôi sẽ giới thiệu về công cụ xử lý lặp lại. Lặp đi lặp lại những thao tác giống nhau chính là điểm mạnh của máy tính Sử dụng times để ra lệnh lặp lại đơn giản Tại Ruby chúng ta có thể sử dụng lệnh [times] để lặp đi lặp lại những xử lý giống nhau theo số cho sẵn. Khi bạn muốn ...

Trong phần này tôi sẽ giới thiệu về công cụ xử lý lặp lại. Lặp đi lặp lại những thao tác giống nhau chính là điểm mạnh của máy tính

Sử dụng times để ra lệnh lặp lại đơn giản

Tại Ruby chúng ta có thể sử dụng lệnh [times] để lặp đi lặp lại những xử lý giống nhau theo số cho sẵn.

Khi bạn muốn lập đi lập lại n lần 1 thao tác xử lý thì chúng ta sẽ viết như sau.

n.times do
  khu vực muốn xử lý lặp đi lặp lại
  .....
  .....
end

Chúng ta hãy thử làm nên một chương trình mà từ "Slime đã xuất hiện" lặp lại 10 lần nhé!

10.times do
  puts "Slime đã xuất hiện"
  sleep 1
end

[Kết quả hiển thị]

Slime đã xuất hiện
Slime đã xuất hiện
Slime đã xuất hiện
Slime đã xuất hiện
Slime đã xuất hiện
Slime đã xuất hiện
Slime đã xuất hiện
Slime đã xuất hiện
Slime đã xuất hiện
Slime đã xuất hiện

Chương trình thực hiện hàng loạt các xử lý giống nhau. Cũng như đã giới thiệu ở trước thì lệnh [sleep] là lệnh nghỉ.

puts "Slime đã xuất hiện"
sleep 1

Trong khoảng [do~end] thì chúng ta có thể viết rất nhiều code, câu lệnh khác nhau. Ví dụ ta muốn thực hiện 100 lần thao tác sau.

puts "A"
puts "B"
puts "C"

Chúng ta sẽ code như sau

100.times do
  puts "A"
  puts "B"
  puts "C"
end

Lý do cách đầu dòng cũng giống như khi chúng ta thực hiện lệnh [if~end]. Khi thực hiện cách đầu dòng thì phần lệnh ở giữa [do~end] sẽ trở thành 1 cột và dễ nhìn và xác nhận hơn. Mặt khác, phần code nằm giữa [do~end] còn gọi là [Block].

Lặp lại những phép tính

Chúng ta cũng có thể dùng với những phép tính sử dụng biến số để lặp đi lặp lại. Chương trình sau đây thực hiện phép tính cứ thêm 1 vào a.

a=0
10. times do
  a=a+1
  puts a
end

[Kết quả hiển thị]

1
2
3
4
5
6
7
8
9
10

Chúng ta hãy cùng xem chi tiết quy trình các bước xử lý.

a=0
10. times do
  ....

end

Khu vực này có nghĩa là thay thế 0 là a, thực hiện lệnh trong block nằm trong [do~end] 10 lần. Và bộ phận phải xử lý 10 lần chính là

a = a+1
puts a

Nếu viết bình thường ra thì chúng ta phải viết lặp lại 10 lần câu lệnh

a = a+1
puts a

Qua câu lệnh trên chúng ta đã có thể rút ngắn quá trình code. Chúng ta lại trở lại quá trình code ban đầu. Phần [a=a+1] là bộ phận [a] thay thế bởi [a+1] Vì nội dung ban đầu mà a chứa là [0] nên chương trình sẽ trở thành như sau

a=0+1
-> a=1

Có nghĩa là nội dung của [a] đã trở thành 1 mà [1] được hiển thị ra. Lần lặp lại thứ 2 cũng vậy.

a=1+1
-> a=2

Và lần thứ 3 cũng vậy. Cứ như thế này, câu lệnh [a=a+1] được thực hiện lặp lại 10 lần, nội dung trong [a] được cộng mỗi lần 1 đơn vị và để hiển thị kết quả một cách thứ tự như vậy thì chúng ta phải đặt câu lệnh gọi lần lượt kết quả 1~10.

Tự động thay thế

Khi chúng ta muốn dùng biến số [a] để biểu diễn biến số [a] sau khi cộng 1 đơn vị thì sẽ viết như sau

a = a + 1

Những trường hợp tự mình cộng vào một số đơn vị nào đó rồi tự thay thế giá trị trong biến số thì chúng ta có thể viết gọn lại như sau

a += 1

Cách sử dụng [+=] được gọi là thao tác [Tự thay thế] Về thao tác [Tự thay thế] này thì ngoài cộng vào một đơn vị nhất định thì còn còn có những thao tác khác như

a -+ 2  # Trừ 2 đơn vị từ a
a *= 5  # Nhân 5 vào a
a /=10  # Lấy a chia 10

Những code trên tương tự những code dưới đây

a = a - 2
a = a * 5
a = a / 10

Lặp lại sử dụng điều kiện while

while điều kiện
  Những thao tác xử lý khi điều kiện thỏa mãn
  ....
  ....
end

Đây là chương trình sử dụng lệnh [while]

a=0
while a<3
  puts a
  a += 1  # cũng giống như a=a+1
end

[Kết quả hiển thị]

0
1
2

Nếu trong chương trình sử dụng lệnh [while] thì sẽ xảy ra quá trình xác định điều kiện viết ngay sau while. Điều kiện của chương trình bên trên đó chính là

a < 3

Giá trị ban đầu của a là 0 nên điều kiện được thỏa mãn, chương trình được chạy cho đến [end]. Sau khi chương trình chạy đến [end] thì chương trình lại chạy lại và xử lý từ [while]. Tại dòng while lại xảy ra xử lý xem điều kiện có được thỏa mãn không, nếu điều kiện vẫn được thỏa mãn thì xử lý vẫn được diễn ra.

Trong xâu điều kiện có viết số 3 nhưng mọi người hãy chú ý rằng mọi xử lý dừng lại ở giá trị 2. Giá trị này sau khi biểu thị bằng [a] thì sau khi [a] chạy đến 3, trước khi lệnh puts được thực hiện thì [a] đã trượt ra khỏi dãy đang xét. Trong trường hợp [a<3] hay có nghĩa là a thuộc các giá trị [0] [1] [2] thì các thao tác vẫn được xử lý.

Dãy kết quả vô hạn

Và đây lại là câu hỏi. Khi chúng ta thực hiện chương trình như dưới đây thì kết quả sẽ trở thành như thế nào?

i=0
while i==0
  puts "hello"
end

Điều kiện ứng với câu kệnh [while] là

i == 0

Có nghĩa là, cho đến khi [i] vẫn bằng [0] thì lệnh [puts "Hello"] vẫn được thực hiện. Tuy nhiên, trong chương trình này, giá trị của [i] không bị thay đổi nên [i] mãi mãi có giá trị bằng [0]. Vậy nên điều kiện mãi mãi được thỏa mãn, trường hợp này chúng ta gọi là dãy kết quả vô hạn. Cứ như vậy, [hello] sẽ được biểu thị liên tục và chương trình không bao giờ dừng lại. Để dừng chương trình thì người ta sử dụng tổ hợp phím Ctrl+C.

Dùng true tạo dãy kết quả vô hạn

Chúng ta còn có phương pháp để tạo dãy kết quả vô hạn như sau

while true
  puts "hello"
end

Đằng sau [while] mà chúng ta viết [true] thì chắc chắn điều kiện sẽ được thỏa mãn nên sẽ tạo ra một dãy kết quả vô hạn. Giá trị ngược nghĩa với [true] sẽ là [false]. Và khi nhập [False] đằng sau [While] thì chắc chắn mãi mãi điều kiện không được thỏa mãn.

Một số ứng dụng đối với lệnh While

Trong chương trình tiếp theo đây, tôi sẽ sử dụng biến số [i] và lệnh while để xử lý thông tin 10 lần. Trong chuỗi xử lý, chúng ta dùng hàm [if] để xác định xem giá trị số đưa ra có nhỏ hơn 5 hay không.

i=0
while i<10
  if i<5
    puts "i nhỏ hơn 5"
  else
    puts "i không nhỏ hơn 5"
  end
  i +=1
end

[Kết quả hiển thị]

i nhỏ hơn 5
i nhỏ hơn 5
i nhỏ hơn 5
i nhỏ hơn 5
i nhỏ hơn 5
i không nhỏ hơn 5
i không nhỏ hơn 5
i không nhỏ hơn 5
i không nhỏ hơn 5
i không nhỏ hơn 5
i không nhỏ hơn 5

Trong dãy xử lý thì điều kiện được xử dụng cho hàm if là

i < 5

Dựa vào điều kiện đó mà chia ra các trường hợp.

Mặt khác, các bạn có nghĩ chúng ta không nên để i mà dùng luôn chữ số để biểu thị thì sẽ dễ hiểu hơn không? Ví dụ như thế này

3 nhỏ hơn 5
4 nhỏ hơn 5
5 không nhỏ hơn 5

Chuyện này có thể thực hiện một cách rất dễ dàng. Trong Ruby có một chức năng triển khai công thức, đó chính là trong dãy chữ được bao bởi [""] nếu chúng ta viết [#{i}] thì nội dung của i cũng sẽ được hiện lên trong dãy chữ. Về chi tiết các bạn hãy tham khảo trong mục nhỏ Triển khai công thức. Chúng ta hãy viết lại chương trình như sau

i=0
while i<10
  if i<5
    puts "#{i} nhỏ hơn 5"
  else
    puts "#{i} không nhỏ hơn 5"
  end
  i += 1
end

[Kết quả hiển thị]

0 nhỏ hơn 5
1 nhỏ hơn 5
2 nhỏ hơn 5
3 nhỏ hơn 5
4 nhỏ hơn 5
5 không nhỏ hơn 5
6 không nhỏ hơn 5
7 không nhỏ hơn 5
8 không nhỏ hơn 5
9 không nhỏ hơn 5

Như vậy kết quả đã hiện ra như mình đã chờ đợi đúng không?

Triển khai công thức

Triển khai công thức là một công thức rất tiện lợi. Nếu chúng ta sử dụng lệnh triển khai công thức thì chúng ta có thể dễ dàng gọi được công thức của giá trị vào trong dãy chữ.

puts "1 + 1 = #{2}"

[Kết quả hiển thị]

1 + 1 = 2

Chúng ta cũng có thể thực hiện ngay phép tính ngay trong bộ phận đó.

puts "1 + 1 = #{1+1}"

[Kết quả hiển thị]

1 + 1 = 2

Chúng ta cũng có thể sử dụng biến số trong trường hợp này.

a = "abc"
puts "a nằm trong #{a}"

[Kết quả hiển thị]

a nằm trong abc

Nhận định số chẵn và số lẻ

Lần này chúng ta cùng làm một chương trình để nhận định [i] là số chẵn hay số lẻ. Phần lõi thì cũng giống như phần trước. Biến số [i] biểu diễn dãy số [1~9] và được cộng dần 1 đơn vị mà hình thành. Để nhận định xem biến số [i] là số lẻ hay số chẵn thì chúng ta phải nhận định thế nào.

Lần này chúng ta nhận định bằng cách xem xét số dư của số đó khi chia cho 2. Để lấy được phần dư của i cho n thì chúng ta làm như sau.

i % n

Như thế chúng ta có thể có được phần dư. Có nghĩa là nếu ta viết [i%2] thì ta có thể lấy được số dư của i khi chia cho 2. Từ kết quả đó ta có thể nhận định xem đó là số chẵn hay số lẻ.

Nếu i%2 bằng 0 -> số chẵn
Nếu i%2 bằng 1 -> số lẻ

Chúng ta có thể viết chương trình lại như sau

i=0
while i<10
  if i%2 == 0
    puts " #{i} là số chẵn"
  else
    puts " #{i} là số lẻ"
  end
  i += 1
end

[Kết quả hiển thị]

0 là số chẵn
1 là số lẻ
2 là số chẵn
3 là số lẻ
4 là số chẵn
5 là số lẻ
6 là số chẵn
7 là số lẻ
8 là số chẵn
9 là số lẻ

Như vậy chúng ta có thể nhận định số chẵn và số lẻ đúng không?

Dùng lệnh break để tạm dừng chuỗi kết quả

Nếu dùng lệnh break thì chúng ta có thể thoát ra khỏi chuỗi kết quả lúc nào tùy thích. Chúng ta thử làm một chuỗi giá trị vô hạn bằng lệnh while

i=0
while true
   puts i
   i +=1
end

Nếu cứ để thế này thì chuỗi kết quả sẽ không bao giờ dừng lại. Nhưng trong chuỗi lệnh ta dùng lệnh break thì có thể ngay lập tức thoát ra khỏi chuỗi kết quả này.

i=0
  while true
     puts i
     if i>4
       break
     end
     i +=1
 end
puts "bye"

[Kết quả hiển thị]

0
1
2
3
4
5

Trong chương trình này, nếu i>4 thì chương trình sẽ thực hiện lệnh break. Trong chương trình, nếu dòng break ở dòng khác thì tại đó kết quả sẽ thoát ra khỏi chuỗi. Chúng ta có thể dùng kết hợp times với break.

10.times do
  puts "Logo!"
  break
end
puts "Bye"

[Kết quả hiển thị]

Logo!
Bye
0