Trong đó một bộ phận của học sinh có niềm say mê công tác lập trình để giải quyết các bài toán thực tiễn thì các em bị rào cản làchương trình tin học được học trên lớp thì chỉ ở mức biết
Trang 1SỞ GIÁO DỤC VÀ ĐÀO TẠO THANH HOÁ
Trang 2MỤC LỤC
Người thực hiện: Lương Trung Dũng 1
Trang 3I MỞ ĐẦU
1 Lí do chọn đề tài.
Trong công tác giảng dạy Tin học ở trường phổ thông việc tiếp cận với lậptrình đối với học sinh là một điều hoàn toàn mới Khác với các bộ môn khác họcsinh được tiếp cận với môn học từ ngay ở cấp tiểu học hay cấp THCS Với tâm
lý lứa tuổi đang trong giai đoạn thịch tìm hiểu, khám phá, việc các em được tiếpcận công nghệ thông tin là một điều hoàn toàn mới mẽ và đầy lý thú đối với các
em Tuy nhiên với thời lượng và phân phối chương trình cho môn tin học lậptrình ở khối 11 chỉ với 1.5 tiết/tuần thì quả là ít ỏi để các em có thể tiếp cận vàtìm hiểu sâu về lập trình được Trong đó một bộ phận của học sinh có niềm say
mê công tác lập trình để giải quyết các bài toán thực tiễn thì các em bị rào cản làchương trình tin học được học trên lớp thì chỉ ở mức biết và hiểu ở mức độ thấptrong khi sự phát triển của xã hội ngày nay đang cần rất nhiều nguồn nhân lựccông nghệ thông tin
2 Mục đích nghiên cứu.
Giúp cho các em học sinh đam mê bộ môn lập trình có thêm kiến thứctrong việc giải quyết các bài toán một các hữu ích hơn, đồng thời giúp các em cóniềm đam mê và yêu thích bộ môn lập trình trong lĩnh vực công nghệ thông tin
Giúp các em học sinh có thêm kiến thức sâu hơn về lập trình, từ đó có thểbồi dưỡng và phát hiện những nhân tố có tố chất và khả năng nhằm tạo nguồnbồi dưỡng học sinh giỏi
3 Đối tượng nghiên cứu.
Với mục tiêu là giúp học sinh có thể lĩnh hội thêm một số phương phápchuyên sâu trong lập trình để có thể tạo hứng thú và sự yêu thích bộ môn lậptrình để giải quyết các bài toán tin học lập trình nâng cao qua ba phương pháp
mở rộng đó là: Phương pháp đệ quy, phương pháp sinh và phương pháp quyhoạch động Sau khi truyền thụ ba phương pháp này các em học sinh khá giỏi cókhả năng phát triển sâu hơn về kỷ thuật lập trình và có thể trang bị hành trangcho cơ sở lập trình cao hơn và phát triển trên các ngôn ngữ lập trình khác nhau
4 Phương pháp nghiên cứu.
Trong đề tài này tôi dựa trên 2 phương pháp chính là phương phápnghiêm cứu xây dựng cơ sở lý thuyết và phương pháp xử lý số liệu Với haiphương pháp này tôi kết hợp với phương pháp thuyết trình trong nghiệp vụ sự
sư phạm nhằm thu hút học sinh và tạo niềm đam mê cho môn học
Trang 4II NỘI DUNG SÁNG KIẾN KINH NGHIỆM
1 Cơ sở lí luận của sáng kiến kinh nghiệm.
Việc mở rộng phát triển tư duy trong thuật toán đối với học sinh để các
em có thể nhìn ra được một cách giải trước một bài toán lớn trong tin học đemlại hiệu quả cho công việc và việc tiếp tục học tập lên cao là hết sức cần thiết.Việc giải quyết bài toán bằng phương pháp thông thường trong tư duy dùngphương thức liệt kê cá trường hợp và khả năng xảy ra của bài toán khi số lượngcấu hình của bài toán nhiều lên thì khoảng thời gian chi phí cho việc liệt kê làquá lớn đối với công sức của con người Đặc biệt là với các bài toán trong tổhợp, bài toán đếm thì con người không thể đủ thời gian để liệt kê ra được việcgiải quyết bài toán bằng các phương pháp thông thường trong sách giáo khoa tinhọc 11 thì các em không thể giải quyết được Do vậy việc mở rộng các phươngpháp để giúp các em có thể biết thêm cách thức tư duy và giải quyết các bài toán
là hết sức cần thiết
Trong thời đại bùng nổ của internet ngày nay các em dễ dàng có thể tìmthấy thấy rất nhiều tài liệu để học tập trong việc lập trình, nhưng việc học tậpcủa em sẽ không có hiệu quả vì các em không biết mình sẽ bắt đầu từ đâu? Khitham gia các diễn đàn lập trình đối với tin học phổ thông thì nghèo nàn chủ yếu
là dừng lại ở việc giải quyết các bài toán cơ bản và đơn giản, chưa chuyên sâu.Với các trường THPT trong tỉnh hiện nay chỉ các trường ở thành phố và lân cậnthì học sinh được tiếp cận công nghệ từ đó các em có thể tìm hiểu trao đổi thôngtin và tìm tòi học hỏi để tìm ra các cách giải quyết bài toán một cách hiệu quả,còn đối với các trường phổ thông còn lại thì việc kích thích trí tìm tòi sáng tạocủa em đối với bộ môn tin học nói chung và bộ môn lập trình nói riêng thì hầunhư đều chưa được đề cập đến Việc tham gia các kỳ thi học sinh giỏi cấp tỉnhthì các bài toán thường có cấu hình lớn và học sinh phải vận dụng được nhiềuphương pháp cao kết hợp với tư duy toán học logic và có khả năng về chiều sâutrong lập trình thì mới có thể giải quyết được
2 Thực trạng vấn đề trước khi áp dụng sáng kiến kinh nghiệm.
Trước khi áp dụng sáng kiến kinh nghiệm vào trong giảng dạy thì tôi thấyrằng Việc học lập trình tin học ở trường phổ thông nói chung các em chỉ họcchủ yếu là đối phó Việc nắm bắt được giải quyết các bài toán và lập trình nhìnchung có thể nói là các em biết lập trình chỉ đếm trên đầu ngón tay, ngoại trừ các
em ở khối chuyên trường chuyên Nếu cứ vẫn giữ phương pháp như đơn điệutruyền thụ nội dung sách giáo khoa cho các em, hết chương trình theo quy địnhcủa bộ thì liệu trong số các em có được bao nhiêu học sinh sẽ đi theo lĩnh vựccông nghệ thông tin, trong khi công nghệ thông tin bây giờ vẫn đang là mộtngành nghề “hot” Các nhà tỉ phú trong lĩnh vực công nghệ thông tin vẫn đangchiếm lĩnh trong các lĩnh vực kinh tế trên thế giới, vậy những chủ nhân tương laicủa đất nước không yêu thích và bắt kịp thì sau này có thể thúc đẩy sự phát triểnđược nên kinh tế của đất nước hay không Và hầu hết câu trả lời ở đây các emđều không nhận thức được điều đó Các em chỉ thích chạy bám theo công nghệ
mà không biết tạo ra công nghệ, hay nói cách khác chỉ có nhu cầu sử dụng màkhông hề có vốn kiến thức để tạo ra nó
Trang 5Quá trình học tập và tìm hiểu lập trình chỉ bám theo nội dung chươngtrình sách giáo khoa đối với một bộ phận học sinh khá giỏi sau khi đã có kiếnthức cơ bản về lập trình thì các em cũng cảm thấy nhàm chán đơn điệu và chỉdừng lại ở việc học tập đối phó, không mở rộng tư duy, điều này dẫn tới việc các
em có tiếp tục đi sâu vào lập trình nữa hay không thì có lẽ các em sẽ không tiếptục nữa, điều này đã minh chứng bởi rất nhiều trường phổ thông có thầy côgiảng dạy tốt về chuyên môn nhưng chỉ áp dụng truyền thụ kiến thức sách giáokhoa cho nên vẫn không thể có nguồn học sinh đam mê lập trình, đến khi thichọn học sinh giỏi thì không có nhân tố và dẫn đến bế tắc
Vấn đề lập trình trước khi áp dụng các em học sinh hầu như chỉ đơn thuầndựa theo các bài tập thực hành sách giáo khoa, một số có tìm tòi ở sách bài tậpnhưng còn rất hạn chế vì bài tập không mang tính hiệu quả, số tiết để giải bài tậpcho các em theo sách bài tập thì không có, do vậy: Các em muốn biết để kiểmchứng thuật toán thì làm thế nào để có thể tạo ra dữ liệu? Có phương pháp nào
để lấy ra kết quả bài toán bằng tư duy theo kiểu toán học hay không? Có cáchnào để giải những bài toán với công thức tổng quát dãy số như truy hồi haykhông? Có phương pháp nào tối ưu để giải bài toán một lớn cho ra kết quả thựchiện một cách nhanh chóng không? Đó là những câu hỏi mà các em học sinh đã
có vốn kiến thức căn bản có thể đặt ra Tuy nhiên còn rất nhiều câu hỏi mà các
em có thể đặt ra nữa nhưng ở đây vẫn nổi lên là 3 vấn đề chính
* Thứ nhất: Tạo nguồn dữ liệu cho bài toán
Việc sau khi lập trình các em chưa biết cách tạo ra dữ liệu để kiểm tra vàkiểm nghiệm bài toán Đôi khi việc kiểm nghiệm bài toán muốn tạo ra dữ liệuđầu vào thì các em mất một khoảng thời gian lớn Việc sinh dữ liệu ngẫu nhiênnhằm tạo ra bộ dữ liệu mẫu một cách nhanh chóng và thuận tiện Có thể vậndụng phương pháp sinh một cách linh hoạt để tạo ra được các bộ dữ liệu kháchnhau phù hợp với yêu cầu bài toán
Hầu hết các bài toán đều đỏi hỏi việc dữ liệu vào ra Người lập trình dùng
ba phương pháp cơ bản sau đây:
1 Nạp dữ liệu trực tiếp từ bàn phím. Phương pháp này được dùng khi dữliệu không nhiều
2 Sinh dữ liệu nhờ hàm Random Phương pháp này nhanh chóng và tiệnlợi Nếu khéo léo tổ chức có thể sinh ngẫu nhiên được các dữ liệu đáp ứng đượcmột số điều kiện định trước
3 Đọc dữ liệu từ tệp văn bản Phương pháp này khá tiện lợi khi phải chuẩn
bị trước những dữ liệu phức tạp
Kết quả thực hiện chương trình thường được thông báo trực tiếp trên mànhình hoặc ghi vào một tệp văn bản
Một số bài toán sinh dữ liệu tiêu biểu.
Bài 1: Sinh ngẫu nhiên theo khoảng
Sinh ngẫu nhiên n phần tử nằm trong khoảng -M M; M>0 cho mảng nguyên a
Bài 2: Sinh ngẫu nhiên tăng
Sinh ngẫu nhiên n phần tử được sắp xếp không giảm cho mảng nguyên a Bài 3: Sinh hoán vị ngẫu nhiên
Trang 6Sinh ngẫu nhiên cho mảng nguyên a một hoán vị của 1 n
Bài 4: Sinh ngẫu nhiên tỉ lệ.
Sinh ngẫu nhiên cho mảng nguyên a có n phần tử tạo thành hai đoạn liên tiếp có tổng các phần tử trong một đoạn gấp k lần tổng các phần tử của đoạn kia.
Bài 5: Sinh ngẫu nhiên đầu: Sinh ngẫu nhiên n phần tử cho mảng nguyên
a thỏa mãn điều kiện n phần tử tạo thành k đoạn liên tiếp có tổng các phần tử trong mỗi đoạn bằng giá trị t cho trước.
Bài 6: Sinh ngẫu nhiên tệp tăng.
Sinh ngẫu nhiên n số tự nhiên được sắp tăng ghi vào tệp văn bản có tên cho trước.
Bài 7: Sinh ngẫu nhiên cấp số cộng.
Sinh ngẫu nhiên cấp số cộng có n số hạng và ghi vào tệp văn bản có tên cho trước.
Bài 8: Sinh số độ cao h
Độ cao của một số tự nhiên là tổng các chữ số của số đó Sinh toàn bộ các số tự nhiên có tối đa ba chữ số và có độ cao h cho trước Ghi kết quả vào một tệp văn bản có tên cho trước.
Đối với phương pháp sinh ta thay vì phải tìm duyệt các đối tượng trong tất
cả các phương án thì ta hãy sinh ra chúng Phương pháp này làm tăng lên tốc độthực hiện cho chương trình, nhiều bài toán ta có thể tìm trực tiếp ra nghiệm củanó
Đối với những bài toán dạng này học sinh phải biết vận dụng tư duy toánhọc một cách linh hoạt trong xử lý thuật toán Ta có thể xét một số bài toán tiêubiểu như sau:
Bài 12: mảng ngẫu nhiên
Sinh ngẫu nhiên n số nguyên không âm cho mảng a.
* Thứ hai: Liết kê các trường hợp ra để tìm phương án
- Phương pháp đệ quy và quay lui:
Về phương pháp đệ quy và quay lui thì đã có rất nhiều tài liệu lập trình đềcập tới, nhưng trong giới hạn chương trình tin học phổ thông thì đệ quy và quaylui chương được đề cập tới mà chỉ dừng lại ở chương trình con hàm và thủ tục
Do vậy học sinh chỉ hiểu chương trình con chỉ dơn thuần là tổ chức giải quyết
Trang 7một công việc nhỏ nào đó qua một số thao tác nhất định và lấy ra một vài kếtquả đơn giản Đối với việc diễn tả thuật toán trong toán học là cơ sở thì côngthức truy hồi thì các em đã được bắt gặp trong các dãy số, do vậy để thể hiện cáccông thức truy hồi như vậy thì trong lập trình có thể thể hiện được các công thứctruy hội đó hay không Mộ số bài toán dạng này.
Bài 13: Lũy thừa
Tính lũy thừa a n với a là số thực, n là số nguyên dương
Bài 14: Tìm n! với n là số tự nhiên
Bài 15: Dãy Fibonaci:
Tìm phần tử thứ n của dãy Fibonaci biết f(n)=f(n-1)+f(n-2) với f(0)=0; f(1) = 1
- Phương pháp quay lui:
Quay lui là một phương pháp mở rộng trong đệ quy Đệ quy quay lui cóthể vét cạn các trường hợp từ đó có thể tìm ra nghiệm của bài toán Đối với bàitoán cần tìm ra nghiệm thì ta có thể sử dụng đệ quy để tìm ra nghiệm một cáchđơn giản Tuy nhiên khi dạy vấn đề đệ quy chúng ta cần chỉ ra cho học sinh thấyđược nhược điểm của phương pháp này là sử dụng phương pháp vét cạn nên tốc
độ chậm, bị hạn chế bởi ngăn xếp và một công việc có thể thực hiện lặp đi lặplại nhiều lần nên có thể tràn bộ nhớ stack
Đối với phương pháp này ta hoàn toàn có thể tìm ra nghiệm cho bài toán
ở một số nghiệm nhỏ Điều này đã có nhiều cuộc thi học sinh giỏi nếu gặp bàitoán khó mà học sinh chưa tìm ra được tất cả các nghiệm của bài toán bằngnhững phương pháp khác các em hoàn toàn có thể sử dụng phương pháp này đểtìm ra một số nghiệm nhỏ với tốc độ trong giới hạn cho phép
Một số bài toán ta có thể kể tới:
Bài 16: dãy nhị phân
Liệt kê các dãy nhị phân có độ dài n cho trước.
Bài 17: Biểu thức Zero
Điền các dấu +, - vào giữa các số tự nhiên từ 1 n sao cho biểu thức có tổng bằng không
Bài 18: Cân vật
Có n quả cân có các khối lượng c 1 , c 2 c n và vật có khối lượng m Hãy tìm các cách để có thể cân được vật nặng m biết vật và cân có thể đặt bên cân trái hoặc cân phải.
* Thứ ba: bài toán giải quyết nhanh chánh vét cạn hay không?
Phương pháp quy hoạch động
Các bài toán dần tìm đến nghiệm tối ưu và cần thời gian thực hiện ra kếtquả mang tính khả thi cao Các bài toán quy hoạch động chiếm một vị trí kháquan trọng trong tổ chức hoạt động sản xuất Chính vì lẽ đó mà việc gây hứngthú cho học sinh trong việc tìm tòi để phát triển khả năng tư duy và tạo ra hứngthú học tập cho học sinh khá giỏi là rất cần thiết Khi học sinh đã có kiến thứccăn bản thì những bài toán thông thường không có gì là khó khăn gây cản trỏcác em dẫn tói học sinh sẽ cảm thấy nhàm chán đối với việc giải quyết các bàitoán, từ đó các em không còn hứng thú đối với việc lập trình nữa
Trang 8Thông thường những em dùng phương pháp quay lui vét cạn cho các bàitoán quy hoạch đổng thì chỉ có thể vét được các tập dữ liệu nhỏ, kích thướcchừng vài chục byte Nếu tìm được đúng hệ thức thể hiện bản chất quy hoạchđộng cảu bài toán và khéo léo tổ chức dữ liệu thì chúng ta xử lý đực những tập
để có thể giải quyết những bài toán khác
* Thứ nhất: Đối với phương pháp sinh:
Xét bài toán 1: Sinh ngẫu nhiên theo khoảng
Đặc tả: Ta viết thủ tục tổng quát Gen(n,d,c) - sinh ngẫu nhiên n số nguyễntrong khoảng từ d đến c (d<c)
Để ý rằng random(c-d+1) biến thiên trong khoảng từ 0 đến c-d, do đó d +random(c-d+1) sẽ biến thiên trong khoảng từ d đến d+c-d=c
Trang 9For i:=1 to n do write(a[i]:4);
2 x là số lẽ nên chữ số hàng đơn vị c phải là số lẻ: c=1,3,5,7,9
3, Chữ số hàng trăm của x phải khác 0: a = 1 9
4 Nếu a,b,c lập thành cấp số cộng thì số đứng giữa b là trung bình cộngcủa hai số đầu và cuối: b=(a+c)/2
Từ (4) suy ra (a+c) là số chẵn Do c là số lẻ nên a cũng là số lẻ
Nếu biết được a và c ta tính được x =100a+10((a+c) div 2) +c
Const chusole[1 5]:array[1 5] of integer =1,3,5,7,9);
Sau đó, mỗi khi cần ta chỉ cần duyệt mảng chỉ số lẽ từ 1 đến 5 là thu đượctoàn bộ các chữ số lẽ theo trật tự đã khai báo trước
Chương trình
Program capcong;
Uses crt;
Const chusole[1 5]:array[1 5] of integer =1,3,5,7,9);
Var s:array[1 25] of integer;
N: integer;
(* -Sinh các số dạng 105a+6c)
-*)
Trang 10Thứ hai: Phương pháp đệ quy:
Trong chương trình tin học phổ thông học sinh chỉ được tìm hiểu về hàm
và thủ tục ở mức độ đơn giản, có thể biết về chương trình con Đề giải quyết bàitoán thông thường thì ta xây dựng hàm và thủ tục Thủ tục là nhằm giải quyếtmột số các thao tác nhất định nào đó mà không trả về kết quả thông qua tên, còn
Trang 11hàm là chương trình con thực hiện một số thao tác nhất định nào đó những kếtquả cuối cùng được trả về thông qua tên, kết quả đó là kế quả đơn, không thể làcấu trúc như mảng.
Vấn đề đặt ra là chương trình con có thể hiện được công thức truy hồi haykhông? Việc vét cạn thông qua chương trình con còn được thể hiện như thế nào?
Ta giải quyết vấn đề này như sau:
- Vấn đề công thức truy hồi:
Ta xét bài toán 14 tính n! bằng đệ quy như sau;
Function giaithua(n:word):longint;
Begin
If n=0 then giaithua:=1 Else giaithua:= n*giaithua(n-1);
Thứ hai là công thức truy hồi ở đây ta dựa vào công thức
End;
Đã có rất nhiều tài liệu phân tích và cho thấy việc sử dụng đệ quy này taphải thực hiện sử dụng ngăn xếp stack để lưu trữ, do đó nó chỉ thực hiện được ởmột giới hạn dữ liệu nhỏ Và cùng một công thức đó ta có thể phải thực hiện tínhtoán lại nhiều lần làm tốn không gian lưu trữ
Ta có thể xét thêm cho học sinh bởi lẽ học sinh đặt ra câu hỏi: có hàm đệquy vậy có thủ đệ quy hay không
Câu trả lời là chúng ta có thể sử dụng thủ tục đệ quy để giải quyết bài toánmột cách linh hoạt và ta có thể vét cạn các trường hợp để tìm ra nghiệm của bàitoán
Trước hết giáo viên phải nêu ra được vấn đề của giải thuật đệ quy quaylui Ta có hai giải thuật quay lui cơ bản là tìm 1 nghiệm
Cơ sở đệ quy quay lui:
Giả sử phải tìm trong một tập dữ liệu D cho trước một dãy dữ liệu
v=(v[1], v[2], ,v[n])
Thỏa mãn đồng thời hai tính chất P và Q Trước hết ta chọn một trong hai tính chất đã cho làm nền, giả sử chọn tính chất P.