Lựa chọn và lặp
Đã giới thiệu| English | Ý nghĩa |
|---|---|
| selection/sɪˈlekʃn/ | chọn lọc |
| iteration/ˌɪtəˈreɪʃn/ | lặp lại |
| trace table/treɪs ˈteɪbl/ | bảng theo dõi |
| nested/ˈnestɪd/ | lồng nhau |
| logic error/ˈlɒdʒɪk ˈerə/ | lỗi logic |
| count-controlled loop/kaʊnt kənˈtrəʊld luːp/ | Vòng lặp điều khiển bằng bộ đếm |
| array/əˈreɪ/ | mảng |
| pre-condition loop/priː kənˈdɪʃn luːp/ | Vòng lặp kiểm tra tiền điều kiện |
| post-condition loop/pəʊst kənˈdɪʃn luːp/ | vòng lặp điều kiện sau |
| dry run/draɪ rʌn/ | chạy thử tay |
Một dòng thừa
- Năm 2014, Apple phát hành bản cập nhật bảo mật do một dòng lặp lại duy nhất. Sâu bên trong đoạn mã kiểm chứng chứng chỉ trang web,
goto fail;đã xuất hiện hai lần liên tiếp. - Bản sao thứ hai nằm bên ngoài
IFcủa nó, nên nó chạy mỗi lần, và kiểm tra bên dưới nó chưa bao giờ diễn ra. Trong suốt vài tháng, bất kỳ kẻ tấn công nào cũng có thể giả mạo bất kỳ trang web nào. - Chọn lọc và lặp là những cấu trúc quyết định điều gì sẽ chạy và chạy bao nhiêu lần. Sai một dòng trong chúng và chương trình vẫn chạy, chỉ là chạy sai lệch.
- Bài học này là IF, CASE và ba vòng lặp, cùng bảng truy vết giúp phát hiện lỗi trước khi bài thi chính thức.
Chọn lọc
IF age >= 18 THEN … ELSE … ENDIF
ELSElà tùy chọn,ENDIFthì không. MọiIFđều phải được đóng lại.- Một điều kiện là bất kỳ biểu thức Boolean nào: một phép so sánh, hoặc các phép so sánh được nối với nhau bởi
AND,ORvàNOT.

Một IF … ELSE kiểm tra một lần, sau đó chạy chính xác một nhánh
IF lồng nhau và ranh giới
- Một IF lồng nhau là một IF nằm trong một nhánh của một IF khác, và mỗi cái cần phải có
ENDIFriêng của nó. - Các ranh giới là nơi bị mất điểm. "Điểm từ 50 trở lên mới đạt" là
Mark >= 50, không phảiMark > 50. - Một phép so sánh sai là lỗi logic: chương trình vẫn chạy và trả về kết quả sai với một số đầu vào nhất định. Việc theo dõi giá trị ranh giới, chính là 50, sẽ giúp bạn phát hiện ra lỗi này.
"Điểm 50 trở lên đạt yêu cầu" được viết là IF Mark ____ 50 THEN.
Độ khó 1/5 · 100 xu + một phần thưởng nhỏ cho lần hoàn thành đầu tiên trong ngày
"Trở lên" bao gồm cả 50, vì vậy phép so sánh là lớn hơn hoặc bằng. > sẽ khiến học sinh điểm đúng 50 bị trượt.
TRƯỜNG HỢP
CASE OF Grade … ENDCASEkiểm tra một giá trị so với nhiều tùy chọn và gọn gàng hơn một chuỗi IF lồng nhau.- Điều kiện bảo vệ (guard) có thể là một giá trị đơn lẻ
"A":, một danh sách1, 2, 3:, hoặc một khoảng1 TO 5:. Nhánh cuối cùng cho "mọi trường hợp khác" làOTHERWISE, không bao giờ là một điều kiện như> 200. - Các điều kiện bảo vệ được kiểm tra theo thứ tự. Với
1 TO 50:đi trước40 TO 60:, nếu giá trị là 45 thì nó sẽ đi vào nhánh đầu tiên, nên việc gán giá trị trong nhánh thứ hai có thể không bao giờ xảy ra. Nếu các nhánh ở trước đã bao phủ hết mọi giá trị có thể, thìOTHERWISEcũng sẽ không bao giờ thực thi.

Một CASE sẽ chạy nhánh đầu tiên mà điều kiện bảo vệ khớp với giá trị
Câu lệnh CASE sạch sẽ hơn IF lồng nhau khi bạn:
Độ khó 1/5 · 100 xu + một phần thưởng nhỏ cho lần hoàn thành đầu tiên trong ngày
CASE khớp một giá trị với nhiều khả năng; IF lồng nhau sâu trở nên khó đọc.
Trong số các điều kiện bảo vệ (guards) nào sau đây là hợp lệ trong câu lệnh CASE của Cambridge? Chọn tất cả các đáp án đúng.
Độ khó 2/5 · 140 xu + một phần thưởng nhỏ cho lần hoàn thành đầu tiên trong ngày
Một giá trị đơn lẻ, danh sách giá trị, khoảng giá trị và OTHERWISE. Một phép so sánh như > 200 không phải là điều kiện bảo vệ; bất cứ điều gì không được xử lý đều chuyển sang OTHERWISE.
Ví dụ minh họa : viết lại một CASE không dùng CASE
CASE OF MySwitchthay thế cho1: ThisChar ← 'a',2: ThisChar ← 'y',3: ThisChar ← '7',OTHERWISE: ThisChar ← '*'.- Mỗi giá trị trở thành một nhánh trong chuỗi IF, và
OTHERWISEtrở thành NHÁNH CUỐI CÙNGELSE.
IF MySwitch = 1 THEN
ThisChar <- 'a'
ELSE
IF MySwitch = 2 THEN
ThisChar <- 'y'
ELSE
IF MySwitch = 3 THEN
ThisChar <- '7'
ELSE
ThisChar <- '*'
ENDIF
ENDIF
ENDIF
- Ba câu IF, ba câu ENDIF. Theo hướng ngược lại, hai mệnh đề CASE gán cùng một giá trị sẽ gộp thành một điều kiện bảo vệ duy nhất với danh sách giá trị, là
1, 2:.
BA VÒNG LẶP
- Lặp (Iteration) lặp lại một khối lệnh, và ba loại vòng lặp khác nhau ở vị trí kiểm tra điều kiện.
- Vòng lặp điều khiển bằng đếm,
FOR i ← 1 TO 10 … NEXT i, chạy một số lượng lần xác định;STEP -1đếm ngược. Hãy dùng nó khi cần số lượng cố định hoặc duyệt qua mọi phần tử của mảng. - Vòng lặp tiền điều kiện,
WHILE … DO … ENDWHILE, kiểm tra trước mỗi lần lặp, nên có thể chạy không lần nào. Vòng lặp hậu điều kiện,REPEAT … UNTIL, kiểm tra sau mỗi lần lặp, nên luôn chạy ít nhất một lần.

Vị trí đặt điều kiện quyết định số lần thân loop có thể chạy
Gắn mỗi vòng lặp với thời điểm bạn sẽ sử dụng nó.
Độ khó 2/5 · 140 xu + một phần thưởng nhỏ cho lần hoàn thành đầu tiên trong ngày
FOR = điều khiển bởi đếm; WHILE = điều kiện kiểm tra trước (0+ lần lặp); REPEAT = điều kiện kiểm tra sau (1+ lần lặp).
REPEAT...UNTIL kiểm tra điều kiện SAU thân vòng lặp, vì vậy thân luôn chạy ít nhất một lần.
Độ khó 1/5 · 100 xu + một phần thưởng nhỏ cho lần hoàn thành đầu tiên trong ngày
Việc kiểm tra hậu điều kiện này là sự khác biệt so với WHILE, vốn có thể chạy zero lần.
CHỌN VÒNG LẶP : Câu trả lời hai điểm
- Một điểm cho tên, một điểm cho lý do, diễn đạt bằng đúng thuật ngữ của bộ tiêu chuẩn chấm điểm.
- Điều khiển bằng đếm, vì số lần lặp biết trước khi vòng lặp bắt đầu. Hậu điều kiện, vì thân vòng lặp phải được thực thi ít nhất một lần. Tiền điều kiện, vì vòng lặp có thể không cần thực thi lần nào cả.
- Duyệt qua bốn phần tử của mảng viết dưới dạng
WHILEkèm biến đếm thì "không phải cách phù hợp nhất"; vòng FOR là phù hợp, vì số lượng là đã biết.
Một câu hỏi yêu cầu bạn "xác định vòng lặp phù hợp hơn và biện minh cho lựa chọn của bạn" cho 2 điểm. Điều gì kiếm được hai điểm đó?
Độ khó 1/5 · 100 xu + một phần thưởng nhỏ cho lần hoàn thành đầu tiên trong ngày
Một điểm cho vòng lặp, một điểm cho lý do: đếm là biết trước, thân phải chạy một lần, hoặc vòng lặp có thể không chạy chút nào.
Ví dụ minh họa : loại vòng lặp nào phù hợp với mỗi nhiệm vụ?
- In bảng nhân 12: số lượng đã biết trước, nên dùng vòng lặp FOR.
- Tiếp tục đọc số cho đến khi người dùng nhập 0: số lượng không biết trước và đầu vào đầu tiên có thể đã là 0, nên phép kiểm tra phải nằm trước thân loop: dùng vòng lặp WHILE.
- Yêu cầu mật khẩu cho đến khi đúng: người dùng phải được hỏi ít nhất một lần, nên dùng vòng lặp REPEAT … UNTIL.
- Hỏi hai câu hỏi: bao nhiêu lần, và thân loop có phải chạy trước phép kiểm tra đầu tiên hay không?
"Tiếp tục yêu cầu mật khẩu cho đến khi đúng, nhưng luôn yêu cầu ít nhất một lần." Vòng lặp nào phù hợp?
Độ khó 1/5 · 100 xu + một phần thưởng nhỏ cho lần hoàn thành đầu tiên trong ngày
Bạn phải yêu cầu ít nhất một lần, vì vậy REPEAT...UNTIL hậu điều kiện là lựa chọn tự nhiên.
BẢNG THEO DÕI
- Bảng theo dõi ghi lại giá trị của mọi biến khi bạn chạy thử thủ công thuật toán. Đây là cách kiểm tra vòng lặp trên giấy và là câu hỏi sáu điểm trong hầu hết các đề thi Paper 2.
- Một cột cho mỗi biến, cộng thêm một cột cho bất kỳ đầu ra nào. Chỉ viết một hàng mới khi giá trị thay đổi, và đánh giá điều kiện vòng lặp tại thời điểm vòng lặp chạm đến nó.
- Tiếp tục cho đến khi điều kiện làm dừng vòng lặp, sau đó ghi lại đầu ra cuối cùng.
Theo dõi vòng lặp, từng bước một
Bảng theo dõi ghi lại mỗi biến sau mỗi lần lặp của vòng lặp. Hãy xem bộ đếm i tăng dần trong khi tổng tích lũy đang hình thành — đúng những gì câu hỏi theo dõi đề thi yêu cầu bạn điền.
Sau total = 0; FOR i = 1 TO 5: total = total + i, giá trị của total là gì?
Độ khó 2/5 · 140 xu + một phần thưởng nhỏ cho lần hoàn thành đầu tiên trong ngày
Thêm 1+2+3+4+5 = 15 — đúng như bảng theo dõi tích lũy từng bước một.
Ví dụ minh họa : điền bảng theo dõi
Count <- 1
Total <- 0
WHILE Total < 10 DO
Total <- Total + Count
Count <- Count + 1
ENDWHILE
OUTPUT Count
- Các hàng (Count, Total): (1, 0) → (2, 1) → (3, 3) → (4, 6) → (5, 10).
- Tại Total = 10, điều kiện
Total < 10là sai, vòng lặp kết thúc, và đầu ra là 5. - Hàng cuối cùng là hàng thường xuyên bị sai nhất: hãy kiểm tra điều kiện một lần nữa trước khi ghi đầu ra.
Trong bảng theo dõi đã giải, vòng lặp kết thúc với Total = 10 và Count = 5, vì vậy đầu ra là 5.
Độ khó 1/5 · 100 xu + một phần thưởng nhỏ cho lần hoàn thành đầu tiên trong ngày
Sau lần lặp thứ tư, Total đạt 10, điều kiện Total < 10 trở thành sai, và Count đã được tăng lên 5.
Điểm số dễ mất
>=và>là những câu trả lời khác nhau. Hãy kiểm tra giá trị ranh giới trong đầu trước khi viết phép so sánh.OTHERWISElà từ khóa, không phải điều kiện. Và mỗiIF,CASE,WHILEvàFORđều đóng bằngENDIF,ENDCASE,ENDWHILEhoặcNEXT.- Một
WHILEcó thể chạy không lần; mộtREPEATthì không thể. Hãy chọn dựa trên việc liệu thân loop có cần chạy một lần trước phép kiểm tra đầu tiên hay không. - Trong bảng theo dõi, giá trị không thay đổi sẽ không được ghi đè, và đầu ra chỉ được ghi khi dòng
OUTPUTchạy.
Bạn đã nắm vững
- IF … ELSE … ENDIF cho sự lựa chọn; IF lồng nhau mỗi cái đều đóng; CASE để kiểm tra một giá trị với nhiều điều kiện bảo vệ, được kiểm tra theo thứ tự,
OTHERWISEnằm cuối - FOR đếm đã biết · WHILE kiểm tra trước, có thể chạy không lần · REPEAT … UNTIL kiểm tra sau, chạy ít nhất một lần
- Giải thích lý do chọn vòng lặp bằng tên và lý do: đếm đã biết, có thể không chạy, phải chạy một lần
- bảng theo dõi chạy thử thuật toán, mỗi hàng ứng với một sự thay đổi; kiểm tra điều kiện một lần nữa trước đầu ra cuối cùng