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