“Hình thành kỹ năng cho học sinh vận dụng đúng từng loại cấu trúc lặp
vào bài toán tin 11THPT”
A- MỞ ĐẦU
1. Lí do chọn đề tài
Trong thời đại thông tin bùng nổ như ngày nay, việc lập được các
chương trình tự hoạt động cho máy tính, máy gia dụng là rất cần thiết. Để
làm được việc đó cần có một quá trình nghiên cứu, học tập về ngôn ngữ lập
trình lâu dài, qua đó nhà lập trình có thể chọn một ngôn ngữ lập trình thích
hợp. Tuy nhiên mọi thứ đều có điểm khởi đầu của nó, với học sinh việc
học Pascal là khởi đầu cho việc tiếp cận ngôn ngữ lập trình bậc cao là ngôn
ngữ nền tảng cho việc học các ngôn ngữ bậc cao khác. Vậy làm sao để các
em viết tốt được các chương trình trong pascal? Một trong những yếu tố
quan trọng là các em phải nắm vững cấu trúc các câu lệnh và biết vận dụng
chúng vào bài toán cụ thể, đặc biệt là hai cấu trúc câu lệnh lặp. Xuyên suốt
khi hai cấu trúc này áp dụng vào hầu hết các bài tập ở các chương còn lại.
Là một giáo viên Tin học tôi luôn trăn trở làm thế nào đào tạo ra các thế
hệ học sinh có trình độ nhất định về tin học và sự đam mê Tin học cũng như
biết lập trình, gây mầm cho các em sau này trở thành các nhà lập trình viên
chuyên nghiệp, vậy để làm được điều đó tôi luôn phải đổi mới phương pháp
giảng dạy cho phù hợp với từng bài học, tiết học, từng đối tượng học sinh.
Xuất phát từ thực tiễn dạy học tại trường THPT Thiệu Hoá. Tôi đã dạy
nhiều khoá học, khi học tin 11 các em mới biết thể hiện thuật toán thành chương
trình, biết máy tính thực hiện chương trình như thế nào nên các em rất hướng
thú và muốn khám phá. Nhưng khi tôi dạy đến Bài10 : “Cấu trúc lặp”, học sinh
vẫn thấy nội dung kiến thức mới, rộng, trừu tượng và khó hiểu hơn nhiều so với
các bài học trước. Nên tôi đưa ra khả năng chuyển đổi qua lại 2 câu lệnh lặp vào
giảng dạy thì thấy kết quả tốt hơn hẳn, vận dụng tốt cấu trúc lặp vào bài toán.
Học sinh học hăng hái, tích cực, chủ động sáng tạo
Vì các lí do trên tôi mạnh dạn đưa ra sáng kiến kinh nghiệm “Hình thành kỹ
năng cho học sinh vận dụng đúng từng loại cấu trúc lặp vào bài toán tin hoc
11 THPT” để nêu một cách dạy và học đáp ứng được mục đích nêu trên.
câu lệnh trong ngôn ngữ, như các câu lệnh lặp. Nhưng thực tế học sinh gặp rất
nhiều khó khăn, nhầm lẫn trong việc xác định vòng lặp và xác định điều kiện
dừng của vòng lặp, câu lệnh nào nằm trong vòng lặp. Từ đó nảy sinh cho giáo
viên và học sinh nhu cầu gải quyết vấn đề đó.
II. Triển khai những nội dung chủ yếu của bài học “Cấu trúc lặp”.
1. Lặp
Trong phạm vi tin học, ta có thể hiểu “Lặp” là một số thao tác nào đó phải
làm đi làm lại một số lần.
Cấu trúc lặp mô tả thao tác lặp và được phân biệt hai loại là lặp với số lần biết
trước và lặp với số lần chưa biết trước.
2. Lặp với số lần biết trước và câu lệnh For –do
• Dạng lặp tiến:
FOR <biến đếm>:=<giá trị đầu> TO <giá trị cuối> DO <câu
lệnh>;
• Dạng lặp lùi:
FOR <biến đếm>:=<giá trị cuối> DOWNTO <giá trị đầui> DO
<câu lệnh>;
Trong đó:
- Biến đếm là biến đơn, thường có kiểu nguyên.
- Giá trị đầu, giá trị cuối là các biểu thức cùng kiểu với biến đếm và giá trị
đầu phải nhỏ hơ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 thực hiện.
Hoạt động của for – do:
- Ở dạng lặp tiến, câu lệnh viết sau từ khóa Do đượ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.
3
- Ở dạng lặp lùi, câu lệnh viết sau từ khóa Do đượ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ị cuối đến giá trị
đầu.
dụng làm các bài tập khác.
⇒
Trước thực trạng trên làm cho cả giáo viên và học sinh đều giảm hứng thú
khi dạy và học đến bài này. Vậy nên tôi nghĩ bản thân phải tìm ra giải pháp
cải thiện thực trạng trên nên tôi đã tìm ra giải pháp là SKKN này.
4
II. Quá trình triển khai giải pháp tạo kỹ năng cho học sinh vận
dụng cấu trúc lặp vào bài toán
Để tạo được kỹ năng cho học sinh trước hết phải giúp học sinh nắm được
kiến thức cơ bản về cấu trúc lặp, sau đó nâng cao dần bằng cách chuyển đổi
qua lại hai cấu trúc lặp. Vậy nên tôi trình bầy bài “cấu trúc lặp”, sau đến khả
năng chuyển đổi hai câu trúc lặp như sau:
1. Giúp học sinh hiểu “Cấu trúc lặp” trong Tin học:
• Thao thác lặp:
Giáo viên: đặt vấn đề bằng các ví dụ từ thực tế:
Vd1: Giáo viên trao giấy khen cho các em học sinh giỏi. giáo viên sẽ trao
từng em một cho đến hết số học sinh giỏi.
Vd2: Chương trình tính điểm cho học sinh một lớp (50 hs) sẽ phải thực
hiện các thao tác sau:
- Nhập họ tên (sbd)
- Nhập điểm
Tính tổng điểm hoặc tính trung bình.
GV: chương trình phải thực hiện đi thực hiện lại 3 thao tác trên bao nhiêu
lần?
Hs: Phải lặp lại 50 lần.
Gv: Các thao tác trên gọi là thao tác lặp, Vậy thao tác lặp là như thế nào?
Hs: Là thao thác được làm đi làm lại nhiều lần.
• Cấu trúc lặp:
Gv: để tính điểm cho học sinh chương trình viết đi viết lại các câu lệnh
thực hiện các thao tác trên 50 lần, dẫn đến không thuận tiện, mất thời gian,
a N
<
+
.
Giáo viên: đưa ra các câu hỏi sau:
Câu 1: xác định thao tác lặp cho 2 bài toán trên?
Hs: thao tác lặp là cộng dồn vào S một lượng 1/(a+N). với (n=1,2 )
Câu 2. Em hãy xác định số lần lặp cho 2 bài toán trên?
Hs: Bài 1: lặp 100 lần. (nếu ban đầu s=1/a)
Bài 2: Chưa biết trước số lần lặp.
Vậy cấu trúc lặp: Mô tả thao tác lặp và được phân biệt 2 loại là lặp với
số lần biết trước và lặp với số lần chưa biết trước.
2. Lặp với số lần biết trước và câu lệnh For-Do
Xét bài toán 1: Với a là số nguyên được nhập từ bàn phím và a > 2
Tính và đưa kết quả ra màn hình tổng
1 1 1 1
1 2 100
S
a a a a
= + + + +
+ + +
Gv: gợi ý cho hs viết thuật toán:
Ban đầu s=1/a;
sau đó cộng dồn vào s một lượng 1/(a+N) với (n= 1, 2, ,n).
Cho học sinh lên trình bầy thuật toán (1a-sgk):
Gv: Nếu S1=
aaaa
1
FOR <biến đếm>:=<giá trị đầu> TO <giá trị cuối> DO <câu lệnh>;
• Dạng lặp lùi:
FOR <biến đếm>:=<giá trị cuối> DOWNTO <giá trị đầui> DO <câu lệnh>;
Trong đó:
- Biến đếm là biến đơn, thường có kiểu nguyên.
- Giá trị đầu, giá trị cuối là các biểu thức cùng kiểu với biến đếm và giá trị
đầu phải nhỏ hơ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 thực hiện.
Gv: Từ 2 thuật toán trên em hãy xác định: Biến đếm, giá trị đầu, giá trị cuối, câu
lệnh?
Hs: Biến đếm: N;
Giá trị đầu =1;
Giá trị cuối = 100;
Câu lệnh: s:=s+1/(a+n);
Gv: Từ đó em áp dụng cấu trúc hai câu lệnh For-Do viết câu lệnh cho hai thuật
toán trên?
Hs: Dạng lặp tiến: S:=1.0/a;
For N:=1 To 100 Do S:=S+1.0/(a+N);
Dạng lặp lùi:
S:=1.0/a;
For N:=100 Downto 1 Do S:=S+1.0/(a+N);
Ở dạng tiến N tự động tăng 1 đơn vị, ở dạng lùi N tự động giảm 1 đơn vị.
GV: Em hãy cho biết hoạt động của câu lệnh for –do ở cả 2 dạng trên?
Hs: dễ dàng đưa ra được
Hoạt động của for – do:
- Ở dạng lặp tiến, câu lệnh viết sau từ khóa Do đượ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.
- Ở dạng lặp lùi, câu lệnh viết sau từ khóa Do đượ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ị cuối đến
1 2
S
a a a a N
= + + + + +
+ + +
Cho đến khi
1
0,0001
a N
<
+
.
Tôi đưa ra các câu hỏi sau để đặt học sinh vào tình huống đặt vấn đề:
Gv: Bài toán này có xác định cụ thể số lần lặp không?
Hs: Không xác định được số lần lặp, vì với a nhập từ bàn phím thì 1/
(a+n)<0.0001 không xác định cụ thể N bằng bao nhiêu được.
Gv: Em hãy viết thuật toán cho bài toán trên?
8
Hs: Trình bầy thuật toán:
Gv: Bài toán dừng khi nào?
Hs: Khi thỏa điều kiện 1/(a+n)<0.0001
GV: bài toán này có biểu diễn bằng câu lệnh for-do được không?
Hs: Không vì không biết trước số lần lặp.
Gv: đây là bài toán lặp với số lần lặp chưa biết trước - ta có câu lệnh While-Do
như sau:
Cấu trúc câu lệnh While-Do:
While <điều kiện> Do <câu lệnh> ;
Trong đó:
- Điều kiện là biểu thức logic;
Tổng quát: bài toán while –do các em phải xác định:
- Giá trị đầu cho biến đếm;
- Điều kiện sau while;
- Câu lệnh sau Do;
- Lệnh tăng, giảm biến đếm mấy đơn vị.
Giáo viên cho học sinh hoàn chỉnh chương trình dựa trên hai vòng lặp đã có ở
trên để giải 2 bài toán trên. (sau đó Giáo viên đi kiểm tra rồi chiếu chương trình
đã chuẩn bị lên, sau đó chạy chương trình)
4. Khả năng chuyển đổi qua lại hai dạng cấu trúc lặp for- do và while-
do.
Với các mục trên học sinh đã nắm vững bài cấu trúc lặp: để nâng cao và hình
thành kỹ năng cho các em tôi đưa ra mục 4 này như sau:
Với a là số nguyên được nhập từ bàn phím và a > 2, xét các bài toán sau đây:
Bài 1. Tính và đưa kết quả ra màn hình tổng
1 1 1 1
1 2 100
S
a a a a
= + + + +
+ + +
Bài 2. Tính và đưa kết quả ra màn hình tổng
1 1 1 1
1 2
S
a a a a N
= + + + + +
không được vì:
+ Câu lệnh while…do thực hiện câu lệnh khi điều_kiện còn đúng, nên ta
không xác định được đến vòng lặp thứ bao nhiêu để điều_kiên sai vì thế ta
không thể dùng vòng lặp for…do để thực hiện tính tổng S cho bài 2.
Câu hỏi 3: Vậy những bài toán nào dùng được cả hai cấu trúc lặp for và While?
Học sinh trả lời: Lớp bài toán lặp với số lần lặp biết trước.
Câu hỏi 4: Những bài toán nào chỉ dùng While do?
Hs: lớp bài toán lặp với số lần lặp chưa biết trước.
Mọi bài toán lặp đều dùng được while-do.
a. Hình thành cách chuyển từ câu lệnh For –do sang While –do.
(Mọi bài toán lặp đều chuyển được)
Đầu tiên các em phải nhớ 2 cấu trúc , thành phần cấu tạo nên để xác định chúng:
Xét ví dụ cụ thể: cho câu lệnh for -do sau, hãy chuyển sang While-do:
S:=0;
For i:=1 to 100 do s:=s+i;
Gv: Em hãy xác định biến đếm, giá trị đầu, giá trị cuối, câu lệnh sau do.
Hs: Biến đếm là: i
Giá trị đầu : 1
Giá trị cuối : 100;
11
Câu lệnh sau do: s:=s+i;
=>Vậy trong khi i
∈
[1 100] thì còn lặp, đây cũng là điều kiện trong While.
Nhưng nếu (biến đếm:=1) thì điều kiện trong while sẽ là (biến đếm <=100)
Học sinh: lên chuyển sang dạng While-do:
S:=0; i:=1;
While i<=100 do
Begin
Câu lệnh sau do:
if (i mod 3=0) or (i mod 5=0) then s:=s+i;
Biến đếm là: i
Gán giá trị đầu : i:= N;
Điều kiện : <=M;
Câu lệnh sau do:
Begin
if (i mod 3=0) or (i mod 5=0)
then s:=s+i;
12
i:=i+1;
end;
Từ trên dễ dàng ta được câu lệnh while:
s:=0; i:=N;
While i<=M Do Begin
if (i mod 3=0) or (i mod 5=0) then s:=s+i;
i:=i+1;
end;
Bài2: S:=0; for i:=100 downto -100 do if (i mod 2=0) then s:=s+i;
Hs làm theo hướng dẫn:
For-do While -do
Biến đếm là: i
Giá trị đầu : -100
Giá trị cuối : 100;
Câu lệnh sau do:
if (i mod 2=0) then s:=s+i;
Biến đếm là: i
Gán giá trị đầu : i:= -100;
Điều kiện : <=100;
Câu lệnh sau do:
Bước 2: Từ điều kiện sau while ta xác định được giá trị cuối (biến đếm :=gt
cuối);
Bước 3: Xác định câu lệnh sau do của for chuyển sang while;
Bước 4: (bỏ lệnh tăng giảm biến đếm).
Áp dụng các bước như trên chuyển for sang while cho các bài toán sau:
Bài1: câu lệnh while
s:=0; i:=N;
While i<=M Do Begin
if (i mod 3=0) or (i mod 5=0) then s:=s+i;
i:=i+1;
end;
Hs làm theo 4 bước trên và viết được:
While –do For-do
While –do For-do
Biến đếm là: i
Gán giá trị đầu : i:= 1;
Điều kiện : <=100;
Câu lệnh sau do: begin
s:=s+i;
i:=i+1;
end;
Biến đếm là: i
Giá trị đầu : 1
Giá trị cuối : 100;
Câu lệnh sau do: s:=s+i;
14
Biến đếm là: i
Gán giá trị đầu : i:= N;
Điều kiện : i <=M;
Bước 1: gán giá trị khởi đầu cho biến đếm: c:=1;
Bước 2:điều kiện sau while: c<=24;
Bước 3: câu lệnh sau do gồm những lệnh nào:
g:=36-c;
If 2*g+4*c=100 then write(‘gà=’,g,’chó=’,c);
15
Bước 4: Tăng giá trị biến đếm lên 1: c:=c+1;
Học sinh trình bầy được câu lệnh while như sau:
C:=1;
While C<=24 Do
Begin
g:=36-c;
If 2*g+4*c=100 then write(‘gà=’,g,’chó=’,c);
C:=c+1;
End;
• Chuyển từ câu lệnh while sang For-do
Học sinh: áp dụng các câu hỏi để chuyển đổi sang for-do và viết được:
While –do For-do
Biến đếm là: C
Gán giá trị đầu : C:=C=1;
Điều kiện : C <=24;
Câu lệnh sau do:
Begin
g:=36-c;
If 2*g+4*c=100 then
write(‘gà=’,g,’chó=’,c);
C:=c+1;
end;
Biến đếm là: C
n
n
n
Bài 3: cho dãy số nguyên A={a
1
, ,a
n
}.
Hãy sắp xếp dãy trên thành dãy không giảm
Bài 4: cho dãy số nguyên A={a
1
, ,a
n
}.
Tính và hiển thị tổng các số dương trong dãy.
Bài 5: Lập trình tìm số phi-bô-na-xi thứ n, n nhập từ bàn phím
Bài 6: Kiểm tra dãy n số a1,a2, ,an có tạo thành cấp số cộng không?
Bài 7: Tính tổng các số nguyên tố <100.
Bài 8: đếm xem có bao nhiêu số hoàn hão <1000.
Bài 9: Tính N!
Bài 10: Tính C
k
n
=
)!(!
!
knk
n
−
(n,k nhập từ bàn phím).
n
Bài 3: Nhập từ bàn phím tuổi cha và con (hiện tại tuổi cha lớn hơn 2 lần tuổi con
và tuổi cha hơn tuổi con ít nhất là 25). Bao nhiêu năm nữa tuổi cha gấp đôi tuổi
con?
Bài 4: Lập trình nhập từ bàn phím số nguyên n (0<n<=32 767). Hãy xác định và
đưa ra màn hình số chữ số 0 có nghĩa của n.
17
Bài 5: cho tệp dulieu.dat gồm các số nguyên, tính tổng các số nguyên trong tệp
đưa vào tệp ketqua.out.
Hướng dẫn: Loại bài tập này học sinh chỉ cần trả lời các yếu tố :
- Giá trị đầu cho biến đếm;
- Điều kiện sau while;
- Câu lệnh sau Do;
- Lệnh tăng, giảm biến đếm mấy đơn vị.
Các em làm rất tốt., sau đó các em dễ dàng hoàn thành thành chương trình.:
3. Một số bài tập dùng nhiều vòng lặp trong cùng bài toán:
(ở mức nâng cao dần dàng cho học sinh khá hơn)
Bài 1: cho mảng n phần tử nguyên a1,a2, ,an. Hỏi mảng đã xắp xếp
tăng chưa?
Bài 2: cho tệp dulieu.dat gồm một dòng văn bản, đếm xem tệp có bao
nhiêu kí tự mỗi loại? cho kết quả vào tệp ketqua.out.
Bài 3: tạo hàm Ho(s) với s là xâu hoten, giá trị trả lại là họ của người
đó.
Bài 4: cho 3 số nguyên n,k,p (n<=15, k<=100).
Yêu cầu 1: cho biết có bao nhiêu số nguyên dương có số chữ số
không vượt quá n và có tổng các chữ số =k.
Yêu cầu 2: nếu đem các số trong yêu cầu 1 sắp xếp tăng dần và
đánh số thứ tự từ 1 đến hết thì số thứ p là số nào? (giả thiết p không
lớn hơn số lượng các số tìm được).
Dữ liệu vào: tong.inp gồm 1 dòng chứa n, k, p.
Bảng thống kê điểm số
Tôi áp
dụng từ các
lớp 11 khóa
này và so
sánh với các
khóa 11 trước dạy bình thường, năm nay các em đạt kết quả tốt hơn hẳn và có
hai em tham gia đội tuyển thi học sinh giỏi tỉnh đều đạt giải. Hầu hết các em khi
viết chương trình cũng thấy dễ dàng hơn, nhanh chóng và chính xác.
Quá trình thực nghiệm cho thấy:
- Việc áp dụng giải pháp dạy học trên là khả thi và ứng dụng được vào tất cả các
bài toán lặp, xuyên suốt khi viết chương trình các bài toán tin 11. Khả năng mở
rộng là rất lớn.
- Dạy học theo giải pháp trên giúp học sinh phát triển tư duy, năng lực giải quyết
vấn đề trong học tập cũng như trong cuộc sống.
- Phát huy được tính tích cực của học sinh, giúp học sinh yêu môn tin học hơn,
là động cơ thôi thúc các em trở thành những nhà lập trình viên trong tương lai.
Tỷ lệ
Lớp
Kém Yếu TB Khá Giỏi
Lần 1
11A 0% 2% 46% 40% 12%
11B 2% 15% 57% 24% 2%
Lần 2
11A 0% 0% 45% 41% 14%
11B 1% 14% 59% 24% 2%
20
C - KẾT LUẬN:
SKKN đã thâu tóm, phân tích những kiến thức chủ yếu về “Cấu trúc lặp”
từ đó hình thành kỹ năng vận dụng linh hoạt cấu trúc lặp vào từng bài toán.
NXBGD.
2. Sách bài tập Tin học 11, Hồ Sĩ Đàm, Trần Đỗ Hùng, Ngô Ánh
Tuyết, NXBGD
3. Sách giáo viên Tin học 11, Hồ Sĩ Đàm, Hồ Cẩm Hà, Trần Đỗ
Hùng, Nguyễn Đức Nghĩa, Nguyễn Thanh Tùng, Ngô Ánh Tuyết,
NXBGD.
4. Tài liệu bồi dưỡng giáo viên thực hiện chương trình sách giáo khoa lớp
11, Hồ Sĩ Đàm, Nguyễn Hải Châu, Hồ Cẩm Hà, Trần Đỗ Hùng,
Quách Tất Kiên, NXBGD.
5. Thuật toán, Nguyễn Xuân Huy, NXBTK
22
MỤC LỤC
Trang
A- Mở đầu 1
1. Lí do chọn đề tài 1
2. Mục đích nghiên cứu 2
3. Nhiệm vụ nghiên cứu 2
4. Đối tượng nghiên cứu 2
B - Nội dung
Chương I: Cơ sở lí luận của bài toán với “cấu trúc lặp”.
I. Cơ sở lí luận
II. Triển khai những nội dung chủ yếu của bài học “Cấu trúc lặp”
3
1. Llặp
3
2. Lặp với số lần biết trước và câu lệnh For-Do.
3
3. với số lần chưa biết trước và câu lệnh While-Do .
4
C - Kết luận 20
Tài liệu tham khảo
24