You are on page 1of 186

HC VIN CNG NGH BU CHNH VIN THNG

NGN NG LP TRNH C++


(Dng cho sinh vin h o to i hc t xa) Lu hnh ni b

H NI - 2006

NGN NG LP TRNH C++


PGS.TS. Trn nh Qu KS. Nguyn Mnh Hng

Lp trnh nng cao vi C++ Lp trnh hng i tng vi C++

GII THIU
C++ l ngn ng lp trnh hng i tng c m rng t ngn ng C. Do vy, C++ c u im l k tha c cc im mnh truyn thng ca ngn ng C nh uyn chuyn, tng thch vi cc thit b phn cng. Hin nay, C++ l mt ngn ng lp trnh ph bin, c ging dy ti cc trng i hc trong nc v trn th gii v c bit c s dng rng ri cho nhu cu pht trin ca cng nghip phn mm hin nay. Ti liu ny khng nhng nhm gii thiu cho sinh vin ngn ng lp trnh C++, m cn mong mun qua sinh vin c th hiu c t tng ca phng php lp trnh hng i tng ni chung. Ni dung ca ti liu bao gm hai phn chnh: Phn th nht l lp trnh nng cao vi C++, bao gm lp trnh C++ vi con tr v mng, cc kiu d liu c cu trc cng cc thao tc vo ra trn tp. Phn th hai l lp trnh hng i tng vi C++, bao gm cc nh ngha v cc thao tc trn lp i tng, tnh k tha v tng ng bi trong C++, cch s dng mt s lp c bn trong th vin C++. Chng 1: Gii thiu tng quan v cc phng php lp trnh Trnh by cc phng php lp trnh tuyn tnh, lp trnh cu trc v c bit, lm quen vi cc khi nim trong lp trnh hng i tng. Chng 2: Con tr v mng Trnh by cch khai bo v s dng cc kiu con tr v mng trong ngn ng C++. Chng 3: Kiu d liu c cu trc Trnh by cch biu din v ci t mt s kiu cu trc d liu tru tng trong C++. Sau , trnh by cch p dng cc kiu d liu ny trong cc ng dng c th. Chng 4: Vo ra trn tp Trnh by cc thao tc c, ghi d liu trn cc tp tin khc nhau: tp tin vn bn v tp tin nh phn. Trnh by cc cch truy nhp tp tin trc tip. Chng 5: Lp i tng Trnh by cc khi nim m u cho lp trnh hng i tng trong C++, bao gm cch khai bo v s dng lp, cc thuc tnh ca lp; cch khi to v hu b i tng, cc quy tc truy nhp n cc thnh phn ca lp. Chng 6: Tnh k tha v tng ng bi Trnh by cch thc k tha gia cc lp trong C++, cc nguyn tc truy nhp trong k tha, nh ngha np chng cc phng thc v tnh a hnh trong lp trnh hng i tng vi C++. Chng 7: Mt s lp quan trng Trnh by cch s dng mt s lp c sn trong th vin chun ca C++, bao gm cc lp: lp tp hp, lp chui, lp ngn xp, lp hng i v lp danh sch lin kt. c c cun sch ny, sinh vin phi quen bit cc khi nim c bn v lp trnh, c mt s k nng lp trnh vi ngn ng C hoc C++. Cun sch ny cng c th dng ti liu tham kho cho nhng sinh vin mun tm hiu cc k thut lp trnh nng cao v lp trnh hng i tng

Ni dung ti liu c t chc thnh 7 chng:

vi C++. Cun sch ny c km theo mt a chng trnh cha ton b cc chng trnh c ly lm minh ho v cc bi tp trong cun sch. Mc d cc tc gi c nhiu c gng trong vic bin son ti liu ny, song khng th trnh khi nhng thiu st. Rt mong nhn c nhng kin ng gp qu bu t cc sinh vin v cc bn ng nghip.

Chng 1: Gii thiu v cc phng php lp trnh

CHNG 1 GII THIU V CC PHNG PHP LP TRNH


Ni dung ca chng ny tp trung trnh by cc phng php lp trnh: Phng php lp trnh tuyn tnh Phng php lp trnh hng cu trc Phng php lp trnh hng i tng.

1.1 LP TRNH TUYN TNH


c trng c bn ca lp trnh tuyn tnh l t duy theo li tun t. Chng trnh s c thc hin theo th t t u n cui, lnh ny k tip lnh kia cho n khi kt thc chng trnh.

c trng
Lp trnh tuyn tnh c hai c trng: n gin: chng trnh c tin hnh n gin theo li tun t, khng phc tp. n lung: ch c mt lung cng vic duy nht, v cc cng vic c thc hin tun t trong lung .

Tnh cht
u im: Do tnh n gin, lp trnh tuyn tnh c ng dng cho cc chng trnh n gin v c u im d hiu. Nhc im: Vi cc ng dng phc tp, ngi ta khng th dng lp trnh tuyn tnh gii quyt.

Ngy nay, lp trnh tuyn tnh ch tn ti trong phm vi cc modul nh nht ca cc phng php lp trnh khc. V d trong mt chng trnh con ca lp trnh cu trc, cc lnh cng c thc hin theo tun t t u n cui chng trnh con.

1.2 LP TRNH HNG CU TRC


1.2.1 c trng ca lp trnh hng cu trc
Trong lp trnh hng cu trc, chng trnh chnh c chia nh thnh cc chng trnh con v mi chng trnh con thc hin mt cng vic xc nh. Chng trnh chnh s gi n chng trnh con theo mt gii thut, hoc mt cu trc c xc nh trong chng trnh chnh. Cc ngn ng lp trnh cu trc ph bin l Pascal, C v C++. Ring C++ ngoi vic c c trng ca lp trnh cu trc do k tha t C, cn c c trng ca lp trnh hng i tng. Cho nn C++ cn c gi l ngn ng lp trnh na cu trc, na hng i tng.

c trng
c trng c bn nht ca lp trnh cu trc th hin mi quan h:

Chng 1: Gii thiu v cc phng php lp trnh

Chng trnh = Cu trc d liu + Gii thut Trong : Cu trc d liu l cch t chc d liu cho vic x l bi mt hay nhiu chng trnh no . Gii thut l mt quy trnh thc hin mt cng vic xc nh Mt cu trc d liu ch ph hp vi mt s hn ch cc gii thut. Nu thay i cu trc d liu th phi thay i gii thut cho ph hp. Mt gii thut thng phi i km vi mt cu trc d liu nht nh.

Trong chng trnh, gii thut c quan h ph thuc vo cu trc d liu:

Tnh cht
Mi chng trnh con c th c gi thc hin nhiu ln trong mt chng trnh chnh. Cc chng trnh con c th c gi n thc hin theo mt th t bt k, tu thuc vo gii thut trong chng trnh chnh m khng ph thuc vo th t khai bo ca cc chng trnh con. Cc ngn ng lp trnh cu trc cung cp mt s cu trc lnh iu khin chng trnh.

u im
Chng trnh sng sa, d hiu, d theo di. T duy gii thut r rng.

Nhc im
Lp trnh cu trc khng h tr mnh vic s dng li m ngun: Gii thut lun ph thuc cht ch vo cu trc d liu, do , khi thay i cu trc d liu, phi thay i gii thut, ngha l phi vit li chng trnh. Khng ph hp vi cc phn mm ln: t duy cu trc vi cc gii thut ch ph hp vi cc bi ton nh, nm trong phm vi mt modul ca chng trnh. Vi d n phn mm ln, lp trnh cu trc t ra khng hiu qu trong vic gii quyt mi quan h v m gia cc modul ca phn mm.

Vn
Vn c bn ca lp trnh cu trc l bng cch no phn chia chng trnh chnh thnh cc chng trnh con cho ph hp vi yu cu, chc nng v mc ch ca mi bi ton. Thng thng, phn r bi ton trong lp trnh cu trc, ngi ta s dng phng php thit k trn xung (top-down).

1.2.2 Phng php thit k trn xung (top-down)


Phng php thit k top-down tip cn bi ton theo hng t trn xung di, t tng qat n chi tit. Theo , mt bi ton c chia thnh cc bi ton con nh hn. Mi bi ton con li c chia nh tip, nu c th, thnh cc bi ton con nh hn na. Qu trnh ny cn c gi l qu trnh lm mn dn. Qu trnh ny s dng li khi cc bi ton con khng cn chia nh thm 6

Chng 1: Gii thiu v cc phng php lp trnh

na. Ngha l khi mi bi ton con u c th gii quyt bng mt chng trnh con vi mt gii thut n gin. V d, s dng phng php top-down gii quyt bi ton xy mt cn nh mi. Chng ta c th phn r bi ton theo cc bc nh sau: mc th nht, chia bi ton xy nh thnh cc bi ton nh hn nh lm mng, ct, trn, xy tng, lp mi. mc th hai, phn r cc cng vic mc th nht nh vic lm mng nh c th phn r tip thnh cc cng vic o mng, gia c nn, lm khung st, b tong; cng vic ct c phn r thnh mc th ba, phn r cc cng vic ca mc th hai nh vic o mng c th phn chia tip thnh cc cng vic nh o c, cm mc, chng dy, o v kim tra mng. Vic gia c nn c phn r thnh

Qu trnh phn r c th dng mc ny, bi v cc cng vic con thu c nh o c, cm mc, chng dy, o c th thc hin c ngay, khng cn chia nh thm na. Lu : Cng s dng phng php top-down vi cng mt bi ton, nhng c th cho ra nhiu kt qu khc nhau. Nguyn nhn l do s khc nhau trong tiu ch phn r mt bi ton thnh cc bi ton con.

V d, vn p dng phng php top-down gii quyt bi ton xy nh, nhng nu s dng mt cch khc phn chia bi ton, ta c th thu c kt qu khc bit so vi phng php ban u: mc th nht, chia bi ton xy nh thnh cc bi ton nh hn nh lm phn g, lm phn st, lm phn b tng v lm phn gch. mc th hai, phn r cc cng vic mc th nht l lm phn g c th chia thnh cc cng vic nh x g, gia cng g, to khung, lp vo nh. Vic lm st c th chia nh thnh

R rng, vi cch lm mn th ny, ta s thu c mt kt qu khc hn vi cch thc thc hin phn trn.

1.3 LP TRNH HNG I TNG


1.3.1 Lp trnh hng i tng
Trong lp trnh hng i tng: Ngi ta coi cc thc th trong chng trnh l cc i tng v sau tru tng ho i tng thnh lp i tng. D liu c t chc thnh cc thuc tnh ca lp. Ngui ta ngn chn vic thay i tu tin d liu trong chng trnh bng cc cch gii hn truy nhp nh ch cho php truy nhp d liu thng qua i tng, thng qua cc phng thc m i tng c cung cp Quan h gia cc i tng l quan h ngang hng hoc quan h k tha: Nu lp B k tha t lp A th A c gi l lp c s v B c gi l lp dn xut.

Chng 1: Gii thiu v cc phng php lp trnh

Ngn ng lp trnh hng i tng ph bin hin nay l Java, C++, C#...Mc d C++ cng c nhng c trng c bn ca lp trnh hng i tng nhng vn khng phi l ngn ng lp trnh thun hng i tng.

c trng
Lp trnh hng i tng c hai c trng c bn: ng gi d liu: d liu lun c t chc thnh cc thuc tnh ca lp i tng. Vic truy nhp n d liu phi thng qua cc phng thc ca i tng lp. S dng li m ngun: vic s dng li m ngun c th hin thng qua c ch k tha. C ch ny cho php cc lp i tng c th k tha t cc lp i tng khc. Khi , trong cc lp dn xut, c th s dng cc phng thc (m ngun) ca cc lp c s m khng cn phi nh ngha li.

u im
Lp trnh hng i tng c mt s u im ni bt: Khng cn nguy c d liu b thay i t do trong chng trnh. V d liu c ng gi vo cc i tng. Nu mun truy nhp vo d liu phi thng qua cc phng thc c cho php ca i tng. Khi thay i cu trc d liu ca mt i tng, khng cn thay i m ngun ca cc i tng khc, m ch cn thay i mt s thnh phn ca i tng dn xut. iu ny hn ch s nh hng xu ca vic thay i d liu n cc i tng khc trong chng trnh. C th s dng li m ngun, tit kim ti nguyn, chi ph thi gian. V nguyn tc k tha cho php cc lp dn xut s dng cc phng thc t lp c s nh nhng phng thc ca chnh n, m khng cn thit phi nh ngha li. Ph hp vi cc d n phn mm ln, phc tp.

1.3.2 Mt s khi nim c bn


Trong mc ny, chng ta s lm quen vi mt s khi nim c bn trong lp trnh hng i tng. Bao gm: Khi nim i tng (object) Khi nim ng gi d liu (encapsulation) Khi nim k tha (inheritance) Khi nim a hnh (polymorphism)

i tng (Object)
Trong lp trnh hng i tng, i tng c coi l n v c bn nh nht. Cc d diu v cch x l ch l thnh phn ca i tng m khng c coi l thc th. Mt i tng cha cc d liu ca ring n, ng thi c cc phng thc (hnh ng) thao tc trn cc d liu : i tng = d liu + phng thc

Chng 1: Gii thiu v cc phng php lp trnh

Lp (Class)
Khi c nhiu i tng ging nhau v mt d liu v phng thc, chng c nhm li vi nhau v gi chung l lp: Lp l s tru tng ho ca i tng i tng l mt th hin ca lp.

ng gi d liu (Encapsulation)
Cc d liu c ng gi vo trong i tng. Mi d liu c mt phm vi truy nhp ring. Khng th truy nhp n d liu mt cch t do nh lp trnh cu trc Mun truy nhp n cc d liu c bo v, phi thng qua cc i tng, ngha l phi s dng cc phng thc m i tng cung cp mi c th truy nhp n d liu ca i tng .

Tuy nhin, v C++ ch l ngn ng lp trnh na i tng, cho nn C++ vn cho php nh ngha cc bin d liu v cc hm t do, y l kt qu k tha t ngn ng C, mt ngn ng lp trnh thun cu trc.

K tha (Inheritance)
Tnh k tha ca lp trnh hng i tng cho php mt lp c th k tha t mt s lp tn ti. Khi , lp mi c th s dng d liu v phng thc ca cc lp c s nh l ca mnh. Ngoi ra, lp dn xut cn c th b sung thm mt s d liu v phng thc. u im ca k tha l khi thay i d liu ca mt lp, ch cn thay i cc phng thc trong phm vi lp c s m khng cn thay i trong cc lp dn xut.

a hnh (Polymorphsim)
a hnh l khi nim lun i km vi k tha. Do tnh k tha, mt lp c th s dng li cc phng thc ca lp khc. Tuy nhin, nu cn thit, lp dn xut cng c th nh ngha li mt s phng thc ca lp c s. l s np chng phng thc trong k tha. Nh s np chng phng thc ny, ta ch cn gi tn phng thc b np chng t i tng m khng cn quan tm l i tng ca lp no. Chng trnh s t ng kim tra xem i tng l thuc kiu lp c s hay thuc lp dn xut, sau s gi phng thc tng ng vi lp . l tnh a hnh.

1.3.3 Lp trnh hng i tng trong C++


V C++ l mt ngn ng lp trnh c m rng t mt ngn ng lp trnh cu trc C nn C++ c xem l ngn ng lp trnh na hng i tng, na hng cu trc.

Nhng c trng hng i tng ca C++


Cho php nh ngha lp i tng. Cho php ng gi d liu vo cc lp i tng. Cho php nh ngha phm vi truy nhp d liu ca lp bng cc t kho phm vi: public, protected, private.

Chng 1: Gii thiu v cc phng php lp trnh

Cho php k tha lp vi cc kiu k tha khc nhau tu vo t kho dn xut. Cho php lp dn xut s dng cc phng thc ca lp c s (trong phm vi quy nh). Cho php nh ngha chng phng thc trong lp dn xut.

Nhng hn ch hng i tng ca C++


Nhng hn ch ny l do C++ c pht trin t mt ngn ng lp trnh thun cu trc C. Cho php nh ngha v s dng cc bin d liu t do. Cho php nh ngha v s dng cc hm t do. Ngay c khi d liu c ng gi vo lp, d liu vn c th truy nhp trc tip nh d liu t do bi cc hm bn, lp bn (friend) trong C++.

TNG KT CHNG 1
Chng 1 trnh by tng quan v cc phng php lp trnh hin nay. Ni dung tp trung vo ba phng php lp trnh c lin quan trc tip n ngn ng lp trnh C++: Lp trnh tuyn tnh Lp trnh hng cu trc Lp trnh hng i tng.

C++ l ngn ng lp trnh c m rng t ngn ng lp trnh cu trc C. Do , C++ va c nhng c trng ca lp trnh cu trc, va c nhng c trng ca lp trnh hng i tng.

10

Chng 2: Con tr v mng

CHNG 2 CON TR V MNG


Ni dung ca chng ny tp trung trnh by cc vn c bn lin quan n cc thao tc trn kiu d liu con tr v mng trong C++: Khi nim con tr, cch khai bo v s dng con tr. Mi quan h gia con tr v mng Con tr hm Cp pht b nh cho con tr

2.1 KHI NIM CON TR


2.1.1 Khai bo con tr
Con tr l mt bin c bit cha a ch ca mt bin khc. Con tr c cng kiu d liu vi kiu d liu ca bin m n tr ti. C php khai bo mt con tr nh sau:
<Kiu d liu> *<Tn con tr>;

Trong : Kiu d liu: C th l cc kiu d liu c bn ca C++, hoc l kiu d liu c cu trc, hoc l kiu i tng do ngi dng t nh ngha. Tn con tr: Tun theo qui tc t tn bin ca C++: Ch c bt u bng mt k t (ch), hoc du gch di _. Bt u t k t th hai, c th c kiu k t s. Khng c du trng (space bar) trong tn bin. C phn bit ch hoa v ch thng. Khng gii hn di tn bin.

V d, khai bo mt bin con tr c kiu l int v tn l pointerInt, ta vit nh sau:


int *pointerInt;

Lu C th vit du con tr * ngay sau kiu d liu, ngha l hai cch khai bo sau l tng ng:
int *pointerInt; int* pointerInt;

Cc cch khai bo con tr nh sau l sai c php:


*int pointerInt; int pointerInt*; // Khai bo sai con tr // Khai bo sai con tr

2.1.2 S dng con tr


Con tr c s dng theo hai cch:

11

Chng 2: Con tr v mng

Dng con tr lu a ch ca bin thao tc Ly gi tr ca bin do con tr tr n thao tc

Dng con tr lu a ch ca bin Bn thn con tr s c tr vo a ch ca mt bin c cng kiu d liu vi n. C php ca php gn nh sau:
<Tn con tr> = &<tn bin>;

Lu V d:
int x, *px; px = &x;

Trong php ton ny, tn con tr khng c du *.

s cho con tr px c kiu int tr vo a ch ca bin x c kiu nguyn. Php ton &<Tn bin> s cho a ch ca bin tng ng. Ly gi tr ca bin do con tr tr n Php ly gi tr ca bin do con tr tr n c thc hin bng cch gi tn:
*<Tn con tr>;

Lu V d:
int x = 12, y, *px; px = &y; *px = x;

Trong php ton ny, phi c du con tr *. Nu khng c du con tr, s tr thnh php ly a ch ca bin do con tr tr ti.

Qu trnh din ra nh sau:


int x = 12, y, *px; px = &y; px = x; x = 12 x = 12 x = 12 y=0 y=0 y=x =12 px px px null

con tr px vn tr ti a ch bin y v gi tr ca bin y s l 12.

Php gn gia cc con tr


Cc con tr cng kiu c th gn cho nhau thng qua php gn v ly a ch con tr:
<Tn con tr 1> = <Tn con tr 2>;

Lu Trong php gn gia cc con tr, bt buc phi dng php ly a ch ca bin do con tr tr ti (khng c du * trong tn con tr) m khng c dng php ly gi tr ca bin do con tr tr ti.

12

Chng 2: Con tr v mng

Hai con tr phi cng kiu. Trong trng hp hai con tr khc kiu, phi s dng cc phng thc p kiu tng t nh trong php gn cc bin thng thng c kiu khc nhau.
int x = 12, *px, *py; px = &x; py = px;
int x = 12, *px, *py; px = &x; py = px; x = 12 x = 12 x = 12 px px px null py py py null null

V d:

con tr py cng tr vo a ch ca bin x nh con tr px. Khi *py cng c gi tr 12 ging nh *px v l gi tr ca bin x. Chng trnh 2.1 minh ho vic dng con tr gia cc bin ca mt chng trnh C++. Chng trnh 2.1
#include <stdio.h> #include <conio.h> void main(void){ int x = 12, *px, *py; cout << x = << x << endl; px = &x; // Con tr px tr ti a ch ca x

cout << px = &x, *px = << *px << endl; *px = *px + 20; // Ni dung ca px l 32

cout << *px = *px+20, x = << x << endl; py = px; *py += 15; } // Cho py tr ti ch m px tr: a ch ca x // Ni dung ca py l 47 << x << endl;

cout << py = px, *py +=15, x =

Trong chng trnh 2.1, ban u bin x c gi tr 12. Sau , con tr px tr vo a ch ca bin x nn con tr px cng c gi tr 12. Tip theo, ta tng gi tr ca con tr px thm 20, gi tr ca con tr px l 32. V px ang tr n a ch ca x nn x cng c gi tr l 32. Sau , ta cho con tr py tr n v tr m px ang tr ti (a ch ca bin x) nn py cng c gi tr 32. Cui cng, ta tng gi tr ca con tr py thm 15, py s c gi tr 37. V py cng ang tr n a ch ca x nn x cng c gi tr 37. Do , v d 2.1 s in ra kt qu nh sau:

13

Chng 2: Con tr v mng


x = 12 px = &x, *px = 12 *px = *px + 20, x = 32 py = px, *py += 15, x = 37

2.2 CON TR V MNG


2.2.1 Con tr v mng mt chiu Mng mt chiu
Trong C++, tn mt mng c coi l mt kiu con tr hng, c nh v ti mt vng nh xc nh v a ch ca tn mng trng vi a ch ca phn t u tin ca mng. V d khai bo:
int A[5];

th a ch ca mng A (cng vit l A) s trng vi a ch phn t u tin ca mng A (l &A[0]) ngha l:


A = &A[0];

Quan h gia con tr v mng


V tn ca mng c coi nh mt con tr hng, nn n c th c gn cho mt con tr c cng kiu. V d khai bo:
int A[5] = {5, 10, 15, 20, 25}; int *pa = A;
int A[5] = {5, 10, 15, 20, 25}; int *pa = A; A A pa A[0]=5 A[0]=5 A[1]=10 A[2]=15 A[3]=20 A[4]= 25 A[1]=10 A[2]=15 A[3]=20 A[4]= 25

th con tr pa s tr n mng A, tc l tr n a ch ca phn t A[0], cho nn hai khai bo sau l tng ng:
pa = A; pa = &A[0];

Vi khai bo ny, th a ch tr ti ca con tr pa l a ch ca phn t A[0] v gi tr ca con tr pa l gi tr ca phn t A[0], tc l *pa = 5;

Php ton trn con tr v mng


Khi mt con tr tr n mng, th cc php ton tng hay gim trn con tr s tng ng vi php dch chuyn trn mng. V d khai bo:
int A[5] = {5, 10, 15, 20, 25};

14

Chng 2: Con tr v mng


int *pa = &A[2];

th con tr pa s tr n a ch ca phn t A[2] v gi tr ca pa l: *pa = A[2] = 15. Khi , php ton:


pa = pa + 1;

s a con tr pa tr n a ch ca phn t tip theo ca mng A, l a ch ca A[3]. Sau , php ton:


pa = pa 2;

s a con tr pa tr n a ch ca phn t A[1].


int A[5] = {5, 10, 15, 20, 25}; int *pa = &A[2]; A A pa A pa A pa A[0]=5 A[1]=10 A[2]=15 A[3]=20 A[4]= 25 A[0]=5 A[1]=10 A[2]=15 A[3]=20 A[4]= 25 A[0]=5 A[0]=5 A[1]=10 A[2]=15 A[3]=20 A[4]= 25 A[1]=10 A[2]=15 A[3]=20 A[4]= 25

pa = pa + 1;

pa = pa - 2;

Lu : Hai php ton pa++ v *pa++ c tc dng hon ton khc nhau trn mng, pa++ l thao tc trn con tr, tc l trn b nh, n s a con tr pa tr n a ch ca phn t tip theo ca mng. *pa++ l php ton trn gi tr, n tng gi tr hin ti ca phn t mng ln mt n v. V d:
int A[5] = {5, 10, 15, 20, 25}; int *pa = &A[2];

th pa++ l tng ng vi pa = &A[3] v *pa = 20. nhng *pa++ li tng ng vi pa = &A[2] v *pa = 15+1 = 16, A[2] = 16.

15

Chng 2: Con tr v mng

int A[5] = {5, 10, 15, 20, 25}; int *pa = &A[2];

A A pa A pa A pa

A[0]=5 A[0]=5

A[1]=10 A[2]=15 A[3]=20 A[4]= 25 A[1]=10 A[2]=15 A[3]=20 A[4]= 25

pa ++;

A[0]=5

A[1]=10 A[2]=15 A[3]=20 A[4]= 25

Nhng *pa ++;

A[0]=5

A[1]=10 A[2]=16 A[3]=20 A[4]= 25

Trong trng hp:


int A[5] = {5, 10, 15, 20, 25}; int *pa = &A[4];

th php ton pa++ s a con tr pa tr n mt a ch khng xc nh. L do l A[4] l phn t cui ca mng A, nn pa++ s tr n a ch ngay sau a ch ca A[4], a ch ny nm ngoi vng ch s ca mng A nn khng xc nh. Tng t vi trng hp pa=&A[0], php ton pa-- cng a pa tr n mt a ch khng xc nh.

int A[5] = {5, 10, 15, 20, 25}; int *pa = &A[2];

A A pa A pa A pa

A[0]=5 A[0]=5

A[1]=10 A[2]=15 A[3]=20 A[4]= 25 A[1]=10 A[2]=15 A[3]=20 A[4]= 25

pa ++;

A[0]=5

A[1]=10 A[2]=15 A[3]=20 A[4]= 25

null

pa = &A[0];

A[0]=5

A[1]=10 A[2]=15 A[3]=20 A[4]= 25

pa --;

null

A pa

A[0]=5

A[1]=10 A[2]=15 A[3]=20 A[4]= 25

V mng A l con tr hng, cho nn khng th thc hin cc php ton trn A m ch c th thc hin trn cc con tr tr n A: cc php ton pa++ hoc pa--l hp l, nhng cc php ton A++ hoc A--l khng hp l.

Chng trnh 2.2a minh ho vic ci t mt th tc sp xp cc phn t ca mt mng theo cch thng thng.

16

Chng 2: Con tr v mng

Chng trnh 2.2a


void SortArray(int A[], int n){ int temp; for(int i=0; i<n-1; i++) for(int j=i+1; j<n; j++) if(A[i] > A[j]){ temp = A[i]; A[i] = A[j]; A[j] = temp; } }

Chng trnh 2.2b ci t mt th tc tng t bng con tr. Hai th tc ny c chc nng hon ton ging nhau. Chng trnh 2.2b
void SortArray(int *A, int n){ int temp; for(int i=0; i<n-1; i++) for(int j=i+1; j<n; j++) if(*(A+i) > *(A+j)){ temp = *(A+i); *(A+i) = *(A+j); *(A+j) = temp; } }

Trong chng trnh 2.2b, thay v dng mt mng, ta dng mt con tr tr n mng cn sp xp. Khi , ta c th dng cc thao tc trn con tr thay v cc thao tc trn cc phn t mng.

2.2.2 Con tr v mng nhiu chiu Con tr v mng nhiu chiu


Mt cu hi t ra l nu mt ma trn mt chiu th tng ng vi mt con tr, vy mt mng nhiu chiu th tng ng vi con tr nh th no? Xt v d:
int A[3][3] = { {5, 10, 15}, {20, 25, 30}, {35, 40, 45} };

17

Chng 2: Con tr v mng

Khi , a ch ca ma trn A chnh l a ch ca hng u tin ca ma trn A, v cng l a ch ca phn t u tin ca hng u tin ca ma trn A: a ch ca ma trn A: a ch ca hng th nht: a ch ca hng th i: a ch phn t Gi tr phn t
int A[3][3]; A = A[0] = *(A+0) = &A[0][0]; A[1] = *(A+1) = &A[1][0]; A[i] = *(A+i) = &A[i][0]; &A[i][j] = (*(A+i)) + j; A[i][j] = *((*(A+i)) + j);

Nh vy, mt mng hai chiu c th thay th bng mt mng mt chiu cc con tr cng kiu: c th thay th bng:
int (*A)[3];

Con tr tr ti con tr
V mt mng hai chiu int A[3][3] c th thay th bng mt mng cc con tr int (*A)[3]. Hn na, mt mng int A[3] li c th thay th bng mt con tr int *A. Do vy, mt mng hai chiu c th thay th bng mt mng cc con tr, hoc mt con tr tr n con tr. Ngha l cc cch vit sau l tng ng:
int A[3][3]; int (*A)[3]; int **A;

2.3 CON TR HM
Mc d hm khng phi l mt bin c th nn khng c mt a ch xc nh. Nhng trong khi chy, mi mt hm trong C++ cng c mt vng nh xc nh, do vy, C++ cho php dng con tr tr n hm. Con tr hm c dng truyn tham s c dng hm.

Khai bo con tr hm
Con tr hm c khai bo tng t nh khai bo nguyn mu hm thng thng trong C++, ngoi tr vic c thm k hiu con tr * trc tn hm. C php khai bo con tr hm nh sau:
<Kiu d liu tr v> (*<Tn hm>)([<Cc tham s>]);

Trong : Kiu d liu tr v: l cc kiu d liu thng thng ca C++ hoc kiu do ngi dng t nh ngha. Tn hm: tn do ngi dng t nh ngha, tun th theo quy tc t tn bin trong C++. Cc tham s: c th c hoc khng (phn trong du [] l tu chn). Nu c nhiu tham s, mi tham s c phn cch nhau bi du phy.
int (*Calcul)(int a, int b);

V d khai bo: l khai bo mt con tr hm, tn l Calcul, c kiu int v c hai tham s cng l kiu int. Lu :

18

Chng 2: Con tr v mng

Du () bao bc tn hm l cn thit ch ra rng ta ang khai bo mt con tr hm. Nu khng c du ngoc n ny, trnh bin dch s hiu rng ta ang khai bo mt hm thng thng v c gi tr tr v l mt con tr. V d, hai khai bo sau l khc nhau hon ton:
// Khai bo mt con tr hm int (*Calcul)(int a, int b); // Khai bo mt hm tr v kiu con tr int *Calcul(int a, int b);

S dng con tr hm
Con tr hm c dng khi cn gi mt hm nh l tham s ca mt hm khc. Khi , mt hm c gi phi c khun mu ging vi con tr hm c khai bo. V d, vi khai bo:
int (*Calcul)(int a, int b);

th c th gi cc hm c hai tham s kiu int v tr v cng kiu int nh sau:


int add(int a, int b); int sub(int a, int b);

nhng khng c gi cc hm khc kiu tham s hoc kiu tr v nh sau:


int add(float a, int b); int add(int a); char* sub(char* a, char* b);

Chng trnh 2.3 minh ho vic khai bo v s dng con tr hm. Chng trnh 2.3
#include <ctype.h> #include <string> // Hm c s dng con tr hm nh tham s void Display(char[] str, int (*Xtype)(int c)){ int index = 0; while(str[index] != \0){ cout << (*Xtype)(str[index]); // S dng con tr hm index ++; } return; } // Hm main, dng li gi hm n con tr hm void main(){ char input[500]; cout << Enter the string: ; cin >> input;

19

Chng 2: Con tr v mng

char reply; cout << Display the string in uppercase or lowercase (u,l): ; cin >> reply; if(reply == l) else return; } // Hin th theo dng lowercase // Hin th theo dng uppercase Display(str, toupper); Display(str, tolower);

Chng trnh 2.3 khai bo hm Display() c s dng con tr hm c khun mu


int (*Xtype)(int c);

Trong hm main, con tr hm ny c gi bi hai th hin l cc hm tolower() v hm toupper(). Hai hm ny c khai bo trong th vin ctype.h vi mu nh sau:
int tolower(int c); int toupper(int c);

Hai khun mu ny ph hp vi con tr hm Xtype trong hm Display() nn li gi hm Display() trong hm main l hp l.

2.4 CP PHT B NH NG
Xt hai trng hp sau y: Trng hp 1, khai bo mt con tr v gn gi tr cho n:
int *pa = 12;

Trng hp 2, khai bo con tr n phn t cui cng ca mng ri tng thm mt n v cho n:
int A[5] = {5, 10, 15, 20, 25}; int *pa = &A[4]; pa++;

Trong c hai trng hp, ta u khng bit thc s con tr pa ang tr n a ch no trong b nh: trng hp 1 ch ra rng con tr pa ang tr ti mt a ch khng xc nh, nhng li cha gi tr l 12 do c gn vo. Trng hp 2, con tr pa tr n a ch ngay sau a ch phn t cui cng ca mng A, cng l mt a ch khng xc nh. Cc a ch khng xc nh ny l cc a ch nm vng nh t do cn tha ca b nh. Vng nh ny c th b chim dng bi bt k mt chng trnh no ang chy. Do , rt c th cc chng trnh khc s chim mt cc a ch m con tr pa ang tr ti. Khi , nu cc chng trnh thay i gi tr ca a ch , gi tr pa cng b thay i theo m ta khng th kim sot c. trnh cc ri ro c th gp phi, C++ yu cu phi cp pht b nh mt cch tng minh cho con tr trc khi s dng chng.

20

Chng 2: Con tr v mng

2.4.1 Cp pht b nh ng cho bin Cp pht b nh ng


Thao tc cp pht b nh cho con tr thc cht l gn cho con tr mt a ch xc nh v a a ch vo vng b chim dng, cc chng trnh khc khng th s dng a ch . C php cp pht b nh cho con tr nh sau:
<tn con tr> = new <kiu con tr>;

V d, khai bo:
int *pa; pa = new int;

s cp pht b nh hp l cho con tr pa. Lu : Ta c th va cp pht b nh, va khi to gi tr cho con tr theo c php sau:
int *pa; pa = new int(12);

s cp pht cho con tr pa mt a ch xc nh, ng thi gn gi tr ca con tr *pa = 12.

Gii phng b nh ng
a ch ca con tr sau khi c cp pht bi thao tc new s tr thnh vng nh b chim dng, cc chng trnh khc khng th s dng vng nh ngay c khi ta khng dng con tr na. tit kim b nh, ta phi hu b vng nh ca con tr ngay sau khi khng dng n con tr na. C php hu b vng nh ca con tr nh sau:
delete <tn con tr>;

V d:
int *pa = new int(12); delete pa; // Khai bo con tr pa, cp pht b nh // v gn gi tr ban u cho pa l 12. // Gii phng vng nh va cp cho pa.

Lu : Mt con tr, sau khi b gii phng a ch, vn c th c cp pht mt vng nh mi hoc tr n mt a ch mi:
int *pa = new int(12); delete pa; pa = A; // Khai bo con tr pa, cp pht b nh // v gn gi tr ban u cho pa l 12. // Gii phng vng nh va cp cho pa. // Cho pa tr n a ch ca mng A

int A[5] = {5, 10, 15, 20, 25};

Nu c nhiu con tr cng tr vo mt a ch, th ch cn gii phng b nh ca mt con tr, tt c cc con tr cn li cng b gii phng b nh:
int *pa = new int(12); int *pb = pa; *pb += 5; delete pa; // *pa = 12 // pb tr n cng a ch pa. // *pa = *pb = 17 // Gii phng c pa ln pb

21

Chng 2: Con tr v mng

Mt con tr sau khi cp pht b nh ng bng thao tc new, cn phi phng b nh trc khi tr n mt a ch mi hoc cp pht b nh mi:
int *pa = new int(12); *pa = new int(15); // pa c cp b nh v *pa = 12 // pa tr n a ch khc v *pa = 15. // a ch c ca pa vn b coi l bn

2.4.2 Cp pht b nh cho mng ng mt chiu Cp pht b nh cho mng ng mt chiu


Mng mt chiu c coi l tng ng vi mt con tr cng kiu. Tuy nhin, c php cp pht b nh cho mng ng mt chiu l khc vi c php cp pht b nh cho con tr thng thng:
<Tn con tr> = new <Kiu con tr>[< di mng>];

Trong : V d:
int *A = new int[5];

Tn con tr: tn do ngi dng t, tun th theo quy tc t tn bin ca C++. Kiu con tr: Kiu d liu c bn ca C++ hoc l kiu do ngi dng t nh ngha. di mng: s lng cc phn t cn cp pht b nh ca mng.

s khai bo mt mng A c 5 phn t kiu int c cp pht b nh ng. Lu : Khi cp pht b nh cho con tr c khi to thng thng, ta dng du (), khi cp pht b nh cho mng, ta dng du []. Hai lnh cp pht sau l hon ton khc nhau:
// Cp pht b nh v khi to cho mt con tr int int *A = new int(5); // Cp pht b nh cho mt mng 5 phn t kiu int int *A = new int[5];

Gii phng b nh ca mng ng mt chiu


gii phng vng nh c cp pht cho mt mng ng, ta dng c php sau:
delete [] <tn con tr>;

V d:
// Cp pht b nh cho mt mng c 5 phn t kiu int int *A = new int[5]; // Gii phng vng nh do mng A ang chim gi. delete [] A;

Chng trnh 2.4 minh ho hai th tc khi to v gii phng mt mng ng mt chiu. Chng trnh 2.4
void InitArray(int *A, int length){ A = new int[length]; for(int i=0; i<length; i++)

22

Chng 2: Con tr v mng


A[i] = 0; return; } void DeleteArray(int *A){ delete [] A; return; }

2.4.3 Cp pht b nh cho mng ng nhiu chiu Cp pht b nh cho mng ng nhiu chiu
Mt mng hai chiu l mt con tr n mt con tr. Do vy, ta phi cp pht b nh theo tng chiu theo c php cp pht b nh cho mng ng mt chiu. V d:
int **A; const int length = 10; A = new int*[length]; // Cp pht b nh cho s dng ca ma trn A for(int i=0; i<length; i++) // Cp pht b nh cho cc phn t ca mi dng A[i] = new int[length];

s cp pht b nh cho mt mng ng hai chiu, tng ng vi mt ma trn c kch thc 10*10. Lu : Trong lnh cp pht A = new int*[length], cn phi c du * ch ra rng cn cp pht b nh cho mt mng cc phn t c kiu l con tr int (int*), khc vi kiu int bnh thng.

Gii phng b nh ca mng ng nhiu chiu


Ngc li vi khi cp pht, ta phi gii phng ln lt b nh cho con tr tng ng vi ct v hng ca mng ng. V d:
int **A; ; for(int i=0; i<length; i++) delete [] A[i]; delete [] A; // Gii phng b nh cho mi dng // Gii phng b nh cho mng cc dng // cp pht b nh

s gii phng b nh cho mt mng ng hai chiu. Chng trnh 2.5 minh ho vic dng mng ng hai chiu tnh tng ca hai ma trn.

23

Chng 2: Con tr v mng

Chng trnh 2.5


#include<stdio.h> #include<conio.h> /* Khai bo nguyn mu hm */ void InitArray(int **A, int row, int colum); void AddArray(int **A, int **B, int row, int colum); void DisplayArray(int **A, int row, int colum); void DeleteArray(int **A, int row); void InitArray(int **A, int row, int colum){ A = new int*[row]; for(int i=0; i<row; i++){ A[i] = new int[colum]; for(int j=0; j<colum; j++){ cout << Phan tu [ << i << , << j << ] = ; cin >> A[i][j]; } return; } void AddArray(int **A, int **B, int row, int colum){ for(int i=0; i<row; i++) for(int j=0; j<colum; j++) A[i][j] += B[i][j]; return; } void DisplayArray(int **A, int row, int colum){ for(int i=0; i<row; i++){ for(int j=0; j<colum; j++) cout << A[i][j] << ; cout << endl; // Xung dng return; } void DeleteArray(int **A, int row){ for(int i=0; i<row; i++) delete [] A[i]; delete [] A; return; }

24

Chng 2: Con tr v mng


void main(){ clrscr(); int **A, **B, row, colum; cout << So dong: ; cin >> row; cout << So cot: ; cin >> colum; /* Khi to cc ma trn */ cout << Khoi tao mang A: << endl; InitArray(A, row, colum); cout << Khoi tao mang B: << endl; InitArray(B, row, colum); // Cng hai ma trn AddArray(A, B, row, colum); // Hin th ma trn kt qu cout << Tong hai mang A va mang B: << endl; DisplayArray(A, row, colum); // Gii phng b nh DeleteArray(A, row); DeleteArray(B, row); return; }

TNG KT CHNG 2
Ni dung chng 2 trnh by cc vn lin quan n vic khai bo v s dng con tr v mng trong ngn ng C++: Con tr l mt kiu bin c bit, n tr n a ch ca mt bin khc. C hai cch truy nhp n con tr l truy nhp n a ch hoc truy nhp n gi tr ca a ch m con tr tr n. Con tr c th tham gia vo cc php ton nh cc bin thng thng bng php ly gi tr. Mt con tr c s tng ng vi mt mng mt chiu c cng kiu. Mt ma trn hai chiu c th thay th bng mt mng cc con tr hoc mt con tr tr n con tr. Mt con tr c th tr n mt hm, khi , n c dng gi mt hm nh l mt tham s cho hm khc.

25

Chng 2: Con tr v mng

Mt con tr cn phi tr vo mt a ch xc nh hoc phi c cp pht b nh qua php ton new v gii phng b nh sau khi dng bng thao tc delete.

CU HI V BI TP CHNG 2
1. Trong cc khai bo con tr sau, nhng khai bo no l ng: a. int A*; b. *int A; c. int* A, B; d. int* A, *B; e. int *A, *B; 2. Vi khai bo:
int a = 12; int *pa;

Cc php gn no sau y l hp l: a. pa = &a; b. pa = a; c. *pa = &a; d. *pa = a; 3. Vi khai bo:


int A[5] = {10, 20, 30, 40, 50}; int *pa = A+2;

Khi , *pa = ? a. 10 b. 20 c. 30 d. 40 e. 50 4. Vi on chng trnh:


int A[5] = {10, 20, 30, 40, 50}; int *pa = A; *pa += 2;

Khi , *pa = ? a. 10 b. 12 c. 30 d. 32 5. Vi on chng trnh:


int A[5] = {10, 20, 30, 40, 50}; int *pa = A;

26

Chng 2: Con tr v mng


pa += 2;

Khi , *pa = ? a. 10 b. 12 c. 30 d. 32 6. Vi on chng trnh:


int A[5] = {10, 20, 30, 40, 50}; int *pa = A; pa += 2;

Khi , pa = ? a. &A[0] b. A[2] c. &A[2] d. Khng xc nh 7. Vi on chng trnh:


int A[5] = {10, 20, 30, 40, 50}; int *pa = A; pa -= 2;

Khi , pa = ? a. &A[0] b. &A[2] c. &A[4] d. Khng xc nh 8. Vi on chng trnh:


int A[3][3] = { {10, 20, 30}, {40, 50, 60}, {70, 80, 90} }; int *pa;

Khi , c c kt qu *pa = 50, cc lnh no sau y l ng? a. pa = A + 4; b. pa = (*(A+1)) + 1; c. pa = &A[1][1]; d. pa = *((*(A+1)) + 1); 9. Gi s ta khai bo mt hm c s dng con tr hm vi khun mu nh sau:
int Calcul(int a, int b, int (*Xcalcul)(int x, int y)){}

V ta c ci t mt s hm nh sau:

27

Chng 2: Con tr v mng


int add(int a, int b); void cal(int a, int b); int squere(int a);

Khi , li gi hm no sau y l ng: a. Calcul(5, 10, add); b. Calcul(5, 10, add(2, 3)); c. Calcul(5, 10, cal); d. Calcul(5, 10, squere); 10. Ta mun cp pht b nh cho mt con tr kiu int v khi u gi tr cho n l 20. Lnh no sau y l ng: a. int *pa = 20; b. int *pa = new int{20}; c. int *pa = new int(20); d. int *pa = new int[20]; 11. Ta mun cp pht b nh cho mt mng ng kiu int c chiu di l 20. Lnh no sau y l ng: a. int *pa = 20; b. int *pa = new int{20}; c. int *pa = new int(20); d. int *pa = new int[20]; 12. Xt on chng trnh sau:
int A[5] = {10, 20, 30, 40, 50}; int *pa = A; pa = new int(2);

Khi , *pa = ? a. 10 b. 30 c. 2 d. Khng xc nh 13. Xt on chng trnh sau:


1> 2> 3> 4> int A[5] = {10, 20, 30, 40, 50}; int *pa = A; pa += 15; delete pa;

on chng trnh trn c li dng no? a. 1 b. 2 c. 3 d. 4

28

Chng 2: Con tr v mng

14. Vit chng trnh thc hin cc php ton cng, tr, nhn, chia trn a thc. Cc a thc c biu din bng mng ng mt chiu. Bc ca a thc v cc h s tng ng c nhp t bn phm. 15. Vit chng trnh thc hin cc php ton cng, tr, nhn hai ma trn kch thc m*n. Cc ma trn c biu din bng mng ng hai chiu. Gi tr kch c ma trn (m, n) v gi tr cc phn t ca ma trn c nhp t bn phm.

29

Chng 3: Kiu d liu cu trc

CHNG 3 KIU D LIU CU TRC


Ni dung chng ny tp trung trnh by cc vn lin quan n kiu d liu c cu trc trong C++: nh ngha mt cu trc S dng mt cu trc bng cc php ton c bn trn cu trc Con tr cu trc, khai bo v s dng con tr cu trc Mng cc cu trc, khai bo v s dng mng cc cu trc Mt s kiu d liu tru tng khc nh ngn xp, hng i, danh sch lin kt.

3.1 NH NGHA CU TRC


Kiu d liu c cu trc c dng khi ta cn nhm mt s bin d liu lun i km vi nhau. Khi , vic x l trn mt nhm cc bin c thc hin nh trn cc bin c bn thng thng.

3.1.1 Khai bo cu trc


Trong C++, mt cu trc do ngi dng t nh ngha c khai bo thng qua t kho struct:
struct <Tn cu trc>{ <Kiu d liu 1> <Tn thuc tnh 1>; <Kiu d liu 2> <Tn thuc tnh 2>; <Kiu d liu n> <Tn thuc tnh n>; };

Trong : struct: l tn t kho khai bo mt cu trc, bt buc phi c khi nh ngha cu trc. Tn cu trc: l tn do ngi dng t nh ngha, tun th theo quy tc t tn bin trong C++. Tn ny s tr thnh tn ca kiu d liu c cu trc tng ng. Thuc tnh: mi thuc tnh ca cu trc c khai bo nh khai bo mt bin thuc kiu d liu thng thng, gm c kiu d liu v tn bin tng ng. Mi khai bo thuc tnh phi kt thc bng du chm phy ; nh mt cu lnh C++ thng thng.

V d, qun l nhn vin ca mt cng ty, khi x l thng tin v mi nhn vin, ta lun phi x l cc thng tin lin quan nh: Tn Tui Chc v Lng

Do , ta s dng cu trc lu gi thng tin v mi nhn vin bng cch nh ngha mt cu trc c tn l Employeee vi cc thuc tnh nh sau:

30

Chng 3: Kiu d liu cu trc


struct Employeee{ char name[20]; int age; char role[20]; float salary; }; // Tn nhn vin // Tui nhn vin // Chc v ca nhn vin // Lng ca nhn vin

Lu : Cu trc ch cn nh ngha mt ln trong chng trnh v c th c khai bo bin cu trc nhiu ln. Khi cu trc c nh ngha, vic khai bo bin ln khc trong chng trnh c thc hin nh khai bo bin thng thng:
<Tn cu trc> <tn bin 1>, <tn bin 2>;

V d, sau khi nh ngha cu trc Employeee, mun c bin myEmployeee, ta khai bo nh sau:
Employee myEmployeee;

3.1.2 Cu trc lng nhau


Cc cu trc c th c nh ngha lng nhau khi mt thuc tnh ca mt cu trc cng cn c kiu l mt cu trc khc. Khi , vic nh ngha cu trc cha c thc hin nh mt cu trc bnh thng, vi khai bo v thuc tnh l mt cu trc con:
struct <Tn cu trc cha>{ <Kiu d liu 1> <Tn thuc tnh 1>; // C kiu cu trc <Kiu cu trc con> <Tn thuc tnh 2>; <Kiu d liu n> <Tn thuc tnh n>; };

V d, vi kiu cu trc Employee, ta khng quan tm n tui nhn vin na, m quan tm n ngy sinh ca nhn vin. V ngy sinh cn c cc thng tin lun i vi nhau l ngy sinh, thng sinh, nm sinh. Do , ta nh ngha mt kiu cu trc con cho kiu ngy sinh:
struct Date{ int day; int month; int year; };

khi , cu trc Employee tr thnh:


struct Employee{ char name[20]; Date birthDay; char role[20]; float salary; }; // Tn nhn vin // Ngy sinh ca nhn vin // Chc v ca nhn vin // Lng ca nhn vin

31

Chng 3: Kiu d liu cu trc

Lu : Trong nh ngha cc cu trc lng nhau, cu trc con phi c nh ngha trc cu trc cha m bo cc kiu d liu ca cc thuc tnh ca cu trc cha l tng minh ti thi im n c nh ngha.

3.1.3 nh ngha cu trc vi t kho typedef


trnh phi dng t kho struct mi khi khai bo bin cu trc, ta c th dng t kha typedef khi nh ngha cu trc:
typedef struct { <Kiu d liu 1> <Tn thuc tnh 1>; <Kiu d liu 2> <Tn thuc tnh 2>; <Kiu d liu n> <Tn thuc tnh n>; } <Tn kiu d liu cu trc>;

Trong : Tn kiu d liu cu trc: l tn kiu d liu ca cu trc va nh ngha. Tn ny s c dng nh mt kiu d liu thng thng khi khai bo bin cu trc.

V d, mun c kiu d liu c cu trc nhn vin, c tn l Employee, ta dng t kho typedef nh ngha cu trc nh sau:
typedef struct { char name[20]; int age; char role[20]; float salary; } Employee; // Tn nhn vin // Tui nhn vin // Chc v ca nhn vin // Lng ca nhn vin

Khi , mun c hai bin l myEmployee1 v myEmployee2 c kiu cu trc Employee, ta ch cn khai bo nh sau m khng cn t kho struct:
Employee myEmployee1, myEmployee2;

Trong v d khai bo lng cu trc Employee, dng t kho typedef cho kiu Date:
typedef struct { int day; int month; int year; } Date;

cu trc Employee tr thnh:


typedef struct { char name[20]; Date birthDay; char role[20]; float salary; } Employee; // Tn nhn vin // Ngy sinh ca nhn vin // Chc v ca nhn vin // Lng ca nhn vin

32

Chng 3: Kiu d liu cu trc

Lu : Khi khng dng t kho typedef, tn cu trc (nm sau t kho struct) c dng khai bo bin. Trong khi , khi c t kho typedef, tn kiu d liu cu trc (dng cui cng trong nh ngha) mi c dng khai bo bin. Khi dng t kho typedef th khng th khai bo bin ng thi vi nh ngha cu trc.

3.2 THAO TC TRN CU TRC


Cc thao tc trn cu trc bao gm: Khai bo v khi to gi tr ban u cho bin cu trc Truy nhp n cc thuc tnh ca cu trc

3.2.1 Khi to gi tr ban u cho cu trc Khi to bin c cu trc n


Bin cu trc c khai bo theo cc cch sau:
<Tn kiu d liu cu trc> <tn bin>;

Ngoi ra, ta c th khi to cc gi tr cho cc thuc tnh ca cu trc ngay khi khai bo bng cc c php sau:
<Tn kiu d liu cu trc> <tn bin> = { <gi tr thuc tnh 1>, <gi tr thuc tnh 2>, <gi tr thuc tnh n> };

Trong : Gi tr thuc tnh: l gi tr khi u cho mi thuc tnh, c kiu ph hp vi kiu d liu ca thuc tnh. Mi gi tr ca thuc tnh c phn cch bng du phy ,.
typedef struct { char name[20]; int age; char role[20]; float salary; } Employee; // Tn nhn vin // Tui nhn vin // Chc v ca nhn vin // Lng ca nhn vin

V d, vi nh ngha cu trc:

th c th khai bo v khi to cho mt bin nh sau:


Employee myEmployee1 = { Nguyen Van A, 27, Nhan vien, 300f

33

Chng 3: Kiu d liu cu trc


};

Khi to cc bin c cu trc lng nhau


Trong trng hp cc cu trc lng nhau, php khi to cng thc hin nh thng thng vi php khi to cho tt c cc cu trc con. V d vi khai bo cu trc nh sau:
typedef struct { int day; int month; int year; } Date;

v:
typedef struct { char name[20]; Date birthDay; char role[20]; float salary; } Employee; // Tn nhn vin // Ngy sinh ca nhn vin // Chc v ca nhn vin // Lng ca nhn vin

Th khai bo v khi to mt bin c kiu Employee c th thc hin nh sau:


Employee myEmployee1 = { Nguyen Van A, {15, 05, 1980}, Nhan vien, 300f }; // Khi to cu trc con

3.2.2 Truy nhp n thuc tnh ca cu trc


Vic truy nhp n thuc tnh ca cu trc c thc hin bng c php:
<Tn bin cu trc>.<tn thuc tnh>

V d, vi mt bin cu trc kiu Employee n:


Employee myEmployee1 = { Nguyen Van A, 27, Nhan vien, 300f };

ta c th truy xut nh sau:


cout << myEmployee1.name; myEmployee1.age += 1; // hin th ra Nguyen Van A // Tng s tui ln 1

i vi kiu cu trc lng nhau, php truy nhp n thuc tnh c thc hin ln lt t cu trc cha n cu trc con. V d, vi mt bin cu trc kiu Employee lng nhau: 34

Chng 3: Kiu d liu cu trc

Employee myEmployee1 = { Nguyen Van A, {15, 05, 1980}, Nhan vien, 300f };

ta c th truy xut nh sau:


cout << myEmployee1.name; myEmployee1.birthDay.day = 16; myEmployee1.birthDay.month = 07; // hin th ra Nguyen Van A // Sa li ngy sinh thnh 16 // Sa li thng sinh thnh 07

Chng trnh 3.1a minh ho vic to lp v s dng cu trc Employee n, khng dng t kho typedef. Chng trnh 3.1a
#include<stdio.h> #include<conio.h> #include<string.h> struct Employee{ char name[20]; int age; char role[20]; float salary; }; /* Khai bo khun mu hm */ void Display(Employee myEmployee); void Display(Employee myEmployee){ cout << Name: << myEmployee.name << endl; cout << Age: << myEmployee.age << endl; cout << Role: << myEmployee.role << endl; cout << Salary: << myEmployee.salary << endl; return; } void main(){ clrscr(); // Hin th gi tr mc nh Employee myEmployee = // Tn nhn vin // Tui nhn vin // Chc v ca nhn vin // Lng ca nhn vin

35

Chng 3: Kiu d liu cu trc


{Nguyen Van A, 27, Nhan vien, 300f}; cout << Thng tin mc nh: << endl; Display(myEmployee); // Thay i gi tr cho cc thuc tnh cout << Name: ; cin >> myEmployee.name; cout << Age: ; cin >> myEmployee.age; cout << Role: ; cin >> myEmployee.role; cout << Salary: ; cin >> myEmployee.salary; cout << Thng tin sau khi thay i: << endl; Display(myEmployee); return; }

Chng trnh 3.1b minh ho vic to lp v s dng cu trc Employee lng nhau, c dng t kho typedef. Chng trnh 3.1b
#include<stdio.h> #include<conio.h> #include<string.h> typedef struct { int day; int month; int year; } Date; typedef struct { char name[20]; Date birthDay; char role[20]; float salary; } Employee; /* Khai bo khun mu hm */ void Display(Employee myEmployee); // Tn nhn vin // Ngy sinh ca nhn vin // Chc v ca nhn vin // Lng ca nhn vin

36

Chng 3: Kiu d liu cu trc

void Display(Employee myEmployee){ cout << Name: << myEmployee.name << endl; cout << Birth day: << myEmployee.birthDay.day << / << myEmployee.birthDay.month << / << myEmployee.birthDay.year << endl; cout << Role: << myEmployee.role << endl; cout << Salary: << myEmployee.salary << endl; return; } void main(){ clrscr(); // Hin th gi tr mc nh Employee myEmployee = {Nguyen Van A, {15, 5, 1980}, Nhan vien, 300f}; cout << Thng tin mc nh: << endl; Display(myEmployee); // Thay i gi tr cho cc thuc tnh cout << Name: ; cin >> myEmployee.name; cout << Day of birth: ; cin >> myEmployee.birthDay.day; cout << Month of birth: ; cin >> myEmployee.birthDay.month; cout << Year of birth: ; cin >> myEmployee.birthDay.year; cout << Role: ; cin >> myEmployee.role; cout << Salary: ; cin >> myEmployee.salary; cout << Thng tin sau khi thay i: << endl; Display(myEmployee); return; }

37

Chng 3: Kiu d liu cu trc

3.3 CON TR CU TRC V MNG CU TRC


3.3.1 Con tr cu trc
Con tr cu trc l mt con tr tr n a ch ca mt bin c kiu cu trc. Cch khai bo v s dng con tr cu trc c thc hin nh con tr thng thng.

Khai bo con tr cu trc


Con tr cu trc c khai bo theo c php:
<Tn kiu cu trc> *<Tn bin>;

V d, vi kiu khai bo cu trc:


typedef struct { int day; int month; int year; } Date;

v:
typedef struct { char name[20]; Date birthDay; char role[20]; float salary; } Employee; // Tn nhn vin // Ngy sinh ca nhn vin // Chc v ca nhn vin // Lng ca nhn vin

th ta c th khai bo mt con tr cu trc nh sau:


Employee *ptrEmployee;

Lu : Cng nh khai bo con tr thng thng, du con tr * c th nm ngay trc tn bin hoc nm ngay sau tn kiu cu trc. Cho n tr n a ch ca mt bin cu trc Cp pht cho n mt vng nh xc nh.

Cng ging con tr thng thng, con tr cu trc c s dng khi:

Gn a ch cho con tr cu trc


Mt con tr cu trc c th tr n a ch ca mt bin cu trc c cng kiu thng qua php gn:
<Tn bin con tr> = &<Tn bin thng>;

V d, khai bo v php gn:


Employee *ptrEmployee, myEmployee; ptrEmployee = &myEmployee;

s a con tr ptrEmployee tr n a ch ca bin cu trc myEmployee.

38

Chng 3: Kiu d liu cu trc

Cp pht b nh ng cho con tr cu trc


Trong trng hp ta mun to ra mt con tr cu trc mi, khng tr vo mt bin cu trc c sn no, s dng con tr mi ny, ta phi cp pht vng nh cho n. C php cp pht vng nh cho con tr cu trc:
<Tn bin con tr> = new <Kiu cu trc>;

V d, cu trc Employee c khai bo bng t kho typedef, ta c th cp pht vng nh cho con tr cu trc nh sau:
Employee *ptrEmployee; ptrEmployee = new Employee;

hoc cp pht ngay khi khai bo:


Employee *ptrEmployee = new Employee;

Sau khi cp pht vng nh cho con tr bng thao tc new, khi con tr khng c dng na, hoc cn tr sang mt a ch khc, ta phi gii phng vng nh va c cp pht cho con tr bng thao tc:
delete <Tn bin con tr>;

V d:
Employee *ptrEmployee = new Employee; // Thc hin cc thao tc trn con tr delete ptrEmployee;

Lu : Thao tc delete ch c thc hin i vi con tr m trc , n c cp pht b nh ng thng qua thao tc new:
Employee *ptrEmployee = new Employee; delete ptrEmployee; //ng

m khng th thc hin vi con tr ch tr n a ch ca mt bin cu trc khc:


Employee *ptrEmployee, myEmployee; ptrEmployee = &myEmployee; delete ptrEmployee; //li

Truy nhp thuc tnh ca con tr cu trc


Thuc tnh ca con tr cu trc c th c truy nhp thng qua hai cch: Cch 1:
<Tn bin con tr> -> <Tn thuc tnh>;

Cch 2:
(*<Tn bin con tr>).<Tn thuc tnh>;

V d, thuc tnh tn nhn vin ca cu trc Employee c th c truy nhp thng qua hai cch:
Employee *ptrEmployee = new Employee; cin >> ptrEmployee -> name;

hoc:

39

Chng 3: Kiu d liu cu trc


cin >> (*ptrEmployee).name;

Lu : Trong cch truy nhp th hai, phi c du ngoc n () quanh tn con tr v php ton truy nhp thuc tnh . c u tin cao hn php ton ly gi tr con tr *. Thng thng, ta dng cch th nht cho n gin v thun tin.

Chng trnh 3.2 ci t vic khi to v hin th ni dung ca mt con tr cu trc. Chng trnh 3.2
#include<stdio.h> #include<conio.h> #include<string.h> typedef struct { int day; int month; int year; } Date; typedef struct { char name[20]; Date birthDay; char role[20]; float salary; } Employee; /* Khai bo khun mu hm */ void InitStruct(Employee *myEmployee); void Display(Employee *myEmployee); void InitStruct(Employee *myEmployee){ myEmployee = new Employee; cout << Name: ; cin >> myEmployee->name; cout << Day of birth: ; cin >> myEmployee->birthDay.day; cout << Month of birth: ; cin >> myEmployee->birthDay.month; cout << Year of birth: ; cin >> myEmployee->birthDay.year; cout << Role: ; cin >> myEmployee->role; cout << Salary: ; // Tn nhn vin // Ngy sinh ca nhn vin // Chc v ca nhn vin // Lng ca nhn vin

40

Chng 3: Kiu d liu cu trc


cin >> myEmployee->salary; } void Display(Employee myEmployee){ cout << Name: << myEmployee->name << endl; cout << Birth day: << myEmployee->birthDay.day << / << myEmployee->birthDay.month << / << myEmployee->birthDay.year << endl; cout << Role: << myEmployee->role << endl; cout << Salary: << myEmployee->salary << endl; return; } void main(){ clrscr(); Employee *myEmployee; InitStruct(myEmployee); Display(myEmployee); return; }

3.3.2 Mng cu trc


Khi cn x l nhiu i tng c dng kiu d liu cu trc, ta c th s dng mng cc cu trc. V mt mng mt chiu l tng ng vi mt con tr c cng kiu. Do , c th khai bo mng theo hai cch: Khai bo mng tnh nh thng thng hoc khai bo mng ng thng qua con tr.

Khai bo mng tnh cc cu trc


Khai bo mng tnh cc cu trc theo c php:
<Tn kiu cu trc> <Tn bin mng>[<S phn t mng>];

V d:
Employee employees[10];

l khai bo mt mng tn l employees gm 10 phn t c kiu l cu trc Employee.

Khai bo mng ng cc cu trc


Khai bo mt mng ng cc cu trc hon ton tng t khai bo mt con tr cu trc cng kiu:
<Tn kiu cu trc> *<Tn bin>;

V d, khai bo:
Employee *employees;

va c th coi l khai bo mt con tr thng thng c cu trc Employee, va c th coi l khai bo mt mng ng cc cu trc c kiu cu trc Employee.

41

Chng 3: Kiu d liu cu trc

Tuy nhin, cch cp pht b nh ng cho mng cc cu trc khc vi mt con tr. y l cch chng trnh nhn bit ta ang dng mt con tr cu trc hay mt mng ng c cu trc. C php cp pht b nh cho mng ng nh sau:
<Tn bin mng> = new <Kiu cu trc>[<S lng phn t>];

V d, khai bo:
Employee *employees = new Employee[10];

s cp pht b nh cho mt mng ng employees c 10 phn t kiu cu trc Employee.

Truy nhp n phn t ca mng cu trc


Vic truy nhp n cc phn t ca mng cu trc c thc hin nh truy cp n phn t ca mng thng thng. V d mun truy nhp n thuc tnh tn nhn vin phn t nhn vin th i trong mng cu trc, ta vit nh sau:
Employee *employees = new Employee[10]; employees[i].name;

Chng trnh 3.3 ci t vic khi to mt mng cc nhn vin ca mt phng trong mt cng ty. Sau , chng trnh s tm v in ra thng tin v nhn vin c lng cao nht v nhn vin c lng thp nht trong phng. Chng trnh 3.3
#include<stdio.h> #include<conio.h> #include<string.h> typedef struct { int day; int month; int year; } Date; typedef struct { char name[20]; Date birthDay; char role[20]; float salary; } Employee; /* Khai bo khun mu hm */ void InitArray(Employee *myEmployee, int length); Employee searchSalaryMax(Employee *myEmployee, int length); Employee searchSalaryMin(Employee *myEmployee, int length); void Display(Employee myEmployee); // Tn nhn vin // Ngy sinh ca nhn vin // Chc v ca nhn vin // Lng ca nhn vin

42

Chng 3: Kiu d liu cu trc


void InitArray(Employee *myEmployee, int length){ myEmployee = new Employee[length]; for(int i=0; i<length; i++){ cout << Nhan vien thu << i << endl; cout << Name: ; cin >> myEmployee[i].name; cout << Day of birth: ; cin >> myEmployee[i].birthDay.day; cout << Month of birth: ; cin >> myEmployee[i].birthDay.month; cout << Year of birth: ; cin >> myEmployee[i].birthDay.year; cout << Role: ; cin >> myEmployee[i].role; cout << Salary: ; cin >> myEmployee[i].salary; } return; } Employee searchSalaryMax(Employee *myEmployee, int length){ int index = 0; int maxSalary = myEmployee[0].salary; for(int i=1; i<length; i++) if(myEmployee[i].salary > maxSalary){ maxSalary = myEmployee[i].salary; index = i; } return myEmployee[index]; } Employee searchSalaryMin(Employee *myEmployee, int length){ int index = 0; int minSalary = myEmployee[0].salary; for(int i=1; i<length; i++) if(myEmployee[i].salary < minSalary){ minSalary = myEmployee[i].salary; index = i; } return myEmployee[index]; } void Display(Employee myEmployee){

43

Chng 3: Kiu d liu cu trc


cout << Name: << myEmployee.name << endl; cout << Birth day: << myEmployee.birthDay.day << / << myEmployee.birthDay.month << / << myEmployee.birthDay.year << endl; cout << Role: << myEmployee.role << endl; cout << Salary: << myEmployee.salary << endl; return; } void main(){ clrscr(); Employee *myEmployee, tmpEmployee; int length = 0; cout << So luong nhan vien: ; cin >> length; // Khi to danh sch nhn vin InitArray(myEmployee); // Nhn vin c lng cao nht tmpEmployee = searchSalaryMax(myEmployee, length); Display(tmpEmployee); // Nhn vin c lng thp nht tmpEmployee = searchSalaryMin(myEmployee, length); Display(tmpEmployee); // Gii phng vng nh delete [] myEmployee; return; }

3.4 MT S KIU D LIU TRU TNG


Ni dung phn ny tp trung trnh by vic ci t mt s cu trc d liu tru tng, bao gm: Ngn xp (stack) Hng i (queue) Danh sch lin kt (list)

44

Chng 3: Kiu d liu cu trc

3.4.1 Ngn xp
Ngn xp (stack) l mt kiu danh sch cho php thm v bt cc phn t mt u danh sch, gi l nh ca ngn xp. Ngn xp hot ng theo nguyn l: phn t no c a vo sau, s c ly ra trc.

nh ngha cu trc ngn xp


V ta ch cn quan tm n hai thuc tnh ca ngn xp l: Danh sch cc phn t ca ngn xp V tr nh ca ngn xp
typedef SIZE 100; typedef struct { int top; int nodes[SIZE]; } Stack; // V tr ca nh // Danh sch cc phn t

nn ta c th nh ngha cu trc ngn xp nh sau (cc phn t ca ngn xp c kiu int):

Tuy nhin, nh ngha ny tn ti mt vn , l kch thc (SIZE) ca danh sch cha cc phn t l tnh. Do : Nu ta chn SIZE ln, nhng khi gp ng dng ch cn mt s t phn t cho ngn xp th rt tn b nh. Nu ta khai bo SIZE nh, th khi gp bi ton cn ngn xp c nhiu phn t, ta s khng thm c cc phn t mi vo, chng trnh s c li.

khc phc hn ch ny, ta c th s dng b nh ng (mng ng thng qua con tr) lu danh sch cc phn t ca ngn xp. Khi , nh ngha cu trc ngn xp s c dng nh sau:
typedef struct { int top; int *nodes; } Stack; // V tr ca nh // Danh sch cc phn t

Ta s s dng nh ngha ny trong cc chng trnh ng dng ngn xp.

Cc thao tc trn ngn xp


i vi cc thao tc trn ngn xp, ta quan tm n hai thao tc c bn: Thm mt phn t mi vo nh ngn xp, gi l push. Ly ra mt phn t t nh ngn xp, gi l pop.

Khi thm mt phn t mi vo ngn xp, ta lm cc bc nh sau: 1. S phn t trong ngn xp c l (top+1). Do , ta cp pht mt vng nh mi lu c (top+1+1) = (top+2) phn t. 2. Sao chp (top+1) phn t c sang vng mi. Nu danh sch ban u rng (top = -1) th khng cn thc hin bc ny. 3. Thm phn t mi vo cui vng nh mi 4. Gii phng vng nh ca danh sch c

45

Chng 3: Kiu d liu cu trc

5. Cho danh sch nodes tr vo vng nh mi. Chng trnh 3.4a ci t th tc thm mt phn t mi vo ngn xp. Chng trnh 3.4a
void push(Stack *stack, int node){ int *tmpNodes = new int[stack->top + 2];// Cp pht vng nh mi stack->top ++; for(int i=0; i<stack->top; i++) tmpNodes[stack->top] = node; delete [] stack->nodes; stack->nodes = tmpNodes; return; } // Tng ch s ca node nh // Sao chp sang vng nh mi // Thm node mi vo nh // Gii phng vng nh c // Tr vo vng nh mi

tmpNodes[i] = stack->nodes[i];

Khi ly ra mt phn t ca ngn xp, ta lm cc bc nh sau: Kim tra xem ngn xp c rng (top = -1) hay khng. Nu khng rng th thc hin cc bc tip theo. Ly phn t nh ngn xp ra Cp pht mt vng nh mi c (top+1) -1 = top phn t Sao chp top phn t t danh sch c sang vng nh mi (tr phn t nh). Gii phng vng nh c Cho con tr danh sch tr vo vng nh mi. Tr v gi tr phn t nh ly ra.

Chng trnh 3.4b ci t th tc ly mt phn t t ngn xp. Chng trnh 3.4b


int pop(Stack *stack){ if(stack->top < 0){ return 0; } int result = stack->nodes[stack->top];// Lu gi gi tr nh int *tmpNodes = new int[stack->top];// Cp pht vng nh mi for(int i=0; i<stack->top; i++) stack->top --; delete [] stack->nodes; stack->nodes = tmpNodes; return result; // Sao chp sang vng nh mi // Gim ch s ca node nh // Gii phng vng nh c // Tr vo vng nh mi // Tr v gi tr node nh tmpNodes[i] = stack->nodes[i]; // Kim tra ngn xp rng cout << Stack is empty! << endl;

46

Chng 3: Kiu d liu cu trc


}

p dng
Ngn xp c s dng trong cc ng dng tho mn nguyn tc: ci no t vo trc s c ly ra sau. Chng trnh 3.4c minh ho vic dng ngn xp o ngc mt xu k t c nhp vo t bn phm. Chng trnh 3.4c
#include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct { int top; int *nodes; } Stack; /* Khai bo nguyn mu hm */ void init(Stack *stack); void push(Stack *stack, int node); int pop(Stack *stack); void release(Stack *stack); void init(Stack *stack){ stack = new Stack; stack->top = -1; } void push(Stack *stack, int node){ int *tmpNodes = new int[stack->top + 2];// Cp pht vng nh mi stack->top ++; for(int i=0; i<stack->top; i++) tmpNodes[stack->top] = node; delete [] stack->nodes; stack->nodes = tmpNodes; return; } int pop(Stack *stack){ if(stack->top < 0){ // Kim tra ngn xp rng // Tng ch s ca node nh // Sao chp sang vng nh mi // Thm node mi vo nh // Gii phng vng nh c // Tr vo vng nh mi // Cp pht vng nh cho con tr // Khi to ngn xp rng // V tr node nh // Danh sch phn t

tmpNodes[i] = stack->nodes[i];

47

Chng 3: Kiu d liu cu trc


cout << Stack is empty! << endl; return 0; } int result = stack->nodes[stack->top];// Lu gi gi tr nh int *tmpNodes = new int[stack->top];// Cp pht vng nh mi for(int i=0; i<stack->top; i++) stack->top --; delete [] stack->nodes; stack->nodes = tmpNodes; return result; } void release(Stack *stack){ delete [] stack->nodes; delete stack; return; } void main(){ clrscr(); Stack *stack; init(stack); char strIn[250]; // Nhp chui k t t bn phm cout << Nhap chuoi: ; cin >> strIn; for(int i=0; i<strlen(strIn); i++) push(stack, strIn[i]); while(stack->top > -1) cout << pop(stack); release(stack); return; } // Gii phng b nh // Ly ra t ngn xp // t vo ngn xp // Khi to ngn xp // Gii phng vng danh sch // Gii phng con tr // Sao chp sang vng nh mi // Gim ch s ca node nh // Gii phng vng nh c // Tr vo vng nh mi // Tr v gi tr node nh tmpNodes[i] = stack->nodes[i];

3.4.2 Hng i
Hng i (queue) cng l mt cu trc tuyn tnh cc phn t. Trong , cc phn t lun c thm vo mt u, gi l u cui hng i, v vic ly ra cc phn t lun c thc hin u cn li, gi l u mt ca hng i. Hng i hot ng theo nguyn l: phn t no c a vo trc, s c ly ra trc.

48

Chng 3: Kiu d liu cu trc

nh ngha cu trc hng i


Hng i c cc thuc tnh: Mt danh sch cc phn t c mt trong hng i. Ch s ca phn t ng u ca danh sch (front). Ch s phn t cui ca danh sch (rear).
typedef SIZE 100; typedef struct { int front, rear; int nodes[SIZE]; } Queue; // V tr ca nh u, nh cui // Danh sch cc phn t

Nu dng cu trc tnh nh ngha, hng i c cu trc nh sau:

Nu dng b nh ng lu gi hng i, th phn t front lun l phn t th 0 ca danh sch. V rear s bng di danh sch tr i 1. Cu trc ng ca hng i:
typedef struct { int front, rear; int *nodes; } Queue; // V tr ca nh u, nh cui // Danh sch cc phn t

Thao tc trn hng i


Thm mt phn t vo cui hng i Ly mt phn t v tr u ca hng i

Thao tc thm mt phn t vo cui hng i vi b nh ng c thc hin tng t vi ngn xp. Chng trnh 3.5a ci t th tc thm mt phn t vo cui hng i ng. Chng trnh 3.5a
void insert(Queue *queue, int node){ int *tmpNodes = new int[queue->rear + 2];// Cp pht vng nh mi queue->rear ++; if(queue->front == -1) queue->front = 0; for(int i=0; i<queue->rear; i++) tmpNodes[queue->rear] = node; delete [] queue->nodes; queue->nodes = tmpNodes; return; } // Tng ch s ca node ui // Nu hng i c rng // th cp nht front // Sao chp sang vng nh mi // Thm node mi vo ui // Gii phng vng nh c // Tr vo vng nh mi

tmpNodes[i] = queue->nodes[i];

Thao tc ly ra mt phn t u ca hng i thc hin theo cc bc: 1. Kim tra tnh rng (front = rear = -1) ca hng i. Nu khng rng mi thc hin tip

49

Chng 3: Kiu d liu cu trc

2. Ly phn t nodes[0] ra. 3. Sao chp danh sch cn li sang vng nh mi 4. Gii phng vng nh c 5. a danh sch tr vo vng nh mi 6. Tr v gi tr phn t ly ra Chng trnh 3.5b ci t th tc ly ra mt phn t ca hng i ng. Chng trnh 3.5b
int remove(Queue *queue){ if((queue-front < 0)||(queue-rear < 0)){// Kim tra hng i rng cout << Queue is empty! << endl; return 0; } // Lu gi gi tr phn t u int result = queue->nodes[queue->front]; int *tmpNodes; if(queue->rear > 0){ // Nu c hn 1 phn t tmpNodes = new int[queue->rear];// Cp pht vng nh mi for(int i=0; i<queue->rear; i++)// Sao chp sang vng nh mi tmpNodes[i] = queue->nodes[i]; }else queue->front --; queue->rear --; delete [] queue->nodes; queue->nodes = tmpNodes; return result; } // Nu ch c 1 phn t // Hng i thnh rng // Gim ch s ca node ui // Gii phng vng nh c // Tr vo vng nh mi // Tr v gi tr node u

p dng
Hng i c p dng trong cc bi ton cn c ch qun l ci no vo trc s c ly ra trc. Chng trnh 3.5c minh ho c ch qun l tin trnh n gin nht ca h iu hnh: cc tin trnh c qun l theo m tin trnh, khi xut hin, tin trnh c a vo cui ca mt hng i. Khi no CPU rnh th s ly tin trnh u hng i ra thc hin. Chng trnh 3.5c
#include<stdio.h> #include<conio.h> typedef struct { int front, rear; // V tr ca nh u, nh cui

50

Chng 3: Kiu d liu cu trc


int *nodes; } Queue; /* Khai bo cc nguyn mu hm */ void init(Queue *queue); void insert(Queue *queue, int node); int remove(Queue *queue); void travese(Queue *queue); void release(Queue *queue); void init(Queue *queue){ queue = new Queue; queue->front = -1; queue->rear = -1; return; } void insert(Queue *queue, int node){ int *tmpNodes = new int[queue->rear + 2];// Cp pht vng nh mi queue->rear ++; if(queue->front == -1) queue->front = 0; for(int i=0; i<queue->rear; i++) tmpNodes[queue->rear] = node; delete [] queue->nodes; queue->nodes = tmpNodes; return; } int remove(Queue *queue){ if((queue-front < 0)||(queue-rear < 0)){// Kim tra hng i rng cout << Queue is empty! << endl; return 0; } // Lu gi gi tr phn t u int result = queue->nodes[queue->front]; int *tmpNodes; if(queue->rear > 0){ // Nu c hn 1 phn t tmpNodes = new int[queue->rear];// Cp pht vng nh mi for(int i=0; i<queue->rear; i++)// Sao chp sang vng nh mi tmpNodes[i] = queue->nodes[i]; }else // Nu ch c 1 phn t // Tng ch s ca node ui // Nu hng i c rng // th cp nht front // Sao chp sang vng nh mi // Thm node mi vo ui // Gii phng vng nh c // Tr vo vng nh mi // Cp pht b nh cho con tr // Khi to danh sch rng // Danh sch cc phn t

tmpNodes[i] = queue->nodes[i];

51

Chng 3: Kiu d liu cu trc


queue->front --; queue->rear --; delete [] queue->nodes; queue->nodes = tmpNodes; return result; } void travese(Queue *queue){ if(queue->front < 0){ return; } for(int i=queue->front; i<=queue.rear; i++) cout << queue->nodes[i] << ;// Lit k cc phn t cout << endl; return; } void release(Queue *queue){ if(queue->front > -1) delete queue; } void main(){ clrscr(); Queue *queue; init(queue); int function; do{ clrscr(); cout << CAC CHUC NANG: << endl; cout << 1: Them mot tien trinh vao hang doi << endl; cout << 2: Dua mot tien trinh trinh vao thuc hien << endl; cout<<3: Xem tat ca cac tien trinh trong hang doi << endl; cout << 5: Thoat! << endl; cout << ========================================= << endl; cout << Chon chuc nang: << endl; cin >> function; switch(function){ case 1: int maso; cout << Ma so tien trinh vao hang doi: ; // Thm vo hng i // Khi to hng i //Nu danh sch khng rng th //Gii phng vng nh ca con tr delete [] queue->nodes; //gii phng vng nh ca danh sch // Khi danh sch rng cout << Danh sach rong! << endl; // Hng i thnh rng // Gim ch s ca node ui // Gii phng vng nh c // Tr vo vng nh mi // Tr v gi tr node u

52

Chng 3: Kiu d liu cu trc


cin >> maso; insert(queue, maso); break; case 2: // Ly ra khi hng i cout << Tien trinh duoc thuc hien: << remove(queue) << endl; break; case 3: <<endl; travese(queue); break; }while(function != 5); release(queue); return; } // Gii phng hng i // Duyt hng i cout<<Cac tien trinh dang o trong hang doi la:

3.4.3 Danh sch lin kt


Danh sch lin kt l mt kiu d liu bao gm mt dy cc phn t c th t, cc phn t c cng cu trc d liu, ngoi tr node u tin ca danh sch l node lu thng tin v danh sch. C hai loi danh sch lin kt: Danh sch lin kt n: mi node c mt con tr tr n node tip theo trong danh sch Danh sch lin kt kp: mi node c hai con tr, mt tr vo node trc, mt tr vo node tip theo trong danh sch.

Trong phn ny s trnh by danh sch lin kt n. Danh sch lin kt kp c coi nh l mt bi tp m rng t danh sch lin kt n.

nh ngha danh sch n


Mi node ca danh sch n cha d liu ca n, ng thi tr n node tip theo trong danh sch, cu trc mt node nh sau:
struct simple{ Employee employee; struct simple *next; }; typedef struct simple SimpleNode; // D liu ca node c kiu Employee // Tr n node k tip

Node u ca danh sch n c cu trc ring, n khng cha d liu nh node thng m cha cc thng tin: S lng node trong danh sch (khng k bn thn n node u) Con tr n node u tin ca danh sch Con tr n node cui cng ca danh sch

Do vy, cu trc node u ca danh sch n l:

53

Chng 3: Kiu d liu cu trc


typedef struct{ int nodeNumber; } SimpleHeader; // S lng cc node SimpleNode *front, *rear;// Tr n node u v cui danh sch

Cc thao tc trn danh sch lin kt n


Cc thao tc c bn trn danh sch n bao gm: Chn thm mt node vo v tr th n trong danh sch Loi ra mt node v tr th n trong danh sch

Vic chn thm mt node vo v tr th n trong danh sch c thc hin theo cc bc: 1. Nu n<=0, chn vo u. Nu n>s phn t ca danh sch, chn vo cui. Trng hp cn li, chn vo gia. 2. Tm node th n: gi vt ca hai node th n-1 v th n. 3. To mt node mi: cho node th n-1 tr tip vo node mi v node mi tr tip vo node th n. Chng trnh 3.6a ci t th tc chn mt node vo v tr th n ca danh sch. Chng trnh 3.6a
void insert(SimpleHeader *list, int position, int value){ SimpleNode *newNode = new SimpleNode; newNode->value = value; if(position <= 0){ newNode->next = list->front; list->front = newNode; if(list->nodeNumber == 0) list->rear = newNode; list->rear->next = newNode; list->rear = newNode; if(list->nodeNumber == 0) list->front = newNode; }else{ int index = 0; while(index < position){ prev = curr; curr = curr->next; index++; } newNode->next = curr; prev->next = newNode; } // chn vo trc node n // v chn vo sau node n-1 // tm node n-1 v n // Chn vo u ds // Chn vo trc node u // Cp nht li node u ds // Nu ds ban u rng th // node ui trng vi node u // Chn vo sau node cui // Cp nht li node cui ds // Nu ds ban u rng th // node u trng node ui // Chn vo gia ds

}else if(position >= list->nodeNumber){// Chn vo cui ds

SimpleNode *prev = list->front, *curr = list->front;

54

Chng 3: Kiu d liu cu trc


list->nodeNumber++; return; } // Cp nht s lng node

Vic xo mt node v tr th n trong danh sch c thc hin theo cc bc: 1. Nu n<0 hoc n>s phn t ca danh sch, khng xo node no. 2. Tm node th n: gi vt ca ba node th n-1, th n v th n+1. 3. Cho node th n-1 tr tip vo node th n+1, xo con tr ca node th n. 4. Tr v node th n. Chng trnh 3.6b ci t th tc xo mt node v tr th n ca danh sch. Chng trnh 3.6b
SimpleNode* remove(SimpleHeader *list, int position){ if((position < 0)||(position >= list->nodeNumber)) return NULL; SimpleNode* result; if(position == 0){ result = list->front; if(list->nodeNumber == 1) // Xo node u // Gi node cn xo // Nu ds ch c 1 node th // Khng xo node no c

list->front = list->front->next;// Cp nht node u list->rear = list->front;// Cp nht node cui ds }else if(position == list->nodeNumber 1){ result = list->rear; // Gi node cn xo SimpleNode *curr = list->front; while(curr->next != list->rear) curr = curr->next; curr->next = NULL; list->rear = curr; }else{ SimpleNode *prev = list->front, *curr = list->front; int index = 0; while(index < position){ prev = curr; curr = curr->next; index++; } result = curr; prev->next = curr->next; } list->nodeNumber --; return result; // Cp nht s lng node // Tr v node cn xo // Gi node cn xo // Cho node n-1 tr n node n+1 // Tm node n-1 v n // Tm node trc ca node cui // Xo node rear hin ti // Cp nht node cui ds

55

Chng 3: Kiu d liu cu trc


}

p dng
Chng trnh 3.6c minh ho vic dng danh sch lin kt n qun l nhn vin vn phng vi cc thng tin rt n gin: tn, tui v tin lng ca mi nhn vin. Chng trnh 3.6c
#include<stdio.h> #include<conio.h> #include<string.h> typedef struct{ char name[25]; int age; float salary; } Employee; struct simple{ Employee employee; struct simple *next; }; typedef struct simple SimpleNode; typedef struct{ int nodeNumber; SimpleNode *front, *rear; } SimpleHeader; // S lng cc node // Tr n node u v cui ds // D liu ca node // Tr n node k tip // Tn nhn vin // Tui nhn vin // Lng nhn vin

/* Khai bo cc nguyn mu hm */ void init(SimpleHeader *list); void insert(SimpleHeader *list, int position, Employee employee); SimpleNode* remove(SimpleHeader *list); void travese(SimpleHeader *list); void release(SimpleHeader *list); void init(SimpleHeader *list){ list = new list; list->front = NULL; list->rear = NULL; // Cp pht b nh cho con tr // Khi to danh sch rng

56

Chng 3: Kiu d liu cu trc


list->nodeNumber = 0; return; } void insert(SimpleHeader *list, int position, Employee employee){ SimpleNode *newNode = new SimpleNode; newNode->employee = employee; if(position <= 0){ newNode->next = list->front; list->front = newNode; if(list->nodeNumber == 0) list->rear = newNode; list->rear->next = newNode; list->rear = newNode; list->front = newNode; }else{ int index = 0; while(index < position){// tm node n-1 v n prev = curr; curr = curr->next; index++; } newNode->next = curr; prev->next = newNode; } list->nodeNumber++; return; } SimpleNode* remove(SimpleHeader *list, int position){ if((position < 0)||(position >= list->nodeNumber)) return NULL; SimpleNode* result; if(position == 0){ result = list->front; // Xo node u // Gi node cn xo // Nu ds ch c 1 node th // Khng xo node no c // Cp nht s lng node // chn vo trc node n // v chn vo sau node n-1 // Chn vo u ds // Chn vo trc node u // Cp nht li node u ds // Nu ds ban u rng th // node ui trng vi node u // Chn vo sau node cui // Cp nht li node cui ds // node u trng node ui

}else if(position >= list->nodeNumber){// Chn vo cui ds

if(list->nodeNumber == 0)// Nu ds ban u rng th // Chn vo gia ds

SimpleNode *prev = list->front, *curr = list->front;

list->front = list->front->next;// Cp nht node u if(list->nodeNumber == 1) list->rear = list->front;// Cp nht node cui ds }else if(position == list->nodeNumber 1){ result = list->rear; // Gi node cn xo

57

Chng 3: Kiu d liu cu trc


SimpleNode *curr = list->front; while(curr->next != list->rear) curr = curr->next;// Tm node trc ca node cui curr->next = NULL; list->rear = curr; }else{ SimpleNode *prev = list->front, *curr = list->front; int index = 0; while(index < position){// Tm node n-1 v n prev = curr; curr = curr->next; index++; } result = curr; } list->nodeNumber --; return result; } void travese(SimpleHeader *list){ if(list->nodeNumber <= 0){ return; } SimpleNode *curr = list->front; while(curr != NULL){ cout << curr->employee.name << << curr->employee.age << << curr->employee.salary << endl;// Lit k cc phn t curr = curr->next; } return; } void release(SimpleHeader *list){ SimpleNode* curr = remove(list, 0); while(curr != NULL){ delete curr; curr = remove(list, 0); } delete list; } //Gii phng vng nh ca con tr //Gii phng vng nh ca node // Khi danh sch rng cout << Danh sach rong! << endl; // Cp nht s lng node // Tr v node cn xo // Gi node cn xo prev->next = curr->next;// Cho node n-1 tr n node n+1 // Xo node rear hin ti // Cp nht node cui ds

58

Chng 3: Kiu d liu cu trc

void main(){ clrscr(); SimpleHeader *list; init(list); int function; do{ clrscr(); cout << CAC CHUC NANG: << endl; cout << 1: Them mot nhan vien << endl; cout << 2: Xoa mot nhan vien << endl; cout << 3: Xem tat ca cac nhan vien trong phong << endl; cout << 5: Thoat! << endl; cout << ======================================= << endl; cout << Chon chuc nang: << endl; cin >> function; switch(function){ case 1: // Thm vo ds int position; Employee employee; cout << Vi tri can chen: ; cin >> position; cout << Ten nhan vien: ; cin >> employee.name; cout << Tuoi nhan vien: ; cin >> employee.age; cout << Luong nhan vien: ; cin >> employee.salary; insert(list, position, employee); break; case 2: // Ly ra khi ds int position; cout << Vi tri can xoa: ; cin >> position; SimpleNode* result = remove(list, position); if(result != NULL){ cout << Nhan vien bi loai: << endl; cout << Ten: << result->employee.name << endl; cout << Tuoi: << result->employee.age << endl; cout << Luong: << result->employee.salary << endl; // Khi to ds

59

Chng 3: Kiu d liu cu trc


} break; case 3: // Duyt ds cout<<Cac nhan vien cua phong:<<endl; travese(list); break; }while(function != 5); release(list); return; } // Gii phng ds

TNG KT CHNG 3
Ni dung chng 3 trnh by cc vn lin quan n cc kiu d liu c cu trc trong C++: Khai bo cu trc thng qua t kho struct T nh ngha kiu d liu cu trc bng t kho typedef. Khai bo mt bin c kiu d liu cu trc Khai bo cc cu trc lng nhau. Truy nhp n cc thuc tnh ca cu trc Khai bo con tr cu trc, cp pht v gii phng b nh ng ca con tr cu trc. Truy nhp n cc thuc tnh ca con tr cu trc. Khai bo v s dng mng cu trc Khai bo mng cu trc bng con tr cu trc. Cp pht v gii phng vng nh ca mng ng cc cu trc. Ci t mt s cu trc c bit: Ngn xp Hng i Danh sch lin kt

CU HI V BI TP CHNG 3
1. nh ngha mt cu trc sinh vin c tn l Sinhvien, gm c tn v tui sinh vin. nh ngha no sau y l ng: a.
struct Sinhvien{ char name[20]; int age; };

b.

struct { char name[20]; int age; } Sinh vien;

60

Chng 3: Kiu d liu cu trc

c.

typedef struct Sinhvien{ char name[20]; int age; };

2. Mt cu trc c nh ngha nh sau:


struct Employee{ char name[20]; int age; };

Khi , cch khai bo bin no sau y l ng: a. struct Employee myEmployee; b. struct employee myEmployee; c. Employee myEmployee; d. employee myEmployee; 3. Mt cu trc c nh ngha nh sau:
typedef struct employee{ char name[20]; int age; } Employee;

Khi , cch khai bo bin no sau y l ng: a. Employee myEmployee; b. employee myEmployee; c. struct Employee myEmployee; d. struct employee myEmployee; 4. Vi cu trc c nh ngha nh trong bi 3. Khi , cch khi to bin no sau y l ng: a. Employee myEmployee = {A, 27}; b. Employee myEmployee = {A, 27}; c. Employee myEmployee = (A, 27); d. Employee myEmployee = (A, 27); 5. Vi cu trc c nh ngha nh trong bi 3. Khi , cc cch cp pht b nh cho bin con tr no sau y l ng: a. Employee *myEmployee = new Employee; b. Employee *myEmployee = new Employee(); c. Employee *myEmployee = new Employee(10); d. Employee *myEmployee = new Employee[10]; 6. nh ngha mt cu trc v mn hc ca mt hc sinh c tn Subject, bao gm cc thng tin:

61

Chng 3: Kiu d liu cu trc

Tn mn hc, kiu char[]; im tng kt mn hc, kiu float; Tn hc sinh, kiu char[]; Tui hc sinh, kiu int; Lp hc sinh, kiu char[]; Danh sch im cc mn hc ca hc sinh, kiu l mt mng cc cu trc Subject c nh ngha trong bi tp 6. Xp loi hc lc, kiu char[];

7. nh ngha cu trc v hc sinh tn l Student bao gm cc thng tin sau:

8. Khai bo mt bin c cu trc l Student nh ngha trong bi 7. Sau , thc hin tnh im trung bnh ca tt c cc mn hc ca hc sinh , v vit mt th tc xp loi hc sinh da vo im trung bnh cc mn hc: Nu im tb nh hn 5.0, xp loi km Nu im tb t 5.0 n di 6.5, xp loi trung bnh. Nu im tb t 6.5 n di 8.0, xp loi kh Nu im tb t 8.0 tr ln, xp loi gii.

9. Vit mt chng trnh qun l cc hc sinh ca mt lp, l mt dy cc cu trc c kiu Stupid nh ngha trong bi 7. S dng th tc ci t trong bi 8 thc hin cc thao tc sau: Khi to danh sch v im ca cc hc sinh trong lp. Tnh im trung bnh v xp loi cho tt c cc hc sinh. Tm tt c cc hc sinh theo mt loi nht nh

10. S dng cu trc ngn xp nh ngha trong bi i mt s t kiu thp phn sang kiu nh phn: Chi s nguyn cho 2, mi cho n khi thng <2, lu cc s d vo ngn xp. Sau , c cc gi tr d t ngn xp ra, ta s thu c chui nh phn tng ng. 11. M rng cu trc hng i nh ngha trong bi tr thnh hng i c u tin: Cho mi node thm mt thuc tnh l u tin ca node Khi thm mt node vo hng i, thay v thm vo cui hng i nh thng thng, ta tm v tr c u tin ph hp chn node vo, sao cho dy cc node trong hng i l mt danh sch c u tin ca cc node l gim dn. Vic ly ra l khng thay i: ly ra phn t u hng i, chnh l phn t c u tin cao nht.

12. p dng hng i c u tin trong bi 11 xy dng chng trnh qun l tin trnh c u tin ca h iu hnh, m rng ng dng trong bi ngn xp. 13. M rng cu trc danh sch lin kt n trong bi thnh danh sch lin kt kp: Mi node c thm mt con tr prev tr n node trc n i vi node header, cng cn 2 con tr: tr n node u tin v node cui cng ca danh sch

62

Chng 3: Kiu d liu cu trc

Ring vi node u tin (front) ca danh sch, con tr prev ca n s tr n NULL. Ging nh con tr next ca node rear.

14. Ci t li hai tho tc thm vo mt node v xo mt node mt v tr xc nh trong mt cu trc danh sch lin kt kp nh ngha trong bi 13. 15. p dng cc nh ngha v thao tc trong cc bi 13 v 14. Ci t li chng trnh qun l nhn vin chng trnh 3.6c bng danh sch lin kt kp.

63

Chng 4: Vo ra trn tp

CHNG 4 VO RA TRN TP
Ni dung chng ny tp trung trnh by cc vn lin quan n cc thao tc trn tp d liu trong ngn ng C++: Khi nim tp, tp vn bn v tp nh phn Cc thao tc vo ra trn tp Phng thc truy nhp tp trc tip

4.1 KHI NIM TP


4.1.1 Tp d liu
Trong C++, khi thao tc vi mt tp d liu, cn thc hin tun t theo cc bc nh sau: 1. M tp tin 2. Thc hin cc thao tc c, ghi trn tp tin ang m 3. ng tp tin thc hin cc thao tc lin quan n tp d liu, C++ cung cp mt th vin <fstream.h> cha cc lp v cc hm phc v cho cc thao tc ny. Do vy, trong cc chng trnh lm vic vi tp tin, ta cn khai bo ch th dng th vin ny ngay t u chng trnh:
#include<fstream.h>

Khai bo bin tp
Trong C++, khi khai bo mt bin tp, ng thi ta s m tp tng ng theo c php tng qut bng cch dng kiu fstream nh sau:
fstream <Tn bin tp>(<Tn tp>, <Ch m tp>);

Trong : Tn bin tp: c tnh cht nh mt tn bin thng thng, n s c dng thc hin cc thao tc vi tp gn vi n. Tn bin tp cng phi tun th theo quy tc t tn bin trong C++. Tn tp: l tn tp d liu m ta cn thao tc trn n. Ch m tp: l cc hng kiu bt c nh ngha sn bi C++. N ch ra rng ta ang m tp tin ch no: c hoc ghi, hoc c c ln ghi.
fstream myFile(abc.txt, ios::in);

V d, khai bo: l khai bo mt bin tp, c tn l myFile, dng m tp tin c tn l abc.txt v tp tin ny c m ch c d liu (bt ch th ios::in). Lu :

64

Chng 4: Vo ra trn tp

Tn tp tin c dng mt chui k t, nu khai bo tn tp c ng dn th mc \ th mi du \ phi c vit thnh \\ trnh b nhm ln vi cc k t c bit trong C nh \n, \d
fstream myFile(myDir\\abc.txt, ios::in);

V d, mun m mt tp tn l abc.txt trong th mc myDir c, ta phi khai bo nh sau:

Cc ch m tp tin
Cc ch m tp tin c nh ngha bi cc bt ch th: Lu : Khi mun m mt tp tin ng thi nhiu ch khc nhau, ta kt hp cc bt ch th tng ng bng php ton hp bt |.

ios::in: ios::out: ios::app: ios::ate: ios::trunc:

M mt tp tin c. M mt tp tin c sn ghi. M mt tp tin c sn thm d liu vo cui tp. M tp tin v t con tr tp tin vo cui tp. Nu tp tin c sn th d liu ca n s b mt.

ios::nocreate: M mt tp tin, tp tin ny bt buc phi tn ti. ios::noreplace: Ch m tp tin khi tp tin cha tn ti. ios::binary: ios::text:
M mt tp tin ch nh phn. M mt tp tin ch vn bn.

V d, mun m mt tp tin abc.txt c (ios::in) ng thi vi ghi (ios::out) di ch vn bn (ios::text), ta khai bo nh sau:
fstream myFile(abc.txt, ios::in|ios::out|ios::text);

4.1.2 Tp vn bn
m mt tp tin di ch vn bn, ta dng c php sau:
fstream <Tn bin tp>(<Tn tp>, ios::text);

Khi , cc thao tc c, ghi trn bin tp c thc hin theo n v l cc t, c phn cch bi du trng (space bar) hoc du xung dng (enter). V d, mun m tp tin baitho.txt di ch vn bn, ta khai bo nh sau:
fstream myBaiTho(baitho.txt, ios::text);

4.1.3 Tp nh phn
m mt tp tin di ch nh phn, ta dng c php sau:
fstream <Tn bin tp>(<Tn tp>, ios::binary);

Khi , cc thao tc c, ghi trn bin tp c thc hin theo n v byte theo kch thc cc bn ghi (cu trc) c ghi trong tp. V d, mun m tp tin baitho.txt di ch nh phn, ta khai bo nh sau:
fstream myBaiTho(baitho.txt, ios::binary);

65

Chng 4: Vo ra trn tp

4.2 VO RA TRN TP
4.2.1 Vo ra tp vn bn bng >> v << Ghi tp vn bn bng <<
Cc bc thc hin ghi d liu vo mt tp tin nh sau: 1. M tp tin theo ch ghi bng i tng ofstream (m tp tin ch ghi):
ofstream <Tn bin tp>(<Tn tp tin>, ios::out);

2. Ghi d liu vo tp bng thao tc <<:


<Tn bin tp> << <D liu>;

3. ng tp tin bng lnh close():


<Tn bin tp>.close();

Chng trnh 4.1 minh ho vic ghi d liu vo tp tin: Tn tp tin c ngi dng t nhp vo t bn phm. Chng trnh s ghi vo tp cc k t do ngi dng g vo t bn phm, mi k t c phn cch nhau bi du trng (space bar). Chng trnh dng li khi ngi dng nhp k t e. V tp tin c kt thc bng mt du xung dng endl.

Chng trnh 4.1


#include<stdlib.h> #include<iostream.h> #include<fstream.h> #include<conio.h> const int length = 25; void main(){ clrscr(); char fileName[length], input; cout << Ten tep tin: ; cin >> setw(length) >> fileName; /* M tp tin */ ofstream fileOut(fileName, ios::out);// Khai bo v m tp tin if(!fileOut){ exit(1); } /* Ghi d liu vo tp tin */ // Khng m c tp cout << Khong the tao duoc tep tin << fileName << endl; // Nhp tn tp tin // di ti a tn tp tin

66

Chng 4: Vo ra trn tp
do{ cin >> input; fileOut << input << ; }while((input != e)&&(fileOut)); fileOut << endl; /* ng tp tin */ fileOut.close(); return; } // ng tp tin // Xung dng cui tp tin // c k t t bn phm // Ghi k t vo tp tin

c d liu t tp vn bn bng >>


Cc bc thc hin c d liu t mt tp tin nh sau: 1. M tp tin theo ch c bng i tng ifstream (m tp tin ch c):
ifstream <Tn bin tp>(<Tn tp tin>, ios::in);

2. c d liu t tp bng thao tc >>:


<Tn bin tp> >> <Bin d liu>;

3. ng tp tin bng lnh close():


<Tn bin tp>.close();

Chng trnh 4.2 minh ho vic c d liu t tp tin va s dng trong chng trnh 4.1 ra mn hnh: Tn tp tin c ngi dng t nhp vo t bn phm. Chng trnh s c cc k t trong tp v hin th ra mn hnh, mi k t c phn cch nhau bi du trng (space bar). Chng trnh dng li khi kt thc tp tin.

Chng trnh 4.2


#include<stdlib.h> #include<iostream.h> #include<fstream.h> #include<conio.h> const int length = 25; void main(){ clrscr(); char fileName[length], output; cout << Ten tep tin: ; cin >> setw(length) >> fileName; /* M tp tin */ // Nhp tn tp tin // di ti a tn tp tin

67

Chng 4: Vo ra trn tp
ifstream fileIn(fileName, ios::in); // Khai bo v m tp tin if(!fileIn){ exit(1); } /* c d liu t tp tin ra mn hnh */ while(fileIn){ fileIn >> output; cout << output; } cout << endl; /* ng tp tin */ fileIn.close(); return; } // ng tp tin // Xung dng trn mn hnh // c k t t tp tin // Ghi k t ra mn hnh // Khng m c tp cout << Khong the mo duoc tep tin << fileName << endl;

Chng trnh 4.3 minh ho vic copy ton b ni dung ca mt tp tin sang mt tp tin mi: Tn tp tin ngun v tp tin ch c nhp t bn phm bi ngi dng. Tp tin ngun c m ch c. Tp tin ch c m ch ghi. c tng k t t tp tin ngun v ghi ngay vo tp tin ch. ng cc tp tin khi kt thc.

Chng trnh 4.3


#include<stdlib.h> #include<iostream.h> #include<fstream.h> #include<conio.h> const int length = 25; void main(){ clrscr(); char sourceFile[length], targetFile[length], data; cout << Ten tep tin nguon: ; cin >> setw(length) >> sourceFile; cout << Ten tep tin dich: ; cin >> setw(length) >> targetFile; // Nhp tn tp tin ch // Nhp tn tp tin ngun // di ti a tn tp tin

68

Chng 4: Vo ra trn tp

/* M tp tin ngun */ ifstream fileIn(sourceFile, ios::in);// Khai bo v m tp ngun if(!fileIn){ << sourceFile << endl; exit(1); } /* M tp tin ch */ ofstream fileOut(targetFile, ios::out);// Khai bo v m tp ch if(!fileOut){ << targetFile << endl; exit(1); } /* c d liu t tp tin ra tp ch */ while(fileIn){ fileIn >> data; fileOut << data; } /* ng cc tp tin */ fileIn.close(); fileOut.close(); return; } // ng tp tin ngun // ng tp tin ch // c k t t tp ngun // Ghi k t ra tp ch // Khng m c tp ch cout << Khong the tao duoc tep tin dich // Khng m c tp ngun cout << Khong the mo duoc tep tin nguon

Lu : Tn bin tp, sau khi dng xong vi mt tp xc nh, c th s dng m mt tp khc, vi mt ch m tp khc bng php ton open() ca bin tp.
<Tn bin tp>.open(<Tn tp mi>, <ch m mi>);

V d, on chng trnh:
ofstream myFile(abc.txt, ios::out); // ghi vao file abc.txt myFile.close(); myFile.open(xyz.txt, ios::out|ios::app); // Them vao cuoi file xyz.txt myFile.close();

s dng bin tp myFile (c kiu ofstream) hai ln: mt ln l dng vi tp tin abc.txt ch m ghi t u. Mt ln khc l vi tp tin xyz.txt ch m ghi thm vo cui.

69

Chng 4: Vo ra trn tp

4.2.2 Vo ra tp nh phn bng read v write Ghi vo tp nh phn bng write


Cc bc thc hin ghi d liu vo mt tp nh phn nh sau: 1. M tp tin theo ch ghi nh phn bng i tng fstream:
fstream <Tn bin tp>(<Tn tp tin>, ios::out|ios::binary);

2. Ghi d liu vo tp bng thao tc write():


<Tn bin tp>.write(char* <D liu>, int <Kch thc d liu>);

3. ng tp tin bng lnh close():


<Tn bin tp>.close();

Trong , thao tc write nhn hai tham s u vo nh sau: Tham s th nht l con tr kiu char tr n vng d liu cn ghi vo tp. V con tr bt buc c kiu char nn khi mun ghi d liu c kiu khc vo tp, ta dng hm chuyn kiu:
reinterpret_cast<char *>(<D liu>);

Tham s th hai l kch c d liu c ghi vo tp. Kch c ny c tnh theo byte, nn thng thng ta dng ton t:
sizeof(<Kiu d liu>);

Lu : Khi mun c, ghi cc d liu c cu trc (struct) vo tp th ta phi dng ch c/ghi tp nh phn m khng th dng ch c/ghi ch vn bn. Khi c/ghi d liu c kiu cu trc, ton t sizeof() thc hin chnh xc th cc thnh vin ca cu trc khng c l kiu con tr. V ton t sizeof() i vi con tr ch cho kch c ca con tr m khng cho kch c tht ca vng d liu m con tr tr ti. Tn tp tin v s lng bn ghi c ngi dng t nhp vo t bn phm. Chng trnh s ghi vo tp cc bn ghi c cu trc do ngi dng g vo t bn phm.

Chng trnh 4.4 minh ho vic ghi d liu vo tp tin nh phn, d liu l kiu cu trc:

Chng trnh 4.4


#include<stdlib.h> #include<iostream.h> #include<fstream.h> #include<conio.h> #include<type.h> const int length = 25; typedef struct { int day; int month; // Ngy // Thng // di ti a tn tp tin

70

Chng 4: Vo ra trn tp
int year; } Date; typedef struct { char name[20]; Date birthDay; char role[20]; float salary; } Employee; void main(){ clrscr(); char fileName[length]; cout << Ten tep tin: ; cin >> setw(length) >> fileName; int recordNumber; cout << So luong ban ghi: ; cin >> recordNumber; /* M tp tin */ // Khai bo v m tp tin fstream fileOut(fileName, ios::out|ios::binary); if(!fileOut){ exit(1); } /* Ghi d liu vo tp tin */ Employee myEmployee; for(int i=0; i<recordNumber; i++){ cout << Ban ghi thu << i+1 << endl; cout << Name: ; cin >> myEmployee.name; cout << Day of birth: ; cin >> myEmployee.birthDay.day;// Nhp ngy sinh cout << Month of birth: ; cin >> myEmployee.birthDay.month;// Nhp thng sinh cout << Year of birth: ; cin >> myEmployee.birthDay.year;// Nhp nm sinh cout << Role: ; cin >> myEmployee.role; cout << Salary: ; // Nhp chc v // Nhp tn nhn vin // Khng m c tp cout << Khong the tao duoc tep tin << fileName << endl; // Nhp s lng bn ghi // Nhp tn tp tin // S lng bn ghi // Tn tp tin // Tn nhn vin // Ngy sinh ca nhn vin // Chc v ca nhn vin // Lng ca nhn vin // Nm

71

Chng 4: Vo ra trn tp
cin >> myEmployee.salary; // Ghi d liu vo tp fileOut.write(reinterpret_cast<char *>(&myEmployee), sizeof(Employee)); } /* ng tp tin */ fileOut.close(); return; } // ng tp tin // Nhp tin lng

c d liu t tp nh phn bng read


Cc bc thc hin c d liu t mt tp tin nh phn nh sau: 1. M tp tin theo ch c nh phn bng i tng fstream (m tp tin ch ghi):
fstream <Tn bin tp>(<Tn tp tin>, ios::in|ios::binary);

2. c d liu t tp bng thao tc read():


<Tn bin tp>.read(char* <D liu ra>, int <Kch thc d liu>);

3. ng tp tin bng lnh close():


<Tn bin tp>.close();

Chng trnh 4.5 minh ho vic c d liu t tp tin vo bin c cu trc: Tn tp tin c ngi dng t nhp vo t bn phm. Chng trnh s c cc cu trc nhn vin trong tp v hin th ra mn hnh. Chng trnh dng li khi kt thc tp tin.

Chng trnh 4.5


#include<stdlib.h> #include<iostream.h> #include<fstream.h> #include<conio.h> #include<type.h> const int length = 25; typedef struct { int day; int month; int year; } Date; // Ngy // Thng // Nm // di ti a tn tp tin

72

Chng 4: Vo ra trn tp

typedef struct { char name[20]; Date birthDay; char role[20]; float salary; } Employee; void main(){ clrscr(); char fileName[length]; cout << Ten tep tin: ; cin >> setw(length) >> fileName; /* M tp tin */ // Khai bo v m tp tin fstream fileIn(fileName, ios::in|ios::binary); if(!fileIn){ exit(1); } /* c d liu t tp tin ra mn hnh */ Employee myEmployee; while(fileIn){ fileIn.read(reinterpret_cast<char *>(&myEmployee), sizeof(Employee)); cout << myEmployee.name << << myEmployee.birthDay.day << / << myEmployee.birthDay.month << / << myEmployee.birthDay.year << << myEmployee.role << << myEmployee.salary << endl; // Ghi k t ra mn hnh } /* ng tp tin */ fileIn.close(); return; } // ng tp tin // c k t t tp tin // Khng m c tp cout << Khong the mo duoc tep tin << fileName << endl; // Nhp tn tp tin // Tn tp tin // Tn nhn vin // Ngy sinh ca nhn vin // Chc v ca nhn vin // Lng ca nhn vin

73

Chng 4: Vo ra trn tp

4.3 TRUY NHP TP TRC TIP


4.3.1 Con tr tp tin
Con tr tp tin c vai tr nh mt u c tr vo mt v tr xc nh ca tp v thao tc truy nhp tp din ra tun t: Ti mi thi im, con tr tp tin xc nh mt v tr trn tp m ti , thao tc truy nhp tp (c/ghi) c thc hin. Sau thao tc truy nhp, con tr tp t ng chuyn n v tr tip theo da vo kch thc n v d liu c truy nhp.

Cch truy nhp tp tun t c nhc im l bao gi cng phi bt u t u tp tin, i tun t cho n v tr cn truy nhp. Khi tp tin c kch thc ln th cch truy nhp ny rt tn thi gian. trnh nhc im ny, C++ cho php truy nhp trc tip n mt v tr xc nh trn tp tin bng cc php ton: Truy nhp v tr hin ti ca con tr tp tin Dch chuyn con tr tp tin n mt v tr xc nh

4.3.2 Truy nhp v tr hin ti ca con tr tp


C php truy nhp n v tr hin thi ca con tr tp ph thuc vo kiu bin tp ang dng l c hay ghi. Nu bin tp l kiu m tp c ifstream th c php l:
<Tn bin tp>.tellg();

Nu bin tp l kiu m tp ghi ofstream th c php l:


<Tn bin tp>.tellp();

Chng trnh 4.6a minh ho vic xc nh v tr hin thi ca con tr tp sau mt s thao tc c tp trc . Chng trnh 4.6a
#include<stdlib.h> #include<iostream.h> #include<fstream.h> #include<conio.h> const int length = 25; void main(){ clrscr(); char fileName[length], output; cout << Ten tep tin: ; cin >> setw(length) >> fileName; // Nhp tn tp tin // di ti a tn tp tin

74

Chng 4: Vo ra trn tp
/* M tp tin */ ifstream fileIn(fileName, ios::in); // Khai bo v m tp tin if(!fileIn){ exit(1); } /* c d liu t tp tin ra mn hnh * Ghi vi tr con tr tp ra mn hnh c sau 5 ln c k t */ int index = 0; while(fileIn){ fileIn >> output; cout << output; if(index % 5 == 0) // c k t t tp tin // Ghi k t ra mn hnh // Ghi ra v tr con tr tp // Khng m c tp cout << Khong the mo duoc tep tin << fileName << endl;

cout<< endl << Vi tri con tro tep: << fileIn.tellg() << endl; index ++; } cout << endl; /* ng tp tin */ fileIn.close(); return; } // ng tp tin // Xung dng trn mn hnh

Chng trnh 4.6b minh ho vic xc nh v tr hin thi ca con tr tp sau mt s thao tc ghi vo tp trc . Chng trnh 4.6b
#include<stdlib.h> #include<iostream.h> #include<fstream.h> #include<conio.h> const int length = 25; void main(){ clrscr(); char fileName[length], input; cout << Ten tep tin: ; cin >> setw(length) >> fileName; // Nhp tn tp tin // di ti a tn tp tin

75

Chng 4: Vo ra trn tp
/* M tp tin */ ofstream fileOut(fileName, ios::out);// Khai bo v m tp tin if(!fileOut){ exit(1); } /* Ghi d liu vo tp tin * Hin ra mn hnh v tr con tr tp sau khi ghi uc 5 k t*/ int index = 0; do{ cin >> input; fileOut << input << ; if(index%5 == 0) // c k t t bn phm // Ghi k t vo tp tin // Hin th v tr con tr tp // Khng m c tp cout << Khong the tao duoc tep tin << fileName << endl;

cout << Vi tri con tro tep: << fileOut.tellp() << endl; index++; }while((input != e)&&(fileOut)); fileOut << endl; /* ng tp tin */ fileOut.close(); return; } // ng tp tin // Xung dng cui tp tin

4.3.3 Dch chuyn con tr tp


Ngoi vic xc nh v tr hin thi ca con tr tp, C++ cn cho php dch chuyn con tr tp n mt v tr bt k trn tp. C php dch chuyn ph thuc vo kiu bin tp l c hay ghi. Nu bin tp c kiu l m tp tin c ifstream, c php s l:
<Tn bin tp>.seekg(<Kch thc>, <Mc dch chuyn>);

Nu bin tp c kiu l m tp ghi ofstream, c php s l:


<Tn bin tp>.seekp(<Kch thc>, <Mc dch chuyn>);

Trong : Kch thc: l tham s m t khong cch dch chuyn so vi v tr mc dch chuyn. n v tnh ca kch thc l byte, c kiu l s nguyn. Mc dch chuyn: l v tr gc xc nh khong cch dch chuyn ca con tr tp. C ba tham s hng v kiu mc dch chuyn: -

ios::beg: Mc dch chuyn l u tp tin. ios::cur: Mc dch chuyn l v tr hin thi ca con tr tp. ios::end: Mc dch chuyn l v tr cui cng ca tp tin.

76

Chng 4: Vo ra trn tp

V d:
ifstream fileIn(abc.txt, ios::in); fileIn.seekg(sizeof(char)*7, ios::beg);

s dch chuyn con tr tp tin n k t (kiu char) th 7+1 = 8 trong tp tin abc.txt c (gi s tp tin abc.txt lu cc k t kiu char). Lu : V khong cch cch dch chuyn c kiu s nguyn (int) cho nn c th nhn gi tr m hoc dng. Nu gi tr dng, dch chuyn v pha sau v tr lm mc, nu gi tr m, dch chuyn v pha trc v tr lm mc. Nu v tr dch chuyn n nm ngoi phm vi tp tin (pha sau v tr cui cng ca tp hoc pha trc v tr u tin ca tp) s ny sinh li, khi <Tn bin tp> = false.

Chng trnh 4.7 ci t chng trnh truy nhp tp tin trc tip c gi tr k t (kiu char) trong tp: Tn tp tin (cha d liu kiu char) do ngi dng nhp vo t bn phm. Sau , mi khi ngi dng nhp vo mt s nguyn, chng trnh s dch chuyn n v tr mi, cch v tr c ng bng tng y k t, tnh t v tr hin thi ca con tr tp. Chng trnh s kt thc khi ngi dng nhp vo s 0.

Chng trnh 4.7


#include<stdlib.h> #include<iostream.h> #include<fstream.h> #include<conio.h> const int length = 25; void main(){ clrscr(); char fileName[length], output; cout << Ten tep tin: ; cin >> setw(length) >> fileName; /* M tp tin */ ifstream fileIn(fileName, ios::in); // Khai bo v m tp tin if(!fileIn){ exit(1); } /* c d liu t tp tin ra mn hnh * Ghi vi tr con tr tp ra mn hnh c sau 5 ln c k t */ // Khng m c tp cout << Khong the mo duoc tep tin << fileName << endl; // Nhp tn tp tin // di ti a tn tp tin

77

Chng 4: Vo ra trn tp
int index = 1; do{ cout << So ki tu dich chuyen: ; cin >> index; // Dch chuyn con tr tp t v tr hin thi fileIn.seekg(sizeof(char)*index, ios::cur); if(fileIn){ fileIn >> output; // ng // c k t t tp tin

// Ghi k t ra mn hnh cout << Vi tri: << fileIn.tellg() << output; }else{ fileIn.clear(); } }while(index); /* ng tp tin */ fileIn.close(); return; } // ng tp tin // Ra khi phm vi tp // V v tr u tp

TNG KT CHNG 4
Ni dung chng 4 tp trung trnh by cc vn lin quan n cc thao tc trn tp tin trong ngn ng C++. Bao gm: Cc bc tun t khi thao tc vi mt tp tin: M tp tin c/ghi d liu trn tp tin ng tp tin

Thao tc m tp tin vi nhiu ch bng kiu fstream. Thao tc m tp tin ch c vi kiu ifstream Thao tc m tp tin ch ghi vi thao tc ofstream. c d liu t tp tin vn bn vi thao tc >>. Ghi d liu vo tp tin vn bn bng thao tc <<. c tp tin nh phn bng thao tc read(). Ghi vo tp tin nh phn bng thao tc write(). Xc nh v tr hin thi ca con tr tp tin vi cc thao tc tellg() v tellp(). Dch chuyn v tr ca con tr tp vi cc thao tc seekg() v seekp(). Thit lp li trng thi cho con tr tp tin bng thao tc clear().

78

Chng 4: Vo ra trn tp

ng tp tin s dng bng thao tc close().

CU HI V BI TP CHNG 4
1. Mun m mt tp tin tn l abc.txt c d liu, lnh m tp no sau y l ng: a. fstream b. fstream c. d.
myFile(abc.txt, ios::in); myFile(abc.txt, ios::out);

fstream myFile(abc.txt, ios::app); fstream myFile(abc.txt, ios::ate);

2. Mun m mt tp tin abc.txt nm trong th mc xyz ghi d liu vo. Lnh m no sau y l ng: a. fstream b. fstream c. d.
myFile(xyz\abc.txt, ios::out); myFile(xyz\\abc.txt, ios::out);

fstream myFile(xyz/abc.txt, ios::out); fstream myFile(xyz//abc.txt, ios::out);

3. Mun m mt tp tin abc.txt ghi thm d liu vo cui tp, lnh no sau y l ng: a. fstream b. fstream c. d.
myFile(abc.txt, ios::out); myFile(abc.txt, ios::app);

fstream myFile(abc.txt, ios::out|ios::app); fstream myFile(abc.txt, ios::out||ios::app);

4. Xt hai lnh khai bo sau:


fstream myFile1(abc.txt, ios::out); ofstream myFile2(abc.txt, ios::out);

Nhn nh no sau y l ng: a. myFile1 v myFile2 c chc nng ging nhau. b. myFile1 v myFile2 c chc nng khc nhau 5. Xt hai lnh khai bo sau:
fstream myFile1(abc.txt, ios::in); ifstream myFile2(abc.txt, ios::in);

Nhn nh no sau y l ng: a. myFile1 v myFile2 c chc nng ging nhau. b. myFile1 v myFile2 c chc nng khc nhau 6. Xt on chng trnh sau:
ofstream myFile(abc.txt, ios::out); if(myFile) myFile << abc.txt;

Chng trnh s lm g? a. Ghi ra mn hnh dng ch abc.txt b. Ghi vo tp tin abc.txt dng ch abc.txt c. c t tp tin abc.txt dng ch abc.txt

79

Chng 4: Vo ra trn tp

d. Chng trnh s bo li. 7. Xt on chng trnh sau:


ifstream myFile(abc.txt, ios::in); char text[20]; if(myFile) myFile >> text;

Chng trnh s lm g, nu tp tin abc.txt c ni dung l dng ch abc.txt? a. Ghi ra mn hnh dng ch abc.txt b. Ghi vo tp tin abc.txt dng ch abc.txt c. c t tp tin abc.txt dng ch abc.txt d. Chng trnh s bo li. 8. Xt on chng trnh sau:
fstream myFile(abc.txt, ios::out); if(myFile) myFile << abc.txt; myFile.close(); myFile.open(abc.txt, ios::in); char text[20]; if(myFile) myFile >> text; cout << text;

Chng trnh s lm g, nu tp tin abc.txt c ni dung l dng ch abc.txt? a. Ghi vo tp tin abc.txt dng ch abc.txt b. c t tp tin abc.txt dng ch abc.txt c. Ghi ra mn hnh dng ch abc.txt d. C ba p n trn. e. Chng trnh s bo li. 9. Xt on chng trnh sau:
ifstream myFile(abc.txt, ios::in); if(myFile) cout << myFile.tellg();

Chng trnh s in ra mn hnh kt qu g? a. 0 b. 1 c. 8 d. 16 10. Xt on chng trnh sau, nu tp abc.txt cha mt s lng k t ln:
ifstream myFile(abc.txt, ios::in); if(myFile){ char c; myFile >> c; cout << myFile.tellg(); }

Chng trnh s in ra mn hnh kt qu g? a. 0

80

Chng 4: Vo ra trn tp

b. 1 c. 8 d. 16 11. Xt on chng trnh sau, nu tp abc.txt cha mt s lng k t ln:


ifstream myFile(abc.txt, ios::in); if(myFile){ myFile.seekg(sizeof(char)*5, ios::beg); myFile.seekg(sizeof(char)*5, ios::cur); cout << myFile.tellg(); }

Chng trnh s in ra mn hnh kt qu g? a. 0 b. 5 c. 10 d. 80 12. Vit mt chng trnh gp ni dung ca hai tp tin c sn vo mt tp tin th ba. Tn cc tp tin c nhp vo t bn phm. 13. Vit mt chng trnh tm kim trn tp nh phn c cu trc c to bi chng trnh 4.4: Tm tt c cc nhn vin c tn l X, X c nhp t bn phm. Hin th kt qu l tt c cc thng tin v cc nhn vin c tm thy. 14. Vit mt chng trnh tm kim trn tp nh phn c cu trc c to bi chng trnh 4.4: Tm tt c cc nhn vin c nm sinh l X, X c nhp t bn phm. Hin th kt qu l tt c cc thng tin v cc nhn vin c tm thy. 15. Vit mt chng trnh tm kim trn tp nh phn c cu trc c to bi chng trnh 4.4: Tm tt c cc nhn vin c lng cao hn hoc bng mt gi tr X, X c nhp t bn phm. Hin th kt qu l tt c cc thng tin v cc nhn vin c tm thy. 16. Vit mt chng trnh sao chp mt on u ni dung ca mt tp tin vo mt tp tin th hai. Tn cc tp tin v di on ni dung cn sao chp c nhp t bn phm. 17. Vit mt chng trnh sao chp mt on cui ni dung ca mt tp tin vo mt tp tin th hai. Tn cc tp tin v di on ni dung cn sao chp c nhp t bn phm.

81

Chng 5: Lp

CHNG 5 LP
Ni dung chng ny tp trung trnh by cc vn lin quan n lp i tng trong C++: Khi nim, khai bo v s dng lp Khai bo v s dng cc thnh phn ca lp: cc thuc tnh v cc phng thc ca lp Phm vi truy nhp lp Khai bo v s dng cc phng thc khi to v hu b ca lp S dng lp thng qua con tr i tng, mng cc i tng.

5.1 KHI NIM LP I TNG


C++ coi lp l s tru tng ha cc i tng, l mt khun mu biu din cc i tng thng qua cc thuc tnh v cc hnh ng c trng ca i tng.

5.1.1 nh ngha lp i tng


nh ngha mt lp trong C++, ta dng t kha class vi c php:
class <Tn lp>{ };

Trong : V d:
class Car{ };

class: l tn t kha bt buc nh ngha mt lp i tng trong C++. Tn lp: do ngi dng t nh ngha. Tn lp c tnh cht nh tn kiu d liu s dng sau ny. Cch t tn lp phi tun th theo quy tc t tn bin trong C++.

l nh ngha mt lp xe t (Car). Lp ny cha c bt k mt thnh phn no, vic nh ngha cc thnh phn cho lp s c trnh by trong mc 5.2. Lu : T kha class l bt buc nh ngha mt lp i tng trong C++. Hn na, C++ c phn bit ch hoa ch thng trong khai bo cho nn ch class phi c vit bng ch thng. V d:
class Car{ }; // nh ngha ng

nhng:
Class Car{ }; // Li t kha

82

Chng 5: Lp

Bt buc phi c du chm phy ; cui nh ngha lp v C++ coi nh ngha mt lp nh nh ngha mt kiu d liu, cho nn phi c du chm phy cui nh ngha (tng t nh ngha kiu d liu kiu cu trc). phn bit vi tn bin thng thng, ta nn (nhng khng bt buc) t tn lp bt u bng mt ch in hoa v cc tn bin bt u bng mt ch in thng.

5.1.2 S dng lp i tng


Lp i tng c s dng khi ta khai bo cc th hin ca lp . Mt th hin ca mt lp chnh l mt i tng c th ca lp . Vic khai bo mt th hin ca mt lp c thc hin nh c php khai bo mt bin c kiu lp:
<Tn lp> <Tn bin lp>;

Trong : Tn lp: l tn lp i tng c nh ngha trc khi khai bo bin. Tn bin lp: l tn i tng c th. Tn bin lp s c s dng nh cc bin thng thng trong C++, ngoi tr vic n c kiu lp i tng.

V d, mun khai bo mt th hin (bin) ca lp Car c nh ngha trong mc 5.1.1, ta khai bo nh sau:
Car myCar;

Sau , ta c th s dng bin myCar trong chng trnh nh cc bin thng thng: truyn tham s cho hm, gn cho bin khc Lu : Khi khai bo bin lp, ta khng dng li t kha class na. T kha class ch c s dng khi nh ngha lp m khng dng khi khai bo bin lp.
Car myCar; // ng // Li c php

V d, khai bo: l ng, nhng khai bo:


class Car myCar;

l sai c php.

5.2 CC THNH PHN CA LP


Vic khai bo cc thnh phn ca lp c dng nh sau:
class <Tn lp>{ private: <Khai bo cc thnh phn ring> protected: <Khai bo cc thnh phn c bo v> public: <Khai bo cc thnh phn cng cng> };

Trong :

83

Chng 5: Lp

private: l t kha ch tnh cht ca C++ ch ra rng cc thnh phn c khai bo trong phm vi t kha ny l ring t i vi lp i tng. Cc i tng ca cc lp khc khng truy nhp c cc thnh phn ny. protected: cc thnh phn c khai bo trong phm vi t kha ny u c bo v. Qui nh loi i tng no c truy nhp n cc thnh phn c bo v s c m t chi tit trong mc 5.3. public: cc thnh phn cng cng. Cc i tng ca cc lp khc u c th truy nhp n cc thnh phn cng cng ca mt i tng bt k. Cc thnh phn ch d liu ca lp, c gi l thuc tnh ca lp Cc thnh phn ch hnh ng ca lp, c gi l phng thc ca lp.

Cc thnh phn ca lp c chia lm hai loi:

5.2.1 Thuc tnh ca lp Khai bo thuc tnh


Thuc tnh ca lp l thnh phn cha d liu, c trng cho cc tnh cht ca lp. Thuc tnh ca lp c khai bo theo c php sau:
<Kiu d liu> <Tn thuc tnh>;

Trong : Kiu d liu: c th l cc kiu d liu c bn ca C++, cng c th l cc kiu d liu phc tp do ngi dng t nh ngha nh struct, hoc kiu l mt lp c nh ngha trc . Tn thuc tnh: l tn thuc tnh ca lp, c tnh cht nh mt bin thng thng. Tn thuc tnh phi tun theo quy tc t tn bin ca C++.
class Car{ private: int speed; public: char mark[20]; };

V d, khai bo:

l khai bo mt lp xe t (Car), c hai thuc tnh: thuc tnh tc (speed) c tnh cht private, thuc tnh nhn hiu xe (mark) c tnh cht public. Lu : Khng c khi to gi tr ban u cho cc thuc tnh ngay trong lp. V cc thuc tnh ch c gi tr khi n gn vi mt i tng c th, l mt th hin (bin) ca lp. V d:
class Car{ private: int speed; // ng int weight = 500; // li

84

Chng 5: Lp
};

Kh nng truy nhp thuc tnh ca lp l ph thuc vo thuc tnh y c khai bo trong phm vi ca t kha no: private, protected hay public. Thng thng, do yu cu ng gi d liu ca hng i tng, ta nn khai bo cc thuc tnh c tnh cht ring t (ptivate). Nu mun cc i tng khc truy nhp c vo cc thuc tnh ny, ta xy dng cc hm public truy nhp (get / set) n thuc tnh .

S dng thuc tnh


Thuc tnh c th c s dng cho cc chng trnh nm ngoi lp thng qua tn bin lp hoc s dng ngay trong lp bi cc phng thc ca lp. Nu thuc tnh c dng bn ngoi phm vi lp, c php phi thng qua tn bin lp (cch ny ch s dng c vi cc bin c tnh cht public):
<Tn bin lp>.<tn thuc tnh>;

Nu thuc tnh c dng bn trong lp, c php n gin hn:


<Tn thuc tnh>;

V d, vi nh ngha lp:
class Car{ private: int speed; public: char mark[20]; };

ta khai bo mt bin lp:


Car myCar;

Th c th s dng thuc tnh nhn hiu xe khi in ra mn hnh nh sau:


cout << myCar.mark;

Lu : Khi dng thuc tnh bn trong cc phng thc ca lp, m tn thuc tnh li b trng vi tn bin ton cc (t do) ca chng trnh, ta phi ch r vic dng tn thuc tnh ca lp (m khng phi tn bin ton cc) bng cch dng ch th phm vi lp :: vi c php:
<Tn lp>::<Tn thuc tnh>;

5.2.2 Phng thc ca lp Khai bo khun mu phng thc


Mt phng thc l mt thao tc thc hin mt s hnh ng c trng ca lp i tng. Phng thc c khai bo tng t nh cc hm trong C++:
<Kiu tr v> <Tn phng thc>([<Cc tham s>]);

Trong : Kiu tr v: l kiu d liu tr v ca phng thc. Kiu c th l cc kiu d liu c bn ca C++, cng c th l kiu do ngi dng nh ngha, hoc kiu lp c nh ngha.

85

Chng 5: Lp

Tn phng thc: do ngi dng t t tn, tun theo quy tc t tn bin ca C++. Cc tham s: Cc tham s u vo ca phng thc, c biu din bng kiu d liu tng ng. Cc tham s c phn cch bi du phy ,. Cc tham s l ty chn (Phn trong du ngoc vung [] l ty chn).
class Car{ private: int speed; char mark[20]; public: void show(); };

V d, khai bo:

l nh ngha mt lp Car c hai thuc tnh cc b l speed v mark, v khai bo mt phng thc show() m t i tng xe tng ng. Show() l mt phng thc khng cn tham s v kiu tr v l void. Lu : Kh nng truy nhp phng thc t bn ngoi l ph thuc vo phng thc c khai bo trong phm vi ca t kha no: private, protected hay public.

nh ngha phng thc


Trong C++, vic ci t chi tit ni dung ca phng thc c th tin hnh ngay trong phm vi lp hoc bn ngoi phm vi nh ngha lp. C php ch khc nhau dng khai bo tn phng thc. Nu ci t phng thc ngay trong phm vi nh ngha lp, c php l:
<Kiu tr v> <Tn phng thc>([<Cc tham s>]){ // Ci t chi tit }

Nu ci t phng thc bn ngoi phm vi nh ngha lp, ta phi dng ch th phm vi :: ch ra rng y l mt phng thc ca lp m khng phi l mt hm t do trong chng trnh:
<Kiu tr v> <Tn lp>::<Tn phng thc>([<Cc tham s>]){ // Ci t chi tit }

V d, nu ci t phng thc show() ca lp Car ngay trong phm vi nh ngha lp, ta ci t nh sau:
class Car{ private: int char public: void show(){ // Khai bo phng thc ngay trong lp cout << This is a << mark << having a speed of speed; mark[20]; // Tc // Nhn hiu

86

Chng 5: Lp
<< speed << km/h! << endl; return; } };

Nu mun ci t bn ngoi lp, ta ci t nh sau:


class Car{ private: int char public: void show(); }; /* Khai bo phng thc bn ngoi lp */ void Car::show(){ cout << This is a << mark << having a speed of << speed << km/h! << endl; return; } // Gii thiu xe speed; mark[20]; // Tc // Nhn hiu

Lu : Nu phng thc c ci t ngay trong lp th cc tham s phi tng minh, ngha l mi tham s phi c biu din bng mt cp <Kiu d liu> <Tn tham s> nh khi ci t chi tit mt hm t do trong chng trnh. Thng thng, ch cc phng thc ngn (trn mt dng) l nn ci t ngay trong lp. Cn li nn ci t cc phng thc bn ngoi lp chng trnh c sng sa, r rng v d theo di.

S dng phng thc


Cng tng t nh cc thuc tnh ca lp, cc phng thc cng c th c s dng bn ngoi lp thng qua tn bin lp, hoc c th c dng ngay trong lp bi cc phng thc khc ca lp nh ngha n. Nu phng thc c dng bn ngoi phm vi lp, c php phi thng qua tn bin lp (cch ny ch s dng c vi cc phng thc c tnh cht public):
<Tn bin lp>.<Tn phng thc>([<Cc i s>]);

Nu thuc tnh c dng bn trong lp, c php n gin hn:


<Tn phng thc>([<Cc i s>]);

V d, vi nh ngha lp:
class Car{ private: int char public: void show(); // Gii thiu xe speed; mark[20]; // Tc // Nhn hiu

87

Chng 5: Lp
}; /* Khai bo phng thc bn ngoi lp */ void Car::show(){ cout << This is a << mark << having a speed of << speed << km/h! << endl; return; }

ta khai bo mt bin lp:


Car myCar;

Th c th s dng phng thc gii thiu xe nh sau:


myCar.show();

Lu : Khi dng phng thc bn trong cc phng thc khc ca lp, m phng thc li b trng vi cc phng thc t do ca chng trnh, ta phi ch r vic dng phng thc ca lp (m khng phi dng phng thc t do) bng cch dng ch th phm vi lp :: vi c php:
<Tn lp>::<Tn phng thc>([<Cc i s>]);

Chng trnh 5.1 ci t y mt lp xe t (Car) vi cc thuc tnh c tnh cht cc b: Tc xe (speed) Nhn hiu xe (mark) Gi xe (price) Khi to cc tham s (init) Gii thiu xe (show) Cc phng thc truy nhp (get/set) cc thuc tnh

V cc phng thc c tnh cht public:

Sau , chng trnh main s s dng lp Car ny nh ngha cc i tng c th v s dng cc phng thc ca lp ny. Chng trnh 5.1
#include<stdio.h> #include<conio.h> #include<string.h> /* nh ngha lp */ class Car{ private: int char public: void setSpeed(int); // Gn tc cho xe speed; mark[20]; // Tc // Nhn hiu // Gi xe

float price;

88

Chng 5: Lp
int void void void void }; /* Khai bo phng thc bn ngoi lp */ void Car::setSpeed(int speedIn){ speed = speedIn; } int Car::getSpeed(){ return speed; } void Car::setMark(char markIn){ strcpy(mark, markIn); } char[] Car::getMark(){ return mark; } void Car::setPrice(float priceIn){ price = priceIn; } float Car::getPrice(){ return price; } void Car::init(int speedIn, char markIn[], float priceIn){ speed = speedIn; strcpy(mark, markIn); price = priceIn; return; } void Car::show(){ // Phng thc gii thiu xe // c gi xe // Gn gi cho xe // c nhn xe // Gn nhn cho xe // c tc xe // Gn tc cho xe getSpeed(); setMark(char); setPrice(float); // c tc xe // Gn nhn cho xe // c nhn xe // Gn gi cho xe // c gi xe // Gii thiu xe

char[] getMark(); float getPrice(); show();

init(int, char[], float);// Khi to thng tin v xe

cout << This is a << mark << having a speed of << speed << km/h and its price is $ << price << endl; return; } // Hm main, chng trnh chnh

89

Chng 5: Lp
void main(){ clrscr(); Car myCar; // Khi to ln th nht cout << Xe thu nhat: << endl; myCar.init(100, Ford, 3000); cout << Toc do (km/h): << myCar.getSpeed() << endl; cout << Nhan hieu : << myCar.getMark() << endl; cout << Gia ($): << myCar.getPrice() << endl; // Thay i thuc tnh xe cout << Xe thu hai: << endl; myCar.setSpeed(150); myCar.setMark(Mercedes); myCar.setPrice(5000); myCar.show(); return; } // Khai bo bin lp

Chng trnh 5.1 s in ra kt qu nh sau:


Xe thu nhat: Toc do (km/h): 100 Nhan hieu: Ford Gia ($): 3000 Xe thu hai: This is a Mercedes having a speed of 150km/h and its price is $5000

5.3 PHM VI TRUY NHP LP


5.3.1 Phm vi truy nhp lp
Trong C++, c mt s khi nim v phm vi, xp t b n ln nh sau: Phm vi khi lnh: Trong phm vi gia hai du gii hn {} ca mt khi lnh. V d cc lnh trong khi lnh lp while(){} s c cng phm vi khi lnh. Phm vi hm: Cc lnh trong cng mt hm c cng mc phm vi hm. Phm vi lp: Cc thnh phn ca cng mt lp c cng phm vi lp vi nhau: cc thuc tnh v cc phng thc ca cng mt lp. Phm vi chng trnh (cn gi l phm vi tp): Cc lp, cc hm, cc bin c khai bo v nh ngha trong cng mt tp chng trnh th c cng phm vi chng trnh.

90

Chng 5: Lp

Trong phm vi truy nhp lp, ta ch quan tm n hai phm vi ln nht, l phm vi lp v phm vi chng trnh. Trong C++, phm vi truy nhp lp c quy nh bi cc t kha v thuc tnh truy nhp: private: Cc thnh phn ca lp c thuc tnh private th ch c th c truy nhp trong phm vi lp. protected: Trong cng mt lp, thuc tnh protected cng c nh hng tng t nh thuc tnh private: cc thnh phn lp c thuc tnh protected ch c th c truy nhp trong phm vi lp. Ngoi ra n cn c th c truy nhp trong cc lp con khi c k tha (s c trnh by trong chng 6). public: cc thnh phn lp c thuc tnh public th c th c truy nhp trong phm vi chng trnh, c ngha l n c th c truy nhp trong cc hm t do, cc phng thc bn trong cc lp khc

V d, thuc tnh price ca lp Car c tnh cht private nn ch c th truy nhp bi cc phng thc ca lp Car. Khng th truy nhp t bn ngoi lp (phm vi chng trnh), chng hn trong mt hm t do ngoi lp Car.
void Car::setPrice(float priceIn){ price = priceIn; } // ng, v setPrice l mt phng thc // ca lp Car

nhng:
void freeFunction(Car myCar){ myCar.price = 3000;// Li, v freeFunction l mt hm t do // nm ngoi phm vi lp Car }

Khi , hm freeFunction phi truy nhp gin tip n thuc tnh price thng qua phng thc truy nhp c tnh cht public nh sau:
void freeFunction(Car myCar){ myCar.setPrice(3000);// ng, v setPrice l mt phng thc ca // lp Car c thuc tnh public }

Tuy nhin, C++ cho php mt cch c bit truy nhp n cc thnh phn private v protected ca mt lp bng khi nim hm bn v lp bn ca mt lp: trong cc hm bn v lp bn ca mt lp, c th truy nhp n cc thnh phn private v protected nh bn trong phm vi lp .

5.3.2 Hm bn
C hai kiu hm bn c bn trong C++: Mt hm t do l hm bn ca mt lp Mt hm thnh phn (phng thc) ca mt lp l bn ca mt lp khc Mt hm l bn ca nhiu lp

Ngoi ra cn c mt s kiu hm bn m rng t hai kiu ny:

91

Chng 5: Lp

Tt c cc hm ca mt lp l bn ca lp khc (lp bn)

Hm t do bn ca mt lp
Mt hm bn ca mt lp c khai bo bng t kha friend khi khai bo khun mu hm trong lp tng ng.
class <Tn lp>{ // Khai bo cc thnh phn lp nh thng thng // Khai bo hm bn friend <Kiu tr v> <Tn hm bn>([<Cc tham s>]); };

Khi , nh ngha chi tit hm bn c thc hin nh nh ngha mt hm t do thng thng:


<Kiu tr v> <Tn hm bn>([<Cc tham s>]){ } // C th truy nhp trc tip cc thnh phn private // ca lp khai bo

Lu : Mc d hm bn c khai bo khun mu hm trong phm vi lp, nhng hm bn t do li khng phi l mt phng thc ca lp. N l hm t do, vic nh ngha v s dng hm ny hon ton tng t nh cc hm t do khc. Vic khai bo khun mu hm bn trong phm vi lp v tr no cng c: hm bn khng b nh hng bi cc t kha private, protected hay public trong lp. Trong hm bn, c th truy nhp trc tip n cc thnh phn private v protected ca i tng c kiu lp m n lm bn (truy nhp thng qua i tng c th).

Chng trnh 5.2 minh ha vic nh ngha mt hm bn ca lp Car, hm ny so snh xem hai chic xe, chic no t hn. Chng trnh 5.2
#include<stdio.h> #include<conio.h> #include<string.h> /* nh ngha lp */ class Car{ private: int char public: void init(int, char[], float);// Khi to thng tin v xe // Khai bo hm bn ca lp friend void moreExpensive(Car, Car); }; speed; mark[20]; // Tc // Nhn hiu // Gi xe

float price;

92

Chng 5: Lp

/* Khai bo phng thc bn ngoi lp */ void Car::init(int speedIn, char markIn[], float priceIn){ speed = speedIn; strcpy(mark, markIn); price = priceIn; return; } /* nh ngha hm bn t do */ void moreExpensive(Car car1, Car car2){ if(car1.price > car2.price)//Truy nhp n cc thuc tnh private cout << xe thu nhat dat hon << endl; else if(car1.price < car2.price) cout << xe thu nhat dat hon << endl; else cout << hai xe dat nhu nhau << endl; return; } // Hm main, chng trnh chnh void main(){ clrscr(); Car car1, car2; // Khi to xe th nht, th hai car1.init(100, Ford, 3000); car2.init(150, Mercedes, 3500); // So snh gi hai xe moreExpensive(car1, car2); return; } // S dng hm bn t do // Khai bo bin lp

Chng trnh 5.2 s in ra thng bo:


xe thu hai dat hon

v xe th hai c gi $3500, trong khi xe th nht c khi to gi l $3000.

Phng thc lp l bn ca mt lp khc


Trong C++, mt phng thc ca lp ny cng c th lm bn ca mt lp kia. khai bo mt phng thc f ca lp B l bn ca lp A v f nhn mt tham s c kiu lp A, ta phi khai bo tun t nh sau (trong cng mt chng trnh): Khai bo khun mu lp A, lm tham s cho hm f ca lp B:

93

Chng 5: Lp
class A;

Khai bo lp B vi hm f nh khai bo cc lp thng thng:


class B{ }; // Khai bo cc thnh phn khc ca lp B void f(A);

Khai bo chi tit lp A vi hm f ca lp B l bn


class A{ }; // Khai bo cc thnh phn khc ca lp A friend void B::f(A);

nh ngha chi tit hm f ca lp B:


void B::f(A){ } // nh ngha chi tit hm f

Lu : Trong trng hp ny, hm f ch c nh ngha chi tit mt khi lp A c nh ngha chi tit. Do vy, ch c th nh ngha chi tit hm f ngay trong lp A ( bc 3) hoc sau khi nh ngha lp A ( bc 4), m khng th nh ngha chi tit hm f ngay trong lp B ( bc 2). Hm f c th truy nhp n cc thnh phn private v protected ca c hai lp A v B. Tuy nhin, mun f truy nhp n cc thnh phn ca lp A th phi thng qua mt i tng c th c kiu lp A.

Chng trnh 5.3 minh ha vic ci t v s dng mt hm permission() ca lp Person, l hm bn ca lp Car. Hm ny thc hin vic kim tra xem mt ngi c quyn iu khin xe hay khng, theo lut sau: Vi cc loi xe thng thng, ngi iu khin phi 18 tui. Vi cc loi xe c tc cao hn 150km/h, ngi iu khin phi 21 tui.

Chng trnh 5.3


#include<stdio.h> #include<conio.h> #include<string.h> class Car; /* nh ngha lp Person */ class Person{ private: char int name[25]; age; // Tn // Tui // Khai bo nguyn mu lp

94

Chng 5: Lp
public: void init(char[], int); int permission(Car); }; /* nh ngha lp Car */ class Car{ private: int char public: void init(int, char[], float);// Khi to thng tin v xe // Khai bo hm bn ca lp friend int Person::permission(Car); }; /* Khai bo phng thc bn ngoi lp */ void Person::init(char nameIn[], int ageIn){ strcpy(name, nameIn); age = ageIn; return; } void Car::init(int speedIn, char markIn[], float priceIn){ speed = speedIn; strcpy(mark, markIn); price = priceIn; return; } /* nh ngha hm bn */ int Person::permission(Car car){ if(age < 18) return 0; //Truy nhp thuc tnh private thng qua i tng car if((age < 21)&&(car.speed > 150)) return 0; return 1; } // Hm main, chng trnh chnh void main(){ speed; mark[20]; // Tc // Nhn hiu // Gi xe // Khi to thng tin v ngi // Xc nh quyn iu khin xe

float price;

95

Chng 5: Lp
clrscr(); // Khai bo cc bin lp Car car; Person person; // Khi to cc i tng car.init(100, Ford, 3000); person.init(Vinh, 20); // Xc nh quyn iu khin xe if(person.permission(car)) else cout << Khong co quyen dieu khien << endl; return; } // S dng hm bn cout << Co quyen dieu khien << endl;

Chng trnh 5.3 s hin th thng bo:


Co quyen dieu khien

V ngi ch xe 20 tui v xe ch c tc 100km/h.

5.3.3 Lp bn
Khi tt cc cc phng thc ca mt lp l bn ca mt lp khc, th lp ca cc phng thc cng tr thnh lp bn ca lp kia. Mun khai bo mt lp B l lp bn ca lp A, ta khai bo theo tun t sau: Khai bo khun mu lp B:
class B;

nh ngha lp A, vi khai bo B l lp bn:


class A{ // Khai bo cc thnh phn ca lp A // Khai bo lp bn B friend class B; };

nh ngha chi tit lp B:


class B{ }; // Khai bo cc thnh phn ca lp B

Lu : Trong trng hp ny, lp B l lp bn ca lp A nhng khng c ngha l lp A cng l bn ca lp B: tt c cc phng thc ca lp B c th truy nhp cc thnh phn private ca lp A (thng qua cc i tng c kiu lp A) nhng cc phng thc ca lp A li khng th truy nhp n cc thnh phn private ca lp B.

96

Chng 5: Lp

Mun cc phng thc ca lp A cng truy nhp c n cc thnh phn private ca lp B, th phi khai bo thm l lp A cng l lp bn ca lp B.

5.4 HM KHI TO V HU B
5.4.1 Hm khi to
Hm khi to c gi mi khi khai bo mt i tng ca lp. Ngay c khi khng c khai bo tng minh, C++ cng gi hm khi to ngm nh khi i tng c khai bo.

Khai bo hm khi to
Hm khi to ca mt lp c khai bo tng minh theo c php sau:
class <Tn lp>{ public: <Tn lp>([<Cc tham s>]); }; // Khai bo hm khi to

V d:
class Car{ int char public: Car(int speedIn, char markIn[], float priceIn){ speed = speedIn; strcpy(mark, markIn); price = priceIn; } }; speed; mark[20];

float price;

l khai bo mt hm khi to vi ba tham s ca lp Car. Lu : Hm khi to phi c tn trng vi tn ca lp Hm khi to khng c gi tr tr v Hm khi to c tnh cht public C th c nhiu hm khi to ca cng mt lp

S dng hm khi to ca lp
Hm khi to c s dng khi khai bo bin lp. Khi , ta c th va khai bo, va khi to gi tr cc thuc tnh ca i tng lp theo c php sau:
<Tn lp> <Tn i tng>([<Cc i s khi to>]);

Trong : Tn lp: l tn kiu lp c nh ngha Tn i tng: l tn bin c kiu lp, tun th theo quy tc t tn bin ca C++

97

Chng 5: Lp

Cc i s khi to: L cc i s tng ng vi hm khi to ca lp tng ng. Tng t nh vic truyn i s khi dng cc li gi hm thng thng.

V d, nu lp Car c hm khi to Car(int, char[], float) th khi khai bo bin c kiu lp Car, ta c th s dng hm khi to ny nh sau:
Car myCar(100, Ford, 3000);

Lu : Khi s dng hm khi to, phi truyn ng s lng v ng kiu ca cc tham s ca cc hm khi to c nh ngha ca lp. Khi mt lp c t nht mt hm khi to tng minh, th khng c s dng hm khi to ngm nh ca C++. Do , khi khai bo t nht mt hm khi to, nu mun khai bo bin m khng cn tham s, lp tng ng phi c t nht mt hm khi to khng c tham s. V d, nu lp Car ch c duy nht mt hm khi to nh sau:
class Car{ public: Car(int, char[], float); };

th khng th khai bo mt bin nh sau:


Car myCar; // Khai bo li

Trong trng hp dng hm khi to khng c tham s, ta khng cn phi s dng cp du ngoc n () sau tn bin i tng. Vic khai bo tr thnh cch khai bo thng thng.

Chng trnh 5.4a minh ha vic nh ngha v s dng lp Car vi hai hm khi to khc nhau. Chng trnh 5.4a
#include<stdio.h> #include<conio.h> #include<string.h> /* nh ngha lp */ class Car{ private: int char public: Car(); void }; show(); // Khi to khng tham s // Gii thiu xe Car(int, char[], float);// Khi to y tham s speed; mark[20]; // Tc // Nhn hiu // Gi xe

float price;

98

Chng 5: Lp
/* Khai bo phng thc bn ngoi lp */ Car::Car(){ speed = 0; strcpy(mark, ); price = 0; } // Khi to c y tham s Car::Car(int speedIn, char markIn[], float priceIn){ speed = speedIn; strcpy(mark, markIn); price = priceIn; } void Car::show(){ // Phng thc gii thiu xe // Khi to khng tham s

cout << This is a << mark << having a speed of << speed << km/h and its price is $ << price << endl; return; } // Hm main, chng trnh chnh void main(){ clrscr(); Car myCar1; // S dng hm khi to khng tham s Car myCar2(150, Mercedes, 5000);// Dng hm khi to tham s // Gii thiu xe th nht cout << Xe thu nhat: << endl; myCar1.show(); // Gii thiu xe th hai cout << Xe thu hai: << endl; myCar2.show(); return; }

Chng trnh 5.4a s hin th cc thng tin nh sau:


Xe thu nhat: This is a having a speed of 0km/h and its price is $0 Xe thu hai: This is a Mercedes having a speed of 150km/h and its price is $5000

99

Chng 5: Lp

L do l xe th nht s dng hm khi to khng c tham s nn xe khng c tn, tc v gi u l mc nh (0). Trong khi , xe th hai c khi to y c ba tham s nn thng tin gii thiu xe c y . Tuy nhin, khi i tng c nhiu thuc tnh ring, trnh trng hp phi nh ngha nhiu hm khi to cho cc trng hp thiu vng mt vi tham s khc nhau. Ta c th s dng hm khi to vi cc gi tr khi u ngm nh. Chng trnh 5.4b cho kt qu hon ton ging chng trnh 5.4a, nhng n gin hn v ch cn nh ngha mt hm khi to vi cc tham s c gi tr ngm nh. Chng trnh 5.4b
#include<stdio.h> #include<conio.h> #include<string.h> /* nh ngha lp */ class Car{ private: int char public: // Khi to vi cc gi tr ngm inh cho cc tham s Car(int speedIn=0, char markIn[]=, float priceIn=0); void }; /* Khai bo phng thc bn ngoi lp */ Car::Car(int speedIn, char markIn[], float priceIn){ speed = speedIn; strcpy(mark, markIn); price = priceIn; } void Car::show(){ // Phng thc gii thiu xe show(); // Gii thiu xe speed; mark[20]; // Tc // Nhn hiu // Gi xe

float price;

cout << This is a << mark << having a speed of << speed << km/h and its price is $ << price << endl; return; } // Hm main, chng trnh chnh void main(){ clrscr(); Car myCar1; // Cc tham s nhn gi tr mc nh

100

Chng 5: Lp
Car myCar2(150, Mercedes, 5000);// Dng hm khi to tham s // Gii thiu xe th nht cout << Xe thu nhat: << endl; myCar1.show(); // Gii thiu xe th hai cout << Xe thu hai: << endl; myCar2.show(); return; }

5.4.2 Hm hy b
Hm hy b c t ng gi n khi m i tng c gii phng khi b nh. Nhim v ca hm hy b l dn dp b nh trc khi i tng b gii phng. C php khai bo hm hy b nh sau:
class <Tn lp>{ public: ~<Tn lp>([<Cc tham s>]); }; // Khai bo hm khi to

V d:
class Car{ int char public: ~Car(){ delete [] mark; }; }; speed; *mark;

float price;

l khai bo mt hm hy b ca lp Car vi thuc tnh mark c kiu con tr. Hm ny s gii phng vng nh cp pht cho con tr kiu char ca thuc tnh nhn hiu xe. Lu : Hm hy b phi c tn bt u bng du ~, theo sau l tn ca lp tng ng. Hm hy b khng c gi tr tr v. Hm hy b phi c tnh cht public Mi lp ch c nhiu nht mt hm hy b. Trong trng hp khng khai bo tng minh hm hy b, C++ s s dng hm hy b ngm nh.

101

Chng 5: Lp

Ni chung, khi c t nht mt trong cc thuc tnh ca lp l con tr, th nn dng hm hy b tng minh gii phng trit cc vng nh ca cc thuc tnh, trc khi i tng b gii phng khi b nh.

Chng trnh 5.5 minh ha vic nh ngha lp Car vi mt hm khi to c cc tham s vi gi tr mc nh v mt hm hy b tng minh. Chng trnh 5.5
#include<stdio.h> #include<conio.h> #include<string.h> /* nh ngha lp */ class Car{ private: int char public: // Khi to vi cc gi tr ngm inh cho cc tham s Car(int speedIn=0, char *markIn=NULL, float priceIn=0); void }; /* Khai bo phng thc bn ngoi lp */ Car::Car(int speedIn, char *markIn, float priceIn){ speed = speedIn; mark = markIn; price = priceIn; } void Car::show(){ // Phng thc gii thiu xe show(); // Gii thiu xe // Hm hy b tng minh ~Car(); speed; *mark; // Tc // Nhn hiu // Gi xe

float price;

cout << This is a << *mark << having a speed of << speed << km/h and its price is $ << price << endl; return; } Car::~Car(){ delete [] mark; cout << The object has been destroyed! << endl; } // Hm hy b tng minh

102

Chng 5: Lp
// Hm main, chng trnh chnh void main(){ clrscr(); Car myCar(150, Mercedes, 5000);// Dng hm khi to tham s // Gii thiu xe cout << Gioi thieu xe: << endl; myCar.show(); return; }

Chng trnh 5.5 s in ra thng bo nh sau:


Gioi thieu xe: This is a Mercedes having a speed of 150km/h and its price is $5000 The object has been destroyed!

Dng cui cng l ca hm hy b, mc d ta khng gi hm hy b trc tip, nhng khi thot khi hm main() ca chng trnh chnh, i tng myCar b gii phng khi b nh v khi , C++ t ng gi n hm hy b m ta nh ngha tng minh. Do vy, m c dng thng bo cui cng ny.

5.5 CON TR I TNG V MNG I TNG


5.5.1 Con tr i tng
Con tr i tng l con tr tr n a ch ca mt i tng c kiu lp. Cc thao tc lin quan n con tr i tng bao gm: Khai bo con tr i tng Cp pht b nh cho con tr i tng S dng con tr i tng Gii phng b nh cho con tr i tng

Khai bo con tr i tng


Con tr i tng c khai bo tng t nh khai bo cc con tr c kiu thng thng:
<Tn lp> *<Tn con tr i tng>;

V d, mun khai bo mt con tr i tng c kiu ca lp Car, ta khai bo nh sau:


Car *myCar;

Khi , myCar l mt con tr i tng c kiu lp Car.

Cp pht b nh cho con tr i tng


Con tr i tng cng cn phi cp pht b nh hoc tr vo mt a ch ca mt i tng lp xc nh trc khi c s dng. Cp pht b nh cho con tr i tng cng bng thao tc new:
<Tn con tr i tng> = new <Tn lp>([<Cc i s>]);

103

Chng 5: Lp

V d, nu lp Car c hai hm khi to nh sau:


class Car{ public: Car(); Car(int, char[], float); };

th ta c th cp pht b nh theo hai cch, tng ng vi hai hm khi to ca lp:


myCar = new Car(); // Khi to khng tham s myCar = new Car(100, Ford, 3000); // Khi to tham s

Lu : Cc i s truyn phi tng ng vi t nht mt trong cc hm khi to ca lp. Khi s dng hm khi to khng c tham s, ta vn phi s dng cp ngoc n () trong thao tc new. Khi lp khng c mt hm khi to tng minh no, s dng hm khi to ngm nh ca C++ v c php tng t nh s dng hm khi to tng minh khng c tham s. C th va khai bo, va cp pht b nh cho con tr i tng. V d:
Car myCar = new Car(); // Khi to khng tham s

S dng con tr i tng


Con tr i tng c s dng qua cc thao tc: Tr n a ch ca mt i tng cng lp Truy nhp n cc phng thc ca lp
<Tn con tr i tng> = &<Tn i tng c sn>;

Con tr i tng c th tr n a ch ca mt i tng c sn, cng lp theo c php sau: V d, ta c mt con tr v mt i tng ca lp Car:
Car *ptrCar, myCar(100, Ford,3000);

Khi , c th cho con tr ptrCar tr vo a ch ca i tng myCar nh sau:


ptrCar = &myCar;

Khi mun truy nhp n cc thnh phn ca con tr i tng, ta dng c php sau:
<Tn con tr i tng> -> <Tn thnh phn lp>([<Cc i s>]);

V d, on chng trnh sau s thc hin phng thc gii thiu xe ca lp Car thng qua con tr ptrCar:
Car *ptrCar = new Car(100, Ford,3000); ptrCar->show();

Lu : Danh sch cc i s phi tng thch vi tn phng thc tng ng. Cc quy tc phm vi truy nhp vn p dng trong truy nhp cc thnh phn lp thng qua con tr.

104

Chng 5: Lp

Gii phng b nh cho con tr i tng


Con tr i tng cng c gii phng thng qua thao tc delete:
delete <Tn con tr i tng>;

V d:
Car *ptrCar = new Car();// Khai bo v cp pht b nh delete ptrCar; // S dng con tr ptrCar // Gii phng b nh.

Lu : Thao tc delete ch c dng khi trc , con tr c cp pht b nh qua thao tc new:
Car *ptrCar = new Car(); delete ptrCar; // ng.

Nhng khng c dng delete khi trc , con tr ch tr vo mt a ch ca i tng c sn (tnh):


Car *ptrCar, myCar(100, Ford, 3000); ptrCar = &myCar; delete ptrCar; // Khng c

Chng trnh 5.6 minh ha vic dng con tr i tng c kiu lp l Car. Chng trnh 5.6
#include<stdio.h> #include<conio.h> #include<string.h> /* nh ngha lp */ class Car{ private: int char public: // Khi to vi cc gi tr ngm inh cho cc tham s Car(int speedIn=0, char markIn[]=, float priceIn=0); void }; /* Khai bo phng thc bn ngoi lp */ Car::Car(int speedIn, char markIn[], float priceIn){ speed = speedIn; strcpy(mark, markIn); price = priceIn; show(); // Gii thiu xe speed; mark[20]; // Tc // Nhn hiu // Gi xe

float price;

105

Chng 5: Lp
} void Car::show(){ // Phng thc gii thiu xe

cout << This is a << mark << having a speed of << speed << km/h and its price is $ << price << endl; return; } // Hm main, chng trnh chnh void main(){ clrscr(); // Khai bo con tr, cp pht b nh dng hm khi to tham s Car *myCar = new Car(150, Mercedes, 5000); // Gii thiu xe cout << Gioi thieu xe: << endl; myCar->show(); // Gii phng con tr delete myCar; return; }

Chng trnh 5.6 hin th ra thng bo l mt li gii thiu xe;


Gioi thieu xe: This is a Mercedes having a speed of 150km/h and its price is $5000

5.5.2 Mng cc i tng


Mng cc i tng cng c th c khai bo v s dng nh mng ca cc bin c kiu thng thng.

Khai bo mng tnh cc i tng


Mng cc i tng c khai bo theo c php:
<Tn lp> <Tn bin mng>[<S lng i tng>];

V d:
Car cars[10];

L khai bo mt mng c 10 i tng c cng kiu lp Car. Lu : C th khai bo mng tnh cc i tng m cha cn khai bo di mng, cch ny thng dng khi cha bit chnh xc di mng:
Car cars[];

106

Chng 5: Lp

Mun khai bo c mng tnh cc i tng, lp tng ng phi c hm khi to khng c tham s. V khi khai bo mng, tng ng vi khai bo mt dy cc i tng vi hm khi to khng c tham s.

Khai bo mng ng vi con tr


Mt mng cc i tng cng c th c khai bo v cp pht ng thng qua con tr i tng nh sau:
<Tn lp> *<Tn bin mng ng> = new <Tn lp>[< di mng>];

V d:
Car *cars = new Car[10];

Sau khi c s dng, mng ng cc i tng cng cn phi gii phng b nh:
delete [] <Tn bin mng ng>;

V d:
Car *cars = new Car[10];// Khai bo v cp pht ng delete [] cars; // S dng bin mng ng // Gii phng b nh ca mng ng

S dng mng i tng


Khi truy nhp vo cc thnh phn ca mt i tng c ch s xc nh trong mng khai bo, ta c th s dng c php:
<Tn bin mng>[<Ch s i tng>].<Tn thnh phn>([<Cc i s>]);

V d:
Car cars[10]; cars[5].show();

s thc hin phng thc show() ca i tng c ch s th 5 (tnh t ch s 0) trong mng cars. Chng trnh 5.7 s ci t mt chng trnh, trong nhp vo di mng, sau yu cu ngi dng nhp thng tin v mng cc xe. Cui cng, chng trnh s tm kim v hin th thng tin v chic xe c gi t nht trong mng. Chng trnh 5.7
#include<stdio.h> #include<conio.h> #include<string.h> /* nh ngha lp Car */ class Car{ private: int char public: void setSpeed(int); // Gn tc cho xe speed; mark[20]; // Tc // Nhn hiu // Gi xe

float price;

107

Chng 5: Lp
int void void getSpeed(); setMark(char); setPrice(float); // c tc xe // Gn nhn cho xe // c nhn xe // Gn gi cho xe // c gi xe

char[] getMark(); float getPrice(); // Khi to thng tin v xe

Car(int speedIn=0, char markIn[]=, float priceIn=0); void }; /* Khai bo phng thc bn ngoi lp */ Car::Car(int speedIn, char markIn[], float priceIn){ speed = speedIn; strcpy(mark, markIn); price = priceIn; } void Car::setSpeed(int speedIn){ speed = speedIn; } int Car::getSpeed(){ return speed; } void Car::setMark(char markIn){ strcpy(mark, markIn); } char[] Car::getMark(){ return mark; } void Car::setPrice(float priceIn){ price = priceIn; } float Car::getPrice(){ return price; } void Car::show(){ // Phng thc gii thiu xe // c gi xe // Gn gi cho xe // c nhn xe // Gn nhn cho xe // c tc xe // Gn tc cho xe show(); // Gii thiu xe

cout << This is a << mark << having a speed of << speed << km/h and its price is $ << price << endl; return; } // Hm main, chng trnh chnh

108

Chng 5: Lp
void main(){ clrscr(); int length; float maxPrice = 0; int index = 0; Car *cars; // Chiu di mng // Gi t nht // Ch s ca xe t nht // Khai bo mng i tng

// Nhp s lng xe, tc l chiu di mng cout << So luong xe: ; cin >> length; // Cp pht b nh ng cho mng cars = new Car[length]; // Khi to cc i tng trong mng for(int i=0;i<length; i++){ int speed; char mark[20]; float price; // (Bin tm) tc // (Bin tm) nhn hiu // (Bin tm) gi xe

cout << Xe thu << i << : <<endl; cout << Toc do (km/h): ; cin >> speed; cars[i].setSpeed(speed); cout << Nhan hieu : ; cin >> mark; cars[i].setMark(mark); cout << Gia ($): ; cin >> price; cars[i].setPrice(price); if(maxPrice < price){ maxPrice = price; index = i; } } // Tm xe t nht for(int i=0; i<length; i++) if(i == index){ cars[i].show(); break; } // Gii phng b nh ca mng delete [] cars; return; // Gii thiu xe t nht // Nhp gi xe // Nhp nhn xe // Nhp tc

109

Chng 5: Lp
}

TNG KT CHNG 5
Ni dung chng 5 tp trung trnh by cc vn c bn v lp i tng trong ngn ng C++: Khai bo, nh ngha lp bng t kha class S dng bin lp nh nhng i tng c th Khai bo, nh ngha cc thuc tnh v cc phng thc ca lp: nh ngha cc phng thc trong hoc ngoi phm vi khai bo lp Khai bo phm vi truy nhp lp bng cc t kha ch phm vi: private, protected v public. Gii thiu cc kiu hm c th truy nhp phm vi bt quy tc: hm bn v lp bn vi t kha friend. Khai bo, nh ngha tng minh hm khi to ca lp v s dng khi khai bo bin lp Khai bo, nh ngha tng minh hm hy b ca lp, nhm dn dp, gii phng b nh trc khi i tng b gii phng khi b nh. Khai bo, cp pht b nh, s dng v gii phng b nh cho con tr i tng Khai bo, cp pht b nh ng, s dng v gii phng vng nh ca mng cc i tng.

CU HI V BI TP CHNG 5
1. Trong cc khai bo lp sau, nhng khai bo no l ng: a. class MyClass; b. Class MyClass; c. class MyClass{}; d. Class MyClass{}; 2. Gi s ta nh ngha lp MyClass, by gi ta khai bo mt i tng thuc kiu lp ny. Khai bo no l ng: a. class MyClass me; b. MyClass me; c. MyClass me(); d. MyClass me{}; 3. Trong cc khai bo thuc tnh ngay trong phm vi ca khai bo lp nh sau, nhng khai bo no l ng: a. int myAge; b. private int myAge; c. public int myAge; d. private: int myAge;

110

Chng 5: Lp

4. Trong cc khai bo phng thc ngay trong phm vi ca khai bo lp MyClass nh sau, nhng khai bo no l ng: a. public: void show(); b. void show(); c. void show(){cout << hello!;}; d. void MyClass::show(){cout << hello!;} 5. Xt on chng trnh sau:
class MyClass{ int age; public: int getAge(); }; MyClass me;

Khi , trong cc lnh sau, lnh no c th thm vo cui on chng trnh trn: a. cout << MyClass::age; b. cout << me.age; c. cout << me.getAge(); d. cin >> me.age; 6. Trong cc khai bo hm khi to cho lp MyClass nh sau, nhng khai bo no l ng: a. myClass(); b. MyClass(); c. MyClass(MyClass); d. void MyClas(); e. MyClass MyClass(); 7. Trong cc khai bo hm hy b cho lp MyClass nh sau, nhng khai bo no l ng: a. ~myClass(); b. ~MyClass(); c. ~MyClass(MyClass); d. void ~MyClas(); e. MyClass ~MyClass(); 8. Gi s ta khai bo lp MyClass c mt thuc tnh age v mt hm khi to:
class MyClass{ int age; public: MyClass(MyClass me){ }; int getAge(){return age}; };

111

Chng 5: Lp

Trong cc dng lnh sau, nhng dng no c th xut hin trong hm khi to trn: a. age = MyClass.age; b. age = me.age; c. age = MyClass.getAge(); d. age = me.getAge(); e. age = 10; 9. Xt khai bo lp nh sau:
class MyClass{ public: MyClass(MyClass); MyClass(int); };

Khi , trong s cc khai bo i tng sau, nhng khai bo no l ng: a. MyClass me; b. MyClass me(); c. MyClass me(10); d. MyClass me1(10), me2(me1); 10. Xt khai bo lp nh sau:
class MyClass{ public: MyClass(); };

Khi , trong s cc khai bo con tr i tng sau, nhng khai bo no l ng: a. MyClass *me; b. MyClass *me(); c. MyClass *me = new me(); d. MyClass *me = new MyClass(); 11. Xt khai bo lp nh sau:
class MyClass{ public: MyClass(int i=0, int j=0, float k=0); };

Khi , trong s cc khai bo con tr i tng sau, nhng khai bo no l ng: a. MyClass *me; b. MyClass *me = new MyClass(); c. MyClass *me = new MyClass(1, 20); d. MyClass *me = new MyClass(1, 20, 30); 12. Khai bo mt lp nhn vin, c tn l Employee, vi ba thuc tnh c tnh cht private: Tn nhn vin, c dng mt con tr kiu char

112

Chng 5: Lp

Tui nhn vin, c kiu int Lung nhn vin, c kiu float. set/get gi tr thuc tnh tn nhn vin set/get gi tr thuc tnh tui nhn vin set/get gi tr thuc tnh lung nhn vin.

13. Thm vo lp Employee trong bi 12 cc phng thc c tnh cht public:

14. Vit mt hm khi to khng c tham s cho lp Employee trong bi 13, cc thuc tnh ca lp nhn gi tr mc nh: gi tr thuc tnh tn nhn vin, mc nh l chui k t rng gi tr thuc tnh tui nhn vin, mc nh l 18 gi tr thuc tnh lung nhn vin, mc nh l $100.

15. Vit thm mt hm khi to vi y ba tham s tng ng vi ba thuc tnh ca lp Employee trong bi 14. 16. Thm vo lp Employee mt phng thc show() gii thiu v tn, tui v lng ca i tng nhn vin. 17. Vit mt hm hy b tng minh cho lp Employee nhm gii phng vng nh ca con tr char, l kiu ca thuc tnh tn nhn vin. 18. Vit mt chng trnh s dng lp Employee c xy dng sau bi 17 vi cc thao tc sau: Khai bo mt i tng kiu Employee, dng hm khi to khng tham s Dng hm show() gii thiu v i tng

19. Vit mt chng trnh s dng lp Employee c xy dng sau bi 17 vi cc thao tc sau: Khai bo mt i tng kiu Employee, dng hm khi to khng tham s Nhp t bn phm gi tr cc thuc tnh tn, tui, lng nhn vin. Gn cc gi tr ny cho cc thuc tnh ca i tng khai bo, dng cc hm set Dng hm show() gii thiu v i tng

20. Vit mt chng trnh s dng lp Employee c xy dng sau bi 17 vi cc thao tc sau: Khai bo mt i tng kiu Employee, dng hm khi to vi 3 tham s Dng hm show() gii thiu v i tng

21. Vit mt chng trnh s dng lp Employee c xy dng sau bi 17 vi cc thao tc sau: Khai bo mt con tr i tng kiu Employee Cp pht b nh, dng hm khi to vi 3 tham s Dng hm show() gii thiu v i tng m con tr ny ang tr ti

22. Vit mt chng trnh nhp d liu cho mt mng ng cc i tng ca lp Employee trong bi 17. Chiu di mng ng cng c nhp t bn phm.

113

Chng 5: Lp

23. Vit mt chng trnh tm kim trn mng ng c xy dng trong bi 22: tm kim v gii thiu v nhn vin tr nht v nhn vin gi nht trong mng . 24. Vit mt chng trnh tm kim trn mng ng c xy dng trong bi 22: tm kim v gii thiu v nhn vin c lng cao nht v nhn vin c lng thp nht trong mng . 25. Vit mt chng trnh tm kim trn mng ng c xy dng trong bi 22: tm kim v gii thiu v nhn vin c tn xc nh, do ngi dng nhp t bn phm.

114

Chng 6: Tnh k tha v a hnh

CHNG 6 TNH K THA V A HNH


Ni dung chng ny tp trung trnh by cc vn lin quan n tnh k tha v tng ng bi (a hnh) trong ngn ng C++: Khi nim k tha, dn xut v cc kiu dn xut Khai bo, nh ngha cc hm khi to v hm hy b trong lp dn xut Truy nhp ti cc thnh phn ca lp c s v cc lp dn xut Vic mt lp c k tha t nhiu lp c s khc nhau Khai bo v s dng cc lp c s tru tng trong k tha Tnh a hnh trong k tha

6.1 KHI NIM K THA


Lp trnh hng i tng c hai c trng c bn: ng gi d liu, c th hin bng cch dng khi nim lp biu din i tng vi cc thuc tnh private, ch cho php bn ngoi truy nhp vo thng qua cc phng thc get/set. Dng li m, th hin bng vic tha k gia cc lp. Vic tha k cho php cc lp tha k (gi l lp dn xut) s dng li cc phng thc c nh ngha trong cc lp gc (gi l lp c s).

6.1.1 Khai bo tha k


C php khai bo mt lp k tha t mt lp khc nh sau:
class <Tn lp dn xut>: <T kha dn xut> <Tn lp c s>{ }; // Khai bo cc thnh phn lp

Trong : Tn lp dn xut: l tn lp c cho k tha t lp khc. Tn lp ny tun th theo quy tc t tn bin trong C++. Tn lp c s: l tn lp c nh ngha trc cho lp khc k tha. Tn lp ny cng tun th theo quy tc t tn bin ca C++. T kha dn xut: l t kha quy nh tnh cht ca s k tha. C ba t kha dn xut l private, protected v public. Mc tip theo s trnh by ngha ca cc t kha dn xut ny.
class Bus: public Car{ }; // Khai bo cc thnh phn

V d:

115

Chng 6: Tnh k tha v a hnh

l khai bo mt lp Bus (xe but) k tha t lp Car (xe t) vi tnh cht k tha l public.

6.1.2 Tnh cht dn xut


S k tha cho php trong lp dn xut c th s dng li mt s m ngun ca cc phng thc v thuc tnh c nh ngha trong lp c s. Ngha l lp dn xut c th truy nhp trc tip n mt s thnh phn ca lp c s. Tuy nhin, phm vi truy nhp t lp dn xut n lp c s khng phi bao gi cng ging nhau: chng c quy nh bi cc t kha dn xut private, protected v public.

Dn xut private
Dn xut private quy nh phm vi truy nhp nh sau: Cc thnh phn private ca lp c s th khng th truy nhp c t lp dn xut. Cc thnh phn protected ca lp c s tr thnh cc thnh phn private ca lp dn xut Cc thnh phn public ca lp c s cng tr thnh cc thnh phn private ca lp dn xut. Phm vi truy nhp t bn ngoi vo lp dn xut c tun th nh quy tc phm vi lp thng thng.

Dn xut protected
Dn xut protected quy nh phm vi truy nhp nh sau: Cc thnh phn private ca lp c s th khng th truy nhp c t lp dn xut. Cc thnh phn protected ca lp c s tr thnh cc thnh phn protected ca lp dn xut Cc thnh phn public ca lp c s cng tr thnh cc thnh phn protected ca lp dn xut. Phm vi truy nhp t bn ngoi vo lp dn xut c tun th nh quy tc phm vi lp thng thng.

Dn xut public
Dn xut public quy nh phm vi truy nhp nh sau: Cc thnh phn private ca lp c s th khng th truy nhp c t lp dn xut. Cc thnh phn protected ca lp c s tr thnh cc thnh phn protected ca lp dn xut. Cc thnh phn public ca lp c s vn l cc thnh phn public ca lp dn xut. Phm vi truy nhp t bn ngoi vo lp dn xut c tun th nh quy tc phm vi lp thng thng.

Bng 6.1 tm tt li cc quy tc truy nhp c quy nh bi cc t kha dn xut.


Kiu dn xut private Tnh cht lp c s private Tnh cht lp dn xut Khng truy nhp c

116

Chng 6: Tnh k tha v a hnh


protected public private protected protected public private public protected public private private Khng truy nhp c protected protected Khng truy nhp c protected public

6.2 HM KHI TO V HU B TRONG K THA


6.2.1 Hm khi to trong k tha
Khi khai bo mt i tng c kiu lp c dn xut t mt lp c s khc. Chng trnh s t ng gi ti hm khi to ca lp dn xut. Tuy nhin, th t c gi s bt u t hm khi to tng ng ca lp c s, sau n hm khi to ca lp dn xut. Do , thng thng, trong hm khi to ca lp dn xut phi c hm khi to ca lp c s. C php khai bo hm khi to nh sau:
<Tn hm khi to dn xut>([<Cc tham s>]): <Tn hm khi to c s>([<Cc i s>]){ }; // Khi to cc thuc tnh mi b sung ca lp dn xut

V tn hm khi to l trng vi tn lp, nn c th vit li thnh:


<Tn lp dn xut>([<Cc tham s>]): <Tn lp c s>([<Cc i s>]){ }; // Khi to cc thuc tnh mi b sung ca lp dn xut

V d:
Bus():Car(){ } // Khi to cc thuc tnh mi b sung ca lp Bus

l mt nh ngha mt hm khi to ca lp Bus k tha t lp Car. nh ngha ny c thc hin trong phm vi khai bo lp Bus. y l mt hm khi to khng tham s, n gi ti hm khi to khng tham s ca lp Car. Lu : Nu nh ngha hm khi to bn ngoi phm vi lp th phi thm tn lp dn xut v ton t phm vi :: trc tn hm khi to. Gia tn hm khi to ca lp dn xut v hm khi to ca lp c s, ch c mt du hai chm :, nu l hai du :: th tr thnh ton t phm vi lp.

117

Chng 6: Tnh k tha v a hnh

Nu khng ch r hm khi to ca lp c s sau du hai chm : chng trnh s t ng gi hm khi to ngm nh hoc hm khi to khng c tham s ca lp c s nu hm c nh ngha tng minh trong lp c s. V d, nh ngha hm khi to:
Bus():Car(){ }; // Khi to cc thuc tnh mi b sung ca lp Bus

C th thay bng:
Bus(){ }; // Gi hm khi to khng tham s ca lp Car // Khi to cc thuc tnh mi b sung ca lp Bus

Chng trnh 6.1 nh ngha lp Car c 3 thuc tnh vi hai hm khi to, sau nh ngha lp Bus c thm thuc tnh label l s hiu ca tuyn xe but. Lp Bus s c ci t hai hm khi to tng minh, gi n hai hm khi to tng ng ca lp Car. Chng trnh 6.1
#include<string.h> /* nh ngha lp Car */ class Car{ int char public: Car(); Car(int, char[], float); }; Car::Car(){ speed = 0; strcpy(mark, ); price = 0; } // Khi to tham s Car::Car(int speedIn, char markIn[], float priceIn){ speed = speedIn; strcpy(mark, markIn); price = priceIn; } /* nh ngha lp Bus k tha t lp Car */ // Khi to khng tham s // Khi to khng tham s // Khi to tham s speed; mark[20]; // Tc // Nhn hiu // Gi xe

float price;

118

Chng 6: Tnh k tha v a hnh


class Bus: public Car{ int label; public: Bus(); }; Bus::Bus():Car(){ label = 0; } // Khi to tham s Bus::Bus(int sIn, char mIn[], float pIn, int lIn):Car(sIn, mIn, pIn){ label = lIn; } // Khi to khng tham s // Khi to khng tham s Bus(int, char[], float, int); // Khi to tham s // S hiu tuyn xe

Trong hm khi to ca lp Bus, mun khi to cc thuc tnh ca lp Car, ta phi khi to gin tip thng qua hm khi to ca lp Car m khng th gn gi tr trc tip cho cc thuc tnh speed, mark v price. L do l cc thuc tnh ny c tnh cht private, nn lp dn xut khng th truy nhp trc tip n chng.

6.2.2 Hm hy b trong k tha


Khi mt i tng lp dn xut b gii phng khi b nh, th t gi cc hm hy b ngc vi th t gi hm thit lp: gi hm hy b ca lp dn xut trc khi gi hm hy b ca lp c s. V mi lp ch c nhiu nht l mt hm hy b, nn ta khng cn phi ch ra hm hy b no ca lp c s s c gi sau khi hy b lp dn xut. Do vy, hm hy b trong lp dn xut c khai bo v nh ngha hon ton ging vi cc lp thng thng:
<Tn lp>::~<Tn lp>([<Cc tham s>]){ // gii phng phn b nh cp pht cho cc thuc tnh b sung }

Lu : Hm hy b ca lp dn xut ch gii phng phn b nh c cp pht ng cho cc thuc tnh mi b sung trong lp dn xut, nu c, m khng c gii phng b nh c cp cho cc thuc tnh trong lp c s (phn ny l do hm hy b ca lp c s m nhim). Khng phi gi tng minh hm hy b ca lp c s trong hm hy b ca lp dn xut. Ngay c khi lp dn xut khng nh ngha tng minh hm hy b (do khng cn thit) m lp c s li c nh ngha tng minh. Chng trnh vn gi hm hy b ngm nh ca lp dn xut, sau vn gi hm hy b tng minh ca lp c s.

Chng trnh 6.2 ci t lp Bus k tha t lp Car: lp Car c mt thuc tnh c dng con tr nn cn gii phng bng hm hy b tng minh. Lp Bus c thm mt thuc tnh c dng con

119

Chng 6: Tnh k tha v a hnh

tr l danh sch cc ng ph m xe but i qua (mng ng cc chui k t *char[]) nn cng cn gii phng bng hm hy b tng minh. Chng trnh 6.2
#include<string.h> /* nh ngha lp Car */ class Car{ char public: ~Car(); }; Car::~Car(){ delete [] mark; } /* nh ngha lp Bus k tha t lp Car */ class Bus: public Car{ char *voyage[]; public: ~Bus(); }; Bus::~Bus(){ delete [] voyage; } // Hy b tng minh // Hy b tng minh // Hnh trnh tuyn xe // Hy b tng minh // Hy b tng minh *mark; // Nhn hiu xe

Trong hm hy b ca lp Bus, ta ch c gii phng vng nh c cp pht cho thuc tnh voyage (hnh trnh ca xe but), l thuc tnh c b sung thm ca lp Bus. M khng c gii phng vng nh cp pht cho thuc tnh mark (nhn hiu xe), vic ny l thuc trch nhim ca hm hy b ca lp Car v thuc tnh mark c khai bo trong lp Car.

6.3 TRUY NHP TI CC THNH PHN TRONG K THA LP


6.3.1 Phm vi truy nhp
Mi quan h gia cc thnh phn ca lp c s v lp dn xut c quy nh bi cc t kha dn xut, nh trnh by trong mc 6.1.2, c tm tt trong bng 6.2
Kiu dn xut private Tnh cht lp c s private protected Tnh cht lp dn xut Khng truy nhp c private

120

Chng 6: Tnh k tha v a hnh


public private protected protected public private public protected public private Khng truy nhp c protected protected Khng truy nhp c protected public

Ta xt phm vi truy nhp theo hai loi: Phm vi truy nhp t cc hm bn, lp bn ca lp dn xut Phm vi truy nhp t cc i tng c kiu lp dn xut

Truy nhp t cc hm bn v lp bn ca lp dn xut


Nhn vo bng tng kt 6.2, phm vi truy nhp ca hm bn, lp bn ca lp dn xut vo lp c s nh sau: Vi dn xut private, hm bn c th truy nhp c cc thnh phn protected v public ca lp c s v chng tr thnh cc thnh phn private ca lp dn xut, c th truy nhp c t hm bn. Vi dn xut protected, hm bn cng c th truy nhp c cc thnh phn protected v public ca lp c s v chng tr thnh cc thnh phn protected ca lp dn xut, c th truy nhp c t hm bn. Vi dn xut public, hm bn cng c th truy nhp c cc thnh phn protected v public ca lp c s v chng tr thnh cc thnh phn protected v public ca lp dn xut, c th truy nhp c t hm bn. i vi c ba loi dn xut, hm bn u khng truy nhp c cc thnh phn private ca lp c s, v cc thnh phn ny cng khng truy nhp c t lp dn xut.

Truy nhp t cc i tng to bi lp dn xut


Nhn vo bng tng kt 6.2, phm vi truy nhp ca cc i tng ca lp dn xut vo lp c s nh sau: Vi dn xut private, i tng ca lp dn xut khng truy nhp c bt c thnh phn no ca lp c s v chng tr thnh cc thnh phn private ca lp dn xut, khng truy nhp c t bn ngoi. Vi dn xut protected, i tng ca lp dn xut khng truy nhp c bt c thnh phn no ca lp c s v chng tr thnh cc thnh phn protected ca lp dn xut, khng truy nhp c t bn ngoi. Vi dn xut public, i tng ca lp dn xut c th truy nhp c cc thnh phn public ca lp c s v chng tr thnh cc thnh phn public ca lp dn xut, c th truy nhp c t bn ngoi.

Bng 6.3 tng kt phm vi truy nhp t hm bn v i tng ca lp dn xut vo cc thnh phn ca lp c s, c quy nh bi cc t kha dn xut.

121

Chng 6: Tnh k tha v a hnh

Kiu dn xut

Tnh cht lp c s private

Tnh cht lp dn xut --private private --protected protected --protected public

Truy nhp t hm bn ca lp dn xut --ok ok --ok ok --ok ok

Truy nhp t i tng ca lp dn xut ----------------ok

private

protected public private

protected

protected public private

public

protected public

6.3.2 S dng cc thnh phn ca lp c s t lp dn xut


T bng tng kt phm vi truy nhp, ta thy rng ch c dn xut theo kiu public th i tng ca lp dn xut mi c th truy nhp n cc thnh phn (thuc loi public) ca lp c s. Khi , vic gi n cc thnh phn ca lp c s cng tng t nh gi cc thnh phn lp thng thng: Lu : Cch gi hm thnh phn ny c p dng khi trong lp dn xut, ta khng nh ngha li cc hm thnh phn ca lp c s. Trng hp nh ngha li hm thnh phn ca lp c s s c trnh by trong mc 6.3.3. i vi bin i tng thng thng:
<Tn i tng>.<Tn thnh phn>([Cc i s]);

i vi con tr i tng:
<Tn i tng>-><Tn thnh phn>([Cc i s]);

Chng trnh 6.3 minh ha vic s dng cc thnh phn lp c s t i tng lp dn xut: lp Bus k tha t lp Car. Lp Bus c nh ngha b sung mt s phng thc v thuc tnh mi. Khi , i tng ca lp Bus c th gi cc hm public ca lp Bus cng nh ca lp Car. Chng trnh 6.3
#include<stdio.h> #include<conio.h> #include<string.h> /* nh ngha lp Car */ class Car{ private: int speed; // Tc

122

Chng 6: Tnh k tha v a hnh


char public: void int void void setSpeed(int); getSpeed(); setMark(char); setPrice(float); // Gn tc cho xe // c tc xe // Gn nhn cho xe // c nhn xe // Gn gi cho xe // c gi xe mark[20]; // Nhn hiu // Gi xe

float price;

char[] getMark(); float getPrice(); // Khi to thng tin v xe

Car(int speedIn=0, char markIn[]=, float priceIn=0); void }; /* Khai bo phng thc bn ngoi lp */ Car::Car(int speedIn, char markIn[], float priceIn){ speed = speedIn; strcpy(mark, markIn); price = priceIn; } void Car::setSpeed(int speedIn){ speed = speedIn; } int Car::getSpeed(){ return speed; } void Car::setMark(char markIn){ strcpy(mark, markIn); } char[] Car::getMark(){ return mark; } void Car::setPrice(float priceIn){ price = priceIn; } float Car::getPrice(){ return price; } void Car::show(){ // Phng thc gii thiu xe // c gi xe // Gn gi cho xe // c nhn xe // Gn nhn cho xe // c tc xe // Gn tc cho xe show(); // Gii thiu xe

cout << This is a << mark << having a speed of << speed << km/h and its price is $ << price << endl;

123

Chng 6: Tnh k tha v a hnh


return; } /* nh ngha lp Bus k tha t lp Car */ class Bus: public Car{ int label; public: // Khi to tham s Bus(int sIn=0, char mIn[]=, float pIn=0, int lIn=0); void setLabel(int); int getLabel(); }; // Khi to tham s Bus::Bus(int sIn, char mIn[], float pIn, int lIn):Car(sIn, mIn, pIn){ label = lIn; } void Bus::setLabel(int labelIn){ label = labelIn; } int Bus::getLabel(){ return label; } // Chng trnh chnh void main(){ clrscr(); Bus myBus; int speedIn, labelIn; float priceIn; char markIn[20]; // Nhp gi tr cho cc thuc tnh cout << Toc do xe bus:; cin >> speedIn; cout << Nhan hieu xe bus:; cin >> markIn; cout << Gia xe bus:; cin >> priceIn; cout << So hieu tuyen xe bus:; cin >> labelIn; myBus.setSpeed(speedIn); // Phng thc ca lp Car // Bin i tng ca lp Bus // c s hiu tuyn xe // Gn s hiu tuyn xe // Gn s hiu tuyn xe // c s hiu tuyn xe // S hiu tuyn xe

124

Chng 6: Tnh k tha v a hnh


myBus.setMark(markIn); myBus.setPrice(priceIn); myBus.setLabel(labelIn); myBus.show(); return; } // Phng thc ca lp Car // Phng thc ca lp Car // Phng thc ca lp Bus // Phng thc ca lp Car

Trong chng trnh 6.3, i tng myBus c kiu lp Bus, l lp dn xut ca lp c s Car, c th s dng cc phng thc ca lp Car v lp Bus mt cch bnh ng. Khi , lnh myBus.show() s gi n phng thc show() ca lp Car, do vy, chng trnh trn s in ra mn hnh kt qu nh sau (ty theo d liu nhp vo 4 dng u):
Toc do xe bus: 80 Nhan hieu xe bus: Mercedes Gia xe bus: 5000 So hieu tuyen xe bus: 27 This is a Mercedes having a speed of 80km/h and its price is $5000

Trong dng gii thiu xe bus (v ta ang dng i tng myBus ca lp Bus), khng c gii thiu s hiu tuyn xe. L do l v ta ang dng hm show ca lp Car. Mun c thm phn gii thiu v s hiu tuyn xe but, ta phi nh ngha li hm show trong lp Bus. Mc 6.3.3 s trnh by ni dung ny.

6.3.3 nh ngha chng cc phng thc ca lp c s nh ngha chng phng thc ca lp c s


Mt phng thc ca lp c s b coi l np chng nu lp dn xut cng nh ngha mt phng thc c cng tn. V d, trong lp Car, c phng thc show(), by gi, trong lp Bus k tha t lp Car, ta cng nh ngha li phng thc show():
class Car{ public: void show(); }; class Bus: public Car{ public: void show(); }; // Phng thc np chng // Phng thc ca lp c s

khi , phng thc show() ca lp Bus c coi l phng thc np chng t phng thc show() ca lp Car.

125

Chng 6: Tnh k tha v a hnh

S dng cc phng thc np chng


T mt i tng ca lp dn xut, vic truy nhp n phng thc c nh ngha li trong lp dn xut c thc hin nh li gi mt phng thc thng thng: V d:
Bus myBus; myBus.show();

i vi bin i tng thng thng:


<Tn i tng>.<Tn thnh phn>([Cc i s]);

i vi con tr i tng:
<Tn i tng>-><Tn thnh phn>([Cc i s]);

s gi n phng thc show() c nh ngha trong lp Bus. Trong trng hp, t mt i tng ca lp dn xut, mun truy nhp n mt phng thc ca lp c s ( b nh ngha li lp dn xut) th phi s dng ch th phm vi lp trc phng thc c gi: V d:
Bus myBus; myBus.Car::show();

i vi bin i tng thng thng:


<Tn i tng>.<Tn lp c s>::<Tn thnh phn>([Cc i s]);

i vi con tr i tng:
<Tn i tng>-><Tn lp c s>::<Tn thnh phn>([Cc i s]);

s gi n phng thc show() c nh ngha trong lp Car t mt i tng ca lp Bus. Chng trnh 6.4 minh ha vic nh ngha chng hm show() trong lp Bus v vic s dng hai phng thc show() ca hai lp t mt i tng ca lp dn xut. Chng trnh 6.4
#include<stdio.h> #include<conio.h> #include<string.h> /* nh ngha lp Car */ class Car{ private: int char public: int getSpeed(); // c tc xe // c nhn xe // c gi xe char[] getMark(); float getPrice(); // Khi to thng tin v xe speed; mark[20]; // Tc // Nhn hiu // Gi xe

float price;

126

Chng 6: Tnh k tha v a hnh


Car(int speedIn=0, char markIn[]=, float priceIn=0); void }; /* Khai bo phng thc bn ngoi lp */ Car::Car(int speedIn, char markIn[], float priceIn){ speed = speedIn; strcpy(mark, markIn); price = priceIn; } void Car::setSpeed(int speedIn){ speed = speedIn; } int Car::getSpeed(){ return speed; } char[] Car::getMark(){ return mark; } float Car::getPrice(){ return price; } void Car::show(){ // Phng thc gii thiu xe // c gi xe // c nhn xe // c tc xe // Gn tc cho xe show(); // Gii thiu xe

cout << This is a << mark << having a speed of << speed << km/h and its price is $ << price << endl; return; } /* nh ngha lp Bus k tha t lp Car */ class Bus: public Car{ int label; public: // Khi to tham s Bus(int sIn=0, char mIn[]=, float pIn=0, int lIn=0); void show(); }; // Khi to tham s Bus::Bus(int sIn, char mIn[], float pIn, int lIn):Car(sIn, mIn, pIn){ label = lIn; } // Gii thiu xe bus // S hiu tuyn xe

127

Chng 6: Tnh k tha v a hnh

// nh ngha np chng phng thc void Bus::show(){ // Gii thiu xe bus cout << This is a bus of type << getMark() << , on the line << label << , having a speed of << getSpeed() << km/h and its price is $ << getPrice() << endl; return; } // Chng trnh chnh void main(){ clrscr(); Bus myBus(80, Mercedes, 5000, 27);// Bin i tng ca lp Bus cout << Gioi thieu xe: << endl; myBus.Car::show(); myBus.show(); return; } // Phng thc ca lp Car // Phng thc ca lp Bus cout << Gioi thieu xe bus: << endl;

Chng trnh 6.4 s hin th cc thng bo nh sau:


Gioi thieu xe: This is a Mercedes having a speed of 80km/h and its price is $5000 Gioi thieu xe bus: This is a bus of type Mercedes, on the line 27, having a speed of 80km/h and its price is $5000

Lu : Trong phng thc show() ca lp Bus, ta phi dng cc hm get truy nhp n cc thuc tnh ca lp Car. Khng c truy nhp trc tip n tn cc thuc tnh (speed, mark v price) v chng c dng private ca lp Car.

6.3.4 Chuyn i kiu gia lp c s v lp dn xut


V mt d liu, mt lp dn xut bao gi cng cha ton b d liu ca lp c s: Ta lun tm thy lp c s trong lp dn xut, nhng khng phi bao gi cng tm thy lp dn xut trong lp c s. Do vy: C th gn mt i tng lp dn xut cho mt i tng lp c s:
<i tng lp c s> = <i tng lp dn xut>; // ng

Nhng khng th gn mt i tng lp c s cho mt i tng lp dn xut:


<i tng lp dn xut> = <i tng lp c s>; // Khng c

V d, ta c lp Bus k tha t lp Car v:


Bus myBus;

128

Chng 6: Tnh k tha v a hnh


Car myCar;

khi , php gn:


myCar = myBus; myBus = myCar; // ng // khng c

th chp nhn c, nhng php gn: th khng chp nhn c. Lu : Nguyn tc chuyn kiu ny cng ng vi cc php gn con tr: mt con tr i tng lp c s c th tr n a ch ca mt i tng lp dn xut. Nhng mt con tr i tng lp dn xut khng th tr n a ch mt i tng lp c s. Nguyn tc chuyn kiu ny cng ng vi truyn i s cho hm: c th truyn mt i tng lp dn xut vo v tr ca tham s c kiu lp c s. Nhng khng th truyn mt i tng lp c s vo v tr mt tham s c kiu lp dn xut.

Chng trnh 6.5 minh ha vic chuyn kiu gia cc i tng ca lp c s v lp dn xut. Chng trnh 6.5
#include<stdio.h> #include<conio.h> #include<string.h> /* nh ngha lp Car */ class Car{ private: int char public: int getSpeed(); // c tc xe // c nhn xe // c gi xe char[] getMark(); float getPrice(); // Khi to thng tin v xe Car(int speedIn=0, char markIn[]=, float priceIn=0); void }; /* Khai bo phng thc bn ngoi lp */ Car::Car(int speedIn, char markIn[], float priceIn){ speed = speedIn; strcpy(mark, markIn); price = priceIn; } show(); // Gii thiu xe speed; mark[20]; // Tc // Nhn hiu // Gi xe

float price;

129

Chng 6: Tnh k tha v a hnh


int Car::getSpeed(){ return speed; } char[] Car::getMark(){ return mark; } float Car::getPrice(){ return price; } void Car::show(){ // Phng thc gii thiu xe // c gi xe // c nhn xe // c tc xe

cout << This is a << mark << having a speed of << speed << km/h and its price is $ << price << endl; return; } /* nh ngha lp Bus k tha t lp Car */ class Bus: public Car{ int label; public: // Khi to tham s Bus(int sIn=0, char mIn[]=, float pIn=0, int lIn=0); void show(); }; // Khi to tham s Bus::Bus(int sIn, char mIn[], float pIn, int lIn):Car(sIn, mIn, pIn){ label = lIn; } // nh ngha np chng phng thc void Bus::show(){ // Gii thiu xe bus cout << This is a bus of type << getMark() << , on the line << label << , having a speed of << getSpeed() << km/h and its price is $ << getPrice() << endl; return; } // Chng trnh chnh void main(){ clrscr(); Car myCar(100, Ford, 3000); // Bin i tng lp Car Bus myBus(80, Mercedes, 5000, 27);// Bin i tng lp Bus // nh ngha chng phng thc // S hiu tuyn xe

130

Chng 6: Tnh k tha v a hnh

cout << Gioi thieu xe o to lan 1: << endl; myCar.show(); cout << Gioi thieu xe o to lan 2: << endl; myCar = myBus; myCar.show(); cout << Gioi thieu xe bus: << endl; myBus.show(); return; }

Chng trnh 6.5 s in ra kt qu thng bo nh sau:


Goi thieu xe o to lan 1: This is a Ford having a speed of 100km/h and its price is $3000 Gioi thieu xe lan o to lan 2: This is a Mercedes having a speed of 80km/h and its price is $5000 Gioi thieu xe bus: This is a bus of type Mercedes, on the line 27, having a speed of 80km/h and its price is $5000

thng bo th nht, i tng myCar gi phng thc show() ca lp Car vi cc d liu c khi u cho myCar: (100, Ford, 3000). thng bo th hai, myCar gi phng thc show() ca lp Car, nhng vi d liu va c gn t i tng myBus: (80, Mercedes, 5000). thng bo th ba, myBus gi phng thc show() ca lp Bus vi cc d liu ca myBus: (80, Mercedes, 5000, 27).

6.4 A K THA
C++ cho php a k tha, tc l mt lp c th c dn xut t nhiu lp c s khc nhau, vi nhng kiu dn xut khc nhau.

6.4.1 Khai bo a k tha


a k tha c khai bo theo c php:
class <Tn lp dn xut>: <T kho dn xut> <Tn lp c s 1>, <T kho dn xut> <Tn lp c s 2>, <T kho dn xut> <Tn lp c s n>{ }; // Khai bo thm cc thnh phn lp dn xut

V d:
class Bus: public Car, public PublicTransport{ }; // Khai bo cc thnh phn b sung

131

Chng 6: Tnh k tha v a hnh

l khai bo lp Bus (xe but) k tha t hai lp xe Car ( t) v PublicTransport (phng tin giao thng cng cng) theo cng mt kiu dn xut l public. Lu : Trong a k tha, mi lp c s c phn cch nhau bi du phy ,. Mi lp c s c th c mt kiu dn xut bi mt t kho dn xut khc nhau. Nguyn tc truy nhp vo cc thnh phn lp c s cng hon ton tng t nh trong k tha n.

6.4.2 Hm khi to v hm hu b trong a k tha Hm khi to trong a k tha


Hm khi to trong a k tha c khai bo tng t nh trong n k tha, ngoi tr vic phi sp xp th t gi ti hm khi to ca cc lp c s: thng thng, th t gi n hm khi to ca cc lp c s nn tun theo th t dn xut t cc lp c s trong a k tha. Chng trnh 6.6 minh ho vic nh ngha hm khi to tng minh trong a k tha: th t gi hm khi to ca cc lp c s trong hm khi to ca lp Bus l tng t th t dn xut: hm khi to ca lp Car trc hm khi to ca lp PublicTransport. Chng trnh 6.6
#include<string.h> /* nh ngha lp Car */ class Car{ int char public: Car(); Car(int, char[], float); }; Car::Car(){ speed = 0; strcpy(mark, ); price = 0; } // Khi to tham s Car::Car(int speedIn, char markIn[], float priceIn){ speed = speedIn; strcpy(mark, markIn); price = priceIn; // Khi to khng tham s // Khi to khng tham s // Khi to tham s speed; mark[20]; // Tc // Nhn hiu // Gi xe

float price;

132

Chng 6: Tnh k tha v a hnh


} /* nh ngha lp PublicTransport */ class PublicTransport{ float ticket; public: PublicTransport(); PublicTransport(float); }; PublicTransport::PublicTransport(){ ticket = 0; } // Khi to tham s PublicTransport::PublicTransport(float ticketIn){ ticket = ticketIn; } /* nh ngha lp Bus k tha t lp Car v PublicTransport */ class Bus: public Car, public PublicTransport{ // Th t khai bo int label; public: Bus(); }; // Khi to khng tham s Bus::Bus(): Car(), Transport(){ label = 0; } // Khi to tham s Bus::Bus(int sIn, char mIn[], float pIn, float tIn, int lIn): Car(sIn, mIn, pIn), PublicTransport(tIn){ // Theo th t dn xut label = lIn; } // Theo th t dn xut // Khi to khng tham s Bus(int, char[], float, float, int);// Khi to tham s // S hiu tuyn xe // Khi to khng tham s // Khi to khng tham s // Khi to tham s // Gi v phng tin

Lu : Trong trng hp dng hm khi to ngm nh hoc khng c tham s, ta c th khng cn gi tng minh cc hm khi to ca cc lp c s, trnh bin dch s t ng gi ti chng theo ng th t dn xut

133

Chng 6: Tnh k tha v a hnh

V d, trong chng trnh 6.6, hai cch nh ngha hm khi to khng tham s ca lp Bus sau l tng ng:
Bus::Bus(): Car(), Transport(){// Theo th t dn xut label = 0; }

l tng ng vi:
Bus::Bus(){ label = 0; } // Theo th t dn xut ngm nh

Hm hu b trong a k tha
V hm hu b l duy nht ca mi lp, hn na hm hu b ca lp c s s c t ng gi n khi gii phng i tng ca lp dn xut. Cho nn hm hu b trong a k tha hon ton tng t hm hu b trong n k tha: Hm hu b ca lp dn xut ch gii phng b nh cho cc thnh phn b sung, nu c, ca lp dn xut. Hm hu b ca lp dn xut s c gi n sm nht. Sau cc hm hu b ca cc lp c s s c gi n. Qu trnh ny c trnh bin dch thc hin t ng.

6.4.3 Truy nhp cc thnh phn lp trong a k tha


Vic truy nhp n cc thnh phn ca cc lp trong a k tha c da trn cc nguyn tc sau: Vic truy nhp t i tng lp dn xut n cc thnh phn ca mi lp c s c tun theo quy tc phm vi tng t nh trong n k tha. Trong trng hp cc lp c s u c cc thnh phn cng tn, vic truy xut n thnh phn ca lp no phi c ch r bng ton t phm vi: <Tn lp>:: i vi thnh phn lp c s .

V d, ta nh ngha lp Bus k tha t hai lp c s: Car v PublicTransport. Nhng c ba lp ny u nh ngha mt phng thc show() t gii thiu:
class Car{ public: void show(); }; class PublicTransport{ public: void show(); }; class Bus: public Car, public PublicTransport{ public: void show(); };

134

Chng 6: Tnh k tha v a hnh

Khi , khai bo:


Bus myBus;

v li gi hm:
myBus.show(); myBus.Car::show(); // Gi n hm ca lp Bus // Gi n hm ca lp Car

myBus.PublicTransport::show();// Gi n hm ca lp PublicTransport

Chng trnh 6.7 minh ho vic truy nhp n cc thnh phn trng nhau trong cc lp c s v c nh ngha li trong lp dn xut.

Chng trnh 6.7


#include<stdio.h> #include<conio.h> #include<string.h> /* nh ngha lp Car */ class Car{ int char public: Car(); Car(int, char[], float); void show(); // Khi to khng tham s // Khi to tham s // Gii thiu speed; mark[20]; // Tc // Nhn hiu // Gi xe

float price;

float getSpeed(){return speed;}; char[] getMark(){return mark;}; float getPrice(){return price;}; }; Car::Car(){ speed = 0; strcpy(mark, ); price = 0; } // Khi to tham s Car::Car(int speedIn, char markIn[], float priceIn){ speed = speedIn; strcpy(mark, markIn); price = priceIn; } // Khi to khng tham s

135

Chng 6: Tnh k tha v a hnh


// Gii thiu void Car::show(){ cout << This is a << mark << having a speed of << speed << km/h and its price is $ << price << endl; return; } /* nh ngha lp PublicTransport */ class PublicTransport{ float ticket; public: PublicTransport(); PublicTransport(float); void show(); }; PublicTransport::PublicTransport(){ ticket = 0; } // Khi to tham s PublicTransport::PublicTransport(float ticketIn){ ticket = ticketIn; } // Gii thiu void PublicTransport::show(){ cout << This public transport had a ticket of $ << ticket << endl; return; } /* nh ngha lp Bus k tha t lp Car v PublicTransport */ class Bus: public Car, public PublicTransport{ // Th t khai bo int label; public: Bus(); void show(); }; // Khi to khng tham s // Khi to khng tham s // Gii thiu Bus(int, char[], float, float, int);// Khi to tham s // S hiu tuyn xe // Khi to khng tham s // Khi to khng tham s // Khi to tham s // Gii thiu // Gi v phng tin

float getTicket(){return ticket;};

136

Chng 6: Tnh k tha v a hnh


Bus::Bus(): Car(), Transport(){ label = 0; } // Khi to tham s Bus::Bus(int sIn, char mIn[], float pIn, float tIn, int lIn): Car(sIn, mIn, pIn), PublicTransport(tIn){ // Theo th t dn xut label = lIn; } // Gii thiu void Bus::show(){ cout << This is a bus on the line << label << , its speed is << getSpeed() << km/h, mark is << getMark() << , price is $ << getPrice() << and ticket is << getTicket() << endl; return; } // phng thc main void main(){ clrscr(); Bus myBus(100, Mercedes, 3000, 1.5, 27); myBus.Car::show(); myBus.PublicTransport:: show(); myBus.show(); return; } // Hm ca lp Car // Hm ca lp PublicTransport // Hm ca lp Bus // Theo th t dn xut

Chng trnh 6.7 s in ra thng bo nh sau:


This is a Mercedes having a speed of 100km/h and its price is $3000 This public transport had a ticket of $1.5 This is a bus on the line 27, its speed is 100km/h, mark is Mercedes, price is $3000 and ticket is $1.5

Dng th nht l kt qu ca phng thc show() ca lp Car, dng th hai, tng ng l kt qu phng thc show() ca lp PublicTransport, dng th ba l kt qu phng thc show() ca lp Bus.

137

Chng 6: Tnh k tha v a hnh

6.5 LP C S TRU TNG


6.5.1 t vn
S cho php a k tha trong C++ dn n mt s hu qu xu, l s ng gia cc thnh phn ca cc lp c s, khi c t nht hai lp c s li cng c k tha t mt lp c s khc. Xt trng hp: Lp Bus k tha t lp Car v lp PublicTransport. Nhng lp Car v lp PublicTransport li cng c tha k t lp Engine (ng c). Lp Engine c mt thuc tnh l power (cng sut ca ng c).
Engine

Car

PublicTransport

Bus

Khi , ny sinh mt s vn nh sau: Cc thnh phn d liu ca lp Engine b lp li trong lp Bus hai ln: mt ln do k tha theo ng Bus::Car::Engine, mt ln theo ng Bus::PublicTransport::Engine. iu ny l khng an ton. Khi khai bo mt i tng ca lp Bus, hm khi to ca lp Engine cng c gi hai ln: mt ln do gi truy hi t hm khi to lp Car, mt ln do gi truy hi t hm khi to lp PublicTransport. Khi gii phng mt i tng ca lp Bus, hm hu b ca lp Engine cng s b gi ti hai ln.

trnh cc vn ny, C++ cung cp mt khi nim l k tha t lp c s tru tng. Khi , ta cho cc lp Car v PublicTransport k tha tru tng t lp Engine. Bng cch ny, cc thnh phn ca lp Engine ch xut hin trong lp Bus ng mt ln. Lp Engine c gi l lp c s tru tng ca cc lp Car v PublicTransport.

6.5.2 Khai bo lp c s tru tng


Vic ch ra mt s k tha tru tng c thc hin bng t kho virtual khi khai bo lp c s:
class <Tn lp c s>: <T kho dn xut> virtual <Tn lp c s>{ }; // Khai bo cc thnh phn b sung

V d:
class Engine{ // Cc thnh phn lp Engine

138

Chng 6: Tnh k tha v a hnh


}; class Car: public virtual Engine{ }; // Khai bo cc thnh phn b sung

l khai bo lp Car, k tha t lp c s tru tng Engine, theo kiu dn xut public. Lu : T kho virtual c vit bng ch thng. T kho virtual khng nh hng n phm vi truy nhp thnh phn lp c s, phm vi ny vn c quy nh bi t kho dn xut nh thng thng. T kho virtual ch ra mt lp c s l tru tng nhng li c vit trong khi khai bo lp dn xut. Mt lp dn xut c th c k tha t nhiu lp c s tru tng

6.5.3 Hm khi to lp c s tru tng


Khc vi cc lp c s thng thng, khi c mt lp dn xut t mt lp c s tru tng, li c ly lm c s cho mt lp dn xut khc th trong hm khi to ca lp dn xut cui cng, vn phi gi hm khi to tng minh ca lp c s tru tng. Hn na, hm khi to ca lp c s tru tng phi c gi sm nht. V d, khi lp Car v lp PublicTransport c k tha t lp c s tru tng Engine. Sau , lp Bus c k tha t hai lp Car v PublicTranport. Khi , hm khi to ca lp Bus cng phi gi tng minh hm khi to ca lp Engine, theo th t sm nht, sau mi gi n hm khi to ca cc lp Car v PublicTransport.
class Engine{ public: Engine(){ }; }; class Car: public virtual Engine{ public: Car(): Engine(){ }; }; class PublicTransport: public virtual Engine{ public: PublicTransport():Engine(){ }; }; class Bus: public Car, public PublicTransport{ public: // Gi hm khi to tng minh ca lp c s tru tng Bus():Engine(), Car(), PublicTransport(){ }; }; //Lp c s virtual //Lp c s virtual

Lu : Trong trng hp lp Engine khng phi l lp c s tru tng ca cc lp Car v PublicTransport, th trong hm khi to ca lp Bus khng cn gi hm khi to ca lp 139

Chng 6: Tnh k tha v a hnh

Engine, m ch cn gi ti cc hm khi to ca cc lp c s trc tip ca lp Bus l lp Car v lp PublicTransport. Chng trnh 6.8 minh ho vic khai bo v s dng lp c s tru tng: lp Engine l lp c s tru tng ca cc lp Car v lp PublicTransport. Hai lp ny, sau , li lm lp c s ca lp Bus. Chng trnh 6.8
#include<stdio.h> #include<conio.h> #include<string.h> /* nh ngha lp Engine */ class Engine{ int public: Engine(){power = 0;}; void show(); }; // Gii thiu void Engine::show(){ cout << This is an engine having a power of << power << KWH << endl; return; } /* nh ngha lp Car dn xut t lp c s tru tng Engine*/ class Car: public virtual Engine{ int char public: Car(); void show(); // Khi to khng tham s // Gii thiu Car(int, int, char[], float); // Khi to tham s float getSpeed(){return speed;}; char[] getMark(){return mark;}; float getPrice(){return price;}; }; speed; mark[20]; // Tc // Nhn hiu // Gi xe // Khi to khng tham s // Gii thiu Engine(int pIn){power = pIn;};// Khi to tham s float getPower(){return power;}; power; // Cng sut

float price;

140

Chng 6: Tnh k tha v a hnh


Car::Car(): Engine(){ speed = 0; strcpy(mark, ); price = 0; } // Khi to tham s Car::Car(int pwIn, int sIn, char mIn[], float prIn): Engine(pwIn){ speed = sIn; strcpy(mark, mIn); price = prIn; } // Gii thiu void Car::show(){ cout << This is a << mark << having a speed of << speed << km/h, its power is << getPower() << KWh and price is $ << price << endl; return; } /* nh ngha lp PublicTransport dn xut tru tng t lp Engine */ class PublicTransport: public virtual Engine{ float ticket; public: PublicTransport(); PublicTransport(int, float); void show(); }; // Khi to khng tham s PublicTransport::PublicTransport(): Engine(){ ticket = 0; } // Khi to tham s PublicTransport::PublicTransport(int pwIn, float tIn): Engine(pwIn){ ticket = tIn; } // Gii thiu void PublicTransport::show(){ // Khi to khng tham s // Khi to tham s // Gii thiu // Gi v phng tin // Khi to khng tham s

float getTicket(){return ticket;};

141

Chng 6: Tnh k tha v a hnh


cout << This is a public transport havn a ticket of $ << ticket << and its power is << getPower() << KWh << endl; return; } /* nh ngha lp Bus k tha t lp Car v PublicTransport */ class Bus: public Car, public PublicTransport{ // Th t khai bo int label; public: Bus(); void show(); }; // Khi to khng tham s Bus::Bus(): Engine(), Car(), Transport(){ label = 0; } // Khi to tham s Bus::Bus(int pwIn, int sIn, char mIn[], float prIn, float tIn, int lIn): Engine(pwIn), Car(sIn, mIn, prIn), PublicTransport(tIn){ label = lIn; } // Gii thiu void Bus::show(){ cout << This is a bus on the line << label << , its speed is << getSpeed() << km/h, power is << Car::getPower() << KWh, mark is << getMark() << , price is $ << getPrice() << and ticket is << getTicket() << endl; return; } // phng thc main void main(){ clrscr(); Bus myBus(250, 100, Mercedes, 3000, 1.5, 27); myBus.Car::Engine::show(); // Hm ca lp Engine // Theo th t dn xut // Khi to khng tham s // Gii thiu Bus(int,int,char[],float,float,int);// Khi to tham s // S hiu tuyn xe

142

Chng 6: Tnh k tha v a hnh


myBus.PublicTransport::Engine::show();// Hm ca lp Engine myBus.Car::show(); myBus.PublicTransport:: show(); myBus.show(); return; } // Hm ca lp Car // Hm ca lp PublicTransport // Hm ca lp Bus

Chng trnh 6.8 s in ra thng bo nh sau:


This is an engine having a power of 250KWh This is an engine having a power of 250KWh This is a Mercedes having a speed of 100km/h, its power is 250KWh and price is $3000 This is a public transport having a ticket of $1.5 and its power is 250KWh This is a bus on the line 27, its speed is 100km/h, power is 250KWh, mark is Mercedes, price is $3000 and ticket is $1.5

Hai dng u l kt qu ca phng thc show() ca lp Engine: mt ln gi qua lp Car, mt ln gi qua lp PublicTransport, chng cho kt qu nh nhau. Dng th ba l kt qu phng thc show() ca lp Car. Dng th t, tng ng l kt qu phng thc show() ca lp PublicTransport. Dng th nm l kt qu phng thc show() ca lp Bus.

6.6 A HNH
6.6.1 t vn
S k tha trong C++ cho php c s tng ng gia lp c s v cc lp dn xut trong s tha k: Mt con tr c kiu lp c s lun c th tr n a ch ca mt i tng ca lp dn xut. Tuy nhin, khi thc hin li gi mt phng thc ca lp, trnh bin dch s quan tm n kiu ca con tr ch khng phi i tng m con tr ang tr ti: phng thc ca lp m con tr c kiu c gi ch khng phi phng thc ca i tng m con tr ang tr ti c gi.
class Car{ public: void show(); }; class Bus: public Car{ public: void show(); };

V d, lp Bus k tha t lp Car, c hai lp ny u nh ngha phng thc show():

khi , nu ta khai bo mt con tr lp Bus, nhng li tr vo a ch ca mt i tng lp Car:

143

Chng 6: Tnh k tha v a hnh


Bus myBus; Car *ptrCar = &myBus; // ng

nhng khi gi:


ptrCar->show();

th chng trnh s gi n phng thc show() ca lp Car (l kiu ca con tr ptrCar), m khng gi ti phng thc show() ca lp Bus (l kiu ca i tng myBus m con tr ptrCar ang tr ti). gii quyt vn ny, C++ a ra mt khi nim l phng thc tru tng. Bng cch s dng phng thc tru tng. Khi gi mt phng thc t mt con tr i tng, trnh bin dch s xc nh kiu ca i tng m con tr ang tr n, sau n s gi phng thc tng ng vi i tng m con tr ang tr ti.

6.6.2 Khai bo phng thc tru tng


Phng thc tru tng (cn gi l phng thc o, hm o) c khai bo vi t kho virtual: Nu khai bo trong phm vi lp:
virtual <Kiu tr v> <Tn phng thc>([<Cc tham s>]);

Nu nh ngha ngoi phm vi lp:


virtual <Kiu tr v> <Tn lp>::<Tn phng thc>([<Cc tham s>]){}

V d:
class Car{ public: virtual void show(); };

l khai bo phng thc tru tng show() ca lp Car: phng thc khng c tham s v khng cn gi tr tr v (void). Lu : T kho virtual c th t trc hay sau kiu tr v ca phng thc. Vi cng mt phng thc c khai bo lp c s ln lp dn xut, ch cn dng t kho virtual mt trong hai ln nh ngha phng thc l : hoc lp c s, hoc lp dn xut. Trong trng hp cy k tha c nhiu mc, cng ch cn khai bo phng thc l tru tng (virtual) mt mc bt k. Khi , tt c cc phng thc trng tn vi phng thc tt c cc mc u c coi l tru tng. i khi khng cn thit phi nh ngha chng (trong lp dn xut) mt phng thc c khai bo tru tng trong lp c s.

6.6.3 S dng phng thc tru tng a hnh


Mt khi phng thc c khai bo l tru tng th khi mt con tr gi n phng thc , chng trnh s thc hin phng thc tng ng vi i tng m con tr ang tr ti, thay v

144

Chng 6: Tnh k tha v a hnh

thc hin phng thc ca lp cng kiu vi con tr. y c gi l hin tng a hnh (tng ng bi) trong C++. Chng trnh 6.9 minh ho vic s dng phng thc tru tng: lp Bus k tha t lp Car, hai lp ny cng nh ngha phng thc tru tng show(). Khi ta dng mt con tr c kiu lp Car tr vo a ch ca mt i tng kiu Car, n s gi phng thc show() ca lp Car. Khi ta dng cng con tr , tr vo a ch ca mt i tng kiu Bus, n s gi phng thc show() ca lp Bus.

Chng trnh 6.9


#include<stdio.h> #include<conio.h> #include<string.h> /* nh ngha lp Car */ class Car{ private: int char public: int getSpeed(){return speed;};// c tc xe char[] getMark(){return mark;};// c nhn xe float getPrice(){return price;};// c gi xe // Khi to thng tin v xe Car(int speedIn=0, char markIn[]=, float priceIn=0); virtual void show(); }; /* Khai bo phng thc bn ngoi lp */ Car::Car(int speedIn, char markIn[], float priceIn){ speed = speedIn; strcpy(mark, markIn); price = priceIn; } // Phng thc tru tng gii thiu xe virtual void Car::show(){ cout << This is a << mark << having a speed of << speed << km/h and its price is $ << price << endl; return; } // Gii thiu xe, tru tng speed; mark[20]; // Tc // Nhn hiu // Gi xe

float price;

145

Chng 6: Tnh k tha v a hnh

/* nh ngha lp Bus k tha t lp Car */ class Bus: public Car{ int label; public: // Khi to tham s Bus(int sIn=0, char mIn[]=, float pIn=0, int lIn=0); void show(); }; // Khi to tham s Bus::Bus(int sIn, char mIn[], float pIn, int lIn):Car(sIn, mIn, pIn){ label = lIn; } // nh ngha np chng phng thc tru tng void Bus::show(){ // Gii thiu xe bus cout << This is a bus of type << getMark() << , on the line << label << , having a speed of << getSpeed() << km/h and its price is $ << getPrice() << endl; return; } // Chng trnh chnh void main(){ clrscr(); Car *ptrCar, myCar(100, Ford, 3000); Bus myBus(150, Mercedes, 5000, 27);// Bin i tng ca lp Bus ptrCar = &myCar; ptrCar->show(); ptrCar = &myBus; ptrCar->show(); return; } // Tr n i tng lp Car // Phng thc ca lp Car // Tr n i tng lp Bus // Phng thc ca lp Bus // Gii thiu xe // S hiu tuyn xe

Chng trnh 6.9 hin th kt qu thng bo nh sau:


This is a Ford having a speed of 100km/h and its price is $3000 This is a bus of type Mercedes, on the line 27, having a speed of 150km/h and its price is $5000

Dng th nht l kt qu khi con tr ptrCar tr n a ch ca i tng myCar, thuc lp Car nn s gi phng thc show() ca lp Car vi cc d liu ca i tng myCar: (100, Ford, 146

Chng 6: Tnh k tha v a hnh

3000). Dng th hai tng ng l kt qu khi con tr ptrCar tr n a ch ca i tng myBus, thuc lp Bus nn s gi phng thc show() ca lp Bus, cng vi cc tham s ca i tng myBus: (150, Mercedes, 5000, 27). Lu : Trong trng hp lp dn xut khng nh ngha li phng thc tru tng, th chng trnh s gi phng thc ca lp c s, nhng vi d liu ca lp dn xut.

V d, nu trong chng trnh 6.9, lp Bus khng nh ngha chng phng thc tru tng show() th kt qu hin th s l hai dng thng bo ging nhau, ch khc nhau d liu ca hai i tng khc nhau:
This is a Ford having a speed of 100km/h and its price is $3000 This is a Mercedes having a speed of 150km/h and its price is $5000

TNG KT CHNG 6
Ni dung chng 6 trnh by cc vn c bn lin quan n tha k v tng ng bi trong C++ nh sau: Khai bo mt lp dn xut k tha t mt lp c s bng khai bo k tha : i km vi mt t kho dn xut. C ba loi dn xut khc nhau, c quy nh bi ba t kho dn xut khc nhau: private, protected v public. Kiu dn xut ph bin l dn xut public. S k tha to ra mi quan h tng ng gia lp c s v lp dn xut: c th chuyn kiu ngm nh (trong php gn, php truyn i s, php tr a ch) t mt i tng lp c s n mt i tng lp dn xut. Nhng khng th chuyn kiu ngc li t lp dn xut vo lp c s. Hm khi to ca lp dn xut c th gi tng minh hoc gi ngm nh hm khi to ca lp c s. Hm khi to lp c s bao gi cng c thc hin trc hm khi to lp dn xut. Hm hu b ca lp dn xut lun gi ngm nh hm hu b ca lp c s. Tri vi hm khi to, hm hu b lp c s lun c thc hin sau hm hu b ca lp dn xut. C th truy nhp cc phng thc ca lp c s t lp dn xut, phm vi truy nhp l ph thuc vo kiu dn xut: private, protected hoc public. iu ny cho php s dng li m ngun ca lp c s, m khng cn nh ngha li lp dn xut. Trong lp dn xut, c th nh ngha chng mt s phng thc ca lp c s. Khi c nh ngha chng, mun truy nhp vo phng thc lp c s, phi dng ton t phm vi lp <Tn lp>::. C++ cn cho php mt lp c th c dn xut t nhiu lp c s khc nhau, gi l a k tha. Trong a k tha, quan h gia lp dn xut vi mi lp c s l tng t nh trong n k tha. Trong a k tha, hm khi to lp dn xut s gi tng minh (hoc ngm nh) hm khi to cc lp c s, theo th t khai bo k tha. Hm hu b lp dn xut li gi ngm nh cc hm hu b ca cc lp c s.

147

Chng 6: Tnh k tha v a hnh

C++ cung cp khi nim k tha t lp c s tru tng trnh trng hp trng lp d liu lp dn xut, khi cc lp c s li cng c dn xut t mt lp khc. C++ cng cho php c ch tng ng bi (a hnh) bng cch nh ngha mt phng thc l tru tng trong s tha k. Khi , mt con tr lp c s c th tr n a ch ca mt i tng lp dn xut, v phng thc c thc hin l tu thuc vo kiu ca i tng m con tr ang tr ti.

CU HI V BI TP CHNG 6
1. Trong cc khai bo sau, khai bo no l ng c php k tha lp: a. class A: b. class A: c. class A: d. class A::
public class B{}; public B{}; class B{}; public B{};

2. Trong cc kiu dn xut sau, t cc phng thc lp dn xut, khng th truy nhp n cc thnh phn private ca lp c s: a. private b. protected c. public d. C ba kiu trn 3. Trong cc kiu dn xut sau, t i tng ca lp dn xut, c th truy nhp n cc thnh phn ca lp c s: a. private b. protected c. public d. C ba kiu trn 4. A l lp dn xut public t lp c s B. Gi s c cc kiu khai bo:
A myA, *ptrA; B myB, *ptrB;

Khi , cc lnh no sau y l khng c li: a. myA = myB; b. myB = myA; c. ptrA = &myB; d. ptrB = &myA; e. ptrA = ptrB; f. ptrB = ptrA; 5. A l lp dn xut public t lp c s B. Gi s c cc kiu khai bo v nguyn mu hm:
A myA; B myB; void show(A, B);

148

Chng 6: Tnh k tha v a hnh

Khi , cc lnh gi hm no sau y l khng c li: a. show(myA, myA); b. show(myA, myB); c. show(myB, myA); d. show(myB, myB); 6. A l lp dn xut public t lp c s B. Gi s B c mt hm khi to:
B(int, float);

Khi , nh ngha hm khi to no sau y ca lp A l chp nhn c: a. A::A(){}; b. A::A(): B(){}; c. A::A(int x, float y): B(){}; d. A::A(int x, float y): B(x, y){}; 7. A l lp dn xut public t lp c s B. Gi s B c hai hm khi to:
B(); B(int, float);

Khi , nhng nh ngha hm khi to no sau y ca lp A l chp nhn c: a. A::A(){}; b. A::A(): B(){}; c. A::A(int x, float y): B(){}; d. A::A(int x, float y): B(x, y){}; 8. A l lp dn xut public t lp c s B. Gi s B c hm hu b tng minh:
~B();

Khi , nhng nh ngha hm hu b no sau y ca lp A l chp nhn c: a. A::~A(){}; b. A::~A(): ~B(){}; c. A::~A(int x){}; d. A::~A(int x): ~B(){}; 9. Gi s B l mt lp c khai bo:
class B{ int x; public: int getx(); };

v A l mt lp dn xut t lp B theo kiu private:


class A: private B{ };

khi , nu myA l mt i tng lp A, lnh no sau y l chp chn c: a. myA.x; b. myA.getx(); c. C hai lnh trn.

149

Chng 6: Tnh k tha v a hnh

d. Khng lnh no c. 10. Gi s B l mt lp c khai bo:


class B{ int x; public: int getx(); };

v A l mt lp dn xut t lp B theo kiu protected:


class A: protected B{ };

khi , nu myA l mt i tng lp A, lnh no sau y l chp chn c: a. myA.x; b. myA.getx(); c. C hai lnh trn. d. Khng lnh no c. 11. Gi s B l mt lp c khai bo:
class B{ int x; public: int getx(); };

v A l mt lp dn xut t lp B theo kiu public:


class A: public B{ };

khi , nu myA l mt i tng lp A, lnh no sau y l chp chn c: a. myA.x; b. myA.getx(); c. C hai lnh trn. d. Khng lnh no c. 12. Gi s B l mt lp c khai bo:
class B{ public: void show(); };

v A l mt lp dn xut t lp B theo kiu public, c nh ngha chng hm show():


class A: public B{ public: void show(); };

khi , nu myA l mt i tng lp A, mun thc hin phng thc show() ca lp B th lnh no sau y l chp chn c: a. myA.show(); b. myA.B::show(); c. B::myA.show();

150

Chng 6: Tnh k tha v a hnh

d. A::B::show(); 13. Mun khai bo mt lp A k tha t hai lp c s B v C, nhng lnh no l ng: a. class A: B, C{}; b. class A: public B, C{}; c. class A: public B, protected C{}; d. class A: public B, public C{}; 14. B l mt lp c hai hm khi to:
B(); B(int);

C cng l mt lp c hai hm khi to:


C(); C(int, int);

V A l mt lp k tha t B v C:
class A: public B, public C{};

Khi , hm khi to no sau y ca lp A l chp nhn c: a. A::A(){}; b. A::A():B(),C(){}; c. A::A(int x, int y): C(x, y){}; d. A::A(int x, int y, int z): B(x), C(y, z){}; e. A::A(int x, int y, int z): C(x, y), B(z){}; 15. Mun khai bo lp A k tha t lp c s tru tng B, nhng khai bo no sau y l ng: a. virtual class A: public B{}; b. class virtual A: public B{}; c. class A: virtual public B{}; d. class A: public virtual B{}; 16. Lp A l mt lp dn xut, c k tha t lp c s B. Hai lp ny u nh ngha hm show(). Mun hm ny tr thnh tru tng th nhng nh ngha no sau y l ng: a. void A::show(){} v void B::show(){} b. virtual void A::show(){} v void B::show(){} c. void A::show(){} v virtual void B::show(){} d. virtual void A::show(){} v virtual void B::show(){} 17. Khai bo lp ngi (Human) bao gm cc thuc tnh sau: Tn ngi (name) Tui ca ngi (age) Gii tnh ca ngi (sex)

Sau khai bo lp C nhn (Person) k tha t lp Human va c nh ngha trn.

151

Chng 6: Tnh k tha v a hnh

18. B sung cc phng thc truy nhp cc thuc tnh ca lp Human, cc phng thc ny c tnh cht public. 19. B sung thm cc thuc tnh ca lp Person: a ch v s in thoi. Thm cc phng thc truy nhp cc thuc tnh ny trong lp Person. 20. Xy dng hai hm khi to cho lp Human: mt hm khng tham s, mt hm vi ba tham s tng ng vi ba thuc tnh ca n. Sau , xy dng hai hm khi to cho lp Person c s dng cc hm khi to ca lp Human: mt hm khng tham s, mt hm nm tham s (ng vi hai thuc tnh ca lp Person v ba thuc tnh ca lp Human). 21. Xy dng mt hm main, trong c yu cu nhp cc thuc tnh to mt i tng c kiu Human v mt i tng c kiu Person, thng qua cc hm set thuc tnh xy dng. 22. Xy dng hm show() cho hai lp Human v Person. Thay i hm main: dng mt i tng c kiu lp Person, gi hm show() ca lp Person, sau li gi hm show() ca lp Human t chnh i tng . 23. Khai bo thm mt lp ngi lao ng (Worker), k tha t lp Human, c thm thuc tnh l s gi lm vic trong mt thng (hour) v tin lng ca ngi (salary). Sau , khai bo thm mt lp nhn vin (Employee) k tha ng thi t hai lp: Person v Worker. Lp Employee c b sung thm mt thuc tnh l chc v (position). 24. Chuyn lp Human thnh lp c s tru tng ca hai lp Person v Worker. Xy dng thm hai hm show() ca lp Worker v lp Employee. Trong hm main, khai bo mt i tng lp Employee, sau gi n cc hm show() ca cc lp Employee, Person, Worrker v Human. 25. Chuyn hm show() trong cc lp trn thnh phng thc tru tng. Trong hm main, khai bo mt con tr kiu Human, sau , cho n tr n ln lt cc i tng ca cc lp Human, Person, Worker v Employee, mi ln u gi phng thc show() hin th thng bo ra mn hnh.

152

Chng 7: Mt s lp quan trng

CHNG 7 MT S LP QUAN TRNG


Ni dung chng ny tp trung trnh by mt s lp c bn trong C++: Lp vt cha (Container) Lp tp hp (Set) Lp chui k t (String) Lp ngn xp (Stack) v hng i (Queue) Lp danh sch lin kt (Lists)

7.1 LP VT CHA
Lp vt cha (Container) bao gm nhiu lp c bn ca C++: lp Vector, lp danh sch (List) v cc kiu hng i (Stack v Queue), lp tp hp (Set) v lp nh x (Map). Trong chng ny s trnh by mt s lp c bn ca Container l: Set, Stack, Queue v List

7.1.1 Giao din ca lp Container


Cc lp c bn ca Container c mt s ton t v phng thc c chc nng ging nhau, bao gm: ==: <: begin(): end(): size(): empty(): front(): back(): []: insert(): Ton t so snh bng Ton t so snh nh hn Gi tr khi u ca con chy iterator Gi tr kt thc ca con chy iterator S lng phn t i tng ca vt cha Vt cha l rng Phn t th nht ca vt cha Phn t cui ca vt cha Ton t truy nhp n phn t ca vt cha Thm vo vt cha mt (hoc mt s) phn t

push_back(): Thm mt phn t vo cui vt cha push_front(): Thm mt phn t vo u vt cha erase(): pop_back(): pop_front(): Loi b mt (hoc mt s) phn t khi vt cha Loi b phn t cui ca vt cha Loi b phn t u ca vt cha.

Ngoi ra, tu vo cc lp c th m c mt s ton t v phng thc c trng ca lp . Cc ton t v phng thc ny s c trnh by chi tit trong ni dung tng lp tip theo.

153

Chng 7: Mt s lp quan trng

7.1.2 Con chy Iterator


Iterator l mt con tr tr n cc phn t ca vt cha. N ng vai tr l mt con chy cho php ngi dng di chuyn qua tng phn t c mt trong vt cha. Mi php tng gim mt n v ca con chy ny tng ng vi mt php dch n phn t tip theo hay phn t trc ca phn t hin ti m con chy ang tr ti.

Khai bo con chy


C php chung khai bo mt bin con chy iterator nh sau:
Tn_lp<T>::iterator Tn_con_chy;

Trong : V d:
Set<int>::iterator iter;

Tn lp: l tn ca lp c bn ta ang dng, v d lp Set, lp List T: l tn kiu lp ca cc phn t cha trong vt cha. Kiu c th l cc kiu c bn trong C++, cng c th l cc kiu phc tp do ngi dng t nh ngha. Tn con chy: l tn bin s c s dng lm bin chy trong vt cha.

l khai bo mt bin con chy iter cho lp tp hp (Set), trong , cc phn t ca lp vt cha c kiu c bn int. Hoc:
List<Person>::iterator iter;

l khai bo mt bin con chy iter cho lp danh sch (List), trong , cc phn t c kiu lp do ngi dng t nh ngha l Person.

S dng con chy


Con chy c s dng khi cn duyt ln lt cc phn t c mt trong vt cha. V d sau s in ra cc phn t c kiu int ca mt tp hp:
Set<int> mySet; Set<int>::iterator i; // Khai bo mt i tng ca lp Set, // cc phn t c kiu int // Khai bo con chy ca lp Set, // cc phn t c kiu int // Thm phn t vo cout << mySet[i] << ; for(i=mySet.begin(); i<mySet.end(); i++)

Lu : Bin con chy phi c khi u bng phng thc begin() v kt thc bng phng thc end() ca i tng cn duyt tng ng. Mt con chy c th c s dng nhiu ln cho nhiu i tng nu chng c cng kiu lp vt cha v cc phn t ca chng cng cng kiu.

154

Chng 7: Mt s lp quan trng

7.2 LP TP HP
Lp tp hp (Set) cha cc phn t c cng kiu, khng phn bit th t gia cc phn t nhng li phn bit gia cc phn t: cc phn t l khc nhau tng i mt. Mun s dng lp tp hp, phi c ch th u tp:
#include<set.h> // Th vin ring ca lp tp hp // Th vin chung cho cc lp vt cha

hoc:
#include<stl.h>

7.2.1 Hm khi to
Lp tp hp c ba kiu khi to chnh: Khi to khng tham s:
Set<T> Tn_i_tng;

Khi to bng mt mng cc i tng phn t:


Set<T> Tn_i_tng(T*, chiu_di_mng);

Khi to bng mt i tng thuc lp tp hp khc:


Set<T> Tn_i_tng(Set<T>);

Trong : V d:
Set<int> mySet;

T: l tn kiu ca cc phn t ca tp hp. Kiu ny c th l kiu c bn ca C++, cng c th l cc kiu cu trc (struct) hoc lp (class) do ngi dng t nh ngha.

l khai bo mt i tng mySet ca lp tp hp, mySet khi u cha c phn t no, cc phn t ca i tng ny c kiu c bn int. Hoc:
Person *myPerson = new Person[10]; Set<Person> mySet(myPerson, 10); // Khi to mng i tng // Khai bo tp hp

l khai bo mt i tng mySet ca lp tp hp, c 10 phn t tng ng vi cc phn t trong mng ng myPerson, cc phn t c kiu lp Person.

7.2.2 Ton t
Cc ton t trn lp tp hp l tng ng vi cc ton t s hc trn tp hp thng thng: OR |, AND &, XOR ^ v php tr -.

Php ton | v |=
Php ton ny tr v php hp (OR) ca hai i tng ca lp tp hp, kt qu cng l mt i tng ca lp tp hp:
<i_tng_1> = <i_tng_2> | <i_tng_3>; <i_tng_1> |= <i_tng_2>;

V d, mySet1 cha hai phn t kiu int {1,2}, mySet2 cha ba phn t kiu int {2,3,4}, v:
mySet3 = mySet1 | mySet2;

th mySet3 s cha cc phn t kiu int l {1,2,3,4}.

155

Chng 7: Mt s lp quan trng

Php ton & v &=


Php ton ny tr v php giao (AND) gia hai i tng tp hp, kt qu cng l mt i tng tp hp:
<i_tng_1> = <i_tng_2> & <i_tng_3>; <i_tng_1> &= <i_tng_2>;

V d, mySet1 cha hai phn t kiu int {1,2}, mySet2 cha ba phn t kiu int {2,3,4}, v:
mySet3 = mySet1 & mySet2;

th mySet3 s cha cc phn t c kiu int l {2}.

Php ton ^ v ^=
Php ton ny tr v php hp ngoi (XOR) gia hai i tng tp hp, kt qu cng l mt i tng tp hp:
<i_tng_1> = <i_tng _2> <i_tng_1> ^= <i_tng_2>; ^ <i_tng_3>;

V d, mySet1 cha hai phn t kiu int {1,2}, mySet2 cha ba phn t kiu int {2,3,4}, v:
mySet3 = mySet1 ^ mySet2;

th mySet3 s cha cc phn t c kiu int l {1,3,4}.

Php ton - v -=
Php ton ny tr v php hiu (loi tr) gia hai i tng tp hp, kt qu cng l mt i tng tp hp:
<i_tng_1> = <i_tng_2> - <i_tng_3>; <i_tng_1> -= <i_tng_2>;

V d, mySet1 cha hai phn t kiu int {1,2}, mySet2 cha ba phn t kiu int {2,3,4}, v:
mySet3 = mySet1 - mySet2;

th mySet3 s cha cc phn t c kiu int l {1}.

7.2.3 Phng thc


Lp tp hp c mt s phng thc c bn sau: Thm mt phn t vo tp hp Loi mt phn t khi tp hp Tm kim mt phn t trong tp hp

Thm mt phn t vo tp hp
C hai c php thm mt phn t vo tp hp:
pair<iterator, bool> insert(T&); iterator insert(<V tr con chy>, T&);

Trong :

156

Chng 7: Mt s lp quan trng

Phng thc th nht thm mt phn t vo tp hp, nu phn t c mt trong tp hp, tr v false v v tr con chy ca phn t . Nu phn t cha tn ti, tr v true v v tr con chy ca phn t mi thm vo. Phng thc th hai cng thm vo mt phn t, nhng ch kim tra xem phn t tn ti hay cha bt u t v tr con chy c ch ra trong bin <v tr con chy>. Phng thc ny tr v v tr con chy ca phn t mi thm vo (nu thnh cng) hoc v tr ca phn t c mt.
mySet.insert(10);

V d, mySet l mt tp hp kiu int: s thm mt phn t c gi tr 10 vo tp hp. Lu : Do tun th theo l thuyt tp hp, nn khi chn vo tp hp nhiu ln vi cng mt gi tr phn t. Trong tp hp ch tn ti duy nht mt gi tr phn t , khng c trng lp.

Loi mt phn t khi tp hp


C ba c php loi b phn t khi tp hp:
int erase(T&); void erase(<v tr con chy>); void erase(<v tr bt u>, <v tr kt thc>);

Trong : T: l tn kiu cc phn t ca tp hp. Phng thc th nht xo phn t c gi tr c ch r trong tham s u vo. Phng thc th hai loi b phn t v tr ca con chy c xc nh bi tham s u vo. Phng thc th ba loi b mt s phn t nm trong phm vi t <v tr bt u> cho n <v tr kt thc> ca con chy.
mySet.erase(10);

V d, mySet l mt tp hp cc phn t c kiu int: s xo phn t c gi tr 10, hoc:


mySet.erase((Set<int>::iterator)10);

s xo phn t v tr th 10 trong tp hp, hoc:


mySet.erase(mySet.begin(), mySet.end());

s xo ton b cc phn t hin c ca tp hp mySet.

Tm kim mt phn t trong tp hp


C hai c php tm kim mt phn t trong tp hp:
iterator find(T&); int count(T&);

Trong :

157

Chng 7: Mt s lp quan trng

Phng thc th nht tm phn t c gi tr xc nh bi tham s u vo, kt qu l v tr con chy ca phn t . Phng th th hai ch kim tra xem phn t c xut hin trong tp hp hay khng: tr v 1 nu c mt, tr v 0 nu khng c mt.
Set<int>::iterator index = mySet.find(10); cout << index;

V d, mySet l mt tp hp cc phn t c kiu int:

s hin th v tr con chy ca phn t c gi tr 10 trong tp hp mySet.

7.2.4 p dng
Chng trnh 7.1 minh ho mt s thao tc trn mt tp hp cc phn t c kiu char: thm phn t, loi b phn t, duyt cc phn t. Chng trnh 7.1
#include<stdio.h> #include<conio.h> #include<set.h> void main(){ clrscr(); Set<char> mySet; int function; do{ clrscr(); cout << CAC CHUC NANG: << endl; cout << 1: Them mot phan tu vao tap hop << endl; cout << 2: Loai bo mot phan tu khoi tap hop << endl; cout << 3: Xem tat ca cac phan tu cua tap hop << endl; cout << 5: Thoat! << endl; cout << ===================================== << endl; cout << Chon chuc nang: << endl; cin >> function; switch(function){ case 1: char phantu; cout << Ki tu them vao: ; cin >> phantu; mySet.insert(phantu); break; case 2: char phantu; cout << Loai bo ki tu: << endl; cin >> phantu; // Loi ra // Thm vo

158

Chng 7: Mt s lp quan trng


mySet.erase(phantu); break; case 3: // Duyt cout<<Cac phan tu cua tap hop la:<<endl; Set<char>::iterator i; for(i=mySet.begin(); i<mySet.end(); i++) cout << mySet[i] << ; break; }while(function != 5); return; }

7.3 LP CHUI
Lp chui (String) cng l mt loi lp cha, n cha mt tp cc phn t l mt dy cc k t c phn bit th t, cc phn t khng nht thit phi phn bit nhau. Mun s dng lp String, cn thm vo ch th u tp:
#include <string.h>

7.3.1 Hm khi to
Lp String c ba hm khi to chnh: V d:
String myStr;

Hm khi to khng tham s:


String <tn bin>;

Hm khi to t mt string khc:


String <tn bin>(const String &);

Hm khi to t mt mng cc k t:
String <tn bin>(char*, <chiu di mng>);

l khai bo mt chui myStr cha c phn t no (rng). Hoc:


String myStr(hello!);

l khai bo mt chui myStr c cc phn t theo th t l {h, e, l, l, o, !}. Hoc:


char* myChar = new char[10]; String myStr(myChar, 10);

l khai bo mt chui myStr c 10 phn t tng ng vi cc k t trong mng myChar. Lu : V d:


String myStr(12);

Trong trng hp khi to bng mt chui khc, ta c th truyn vo mt i s c kiu c bn khc, trnh bin dch s t ng chuyn i s sang dng string.

159

Chng 7: Mt s lp quan trng

th chui myStr s cha hai phn t k t{1, 2}. Hoc:


String myStr(15.55);

th chui myStr s cha nm phn t k t {1, 5, ., 5, 5}.

7.3.2 Ton t
Lp String c cc ton t c bn l: Php gn chui Php cng chui Php so snh chui Php vo/ra

Php gn chui =
C php php gn chui l tng t c php gn cc i tng c bn:
<Tn bin 1> = <Tn bin 2>;

V d:
String s1(12), s2; s2 = s1;

th chui s2 cng cha hai phn t nh s1 {1, 2}. Lu : C th gn trc tip cc i tng c bn cho chui:
String myStr = 12; String myStr = 12+1.5; // myStr c hai phn t {1, 2} // tng ng myStr = 13.5

Nhng php gn li c u tin thp hn php ton hc:

Php cng chui + v +=


Php cng chui s ni chui th hai vo sau chui th nht, kt qu cng l mt chui:
<Tn bin 1> = <Tn bin 2> + <Tn bin 3>; <Tn bin 1> += <Tn bin 2>;

V d:
String s1(12), s2(3); s1+= s2;

th s1 s c ba phn t k t {1, 2, 3}.

Php so snh chui


Cc php so snh chui u l cc php ton hai ngi, tr v kt qu dng bool (true/false): Php so snh ln hn >: Php so snh nh hn <:
chui_1 > chui_2;

Php so snh ln hn hoc bng >=: chui_1 >= chui_2;


chui_1 < chui_2;

Php so snh nh hn hoc bng <=: chui_1 <= chui_2;

160

Chng 7: Mt s lp quan trng

Lu : V d:

Php so snh bng ==:

chui_1 == chui_2;

Php so snh khc (khng bng) !=: chui_1 != chui_2; Php so snh chui thc hin so snh m ASCII ca tng k t hai chui theo th t tng ng cho n khi c s khc nhau u tin gia hai k t. Php so snh l php so snh da trn t in, c phn bit ch hoa v ch thng.
12 < a; a <= A; // c gi tr ng // c gi tr sai

Php vo/ra
V d:
String s(hello!); cout << s;

Php xut ra <<:

cout << bin_chui;

Php nhp vo >>: cin >> bin_chui;

s in ra mn hnh dng ch hello!.

7.3.3 Phng thc


Lp chui c mt s phng thc c bn: Ly chiu di chui Tm mt chui con Thm mt chui con Xo mt chui con Chuyn kiu k t

Ly chiu di chui
C php:
<bin_chui>.length();

tr v chiu di ca chui (s lng phn t k t trong chui). V d:


String s(hello!); cout << s.length();

s in ra mn hnh di chui s l 6.

Tm mt chui con
C php:
<bin_chui>.find(<Chui con>, <V tr bt u>, <Kiu so khp>);

Trong :

161

Chng 7: Mt s lp quan trng

V d:

Tham s th nht l chui con cn tm. Tham s th hai l v tr bt u tm, mc nh l bt u tm t phn t c ch s 0. Tham s th ba ch ra cch so khp c phn bit ch hoa vi ch thng: SM_IGNORE l khng phn bit, SM_SENSITIVE l c phn bit. Phng thc ny tr v kt qu dng bool, tng ng l c tm thy hay khng.

s.find(12, 0, SM_IGNORE);

s tm trong chui s xem c s xut hin ca chui 12 hay khng, v tr bt u tm l 0, vi cch tm khng phn bit ch hoa ch thng.

Thm mt chui con


C php:
<bin_chui>.insert(<v tr chn>, <chui con>);

Trong : V d:
s.insert(0, 12);

Tham s th nht l v tr ch s m ti , chui con s c chn vo Tham s th hai l chui con cn chn, chui con ny cng c th l mt k t.

s chn vo u chui s mt chui con c hai phn t 12.

Xo mt chui con
C php:
<bin_chui>.delete(<v tr bt u>, < di chui xo>);

Trong : V d:
s.delete(0, 2);

Tham s th nht l v tr bt u xo chui con Tham s th hai l di chui con b xo, gi tr mc nh l 1.

s xo hai k t u ca chui s.

Chuyn kiu k t
V d:
s.toUpper(); s.toLower(); // chuyn chui s thnh k t hoa // chuyn chui s thnh k t thng

i chui thnh cc k t hoa: i chui thnh cc k t thng:

<bin_chui>.toUpper(); <bin_chui>.toLower();

162

Chng 7: Mt s lp quan trng

7.3.4 p dng
Chng trnh 7.2 minh ho mt s thao tc c bn trn lp chui, c s dng th vin lp chui chun ca C++: cng thm mt chui, chn thm mt chui con, xo mt chui con, tm mt chui con Chng trnh 7.2
#include<stdio.h> #include<conio.h> #include<string.h> void main(){ clrscr(); String myStr; int function; do{ clrscr(); cout << CAC CHUC NANG: << endl; cout << 1: Cong them mot chuoi << endl; cout << 2: Chen them mot chuoi << endl; cout << 3: Xoa di mot chuoi << endl; cout << 4: Tim mot chuoi con << endl; cout << 5: Chuyen thanh chu hoa << endl; cout << 6: Chuyen thanh chu thuong << endl; cout << 7: Xem noi dung chuoi << endl; cout << 8: Xem chieu dai chuoi << endl; cout << 9: Thoat! << endl; cout << ===================================== << endl; cout << Chon chuc nang: << endl; cin >> function; switch(function){ case 1: String subStr; cout << Chuoi them vao: ; cin >> subStr; myStr += subStr; break; case 2: String subStr; int position; cout << Chuoi them vao: ; cin >> subStr; cout << Vi tri chen:; cin >> position; // Chn vo chui // Thm vo cui

163

Chng 7: Mt s lp quan trng


myStr.insert(position, subStr); break; case 3: // Xo i mt chui con int position, count; cout << Vi tri bat dau xoa:; cin >> position; cout << Do dai xoa:; cin >> count; myStr.delete(position, count); break; case 4: String subStr; int position; cout << Chuoi con can tim:; cin >> subStr; cout << Vi tri bat dau tim:; cin >> position; if(myStr.find(position, subStr)) cout << Co xuat hien! << endl; else cout << Khong xuat hien! << endl; break; case 5: myStr.toUpper(); cout << myStr << endl; break; case 6: myStr.toLower(); cout << myStr << endl; break; case 7: // Duyt cout << Noi dung chuoi: << endl; cout << myStr << endl; break; case 8: // Duyt << myStr.length() << endl; break; }while(function != 9); return; } cout << Chieu dai chuoi: // Chuyn thnh ch thng // Chuyn thnh ch hoa // Tm chui con

164

Chng 7: Mt s lp quan trng

7.4 LP NGN XP V HNG I


7.4.1 Lp ngn xp
Lp ngn xp (stack) cng l mt loi lp vt cha, n cha cc phn t cng kiu, khng bt buc phi phn bit nhau nhng c phn bit v th t: cc thao tc thm phn t v ly phn t ra u c thc hin mt u ngn xp. Phn t no c thm vo trc th s b ly ra sau. Mun dng lp Stack phi dng ch th u tp:
#include<stack.h>

Hm khi to
Lp Stack c hai cch khi to: Khi to khng tham s:
Stack<T> bin_ngn_xp;

Khi to bng mt ngn xp khc, c cng kiu phn t:


Stack<T> bin_ngn_xp(Stack<T>);

Trong : V d:
Stack<int> myStack;

T: l kiu ca cc phn t cha trong ngn xp. T c th l cc kiu c bn, cng c th l cc kiu phc tp do ngi dng t nh ngha.

l khai bo mt bin myStack, cha cc phn t c kiu c bn int.

Ton t
Lp Stack ch dng n cc ton t gn = v ton t so snh bng ==: Php gn =:
<ngn xp 1> = <ngn xp 2>;

Dng gn hai i tng ngn xp. Php so snh bng ==:


<ngn xp 1> == <ngn xp 2>;

Dng kim tra xem hai i tng ngn xp c bng nhau hay khng. Kt qu tr v c kiu bool (true/false).

Phng thc
Thm mt phn t:
<bin ngn xp>.push(T);

s thm mt phn t c kiu T vo nh ngn xp. Loi mt phn t:


<bin ngn xp>.pop();

s tr v phn t ang nm nh ngn xp. Kim tra tnh rng:

165

Chng 7: Mt s lp quan trng


<bin ngn xp>.empty();

s tr v kt qu kiu bool, tng ng vi trng thi ca ngn xp c rng hay khng. Kch thc ngn xp:
<bin ngn xp>.size();

s tr v s lng cc phn t hin ang c mt trong ngn xp.

p dng
Trong phn ny, ta s vit li chng trnh 3.4c c minh ho trong phn vit v cu trc ngn xp (chng 3). Nhng thay v phi nh ngha cu trc ngn xp, ta dng lp ngn xp ca th vin C++: o ngc mt xu k t c nhp vo t bn phm. Chng trnh 7.3
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<stack.h> void main(){ clrscr(); Stack<char> myStack; char strIn[250]; cout << Nhap chuoi: ; cin >> strIn; // Nhp chui k t t bn phm // t vo ngn xp // Ly ra t ngn xp for(int i=0; i<strlen(strIn); i++) myStack.push(strIn[i]); while(!myStack.empty()) cout << myStack.pop(); return; }

7.4.2 Lp hng i
Lp hng i (queue) cng l mt loi lp vt cha, n cha cc phn t cng kiu, khng bt buc phi phn bit nhau nhng c phn bit v th t: cc thao tc thm phn t c thc hin mt u, cc thao tc ly phn t ra c thc hin mt u cn li ca hng i. Phn t no c thm vo trc th s b ly ra trc. Mun dng lp Queue phi dng ch th u tp:
#include<queue.h>

Hm khi to
Lp Queue c hai cch khi to:

166

Chng 7: Mt s lp quan trng

Khi to khng tham s:


Queue<T> bin_hng_i;

Khi to bng mt hng i khc, c cng kiu phn t:


Queue<T> bin_hng_i(Queue<T>);

Trong : V d:
Queue<int> myQueue;

T: l kiu ca cc phn t cha trong hng i. T c th l cc kiu c bn, cng c th l cc kiu phc tp do ngi dng t nh ngha.

l khai bo mt bin myQueue, cha cc phn t c kiu c bn int.

Ton t
Lp Queue ch dng n cc ton t gn = v ton t so snh bng ==: Php gn =:
<hng i 1> = <hng i 2>;

Dng gn hai i tng hng i. Php so snh bng ==:


<hng i 1> == <hng i 2>;

Dng kim tra xem hai i tng hng i c bng nhau hay khng. Kt qu tr v c kiu bool (true/false).

Phng thc
Thm mt phn t:
<bin hng i>.push(T);

s thm mt phn t c kiu T vo cui hng i. Loi mt phn t:


<bin hng i>.pop();

s tr v phn t ang nm nh u hng i. Kim tra tnh rng:


<bin hng i>.empty();

s tr v kt qu kiu bool, tng ng vi trng thi ca hng i c rng hay khng. Kch thc hng i:
<bin hng i>.size();

s tr v s lng cc phn t hin ang c mt trong hng i.

p dng
Trong phn ny, ta s ci t li chng trnh trong phn cu trc hng i (chung 3). Nhng thay v phi t nh ngha cu trc hng i, ta dng lp Queue ca th vin C++ m phng chng trnh qun l tin trnh ca h iu hnh.

167

Chng 7: Mt s lp quan trng

Chng trnh 7.4


#include<stdio.h> #include<conio.h> #include<queue.h> void main(){ clrscr(); Queue<int> myQueue; int function; do{ clrscr(); cout << CAC CHUC NANG: << endl; cout << 1: Them mot tien trinh vao hang doi << endl; cout << 2: Dua mot tien trinh trinh vao thuc hien << endl; cout<<3: Xem tat ca cac tien trinh trong hang doi<< endl; cout << 5: Thoat! << endl; cout << ======================================== << endl; cout << Chon chuc nang: << endl; cin >> function; switch(function){ case 1: int maso; cout << Ma so tien trinh vao hang doi: ; cin >> maso; myQueue.push(maso); break; case 2: // Ly ra khi hng i cout << Tien trinh duoc thuc hien: << myQueue.pop() << endl; break; case 3: // Duyt hng i Queue<int>::iterator i; for(i=myQueue.begin(); i<myQueue.end(); i++) cout << myQueue[i] << ; break; }while(function != 5); return; } // Thm vo hng i

168

Chng 7: Mt s lp quan trng

7.5 LP DANH SCH LIN KT


Lp danh sch lin kt (List) cng l mt kiu lp vt cha, n cha cc phn t cng kiu, c tnh n th t. Mun s dng lp List ca th vin C++, phi khai bo ch th u tp:
#include<list.h> // Dnh ring cho lp List // Dng chung cho cc lp vt cha

hoc:
#include<stl.h>

7.5.1 Hm khi to
Lp List c ba kiu khi to: Khi to khng tham s:
List<T> bin_danh_sch;

Khi to t mt danh sch cng kiu:


List<T> bin_danh_sch(List<T>);

Khi to t mt mng cc phn t:


List<T> bin_danh_sch(T* <Mng phn t>, int <chiu di mng>);

Trong : V d:
List<int> myList;

T: l kiu ca cc phn t cha trong danh sch lin kt. T c th l cc kiu c bn, cng c th l cc kiu phc tp do ngi dng t nh ngha.

s khai bo mt danh sch lin kt myList, cc phn t ca n c kiu c bn int.

7.5.2 Ton t Ton t gn =


C php:
<danh sch 1> = <danh sch 2>;

s copy ton b cc phn t ca <danh sch 2> vo <danh sch 1>.

Ton t so snh bng ==


C php:
<danh sch 1> = <danh sch 2>;

s tr v mt gi tr kiu bool, tng ng vi vic hai danh sch ny c bng nhau hay khng. Vic so snh c tin hnh trn tng phn t v tr tng ng nhau. Lu : Ngoi ra cn c cc php ton so snh khc cng c th thc hin trn danh sch: <, >, <=, >=, !=.

169

Chng 7: Mt s lp quan trng

7.5.3 Phng thc Thm mt phn t vo danh sch


C php:
<bin danh sch>.insert(<v tr chn>, <phn t>); <bin danh sch>.push_front(<phn t>); <bin danh sch>.push_back(<phn t>);

Trong : V d:
List<int> myList; myList.push_front(7);

Phng thc th nht chn mt phn t vo mt v tr bt k ca danh sch, v tr chn c ch ra bi tham s th nht. Phng thc th hai chn mt phn t vo u danh sch Phng thc th ba chn mt phn t vo cui danh sch.

s chn vo u danh sch myList mt phn t c gi tr l 7.

Xo i mt phn t
C php:
<bin danh sch>.erase(<v tr xo>); <bin danh sch>.pop_front(); <bin danh sch>.pop_back();

Trong : V d:
List<int> myList; cout << myList.pop_front();

Phng thc th nht xa mt phn t mt v tr bt k ca danh sch, v tr xo c ch ra bi tham s th nht. Phng thc th hai xo mt phn t u danh sch Phng thc th ba xo mt phn t cui danh sch.

s in ra mn hnh phn t u ca danh sch myList.

Kim tra tnh rng ca danh sch


C php:
<bin danh sch>.empty();

tr v gi tr bool, tng ng vi trng thi hin ti ca bin danh sch l rng hay khng.

Xem kch thc danh sch


C php:
<bin danh sch>.size();

V d: 170

Chng 7: Mt s lp quan trng


cout << myList.size();

s in ra mn hnh kch c (s lng cc phn t) ca danh dch.

Xem ni dung mt phn t


C php:
<bin danh sch>.get(); <bin danh sch>.next();

Trong : V d:
List<int> myList; cout << myList.get();

Phng thc th nht tr v phn t v tr hin ti ca con chy Phng thc th hai tr v phn t tip theo, v con chy cng di chuyn sang phn t .

s in ra mn hnh ni dung phn t th nht ca danh sch myList.

7.5.4 p dng
Trong phn ny, ta ci t li chng trnh 3.6c c trnh by trong phn cu trc danh sch lin kt (chng 3). Nhng thay v t to danh sch lin kt, ta dng lp List trong th vin ca C++ qun l nhn vin vn phng. Chng trnh 7.5
#include<stdio.h> #include<conio.h> #include<string.h> #include<list.h> typedef struct{ char name[25]; int age; float salary; } Employee; void main(){ clrscr(); List<Employee> myList; int function; do{ clrscr(); cout << CAC CHUC NANG: << endl; cout << 1: Them mot nhan vien << endl; cout << 2: Xoa mot nhan vien << endl; cout << 3: Xem tat ca cac nhan vien trong phong << endl; // Tn nhn vin // Tui nhn vin // Lng nhn vin

171

Chng 7: Mt s lp quan trng


cout << 5: Thoat! << endl; cout << ======================================= << endl; cout << Chon chuc nang: << endl; cin >> function; switch(function){ case 1: int position; Employee employee; cout << Vi tri can chen: ; cin >> position; cout << Ten nhan vien: ; cin >> employee.name; cout << Tuoi nhan vien: ; cin >> employee.age; cout << Luong nhan vien: ; cin >> employee.salary; myList.insert(position, employee); break; case 2: int position; cout << Vi tri can xoa: ; cin >> position; Employee result = myList.erase(position); if(result != NULL){ cout << Nhan vien bi loai: endl; cout << Ten: << result.name << endl; cout << Tuoi: << result.age << endl; cout << Luong: << result.salary << endl; } break; case 3: // Duyt ds cout << Cac nhan vien cua phong: << endl; Employee result = myList.front(); do{ cout << result.name << << result.age << << result.salary << endl; result = myList.next(); }while(result != NULL); break; }while(function != 5); return; } // Ly ra khi ds // Thm vo ds

172

Chng 7: Mt s lp quan trng

TNG KT CHNG 7
Ni dung chng 7 trnh by mt s lp c bn ca lp vt cha (Container) trong th vin ca C++: Lp tp hp (Set) Lp chui (String) Lp ngn xp (Stack) Lp hng i (Queue) Lp danh sch lin kt (List)

Hu ht cc lp vt cha ny u c th cha cc phn t vi kiu bt k: c th l kiu c bn, cng c th l kiu phc tp do ngi dng t nh ngha. Ngoi tr lp chui, ch cha cc phn t c kiu char. Cc lp vt cha ny c mt s phng thc tng t nhau, nhng cch thc hin li khc nhau: Thm vo mt phn t Ly ra mt phn t Kim tra tnh rng Kim tra s lng phn t.

Ngi dng c th p dng cc lp c sn trong th vin ny ca C++ gii quyt cc bi ton khc nhau m khng phi t nh ngha li cc lp.

CU HI V BI TP CHNG 7
1. Dng th vin lp stack kim tra mt s t nhin nhp vo t bn phm c phi l mt s parlindom hay khng: Mt s t nhin l parlindom nu i ngc th t cc ch s, ta vn thu c chnh s , v d, 87278 l mt s nh vy. 2. Vit li chng trnh 7.1 dng lp tp hp, nhng dng kiu ca cc phn t l lp Car c nh ngha trong chng 5. 3. Dng th vin lp String vit chng trnh chia nh mt chui ban u thnh mt s chui con, ranh gii phn chia l mt chui con c nhp vo t bn phm. V d abc acb, m chia nh theo chui con c s thu c cc chui: ab, ca, cb. 4. Dng th vin lp String vit chng trnh thay th cc chui con ca mt chui ban u bng mt chui con khc. Cc chui con c nhp t bn phm. 5. Vit li chng trnh 7.5 , vn dng th vin lp List, nhng thay th kiu phn t bng kiu lp Car c nh ngha trong chng 5.

173

Hng dn tr li cu hi v n tp

HNG DN TR LI CU HI V BI TP
Chng 1

Chng 2
1. c v e. 2. a v d. 3. c. 4. b. 5. c. 6. c. 7. d. 8. b v c. 9. b. 10. c. 11. d. 12. c. 13. d.

Chng 3
1. a. 2. c. 3. a. 4. b. 5. b v d. 6. Gi :
struct Subject{ char subject[20]; float note; };

Hoc:
typedef struct { char subject[20]; float note; }Subject;

7. Gi :
typedef struct { char name[20];

174

Hng dn tr li cu hi v n tp
int age; char class[20]; Subject* subjects; char type[20]; }Student;

Chng 4
1. a. 2. b. 3. c. 4. a. 5. a. 6. b. 7. c. 8. d. 9. a. 10. b. 11. c.

Chng 5
1. a v c. 2. b. 3. d. 4. a, b v c. 5. c. 6. b v c. 7. b v c. 8. b, d v e. 9. c v d. 10. a v d. 11. a, b, c v d. 12. Gi (t bi 12 n bi 17):
class Employee{ char* name; int age; float salary; public: Employee(); Employee(char* salaryIn=100); nameIn=, int ageIn=18, float

175

Hng dn tr li cu hi v n tp
void setName(char*); char* getName(); void setAge(int); int getAge(); void setSalary(float); float getSalary(); void show(); ~Employee(); };

Chng 6
1. b. 2. d. 3. c. 4. b, d v f. 5. b v d. 6. d. 7. a, b, c v d. 8. a v c. 9. d. 10. d. 11. b. 12. b. 13. c v d. 14. a, b, c v d. 15. c v d. 16. b v c. 17. Gi (t bi 17 n bi 25):
class Human{ char* name; int age; int sex; public: Human(); Human(char*, int, int); void setName(char*); char* getName(); void setAge(int); int getAge(); void setSex(int);

176

Hng dn tr li cu hi v n tp
int getSex(); void show(); ~Human(); }; class Person: public virtual Human{ char* address; char* phone; public: Person(); Person(char*, int, int, char*, char*); void setAddress(char*); char* getAddress(); void setPhone(char*); char* getPhone(); void show(); ~Person(); }; class Worker: public virtual Human{ int hour; float salary; public: Worker(); Worker(int, float); void setHour(int); int getHour(); void setSalary(float); float getSalary(); void show(); }; class Employee: public Person, public Worker{ char* position; public: Employee(); Employee(char*, char*); void setPosition(char*); char* getPosition(); void virtual show(); ~Employee(); }; int, int, char*, char*, int, float,

Chng 7
2. Gi

177

Hng dn tr li cu hi v n tp
void main(){ clrscr(); Set<Car> mySet; int function; do{ clrscr(); cout << CAC CHUC NANG: << endl; cout << 1: Them mot phan tu vao tap hop << endl; cout << 2: Loai bo mot phan tu khoi tap hop << endl; cout << 3: Xem tat ca cac phan tu cua tap hop << endl; cout << 5: Thoat! << endl; cout << =========================================== << endl; cout << Chon chuc nang: << endl; cin >> function; switch(function){ case 1: Car car = new Car(); cout << O to them vao: << endl; cout << Toc do: ; int speed; cin >> speed; car.setSpeed(speed); cout << Nhan hieu:; char[] mark; cin >> mark; car.setMark(mark); float price; cout << Gia xe:; cin >> price; car.setPrice(price); mySet.insert(car); break; case 2: // Loi ra Set<Car>::iterator index; cout << Loai bo xe o vi tri: ; cin >> index; if(index >= mySet.begin())&&(index < mySet.end()) mySet.erase(mySet[index]); break; case 3: // Duyt cout<<Cac phan tu cua tap hop la:<<endl; Set<char>::iterator i; for(i=mySet.begin(); i<mySet.end(); i++){ cout << mySet[i].getSpeed() << ; cout << mySet[i].getMark() << ; cout << mySet[i].getPrice() << ; } // Thm vo

178

Hng dn tr li cu hi v n tp
break; }while(function != 5); return; }

5. Gi
void main(){ clrscr(); List<Car> myList; int function; do{ clrscr(); cout << CAC CHUC NANG: << endl; cout << 1: Them mot xe o to << endl; cout << 2: Xoa mot xe o to << endl; cout << 3: Xem tat ca cac o to << endl; cout << 5: Thoat! << endl; cout << ======================================= << endl; cout << Chon chuc nang: << endl; cin >> function; switch(function){ case 1: int possition; Car car = new Car(); cout << Vi tri can chen: ; cin >> possition; cout << Toc do: ; int speed; cin >> speed; car.setSpeed(speed); cout << Nhan hieu:; char[] mark; cin >> mark; car.setMark(mark); float price; cout << Gia xe:; cin >> price; car.setPrice(price); myList.insert(possition, car); break; case 2: int possition; cout << Vi tri can xoa: ; cin >> possition; Car result = myList.erase(possition); if(result != NULL){ cout << O to bi loai: endl; cout<<Toc do:<<result.getSpeed()<<endl; // Ly ra khi ds // Thm vo ds

179

Hng dn tr li cu hi v n tp
cout << Nhan hieu: << result.getMark() << endl; cout<<Gia: <<result.getPrice()<<endl; } break; case 3: // Duyt ds cout << Cac o to hien co: << endl; Car result = myList.front(); do{ cout << result.getSpeed() << << result.getMark() << << result.getPrice() << endl; result = myList.next(); }while(result != NULL); break; }while(function != 5); return; }

180

Ti liu tham kho

TI LIU THAM KHO


Ti liu ting Anh
[1] [2] [3] [4] [5] [6] James P. Cohoon and Jack W.Davidson, C++ Program Design An Introduction to Programming and Object-Oriented Design, 2nd edition, WCB McGraw-Hill, 1999. Nell Dale, Chip Weems and Mark Headington, Programming and Problem Solving with C++, John & Barlett Publisher, 1996. Michael T. Goodrich, Roberto Tamassia and David Mount, Data Structures and Algorithms in C++, John Wiley & Sons Inc, 2004. Scott R.Ladd, C++ Components and Algorithms. 2nd edition. . M&T Books, 1994. Scott R.Ladd, C++ Templates and Tools, M&T Books, 1994 Robert Lafore, Object Oriented Programming in C++, Fourth edition, SAMS, 2001.

Ti liu ting Vit


[1] [2] L . Hng, T T. Anh, Nguyn H. c v Nguyn T. Thu, Lp trnh hng i tng vi C++, NXB Khoa hc v K thut, 2005. Nguyn T. Thu, T T. Anh, Nguyn Q. Huy v Nguyn H. c, Bi tp lp trnh hng i tng vi C++, NXB Khoa hc v K thut, 2004.

Cc a ch web
1. 2. 3. 4. 5. http://www.angelfire.com/country/aldev0/cpphowto/ http://www.gnacademy.org/text/cc/Tutorial/tutorial.html http://sophia.dtp.fmph.uniba.sk/cpptut/tutorial.us.html http://www.brpreiss.com/books/opus4/html/book.html http://www.fredosaurus.com/notes-cpp/index.html

181

Mc lc

MC LC
GII THIU .....................................................................................................................................3 CHNG 1.......................................................................................................................................5 GII THIU V CC PHNG PHP LP TRNH ...................................................................5 1.1 LP TRNH TUYN TNH...................................................................................................5 1.2 LP TRNH HNG CU TRC .......................................................................................5 1.2.1 c trng ca lp trnh hng cu trc............................................................................5 1.2.2 Phng php thit k trn xung (top-down) ..................................................................6 1.3 LP TRNH HNG I TNG .....................................................................................7 1.3.1 Lp trnh hng i tng ...............................................................................................7 1.3.2 Mt s khi nim c bn..................................................................................................8 1.3.3 Lp trnh hng i tng trong C++ .............................................................................9 TNG KT CHNG 1............................................................................................................10 CHNG 2.....................................................................................................................................11 CON TR V MNG ...................................................................................................................11 2.1 KHI NIM CON TR .......................................................................................................11 2.1.1 Khai bo con tr.............................................................................................................11 2.1.2 S dng con tr ..............................................................................................................11 2.2 CON TR V MNG .........................................................................................................14 2.2.1 Con tr v mng mt chiu ............................................................................................14 2.2.2 Con tr v mng nhiu chiu .........................................................................................17 2.3 CON TR HM...................................................................................................................18 2.4 CP PHT B NH NG...............................................................................................20 2.4.1 Cp pht b nh ng cho bin .....................................................................................21 2.4.2 Cp pht b nh cho mng ng mt chiu...................................................................22 2.4.3 Cp pht b nh cho mng ng nhiu chiu ................................................................23 TNG KT CHNG 2............................................................................................................25 CU HI V BI TP CHNG 2........................................................................................26 CHNG 3.....................................................................................................................................30 KIU D LIU CU TRC .........................................................................................................30 3.1 NH NGHA CU TRC..................................................................................................30 3.1.1 Khai bo cu trc ...........................................................................................................30 3.1.2 Cu trc lng nhau .........................................................................................................31 3.1.3 nh ngha cu trc vi t kho typedef........................................................................32 3.2 THAO TC TRN CU TRC ..........................................................................................33 3.2.1 Khi to gi tr ban u cho cu trc .............................................................................33 3.2.2 Truy nhp n thuc tnh ca cu trc...........................................................................34 3.3 CON TR CU TRC V MNG CU TRC ...............................................................38 3.3.1 Con tr cu trc..............................................................................................................38 3.3.2 Mng cu trc ................................................................................................................41 3.4 MT S KIU D LIU TRU TNG.........................................................................44 3.4.1 Ngn xp ........................................................................................................................45 3.4.2 Hng i.........................................................................................................................48 3.4.3 Danh sch lin kt..........................................................................................................53 TNG KT CHNG 3............................................................................................................60 CU HI V BI TP CHNG 3........................................................................................60 CHNG 4.....................................................................................................................................64

182

Mc lc

VO RA TRN TP ..................................................................................................................... 64 4.1 KHI NIM TP................................................................................................................. 64 4.1.1 Tp d liu .................................................................................................................... 64 4.1.2 Tp vn bn................................................................................................................... 65 4.1.3 Tp nh phn.................................................................................................................. 65 4.2 VO RA TRN TP ........................................................................................................... 66 4.2.1 Vo ra tp vn bn bng >> v <<......................................................................... 66 4.2.2 Vo ra tp nh phn bng read v write......................................................................... 70 4.3 TRUY NHP TP TRC TIP.......................................................................................... 74 4.3.1 Con tr tp tin ............................................................................................................... 74 4.3.2 Truy nhp v tr hin ti ca con tr tp ........................................................................ 74 4.3.3 Dch chuyn con tr tp ................................................................................................ 76 TNG KT CHNG 4........................................................................................................... 78 CU HI V BI TP CHNG 4....................................................................................... 79 CHNG 5.................................................................................................................................... 82 LP ................................................................................................................................................ 82 5.1 KHI NIM LP I TNG......................................................................................... 82 5.1.1 nh ngha lp i tng .............................................................................................. 82 5.1.2 S dng lp i tng................................................................................................... 83 5.2 CC THNH PHN CA LP......................................................................................... 83 5.2.1 Thuc tnh ca lp ........................................................................................................ 84 5.2.2 Phng thc ca lp ..................................................................................................... 85 5.3 PHM VI TRUY NHP LP............................................................................................. 90 5.3.1 Phm vi truy nhp lp ................................................................................................... 90 5.3.2 Hm bn ........................................................................................................................ 91 5.3.3 Lp bn ......................................................................................................................... 96 5.4 HM KHI TO V HU B ......................................................................................... 97 5.4.1 Hm khi to................................................................................................................. 97 5.4.2 Hm hy b................................................................................................................. 101 5.5 CON TR I TNG V MNG I TNG........................................................ 103 5.5.1 Con tr i tng ........................................................................................................ 103 5.5.2 Mng cc i tng..................................................................................................... 106 TNG KT CHNG 5......................................................................................................... 110 CU HI V BI TP CHNG 5..................................................................................... 110 CHNG 6.................................................................................................................................. 115 TNH K THA V A HNH ................................................................................................. 115 6.1 KHI NIM K THA .................................................................................................... 115 6.1.1 Khai bo tha k ......................................................................................................... 115 6.1.2 Tnh cht dn xut....................................................................................................... 116 6.2 HM KHI TO V HU B TRONG K THA ...................................................... 117 6.2.1 Hm khi to trong k tha......................................................................................... 117 6.2.2 Hm hy b trong k tha........................................................................................... 119 6.3 TRUY NHP TI CC THNH PHN TRONG K THA LP ............................... 120 6.3.1 Phm vi truy nhp ....................................................................................................... 120 6.3.2 S dng cc thnh phn ca lp c s t lp dn xut ............................................... 122 6.3.3 nh ngha chng cc phng thc ca lp c s ...................................................... 125 6.3.4 Chuyn i kiu gia lp c s v lp dn xut......................................................... 128 6.4 A K THA ................................................................................................................... 131 6.4.1 Khai bo a k tha..................................................................................................... 131 6.4.2 Hm khi to v hm hu b trong a k tha ........................................................... 132 6.4.3 Truy nhp cc thnh phn lp trong a k tha .......................................................... 134 183

Mc lc

6.5 LP C S TRU TNG .............................................................................................138 6.5.1 t vn ....................................................................................................................138 6.5.2 Khai bo lp c s tru tng .....................................................................................138 6.5.3 Hm khi to lp c s tru tng..............................................................................139 6.6 A HNH ............................................................................................................................143 6.6.1 t vn ....................................................................................................................143 6.6.2 Khai bo phng thc tru tng................................................................................144 6.6.3 S dng phng thc tru tng a hnh .................................................................144 TNG KT CHNG 6..........................................................................................................147 CU HI V BI TP CHNG 6......................................................................................148 CHNG 7...................................................................................................................................153 MT S LP QUAN TRNG ....................................................................................................153 7.1 LP VT CHA ...............................................................................................................153 7.1.1 Giao din ca lp Container ........................................................................................153 7.1.2 Con chy Iterator..........................................................................................................154 7.2 LP TP HP....................................................................................................................155 7.2.1 Hm khi to................................................................................................................155 7.2.2 Ton t .........................................................................................................................155 7.2.3 Phng thc .................................................................................................................156 7.2.4 p dng........................................................................................................................158 7.3 LP CHUI .......................................................................................................................159 7.3.1 Hm khi to................................................................................................................159 7.3.2 Ton t .........................................................................................................................160 7.3.3 Phng thc .................................................................................................................161 7.3.4 p dng........................................................................................................................163 7.4 LP NGN XP V HNG I.....................................................................................165 7.4.1 Lp ngn xp ...............................................................................................................165 7.4.2 Lp hng i ................................................................................................................166 7.5 LP DANH SCH LIN KT ..........................................................................................169 7.5.1 Hm khi to................................................................................................................169 7.5.2 Ton t .........................................................................................................................169 7.5.3 Phng thc .................................................................................................................170 7.5.4 p dng........................................................................................................................171 TNG KT CHNG 7..........................................................................................................173 CU HI V BI TP CHNG 7......................................................................................173 HNG DN TR LI CU HI V BI TP .................................................................174 Chng 1...............................................................................................................................174 Chng 2...............................................................................................................................174 Chng 3...............................................................................................................................174 Chng 4...............................................................................................................................175 Chng 5...............................................................................................................................175 Chng 6...............................................................................................................................176 Chng 7...............................................................................................................................177 TI LIU THAM KHO.........................................................................................................181 MC LC.................................................................................................................................182

184

NGN NG LP TRNH C++


M s : 412LTC340
Chu trch nhim bn tho TRUNG TM O TO BU CHNH VIN THNG 1

You might also like