Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 16 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
16
Dung lượng
148 KB
Nội dung
SỞ GIÁO DỤC VÀ ĐÀO TẠO THANH HOÁ TRƯỜNG THPT QUẢNG XƯƠNG SÁNG KIẾN KINH NGHIỆM HƯỚNG DẪN HỌC SINH KHI DÙNG THAM BIẾN VÀ THAM TRỊ TRONG NGÔN NGỮ LẬP TRÌNH PASCAL ĐỂ TRÁNH NHẦM LẪN Người thực hiện: Phạm Văn Cường Chức vụ: Tổ trưởng chuyên môn SKKN thuộc lĩnh vực (mơn): Tin học THANH HĨA NĂM 2014 PHẦN I ĐẶT VẤN ĐỀ Khi giảng dạy phần chương trình (CTC) – Tin học 11 tơi nhận thấy hầu hết học sinh bỡ ngỡ với khái niệm hồn tồ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 tơi 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 tốn mà trọng đến vấn đề viết: “Hướng dẫn học sinh dùng tham biến tham trị ngơn ngữ lập trình Pasca để tránh nhầm lẫn ” PHẦN II GIẢI QUYẾT VẤN ĐỀ 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 Function Delta(Var x: integer ; y: real); 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ừ khoá 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 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 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: 0 0 0 0 1 0 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 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 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) Nhận xét: Việc tổ chức truyền theo trị hay truyền theo biến cho tham số khơng thể tuỳ tiện dẫn đến kết sai với yêu cầu toá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 yê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 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 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 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 B 10, 3, 7, 13 C 10, 3, 5, D 30, 3, 5, Đá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); 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ố 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 B C D Đá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; 10 End A 10 B 11 C 12 D 13 Đáp án: D 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