Giáo trình Tin học đại cương - Phần 2 - Chương 6: Kiểu dữ liệu có cấu trúc Kiểu bản ghi và kiểu tệp
Kiểu bản ghi là một kiểu dữ liệu có cấu trúc gồm một số cố ñịnh các phần tử có kiểu khác
nhau.
Kiểu bản ghi dùng ñể mô tả các dữ liệu có nhiều thành phần khác kiểu liên kết với nhau như
dữ liệu của các bảng, các cột của bảng là các thành phần, mỗi cột có một kiểu dữ liệu khác
nhau, các cột liên kết với nhau ñể biểu diễn một nội dung nhất ñịnh.
Ví dụ1: Bảng lương bao gồm các cột: Số thứ tự, Họ và tên, Ngày sinh, Hệ số, Lương, Bảo
hiểm xã hội, Tổng lĩnh. Mỗi dòng của bảng lương thuộc kiểu dữ liệu bản ghi. Các cột là các
thành phần còn ñược gọi là các phần tử.
ign(f, 'Diem.dat' );
reset(f);
write(‘ Diem chuan : ‘); readln(diemc);
writeln(‘ Danh sach thi sinh trung tuyen dai hoc ‘);
while not eof(f) do
begin
read(f,hs);
with hs do
if toan+ly+hoa >= diemc then writeln(ten:25,toan:10:1,ly:10:1,hoa:10:1);
end;
close(f);
end; { ket thuc thu tuc doc}
{******************}
{ than chuong trinh chinh}
repeat
clrscr;
writeln(‘ 1- Tao tep’);
writeln(‘ 2- Doc tep’);
writeln(‘ 3- Ket thuc’);
write(‘ Hay chon mot viec ? ‘); readln(i);
case i of
1: tao;
2: doc;
Trường ðại học Nông nghiệp 1 - Giáo trình Tin học ñại cương --------------------------------------------- 170
170
end;
until i=3;
readln;
end.
2.6 - Truy nhập tệp trực tiếp
Các phần ñã xét ở trên là truy nhập tuần tự tệp có ñịnh kiểu. Trong phần này ta xét cách
truy nhập trực tiếp tệp có ñịnh kiểu.
Sử dụng tất cả các thủ tục và lệnh ñã nêu ở trên, ngoài ra ñể truy nhập trực tiếp tệp còn
sử dụng một số thủ tục và hàm sau.
* Thủ tuc Seek ñể dịch chuyển con trỏ tệp
Seek( biến_tệp, n);
n có kiểu longint. Thủ tục này thực hiện chuyển con trỏ tệp tới phần tử thứ n.
Trong tệp phần tử ñầu ñược ñánh thứ tự là 0.
* Hàm Filepos
Filepos(biến_tệp)
Hàm này cho vị trí hiện thời của con trỏ tệp. Ví trí ñầu là 0.
* Hàm Filesize
Filesize(biến_tệp)
Hàm này cho số lượng phần tử của tệp. Hàm cho giá trị 0 khi tệp rỗng.
ðể thêm 1 phần tử vào tệp phải thêm vào cuối tệp. Như vậy phải dịch con trỏ tới cuối tệp
bằng thủ tục seek như sau:
seek(biến_tệp, Filesize(biến_tệp)-1 );
* Ví dụ chương trình truy nhập tệp trực tiếp
Bài toán 1: Tạo tệp ‘sochan.dat’ ghi các số nguyên dương chẵn <=20. Truy nhập ñể sửa một
phần tử bất kỳ và thêm một phần tử vào tệp.
Chương trình
Program truy_nhap_truc_tiep_tep;
uses crt;
var i,j : integer; f: file of byte;
{ thu tuc tao tep }
procedure tao;
begin
clrscr;
assign(f, ‘sochan.dat’);
rewrite(f);
for i:=1 to 20 do
if (i mod 2) =0 then write(f, i);
close(f);
readln;
end; {ket thuc thu tuc tao }
{ thu tuc sua }
procedure sua;
begin
clrscr;
reset(f);
Trường ðại học Nông nghiệp 1 - Giáo trình Tin học ñại cương --------------------------------------------- 171
171
write(‘ sua phan tu thu ? ‘); readln(i);
seek(f, i-1);
read(f,j);
witeln(‘ gia trị cu: ‘, j);
write(‘ nhap gia tri moi : ‘);
readln(j);
seek(f, i-1);
write(f, j);
close(f);
end; { ket thuc thu tuc sua }
{ thu tuc them phan tu }
procedure them;
begin
clrscr;
reset(f);
write(‘ gia tri moi them: ‘);
readln(j);
seek(f, filesize(f)-1);
write(f,j);
close(f);
readln;
end; {ket thuc thu tuc sua }
{ thu tuc doc }
procedure doc;
uses crt;
clrscr;
reset (f);
while not eof(f) do
begin
read(f,i);
witeln(i);
end;
close(f);
end; { ket thuc thu tuc doc}
{******************}
{ than chuong trinh chinh}
repeat
clrscr;
writeln(‘ 1- Tao tep’);
writeln(‘ 2- Sua tep’);
writeln(‘ 3- Them phan tu’);
writeln(‘ 4- Doc tep’);
writeln(' 5- ket thuc ');
write(‘ Hay chon mot viec ? ‘); readln(i);
case i of
1: tao;
Trường ðại học Nông nghiệp 1 - Giáo trình Tin học ñại cương --------------------------------------------- 172
172
2: sua;
3: them;
4: doc;
end;
until i=5;
readln;
end.
2.7 - Tệp văn bản
* Khai báo tệp văn bản
Trong Pascal có một kiểu tệp ñã ñược ñịnh nghĩa trước ñó là tệp văn bản, ñược ñịnh
nghĩa với từ chuẩn TEXT.
Khai báo kiểu tệp văn bản;
Var Ten_bien: TEXT;
Các phần tử của TEXT là các kiểu kí tự, ñược tổ chức thành các dòng với ñộ dài của các dòng
khác nhau, nhờ có thêm các dấu hết dòng (End of Line). ðó là cặp kí tự ñiều khiển CR
(Carriage Return, nhẩy về ñầu dòng, mã ASCII là 13) và LR(Line Feed: xuống dòng, mã
ASCII là10), chúng dùng ñể ngăn cách các dãy kí tự tương ứng với 2 dòng khác nhau.
Ví dụ: ðoạn văn bản sau:
HANOI
123
THUDO
ðược chứa trong tệp văn bản thành một dãy như sau:
HANOI CR LF 123 CR LF THUDO CR LF EOF
Do tệp văn bản ñược tổ chức thành từng dòng nên việc ghi và ñọc tệp văn bản có thẻ tục ghi
và ñọc theo dòng.
* Ghi vào tệp văn bản
Có thể ghi các giá trị kiểu Integer, real, boolean, string vào tệp văn bản bằng lệnh
Write hoặc Writeln, các lệnh này cho phép chuyển các giá trị kiểu nói trên sang dạng kí tự.
Có 3 dạng sau:
Dạng 1:
Write(biến _tệp, biểu_thức_1, biểu_thức_2,..., biểu_thức_n);
Ghi các giá trị của biểu thức vào tệp không có dấu hết dòng
Dạng 2:
Writeln(biến _tệp, biểu_thức_1, biểu_thức_2,..., biểu_thức_n);
Ghi các giá trị của biểu thức vào tệp có dấu hết dòng.
Dạng 3:
Writeln(biến _tệp);
Ghi dấu hết dòng vào tệp.
* ðọc dữ liệu từ tệp vănbản
Chúng ta có thể ñọc các kí tự, các số nguyên, số thực, boolean từ tệp văn bản thông
qua các thủ tục sau:
Dạng 1:
read(biến _tệp, biến1, biến2, biến3,..., biếnn);
ðọc các giá trị từ tệp gán cho các biến tương ứng và không sang ñầu dòng tiếp theo.
Dạng 2:
Trường ðại học Nông nghiệp 1 - Giáo trình Tin học ñại cương --------------------------------------------- 173
173
readln(biến _tệp, biến1, biến2, biến3,..., biếnn);
ðọc các giá trị từ tệp gán cho các biến tương ứng và ñưa con trỏ sang ñầu dòng tiếp
theo.
Dạng 3:
readln(biến _tệp);
ðưa con trỏ sang ñầu dòng tiếp theo.
Hàm chuẩn EOLN(f) sẽ phát hiện ra dấu hết dòng của tệp f.
Hàm này cho giá trị là True nếu kết thúc dòng, ngược lại là False.
* Các chương trình xử lý tệp văn bản
Bài toán 1: Tạo tệp văn bản ghi lại n dòng văn bản nhập vào từ bàn phím. ðọc tệp ñã tạo và
hiện ra trên màn hình.
Program Tao_doc_tep_van_ban;
uses crt;
var i,n: integer; f: text; s: string;
{**************}
procedure tao; { thu tuc tao }
begin
clrscr;
assign(f, ‘vanban.txt’);
rewrite(f);
write(‘ So dong van ban: ‘); readln(n);
for i:=1 to n do
begin
write(‘ Nhap dong ‘, i ); readln(s);
writeln(f, s);
end;
close(f);
end; { ket thuc thu tuc tao}
{ ***************}
Procedure doc; { thu tuc doc }
begin
clrscr;
Assign(f, 'vanban.txt' );
reset(f);
Writeln(‘ Tep van ban da tao’);
while not eof(f) do
begin
readln(f,s);
writeln(s);
end;
close(f);
end; { ket thuc thu tuc doc}
{******************}
{ than chuong trinh chinh}
repeat
clrscr;
Trường ðại học Nông nghiệp 1 - Giáo trình Tin học ñại cương --------------------------------------------- 174
174
writeln(‘ 1- Tao tep’);
writeln(‘ 2- Doc tep’);
writeln(‘ 3- Ket thuc’);
write(‘ Hay chon mot viec ? ‘); readln(i);
case i of
1: tao;
2: doc;
end;
until i=3;
readln;
end.
Bài toán 2: ðọc xâu văn bản từ tệp, kiểm tra xem xâu ñó có ñối xứng không, sau ñó sắp xếp
các chữ số trong xâu theo thứ tự tăng dần.
chương trình
PROGRAM DOC_XAU_SAP_TT_SO;
USES CRT;
TYPE MANG=ARRAY[1..200] OF CHAR;
VAR I,K,L,N:INTEGER;T:BOOLEAN;S:STRING;A:MANG;F:TEXT;
PROCEDURE SAPTANG(VAR X:MANG;M:INTEGER);
VAR J,Z:INTEGER;P:CHAR;
BEGIN
FOR J:=1 TO M-1 DO
FOR Z:=1 TO M-J DO IF X[Z]>X[Z+1] THEN BEGIN P:=X[Z];
X[Z]:=X[Z+1];
X[Z+1]:=P;
END;
END;
BEGIN { thân chương trinh chính}
CLRSCR;
ASSIGN(F,'VB.TXT');
RESET(F);
READLN(F,S);
WRITELN(' XAU DOC DUOC');
WRITELN(S);
N:=LENGTH(S);
{tim xau doi xung}
K:=1;L:=N;T:=TRUE;
WHILE (K<L) AND T DO
IF S[K]=S[L] THEN BEGIN K:=K+1; L:=L-1; END
ELSE T:=FALSE;
IF T THEN WRITELN(' XAU DOI XUNG ') ELSE WRITELN(' XAU KHONG DOI XUNG ');
{ sap cac so trong xau tang dan }
K:=0;
FOR I:=2 TO N DO IF (ORD(S[I])>=48) AND (ORD(S[I])<=57) THEN
BEGIN
K:=K+1;
Trường ðại học Nông nghiệp 1 - Giáo trình Tin học ñại cương --------------------------------------------- 175
175
A[K]:=S[I];
END;
SAPTANG(A,K);
L:=0;
FOR I:=1 TO N DO IF (ORD(S[I])>=48) AND (ORD(S[I])<=57) THEN
BEGIN
L:=L+1;
S[I]:=A[L];
END;
WRITELN('XAU DA SAP THU TU CAC SO ');
WRITELN(S);
READLN;
CLOSE(F);
END.
Trường ðại học Nông nghiệp 1 - Giáo trình Tin học ñại cương --------------------------------------------- 176
176
Bài tập chương VI
1. Viết chương trình gồm 2 CT con làm các công việc sau: Ghi 1 bài thơ có n dòng, nội dung
nhập vào từ bàn phím lên tệp văn bản có tên ‘BAITHO.TXT’ và ñọc tệp văn bản ñã tạo từ
ñĩa và cho hiện nội dung lên màn hình. Dùng câu lệnh lựa chọn ñể chọn công việc: 1= Ghi,
2=Doc.
2. Viết chương trình tạo tệp dữ liệu ‘DIEM.DAT’ chứa bảng ñiểm của n người và in kết quả
ra màn hình. Bảng ñiểm gồm các cột: Họ tên, ðiểm Toán, ðiểm Lý, ðiểm Hoá , Tổng, Loại.
Nhập vào: Họ tên, ðiểm toán, ðiểm lý, ðiểm hoá.
Tính Tổng, Loại :
Tổng = ðiểm toán + ðiểm lý + ðiểm hoá .
Loại = ‘ DO ’ nếu Tổng > 19
Loại = ‘ TRUOT' nếu Tổng <= 19
3. Viết chương trình tạo tệp dữ liệu ‘LUONG.DAT’ chứa bảng lương của n người và in kết
quả ra màn hình.
Bảng lương gồm các cột: Họ tên, Ngày công, Lương ính,Thưởng, Tổng
Nhập vào : Họ tên, Ngày công, Lương chính .
Tính Thưởng, Tổng :
Thưởng = Lương chính x 2 nếu Ngày công > 25
Thưởng = Lương chính nếu Ngày công <= 25
Tổng = Lương chính + Thưởng .
4. Viết chương trình tạo tệp dữ liệu ‘HANG.DAT’ chứa bảng Thống kê hàng nhập của n mặt
hàng và in kết quả ra màn hình. Bảng Thống kê hàng nhập gồm các cột:
Tên , Số lượng, ðơn giá, Tiền, Loại.
Nhập vào: Tên , Số lượng, ðơn giá.
Tính Tiền, Loại : Tiền = Số lương x ðơn giá .
Loại = ‘Cao’ nếu Tiền > 500000.
Loại = ‘THAP’ nếu Tiền <= 500000.
5. Viết chương trình tạo tệp dữ liệu ‘SACH.DAT’ chứa bảng danh mục của n quyển sách và
in kết quả ra màn hình. Bảng danh mục sách bao gồm các cột:
Tên, Năm, Tác giả, Giá, Loại.
Nhập vào : Tên, Năm, Tác giả, Giá.
Tính Loại theo công thức sau:
Loại = ‘Cao’ nếu Tiền > 50000
Loại = ‘TB’ nếu 20000<= Tiền <= 50000
Loại = ‘THAP’ nếu Tiền < 20000.
File đính kèm:
Giáo trình Tin học đại cương - Phần 2 - Chương 6_Kiểu dữ liệu có cấu trúc Kiểu bản ghi và kiểu tệp.pdf

