Câu hỏi:
Nêu một vài ví dụ về hoạt độ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 lặp cho trước và câu lệnh lặp với số lần lặp 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 S bằng bao nhiêu? Viết chương trình Pascal thể hiện các thuật toán đó.
a) 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 S và kết thúc thuật toán.
b) 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 ← n+3, S ← S-n và 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 chương trình Pascal sau đây và cho biết với đoạn lệnh đó chương 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.
a)
S:=0; n:=0;
while s <= 10 do
begin n:=n+1; S:=S+n end;
b)
S:=0; n:=0;
while S <= 10 do
n:=n+1; S:=S+n;
Trả lời:
Một vài ví dụ về hoạt động lặp với số lần chưa biết trước là:
Tập đi cho đến khi biết đi.
Tập nấu cho đến khi nấu ăn giỏi.
Múc nước cho đến khi đầy thùng.
2.
Sự khác biệt giữa câu lệnh lặp với số lần lặp cho trước và câu lệnh lặp với số lần lặp chưa biết trước là:
3.
a) Thuật toán 1:
Kết quả thuật toán có 10 vòng lặp, giá trị S=5.
Chương trình Pascal:
var S,x:real;
i:integer;
S:=10;
x:=0.5;
i:=0;
while S>5.2 do
begin
S:=S-x;
i:=i+1;
end;
writeln(i); writeln(S);
b) Thuật toán 2:
Kết quả thuật toán có 0 vòng lặp do điều kiện vòng lặp không thỏa mãn, giá trị S=10.
Chương trình Pascal:
var S,n:real;
i:integer;
S:=10;
n:=0;
i:=0;
while S<10 do
begin
n:=n+3;
S:=S-n;
i:=i+1;
end;
writeln(i); writeln(S);
4.
a) Chương trình thực hiện 10 vòng lặp.
b) Chương trình thực hiện vô hạn vòng lặp do giá trị của S luôn luôn nhỏ hơn 10
Nhận xét: Cần chú ý về lỗi vòng lặp vô hạn. Ở phần b do thiếu đoạn begin end để đóng mở nên sau lệnh lặp chỉ thực hiện lệnh tăng n lên 1, còn lệnh tăng S lên 1 không thực hiện được. Do đó S luôn bằng 0 như ban đầu. Lỗi lặp vô hạn xuất hiện.
Câu hỏi:
Câu lệnh lặp Repeat… until
Một câu lệnh lăp khác cũng thường hay được sử dụng trong Pascal là câu lệnh repeat… until có cú pháp như sau:
repeat
<câu lệnh 1>;
<câu lệnh 2>;…;
<câu lệnh k>;
until <điều kiện>;
Khi gặp câu lệnh này chương trình sẽ thực hiện các câu lệnh nằm giữa hai từ khóa repeat và until, sau đó kiểm tra <điều kiện kiện>, nếu <điều kiện> sai thì tiếp tục thực hiện vòng lặp. Quá trình đó được lăp đi lặp lại cho tới khi nào <điều kiện> đúng thì kết thúc.
Đoạn chương trình sau cho cùng kết quả như ví dụ 4 ở trên:
T:= 0;
i:= 1;
repeat
T:= T+1/i;
i:= i+1;
until i>100;
writeln(T);
1. Em hãy viết chương trình Pascal với câu lệnh repeat…until thể hiện thuật tính tính số n trong ví dụ 1.
2. Hãy tìm hiểu và rút ra những điểm giống và khác nhau giữa các câu lệnh lặp While… do và Repeat … until.
Trả lời:
1.
Chương trình Pascal với câu lệnh repeat…until thể hiện thuật tính tính số n trong ví dụ 1:
Ví dụ 1. Nếu cộng lần lượt n số tự nhiên đầu tiên (n = 1, 2, 3, …), ta sẽ được kết quả T1 = 1, T2 = 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 dược tổng Tn nhỏ nhất lớn hơn 1000 ?
Chương trình Pascal với While ... do:
Begin
S:=0; i:=0;
while S<=1000 do
begin i:=i+1; S:=S+i end;
writeln(i);
End.
Chương trình Pascal với Repeat ... until:
Begin
S:=0; i:=1;
repeat
S:=S+i;
i:=i+1;
until S>1000
writeln(i);
End.
2.
Điểm giống và khác nhau giữa các câu lệnh lặp While… do và Repeat … until: