Đến lúc này, các em đã làm quen với ngôn ngữ lặp trình Python và hai cấu trúc cơ bản trong lập trình là cấu trúc tuần tự và rẽ nhánh. Bài học này sẽ tiếp tục giới thiệu đến các em cấu trúc lặp. Là một cấu trúc phổ biến trong đời sống, kỹ thuật và trong lập trình, cấu trúc lặp mô tả các dạng công việc được lặp đi lặp lại nhiều lần với cách thức giống hệt hoặc tương tự nhau.
Hai loại cấu trúc lặp phổ biến nhất là lặp với số lần biết trước và số lần không biết trước. Ví dụ với yêu cầu hãy in 10 hóa đơn cho khách hàng, chúng ta biết được hành động in hóa đơn được lặp lại 10 lần, đó chính là lặp với số lần biết trước. Tuy nhiên với yêu cầu hãy nhập user name và password để đăng nhập vào hệ thống, chúng ta không biết trước người dùng sẽ nhập bao nhiêu lần, vì chỉ khi nhập đúng user và pass mới vào được, còn nhập sai thì hệ thống sẽ yêu cầu nhập lại, đây chính là dạng lặp với số lần không biết trước.
Như đã để cập ở trên, lặp với số lần biết trước là chúng ta đã biết được số lần lặp, như vậy chúng ta cần xác định rõ hai vấn đề:
Hành động nào được lặp
Số lần lặp là bao nhiêu
Ví dụ: Hãy xuất ra 10 dòng chữ "Chao cac ban".
Hành động cần lặp: Xuất dòng chữ
Số lần lặp: 10
Mọi ngôn ngữ lập trình đều cung cấp cú pháp để chúng ta thể hiện được dạng cấu trúc lặp như trên. Trong Python, cú pháp cần dùng là lệnh For.
Cú pháp:
for <biến đếm> in range(stop):
Các lệnh cần lặp
Trong đó:
Biến đếm: là biến tự đặt (theo đúng quy tắc đặt tên)
Range(stop): là vùng mà biến đếm chạy trong giới hạn đó, trong trường hợp này sẽ chạy từ 0 đến stop -1
Các lệnh cần lặp: là các lện sẽ lặp đúng stop lần, phài thục lề một tab so với chữ for, đây là lưu ý quan trọng trong Python.
Ví dụ: để xuất ra 10 dòng chữ "Chao các ban", chúng ta viết như sau trong Python:
for i in range(10):
print("Chao cac ban")
Ví dụ 2: Viết chương trình xuất dãy số từ 1 đến 10. Kết quả ra màn hình là 1 2 3 4 5 6 7 8 9 10
Hành động cần lặp: xuất con số
Số lần lặp: 10
Phân tích: ở đây chúng ta thấy hành động xuất con số được lặp lại 10 lần nên đơn giản chúng ta chỉ cần xuất chính biến đếm trong cú pháp for, vì bản chất biến đếm tự động được tăng dần trong for.
Khi viết:
for i in range(10):
print(i)
Kết quả ra màn hình là:
0
1
2
3
4
5
6
7
8
9
Rõ ràng không đạt yêu cầu bài toán. Để khắc phục tình trạng trên, chúng ta cần nói rõ hơn về range() trong Python.
range(stop): trả về vùng từ 0 đến stop -1
range(start, stop): trả về vùng từ start đến stop -1
range(start, stop, step): trả về vùng từ start đến stop nhưng nhảy step lần
Như vậy ví dụ 2 ở trên được viết đúng như sau:
for i in range(1, 11):
print(i, end = " ") # lệnh end = " " là để kết quả xuất ra không tự động xuống dòng.
Các em hãy tự viết đoạn lệnh này trong python IDE để xem kết quả nhé.
Nhiệm vụ 1: Viết chương trình xuất dãy số từ 20 về 1. Kết quả ra màn hình là: 20 19 18 ... 3 2 1
Gợi ý: dùng range(start, stop, step), trong đó: start = 20, stop = 0, step = -1
Nhiệm vụ 2: Viết chương trình xuất dẫy số chẵn từ 1 đến 20. Kết quả ra màn hình là 2 4 6 ... 16 18 20
Nhiệm vụ 3. Viết chương trình nhập vào số nguyên N. Xuất ra dãy số chẵn từ 1 đến N.
Nhiệm vụ 4. Viết chương trình nhập vào số nguyên N. Xuất ra những số là bội của 5 từ 1 đến N.
Tương tự với dạng lặp với số lần biết trước, dạng lặp này ta cũng xác định hành động cần lặp lại, nhưng ta không xác định số lần lặp mà xác định điều kiện để hành động được lặp, cụ thể cần xác định hai việc:
Hạnh động cần lặp
Điều kiện để hành động vẫn lặp
Lưu đồ trên có thể được diễn tả bằng ngôn ngữ tự nhiên như sau:
Trong khi điều kiện còn thỏa thì còn thực hiện hành động
Ví dụ: Viết chương trình nhập vào số nguyên a, tính b = 1/a. Xuất b ra màn hình. Nếu người dùng nhập 0 thì yêu cầu nhập lại.
Ở đây ta thấy rất rõ là a nằm dười mẫu số nên không thể bằng 0. Khi người dùng nhập 0, ta yêu cầu nhập lại thì họ vẫn có thể nhập số 0 tiếp, nên ta không biết hành động nhập này sẽ lặp lại bao nhiêu lần. Ta chỉ có thể dùng điều kiện để ràng buộc.
Hành động cần lặp: nhập a
Điều kiện lặp: a = 0
Lưu đồ trên có thể được diễn tả theo cách liệt kê như sau:
Bước 1. Nhập a
Bước 2. Trong khi a ==0:
Nhập lại a
Bước 3. b <-- 1/a
Bước 4. Xuất b
Bước 5. Kết thúc
Nhìn lưu đồ hoặc giải thuật theo bước ở trên, các em dễ thấy rằng hành động nhập lại a sẽ được lặp lại chừng nào điều kiện a = 0 còn thỏa, đây chính là phần quan trọng nhất của vòng lặp với số lần không biết trước.
Hầu hết mọi ngôn ngữ lặp trình đều dùng câu lệnh While để thể hiện cho loại vòng lặp này, trong bài này chúng ta xem xét cách thể hiện nó trong Python.
Cú pháp:
while <điều kiện>:
Các lệnh cần lặp
Trong đó:
Điều kiện: là biểu thức logic (để luôn cho kết quả đúng hoặc sai)
Các lệnh cần lặp: một hoặc nhiều lệnh, lưu ý thục lề một tab so với chữ while
Như vậy ví dụ ở trên có thể được viết lại như sau:
a = int(input("Nhap a: ")
while a == 0: # Bắt đầu vào lặp
a = int(input("Nhap lai a: ") # hành động nhập được lặp lại trong khi điều kiện còn thỏa
b = 1/a # ra khỏi lặp và tính b
print(b) # xuất b ra màn hình
Các em hãy tự việt lại chương trình trên vào Python IDE để xem kết quả nhé.
Nhiệm vụ 5. Viết chương trình nhập vào số nguyên dương N. Tính tổng dãy số từ 1 sao cho tổng đó là lớn nhất nhưng vẫn nhỏ hơn N.
Input: một số nguyên dương N
Output: tổng lớn nhất còn nhỏ hơn N
Ví dụ:
input | output
--------------------------------
7 | 6
Giải thích: Tổng dãy từ 1 là S = 1 + 2 + 3 =6. S = 6 là số lớn nhất còn nhỏ hơn 7, vì nếu cộng thêm 4 vào S thì S sẽ = 10 đã vượt qua 7
Nhiệm vụ 6. Viết chương trình yêu cầu người dùng nhập vào username và password (user và pass do em tự nghĩ ra và gán trước vào hai biến username và password). Nếu người dùng nhập đúng user và pass thì xuất ra câu "Chào mừng bạn đến với hệ thống", nếu nhập sai một trong hai thì thông báo "Sai username hoặc password, vui lòng nhập lại"
Các e truy cập vào Codelearn.io đăng nhập bằng google hoặc tự đăng ký tài khoản và làm 6 task nhỏ của phần Loop.
Các em truy cập tkncoder.net, đăng nhập vào hệ thống và thực hiện các bài tập sau đây
K11_C3_XuatDong
K11_C3_XuatSo
K11_C3_XuatSo01
K11_C3_XuatSoChan
K11_TinhTong
K11_C3_TinhTongLe
K11_C3_TinhGiaiThua
K11_C3_TinhTong
K11_C3_TinhTong01
K11_C3_SNT
K11_C3_TongGanNhat
K11_C3_UCLN
Để thuận tiện trong việc tìm kiếm bài tập trên hệ thống, các em copy mã bài. Vào tkncoder --> chọn danh sách bài tập --> Chọn mở tìm kiếm --> paste mã bài vào --> Bấm tìm kiếm