Tải bản đầy đủ (.doc) (15 trang)

SKKN một số sai lầm của học sinh THPT khi dùng tham biến và tham trị trong lập trình ngôn ngữ pascal

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (105.04 KB, 15 trang )

SỞ GIÁO DỤC VÀ ĐÀO TẠO THANH HOÁ

TRƯỜNG THPT ĐẶNG THAI MAI

SÁNG KIẾN KINH NGHIỆM

ĐỀ TÀI
MỘT SỐ SAI LẦM CỦA HỌC SINH THPT
KHI DÙNG THAM BIẾN VÀ THAM TRỊ TRONG LẬP TRÌNH
NGƠN NGỮ PASCAL

Người thực hiện: Lê Văn Bắc
Chức vụ: Phó hiệu trưởng
SKKN thuộc lĩnh vực : Tin học

THANH HĨA NĂM 2021
1


1. Mở đầu.
1.1. Lí do chọn đề tài.
Khi 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 hồn tồn mới mẻ mang tính trừu tượng
như: 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, đó 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 hai cách truyền tham chiếu 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 tốn của các bài tốn khó mà chỉ đưa ra
các bài tốn có thuật tố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: “Một số sai lầm của học sinh
THPT khi dùng tham biến và tham trị trong ngơn ngữ lập trình Pascal”
1.2. Mục đích nghiên cứu.
- Giúp học sinh hiểu được 2 khái niệm then chốt là "tham biến" và "tham trị",
biết sử dụng trong lập trình CTC bằng ngôn ngữ PASCAL.
- Rèn luyện cho học sinh có tư duy khoa học, logic, tác phong sáng tạo, say mê
môn Tin học.
1.3. Đối tượng nghiên cứu.
Công tác giảng dạy môn Tin học lớp 11.
1.4. Phương pháp nghiên cứu.
Phương pháp nghiên cứu lý thuyết
Phương pháp nghiên cứu thực tiễn

2


2. Nội dung sáng kiến kinh nghiệm.
2.1. 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ụ:
Procedure Delta(Var x: integer ; y: real);
Function

Beta( a, b: real): real;
Danh sách tham số là x, y, a, b. Với x có kiểu dữ liệu Integer y, a, b, có kiểu số
thực. Vậy trong danh sách tham số x, y, a, b đâu là tham biến, đâu là tham trị?
Bằng trực quan ta dễ dàng nhận thấy x là tham biến vì x có từ khố Var đứng trước;
y, a, b là tham trị vì khơng có từ khố Var đứng trước. Để thấy rõ hơn về bản chất
sự khác nhau giữa tham biến và tham trị ta xét ví dụ sau:
Ví dụ1:
Progam Vidu1;
Procedure Tong_hieu(a, b: Integer; Var c, d: Integer );
Begin
c:= a – b ;
d:= a + b ;
a:= a*b ;
End;
Begin
clrscr;
a:= 10; b:= 3; c:= 5; d:= 6;
Tong_hieu(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ị 30,
3, 7, 13 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à 10, 3, 7, 13 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 Tong_hieu(a,b,c,d) thì
giá trị của a, b vẫn được giữ nguyên như ban đầu a = 10, b = 3 còn c, d được
3



truyền theo biến nên khi có lời gọi Tong_hieu(a,b,c,d) thì các giá trị của c, d thay
đổi c = 7, d = 13.
Nhận xét: Qua ví dụ1, 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:
Ví dụ 2:
Program VD2;
Var x,y: Integer ;
Procedure Thamso(Var Z: Integer ; W: Integer);
Begin
Z:= 1; W:=1;
End;
Begin
{chuong trinh chinh}
x:= 0; y:= 0;
Writeln(x:5,y:5);
Thamso(x,y);
Writeln(x:5,y:5);
Readln;
End.
Kết quả nào sẽ xuất hiện trên màn hình khi chương trình được thực hiện:
0 0
0 0
0 0
0 0
1 0
1 1
0 1
0 0
Bước vào thân chương trình chính ban đầu x và y đều có giá trị là 0 (do các

lệnh x:= 0, y:= 0). Khi gọi thủ tục Thamso(x,y), tham số biến được thay bởi biến x.
Điều này có nghĩa là mọi thao tác đối với z trong thủ tục sẽ xảy ra đối với x. Cụ thể
là lệnh gán z:= 1 bây giờ sẽ là x:= 1, tức gán giá trị 1 cho biến x. Còn khi gọi thủ
tục Thamso(x,y) tham số w được thay bởi biến y; giá trị của biến y được sao chép
sang cho biến w. Tức là w có giá trị 0. Khi bước vào thân thủ tục khơng có một liên
quan nào nữa giữa biến y với w, vì vậy lệnh gán w:= 1 khơng ảnh hưởng gì đến giá
trị của y. Như vậy, giá trị của x được in ra là 1, còn y là 0.
Với thủ tục Procedure
Thamso(Var z: Integer ; w: Integer ) thì các lời
gọi sau đây có hợp lý khơng? Thamso(x + 1, y) hay Thamso(2, y). Khi thay lời gọi
Thamso(x,y) bằng 2 lời gọi trên thì máy sẽ báo lỗi. Bởi trong lời gọi CTC các tham
4


số biến chỉ được phép thay bởi các biến cùng kiểu, khơng được là hằng(2) hay biểu
thức(x+1), cịn các tham số giá trị được phép thay thế bởi hằng, biểu thức hoặc
biến đơn. Sự thay thế phải theo đúng trật tự các tham số đã khai báo trong đầu của
CTC. Ngồi lời gọi Thamso(x,y) thì các lời gọi Thamso(x,y+1); Thamso(x,3); đều
khơng hợp lý. Đây chính là một sự khác nhau nữa giữa tham biến và tham trị.
Nhận xét: Khi đã nhận biết được sự khác nhau giữa tham biến và tham trị thì
một CTC có tham số lúc nào cần đến tham biến, lúc nào cần đến tham trị?
Ví dụ 3:
Program VD3;
Var x,y: Integer;
Procedure Hoandoi(x,y:Integer);
Var t:Integer;
Begin
t:= x; x:= y; y:= t;
End;
Begin

x:=1; y:= 2;
Hoandoi(x,y);
Writeln(‘Hai so chua hoandoi:’,x:2,y:2);
Write('x=',x:2,' y=',y:2);
Readln;
End.
Thủ tục Hoandoi(x,y) trong ví dụ này dùng để hốn đổi giá trị giữa 2 biến
nguyên x và y. Tuy nhiên khi chạy chương trình, điều này khơng xẩy ra. Giá trị của
2 biến nguyên x và y trước khi gọi thủ tục x có giá trị bằng 1, y có giá trị bằng 2 và
sau khi gọi thủ tục Hoandoi(x,y) giá trị của x, y có giá trị vẫn khơng đổi: x=1, y=2.
Vậy lỗi xảy ra do thủ tục Hoandoi(x,y) tổ chức truyền theo trị nên các giá
trị của các biến x và y không bị ảnh hưởng bởi các lệnh đổi giá trị trong thủ tục
này. Nếu sửa lại việc khai báo các tham số trong thủ tục tráo đổi là truyền theo biến
(thêm từ khoá Var trước x, y trong phần đầu của thủ tục) thì chương trình sẽ cho
kết quả như mong muốn: x=2, y=1.

5


Ví dụ 4:
Program VD4;
Var tu,mau,d:word;
Function UCLN(Var a,b:Word):Word;
Begin
While a<>b Do
If a>b Then a:= a-b
Else b:= b-a;
UCLN:= a;
End;
Begin

Write('nhap tu so:'); Readln(tu);
Write('nhap mau so:'); Readln(Mau);
d:= UCLN(tu,mau); writeln('d =:',d);
If d>1 Then
Begin
Tu:= tu Div d;
mau:= mau Div d;
End;
Writeln('phan so duoc toi gian la:',tu,'/',mau);
Readln;
End.
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 ln 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).
6


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 u cầu của bài
tố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 tốn. Cịn ở ví dụ 4 cho thấy một kết quả sai khi
truyền theo tham biến.
Ví dụ 5:
Program VD5;
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;
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
7



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.
2.2. Xây dựng một số câu hỏi trắc nghiệm và bài tập phục vụ cho tiết kiểm tra:
Câu 1: Với a là tham biến, b là tham trị thì khai báo phần đầu cho thủ tục nào sau
đây là đúng? (a, b đều có kiểu DL Integer)
A. Procedure M(Var a:Integer ; b: Integer );
B. Procedure M(a,b: Integer );
C. Procedure M(Var a,b: Integer );
D. Procedure M(a: Integer ; Var b: Integer ) ;
Đáp án: A
Câu2: Cho biết giá trị tương ứng cho các biến a, b, c, d sau khi chạy thử chương
trình :
Progam Vidu1;
Procedure Tong_hieu(a, b: Integer; Var c, d: Integer );
Begin
c:= a – b ;
d:= a + b ;
a:= a*b ;
End;
Begin
clrscr;
a:= 10; b:= 3; c:= 5; d:= 6;
Tong_hieu(a,b,c,d);
Write(a,b,c,d);
Readln;
End.
A. 30, 3, 7, 13
B. 10, 3, 7, 13

C. 10, 3, 5, 6
D. 30, 3, 5,
6
Đáp án: B
Câu 3: Số nào được in ra màn hình khi thực hiện chương trình sau?
Program c3;
Var a,b:byte;
Procedure Thu1(Var a:byte);
8


Begin
a:= 2*a; b:=b+5;
End;
Begin
a:= 3; b:= 7; Thu1(b);
a:= a+b; Writeln(a);
Readln;
End.
A. 13
B. 19
C. 22
D……. (Một đáp án khác)
Đáp án: C
Câu 4: Số nào được in ra màn hình khi thực hiện chương trình sau?
program C4;
Var x:integer;
Procedure Thaydoi( x:integer);
Begin
x:=1;

end;
Begin
x:=0; Thaydoi(x); Writeln(x:3);
readln
End.
A. 1
B. 0
C. 1 0
D. 0 1
Đáp án: B
Câu 5: Chương trình sau cho kết quả gì?
Program VD5;
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;
End.
A. 10
B. 11
C. 12
D. 13
Đáp án: D
9


Câu 6: (Ta cũng có thể có câu hỏi như sau đối với Vd5):

Hãy sửa lỗi chương trình trên để chương trình có kết quả là 12?
Đáp án: Cách 1: Function F( x:Byte):Byte;
Cách 2: Thay biểu thức (F(a)+F(a))thành biểu thức (2*F(a))
Câu 7: Với đầu thủ tục:
Procedure N( x:Integer ; Var y:Integer );
m là biến nguyên, các lời gọi sau đây lời gọi nào là hợp lệ?
A. N(m,m+3);
B. N(2,m);
C. N(m+1,4);
D. N(2,3*m+5);
Đáp án: B
Câu 8: Hãy sửa lỗi chương trình sau và cho biết chương trình sau làm việc gì?
Program C8;
Var n:integer;
Begin
Function fibo( Var n: longint):longint;
Begin
If n<3 then fibo:= 1
Else fibo:= fibo(n-1)+fibo(n-2);
End;
Write(‘nhap n:’); Readln;
Writeln(fibo(n));
Readln;
End.
Đáp án: Chương trình được sửa lỗi:
Program C8;
Var n:integer;
Function fibo(n: longint):longint;
Begin
If n<3 then fibo:= 1

Else fibo:= fibo(n-1)+fibo(n-2);
End;
10


Begin
Write(‘nhap n:’); Readln(n);
Writeln(fibo(n));
Readln;
End.
Chương trình dùng hàm để tính dãy số Fibonaxi F1, F2, …, Fn
với F1= F2=1
Fn = Fn-1 + Fn-2( n >2) .
3. Kết luận và kiến nghị.
3.1. Kết luận
Đề 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;
- 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 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.
Kết quả thu được qua thực tế áp dụng đề tài ở 1 lớp dạy và 1 lớp không dạy
của tôi trong năm học 2020-2021 như sau
1. Áp dụng với các lớp dạy
LỚP

SĨ SỐ


11A1

36

GIỎI

KHÁ

TB

YẾU

KÉM

SL

%

SL

%

SL

%

SL

%


SL

%

11

30,56

23

63,88

2

5,56

0

0

0

0

2. Ở các lớp không dạy
LỚP

SĨ SỐ

11A4


40

GIỎI

KHÁ

TB

YẾU

SL

%

SL

%

SL

%

4

10

17

42,5


19

47,5

KÉM

SL

%

SL

%

0

0

0

0

11


3.2. Kiến nghị
- Giáo viên cần chuẩn bị sẵn các chương trình vào máy hay trên khổ giấy lớn,
để tiết kiệm thời gian và các giờ học đạt kết quả cao. Học sinh có thể chạy chương
trình và thử với các bộ test khác nhau;

- Bài viết mới chỉ là một phần của CTC, tác giả rất mong có nhiều bài viết về
những vấn đề còn lại của CTC để hoàn thiện cả phần CTC.

XÁC NHẬN
CỦA THỦ TRƯỞNG ĐƠN VỊ

Thanh Hóa, ngày 15 tháng 05 năm
2021
Tơi xin cam đoan đây là SKKN của
mình viết, khơng sao chép nội dung của
người khác.

12


PHẦN IV. TÀI LIỆU THAM KHẢO
1. Hồ Sĩ Đàm – Hồ Cẩm Hà - Trần Đỗ Hùng – Nguyễn Đức Nghĩa –
Nguyễn Thành Tùng – Ngô ánh Tuyết . Tin học 11- NXB Giáo dục
2. Lê Khắc Thành – Hồ Cẩm Hà - Nguyễn Vũ Quốc Hưng. Tài liệu bồi
dưỡng thường xuyên cho GV THPT chu kỳ III (2014 – 2018).
3. Qch Tuấn Ngọc. Ngơn ngữ lập trình PASCAL (lý thuyết và bài tập).

13


MỤC LỤC
Nội dung
1. Mở đầu.
1.1. Lí do chọn đề tài.
1.2. Mục đích nghiên cứu.

1.3. Đối tượng nghiên cứu.
1.4. Phương pháp nghiên cứu.
2. Nội dung sáng kiến kinh nghiệm.
2.1. Những tình huống có thể xảy ra trong khi sử dụng tham biến và tham trị
2.2. Xây dựng một số câu hỏi trắc nghiệm và bài tập phục vụ cho tiết kiểm tra
3. Kết luận và kiến nghị.
3.1. Kết luận
3.2. Kiến nghị

Trang
1
1
1
1
1
2
2
7
10
10
11

DANH MỤC CÁC SKKN ĐÃ ĐƯỢC XẾP LOẠI CẤP NGÀNH
STT

TÊN SÁNG KIÊN KINH NGHIỆM

XẾP

NĂM HỌC

14


LOẠI
1

2

Một số biện pháp tổ chức bồi dưỡng
để nâng cao chất lượng học sinh giỏi
cấp tỉnh Trường THPT Nguyễn Xuân
Nguyên, Năm học 2011-2012
Một số giải pháp triển khai cuộc thi
KHKT giành cho học sinh trung học
nhằm đẩy mạnh phong trào đổi mới
dạy học tại trường THPT Nguyễn Xuân
Nguyên giai đoạn 2014-2018

B

2011-2012

C

2015-2016

15




×