Bµi
10
Gi¸o ¸n ®iÖn tö tin häc líp 11
(2 tiÕt)
Bµi to¸n 1:
Bµi to¸n 2:
100
1
2
1
1
11
+
++
+
+
+
+=
aaaa
S
1
2
1
1
11
+
+
++
+
+
+
+=
Naaaa
S
C¸c 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
0001.0
1
<
+ Na
Xuất phát
a
S
1
=
1
1
+
+
a
Lần 1
2
1
+
+
a
Lần 2
+
Lần N
Na +
+
1
Mỗi lần thực hiện giá trị tổng S tăng thêm bao nhiêu?
1
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)
a + i
Cùng tìm thuật toán
Bài toán 1: Bài toán 2:
100
1
2
1
1
11
+
++
+
+
+
+=
aaaa
S
1
2
1
1
11
+
+
++
+
+
+
+=
Naaaa
S
Cho đến khi
00010
1
.<
+ Na
Số lần lặp biết tr ớc.
Việc tăng giá trị cho
tổng S đ ợc lặp đi lặp
lại cho đến khi
0.0001
Na
1
<
+
Việc tăng giá trị cho
tổng S đ ợc lặp đi lặp
lại 100 lần.
tìm sự khác biệt
Số lần lặp ch a biết tr ớc.
CÊu tróc lÆp
1. Bài toán đặt vấn đề
- Dữ liệu ra (Output) : Tổng S
Lập ch ơ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 ớc
N
1
4
1
3
1
2
1
1S +++++=
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
1=S
Bắt đầu từ S2 việc tính S đ
ợc lặp đi lặp lại 99 lần theo
quy luật
S
sau
= S
tr ớc
+ 1/i
với i chạy từ 2
100
2
1
+
3
1
+
4
1
+
. . .+ +
1
100
. . . . . . . . . . . . . . . . . . . .
§
S
NhËp N
S:= 1 ; i:= 2
i > N ?
S:= S + 1/i
§ a ra S råi kÕt thóc
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 <biến đếm> := <giá trị đầu> TO <giá trị cuối> 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 <biến đếm> := <giá trị cuối> DOWNTO <giá trị đầu> DO <câu lệnh >;
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 ớ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 ơng trình tính tổng sau:
N
1
4
1
3
1
2
1
1S +++++=
S := 1 ; i := 2;
i >N
KT
S := S +1/ i ;
i := i +1;
2.081.83
1.51
432
L îti
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
SS
S
6>5 ?
In Tæng STæ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
).
100
1
2
1
1
11
+
++
+
+
+
+=
aaaa
S
?
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 ơng 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?
1
2
1
1
11
+
+
++
+
+
+
+=
Naaaa
S
Cho đến khi
1
0.0001
a N
<
+
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 ớc
B ớc 2:
S:=1/a; N:=1;
{Khởi tạo S và N}
B ớc 3:
Nếu 1/(a+N) < 0.0001
=> B ớc 5
B ớc 4:
S:=S+1/(a+N);
N:=N+1;
=> quay lại b ớc 3
thuật toán
B ớc 1: Nhập a.
S:=1/a ; N:=1
Đ a ra S
=> Kết thúc
S:= S+1/(a+N);
N:= N+1;
Vòng lặp chỉ dừng khi 1/(a+N)<0.0001
Nhập a
S
Đ
1/(a+N) >= 0.0001
B ớc 5: In S => Kết thúc.
WHILE
<§iÒu kiÖn>
DO
<C©u lÖnh>
;
§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.
Sa
i
2. LÆp víi sè lÇn lÆp kh«ng biÕt tr íc
Trong ®ã:
Chõng nµo ®iÒu kiÖn cßn ®óng th× c©u lÖnh cßn ® î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ị.
1
2
1
1
11
+
+
++
+
+
+
+=
Naaaa
S
1
0.0001
a N
<
+
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 ¬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 ơ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 MN
nếu M>N thì M:=M-N,
ng ợ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 ớc viết ch ơ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 tr íc
REPEAT
<C©u lÖnh>
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 <câu lệnh>;
FOR TO DO
IF <đk> THEN <câu lệnh 1>
ESLE <câu lệnh 2>;
FOR Downto DO
While <đk> Do <câu lệnh>;
+
Dạng khuyết.
+
Dạng đầy đủ.
+
Lặp với số lần lặp biết tr ớc.
+
Lặp với số lần lặp không biết
tr ớc.