Để đảm bảo được điều đó, nhất định phải thực hiện thành công việc chuyển từ phương pháp dạy học theo lối “truyền thụ một chiều” sang dạy các học, cách vận dụng kiến thức, rèn luyện kĩ nă
Trang 2A PHẦN MỞ ĐẦU
I Lý do chọn đề tài
Giáo dục phổ thông nước ta đang thực hiện bước chuyển từ chương trình giáo dục tiếp cận nội dung sang tiếp cận năng lực của người học, nghĩa là từ chỗ quan tâm đến việc học sinh học được cái gì đến chỗ quan tâm học sinh vận dụng được cái gì qua việc học Để đảm bảo được điều đó, nhất định phải thực hiện thành công việc chuyển từ phương pháp dạy học theo lối “truyền thụ một chiều” sang dạy các học, cách vận dụng kiến thức, rèn luyện kĩ năng, hình thành năng lực và phẩm chất; đồng thời phải chuyển cách đánh giá kết quả giáo dục từ nặng kiểm tra trí nhớ sang kiểm tra, đánh giá năng lực vận dụng kiến thức giải quyết vấn đề, coi trọng cả kiểm tra, đánh giá kết quả học tập với kiểm tra, đánh giá trong quá trình học tập để có thể tác động kịp thời nhằm nâng cao chất lượng của các hoạt động dạy học và giáo dục
Trong quá trình bồi dưỡng học sinh giỏi, chủ đề chương trình con là một trong những vấn đề chiếm vai trò quan trọng Bởi vì, sử dụng chương trình con
để hợp lý hóa, tiết kiệm công sức lập trình Đồng thời, chương trình con có thể giúp cho người lập trình dễ sửa chữa, dễ kiểm tra Vì thế trong tất cả các bộ đề thi học sinh giỏi khối THCS đều sử dụng chương trình con để giải quyết các bài toán Vấn đề đặt ra là: gợi động cơ hoạt động cho học sinh khi giảng dạy về chương trình con như thế nào? Đó chính là vấn đề mà bản thân tôi hết sức quan tâm
Chính vì vậy, tôi mạnh dạn đưa ra kinh nghiệm “Giúp học sinh hình thành
kỹ năng xây dựng chương trình con trong ôn luyện Học sinh giỏi Tin học THCS” cụ thể của bản thân đã thực hiện khi giảng dạy Bồi dưỡng Học sinh giỏi
tại trường Phổ thông Dân tộc Nội trú Hướng Hoá để đồng nghiệp tham khảo
Trang 3II Mục đích của đề tài
Tạo động cơ cho học sinh ý thức về ý nghĩa của các hoạt động khi sử dụng chương trình con trong công việc lập trình Từ đó, học sinh có thể liên hệ , vận dụng sáng tạo vào giải quyết các bài toán lập trình và các tình huống thực tế
III Phương pháp nghiên cứu
Phương pháp nghiên cứu dựa trên lí thuyết và thực tiễn quá trình bồi dưỡng học sinh giỏi tại trường Phổ thông Dân tộc Nội trú Hướng Hoá để đưa ra kết luận phù hợp
IV Phạm vi và đối tượng nghiên cứu
1 Phạm vi nghiên cứu
- Nghiên cứu lí luận: Phân tích - tổng hợp- khái quát
- Nghiên cứu thực tiễn: đề tài tập trung nghiên cứu trong phạm vi các học sinh được bồi dưỡng để chuẩn bị cho kì thi Học sinh giỏi cấp trường, cấp Tỉnh trong các năm học 2013-2014, 2014-2015, 2015-2016
2 Đối tượng nghiên cứu
Đối tượng nghiên cứu là kỹ năng xây dựng chương trình con của học sinh khi bồi dưỡng Học sinh giỏi
V Thời gian thực hiện đề tài
Các năm học 2013 – 2014, 2014 – 2015 và năm học 2015 - 2016
Trang 4B PHẦN NỘI DUNG
I Cơ sở lý luận
1 Lập trình từ trên xuống
Khi lập trình giải quyết một bài toán lớn, nếu viết chương trình một mạch
từ trên xuống thì người lập trình sẽ rất vất vả và thậm chí có thể không thực hiện được Mặc khác, nếu có viết được đi nữa thì việc sửa đổi và kiểm tra lỗi cũng rất
là khó khăn vì phải đụng chạm đến toàn bộ chương trình
Để khắc phục được điều đó, người ta phân tích việc giải quyết bài toán thành những công việc tương đối độc lập Sau đó chi tiết dần các công việc này thành các các công việc nhỏ hơn Điều đó có nghĩa là chúng ta đã "phân mảnh" dần theo từng cấp Turbo Pascal cho phép người lập trình "phân mảnh" chương trình nhằm phục vụ ý đồ trên Có nghĩa là chia chương trình lớn thành nhiều phần nhỏ rồi giải quyết từng phần một (mỗi phần nhỏ như vậy được gọi là một chương trình con) Sau đó tuỳ nội dung công việc mà lắp ghép các chương trình nhỏ này lại với nhau để giải quyết bài toán
Phương pháp lập trình có phân mảnh như trên được gọi là TOP-DOWN PROGRAMMING (Lập trình từ gốc đến ngọn hay còn gọi là lập trình có cấu trúc)
Phân loại và cấu trúc chung của chương trình con:
Turbo Pascal cho phép xây dựng hai loại chương trình con đó là thủ tục (Procedure) và hàm (Function) Trong đó:
Thủ tục là một chương trình con dùng để thực hiện một số thao tác xử lý
nào đó để giải quyết một công việc cụ thể nào đó đã được phân mảnh
Hàm là một chương trình con dùng để xác định một giá trị của đại lượng ra
nào đó có kiểu dữ liệu đơn giản (số, kí tự, xâu kí tự, logíc) Giá trị của đại lượng
ra này được gọi là giá trị trả về của hàm
Trang 52 Thủ tục
2.1 Định nghĩa thủ tục:
Một thủ tục được định nghĩa theo cú pháp sau:
PROCEDURE TênThủTục [(Danh sách các tham số hình thức)] ;
Các định nghĩa và khai báo địa phương;
BEGIN
Các câu lệnh xử lý; {thân của thủ tục}
END;
Trong đó:
- TênThủTục: là là một định danh do người sử dụng đặt theo nguyên tắc
đặt tên của Turbo Pascal
- Danh sách các tham số hình thức: là tên của các đối tượng đóng vai trò
nhận thông tin vào cho thủ tục hoạt động Tham số hình thức có hai loại: tham biến và tham trị Các tham số hình thức đều được xác định rõ kiểu dữ liệu của chúng và nếu là kiểu dữ liệu của người dùng thì kiểu này phải được định nghĩa trước đó chứ không thể định nghĩa trực tiếp Nếu là tham biến thì phải có từ khoá Var đứng trước
Ví dụ:
PROCEDURE UCLN(m,n:Word; Var a:Word);
TYPE MANG = Array[1 100] Of Integer;
;
PROCEDURE SapXep(Var A:Mang; N:Word);
;
Một thủ tục có thể không có tham số hình thức nào Khi đó phần khai báo sau tên thủ tục sẽ không có cặp dấu ngoặc
Ví dụ: PROCEDURE TO_MAU;
Trang 6- Các định nghĩa và khai báo địa phương: là các khai báo về hằng, kiểu,
biến, chương trình con của nó Các đối tượng được khai báo ở đây chỉ được dùng cho thủ tục này và các chương trình con chứa trong nó
- Các câu lệnh xử lý: là hệ thống câu lệnh được cài đặt nhằm thực hiện giải
thuật đã thiết kế cho thủ thục
Ví dụ: Để viết thủ tục tìm ước số chung lớn nhất của hai số nguyên dương
m và n cho trước ta cho m, n đóng vai trò tham trị, giá trị ước số chung lớn nhất tìm được sẽ lưu ở tham biến a Thủ tục được viết như sau:
PROCEDURE UCLN(m,n:Word; Var a:Word);
BEGIN While m <> n do
if m>n then m:=m-n else n:=n-m;
a:=m;
END;
2.2 Lời gọi thủ tục
Sau khi thủ tục đã được định nghĩa, muốn sử dụng thủ tục đó thì phải thực hiện lời gọi thủ tục Lời gọi thủ tục được thực hiện như sau:
Nếu thủ tục có tham số hình thức thì lời gọi thủ tục phải có tên thủ tục và các tham số thực tế kèm theo như sau:
TênThủTục [(danh sách tham số thực tế)];
Nếu thủ tục không có tham số hình thức thì lời gọi thủ tục chỉ có tên thủ
Khi thực hiện lời gọi thủ tục, nếu có truyền biến cho tham biến hoặc tham trị thì trong quá trình xử lý giá trị của biến có thể bị thay đổi Tuy nhiên, khi thủ tục hoạt động xong thì:
- Nếu tham số thực tế là biến truyền theo kiểu tham trị thì biến đó sẽ lấy lại
giá trị của nó trước khi truyền cho thủ tục
- Nếu tham số thực tế là biến truyền theo kiểu tham biến thì biến đó sẽ giữ
lại giá trị của lần thay đổi sau cùng
Trang 73 Hàm
3.1 Định nghĩa hàm:
Một hàm được định nghĩa theo cú pháp sau:
FUNCTION TênHàm [(Danh sách các tham số hình thức)] : <Kiểu>;
Các khai báo địa phương;
Định nghĩa các chương trình con của hàm;
BEGIN Các câu lệnh xử lý; {thân của hàm}
END;
Trong đó:
TênHàm là một định danh do người sử dụng đặt theo nguyên tắc đặt tên
của Turbo Pascal
Danh sách các tham số hình thức giống như đối với thủ tục.
Kiểu là kiểu của giá trị trả về của hàm.
Ví dụ: FUNCTION UCLN(m,n:Word):Word;
Một hàm có thể không có tham số hình thức nào Khi đó phần khai báo sau tên hàm sẽ không có cặp dấu ngoặc
Ví dụ: FUNCTION SO_NGAU_NHIEN:Word;
Các khai báo địa phương giống như đối với thủ tục.
Các câu lệnh xử lý giống như đối với thủ tục Tuy nhiên đối với thân của
hàm bắt buộc phải có câu lệnh gán tên hàm bằng giá trị trả về của hàm, giá trị này có thể dưới dạng một biểu thức có kiểu là kiểu của giá trị trả về của hàm, theo cú pháp:
TênHàm:= Biểu thức;
Trong đó kiểu của Biểu thức phải trùng với kiểu của giá trị trả về của hàm
Trang 83.2 Lời gọi hàm:
Khi sử dụng hàm thì phải thực hiện lời gọi hàm Thực hiện lời gọi hàm là
để lấy giá trị trả về của hàm Vì vậy lời gọi hàm phải được đặt trong một biểu thức có xử lý giá trị của nó Khi thực hiện lời gọi hàm thì cũng phải truyền tham
số thực tế cho nó giống như đối với thủ tục
Ví dụ: USES CRT;
Var m,n,a:Word;
FUNCTION UCLN(m,n:Word):Word;
BEGIN While m <> n do
if m>n then m:=m-n else n:=n-m;
UCLN:=m;
END;
BEGIN Readln(m,n); a:= UCLN(m,n);
Writeln('USCLN của ', m ,' và ', n ,' là: ', a);
END.
Chương trình trên gồm có hai hàm:
Hàm UCLN(m,n)có giá trị trả về của hàm là ước số chung lớn nhất của hai
số nguyên dương m và n
4 Biến toàn cục và biến địa phương
Biến toàn cục là các biến được khai báo sau từ khoá VAR của chương trình
chính
Biến địa phương là các biến được khai báo sau từ khoá VAR trong các
chương trình con
USES CRT;
VAR Khai báo các biến toàn cục;
PROCEDURE AAA(danh sách các tham số hình thức);
Var Khai báo các biến địa phương;
Begin
; End;
BEGIN
Trang 9; END.
Phạm vi sử dụng của biến địa phương là trong thân của chương trình con khai báo chúng và trong các chương trình con chứa trong chương trình con này Thời gian tồn tại của chúng là từ khi chương trình con được gọi thực hiện cho đến khi thực hiện xong Còn phạm vi sử dụng của biến toàn cục là trong toàn bộ chương trình (trong chương trình chính và trong tất cả các chương trình con của nó) và thời gian tồn tại của chúng là khi chương trình đang hoạt động
5 Chú ý
(1) Tên của các tham số hình thức và tên của các biến địa phương trong cùng một chương trình con không được trùng nhau
(2) Tên của các biến địa phương có thể trùng tên với tên biến toàn cục Tuy nhiên khi chương trình con được gọi, nếu có sử dụng biến trùng tên thì trong quá trình chương trình con hoạt động, Turbo Pascal sẽ hiểu đó là biến địa phương, khi đó biến toàn cục tạm thời bị che dấu cho đến khi chương trình con hoạt động xong
(3) Biến toàn cục có thể tham gia trong các chương trình con, mọi tác động ảnh hưởng đến nó vẫn giống như khi chúng tham gia trong chương trình chính Ngược lại, biến địa phương chỉ tham gia trong chương trình con khai báo chúng, không thể tham gia trong chương trình chính
II Cơ sở thực tiễn
1 Mục đích của việc viết chương trình con
Để giúp học sinh hiểu được mục đích của việc viết chương trình con như thế nào Giáo viên sẽ cho HS thực hiện bài tập sau rồi viết nhận xét:
Xét bài toán : “Viết chương trình cho máy tính chu vi, diện tích và đường chéo của hai hình chữ nhật theo hai kích thước của mỗi hình Trong đó:
- Hình thứ nhất có hai kích thước là a1, a2;
Trang 10- Hình thứ hai có hai kích thước là b1, b2.
Var a1, b1, a2, b2, p1, p2, S1, S2, d1, d2: Real;
Begin
Writeln('Nhap hai canh cua HCN thu nhat:');
Write('a1 = '); Readln(a1);
Write('b1 = '); Readln(b1);
Writeln('Nhap hai canh cua HCN thu hai:');
Write('a2 = '); Readln(a2);
Write('b2 = '); Readln(b2);
p1 := 2 * (a1 + b1);
p2 := 2 * (a2 + b2);
S1 := a1 * b1;
S2 := a2 * b2;
d1 := sqrt(a1 * a1 + b1 * b1);
d2 := sqrt(a2 * a2 + b2 * b2);
Writeln('Hinh chu nhat thu nhat:');
Writeln('Chu vi bang ',p1);
Writeln('Dien tich bang : ',S1);
Writeln('Duong cheo bang: ',d1);
Writeln('Hinh chu nhat thu hai:');
Writeln('Chu vi bang ',p2);
Writeln('Dien tich bang : ',S2);
Writeln('Duong cheo bang: ',d2);
Readln
End.
Với chương trình trên để thực hiện được yêu cầu của đề bài, chúng ta phải viết đi viết lại hai dòng liên tiếp tính chu vi, diện tích và đường chéo của từng hình chữ nhật Giả sử nếu phải tính đến n hình chữ nhật thì vấn đề quả thực là hết sức phức tạp Trong bài toán trên ta còn chưa có phần kiểm tra điều kiện nhập vào của mỗi hình Nếu có thêm điều kiện này, chắc chắn chương trình còn dài nữa Vấn đề đặt ra là: làm thế nào có thể xóa bỏ được sự hạn chế này? Ở đây, chúng ta có thể hướng dẫn cho học sinh sử dụng chương trình con để khắc phục sự hạn chế đó Thay vì phải viết nhiều lần lệnh nhập, tính đi tính lại cho từng hình ta có thể viết 2 thủ tục: thủ tục nhập hai cạnh của hình chữ nhật và thủ tục Tính ba giá trị cho mỗi hình
Var a1, b1, a2, b2: Real;
Procedure nhapDoDai(Var x, y: Real; i: Byte);
Begin
Writeln('Nhap hai kich thuoc cua HCN thu ',i,':'); Repeat
Write('Canh thu nhat: '); Readln(x);
Write('Canh thu hai : '); Readln(y);
If (x <= 0) Or (y <= 0) Then Writeln('Nhap lai!');
Trang 11Until (x > 0) And (y > 0);
End;
Procedure Tinh(a, b: Real; k: Byte);
Begin
Writeln('Hinh chu nhat thu ',k,':');
Writeln('Chu vi bang: ',2 * (a + b));
Writeln('Dien tich bang : ',a * b);
Writeln('Duong cheo bang: ',sqrt(a * a + b * b)); End;
Begin
Nhap(a1, b1, 1); nhapDoDai(a2, b2, 2);
Tinh(a1, b1, 1); tinh(a2, b2, 2);
Readln
End.
Như vậy việc viết chương trình con sẽ xoá bỏ sự dài dòng không cần thiết (lặp đi lặp lại một công việc) so với cách viết thông thường, và với cách viết chương trình con ta còn dễ dàng kiểm tra tính đúng đắn trước khi lắp ráp vào chương trình chính, do đó sẽ dễ dàng xác định sai sót và điều chỉnh các câu lệnh cho phù hợp
2 Các bước hướng dẫn học sinh xây dựng chương trình con cho một bài toán
2.1 Xác định cần xây dựng những chương trình con nào để giải quyết bài toán
Xác định cần xây dựng những chương trình con nào là bước quan trọng nhất để giải quyết bài toán trong các đề thi Học sinh giỏi Vì vậy giáo viên cần hướng dẫn, đưa ra một số ví dụ cụ thể để học sinh có thể tham khảo, từ đó hình thành thói quen, kỹ năng xác định mình cần những chương trình con nào
Ví dụ với bài toán “Viết chương trình cho máy tính chu vi, diện tích và đường chéo của hai hình chữ nhật theo hai kích thước của mỗi hình” thì ta cần
xây dựng hai chương trình con là nhapDoDai và tinh như ở trên.
Hoặc là đối với bài toán “Nhập vào một dãy số nguyên gồm n phần tử Sau đó in ra các phần tử trong dãy là số nguyên tố” thì ta sẽ chia bài toán ra thành 3 công việc đó là:
Trang 12- Nhập dãy n số nguyên.
- Kiểm tra xem 1 số có phải là số nguyên tố hay không
- In kết quả tất cả các số nguyên tố trong dãy vừa nhập
Do đó ta cần xây dựng những chương trình con như nhapDay, kTSNT,
inKetQua.
Từ những bài toán như vậy sẽ dần hình thành cho học sinh kỹ năng xác định các chương trình con cần thiết để giải bài toán
2.2 Sử dụng hàm hay thủ tục để viết các chương trình con
Hầu hết các bài toán có thể giải được chỉ bằng hàm hoặc chỉ bằng thủ tục Nhưng việc chọn hàm hay thủ tục cho phù hợp với từng bài toán riêng biệt giúp chúng ta giải quyết bài toán một cách rõ ràng, tiện lợi và khoa học hơn Do đó việc xác định hàm hay thủ tục cũng là một bước rất quan trọng
Việc chọn này phụ thuộc vào bước xác định các chương trình con ở trên Thông thường, các chương trình con thể hiện việc nhập, xuất dữ liệu ta thường
viết ở dạng thủ tục còn các chương trình con thể hiện việc tính toán, kiểm tra điều kiện sẽ được thể hiện ở dạng hàm.
Xét bài toán “Nhập vào một dãy số nguyên gồm n phần tử Sau đó in ra
các phần tử trong dãy là số nguyên tố” với các chương trình con như nhapDay,
kTSNT, inKetQua thì sẽ viết thành 2 thủ tục và 1 hàm đó là:
- Procedure nhapDay(……….);
- Function kTSNT(………): boolean;
- Procedure inKetQua(…….);
2.3 Khai báo là tham trị hay tham biến trong chương trình con
Việc khai báo tham biến hay tham trị ảnh hưởng đến kết quả của chương trình Khi sử dụng tham trị nếu tham số thực tế là biến truyền theo kiểu tham trị thì biến đó sẽ lấy lại giá trị của nó trước khi truyền cho thủ tục, còn biến truyền theo kiểu tham biến thì biến đó sẽ giữ lại giá trị của lần thay đổi sau cùng Do
đó, giáo viên phải cần củng cố, khắc sâu thêm cho học sinh thông qua các ví dụ, các bài toán cụ thể để học sinh có thể hiểu hơn các bản chất của việc khai báo