Sử dụng cấu trúc lặp phù hợp trong các bài toán lập trình Tin học

1. Thực trạng của vấn đề

Là giáo viên giảng dạy môn tin học tại trường THPT Trung Nghĩa, tôi nhận thấy nhiều em học sinh luôn cảm thấy khó khăn trong việc học lập trình Pascal. Lập trình Pascal được học trong tin học lớp 11. Trường THPT Trung Nghĩa có 8 lớp 11. Lớp 11A1 và 11A2 (ban khoa học tự nhiên), đa phần các em hiểu và vận dụng làm được các bài tập. Lớp 11A3, 11A4, 11A5, 11A6, 11A7, 11A8 (ban khoa học xã hội) các em cảm thấy học “lập trình” rất khó, việc tìm ra thuật toán hay nhớ cấu trúc và vận dụng các câu lệnh để lập trình đối với các em rất khó khăn.

Trường THPT Trung Nghĩa là một trường thuộc trung du miền núi phía Bắc, nên đại bộ phận dân cư sống chủ yếu bằng nghề nông, điều kiện kinh tế còn khó khăn. Nên rất ít gia đình có máy tính. Ngoài được thực hành trên trường, thì về nhà các em chỉ có thể lập trình trên “giấy”. Chính vì thế các em khó để kiểm tra xem thuật toán của mình đã chính xác chưa? Kết quả đã đúng chưa? Nếu có máy tính thì sẽ giúp các em dễ dàng phát hiện lỗi và sửa câu lệnh hay thuật toán cho đúng yêu cầu của đề bài. Trên internet có rất nhiều tài liệu và có rất nhiều bài tập minh hoạ về cấu trúc lặp, nhưng do nhà chưa có máy tính nên các em chưa có điều kiện để tham khảo thêm.

 

doc19 trang | Chia sẻ: hatranv1 | Lượt xem: 616 | Lượt tải: 0download
Bạn đang xem nội dung tài liệu Sử dụng cấu trúc lặp phù hợp trong các bài toán lập trình Tin học, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
rình Pascal. Lập trình Pascal được học trong chương trình tin học lớp 11. Trường THPT Trung Nghĩa có 8 lớp 11. Lớp 11A1 và 11A2 (ban khoa học tự nhiên), đa phần các em hiểu và vận dụng làm được các bài tập. Lớp 11A3, 11A4, 11A5, 11A6, 11A7, 11A8 (ban khoa học xã hội) các em cảm thấy “lập trình” rất khó, việc tìm ra thuật toán, nhớ cấu trúc và vận dụng các câu lệnh để lập trình đối với các em rất khó khăn.
Lớp 10 các em học những thao tác sử dụng như: cách sử dụng internet, sử dụng hệ điều hành windows, chương trình soạn thảo văn bản microsoft office word Đây là những phần học không cần đòi hỏi tư duy, mà chỉ cần học kĩ và nhớ thao tác, thực hành nhiều lần thì sẽ thành  thạo.
Nhưng khi lên lớp 11 thì hầu như các em cảm thấy môn học khá khó và cách học cũng “mới”. Học những thao tác và thực hành nhiều không còn tác dụng, học thuộc bài cũng không còn ổn nữa. Lúc này các em cần phải học cách tư duy logic, tìm thuật toán, và viết những dòng lệnh máy tính chính xác đến từng đấu chấm, dấu phẩy.
Với tâm lí thông thường các em học sinh coi tin học là môn phụ không quan trọng nên nhiều em chủ quan không dành đủ thời gian để học nên không hiểu bài và dần bị mất căn bản. Đây cũng là lí do mà nhiều em bị điểm yếu, mặc dù có thể các em học rất giỏi các môn học khác.
Ở trường phổ thông chúng ta không chú trọng học chuyên sâu về ngôn ngữ lập trình để tạo ra các phần mềm máy tính mà tập trung rèn luyện kĩ năng tư duy logic, tư duy hệ thống và sáng tạo không chỉ để giải quyết những vấn đề trong tin học mà đây còn là những kĩ năng vô cùng quan trọng để giải quyết nhiều vấn đề trong cuộc sống.
Học Pascal giúp cho ta hiểu được cách làm việc của máy tính, cách giao tiếp để ra lệnh cho máy tính làm việc theo sự điều khiển của con người thông qua ngôn ngữ lập trình. Các em có thể tạo ra các chương trình thú vị bằng cách sử dụng các câu lệnh Pascal. Cũng giống như những môn học khác như toán học, vật lý, hóa học  khi các em đã thực sự hiểu và yêu thích bộ môn tin học các em sẽ tìm thấy nhiều niềm vui, sự đam mê khi tìm hiểu và khám phá những điều mới mẻ nhưng đầy hấp dẫn trong bộ môn tưởng chừng như khô khan này.
	Định lí Bohn Jacopini (Bon Ja-co-pi-ni): Mọi quá trình tính toán đều có thể mô tả và thực hiện dựa trên ba cấu trúc cơ bản là cấu trúc tuần tự, cấu trúc rẽ nhánh và lặp.
Mọi quá trình tính toán gần đúng đều dựa trên các cấu trúc lặp với tham số xác định. Tất cả các công thức toán học gần đúng đều dựa trên nguyên tắc lặp. Nghĩa là quá trình hình thành lời giải sẽ đi qua nhiều bước, số bước càng tăng thì quá trình tính toán càng tiến gần đến lời giải. Sức mạnh của phép lặp thể hiện ở điểm, chỉ cần định nghĩa trạng thái của vấn đề - bài toán tịa một trường hợp tổng quát, dựa theo một số tham số nào đó. Sau đó, chỉ cần biến đổi các tham số này theo một quy luật nhất định thì ta sẽ có được vô số trạng thái mới. Chỉ cần một phép toán cộng và phép lặp, máy tính đã có thể thực hiện mọi phép toán khác, từ nhân, chia cho đến luỹ thừa, rút căn, sin, cos 
Trong một số thuật toán có những thao tác phải thực hiện lặp đi lặp lại một số lần. Một trong các đặc trưng của máy tính là có khả năng thực hiện hiệu quả các thao tác lặp. 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.
Câu lệnh lặp tưởng chừng áp dụng rất đơn giản. Vì chỉ cần phân biệt 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. Nhưng vẫn còn nhiều học sinh chưa hiểu và phân tích được dữ liệu đầu vào (input) của bài toán, chưa tìm ra được thuật toán hoặc áp dụng sai câu lệnh lặp và làm cho chương trình không chạy được. Hoặc chương trình vẫn chạy được nhưng cho kết quả sai.
Nhiều học sinh chưa nắm vững khi nào sử dụng cấu trúc lặp: for - do, while - do, repeat - until. Chưa biết chuyển đổi giữa các cấu trúc lặp. Gặp nhiều bài toán các em vẫn băn khoăn: không biết dùng câu lệnh lặp nào là thích hợp và đúng? Có những bài toán thì có thể dùng được câu lệnh for- do hay có thể dùng while – do thì bài toán vẫn chạy được và kết quả vẫn đúng. Nhưng có những bài toán nếu không xác định đúng nên dùng cấu trúc lặp nào cho đúng, mặc dù chương trình có chạy được nhưng sẽ cho kết quả sai. Hay có một số bài toán phải kết hợp các cấu trúc lặp để giải bài toán.
Chính vì vậy mà tôi đưa ra sáng kiến: “Sử dụng cấu trúc lặp phù hợp trong các bài toán lập trình tin học” để giúp các em hiểu rõ cấu trúc của câu lệnh lặp. Giúp các em biết khi nào dùng cấu trúc for - do, khi nào dùng cấu trúc while - do, khi nào dùng cấu trúc repat - until cho đúng. Từ đó giúp các em yêu thích môn học, tìm ra được những thuật toán tối ưu và thấy câu lệnh lặp thật đơn giản và dễ áp dụng trong các bài toán lập trình.
II. GIẢI QUYẾT VẤN ĐỀ
1. Thực trạng của vấn đề
Là giáo viên giảng dạy môn tin học tại trường THPT Trung Nghĩa, tôi nhận thấy nhiều em học sinh luôn cảm thấy khó khăn trong việc học lập trình Pascal. Lập trình Pascal được học trong tin học lớp 11. Trường THPT Trung Nghĩa có 8 lớp 11. Lớp 11A1 và 11A2 (ban khoa học tự nhiên), đa phần các em hiểu và vận dụng làm được các bài tập. Lớp 11A3, 11A4, 11A5, 11A6, 11A7, 11A8 (ban khoa học xã hội) các em cảm thấy học “lập trình” rất khó, việc tìm ra thuật toán hay nhớ cấu trúc và vận dụng các câu lệnh để lập trình đối với các em rất khó khăn.
Trường THPT Trung Nghĩa là một trường thuộc trung du miền núi phía Bắc, nên đại bộ phận dân cư sống chủ yếu bằng nghề nông, điều kiện kinh tế còn khó khăn. Nên rất ít gia đình có máy tính. Ngoài được thực hành trên trường, thì về nhà các em chỉ có thể lập trình trên “giấy”. Chính vì thế các em khó để kiểm tra xem thuật toán của mình đã chính xác chưa? Kết quả đã đúng chưa? Nếu có máy tính thì sẽ giúp các em dễ dàng phát hiện lỗi và sửa câu lệnh hay thuật toán cho đúng yêu cầu của đề bài. Trên internet có rất nhiều tài liệu và có rất nhiều bài tập minh hoạ về cấu trúc lặp, nhưng do nhà chưa có máy tính nên các em chưa có điều kiện để tham khảo thêm.
Nhiều học sinh chưa nắm vững khi nào sử dụng cấu trúc lặp: for - do, while - do, repeat - until. Chưa biết chuyển đổi giữa các cấu trúc lặp. Gặp nhiều bài toán các em vẫn băn khoăn: không biết dùng câu lệnh lặp nào là thích hợp và đúng? Có những bài toán thì có thể dùng được câu lệnh for - do hay có thể dùng while - do thì bài toán vẫn chạy được và kết quả vẫn đúng. Nhưng có những bài toán nếu không xác định đúng nên dùng cấu trúc lặp nào cho đúng, mặc dù chương trình có chạy được nhưng sẽ cho kết quả sai.
Tôi tiến hành khảo sát cho học sinh khối 11 trường. Khối 11 trường THPT Trung Nghĩa có 8 lớp:
Lớp 11A1 sĩ số: 43 học sinh (Ban khoa học tự nhiên)
Lớp 11A2 sĩ số: 41 học sinh (Ban khoa học tự nhiên)
Lớp 11A3 sĩ số: 42 học sinh (Ban khoa học xã hội)
Lớp 11A4 sĩ số: 38 học sinh (Ban khoa học xã hội)
Lớp 11A5 sĩ số: 35 học sinh (Ban khoa học xã hội)
Lớp 11A6 sĩ số: 36 học sinh (Ban khoa học xã hội)
Lớp 11A7 sĩ số: 36 học sinh (Ban khoa học xã hội)
Lớp 11A8 sĩ số: 37 học sinh (Ban khoa học xã hội)
Tổng số học sinh khối 11 là: 308 học sinh 
Bảng đánh giá về khả năng sử dụng đúng các câu lệnh lặp
Điểm số
Mức độ
Số lượng học sinh
Tỉ lệ %
 Từ 0 đến dưới 5 
Yếu 
50
16,2
Từ 5 đến 6,5
Trung bình
150
48,7
Từ 6,5 đến dưới 8
Khá
85
27,6
Từ 8 đến 10
Giỏi
23
7,5
Sau khi thống kế về số khả năng sử dụng các câu lệnh lặp trong lập trình để nắm được tình hình hiểu biết và áp dụng các câu lệnh lập. Tôi đã tiến hành hai biện pháp:
- Phỏng vấn trực tiếp về cách sử dụng đúng các câu lệnh lặp trong lập trình.
- Điền vào phiếu trả lời trắc nghiệm khách quan về cách sử dụng đúng câu lệnh lặp.
Sau khi tiến hành hai biện pháp trên, kết quả thu được như sau:
* Về phỏng vấn trực tiếp: tôi thu được các câu trả lời chân thật, khách quan từ các em học sinh lớp 11:
+ Em Trần Thị Kim Liên, học sinh lớp 11A1(ban khoa học tự nhiên), trường THPT Trung Nghĩa nói: “Em rất thích học môn tin học 11, về sử dụng các câu lệnh lặp thì em đã áp dụng được vào các bài toán. Em đã chuyển đổi thành thạo giữa cấu trúc lặp: for – do, while –do, repeat –until”.
+ Em Nguyễn Huy Hoàng, học sinh lớp 11A2 (Ban khoa học tự nhiên), trường nói: “Một số bài toán đơn giản em có thể chuyển đổi thành thạo giữa các cấu trúc lặp. Nhưng có một số bài toán khó thì em vẫn còn phân vân không biết nên sử dụng cấu trúc lặp: for-do hay while – do hay repeat thì mới đúng?”
+ Em Vũ Thị Phương Thảo, học sinh lớp 11A5 (ban khoa học xã hội) nói: “Học tin học 11, học về lập trình Pascal cần phải có tư duy tốt về toán. Phải phân tích được dữ liệu đầu vào và dữ liệu đầu ra, từ đó tìm ra được thuật toán. Do em chuyên về ban khoa học xã hội nên việc học về lập trình em thấy rất khó. Những cấu trúc rẽ nhánh hay cấu trúc lặp em vẫn còn chưa áp dụng được vào những bài toán”.
+ Em Nguyễn Văn Tuấn, lớp 11A6 nói: “Bố mẹ em đều là nông dân, kinh tế còn khó khăn nên chưa có điều kiện mua máy tính. Ngoài những giờ thực hành trên trường, còn về nhà thì em lập trình trên giấy. Nên nhiều lúc không biết là có vận dụng đúng câu lệnh lặp vào bài toán hay không?”
* Về phương pháp dùng phiếu trắc nghiệm khách quan để trả lời, sau khi tông hợp 30 phiếu trả lời, tôi thu được kết quả như sau:
Bảng 2. Khảo sát về mức độ sử dụng đúng câu lệnh lặp trong lập trình
Mức độ
Số lượng HS
Tỉ lệ %
Đã hiểu về cấu trúc lặp, biết chuyển đổi giữa các câu lệnh lặp: for – do, while – do, repeat – until.
120
39
Biết vận dụng và sử dụng đúng câu lệnh lặp theo yêu cầu của bài toán.
50
16,2
Chưa hiểu về cấu trúc lặp, chưa biết chuyển đồi giữa các câu lệnh lặp
40
13
Chưa biết vận dụng và sử dụng đúng câu lệnh lặp theo yêu cầu của bài toán.
98
31,8
Thông qua kết quả của hai phương pháp trên, tôi đi đến kết luận:
- Các em học sinh ở lớp 11A1 và 11A2 (ban khoa học tự nhiên) đa phần là đã hiểu biết về cấu trúc trúc lặp, biết chuyển đổi giữa các câu lệnh lặp: for – do, while – do, repeat – until. Biết vận dụng và sử dụng đúng câu lệnh lặp theo yêu cầu của bài toán.
- Các em học sinh ở lớp 11A3, 11A4,11A5, 11A6, 11A7, 11A8 (ban khoa học xã hội) gần như vẫn còn nhiều khó khăn, các em chưa hiểu biết về cấu trúc trúc lặp, chưa biết chuyển đổi giữa các câu lệnh lặp: for – do, while – do, repeat – until. Chưa biết vận dụng và sử dụng đúng câu lệnh lặp theo yêu cầu của bài toán.
Qua bảng trên đại đa phần học sinh chưa nắm vững khi nào sử dụng cấu trúc lặp: for - do, while - do, repeat - until. Chưa biết chuyển đổi giữa các cấu trúc lặp. Gặp nhiều bài toán các em vẫn băn khoăn: không biết dùng câu lệnh lặp nào là thích hợp và đúng? Có những bài toán thì có thể dùng được câu lệnh for- do hay có thể dùng while – do thì bài toán vẫn chạy được và kết quả vẫn đúng. Nhưng có những bài toán nếu không xác định đúng nên dùng cấu trúc lặp nào cho đúng, mặc dù chương trình có chạy được nhưng sẽ cho kết quả sai. Hay có một số bài toán phải kết hợp các cấu trúc lặp để giải bài toán. Xuất phát từ đó nên tôi đã viết sáng kiến kinh nghiệm này để giúp các em có thể hiểu rõ các vấn đề nêu trên và áp dụng đúng vào các bài toán.
2. Các biện pháp để giải quyết vấn đề
Đề giải quyết một số khó khăn nêu trên. Sau đây là một số giải pháp tôi đưa ra như sau:
2.1. Nắm vững cấu trúc lặp
“ Đánh răng mỗi ngày hai lần, học môn tin học mỗi tuần 2 tiết, mỗi ngày tắm một lần...Học cho đến khi thuộc bài, rửa tách trà cho đến khi sạch...”
Trong cuộc sống, những hành động trên được gọi là lặp đi lặp lặp lại nhiều. Trong Pascal, cách mô tả công việc (hoạt động) được lặp lại nhiều lần gọi là cấu trúc lặp. Có 3 loại cấu trúc vòng lặp như sau: vòng lặp for..do, while..do, repeat..until. Lặp với số lần biết trước (câu lệnh for..do), lặp với số lần chưa biết trước (while..do và repeatuntil).
a) 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 := to do ;
* Dạng lặp lùi
for := downto do 
b) Lặp với số lần chưa biết trước (câu lệnh while - do và repeat –until)
* Câu lệnh while – do có dạng: 
 while do ;
Trong đó
+ Điều kiện là biểu thức logic
+ Câu lệnh là một câu lệnh đơn hoặc ghép
- Câu lệnh sẽ được lặp lại nhiều lần cho đến khi nào điều kiện còn đúng (nếu điều kiện sai thì các lệnh này sẽ không thực hiện nữa). Đối với lệnh này điều kiện sẽ được kiểm tra trước khi thực hiện lệnh nên nên điều kiện sai thì không có lệnh nào được thực hiện.
* Cấu lệnh repeat..until 
Câu lệnh này dùng để tổ chức lặp với số lần lặp không biết trước. Khác với câu lên while –do, điều kiện kết thúc lặp trong câu lệnh repeat – until được kiểm tra sau và có dạng: 
repeat
;
until ;
Trong đó điều kiện là biểu thức quan hệ hoặc lôgic.
- Câu lệnh giữa repeat và until sẽ được lặp lại nhiều lần khi nào điều kiện sai, nếu điều kiện đúng thì ngưng (ngược với vòng lặp while). Đối với lệnh này điều kiện sẽ được kiểm tra sau khi thực hiện các lệnh giữa repeat và until nên ít nhất các lệnh sẽ được thực hiện trước 1 lần rồi mới kiểm tra điều kiện đúng hay sai (nếu sai thì thực hiện tiếp vòng lặp, đúng thì ngưng).
2.2. Với một số bài toán, phải biết chuyển đổi thành thạo giữa cấu trúc lặp for - do, while - do, repeat - until.
Bài toán: Viết chương trình tính tổng S = 1 +2 ++N
Với bài toán này các em có thể dùng cấu trúc lặp for – do hay while – do hay repeat – until đều được. Đều cho ra cùng một kết quả đúng.
* Cách 1: Dùng vòng lặp for - do
* Cách 2: Dùng vòng lặp while – do
* Cách 3: Dùng vòng lặp repeat - until
Với bài toán này, các em có thể áp dùng cấu trúc lặp nào cũng được, vẫn cho ra một kết quả duy nhất. Ví dụ: nhập n = 100, kết quả tổng S = 5050.
2.3. Vận dụng đúng câu lệnh lặp trong các bài toán
Mỗi thuật toán chỉ giải một bài toán nào đó, nhưng có thể có nhiều thuật toán khác nhau cùng giải một bài toán. Việc xác định thuật toán và sử dụng đúng câu lệnh sẽ cho kết quả đúng. Ngoài thuộc cấu trúc của câu lệnh lặp, đã biết chuyển đổi từ câu lệnh for – do sang while – do hay sang repeat – until, thì các em phải biết vận dụng đúng câu lệnh lặp trong bài toán. Có những bài toán khi bạn sử dụng câu lệnh lặp while – do thì cho kết quả đúng, còn khi bạn sử dụng câu lệnh lặp for – do thì chương trình vẫn chạy nhưng cho kết quả không đúng. Hay có một số bài nên dùng repeat – until thì mới cho kết quả đúng. Hay một số bài toán áp dụng cả 3 cấu trúc lặp. Sau đây tôi xin giới thiệu một bài toán tiêu biểu để các em hiểu thêm về cấu trúc lặp và phải biết vận dụng hay sử dụng đúng câu lệnh lặp for – do hay while – do hay repeat – until thì bài toán mới cho kết quả đúng. Các em cùng tham khảo các bài toán sau:
Bài toán 1: Viết chương trình nhập vào các số nguyên cho đến khi gặp số thì kết thúc. Hãy đếm xem có bao nhiêu số chẵn vừa được nhập vào.
Ý tưởng: Bài toán này không biết chính xác số lần lặp nên các em không thể dùng vòng lặp for..do. Vì phải nhập vào số nguyên N trước, sau đó mới kiểm tra xem N = 0?. Do đó với bài toán này các em nên dùng vòng lặp repeat..until.
Giải bài toán bằng câu lệnh repeat..until
Bài toán 2: Chữ số không (Kỳ thi chọn đội tuyển dự thi học sinh giỏi quốc gia lớp 12 THPT năm học 2015 – 2016, Sở giáo dục và đào tạo Phú Thọ)
Hôm nay, sau khi học xong tiết học về giai thừa của một số, Thắng rất thích thú. Vốn là một cậu bé thích các con số không, Thắng quyết tâm sẽ tìm hiểu về giai thừa để khoe các bạn. Cụ thể là: nếu cho một số nguyên n (n >= 0) thì trong kết quả n! sẽ có bao nhiêu chữ số không liên tiếp tính từ phải qua trái bắt đầu từ hàng đơn vị. Ví dụ:
Với n = 8 thì 8! = 1.2.3.4.5.6.7.8= 40320 có 1 chữ số không liên tiếp tính từ phải qua trái bắt đầu từ hàng đơn vị.
Với n = 10 thì 10! = 1.2.3.4.5.6.7.8.9.10 = 3628800 có 2 chữ số không liên tiếp tính từ phải qua trái bắt đầu từ hàng đơn vị.
Yêu cầu: Với số n cho trước hãy tính số chữ số không liên tiếp tính từ phải qua trái bắt đầu từ hàng đơn vị của n!
Dữ liệu: Vào từ file văn bản CAU1.INP gồm 1 dòng chứa số nguyên dương n.
Kết quả: Đưa ra file văn bản CAU1.OUT gồm 1 dòng chứa số không liên tiếp tính từ phải qua trái bắt đầu từ hàng đơn vị của n!
Ví dụ: 
CAU1.INP
8
CAU1.OUT
1
Nhiều học sinh sau khi đọc đề, phân tích dữ liệu đầu vào và dữ liệu đầu ra. Sau đó các em lên ý tưởng tìm thuật toán. 
Qua quá trình giảng dạy tôi nhận thấy: 
+ Với bài toán có rất nhiều thuật toán để giải. Có một số em sau khi phân tích bài toán: các em đã biết sử dụng lệnh lặp while - do. Và kết quả là đúng với bộ test của đề đã cho.
Giải bài toán bằng câu lệnh lặp: while – do
+ Với bài toán : có một số em sau khi phân tích bài toán và dùng câu lệnh lặp for – do thì chương trình vẫn chạy, nhưng cho kết quả không đúng yêu cầu của bài toán. 
Giải bài toán bằng cau lệnh lặp: for – do
3. Hiệu quả của sáng kiến kinh nghiệm
Sau khi sáng kiến được thực hiện và triển khai tại trường THPT Trung Nghĩa, học sinh rất vui và hợp tác thực hiện. Các em đã hiểu về cấu trúc lặp, biết chuyển đổi giữa các cấu trúc lặp và biết vận dụng đúng câu lệnh lặp while – do hay for – do hay repeat – until hay kết hợp các câu lệnh lặp vào từng bài toán cụ thể.
* Bài toán: Viết chương trình tính tổng S = 1 +2 ++N
Với bài toán này các em có thể dùng cấu trúc lặp for – do hay while – do hay repeat – until đều được. Đều cho ra cùng một kết quả đúng.
Khi nhập N =100, tổng S = 5050.
* Bài toán: Viết chương trình nhập vào các số nguyên cho đến khi gặp số thì kết thúc. Hãy đếm xem có bao nhiêu số chẵn vừa được nhập vào.
 Với bài toán này không biết chính xác số lần lặp nên các em không thể dùng vòng lặp for..do. Vì phải nhập vào số nguyên N trước, sau đó mới kiểm tra xem N = 0?. Do đó với bài toán này các em nên dùng vòng lặp repeat..until.
* Bài toán: Chữ số không (Kỳ thi chọn đội tuyển dự thi học sinh giỏi quốc gia lớp 12 THPT năm học 2015 – 2016, Sở giáo dục và đào tạo Phú Thọ). 
Yêu cầu: Với số n cho trước hãy tính số chữ số không liên tiếp tính từ phải qua trái bắt đầu từ hàng đơn vị của n!
* Đây là kết quả bài tính giai thừa khi tính bằng lệnh while – do. Với N = 8 thì kết quả số chữ số 0 tận cùng của 8! là 1. Và đúng với yêu cầu và bộ test của bài toán.
* Đây là kết quả bài tính giai thừa khi tính bằng lệnh for – do. Với N = 8 thì kết quả số chữ số 0 tận cùng của 8! là 2. Chương trình vẫn chạy và vẫn cho kết quả. Nhưng kết quả không đúng với yêu cầu và bộ test của bài toán.
Chính vì vậy trong một bài toán ngoài phân tích kỹ dữ liệu đầu vào (input) và dữ liệu đầu ra (output) thì việc tìm ra thuật toán tối ưu hay vận dụng đúng các cấu trúc lệnh như rẽ nhánh hay cấu trúc lặp là điều rất quan trọng. 
Qua ví dụ trên, sau khi chương trình chạy và xem kết quả đã giúp các em phân tích và hiểu rõ cấu trúc của câu lệnh lặp. Giúp các em biết khi nào dùng cấu trúc for – do, khi nào dùng cấu trúc while – do, khi nào dùng cấu trúc repat – until cho đúng hay phải kết hợp cả 3 cấu trúc lặp. Từ đó giúp các em yêu thích môn học, tìm ra được những thuật toán tối ưu và thấy câu lệnh lặp thật đơn giản và dễ áp dụng trong các bài toán lập trình.
Tôi tiến hành thực nghiệm sáng kiến cho học sinh khối 11 trường THPT Trung Nghĩa. Tôi chọn lớp 11A3 (lớp đối chứng) và lớp 11A4 (lớp thực nghiệm). Mỗi lớp em chọn 10 bạn học sinh. Sau đó tôi cho các em tiến hành thực hiện đề tài ở lớp thực nghiệm. Tôi phân loại kết quả theo mức đánh giá như sau:
Mức điểm
Mức độ
1 – 3 điểm
Chưa biết vận dụng
4 – 6 điểm
Đã hiểu về cấu trúc lặp
7 – 9 điểm
Đã biết chuyển đổi cấu trúc lặp trong cùng một bài toán.
10 điểm
Đã biết chuyển đổi cấu trúc lặp trong cùng một bài toán. Biết vận dụng đúng cấu trúc lặp.
Kết quả tôi thu được sau khi cho 10 em học sinh lớp thực nghiệm (lớp 11A3) tiến hành theo các bước so với 10 em ở lớp đối chứng (lớp 11A4) không tiến hành các bước trên như sau:
Điểm
Lớp đối chứng
(lớp 11A4)
Lớp thực nghiệm (lớp 11A3)
 1 -3 điểm
5
2
 4 - 6 điểm
3
2
 7 - 9 điểm
2
4
 10 điểm
0
2
So sánh kết quả hai lớp:
Sau khi sáng kiến được thực hiện và triển khai tại trường THPT Trung Nghĩa, học sinh rất vui và hợp tác thực hiện. Kết quả nhiều học sinh đã hiểu rõ về cấu trúc lặp, biết vận dụng đúng câu lệnh lặp vào từng bài toán. Các em rất vui vẻ và tự tin hơn trong học tập, hăng hái phát biểu và xây dựng bài. 
III. KẾT LUẬN
1. Kết luận
Sáng kiến giúp các em hiể

File đính kèm:

  • docsu_dung_cau_truc_lap_phu_hop_trong_cac_bai_toan_lap_trinh_ti.doc
Giáo án liên quan