SỞ GIÁO DỤC ĐÀO TẠO VĨNH PHÚC
TRƯỜNG THPT YÊN LẠC 2
=====***=====
BÁO CÁO KẾT QUẢ
NGHIÊN CỨU, ỨNG DỤNG SÁNG KIẾN
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
Tác giả sáng kiến: CHU THỊ THU
Mã sáng kiến: 28.62.01
Yên Lạc, năm 2020
Trang 2
DANH MỤC CÁC CHỮ VIẾT TẮT
1. THPT: Trung học phổ thông
2. HSG: Học sinh giỏi
3. HS: Học sinh
4. SKKN: Sáng kiến kinh nghiệm
5. NXB: Nhà xuất bản
6. NH: Năm học
7. KK: Khuyến khích
8. HSDT: Học sinh dự thi
9. CTC: Chương trình con
MỤC LỤC
Trang 4
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 toá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 nguyên 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 toá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 toá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 toán cho bài toá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 toá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 quá 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 toán cụ thể.
Trang 5
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”
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 độ chuyên 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
Trang 6
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
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 quá 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 20172018, năm học 20182019
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 20182019.
7.2. Phần nội dung
7.2.1. Cơ sở lý luận
Đứng trước một bài toá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 toán của bài toá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 toán, hiệu suất để tìm
thuật toá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 toá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 quá trình tìm thuật toán, trước khi có thể tự tìm
được thuật toá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
Trang 7
toá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 toá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 toá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 toán cơ
bản đó là một quá 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 đố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 toá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 quá trình trừu tượng hóa
Mở rộng khả năng ngôn ngữ
Trang 8
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
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 luôn 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
Trang 9
Biến toà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}
<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ị>;
Trang 10
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ố 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);
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);
Trang 11
E. 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 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 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.
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 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 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}
inso('a',13); {loi goi sai}
inso(13);{lời gọi sai}
Trang 12
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 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 CTC cần nằm trong các biểu thức tính toán.
* Thủ tục (Procedure)
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 CTC không nằm trong các biểu thức tính toá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.(n1)!
Hàm tính n!
Trang 13
function giai_thua(n:integer):longint;
begin
if n=0 then giai_thua:=1
else giai_thua:=n*giai_thua(n1);
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.
Luôn có lời gọi đệ quy, trong TH trên là lời gọi giai_thua(n1);
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:
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
Trang 14
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.
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;
Trang 15
Begin
For k := a to a*b do { Lap voi moi i co gia tri tu a den 1}
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<105). 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 { Lap voi moi i co gia tri tu 2 den phan nguyen
can bac 2 cua N}
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}
KiemtraSNT:=OK;
End;
Cải tiến thuật toá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 { Lap voi moi i co gia tri tu 2 den phan nguyen
can bac 2 cua N}
If N mod i = 0 then { Kiem tra xem N co chia het cho i hay khong}
Begin Writeln('N khongla SNT');
Trang 16
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 hoàn thiện chương trình chính.
Chương trình mẫu
Program Tam_Giac;
Uses crt;
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* (pa)*(pb)*(pc));
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');
End;
Trang 17
{ 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 hoà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;
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
Trang 18
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;
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
write('Phuong trinh co hai nghiem x1=',(b+sqrt(delta))/(2*a),'x2=',(
Trang 19
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*b4*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 hoá. Ngoà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}
Trang 20
Procedure swap(var x,y:real);
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
Trang 21
tam:=x;
x:=y;
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 (so if 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;
Trang 22
Procedure Giai_Thua(var GT:longint; n:byte);
begin
GT:=1;
while n>0 do
begin
GT:=GT*n;
n:=n1;
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:= n1 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 yê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;
Trang 23
n:=n1;
end;
Giai_thua:=GT;
end;
begin
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;
Trang 24
end;
UCLN:=b;
end;
begin
clrscr;
write('Nhap tu: '); readln(tu);
write('Nhap mau: '); readln(mau);
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;
Trang 25