Bản ghi
DỮ LIỆU KIỂU BẢN GHI Khái niệm cơ bản: (Record) là một cấu trúc bao gồm một số (cố định hoặc thay đổi) các phần tử có kiểu khác nhau nhưng có liên quan nhau. Các phần tử này gọi là các trường (Field), vd: bảng điểm của lớp học bao gồm các ...
DỮ LIỆU KIỂU BẢN GHI
- Khái niệm cơ bản:
(Record) là một cấu trúc bao gồm một số (cố định hoặc thay đổi) các phần tử có kiểu khác nhau nhưng có liên quan nhau. Các phần tử này gọi là các trường (Field), vd: bảng điểm của lớp học bao gồm các trường Hoten, Ngaysinh, Toan,Ly, Hoa.. Dữ liệu điền vào các trường hình thành nên một bản ghi (Record). Có thể có những trường trong một bản ghi lại là một bản ghi, ví dụ trường Ngaysinh ở trên có thể là một bản ghi của 3 trường là Ngay, Thang, Nam. không phải là kiểu dữ liệu đã có sẵn trong Pascal mà do người sử dụng tự định nghĩa do đó chúng phải được khai báo ở phần TYPE.
bao gồm 2 loại:
- có cấu trúc không đổi
- có cấu trúc thay đổi
Điểm mạnh của bản ghi là cho phép xây dựng những cấu trúc dữ liệu đa dạng phục vụ công việc quản lý, tuy vậy muốn lưu trữ dữ liệu để sử dụng nhiều lần thì phải kết hợp kiểu bản ghi với kiểu Tệp.
- Khai báo:
TYPE TênKiểu = RECORD
Field1 : Kiểu1;
Field2 : Kiểu2;
...
FieldN: KiểuN;
END;
VAR Biến : TênKiểu;
Ví dụ 2.1:
TYPE Bangdiem = RECORD
Hoten : String[25];
Gioitinh:Char;
Lop:String[5];
Diachi: String[30];
Toan,Ly,Hoa:Real;
END;
Tổng độ dài của Record là: 26+1+6+31+18=82 Bytes.
Có thể dùng hàm sizeof(tên kiểu) để xác định độ dài một kiểu dữ liệu, ví dụ:
Write(sizeof(bangdiem)) sẽ nhận được số 82.
Ví dụ 2.2
Xây dựng kiểu dữ liệu quản lý hồ sơ công chức:
Type
Diadanh=Record
Tinh,Huyen,Xa:String[15];
End;
Donvi=Record
Truong:String[30];
Khoa,Bomon:String[20];
End;
Ngay=Record
Ng:1..31;
Th:1..12;
Nam:Integer;
End;
Lylich=Record
Mhs:Word;
Hoten:String[25];
Ngaysinh:Ngay;
Quequan:Diadanh;
Coquan:Donvi;
End;
- Truy nhập các trường của bản ghi:
Giả sử cần quản lý danh sách cán bộ của một trường đại học, chúng ta phải khai báo một biến chứa danh sách:
Var DS:Lylich;
Để truy nhập các trường cần viết:
<tên biến>.<tên trường mẹ>.<tên trường con>…
Ví dụ để nhập dữ liệu cho trường Hoten ta viết các lệnh:
Readln(DS.hoten);
Để nhập ngày tháng năm sinh:
Readln(Ds.Ngay.Ng);
Readln(Ds.Ngay.Thang);
Readln(Ds.Ngay.Nam);
- Lệnh With…Do
Các cú pháp của lệnh:
WITH <Tên biến kiểu RECORD> DO <Các lệnh>
Khi sử dụng lệnh WITH..DO chuỗi lệnh viết sau DO chỉ cần viết tên trường có liên quan mà không cần viết tên biến.
Ví dụ 2.3
Program Nhapdiem;
Uses CRT;
Type
BANGDIEM=RECORD
Hoten:String[25];
Gioitinh: (‘1’,’0’);
Lop:String[5];
Toan,Ly,Hoa:Real;
End;
Var
DS_LOP:Array[1..40] of BANGDIEM {ds lớp là mảng 40 phần tử}
i,j: integer;
tiep:Char;
BEGIN
Clrscr;
tiep:=’C’; i:=1;
Repeat
With DS_LOP[i] do
Begin
Write (‘Ho ten hs:’); Readln(Hoten);
Write (‘Nam hay nữ: 1/0’); Readln(Gioitinh);
Write (‘Lop:’); Readln(Lop);
Write (‘Dia chi:’); Readln(Diachi);
Write (‘Diem Toan:’); Readln(Toan);
Write (‘Diem ly:’); Readln(Ly);
Write (‘Diem Hoa:’); Readln(Hoa);
End;
i:=i+1;
Write(‘Nhap tiep hay khong? C/K’); Readln(tiep);
Until upcase(tiep)=’K’;
Clrscr;
For j:=1 to i-1 do
With DS_LOP[j] do
Wrteln(Ho ten:15,’ ‘, Gioi tinh:2,’ ‘,Lop: 4,’ ‘,Dia chi:10,’ Toan:’, Toan:4:2,’ Ly:’, Ly:4:2, ’ Hoa:’, Hoa:4:2);
Readln;
END.
Đối với các bản ghi lồng nhau thì lệnh with..do cũng phải lồng nhau.
- có cấu trúc thay đổi:
a. Xây dựng kiểu dữ liệu:
có cấu trúc cố định dùng để mô tả một đối tượng mà các thể hiện của nó có các thuộc tính như nhau. Trong thực tế nhiều khi ta gặp những đối tượng mà thuộc tính của chúng gồm hai loại:
- Thuộc tính chung cho mọi thể hiện
- Thuộc tính riêng cho một số thể hiện đặc biệt
Ví dụ 2.4: Kiểu dữ liệu quản lý vé ngành đường sắt
Trên một tuyến đường sắt có nhiều đoàn tàu chạy trong ngày, có những chuyến tốc hành chỉ dừng lại ở một vài ga dọc đường, có những chuyến tàu thường dừng lại tất cả các ga lẻ. Với tàu tốc hành, hành khách chỉ được mang theo hành lý không quá 20 kg và sẽ có suất ăn trên tàu. Với tàu thường hành khách phải mua vé hàng hóa nếu có vận chuyển hàng hóa và không có suất ăn trên tàu.
Thuộc tính chung: tên đoàn tàu (TDT), tuyến đường (TD), giờ đi (GD), loại tàu (LT) ( ví dụ tốc hành –TH, tàu thường TT)
Thuộc tính riêng với tàu tốc hành: Số xuất ăn (SXA), số ga lẻ dừng dọc đường (SGD), còn tàu thường có thuộc tính riêng là cước hàng hóa (CHH).
Xây dựng các bản ghi dữ liệu:
Type QLDS=record
Ten_doan_tau:string[3];
Tuyen_duong:string[15];
Gio_di:real;
Case Loai_tau: (Toc_hanh,Tau_thuong ) of
Toc_hanh:(So_xuat_an:Word; So_ga_do:Byte);
Tau_thuong: (cuoc_hang_hoa:real);
End;
Ví dụ 2.5: Kiểu dữ liệu quản lý điểm của sinh viên:
SV là kiểu dữ liệu bản ghi dùng để quản lý điểm của sinh viên. Các trường cố định của SV gồm MHS (mã hồ sơ), HOTEN (họ tên), NS (ngày sinh), GIOI (giới tính), Khoa (Sư phạm- SP, Kinh tế - KT, Cơ điện – CD). Các môn học tùy thuộc vào khoa mà sinh viên đang theo học, giả sử chúng ta quy định khoa sư phạm có các môn : Toán, Lý, Tin cơ bản, lập trình nâng cao; khoa Kinh tế có các môn : Kế toán máy, Marketing; khoa Cơ điện có các môn: Cơ học máy, Sức bền vật liệu. Tất cả sinh viên nếu là Nam thì học thêm môn Bơi lội, nếu là Nữ thì học thêm Thể dục nghệ thuật.
Mỗi bản ghi kiểu sinh viên có cấu trúc thuộc một trong các dạng sau:
* Sinh viên khoa sư phạm:
1/ Mhs, Hoten, Ns, Boi_loi, Toan, Ly, Tincoban, Lap_trinh_nang_cao
2/ Mhs, Hoten, Ns, The_duc, Toan, Ly, Tincoban, Lap_trinh_nang_cao
* Sinh viên khoa cơ điện:
3/ Mhs, Hoten, Ns, Boi_loi, Co_hoc_may, Suc_ben_vat_lieu
4/ Mhs, Hoten, Ns, The_duc, Co_hoc_may, Suc_ben_vat_lieu
* Sinh viên khoa Kinh tế:
5/ Mhs, Hoten, Ns, Boi_loi, Ke_toan_may, Marketing
6/ Mhs, Hoten, Ns, The_duc, Ke_toan_may, Marketing
Kiểu dữ liệu bản ghi SV được khai báo như sau:
SV=record
Mhs: Byte;
Hoten: String[20];
NS:Record;
Ngay:1..31; Thang:1..12; Nam:Word;
End;
Case monhoc:(pl1,pl2) of
pl1: (case gioi:(Nam,Nu) of
Nam:(Boi loi:real);
Nu: (the_duc:real);
pl2: (case KHOA:(SP,CD,KT) of
SP: (Toan, Ly, Tincb, Ltnc:Real);
CD: (Co_hoc_may, Suc_ben_vat_lieu: real);
KT: (Ke_toan_may, Marketing:real));
End;
Từ cách khai báo trên, ta rút ra một số nhận xét sau:
Nhận xét 1: Trong một kiểu record các trường cố định được khai báo trước, trường phân loại khai báo sau, như vậy truờng phân loại phải là trường khai báo cuối cùng. Các trường thay đổi khai báo bên trong trường phân loại.
Nhận xét 2: Mỗi kiểu dữ liệu record có cấu trúc thay đổi chỉ được phép có duy nhất một trường phân loại, nghĩa là không thể có hai toán tử case…of ngang hàng khi khai báo.
Nhận xét 3: Vì mỗi trường lại có thể là một bản ghi cho nên bên trong trường phân loại lại có thể chứa các trường phân loại khác, đây là trường hợp bản ghi thay đổi nhiều mức.
b. Truy nhập:
Việc truy nhập vào các trường cố định của bản ghi có cấu trúc thay đổi hoàn toàn giống như bản ghi thường. Còn việc truy nhập vào các trường thay đổi cần phải chú ý một số điểm sau:
- Không dùng phép gán hoặc nhập dữ liệu từ bàn phím cho các trường phân loại.
- Lệnh With…do có tác dụng với tất cả các trường kể cả các trường thay đổi bên trong các trường phân loại.
- Tên các trường phân loại không thể đưa ra màn hình như một tên trường bình.
Bài tập chương 2:
1. Viết lại chương trình ở ví dụ 2.5, đưa vào chương trình con Nhập và chương trình con hiện. Dữ liệu đưa ra có dạng như sau:
Ma ho so | Ho va ten | Gioitinh | Khoa | So mon hoc | Tong diem | Trung bình |
… | ||||||