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++. Ni dung ti liu c t chc thnh 7 chng: 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 4 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
5 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
6 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 Trong chng trnh, gii thut c quan h ph thuc vo cu trc d liu: 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. 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 Chng 1: Gii thiu v cc phng php lp trnh
7 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
8 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
9 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
10 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. Chng 2: Con tr v mng
11 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; // Khai bo sai con tr int pointerInt*; // Khai bo sai con tr 2.1.2 S dng con tr Con tr c s dng theo hai cch: Chng 2: Con tr v mng
12 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 Trong php ton ny, tn con tr khng c du *. V d: int x, *px; px = &x; 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 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. V d: int x = 12, y, *px; px = &y; *px = x; Qu trnh din ra nh sau:
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. x = 12 y = 0 px null int x = 12, y, *px; px = &y; x = 12 y = 0 px px = x; x = 12 y=x =12 px Chng 2: Con tr v mng
13 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. V d: int x = 12, *px, *py; px = &x; py = px;
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; // Cho py tr ti ch m px tr: a ch ca x *py += 15; // Ni dung ca py l 47 cout << py = px, *py +=15, x = << x << endl; }
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: x = 12 px py null int x = 12, *px, *py; px = &x; x = 12 px py = px; x = 12 px py py null null Chng 2: Con tr v mng
14 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;
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}; A[0]=5 A int A[5] = {5, 10, 15, 20, 25}; int *pa = A; pa A[1]=10 A[2]=15 A[3]=20 A[4]= 25 A[0]=5 A A[1]=10 A[2]=15 A[3]=20 A[4]= 25 Chng 2: Con tr v mng
15 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].
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. A[0]=5 A int A[5] = {5, 10, 15, 20, 25}; int *pa = &A[2]; pa A[1]=10 A[2]=15 A[3]=20 A[4]= 25 A[0]=5 A A[1]=10 A[2]=15 A[3]=20 A[4]= 25 pa = pa + 1; pa A[0]=5 A A[1]=10 A[2]=15 A[3]=20 A[4]= 25 pa = pa - 2; pa A[0]=5 A A[1]=10 A[2]=15 A[3]=20 A[4]= 25 Chng 2: Con tr v mng
16
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.
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.
A[0]=5 A int A[5] = {5, 10, 15, 20, 25}; int *pa = &A[2]; pa A[1]=10 A[2]=15 A[3]=20 A[4]= 25 A[0]=5 A A[1]=10 A[2]=15 A[3]=20 A[4]= 25 pa ++; pa A[0]=5 A A[1]=10 A[2]=15 A[3]=20 A[4]= 25 pa = &A[0]; pa A[0]=5 A A[1]=10 A[2]=15 A[3]=20 A[4]= 25 null pa --; pa A[0]=5 A A[1]=10 A[2]=15 A[3]=20 A[4]= 25 null A[0]=5 A int A[5] = {5, 10, 15, 20, 25}; int *pa = &A[2]; pa A[1]=10 A[2]=15 A[3]=20 A[4]= 25 A[0]=5 A A[1]=10 A[2]=15 A[3]=20 A[4]= 25 pa ++; pa A[0]=5 A A[1]=10 A[2]=15 A[3]=20 A[4]= 25 Nhng *pa ++; pa A[0]=5 A A[1]=10 A[2]=16 A[3]=20 A[4]= 25 Chng 2: Con tr v mng
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} }; Chng 2: Con tr v mng
18 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 = A[0] = *(A+0) = &A[0][0]; a ch ca hng th nht: A[1] = *(A+1) = &A[1][0]; a ch ca hng th i: A[i] = *(A+i) = &A[i][0]; a ch phn t &A[i][j] = (*(A+i)) + j; Gi tr phn t 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: int A[3][3]; 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. V d khai bo: int (*Calcul)(int a, int b); l khai bo mt con tr hm, tn l Calcul, c kiu int v c hai tham s cng l kiu int. Lu : Chng 2: Con tr v mng
19 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.
// 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; Chng 2: Con tr v mng
20
char reply; cout << Display the string in uppercase or lowercase (u,l): ; cin >> reply; if(reply == l) // Hin th theo dng lowercase Display(str, tolower); else // Hin th theo dng uppercase Display(str, toupper); return; }
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. Chng 2: Con tr v mng
21 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); // Khai bo con tr pa, cp pht b nh // v gn gi tr ban u cho pa l 12. delete pa; // 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); // Khai bo con tr pa, cp pht b nh // v gn gi tr ban u cho pa l 12. delete pa; // Gii phng vng nh va cp cho pa. int A[5] = {5, 10, 15, 20, 25}; pa = A; // Cho pa tr n a ch ca mng A 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); // *pa = 12 int *pb = pa; // pb tr n cng a ch pa. *pb += 5; // *pa = *pb = 17 delete pa; // Gii phng c pa ln pb Chng 2: Con tr v mng
22 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 c cp b nh v *pa = 12 *pa = new int(15); // 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 : 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. V d: int *A = new int[5]; 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++) Chng 2: Con tr v mng
23 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; ; // cp pht b nh
for(int i=0; i<length; i++) delete [] A[i]; // Gii phng b nh cho mi dng delete [] A; // Gii phng b nh cho mng cc dng 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.
/* 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; }
// 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. Chng 2: Con tr v mng
26 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; Chng 2: Con tr v mng
27 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: Chng 2: Con tr v mng
28 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> int A[5] = {10, 20, 30, 40, 50}; 2> int *pa = A; 3> pa += 15; 4> delete pa; on chng trnh trn c li dng no? a. 1 b. 2 c. 3 d. 4 Chng 2: Con tr v mng
29 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.
Chng 3: Kiu d liu cu trc
30 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: Chng 3: Kiu d liu cu trc
31 struct Employeee{ char name[20]; // Tn nhn vin int age; // Tui nhn vin char role[20]; // Chc v ca nhn vin float salary; // 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]; // Tn nhn vin Date birthDay; // Ngy sinh ca nhn vin char role[20]; // Chc v ca nhn vin float salary; // Lng ca nhn vin };
Chng 3: Kiu d liu cu trc
32
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]; // Tn nhn vin int age; // Tui nhn vin char role[20]; // Chc v ca nhn vin float salary; // Lng ca nhn vin } Employee; 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]; // Tn nhn vin Date birthDay; // Ngy sinh ca nhn vin char role[20]; // Chc v ca nhn vin float salary; // Lng ca nhn vin } Employee; Chng 3: Kiu d liu cu trc
33
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 ,. V d, vi nh ngha cu trc: typedef struct { char name[20]; // Tn nhn vin int age; // Tui nhn vin char role[20]; // Chc v ca nhn vin float salary; // Lng ca nhn vin } Employee; th c th khai bo v khi to cho mt bin nh sau: Employee myEmployee1 = { Nguyen Van A, 27, Nhan vien, 300f Chng 3: Kiu d liu cu trc
34 }; 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]; // Tn nhn vin Date birthDay; // Ngy sinh ca nhn vin char role[20]; // Chc v ca nhn vin float salary; // Lng ca nhn vin } Employee; 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}, // Khi to cu trc con Nhan vien, 300f }; 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; // hin th ra Nguyen Van A myEmployee1.age += 1; // 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: Chng 3: Kiu d liu cu trc
35
Employee myEmployee1 = { Nguyen Van A, {15, 05, 1980}, Nhan vien, 300f }; ta c th truy xut nh sau: cout << myEmployee1.name; // hin th ra Nguyen Van A myEmployee1.birthDay.day = 16; // Sa li ngy sinh thnh 16 myEmployee1.birthDay.month = 07; // 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.
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; } Chng 3: Kiu d liu cu trc
38 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]; // Tn nhn vin Date birthDay; // Ngy sinh ca nhn vin char role[20]; // Chc v ca nhn vin float salary; // Lng ca nhn vin } Employee; 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. Cng ging con tr thng thng, con tr cu trc c s dng khi: Cho n tr n a ch ca mt bin cu trc Cp pht cho n mt vng nh xc nh. 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. Chng 3: Kiu d liu cu trc
39 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: Chng 3: Kiu d liu cu trc
40 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.
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. Chng 3: Kiu d liu cu trc
42 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.
typedef struct { int day; int month; int year; } Date;
typedef struct { char name[20]; // Tn nhn vin Date birthDay; // Ngy sinh ca nhn vin char role[20]; // Chc v ca nhn vin float salary; // Lng ca nhn vin } 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);
Chng 3: Kiu d liu cu trc
43 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){ Chng 3: Kiu d liu cu trc
// 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) Chng 3: Kiu d liu cu trc
45 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 nn ta c th nh ngha cu trc ngn xp nh sau (cc phn t ca ngn xp c kiu int): typedef SIZE 100; typedef struct { int top; // V tr ca nh int nodes[SIZE]; // Danh sch cc phn t } Stack; 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; // V tr ca nh int *nodes; // Danh sch cc phn t } Stack; 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 Chng 3: Kiu d liu cu trc
46 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 ++; // Tng ch s ca node nh for(int i=0; i<stack->top; i++) // Sao chp sang vng nh mi tmpNodes[i] = stack->nodes[i]; tmpNodes[stack->top] = node; // Thm node mi vo nh delete [] stack->nodes; // Gii phng vng nh c stack->nodes = tmpNodes; // Tr vo vng nh mi return; }
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){ // Kim tra ngn xp rng 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++) // Sao chp sang vng nh mi tmpNodes[i] = stack->nodes[i]; stack->top --; // Gim ch s ca node nh delete [] stack->nodes; // Gii phng vng nh c stack->nodes = tmpNodes; // Tr vo vng nh mi return result; // Tr v gi tr node nh Chng 3: Kiu d liu cu trc
47 }
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.
typedef struct { int top; // V tr node nh int *nodes; // Danh sch phn t } 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; // Cp pht vng nh cho con tr stack->top = -1; // Khi to ngn xp rng }
void push(Stack *stack, int node){ int *tmpNodes = new int[stack->top + 2];// Cp pht vng nh mi stack->top ++; // Tng ch s ca node nh for(int i=0; i<stack->top; i++) // Sao chp sang vng nh mi tmpNodes[i] = stack->nodes[i]; tmpNodes[stack->top] = node; // Thm node mi vo nh delete [] stack->nodes; // Gii phng vng nh c stack->nodes = tmpNodes; // Tr vo vng nh mi return; }
int pop(Stack *stack){ if(stack->top < 0){ // Kim tra ngn xp rng Chng 3: Kiu d liu cu trc
48 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++) // Sao chp sang vng nh mi tmpNodes[i] = stack->nodes[i]; stack->top --; // Gim ch s ca node nh delete [] stack->nodes; // Gii phng vng nh c stack->nodes = tmpNodes; // Tr vo vng nh mi return result; // Tr v gi tr node nh }
void main(){ clrscr(); Stack *stack; init(stack); // Khi to ngn xp char strIn[250]; // Nhp chui k t t bn phm cout << Nhap chuoi: ; cin >> strIn; for(int i=0; i<strlen(strIn); i++) // t vo ngn xp push(stack, strIn[i]); while(stack->top > -1) // Ly ra t ngn xp cout << pop(stack); release(stack); // Gii phng b nh return; } 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. Chng 3: Kiu d liu cu trc
49 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). Nu dng cu trc tnh nh ngha, hng i c cu trc nh sau: typedef SIZE 100; typedef struct { int front, rear; // V tr ca nh u, nh cui int nodes[SIZE]; // Danh sch cc phn t } Queue; 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; // V tr ca nh u, nh cui int *nodes; // Danh sch cc phn t } Queue; 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 ++; // Tng ch s ca node ui if(queue->front == -1) // Nu hng i c rng queue->front = 0; // th cp nht front for(int i=0; i<queue->rear; i++) // Sao chp sang vng nh mi tmpNodes[i] = queue->nodes[i]; tmpNodes[queue->rear] = node; // Thm node mi vo ui delete [] queue->nodes; // Gii phng vng nh c queue->nodes = tmpNodes; // Tr vo vng nh mi return; }
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 Chng 3: Kiu d liu cu trc
50 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 // Nu ch c 1 phn t queue->front --; // Hng i thnh rng queue->rear --; // Gim ch s ca node ui delete [] queue->nodes; // Gii phng vng nh c queue->nodes = tmpNodes; // Tr vo vng nh mi return result; // 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.
typedef struct { int front, rear; // V tr ca nh u, nh cui Chng 3: Kiu d liu cu trc
51 int *nodes; // Danh sch cc phn t } 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; // Cp pht b nh cho con tr queue->front = -1; // Khi to danh sch rng queue->rear = -1; return; }
void insert(Queue *queue, int node){ int *tmpNodes = new int[queue->rear + 2];// Cp pht vng nh mi queue->rear ++; // Tng ch s ca node ui if(queue->front == -1) // Nu hng i c rng queue->front = 0; // th cp nht front for(int i=0; i<queue->rear; i++) // Sao chp sang vng nh mi tmpNodes[i] = queue->nodes[i]; tmpNodes[queue->rear] = node; // Thm node mi vo ui delete [] queue->nodes; // Gii phng vng nh c queue->nodes = tmpNodes; // Tr vo vng nh mi 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 Chng 3: Kiu d liu cu trc
52 queue->front --; // Hng i thnh rng queue->rear --; // Gim ch s ca node ui delete [] queue->nodes; // Gii phng vng nh c queue->nodes = tmpNodes; // Tr vo vng nh mi return result; // Tr v gi tr node u }
void travese(Queue *queue){ if(queue->front < 0){ // Khi danh sch rng cout << Danh sach rong! << endl; return; } for(int i=queue->front; i<=queue.rear; i++) cout << queue->nodes[i] << ;// Lit k cc phn t cout << endl; return; }
void main(){ clrscr(); Queue *queue; init(queue); // Khi to hng i 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: // Thm vo hng i int maso; cout << Ma so tien trinh vao hang doi: ; Chng 3: Kiu d liu cu trc
53 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: // Duyt hng i cout<<Cac tien trinh dang o trong hang doi la: <<endl; travese(queue); break; }while(function != 5); release(queue); // Gii phng hng i return; } 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; // D liu ca node c kiu Employee struct simple *next; // Tr n node k tip }; typedef struct simple SimpleNode; 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: Chng 3: Kiu d liu cu trc
54 typedef struct{ int nodeNumber; // S lng cc node SimpleNode *front, *rear;// Tr n node u v cui danh sch } SimpleHeader; 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){ // Chn vo u ds newNode->next = list->front; // Chn vo trc node u list->front = newNode; // Cp nht li node u ds if(list->nodeNumber == 0) // Nu ds ban u rng th list->rear = newNode; // node ui trng vi node u }else if(position >= list->nodeNumber){// Chn vo cui ds list->rear->next = newNode; // Chn vo sau node cui list->rear = newNode; // Cp nht li node cui ds if(list->nodeNumber == 0) // Nu ds ban u rng th list->front = newNode; // node u trng node ui }else{ // Chn vo gia ds 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++; } newNode->next = curr; // chn vo trc node n prev->next = newNode; // v chn vo sau node n-1 } Chng 3: Kiu d liu cu trc
55 list->nodeNumber++; // Cp nht s lng node return; }
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; // Khng xo node no c SimpleNode* result; if(position == 0){ // Xo node u result = list->front; // Gi node cn xo list->front = list->front->next;// Cp nht node u if(list->nodeNumber == 1) // Nu ds ch c 1 node th 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; // Tm node trc ca node cui curr->next = NULL; // Xo node rear hin ti list->rear = curr; // Cp nht node cui ds }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; // Gi node cn xo prev->next = curr->next; // Cho node n-1 tr n node n+1 } list->nodeNumber --; // Cp nht s lng node return result; // Tr v node cn xo Chng 3: Kiu d liu cu trc
56 }
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.
struct simple{ Employee employee; // D liu ca node struct simple *next; // Tr n node k tip }; typedef struct simple SimpleNode;
typedef struct{ int nodeNumber; // S lng cc node SimpleNode *front, *rear; // Tr n node u v cui ds } SimpleHeader;
/* 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; // Cp pht b nh cho con tr list->front = NULL; // Khi to danh sch rng list->rear = NULL; Chng 3: Kiu d liu cu trc
57 list->nodeNumber = 0; return; }
void insert(SimpleHeader *list, int position, Employee employee){ SimpleNode *newNode = new SimpleNode; newNode->employee = employee; if(position <= 0){ // Chn vo u ds newNode->next = list->front; // Chn vo trc node u list->front = newNode; // Cp nht li node u ds if(list->nodeNumber == 0) // Nu ds ban u rng th list->rear = newNode; // node ui trng vi node u }else if(position >= list->nodeNumber){// Chn vo cui ds list->rear->next = newNode; // Chn vo sau node cui list->rear = newNode; // Cp nht li node cui ds if(list->nodeNumber == 0)// Nu ds ban u rng th list->front = newNode; // node u trng node ui }else{ // Chn vo gia ds 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++; } newNode->next = curr; // chn vo trc node n prev->next = newNode; // v chn vo sau node n-1 } list->nodeNumber++; // Cp nht s lng node return; }
SimpleNode* remove(SimpleHeader *list, int position){ if((position < 0)||(position >= list->nodeNumber)) return NULL; // Khng xo node no c SimpleNode* result; if(position == 0){ // Xo node u result = list->front; // Gi node cn xo list->front = list->front->next;// Cp nht node u if(list->nodeNumber == 1) // Nu ds ch c 1 node th list->rear = list->front;// Cp nht node cui ds }else if(position == list->nodeNumber 1){ result = list->rear; // Gi node cn xo Chng 3: Kiu d liu cu trc
58 SimpleNode *curr = list->front; while(curr->next != list->rear) curr = curr->next;// Tm node trc ca node cui curr->next = NULL; // Xo node rear hin ti list->rear = curr; // Cp nht node cui ds }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; // Gi node cn xo prev->next = curr->next;// Cho node n-1 tr n node n+1 } list->nodeNumber --; // Cp nht s lng node return result; // Tr v node cn xo }
void release(SimpleHeader *list){ SimpleNode* curr = remove(list, 0); while(curr != NULL){ delete curr; //Gii phng vng nh ca node curr = remove(list, 0); } delete list; //Gii phng vng nh ca con tr } Chng 3: Kiu d liu cu trc
59
void main(){ clrscr(); SimpleHeader *list; init(list); // Khi to ds 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; Chng 3: Kiu d liu cu trc
60 } break; case 3: // Duyt ds cout<<Cac nhan vien cua phong:<<endl; travese(list); break; }while(function != 5); release(list); // Gii phng ds return; } 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; Chng 3: Kiu d liu cu trc
61 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: Chng 3: Kiu d liu cu trc
62 Tn mn hc, kiu char[]; im tng kt mn hc, kiu float; 7. nh ngha cu trc v hc sinh tn l Student bao gm cc thng tin sau: 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[]; 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 Chng 3: Kiu d liu cu trc
63 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. Chng 4: Vo ra trn tp
64 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. V d, khai bo: fstream myFile(abc.txt, ios::in); 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 : Chng 4: Vo ra trn tp
65 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 V d, mun m mt tp tn l abc.txt trong th mc myDir c, ta phi khai bo nh sau: fstream myFile(myDir\\abc.txt, ios::in); Cc ch m tp tin Cc ch m tp tin c nh ngha bi cc bt ch th: ios::in: M mt tp tin c. ios::out: M mt tp tin c sn ghi. ios::app: M mt tp tin c sn thm d liu vo cui tp. ios::ate: M tp tin v t con tr tp tin vo cui tp. ios::trunc: 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: M mt tp tin ch nh phn. ios::text: M mt tp tin ch vn bn. 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 |. 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); Chng 4: Vo ra trn tp
66 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.
void main(){ clrscr(); char fileName[length], input; cout << Ten tep tin: ; cin >> setw(length) >> fileName; // Nhp tn tp tin
/* M tp tin */ ofstream fileOut(fileName, ios::out);// Khai bo v m tp tin if(!fileOut){ // Khng m c tp cout << Khong the tao duoc tep tin << fileName << endl; exit(1); }
/* Ghi d liu vo tp tin */ Chng 4: Vo ra trn tp
67 do{ cin >> input; // c k t t bn phm fileOut << input << ; // Ghi k t vo tp tin }while((input != e)&&(fileOut)); fileOut << endl; // Xung dng cui tp tin
/* ng tp tin */ fileOut.close(); // ng tp tin return; } 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.
void main(){ clrscr(); char fileName[length], output; cout << Ten tep tin: ; cin >> setw(length) >> fileName; // Nhp tn tp tin
/* M tp tin */ Chng 4: Vo ra trn tp
68 ifstream fileIn(fileName, ios::in); // Khai bo v m tp tin if(!fileIn){ // Khng m c tp cout << Khong the mo duoc tep tin << fileName << endl; exit(1); }
/* c d liu t tp tin ra mn hnh */ while(fileIn){ fileIn >> output; // c k t t tp tin cout << output; // Ghi k t ra mn hnh } cout << endl; // Xung dng trn mn hnh
/* ng tp tin */ fileIn.close(); // ng tp tin return; }
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.
void main(){ clrscr(); char sourceFile[length], targetFile[length], data; cout << Ten tep tin nguon: ; cin >> setw(length) >> sourceFile; // Nhp tn tp tin ngun
cout << Ten tep tin dich: ; cin >> setw(length) >> targetFile; // Nhp tn tp tin ch Chng 4: Vo ra trn tp
69
/* M tp tin ngun */ ifstream fileIn(sourceFile, ios::in);// Khai bo v m tp ngun if(!fileIn){ // Khng m c tp ngun cout << Khong the mo duoc tep tin nguon << sourceFile << endl; exit(1); }
/* M tp tin ch */ ofstream fileOut(targetFile, ios::out);// Khai bo v m tp ch if(!fileOut){ // Khng m c tp ch cout << Khong the tao duoc tep tin dich << targetFile << endl; exit(1); }
/* c d liu t tp tin ra tp ch */ while(fileIn){ fileIn >> data; // c k t t tp ngun fileOut << data; // Ghi k t ra tp ch }
/* ng cc tp tin */ fileIn.close(); // ng tp tin ngun fileOut.close(); // ng tp tin ch return; }
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. Chng 4: Vo ra trn tp
70 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. Chng trnh 4.4 minh ho vic ghi d liu vo tp tin nh phn, d liu l kiu cu trc: 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.
typedef struct { int day; // Ngy int month; // Thng Chng 4: Vo ra trn tp
71 int year; // Nm } Date;
typedef struct { char name[20]; // Tn nhn vin Date birthDay; // Ngy sinh ca nhn vin char role[20]; // Chc v ca nhn vin float salary; // Lng ca nhn vin } Employee;
void main(){ clrscr(); char fileName[length]; // Tn tp tin cout << Ten tep tin: ; cin >> setw(length) >> fileName; // Nhp tn tp tin
int recordNumber; // S lng bn ghi cout << So luong ban ghi: ; cin >> recordNumber; // Nhp s lng bn ghi
/* M tp tin */ // Khai bo v m tp tin fstream fileOut(fileName, ios::out|ios::binary); if(!fileOut){ // Khng m c tp cout << Khong the tao duoc tep tin << fileName << endl; 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; // Nhp tn nhn vin 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; // Nhp chc v cout << Salary: ; Chng 4: Vo ra trn tp
72 cin >> myEmployee.salary; // Nhp tin lng
// Ghi d liu vo tp fileOut.write(reinterpret_cast<char *>(&myEmployee), sizeof(Employee)); }
/* ng tp tin */ fileOut.close(); // ng tp tin return; }
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.
typedef struct { int day; // Ngy int month; // Thng int year; // Nm } Date; Chng 4: Vo ra trn tp
73
typedef struct { char name[20]; // Tn nhn vin Date birthDay; // Ngy sinh ca nhn vin char role[20]; // Chc v ca nhn vin float salary; // Lng ca nhn vin } Employee;
void main(){ clrscr(); char fileName[length]; // Tn tp tin cout << Ten tep tin: ; cin >> setw(length) >> fileName; // Nhp tn tp tin
/* M tp tin */ // Khai bo v m tp tin fstream fileIn(fileName, ios::in|ios::binary); if(!fileIn){ // Khng m c tp cout << Khong the mo duoc tep tin << fileName << endl; exit(1); }
/* c d liu t tp tin ra mn hnh */ Employee myEmployee; while(fileIn){ fileIn.read(reinterpret_cast<char *>(&myEmployee), sizeof(Employee)); // c k t t tp tin 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(); // ng tp tin return; }
Chng 4: Vo ra trn tp
74 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 .
void main(){ clrscr(); char fileName[length], output; cout << Ten tep tin: ; cin >> setw(length) >> fileName; // Nhp tn tp tin
Chng 4: Vo ra trn tp
75 /* M tp tin */ ifstream fileIn(fileName, ios::in); // Khai bo v m tp tin if(!fileIn){ // Khng m c tp cout << Khong the mo duoc tep tin << fileName << endl; 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; // c k t t tp tin cout << output; // Ghi k t ra mn hnh if(index % 5 == 0) // Ghi ra v tr con tr tp cout<< endl << Vi tri con tro tep: << fileIn.tellg() << endl; index ++; } cout << endl; // Xung dng trn mn hnh
/* ng tp tin */ fileIn.close(); // ng tp tin return; }
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 .
void main(){ clrscr(); char fileName[length], input; cout << Ten tep tin: ; cin >> setw(length) >> fileName; // Nhp tn tp tin
Chng 4: Vo ra trn tp
76 /* M tp tin */ ofstream fileOut(fileName, ios::out);// Khai bo v m tp tin if(!fileOut){ // Khng m c tp cout << Khong the tao duoc tep tin << fileName << endl; 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; // c k t t bn phm fileOut << input << ; // Ghi k t vo tp tin if(index%5 == 0) // Hin th v tr con tr tp cout << Vi tri con tro tep: << fileOut.tellp() << endl; index++; }while((input != e)&&(fileOut)); fileOut << endl; // Xung dng cui tp tin
/* ng tp tin */ fileOut.close(); // ng tp tin return; }
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. Chng 4: Vo ra trn tp
77 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.
void main(){ clrscr(); char fileName[length], output; cout << Ten tep tin: ; cin >> setw(length) >> fileName; // Nhp tn tp tin
/* M tp tin */ ifstream fileIn(fileName, ios::in); // Khai bo v m tp tin if(!fileIn){ // Khng m c tp cout << Khong the mo duoc tep tin << fileName << endl; 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 */ Chng 4: Vo ra trn tp
78 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){ // ng fileIn >> output; // c k t t tp tin
// Ghi k t ra mn hnh cout << Vi tri: << fileIn.tellg() << output; }else{ // Ra khi phm vi tp fileIn.clear(); // V v tr u tp } }while(index);
/* ng tp tin */ fileIn.close(); // ng tp tin return; }
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(). Chng 4: Vo ra trn tp
79 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 myFile(abc.txt, ios::in); b. fstream myFile(abc.txt, ios::out); c. fstream myFile(abc.txt, ios::app); d. 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 myFile(xyz\abc.txt, ios::out); b. fstream myFile(xyz\\abc.txt, ios::out); c. fstream myFile(xyz/abc.txt, ios::out); d. 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 myFile(abc.txt, ios::out); b. fstream myFile(abc.txt, ios::app); c. fstream myFile(abc.txt, ios::out|ios::app); d. 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 Chng 4: Vo ra trn tp
80 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 Chng 4: Vo ra trn tp
81 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. Chng 5: Lp
82 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 : 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++. V d: class Car{ }; 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 }; Chng 5: Lp
83 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. V d, khai bo: Car myCar; // ng l ng, nhng khai bo: class Car myCar; // Li c php 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 : Chng 5: Lp
84 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 ca lp c chia lm hai loi: 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. 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++. V d, khai bo: class Car{ private: int speed; public: char mark[20]; }; 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 Chng 5: Lp
85 }; 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. Chng 5: Lp
86 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). V d, khai bo: class Car{ private: int speed; char mark[20]; public: void show(); }; 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 speed; // Tc char mark[20]; // Nhn hiu public: void show(){ // Khai bo phng thc ngay trong lp cout << This is a << mark << having a speed of Chng 5: Lp
87 << speed << km/h! << endl; return; } }; Nu mun ci t bn ngoi lp, ta ci t nh sau: class Car{ private: int speed; // Tc char mark[20]; // Nhn hiu public: void show(); // Gii thiu xe }; /* Khai bo phng thc bn ngoi lp */ void Car::show(){ cout << This is a << mark << having a speed of << speed << km/h! << endl; return; } 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 speed; // Tc char mark[20]; // Nhn hiu public: void show(); // Gii thiu xe Chng 5: Lp
88 }; /* 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) V cc phng thc c tnh cht public: Khi to cc tham s (init) Gii thiu xe (show) Cc phng thc truy nhp (get/set) cc thuc tnh 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.
/* nh ngha lp */ class Car{ private: int speed; // Tc char mark[20]; // Nhn hiu float price; // Gi xe public: void setSpeed(int); // Gn tc cho xe Chng 5: Lp
89 int getSpeed(); // c tc xe void setMark(char); // Gn nhn cho xe char[] getMark(); // c nhn xe void setPrice(float); // Gn gi cho xe float getPrice(); // c gi xe void init(int, char[], float);// Khi to thng tin v xe void show(); // Gii thiu xe };
/* Khai bo phng thc bn ngoi lp */ void Car::setSpeed(int speedIn){ // Gn tc cho xe speed = speedIn; } int Car::getSpeed(){ // c tc xe return speed; } void Car::setMark(char markIn){ // Gn nhn cho xe strcpy(mark, markIn); } char[] Car::getMark(){ // c nhn xe return mark; } void Car::setPrice(float priceIn){ // Gn gi cho xe price = priceIn; } float Car::getPrice(){ // c gi xe return price; }
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 Chng 5: Lp
90 void main(){ clrscr(); Car myCar; // Khai bo bin lp
// Thay i thuc tnh xe cout << Xe thu hai: << endl; myCar.setSpeed(150); myCar.setMark(Mercedes); myCar.setPrice(5000); myCar.show(); return; }
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. Chng 5: Lp
91 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 Ngoi ra cn c mt s kiu hm bn m rng t hai kiu ny: Mt hm l bn ca nhiu lp Chng 5: Lp
92 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.
/* nh ngha lp */ class Car{ private: int speed; // Tc char mark[20]; // Nhn hiu float price; // Gi xe public: void init(int, char[], float);// Khi to thng tin v xe // Khai bo hm bn ca lp friend void moreExpensive(Car, Car); }; Chng 5: Lp
93
/* 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; // Khai bo bin lp
// 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); // S dng hm bn t do return; }
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: Chng 5: Lp
94 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.
/* nh ngha lp Person */ class Person{ private: char name[25]; // Tn int age; // Tui Chng 5: Lp
95 public: void init(char[], int); // Khi to thng tin v ngi int permission(Car); // Xc nh quyn iu khin xe };
/* nh ngha lp Car */ class Car{ private: int speed; // Tc char mark[20]; // Nhn hiu float price; // Gi xe 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; }
96 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)) // S dng hm bn cout << Co quyen dieu khien << endl; else cout << Khong co quyen dieu khien << endl; return; }
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. Chng 5: Lp
97 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 speed; char mark[20]; float price; public: Car(int speedIn, char markIn[], float priceIn){ speed = speedIn; strcpy(mark, markIn); price = priceIn; } }; 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++ Chng 5: Lp
98 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.
/* nh ngha lp */ class Car{ private: int speed; // Tc char mark[20]; // Nhn hiu float price; // Gi xe public: Car(); // Khi to khng tham s Car(int, char[], float);// Khi to y tham s void show(); // Gii thiu xe };
Chng 5: Lp
99 /* Khai bo phng thc bn ngoi lp */ Car::Car(){ // Khi to khng tham s 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 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
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 Chng 5: Lp
100 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.
/* nh ngha lp */ class Car{ private: int speed; // Tc char mark[20]; // Nhn hiu float price; // Gi xe public: // Khi to vi cc gi tr ngm inh cho cc tham s Car(int speedIn=0, char markIn[]=, float priceIn=0); void show(); // Gii thiu xe };
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(); Car myCar1; // Cc tham s nhn gi tr mc nh Chng 5: Lp
101 Car myCar2(150, Mercedes, 5000);// Dng hm khi to tham s
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 speed; char *mark; float price; public: ~Car(){ delete [] mark; }; }; 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. Chng 5: Lp
102 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.
/* nh ngha lp */ class Car{ private: int speed; // Tc char *mark; // Nhn hiu float price; // Gi xe public: // Khi to vi cc gi tr ngm inh cho cc tham s Car(int speedIn=0, char *markIn=NULL, float priceIn=0); void show(); // Gii thiu xe ~Car(); // Hm hy b tng minh };
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; }
Car::~Car(){ // Hm hy b tng minh delete [] mark; cout << The object has been destroyed! << endl; }
Chng 5: Lp
103 // Hm main, chng trnh chnh void main(){ clrscr(); Car myCar(150, Mercedes, 5000);// Dng hm khi to tham s
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>]); Chng 5: Lp
104 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 Con tr i tng c th tr n a ch ca mt i tng c sn, cng lp theo c php sau: <Tn con tr i tng> = &<Tn i tng c sn>; 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. Chng 5: Lp
105 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 // S dng con tr ptrCar delete 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.
/* nh ngha lp */ class Car{ private: int speed; // Tc char mark[20]; // Nhn hiu float price; // Gi xe public: // Khi to vi cc gi tr ngm inh cho cc tham s Car(int speedIn=0, char markIn[]=, float priceIn=0); void show(); // Gii thiu xe };
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);
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[]; Chng 5: Lp
107 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 // S dng bin mng ng delete [] cars; // 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.
/* nh ngha lp Car */ class Car{ private: int speed; // Tc char mark[20]; // Nhn hiu float price; // Gi xe public: void setSpeed(int); // Gn tc cho xe Chng 5: Lp
108 int getSpeed(); // c tc xe void setMark(char); // Gn nhn cho xe char[] getMark(); // c nhn xe void setPrice(float); // Gn gi cho xe float getPrice(); // c gi xe // Khi to thng tin v xe Car(int speedIn=0, char markIn[]=, float priceIn=0); void show(); // Gii thiu xe };
void Car::setSpeed(int speedIn){ // Gn tc cho xe speed = speedIn; } int Car::getSpeed(){ // c tc xe return speed; } void Car::setMark(char markIn){ // Gn nhn cho xe strcpy(mark, markIn); } char[] Car::getMark(){ // c nhn xe return mark; } void Car::setPrice(float priceIn){ // Gn gi cho xe price = priceIn; } float Car::getPrice(){ // c gi xe return price; }
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 Chng 5: Lp
109 void main(){ clrscr(); int length; // Chiu di mng float maxPrice = 0; // Gi t nht int index = 0; // Ch s ca xe t nht Car *cars; // 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; // (Bin tm) tc char mark[20]; // (Bin tm) nhn hiu float price; // (Bin tm) gi xe cout << Xe thu << i << : <<endl; cout << Toc do (km/h): ; cin >> speed; cars[i].setSpeed(speed); // Nhp tc cout << Nhan hieu : ; cin >> mark; cars[i].setMark(mark); // Nhp nhn xe cout << Gia ($): ; cin >> price; cars[i].setPrice(price); // Nhp gi xe
// Gii phng b nh ca mng delete [] cars; return; Chng 5: Lp
110 }
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; Chng 5: Lp
111 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}; }; Chng 5: Lp
112 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 Chng 5: Lp
113 - Tui nhn vin, c kiu int - Lung nhn vin, c kiu float. 13. Thm vo lp Employee trong bi 12 cc phng thc c tnh cht public: - 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. 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. Chng 5: Lp
114 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.
Chng 6: Tnh k tha v a hnh
115 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. V d: class Bus: public Car{ // Khai bo cc thnh phn }; Chng 6: Tnh k tha v a hnh
116 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 Tnh cht lp c s Tnh cht lp dn xut private private Khng truy nhp c Chng 6: Tnh k tha v a hnh
117 protected public private private protected private protected public Khng truy nhp c protected protected public private protected public 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. Chng 6: Tnh k tha v a hnh
118 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 speed; // Tc char mark[20]; // Nhn hiu float price; // Gi xe public: Car(); // Khi to khng tham s Car(int, char[], float); // Khi to tham s };
Car::Car(){ // Khi to khng tham s 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 */ Chng 6: Tnh k tha v a hnh
119 class Bus: public Car{ int label; // S hiu tuyn xe public: Bus(); // Khi to khng tham s Bus(int, char[], float, int); // Khi to tham s };
Bus::Bus():Car(){ // Khi to khng tham s label = 0; }
// Khi to tham s Bus::Bus(int sIn, char mIn[], float pIn, int lIn):Car(sIn, mIn, pIn){ label = lIn; }
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 Chng 6: Tnh k tha v a hnh
120 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 *mark; // Nhn hiu xe public: ~Car(); // Hy b tng minh };
Car::~Car(){ // Hy b tng minh delete [] mark; }
/* nh ngha lp Bus k tha t lp Car */ class Bus: public Car{ char *voyage[]; // Hnh trnh tuyn xe public: ~Bus(); // Hy b tng minh };
Bus::~Bus(){ // Hy b tng minh delete [] voyage; }
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 Tnh cht lp c s Tnh cht lp dn xut private private protected Khng truy nhp c private Chng 6: Tnh k tha v a hnh
121 public private protected private protected public Khng truy nhp c protected protected public private protected public 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. Chng 6: Tnh k tha v a hnh
122
Kiu dn xut Tnh cht lp c s Tnh cht lp dn xut Truy nhp t hm bn ca lp dn xut Truy nhp t i tng ca lp dn xut private private protected public --- private private --- ok ok --- --- --- protected private protected public --- protected protected --- ok ok --- --- --- public private protected public --- protected public --- ok ok --- --- ok
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: 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]); 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. 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.
/* nh ngha lp Car */ class Car{ private: int speed; // Tc Chng 6: Tnh k tha v a hnh
123 char mark[20]; // Nhn hiu float price; // Gi xe public: void setSpeed(int); // Gn tc cho xe int getSpeed(); // c tc xe void setMark(char); // Gn nhn cho xe char[] getMark(); // c nhn xe void setPrice(float); // Gn gi cho xe float getPrice(); // c gi xe // Khi to thng tin v xe Car(int speedIn=0, char markIn[]=, float priceIn=0); void show(); // Gii thiu xe };
void Car::setSpeed(int speedIn){ // Gn tc cho xe speed = speedIn; } int Car::getSpeed(){ // c tc xe return speed; } void Car::setMark(char markIn){ // Gn nhn cho xe strcpy(mark, markIn); } char[] Car::getMark(){ // c nhn xe return mark; } void Car::setPrice(float priceIn){ // Gn gi cho xe price = priceIn; } float Car::getPrice(){ // c gi xe return price; }
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; Chng 6: Tnh k tha v a hnh
124 return; }
/* nh ngha lp Bus k tha t lp Car */ class Bus: public Car{ int label; // S hiu tuyn xe public: // Khi to tham s Bus(int sIn=0, char mIn[]=, float pIn=0, int lIn=0); void setLabel(int); // Gn s hiu tuyn xe int getLabel(); // c s hiu tuyn xe };
// 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){ // Gn s hiu tuyn xe label = labelIn; } int Bus::getLabel(){ // c s hiu tuyn xe return label; }
// Chng trnh chnh void main(){ clrscr(); Bus myBus; // Bin i tng ca lp Bus 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 Chng 6: Tnh k tha v a hnh
125 myBus.setMark(markIn); // Phng thc ca lp Car myBus.setPrice(priceIn); // Phng thc ca lp Car myBus.setLabel(labelIn); // Phng thc ca lp Bus myBus.show(); // Phng thc ca lp Car return; }
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(); // Phng thc ca lp c s }; class Bus: public Car{
public:
void show(); // Phng thc np chng }; khi , phng thc show() ca lp Bus c coi l phng thc np chng t phng thc show() ca lp Car. Chng 6: Tnh k tha v a hnh
126 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: 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]); V d: Bus myBus; myBus.show(); 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: 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]); V d: Bus myBus; myBus.Car::show(); 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.
/* nh ngha lp Car */ class Car{ private: int speed; // Tc char mark[20]; // Nhn hiu float price; // Gi xe public: int getSpeed(); // c tc xe char[] getMark(); // c nhn xe float getPrice(); // c gi xe // Khi to thng tin v xe Chng 6: Tnh k tha v a hnh
void Car::setSpeed(int speedIn){ // Gn tc cho xe speed = speedIn; } int Car::getSpeed(){ // c tc xe return speed; } char[] Car::getMark(){ // c nhn xe return mark; } float Car::getPrice(){ // c gi xe return price; }
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; }
/* nh ngha lp Bus k tha t lp Car */ class Bus: public Car{ int label; // S hiu tuyn xe public: // Khi to tham s Bus(int sIn=0, char mIn[]=, float pIn=0, int lIn=0); void show(); // Gii thiu xe bus };
// Khi to tham s Bus::Bus(int sIn, char mIn[], float pIn, int lIn):Car(sIn, mIn, pIn){ label = lIn; } Chng 6: Tnh k tha v a hnh
128
// 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(); // Phng thc ca lp Car cout << Gioi thieu xe bus: << endl; myBus.show(); // Phng thc ca lp Bus return; }
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; Chng 6: Tnh k tha v a hnh
129 Car myCar; khi , php gn: myCar = myBus; // ng th chp nhn c, nhng php gn: myBus = myCar; // khng c 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.
/* nh ngha lp Car */ class Car{ private: int speed; // Tc char mark[20]; // Nhn hiu float price; // Gi xe public: int getSpeed(); // c tc xe char[] getMark(); // c nhn xe float getPrice(); // c gi xe // Khi to thng tin v xe Car(int speedIn=0, char markIn[]=, float priceIn=0); void show(); // Gii thiu xe };
130 int Car::getSpeed(){ // c tc xe return speed; } char[] Car::getMark(){ // c nhn xe return mark; } float Car::getPrice(){ // c gi xe return price; }
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; }
/* nh ngha lp Bus k tha t lp Car */ class Bus: public Car{ int label; // S hiu tuyn xe public: // Khi to tham s Bus(int sIn=0, char mIn[]=, float pIn=0, int lIn=0); void show(); // nh ngha chng phng thc };
// 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 Chng 6: Tnh k tha v a hnh
131
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 }; Chng 6: Tnh k tha v a hnh
132 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 speed; // Tc char mark[20]; // Nhn hiu float price; // Gi xe public: Car(); // Khi to khng tham s Car(int, char[], float); // Khi to tham s };
Car::Car(){ // Khi to khng tham s 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; Chng 6: Tnh k tha v a hnh
133 }
/* nh ngha lp PublicTransport */ class PublicTransport{ float ticket; // Gi v phng tin public: PublicTransport(); // Khi to khng tham s PublicTransport(float); // Khi to tham s };
PublicTransport::PublicTransport(){ // Khi to khng tham s 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; // S hiu tuyn xe public: Bus(); // Khi to khng tham s Bus(int, char[], float, float, int);// Khi to tham s };
// Khi to khng tham s Bus::Bus(): Car(), Transport(){ // Theo th t dn xut 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; }
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 Chng 6: Tnh k tha v a hnh
134 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(){ // Theo th t dn xut ngm nh label = 0; } 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(); }; Chng 6: Tnh k tha v a hnh
135 Khi , khai bo: Bus myBus; v li gi hm: myBus.show(); // Gi n hm ca lp Bus myBus.Car::show(); // 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.
/* nh ngha lp Car */ class Car{ int speed; // Tc char mark[20]; // Nhn hiu float price; // Gi xe public: Car(); // Khi to khng tham s Car(int, char[], float); // Khi to tham s void show(); // Gii thiu float getSpeed(){return speed;}; char[] getMark(){return mark;}; float getPrice(){return price;}; };
Car::Car(){ // Khi to khng tham s 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; }
Chng 6: Tnh k tha v a hnh
136 // 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; // Gi v phng tin public: PublicTransport(); // Khi to khng tham s PublicTransport(float); // Khi to tham s void show(); // Gii thiu float getTicket(){return ticket;}; };
PublicTransport::PublicTransport(){ // Khi to khng tham s 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; // S hiu tuyn xe public: Bus(); // Khi to khng tham s Bus(int, char[], float, float, int);// Khi to tham s void show(); // Gii thiu };
// Khi to khng tham s Chng 6: Tnh k tha v a hnh
137 Bus::Bus(): Car(), Transport(){ // Theo th t dn xut 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(); // Hm ca lp Car myBus.PublicTransport:: show(); // Hm ca lp PublicTransport myBus.show(); // Hm ca lp Bus return; }
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. Chng 6: Tnh k tha v a hnh
138 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).
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 Engine Car PublicTransport Bus Chng 6: Tnh k tha v a hnh
139 }; 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{ //Lp c s virtual public: Car(): Engine(){ }; }; class PublicTransport: public virtual Engine{ //Lp c s virtual 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(){ }; }; 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 Chng 6: Tnh k tha v a hnh
140 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.
/* nh ngha lp Engine */ class Engine{ int power; // Cng sut public: Engine(){power = 0;}; // Khi to khng tham s Engine(int pIn){power = pIn;};// Khi to tham s void show(); // Gii thiu float getPower(){return power;}; };
// 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 speed; // Tc char mark[20]; // Nhn hiu float price; // Gi xe public: Car(); // Khi to khng tham s Car(int, int, char[], float); // Khi to tham s void show(); // Gii thiu float getSpeed(){return speed;}; char[] getMark(){return mark;}; float getPrice(){return price;}; };
Chng 6: Tnh k tha v a hnh
141 Car::Car(): Engine(){ // Khi to khng tham s 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; // Gi v phng tin public: PublicTransport(); // Khi to khng tham s PublicTransport(int, float); // Khi to tham s void show(); // Gii thiu float getTicket(){return ticket;}; };
// 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(){ Chng 6: Tnh k tha v a hnh
142 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; // S hiu tuyn xe public: Bus(); // Khi to khng tham s Bus(int,int,char[],float,float,int);// Khi to tham s void show(); // Gii thiu };
// Khi to khng tham s Bus::Bus(): Engine(), Car(), Transport(){ // Theo th t dn xut 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 Chng 6: Tnh k tha v a hnh
143 myBus.PublicTransport::Engine::show();// Hm ca lp Engine myBus.Car::show(); // Hm ca lp Car myBus.PublicTransport:: show(); // Hm ca lp PublicTransport myBus.show(); // Hm ca lp Bus return; }
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. V d, lp Bus k tha t lp Car, c hai lp ny u nh ngha phng thc show(): class Car{ public: void show(); }; class Bus: public Car{ public: void show(); }; khi , nu ta khai bo mt con tr lp Bus, nhng li tr vo a ch ca mt i tng lp Car: Chng 6: Tnh k tha v a hnh
144 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 Chng 6: Tnh k tha v a hnh
145 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.
/* nh ngha lp Car */ class Car{ private: int speed; // Tc char mark[20]; // Nhn hiu float price; // Gi xe 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(); // Gii thiu xe, tru tng };
// 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; } Chng 6: Tnh k tha v a hnh
146
/* nh ngha lp Bus k tha t lp Car */ class Bus: public Car{ int label; // S hiu tuyn xe public: // Khi to tham s Bus(int sIn=0, char mIn[]=, float pIn=0, int lIn=0); void show(); // Gii thiu xe };
// 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; // Tr n i tng lp Car ptrCar->show(); // Phng thc ca lp Car
ptrCar = &myBus; // Tr n i tng lp Bus ptrCar->show(); // Phng thc ca lp Bus return; }
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, Chng 6: Tnh k tha v a hnh
147 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. Chng 6: Tnh k tha v a hnh
148 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: public class B{}; b. class A: public B{}; c. class A: class B{}; d. class A:: 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); Chng 6: Tnh k tha v a hnh
149 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. Chng 6: Tnh k tha v a hnh
150 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(); Chng 6: Tnh k tha v a hnh
151 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. Chng 6: Tnh k tha v a hnh
152 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. Chng 7: Mt s lp quan trng
153 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: ==: Ton t so snh bng <: Ton t so snh nh hn begin(): Gi tr khi u ca con chy iterator end(): Gi tr kt thc ca con chy iterator size(): S lng phn t i tng ca vt cha empty(): Vt cha l rng front(): Phn t th nht ca vt cha back(): Phn t cui ca vt cha []: Ton t truy nhp n phn t ca vt cha insert(): 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(): Loi b mt (hoc mt s) phn t khi vt cha pop_back(): Loi b phn t cui ca vt cha pop_front(): 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. Chng 7: Mt s lp quan trng
154 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 : 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. V d: Set<int>::iterator iter; 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; // Khai bo mt i tng ca lp Set, // cc phn t c kiu int Set<int>::iterator i; // Khai bo con chy ca lp Set, // cc phn t c kiu int // Thm phn t vo for(i=mySet.begin(); i<mySet.end(); i++) cout << mySet[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. Chng 7: Mt s lp quan trng
155 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 hoc: #include<stl.h> // Th vin chung cho cc lp vt cha 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 : 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. V d: Set<int> mySet; 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]; // Khi to mng i tng Set<Person> mySet(myPerson, 10); // 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}. Chng 7: Mt s lp quan trng
156 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_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,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 : Chng 7: Mt s lp quan trng
157 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. V d, mySet l mt tp hp kiu int: mySet.insert(10); 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. V d, mySet l mt tp hp cc phn t c kiu int: mySet.erase(10); 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 : Chng 7: Mt s lp quan trng
158 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. V d, mySet l mt tp hp cc phn t c kiu int: Set<int>::iterator index = mySet.find(10); cout << index; 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: // Thm vo char phantu; cout << Ki tu them vao: ; cin >> phantu; mySet.insert(phantu); break; case 2: // Loi ra char phantu; cout << Loai bo ki tu: << endl; cin >> phantu; Chng 7: Mt s lp quan trng
159 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: 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>); V d: String myStr; 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 : 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. V d: String myStr(12); Chng 7: Mt s lp quan trng
160 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; // myStr c hai phn t {1, 2} Nhng php gn li c u tin thp hn php ton hc: String myStr = 12+1.5; // tng ng myStr = 13.5 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 >: chui_1 > chui_2; Php so snh ln hn hoc bng >=: chui_1 >= chui_2; Php so snh nh hn <: chui_1 < chui_2; Php so snh nh hn hoc bng <=: chui_1 <= chui_2; Chng 7: Mt s lp quan trng
161 Php so snh bng ==: chui_1 == chui_2; Php so snh khc (khng bng) !=: chui_1 != chui_2; Lu : 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. V d: 12 < a; // c gi tr ng a <= A; // c gi tr sai Php vo/ra Php xut ra <<: cout << bin_chui; Php nhp vo >>: cin >> bin_chui; V d: String s(hello!); cout << s; 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 : Chng 7: Mt s lp quan trng
162 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.
V d: 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 : 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. V d: s.insert(0, 12); 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 : 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. V d: s.delete(0, 2); s xo hai k t u ca chui s. Chuyn kiu k t i chui thnh cc k t hoa: <bin_chui>.toUpper(); i chui thnh cc k t thng: <bin_chui>.toLower(); V d: s.toUpper(); // chuyn chui s thnh k t hoa s.toLower(); // chuyn chui s thnh k t thng Chng 7: Mt s lp quan trng
163 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: // Thm vo cui String subStr; cout << Chuoi them vao: ; cin >> subStr; myStr += subStr; break; case 2: // Chn vo chui String subStr; int position; cout << Chuoi them vao: ; cin >> subStr; cout << Vi tri chen:; cin >> position; Chng 7: Mt s lp quan trng
164 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: // Tm chui con 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: // Chuyn thnh ch hoa myStr.toUpper(); cout << myStr << endl; break; case 6: // Chuyn thnh ch thng myStr.toLower(); cout << myStr << endl; break; case 7: // Duyt cout << Noi dung chuoi: << endl; cout << myStr << endl; break; case 8: // Duyt cout << Chieu dai chuoi: << myStr.length() << endl; break; }while(function != 9); return; }
Chng 7: Mt s lp quan trng
165 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 : 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. V d: Stack<int> myStack; 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: Chng 7: Mt s lp quan trng
166 <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.
void main(){ clrscr(); Stack<char> myStack; char strIn[250]; cout << Nhap chuoi: ; cin >> strIn; // Nhp chui k t t bn phm for(int i=0; i<strlen(strIn); i++) // t vo ngn xp myStack.push(strIn[i]); while(!myStack.empty()) // Ly ra t ngn xp 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: Chng 7: Mt s lp quan trng
167 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 : 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. V d: Queue<int> myQueue; 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.
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: // Thm vo hng i 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; }
Chng 7: Mt s lp quan trng
169 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 hoc: #include<stl.h> // Dng chung cho cc lp vt cha 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 : 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. V d: List<int> myList; 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: <, >, <=, >=, !=. Chng 7: Mt s lp quan trng
170 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 : 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. V d: List<int> myList; myList.push_front(7); 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 : 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. V d: List<int> myList; cout << myList.pop_front(); 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: Chng 7: Mt s lp quan trng
171 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 : 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 . V d: List<int> myList; cout << myList.get(); 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.
typedef struct{ char name[25]; // Tn nhn vin int age; // Tui nhn vin float salary; // Lng nhn vin } 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; Chng 7: Mt s lp quan trng
172 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; myList.insert(position, employee); break; case 2: // Ly ra khi ds 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; } Chng 7: Mt s lp quan trng
173 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.
Hng dn tr li cu hi v n tp
174 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]; Hng dn tr li cu hi v n tp
175 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* nameIn=, int ageIn=18, float salaryIn=100); Hng dn tr li cu hi v n tp
176 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); Hng dn tr li cu hi v n tp
177 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*, int, int, char*, char*, int, float, char*); void setPosition(char*); char* getPosition(); void virtual show(); ~Employee(); }; Chng 7 2. Gi Hng dn tr li cu hi v n tp
178 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: // Thm vo 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() << ; } Hng dn tr li cu hi v n tp
179 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: // Thm vo ds 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: // Ly ra khi ds 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; Hng dn tr li cu hi v n tp
180 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; } Ti liu tham kho
181 TI LIU THAM KHO Ti liu ting Anh [1] James P. Cohoon and Jack W.Davidson, C++ Program Design An Introduction to Programming and Object-Oriented Design, 2 nd edition, WCB McGraw-Hill, 1999. [2] Nell Dale, Chip Weems and Mark Headington, Programming and Problem Solving with C++, John & Barlett Publisher, 1996. [3] Michael T. Goodrich, Roberto Tamassia and David Mount, Data Structures and Algorithms in C++, John Wiley & Sons Inc, 2004. [4] Scott R.Ladd, C++ Components and Algorithms. 2 nd edition. . M&T Books, 1994. [5] Scott R.Ladd, C++ Templates and Tools, M&T Books, 1994 [6] Robert Lafore, Object Oriented Programming in C++, Fourth edition, SAMS, 2001. Ti liu ting Vit [1] 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. [2] 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. http://www.angelfire.com/country/aldev0/cpphowto/ 2. http://www.gnacademy.org/text/cc/Tutorial/tutorial.html 3. http://sophia.dtp.fmph.uniba.sk/cpptut/tutorial.us.html 4. http://www.brpreiss.com/books/opus4/html/book.html 5. http://www.fredosaurus.com/notes-cpp/index.html
Mc lc
182 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 Mc lc
183 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 Mc lc
184 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
NGN NG LP TRNH C++ M s : 412LTC340
Chu trch nhim bn tho TRUNG TM O TO BU CHNH VIN THNG 1