Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 19 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
19
Dung lượng
23,71 KB
Nội dung
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 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Mở đầu 1.1 Lí chọn đề tài Khi giảng dạy phần chương trình (CTC) – Tin học 11 nhận thấy hầu hết học sinh bỡ ngỡ với khái niệm hoàn toàn 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 không khỏi băn khoăn làm để học sinh hiểu nắm bắt khái niệm cách hiệu nhất, nhằm tránh hiểu lầm khái niệm tham biến tham trị Hiện hầu hết ngôn ngữ bậc cao tổ chức hai cách truyền tham số gọi CTC, truyền theo trị truyền theo biến Việc truyền tham chiếu theo hai cách khác nhiều gây kết khác không mong muốn, điều dẫn đến lỗi logic khó phát Dưới trình bày sai lầm xảy sử dụng hai cách truyền tham chiếu cách dùng chúng cho để đạt mục đích đề chương trình Bài viết khơng nghiêng thuật tốn tốn khó mà đưa tốn có thuật tốn đơn giản để học sinh không rơi vào việc giải thuật toán mà trọng đến vấn đề viết: “Một số sai lầm học sinh THPT dùng tham biến tham trị ngôn ngữ lập trình Pascal” 1.2 Mục đích nghiên cứu Giúp học sinh hiểu khái niệm then chốt "tham biến" "tham trị", biết sử dụng lập trình CTC ngơn ngữ PASCAL - Rèn luyện cho học sinh có tư 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 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Nội dung sáng kiến kinh nghiệm 2.1 Những tình xảy sử dụng tham biến tham trị Nếu CTC có danh sách tham số tham số phải khai báo phần đầu sau tên CTC, cặp dấu ngoặc tròn Khai báo tham số có nghĩa thuộc loại tham số (tham số biến hay tham số trị) có kiểu liệu gì? Ví dụ: Procedure Delta(Var x: integer ; y: real); Function Beta( a, b: real): real; Danh sách tham số x, y, a, b Với x có kiểu liệu Integer y, a, b, có kiểu số thực Vậy danh sách tham số x, y, a, b đâu tham biến, đâu tham trị? Bằng trực quan ta dễ dàng nhận thấy x tham biến x có từ khố Var đứng trước; y, a, b tham trị khơng có từ khố Var đứng trước Để thấy rõ chất khác tham biến 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 chủ quan đưa giá trị 30, 3, 7, 13 tương ứng với tham số a, b, c, d Nhưng kết qủa nhận sau chạy chương trình lại 10, 3, 7, 13 tương ứng với tham số a, b, c, d Vậy lại có kết này? Thật vậy, a, b truyền theo trị nên có lời gọi Tong_hieu(a,b,c,d) giá trị a, b giữ nguyên ban đầu a = 10, b = c, d LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com truyền theo biến nên có lời gọi Tong_hieu(a,b,c,d) giá trị c, d thay đổi c = 7, d = 13 Nhận xét: Qua ví dụ1, sau chạy chương trình tham biến có kết thay đổi cịn tham trị kết khơng thay đổi, khác tham biến 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 xuất hình chương trình thực hiện: Bước vào thân chương trình ban đầu x y có giá trị (do lệnh x:= 0, y:= 0) Khi gọi thủ tục Thamso(x,y), tham số biến thay biến x Điều có nghĩa thao tác z thủ tục xảy x Cụ thể lệnh gán z:= x:= 1, tức gán giá trị cho biến x Còn gọi thủ tục Thamso(x,y) tham số w thay biến y; giá trị biến y chép sang cho biến w Tức w có giá trị Khi bước vào thân thủ tục khơng có liên quan biến y với w, lệnh gán w:= khơng ảnh hưởng đến giá trị y Như vậy, giá trị x in 1, y Với thủ tục Procedure Thamso(Var z: Integer ; w: Integer ) lời gọi sau có hợp lý khơng? Thamso(x + 1, y) hay Thamso(2, y) Khi thay lời gọi Thamso(x,y) lời gọi máy báo lỗi Bởi lời gọi CTC tham LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com 0 số biến phép thay biến kiểu, không hằng(2) hay biểu thức(x+1), tham số giá trị phép thay hằng, biểu thức biến đơn Sự thay phải theo trật tự tham số khai báo đầu CTC Ngoài lời gọi Thamso(x,y) lời gọi Thamso(x,y+1); Thamso(x,3); khơng hợp lý Đây khác tham biến tham trị Nhận xét: Khi nhận biết khác tham biến tham trị CTC có tham số lúc cần đến tham biến, lúc 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) ví dụ dùng để hoán đổi giá trị biến nguyên x y Tuy nhiên chạy chương trình, điều không xẩy Giá trị biến nguyên x y trước gọi thủ tục x có giá trị 1, y có giá trị sau gọi thủ tục Hoandoi(x,y) giá trị x, y có giá trị khơng đổi: x=1, y=2 Vậy lỗi xảy thủ tục Hoandoi(x,y) tổ chức truyền theo trị nên giá trị biến x y không bị ảnh hưởng lệnh đổi giá trị thủ tục Nếu sửa lại việc khai báo tham số thủ tục tráo đổi truyền theo biến (thêm từ khoá Var trước x, y phần đầu thủ tục) chương trình cho kết mong muốn: x=2, y=1 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Ví dụ 4: Program VD4; Var tu,mau,d:word; Function UCLN(Var a,b:Word):Word; Begin While ab 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 sử dụng hàm UCLN(a, b) để tối giản phân số nhập từ bàn phím giá trị tử số mẫu số Nhìn vào chương trình ta khơng phải bàn đến tính đắn cơng thức Vì ta thấy chương trình trả UCLN hai số nguyên dương a b dùng hàm để tính d UCLN tử mẫu Phân số tối giản nhận cách chia tử mẫu cho d Tuy nhiên chạy chương trình, ta ln nhận kết khơng mong muốn 1/1 cho phân số Vậy lỗi đâu? Lỗi logic xảy hàm UCLN tổ chức truyền theo tham biến, nên sau lời gọi d:= UCLN(tu,mau), ta đồng thời giá trị d, tu, mau d Để chương trình cho kết ta phải sửa lại việc khai báo tham số hàm UCLN truyền theo tham trị (bỏ từ khoá Var trước a, b) LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Nhận xét: Việc tổ chức truyền theo trị hay truyền theo biến cho tham số tuỳ tiện dẫn đến kết sai với u cầu tốn Qua hai ví dụ minh hoạ tình xảy Ví dụ cho kết sai truyền theo trị sửa lại việc khai báo tham số thủ tục Hoandoi truyền theo tham biến chương trình cho kết với u cầu tốn Cịn ví dụ cho thấy kết sai 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 đưa hình giá trị F(a)+F(a) với a = Bằng suy luận thông thường, kết phải 12 a = 5, F (a) cho giá trị Tuy nhiên chạy chương trình ta nhận kết 13 Có thể sửa biểu thức F(a) +F(a) thành biểu thức 2*F(a) lúc ta nhận kết 12 Chương trình thực lệnh mà ta viết, có điều xuất hiệu ứng phụ hàm F tổ chức truyền theo biến tham biến x Lệnh x:= x + hàm F làm biến a tăng lên đơn vị gọi F(a) thực hịên biểu thức F(a)+F(a), giá trị F(a) gọi hai lần Tại lần thứ a = 5, F(a) = , lần gọi thứ hai lúc a = F(a) = ta nhận kết 13 Trong biểu thức 2*F(a) gọi giá trị F(a) lần mà ta nhận kết 12 Nếu sửa lại việc truyền cho tham biến x hàm F theo trị khơng cịn khác Nhận xét: Như vậy, truyền tham số cho CTC, ta muốn bảo vệ giá trị tham số khỏi bị CTC “ vơ tình phá” tham số phải dùng tham trị Khi cho phép giá trị đầu vào tương ứng hằng, biểu LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com thức biến nguyên Còn tham số muốn dùng để lấy kết (những biến đổi) chương trình đem lại tham số phải tham biến giá trị đầu vào tương ứng biến 2.2 Xây dựng số câu hỏi trắc nghiệm tập phục vụ cho tiết kiểm tra: Câu 1: Với a tham biến, b tham trị khai báo phần đầu cho thủ tục sau đúng? (a, b 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 biến a, b, c, d sau 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 Đáp án: B Câu 3: Số in hình thực chương trình sau? Program c3; Var a,b:byte; Procedure Thu1(Var a:byte); LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Begin a:= 2*a; b:=b+5; End; Begin a:= 3; b:= 7; Thu1(b); a:= a+b; Writeln(a); Readln; End A 13 Đáp án: C Câu 4: Số in hình thực 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 D.0 Đáp án: B Câu 5: Chương trình sau cho kết 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 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Câu 6: (Ta có câu hỏi sau Vd5): Hãy sửa lỗi chương trình để chương trình có kết 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 biến nguyên, lời gọi sau lời gọi 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 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