Giáo trình Tin học đại cương A1 (Phần 2)

Tóm tắt Giáo trình Tin học đại cương A1 (Phần 2): ...". Biến Ch kiểu ký tự được dùng để lưu chữ cái (mục) mà người dùng đã chọn. Tùy theo giá trị của Ch mà lệnh CASE sẽ quyết định phải làm gì. 121 Chương trình được viết như sau: PROGRAM VIDU8_6; {Thực đơn} Uses Crt; Var x, y: Real; Ch: Char; Begin Clrscr; Write('Nhap x va y:'); Readln(...thay lệnh Write bằng Writeln. Tương tự, mảng B được in lên màn hình bằng lệnh: For ch:=‘a’to ‘d’do Write(B[ch]); Chú ý: Turbo Pascal cho phép gán một mảng này cho một mảng khác. Nếu X, Y là hai biến mảng cùng một kiểu mảng thì lệnh: X:= Y; 170 có nghĩa là lấy giá trị của từng phần tử của m...thư viện chuẩn} Const ... {khai báo hằng} Type .... {khai báo kiểu dữ liệu mới} Var .... {khai báo biến của ctrình chính} Function Tênhàm(tênthamsố: kiểuthamso): kiểugiátrị; {Các khai báo Const, Type, Var dùng trong hàm} Begin {Các lệnh của hàm} End; BEGIN 214 {Các lệnh của chương trình c...

pdf231 trang | Chia sẻ: havih72 | Lượt xem: 176 | Lượt tải: 0download
Nội dung tài liệu Giáo trình Tin học đại cương A1 (Phần 2), để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
 Toán cao nhất}
Max:=DS[1].Toan;
For i:=1 to N do
if Max< DS[i].Toan then
Max:=DS[i].Toan;
Writeln(‘Diem Toan cao nhat = ‘, Max:4:1);
{Ðếm số em có điểm Toán =Max}
Dem:=0;
261
For i:=1 to N do
if DS[i].Toan =Max then
Dem:=Dem+1;
Writeln(‘Có ‘, Dem, ‘em có điểm Toán= ‘, Max:4:1);
{Tính điểm trung bình môn Toán cho cả danh sach}
TBToan:=0; {Lấy tổng điểm môn Toán}
For i:=1 to N do
TBToan:= TBToan + DS[i].Toan;
TBToan:=TBToan/N;
Writeln(‘Diem trung binh mon Toan= ‘,
TBToan:6:2);
Readln;
END.
+ Ví dụ 16_2 
- Nhập một danh sách N (1N50) đầu sách gồm các thông 
tin về Tên sách, Số lượng (SL) và Ðơn giá (DG).
- Với mỗi đầu sách, tính Giá tiền như sau:
GT = SL * DG nếu SL<10
= SL*DG - 5%*SL*DG nếu 10  SL<30
= SL*DG - 8%* SL*DG nếu 30  SL <50
= SL*DG - 10%* SL*DG nếu SL  50
(Tức là nếu mua từ 10 đến 29 cuốn thì được giảm 5% đơn
giá, mua từ 30 đến 49 cuốn thì được giảm 8% đơn giá, mua từ 
50 cuốn trở lên thì được giảm 10% đơn giá).
262
- Tính Tổng số tiền phải chi cho việc mua sách, kể cả 10% 
thuế giá trị gia tăng đánh vào tổng giá tiền.
- Tìm xem trong danh sách đó có cuốn "TIN HOC DAI 
CUONG" không. Nếu có thì cho biết có bao nhiêu cuốn và đơn
giá của nó. 
Bài giải
PROGRAM VIDU16_2;
Uses CRT;
Type
KSACH = RECORD
Tensach: String[20];
SL: Integer;
DG, GT: Real;
End;
Mang = Array[1..50] of KSACH;
Var
S: Mang;
Z: KSACH;
N, i: Integer;
Tongtien: Real;
BEGIN
Repeat
Write(‘Nhập N: ‘);
Readln( N );
Until (N>0) and ( N<51);
{Nhập N sách và tính tiền}
263
For i:=1 to N do
With S[i] do
Begin
Write(‘Nhập tên sách thứ ‘, i ,’: ‘); 
Readln(Tensach);
Repeat
Write(‘Nhập Số lượng: ‘); 
Readln(SL);
Until SL>0;
Write(‘Nhập đơn giá: ‘);
Readln(DG);
Case SL of
1..9 : GT:=SL*DG;
10..29: GT:=SL*DG*(1-0.05);
30..49: GT:=SL*DG*(1-0.08);
else
GT:=SL*DG*(1-0.1);
End; {Hết Case}
End; {Hết For}
{Tính tổng giá thành các đầu sách}
Tongtien:=0;
For i:=1 to N do
Tongtien:=Tongtien+S[i].GT;
{Cộng thêm thuế 10% giá tri gia tăng}
264
Tongtien:=Tongtien + 0.1*Tongtien;
Writeln(‘Tổng tiền phải chi là: ‘, Tongtien:6:2);
{Tìm cuốn ‘TIN HOC DAI CUONG’}
i:=1;
While (i ‘TIN HOC
DAI CUONG’) do
i:=i+1;
If i> N then
writeln (‘Không có cuốn THDC‘)
else
WITH S[i] DO
writeln(‘Sách THDC có ‘, SL:4, ‘ cuốn, đơn giá= ‘,
DG:6:2);
Readln;
END.
+ Ví dụ 16_3
Sử dụng dữ liệu của ví dụ 16.2 viết thủ tục in danh sách các 
đầu sách lên mà hình, trình bày thành biểu sau:
TỔNG KẾT TIỀN MUA SÁCH NĂM 1999
Giải
Thủ tục INBIEU sau đây chứa một thủ tục con INCHITIET 
có nhiệm vụ in chi tiết từng dòng cho từng cuốn sách.
265
Thân của thủ tục INBIEU là các lệnh in tiêu đề, sau đó là lời 
gọi thủ tục INCHITIET.
Các dữ liệu phục vụ cho thủ tục này là các biến toàn cục 
được khai báo ở chương trình chính trong ví dụ 16.2, đó là N và
S.
Chỗ nào có ký hiệu  thì hãy thay bằng một ký tự trắng. 
Nhắc lại rằng #32 cũng là một ký tự trắng. Thủ tục in biểu được 
viết như sau:
PROCEDURE INBIEU;
Var
i: Integer;
Procedure INCHITIET;
{Thủ tục in chi tiết từng cuốn sách}
Var
i: Integer;
Begin
For i:=1 to N do
WITH S[i] DO
Begin
Write(‘| ’, i:3, #32);
Write(‘| ’, Tensach);
Write(#32: 21-Length(Tensach));
Write(‘| ‘, SL:8, #32);
Write(‘| ‘, DG:8:2, #32);
266
Write(‘| ‘, GT:8:2, ‘ |’);
Writeln;
End;
For i:=1 to 63 do
write(‘-’);
Writeln;
End; {hết in chi tiết}
Begin {Vào thủ tục Inbiểu}
{In tiêu đề}
Writeln(‘TONG KET TIEN MUA SACH NAM 1999’);
Writeln(#32:6 , ‘-----------------------------------------------’);
For i:=1 to 63 do
write(‘-’);
Writeln;
Write(‘| STT ‘);
Write(‘|’, #32:7 , ‘TEN SACH’, #32:7 );
Write(‘| SO LUONG ‘);
Write(‘| DON GIA ‘);
Write(‘| GIA TIEN |’);
Writeln;
For i:=1 to 63 do
write(‘-’);
Writeln;
267
INCHITIET;
End;
Ráp toàn bộ thủ tục INBIEU vào phần khai báo của chương
trình trong ví dụ 16.2, và thêm lệnh gọi INBIEU; vào cuối của 
thân của chương trình đó, ta được một chương trình đầy đủ mà
khi chạy sẽ in biểu theo đúng yêu cầu.
Ngoài ra, để chương trình chính bớt rườm rà, ta đưa phần 
nhập dữ liệu vào một thủ tục riêng gọi là NHAP, phần tính tổng 
giá thành các cuốn sách vào một thủ tục riêng gọi là TINH, và
phần tìm cuốn TIN HOC DAI CUONG vào một thủ tục gọi là
TIM. Trong chương trình chính ta chỉ phải gọi tên các thủ tục 
đó ra mà thôi.
PROGRAM VIDU16_3;
Uses CRT;
Type
KSACH = RECORD
Tensach: String[20];
SL: Integer;
DG, GT: Real;
End;
Mang = Array[1..50] of KSACH;
Var
S: Mang;
Z: KSACH;
N, i: Integer;
Tongtien: Real;
268
{--- Thủ tục Nhập -----}
PROCEDURE NHAP (Var N: Integer);
{Nhập N đầu sách và tính giá thành}
Var
i: Integer;
Begin
Repeat
Write(‘Nhập số lượng sách N: ‘);
Readln( N );
Until (N>0) and ( N<51);
For i:=1 to N do
With S[i] do
Begin
Write(‘Nhập tên sách thứ ‘, i ,’: ‘); 
Readln(Tensach);
Repeat
Write(‘Nhập Số lượng: ‘); 
Readln(SL);
Until SL>0;
Write(‘Nhập đơn giá: ‘);
Readln(DG);
Case SL of
1..9: GT:=SL*DG;
10..29: GT:=SL*DG*(1-0.05);
269
30..49: GT:=SL*DG*(1-0.08);
else
GT:=SL*DG*(1-0.1);
End; {Hết Case}
End; {Hết For}
End;
{--- Thủ tục Tinh -----}
PROCEDURE TINH;
{Tính tổng giá thành các đầu sách}
Var
i: Integer;
Begin
Tongtien:=0;
For i:=1 to N do Tongtien:=Tongtien+S[i].GT;
{Cộng thêm 10% thuế giá trị gia tăng}
Tongtien:=Tongtien + 0.1*Tongtien;
Writeln(‘Tổng tiền phải chi là: ‘, Tongtien:6:2);
End;
{--- Thủ tục Tìm -----}
PROCEDURE TIM;
{Tìm cuốn ‘TIN HOC DAI CUONG’}
Var
i: Integer;
Begin
270
i:=1;
While (i‘TIN HOC
DAI CUONG’) do
i:=i+1;
If i> N then
writeln (‘Không có cuốn THDC ‘)
else
WITH S[i] DO
writeln(‘Sách THDC có ‘, SL:4, ‘cuốn 
với đơn giá= ‘, DG:6:2);
End;
{---------- Thủ tục In biểu ----------------}
PROCEDURE INBIEU;
Var
i: Integer;
Procedure INCHITIET;
{Thủ tục in chi tiết từng cuốn sách}
Var
i: Integer;
Begin
For i:=1 to N do
WITH S[i] DO
Begin
Write(‘|’, i:3, #32);
Write(‘| ’, Tensach);
271
Write(#32:21-Length(Tensach));
Write(‘| ‘, SL:8, #32);
Write(‘| ‘, DG:8:2, #32);
Write(‘| ‘, GT:8:2, ‘ |’);
Writeln;
End;
For i:=1 to 63 do
write(‘-’);
Writeln;
End; {hết in chi tiết}
Begin {Vào thủ tục Inbiểu}
{In tiêu đề}
Writeln(‘TONG KET TIEN MUA SACH NAM 1999’);
Writeln( #32:6, ‘------------------------------------’);
For i:=1 to 63 do
write(‘-’);
Writeln;
Write(‘| STT ‘);
Write(‘|’, #32:7 , ‘TEN SACH’, #32:7 );
Write(‘| SO LUONG ‘);
Write(‘| DON GIA ‘);
Write(‘| GIA TIEN |’);
Writeln;
272
For i:=1 to 63 do
write(‘-’);
Writeln;
INCHITIET;
End;
{---------- Hết thủ tục In biểu --------------}
BEGIN
NHAP ( N);
TINH;
TIM;
INBIEU;
Readln;
END.
17. DỮ LIỆU KIỂU TẬP TIN
17.1. Khái niệm
Nhập và xuất dữ liệu là hai công việc rất phổ biến khi thực 
hiện một chương trình. Cho đến nay, ta mới chỉ nhập dữ liệu từ 
bàn phím và xuất dữ liệu ra màn hình. Các dữ liệu này được tổ 
chức trong bộ nhớ của máy, chúng tồn tại khi chương trình
đang chạy và bị xóa khi chương trình kết thúc. Muốn lưu trữ 
các dữ liệu lâu dài để sử dụng nhiều lần thì phải ghi chúng lên
đĩa thành các tập tin.
Tập tin (file) trong Pascal là một kiểu dữ liệu có cấu trúc. 
Mỗi tập tin là một tập hợp các phần tử có cùng chung một kiểu 
dữ liệu được nhóm lại thành một dãy và được ghi trên đĩa dưới 
một cái tên chung. Khái niệm tập tin và mảng có những điểm 
rất gần nhau. Song tập tin khác mảng ở những điểm sau đây:
273
- Mảng được tổ chức trong bộ nhớ còn tập tin chủ yếu được 
tổ chức trên đĩa.
- Số phần tử của mảng được xác định ngay khi khai báo, 
còn số phần tử của tập tin thì không. Các tập tin được kết thúc 
bằng một dấu hiệu đặc biệt gọi là EOF (End Of File).
- Các phần tử của mảng được truy xuất thông qua chỉ số. 
Các phần tử của tập tin được truy xuất nhờ một biến trung gian 
chỉ điểm vào vị trí của chúng trên đĩa, gọi là con trỏ tệp. Tại 
mỗi thời điểm, con trỏ sẽ chỉ vào một vị trí nào đó trong tập tin, 
gọi là vị trí hiện thời. 
Dưới đây sẽ trình bày hai loại tập tin thường gặp là tập tin
có định kiểu và tập tin văn bản.
17.2. Tập tin có định kiểu
Tập tin mà các phần tử của nó có cùng một kiểu dữ liệu gọi 
là tập tin có định kiểu. Kiểu dữ liệu của các phần tử của tập tin 
có thể là kiểu đơn giản (nguyên, thực, ký tự , lô gic, chuỗi ký 
tự...) hoặc kiểu có cấu trúc (mảng, bản ghi).
Cách khai báo kiểu tập tin như sau:
Type
TênkiểuTtin = File of Kiểuphầntử;
Ví dụ
Type
Ksvien = Record
Ten: String[20];
Namsinh: Integer;
DTB: Real;
End;
274
KieuT1 = File of Integer;
KieuT2 = File of String[20];
KieuT3 = File of Ksvien;
Theo khai báo trên thì KieuT1 là tập tin có các phần tử kiểu 
nguyên (Integer), KieuT2 là tập tin có các phần tử là các chuỗi 
ký tự (String[20]), còn KieuT3 là tập tin có các phần tử là các
bản ghi kiểu Ksvien.
Khi đã có kiểu tập tin, ta có thể khai báo các biến tập tin:
Var
F1: KieuT1;
F2: KieuT2;
F3: KieuT3;
F1, F2, F3 là các biến kiểu tập tin, một loại biến đặc biệt, 
không dùng để gán giá trị như các biến nguyên, thực hay chuỗi. 
Mỗi biến này đại diện cho một tập tin mà thông qua các biến đó 
ta có thể thực hiện các thao tác trên tập tin như: tạo tập tin, mở, 
đóng, xóa tập tin, ghi dữ liệu vào tập tin và đọc dữ liệu từ tập 
tin, ...
Ngoài cách khai báo các biến F1, F2, F3 thông qua việc 
định nghĩa các kiểu dữ liệu mới như trên, Pascal còn cho phép
khai báo trực tiếp các biến tập tin như sau:
Var
TênbiếnTtin: File of Kiểuphầntử;
Ví dụ: có thể khai báo ba biến F1, F2, F3 nói trên theo cách
sau:
Type
Ksvien = Record
Ten: String[20];
275
Namsinh: Integer;
DTB: Real;
End;
Var
F1: File of Integer;
F2: File of String[20];
F3: File of Ksvien;
17.2.1. Các thủ tục chuẩn
1) Thủ tục ASSIGN(biếntậptin, têntậptin)
Gán tên tập tin cho biến tập tin. Ở đây tên tập tin là
một biểu thức kiểu chuỗi là tên thực sự của tập tin. Ví dụ:
Assign(F1, ‘DLIEU.DAT’);
Assign(F3, ‘QLSV.DAT’);
Sau hai lệnh này, biến F1 đồng nhất với tập tin 
DLIEU.DAT, mọi thao tác trên biến F1 chính là thao tác trên
tập tin DLIEU.DAT. Tương tự, biến F3 đồng nhất với tập tin 
QLSV.DAT
2) Thủ tục REWRITE(biếntậptin)
Khởi tạo tập tin mới, nếu tập tin đã có trên đĩa thì nó xóa đi
và tạo mới. Ví dụ:
Rewrite(F1); khởi tạo tập tin DLIEU.DAT
Rewrite(F3); khởi tạo tập tin QLSV.DAT
3) Thủ tục RESET(biếntậptin)
Mở tập tin đã có để sử dụng. Con trỏ tập tin trỏ vào phần tử 
đầu tiên (có số thứ tự là 0) của tập tin .
Ví dụ: Reset ( F3); mở tập tin QLSV.DAT
276
4) Thủ tục WRITE(biếntậptin, b1, b2, ..., bN)
Tuần tự ghi vào tập tin các giá trị của các biến b1, b2, ..., 
bN. Các biến b1, ..., bN phải cùng kiểu dữ liệu với các phần tử 
của tập tin.
Ví dụ:
- Cho i, j, k là các biến kiểu Integer và i=10, j=20, k=100,
khi đó lệnh: 
Write(F1, i, j, k );
sẽ ghi lần lượt các giá trị 10, 20, 100 vào tập tin 
DLIEU.DAT
- Cho khai báo:
Var
X: Ksvien;
Các lệnh sau gán giá trị cho X và ghi X vào tập tin 
QLSV.DAT:
X.Ten:=’Ng Van An’;
X.Namsinh:=1980;
X.DTB:=6.5;
Write(F3, X);
Sau khi ghi X vào tập tin QLSV.DAT, con trỏ tập tin tự 
động dời đến vị trí của phần tử tiếp theo.
5) Thủ tục READ( biếntậptin, b1, b2, ..., bN)
Ðọc tuần tự các phần tử của tập tin từ vị trí hiện thời của 
con trỏ tập tin và gán cho các biến b1, b2, ..., bN. Kiểu dữ liệu 
của các biến b1, b2, ..., bN phải cùng kiểu với các phần tử của 
tập tin. Mỗi khi đọc xong một phần tử, con trỏ tập tin tự động 
dời đến phần tử tiếp theo.
277
Ví dụ 
Lệnh Read(F1,i,j); đọc hai số nguyên trong tập tin 
DLIEU.DAT (kể từ vị trí hiện thời) và gán cho các biến nguyên
i, j .
Lệnh Read(F3,X); đọc bản ghi hiện thời của tập tin 
QLSV.DAT và gán cho biến bản ghi X.
6) Thủ tục CLOSE(biếntậptin): Ðóng tập tin.
7) Thủ tục SEEK(biếntậptin, k):
Ðặt con trỏ tập tin vào phần tử thứ k trong tập tin. Thủ tục 
này cho phép truy xuất trực tiếp một phần tử của tập tin mà
không phải thực hiện tuần tự từ đầu tập tin.
Ví dụ: đọc phần tử thứ 10 của tập tin DLIEU.DAT và gán
cho biến nguyên i rồi in giá trị của i:
Seek(F1, 10);
Read(F1, i);
Write(i);
8) Thủ tục ERASE(biếntậptin): Xóa tập tin trên đĩa
9) Thủ tục RENAME(biếntậptin, tênmới): Ðổi tên tập tin.
Yêu cầu là tập tin phải đang đóng thì mới xóa hay đổi tên
được.
17.2.2. Các hàm chuẩn
1) Hàm EOF(biếntậptin)
Cho kết quả True khi con trỏ tập tin đang ở cuối tệp, trong 
các trường hợp khác hàm cho giá trị False. 
2) Hàm FILESIZE(biếntậptin)
278
Cho số phần tử của tập tin. Nếu tập tin rỗng thì số phần tử 
bằng 0.
3) Hàm FILEPOS(biếntậptin)
Cho vị trí hiện thời của con trỏ tập tin. Phần tử đầu tiên có
số thứ tự là 0. Phần tử cuối cùng có số thứ tự bằng FileSize -1.
Ví dụ: Ghi số 100 vào cuối tập tin DLIEU.DAT, dùng các
lệnh:
i:=100;
Seek(F1, FileSize(F1)); {Ðặt con trỏ vào cuối tập tin} 
Write(F1, i); {Ghi giá trị của i vào cuối tệp}
+ Ví dụ 17_1
Nhập một danh sách sinh viên gồm Họ tên, điểm Toán, Lý, 
tính điểm trung bình rồi lưu vào tập tin HOSO.DAT. Sau đó 
đọc dữ liệu tập tin này và in ra màn hình. Trong chương trình,
chỗ nào có dấu ~ thì thay bằng một ký tự trắng.
PROGRAM VIDU17_1;
Uses CRT;
Const Tenttin = ‘HOSO.DAT’;
Type
Ksvien= Record
Hoten: String[20];
Toan, Ly, Dtb: Real;
End;
KieuTtin = File of Ksvien;
Var
F: KieuTtin;
279
X: Ksvien;
i: Integer;
Procedure Hienthi (Var F: KieuTtin);
Begin
Clrscr;
Writeln(#32:5, ‘HỌ VÀ TÊN’, #32:6 ,
‘ÐTOÁN~~~ÐLÝ~~~~DTB’);
Reset(F);
While Not Eof(F) do
Begin
Read(F, X);
Writeln(X.Hoten, #32:20-Length(X.Hoten),
X.Toan:4:1,#32:3, X.Ly:4:1, #32:3, X.DTb:4:1);
End;
End; {Hết hiển thị}
BEGIN
Clrscr;
Assign(F, TenTtin);
Rewrite(F);
i:=0;
Repeat
Clrscr;
Gotoxy(10,4);
Write(‘NHẬP SINH VIÊN THỨ ‘, i ,‘: (Enter để kết thúc)‘);
280
With X do
Begin
Gotoxy(10,6); Write(‘Ho va ten:’);
Gotoxy(10,8); Write(‘Ðiem Toan:’);
Gotoxy(10,10); Write(‘Ðiem Ly:’);
Gotoxy(20,6); Readln(Hoten);
If Hoten’’then
Begin
Gotoxy(20,8); Readln(Toan);
Gotoxy(20,10); Readln(Ly);
DTB:=(Toan+Ly)/2;
End;
End;
If X.Hoten’’then Write(F,X);
i:=i+1;
Until X.Hoten=’’;
Close(F);
Hienthi(F);
Close(F);
Readln;
END.
Chú ý: Nếu tham số trong chương trình con là tập tin thì nó
phải là tham số biến, không thể là tham số trị.
281
17.3. Tập tin văn bản
Trong Pascal có một kiểu tập tin đã được định nghĩa sẵn, đó 
là kiểu TEXT hay tập tin văn bản.
Ðể khai báo F là biến tập tin văn bản ta viết:
Var
F: Text;
Các phần tử của tập tin văn bản là các ký tự được ghi thành
từng dòng có độ dài khác nhau. Các dòng được phân cách nhờ 
các dấu kết thúc dòng (End of line). Ðó là hai ký tự điều khiển 
CR (Carriage return: nhảy về đầu dòng) và LF (Line feed:
xuống dòng dưới). Ví dụ , đoạn văn bản sau:
Tap tin van ban Text
12345
Het
được chứa trong tập tin văn bản thành một dãy:
Tap tin van ban Text CR LF 12345 CR LF Het Eof
Các thủ tục Assign, Rewrite, Reset, Write, Read, Close,
Erase, Rename đều dùng được cho tập tin văn bản. Ngoài ra
còn có thêm thủ tục Append(biếntậptin) dùng để mở tập tin 
văn bản và cho phép ghi thêm dữ liệu vào cuối tập tin.
Ðối với tập tin văn bản, không thể đồng thời vừa ghi vừa 
đọc dữ liệu như tập tin có định kiểu.
Ðể ghi dữ liệu, trước tiên phải khởi tạo tập tin bằng lệnh 
Rewrite hay mở tập tin và đưa trỏ về cuối tệp bằng lệnh 
Append. Sau đó ghi dữ liệu vào tập tin bằng thủ tục Write hay 
Writeln.
282
Ðể đọc dữ liệu một tập tin đã có, trước tiên ta phải mở tập 
tin bằng lệnh Reset. Sau đó đọc dữ liệu bằng thủ tục Read hay 
Readln.
Nếu mở tập tin bằng Rewrite hoặc Append thì không thể 
đọc được bằng Read và Readln. Nếu mở tập tin bằng Reset thì
không thể ghi được bằng Write hay Writeln.
+ Ghi dữ liệu vào tập tin văn bản
- Thủ tục WRITE(biếntậptin, bt1, bt2, ..., btN): cho
phép tuần tự ghi các giá trị của các biểu thức bt1, bt2, .. btN vào
tập tin văn bản. Các biểu thức bt1, bt2, , btN phải thuộc kiểu 
đơn giản chuẩn (nguyên, thực, ký tự, lôgic) hay kiểu chuỗi, và
chúng không cần phải có kiểu giống nhau. Ví dụ:
Write(F, 3, 10:4, ‘a’:2, ‘Text’, 4.5:6:2);
sẽ ghi vào tập tin thành dãy như sau (Dấu ~ hiểu là một ký
tự trắng):
3~~10~aText~~4.50
Chương trình dưới đây sẽ tạo tập tin văn bản T1.TXT:
Program VIDU;
Var
F: Text;
A: Integer;
B: Real;
Begin
A:=100;
B:=1234.5;
Assign(F, ’T1.TXT’);
Rewrite(F);
283
Write(F, ‘Ket qua=’:10, A:5, B:7:2);
Close(F);
End.
Nội dung của tập tin T1.TXT là:
~~Ket qua=~~100~123.45
Như vậy, cách ghi dữ liệu vào tập tin văn bản hoàn toàn
giống như khi in dữ liệu lên màn hình.
- Thủ tục WRITELN cũng có công dụng như WRITE,
nhưng ghi xong dữ liệu thì đưa con trỏ tập tin xuống dòng dưới. 
Ðặc biệt, lệnh Writeln(F); không ghi gì cả, chỉ đưa con trỏ tập 
tin xuống dòng.
Nội dung của các tập tin văn bản tạo bằng Pascal hoàn toàn
có thể xem được bằng lệnh Type của MSDOS, bằng Norton hay
bằng chính Turbo Pascal, ...
+ Ðọc dữ liệu của tập tin văn bản
- Thủ tục READ(biếntậptin, biến1, biến2, ..., biếnN) đọc 
tuần tự các giá trị từ tập tin và gán cho các biến. Các biến1, 
biến2, ..., biếnN phải có kiểu dữ liệu phù hợp với dữ liệu cần 
đọc tại vị trí tương ứng trong tập tin.
Ví dụ: Nếu tập tin T1.TXT có nội dung như sau:
~~Ket qua=~~100~123.45
thì để đọc lại các dữ liệu này, ta phải khai báo:
Var
St:String[10];
i: Integer; Z: Real;
Và dùng các lệnh:
Reset(F);
284
Read(F, St, i, Z);
Giá trị của St, i, Z sẽ là: St=’~~Ket qua=’, i=100, Z=123.45.
Nếu khai báo St có kiểu String[9] thì sẽ bị lỗi vì sau khi đọc 
xong 9 ký tự đầu, máy sẽ đọc tiếp giá trị =~~100 cho biến 
nguyên i, nhưng vì giá trị này bắt đầu là dấu = nên không đổi ra 
số nguyên được.
- Thủ tục READLN(biếntậptin, biến1, biến2, ..., biếnN)
đọc dữ liệu cho các biến xong sẽ đưa trỏ tập tin xuống đầu dòng
dưới.
Ðặc biệt, lệnh READLN(biếntậptin); không đọc gì cả, chỉ 
đưa con trỏ tập tin xuống dòng.
Chú ý
* Hàm Eof(F) cũng dùng được cho tập tin văn bản, ngoài ra
còn có hàm EOLN(F) cho kết quả là True hoặc False tùy theo
con trỏ tập tin có đang ở cuối dòng hay không. Khi
Eof(F)=True thì Eoln(F) cũng có giá trị là True.
* Thủ tục Seek và các hàm FileSize, FilePos không dùng
cho tập tin văn bản.
+ Các tập tin văn bản ngầm định
Trong Pascal có hai biến tập tin văn bản đã được khai báo 
sẵn là Input và Output, tức là máy đã ngầm khai báo:
Var
Input, Output: Text;
Input thường là bàn phím còn Output thường là màn hình.
Lệnh Readln(Input, x); được viết tắt thành Readln(x);
Lệnh Writeln(Output, x); được viết tắt thành Writeln(x);
285
Máy in cũng là một tập tin văn bản, được ngầm khai báo với 
tên là LST. Ðể in các biểu thức bt1, bt2, ..., btN ra máy in, ta 
phải khai báo sử dụng thư viện chuẩn PRINTER, và dùng lệnh:
Write(LST, bt1, bt2, ... , btN);
+ So sánh tập tin văn bản với tập tin định kiểu
Các tập tin có định kiểu cho phép vừa đọc vừa ghi và truy
nhập trực tiếp vào từng phần tử gần giống như thao tác với 
mảng. 
Các tập tin văn bản không cho phép đồng thời đọc, ghi và
chỉ có thể đọc hoặc ghi tuần tự, nhưng cho phép ta có thể xem, 
sửa trực tiếp một cách dễ dàng bằng các hệ soạn thảo văn bản 
đơn giản, như NC hay chính Turbo Pascal.
Ví dụ 17_2
Cho tập tin văn bản tên là T2.TXT và có nội dung là:
dong=6
cot =7
0 8 8 -2 6 11 1
8 0 2 0 7 0 2
8 2 0 11 12 9 3
-2 0 11 0 -7 9 4
6 7 12 -7 0 6 5
11 0 9 9 6 0 6
Hãy đọc tập tin này đưa vào một ma trận A và in ma trận A 
lên màn hình. Số dòng và số cột của ma trận A được ghi ở hai 
dòng đầu tiên trong tập tin T2.TXT.
Program VIDU17_2;
{vi du ve File Van ban}
286
Uses crt;
Type
MANG = array[1..20,1..20] of integer;
Var
A: MANG;
N, M: integer;
F: Text;
Procedure Nhap;
Var
i,j: Byte;
st: string[5];
Begin
Assign(F, 'T2.TXT');
Reset(F);
Readln(F, St, N);
Readln(F, St, M);
For i:=1 to N do
Begin
For j:=1 to M do
Read(F, A[i,j]);
Readln(F);
End;
Close(F);
End;
287
Procedure InMatran;
Var
i, j: Integer;
Begin
For i:=1 to N do
Begin
for j:=1 to M do
write( A[i,j]:4);
writeln;
End;
End;
BEGIN
Clrscr;
Nhap;
InMatran;
Readln;
END.

File đính kèm:

  • pdfgiao_trinh_tin_hoc_dai_cuong_a1_phan_2.pdf