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.
20 trang |
Chia sẻ: huongthu9 | Lượt xem: 497 | Lượt tải: 0
Bạn đang xem nội dung tài liệu Bài giảng Nhập môn Tin học - Phần 4: Chương trình con - Đào Tăng Kiệm, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
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 trinh con 1 1 1 1
Gia tri cua X,Y trong chuong trinh con 2 3 2 3
Gia tri cua X,Y truoc khi goi chuong trinh con 2 3 1 1
Từ đó có thể thấy việc khai báo tham biến hay tham trị là rất quan trọng và ảnh hưởng đến
kết quả tính toán.
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 9
Sơ đồ điều khiển giữa chương trình chính và chương trình con
Cấu trúc chương trình Điều khiển Giải thích
Program Chuong_trinh_chinh;
.
Chương trình chính
Phần khai báo chương trình chính
Procudere CTC1 ( Danh_sach);
. . . . thực hiện
End;
Khai báo- Toàn bộ CT con 1
Procedure CTC2 (Danh_sach);
thực hiện
End;
Khai báo- Toàn bộ CT con 2
BEGIN
CTC1 ( Tham_so_thuc_su);
Phần thân Chương trình chính
Lời gọi chương trình con 1
CTC2 (Tham_so_thuc_su);
.
Lời gọi chương trình con 2
3. Các bài tập áp dụng:
Bài 1: Cho 2 véc tơ A, B có m phần tử. Viết chương trình con tính các véc tơ C= A+B;
D=A+C; E= B+D , trong đó viết 2 chương trình con, một chương trình con nhập dữ liệu
cho một véc tơ và một chương trình con tính tổng 2 véc tơ.
Bài 2: Cho một ma trận A vuông (mảng 2 chiều) có m hàng, n cột.
- Tính trung bình cộng từng hàng của ma trận.
- Tìm giá trị lớn nhất của từng cột của ma trận.
trong đó viết 3 chương trình con, một chương trình con nhập dữ liệu cho ma trận, một
chương trình con tính tổng từng hàng của ma trận và chương trình con tính giá trị lớn nhất
từng cột của ma trận.
Bài 3: Cho dữ liệu của một phường dân cư có m người. Biết các thông tin Tên chủ hộ, Địa
chỉ, Tổng số điện tiêu thụ mỗi tháng của mỗi nhà trong 12 tháng.
- Nhập các thông tin của từng hộ
- Tính tổng số điện tiêu thụ trong cả năm của mỗi nhà
- Tính tiền điện của từng hộ trong cả năm theo lũy tiến như sau:
Tổng số điện cả năm 150 số : 5000đ/ số
- Tính số lượng những hộ phải trả tiền điện trong cả năm > X đồng
Viết 2 chương trình con: một chương trình con nhập dữ liệu và một chương trình con tính
tiền điện cho từng hộ.
Chương 5 TỆP VĂN BẢN
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 10
I. Khái niệm về tệp (File)
1. Lý do dùng tệp
Trong quá trình tạo lập biến và các dữ liệu đưa vào theo danh sách biến cũng như quá trình
lưu trữ các kết quả tính được trong chương trình Pascal ở các chương trước gặp nhiều tổn
thất, đó là khi mất điện hoặc tắt máy, chuyển chương trình các dữ liệu đã nhập và kết quả
đang hiện trên màn hình sẽ mất hết. Bên cạnh đó khi làm các bài toán lớn, khối lượng dữ
liệu nhiều, quá trình nhập dữ liệu mất nhiều thời gian và dữ liệu cần lưu lại hoặc có thể sử
dụng cho những mục đích khác thì cách nhập-xuất trực tiếp không hiệu quả.
Vấn đề là cần một phương pháp để lưu trữ các dữ liệu đã nhập và có thể thêm – xóa - sửa
chúng một cách dễ dàng, đó là mục đích sử dụng cấu trúc tệp dữu liệu.
2. Cấu trúc tệp:
Tệp là một kiểu dữ liệu có cấu trúc, tập hợp các dữ liệu có liên quan đến nhau được chứa
trong một thiết bị nhớ ngoài (băng, đĩa,) với một tên nào đó, do vậy dữ liệu trong tệp
được lưu trữ và sử dụng nhiều lần. Khác với các tệp chương trình, tệp văn bản, tệp dữ
liệu trong Pascal có thể tạo ra từ các câu lệnh của chương trình Pascal hoặc từ một phần
mềm soạn thảo văn bản.
Tệp dữ liệu là một tập hợp các loại dữ liệu dưới dạng Văn bản hoặc Bản ghi và được tổ
chức theo một cách nào đó, được đặt một tên và lưu trong đĩa.
Việc tổ chức và sử dụng tệp được gắn bó với nhau và gọi chung là phương pháp truy nhập
tệp. Có 2 phương pháp truy nhập là truy nhập tuần tự và truy nhập trực tiếp. Truy nhập tuần
tự là tệp được tổ chức để nhập dữ liệu vào và lấy ra một cách tuần tự, từ đầu đến cuối tệp
hoặc từ bản ghi đầu đến bản ghi cuối. Truy nhập trực tiếp hay ngẫu nhiên là tổ chức dữ liệu
và nhập – lấy dữ liệu từ tệp theo một địa chỉ bất kỳ (kiểu cấu trúc bản ghi và truy nhập đến
địa chỉ của bản ghi).
3. Các loại tệp
Có 3 loại tệp : Tệp mã, Tệp văn bản và Tệp không định kiểu.
Trong nội dung chương trình, chúng ta chỉ đề cập đến Tệp văn bản.
Tệp văn bản là tệp dữ liệu được lưu trữ dưới dạng mã ASCII và xếp theo dòng. Các dòng
ngăn cách nhau bằng tín hiệu EOLN (End of line),và đánh dấu ở vị trí cuối tệp là ký hiệu
EOF (end of file). Độ dài của các dòng trong tệp có thể thay đổi.
Đặc điểm: - Dữ liệu ghi trong tệp dạng ký tự do đó có thể đọc và 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.
Các file đính kèm theo tài liệu này:
- bai_giang_nhap_mon_tin_hoc_phan_4_chuong_trinh_con_dao_tang.pdf