Giáo trình Nhập môn tin học - Phần III: Ngôn ngữ lập trình Pascal (Phần 2)

I. Khái niệm chung – đặc điểm

1. Khái niệm chung:

Ở những chương trước chúng ta mới làm quen với cấu trúc của chương trình chính, trong đó

để giải quyết một hoặc nhiều vấn đề, tất cả các lệnh đều nằm trong một chương trình và

thực hiện các lệnh từ trên xuống dưới. Với những bài toán lớn, theo cấu trúc này chương

trình chính rất dài, cồng kềnh, khó kiểm soát và không thể phân chia cho nhiều nhóm thực

hiện đồng thời một lúc.

Từ đó hình thành ý tưởng xây dựng chương trình con là một mô đun độc lập, kết nối với

chương trình chính và các chương trình con khác qua “đầu vào” và “đầu ra”, chia nhỏ chức

năng và cấu trúc chương trình chính thành nhiều mô đun nhỏ, trong đó chương trình chính

là chương trình điều khiển quá trình tính toán của chương trình con.

Trong những năm đầu khi bắt đầu xuất hiện ngôn ngữ lập trình, người ta chưa thiết lập được

cấu trúc Chương trình con. Trong quá trình phát triển các ngôn ngữ đã có, cùng với nhu cầu

của người sử dụng, những tiện lợi mà chương trình con mang lại, sự phát triển các ngôn ngữ

đã có và khi xây dựng ngôn ngữ lạp trình mới đều hướng đến việc tổ chức chương trình con.

Ưu điểm khi sử dụng cấu trúc chương trình con:

- Cấu trúc chương trình chính trở nên gọn, mạch lạc, dễ hiểu.

- Không lặp lại các phần tương tự.

- Vì là một mô đun độc lập, chương trình con có thể sử dụng nhiều lần trong một

chương trình hoặc ở các chương trình khác nhau.

- Dễ kiểm tra, theo dõi trong quá trình thử nghiệm.

2. Đặc điểm của Chương trình con:

- Là một đơn vị chương trình độc lập, hoàn chỉnh, cũng bao gồm 3 phần: tên chương trình,

phần khai báo và phần thân. Chương trình con có thể giải quyết một vấn đề trọn vẹn và

được sử dụng nhiều lần qua lời gọi nó trong chương trình chính.

- Toàn bộ các Chương trình con đặt ở cuối phần khai báo trong chương trình chính.

- Các biến trong chương trình con chỉ có tính chất cục bộ (chỉ có tác dụng trong bản thân

chương trình đó). Trong chương trình con có thể sử dụng tất cả các lệnh như chương trình

chính.

- Thứ tự khai báo các chương trình con không quan trọng nếu các chương trình độc lập với

nhau. Khi các chương trình con gọi đến nhau thì phải xếp theo một trật tự nào đó nếu. Ví dụ

chương trình con A gọi đến chương trình con B thì B phải khai báo trước A.

- Trong Pascal có 2 loại chương trình con: chương trình con dạng hàm (Function) và

chương trình con dạng thủ tục (Procedurre).

pdf 20 trang yennguyen 1440
Bạn đang xem tài liệu "Giáo trình Nhập môn tin học - Phần III: Ngôn ngữ lập trình Pascal (Phần 2)", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

Tóm tắt nội dung tài liệu: Giáo trình Nhập môn tin học - Phần III: Ngôn ngữ lập trình Pascal (Phần 2)

Giáo trình Nhập môn tin học - Phần III: Ngôn ngữ lập trình Pascal (Phần 2)
 TRƯỜNG ĐẠI HỌC XÂY DỰNG 
KHOA CÔNG NGHỆ THÔNG TIN 
------------  ------------ 
GIÁO TRÌNH 
MÔN HỌC: NHẬP MÔN TIN HỌC 
PHẦN III – NGÔN NGỮ LẬP TRÌNH PASCAL -2 
Giảng viên: ĐÀO TĂNG KIỆM 
Bộ môn : TIN HỌC XÂY DỰNG 
Hà nội 2012 
---------- 
Giáo trình Nhập môn Tin học: Phần III – Ngôn ngữ lập trình Pascal -2 GVC: Đào Tăng Kiệm 
Bộ môn Tin học Xây dựng 2 
Chương 4 CHƯƠNG TRÌNH CON 
I. Khái niệm chung – đặc điểm 
1. Khái niệm chung: 
Ở những chương trước chúng ta mới làm quen với cấu trúc của chương trình chính, trong đó 
để giải quyết một hoặc nhiều vấn đề, tất cả các lệnh đều nằm trong một chương trình và 
thực hiện các lệnh từ trên xuống dưới. Với những bài toán lớn, theo cấu trúc này chương 
trình chính rất dài, cồng kềnh, khó kiểm soát và không thể phân chia cho nhiều nhóm thực 
hiện đồng thời một lúc. 
Từ đó hình thành ý tưởng xây dựng chương trình con là một mô đun độc lập, kết nối với 
chương trình chính và các chương trình con khác qua “đầu vào” và “đầu ra”, chia nhỏ chức 
năng và cấu trúc chương trình chính thành nhiều mô đun nhỏ, trong đó chương trình chính 
là chương trình điều khiển quá trình tính toán của chương trình con. 
Trong những năm đầu khi bắt đầu xuất hiện ngôn ngữ lập trình, người ta chưa thiết lập được 
cấu trúc Chương trình con. Trong quá trình phát triển các ngôn ngữ đã có, cùng với nhu cầu 
của người sử dụng, những tiện lợi mà chương trình con mang lại, sự phát triển các ngôn ngữ 
đã có và khi xây dựng ngôn ngữ lạp trình mới đều hướng đến việc tổ chức chương trình con. 
Ưu điểm khi sử dụng cấu trúc chương trình con: 
- Cấu trúc chương trình chính trở nên gọn, mạch lạc, dễ hiểu. 
- Không lặp lại các phần tương tự. 
- Vì là một mô đun độc lập, chương trình con có thể sử dụng nhiều lần trong một 
chương trình hoặc ở các chương trình khác nhau. 
- Dễ kiểm tra, theo dõi trong quá trình thử nghiệm. 
2. Đặc điểm của Chương trình con: 
- Là một đơn vị chương trình độc lập, hoàn chỉnh, cũng bao gồm 3 phần: tên chương trình, 
phần khai báo và phần thân. Chương trình con có thể giải quyết một vấn đề trọn vẹn và 
được sử dụng nhiều lần qua lời gọi nó trong chương trình chính. 
- Toàn bộ các Chương trình con đặt ở cuối phần khai báo trong chương trình chính. 
- Các biến trong chương trình con chỉ có tính chất cục bộ (chỉ có tác dụng trong bản thân 
chương trình đó). Trong chương trình con có thể sử dụng tất cả các lệnh như chương trình 
chính. 
- Thứ tự khai báo các chương trình con không quan trọng nếu các chương trình độc lập với 
nhau. Khi các chương trình con gọi đến nhau thì phải xếp theo một trật tự nào đó nếu. Ví dụ 
chương trình con A gọi đến chương trình con B thì B phải khai báo trước A. 
- Trong Pascal có 2 loại chương trình con: chương trình con dạng hàm (Function) và 
chương trình con dạng thủ tục (Procedurre). 
- Chương trình con chỉ được tham chiếu đến nếu nó được gọi từ chương trình chính. 
Giáo trình Nhập môn Tin học: Phần III – Ngôn ngữ lập trình Pascal -2 GVC: Đào Tăng Kiệm 
Bộ môn Tin học Xây dựng 3 
- Mỗi lần gặp lời gọi chương trình con, chương trình chính chuyển đến chương trình con và 
thực hiện chúng, sau khi thực hiện, nó quay trở về chương trình chính thực hiện câu lệnh 
ngay sau lời gọi chương trình con. 
Minh họa cấu trúc của chương trình chính và chương trình con: 
Cấu trúc chương trình Chú thích 
Program Tên_chương_trình_chính; 
 Lebel – Const- Type 
 Var (Khai báo Các biến chung ) 
Các khai 
báo chung 
của CT 
chính 
 Function Tên_hàm ( Danh_sách_tham_số_hình thức) : 
kiểu_hàm ; 
 { Phần khai báo các biến cục bộ của hàm} 
Begin 
Các câu lệnh của chương trình con ạng hàm 
End; 
 Procedure Tên_Thủ_tục (Dsach_Tham_số_hình_thức); 
{ Phần khai báo các biến cục bộ của thủ tục} 
Begin 
Các câu lệnh của chương trình con thủ tục; 
 End; 
Khai báo 
các 
Chương 
trình con 
 - 
Nội dung 
các 
chương 
trình con 
Phần khai báo 
của chương 
trình chính 
BEGIN 
 Các lệnh ; 
 Lời gọi chương trình con; 
END. 
Phần thân 
của 
chương 
trình chính 
II. Thủ tục và hàm – cách khai báo 
1. Hàm – Function: Chương trình con dạng hàm dùng để tính cho các hàm hoặc xử lý 
cho những bài toán chỉ tính và xuất một kết quả. 
 Đặc điểm của chương trình con dạng hàm: 
- Tên chương trình con là tên biến chứa kết quả. 
- Dùng cho các bài toán chỉ tính 1 kết quả 
- Trong phần thân của chương trình con phải có một phép gán có chứa tên của CTC. 
- Lời gọi chương trình con hàm phải nằm trong thành phần của biểu thức hoặc phép gán 
và kết quả của chương trình con được lấy ra từ đó. 
 Cấu trúc chương trình con dạng hàm: 
Function Tên_hàm ( Danh_sách_tham_số_hình thức) : kiểu_hàm ; 
 { Phần khai báo các biến cục bộ của hàm} 
Begin 
Giáo trình Nhập môn Tin học: Phần III – Ngôn ngữ lập trình Pascal -2 GVC: Đào Tăng Kiệm 
Bộ môn Tin học Xây dựng 4 
Các câu lệnh; 
Tên_hàm:= Biểu_Thức 
 . . . . 
End; 
 Ví dụ: Để tính các hàm: 
F1 = a.x + 5b. x2 – (a+b). xy 
F2 = (7.a-c).x + b2. x2 + (a-b). xy 
F3 = c.x + (a+c). x2 – (a2+b2). xy 
F4 = (a/2).x + 5b. x2 – 120.b. xy 
- Chúng ta nhận thấy các hàm có 1 cấu trúc giống nhau có thể tổng quát hóa qua công thức : 
F= a1.x + a2. x2 +a3. xy 
Trong đó a1, a2, a3 có các giá trị khác nhau trong các hàm F1,.. F4. Chúng ta thiết lập một 
chương trình con dạng Function để tính cho một hàm “đại diện”, và sau đó gọi chúng ra tính 
cho các hàm F1..F4 như sau: 
- Chương tình con tính cho một hàm F bất kỳ: 
Nội dung Giải thích 
Function F ( a1, a2, a3 : real) : real; a1,a2,..Ten : các tham số hình 
thức 
Var x,y : real ; Khai báo 2 biến x,y lấy tên 
trùng với tên trong CT chính 
 Begin 
 F := a1* + a2* x2 +a3* x*y ; 
 Writeln ( ‘ Gia tri cua ham ’); 
 End; 
Thân của chương trình con, 
tính cho hàm F bất kỳ và sau 
đó in kết quả 
- Để tính toán cho các hàm F1,..F4 ta viết đoạn chương trình 
chính sau: 
Program Tinh_ham; Chương trình chính 
Var a,b,c, F1,F2,F3,F4,x,y : real ; Khai báo các tham số thực sự 
BEGIN 
 Writeln (‘ Nhap du lieu ’); 
 Write ( ‘ Nhap cac gia tri a,b,c ’); Readln ( a,b,c); 
 Write ( ‘ Nhap cac gia tri x,y ’); Readln ( x,y); 
Nhập dữ liệu cho chương trình 
chính 
 Writeln (‘ KET QUA ’); 
 F1:= F ( a, 5*b, - (a+b) ) ; Writeln (’F1= ’ , F1:8:2 ); 
 F2:= F ( 7*a-c , sqr(b), (a-b) ) ; Writeln (’F2= ’, F2:8:2 ); 
 F3:= F ( c, (a+c), - (a*a+b*b)) ; Writeln (’F3= ’ , F3:8:2 ); 
 F4:= F ( a/2, 5*b, - 120*b ) ; Writeln (’F4= ’ , F4:8:2 ); 
Gọi 4 lần CTcon tính hàm, 
mỗi lời gọi tính cho một hàm, 
ví dụ để tính F1 thay các tham 
số hình thức bằng các tham số 
thực sự như sau: a1= a; 
a2=5*b ;a3=a+b; 
 Readln ; 
END. 
Giáo trình Nhập môn Tin học: Phần III – Ngôn ngữ lập trình Pascal -2 GVC: Đào Tăng Kiệm 
Bộ môn Tin học Xây dựng 5 
2. Thủ tục - Procedure: 
 Đặc điểm của thủ tục: có thể dùng để tính cho bài toán bất kỳ. 
- Tên của chương trình con là một tên bất kỳ, theo cách đặt tên của Pascal. 
- Thủ tục có thể tính và xuất cho nhiều kết quả. 
 Cấu trúc chương trình con dạng thủ tục: 
Procedure Tên_thủ_tục ( Danh_sách_tham_số_hình thức) ; 
 { Phần khai báo các biến cục bộ của thủ tục} 
Begin 
Các câu lệnh; 
 . . . . 
End; 
 Ví dụ: Viết chương trình con nhập dữ liệu cho ma trận X bất kỳ có kích thước m 
hàng, n cột. 
Procedure Nhap_ma_tran ( Var m,n: integer; Var X :MT) ; 
 Var i,j :integer; 
 Begin 
 Write (' m, n = '); Readln (n,m); 
 for i:=1 to m do 
 for j:=1 to n do 
 begin 
 write (' X[', i, ',' , j ,']= ' ); readln (X [i,j]); 
 end 
 End; 
Chú ý: trong tham số hình thức đối với mảng, không được khai báo trực tiếp, do vậy, để 
khai báo cho X, trong chương trình chính phải mô tả trước kiểu, dùng lệnh Type ví dụ: 
Type MT=array[1..15,1..15] of real; 
(Tham khảo thêm ví dụ của chương trình con trong các ví dụ tổng hợp ở phần sau). 
3. Biến toàn cục và biến cục bộ: 
Biến toàn cục (tổng thể) là các biến của chương trình chính, các biến thực sự của chương 
trình và chỉ được đặt trong phần khai báo của chương trình chính. 
Biến cục bộ (đại phương) là các biến của chương trình con, nó chỉ có tác dụng trong chương 
trình con. Biến cục bộ cũng có thể dùng chung với biến toàn cục. Khai báo biến cục bộ, có 
thể qua một trong số các vị trí trong chương trình: 
- Đặt trong phần khai báo của chương trình con 
- Khai báo qua các tham số hình thức 
- Dùng chung với các biến toàn cục (tên phải giống nhau ở CT chính và CT con) 
III. Tham số 
1. Tham số hình thức: Chương trình con có thể có tham số hoặc không có tham số. 
Việc truyền tham số là cách kiểm soát các dữ liệu vào/ ra chương trình con, dễ dàng 
điều khiển các biến nằm ngoài và các trị liên quan đến chứng trong chương trình con. 
Giáo trình Nhập môn Tin học: Phần III – Ngôn ngữ lập trình Pascal -2 GVC: Đào Tăng Kiệm 
Bộ môn Tin học Xây dựng 6 
Khi sử dụng và tạo ra tham số chúng ta cần phải xác định: 
- Các dữ liệu nào từ bên ngoài cần truyền đến chương trình con hoặc các dữ liệu mà chương 
trình con sau khi tính toán cần lấy ra sử dụng tiếp. 
- Đặt tên cho tham số 
- Những dữ liệu nào sẽ bị chương trình con thay đổi 
- Loại tham số trong danh sách (tham trị hay tham biến) 
 Tham số hình thức là các tham số được khai báo ngay sau tên của hàm và thủ tục, đặt 
trong cặp ngoặc tròn. Nó là các tên giả định đại diện cho các đại lượng nào đó của 
các biến/trị đưa vào hoặc các trị cần đưa ra trong chương trình, nó là các biến cục bộ 
của CT Con. 
Danh sách tham số hình thức là tập hợp của nhiều nhóm, mỗi nhóm phải cùng loại và kiểu, 
các nhóm ngăn cách nhau bởi dấu chấm phẩy; còn trong một nhóm có thể có nhiều tên ngăn 
cách nhau bằng dấu phẩy. 
Dạng : (Nhóm 1 :kiểu; Nhóm 2: kiểu ); 
 Ví dụ: Procedure Tong_MT ( m,n: interger; A,B: VT2; var C: VT2); 
Trong ví dụ trên, danh sách tham số hình thức có 3 nhóm, nhóm 1 và 2 là tham trị, nhóm 3 
là tham biến. Nhóm 1 có kiểu nguyên, nhóm 2 và nhóm 3 có kiểu VT2, là một kiểu loại 
mảng đã khai báo trước đó. 
Trong danh sách tham số hình thức chỉ có 2 loại : Tham biến và tham trị. 
 Tham biến: là các tên trong phần khai báo của tham số hình thức có chữ Var ở 
trước, đó là các tham số truyền theo kiểu biến. Với kiểu truyền này, địa chỉ chứa các 
biến trước khi truyền vào CTCon và sau khi ra khỏi CTCon chung một vùng, do vậy 
nếu trong chương trình con làm thay đổi giá trị của nó thì ra khỏi CTC nó vẫn giữ 
nguyên giá trị đã bị thay đổi. 
Thông thường, tham biến dùng khai báo cho các dữ liệu cần chương trình con thay đổi và 
giữ lại sự thay đổi đó, ví dụ các dữ liệu, kết quả cần tính toán. Sử dụng tham biến sẽ tiết 
kiệm bộ nhớ. 
 Tham trị: là các tên trong phần khai báo của tham số hình thức không có chữ Var ở 
trước. Với tham trị, Pascal sử dụng 2 ô nhớ, một ô nhớ để chứa giá trị của biến trước 
khi truyền vào chương trình con và một ô nhớ chứa bản sao của tham trị dùng để tính 
toán trong chương trình con, do vậy các tác động trong chương trình con đến tham trị 
chỉ có tác dụng trong nội bộ CTCon. Khi kết thúc và ra khỏi chượng trình con, giá trị 
của tham trị sẽ lấy theo giá trị ban đầu, trước khi truyền vào CTCon nên giá trị của 
nó không bị thay đổi. 
Do vậy tham trị thường dùng để khai báo cho các dữ liệu cần truyền vào chương trình con 
mà ra khỏi CTC, các dữ liệu này không được thay đổi. 
Chú ý: 
- Trong danh sách tham số hình thức, khi khai báo mảng, tệp phải khai báo gián tiếp. 
Giáo trình Nhập môn Tin học: Phần III – Ngôn ngữ lập trình Pascal -2 GVC: Đào Tăng Kiệm 
Bộ môn Tin học Xây dựng 7 
- Chỉ những dữ liệu cần truyền vào, lấy ra mới đưa vào danh sách, tránh khai báo các biến 
không cần thiết ( ví dụ các chỉ số, biến đếm, các biến tính toán, xử lý trung gian). 
2. Tham số thực sự và cách truyền tham số: Chương trình con chỉ được thực hiện khi 
có lời gọi nó từ chương trình chính. Trong lời gọi chương trình con, các tham số thực tế của 
chương trình thay thế cho danh sách tham số hình thức gọi là Tham số thực sự. Tham số 
thực sự dùng để truyền dữ liệu vào chương trình con, thay các biến giả định bằng các hằng, 
biến, hàm hoặc biểu thức đơn giản (tùy thuộc vào nó thay cho tham biến hay tham trị). 
Tham số thực sự là các đại lượng đã được khai báo trong chương trình chính, các đại 
lượng dùng thực sự trong chương trình chính. 
Dạng: ( Danh_sách_tham_số_thực sự); 
Danh sách tham số thực sự có thể là các hằng, biến, hàm,bản ghi, tệp, biểu thức ngăn cách 
nhau bằng dấu phẩy. Việc thay thế danh sách này trong tham số thực sự gọi là truyền tham 
số. 
Danh sách truyền phải phù hợp với danh sách trong tham số hình thức về số lượng, thứ tự 
và kiểu. 
- Với tham trị : có thể truyền theo hằng, biến,biểu thức. 
- Với tham biến: chỉ truyền dữ liệu theo kiểu biến. 
- Tên của tham số hình thức và tham số thực sự có thể giống nhau 
Ví dụ: 
Tham số hình thức Truyền -Tham số thực sự 
( m,n: interger; A,B: VT2; var C: VT2); ( m, n, A, B, C); 
 (10, 5, X, Y, Z) 
III. Lời gọi chương trình con 
Chương trình con được dùng (tham chiếu đến) qua lời gọi của chương trình chính tại những 
chỗ cần thực hiện chương trình con. Số lần gọi là tùy ý, và mỗi lần gọi, danh sách tham số 
thực sự truyền vào danh sách tham số hình thức có thể khác nhau. Lời gọi CTC là một câu 
lệnh độc lập. 
 Dạng : Tên_chương trình_con ( Danh_sách_tham_số_thực_sự); 
Chú ý : Lời gọi hàm có thể đứng độc lập hoặc tham gia trong một vế của biểu thức gán ( lời 
gọi hàm). 
Khi gặp lời gọi chương trình con, chương trình chính sẽ chuyển đến thực hiện CTCon, thay 
tham số thực sự tương ứng với tham số hình thức và thực hiện CTCon, sau khi thực hiện 
xong, kết quả trả về chương trình chính thông qua các tham số và trở về chương trình chính 
tại câu lệnh ngay sau lời gọi chương trình con. 
 Ví dụ: Minh họa cho tham biến, tham trị và thực hiện lời gọi chương trình con 
Program Tham_bien; 
Var X,Y : integer ; 
{ Chương trinh con} 
Giáo trình Nhập môn Tin học: Phần III – Ngôn ngữ lập trình Pascal -2 GVC: Đào Tăng Kiệm 
Bộ môn Tin học Xây dựng 8 
Procedure Cong ( Var A,B : integer); 
 Begin 
 A:= A+1 ; B:= B+ 2 ; 
 Writeln ( ‘ Gia tri cua X, Y trong chương trinh con : ’ , A,B ); 
End; 
BEGIN { Chuong trinh chinh } 
X:=1 ; Y :=1 ; 
Writeln ( ‘ Gia tri cua X,Y truoc khi goi chuong trinh con ’, X, Y ); 
Cong (X,Y) ; 
Writeln ( ‘ Gia tri cua X,Ysau khi goi chuong trinh con ’, X, Y ); 
Readln 
END. 
-------------- 
Program Tham_tri; 
Var X,Y : integer ; 
{ Chương trinh con} 
Procedure Cong ( A,B : integer); Begin 
 A:= A+1 ; B:= B+ 2 ; 
 Writeln ( ‘ Gia tri cua X, Y trong chương trinh con : ’ , A,B ); 
End; 
BEGIN { Chuong trinh chinh } 
X:=1 ; Y :=1 ; 
Writeln ( ’ Gia tri cua X,Y truoc khi goi chuong trinh con ’, X, Y ); 
Cong (X,Y) ; 
Writeln (’ Gia tri cua X,Ysau khi goi chuong trinh con ’, X, Y ); 
Readln 
END. 
------------------------ 
Nội dung của 2 chương trình trên hoàn toàn giống nhau cả chương trình chính và chương 
trình con, sự khác nhau duy nhất là hai tham số hình thức A,B mà sau này được truyền vào 
bằng X,Y, ở chương trình con 1 khai báo dạng tham biến, còn ở chương trình con 2 khai 
báo là tham trị. 
Kết quả sau khi chạy 2 chương trình trên: 
 Chương trình Tham biến Chương trình Tham trị 
Gia tri cua X,Y truoc khi goi chuong tri ... hiểu được. 
- Muốn truy nhập tệp văn bản (nhập dữ liệu – lấy dữ liệu) phải tiến hành tuần tự.Ví dụ muốn 
lấy 1 dữ liệu ở giữa tệp thì cũng phải đọc các dữ liệu từ đầu đến vị trí muốn lấy DL (giữa 
tệp). 
- Có thể sử dụng bất cứ phần mềm soạn thảo văn bản nào để soạn nội dung của tệp. 
- Tệp văn bản đơn giản, dễ tạo và sử dụng. 
Giáo trình Nhập môn Tin học: Phần III – Ngôn ngữ lập trình Pascal -2 GVC: Đào Tăng Kiệm 
Bộ môn Tin học Xây dựng 11 
4. Tên tệp và biến tệp: 
 Như đã biết, mỗi tệp khi tạo hoặc sử dụng đều có một tên và phải chỉ ra tên trong quá trình 
truy nhập để chương trình có thể tìm đúng vị trí. Tên tệp là một xâu ký tự có 2 thành phần : 
đường dẫn và Tên. Trong tất cả các câu lệnh từ tạo tệp, mở tệp, truy nhập tệp đều phải chỉ 
ra tên tệp mà chúng ta muốn làm việc. Điều này làm cho chương trình rườm rà và khó “tổng 
quát” trong câu lệnh. Để tránh phiền toái và đơn giản cho câu lệnh, trong Pascal người ta 
đưa ra khái niệm biến tệp. Biến tệp như một bí danh cho mỗi tên tệp, nó thay cho tên tệp 
trong các câu lệnh. Bởi vậy, trước khi sử dụng, ta phải gán tên tệp cho biến tệp qua việc sử 
dụng thủ tục Assign. 
5. Các bước làm việc với tệp văn bản: 
- Khai báo (Tạo (nhập) tên tệp và gán Tên-> biến tệp) 
- Mở tệp 
- Truy nhập dữ liệu trong tệp (nhập dữ liệu vào tệp hoặc lấy dữ liệu ra từ tệp) 
- Đóng tệp 
II. Khai báo 
1. Tạo Tên tệp: tên tệp chứa dữ liệu có thể được đưa vào trực tiếp trong câu lệnh gán 
cho biến tệp, hoặc đưa vào trong mỗi lần thực hiện chương trình qua lệnh Read qua một 
biến có kiểu xâu ký tự. Các tên tệp phải khác nhau, nếu trùng tên, khi tạo tệp mới, dữ liệu 
trong tệp cũ sẽ bị xóa hết. 
2. Gán biến tệp cho tên tệp: 
 ASSIGN ( Biến tệp, Tên tệp ); 
Biến tệp có kiểu text, ngắn, thường sử dụng các ký hiệu f, f1, f2  
Tên tệp có thể có dạng hằng xâu kí tự (tên cụ thể) hoặc dạng biến. 
 Ví dụ: 
- Gán trực tiếp : Assign ( f, ’D:\Bai_tap\ DL1.dat’ ); 
Theo cách này, tên tệp là hằng xâu sẽ cố định trong các lần thực hiện chương trình hoặc 
muốn thay tên phải thay trực tiếp trong câu lệnh Assign. 
- Gán gián tiếp tên qua một biến trung gian: 
 Write ( ’ Hay nhap ten tep chua du lieu’); Readln (Ten_tep); 
 Assign ( f, Ten_tep ); 
Theo cách này, tên tệp sẽ thay đổi trong mỗi lần thực hiện chương trình, do người sử dụng 
nhập vào khi gặp lệnh Read. 
III. Mở tệp 
Tất cả các tệp trước khi làm việc đều phải dùng thủ tục mở tệp. Trong Pascal mở tệp để tạo 
tệp mới hay mở tệp để lấy dữ liệu ra từ tệp sẽ dùng các lệnh khác nhau. 
Các dạng lệnh: 
Giáo trình Nhập môn Tin học: Phần III – Ngôn ngữ lập trình Pascal -2 GVC: Đào Tăng Kiệm 
Bộ môn Tin học Xây dựng 12 
1. Mở tệp để tạo tệp mới: 
REWRITE (Biến_tệp); 
2. Mở tệp để đưa thêm dữ liệu vào tệp đã có: 
APPEND (Biến_tệp); 
3. Mở tệp để lấy dữ liệu ra từ tệp 
RESET (Biến_tệp); 
Chú ý: - Khi gặp lệnh Rewrite chương trình sẽ kiểm tra, nếu tên tệp chưa tồn tại, tệp mới 
được tạo, nếu tên tệp đã có, chương trình sẽ xóa hết dữ liệu của tệp cũ và thay thế vào đó dữ 
liệu mới. 
- Khi gặp lệnh Append và Reset chương trình sẽ kiểm tra tên tệp được gán cho biến tệp, nếu 
chưa tồn tại, sẽ thông báo: “ File not found”. 
IV. Đóng tệp 
Tất cả các tệp sau khi sử dụng: nhập dữ liệu hoặc lấy dữ liệu ra đều phải đóng lại. 
Cấu trúc của lệnh : 
 CLOSE (Biến_tệp); (Đóng 1 tệp ) 
hoặc CLOSE (All); (Đóng tất cả các tệp đã mở) 
Chú ý : Các lệnh gán biến tệp, mở tệp, đóng tệp không được đặt trong các lệnh chu trình. 
Thông thường, chúng ta nên viết các lệnh này (trừ Close) ở đầu chương trình, trước khi xử 
lý dữ liệu. 
V. Nhập dữ liệu vào tệp 
Để nhập các dữ liệu vào tệp chúng ta sử dụng lệnh Write và có thể kết hợp với các lệnh 
khác của Pascal. 
 Cấu trúc lệnh: 
 WRITE[LN] ( Biến_tệp, Danh sach biểu thức) ; 
 WRITE[LN] ( Biến_tệp) ; 
- Cách sử dụng lệnh cũng như lệnh Write thông thường, chỉ khác là có thêm biến tệp 
để chương trình nhận biết dữ liệu sẽ được ghi vào tệp nào (địa chỉ). 
- Trước khi nhập dữ liệu vào tệp, thì các dữ liệu này phải đã có ở bộ nhớ trong. 
- Có thể kết hợp vừa nhập dữ liệu vào máy, vừa cất vào tệp hoặc làm độc lập với nhau. 
- Lệnh Writeln (f) dùng để in một dòng trống trong tệp hoặc chuyển con trỏ xuống 
dòng dưới. 
- Khi cất dữ liệu vào tệp nên dùng cấu trúc có định dạng, như vậy có thể tạo ra các ô 
trống giữa các giá trị và chúng có thể được Pascal nhận dạng khác nhau. 
 Ví dụ: Nhập các dữ liệu của véc tơ A có n phần tử vào tệp có tên là Bai1.txt đặt tại ổ 
đĩa D. 
 Assign ( f, ’D:Bai1,txt’); 
 Rewrite ( f ); Writeln ( ’ Nhap cac phan tu cua A vao tep); 
Giáo trình Nhập môn Tin học: Phần III – Ngôn ngữ lập trình Pascal -2 GVC: Đào Tăng Kiệm 
Bộ môn Tin học Xây dựng 13 
 Write ( ’ n= ’ ); Readln (n); 
 For i:= 1 to n Do 
 Begin 
 Write ( ‘ A[ ’ , i , ’ ] ’ ); Readln ( A[i] ) {Nhap du lieu vao bo nho trong} 
 Write (f, a[i] :6:1 ); {Nhap du lieu vao tệp} 
 End; Close (f) 
VI. Lấy dữ liệu ra từ tệp 
Để lấy các dữ liệu ra từ tệp, chúng ta sử dụng lệnh Read và có thể kết hợp với các lệnh khác 
của Pascal. 
 Cấu trúc lệnh: 
 READ[LN] ( Biến_tệp, Danh sách biến) ; 
 READ[LN] ( Biến_tệp) ; 
- Cách sử dụng lệnh cũng như lệnh Read thông thường, chỉ khác là có thêm biến tệp để 
chương trình nhận biết dữ liệu sẽ được lấy ra từ tệp nào (địa chỉ). 
- Lệnh Readln (f) dùng để bỏ qua 1 dòng dữ liệu hoặc chuyển con trỏ xuống dòng 
dưới. 
- Cách lấy dữ liệu ra từ tệp phải hoàn toàn giống cách tạo ra chúng. 
- Gặp lệnh Read, chương trình sẽ tuần tự đọc các dữ liệu trong tệp và gán cho các biến 
tương ứng trong danh sách của lệnh. Các dữ liệu khác nhau trong 1 dòng lệnh của tệp 
được nhận biết qua ít nhất một ô trống. Các dữ liệu viết liền nhau, chương trình coi 
như một dữ liệu. 
- Các giá trị lấy ra từ tệp có thể gán cho các biến bất kỳ, với tên bất kỳ (không nhất 
thiết cùng tên với các biến đã cất nó vào tệp). Tuy nhiên kiểu và cấu trúc của dữ liệu 
trong tệp phải khớp với các biến nhận giá trị. 
 Ví dụ: Đọc các dữ liệu của véc tơ A có n phần tử từ tệp có tên là Bai1.txt đặt tại ổ 
đĩa D. 
 Assign ( f, ’D:Bai1,txt’); 
 Reset ( f ); Writeln ( ’ Lay du lieu tu tep gan cho cac phan tu cua A ’); 
 For i:= 1 to n Do 
 Read (f, a[i] ); 
 Close (f); 
 Ví dụ: Tạo tệp để cất dữ liệu cho ma trận A(mxn) và sau đó mở tệp lấy dữ liệu ra và 
cất vào ma trận B(m1xn1): 
Program Tao_Tep_LayDL_tu_tep; 
 Var n,m,i,j:integer; 
 n1, m1:integer; 
 a, b: array[1..10,1..15] of real; 
 f: text; Ttep, ten2: string[20]; 
 BEGIN 
 Write( ' Nhap ten tep cat du lieu '); 
 Readln ( Ttep); 
Giáo trình Nhập môn Tin học: Phần III – Ngôn ngữ lập trình Pascal -2 GVC: Đào Tăng Kiệm 
Bộ môn Tin học Xây dựng 14 
 Assign (f, Ttep); 
 Rewrite (f); 
 Write ('Nhap kich thuoc ma tran A n,m=? '); 
 Readln (n,m); 
 Writeln (f, n:5,m:5); 
 for i:=1 to n do 
 for j:=1 to m do 
 begin 
 write ( 'a[',i,',',j,']=?' ); 
 readln ( a[i,j] ) 
 end; 
 { In ma tran A len man hinh va cat vao tep } 
 Writeln; 
 Writeln ( ' Ma tran A truoc khi cat vao tep ' ); 
 for i:=1 to n do 
 begin 
 for j:=1 to m do write ( a[i,j]:10:2 ); 
 writeln; 
 for j:=1 to m do write ( f, a[i,j]:10:2 ); 
 writeln ( f ); 
 end; 
 close ( f ); 
 write (' Nhap ten tep cab lay du lieu' ); Readln ( ten2 ); 
 Assign ( f, ten2); 
 Reset ( f ); 
 Writeln; 
 Writeln ( ' Cac du lieu lay ra tu tep ' ); 
 Readln ( f, n1, m1); writeln; 
 Writeln ( 'n= ',n1:3,' m= ',m1:3); 
 Writeln ( ' Ma tran A sau khi lay tu tep ' ); writeln; 
 for i:=1 to n1 do 
 begin 
 for j:=1 to m1 do read (f, b[i,j] ); 
 readln ( f ); 
 end; 
 close (f) ; { sau khi doc du lieu tu tep In na tran B len man hinh } 
 for i:=1 to n1 do 
 begin 
 for j:=1 to m1 do write ( b[i, j]:10:1 ); 
 writeln; 
 end; 
 readln 
 END. 
Giáo trình Nhập môn Tin học: Phần III – Ngôn ngữ lập trình Pascal -2 GVC: Đào Tăng Kiệm 
Bộ môn Tin học Xây dựng 15 
Chương 6. MỘT SỐ VÍ DỤ TỔNG HỢP 
Bài 1 : Cho một lớp học sinh, biết mã số SV, tên và điểm thi 3 môn của mỗi sinh viên. Viết 
chương trình (cấu trúc dữ liệu kiểu bản ghi) tính điểm trung bình của từng người và sắp xếp 
lại danh sách theo điểm trung bình tăng dần 
Program Vi_du_Ban_ghi_Sapxep; 
type sinhvien = record 
 masv:string[10]; 
 tensv: string[30]; 
 dt,dl,dh,dtb:real; 
 end; 
var 
 temp:sinhvien; 
 sv:array[1..100] of sinhvien; 
 n, i, j: integer; 
BEGIN 
 {Nhap du lieu n sinh vien} 
 write('Nhap so sinh vien:'); 
 readln(n); 
 for i:=1 to n do 
 begin 
 writeln('Nhap thong tin cua sv thu ' , i); 
 write('Ma sv:'); readln(sv[i].masv); 
 write('Ten sv:'); readln(sv[i].tensv); 
 write('Diem toan:'); readln(sv[i].dt); 
 write('Diem ly:'); readln(sv[i].dl); 
 write('Diem hoa:'); readln(sv[i].dh); 
 sv[i].dtb := (sv[i].dt+sv[i].dl+sv[i].dh)/3; 
 end; 
 {in ra danh sach sinh vien vua nhap} 
 writeln; 
 writeln(' Danh sach sinh vien vua nhap'); 
 writeln(' STT ','Masv':5,'Tensv':10,' DT DL DH DTB'); 
 for i:=1 to n do 
 writeln(i:4, sv[i].masv:5, sv[i].tensv:10, sv[i].dt:6:1, sv[i].dl:6:1, sv[i].dh:6:1, 
sv[i].dtb:6:1); 
 {sap xep danh sach sinh vien theo diem trung binh tang dan} 
 for i:= 1 to n do 
 for j:=i+1 to n do 
 if (sv[i].dtb >sv[j].dtb) then 
 begin 
 temp:=sv[i]; 
 sv[i]:=sv[j]; 
 sv[j]:=temp; 
 end; 
Giáo trình Nhập môn Tin học: Phần III – Ngôn ngữ lập trình Pascal -2 GVC: Đào Tăng Kiệm 
Bộ môn Tin học Xây dựng 16 
 {in ket qua sau danh sach sinh vien sau khi sap xep} 
 writeln; 
 writeln(' Danh sach sinh vien sap theo thu tu dtb tang dan'); 
 writeln(' STT ','Masv':5,'Tensv':10,' DT DL DH DTB'); 
 for i:=1 to n do 
 writeln(i:4, sv[i].masv:5, sv[i].tensv:10, sv[i].dt:6:1, sv[i].dl:6:1, sv[i].dh:6:1, 
sv[i].dtb:6:1); 
readln; 
END. 
Bài 2 : Cho một véc tơ A có n phần tử,tính tổng các phần tử của mảng, tạo tệp để cất các 
dữ liệu . 
 Program Mang_1_chieu; 
 var 
 i,n : Byte; 
 A : Array[1..50] of Real; 
 s : Real; tentep: string[10]; 
 f : Text; 
 BEGIN 
 {Nhap mang} 
 Write('n = '); 
 ReadLn(n); 
 For i:=1 To n Do 
 Begin 
 Write('A[',i,']= '); 
 ReadLn(A[i]); 
 End; 
 {Tinh Tong Mang} 
 s:=0; 
 For i:=1 To n Do s:=s+A[i]; 
 WriteLn('s = ',s:7:3); 
 WriteLn; 
 {Ra Mang} 
 WriteLn( ' Mang vua nhap '); 
 For i:=1 To n Do Write(A[i]:7:3); 
 WriteLn( ' Mang vua nhap '); 
 Write('Nhap ten tep cat du lieu'); ReadLn(tentep); 
 Assign(f,tentep); 
 ReWrite(f); 
 WriteLn(f,'s = ',s:7:3); 
 WriteLn(f); 
 {Ra Mang} 
 For i:=1 To n Do Write(f,A[i]:7:3); 
 WriteLn(f); 
 Close(f); 
Giáo trình Nhập môn Tin học: Phần III – Ngôn ngữ lập trình Pascal -2 GVC: Đào Tăng Kiệm 
Bộ môn Tin học Xây dựng 17 
 WriteLn('Da xuat xong du lieu ra File '); 
 ReadLn; 
 END. 
Bài 3 : Cho một lớp học sinh có n người, biết mã số SV, tên và điểm thi m môn của mỗi 
sinh viên. Viết chương trình (cấu trúc dữ liệu kiểu bản ghi) tính điểm trung bình của từng 
người và tách danh sách lớp thành 3 danh sách: những SV có DTB nhỏ hơn 5 từ 5-7,và 
DTB >8. 
Program Ban_ghi_Tao_danh_sach; 
 type sv=record 
 ms:integer; 
 ht:string[25]; 
 d:array[1..20] of real; 
 dtb:real 
 end; 
 var n,m,n1,n2,n3,i,j,k:integer; 
 ds,ds1,ds2,ds3:array[1..30] of sv; 
 ttsv:sv; 
 t:real; 
 BEGIN 
 write('Nhap so nguoi n, somon m= '); readln(n,m); 
 for i:=1 to n do 
 begin 
 write('ms[',i,']=? '); readln(ds[i].ms); 
 write('ht[',i,']=? '); readln(ds[i].ht); 
 for j:=1 to m do 
 begin 
 write('d[',j,']=? '); readln(ds[i].d[j]); 
 end 
 end; 
 for i:=1 to n do 
 begin 
 t:=0; 
 for j:=1 to m do t:=t+(ds[i].d[j]); 
 ds[i].dtb:=t/m 
 end; 
 n1:=0; n2:=0; n3:=0; 
 for i:=1 to n do if ds[i].dtb<5 then 
 begin 
 n1:=n1+1; 
 ds1[n1]:=ds[i] 
 end else if ds[i].dtb<8 then 
 begin 
 n2:=n2+1; 
 ds2[n2]:=ds[i] 
 end else 
Giáo trình Nhập môn Tin học: Phần III – Ngôn ngữ lập trình Pascal -2 GVC: Đào Tăng Kiệm 
Bộ môn Tin học Xây dựng 18 
 begin 
 n3:=n3+1; 
 ds3[n3]:=ds[i] 
 end; 
 writeln; 
 If n1 0 then 
 begin 
 writeln('1. DS SINH VIEN CO DTB<5:'); 
 for i:=1 to n1 do writeln(ds1[i].ms:5,ds1[i].ht:15,ds1[i].dtb:10:1); 
 end; 
 writeln; 
 if n20 then 
 begin 
 writeln('2. DS SINH VIEN CO DTB: 5-7:'); 
 for i:=1 to n2 do writeln(ds2[i].ms:5,ds2[i].ht:15,ds2[i].dtb:10:1); 
 end; 
 writeln; 
 if n30 then 
 begin 
 writeln('3. DS SINH VIEN CO DTB: 8-10:'); 
 for i:=1 to n3 do writeln(ds3[i].ms:5,ds3[i].ht:15,ds3[i].dtb:10:1); 
 end; 
 writeln; 
 readln 
 END. 
Bài 4 : Cho một ma trận A (nxm). Sắp xếp lại ma trận sao cho các phần tử trong từng hàng 
tăng dần. Viết 3 chương trình con:một chương trình con nhập dữ liệu, 1 chương trình con 
sắp xếp và 1 chương trình con in kết quả. 
Program Chuong_trinh_con_sap_xep_ma_tran; 
 type k1=array[1..15,1..15] of real; 
 var n,m,i,j,k:integer; 
 a:k1; 
 c:real; 
 Procedure nhap; 
 begin 
 write('n,m=?'); 
 readln(n,m); 
 for i:=1 to n do 
 for j:=1 to m do 
 begin 
 write('A[',i,',',j,']=?'); 
 readln(a[i,j]); 
 end 
 end; 
Giáo trình Nhập môn Tin học: Phần III – Ngôn ngữ lập trình Pascal -2 GVC: Đào Tăng Kiệm 
Bộ môn Tin học Xây dựng 19 
 Procedure XL; 
 begin 
 for i:=1 to n do 
 for j:=1 to m-1 do 
 for k:=j+1 to m do if a[i,j]>a[i,k] then 
 begin 
 c:=a[i,j]; 
 a[i,j]:=a[i,k]; 
 a[i,k]:=c 
 end 
 end; 
 Procedure IKQ; 
 begin 
 for i:=1 to n do 
 begin 
 for j:=1 to m do write(a[i,j]:12:2); 
 writeln 
 end 
 end; 
{ Chuong trinh chinh} 
BEGIN 
 nhap; 
 xl; 
 ikq; 
 readln 
 END. 
Bài 5 : 
Bài 6 : Cho trước 2 tệp dữ liệu chứa các thông tin của sinh viên: tệp thứ nhất chứa các dữ liệu về 
số thứ tự và tên của từng sinh viên; tệp thứ hai gồm các thông tin về số thứ tự, mã số sinh viên, năm 
sinh và điểm tốt nghiệp của từng sinh viên. Viết chương trình Pascal để lấy các dữ liệu từ tệp sau 
đó lập danh sách sinh viên giỏi ( có điểm tốt nghiệp >8) in trên màn hình. 
Program Lay_du_lieu_ra_tu_tep_da_co_va_Xu_ly; 
Type 
 sv=record 
 tt:integer; 
 ht:string[15]; 
 ms,ns,dtn:real; 
 end; 
Var 
i,n:integer; 
tentep1,tentep2:string[10]; 
f1,f2:text; 
ds:array[1..10] of sv;{ Mang chua cac du lieu cua hoc sinh} 
Giáo trình Nhập môn Tin học: Phần III – Ngôn ngữ lập trình Pascal -2 GVC: Đào Tăng Kiệm 
Bộ môn Tin học Xây dựng 20 
BEGIN 
{ Doc du lieu tu tep thu nhat va cat vao mang danh sach co cau truc ban ghi} 
write(' Dua vao ten tep chua du lieu - hoten '); 
readln(Tentep1); 
Assign (f1,tentep1); 
Reset(f1); 
i:=1; 
readln(f1); 
While not EOF(f1) Do 
 with ds[i] do 
 Begin 
 readln(f1,tt,ht); 
 i:=i+1; 
 end; 
n:=i-1; 
Close(f1); 
{ Doc du lieu tu mang thu hai cat tiep vao mang truoc } 
write(' Dua vao ten tep chua thong tin hoc sinh-thongtin '); 
readln(tentep2); 
Assign (f2,tentep2); 
Reset(f2); 
i:=1; 
readln(f2); 
While not EOF(f2) do 
 with ds[i] do 
 begin 
 readln(f2,tt,ms,ns,dtn); 
 i:=i+1; 
 End; 
close(f2); 
Writeln; 
Writeln(' Danh sach day du '); 
For i:=1 to n do with ds[i] do 
writeln(tt:3,ht:15,' ',ms:6:0,' ',ns:6:0,' ',dtn:5:1); 
Writeln; 
Writeln ( ' DANH SACH SINH VIEN GIOI '); 
For i:= 1 to n do 
 with ds[i] do 
 If dtn>=8 then 
 Writeln (tt:3,' ',ht:15,' ',ms:5:0,' ',ns:5:0,' ',dtn:5:1); 
Readln 
END. 

File đính kèm:

  • pdfgiao_trinh_nhap_mon_tin_hoc_phan_iii_ngon_ngu_lap_trinh_pasc.pdf