1. Trang chủ
  2. » Luận Văn - Báo Cáo

Một số sai lầm khi dùng tham biến và tham trị trong pascal

10 12 0

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 10
Dung lượng 222,88 KB

Nội dung

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ê[r]

(1) S¸ng kiÕn kinh nghiÖm Hoàng văn lập A - §Æt ĐT: 01.222.243.123 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 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ư: 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 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 hầu hết các ngôn ngữ bậc cao tổ chức hai cách truyền tham số gọi 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 nhiÒu g©y nh÷ng kÕt qu¶ kh¸c kh«ng mong muốn, điều này dẫn đến lỗi logic khó phát Dưới đây trình bày nh÷ng sai lÇm cã thÓ x¶y sö dông hai c¸ch truyÒn tham chiÕu vµ c¸ch dïng chúng cho đúng để đạt múc đích đã đề 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 các bài toán có thuật toán đơn giản để học sinh không rơi vào việc giải thuật toán mà chú trọng đến vấn đề bài viết: “Một số sai lầm dùng tham biÕn vµ tham trÞ PASCAL”  - 1– Mét sè sai lÇm dïng tham biÕn vµ tham trÞ PASCAL  Lop11.com (2)  S¸ng kiÕn kinh nghiÖm Hoàng văn lập ĐT: 01.222.243.123 B- Giải vấn đề: Nh÷ng t×nh huèng cã thÓ xÈy 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, cÆp dÊu ngoÆc trßn Khai b¸o mét tham sè cã nghÜa lµ chØ 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 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ừ khoá Var đứng trước; y, a, b là tham trị vì không có từ khoá Var đứng trước Để thấy rõ b¶n chÊt sù kh¸c 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 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 sau 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 l¹i cã kÕt qu¶ nµy? ThËt vËy, a, b ®­îc truyÒn theo trÞ nªn 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 = cßn c, d ®­îc truyÒn theo biÕn nªn 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  - 2– Mét sè sai lÇm dïng tham biÕn vµ tham trÞ PASCAL  Lop11.com (3)  S¸ng kiÕn kinh nghiÖm Hoàng văn lập ĐT: 01.222.243.123 Nhận xét: Qua ví dụ1, sau chạy chương trình thì tham biến có kết thay đổi còn tham trị kết không thay đổi, đó chính là khác 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 nào xuất trên màn hình chương trình thực hiện: 0 0 0 0 1 1 0 Bước vào thân chương trình chính ban đầu x và y có giá trị là (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êù này có nghĩa là thao tác z thủ tục xẩy x; cụ thÓ lµ lÖnh g¸n z:= b©y giê sÏ lµ 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 ®­îc thay bëi biÕn y; gi¸ trÞ cña biÕn y ®­îc chép sang cho biến w Tức là w có giá trị Khi bước vào thân thủ tục không có liên quan nào biến y với w, vì lệnh gán w:= không ảnh hưởng gì đến giá trị y Như vậy, giá trị x in là 1, còn y là 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 lêi gäi trªn th× m¸y sÏ b¸o lçi Bëi lêi gäi CTC c¸c tham 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 biến đơn Sự thay phải theo đúng trật tự các tham số đã khai báo ®Çu cña CTC Ngoµi lêi gäi Thamso(x,y) th× c¸c lêi gäi Thamso(x,y+1); Thamso(x,3); không hợp lý Đây chính là khác tham biÕn vµ tham trÞ Nhận xét: Khi đã nhận biết khác tham biến và tham trị thì CTC có tham số lúc nào cần đến tham biến, lúc nào cần đến tham trị?  - 3– Mét sè sai lÇm dïng tham biÕn vµ tham trÞ PASCAL  Lop11.com (4)  S¸ng kiÕn kinh nghiÖm Hoàng văn lập ĐT: 01.222.243.123 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ụ này dùng để đổi giá trị biến nguyên x và y Tuy nhiên chạy chương trình, điều này không xẩy Giá trị biến nguyên x và y trước gọi thủ tục x có giá trị 1, y có giá trị và 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 c¸c gi¸ trÞ các biến x và y không bị ảnh hưởng các lệnh đổi giá trị thủ tục này Nếu sữa lại việc khai báo các tham số thủ tục tráo đổi là truyền theo biến (thêm từ khoá Var trước x, y phần đầu thủ tục) thì chương trình cho kÕt qu¶ nh­ 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 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;  - 4– Mét sè sai lÇm dïng tham biÕn vµ tham trÞ PASCAL  Lop11.com (5)  S¸ng kiÕn kinh nghiÖm Hoàng văn lập ĐT: 01.222.243.123 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 phân số 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ông thức Vì ta thấy chương trình trên trả UCLN hai số nguyên dương a và b và dùng hàm này để tính d là UCLN tử và mẫu Phân số tối giản nhận cách cùng chia tử và mẫu cho d Tuy nhiên chạy chương trình, ta luôn nhận kÕt qu¶ kh«ng mong muèn lµ 1/1 cho mäi ph©n sè VËy lçi ®©u? Lçi logic nµy xÈy 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 đồng thời các giá trị d, tu, mau và d Để chương trình cho kết đúng ta phải sửa lại việc khai báo các tham số 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 kết sai với yêu cầu bài toán Qua hai ví dụ trên đã minh hoạ các tình có thể xảy Ví dụ cho kết qu¶ sai truyÒn theo trÞ nÕu söa l¹i viÖc khai b¸o c¸c tham sè thñ tục Hoandoi là truyền theo tham biến thì chương trình cho kết đúng với yêu cÇu cña bµi to¸n Cßn ë vÝ dô cho thÊy mét kÕt qu¶ 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 trên đưa màn hình giá trị F(a)+F(a) với a = Bằng suy luận thông thường, kết đúng phải là 12 vì 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 này ta nhận kết là 12 Chương trình thực đúng lệnh mà ta viết, có điều đây xuất hiệu ứng phụ hàm F tổ chức truyền theo biến tham biến x nó Lệnh  - 5– Mét sè sai lÇm dïng tham biÕn vµ tham trÞ PASCAL  Lop11.com (6)  S¸ng kiÕn kinh nghiÖm Hoàng văn lập ĐT: 01.222.243.123 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) = và ta nhận kết 13 Trong đó biểu thức 2*F(a) gọi giá trị F(a) lần vì mà ta nhận 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 nh­ vËy n÷a NhËn xÐt: Nh­ vËy, truyÒn mét tham sè cho CTC, nÕu ta muèn b¶o vÖ gi¸ trÞ tham số đó khỏi bị CTC “ vô tình phá” thì tham số đó phải dùng là tham trị Khi đó cho phép giá trị đầu vào tương ứng có thể là 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 thì tham số đó phải là tham biến và giá trị đầu vào tương øng chØ cã thÓ lµ biÕn 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 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 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 B 10, 3, 7, 13 C 10, 3, 5, D 30, 3, 5,  - 6– Mét sè sai lÇm dïng tham biÕn vµ tham trÞ PASCAL  Lop11.com (7)  S¸ng kiÕn kinh nghiÖm Hoàng văn lập ĐT: 01.222.243.123 Câu 3: Số nào in màn 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ố nào in màn 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 §¸p ¸n: B Câu 5: Chương trình sau cho kết gì? C D 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 §¸p ¸n: D Câu 6: (Ta có thể có câu hỏi sau Vd5): D 13  - 7– Mét sè sai lÇm dïng tham biÕn vµ tham trÞ PASCAL  Lop11.com (8)  S¸ng kiÕn kinh nghiÖm Hoàng văn lập ĐT: 01.222.243.123 Hãy sửa lỗi chương trình trên để chương trình có kết 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:= Else fibo:= fibo(n-1)+fibo(n-2); End; Write(‘nhap n:’); Readln; Writeln(fibo(n)); Readln; End Đáp án: Chương trình sữa lỗi: Program C8; Var n:integer; Function fibo(n: longint):longint; Begin If n<3 then fibo:= Else fibo:= fibo(n-1)+fibo(n-2); End; 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  - 8– Mét sè sai lÇm dïng tham biÕn vµ tham trÞ PASCAL  Lop11.com (9)  S¸ng kiÕn kinh nghiÖm Hoàng văn lập ĐT: 01.222.243.123 víi F1= F2=1 Fn =Fn-1+Fn-2(n>2) C- KÕt luËn Đề tài đã thu số kết sau:  Xây dựng 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 các đề kiểm tra: tìm đáp án đúng hay sửa lỗi chương trình…  Đề tài đã ứng dụng để giảng dạy và đạt kết tốt 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 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 học đạt kết cao, 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 Học sinh có thể chạy chương trình và thử với c¸c bé test kh¸c (Tèt h¬n lµ d¹y b»ng m¸y chiÕu v× hầu hết trường nào đã có)  Bµi viÕt nµy míi chØ lµ mét phÇn cña CTC, chóng t«i mong có nhiều bài viết vấn đề còn lại CTC để hoµn thiÖn c¶ phÇn CTC Th¸ng / 2008  - 9– Mét sè sai lÇm dïng tham biÕn vµ tham trÞ PASCAL  Lop11.com (10)  S¸ng kiÕn kinh nghiÖm Hoàng văn lập ĐT: 01.222.243.123 Tµi liÖu tham kh¶o 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(SGK thÝ ®iÓm), NXB Gi¸o dôc 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(SGV thÝ ®iÓm), NXBGD 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 (2004 – 2007) Qu¸ch TuÊn Ngäc Ng«n ng÷ lËp tr×nh PASCAL (lý thuyÕt vµ bµi tËp)  - 10– Mét sè sai lÇm dïng tham biÕn vµ tham trÞ PASCAL  Lop11.com (11)

Ngày đăng: 01/04/2021, 23:25

TỪ KHÓA LIÊN QUAN

w