Bài 13: Kiểu bản ghi


Dữ liệu kiểu bản ghi (record) dùng để mô tả các đối tượng có cùng một số thuộc tính mà các thuộc tính có thể có các kiểu dữ liệu khác nhau.

Để mô tả kiểu bản ghi ta cần xác định:

- Tên kiểu bản ghi;

- Tên các thuộc tính (trường);

- Kiểu dữ liệu của mỗi trường;

- Cách khai báo biến;

- Cách tham chiếu đến trường.

Dưới đây giới thiệu cách khai báo kiểu, biến, tham chiếu đến trường và phép gán giá trị bản ghi trong Pascal.

1. Khai báo và tham chiếu đến trường

a. Khai báo

Do dữ liệu kiểu bản ghi thường dùng để mô tả nhiều đối tượng nên ta thường định nghĩa một kiểu bản ghi và sau đó dùng nó để khai báo các biến liên quan.

- Kiểu bản ghi thường được định nghĩa như sau:

 type < tên kiểu bản ghi > = record

                                                      < tên trường 1 > : < kiểu trường 1 >

                                                       ……………………………….

                                                       < tên trường k > : < kiểu trường k >;

                                          end;

- Sau khi có kiểu bản ghi, biến kiểu bản ghi có thể được khai báo như sau:

var   < tên biến bản ghi > : < tên kiểu bản ghi >;

Ví dụ 1: Quan sát hình 1 dưới đây và khai báo cho kiểu bản ghi học sinh

const Max =60; {gia thiet si so lop cao nhat la 60}

type

   HocSinh = record

                HoTen: string[30];

                NgaySinh: string[10];

                GioiTinh: boolean;

                Tin, Toan, Li, Hoa, Van, Su, Dia: Real;

             end;

var

   A, B: HocSinh;

   Lop: array[1..Max] of HocSinh;

Hình 1. Bản ghi học sinh

b. Tham chiếu đến trường

- Cú pháp: < Tên biến bản ghi >. < Tên trường >

- Ví dụ 2:

+ Nếu A là biến kiểu bản ghi và X là tên một trường của A, thì tham chiếu đến trường X, ta viết: A.X

+ Để tham chiếu đến điểm tin học của một học sinh trong ví dụ trên ta viết: A.Tin

2. Gán giá trị

Có 2 cách để gán giá trị cho biến bản ghi:

- Cách 1. Dùng lệnh gán trực tiếp: Nếu A và B là hai biến bản ghi cùng kiểu và thì ta có thể gán giá trị của B cho A bằng câu lệnh: A:= B;

- Cách 2. Gán giá trị cho từng trường: Có thể thực hiện bằng lệnh gán hoặc nhập từ bàn phím. 

3. Ví dụ

Một lớp gồm N (N \(\leq\) 60) học sinh. Cần quản lí học sinh với các thuộc tính như họ và tên, ngày sinh, địa chỉ, điểm toán, điểm văn, xếp loại. Giả sử việc xếp loại được xác định như sau:

- Nếu tổng điểm toán và văn lớn hơn hoặc bằng 18 thì xếp loại A.

- Nếu tổng điểm toán và văn lớn hơn hoặc bằng 14 và nhỏ hơn 18 thì xếp loại B.

- Nếu tổng điểm toán và văn lớn hơn hoặc bằng 10 và nhỏ hơn 14 thì xếp loại C.

- Nếu tổng điểm toán và văn nhỏ hơn 10 thì xếp loại D.

Chú ý rằng, trong các thuộc tính cần quản lí, chỉ có 5 thuộc tính đầu là độc lập, còn thuộc tính xếp loại được xác định dựa vào các điểm toán và văn. Để lưu trữ thông tin về học sinh, ta dùng kiểu bản ghi với 6 trường tương ứng với 6 thuộc tính cần quản lí.

Gợi ý làm bài:

Dưới đây là chương trình nhập vào từ bàn phím thông tin của từng học sinh trong lớp, thực hiện xếp loại và đưa ra màn hình kết quả xếp loại học sinh:

program Xep_loai;

uses crt;

const Max = 60;

type     HocSinh = record

                HoTen:string[30];

               NgaySinh:string[10];

              DiaChi:string[50];

              Toan,Van:real;

              XepLoai:char;

                       end;

var

   Lop: array[1..Max] of HocSinh;

   N,i: Byte;

begin

   clrscr;

   write('So luong hoc sinh trong lop N = '); readln(N);

   for i:= 1 to N do

         begin

               writeln('Nhap so lieu ve hoc sinh thu ',i,': ');

               write('Ho va ten: ');readln(Lop[i].HoTen);

               write('Ngaysinh: ');readln(Lop[i].Ngaysinh);

               write('Dia chi: ');readln(Lop[i].DiaChi);

               write('Diem Toan: ');readln(Lop[i].Toan);

               write('Diem Van: ');readln(Lop[i].Van);

               if Lop[i].Toan+Lop[i].Van>=18

                     then Lop[i].XepLoai:='A';

               if (Lop[i].Toan+Lop[i].Van>=14)And

                     (Lop[i].Toan+Lop[i].Van<18)

                     then Lop[i].XepLoai:='B';

               if (Lop[i].Toan+Lop[i].Van>=10)And

                     (Lop[i].Toan+Lop[i].Van<14)

                     then Lop[i].XepLoai:='C'

                     else Lop[i].XepLoai:='D';

 end;

         clrscr;

         writeln('Danh sach xep loai hoc sinh trong lop:');

         for i:= 1 to N do

                writeln(Lop[i].HoTen:30,' - Xep loai: ',Lop[i].XepLoai);

readln

end.

Dữ liệu kiểu bản ghi (record) dùng để mô tả các đối tượng có cùng một số thuộc tính mà các thuộc tính có thể có các kiểu dữ liệu khác nhau.

Để mô tả kiểu bản ghi ta cần xác định:

- Tên kiểu bản ghi;

- Tên các thuộc tính (trường);

- Kiểu dữ liệu của mỗi trường;

- Cách khai báo biến;

- Cách tham chiếu đến trường.

Dưới đây giới thiệu cách khai báo kiểu, biến, tham chiếu đến trường và phép gán giá trị bản ghi trong Pascal.

1. Khai báo và tham chiếu đến trường

a. Khai báo

Do dữ liệu kiểu bản ghi thường dùng để mô tả nhiều đối tượng nên ta thường định nghĩa một kiểu bản ghi và sau đó dùng nó để khai báo các biến liên quan.

- Kiểu bản ghi thường được định nghĩa như sau:

 type < tên kiểu bản ghi > = record

                                                      < tên trường 1 > : < kiểu trường 1 >

                                                       ……………………………….

                                                       < tên trường k > : < kiểu trường k >;

                                          end;

- Sau khi có kiểu bản ghi, biến kiểu bản ghi có thể được khai báo như sau:

var   < tên biến bản ghi > : < tên kiểu bản ghi >;

Ví dụ 1: Quan sát hình 1 dưới đây và khai báo cho kiểu bản ghi học sinh

const Max =60; {gia thiet si so lop cao nhat la 60}

type

   HocSinh = record

                HoTen: string[30];

                NgaySinh: string[10];

                GioiTinh: boolean;

                Tin, Toan, Li, Hoa, Van, Su, Dia: Real;

             end;

var

   A, B: HocSinh;

   Lop: array[1..Max] of HocSinh;

Hình 1. Bản ghi học sinh

b. Tham chiếu đến trường

- Cú pháp: < Tên biến bản ghi >. < Tên trường >

- Ví dụ 2:

+ Nếu A là biến kiểu bản ghi và X là tên một trường của A, thì tham chiếu đến trường X, ta viết: A.X

+ Để tham chiếu đến điểm tin học của một học sinh trong ví dụ trên ta viết: A.Tin

2. Gán giá trị

Có 2 cách để gán giá trị cho biến bản ghi:

- Cách 1. Dùng lệnh gán trực tiếp: Nếu A và B là hai biến bản ghi cùng kiểu và thì ta có thể gán giá trị của B cho A bằng câu lệnh: A:= B;

- Cách 2. Gán giá trị cho từng trường: Có thể thực hiện bằng lệnh gán hoặc nhập từ bàn phím. 

3. Ví dụ

Một lớp gồm N (N \(\leq\) 60) học sinh. Cần quản lí học sinh với các thuộc tính như họ và tên, ngày sinh, địa chỉ, điểm toán, điểm văn, xếp loại. Giả sử việc xếp loại được xác định như sau:

- Nếu tổng điểm toán và văn lớn hơn hoặc bằng 18 thì xếp loại A.

- Nếu tổng điểm toán và văn lớn hơn hoặc bằng 14 và nhỏ hơn 18 thì xếp loại B.

- Nếu tổng điểm toán và văn lớn hơn hoặc bằng 10 và nhỏ hơn 14 thì xếp loại C.

- Nếu tổng điểm toán và văn nhỏ hơn 10 thì xếp loại D.

Chú ý rằng, trong các thuộc tính cần quản lí, chỉ có 5 thuộc tính đầu là độc lập, còn thuộc tính xếp loại được xác định dựa vào các điểm toán và văn. Để lưu trữ thông tin về học sinh, ta dùng kiểu bản ghi với 6 trường tương ứng với 6 thuộc tính cần quản lí.

Gợi ý làm bài:

Dưới đây là chương trình nhập vào từ bàn phím thông tin của từng học sinh trong lớp, thực hiện xếp loại và đưa ra màn hình kết quả xếp loại học sinh:

program Xep_loai;

uses crt;

const Max = 60;

type     HocSinh = record

                HoTen:string[30];

               NgaySinh:string[10];

              DiaChi:string[50];

              Toan,Van:real;

              XepLoai:char;

                       end;

var

   Lop: array[1..Max] of HocSinh;

   N,i: Byte;

begin

   clrscr;

   write('So luong hoc sinh trong lop N = '); readln(N);

   for i:= 1 to N do

         begin

               writeln('Nhap so lieu ve hoc sinh thu ',i,': ');

               write('Ho va ten: ');readln(Lop[i].HoTen);

               write('Ngaysinh: ');readln(Lop[i].Ngaysinh);

               write('Dia chi: ');readln(Lop[i].DiaChi);

               write('Diem Toan: ');readln(Lop[i].Toan);

               write('Diem Van: ');readln(Lop[i].Van);

               if Lop[i].Toan+Lop[i].Van>=18

                     then Lop[i].XepLoai:='A';

               if (Lop[i].Toan+Lop[i].Van>=14)And

                     (Lop[i].Toan+Lop[i].Van<18)

                     then Lop[i].XepLoai:='B';

               if (Lop[i].Toan+Lop[i].Van>=10)And

                     (Lop[i].Toan+Lop[i].Van<14)

                     then Lop[i].XepLoai:='C'

                     else Lop[i].XepLoai:='D';

 end;

         clrscr;

         writeln('Danh sach xep loai hoc sinh trong lop:');

         for i:= 1 to N do

                writeln(Lop[i].HoTen:30,' - Xep loai: ',Lop[i].XepLoai);

readln

end.

Bài học bổ sung