Trung Tâm Tin Học – Ngành Mạng  và Thiết  Bị  Di Động

TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN

Bài 7:

Kiểu Dữ Liệu Có Cấu Trúc

Trung Tâm Tin Học – Ngành Mạng  và Thiết  Bị  Di Động

TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN

2

1. Khái niệm kiểu cấu trúc

2. Khai báo cấu trúc

3. Các thao tác cơ bản

4. Mảng cấu trúc và các thao tác

5. Enumerations - Typedef

Trung Tâm Tin Học – Ngành Mạng  và Thiết  Bị  Di Động

TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN

3

1. Khái niệm

●Ngôn ngữ C/C++ đưa ra 5 cách để tạo  nên một kiểu dữ liệu tùy biến (custom data types).

1.Structure:Là một nhóm của các biến được định nghĩa  dưới  một  tên.  Kiểu  này  còn  gọi  là  kiểu  dữ  liệu  phức  hợp.

2.Bit-field:là một biến thể của kiểu structure và cho phép dễ dàng truy cập đến từng bit riêng rẽ.

3.Union: cho phép cùng một mẫu bộ nhớ được định nghĩa như hai hay nhiều kiểu biến khác nhau.

4.Enumeration: là danh sách của các tên hằng nguyên.

5.Typedef: định nghĩa một tên khác cho một kiểu dữ liệu đã có.

Trung Tâm Tin Học – Ngành Mạng  và Thiết  Bị  Di Động

TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN

1.2. Khái niệm kiểu cấu trúc

4

●Ví dụ mở đầu: Trường đại học XYZ cần viết 1 phần mềm quản lý sinh viên, thông tin cần lưu trữ cho mỗi sinh viên bao gồm: mã sinh viên, họ tên, tuổi, quê quán, lớp học…..

Trong trường hợp này chúng ta cần giải quyết vấn đề  : 1 dữ liệu có khả năng chứa nhiều thông tin trong nó.

để giải quyết vấn đề này ta dùng kiểu dữ liệu có Cấu Trúc

Trung Tâm Tin Học – Ngành Mạng  và Thiết  Bị  Di Động

TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN

1.2. Khái niệm kiểu cấu trúc

5

•Một cấu trúc là một tập các biến được tham chiếu thông qua một tên chung. Những biến tạo nên cấu trúc được gọi là các thành viên (members).

•Sự khác biệt giữa kiểu cấu trúc và kiểu mảng là: các phần tử của mảng là cùng kiểu còn các phần tử của kiểu cấu trúc có thể có kiểu khác nhau.

 

Trung Tâm Tin Học – Ngành Mạng  và Thiết  Bị  Di Động

TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN

2.1. Khai báo kiểu cấu trúc

6

●Cấu trúc thực chất là một kiểu dữ liệu do người dùng định nghĩa bằng cách gom nhóm các kiểu dữ liệu cơ bản có sẵn trong C thành một kiểu dữ liệu phức hợp nhiều thành phần.

struct tructureName

{

   type member1;

   type member2;

   ...

   type memberN;

   .. .

} varNames;

 

•structureName: Tên của cấu trúc

•type: Kiểu dữ liệu của thành viên tương ứng

•Member1,..., memberN: Tên các biến thành viên của cấu trúc

•varNames: Tên các biến cấu trúc phân cách nhau bằng dấu phẩy.

 

Trung Tâm Tin Học – Ngành Mạng  và Thiết  Bị  Di Động

TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN

7

2. Khai báo kiểu cấu trúc

Ví dụ:

•Tạo một struct sinh viên gồm các thông tin: mã số sinh viên, họ tên, năm sinh, địa chỉ.

   struct sinhvien

   {

       char MaSv[10];

       char TenSv[30];

       int Namsinh;

       char Diachi[50];

   };

•Khai báo biến kiểu sinhvien: sinhvien sv1, sv2;

 

Trung Tâm Tin Học – Ngành Mạng  và Thiết  Bị  Di Động

TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN

8

Từ khóa typedef dùng để định nghĩa một kiểu dữ liệu mới

Khi ta khai báo:   SinhVien   teo;

Thì teo chính là 1 đối tượng có kiểu dữ liệu là SinhVien

nó tương tự như ta khai báo    int   x ;

 

Vậy để lấy các thông tin bên trong của teo thì làm như thế nào?

Những thông tin mà nằm bên trong 1 cấu trúc (struct) thì được gọi là các thuộc tính của cấu trúc đó

Tức là teo là 1 đối tượng cụ thể, teo có 4 thuộc tính đó là: ma, ten,dtb,lop

để truy xuất tới các thuộc tính ta dùng:

             tên_đối_tượng.thuộc_tính

2. Khai báo kiểu cấu trúc

Trung Tâm Tin Học – Ngành Mạng  và Thiết  Bị  Di Động

TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN

9

●Dùng toán tử dấu chấm (dot operator) để truy cập các thành viên của một biến cấu trúc.

●Cú pháp:

 varNames.memberName

●Ví dụ:

       strcpy(sv1.MaSv, “a001”);

       strcpy(sv1.TenSv,“Nguyen van A”);

       sv2.Namsinh=1977;

3.1. Truy cập biến cấu trúc

Trung Tâm Tin Học – Ngành Mạng  và Thiết  Bị  Di Động

TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN

10

3.2. Lệnh gán cấu trúc

●Dùng lệnh gán để gán nội dung trong 1 biến cấu trúc cho một biến cấu trúc khác có cùng kiểu.

●Ví dụ:

struct coordXY

{

   int x;

   int y;

} diemA, diemB;

diemA.x = 100; diemA.y = 200;

Trung Tâm Tin Học – Ngành Mạng  và Thiết  Bị  Di Động

TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN

11

●Gán nội dung biến cấu trúc diemA cho biến diemB:

diemB = diemA ;

●Hoặc có thể sao chép từng thành viên:

diemB.x = diemA.x;

diemB.y = diemA.y;

 

 

3.2. Lệnh gán cấu trúc

Trung Tâm Tin Học – Ngành Mạng  và Thiết  Bị  Di Động

TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN

12

3.3. Ví dụ

●Cách nhập dữ liệu có kiểu chuỗi từ bàn phím:

   dùng gets

Trung Tâm Tin Học – Ngành Mạng  và Thiết  Bị  Di Động

TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN

13

3.3. Ví dụ

●Viết chương trình nhập vào toạ độ hai điểm trong mặt phẳng và tính tổng hai toạ độ này

*Bước 1: Khai báo kiểu dữ liệu có cấu trúc biểu diễn thông tin tọa độ của một điểm trong mặt phẳng gồm 2 thành phần: hoành độ và tung độ

typedef struct ttDIEM

{

int x;

int y;

};

ttDIEM DIEM;

Trung Tâm Tin Học – Ngành Mạng  và Thiết  Bị  Di Động

TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN

14

*Bước 2: Cài đặt các hàm:

➢Nhập vào tọa độ điểm

void Nhap (DIEM &d);

➢Xuất tọa độ điểm

void Xuat (DIEM d);

➢Tính tổng hai tọa độ

DIEM Tong (DIEM d1,DIEM d2);

3.3. Ví dụ

Trung Tâm Tin Học – Ngành Mạng  và Thiết  Bị  Di Động

TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN

15

3.3. Ví dụ

void Nhap (DIEM &d)

{

cout<<“Hoanh do : “;

cin>>d. x;

cout“Tung do : ”;

cin>>d.y;

}

Trung Tâm Tin Học – Ngành Mạng  và Thiết  Bị  Di Động

TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN

16

3.3. Ví dụ

DIEM Tong (DIEM d1,DIEM d2)

{

DIEM temp;

temp.x = d1.x + d2.x ;

temp.y = d1.y + d2.y ;

return Temp;

}

void Xuat (DIEM d)

{

cout<<“\nToa do diem : (“ <<d.x<< “,”<<d.y<<”)”;

}

Trung Tâm Tin Học – Ngành Mạng  và Thiết  Bị  Di Động

TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN

17

3.3. Ví dụ

void main ()

{

DIEM A , B, AB; //khai bao 3 diem A, B, AB;

cout<<“Nhap toa do diem thu 1: “<<endl;

Nhap ( A );

Xuat ( A );

cout<<“Nhap toa do diem thu 2: “<<endl;

Nhap ( B );

Xuat ( B );

cout<<“\n Tong toa do cua hai diem vua nhap la : ”;

AB = Tong ( A, B);

Xuat ( AB );

}

Trung Tâm Tin Học – Ngành Mạng  và Thiết  Bị  Di Động

TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN

18

4. Mảng các cấu trúc

•Mảng cấu trúc là một mảng mà mỗi phần tử là một biến kiểu cấu trúc.

•Để khai báo một mảng các cấu trúc, trước hết phải khai báo cấu trúc, sau đó khai báo một mảng của cấu trúc đó.

Ví dụ: struct  ds{    

               char hoten[25];

               float toan,ly,hoa;

               };

ds  bangdiem[50];//mảng 50 phần tử kiểu ds

 

Trung Tâm Tin Học – Ngành Mạng  và Thiết  Bị  Di Động

TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN

19

4. Mảng các cấu trúc

●Để truy cập đến từng thành viên của từng phần tử của mảng, ta dùng chỉ mục của phần tử và toán tử thành viên (.).

Ví dụ:

for(int i=0; i<n; i++)

{

   cout <<"Ho va ten: "; gets(bangdiem[i].hoten)

   cout <<"Diem toan: "; cin >> bangdiem[i].toan;

   cout <<"Diem ly:     "; cin >> bangdiem[i].ly;

   cout <<"Diem hoa     "; cin >> bangdiem[i].hoa;

}

Trung Tâm Tin Học – Ngành Mạng  và Thiết  Bị  Di Động

TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN

20

5. Truyền tham số kiểu cấu trúc

a.Truyền thành viên của biến cấu trúc vào hàm

➢Có 2 cách truyền thành viên của biến cấu trúc vào hàm:

•Truyền tham trị

•Truyền tham biến

Trung Tâm Tin Học – Ngành Mạng  và Thiết  Bị  Di Động

TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN

21

5. Truyền tham số kiểu cấu trúc

Ví dụ: Truyền tham trị

struct diem

{

   int x;

   int y;

};

double khcach(int x1, int y1, int x2, int y2)

{

   double kc;

   kc=sqrt(pow((x2-x1),2)+pow((y2-y1),2));

   return kc;

}

Trung Tâm Tin Học – Ngành Mạng  và Thiết  Bị  Di Động

TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN

22

5. Truyền tham số kiểu cấu trúc

Ví dụ: Truyền tham trị

void main()

{

   diem a,b;    double kcach;

   cout<<"\ntoa do diem a:";

   cout<<"\nx1=";cin>>a.x;

   cout<<"\ny1=";cin>>a.y;

   cout<<"\ntoa do diem b:";

   cout<<"\nx2=";cin>>b.x;

   cout<<"\ny2=";cin>>b.y;

   cout<<"\nKhoang cach giua a diem:";

   kcach=khcach(a.x, a.y,b.x, b.y);

   cout<<kcach;

}

Trung Tâm Tin Học – Ngành Mạng  và Thiết  Bị  Di Động

TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN

23

5. Truyền tham số kiểu cấu trúc

Ví dụ: truyền tham chiếu

●Để truyền địa chỉ của thành viên của cấu trúc vào hàm ta dùng toán tử & đặt trước tên biến cấu trúc

void doitoado(int &x, int& y, int a, int b)

   {    x=x-a;    y=y-b; }

void main()

{    diem a,b;

   doitoado(a.x, a.y, 10, 10);

   cout<<"\nx="<<a.x;

   cout<<"\ny="<<a.y;

}

Trung Tâm Tin Học – Ngành Mạng  và Thiết  Bị  Di Động

TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN

24

b. Truyền toàn bộ biến cấu trúc đến hàm

   Khi một cấu trúc được dùng như một đối số của một hàm, toàn bộ cấu trúc được truyền vào tham số hình thức. Có hai cách truyền

–Truyền tham trị.

double khcach(diem a,diem b)

{

   double kc;

   kc=sqrt(pow((b.x-a.x),2)+pow((b.y-a.y),2));

   return kc;

}

5. Truyền tham số kiểu cấu trúc

Trung Tâm Tin Học – Ngành Mạng  và Thiết  Bị  Di Động

TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN

25

5. Truyền tham số kiểu cấu trúc

–Truyền tham chiếu

void doitoado(diem &a,int n, int m)

{

   a.x=a.x-n;    a.y=a.y-m;

}

void main()

{  

          diem a,b;

   doitoado(a, 10, 10);

   cout<< "x="<<a.x<<" y="<<a.y;

}

Trung Tâm Tin Học – Ngành Mạng  và Thiết  Bị  Di Động

TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN

26

6. Con trỏ đến cấu trúc

●Một biến con trỏ có thể trỏ đến một biến kiểu cấu trúc.

●Cú pháp khai báo một con trỏ cấu trúc

structureName *structurePointers;

●Ví dụ:

struct diem

   {

       int x;

       int y;

   };

   diem *p;//p là con trỏ cấu trúc.

 

Trung Tâm Tin Học – Ngành Mạng  và Thiết  Bị  Di Động

TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN

27

6. Con trỏ đến cấu trúc

●Để tham chiếu đến thành viên của một cấu trúc được trỏ đến bởi một con trỏ, ta dùng toán tử -> (toán tử tham chiếu gồm một dấu trừ và một dấu lớn hơn).

●Ví dụ:

P->x=100;

P->y=150;

 

Trung Tâm Tin Học – Ngành Mạng  và Thiết  Bị  Di Động

TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN

28

6. Con trỏ đến cấu trúc

void main()

{

   struct diem

   {

       int x;

       int y;

   };

   diem *p, a;

   p=&a;

   p->x=100;

   p->y=120;

   cout<<a.x;

   cout<<a.y;

}

Trung Tâm Tin Học – Ngành Mạng  và Thiết  Bị  Di Động

TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN

29

6. Con trỏ đến cấu trúc

●Lưu ý:

●Để truy cập đến thành viên của một cấu trúc:

•Nếu dùng biến cấu trúc thì dùng toán tử chấm (dot operator).

•Nếu dùng biến con trỏ thì dùng toán tử -> (arrow operator).

●Truyền tham số là con trỏ cấu trúc thì mặc định là truyền tham chiếu

 

Trung Tâm Tin Học – Ngành Mạng  và Thiết  Bị  Di Động

TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN

30

7. Kiểu liệt kê (Enumerations, enum)

•Một enum là một tập của các tên hằng nguyên xác định tất cả các giá trị hợp lệ mà một biến của kiểu đó có thể có.

•Cú pháp:

enum enumName {enumList} enumVars;

–enum: từ khóa để khai báo enum

–enumName: Tên của enum

–enumList: Danh sách các tên hằng nguyên phân cách nhau bởi dấu phẩy

–enumVars: Tên các biến kiểu enum.

 

Trung Tâm Tin Học – Ngành Mạng  và Thiết  Bị  Di Động

TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN

31

7. Kiểu liệt kê (Enumerations, enum)

•Ví dụ:

enum color {red, orange, yellow, green, blue, indigo};

color c1 = indigo;

if( c1 == indigo )

{

   cout << "c1 is indigo" << endl;

}

Trung Tâm Tin Học – Ngành Mạng  và Thiết  Bị  Di Động

TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN

32

7. Kiểu liệt kê (Enumerations, enum)

•Mỗi một tên trong danh sách enum tượng trưng cho một giá trị nguyên. Giá trị của tên thứ nhất trong enum là 0, kế tiếp là 1, ...

•Ta có thể gán giá trị khác cho mỗi tên hằng nguyên

Trung Tâm Tin Học – Ngành Mạng  và Thiết  Bị  Di Động

TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN

33

8. Typedef

•Từ khóa typedef dùng để định nghĩa một tên mới cho một kiểu dữ liệu đã có.

•Dạng tổng quát của dùng typedef là

typedef  existingType  newType;

–existingType: là kiểu dữ liệu nào đã tồn tại

–newType: tên mới của kiểu dữ liệu

Trung Tâm Tin Học – Ngành Mạng  và Thiết  Bị  Di Động

TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN

34

•Ví dụ: Tạo một tên mới cho kiểu dữ liệu int

typedef int int2bytes;

typedef long int4bytes;

Sau khi các lệnh trên thực hiện thì lệnh

int n1;

long n2;

tương đương

           int2bytes n1;

Int4bytes  n2;

 

8. Typedef

Trung Tâm Tin Học – Ngành Mạng  và Thiết  Bị  Di Động

TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN

35

 

Viết chương trình quản lý sinh viên