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 (222.88 KB, 10 trang )
<span class='text_page_counter'>(1)</span> 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 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 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 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 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: “Một số sai lầm khi dùng tham biÕn vµ tham trÞ trong PASCAL”. . - 1– Mét sè sai lÇm khi dïng tham biÕn vµ tham trÞ trong PASCAL . Lop11.com.
<span class='text_page_counter'>(2)</span> S¸ng kiÕn kinh nghiÖm. Hoàng văn lập. ĐT: 01.222.243.123. B- Giải quyết vấn đề: 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ừ khoá Var đứng trước; y, a, b là tham trị vì không có từ khoá 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 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 . - 2– Mét sè sai lÇm khi dïng tham biÕn vµ tham trÞ trong PASCAL . Lop11.com.
<span class='text_page_counter'>(3)</span> 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 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êù 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 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. Ngoµ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ị? . - 3– Mét sè sai lÇm khi dïng tham biÕn vµ tham trÞ trong PASCAL . Lop11.com.
<span class='text_page_counter'>(4)</span> 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) trong ví dụ này dùng để đổ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. 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 khi dïng tham biÕn vµ tham trÞ trong PASCAL . Lop11.com.
<span class='text_page_counter'>(5)</span> 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 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ô 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 . - 5– Mét sè sai lÇm khi dïng tham biÕn vµ tham trÞ trong PASCAL . Lop11.com.
<span class='text_page_counter'>(6)</span> S¸ng kiÕn kinh nghiÖm. Hoàng văn lập. ĐT: 01.222.243.123 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.. 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 §¸p ¸n: B. B. 10, 3, 7, 13. C. 10, 3, 5, 6. D. 30, 3, 5, 6. . - 6– Mét sè sai lÇm khi dïng tham biÕn vµ tham trÞ trong PASCAL . Lop11.com.
<span class='text_page_counter'>(7)</span> S¸ng kiÕn kinh nghiÖm. Hoàng văn lập. ĐT: 01.222.243.123. 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); 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 §¸p ¸n: B Câu 5: Chương trình sau cho kết quả gì?. C. 1 0. D. 0 1. 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ũng có thể có câu hỏi như sau đối với Vd5):. D. 13. . - 7– Mét sè sai lÇm khi dïng tham biÕn vµ tham trÞ trong PASCAL . Lop11.com.
<span class='text_page_counter'>(8)</span> 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 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; 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 khi dïng tham biÕn vµ tham trÞ trong PASCAL . Lop11.com.
<span class='text_page_counter'>(9)</span> 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 đượ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.. 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 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 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ó). Bµi viÕt nµy míi chØ lµ mét phÇn cña CTC, chóng t«i mong rằng 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. Th¸ng 4 / 2008. . - 9– Mét sè sai lÇm khi dïng tham biÕn vµ tham trÞ trong PASCAL . Lop11.com.
<span class='text_page_counter'>(10)</span> 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 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(SGK thÝ ®iÓm), NXB Gi¸o dôc. 2. 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. 3. Lª Kh¾c Thµnh – Hå CÈm Hµ - NguyÔn Vò Quèc Hng. Tµi liÖu båi dưỡng thường xuyên cho GV THPT chu kỳ III (2004 – 2007). 4. 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 khi dïng tham biÕn vµ tham trÞ trong PASCAL . Lop11.com.
<span class='text_page_counter'>(11)</span>