Bài 10
Cấu trúc lặp
(2 tiết)
Bài toán 1:
Bài toán 2:
Bài toán đặt vấn đề : Tính tổng S, với a là số nguyên và a>2
cho đến khi
Xuất phát
Lần 1
Lần 2

+.
Lần N

Mỗi lần thực hiện giá trị tổng S tăng thêm bao nhiêu?
Sau mỗi lần thực hiện giá trị tổng S tăng thêm ( với i =1; 2; 3 ; ...;N)
Cùng tìm thuật toán
Bài toán 1:
Bài toán 2:
Cho đến khi
? Số lần lặp biết trưuớc.
Việc tăng giá trị cho tổng S đưuợc lặp đi lặp lại cho đến khi
Việc tăng giá trị cho tổng S đưuợc lặp đi lặp lại 100 lần.
Tìm sự khác biệt
? Số lần lặp chưua biết trưuớc.
Cấu trúc lặp
I. Lặp với số lần lặp biết trưuớc
II. Lặp với số lần lặp không biết trưuớc
1. Bài toán đặt vấn đề:
- Dữ liệu ra (Output) : Tổng S
Lập chưuơng trình tính tổng sau:

- Dữ liệu vào (Input) : Nhập N
Hãy x¸c ®Þnh INPUT vµ OUTPUT cña bµi to¸n trªn!
I. Lặp với số lần lặp biết trưuớc
Phân tích bài toán với N = 100

Nhận xét:
S1 = 1
S2 = S1 + 1/2
S3 = S2 + 1/3
S4 = S3 + 1/4


.....
S100 = S99 + 1/100
Bắt đầu từ S2 việc tính S đưuợc lặp đi lặp lại 99 lần theo quy luật
Ssau = Strưuớc+ 1/i
với i chạy từ 2 ? 100
. . . . . . . . . . . . . . . . . . . .
Đ
S
B1: Nhập N;
B2: S:=1; i:=2;
B3: Nếu i > N thì đưa ra giá trị S => Kết thúc;
B4 : S:= S + 1/i;
B5: i := i +1 quay lại B3.
Xây dựng thuật toán
i:= i+1
FOR := TO DO < câu lệnh>;
Ví dụ: S:=1;
FOR i:=2 TO 100 DO S:=S+1/i;
b. Dạng 2 (dạng lùi)
FOR := DOWNTO DO ;
Ví dụ: S:=1;
FOR i:=100 DOWNTO 2 DO S:=S+1/i;
a. Dạng 1 (dạng tiến)
2. Lặp với số lần lặp biết trưuớc
? Giá trị đầu, giá trị cuối là các biểu thức cùng kiểu với biến đếm, giá trị đầu phải nhỏ hơn giá trị cuối.
For i:= 100 to 200 do write(i);

? Giá trị biến đếm được điều chỉnh tự động, vì vậy câu lệnh sau DO không được thay đổi giá trị biến đếm.
Trong đó
? Biến đếm là biến kiểu số nguyên hoặc kí tự.
For i:=1 to 10 do write(i);
For i:=`a` to `z` do write(i);

Uses crt;
Var i,N : Integer; S : real;
BEGIN
Readln;
END.
S:=1;
FOR i:=2 to N do S := S+1/i;
Writeln(` Tong S =`,S:8:3);
Write(` Nhap vao gia tri cua N :`);readln(N);
Program Tinh_tong;
Hãy ¸p dông c©u lÖnh lÆp d¹ng tiÕn ®Ó viÕt chương tr×nh gi¶i bµi to¸n ®Æt vÊn ®Ò.
Lập chưuơng trình tính tổng sau:

S := 1 ; i := 2;
i >N
KT
S := S +1/ i ;
i := i +1;
2.08
1.83
1.5
1
4
3
2
Lượt
i
S
2.28
5
Nhập N
S := 1 ; i := 2;
2>5 ?
S
S
S := 1 +1/2 ;
i := 2 +1;
3>5 ?
S := 1.5+1/3 ;
i := 3 +1;
4>5 ?
S := 1.83+1/4 ;
i := 4 +1;
5>5 ?
S := 2.08+1/5;
i := 5 +1;
6
S
S
S
6>5 ?
In Tổng S
Tổng S=2.28
Với N = 5
2.28
Đ
Đ
Mô phỏng thuật toán

3. Ví dụ
Tính tổng S (với a là số nguyên nhập vào từ bàn phím và a>2).
?
Hóy xác định giá trị khởi đầu của S, quy luật thay đổi giá trị của S và số lần lặp.
Viết chưuong trình để giải bài toán trên.
S:=1/a;
- S:= S + 1/(a+i);
- i chạy từ 1 đến 100 => Số lần lặp là 100 lần.
1. Bài toán
Dữ liệu ra (Output) : Tổng S
Dữ liệu vào (Input) : Nhập a
Hãy x¸c ®Þnh INPUT, OUTPUT vµ nªu thuËt to¸n gi¶i bµi to¸n trªn?
Cho đến khi
Tính giá trị tổng S, với a là số nguyên và a>2.
thì dừng lại.
II. Lặp với số lần lặp không biết trưuớc
Bưuớc 2:
S:=1/a; N:=1;
{Khởi tạo S và N}
Bưuớc 3:
Nếu 1/(a+N) < 0.0001
=> Bước 5
Bưuớc 4:
S:=S+1/(a+N);
N:=N+1;
=> quay lại bước 3
Thuật toán
Bưuớc 1: Nhập a.
Đuưa ra S
=> Kết thúc
? Vòng lặp chỉ dừng khi 1/(a+N)<0.0001
S
Đ
Bưuớc 5: In S => Kết thúc.
WHILE <Điều kiện> DO ;
Điều kiện
Đúng
Câu lệnh
Điều kiện: Là biểu thức
quan hệ hoặc lôgic.

Câu lệnh: Là một câu lệnh của Pascal.
Sai
2. Lặp với số lần lặp không biết truước
Trong đó:
Chừng nào điều kiện còn đúng thì câu lệnh còn đuược thực hiện.
WHILE 1/(a+N) >= 0.0001 DO
Begin
S:=S+1/(a+N);
N:=N+1;
END;
3. Một số ví dụ
a
Bài toán đặt vấn đề:
Nhận xét:
Chừng nào 1/(a+N)>=0.0001 thì còn thực hiện:
+ Tăng giá trị của tổng S thêm 1/(a+N).
+ Tăng N thêm 1 đơn vị.
Tính giá trị tổng S, với a là số nguyên và a>2
thì dừng lại.
Cho đến khi
Chưuơng trình
Program Bai_toan;
Uses Crt;
Var a,N:Integer;
S:Real;
BEGIN
Clrscr;
Write(`Nhap gia tri cua a= `);Readln(a);
S:=1/a;N:=1;
WHILE 1/(a+N)>=0.0001 DO
BEGIN
S:=S+1/(a+N);
N:=N+1;
END;
Writeln(`Gia tri cua tong S = `,S:8:3);
Readln;
END.
b
Lập chưuơng trình nhập vào hai số nguyên dương M,N. Tìm ƯCLN của hai số đó.
B1: Nhập M,N;
B2 : Chừng nào M?N
nếu M>N thì M:=M-N,
ngưuợc lại thì N:=N-M;
B3: Đến khi M=N thì
=> Đưa ra ƯCLN(M,N)=M;
=> Kết thúc.
B1: Nhập M,N
B2 : While M<>N DO
Begin
IF M>N then M:=M-N
else N:=N-M; end;
B3: In ƯCLN(M,N)
Thuật toán
các bưuớc viết chưuơng trình
Tham khảo:

Dạng khác của câu lệnh lặp với số lần lặp không biết truước
REPEAT UNTIL <Điều kiện>;
Điều kiện
Sai

Câu lệnh
Đúng
Bài toán đặt vấn đề:
Program Bai_toan;
Uses Crt;
Var a,N:Integer;
S:Real;
BEGIN
Clrscr;
Write(`Nhap gia tri cua a= `);Readln(a);
S:=1/a;N:=1;
REPEAT {Bat dau lap}
S:=S+1/(a+N);
N:=N+1
UNTIL 1/(a+N)< 0.0001; {Ket thuc lap}
Writeln(`Gia tri cua tong S = `,S:8:3);
Readln;
END.
Hãy nhí!
Câu lệnh rẽ nhánh.
Câu lệnh lặp
IF <đk> THEN ;
trong pascal
FOR ... TO ... DO ....
IF <đk> THEN
ESLE ;
FOR ... Downto ... DO ...
While <đk> Do ;
Dạng khuyết.
Dạng đầy đủ.
Lặp với số lần lặp biết
trưu?c.
Lặp với số lần lặp không biết trưuớc.
nguon VI OLET