Trung Tâm Tin Hc – Ngành Mng  và Thiết  Bị  Di Đng

TRƯNG ĐI HC KHOA HC TNHIÊN

Bài 7:

Kiu DLiu Có Cu Trúc

Trung Tâm Tin Hc – Ngành Mng  và Thiết  Bị  Di Đng

TRƯNG ĐI HC KHOA HC TNHIÊN

2

1. Khái nim kiu cu trúc

2. Khai báo cu trúc

3. Các thao tác cơ bn

4. Mng cu trúc và các thao tác

5. Enumerations - Typedef

Trung Tâm Tin Hc – Ngành Mng  và Thiết  Bị  Di Đng

TRƯNG ĐI HC KHOA HC TNHIÊN

3

1. Khái nim

Ngôn ngC/C++ đưa ra 5 cách đto  nên mt kiu dliu tùy biến (custom data types).

1.Structure:Là mt nhóm ca các biến đưc đnh nghĩa  i  mt  tên.  Kiu  này  còn  gi  là  kiu  dữ  liu  phc  hp.

2.Bit-field:là mt biến thca kiu structure và cho phép ddàng truy cp đến tng bit riêng r.

3.Union: cho phép cùng mt mu bnhđưc đnh nghĩa như hai hay nhiu kiu biến khác nhau.

4.Enumeration: là danh sách ca các tên hng nguyên.

5.Typedef: đnh nghĩa mt tên khác cho mt kiu dliu đã có.

Trung Tâm Tin Hc – Ngành Mng  và Thiết  Bị  Di Đng

TRƯNG ĐI HC KHOA HC TNHIÊN

1.2. Khái nim kiu cu trúc

4

Ví dmđu: Trưng đi hc XYZ cn viết 1 phn mm qun lý sinh viên, thông tin cn lưu trcho mi sinh viên bao gm: mã sinh viên, htên, tui, quê quán, lp hc…..

Trong trưng hp này chúng ta cn gii quyết vn đề  : 1 dliu có khnăng cha nhiu thông tin trong nó.

đgii quyết vn đnày ta dùng kiu dliu có Cu Trúc

Trung Tâm Tin Hc – Ngành Mng  và Thiết  Bị  Di Đng

TRƯNG ĐI HC KHOA HC TNHIÊN

1.2. Khái nim kiu cu trúc

5

Mt cu trúc là mt tp các biến đưc tham chiếu thông qua mt tên chung. Nhng biến to nên cu trúc đưc gi là các thành viên (members).

Skhác bit gia kiu cu trúc và kiu mng là: các phn tca mng là cùng kiu còn các phn tca kiu cu trúc có thcó kiu khác nhau.

 

Trung Tâm Tin Hc – Ngành Mng  và Thiết  Bị  Di Đng

TRƯNG ĐI HC KHOA HC TNHIÊN

2.1. Khai báo kiu cu trúc

6

Cấu trúc thực chất là một kiểu dữ liu 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 ca cu trúc

type: Kiu dliu ca thành viên tương ng

Member1,..., memberN: Tên các biến thành viên ca cu trúc

varNames: Tên các biến cu trúc phân cách nhau bng du phy.

 

Trung Tâm Tin Hc – Ngành Mng  và Thiết  Bị  Di Đng

TRƯNG ĐI HC KHOA HC TNHIÊN

7

2. Khai báo kiu cu trúc

Ví d:

To mt struct sinh viên gm các thông tin: mã ssinh viên, htên, năm sinh, đa ch.

   struct sinhvien

   {

       char MaSv[10];

       char TenSv[30];

       int Namsinh;

       char Diachi[50];

   };

Khai báo biến kiu sinhvien: sinhvien sv1, sv2;

 

Trung Tâm Tin Hc – Ngành Mng  và Thiết  Bị  Di Đng

TRƯNG ĐI HC KHOA HC TNHIÊN

8

Tkhóa typedef dùng đđnh nghĩa mt kiu dliu mi

Khi ta khai báo:   SinhVien   teo;

Thì teo chính là 1 đi tưng có kiu dliu là SinhVien

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

 

Vy đly các thông tin bên trong ca teo thì làm như thế nào?

Nhng thông tin mà nm bên trong 1 cu trúc (struct) thì đưc gi là các thuc tính ca cu trúc đó

Tc là teo là 1 đi tưng cth, teo có 4 thuc tính đó là: ma, ten,dtb,lop

đtruy xut ti các thuc tính ta dùng:

             tên_đi_tưng.thuc_tính

2. Khai báo kiu cu trúc

Trung Tâm Tin Hc – Ngành Mng  và Thiết  Bị  Di Đng

TRƯNG ĐI HC KHOA HC TNHIÊN

9

Dùng toán tdu chm (dot operator) đtruy cp các thành viên ca mt biến cu 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 cp biến cu trúc

Trung Tâm Tin Hc – Ngành Mng  và Thiết  Bị  Di Đng

TRƯNG ĐI HC KHOA HC TNHIÊN

10

3.2. Lnh gán cu trúc

Dùng lnh gán đgán ni dung trong 1 biến cu trúc cho mt biến cu trúc khác có cùng kiu.

Ví d:

struct coordXY

{

   int x;

   int y;

} diemA, diemB;

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

Trung Tâm Tin Hc – Ngành Mng  và Thiết  Bị  Di Đng

TRƯNG ĐI HC KHOA HC TNHIÊN

11

Gán ni dung biến cu trúc diemA cho biến diemB:

diemB = diemA ;

Hoc có thsao chép tng thành viên:

diemB.x = diemA.x;

diemB.y = diemA.y;

 

 

3.2. Lnh gán cu trúc

Trung Tâm Tin Hc – Ngành Mng  và Thiết  Bị  Di Đng

TRƯNG ĐI HC KHOA HC TNHIÊN

12

3.3. Ví d

Cách nhp dliu có kiu chui tbàn phím:

   dùng gets

Trung Tâm Tin Hc – Ngành Mng  và Thiết  Bị  Di Đng

TRƯNG ĐI HC KHOA HC TNHIÊ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 kiu dliu có cu trúc biu din thông tin ta đca mt đim trong mt phng gm 2 thành phn: hoành đvà tung đ

typedef struct ttDIEM

{

int x;

int y;

};

ttDIEM DIEM;

Trung Tâm Tin Hc – Ngành Mng  và Thiết  Bị  Di Đng

TRƯNG ĐI HC KHOA HC TNHIÊN

14

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

Nhp vào ta đđim

void Nhap (DIEM &d);

Xut ta đđim

void Xuat (DIEM d);

Tính tng hai ta đ

DIEM Tong (DIEM d1,DIEM d2);

3.3. Ví d

Trung Tâm Tin Hc – Ngành Mng  và Thiết  Bị  Di Đng

TRƯNG ĐI HC KHOA HC TNHIÊ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 Hc – Ngành Mng  và Thiết  Bị  Di Đng

TRƯNG ĐI HC KHOA HC TNHIÊ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 Hc – Ngành Mng  và Thiết  Bị  Di Đng

TRƯNG ĐI HC KHOA HC TNHIÊ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 Hc – Ngành Mng  và Thiết  Bị  Di Đng

TRƯNG ĐI HC KHOA HC TNHIÊN

18

4. Mng các cu trúc

Mng cu trúc là mt mng mà mi phn tlà mt biến kiu cu trúc.

Đkhai báo mt mng các cu trúc, trưc hết phi khai báo cu trúc, sau đó khai báo mt mng ca cu trúc đó.

Ví d: struct  ds{    

               char hoten[25];

               float toan,ly,hoa;

               };

ds  bangdiem[50];//mng 50 phn tkiu ds

 

Trung Tâm Tin Hc – Ngành Mng  và Thiết  Bị  Di Đng

TRƯNG ĐI HC KHOA HC TNHIÊN

19

4. Mng các cu trúc

Đtruy cp đến tng thành viên ca tng phn tca mng, ta dùng chmc ca phn tvà toán tthà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 Hc – Ngành Mng  và Thiết  Bị  Di Đng

TRƯNG ĐI HC KHOA HC TNHIÊN

20

5. Truyn tham skiu cu trúc

a.Truyn thành viên ca biến cu trúc vào hàm

Có 2 cách truyn thành viên ca biến cu trúc vào hàm:

Truyn tham tr

Truyn tham biến

Trung Tâm Tin Hc – Ngành Mng  và Thiết  Bị  Di Đng

TRƯNG ĐI HC KHOA HC TNHIÊN

21

5. Truyn tham skiu cu trúc

Ví d: Truyn 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 Hc – Ngành Mng  và Thiết  Bị  Di Đng

TRƯNG ĐI HC KHOA HC TNHIÊN

22

5. Truyn tham skiu cu trúc

Ví d: Truyn 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 Hc – Ngành Mng  và Thiết  Bị  Di Đng

TRƯNG ĐI HC KHOA HC TNHIÊN

23

5. Truyn tham skiu cu trúc

Ví d: truyn tham chiếu

Đtruyn đa chca thành viên ca cu trúc vào hàm ta dùng toán t& đt trưc tên biến cu 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 Hc – Ngành Mng  và Thiết  Bị  Di Đng

TRƯNG ĐI HC KHOA HC TNHIÊN

24

b. Truyn toàn bbiến cu trúc đến hàm

   Khi mt cu trúc đưc dùng như mt đi sca mt hàm, toàn bcu trúc đưc truyn vào tham shình thc. Có hai cách truyn

Truyn 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. Truyn tham skiu cu trúc

Trung Tâm Tin Hc – Ngành Mng  và Thiết  Bị  Di Đng

TRƯNG ĐI HC KHOA HC TNHIÊN

25

5. Truyn tham skiu cu trúc

Truyn 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 Hc – Ngành Mng  và Thiết  Bị  Di Đng

TRƯNG ĐI HC KHOA HC TNHIÊN

26

6. Con trđến cu trúc

Mt biến con trcó thtrđến mt biến kiu cu trúc.

Cú pháp khai báo mt con trcu trúc

structureName *structurePointers;

Ví d:

struct diem

   {

       int x;

       int y;

   };

   diem *p;//p là con trcu trúc.

 

Trung Tâm Tin Hc – Ngành Mng  và Thiết  Bị  Di Đng

TRƯNG ĐI HC KHOA HC TNHIÊN

27

6. Con trđến cu trúc

Đtham chiếu đến thành viên ca mt cu trúc đưc trđến bi mt con tr, ta dùng toán t-> (toán ttham chiếu gm mt du trvà mt du ln hơn).

Ví d:

P->x=100;

P->y=150;

 

Trung Tâm Tin Hc – Ngành Mng  và Thiết  Bị  Di Đng

TRƯNG ĐI HC KHOA HC TNHIÊN

28

6. Con trđến cu 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 Hc – Ngành Mng  và Thiết  Bị  Di Đng

TRƯNG ĐI HC KHOA HC TNHIÊN

29

6. Con trđến cu trúc

Lưu ý:

Đtruy cp đến thành viên ca mt cu trúc:

Nếu dùng biến cu trúc thì dùng toán tchm (dot operator).

Nếu dùng biến con trthì dùng toán t-> (arrow operator).

Truyn tham slà con trcu trúc thì mc đnh là truyn tham chiếu

 

Trung Tâm Tin Hc – Ngành Mng  và Thiết  Bị  Di Đng

TRƯNG ĐI HC KHOA HC TNHIÊN

30

7. Kiu lit kê (Enumerations, enum)

Mt enum là mt tp ca các tên hng nguyên xác đnh tt ccác giá trhp lmà mt biến ca kiu đó có thcó.

Cú pháp:

enum enumName {enumList} enumVars;

enum: tkhóa đkhai báo enum

enumName: Tên ca enum

enumList: Danh sách các tên hng nguyên phân cách nhau bi du phy

enumVars: Tên các biến kiu enum.

 

Trung Tâm Tin Hc – Ngành Mng  và Thiết  Bị  Di Đng

TRƯNG ĐI HC KHOA HC TNHIÊN

31

7. Kiu lit 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 Hc – Ngành Mng  và Thiết  Bị  Di Đng

TRƯNG ĐI HC KHOA HC TNHIÊN

32

7. Kiu lit kê (Enumerations, enum)

Mi mt tên trong danh sách enum tưng trưng cho mt giá trnguyên. Giá trca tên thnht trong enum là 0, kế tiếp là 1, ...

Ta có thgán giá trkhác cho mi tên hng nguyên

Trung Tâm Tin Hc – Ngành Mng  và Thiết  Bị  Di Đng

TRƯNG ĐI HC KHOA HC TNHIÊN

33

8. Typedef

Tkhóa typedef dùng đđnh nghĩa mt tên mi cho mt kiu dliu đã có.

Dng tng quát ca dùng typedef là

typedef  existingType  newType;

existingType: là kiu dliu nào đã tn ti

newType: tên mi ca kiu dliu

Trung Tâm Tin Hc – Ngành Mng  và Thiết  Bị  Di Đng

TRƯNG ĐI HC KHOA HC TNHIÊN

34

Ví d: To mt tên mi cho kiu dliu int

typedef int int2bytes;

typedef long int4bytes;

Sau khi các lnh trên thc hin thì lnh

int n1;

long n2;

tương đương

           int2bytes n1;

Int4bytes  n2;

 

8. Typedef

Trung Tâm Tin Hc – Ngành Mng  và Thiết  Bị  Di Đng

TRƯNG ĐI HC KHOA HC TNHIÊN

35

 

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