Tải bản đầy đủ (.doc) (19 trang)

Rèn luyện kĩ năng cho học sinh khi viết chương trình con bằng ngôn ngữ lập trình pascal

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 (464.34 KB, 19 trang )

S
Ở GIÁO DỤC VÀ ĐÀO TẠO THANH HÓA

TRƯỜNG THPT TRẦN PHÚ NGA SƠN
----------

SÁNG KIẾN KINH NGHIỆM

RÈN LUYỆN KĨ NĂNG CHO HỌC SINH KHI VIẾT
CHƯƠNG TRÌNH CON BẰNG NGÔN NGỮ
LẬP TRÌNH PASAL

Người thực hiện: Nghiêm Thị Nhung
Chức vụ: Giáo viên
Đơn vị công tác: Trường THPT Trần Phú
SKKN thuộc môn: Tin học

THANH HÓA NĂM 2017


MỤC LỤC
Nội dung
Trang
MỤC LỤC…………………………………………………………... 1
1. MỞ ĐẦU………………………………………………………….. 2
1.1. Lý do chọn đề tài………………………………………………... 2
1.2. Mục đích nghiên cứu……………………………………………. 2
1.3. Đối tượng nghiên cứu…………………………………………… 2
1.4. Phương pháp nghiên cứu………………………………………... 2
2. NỘI DUNG SÁNG KIẾN KINH NGHIỆM……………………. 2
2.1. Cơ sở lý luận của sáng kiến kinh nghiệm……………………….. 2


2.2.Thực trạng của vấn đề trước khi áp dụng sáng kiến kinh nghiệm.. 4
2.3. Các giải pháp đã sử dụng để giải quyết vấn đề…………………. 4
A. Tóm tắt lí thuyết………………………………………………….. 4
1. Khái niệm chung về chương trình con……………………………. 4
2. Cấu trúc và vị trí của chương trình con trong chương trình chính... 4
3. Biến toàn cục và biến cục bộ……………………………………… 6
4. Cách truyền tham số trong chương trình con……………………... 6
5. Phân biệt cách sử dụng hàm và thủ tục…………………………… 7
6. Tính đệ qui của chương trình con…………………………………. 7
7. Nguyên tắc viết một chương trình con……………………………. 8
8. Phương pháp chung khi lập trình chương trình con………………. 8
B. Bài tập áp dụng…………………………………………………… 9
1. Một số bài tập về thủ tục………………………………………….. 9
2. Một số bài tập về hàm……………………………………………..

12

3. Một số bài tập liên quan đến thủ tục và hàm

16

2.4. Hiệu quả của sáng kiến kinh nghiệm……………………………. 16
3. KẾT LUẬN VÀ KIẾN NGHỊ…………………………………… 17
3.1. Kết luận………………………………………………………….

17

3.2. Kiến nghị………………………………………………………... 17
Tài liệu tham khảo…………………………………………………… 18
1. MỞ ĐẦU

1.1/ Lí do chọn đề tài
Trong bối cảnh toàn ngành Giáo dục và Đào tạo đang nỗ lực đổi mới phương
pháp dạy học theo hướng phát huy tính tích cực chủ động của học sinh trong
2


hoạt động học tập. Chúng ta có thể thấy định hướng đổi mới phương pháp dạy
học đã được khẳng định, không còn là vấn đề tranh luận. Cốt lõi của việc đổi
mới phương pháp dạy học ở trường phổ thông là giúp học sinh hướng tới việc
học tập chủ động, chống lại thói quen học tập thụ động.
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.
Trong suốt quá trình giảng dạy từ khi môn Tin học được đưa vào trường phổ
thông đế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 sử dụng chương trình con như thế nào khi viết chương trình 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 bản thân tôi đã chọn
đề tài “ Rèn luyện kĩ năng cho học sinh khi viết chương trình con bằng ngôn ngữ
lập trình Pascal” là đề tài Sáng kiến kinh nghiệm của mình để có thể giúp cho
giáo viên, học sinh hiểu rõ được vấn đề tương đối phức tạp này.
1.2/ Mục đích nghiên cứu
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, chủ động 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.
1.3/ Đối tượng nghiên cứu

Là những học sinh có lực học từ khá trở xuống trong chương trình THPT áp
dụng cho khối lớp 11.
1.4/ Phương pháp nghiên cứu
Tổng hợp nghiên cứu các tài liệu liên quan đến chương trình con và các bài
tập có sử dụng chương trình con.
2. NỘI DUNG
2.1/ Cơ sở lí luận
Bản thân là một giáo viên giảng dạy môn Tin học tại trường THPT Trần Phú.
Với chất lượng học sinh đầu vào thấp, bản thân tôi được phân công dạy các lớp
đại trà nên học sinh có học lực khá trở xuống chiếm khoảng ¾ lớp. Vì vậy, khi
dạy về “Cách viết và sử dụng chương trình con” tôi thấy rằng phần đông các em
chưa hiểu rõ được bản chất của chương trình con cũng như cách xây dựng
chương trình con để viết chương trình. Đa số các em chỉ hiểu một cách thụ
động và không có tính tư duy, sáng tạo trong việc sử dụng chương trình con cho
từng bài toán cụ thể. Các em chỉ nhớ được các chương trình con mẫu trong
SGK, với những chương trình con khác hầu như các em không biết xây dựng
hoặc số ít các em cũng chỉ đưa ra được những thao tác tương tự như bài mẫu.

3


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ư: Hàm (Function), thủ tục (Procedure), 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ự, lời
gọi chương trình con,…
Đ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 hàm và thủ tục, giữa tham trị và tham biến, giữa tham số thực sự
và tham số hình thức, giữa biến chung (biến toàn cục) và biến riêng (biến cục

bộ).
Khi trình bày vấn đề này cho học sinh, tôi đã thực hiện như sau:
+ Trước hết, đặt câu hỏi chương trình con là Thủ tục (Procedure) hay Hàm
(Function)? Giải quyết chương trình con là Function khi và chỉ khi thỏa mãn
đồng thời các yêu cầu sau:
– Nếu ta muốn nhận lại một và chỉ một kết quả mà thôi.
– Kết quả phải là kiểu xác định ( kiểu vô hướng).
– Có cần dùng tên của Hàm để viết trong các biểu thức hay không ?
– Nếu không thỏa mãn các tính chất trên thì chương trình con là
Procedure.
Ví dụ :
Function BinhPhuong( x: real) : real;
Begin
BinhPhuong := x * x;
End;
(*---------------------------------------------*)
Procedure BinhPhuong( x : real; var x2: real);
Begin
x2:=x*x;
End;
Xem cách tính c= a2 + b2
- Nếu dùng Function : c: = BinhPhuong(a) + BinhPhuong(b);
- Nếu dùng Procedure với một biến trung gian tg:
BinhPhuong(a,tg); c:=tg; {c:=a2}
BinhPhuong(b,tg); c:= c+tg; {c:= a2 + b2}
+ Sau cùng, giải quyết vấn đề tham số của chương trình con.
Giải quyết :
– Chương trình con có cần tham số không?
– Nếu đối tượng của chương trình con là biến toàn cục thì biến này không
cần đưa vào làm tham số.

Làm như vậy tôi thấy có hiệu quả. Học sinh hiểu rõ được về bản chất của
từng bài toán cụ thể, các em dễ dàng tiếp cận được những yêu cầu khó khăn hơn
trong các bài toán khác nhau. Đó chính là những căn cứ để tôi viết đề tài này.
2.2/ Thực trạng vấn đề
4


Chương trình con là một nội dung khó, kiến thức rộng, phương pháp nhiều
đối với học sinh mà đặc biệt là kiến thức về tham số, đòi hỏi học sinh phải có
khả năng tư duy, óc phán đoán để định hướng tìm phương pháp thích hợp, tuy
nhiên mức độ học sinh trường THPT không đồng đều, học sinh khá giỏi chiếm tỉ
lệ ít. Với học sinh có mức học khá trở xuống các em thường bỏ qua hoặc có làm
thì làm không đúng, không định hình được nên viết như thế nào. Bên cạnh đó,
thời lượng một tiết học sẽ không đủ để giáo viên vừa viết chương trình , vừa
giảng giải và tổ chức hoạt động trong lớp học.
Như ví dụ tính bình phương ở trên, tôi đã cho lớp 11B làm thử kết quả 30/39
học sinh không làm được, 5/39 học sinh làm nhưng kết quả sai, có 4/39 em học
giỏi trong lớp viết được chương trình và cho kết quả đúng.
2.3/ Giải pháp thực hiện
Nêu ra cách chương trình giải quyết một số bài toán thường gặp trong toán
học và các bài tập liên quan để học sinh hiểu rõ hơn cách viết chương trình con
trong pascal từ đó có thể tự mình giải quyết các bài toán tương tự.
Bằng những kiến thức về Tin học và những kinh nghiệm của bản thân trong
công tác giảng dạy bộ môn Tin học, để phát triển khả năng tư duy sáng tạo cho
học sinh trong quá trình hình thành kỹ năng viết chương trình tôi đã sử dụng
phương pháp gợi động cơ kích thích tính tích cực, sự sáng tạo, say mê, tìm tòi,
học hỏi của học sinh qua cách xây dựng chương trình con được trình bày qua
các giải pháp dưới đây:
A. Tóm tắt lý thuyết
1. Khái niệm chung về chương trình con (CTC)

Trong khi lập trình chúng ta thường gặp những đoạn chương trình được lặp
đi lặp lại nhiều lần ở những chỗ khác nhau. Để tránh rườm rà, những đoạn
chương trình này được thay thế bởi các đoạn CTC tương ứng và khi cần, ta chỉ
việc gọi đoạn CTC đó ra mà không phải viết lại cả đoạn chương trình đó.
Đối với những bài toán lớn và phức tạp sẽ tương ứng với một chương trình
có thể rất lớn và dài. Do đó, việc gỡ rối và hiệu chỉnh sẽ rất khó khăn. Ta có thể
phân tách vấn đề phức tạp đó ra thành các vấn đề nhỏ hơn để dễ kiểm tra, gỡ rối
từng khối một và sau đó ghép thành một chương trình lớn. Mỗi CTC có thể
phần công cho một lập trình viên hoặc một nhóm cán bộ lập trình đảm nhiệm.
Đó là ý tưởng cơ bản của lập trình có cấu trúc.
Chương trình con là một dãy lệnh mô tả một số thao tác nhất định và có thể
được thực hiện ở nhiều vị trí trong chương trình.
2. Cấu trúc và vị trí của chương trình con trong chương trình chính:
Progam Tên_chương_trình_chính;
Uses Khai báo thư viện sử dụng;
Const Khai báo hằng;
Type Khai báo kiểu dữ liệu;
Var Khai báo biến;
Khai báo chương trình con
BEGIN {Chương trình chính}
5


Các lệnh của chương trình chính;
Lời gọi thực hiện hàm và thủ tục;
END.
Như vậy, phần khai báo chương trình con nằm ở phần cuối phần khai báo của
chương trình chính.
a. Khai báo và lời gọi thủ tục
– Khai báo:

PROCEDURE <tên thủ tục>(Danh sách các tham số hình thức);{không có
giá trị trả về}
{Khai báo các biến riêng của thủ tục (nếu cần)}
BEGIN
<các câu lệnh của thủ tục>;
END;
Ví dụ:
Procedure inso(n:integer);
Var i:integer;
Begin
For i:=1 to n do
write(i:5);
End;
– Lời gọi thủ tục
Cấu trúc: <tên thủ tục>(danh sách các tham số thực);
Ví dụ: inso(6);
b. Khai báo và lời gọi hàm
– Khai báo:
FUNCTION <tên hàm>(danh sách các tham số hình thức):của hàm>;
{Khai báo các biến riêng của hàm (nếu cấn)}
BEGIN
<các lệnh trong thân hàm>;
<tên hàm>:=<Giá trị>;
END;
Chú ý: Luôn có phép gán tên hàm cho giá trị để hàm trả về giá trị khi được gọi
Ví dụ: Tính tổng của 2 số nguyên x và y
Function tong(x,y:integer):integer; {Do có giá trị trả về}
var s:integer;
begin

s:=x+y;
tong:=s;
end;
– Lời gọi hàm:
Cấu trúc: <tên hàm>(danh sách các tham số thực);

6


* Lưu ý: Lời gọi hàm khác lời gọi thủ tục ở chỗ: Lời gọi hàm phải được đặt
trong một lệnh hoặc trong một lời gọi chương trình con khác còn lời gọi thủ tục
thì không.
Ví dụ về lời gọi hàm: kq:=tong(4,5);
3. Biến toàn cục và biến cục bộ
Biến toàn cục là biến được khai báo trong chương trình chính. Các biến này
có thể được dùng ở mọi nơi trong chương trình và tồn tại trong suốt thời gian
làm việc của chương trình.
Biến cục bộ (biến địa phương) là các biến được khai báo trong chương trình
con. Các biến này chỉ được sử dụng trong phạm vi chương trình con mà nó được
khai báo. Sau khi kết thúc chương trình con các biến này sẽ không tồn tại.
Ví dụ:
PROGRAM vidu;
Var a,b,c:integer; {a,b,c là 3 biến toàn cục}
PROCEDURE thutuc(n:integer);{n là tham số hình thức}
Var i:integer; {i là biến cục bộ}
Begin
For i:=1 to 10 do write(i);
End;
BEGIN
a:=5; b:=6; c:=8;

thutuc( a);{a là tham số thực sự}
thutuc( b); {b là tham số thực sự}
thutuc( c); {c là tham số thực sự}
readln;
END.
Trong trường hợp biến cục bộ trùng tên với biến toàn cục thì máy không bị
nhầm lẫn mà sẽ thực hiện trên biến cục bộ. Biến toàn cục không bị ảnh hưởng.
4. Cách truyền tham số cho chương trình con (CTC)
CTC không cần có tham số (sau tên CTC) nếu không dùng đến chúng hoặc
dùng trực tiếp biến toàn cục.
Khi truyền tham số các tham số trong lời gọi CTC phải đúng thứ tự và kiểu
tương ứng với khi khai báo chương trình con.
Trong khi thực hiện CTC, các biến cục bộ và các tham số giá trị có thể bị
thay đổi nhưng không ảnh hưởng đến các biến ở bên ngoài. Trái lại, mọi thay
đổi của tham biến ở trong CTC sẽ kéo theo sự thay đổi giá trị của các tham số
thực sự tương ứng ở ngoài chương trình chính.
Khi kết thúc CTC, máy sẽ giải phóng bộ nhớ của các biến cục bộ và các đối
số.
Ví dụ:
Procedure inso(a:integer; ch:char);
begin
7


{các lệnh của chương trình con}
end;
{lời gọi}
inso(13,’a’); {lời gọi đúng}
inso(‘a’,13); {loi gọi sai}
inso(13);{lời gọi sai}

– Tham số hình thức (đối) là các tham số sau tên hàm và thủ tục trong khai báo.
– Tham số thực sự là các tham số sau tên hàm và thủ tục trong lời gọi.
– Tham số biến (tham biến): Là các tham số được khai báo sau từ khóa Var. Các
tham số thực phải là các biến chứ không được là giá trị. Tham biến có thể được
thay đổi trong chương trình con và sau khi ra khỏi chương trình con nó vẫn giữ
giá trị thay đổi đó.
– Tham số giá trị (tham trị): Là các tham số được khai báo mà không đứng sau
từ khóa Var. Các tham số thực có thể là các giá trị, hằng, biến. Tham trị có thể
thay đổi trong chương trình con nhưng sau khi kết thúc chương trình con giá trị
của nó trở về như ban đầu.
– Các tham số trong hàm luôn là các tham trị, các tham số trong thủ tục có thể là
tham trị hoặc tham biến.
5. Phân biệt cách sử dụng hàm và thủ tục
Hàm khác thủ tục ở chỗ hàm trả về một giá trị cho lệnh gọi thông qua tên
hàm còn thủ tục thì không.
*Dùng hàm
– Kết quả của bài toán trả về 1 giá trị duy nhất (kiểu vô hướng, kiểu string hoặc
kiểu con trỏ).
– Lời gọi chương trình con cần nằm trong các biểu thức tính toán.
*Dùng thủ tục
– Kết quả của bài toán không trả về giá trị nào hoặc trả về nhiều giá trị hoặc trả
về kiểu dữ liệu có cấu trúc (Array, Record, File)
– Lời gọi chương trình con không nằm trong các biểu thức tính toán.
6. Tính đệ quy của chương trình con
Một chương trình con mà trong chương trình con này lại dùng chính nó để
tính toán gọi là chương trình đệ qui.
Ta xét ví dụ sau: Nhập vào một số n và tính n!
Ta đã biết n! = 1 nếu n =0 trong trường hợp n>=1 ta có n!=n*(n-1)!
Hàm tính n! như sau:
Function Giaithua(n:integer):longint;

Begin
if n=0 then giai_thua:=1
else Giaithua:=n*Giaithua(n-1);
End;
– Lưu ý:
+ Khi sử dụng đệ quy phải có điều kiện kết thúc đệ quy (trường hợp suy biến).
8


Trong ví dụ ta xét điều kiện kết thúc đệ quy chính là n=0. Nếu không có điều
kiện kết thúc này chương trình của ta sẽ lặp vô hạn.
+ Luôn có lời gọi đệ quy, trong trường hợp trên là lời gọi giai_thua(n-1);
7. Nguyên tắc viết một chương trình con
Một chương trình con phải viết như là modul độc lập không phụ thuộc
chương trình chính.Muốn vậy phải viết theo nguyên tắc sau:
7.1. Dùng danh sách biến hình thức để nhận các dữ liệu truyền vào
CTC sử dụng dữ liệu hoặc biến của chương trình chính thông qua biến hình
thức, không dùng trực tiếp các dữ liệu của chương trình chính
7.2.Biến của chương trình con
Các tên biến dùng trong chương trình con phải khai báo ở chương trình con
(biến riêng), không dùng biến của chương trình chính trong chương trình con.
8. Phương pháp chung khi lập trình chương trình con là:
8.1.Trước hết hãy tạo chương trình chính cùng với các tên chương trình con
Thí dụ khi giải phương trình bậc hai, trước tiên hãy viết như sau:
PROGRAM Giai_PT_Bac2;
Begin
DocvaTinhDelta;
If Delta=0 then DeltaKhong
Else
If Delta>0 then DeltaDuong

Else DeltaAm;
End.
Trong đó DeltaKhong, DeltaDuong, DeltaAm là 3 tên chương trình con mà bạn
sẽ hình thành tiếp theo với các khung gồm tên chương trình con cùng với hai từ
khóa Begin và End; vừa đủ để khi dịch thì chương trình dịch không báo lỗi về
các chương trình con này.
PROGRAM Giai_PT_Bac2;
{--------------------------------------------------------------------------}
Procedure DeltaKhong;
Begin
End;
{-------------------------------------------------------------------------}
Procedure DeltaDuong;
Begin
End;
{-------------------------------------------------------------------------}
Procedure DeltaAm;
Begin
End;
{------------------------------chương trình chính---------------------}
Begin
DocvaTinhDelta;
9


If Delta=0 then DeltaKhong
Else If Delta>0 then DeltaDuong
Else DeltaAm;
End.
8.2. Tiếp theo mới là đến việc hoàn thiện từng chương trình con một cách riêng

rẽ.
Bắt đầu cho chạy chương trình thì tôi hướng dẫn học sinh cho chạy thử dần
với từng chương trình con một. Nên làm dứt điểm, làm xong từng chương trình
con một. Mỗi chương trình con như vậy nên thử một vài giá trị đặc biệt để xem
có lỗi về mặt thuật toán, về mặt tính toán hay không.
B. Bài tập áp dụng
Vì sáng kiến kinh nghiệm này chỉ dùng cho đối tượng là những học sinh có
học lực khá trở xuống (đa số là những học sinh có lực học trung bình), cho nên
những bài tập tôi đưa ra sau đây là tương đối cơ bản.
1. Một số bài tập về thủ tục
Bài tập 1. Giải và biện luận phương trình bậc nhất: ax+b=0 với a=4.5, b=13.5 và
với các cặp a,b tạo bởi a=-1, a=0, a=1, b=0, b=1, b=2
Ta viết một thủ tục có nhiệm vụ giải và biện luận phương trình ax+b=0 với
hai tham số a,b tùy ý và gọi thực hiện thủ tục này 10 lần ứng với các giá trị cụ
thể của a,b cho trong giả thiết.
Phân tích:
Khi gọi Giaipt(4.5,13.5); là ta yêu cầu máy thực hiện thủ tục Giaipt với tham
số a=4.5 và b=13.5. Hai vòng lặp for xác định 9 cặp giá trị i,j cụ thể và cứ mỗi
lần như vậy lại gọi thực hiện thủ tục Giaipt với tham số a=i, b=j tương ứng.
For i:=-1 to 1 do
For j:=0 to 2 do Giaipt(i,j);
Do tách riêng biệt việc giải phương trình ax+b=0 thành một thủ tục nên số
lệnh trong thân chương trình chính giảm đi, nổi bật được thuật toán chính của
chương trình.
Ở đây, ta chọn chương trình con Giaipt là thủ tục chứ không phải là hàm vì
phương trình ax+b=0 có thể vô nghiệm hoặc vô số nghiệm (khi a=0). Thành ra
ta không tìm được một giá trị thích hợp để gán cho tên hàm. Vậy kết quả giải
phương trình phải xuất ra ngay trong chương trình con, đó là công việc của thủ
tục.
Chương trình:

Program Bai1;{giải phương trình bậc nhất ax+b=0 bằng thủ tục}
Uses crt;
Var i,j: integer;
Procedure Giaipt (a,b:real);
Begin
Writeln(‘giai phuong trinh:’,a:4:1,’x+’,b:4:1,’=0’);
If a<>0 then writeln(‘nghiem x=’,-b/a:4:2)
else
10


If b<>0 then writeln(‘phuong trinh vo nghiem’)
else writeln(‘phuong trinh vo so nghiem’);
End;
BEGIN{thân chương trình chính}
Clrscr;
Writeln(‘ket qua giai phuong trinh’);
Giaipt(4.5,13.5);
For i:=-1 to 1 do
For j:=0 to 2 do Giaipt(i,j);
Readln;
END.
Bài tập 2. Nhập vào một mảng một chiều A1,A2,…,AN chứa các số nguyên sau
đó sắp xếp dãy tăng rồi in ra màn hình.
Phân tích:
Có thể chia bài toán ra thành 3 công việc lớn sau:
a- Nhập dãy số A1,A2,…,AN.
b- Sắp xếp dãy A1,A2,…,AN tăng
c- In dãy A1,A2,…,AN ra màn hình
Mỗi việc a,b,c thuộc về một lĩnh vực riêng nên có thể xây dựng thành các

thủ tục độc lập với nhau. Để liên kết chúng lại, trong chương trình chính ta chỉ
cần gọi tên các thủ tục này theo thứ tự a,b,c với các tham số thích hợp.
– Các chương trình con trên không cần trả về một giá trị cụ thể nào nên dùng
thủ tục.
– Đối với thủ tục nhập mảng cần phải giữ lại các thay đổi bên trong nên sử
dụng tham số biến.
– Đối với thủ tục sắp xếp cần giữ lại các giá trị sau khi sắp xếp nên khai báo
mảng là tham số biến, số lượng phần tử không thay đổi nên dùng tham trị.
Hướng dẫn:
- Khai báo một mảng chứa các số nguyên.
- Nhập phần tử vào cho mảng.
- Duyệt mảng và so sánh các phần tử theo giải thuật sau:
For i:=1 to N-1 do
For j:=i+1 to N do
If A[i] > A[j] then
Begin
tg:=A[i];
A[i]:=A[j]
A[j]:=tg;
End;
Chương trình:
Program sx_dayso;
Uses crt;
11


Const Nmax = 250;
Type ArrInt = Array[1..Nmax] of integer;
Var
A: ArrInt; N: integer;

Procedure Nhap_Mang(var A: ArrInt; var N: integer; ten:char);{Nhập N giá trị
vào mảng A với tên mảng là ten}
Var i: integer;
Begin
Write(‘Nhap day’,ten,’.’);
For i:=1 to N do
Begin
Write(ten,’[‘,i,’]=’);
Readln(A[i]);
End;
End;
Procedure Sap_tang(var A: ArrInt; N: integer);
Var i, j,tg: integer;
Begin
For i:=1 to N-1 do
For j:=i+1 to N do
If A[i] > A[j] then
Begin
tg:=A[i];
A[i]:=A[j]
A[j]:=tg;
End;
Procedure Xuat_mang(A: ArrInt; N: integer; ten:char);{Hiện N giá trị của mảng
A ra màn hình}
Var i: integer;
Begin
Writeln(‘Day’,ten,’nhu sau:’);
For i:=1 to N do Write(A[i]: 10:1);Writeln
End;
BEGIN

Clrscr;
Write(‘so luong so cua day A,N=’); readln(N);
Nhap_mang(A,N,’A’);
Sap_tang(A,N);
Xuat_mang(A,N,’A’)
Readln
END.
Thủ tục Nhap_mang có 3 tham số hình thức là A, N và ten. Nhiệm vụ của nó
là nhập dữ liệu cho mảng A gồm N phần tử. Tương tự, thủ tục Sap_tang có
12


nhiệm vụ sắp xếp N phần tử của dãy A thành dãy tăng. Thủ tục Xuat_mang sẽ in
ra N phần tử của dãy A .
Khi một tham số được khai báo trong chương trình con, nó có thể có hoặc
không có từ khóa Var ở đằng trước. Ví dụ, thủ tục Sap_tang, tham số A đi sau từ
khóa Var, còn tham số N thì không. A gọi là tham biến còn N là tham trị.
Bài tập 3. Viết chương trình con tìm max, min của ba số nguyên. Chương trình
chính: nhập 3 số nguyên. Tìm số bé nhất, số lớn nhất. Thông báo kết quả ra màn
hình.
Chương trình:
Program Tim_minmax;{phương án 1 dùng 1 CTC dạng thủ tục}
Uses crt;
Var a,b,c,min,max: integer;
Procedure minmax(a,b,c:integer; var min,max:integer);
Begin
min:=a; if min>b then min:=b; if min>c then min:=c;
max:=a; if maxEnd;
BEGIN

Clrscr;
write(‘Nhap a,b,c=’); readln(a,b,c);
minmax(a,b,c,min,max);
Writeln(‘Min=’,min,’Max=’,max);
Readln;
END.
2. Một số bài tập về hàm
Bài tập 1. Viết chương trình con tính an.
Sau đây là một chương trình được viết ra với những lỗi mà học sinh mới học
thường hay mắc phải
Chương trình viết sai :
Var b,m,x:real;
Function Amu(a:real; n:real):real;
Var t:real;
Begin
Write(‘a,n=’); readln(a,n);
If a<=0 then
Begin
Writeln(‘khong tinh duoc’);
{dừng chương trình không tính nữa}
Halt;
End
Else
Begin
t:=Exp(n*ln(a));
13


Amu:=t;
End;

End;
{-------------------------------chương trình chính ---------------------------------------}
Begin
{tính b mũ m}
Write(‘b=’); readln(b);
Write(‘m=’); readln(m);
x:=Amu(b,m);
Writeln(b,’mu’, m, ‘=’, x);
Readln;
End.
Trong chương trình trên, ta thấy có các điểm cần phải sửa:
1. Khai báo
Function Amu(a:real;n:real):real;
Có thể thay bằng khai báo sau cho gọn, đẹp:
Function Amu(a,n:real):real;
2. Đã có khai báo tham số của Function là a và n thì việc đọc:
Writeln(‘a,n=’); readln(a,n);
ở trong CTC là hoàn toàn sai, không chấp nhận được.
3. Việc khai báo biến địa phương t là có thể được, song hoàn toàn không cần
thiết vì ta có thể thay:
t:=Exp(n*ln(a));
Amu:=t;
bằng một dòng lệnh gọn hơn (kèm theo việc bỏ khai báo biến t):
Amu:=Exp(n*ln(a));
4. Việc khai báo biến x cũng không cần thiết nếu chỉ có nhu cầu viết ra giá trị a
mũ n. Ta có thể viết luôn Amu(b,m) vào trong thủ tục writeln;
Writeln(b, ‘mu ‘, m, ‘=’, Amu(b,m));
Chương trình được sửa lại là:
Var b,m,x: real;
Function Amu(a,n:real):real;

Begin
If a<=0 then
Begin
Writeln(‘khong tinh duoc ham mu voi a am!’);
Halt;
End
Else
Amu:=Exp(n*ln(a));
End;

14


{------------------------------------ chương trình chính ---------------------------------}
BEGIN
{tinh b mu m}
Write(‘b=’); readln(b);
Write(‘m=’); readln(m);
x:=Amu(b,m);
Writeln(b,’mu’, m, ‘=’, Amu(b,m)); Readln;
END.
Nếu Funtion Amu được viết như sau:
Function Amu(a,n:real):real;
Begin
If a<=0 then
Begin
Writeln(‘khong tinh duoc ham mu voi a am!’);
Halt;
End
Else

Writeln(‘a mu n =’, Exp(n*ln(a));
End;
Thì lỗi là: hàm Amu sẽ không nhận được giá trị gì khi ra khỏi Function. Không
nên dùng các thủ tục viết ngay kết quả ở trong Function theo kiểu trên. Nếu
trong các CTC không dùng lệnh Halt để dừng chương trình lại thì sau khi thông
báo sai xong, chương trình sẽ tiếp tục chạy với giá trị của Amu là không xác
định. Nên chuyển việc kiểm tra miền giá của các biến ra ngoài CTC.
Bài tập 2. Lập chương trình con tính N!
Bước 1: CTC là Function hay Procedure?
Ta thấy N! chỉ nhận lại một kết quả thuộc loại vô hướng nên hoàn toàn
có thể lập Function tính N!. Song điều đó không bắt buộc người dùng
phải lập là Function. Vấn đề chỉ còn phụ thuộc một yếu tố nữa: nếu
người sử dụng muốn dùng CTC trong các biểu thức tính toán thì nó
phải là Function.
Bước 2: Tham số CTC là N
Câu hỏi đặt ra sẽ là tham số giá trị hay tham số biến.Ta thấy việc tính
toán N! không có nhu cầu thay đổi N. Vậy N là tham số giá trị, do đó
không cần phải khai báo với từ khóa Var.
Bước 3: Đặt tên cho Fuction là N! có được không?
Không được vì Pascal không cho phép dùng các dấu chấm câu để đặt tên.
Chúng ta phải đặt tên khác, ví dụ GT.
Bước 4: Viết chương trình:
Function GT(N:integer):integer;
Var i,T:integer;
Begin
If N=0 then GT:=1
15


Else

Begin
T:=1;
For i:=1 to N do T:=T*i;
GT:=T;
End;
End;
Giải thích thêm:
Trong CTC ta khai báo biến i, T là các biến địa phương vì biến i,T chỉ tồn tại
một cách tạm thời. Sau khi kết thúc tính toán N! trong CTC thì ta không có nhu
cầu dùng đến i và T nữa.
Điểm chú ý thứ hai thuộc về nguyên tắc là tên của Function (ở đây là GT) chỉ
nên dùng để nhận kết quả (GT:=T), tên của Function chỉ nên viết ở vế trái của
phép gán để nhận giá trị của biểu thức. Không được dùng thẳng GT trong khi
tính toán ở vế trái của phép gán. Tức là nên tránh viết:
For i:=1 to N do GT:=GT*i;
Hoặc có thể chương trình được viết như sau (sử dụng tính đệ qui của CTC)
Function Giaithua(N:integer):integer;
Begin
If N=0 then Giaithua:=1
Else Giaithua:=n*Giaithua(n-1);
End;
Bài tập 3. Viết chương trình con tìm max, min của ba số nguyên. Chương trình
chính: nhập 3 số nguyên. Tìm số bé nhất, số lớn nhất. Thông báo kết quả ra màn
hình.
Chương trình:
Program Tim_minmax;{phương án 2 dùng 2 CTC dạng hàm}
Uses crt;
Var a,b,c,kq1,kq2: integer;
Function min(a,b,c:integer):integer; {dữ liệu trả về là số nguyên}
Var tg:integer;{sử dụng biến trung gian tg}

Begin
tg:=a; If tg>b then tg:=b; If tg>c then tg:=c;
End;
Function max(a,b,c:integer):integer; {dữ liệu trả về là số nguyên}
Var tg:integer;
Begin
tg:=a; If tgEnd;
BEGIN
Clrscr;
write(‘Nhap a,b,c=’); readln(a,b,c);
kq1:=min(a,b,c); kq2:=max(a,b,c);
16


Writeln(‘Min=’,kq1,’Max=’,kq2);
Readln;
END.
3. Một số bài tập liên quan đến thủ tục và hàm
Bài tập 1. Lập trình đọc từ bàn phím dãy n số thực rồi đếm xem có bao nhiêu số
dương, tính tổng của chúng. Đưa kết quả ra màn hình gồm: dãy số, số lượng số
dương và tổng của chúng.
Bài tập 2. Lập trình thực hiện các công việc sau: Đọc từ bàn phím một dãy n số
nguyên. Sau đó sắp xếp các số lẻ lên đầu dãy, các số chẵn xuống cuối dãy. Đưa
ra màn hình dãy số đã sắp, số lượng các số lẻ và tổng của chúng.
Bài tập 3. Một xâu được gọi là Palindrom nếu nó trùng với xâu đảo của nó. Viết
chương trình nhập từ bàn phím một xâu bất kì và cho biết có phải là xâu
Palindrom hay không?
* Lưu ý: Các dạng bài tập này đã làm ở dạng chưa sử dụng chương trình con.
Y/c học sinh chuyển các bài tập này sang dạng chương trình con)

2.4/ Hiệu quả của sáng kiến kinh nghiệm
Trong quá trình trao đổi, thảo luận và trình bày, tôi thực sự cảm thấy phấn
khởi khi thấy các em học sinh nắm được những vấn đề lý thuyết cơ bản về
chương trình con – nhận dạng được các loại bài tập – phương pháp giải từng loại
bài tập có hệ thống như trên. Đa số các em biết ứng dụng và giải quyết được các
bài toán có sử dụng chương trình con. Các em cũng thấy giờ học nhẹ nhàng hơn,
có hứng thú đối với tiết học do vậy mà việc tiếp thu kiến thức có hiệu quả hơn
và đặc biệt giờ thực hành sau đó có hiệu quả rõ rệt.
Qua tiết dự giờ của các đồng nghiệp, tôi thấy tiết dạy áp dụng phương pháp
này được các đồng nghiệp đánh giá cao, có tính cải tiến và đổi mới từ những giải
pháp đã có và và đã triển khai áp dụng tại đơn vị có hiệu quả cao.
Để có số liệu khách quan và chính xác, tôi chọn dạy 2 lớp 11B và 11E . Lớp
thực nghiệm (TN) là lớp 11B và lớp đối chứng (ĐC) là lớp 11E. Hai lớp này có
trình độ tương đương nhau về các mặt:
- Số lượng học sinh.
- Chất lượng học tập nói chung và môn Tin học nói riêng
Để xác định hiệu quả, tính khả thi của đề tài. Việc kiểm tra, đánh giá chất lượng
nắm bắt kiến thức của học sinh ở lớp thực nghiệm và lớp đối chứng được tiến
hành bằng các bài kiểm tra, kết quả của một trong các bài kiểm tra đó như sau:
Số học sinh
Số học sinh không
làm được
làm được
Lớp
Sĩ số
Ghi chú
Số lượng Tỉ lệ (%) Số lượng Tỉ lệ (%)
11B
40
5

12.5
35
87.5
Đối chứng
11E
40
27
67.5
13
32.5
Thực nghiệm
Trong quá trình giảng dạy đối với mỗi bài lập trình nếu giáo viên biết tìm ra
cơ sở lí thuyết, đưa ra phương pháp giải hợp lí, dẫn dắt học sinh vận dụng
phương pháp một cách linh hoạt, gây hứng thú học tập của học sinh thì kết quả
giảng dạy tốt hơn.
17


3. KẾT LUẬN VÀ KIẾN NGHỊ
3.1/ Kết luận
Bộ môn Tin học là một bộ môn mới và khó đối với học sinh bởi tính phức
tạp và khả năng ứng dụng của nó đối với đời sống thực tế.
Dạy Tin học đã khó - Dạy thế nào để học sinh có thể mau chóng nắm bắt
kiến thức và vận dụng hành thạo kiến thức vào các bải tập thực hành lại càng đòi
hỏi người giáo viên phải có nhiều cố gắng, có phương pháp dạy học sáng tạo có
thể đáp ứng ngày càng cao yêu cầu của môn học.
Trên đây là những kinh nghiệm nhỏ của bản thân trong việc giảng dạy học
sinh có kĩ năng sử dụng chương trình con khi viết chương trình của ngôn ngữ
lập trình PASCAL mà tôi đưa ra để đồng nghiệp tham khảo góp ý kiến.
Rất mong nhận được những đóng góp của đồng nghiệp để bản thân tôi nói

riêng và giáo viên dạy tin học nói chung có thể có những cách dạy hay và phù
hợp với đặc trưng bộ môn, với mỗi bài học và đối tượng học sinh.
3.2/ Kiến nghị
Trên cơ sở vật chất hiện có của Nhà trường đối với bộ môn tin học, việc
việc dạy và học của thầy và trò còn gặp rất nhiều khó khăn, như: thiết bị không
đồng bộ, máy đang còn là dạng phòng học cải tạo nên không đảm bảo cả về tiêu
chuẩn và chất lượng.
Vì vậy, để có thể nâng cao chất lượng hơn nữa, rất mong Nhà trường cũng
như sở, ngành có kế hoạch đầu tư về cơ sở vật chất cũng như tạo điều kiện quan
tâm đối với đội ngũ giáo viên tin học và đặc biệt xây dựng được một đội ngũ
quản trị các phòng máy tại các Nhà trường.
Xin chân thành cảm ơn!
XÁC NHẬN
CỦA THỦ TRƯỞNG ĐƠN VỊ

Thanh Hóa, ngày 25 tháng 5 năm 2017
Tôi xin cam đoan đây là SKKN của mình viết,
không sao chép nội dung của người khác.

Người viết

Nghiêm Thị Nhung

18


TÀI LIỆU THAM KHẢO
- Sách giáo khoa Tin học 11
- Bài tập ngôn ngữ lập trình Pascal của Quách Tuấn Ngọc.
- Internet.


19