SKKN Rèn luyện kĩ năng sử dụng cấu trúc lặp trong Pascal để giải một số bài Toán truy hồi cho học sinh lớp 11 - Pdf 26

SÁNG KIẾN KINH NGHIỆM
ĐỀ TÀI:
"RÈN LUYỆN KĨ NĂNG SỬ DỤNG CẤU TRÚC LẶP TRONG
PASCAL ĐỂ GIẢI MỘT SỐ BÀI TOÁN TRUY HỒI CHO HỌC
SINH LỚP 11"
A. ĐẶT VẤN ĐỀ
I. Lời mở đầu :
Sự phát triển mạnh mẽ của công nghệ thông tin đã làm cho xã hội có nhiều nhận
thức mới về cách tổ chức các hoạt động. Nhiều quốc gia trên thế giới ý thức được rất
rõ tầm quan trọng của tin học và có những đầu tư lớn cho lĩnh vực này, đặc biệt trong
giáo dục nhằm nâng cao dân trí về tin học và đào tạo nguồn nhân lực có chất lượng
cao.
Người Việt Nam có nhiều tố chất thích hợp với ngành khoa học này, vì thế chúng ta
hi vọng có thể sớm hoà nhập với khu vực và trên thế giới về tốc độ phát triển nền công
nghệ thông tin. Đảng, Nhà nước ta đã nhận thấy được tầm quan trọng của ngành Tin học
và đã đưa môn học này vào nhà trường phổ thông như những môn khoa học khác bắt đầu
từ năm học 2006-2007. Bộ trưởng Bộ GDĐT cũng đã đưa ra chỉ thị số 55/2008/CT-
BGTĐT ngày 30/9/2008 về tăng cường giảng dạy, đào tạo và ứng dụng công nghệ thông
tin trong ngành giáo dục giai đoạn 2008-2011.
Ngành Giáo dục và Đào tạo đang nỗ lực đổi mới phương pháp dạy học theo
hướng phát huy tính tích cực chủ động của học sinh. Cốt lõi của việc đổi mới phương
pháp dạy học ở trường phổ thông là giúp học sinh hướng tới việc học tập chủ động,
chống lại thói quen học tập thụ động, học sinh có thể tự học, tự rèn luyện thông qua
một số bài tập, dạng bài tập cụ thể.
II. Thực trạng của vấn đề nghiên cứu :
1. Thực trạng :
Tin học là một môn học mới ở các trường phổ thông nên học sinh còn nhiều bỡ
ngỡ khi tiếp cận với môn học này. Trong đó nội dung tin học lớp 11 là một nội dung
tương đối khó với đa số học sinh. Việc học ngôn ngữ lập trình Turbo Pascal là khởi
đầu cho việc tiếp cận ngôn ngữ lập trình bậc cao. Học sinh được làm quen với nhiều
khái niệm, thuật ngữ, cấu trúc dữ liệu qua đó giúp các em hình dung được sự ra đời,

nên sử dụng cấu trúc lặp với số lần biết trước hay chưa biết trước. Xuất
phát từ cơ sở trên, tôi mạnh dạn đề xuất SKKN “Rèn luyện kĩ năng sử dụng cấu trúc
lặp trong Pascal để giải một số bài toán truy hồi cho học sinh lớp 11”.
B. GIẢI QUYẾT VẤN ĐỀ
I. Bài toán truy hồi và cấu trúc lặp :
1. Bài toán truy hồi :
Trong khoa học tính toán ngày nay, phép truy hồi là thuật toán cơ bản để giải một
số bài toán. Ưu điểm của phương pháp truy hồi là ở chỗ nó dùng một công thức nhất
định để diễn tả những phép tính lặp đi lặp lại bất chấp số lần lặp lại là bao nhiêu.
Chẳng hạn với bài toán cấp số cộng là một ví dụ :
Cho
0
1
U
( n 1)
n n
a
U U d

=


= + ∀ ≥

với a là một số cho trước và d là hằng số cố định
(công sai).
- Nếu n là biết trước thì việc xác định số U
n
phải được thực hiện thông qua n bước
lặp theo công thức truy hồi.

* Trong đó:
- for, to, do là các từ khoá.
- <biến đếm> là một biến có kiểu đếm được (nguyên, kí tự, liệt kê, logic…)
- <biểu thức 1>, <biểu thức 2> là các biểu thức có giá trị cùng kiểu với <biến đếm>
- <câu lệnh> là một câu lệnh, có thể là câu lệnh đơn hoặc câu lệnh phức.
* Hoạt động:
Câu lệnh viết sau từ khóa do sẽ được thực hiện tuần tự, với biến đếm lần lượt nhận
các giá trị liên tiếp tăng từ giá trị đầu đến giá trị cuối, nếu giá trị đầu lớn hơn giá trị
cuối thì vòng lặp không được thực hiện.
Ví dụ 1: Với a là số nguyên và a > 2, tính tổng:

1 1 1 1

1 2 100
S
a a a a
= + + + +
+ + +
(SGK Tin học 11 – Trang 42)
Phân tích:
Với bài toán trên dễ thấy ta có công thức truy hồi để tính giá trị S như sau:
0
1
S
a
=
1
1
n n
S S


=
=
)!1n.(n-n!
1!0
Đặt g
n
=n!, theo công thức trên ta có:
0
n n-1
g =1
g =g .n



Như vậy ta có chương trình tính giai thừa như sau:
program Vidu_2;
var n, i, g : integer;
begin
writeln('Chuong trinh tinh n! ');
write('Nhap (n<8): ');
readln(n);
g := 1;
for i := 1 to n do
g := g * i;
writeln('Ket qua: ',n,'! = ',g);
readln;
end.
Ví dụ 3: Dãy số Fibônaxi được định nghĩa như sau:
1 2

for i := 3 to 20 do
begin
f0 := f1 + f2;
writeln('F',i,' = ',f0);
f1 := f2;
f2 := f0;
end;
readln;
end.
2. Sử dụng cấu trúc for downto do
* Cấu trúc:
for <biến đếm>:= <biểu thức 1> downto <biểu thức 2> do <câu lệnh>;
* Trong đó:
- for, downto, do là các từ khoá.
- <biến đếm> là một biến có kiểu đếm được (nguyên, kí tự, liệt kê, logic…)
- <biểu thức 1>, <biểu thức 2> là các biểu thức có giá trị cùng kiểu với <biến đếm>
- <câu lệnh> là một câu lệnh, có thể là câu lệnh đơn hoặc phức.
* Hoạt động:
Câu lệnh viết sau từ khóa do sẽ được thực hiện tuần tự, với biến đếm lần lượt
nhận các giá trị liên tiếp giảm từ giá trị đầu đến giá trị cuối, nếu giá trị đầu nhỏ hơn giá
trị cuối thì vòng lặp không được thực hiện.
Hoạt động của cấu trúc for … downto … do cũng tương tự cấu trúc for …to
… do, chỉ khác là biến đếm là đếm ngược. Trong đa số trường hợp cả hai có tác dụng
như nhau.
Ví dụ 4: Lập trình tính tổng sau:
50
n=1
n
Y =
n+1

begin
clrscr;
Y := 0;
for n := 50 downto 1 do
Y := Y + n/(n+1);
writeln('Tong Y la: ',Y:10:4);
readln;
end.
Tuy nhiên trong một số trường hợp thì chỉ có thể dùng một cấu trúc, đặc biệt là khi
tính các công thức truy hồi. Ta xét một ví dụ dùng for … downto … do thích hợp hơn:
Ví dụ 5:
Tính tổng S =
2 4 2n+ +
với n là một số tự nhiên nhập từ bàn phím.
Phân tích:
n dấu căn
Đặt
i
s 2 2( 1) 2ni i
= + + +
ta có công thức truy hồi sau:
n 1 n
i i 1
s 0 , s 2
s 2 s
n
i
+
+


* Cấu trúc:
While <điều kiện> do <câu lệnh>;
* Trong đó:
- While, do là các từ khoá;
- <điều kiện> là một biểu thức logic;
- <câu lệnh> là một câu lệnh. Có thể là câu lệnh đơn hoặc câu lệnh phức.
* Cấu trúc hoạt động như sau:
- Bước 1: Tính <biểu thức>;
- Bước 2: Nếu kết quả là đúng (true) thì thực hiện <câu lệnh> và quay lại bước
1, ngược lại thì chuyển sang câu lệnh tiếp theo trong chương trình.
Ví dụ 6: Tính tổng
1 1 1
1
3 5 2 1
S
n
= + + + + +
+
đến khi
4
1
10
2n+1

<=
Phân tích: Ta nhận thấy:
Đặt:
1 1 1
1
3 5 2 1

var
s,r : real;
n : integer;
begin
writeln('Chuong trinh tinh tong chuoi S = 1+1/3+1/5+ ');
s := 0; n := 0; r:= 1/(2*n+1);
While r>= 1E-4 do
Begin
s := s + r; n := n + 1; r:= 1/(2*n+1);
end;
writeln('Tong can tinh voi do chinh xac 1E-4 la S = ',s :10:6);
readln;
end.
Ví dụ 7: Tính tổng
2
1 1 1
1
4 9
S
n
= + + + + +
đến khi
6
2
1
10
n

<=
Phân tích: Phương pháp tính của chúng ta như sau:

Toàn bộ chương trình:
program vidu_7;
var s,r : real;
n : integer;
begin
writeln(' Chuong trinh tinh tong chuoi S = 1+1/4+1/9+ ');
s := 0; n := 1; r:= sqr(1/n);
While r>= 1E-6 do
Begin
s := s + r; n := n + 1; r := sqr(1/n);
end;
writeln('Tong can tinh voi do chinh xac 1E-6 la S = ',s :10:6);
readln;
end.
Ví dụ 8: Dân số hiện nay ở một quốc gia khoảng 75 triệu người, tỉ lệ tăng tự nhiên là
1.7%. Hỏi sau bao nhiêu năm nữa thì dân số quốc gia đó đạt xấp xỉ 100 triệu?
Phân tích: đặt S
0
là dân số (tính theo đơn vị triệu) thời điểm hiện tại, S
n
là dân số sau n
năm tính từ thời điểm hiện tại. Ta có:
0
n n-1 n-1
s 75

s s s *0.017
=



End.
4. Sử dụng cấu trúc lặp Repeat … Until…
* Cấu trúc:
Repeat
<câu lệnh>;
until <điều kiện>;
* Trong đó:
- Repeat, until là từ khoá;
- <câu lệnh>; là một hay nhiều câu lệnh cách nhau bởi dấu ;
- <điều kiện> là một biểu thức logic.
* Cấu trúc hoạt động:
- Bước 1: Thực hiện các câu lệnh giữa hai từ khoá Repeat … until
- Bước 2: Tính giá trị <biểu thức> nếu kết quả là đúng (true) thì chuyển sang
câu lệnh tiếp theo, ngược lại thì quay lại bước 1.
Ví dụ 9: Cho số thực a. Tìm số nguyên dương n nhỏ nhất thỏa mãn
1 1 1
1
2 3
a
n
+ + + + >
Phân tích:
Đặt:
n
1 1 1
s 1
2 3 n
= + + + +

n

Until S>a;
Writeln(‘ So nguyen n la:’, n );
Readln;
End.
Ví dụ 10 : Turbo Pascal đã có hàm exp để tính e
x
, tuy nhiên e
x
có thể tính theo công
thức khai triển chuỗi sau:

2 3 n
x
x x x
e =1+x+ + + + +
2! 3! n!
Lập trình nhập số thực x rồi tính e
x
với độ chính xác exp =2 *10
-6
.
Phân tích:
Đặt:
2 3 n
n
x x x
=1+x+ + + + +
2! 3! n!
s


n
x
r
n!
=
ta cũng có thể tính theo công thức truy hồi:
0
n n-1
r =1
x
r =r .
n





với n>=1
Quá trình tính là một quá trình lặp cho đến khi điều kiện dừng xảy ra.
* Ta có thể viết chương trình như sau:
program vidu_10;
var s, r : real;
n ,x : integer;
begin
writeln('Chuong trinh tinh gan dung ham e mu ',x);
s := 1; n := 1; r:= 1;
Repeat
r :=r * x/n; s := s + r; n := n + 1;
until r<=2*(1E-6)
writeln('Tong can tinh voi do chinh xac 1E-6 la S = ',s :10:6);

)1(
!5
x
!3
x
xxsin
n2
n
42
1n2
n
53
+−+−+−=
+
+
−+−+−=
+
Bài tập 4: Một người gửi tiết kiệm không kì hạn với số tiền là A đồng với lãi suất
0.3% mỗi tháng. Hỏi sau bao nhiêu tháng, người đó rút hết tiền thì sẽ nhận được số
tiền ít nhất là B đồng? Biết rằng việc gửi tiết kiệm không kì hạn thì lãi suất không
được cộng vào vốn.
III. Kết quả và kiến nghị đề xuất :
1. Kết quả nghiên cứu :
Trong năm học 2012-2013 tôi đã ứng dụng đề tài nghiên cứu của mình đối với một
số lớp khối 11 ở trường THPT Hậu Lộc 4 và đã tổng hợp số liệu về kết quả đạt được
của học sinh về kĩ năng sử dụng cấu trúc lặp khi giải các bài toán truy hồi như sau:
STT Lớp Sĩ số Đạt yêu cầu Không đạt yêu
cầu
1 11A1 45 85% 15%
2 11A5 46 92% 7%

Trên đây là một số kinh nghiệm của tôi qua nhiều năm liền dạy ở khối lớp 11,
trường THPT Hậu Lộc 4, cũng như tham khảo qua nhiều nguồn thông tin, tư liệu
khác nhau, rất mong được sự đóng góp của các đồng nghiệp nhằm giúp đề tài của tôi
được hoàn thiện thêm.
XÁC NHẬN CỦA THỦ
TRƯỞNG ĐƠN VỊ
Thanh Hóa, ngày 20 tháng 5 năm
2013
Tôi xin cam đoan đây là SKKN của
mình viết, không sao chép nội dung
của người khác.

Người viết SKKN
Nguyễn Thị Hòa
MỤC LỤC
Trang
A. ĐẶT VẤN ĐỀ 1
I. Lời mở đầu 1
II. Thực trạng của vấn đề nghiên cứu 1
1. Thực trạng 1
2. Kết quả của thực trạng trên 2
B. GIẢI QUYẾT VẤN ĐỀ : 3
I. Bài toán truy hồi và cấu trúc lặp 3
1. Bài toán truy hồi 3
2. Cấu trúc lặp trong Pascal 3
II. Sử dụng cấu trúc lặp để giải bài toán truy hồi : 4
1. Sử dụng cấu trúc For … to do 4
2. Sử dụng cấu trúc For downto do 7
3. Sử dụng cấu trúc While … do… 9
4. Sử dụng cấu trúc lặp Repeat … Until… 13


Nhờ tải bản gốc

Tài liệu, ebook tham khảo khác

Music ♫

Copyright: Tài liệu đại học © DMCA.com Protection Status