Với bài toán này ta không thể biết trước được ta sẽ cộng bao nhiêu số tự nhiên để tổng T nhỏ nhất lớn hơn 1000 nên không biết trước được n bằng bao nhiêu. Vậy để giải bài toán này ta phả[r]
(1)BÀI 8: LẶP VỚI SỐ LẦN CHƯA BIẾT TRƯỚC I TÓM LƯỢT LÝ THUYẾT
1 Lệnh lặp với số lần chưa biết trước.
* Ta sử dụng câu lệnh có dạng lặp với số lần chưa xác định để viết chương trình chỉ dẫn máy tính thực hoạt động lặp mà chưa xác định trước số lần lặp.
* Cú pháp câu lệnh lặp với số lần chưa biết trước: WHILE <điều kiện> DO <câu lệnh> ; Trong đó:
+ WHILE, DO: từ khóa
+ Điều kiện: thường phép so sánh.
+ Câu lệnh: câu lệnh đơn hay câu lệnh ghép. * Câu lệnh thực 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 bị bỏ qua kết thúc vòng lặp Nếu điều kiện đúng, câu lệnh thực tiếp tục quay lại bước
* Ta có sơ đồ khối thể hai bước thực câu lệnh While sau:
2 Lặp vô hạn lần – Lỗi lặp trình cần tránh. (Các em tự học, tự tìm hiểu tinh giản) II CÁC VÍ DỤ
1) Ví dụ 1: Với n số tự nhiên để ta nhận tổng n số tự nhiên đầu tiên T nhỏ lớn 1000?
* Hướng dẫn:
(2)Qua trình thực giải tốn: Giá trị ban đầu n = T = 0; kiểm tra xem tổng T lớn 1000 chưa: T<=1000 tính n=n+1 tính tổng T= T+n với số tự nhiên n = 1, tiếp tục thực với n tăng dần lần đơn vị tổng T (đầu tiên) > 1000 dừng lại
Thuật tốn toán sau: + Bước T 0; n 0;
+ Bước Kiểm tra điều kiện: Nếu T <= 1000 chuyển tới bước ngược lại (T > 1000) chuyển tới bước
+ Bước Thực n n + 1(tăng n lên đơn vị); T T + n (cộng n vào tổng T) và quay lại bước
+ Bước In kết hình( in giá trị tổng T số n số tự nhiên nhỏ cho T > 1000) Kết thúc thuật tốn.
2) Ví dụ 2: Tìm số n nhỏ để 1/n < 0.005 1/n < 0.003 ? * Hướng dẫn:
- Bài tốn ta khơng biết trước n nhỏ để 1/n < 0.003 hoặc 1/n < 0.005 Vậy giải toán nào?
- Cách thực hiện: biết rằng, n (n>0) lớn 1/n nhỏ, lớn Vậy Ta thực phép tính chia với n sau kiểm tra kết giá trị 1/n có nhỏ 0.005 chưa, chưa ta tăng giá trị n lên đơn vị tiếp tục thực phép tính 1/n ngược lại kết thúc Với giá trị n ban đầu
- Các bước thực sau:
Bước 1: Ban đầu cho n =1; Thuong = 1; { Thuong = 1/n }
Bước 2: Nếu Thuong >= 0.005 Thuong >= 0.003 thực Bước Ngược lại chuyển sang Bước 4;
Bước 3: n = n+1; Thuong = 1/n; quay lại bước 2;
Bước 4: In kết hình: giá trị n nhỏ để 1/n < 0.005 1/n < 0.003 - Sử dụng câu lệnh While để viết chương trình:
uses crt;
var
Thuong: real; n: integer;
begin
clrscr;
Thuong:=1; n:=1;
while (Thuong >= 0.005) or (Thuong >= 0.003) do begin
n:=n+1; Thuong:=1/n;
end;
(3)readln
end
* Chú ý: Với câu lệnh:
while (Thuong >= 0.005) or (Thuong >= 0.003) do begin
n:=n+1; Thuong:=1/n;
end;
Chương trình thực bước thuật toán:
Đầu tiên kiểm tra đk: Thuong >= 0.005 Thuong >= 0.003
Nếu đk thỏa mãn thực câu lệnh ghép (2 lệnh begin end;) sau:
begin
n:=n+1; { tăng n lên đơn vị}
Thuong:=1/n; { Tính 1/n lưu vào biến Thuong}
end;
Ngược lại kết thúc vòng lặp
Như câu lệnh n:=n+1; Thuong:=1/n; thực đk Thuong >= 0.005 Thuong >= 0.003 thỏa mãn
Sau kết thúc vòng lặp (Thuong < 0.005 Thuong < 0.003) ta xác định giá trị n (n tăng lên bao nhiêu)
3) Ví dụ 3: Sử dụng câu lệnh While … để viết chương trình tìm số n ví dụ 1
var T, n: integer; { khai báo biến T n }
begin
T:=0; n:=1; {gán giá trị ban đầu cho biến}
while T<1000 do begin
n:=n+1; T:= T+n;
end;
writeln('So n nho nhat de tong > 1000 la ', n); writeln('Tong dau tien > 1000 la ', T);
Readln
end
* Nếu chạy chương trình ta nhận n = 45 tổng T lớn 1000 1035
* Chú ý: Hãy mô tả cách thực câu lệnh:
(4)n:=n+1; T:= T+n;
end;
4) Ví dụ 4: Viết chương trình tính tổng T = 1+ 1/2 + 1/3 + + 1/100. * Hướng dẫn:
- Với toán ta xác định yêu cầu tính tổng từ 1=1/1 đến 1/100 Nghĩa ta xác định số lần thực phép tính tổng xác định giá trị đầu (1/1) giá trị cuối 1/100 Vậy với tốn ta sử dụng lệnh lặp với số lần biết trước For để viết chương trình
- Ta thấy tất số: 1; 1/2; 1/3; ; 1/100 có tử có mẫu tăng dần lần đơn vị theo thứ tự từ đến 100 Do ta sử dụng biến đếm i cho mẫu số Đoạn lệnh được viết để tính Tổng T sau:
T:=0;
for i:=1 to 100 T:=T+1/i; { giá trị biến i tự động tăng đơn vị sau lần lặp} - Ta để ý vòng lặp for i:=1 to 100 T := T + 1/i; câu lệnh T:=T+1/i thực điều kiện biến i thỏa mãn? Có phải điều kiện i <= 100 khơng? Vậy nên sử dụng lệnh lặp While để viết chương trình giải tốn Đoạn chương trình sau:
T:=0; i:=1;
while i<=100 begin
T:=T+1/i; { Tính tổng 1/i } i:=i+1; { tăng giá trị biến i}
end;
- Từ ví dụ cho thấy sử dụng câu lệnh While thay cho câu lệnh For
- Chú ý: Trong vòng lặp While … phần câu lệnh sau từ khóa ln ln câu lệnh ghép có tác dụng làm cho điều kiện vịng lặp đến lúc khơng cịn thỏa mãn để vịng lặp kết thúc Khi thu kết toán
III BÀI TẬP TỰ LÀM Ở NHÀ
1) Viết cú pháp câu lệnh While cho biết cách thực câu lệnh
2) Sử dụng vòng lặp For While để viết lại chương trình hồn chỉnh cho ví dụ