Chỉång VII : Dỉỵ liãûu kiãøu cáúu trục Trang 86 Ch−¬ng VII. DỈỴ LIÃÛU KIÃØU CÁÚU TRỤC I. Kiãøu cáúu trục: I.1. Khai bạo v khåíi tảo kiãøu biãún cáúu trục : Mng l táûp håüp gäưm cạc pháưn tỉí cọ cng kiãøu. Khi ta mún tảo kiãøu dỉỵ liãûu m cạc pháưn tỉí ca chụng cọ kiãøu khạc nhau nhỉng cọ sỉû liãn kãút våïi nhau, ta sỉí dủng kiãøu struct. Máùu : struct tãn_kiãøu_cáúu_trục { khai bạo cạc thnh pháưn (cạc trỉåìng) }; Vê dủ : struct khach { char ten[20]; char diachi[100]; int tuoi; int dienthoai; }; Ta cọ mäüt kiãøu måïi l kiãøu khach gäưm cạc trỉåìng ten, diachi, tuoi v dienthoai. Khai bạo v khåíi tảo biãún : struct khach khach_thu_1 = {“Nguyen Van A”,”Da Nang”,20,888888}; Ta cng cọ thãø khai bạo biãún cng lục våïi kiãøu nhỉ sau: struct khach { char ten[20]; char diachi[100]; int tuoi; int dienthoai; } khach_thu_1, khach_thu_2; Ta cọ thãø khai bạo biãún khäng khai bạo kiãøu: struct { char ten[20]; char diachi[100]; int tuoi; int dienthoai; } khach_thu_1, khach_thu_2; Khai bạo kiãøu dng typedef: typedef struct { char ten[20]; char diachi[100]; int tuoi; int dienthoai; } khach; khi khai bạo biãún ta s khäng dng tỉì khọa struct: Chỉång VII : Dỉỵ liãûu kiãøu cáúu trục Trang 87 khach khach_thu_1, khach_thu_2; Âënh nghéa kiãøu cáúu trục läưng nhau: Vê dủ : struct ngay { int ngaythu; int thang; int nam; }; struct nhansu { char hoten[20]; struct ngay ngaysinh; int gioitinh; float hsluong; }nguoi1; I.2. Truy cáûp âãún cạc pháưn tỉí ca mäüt biãún kiãøu cáúu trục : Máùu : tãn_biãún.tãn_pháưn_tỉí Vê dủ : strcpy(khach_thu_1.ten,”Tran Van B”); khach_thu_1.tuoi=40; printf(“Tuoi cua %s la %d”, khach_thu_1.ten, khach_thu_1.tuoi); Ta cọ thãø gạn biãún cáúu trục ny cho biãún cáúu trục khạc cọ cng kiãøu : khach_thu_2= khach_thu_1; Ta cọ thãø khåíi tảo biãún cáúu trục tỉì lục khai bạo nhỉ khåíi tảo mng: khach khach_1={“John”,”17 Le Duan, Da Nang”,40,876543}; Våïi cạc cáúu trục läưng nhau ta cng truy cáûp tỉång tỉû. Vê dủ : nguoi1.ngaysinh.nam Ta cọ thãø sỉí dủng phẹp toạn láúy âëa chè âäúi våïi thnh pháưn cáúu trục Vê dủ : scanf(“%d”,&khach_thu_1.tuoi); Våïi thnh pháưn cáúu trục khäng ngun, ta nháûp thäng qua biãún trung gian. I.3. Thnh pháưn kiãøu field: Khi ta mún cọ âỉåüc cạc thnh pháưn ngun giạ trë nh, tiãút kiãûm bäü nhåï thç ta dng kiãøu field. Cạc pháưn tỉí âỉåüc âënh nghéa âỉåïi dảng cạc bit cọ dáúu hồûc khäng dáúu. Âäü di ca mäùi trỉåìng khäng vỉåüt quạ 16 bit. struct bit_field { int bit_1 : 1; int bits_2_to_5 : 4; int bit_6 : 1; int bits_7_to_16 : 10; } bit_var; Ta khäng thãø láúy âëa chè thnh pháưn kiãøu field, khäng thãø xáy dỉûng mng kiãøu field v thnh pháưn kiãøu field khäng thãø lm giạ trë tr vãư. Chỉång VII : Dỉỵ liãûu kiãøu cáúu trục Trang 88 I.4. Con tr tr âãún kiãøu cáúu trục : typedef struct { int x; int y; }diem; diem diem1,diem2; diem *pointer=&diem1; Ta dng con tr âãø truy cáûp âãún cạc pháưn tỉí ca cáúu trục : tãn_con_tr->tãn_thnh_pháưn hồûc (*tãn_con_tr).tãn_thnh_pháưn toạn tỉí -> gi l toạn tỉí tr tåïi Vê dủ : pointer->x=5; tỉång âỉång våïi diem1.x (*pointer).y=6; tỉång âỉång våïi diem1.y Tỉång tỉû nhỉ con tr biãún thỉåìng, phẹp toạn säú hc âäúi våïi con tr cáúu trục cng hoảt âäüng tỉång tỉû. I.5. Mng cáúu trục : Ta khai bạo ta âäü bàòng cáúu trục : typedef struct { int x; int y; }diem; diem diem1,diem2; Âãø lỉu trỉỵ ta âäü ca 20 âiãøm ta dng mng : diem taphop[20]= { {2,3}, {3,4} }; Cng nhỉ mng khạc, mng cáúu trục cng âỉåüc âạnh säú thỉï tỉû tỉì 0. Âãø truy cáûp vo cạc pháưn tỉí ca mng : taphop[3].x=4; taphop[3].y=6; Cng nhỉ cạc biãún cáúu trục, ta cọ thãø gạn cạc pháưn tỉí ca mng cho nhau v cho cạc biãún cáúu trục âån. Chụ : thỉåìng khäng âỉåüc sỉí dủng phẹp toạn láúy âëa chè âäúi våïi cạc thnh pháưn ca mng cáúu trục. Âãø cáúp phạt bäü nhåï hiãûu qu, ta dng hm malloc: diem *d; int sodiem; d=(diem *)malloc(sodiem*sizeof(diem)); I.6. Cáúu trục v hm : Chuøn tỉìng pháưn tỉí ca biãún cáúu trục hồûc c biãún cáúu trục cho hm : Chổồng VII : Dổợ lióỷu kióứu cỏỳu truùc Trang 89 ham1(diem1.x); ham2(diem1.y); Ta coù thóứ chuyóứn õởa chố cuớa tổỡng phỏửn tổớ cho haỡm. ham1(&diem1.x); ham2(&diem1.y); Vờ duỷ : struct diem { int x; int y; } ; void ham(struct diem d) { printf("\nd.x=%4d\nd.y=%4d",d.x,d.y); } void main() { struct diem diem1; diem1.x=2;diem1.y=4; ham(diem1); } óứ thay õọứi giaù trở cuớa cỏỳu truùc ta truyóửn con troớ cỏỳu truùc. Giaù trở traớ vóử cuớa haỡm coù thóứ laỡ cỏỳu truùc hoỷc con troớ cỏỳu truùc. Vờ duỷ: #include <stdio.h> #include <conio.h> #include <alloc.h> typedef struct { char ten[30] ; int diem ; char kq[5] ; } kieuHV; kieuHV *lop , *p , tam ; /* Ham nhap danh sach */ void nhapds ( int n , kieuHV lop[ ]) { int i , diem ; p = lop ; for ( i = 0 ; i < n ; i++) { printf("\nNhap Ho ten nguoi thu %d : " , i + 1 ) ; gets ( p->ten); printf ( " diem = " ) ; scanf ( "%d" , &diem ) ; p->diem = diem ; Chổồng VII : Dổợ lióỷu kióứu cỏỳu truùc Trang 90 printf ("%c", getchar()); /* khu stdin */ p++ ; } } /* Ham sap xep*/ void sapxep ( int n, kieuHV lop[ ]) { int i , j ; kieuHV tam ; for ( i = 0 ; i < n-1 ; i++) for ( j=i + 1 ; j< n ; j++) if ( lop[i].diem < lop[j].diem ) { tam = lop[i] ; lop[i] = lop [j] ; lop [j] = tam ; } } /* ham in danh sach */ void inds( int n, kieuHV lop[] ) { int i ; for ( i = 0 ; i < n ; i++ ) { printf ("%20s%5d ", lop[i].ten,lop[i].diem ); printf ("\n") ; /* xuong hang */ } } /* chuong trinh chinh */ void main ( ) { int i , j, n , t, diem ; printf ("\n Nhap si so : ") ; scanf ( "%d", &n); lop = (kieuHV*)malloc ( n * sizeof ( kieuHV) ) ; printf ("%c", getchar ()); nhapds(n, lop ) ; sapxep ( n, lop ) ; inds ( n, lop ); getch ( ); } II. Kióứu Union: Cuợng nhổ cỏỳu truùc, union gọửm nhióửu thaỡnh phỏửn khaùc nhau, nhổng chuùng khaùc nhau ồớ chọự : caùc thaỡnh phỏửn cuớa cỏỳu truùc chióỳm caùc vuỡng nhồù khaùc nhau trong khi caùc thaỡnh phỏửn cuớa union õổồỹc cỏỳp phaùt chung mọỹt vuỡng nhồù. ọỹ daỡi cuớa union bũng õọỹ daỡi cuớa thaỡnh phỏửn lồùn nhỏỳt. Vióỷc khai baùo vaỡ truy xuỏỳt caùc thaỡnh phỏửn cuớa union cuợng tổồng tổỷ nhổ struct. Seợ laỡ vọ nghộa nóỳu chuùng ta khồới taỷo cho tỏỳt caớ caùc thaỡnh phỏửn cuớa bióỳn union. Ta coù thóứ khồới taỷo : union u { char ch; int x; } a_union = {`H'}; Chæång VII : Dæî liãûu kiãøu cáúu truïc Trang 91 Vê duû : #include <stdio.h> #include <conio.h> typedef union { int ax; int ay; } test; void main() { test r; r.ax=4660; printf("\n r.ax=%d",r.ax); printf("\n r.ay=%d",r.ay); getch(); } Kãút quaí laì : ax=4660 ay=4660 Vê duû: #include <stdio.h> #include <conio.h> union u { char ch[2]; int num; }; void main(void) { union u val; val.ch[0] = 'A'; val.ch[1] = 'b'; printf("The two character constants held by the union:\n"); printf("%c\n", val.num & 0x00FF); A printf("%c\n", val.num >> 8); b } Vê duû : #include <stdio.h> #include <conio.h> typedef union { unsigned int ax; struct { unsigned char al; unsigned char ah; } byte; } thanh_ghi; void main() Chổồng VII : Dổợ lióỷu kióứu cỏỳu truùc Trang 92 { thanh_ghi r; r.ax=0x1234; printf("\n r.ax=%x",r.ax); printf("\n r.ah=%x",r.byte.ah); printf("\n r.al=%x",r.byte.al); getch(); } Kóỳt quaớ : r.ax=1234 r.ah=12 r.al=34 Thổỷc ra trong dos.h ngổồỡi ta õaợ õởnh nghộa kióứu dổợ lióỷu union coù tón REGS õóứ phuỷc vuỷ cho vióỷc truy cỏỷp caùc thanh ghi cuớa CPU trong vióỷc goỹi ngừt trong C. struct BYTEREGS { unsigned char al, ah, bl, bh; unsigned char cl, ch, dl, dh; }; struct WORDREGS { unsigned int ax, bx, cx, dx; unsigned int si, di, cflag, flags; }; union REGS { struct WORDREGS x; struct BYTEREGS h; }; Vờ duỷ: typedef struct { char type; union { char ch; int i; float f; }v; } solieu; Dổỷa vaỡo thaỡnh phỏửn type maỡ ta bióỳt õổồỹc cỏửn xổớ lyù sọỳ lióỷu theo kióứu sọỳ naỡo. Caùch laỡm naỡy ờt tọỳn bọỹ nhồù. Ngổồỡi ta coỡn duỡng union õóứ trờch xuỏỳt caùc bit trong byte,word. Chổồng VII : Dổợ lióỷu kióứu cỏỳu truùc Trang 93 III. Baỡi tỏỷp : 1. Xỏy dổỷng maớng cỏỳu truùc maỡ mọựi cỏỳu truùc (ổùng vồùi mọựi sinh vión) gọửm caùc trổồỡng sau : - Hoỹ vaỡ tón - Tuọứi - Lồùp - ióứm thi trong õoù õióứm thi laỡ mọỹt cỏỳu truùc gọửm ba trổồỡng : toaùn, lyù, hoùa. Nhỏỷp sọỳ lióỷu cuớa 10 thờ sinh, hióứn thở caùc thờ sinh coù õióứm trung bỗnh lồùn hồn 5 theo thổù tổỷ tng dỏửn cuớa tọứng sọỳ õióứm. Nhỏỷp vaỡo tón cỏửn tỗm, nóỳu coù nhióửu hoỹc vión coù cuỡng tón cỏửn tỗm thỗ in ra ngổồỡi õỏửu tión vaỡ ngổồỡi cuọỳi cuỡng. 2. Vióỳt chổồng trỗnh cọỹng, trổỡ, nhỏn, chia caùc sọỳ phổùc. 3. Nhỏỷp vaỡo toaỷ õọỹ 4 õióứm A,B,C,D. Kióứm tra xem õióứm D coù nũm trong tam giaùc ABC khọng, 2 õoaỷn thúng AC vaỡ BD coù cừt nhau khọng.