Tải bản đầy đủ (.docx) (30 trang)

skkn KÍCH THÍCH HỨNG THÚ học tập bộ môn TIN học THÔNG QUA dạy học CHƯƠNG TRÌNH CON TIN học 11

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 (799.17 KB, 30 trang )

MỤC LỤC

Trang 1


BÁO CÁO KẾT QUẢ
NGHIÊN CỨU, ỨNG DỤNG SÁNG KIẾN
1. LỜI GIỚI THIỆU
Để rèn luyện kỹ năng lập trình cho học sinh khá, giỏi trước khi chọn đội tuyển đi
thi học sinh giỏi mơn Tin học có rất nhiều cách mà giáo viên có thể áp dụng đối với các
đối tượng học sinh khác nhau. Các trường có điểm thi đầu vào cao thì việc rèn luyện kỹ
năng sẽ có nhiều thuận lợi nhưng với các trường có điểm thi đầu vào trung bình và thấp
thì việc rèn luyện kỹ năng lập trình cho các em gặp rất nhiều khó khăn. Tuy nhiên trong
cùng một trường với các đối tượng học sinh khác nhau giáo viên có thể áp dụng nhiều
biện pháp khác nhau để rèn luyện kỹ năng lập trình cho học sinh với hiệu quả khác nhau.
Các giáo viên đều hướng dẫn cho học sinh biết một bài toán có thể được giải với nhiều
thuật tốn khác nhau và mỗi thuật toán chỉ giải được một bài toán hoặc một lớp bài toán,
nhưng thực tế cho thấy, đứng trước một bài toán tin học đặc biệt là bài toán về xâu kí tự
học sinh thường lúng túng khi lập trình việc này cũng có thể do nhiều ngun nhân,
chẳng hạn không biết xử lý dữ liệu như thế nào, không biết đọc, ghi dữ liệu ra sao… ,
mặt khác học sinh khơng có máy để thực hành thêm ở nhà. Tuy nhiên, khi học sinh được
rèn luyện từ những bài cơ bản cho đến những bài tốn có dạng tương tự hoặc dạng mở
rộng từ một bài toán cơ bản nào đó trong sách giáo khoa, hoặc một bài tốn cơ bản nào
đó mà các em biết thì các em có thể xây dựng và có hứng thú để xây dựng thuật tốn cho
bài tốn đặt ra. Vì vậy giáo viên có thể chọn các bài tập cơ bản liên quan đến mảng một
chiều, mảng hai chiều, xâu kí tự từ đó mở rộng và phát triển đến các bài tốn có sử dụng
chương trình con để để rèn luyện kỹ năng lập trình và kích thích hứng thú học tập bộ môn
Tin học cho học sinh.
Dĩ nhiên cách làm này không mới với giáo viên nhưng cách chọn các bài toán cơ
bản như thế nào để học sinh có thể vận dụng và kích thích được húng thú học tập mơn
Tin học cho học sinh đó lại là điều đáng quan tâm.


Chương trình con là một trong những vấn đề hay gặp trong lập trình nói chung và
lập trình pascal nói riêng. Chương trình tin học lớp 11 đã giới thiệu và có một số ví dụ về
chương trình con nhưng trong q trình học lập trình khơ khan, để học sinh không nhàm
chán và tránh mắc phải những sai lầm khi lập trình lại kích thích hứng thú học tập cho
học sinh không phải là việc đơn giản. Vì những lý do trên tơi chọn đề tài “Kích thích
hứng thú học tập bộ mơn Tin học thơng qua dạy học chương trình con tin học 11”
nhằm cung cấp cho học sinh những kiến thức khái quát hơn về chương trình con, rèn
luyện kỹ năng lập trình và kích thích hứng thú học tập bộ mơn này cho học sinh thơng
qua một số bài tốn cụ thể.
2. TÊN SÁNG KIẾN
“Kích thích hứng thú học tập bộ mơn Tin học thơng qua dạy học chương trình
con tin học 11”
Trang 2


3. TÁC GIẢ SÁNG KIẾN
- Họ và tên: Chu Thị Thu
- Địa chỉ: Trường THPT Yên Lạc 2 – Huyện Yên Lạc – Tỉnh Vĩnh Phúc
- Số điện thoại: 037467972

E_mail:

4. CHỦ ĐẦU TƯ TẠO RA SÁNG KIẾN
- Họ tên: Chu Thị Thu
- Trình độ chun mơn: Đại học sư phạm Tin học
- Đơn vị công tác: Trường THPT Yên Lạc 2– Huyện Yên Lạc – Tỉnh Vĩnh Phúc
5. LĨNH VỰC ÁP DỤNG SÁNG KIẾN
Ứng dụng chương trình con trong lập trình giảng dạy học sinh lớp 11 mơn Tin học
và bồi dưỡng học sinh tham gia kì thi chọn học sinh giỏi các cấp môn Tin học.
6. NGÀY SÁNG KIẾN ĐƯỢC ÁP DỤNG

Từ ngày 01/08/2018
7. MÔ TẢ BẢN CHẤT CỦA SÁNG KIẾN
7.1. Tổng quan các vấn đề nghiên cứu
7.1.1. Mục đích nghiên cứu
Góp phần đổi mới phương pháp dạy học sinh đại trà và học sinh tham dự kì thi học
sinh giỏi mơn Tin học theo hướng phát huy tính tích cực, chủ động và sáng tạo của học
sinh giúp học sinh tiếp thu tri thức một cách có hiệu quả.
Góp phần gây hứng thú học tập mơn Tin học cho học sinh lớp 11 và học sinh tham
gia thi chọn học sinh giỏi, tránh việc học thụ động, học vẹt. Giúp học sinh lĩnh hội tri
thức một cách khoa học, củng cố và khắc sâu kiến thức.
Qua đề tài này tôi mong muốn cung cấp cho học sinh một trong những vấn đề mà
các em đang gặp phải trong khi lập trình thơng qua việc sử dụng chương trình con giúp
các em chủ động hơn trong học tập, tích luỹ kiến thức, kỹ năng lập trình.
7.1.2. Bản chất đối tượng nghiên cứu
Đưa ra hệ thống lý thuyết về chương trình con và ứng dụng chương trình con giải
các bài tập trong ngơn ngữ lập trình Pascal giúp học sinh lĩnh hội tri thức, giúp các em
tích cực, chủ động tích lũy kiến thức, kích thích hứng thú học tập bộ mơn Tin học. Qua
đó, học sinh phát triển được tư duy logic thông qua hệ thống bài tập giúp các em rèn
luyện được tính tự giác, tính kỉ luật, thói quen tự học đó là những đức tính rèn luyện tốt
của học sinh.
7.1.3. Đối tượng, phạm vi nghiên cứu
Đối tượng: Chương trình con trong lập trình
Trang 3


Phạm vi: Các vấn đề về chương trình con trên ngơn ngữ lập trình Pascal.
7.1.4. Phương pháp nghiên cứu
Phương pháp
Nghiên cứu lí luận chung.
Khảo sát điều tra thực tế dạy học.

Tổng hợp đúc rút kinh nghiệm.
Cách thực hiện
Trao đổi với đồng nghiệp, tham khảo ý kiến giáo viên cùng bộ môn. Liên hệ thực
tế trong nhà trường, áp dụng và đúc rút kinh nghiệm qua q trình giảng dạy. Thơng qua
việc giảng dạy trực tiếp học sinh khối 11 và học sinh tham gia thi chọn học sinh giỏi môn
Tin học lớp 11.
7.1.5. Giới hạn về không gian của phương pháp nghiên cứu
Đề tài được đề cập với đồng nghiệp và thực nghiệm sư phạm qua các em học sinh
lớp 11A1, 11A2 và các em học sinh tham gia dự kì thi chọn học sinh giỏi mơn Tin học
lớp 11 năm học 2017-2018, năm học 2018-2019
7.1.6. Phạm vi nghiên cứu
Tôi đã nghiên cứu đề tài này trong suốt quá trình giảng dạy và thực nghiệm đề tài
này trong năm học 2018-2019.
7.2. Phần nội dung
7.2.1. Cơ sở lý luận
Đứng trước một bài tốn lập trình tin học học sinh thường lúng túng và khơng biết
tìm thuật tốn của bài tốn từ đâu và tìm như thế nào? Một số học sinh khá, giỏi trong đội
thì có thói quen là mị mẫm và thử nghiệm để tìm lời giải, điều đó có thể dẫn tới kết quả
đúng hoặc sai hoặc chệch hướng giải quyết bài tốn, hiệu suất để tìm thuật tốn như thế
là không cao, một số học sinh kém hơn thì khơng biết cách tìm thuật tốn từ đâu và điều
đó gây tâm lý chán nản cho các em. Với tình hình ấy để giúp học sinh định hướng tốt hơn
trong q trình tìm thuật tốn, trước khi có thể tự tìm được thuật tốn tốt hơn thì người
giáo viên cần tạo cho học sinh thói quen tìm thuật tốn từ các các bài toán cơ bản quen
thuộc mà các em đã biết, khai thác các yếu tố đặc trưng của một số bài tốn cơ bản sử
dụng chương trình con để giải quyết cho các bài toán mới. Việc áp dụng thuật toán của
các bài toán cơ bản về chương trình con xây dựng thuật tốn cho các bài toán tương tự
hoặc các bài toán mở rộng từ các bài tốn cơ bản đó là một q trình giúp học sinh kích
thích hứng thú học tập và rèn luyện kỹ năng lập trình.
7.2.2. Cơ sở thực tiễn
Trường tơi nằm dưới chân đê dải sông Hồng nên đa số học sinh ở nơng thơn nên chưa có

cơ hội, điều kiện tiếp xúc với cơng nghệ và máy tính. Vì vậy, tin học là một môn học tương
Trang 4


đối lạ lẫm và khó đối với học sinh trường tơi. Học sinh học trên lớp đã khơng có hứng thú
học tin học đặc biệt là các bài lập trình vì các em khơng học thêm hay tin học khơng phải là
môn mà các em thi đại học. Điều này dẫn đến ý thức tự giác của học sinh chưa cao, đặc biệt
là đối với mơn học lập trình Tin học lớp 11. Những thao tác thực hành thì đa phần học sinh
chưa nhớ vì ở nhà các em cũng khơng có máy tính để học sinh rèn luyện các kỹ năng thực
hành cho học sinh. Phần chương trình con là phần các em học rất ít trên tiết lý thuyết. Cơ sở
trên đã giúp tôi áp dụng đề tài kích thích hứng thú học tập bộ mơn Tin học thơng qua chương
trình con trong lập trình Pascal giảng dạy cho học sinh khối 11 và áp dụng cho học sinh tham
dự kì thi chọn học sinh giỏi cấp tỉnh và cấp quốc gia.
7.2.3. Nội dung cụ thể
Tất cả các nội dung, các ví dụ, bài tập trong đề tài này được xây dựng trên ngơn ngữ
lập trình Pascal
I. Khái niệm chương trình con
A. Khái niệm
Để viết chương trình giải các bài tốn lớn, phức tạp người lập trình có thể chia thành
nhiều bài toán nhỏ, mỗi bài toán là một dãy lệnh mô tả một số thao tác nhất định (gọi là
chương trình con). Sau đó ghép nối các chương trình con thành chương trình chính.
Chương trình con là dãy các lệnh mô tả một số thao tác nhất định và có thể được thực
hiện (được gọi) từ nhiều vị trí khác nhau trong chương trình.
B. Lợi ích của việc sử dụng chương trình con
• Tránh được việc phải lặp đi lặp lại cùng một dãy lệnh.
• Hỗ trợ việc thực hiện các chương trình lớn
• Phục vụ cho q trình trừu tượng hóa
• Mở rộng khả năng ngơn ngữ
• Thuận tiện cho việc phát triển nâng cấp chương trình
II. Phân loại và cấu trúc chương trình con

A. Phân loại
Trong nhiều ngơn ngữ lập trình, chương trình con thường gồm hai loại:
 Hàm (Function): Là chương trình con thực hiện một số thao tác nào đó và trả về một giá
trị qua tên của nó.
Ví dụ:
Sin(x) nhận vào giá trị thực x và trả về giá trị sin x
Sqrt(x) nhận vào gía trị x trả về giá trị căn bậc hai của x
Length(x) nhận vào xâu x và trả về độ dài của xâu x
 Thủ tục (Procedure): Là chương trình con thực hiện một số thao tác nào đó, và khơng trả
về giá trị nào qua tên của nó.
Ví dụ: Các thủ tục vào/ra chuẩn hay thủ tục xử lí xâu: writeln, readln, delete
Trang 5


B. Cấu trúc chương trình con

[]

 Phần đầu: Cấu trúc chương trình con tương tự chương trình chính, chương trình chính,
nhưng nhất thiết phải có phần đầu để khai báo tên, nếu là Hàm thì phải có khai báo
kiểu dữ liệu trả về.
 Phần khai báo: Có thể khai báo cho dữ liệu vào ra, các hằng được sử dụng trong
chương trình con
 Phần thân: Là dãy các lệnh được thực hiện trong chương trình con từ dữ liệu vào và
được kết quả như mong muốn. Phần này ln nằm giữa hai từ khóa là Begin và End. Ở
giữa là các thao tác cần thực hiện. Sau từ khóa End là dấu chấm phẩy (;).
o Một số lưu ý:
Một chương trình con có thể có hoặc khơng có tham số hình thức, có thể có hoặc
khơng có biến cục bộ.
• Tham số hình thức: Là tham số được đưa vào khi định nghĩa chương trình con

• Tham số thực sự: Là tham số được viết trong lời gọi chương trình con
• Biến cục bộ: Là các biến được khai báo trong chương trình con
• Biến tồn phần: Là các biến được khai báo trong chương trình chính
 Trong thân hàm cần có lệnh: <tên hàm> :=<biểu thức>;
 Kết thúc chương trình con là dấu chấm phẩy (;)
C. Thực hiện chương trình con
 Để thực hiện (gọi) một chương trình con, ta cần phải có lệnh gọi nó tưởng tự lệnh gọi
hàm hay thủ tục chuẩn, bao gồm tên chương trình con với tham số (nếu có) là các
hằng và biến chứa dữ liệu vào và ra tương ứng với các tham số hình thức đặt trong
cặp ngoặc ( và ). Các hằng và biến này được gọi là các tham số thực số thực sự.
 Lệnh gọi chương trình con sẽ thực hiện từ trên xuống dưới trong chương trình chính.
 Khi thực hiện gọi chương trình con, các tham số hình thức dùng để nhập dữ liệu vào
của tham số thực sự tương ứng. Khi xuất dữ liệu thì tham số hình thức lưu trữ dữ liệu
ra sẽ trả giá trị cho tham số thực sự tương ứng
D. Khai báo CTC
– Nhắc lại cấu trúc của một chương trình
PROGRAM Tên_chương_trình; { Tên chương trình}
USES ...; {Khai báo thư viện}
CONST ...;{Khai báo hằng}
TYPE ...;{Khai báo kiểu}
VAR ...;{Khai báo biến}
Khai báo CTC
BEGIN {Chương trình chính}
Trang 6


<các lệnh>;
END.
Như vậy phần khai báo CTC nằm ở phần cuối của phần khai báo
a. Khai báo và lời gọi hàm

– Khai báo:
FUNCTION <tên hàm>(Danh sách ác tham số):<Kiểu dữ liệu>;
[Khai báo Const, Type, Var]
BEGIN
<các lệnh trong thân hàm>;
<tên hàm>:=<Giá trị>;
END;
Chú ý ln 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ố 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
<tên hàm>(danh sách các tham số thực);
Ví dụ: tong(4,5);
b. 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ố);{khơng có giá trị trả về}
[Khai báo Const, Type, Var]
BEGIN
<các câu lệnh>;
END;
Ví dụ:
Procedure inso(n:integer);
var i:inteher;
Begin
for i:=1 to n do

write(i:5);
Trang 7


end;
– Lời gọi thủ tục
<tên thủ tục>(danh sách các tham số thực);
Ví dụ:
inso(6);
E. Biến tồ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 co 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 CTC. Các biến này chỉ
được sử dụng trong phạm vi ctc mà nó được khai báo. Sau khi kết thức ctc các biến
này sẽ khơng cịn tồn tại.
Ví dụ:
PROGRAM vidu;
Var a,b,c:integer; {3 biến toàn cục}
PROCEDURE thutuc(n:integer);{n là biến cục bộ}
var i:integer; {i là biến cục bộ}
begin
for i:=1 to 10 do writeln(i);
end;
BEGIN
a:=5;b:=6;c:=8;
thutuc( a);
thutuc( b);
thutuc( c);
readln;

END.
Trong trường họp biến cục bộ trùng tên với biến tồ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 tồn cục khơng bị ảnh hưởng.
F. Cách truyền tham số trong chương trình con
 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 tồ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 ctc.
Ví dụ:
Procedure inso(a:integer; ch:char);
begin
{các lệnh của CTC}
end;
{gọi}
inso(13,'a'); {lời gọi đúng}
Trang 8


inso('a',13); {loi goi 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 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 CTC và sau khi ra
khỏi CTC nó vẫn giữ giá trị thay đổi đó.
 Tham trị: là các tham số được khia 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 ctc nhưng sau khi kết thúc
ctc 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.

 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.
* Hàm (Function)
 Kết quả của bài tố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 CTC cần nằm trong các biểu thức tính tốn.
* Thủ tục (Procedure)
 Kết quả của bài tố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 CTC khơng nằm trong các biểu thức tính tốn.
 Chú ý: Nếu một cơng việc có thể làm bằng hàm thì chắc chắn sẽ làm được bằng thủ
tục {tuy nhiên sẽ phức tạp hơn khi dùng hàm} nhưng một chương trình làm bằng thủ
tục thì chưa chắc ta đã làm được bằng hàm.
Đối với Borland Pascal 7.0 ta có thể gọi hàm như gọi một thủ tục. Không nhất thiết
phải lấy giá trị trả về. Để thực hiện được điều này trong menu Options >Compiler cần
khai báo cú pháp mở rộng (Extended syntax), hoặc trong chương trình cần có dẫn hướng
biên dịch {$ X+}. Nếu không, khi biên dịch (gõ F9) Pascal sẽ thơng báo lỗi “Error 122:
Invalid variable reference”.
G. Tính đệ quy của chương trình con
Một CTC trong Pascal có thể gọi về chính nó. Một lời gọi như thế gọi là một lời
gọi đệ quy. Ta xét ví dụ sau:
Nhập vào 1 số ngun 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!
function giai_thua(n:integer):longint;
begin
Trang 9



if n=0 then giai_thua:=1
else giai_thua:=n*giai_thua(n-1);
end;
Lưu ý:
 Khi sử dụng đệ quy phải có điều kiện kết thúc đệ quy (TH suy biến). 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.
 Ln có lời gọi đệ quy, trong TH trên là lời gọi giai_thua(n-1);
H. Một số ví dụ
Ví dụ 1: Cho số nguyên dương N (N<105). Viết chương trình chuyển đổi số tự nhiên N
cho trước sang hệ cơ số 2 bằng việc xây dựng hàm chuyển đổi Dec2Bin( ).
Hướng dẫn:
- Xây dựng hàm Dec2Bin( ) chuyển đổi từ số tự nhiên sang số nhị phân.
Sử dụng biến S để lưu giá trị số nhị phân của N. Khởi gán bằng 0.
Tiến hành lặp chuyển đổi cơ số: Lặp trong khi mà N > 0
SoDu = số dư của N chia cho 2.
N = N chia cho 2.
Bổ sung chữ số SoDu vào số S thành một chữ số
Trả về kết quả cuối cùng của S.
- Viết thân chương trình chính với nội dung dùng để kiểm tra kết quả thực hiện của hàm.
Khai báo biến N, M
Thông báo nhập và nhập giá trị cho biến N
Gán giá trị M bằng kết quả trả về của hàm Dec2Bin( N )
In thông báo về kết quả số nhị phân chuyển đổi được (giá trị của M)
Gọi hàm readln trước khi kết thúc chương trình
Chương trình:
Trang 10



Program Doi_Co_So;
Uses crt;
Var N:integer;
{ 1. Thu tuc chuyen so tu nhien n cho truoc sang ket qua tra ve he co so 2 }
Function Dec2Bin ( n:integer ):integer;
Var S,So,Du:integer;
Begin
S := 0; So := n ;
While ( So > 0) do
Begin
Du := So mod 2 ;
So := So div 2 ;
S := S * 10 + Du;
End;
Dec2Bin:= S ;
End;
{ 2. Than chuong trinh chinh dap ung yeu cau bai toan }
BEGIN
clrscr;
write( 'Nhap so N =' ); readln(N );
writeln(' Dang nhi phan cua N la ', Dec2Bin(N) );
readln;
END.
Trang 11


Ví dụ 2: Cho hai số nguyên dương a, b (a,b<10 5). Viết các hàm USCLN(a,b) tính ước số
chung lơn nhất của a, b và BSCNN(a, b) tính bội số chung nhỏ nhất của a, b.
Hướng dẫn: Khai báo hàm USCLN có:
Tên hàm: USCLN

Kiểu dữ liệu trả về: integer
Tham số: 2 tham trị là int a, int b
Giá trị trả về: chính là giá trị ước số chung lớn nhất của a và b.
Function USCLN( a, b: Integer): Integer;
Var Sodu:integer;
Begin
While (b <> 0) do
Begin
Sodu:= a mod b;
a := b;
b := Sodu;
End;
USCLN := a;
End;
{Tuong tu ham BSCNN(a, b : Integer)}
Function BSCNN(a,b: Integer): Integer;
Var k :integer;
Begin
For k := a to a*b do

{ Lap voi moi i co gia tri tu a den 1}
Trang 12


If ((k mod a = 0) and ( k mod b = 0)) then { Kiem tra a, b cung chia het cho k? }
Break;

{ break de thoat, luu giu lai gia tri cua k.}

BSCNN:= k;

End;
* Mở rộng bài toán:
Từ ví dụ 2, viết chương trình tối giản phân số n/m. Với n, m là hai số nguyên
dương không lớn hơn 105.
Ví dụ 3: Cho số nguyên dương N (N<10 5). Viết hàm kiểm tra số N có phải là số nguyên
tố hay không?
Hướng dẫn: Khai báo hàm kiểm tra số nguyên tố có:
Tên hàm: KiemtraSNT
Dữ liệu trả về: int, ( 0 nếu không phải là số nguyên tố, là 1 nếu là số nguyên tố )
Tham số: tham trị là int N, số cần kiểm tra.
Xử lý kiểm tra: Dựa trên ví dụ đã có ở phần trước.
Function KiemtraSNT(N: Integer ): Boolean;
Var OK : Boolean;
i : Integer;
Begin
OK:= True;

{ Khoi gan gia tri dung cho ktrSNT}

For i := 2 to trunc(sqrt(N)) do
can bac 2 cua N}

{ Lap voi moi i co gia tri tu 2 den phan nguyen

If N mod i = 0 then

{ Kiem tra xem N co chia het cho i hay khong}

Begin


OK:=false; break; end;

{ Neu dung thi khong la so nguyen to va thoat khoi vong lap}
Trang 13


KiemtraSNT:=OK;
End;
Cải tiến thuật tốn, khơng sử dụng biến phụ OK:
Function KiemtraSN(N: Integer): Integer;
Var i :integer;
Begin
For i := 2 to trunc(sqrt(N)) do
can bac 2 cua N}

{ Lap voi moi i co gia tri tu 2 den phan nguyen

If N mod i = 0 then

{ Kiem tra xem N co chia het cho i hay khong}

Begin Writeln('N khongla SNT');
Break;
End

{ Neu dung thi khong la so nguyen to va thoat khoi vong lap }

Else
Writeln('N la SNT');


{ N la SNT}

End;
Ví dụ 4: Viết chương trình thực hiện lần lượt các cơng việc sau:
1. Lập thủ tục nhập ba số thực dương a , b , c (a,b,c <105) từ bàn phím .
2. Lập thủ tục kiểm tra xem ba số trên có lập thành ba cạnh của tam giác hay không ?
3. Viết hàm tính diện tích của tam giác .
4. Viết hồn thiện chương trình chính.
Chương trình mẫu
Program Tam_Giac;
Uses crt;
Trang 14


Var a,b,c : Integer;
{ 1. Thu tuc nhap}
Procedure NhapABC (Var a, b, c : Integer);
Begin
Write( 'Nhap a:' ); Readln( a );
Write( 'Nhap b:' ); Readln( b );
Write( 'Nhap c:' ); Readln( c );
End;
{ 2. Ham tinh dien tich}
Function Dientich( a, b, c:Integer ) : Real;
Var dt,p : Real;
Begin
p := (a+b+c)/2;
dt := sqrt(p* (p-a)*(p-b)*(p-c));
Dientich := dt;
End;

{ 3. Thu tuc kiem tra va In kqua tinh dien tich (neu la tam giac) }
Procedure KiemTra_InDienTich ( a,b,c:Integer);
Begin
If ((a+b>c) and (b+c>a) and (a+c>b)) then
Writeln(' Ba canh tren tao thanh tam giac.dien tich', Dientich(a,b,c) )
Else
Writeln('Ba canh tren khongtao thanh tam giac');
Trang 15


End;
{ 4. Than chuong trinh chinh }
BEGIN
NhapABC(a,b,c);
KiemTra_InDienTich (a,b,c);
END.
Ví dụ. 5: Viết chương trình hồn chỉnh thực hiện phân tích ra N ra thành các thừa số
nguyên tố.
Ví dụ: N = 1260 = 2 . 2 . 3 . 3 . 5 . 7
Hướng dẫn:
 Viết hàm nhập số N. Lưu ý, hàm nhập cần truyền tham số N theo dạng tham biến

để lưu lại giá trị đã nhập vào.
 Viết hàm phân tích số N ra các thừa số nguyên tố và in các thừa số đó ra màn hình

với ý tưởng thuật toán:
Chia N cho số nguyên tố u (nhỏ nhất là 2).
Trong khi N còn chia hết cho u thì tiến hành phân tích N với u là thừa số. Giảm N đi u
lần.
Nếu N không chia hết cho u, thi tăng u lên 1.

Quá trình lặp lại với u từng bước tăng lên 1 nếu N không chia hết cho u. N từng bước
giảm xuống u lần nếu N chia hết cho u.
Quá trình lặp lại đến một mức u tăng lên và N giảm xuống để N = u, khi đó giá trị mới
của N sẽ là 1.
Chương trình mẫu
Program Phan_Tich_Thua_So;
Uses crt;
Trang 16


Var N : integer;
{ 1. Thu tuc nhap so N. }
Procedure NhapSoN( var NN : Integer );
Begin
NN := 0; {Gan khoi dau bang 0 de vao vong lap, vong lap dung khi nhap khac 0}
While ( N = 0 ) do
Begin
Write( 'Nhap N=' ); Readln(NN );
End;
End;
{ 2. Thu tuc phan tich N ra thanh cac thua so nguyen to }
Procedure PhantichSoN ( Var N1 : Integer );
Var u,dem:Integer;
Begin
If ( N1 > 1 ) Then
Begin
u := 2; dem := 0;
While ( N1 > 1 ) do
If ( N1 mod u = 0 ) Then
Begin

dem:=dem+1;
Writeln( u);
N1 := N1 div u;
Trang 17


End
Else
u:=u+1;
End
Else
Writeln(' Khong the phan tich duoc' );
End;
{ 3. Than chuong trinh chinh }
BEGIN
Clrscr;
Writeln('Phan tich so N thanh tich cua cac so nguyen to :' );
NhapSoN( N );
PhantichSoN( N );
Writeln ('Nhan Enter de ket thuc ...' );
Readln;
END.
J. Bài tập áp dụng
Bài tập 1:
Viết chương trình giải phương trình bậc hai với yêu cầu sử dụng các chương trình
con để giải quyết các trường hợp xãy ra của delta.
Mã chương trình:
Program Giai_PT_bac_hai;
uses crt;
var a,b,c,delta:real;

Procedure delta_duong;
begin
Trang 18


write('Phuong trinh co hai nghiem x1=',(-b+sqrt(delta))/(2*a),'x2=',(b+sqrt(delta))/(2*a));
end;
Procedure delta_khong;
begin
write('Phuong trinh co nghiem kep x=',-b/(2*a):3:1);
end;
Procedure delta_am;
begin
writeln('Phuong trinh vo nghiem');
end;
{Chuong trinh chinh}
Begin
clrscr;
write('Nhap a: ');readln(a);
write('Nhap b: ');readln(b);
write('Nhap c: ');readln(c);
delta:=b*b-4*a*c;
if delta>0 then delta_duong
else if delta = 0 then delta_khong
else delta_am;
readln
end.
Nhận xét: Chương trình con cho phép chia nhỏ cơng việc nhằm đơn giản hố. Ngồi ra
một cơng việc nào đó lặp lại nhiều lần trong chương trình nên dùng CTC vì khi đó mã
chương trình sẽ gọn, dễ theo dõi, gỡ rối hơn.

Bài tập 2:
Viết chương trình cho phép nhập hai số vào hai biến, thực hiện đổi giá trị của hai
biến cho nhau. Yêu cầu dùng chương trình con để thực hiện chức năng đổi giá trị.
Mã chương trình:
Program CTC_1;
uses crt;
var a,b: real;
{----CTC doi gia tri----}
Procedure swap(var x,y:real);
Trang 19


var tam:real;
begin
tam:=x; x:=y; y:=tam;
end;
{-----Ket thuc CTC-----}
begin
clrscr;
write('Nhap so a: ');readln(a);
write('Nhap so b: ');readln(b);
swap(a,b);
write('Sau khi doi a =',a:3:1);
write('Sau khi doi b =',b:3:1);
readln
end.
Nhận xét:
- Nếu bỏ từ var ở khai báo var x,y:real thì chương trình vẫn khơng báo lỗi nhưng chức
năng đổi giá trị của hai biến không thực hiện được.
Bài tập 3:

Tìm số lớn thứ nhì trong n số được nhập từ bàn phím.
Ví dụ: Nhập các sơ 10; 10; 9; 9; 8 thì được số lớn nhì là 9.
Giải thuật:
- Nhập 2 số, Xác định giá trị cho hai biến Max, Nhi.
- Lần lượt nhâp các số. Với mỗi số được nhập xét:
- Nếu So > Max thì gán Nhi = Max, Max = So.
- Nếu Nhi < So < Max thì gán Nhi = So.
Mã chương trình
Program So_lon_nhi;
Var n,i,so, nhi,max,tam:integer;
Procedure swap(var x,y:real);
var tam:real;
begin
tam:=x;
x:=y;
Trang 20


y:=tam;
end;
Begin
Write('Nhap n: ');Readln(n);
Write('nhap so:');Readln(max);
Write('nhap so: ');Readln(nhi);
if nhi > Max then swap(Max,nhi)
For i:= 3 to n do
Begin
Write('Nhap so: ');Readln(so);
if (so>nhi) and (soif so>max then

Begin
nhi:=max;
Max:=so;
End;
End;
Write('So thu nhi la: ',nhi);
Readln
End.
Bài tập 4:
Viết chương trình tính giai thừa của số n (Viết là n!). Với yêu cầu:
- Nếu người dùng nhập số n < 0 thì yêu cầu nhập lại.
- Sử dụng chương trình con để tính giai thừa của một số.
n! = 1 nếu n = 0;
n! = 1.2.3.4.5...n (Tích của n thừa số).
Mã chương trình:
Program CTC_2;
uses crt;
var n:integer;x:longint;
Procedure Giai_Thua(var GT:longint; n:byte);
begin
GT:=1;
while n>0 do
Trang 21


begin
GT:=GT*n;
n:=n-1;
end;
end;

begin
repeat
clrscr;
write('Nhap so n: ');readln(n);
if n < 0 then begin write('Nhap so n>=0');readln; end;
until n>=0;
Giai_Thua(x,n);
writeln('Giai thua cua ',n,'la:',x);
readln
end.
Nhận xét: Lệnh n:= n-1 làm thay đổi giá trị của n nhưng khi ra khỏi chương trình con n
có giá trị khơng đổi so với trước khi gọi chương trình con.
Bài tập 5: Viết chương trình tính n! với u cầu sử dụng hàm để tính giai thừa.
Mã chương trình:
Program Giai_thua_Ham;
uses crt;
var n: longint;
Function Giai_Thua(n:longint):longint;
Var GT:Longint;
begin
GT:=1;
while n > 0 do
begin
GT:=GT * n;
n:=n-1;
end;
Giai_thua:=GT;
end;
begin
Trang 22



clrscr;
write('Nhap n: '); readln(n);
write(n,'!=',Giai_thua(n));
readln
end.
Nhận xét: Hãy so sánh sự khác nhau khi Giai_thua được viết dưới hai dạng Function và
Procedure.
- Khi dùng Procedure cần một biến (toàn cục) để lưu giữa giá trị của n!. Biến này được
truyền cho tham biến trong Procedure. Sau khi gọi nó cần lệnh để in n!
- Khi dùng Function, có thể sử dụng nó như là một biểu thức.
Bài tập 6: Viết chương trình cho phép thực hiện rút gọn phân số.
a. Hướng dẫn:
- Tìm UCLN của tử số và mẫu số.
- Chia tử và mẫu của phân số cho UCLN vừa tìm được.
b. Mã chương trình:
Program Rut_gon_phan_so;
uses crt;
var tu,mau:integer;
Function UCLN(a,b:integer):integer;
var r: integer;
begin
r:= a mod b;
while r <> 0 do
begin
a:= b;
b:= r;
r:=a mod b;
end;

UCLN:=b;
end;
begin
clrscr;
write('Nhap tu: '); readln(tu);
write('Nhap mau: '); readln(mau);
Trang 23


write('Ket qua rut gon: ',tu,'/',mau,'=',tu div UCLN(tu,mau),'/',mau div
UCLN(tu,mau));
readln
end.
Bài tập 7:
Viết chương trình cho phép trộn hai dãy số A và B cùng có số phần tử là k để
được dãy số C theo yêu cầu sau:
A = a1, a2 ... ak
B = b1, b2 ... bk
Được C = a1, b1, a2, b2 ... ak, bk.
Mã chương trình:
Program Tron_day;
uses crt;
type kieu_mang = array[1..100] of integer;
var A, B, C: Kieu_mang;
n,i,j: integer;
Procedure Nhap_Mang(Var X: Kieu_mang; n:byte);
var i:integer;
begin
for i:=1 to n do
begin

write('M[',i,']=');readln(X[i]);
end;
end;
Procedure In_Mang(X:kieu_mang; n:byte);
var i: byte;
begin
for i:=1 to n do write(x[i],', ');
end;
{-----------}
begin
clrscr;
write('Nhap so phan tu cua day: ');read(n);
Nhap_mang(A,n);
Nhap_mang(B,n);
Trang 24


i:=1;
j:=1;
while i<= n do
begin
C[j]:= A[i];
C[j+1]:=B[i];
j:=j+2;
i:=i+1;
end;
in_mang(C,2*n);
readln
end.
Bài tập 8:

Viết chương trình in ra các số nguyên tố nhỏ hơn n với yêu cầu dùng hàm để kiểm
tra một số có phải là số ngun tố hay khơng
Mã chương trình:
Program In_so_nguyen_to;
uses crt;
var n, i: integer;
{------Ham kiem tra-------}
Function kiem_tra(n:integer):boolean;
var i: integer;
begin
kiem_tra:=true;
for i:=2 to n-1 do if (n mod i) = 0 then kiem_tra:=false;
end;
{------CTC----------------}
begin
clrscr;
write('Nhap n: '); readln(n);
for i:=2 to n do if kiem_tra(i) then write(i:3, ', ');
readln;
end.

Trang 25


×