Professional Documents
Culture Documents
A. PHẦN MỞ ĐẦU
I. ĐẶT VẤN ĐỀ
Hiện nay trong lí luận dạy học nói chung và lí luận dạy học môn tin
học nói riêng đề cập khá nhiều phương pháp và kỉ thuật dạy học: phương pháp
thảo luận, phương pháp đặt câu hỏi, phương pháp chia nhóm …
Các cách thiết kế bài giảng hiện nay, nhằm mục đích áp dụng phương
pháp hiện đại để bồi dưỡng cho học sinh năng lực ham muốn học hỏi, tư duy
sáng tạo, năng lực tự giải quyết vấn đề, rèn luyện và phát triển năng lực tự học
sáng tạo, nghiên cứu, nghĩ và làm việc một cách tự chủ… Đồng thời để thích
ứng với sự phát triển tư duy của học sinh trong xã hội mới và tiếp cận với các
công nghệ tiến tiến trong xã hội, trên thế giới. Bên cạnh đó, trong các phương
pháp dạy học mới, vai trò của người thầy có sự thay đổi là: “hướng dẫn học
sinh biết tự minh tìm ra hướng giải quyết những vấn đề nãy sinh trong quá trình
học tập, biết cách làm việc độc lập, làm việc tập thể. Giáo viên là người định
hướng, là người cố vấn giúp học sinh tự đánh giá, cũng như giúp học sinh luôn
đi đúng con đường tìm hiểu, lĩnh hội kiến thức…”.
Xuất phát từ thực tiễn giảng dạy tại trường THPT Huỳnh Thúc Kháng
tôi thấy rằng, để đạt hiệu quả cao trong mỗi phần học, tiết học cần có cách thiết
kế bài giảng cho phù hợp với nội dung kiến thức, phương pháp, phương tiện dạy
học phải phù hợp với từng đối tượng học sinh. Để qua mỗi phần học, tiết học học
sinh thích thú với kiến thức mới, qua đó hiểu được kiến thức đó học trên lớp,
đồng thời học sinh thấy được tầm quan trọng của vấn đề và việc ứng dụng của
kiến thức trước hết để đáp ứng những yêu cầu của môn học, sau đó là việc ứng
dụng của nó vào các công việc thực tiển trong đời sống. Trong thời đại thông tin
1
MỘT SỐ LỖI KHI SỬ DỤNG THỦ TỤC VÀ HÀM TRONG PASCAL
Sáng kiến kinh nghiệm tin học 11 GV: Phan Thị Hương
bùng nổ ngày nay, thì không chỉ ngành tin học mới sử dụng đến những kiến thức
về tin học mà tất cả đều sử dụng tin học. Nhưng hiện nay đội ngũ những người
lập trình ra được các phần mềm ứng dụng thì đang còn quá ít nói chung hầu hết
không mấy người mặn mà lắm với công việc lập trình bởi đối với công việc này
đòi hỏi phải có tu duy, và sự đam mê với công việc.
Khi giảng dạy môn Tin học 11, khi dạy Bài 17 “CHƯƠNG TRÌNH
CON VÀ PHÂN LOẠI”, nội dung của bài này: giới thiệu cho học sinh nắm
được cơ bản trong việc khi sử dụng để giải quyết các vấn đề cần chia nhỏ và giải
quyết được bằng những đoạn chương trình ngắn gọn, đơn giản. Trong pascal
được tổ chức thành các thủ tục và hàm . Nhưng 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ư: tại sao lại
dùng thủ tục? tại sao lại dùng hàm?. Danh sách tham số, tham số giá trị, tham số
biến, tham số hình thức, tham số thực sự.
Đ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 các khái niệm tham biến và tham trị .
Hiện nay hầu hết các ngôn ngữ bậc cao đều tổ chức hai cách truyền
tham số khi gọi một CTC( chương trình con), đó là truyền theo trị và truyền theo
biến. Việc truyền tham chiếu theo hai cách khác nhau nhiều khi gây ra những kết
quả khác nhau không mong muốn, điều này dẫn đến những lỗi logic rất khó phát
hiện. Dưới đây trình bày những sai lầm có thể xảy ra khi sử dụng chương trình
con là hàm hay thủ tục, hai cách truyền tham số và cách dùng chúng cho đúng để
đạt được múc đích đã đề ra của chương trình.
Bài viết này không nghiêng về thuật toán của các bài toán khó mà chỉ
đưa ra các bài toán có thuật toán đơn giản nhất để học sinh không rơi vào việc
giải quyết thuật toán mà chú trọng đến vấn đề của bài viết “GIẢI QUYẾT MỘT
2
MỘT SỐ LỖI KHI SỬ DỤNG THỦ TỤC VÀ HÀM TRONG PASCAL
Sáng kiến kinh nghiệm tin học 11 GV: Phan Thị Hương
SỐ LỔI KHI SỬ DỤNG HÀM VÀ THỦ TỤC CÁC THAM SỐ CỦA HÀM VÀ
THỦ TỤC trong PASCAL ”.
Do lần đầu tiên thực hiện làm sáng kiến kinh nghiệm, nên không
tránh khỏi những thiếu sót. Mong quý thầy cô góp ý để lần sau làm tốt hơn.
3
MỘT SỐ LỖI KHI SỬ DỤNG THỦ TỤC VÀ HÀM TRONG PASCAL
Sáng kiến kinh nghiệm tin học 11 GV: Phan Thị Hương
4
MỘT SỐ LỖI KHI SỬ DỤNG THỦ TỤC VÀ HÀM TRONG PASCAL
Sáng kiến kinh nghiệm tin học 11 GV: Phan Thị Hương
If n= 0 then GT:=1;
Else
Begin
T:=1;
For i:= 1 to n do
T:=T*I;
GT:=T;
End;
End;
- Khi sử dụng Procedure để viết chương trình tính N! thì sử dụng như
thế nào?
Procedure tinhGT(N:integer; var GT:integer);
Var i:integer;
Begin
IF N=0 Then GT:=1
Else
Begin
GT:=1;
For i:= 1 to n do GT:=GT*i;
End;
End;
- Nhưng khi đưa ra câu hỏi là dùng chương trình con để giải bài toán
sau:
N!
CNK =
K !( N K )!
Việc dùng thủ tục hay hàm để giải bài toán trên là một vấn đề phải
nói , với học sinh hầu như các em không thể trả lời được câu hỏi này.
Lúc này giáo viên phải hướng dẫn và giải thích cho các em rõ điều này
đó là. Ta thấy N! chỉ nhận lại 1 kết quả thuộc loại vô hướng nên hoàn toàn có thể
lập Function tính N!. Song điều đó không bắt buộc người dùng phải sử dụng
Function.
Nhưng khi nào cần dùng FUNCTION? khi nào cần dùng là
PROCEDURE?
6
MỘT SỐ LỖI KHI SỬ DỤNG THỦ TỤC VÀ HÀM TRONG PASCAL
Sáng kiến kinh nghiệm tin học 11 GV: Phan Thị Hương
tính toán
Vậy thì bài toán tính tổng không thể sử dụng Procedure vi
trong chương trình có sử dụng biểu thức tính toán.
Giống nhau:
Hàm và thủ tục là các chương trình con có chức năng thực
hiện một công việc nào đó trong chương trình chính. Về cấu trúc chung thì
chúng gần giống nhau.
Khác nhau:
Hàm sau khi thực hiện công việc sẽ trả về một giá trị cho tên hàm.
Thủ tục khi thực hiện công việc không trả về một giá trị cho tên thủ
tục.
3. Những tình huống có thể xẩy ra trong khi sử dụng tham biến và tham
trị .
- Nếu một CTC có danh sách tham số thì các tham số phải được khai báo ở
phần đầu sau tên CTC, trong cặp dấu ngoặc tròn. Khai báo một tham số có nghĩa
là chỉ ra nó thuộc loại tham số nào ( tham số biến hay tham số trị ) và nó có kiểu
dữ liệu là gì?
Ví dụ 1: Procedure Delta(Var x: integer ; y: real);
7
MỘT SỐ LỖI KHI SỬ DỤNG THỦ TỤC VÀ HÀM TRONG PASCAL
Sáng kiến kinh nghiệm tin học 11 GV: Phan Thị Hương
Sử dụng Hàm:
Begin
Kq := a*b;
Tich := Kq;
End;
8
MỘT SỐ LỖI KHI SỬ DỤNG THỦ TỤC VÀ HÀM TRONG PASCAL
Sáng kiến kinh nghiệm tin học 11 GV: Phan Thị Hương
Begin
Kq := a*b;
End;
Nhận xét:
Vì hàm hàm trả về giá trị sau khi thực hiện nên có lệnh gán kết
quả cho tên hàm Tich := Kq; và cũng chính vì vậy nên sau khai báo tên hàm có
khai báo thêm kiểu dũ liệu trả về Tich(a, b: integer): integer;
Thủ tục không trả về kết quả nên có câu lệnh xuất kết quả ngay
trong thủ tụcWrite(‘Tích của , a, ‘ và ‘, b, ‘ là ‘, Kq);
Trong chương trình chính, khi sử dụng hàm và thủ tục cũng cần
chú ý:
Vì hàm trả về một giá trị thông qua tên gọi của nó nên ta có thể
viết hàm trong biểu thức, hay xuất ra trong câu lệnh write. Ví dụ:
+ tich(2, 5) * 5 –> cho kết quả 50
+ write(tich(2, 5)) –> in ra màn hình giá trị 10
Thủ tục không trả về giá trị thông qua tên của nó. Do đó ta
không thể sử dụng như hàm trong ví dụ trên và chỉ có thể gọi thủ tục như một
câu lệnh độc lập. Ví dụ:
Ví dụ3:
Progam Vidu3;
USES CRt;
Var a, b,c,d:integer;
Procedure Tinh (a,b:Integer; Var c, d:Integer );
9
MỘT SỐ LỖI KHI SỬ DỤNG THỦ TỤC VÀ HÀM TRONG PASCAL
Sáng kiến kinh nghiệm tin học 11 GV: Phan Thị Hương
Begin
c:= a – b ;
d:= a + b ;
a:= a*b ;
End;
Begin clrscr;
a:= 15; b:= 5; c:= 5; d:= 10;
Tinh(a,b,c,d);
Write(a,b,c,d);
Readln;
End.
Mới nhìn vào chương trình nhiều học sinh có thể chủ quan đưa ra các
giá trị 150, 5, 5, 25 tương ứng với các tham số a, b, c, d. Nhưng kết qủa nhận
được sau khi chạy chương trình lại là 15, 5, 10, 20 tương ứng với các tham số a,
b, c, d. Vậy tại sao lại có kết quả này?
Thật vậy, do a, b được truyền theo trị nên khi có lời gọi Tinh(a,b,c,d)
thì giá trị của a, b vẫn được giữ nguyên như ban đầu a = 15, b = 5 còn c, d được
truyền theo biến nên khi có lời gọi Tinh(a,b,c,d) thì các giá trị của c, d thay đổi c
= 10, d = 20
Nhận xét: Qua ví dụ3, sau khi chạy chương trình thì tham biến có kết quả
thay đổi còn tham trị kết quả không thay đổi, đó chính là sự khác nhau cơ
bản giữa tham biến và tham trị, ta xét ví dụ sau.
Program Vidu4;
Var x, y: integer;
begin
10
MỘT SỐ LỖI KHI SỬ DỤNG THỦ TỤC VÀ HÀM TRONG PASCAL
Sáng kiến kinh nghiệm tin học 11 GV: Phan Thị Hương
end;
BEGIN
HoanDoi(x, y);
readln
END.
Nhận xét:
11
MỘT SỐ LỖI KHI SỬ DỤNG THỦ TỤC VÀ HÀM TRONG PASCAL
Sáng kiến kinh nghiệm tin học 11 GV: Phan Thị Hương
12
MỘT SỐ LỖI KHI SỬ DỤNG THỦ TỤC VÀ HÀM TRONG PASCAL
Sáng kiến kinh nghiệm tin học 11 GV: Phan Thị Hương
Chương trình trên sử dụng hàm UCLN(a, b) để tối giản một phân số khi
nhập từ bàn phím các giá trị tử số và mẫu số của nó.
Nhìn vào chương trình ta không phải bàn đến tính đúng đắn của
công thức. Vì ta thấy chương trình trên trả về UCLN của hai số nguyên dương a
và b và dùng hàm này để tính d là UCLN của tử và mẫu. Phân số tối giản nhận
được bằng cách cùng chia tử và mẫu cho d. Tuy nhiên, khi chạy chương trình, ta
luôn nhận được kết quả không mong muốn là 1/1 cho mọi phân số. Vậy lỗi do
đâu?
Lỗi logic này xẫy ra do hàm UCLN được tổ chức truyền theo
tham biến, nên sau lời gọi d:= UCLN(tu,mau) , ta được đồng thời các giá trị d,
tu, mau bằng nhau và bằng d. Để chương trình cho kết quả đúng ta phải sửa lại
việc khai báo các tham số trong hàm UCLN là truyền theo tham trị ( bỏ từ khoá
Var trước a, b).
Nhận xét: Việc tổ chức truyền theo trị hay truyền theo biến cho một tham số
là không thể tuỳ tiện vì nó có thể dẫn đến những kết quả sai với yêu cầu của
bài toán. Qua hai ví dụ trên đã minh hoạ các tình huống có thể xảy ra. Ví dụ
3 cho một kết quả sai khi truyền theo trị trong khi nếu sửa lại việc khai báo
các tham số trong thủ tục Hoandoi là truyền theo tham biến thì chương trình
sẽ cho kết quả đúng với yêu cầu của bài toán. Còn ở ví dụ 4 cho thấy một kết
quả sai khi truyền theo tham biến.
Ví dụ 6:
Program VD6;
Var a: Byte;
Function F(Var x:Byte):Byte;
Begin
x:=x+1; F:=x;
End;
Begin
a:=5; Writeln(F(a)+F(a));
Readln;
13
MỘT SỐ LỖI KHI SỬ DỤNG THỦ TỤC VÀ HÀM TRONG PASCAL
Sáng kiến kinh nghiệm tin học 11 GV: Phan Thị Hương
End.
Chương trình đơn giản trên đưa ra màn hình giá trị F(a)+F(a)
với a = 5. Bằng suy luận thông thường, kết quả đúng phải là 12 vì tại a = 5, F (a)
cho giá trị 6. Tuy nhiên khi chạy chương trình ta sẽ nhận được kết quả 13. Có thể
sửa biểu thức F(a)+F(a) thành biểu thức 2*F(a) lúc này ta sẽ nhận được kết quả
là 12. Chương trình vẫn thực hiện đúng những lệnh mà ta viết, chỉ có điều ở đây
xuất hiện hiệu ứng phụ do hàm F được tổ chức truyền theo biến đối với tham
biến x của nó. Lệnh x:= x + 1 trong hàm F sẽ làm biến a tăng lên một đơn vị mỗi
khi gọi F(a) khi thực hịên biểu thức F(a)+F(a), giá trị F(a) được gọi hai lần. Tại
lần thứ nhất a = 5, do đó F(a) = 6 , tại lần gọi thứ hai lúc đó a = 6 do đó F(a) = 7
và ta nhận được kết quả 13.
Trong khi đó biểu thức 2*F(a) chỉ gọi giá trị F(a) một lần vì thế
mà ta nhận được kết quả là 12. Nếu sửa lại việc truyền cho tham biến x của hàm
F là theo trị thì không còn sự khác nhau như vậy nữa.
Nhận xét: Như vậy, khi truyền một tham số cho CTC, nếu ta muốn bảo vệ
giá trị của tham số đó khỏi bị CTC “ vô tình phá” thì tham số đó phải được
dùng như là tham trị. Khi đó cho phép giá trị đầu vào tương ứng có thể là
hằng, biểu thức hoặc biến nguyên. Còn một tham số nếu muốn dùng để lấy
kết quả (những biến đổi) do chương trình con đem lại thì tham số đó phải là
tham biến và giá trị đầu vào tương ứng chỉ có thể là biến.
15
MỘT SỐ LỖI KHI SỬ DỤNG THỦ TỤC VÀ HÀM TRONG PASCAL
Sáng kiến kinh nghiệm tin học 11 GV: Phan Thị Hương
Câu 6: Viết chương trình sử dụng chương trình con để tính tổng các số chẵn
từ a đến b.
Câu 7: Viết chương trình tìm giá trị nhỏ nhất và giá trị lớn nhất của một
dãy số.
Câu 8: Viết hàm chuyển một xâu ký tự thường sang ký tự hoa.
Câu 9: Viết hàm tính xn.
C- Kết luận
Bộ môn tin học lớp 11 là một phần khó của chương trình tin học
phổ thông và đồng thời nó là một bộ môn chưa được đưa vào trong chương trình
thi tốt nghiệp. Cho nên đối với học sinh sự đam mê học môn ngôn ngữ lập trình
cũng đang còn hạn chế. Như vậy đối với giáo viên giảng dạy bộ môn tin học
cũng gặp nhiều khó khăn, để làm thế nào có được một tiết học tốt đồng thời giúp
các em hứng thú với tiến học sau, hay trong môn học thì đó là một quá trình
chuẩn bị của giáo viên. Giáo viên cần có sự thay đổi trong phương pháp giảng
dạy cũng như cách thiết kế nội dung trong từng bài giảng để giúp các em tiếp
nhận được dễ dàng và thấy thích thú đối với từng tiết tin học. Đối với tôi là một
giáo viên con mới chưa có nhiều kinh nghiệm thì đây cũng là một điều khó trong
quá trình giảng dạy. Nhưng đây là một vài kinh nghiệm của tôi được rút ra trong
qua trình giảng dạy bộ môn tin học lớp 11.
Và đề tài đã thu được một số kết quả sau:
Xây dựng được hệ thống câu hỏi, bài tập để giảng dạy chương VI –
phần CTC và lập trình có cấu trúc,
16
MỘT SỐ LỖI KHI SỬ DỤNG THỦ TỤC VÀ HÀM TRONG PASCAL
Sáng kiến kinh nghiệm tin học 11 GV: Phan Thị Hương
Sử dụng các ví dụ này vào trong các đề kiểm tra: tìm đáp án đúng
hay sửa lỗi chương trình…
Đề tài đã được ứng dụng để giảng dạy và đạt kết quả tốt trong năm
học vừa qua. Phần lớn học sinh đã phân biệt cách sử dụng
hàm hay thủ tuc và biết được bản chất của sự khác nhau
giữa tham biến và tham trị và cách sử dụng chúng.
D- Kiến Nghị
Để tiết kiệm thời gian và các giờ học đạt kết quả
cao, giáo viên cần chuẩn bị sẵn các chương trình vào máy tính. Học sinh có thể
chạy chương trình và thử với các bộ test khác nhau (Tốt hơn là dạy bằng máy
chiếu vì hầu hết trường nào cũng đã có).
Tuy nhiên đề tài sáng kiến kinh nghiệm chưa sâu
sắc và không thể tránh khỏi những sai sót. Rất mong được sự đóng góp ý kiến
của quý thây cô để sáng kiến hoàn chỉnh hơn.
17
MỘT SỐ LỖI KHI SỬ DỤNG THỦ TỤC VÀ HÀM TRONG PASCAL
Sáng kiến kinh nghiệm tin học 11 GV: Phan Thị Hương
18
MỘT SỐ LỖI KHI SỬ DỤNG THỦ TỤC VÀ HÀM TRONG PASCAL
Sáng kiến kinh nghiệm tin học 11 GV: Phan Thị Hương
MỤC LỤC
A. PHẦN MỞ ĐẦU
2.Những tình huống có thể xẩy ra trong khi sử dụng thủ tục và hàm..................05
3.Những tình huống có thể xẩy ra khi sử dụng tham biến và tham trị.................07
4. Một số bài tập áp dụng.....................................................................................14
C- Kết luận .........................................................................................................16
D- Kiến Nghị.......................................................................................................17
Tài liệu tham khảo...............................................................................................18
19
MỘT SỐ LỖI KHI SỬ DỤNG THỦ TỤC VÀ HÀM TRONG PASCAL