SGK Tin Học 8 - Bài 8. LẶP VỚI SỐ LẦN BIẾT TRƯỚC

  • Bài 8. LẶP VỚI SỐ LẦN BIẾT TRƯỚC trang 1
  • Bài 8. LẶP VỚI SỐ LẦN BIẾT TRƯỚC trang 2
  • Bài 8. LẶP VỚI SỐ LẦN BIẾT TRƯỚC trang 3
  • Bài 8. LẶP VỚI SỐ LẦN BIẾT TRƯỚC trang 4
  • Bài 8. LẶP VỚI SỐ LẦN BIẾT TRƯỚC trang 5
5 -THDCTHCSQ3- A
BÀI 8
LẶP VỚI SỐ LẨN CHƯA BIẾT TRƯỚC
Các hoạt động lặp với số lần chưa biết trước
Trong bài trước chúng ta đã làm quen với các hoạt động lặp và cách chỉ thị cho máy tính thực hiện các hoạt động lặp với số lần đã được xác định trước. Chẳng hạn, để tính tổng các số nguyên từ 1 đến 100, ta có thể viết câu lệnh lặp để máy tính thực hiện phép cộng 1 00 lần.
Trong thực tế có nhiều hoạt động được thực hiện lặp đi lặp lại với số lần chưa được biết trước.
Ví dụ 1. Một ngày chủ nhật, bạn Long gọi điện cho Tuấn. Không có ai nhấc máy. Long quyết định gọi thêm hai lần nữa. Nếu vẫn không có ai nhấc máy thì chắc là không có ai ở nhà. Như vậy Long đã biết trước là mình sẽ lặp lại hoạt động gọi điện thêm hai lần. Một ngày khác, Long quyết định cứ 10 phút gọi điện một lần cho Tuấn cho đến khi nào có người nhấc máy. Lần này Long sẽ lặp lại hoạt động gọi điện mấy lần? Chưa thể biết trước được, có thể một lần, có thể hai hoặc nhiều hon nữa. Điều kiện để kết thúc hoạt động lặp đó là có người nhấc máy.
Ví dụ 2. Nếu cộng lần lượt n số tự nhiên đầu tiên (/7=1,2, 3,...), ta sẽ được các kết quả T, =1, r2 =1 + 2, T3 =1 + 2 + 3,... tăng dần. cần cộng bao nhiêu số tự nhiên đầu tiên để ta nhận được tổng Tn nhỏ nhất lớn hơn 1000 ? Trong trường hợp này, để quyết định thực hiện phép cộng với số tiếp theo hay dừng, trong từng bước cần phải kiểm tra tổng đã lớn hơn 1000 hay chưa.
Chúng ta hãy tìm hiểu các bước của thuật toán trong ví dụ này một cách cụ thể hơn. Kí hiệu s là tổng cần tìm và ta có thuật toán như sau:
Bước 7. s <- 0, n <- 1.
Bước 2. Nếu s < 1 000, s s + n; Ngược lại, chuyển tới bước 4.
Bước 3. n <- n + 7 và quay lại bước 2.
Bước 4. In kết quả: s và n là số tự nhiên nhỏ nhất sao cho 5 > 1000. Kết thúc thuật toán.
5-THDCTHCSQ3-B
Việc thực hiện phép cộng ở thuật toán trên được lặp lại với số lần chưa biết trước, phụ thuộc vào một điều kiện (S< 1000) và chỉ dừng khi điều kiện đó sai.
Nói chung, việc lặp lại một nhóm hoạt động với số lần chưa xác định trước phụ thuộc vào một điều kiện cụ thể có được thoả mãn hay không và có thể được mô tả như hình 39.
Hình 39
Để viết chưong trình chỉ dẫn máy tính thực hiện các hoạt động lặp như trong các ví dụ trên, ta có thể sử dụng câu lệnh có dạng lặp với số lần chưa biết trước. Nói chung các ngôn ngữ lập trình đều có câu lệnh lặp dạng này.
Ví dụ về lệnh lặp với số lần chưa biết trước
Trong Pascal câu lệnh lặp với số lần chưa biết trước có dạng:
while do ; trong đó:
điều kiện thường là một phép so sánh;
câu lệnh có thể là câu lệnh đơn giản hay câu lệnh ghép.
Câu lệnh lặp này được thực hiện như sau:
Bước 7. Kiểm tra điều kiện.
Bước 2. Nếu điều kiện SAI, câu lệnh sẽ bị bỏ qua và việc thực hiện lệnh lặp kết thúc. Nếu điều kiện đúng, thực hiện câu lệnh và quay lại bước 1.
Ví dụ 3. Chúng ta biết rằng, nếu n In > 0) càng lớn thì càng nhỏ, nhưng luôn luôn lớn hon 0.
Với giá trị nào của n thì — < 0.005 hoặc -jj< 0.003? Chương trình dưới đây tính số n nhỏ nhất để -1- nhỏ hơn một sai số cho trước:
uses crt;
var x: real; n: integer;
const sai_so=0.003; begin
clrscr;
X: = 1; n: = 1;
while X >= sai_so do begin x:= 1/n; n:= n + 1 end; writeln('So ụ nho nhat de 1/n <	sai_so:6:5, 'la ',n-lj;
readln
end.
Nếu chạy chương trình này, ta sẽ nhận được kết quả n = 334 (và sai số là 0.00299). Thay điều kiện sai_so = 0.003 lần lượt bằng các điểu kiện sai_so = 0.002 và sai_so = 0.001, ta nhận được các kết quả n = 501 và n = 1 001. Có thể kiểm tra các kết quả này bằng một phép chia đơn giản.
Ví dụ 4. Chương trình Pascal dưới đây thể hiện thuật toán tính tổng n số trong ví dụ 2:
var s, n: integer;
begin
S:= 0; n: = 1;
while s <= 1000 do
begin S : = s + n
; n: = n +
1 end;
writeln('So n nho nhat
de tong >
1000 la	n-1);
writeln('Tong dau tien
> 1000 la
S);
readln
end.
Nếu chạy chương trình này ta sẽ nhận được n = 45 và tổng đầu tiên lớn hơn 1000 la 1035.
Ví dụ 5. Đê’ viết chương trình tính tổng T = 1 + y + y + ... + ta có
thể sử dụng lệnh lặp với số lần lặp biết trước for...do:
T: = 0;
for ỉ:= 1 to 100 do T:= T + 1/i; writeln(T);
Nếu sử dụng lệnh lặp while...do, đoạn chương trình dưới đây cũng cho cùng một kết quả:
T: = 0;
i: = 1;
while i <= 100 do begin T: = T + 1/i; i:= i + 1 end; writeln(T);
Ví dụ này cho thấy rằng chúng ta có thể sử dụng câu lệnh while...do thay cho câu lệnh for .do.
Lặp vô hạn lần - Lỗi lập trình cần tránh
Khi viết chương trình sử dụng cấu trúc lặp cần chú ý tránh tạo nên vòng lặp không bao giờ kết thúc. Chẳng hạn, chương trình dưới đây sẽ lặp lại vô tận:
var a:integer;
begin
a: =5;
while a<6 do writeln('A'); end.
Trong chương trình trên, giá trị của biến a luôn luôn bằng 5, điều kiện a<6 luôn luôn đúng nên lệnh writeln ('A') luôn được thực hiện.
Do vậy, khi thực hiện vòng lặp, giá trị các biến trong điều kiện của câu lệnh phải được thay đổi để sớm hay muộn giá trị của điều kiện được chuyển từ đúng sang sai. Chỉ như thế chương trình mới không “rơi” vào những “vòng lặp vô tận”. Trong các ví dụ 3, 4, 5 sau mỗi vòng lặp giá trị các biến X, s, i được thay đổi (x giảm đi còn s, i tăng lên) làm cho giá trị của điểu kiện (x >= sai_so ở ví dụ 3; s <= 1000 ở ví dụ 4; i <= 100 ở ví dụ 5) sẽ buộc phải thay đổi khi X đủ nhỏ còn s, i đủ lớn.
GHI NHÓ
Ngoài cấu trúc lặp với số lần lặp biết trước, các ngôn ngữ lập trình còn có các câu lệnh lặp với số lần chưa biết trước.
while .do là câu lệnh lặp với số lần chưa biết trước trong Pascal.
Câu hỏi và bài tập
Nêu một vài ví dụ về hoạt dộng lặp với số lần chưa biết trước.
Hãy phát biểu sự khác biệt giữa câu lệnh lặp với số lần biết trước và câu lệnh lặp vối số lần chưa biết trước.
Hãy tìm hiểu các thuật toán sau đây và cho biết khi thục hiện thuật toán, máy tính sẽ thục hiện bao nhiêu vòng lặp? Khi kết thúc, giá trị của Sbằng bao nhiêu? Viết chưang trình Pascal thể hiện các thuật toán đó.
Thuật toán 1
Bước 1. s <- 10, x<- 0.5.
Bước 2. Nếu s< 5.2, chuyển tói bước 4.
Bước 3 s <- s - X và quay lại bước 2.
Bước 4. Thông báo Svà kết thúc thuật toán.
Thuật toán 2 Bước 1. s<- 10, n<- 0.
Bưôc 2. Nếu s> 10, chuyển tới bước 4.
Bước 3 . n <r- n + 3, s <- s - n quay lại bước 2.
Bước 4. Thông báo s và kết thúc thuật toán.
Hãy tìm hiểu mỗi đoạn lệnh sau đây và cho biết vái đoạn lệnh đó chưong trình thục hiện bao nhiêu vòng lặp ? Hãy rút ra nhận xét của em.
S:= 0; n: = 0;
while s <= 10 do
begin n: = n + 1; s: = s + n end;
s : = 0; n : = 0 ;
while s <= 10 do
n: = n + 1; S:= s + n
Hãy chỉ ra lỗi trong các câu lệnh sau đây:
a) X: =
10; while
X: =
10
do
X:
= X + 5;
b) X: =
10; while
X =
10
do
X
= X + 5;
c) S: =
0; n: = 0;
while
s
<=
10
do n: = n + 1;