You are on page 1of 7

Lp trnh cn bn

Chng IX:

KIU CU TRC

Hc xong chng ny, sinh vin s nm c cc vn sau: Khi nim v kiu cu trc. Cch s dng kiu cu trc. Con tr cu trc.

I. KIU CU TRC TRONG C


I.1 Khi nim
Kiu cu trc (Structure) l kiu d liu bao gm nhiu thnh phn c kiu khc nhau, mi thnh phn c gi l mt trng (field) S khc bit gia kiu cu trc v kiu mng l: cc phn t ca mng l cng kiu cn cc phn t ca kiu cu trc c th c kiu khc nhau. Hnh nh ca kiu cu trc c minh ha: 1 2 3 4 5 6 7
Trng

y l cu trc c 7 trng Cn kiu mng c dng: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14


Phn t

y l mng c 15 phn t

I.2 nh ngha kiu cu trc


Cch 1: struct <Tn cu trc> { <Kiu> <Trng 1> ; <Kiu> <Trng 2> ; .. <Kiu> <Trng n> ; }; Cch 2: S dng t kha typedef nh ngha kiu: typedef struct { <Kiu> <Trng 1> ; <Kiu> <Trng 2> ; ..
Trang 98

Lp trnh cn bn

<Kiu> <Trng n> ; } <Tn cu trc>;


Trong :

- <Tn cu trc>: l mt tn c t theo quy tc t tn ca danh biu; tn ny mang ngha s l tn kiu cu trc. - <Kiu> <Trng i> (i=1..n): mi trng trong cu trc c d liu thuc kiu g (tn ca trng phi l mt tn c t theo quy tc t tn ca danh biu). V d 1: qun l ngy, thng, nm ca mt ngy trong nm ta c th khai bo kiu cu trc gm 3 thng tin: ngy, thng, nm.
struct NgayThang { unsigned char Ngay; unsigned char Thang; unsigned int Nam; };
typedef struct { unsigned char Ngay; unsigned char Thang; unsigned int Nam; } NgayThang;

V d 2: Mi sinh vin cn c qun l bi cc thng tin: m s sinh vin, h tn, ngy thng nm sinh, gii tnh, a ch thng tr. Lc ny ta c th khai bo mt struct gm cc thng tin trn.
struct SinhVien { char MSSV[10]; char HoTen[40]; struct NgayThang NgaySinh; int Phai; char DiaChi[40]; }; typedef struct { char MSSV[10]; char HoTen[40]; NgayThang NgaySinh; int Phai; char DiaChi[40]; } SinhVien;

I.3 Khai bo bin cu trc


Vic khai bo bin cu trc cng tng t nh khai bo bin thuc kiu d liu chun.
C php:

- i vi cu trc c nh ngha theo cch 1: struct <Tn cu trc> <Bin 1> [, <Bin 2>]; - i vi cc cu trc c nh ngha theo cch 2: <Tn cu trc> <Bin 1> [, <Bin 2>]; V d: Khai bo bin NgaySinh c kiu cu trc NgayThang; bin SV c kiu cu trc SinhVien.
struct NgayThang NgaySinh; struct SinhVien SV; NgayThang NgaySinh; SinhVien SV;

Trang 99

Lp trnh cn bn

II. CC THAO TC TRN BIN KIU CU TRC


II.1 Truy xut n tng trng ca bin cu trc
C php: <Bin cu trc>.<Tn trng> Khi s dng cch truy xut theo kiu ny, cc thao tc trn <Bin cu trc>.<Tn trng> ging nh cc thao tc trn cc bin ca kiu d liu ca <Tn trng>. V d : Vit chng trnh cho php c d liu t bn phm cho bin mu tin SinhVien v in bin mu tin ln mn hnh:
#include<conio.h> #include<stdio.h> #include<string.h> typedef struct { unsigned char Ngay; unsigned char Thang; unsigned int Nam; } NgayThang; typedef struct { char MSSV[10]; char HoTen[40]; NgayThang NgaySinh; int Phai; char DiaChi[40]; } SinhVien; /* Hm in ln mn hnh 1 mu tin SinhVien*/ void InSV(SinhVien s) { printf("MSSV: | Ho va ten | Ngay Sinh | Dia chi\n"); printf("%s | %s | %d-%d-%d | %s\n",s.MSSV,s.HoTen, s.NgaySinh.Ngay,s.NgaySinh.Thang,s.NgaySinh.Nam,s.DiaChi); } int main() { SinhVien SV, s; printf("Nhap MSSV: ");gets(SV.MSSV); printf("Nhap Ho va ten: ");gets(SV.HoTen); printf("Sinh ngay: ");scanf("%d",&SV.NgaySinh.Ngay); printf("Thang: ");scanf("%d",&SV.NgaySinh.Thang); printf("Nam: ");scanf("%d",&SV.NgaySinh.Nam); printf("Gioi tinh (0: Nu), (1: Nam): ");scanf("%d",&SV.Phai); flushall(); printf("Dia chi: ");gets(SV.DiaChi); InSV(SV); s=SV; /* Gn tr cho mu tin s*/ InSV(s); getch(); return 0; }

Trang 100

Lp trnh cn bn

Lu :

- Cc bin cu trc c th gn cho nhau. Thc cht y l thao tc trn ton b cu trc khng phi trn mt trng ring r no. Chng trnh trn dng s=SV l mt v d. - Vi cc bin kiu cu trc ta khng th thc hin c cc thao tc sau y: o S dng cc hm xut nhp trn bin cu trc. o Cc php ton quan h, cc php ton s hc v logic. V d: Nhp vo hai s phc v tnh tng ca chng. Ta bit rng s phc l mt cp (a,b) trong a, b l cc s thc, a gi l phn thc, b l phn o. (i khi ngi ta cng vit s phc di dng a + ib trong i l mt n v o c tnh cht i2=-1). Gi s phc c1=(a1, b1) v c2=(a2,b2) khi tng ca hai s phc c1 v c2 l mt s phc c3 m c3=(a1+a2, b1+b2). Vi hiu bit nh vy ta c th xem mi s phc l mt cu trc c hai trng, mt trng biu din cho phn thc, mt trng biu din cho phn o. Vic tnh tng ca hai s phc c tnh bng cch ly phn thc cng vi phn thc v phn o cng vi phn o.
#include<conio.h> #include<stdio.h> #include<string.h> typedef struct { float Thuc; float Ao; } SoPhuc; /* Hm in s phc ln mn hnh*/ void InSoPhuc(SoPhuc p) { printf("%.2f + i%.2f\n",p.Thuc,p.Ao); } int main() { SoPhuc p1,p2,p; clrscr(); printf("Nhap so phuc thu nhat:\n"); printf("Phan thuc: ");scanf("%f",&p1.Thuc); printf("Phan ao: ");scanf("%f",&p1.Ao); printf("Nhap so phuc thu hai:\n"); printf("Phan thuc: ");scanf("%f",&p2.Thuc); printf("Phan ao: ");scanf("%f",&p2.Ao); printf("So phuc thu nhat: "); InSoPhuc(p1); printf("So phuc thu hai: ");

Trang 101

Lp trnh cn bn
InSoPhuc(p2); p.Thuc = p1.Thuc+p2.Thuc; p.Ao = p1.Ao + p2.Ao; printf("Tong 2 so phuc: "); InSoPhuc(p); getch(); return 0; }

Kt qu thc hin chng trnh:

II.2 Khi to cu trc


Vic khi to cu trc c th c thc hin trong lc khai bo bin cu trc. Cc trng ca cu trc c khi to c t gia 2 du { v }, chng c phn cch nhau bi du phy (,). V d: Khi to bin cu trc NgaySinh: struct NgayThang NgaySinh ={29, 8, 1986};

III. CON TR CU TRC


III.1 Khai bo
Vic khai bo mt bin con tr kiu cu trc cng tng t nh khi khai bo mt bin con tr khc, ngha l t thm du * vo pha trc tn bin. C php: struct <Tn cu trc> * <Tn bin con tr>; V d: Ta c th khai bo mt con tr cu trc kiu NgayThang nh sau:
struct NgayThang *p; /* NgayThang *p; // Nu c nh ngha kiu */

III.2 S dng cc con tr kiu cu trc


Khi khai bo bin con tr cu trc, bin con tr cha c a ch c th. Lc ny n ch mi c cp pht 2 byte lu gi a ch v c ghi nhn l con tr ch n 1 cu trc, nhng cha ch n 1 i tng c th. Mun thao tc trn con tr cu trc hp l, cng tng t nh cc con tr khc, ta phi: - Cp pht mt vng nh cho n (s dng hm malloc() hay calloc) - Hoc, cho n qun l a ch ca mt bin cu trc no . V d: Sau khi khi to gi tr ca cu trc:
struct NgayThang Ngay = {29,8,1986};

Trang 102

Lp trnh cn bn
p = &Ngay;

lc ny bin con tr p cha a ch ca Ngay.

III.3 Truy cp cc thnh phn ca cu trc ang c qun l bi con tr


truy cp n tng trng ca 1 cu trc thng qua con tr ca n, ta s dng ton t du mi tn (->: du - v du >). Ngoi ra, ta vn c th s dng n php ton * truy cp vng d liu ang c qun l bi con tr cu trc ly thng tin cn thit. V d: S dng con tr cu trc.
#include<conio.h> #include<stdio.h> typedef struct { unsigned char Ngay; unsigned char Thang; unsigned int Nam; } NgayThang; int main() { NgayThang Ng={29,8,1986}; NgayThang *p; clrscr(); p=&Ng; printf("Truy cap binh thuong %d-%d-%d\n", Ng.Ngay,Ng.Thang,Ng.Nam); printf("Truy cap qua con tro %d-%d-%d\n", p->Ngay,p->Thang,p->Nam); printf("Truy cap qua vung nho con tro %d-%d-%d\n", (*p).Ngay,(*p).Thang,(*p).Nam); getch(); return 0; }

Kt qu:

IV. BI TP
IV.1 Mc ch yu cu
Lm quen v bit cch s dng kiu d liu cu trc kt hp vi cc kiu d liu hc. Phn bit kiu d liu mng v kiu cu trc. Thc hin cc bi tp trong phn ni dung.

Trang 103

Lp trnh cn bn

IV.2 Ni dung
1. Hy nh ngha kiu:
struct Hoso{ char HoTen[40]; float Diem; char Loai[10]; };

Vit chng trnh nhp vo h tn, im ca n hc sinh. Xp loi vn ha theo cch sau: im Xp loi 9, 10 Gii 7, 8 Kh 5, 6 Trung bnh di 5 Khng t In danh sch ln mn hnh theo dng sau:
XEP LOAI VAN HOA

HO VA TEN DIEM XEPLOAI Nguyen Van A 7 Kha Ho Thi B 5 Trung binh Dang Kim C 4 Khong dat ........................................................................................................ 2. Xem mt phn s l mt cu trc c hai trng l t s v mu s. Hy vit chng trnh thc hin cc php ton cng, tr, nhn, chia hai phn s. (Cc kt qu phi ti gin ). 3. To mt danh sch cn b cng nhn vin, mi ngi ngi xem nh mt cu trc bao gm cc trng Ho, Ten, Luong, Tuoi, Dchi. Nhp mt s ngi vo danh sch, sp xp tn theo th t t in, in danh sch sp xp theo mu sau:
DANH SACH CAN BO CONG NHAN VIEN | STT |HO VA TEN | LUONG | TUOI | DIACHI | 1 | Nguyen Van | 333.00 | 26 Tho | | 2 | Dang Kim B | 23 | Vinh Long | | Can | |

290.00

Trang 104

You might also like