Trong suốt quá trình giảng dạy từ khi môn Tin học được đưa vào trường phổ thông đến nay, tôi nhận thấy rằng khi giảng dạy về nội dung của Chương 6 "Chương trình con và lập trình có cấu t
Trang 1S
Ở GIÁO DỤC VÀ ĐÀO TẠO THANH HÓA
TRƯỜNG THPT TRẦN PHÚ NGA SƠN
SÁNG KIẾN KINH NGHIỆM
RÈN LUYỆN KĨ NĂNG CHO HỌC SINH KHI VIẾT CHƯƠNG TRÌNH CON BẰNG NGÔN NGỮ
LẬP TRÌNH PASAL
Người thực hiện: Nghiêm Thị Nhung Chức vụ: Giáo viên
Đơn vị công tác: Trường THPT Trần Phú SKKN thuộc môn: Tin học
THANH HÓA NĂM 2017
Trang 2MỤC LỤC
Nội dung Trang
MỤC LỤC……… 1
1 MỞ ĐẦU……… 2
1.1 Lý do chọn đề tài……… 2
1.2 Mục đích nghiên cứu……… 2
1.3 Đối tượng nghiên cứu……… 2
1.4 Phương pháp nghiên cứu……… 2
2 NỘI DUNG SÁNG KIẾN KINH NGHIỆM……… 2
2.1 Cơ sở lý luận của sáng kiến kinh nghiệm……… 2
2.2.Thực trạng của vấn đề trước khi áp dụng sáng kiến kinh nghiệm 4
2.3 Các giải pháp đã sử dụng để giải quyết vấn đề……… 4
A Tóm tắt lí thuyết……… 4
1 Khái niệm chung về chương trình con……… 4
2 Cấu trúc và vị trí của chương trình con trong chương trình chính 4
3 Biến toàn cục và biến cục bộ……… 6
4 Cách truyền tham số trong chương trình con……… 6
5 Phân biệt cách sử dụng hàm và thủ tục……… 7
6 Tính đệ qui của chương trình con……… 7
7 Nguyên tắc viết một chương trình con……… 8
8 Phương pháp chung khi lập trình chương trình con……… 8
B Bài tập áp dụng……… 9
1 Một số bài tập về thủ tục……… 9
2 Một số bài tập về hàm……… 12
3 Một số bài tập liên quan đến thủ tục và hàm 16 2.4 Hiệu quả của sáng kiến kinh nghiệm……… 16
3 KẾT LUẬN VÀ KIẾN NGHỊ……… 17
3.1 Kết luận……… 17
3.2 Kiến nghị……… 17
Tài liệu tham khảo……… 18
1 MỞ ĐẦU 1.1/ Lí do chọn đề tài
Trong bối cảnh toàn 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
Trang 3trong hoạt động học tập Chúng ta có thể thấy định hướng đổi mới phương pháp dạy học đã được khẳng định, không còn là vấn đề tranh luận 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
Tuy nhiên với bất kỳ một phương pháp nào thì giáo viên vẫn phải có một yêu cầu chung là phải hiểu rõ về bản chất của vấn đề thì từ đó mới có khả năng
sử dụng một hoặc nhiều phương pháp thích hợp để truyền đạt hay gợi mở vấn đề cho học sinh
Trong suốt quá trình giảng dạy từ khi môn Tin học được đưa vào trường phổ thông đến nay, tôi nhận thấy rằng khi giảng dạy về nội dung của Chương 6
"Chương trình con và lập trình có cấu trúc" phần lớn học sinh đều không hiểu được cách sử dụng chương trình con như thế nào khi viết chương trình mà lý do chính là có một số giáo viên cũng chỉ dạy những gì mình biết chứ cũng chưa hiểu rõ bản chất của vấn đề
Từ những lý do trên, qua quá trình giảng dạy trên lớp bản thân tôi đã chọn
đề tài “ Rèn luyện kĩ năng cho học sinh khi viết chương trình con bằng ngôn ngữ lập trình Pascal” là đề tài Sáng kiến kinh nghiệm của mình để có thể giúp cho giáo viên, học sinh hiểu rõ được vấn đề tương đối phức tạp này
1.2/ Mục đích nghiên cứu
Góp phần thúc đẩy quá trình đổ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
Góp phần nâng cao kiến thức và khả năng thực hành cho giáo viên
Giúp học sinh có khả năng nhận thức kiến thức và tự hoàn thiện kiến thức
1.3/ Đối tượng nghiên cứu
Là những học sinh có lực học từ khá trở xuống trong chương trình THPT áp dụng cho khối lớp 11
1.4/ Phương pháp nghiên cứu
Tổng hợp nghiên cứu các tài liệu liên quan đến chương trình con và các bài tập có sử dụng chương trình con
2 NỘI DUNG 2.1/ Cơ sở lí luận
Bản thân là một giáo viên giảng dạy môn Tin học tại trường THPT Trần Phú Với chất lượng học sinh đầu vào thấp, bản thân tôi được phân công dạy các lớp đại trà nên học sinh có học lực khá trở xuống chiếm khoảng ¾ lớp Vì vậy, khi dạy về “Cách viết và sử dụng chương trình con” tôi thấy rằng phần đông các
em chưa hiểu rõ được bản chất của chương trình con cũng như cách xây dựng chương trình con để viết chương trình Đa số các em chỉ hiểu một cách thụ động và không có tính tư duy, sáng tạo trong việc sử dụng chương trình con cho từng bài toán cụ thể Các em chỉ nhớ được các chương trình con mẫu trong SGK, với những chương trình con khác hầu như các em không biết xây dựng
hoặc số ít các em cũng chỉ đưa ra được những thao tác tương tự như bài mẫu
Trang 4Khi giảng dạy về phần chương trình con (CTC) – Tin học 11 tôi nhận thấy hầu hết học sinh rất bỡ ngỡ với các khái niệm hoàn toàn mới mẻ mang tính trừu tượng như: Hàm (Function), thủ tục (Procedure), danh sách tham số, tham số giá trị (tham trị), tham số biến (tham biến), tham số hình thức, tham số thực sự, lời gọi chương trình con,…
Điều làm tôi không khỏi băn khoăn đó là làm thế nào để học sinh hiểu và nắm bắt được các khái niệm này một cách hiệu quả nhất, nhằm tránh những sự hiểu lầm giữa hàm và thủ tục, giữa tham trị và tham biến, giữa tham số thực sự
và tham số hình thức, giữa biến chung (biến toàn cục) và biến riêng (biến cục bộ)
Khi trình bày vấn đề này cho học sinh, tôi đã thực hiện như sau:
+ Trước hết, đặt câu hỏi chương trình con là Thủ tục (Procedure) hay Hàm (Function)? Giải quyết chương trình con là Function khi và chỉ khi thỏa mãn đồng thời các yêu cầu sau:
– Nếu ta muốn nhận lại một và chỉ một kết quả mà thôi
– Kết quả phải là kiểu xác định ( kiểu vô hướng)
– Có cần dùng tên của Hàm để viết trong các biểu thức hay không ?
– Nếu không thỏa mãn các tính chất trên thì chương trình con là Procedure
Ví dụ :
Function BinhPhuong( x: real) : real;
Begin
BinhPhuong := x * x;
End;
(* -*)
Procedure BinhPhuong( x : real; var x2: real);
Begin
x2:=x*x;
End;
Xem cách tính c= a2 + b2
- Nếu dùng Function : c: = BinhPhuong(a) + BinhPhuong(b);
- Nếu dùng Procedure với một biến trung gian tg:
BinhPhuong(a,tg); c:=tg; {c:=a2}
BinhPhuong(b,tg); c:= c+tg; {c:= a2 + b2}
+ Sau cùng, giải quyết vấn đề tham số của chương trình con
Giải quyết :
– Chương trình con có cần tham số không?
– Nếu đối tượng của chương trình con là biến toàn cục thì biến này không cần đưa vào làm tham số
Làm như vậy tôi thấy có hiệu quả Học sinh hiểu rõ được về bản chất của từng bài toán cụ thể, các em dễ dàng tiếp cận được những yêu cầu khó khăn hơn trong các bài toán khác nhau Đó chính là những căn cứ để tôi viết đề tài này
2.2/ Thực trạng vấn đề
Trang 5Chương trình con là một nội dung khó, kiến thức rộng, phương pháp nhiều đối với học sinh mà đặc biệt là kiến thức về tham số, đòi hỏi học sinh phải có khả năng tư duy, óc phán đoán để định hướng tìm phương pháp thích hợp, tuy nhiên mức độ học sinh trường THPT không đồng đều, học sinh khá giỏi chiếm tỉ
lệ ít Với học sinh có mức học khá trở xuống các em thường bỏ qua hoặc có làm thì làm không đúng, không định hình được nên viết như thế nào Bên cạnh đó, thời lượng một tiết học sẽ không đủ để giáo viên vừa viết chương trình , vừa giảng giải và tổ chức hoạt động trong lớp học
Như ví dụ tính bình phương ở trên, tôi đã cho lớp 11B làm thử kết quả 30/39 học sinh không làm được, 5/39 học sinh làm nhưng kết quả sai, có 4/39 em học giỏi trong lớp viết được chương trình và cho kết quả đúng
2.3/ Giải pháp thực hiện
Nêu ra cách chương trình giải quyết một số bài toán thường gặp trong toán học và các bài tập liên quan để học sinh hiểu rõ hơn cách viết chương trình con trong pascal từ đó có thể tự mình giải quyết các bài toán tương tự
Bằng những kiến thức về Tin học và những kinh nghiệm của bản thân trong công tác giảng dạy bộ môn Tin học, để phát triển khả năng tư duy sáng tạo cho học sinh trong quá trình hình thành kỹ năng viết chương trình tôi đã sử dụng phương pháp gợi động cơ kích thích tính tích cực, sự sáng tạo, say mê, tìm tòi, học hỏi của học sinh qua cách xây dựng chương trình con được trình bày qua các giải pháp dưới đây:
A Tóm tắt lý thuyết
1 Khái niệm chung về chương trình con (CTC)
Trong khi lập trình chúng ta thường gặp những đoạn chương trình được lặp
đi lặp lại nhiều lần ở những chỗ khác nhau Để tránh rườm rà, những đoạn chương trình này được thay thế bởi các đoạn CTC tương ứng và khi cần, ta chỉ việc gọi đoạn CTC đó ra mà không phải viết lại cả đoạn chương trình đó
Đối với những bài toán lớn và phức tạp sẽ tương ứng với một chương trình
có thể rất lớn và dài Do đó, việc gỡ rối và hiệu chỉnh sẽ rất khó khăn Ta có thể phân tách vấn đề phức tạp đó ra thành các vấn đề nhỏ hơn để dễ kiểm tra, gỡ rối từng khối một và sau đó ghép thành một chương trình lớn Mỗi CTC có thể phần công cho một lập trình viên hoặc một nhóm cán bộ lập trình đảm nhiệm
Đó là ý tưởng cơ bản của lập trình có cấu trúc
Chương trình con là một dãy lệnh mô tả một số thao tác nhất định và có thể được thực hiện ở nhiều vị trí trong chương trình
2 Cấu trúc và vị trí của chương trình con trong chương trình chính:
Progam Tên_chương_trình_chính;
Uses Khai báo thư viện sử dụng;
Const Khai báo hằng;
Type Khai báo kiểu dữ liệu;
Var Khai báo biến;
Khai báo chương trình con
BEGIN {Chương trình chính}
Trang 6Các lệnh của chương trình chính;
Lời gọi thực hiện hàm và thủ tục;
END
Như vậy, phần khai báo chương trình con nằm ở phần cuối phần khai báo của chương trình chính
a Khai báo và lời gọi thủ tục
– Khai báo:
PROCEDURE <tên thủ tục>(Danh sách các tham số hình thức);{không có giá trị trả về}
{Khai báo các biến riêng của thủ tục (nếu cần)}
BEGIN
<các câu lệnh của thủ tục>;
END;
Ví dụ:
Procedure inso(n:integer);
Var i:integer;
Begin
For i:=1 to n do
write(i:5);
End;
– Lời gọi thủ tục
Cấu trúc: <tên thủ tục>(danh sách các tham số thực);
Ví dụ: inso(6);
b Khai báo và lời gọi hàm
– Khai báo:
FUNCTION <tên hàm>(danh sách các tham số hình thức):<Kiểu dữ liệu của hàm>;
{Khai báo các biến riêng của hàm (nếu cấn)}
BEGIN
<các lệnh trong thân hàm>;
<tên hàm>:=<Giá trị>;
END;
Chú ý: Luôn có phép gán tên hàm cho giá trị để hàm trả về giá trị khi được gọi
Ví dụ: Tính tổng của 2 số nguyên x và y
Function tong(x,y:integer):integer; {Do có giá trị trả về}
var s:integer;
begin
s:=x+y;
tong:=s;
end;
– Lời gọi hàm:
Cấu trúc: <tên hàm>(danh sách các tham số thực);
Trang 7* Lưu ý: Lời gọi hàm khác lời gọi thủ tục ở chỗ: Lời gọi hàm phải được đặt trong một lệnh hoặc trong một lời gọi chương trình con khác còn lời gọi thủ tục thì không
Ví dụ về lời gọi hàm: kq:=tong(4,5);
3 Biến toàn cục và biến cục bộ
Biến toàn cục là biến được khai báo trong chương trình chính Các biến này
có thể được dùng ở mọi nơi trong chương trình và tồn tại trong suốt thời gian làm việc của chương trình
Biến cục bộ (biến địa phương) là các biến được khai báo trong chương trình con Các biến này chỉ được sử dụng trong phạm vi chương trình con mà nó được khai báo Sau khi kết thúc chương trình con các biến này sẽ không tồn tại
Ví dụ:
PROGRAM vidu;
Var a,b,c:integer; {a,b,c là 3 biến toàn cục}
PROCEDURE thutuc(n:integer);{n là tham số hình thức}
Var i:integer; {i là biến cục bộ}
Begin
For i:=1 to 10 do write(i);
End;
BEGIN
a:=5; b:=6; c:=8;
thutuc( a);{a là tham số thực sự}
thutuc( b); {b là tham số thực sự}
thutuc( c); {c là tham số thực sự}
readln;
END
Trong trường hợp biến cục bộ trùng tên với biến toàn cục thì máy không bị nhầm lẫn mà sẽ thực hiện trên biến cục bộ Biến toàn cục không bị ảnh hưởng
4 Cách truyền tham số cho chương trình con (CTC)
CTC không cần có tham số (sau tên CTC) nếu không dùng đến chúng hoặc dùng trực tiếp biến toàn cục
Khi truyền tham số các tham số trong lời gọi CTC phải đúng thứ tự và kiểu tương ứng với khi khai báo chương trình con
Trong khi thực hiện CTC, các biến cục bộ và các tham số giá trị có thể bị thay đổi nhưng không ảnh hưởng đến các biến ở bên ngoài Trái lại, mọi thay đổi của tham biến ở trong CTC sẽ kéo theo sự thay đổi giá trị của các tham số thực sự tương ứng ở ngoài chương trình chính
Khi kết thúc CTC, máy sẽ giải phóng bộ nhớ của các biến cục bộ và các đối số
Ví dụ:
Procedure inso(a:integer; ch:char);
begin
Trang 8{các lệnh của chương trình con}
end;
{lời gọi}
inso(13,’a’); {lời gọi đúng}
inso(‘a’,13); {loi gọi sai}
inso(13);{lời gọi sai}
– Tham số hình thức (đối) là các tham số sau tên hàm và thủ tục trong khai báo – Tham số thực sự là các tham số sau tên hàm và thủ tục trong lời gọi
– Tham số biến (tham biến): Là các tham số được khai báo sau từ khóa Var Các
tham số thực phải là các biến chứ không được là giá trị Tham biến có thể được thay đổi trong chương trình con và sau khi ra khỏi chương trình con nó vẫn giữ giá trị thay đổi đó
– Tham số giá trị (tham trị): Là các tham số được khai báo mà không đứng sau
từ khóa Var Các tham số thực có thể là các giá trị, hằng, biến Tham trị có thể
thay đổi trong chương trình con nhưng sau khi kết thúc chương trình con giá trị của nó trở về như ban đầu
– Các tham số trong hàm luôn là các tham trị, các tham số trong thủ tục có thể là tham trị hoặc tham biến
5 Phân biệt cách sử dụng hàm và thủ tục
Hàm khác thủ tục ở chỗ hàm trả về một giá trị cho lệnh gọi thông qua tên hàm còn thủ tục thì không
*Dùng hàm
– Kết quả của bài toán trả về 1 giá trị duy nhất (kiểu vô hướng, kiểu string hoặc kiểu con trỏ)
– Lời gọi chương trình con cần nằm trong các biểu thức tính toán
*Dùng thủ tục
– Kết quả của bài toán không trả về giá trị nào hoặc trả về nhiều giá trị hoặc trả
về kiểu dữ liệu có cấu trúc (Array, Record, File)
– Lời gọi chương trình con không nằm trong các biểu thức tính toán
6 Tính đệ quy của chương trình con
Một chương trình con mà trong chương trình con này lại dùng chính nó để tính toán gọi là chương trình đệ qui
Ta xét ví dụ sau: Nhập vào một số n và tính n!
Ta đã biết n! = 1 nếu n =0 trong trường hợp n>=1 ta có n!=n*(n-1)! Hàm tính n! như sau:
Function Giaithua(n:integer):longint;
Begin
if n=0 then giai_thua:=1
else Giaithua:=n*Giaithua(n-1);
End;
– Lưu ý:
+ Khi sử dụng đệ quy phải có điều kiện kết thúc đệ quy (trường hợp suy biến)
Trang 9Trong ví dụ ta xét điều kiện kết thúc đệ quy chính là n=0 Nếu không có điều kiện kết thúc này chương trình của ta sẽ lặp vô hạn
+ Luôn có lời gọi đệ quy, trong trường hợp trên là lời gọi giai_thua(n-1);
7 Nguyên tắc viết một chương trình con
Một chương trình con phải viết như là modul độc lập không phụ thuộc chương trình chính.Muốn vậy phải viết theo nguyên tắc sau:
7.1 Dùng danh sách biến hình thức để nhận các dữ liệu truyền vào
CTC sử dụng dữ liệu hoặc biến của chương trình chính thông qua biến hình thức, không dùng trực tiếp các dữ liệu của chương trình chính
7.2.Biến của chương trình con
Các tên biến dùng trong chương trình con phải khai báo ở chương trình con (biến riêng), không dùng biến của chương trình chính trong chương trình con
8 Phương pháp chung khi lập trình chương trình con là:
8.1.Trước hết hãy tạo chương trình chính cùng với các tên chương trình con Thí dụ khi giải phương trình bậc hai, trước tiên hãy viết như sau:
PROGRAM Giai_PT_Bac2;
Begin
DocvaTinhDelta;
If Delta=0 then DeltaKhong
Else
If Delta>0 then DeltaDuong
Else DeltaAm;
End.
Trong đó DeltaKhong, DeltaDuong, DeltaAm là 3 tên chương trình con mà bạn
sẽ hình thành tiếp theo với các khung gồm tên chương trình con cùng với hai từ khóa Begin và End; vừa đủ để khi dịch thì chương trình dịch không báo lỗi về các chương trình con này
PROGRAM Giai_PT_Bac2;
{ -}
Procedure DeltaKhong;
Begin
End;
{ -}
Procedure DeltaDuong;
Begin
End;
{ -}
Procedure DeltaAm;
Begin
End;
{ -chương trình chính -}
Begin
DocvaTinhDelta;
Trang 10If Delta=0 then DeltaKhong
Else If Delta>0 then DeltaDuong
Else DeltaAm;
End.
8.2 Tiếp theo mới là đến việc hoàn thiện từng chương trình con một cách riêng rẽ
Bắt đầu cho chạy chương trình thì tôi hướng dẫn học sinh cho chạy thử dần với từng chương trình con một Nên làm dứt điểm, làm xong từng chương trình con một Mỗi chương trình con như vậy nên thử một vài giá trị đặc biệt để xem
có lỗi về mặt thuật toán, về mặt tính toán hay không
B Bài tập áp dụng
Vì sáng kiến kinh nghiệm này chỉ dùng cho đối tượng là những học sinh có học lực khá trở xuống (đa số là những học sinh có lực học trung bình), cho nên những bài tập tôi đưa ra sau đây là tương đối cơ bản
1 Một số bài tập về thủ tục
Bài tập 1 Giải và biện luận phương trình bậc nhất: ax+b=0 với a=4.5, b=13.5 và với các cặp a,b tạo bởi a=-1, a=0, a=1, b=0, b=1, b=2
Ta viết một thủ tục có nhiệm vụ giải và biện luận phương trình ax+b=0 với hai tham số a,b tùy ý và gọi thực hiện thủ tục này 10 lần ứng với các giá trị cụ thể của a,b cho trong giả thiết
Phân tích:
Khi gọi Giaipt(4.5,13.5); là ta yêu cầu máy thực hiện thủ tục Giaipt với tham
số a=4.5 và b=13.5 Hai vòng lặp for xác định 9 cặp giá trị i,j cụ thể và cứ mỗi lần như vậy lại gọi thực hiện thủ tục Giaipt với tham số a=i, b=j tương ứng
For i:=-1 to 1 do
For j:=0 to 2 do Giaipt(i,j);
Do tách riêng biệt việc giải phương trình ax+b=0 thành một thủ tục nên số lệnh trong thân chương trình chính giảm đi, nổi bật được thuật toán chính của chương trình
Ở đây, ta chọn chương trình con Giaipt là thủ tục chứ không phải là hàm vì phương trình ax+b=0 có thể vô nghiệm hoặc vô số nghiệm (khi a=0) Thành ra
ta không tìm được một giá trị thích hợp để gán cho tên hàm Vậy kết quả giải phương trình phải xuất ra ngay trong chương trình con, đó là công việc của thủ tục
Chương trình:
Program Bai1;{giải phương trình bậc nhất ax+b=0 bằng thủ tục}
Uses crt;
Var i,j: integer;
Procedure Giaipt (a,b:real);
Begin
Writeln(‘giai phuong trinh:’,a:4:1,’x+’,b:4:1,’=0’);
If a<>0 then writeln(‘nghiem x=’,-b/a:4:2)
else