Trong suốt quá trình giảng dạy từ khi môn Tin học được đưa vào trường PT đến nay, tôi nhận thấy rằng khi giảng dạy về nội dung của Chương 6 "Chương trình con và lập trình có cấu trúc" ph
Trang 1PHẦN MỞ ĐẦU
I LÍ DO CHỌN ĐỀ TÀI
Theo những nguyên tắc biên soạn SGK, điểm nổi bật nhất trong SGK Tin học lớp 11 là tinh thần tích hợp kiến thức, kỹ năng trong từng bài học, chú trọng tới việc thực hành Điều này tạo điều kiện cho học sinh phát triển đồng thời cả
về kiến thức và kỹ năng làm việc Điểm nổi bật thứ hai là tinh thần đổi mới phương pháp dạy học theo hướng tích cực hoá hoạt động học tập của học sinh Hiện nay trong lí luận dạy học nói chung và lí luận dạy học môn Tin học nói riêng yêu cầu sử dụng khá nhiều phương pháp: phương pháp thảo luận, phương pháp đặt câu hỏi, phương pháp chia nhóm…
Tuy nhiên với bất kỳ một phương pháp nào thì giáo viên vẫn phải có một yêu cầu chung là phải hiểu rõ về bản chất của vấn đề thì từ đó mới có khả năng sử dụng một hoặc nhiều phương pháp thích hợp để truyền đạt hay gợi mở vấn đề cho học sinh
Là một giáo viên giỏi, trước hết phải là một người học giỏi, người ta nói: Nếu anh nghe -> thì anh sẽ quên
Nếu anh thấy -> thì anh sẽ nhớ
Nếu anh làm -> thì anh sẽ hiểu
Nếu anh giảng -> thì anh sẽ tinh thông
Trong chương trình Tin học phổ thông thì chương trình Tin học lớp 11 tìm hiểu về ngôn ngữ lập trình mà cụ thể là ngôn ngữ lập trình Pascal Đây là một ngôn ngữ không chỉ chặt chẽ về mặt cú pháp mà còn chặt chẽ về mặt dữ liệu Chính vì thế, thảo chương bằng ngôn ngữ Pascal là một cơ hội tốt không chỉ rèn luyện tư duy mà còn rèn luyện tính cẩn thận và chính xác
Ngôn ngữ Pascal được dùng để viết các chương trình ứng dụng trong nhiều lĩnh vực Với văn phạm sáng sủa, dễ hiểu, với khả năng đủ mạnh, Pascal được xem là ngôn ngữ thích hợp nhất để giảng dạy ở các trường phổ thông và đại học Trong suốt quá trình giảng dạy từ khi môn Tin học được đưa vào trường PT đến nay, tôi nhận thấy rằng khi giảng dạy về nội dung của Chương 6 "Chương trình con và lập trình có cấu trúc" phần lớn học sinh đều không hiểu được cách truyền tham trị và tham biến như thế nào mà lý do chính là có một số giáo viên cũng chỉ dạy những gì mình biết chứ cũng chưa hiểu rõ bản chất của vấn đề
Từ những lý do trên, qua quá trình giảng dạy trên lớp của bản thân tôi đã chọn đề tài "Một cách nhận biết và truyền tham biến và tham trị trong Chương trình con" là đề tài Sáng kiến kinh nghiệm của mình để có thể giúp cho giáo
Trang 2viên, học sinh hiểu rõ được vấn đề tương đối phức tạp này.
II MỤC ĐÍCH CỦA SÁNG KIẾN KINH NGHIỆM
- Góp phần thúc đẩy quá trình đổi mới phương pháp dạy học theo hướng phát huy tính tích cực của học sinh
- Góp phần nâng cao kiến thức và khả năng thực hành cho giáo viên
- Giúp học sinh có khả năng nhận thức kiến thức và tự hoàn thiện kiến thức
III KHÁCH THỂ VÀ ĐỐI TƯỢNG NGHIÊN CỨU
Khách thể: Học sinh lớp 11 trường THPT Lê Văn Hưu
Đối tượng: Truyền tham biến và tham trị trong chương trình con, ngôn ngữ lập trình Pascal
IV NHIỆM VỤ NGHIÊN CỨU
Trên cơ sở nhận thức, tìm hiểu và phân tích, đề tài đưa ra các bài thực hành cụ thể về truyền tham trị và tham biến trong chương trình con, trong ngôn ngữ lập trình Pascal
V PHƯƠNG PHÁP NGHIÊN CỨU
Đề tài sử dụng các phương pháp:
- Đọc tài liệu
- Thực nghiệm
- Phân tích đánh giá
VI NHỮNG ĐÓNG GÓP MỚI
Hiệu quả và chất lượng trong dạy học phụ thuộc vào nhiều yếu tố Tuy nhiên việc giáo viên nhận thức vấn đề có sâu sắc, chính xác hay không, chuẩn bị thiết kế có chu đáo hay không cũng như trong phương pháp giảng dạy việc nêu vấn đề và giải quyết vấn đề đối với một bài học đóng một vai trò quan trọng Một cách nhận thức, cách hiểu, phân tích và đưa ra các chương trình cụ thể mà tôi đưa ra sau đây, hy vọng sẽ góp một phần nhỏ định hướng để đồng nghiệp rút kinh nghiệm trong nhiệm vụ giảng dạy tốt môn Tin học
Trang 3PHẦN NỘI DUNG
I CƠ SỞ LÍ LUẬN
Ngôn ngữ lập trình (programming language) là một tập con của ngôn ngữ
máy tính Đây là một dạng ngôn ngữ được chuẩn hóa (đối lập với ngôn ngữ tự nhiên) Nó được dùng để miêu tả những quá trình, những ngữ cảnh một cách rất chi tiết
Ngôn ngữ lập trình là một hệ thống được ký hiệu hóa để miêu tả những tính toán (qua máy tính) trong một dạng mà cả con người và máy đều có thể đọc và hiểu được
Theo định nghĩa ở trên thì một ngôn ngữ lập trình phải thỏa mãn được hai điều kiện cơ bản là:
1 Nó phải dễ hiểu và dễ sử dụng đối với người lập trình, để con người có thể dùng nó giải quyết các bài toán khác
2 Nó phải miêu tả một cách đầy đủ và rõ ràng các tiến trình (process), để
có thể chạy được trên các máy tính khác
Chương trình con (subprograms) là một phép toán trừu tượng được định
nghĩa bởi người lập trình Chương trình con có các đặc tính như sau:
Mỗi chương trình con có một điểm vào duy nhất
Chương trình gọi tạm ngừng việc thực hiện trong quá trình thực hiện chương trình con
Ðiều khiển luôn được trả về chương trình gọi khi sự thực hiện chương trình con kết thúc
Khi nói đến chương trình con, chúng ta quan tâm đến hai khía cạnh: sự định nghĩa chương trình con và lời gọi thực hiện chương trình con
Sự đặc tả chương trình con bao gồm:
* Tên của chương trình con
* Số lượng các tham số, thứ tự của chúng và kiểu dữ liệu của mỗi một tham
số
* Số lượng các kết quả, thứ tự của chúng và kiểu dữ liệu của mỗi một kết quả
* Hoạt động được thực hiện bởi chương trình con
Chương trình con biểu diễn một hàm toán học, là một ánh xạ từ tập hợp các tham số đến tập hợp các kết quả
Trang 4- Chương trình con trả về một kết quả duy nhất trong tên chương trình con thường được gọi là một hàm Cú pháp điển hình đặc tả hàm được quy định trong ngôn ngữ lập trình Pascal:
Function Ten_ham(Danh sách các tham số cùng với kiểu dữ liệu tương ứng): Kiểu kết quả trả về
Ví dụ:
Function FN(x:real; y:integer) : real
Ðặc tả này xác định hàm FN : REAL x INTEGER -> REAL
- Chương trình con trả về nhiều hơn một kết quả hoặc không có kết quả trả
về trong tên chương trình con thường được gọi là thủ tục (procedure hoặc subroutine) Cú pháp điển hình đặc tả thủ tục được quy định trong ngôn ngữ lập trình Pascal:
Procedure Ten_thu_tuc(Danh sách các tham số cùng với kiểu dữ liệu tương ứng)
Ví dụ:
Procedure SUB(X:real; Y:Integer; Var Z:Real; Var U:boolean);
Trong sự đặc tả này, tham số có tên đứng sau VAR biểu thị một kết quả hoặc một tham số có thể bị thay đổi Cú pháp của sự đặc tả này là:
Procedure SUB(X: IN Real; Y: IN Integer; Z: IN OUT Real; U: OUT
Boolean)
Thủ tục này khai báo một chương trình con với sự xác định:
SUB : Real x Integer x Real -> Real x Boolean
Các từ IN, OUT và IN OUT phân biệt ba trường hợp sau đây: IN chỉ định một tham số không thể bị thay đổi bởi cương trình con, IN OUT chỉ định một tham số có thể bị thay đổi và OUT chỉ định một kết quả
Như vậy, việc đưa ra cách nhận biết và truyền tham số sẽ làm cho học sinh hiểu rõ hơn tầm quan trọng của chương trình con đồng thời cũng như càng làm tăng khả năng tư duy của học sinh đối với các bài toán khác
II CƠ SỞ THỰC TIỄN
* Điều kiện của Nhà trường: Cũng như tình trạng chung của các trường THPT trong tỉnh nói riêng và cả nước nói chung trang thiết bị của Nhà trường còn nhiều thiếu thốn đối với tất cả các môn học chức không riêng gì bộ môn Tin học Mặt khác, trang thiết bị đối với bộ môn lại có khối lượng kinh phí lớn Vì vậy, trang thiết bị tin học còn khá khiêm tốn, thiếu thốn cả về lượng và chất số lượng máy tính ít (còn chưa đủ 2 học sinh/01 máy tính trong giờ thực hành), trang thiết bị hỗ trợ cho phòng máy hầu như không có gì
Trang 5* Điều kiện của giáo viên: Nhà trường có 03 giáo viên tin học đều đạt chuẩn, tuổi đời trẻ, có năng lực, có ý thức học hỏi để nâng cao trình độ chuyên môn của bản thân, luôn cố gắng khắc phục mọi khó khăn tận dụng mọi trang thiết bị hiện có để có những bài giảng hay và sinh động nhằm truyền tải một cách tốt nhất kiến thức tới học sinh
* Điều kiện học sinh: Hầu hết học sinh đều là con em ở nông thôn Nhưng
do kinh tế địa phương những năm gần đây phát triển mạnh, các dịch vụ Internet
và kinh doanh máy tính trên địa bàn cũng phát triển vì vậy học sinh ít nhiều đã được tiếp cận máy tính và Internet Mặt khác, đây là môn học mới lại được ứng dụng nhiều trên thực tế đời sống Vì vậy, học sinh cũng khá hứng thú và có ý thức với môn học nên trong các tiết học hầu hết các em đều hăng say xây dựng bài và tìm hiểu thực tế đối với môn học Tuy nhiên, đây là môn học khó đồng thời lại liên quan đến rất nhiều lĩnh vực khoa học tự nhiên, xã hội nên việc tiếp cận của học sinh cũng tương đối khó
III ĐẶT 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 trị), tham số biến (tham 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
Bài viết này không ngiê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 để giáo viên và 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
IV GIẢI QUYẾT VẤN ĐỀ
1 Khái niệm về tham biến và tham trị
Theo SGK Tin học 11, tham biến và tham trị được định nghĩa như sau:
* Tham trị: Trong lệnh gọi CTC, các tham số hình thức được thay bằng các tham số thự sự tương ứng là các giá trị cụ thể được gọi là các tham số giá trị
(tham trị).
Trang 6* Tham biến: Trong lệnh gọi CTC, các tham số hình thức được thay bằng
các tham số thự sự tương ứng là tên các biến được gọi là các tham số biến (tham
biến)
2 Truyền tham số khi 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 Test(x, y: integer ; var z: boolean);
Function Delta( a, b, c: real): real;
- Danh sách tham số là x, y, z, a, b
- x, y có kiểu dữ liệu Integer (số nguyên);
- a, b, c có kiểu dữ liệu real (số thực);
- z có kiểu dữ liệu boolean (logic)
Vậy trong các tham số x, y, z, a, b đâu là tham biến, đâu là tham trị?
Bằng trực quan ta dễ dàng nhận thấy:
- z là tham biến vì z có từ khoá Var đứng trước;
- x, y, a, b, c 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;
var a, b, c: Integer;
Procedure Exp(x, y: Integer; Var z: Integer );
Begin
End;
Begin
End
Nhìn vào chương trình, chủ quan người đọc có thể đưa ra kết quả
Trang 750 10 15 (*)
Nhưng kết quả nhận được sau khi chạy chương trình là:
5 10 15 (**)
Vậy tại sao lại có kết quả này?
Thật vậy, do x và y là tham trị nên khi có lời gọi Exp(a,b,c) thì x nhận được giá trị của a, y nhận được giá trị của b (có nghĩa a, b vẫn có giá trị như ban đầu a
= 10, b = 3) Nhưng còn z là tham biến nên khi có lời gọi Exp(a,b,c) thì z nhận được biến c
Mô tả thực hiện chương trình cụ thể theo thứ tự lệnh:
Lệnh Kết quả CT chính Kết quả CT con Diễn giải
(1) a = 5
(2) a = 5, b = 10
(3) a = 5, b = 10 và c = 7
Nhận xét: khi chạy chương trình thì tham số thực sự truyền cho tham biến
có kết quả thay đổi (theo CTC) còn tham số thực sự truyền cho tham trị có 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 Vidu2 ;
Var a, b: Integer ;
Procedure Hoan_doi(x, y: Integer);
var tg:Integer;
Begin
End;
Begin
Trang 8End
Kết quả xuất hiện trên màn hình khi chương trình được thực hiện:
Thủ tục Hoandoi(a,b) trong ví dụ này dùng để đổi giá trị giữa 2 biến nguyên a và b 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 a và b trước và sau khi gọi thủ tục Hoan_doi(a,b) vẫn không đổi: a = 5 và b = 10
Tại sao lại như vậy?
Lý do: trong mô tả thủ tục Hoan_doi thì x và y là tham trị nên khi có lời gọi Hoan_doi(a,b) thì x nhận được giá trị chứa trong a còn y nhận được giá trị chứa trong b
Mô tả thực hiện chương trình cụ thể theo thứ tự lệnh:
Lệnh Kết quả CT chính Kết quả CT con Diễn giải
(1) a = 5
(2) a = 5 và b = 10
Ví dụ 3:
Program Vidu3;
Var a, b: Integer ;
Procedure Hoan_doi(x: Integer; var y: Integer);
var tg:Integer;
Begin
End;
Begin
Trang 9Writeln(a:5,b:5); (3) Hoan_doi(a,b); (4) Writeln(a:5,b:5); (5) Readln;
End
Kết quả xuất hiện trên màn hình khi chương trình được thực hiện:
5 10 (*)
5 5 (**)
Trong ví dụ này khi chạy chương trình ta lại thấy chỉ có biến b thay đổi còn biến a lại được giữ nguyên
Lý do trong mô tả thủ tục Hoan_doi thì x là tham trị và y là tham biến nên khi có lời gọi Hoan_doi(a,b) thì x nhận được giá trị chứa trong a còn y nhận được biến b
Mô tả thực hiện chương trình cụ thể theo thứ tự lệnh:
Lệnh Kết quả CT chính Kết quả CT con Diễn giải
(1) a = 5
(2) a = 5 và b = 10
(4) Gọi CT con x = 5 và y = b(10) Truyền tham số
Vậy, nếu sửa lại việc khai báo các tham số trong thủ tục Hoan_doi là truyền theo biến bằng cách thay phần khai báo tên thủ tục lại như sau:
Procedure Hoan_doi(var x, y: Integer);
thì chương trình sẽ cho kết quả như mong muốn là:
5 10
10 5
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ị là một vấn đề ta cần phải quan tâm khi sửa dụng trong những chương trình cụ thể
Vì vậy, ta xét tiếp một ví dụ sau đây:
Ví dụ 4:
Program Vidu4;
Var tu,mau,d:word;
Function UCLN(Var a,b:Word):Word;
Trang 10While a<>b Do
If a>b Then a:= a-b
Else b:= b-a;
End;
Begin
Write('nhap tu so:'); Readln(tu);
Write('nhap mau so:'); Readln(Mau);
If d>1 Then
Tu:= tu Div d;
mau:= mau Div d;
Writeln(tu,'/',mau);
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ó
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 này xảy ra do hai tham số hình thức của hàm UCLN: a, b là tham biến, nên sau lời gọi d:= UCLN(tu,mau), thì a nhận được là tu; b nhận được là mau và khi đó trong quá trình thực hiện hàm
d = tu = mau dẫ đến kết quả luôn là 1/1
Để 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 phần mô tả hàm như sau:
Function UCLN(a,b:Word):Word;
Nhận xét: Việc xác định truyền theo tham trị hay truyền theo tham biến cho một tham số là không thể tuỳ ý 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
Tuy nhiên đối với một chương trình khi xử dụng CTC, việc xác định được một tham số hình thức là tham biến hoặc tham trị còn chưa đủ, ta nên nhớ một CTC được thực hiện là dựa vào lời gọi nó từ Chương trình chính Vì vậy, CTC
có thể được thực hiện nhiều lần và mỗi lần gọi giá trị các tham số có thể thay đổi: