Tải bản đầy đủ (.pdf) (32 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 (1.15 MB, 32 trang )

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 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 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.(n­1)!
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(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.
 Luôn 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:
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* (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');
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*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 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:=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 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:=n­1;
     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


×