=
=

Bài 9: Trừu tượng hóa dữ liệu

I. Khái niệm

Trừu tượng hóa dữ liệu là một phương pháp tích hợp các kiểu dữ liệu sơ cấp (còn gọi là kiểu dữ liệu đơn) như int, float, char,...thành kiểu dữ liệu phức nhằm mô tả biểu diễn thông tin của một khái niệm hay một đối tượng trong thế giới thực.

Trong C, để trừu tượng hóa dữ liệu chúng ta dùng cú pháp:

struct <kieutruutuong>
{
   kieu_du_lieu_1 thanh_phan_1;
   kieu_du_lieu_2 thanh_phan_2;
   ...
   kieu_du_lieu_n thanh_phan_n;
};

Ví dụ định nghĩa kiểu phân số:

struct phanso
{
   // khai báo các thành phần
   int tu;
   int mau;
};

2. Khai báo biến

Khai báo một biến có kiểu dữ liệu trừu tượng vừa định nghĩa chúng ta viết

struct <kieutruutuong> ten_bien;
Ví dụ khai báo biến x kiểu phanso
struct phanso x;

Một giải pháp gọn hơn cho việc khai báo biến kiểu dữ liệu trừu tượng là dùng từ khóa typedef như sau:

struct <kieutruutuong>
{
   kieu_du_lieu_1 thanh_phan_1;
   kieu_du_lieu_2 thanh_phan_2;
   ...
   kieu_du_lieu_n thanh_phan_n;
};
typedef struct <kieutruutuong><KIEUTRUUTUONG>;

Lúc này chúng ta khai báo biến

<KIEUTRUUTUONG> ten_bien;

Ví dụ định nghĩa lại kiểu phân số:

struct phanso
{
   // khai báo các thành phần
   int tu;
   int mau;
};
typedef struct phanso PHANSO;

Khai báo biến x được viết lại tự nhiên hơn như sau:

PHANSO x;

3. Truy cập các thành phần của một biến có kiểu dữ liệu trừ tượng

Để truy cập (gán dữ liệu hay xuất dữ liệu) các thành phần của một biến có kiểu dữ liệu trừu tượng, chúng ta dùng dấu chấm

ten_bien.thanh_phan_1
ten_bien.thanh_phan_2
...
ten_bien.thanh_phan_n

Trong trường hợp biến con trỏ, chúng ta dùng dấu mũi tên

ten_bien->thanh_phan_1
ten_bien->thanh_phan_2
...
ten_bien->thanh_phan_n

Ví dụ các biến kiểu PHANSO như sau:

PHANSO x;
x.tu = 3;
x.mau = 5;
PHANSO *y;
y->tu = 7;
y->mau = 10;
printf("%d/%d\n", x.tu, x.mau);// 3/5
printf("%d/%d", y->tu, y->mau);// 7/10

Chương trình minh họa nhập và hiển thị phân số:

Lưu ý hàm nhap_ps truyền tham số kiểu tham chiếu dạng con trỏ.

4. Mảng và kiểu dữ liệu lồng nhau

Thành phần của kiểu trừu tượng có thể là cấu trúc mảng như ví dụ sau:

// ví dụ khai báo đa thức
struct dathuc
{
   // khai báo các thành phần
   float heso[100];
   int bac;
};
typedef struct dathuc DATHUC;

Chương trình sau đây khai báo và hiển thị một đa thức bậc 3 như sau:

Có thể kiểu dữ liệu trừu tượng này lồng trong kiểu dữ liệu trừu tượng khác như ví dụ về khai báo kiểu số phức sau:

struct kieuphuc {
   int ao;
   float thuc;
};
struct kieuso {
   struct kieuphuc sophuc;
   int songuyen;
} num1;
typedef struct kieuso SO;

Chương trình sau đây khai báo và hiển thị giá trị biến kiểu SO