Cấu trúc lặp với số lần lặp không xác định trước
Câu lệnh lặp với số lần chưa biết trước
While … do.
NỘI DUNG CẦN TÌM HIỂU
LẶP VỚI SỐ LẦN CHƯA BIẾT TRƯỚC
1./ Lệnh lặp với số lần chưa biết trước
2./ Lặp vô hạn lần- Lỗi lập trình cần tránh
Các hoạt động lặp với số lần chưa biết trước:
Ví dụ: Một ngày chủ nhật, bạn Long gọi điện cho bạn Trang. Không có ai nhất máy. Long quyết định gọi thêm hai lần nữa. Nếu vẫn không có ai nhất máy thì chắc là không có ai ở nhà. Như vậy là 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 Trang 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 lần hoặc nhiều hơn nữa. Điều kiện để kết thúc hoạt động lặp đó là có người nhất máy.
Ví dụ: Cho biết kết quả thuật toán sau sẽ lặp lại bao nhiêu lần:
B1. Nhập số N từ bàn phím.
B2. Nếu N<5 quay trở về bước 1.
B3. ….
1./ Lặp với số lần chưa biết trước:
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 cá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 được tổng Tn nhỏ nhất lớn hơn 1000?
* Bước 4: In kết quả: S và n là số tự nhiên nhỏ nhất sao cho S > 1000. Kết thúc thuật toán
* Bước 1: S ← 0; n ← 0; {Khởi tạo S và n}
* Bước 2: Nếu S<=1000 thì chuyển đến bước 3;
ngược lại (S > 1000) thì chuyển đến Bước 4;
* Bước 3: n ← n + 1; S ← S + n; và quay lại bước 2;
Từ bước 2 đến bước 3 được lặp lại nhiều lần nếu điều kiện S≤1000 chưa được thoả mãn và chỉ dừng khi điều kiện đó sai.
1./ Lặp với số lần chưa biết trước:
THUẬT TOÁN
1./ Lặp với số lần chưa biết trước:
Tóm lại:
Để viết các chương trình chỉ dẫn máy tính thực hiện các hoạt động lặp mà chưa xác định trước được số lần lặp, ta có thể sử dụng câu lệnh có dạng lặp với số lần chưa xác định.
1./ Lặp với số lần chưa biết trước:
Cú pháp câu lệnh lặp với số lần chưa biết trước trong Pascal:
While <điều kiện> 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 được thực hiện như sau:
-Bước 1: 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ụ 2./ Chúng ta biết rằng, nếu n (n>0) càng lớn thì 1/n càng nhỏ nhưng luôn lớn hơn 0.
Với giá trị nào của n thì 1/n < 0.005 hoặc 1/n < 0.003 ?
Em hãy viết chương trình tính số n nhỏ nhất để 1/n nhỏ hơn một sai số cho trước.
1./ Lặp với số lần chưa biết trước:
Chương trình ví dụ 2:
* Lần lượt thay điều kiện sai_so bằng các giá trị 0.005; 0.002; 0.001, ta nhận các kết quả khác nhau.
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 n nho nhat de 1/n < ‘, sai_so:6:4, ‘ la’, n-1);
Readln
End.
Ví dụ 3./
Viết chương trình tính tổng: Sn=1 + 2 + 3 + … + n
Cần cộng bao nhiêu số tự nhiên để ta nhận được tổng Sn nhỏ nhất lớn hơn 1000. Tính tổng Sn
1./ Lặp với số lần chưa biết trước:
Chương trình ví dụ 3:
Var S, n :integer;
Begin
S:=0; n:=0;
While S<=1000 do
Begin N:=n+1; S:=s+n; End;
Writeln(‘So n nho nhat de tong > 1000 la ‘, n );
Writeln(‘Tong dau tien > 1000 la ‘, s );
Readln
End.
Ví dụ 4:
Viết chương trình tính tổng T.

Yêu cầu:
Viết chương trình theo hai dạng cấu trúc:
a./ For .. do
b./ While .. do
1./ Lặp với số lần chưa biết trước:
Chương trình ví dụ 4:
Program Tinh_tong1;
Uses crt;
Var T : real; i : integer ;
Begin
Clrscr ; T:=0;
For i:=1 to 100 do
T:=T+1/i ;
Write(‘Tong T la ‘, T);
Readln
End.
Program Tinh_tong2;
Uses crt;
Var T : real ; i: integer ;
Begin Clrscr;
T:=0; i:=1;
While i <= 100 do
Begin T:=T+1/i ; i:= i+1; end;
Write(‘Tong T la ‘, T);
Readln
End.
2./ LẶP VÔ HẠN LẦN _ LỖI LẬP TRÌNH CẦN TRÁNH
Yêu cầu:
* Hãy cho biết chương trình trên sẽ lặp lại như thế nào?
Vòng lặp vô tận
Quan sát đoạn chương trình sau:
Var a : integer;
Begin
a := 5;
While a < 6 do writeln(‘A’);
End.
Ghi nhớ:
Cấu trúc lặp với số lần chưa biết trước.
While <điều kiện> do ;
2. Khi thực hiện vòng lặp, điều kiện trong 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, thì chương trình sẽ không “rơi” vào “vòng lặp vô tận”
Ý tưởng: Sử dụng một biến đếm và lệnh lặp While…do để nhập và cộng dần các số vào một biến kiểu số thực cho đến khi nhập đủ n số.
Em hãy trình bày ý tưởng cho viết chương trình trên?
Em hãy mô tả thuật toán của chương trình, các biến dự định và kiểu của chúng?
Thuật toán: Sử dụng biến n và biến dem kiểu số nguyên, biến x và biến TB kiểu số thực.
B1: dem  0 , TB  0; B2: Nhập giá trị cho biến n;
B3: Nếu dem >=n chuyển đến B5;
B4: dem  dem + 1, nhập giá trị cho biến x, TB TB+x, chuyển đến B3; B5: TB  TB / n , thông báo giá trị trung bình, kết thúc.
Bài tập 1:Viết chương trình sử dụng lệnh lặp while…do để tính trung bình n số thực x1, x2, x3,…, xn, các số n và x1, x2, x3,…, xn được nhập từ bàn phím.
a./ Gõ chương trình sau và lưu với tên Tinh_TB:
b./ Tìm hiểu ý nghĩa các lệnh, dịch, sửa lỗi, chạy chương trình
c./ Viết lại chương trình sử dụng lệnh For..do thay lệnh While …do.
Bài tập 1:
Chương trình 2:
Bài tập 2: Tìm hiểu chương trình nhận biết một số tự nhiên N được nhập vào từ bàn phím có phải là số nguyên tố hay không?
Ý tưởng: Kiểm tra lần lượt N có chia hết cho các số tự nhiên
2<= i <= n-1 hay không. Kiểm tra tính chia hết bằng phép chia lấy phần dư (mod).
Yêu cầu:
a./ Đọc và tìm hiểu ý nghĩa của từng câu lệnh trong chương trình sau.
b./ Gõ, dịch và chạy thử chương trình với một vài độ chính xác khác nhau. Lưu chương trình với tên SONGUYENTO.PAS.
Em hãy trình bày ý tưởng cho chương trình trên?
Bài tập 2:
Chương trình:
Bài tập:
nguon VI OLET