Professional Documents
Culture Documents
H NI - 2006
GII THIU
C++ l ngn ng lp trnh hng i tng c m rng t ngn ng C. Do vy, C++ c u im l k tha c cc im mnh truyn thng ca ngn ng C nh uyn chuyn, tng thch vi cc thit b phn cng. Hin nay, C++ l mt ngn ng lp trnh ph bin, c ging dy ti cc trng i hc trong nc v trn th gii v c bit c s dng rng ri cho nhu cu pht trin ca cng nghip phn mm hin nay. Ti liu ny khng nhng nhm gii thiu cho sinh vin ngn ng lp trnh C++, m cn mong mun qua sinh vin c th hiu c t tng ca phng php lp trnh hng i tng ni chung. Ni dung ca ti liu bao gm hai phn chnh: Phn th nht l lp trnh nng cao vi C++, bao gm lp trnh C++ vi con tr v mng, cc kiu d liu c cu trc cng cc thao tc vo ra trn tp. Phn th hai l lp trnh hng i tng vi C++, bao gm cc nh ngha v cc thao tc trn lp i tng, tnh k tha v tng ng bi trong C++, cch s dng mt s lp c bn trong th vin C++. Chng 1: Gii thiu tng quan v cc phng php lp trnh Trnh by cc phng php lp trnh tuyn tnh, lp trnh cu trc v c bit, lm quen vi cc khi nim trong lp trnh hng i tng. Chng 2: Con tr v mng Trnh by cch khai bo v s dng cc kiu con tr v mng trong ngn ng C++. Chng 3: Kiu d liu c cu trc Trnh by cch biu din v ci t mt s kiu cu trc d liu tru tng trong C++. Sau , trnh by cch p dng cc kiu d liu ny trong cc ng dng c th. Chng 4: Vo ra trn tp Trnh by cc thao tc c, ghi d liu trn cc tp tin khc nhau: tp tin vn bn v tp tin nh phn. Trnh by cc cch truy nhp tp tin trc tip. Chng 5: Lp i tng Trnh by cc khi nim m u cho lp trnh hng i tng trong C++, bao gm cch khai bo v s dng lp, cc thuc tnh ca lp; cch khi to v hu b i tng, cc quy tc truy nhp n cc thnh phn ca lp. Chng 6: Tnh k tha v tng ng bi Trnh by cch thc k tha gia cc lp trong C++, cc nguyn tc truy nhp trong k tha, nh ngha np chng cc phng thc v tnh a hnh trong lp trnh hng i tng vi C++. Chng 7: Mt s lp quan trng Trnh by cch s dng mt s lp c sn trong th vin chun ca C++, bao gm cc lp: lp tp hp, lp chui, lp ngn xp, lp hng i v lp danh sch lin kt. c c cun sch ny, sinh vin phi quen bit cc khi nim c bn v lp trnh, c mt s k nng lp trnh vi ngn ng C hoc C++. Cun sch ny cng c th dng ti liu tham kho cho nhng sinh vin mun tm hiu cc k thut lp trnh nng cao v lp trnh hng i tng
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.
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.
c trng
c trng c bn nht ca lp trnh cu trc th hin mi quan h:
Chng trnh = Cu trc d liu + Gii thut Trong : Cu trc d liu l cch t chc d liu cho vic x l bi mt hay nhiu chng trnh no . Gii thut l mt quy trnh thc hin mt cng vic xc nh Mt cu trc d liu ch ph hp vi mt s hn ch cc gii thut. Nu thay i cu trc d liu th phi thay i gii thut cho ph hp. Mt gii thut thng phi i km vi mt cu trc d liu nht nh.
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).
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.
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.
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
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.
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.
TNG KT CHNG 1
Chng 1 trnh by tng quan v cc phng php lp trnh hin nay. Ni dung tp trung vo ba phng php lp trnh c lin quan trc tip n ngn ng lp trnh C++: Lp trnh tuyn tnh Lp trnh hng cu trc Lp trnh hng i tng.
C++ l ngn ng lp trnh c m rng t ngn ng lp trnh cu trc C. Do , C++ va c nhng c trng ca lp trnh cu trc, va c nhng c trng ca lp trnh hng i tng.
10
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.
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;
11
Dng con tr lu a ch ca bin Bn thn con tr s c tr vo a ch ca mt bin c cng kiu d liu vi n. C php ca php gn nh sau:
<Tn con tr> = &<tn bin>;
Lu V d:
int x, *px; px = &x;
s cho con tr px c kiu int tr vo a ch ca bin x c kiu nguyn. Php ton &<Tn bin> s cho a ch ca bin tng ng. Ly gi tr ca bin do con tr tr n Php ly gi tr ca bin do con tr tr n c thc hin bng cch gi tn:
*<Tn con tr>;
Lu V d:
int x = 12, y, *px; px = &y; *px = x;
Trong php ton ny, phi c du con tr *. Nu khng c du con tr, s tr thnh php ly a ch ca bin do con tr tr ti.
Lu Trong php gn gia cc con tr, bt buc phi dng php ly a ch ca bin do con tr tr ti (khng c du * trong tn con tr) m khng c dng php ly gi tr ca bin do con tr tr ti.
12
Hai con tr phi cng kiu. Trong trng hp hai con tr khc kiu, phi s dng cc phng thc p kiu tng t nh trong php gn cc bin thng thng c kiu khc nhau.
int x = 12, *px, *py; px = &x; py = px;
int x = 12, *px, *py; px = &x; py = px; x = 12 x = 12 x = 12 px px px null py py py null null
V d:
con tr py cng tr vo a ch ca bin x nh con tr px. Khi *py cng c gi tr 12 ging nh *px v l gi tr ca bin x. Chng trnh 2.1 minh ho vic dng con tr gia cc bin ca mt chng trnh C++. Chng trnh 2.1
#include <stdio.h> #include <conio.h> void main(void){ int x = 12, *px, *py; cout << x = << x << endl; px = &x; // Con tr px tr ti a ch ca x
cout << px = &x, *px = << *px << endl; *px = *px + 20; // Ni dung ca px l 32
cout << *px = *px+20, x = << x << endl; py = px; *py += 15; } // Cho py tr ti ch m px tr: a ch ca x // Ni dung ca py l 47 << x << endl;
Trong chng trnh 2.1, ban u bin x c gi tr 12. Sau , con tr px tr vo a ch ca bin x nn con tr px cng c gi tr 12. Tip theo, ta tng gi tr ca con tr px thm 20, gi tr ca con tr px l 32. V px ang tr n a ch ca x nn x cng c gi tr l 32. Sau , ta cho con tr py tr n v tr m px ang tr ti (a ch ca bin x) nn py cng c gi tr 32. Cui cng, ta tng gi tr ca con tr py thm 15, py s c gi tr 37. V py cng ang tr n a ch ca x nn x cng c gi tr 37. Do , v d 2.1 s in ra kt qu nh sau:
13
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];
14
pa = pa + 1;
pa = pa - 2;
Lu : Hai php ton pa++ v *pa++ c tc dng hon ton khc nhau trn mng, pa++ l thao tc trn con tr, tc l trn b nh, n s a con tr pa tr n a ch ca phn t tip theo ca mng. *pa++ l php ton trn gi tr, n tng gi tr hin ti ca phn t mng ln mt n v. V d:
int A[5] = {5, 10, 15, 20, 25}; int *pa = &A[2];
th pa++ l tng ng vi pa = &A[3] v *pa = 20. nhng *pa++ li tng ng vi pa = &A[2] v *pa = 15+1 = 16, A[2] = 16.
15
int A[5] = {5, 10, 15, 20, 25}; int *pa = &A[2];
A A pa A pa A pa
A[0]=5 A[0]=5
pa ++;
A[0]=5
A[0]=5
th php ton pa++ s a con tr pa tr n mt a ch khng xc nh. L do l A[4] l phn t cui ca mng A, nn pa++ s tr n a ch ngay sau a ch ca A[4], a ch ny nm ngoi vng ch s ca mng A nn khng xc nh. Tng t vi trng hp pa=&A[0], php ton pa-- cng a pa tr n mt a ch khng xc nh.
int A[5] = {5, 10, 15, 20, 25}; int *pa = &A[2];
A A pa A pa A pa
A[0]=5 A[0]=5
pa ++;
A[0]=5
null
pa = &A[0];
A[0]=5
pa --;
null
A pa
A[0]=5
V mng A l con tr hng, cho nn khng th thc hin cc php ton trn A m ch c th thc hin trn cc con tr tr n A: cc php ton pa++ hoc pa--l hp l, nhng cc php ton A++ hoc A--l khng hp l.
Chng trnh 2.2a minh ho vic ci t mt th tc sp xp cc phn t ca mt mng theo cch thng thng.
16
Chng trnh 2.2b ci t mt th tc tng t bng con tr. Hai th tc ny c chc nng hon ton ging nhau. Chng trnh 2.2b
void SortArray(int *A, int n){ int temp; for(int i=0; i<n-1; i++) for(int j=i+1; j<n; j++) if(*(A+i) > *(A+j)){ temp = *(A+i); *(A+i) = *(A+j); *(A+j) = temp; } }
Trong chng trnh 2.2b, thay v dng mt mng, ta dng mt con tr tr n mng cn sp xp. Khi , ta c th dng cc thao tc trn con tr thay v cc thao tc trn cc phn t mng.
17
Khi , a ch ca ma trn A chnh l a ch ca hng u tin ca ma trn A, v cng l a ch ca phn t u tin ca hng u tin ca ma trn A: a ch ca ma trn A: a ch ca hng th nht: a ch ca hng th i: a ch phn t Gi tr phn t
int A[3][3]; A = A[0] = *(A+0) = &A[0][0]; A[1] = *(A+1) = &A[1][0]; A[i] = *(A+i) = &A[i][0]; &A[i][j] = (*(A+i)) + j; A[i][j] = *((*(A+i)) + j);
Nh vy, mt mng hai chiu c th thay th bng mt mng mt chiu cc con tr cng kiu: c th thay th bng:
int (*A)[3];
Con tr tr ti con tr
V mt mng hai chiu int A[3][3] c th thay th bng mt mng cc con tr int (*A)[3]. Hn na, mt mng int A[3] li c th thay th bng mt con tr int *A. Do vy, mt mng hai chiu c th thay th bng mt mng cc con tr, hoc mt con tr tr n con tr. Ngha l cc cch vit sau l tng ng:
int A[3][3]; int (*A)[3]; int **A;
2.3 CON TR HM
Mc d hm khng phi l mt bin c th nn khng c mt a ch xc nh. Nhng trong khi chy, mi mt hm trong C++ cng c mt vng nh xc nh, do vy, C++ cho php dng con tr tr n hm. Con tr hm c dng truyn tham s c dng hm.
Khai bo con tr hm
Con tr hm c khai bo tng t nh khai bo nguyn mu hm thng thng trong C++, ngoi tr vic c thm k hiu con tr * trc tn hm. C php khai bo con tr hm nh sau:
<Kiu d liu tr v> (*<Tn hm>)([<Cc tham s>]);
Trong : Kiu d liu tr v: l cc kiu d liu thng thng ca C++ hoc kiu do ngi dng t nh ngha. Tn hm: tn do ngi dng t nh ngha, tun th theo quy tc t tn bin trong C++. Cc tham s: c th c hoc khng (phn trong du [] l tu chn). Nu c nhiu tham s, mi tham s c phn cch nhau bi du phy.
int (*Calcul)(int a, int b);
V d khai bo: l khai bo mt con tr hm, tn l Calcul, c kiu int v c hai tham s cng l kiu int. Lu :
18
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);
Chng trnh 2.3 minh ho vic khai bo v s dng con tr hm. Chng trnh 2.3
#include <ctype.h> #include <string> // Hm c s dng con tr hm nh tham s void Display(char[] str, int (*Xtype)(int c)){ int index = 0; while(str[index] != \0){ cout << (*Xtype)(str[index]); // S dng con tr hm index ++; } return; } // Hm main, dng li gi hm n con tr hm void main(){ char input[500]; cout << Enter the string: ; cin >> input;
19
char reply; cout << Display the string in uppercase or lowercase (u,l): ; cin >> reply; if(reply == l) else return; } // Hin th theo dng lowercase // Hin th theo dng uppercase Display(str, toupper); Display(str, tolower);
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);
2.4 CP PHT B NH NG
Xt hai trng hp sau y: Trng hp 1, khai bo mt con tr v gn gi tr cho n:
int *pa = 12;
Trng hp 2, khai bo con tr n phn t cui cng ca mng ri tng thm mt n v cho n:
int A[5] = {5, 10, 15, 20, 25}; int *pa = &A[4]; pa++;
Trong c hai trng hp, ta u khng bit thc s con tr pa ang tr n a ch no trong b nh: trng hp 1 ch ra rng con tr pa ang tr ti mt a ch khng xc nh, nhng li cha gi tr l 12 do c gn vo. Trng hp 2, con tr pa tr n a ch ngay sau a ch phn t cui cng ca mng A, cng l mt a ch khng xc nh. Cc a ch khng xc nh ny l cc a ch nm vng nh t do cn tha ca b nh. Vng nh ny c th b chim dng bi bt k mt chng trnh no ang chy. Do , rt c th cc chng trnh khc s chim mt cc a ch m con tr pa ang tr ti. Khi , nu cc chng trnh thay i gi tr ca a ch , gi tr pa cng b thay i theo m ta khng th kim sot c. trnh cc ri ro c th gp phi, C++ yu cu phi cp pht b nh mt cch tng minh cho con tr trc khi s dng chng.
20
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);
Gii phng b nh ng
a ch ca con tr sau khi c cp pht bi thao tc new s tr thnh vng nh b chim dng, cc chng trnh khc khng th s dng vng nh ngay c khi ta khng dng con tr na. tit kim b nh, ta phi hu b vng nh ca con tr ngay sau khi khng dng n con tr na. C php hu b vng nh ca con tr nh sau:
delete <tn con tr>;
V d:
int *pa = new int(12); delete pa; // Khai bo con tr pa, cp pht b nh // v gn gi tr ban u cho pa l 12. // Gii phng vng nh va cp cho pa.
Lu : Mt con tr, sau khi b gii phng a ch, vn c th c cp pht mt vng nh mi hoc tr n mt a ch mi:
int *pa = new int(12); delete pa; pa = A; // Khai bo con tr pa, cp pht b nh // v gn gi tr ban u cho pa l 12. // Gii phng vng nh va cp cho pa. // Cho pa tr n a ch ca mng A
Nu c nhiu con tr cng tr vo mt a ch, th ch cn gii phng b nh ca mt con tr, tt c cc con tr cn li cng b gii phng b nh:
int *pa = new int(12); int *pb = pa; *pb += 5; delete pa; // *pa = 12 // pb tr n cng a ch pa. // *pa = *pb = 17 // Gii phng c pa ln pb
21
Mt con tr sau khi cp pht b nh ng bng thao tc new, cn phi phng b nh trc khi tr n mt a ch mi hoc cp pht b nh mi:
int *pa = new int(12); *pa = new int(15); // pa c cp b nh v *pa = 12 // pa tr n a ch khc v *pa = 15. // a ch c ca pa vn b coi l bn
Trong : V d:
int *A = new int[5];
Tn con tr: tn do ngi dng t, tun th theo quy tc t tn bin ca C++. Kiu con tr: Kiu d liu c bn ca C++ hoc l kiu do ngi dng t nh ngha. di mng: s lng cc phn t cn cp pht b nh ca mng.
s khai bo mt mng A c 5 phn t kiu int c cp pht b nh ng. Lu : Khi cp pht b nh cho con tr c khi to thng thng, ta dng du (), khi cp pht b nh cho mng, ta dng du []. Hai lnh cp pht sau l hon ton khc nhau:
// Cp pht b nh v khi to cho mt con tr int int *A = new int(5); // Cp pht b nh cho mt mng 5 phn t kiu int int *A = new int[5];
V d:
// Cp pht b nh cho mt mng c 5 phn t kiu int int *A = new int[5]; // Gii phng vng nh do mng A ang chim gi. delete [] A;
Chng trnh 2.4 minh ho hai th tc khi to v gii phng mt mng ng mt chiu. Chng trnh 2.4
void InitArray(int *A, int length){ A = new int[length]; for(int i=0; i<length; i++)
22
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.
s gii phng b nh cho mt mng ng hai chiu. Chng trnh 2.5 minh ho vic dng mng ng hai chiu tnh tng ca hai ma trn.
23
24
TNG KT CHNG 2
Ni dung chng 2 trnh by cc vn lin quan n vic khai bo v s dng con tr v mng trong ngn ng C++: Con tr l mt kiu bin c bit, n tr n a ch ca mt bin khc. C hai cch truy nhp n con tr l truy nhp n a ch hoc truy nhp n gi tr ca a ch m con tr tr n. Con tr c th tham gia vo cc php ton nh cc bin thng thng bng php ly gi tr. Mt con tr c s tng ng vi mt mng mt chiu c cng kiu. Mt ma trn hai chiu c th thay th bng mt mng cc con tr hoc mt con tr tr n con tr. Mt con tr c th tr n mt hm, khi , n c dng gi mt hm nh l mt tham s cho hm khc.
25
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;
26
Khi , c c kt qu *pa = 50, cc lnh no sau y l ng? a. pa = A + 4; b. pa = (*(A+1)) + 1; c. pa = &A[1][1]; d. pa = *((*(A+1)) + 1); 9. Gi s ta khai bo mt hm c s dng con tr hm vi khun mu nh sau:
int Calcul(int a, int b, int (*Xcalcul)(int x, int y)){}
V ta c ci t mt s hm nh sau:
27
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);
28
14. Vit chng trnh thc hin cc php ton cng, tr, nhn, chia trn a thc. Cc a thc c biu din bng mng ng mt chiu. Bc ca a thc v cc h s tng ng c nhp t bn phm. 15. Vit chng trnh thc hin cc php ton cng, tr, nhn hai ma trn kch thc m*n. Cc ma trn c biu din bng mng ng hai chiu. Gi tr kch c ma trn (m, n) v gi tr cc phn t ca ma trn c nhp t bn phm.
29
Trong : struct: l tn t kho khai bo mt cu trc, bt buc phi c khi nh ngha cu trc. Tn cu trc: l tn do ngi dng t nh ngha, tun th theo quy tc t tn bin trong C++. Tn ny s tr thnh tn ca kiu d liu c cu trc tng ng. Thuc tnh: mi thuc tnh ca cu trc c khai bo nh khai bo mt bin thuc kiu d liu thng thng, gm c kiu d liu v tn bin tng ng. Mi khai bo thuc tnh phi kt thc bng du chm phy ; nh mt cu lnh C++ thng thng.
V d, qun l nhn vin ca mt cng ty, khi x l thng tin v mi nhn vin, ta lun phi x l cc thng tin lin quan nh: Tn Tui Chc v Lng
Do , ta s dng cu trc lu gi thng tin v mi nhn vin bng cch nh ngha mt cu trc c tn l Employeee vi cc thuc tnh nh sau:
30
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;
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; };
31
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.
Trong : Tn kiu d liu cu trc: l tn kiu d liu ca cu trc va nh ngha. Tn ny s c dng nh mt kiu d liu thng thng khi khai bo bin cu trc.
V d, mun c kiu d liu c cu trc nhn vin, c tn l Employee, ta dng t kho typedef nh ngha cu trc nh sau:
typedef struct { char name[20]; int age; char role[20]; float salary; } Employee; // Tn nhn vin // Tui nhn vin // Chc v ca nhn vin // Lng ca nhn vin
Khi , mun c hai bin l myEmployee1 v myEmployee2 c kiu cu trc Employee, ta ch cn khai bo nh sau m khng cn t kho struct:
Employee myEmployee1, myEmployee2;
Trong v d khai bo lng cu trc Employee, dng t kho typedef cho kiu Date:
typedef struct { int day; int month; int year; } Date;
32
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.
Ngoi ra, ta c th khi to cc gi tr cho cc thuc tnh ca cu trc ngay khi khai bo bng cc c php sau:
<Tn kiu d liu cu trc> <tn bin> = { <gi tr thuc tnh 1>, <gi tr thuc tnh 2>, <gi tr thuc tnh n> };
Trong : Gi tr thuc tnh: l gi tr khi u cho mi thuc tnh, c kiu ph hp vi kiu d liu ca thuc tnh. Mi gi tr ca thuc tnh c phn cch bng du phy ,.
typedef struct { char name[20]; int age; char role[20]; float salary; } Employee; // Tn nhn vin // Tui nhn vin // Chc v ca nhn vin // Lng ca nhn vin
V d, vi nh ngha cu trc:
33
v:
typedef struct { char name[20]; Date birthDay; char role[20]; float salary; } Employee; // Tn nhn vin // Ngy sinh ca nhn vin // Chc v ca nhn vin // Lng ca nhn vin
i vi kiu cu trc lng nhau, php truy nhp n thuc tnh c thc hin ln lt t cu trc cha n cu trc con. V d, vi mt bin cu trc kiu Employee lng nhau: 34
Employee myEmployee1 = { Nguyen Van A, {15, 05, 1980}, Nhan vien, 300f };
Chng trnh 3.1a minh ho vic to lp v s dng cu trc Employee n, khng dng t kho typedef. Chng trnh 3.1a
#include<stdio.h> #include<conio.h> #include<string.h> struct Employee{ char name[20]; int age; char role[20]; float salary; }; /* Khai bo khun mu hm */ void Display(Employee myEmployee); void Display(Employee myEmployee){ cout << Name: << myEmployee.name << endl; cout << Age: << myEmployee.age << endl; cout << Role: << myEmployee.role << endl; cout << Salary: << myEmployee.salary << endl; return; } void main(){ clrscr(); // Hin th gi tr mc nh Employee myEmployee = // Tn nhn vin // Tui nhn vin // Chc v ca nhn vin // Lng ca nhn vin
35
Chng trnh 3.1b minh ho vic to lp v s dng cu trc Employee lng nhau, c dng t kho typedef. Chng trnh 3.1b
#include<stdio.h> #include<conio.h> #include<string.h> typedef struct { int day; int month; int year; } Date; typedef struct { char name[20]; Date birthDay; char role[20]; float salary; } Employee; /* Khai bo khun mu hm */ void Display(Employee myEmployee); // Tn nhn vin // Ngy sinh ca nhn vin // Chc v ca nhn vin // Lng ca nhn vin
36
void Display(Employee myEmployee){ cout << Name: << myEmployee.name << endl; cout << Birth day: << myEmployee.birthDay.day << / << myEmployee.birthDay.month << / << myEmployee.birthDay.year << endl; cout << Role: << myEmployee.role << endl; cout << Salary: << myEmployee.salary << endl; return; } void main(){ clrscr(); // Hin th gi tr mc nh Employee myEmployee = {Nguyen Van A, {15, 5, 1980}, Nhan vien, 300f}; cout << Thng tin mc nh: << endl; Display(myEmployee); // Thay i gi tr cho cc thuc tnh cout << Name: ; cin >> myEmployee.name; cout << Day of birth: ; cin >> myEmployee.birthDay.day; cout << Month of birth: ; cin >> myEmployee.birthDay.month; cout << Year of birth: ; cin >> myEmployee.birthDay.year; cout << Role: ; cin >> myEmployee.role; cout << Salary: ; cin >> myEmployee.salary; cout << Thng tin sau khi thay i: << endl; Display(myEmployee); return; }
37
v:
typedef struct { char name[20]; Date birthDay; char role[20]; float salary; } Employee; // Tn nhn vin // Ngy sinh ca nhn vin // Chc v ca nhn vin // Lng ca nhn vin
Lu : Cng nh khai bo con tr thng thng, du con tr * c th nm ngay trc tn bin hoc nm ngay sau tn kiu cu trc. Cho n tr n a ch ca mt bin cu trc Cp pht cho n mt vng nh xc nh.
38
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;
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
Cch 2:
(*<Tn bin con tr>).<Tn thuc tnh>;
V d, thuc tnh tn nhn vin ca cu trc Employee c th c truy nhp thng qua hai cch:
Employee *ptrEmployee = new Employee; cin >> ptrEmployee -> name;
hoc:
39
Lu : Trong cch truy nhp th hai, phi c du ngoc n () quanh tn con tr v php ton truy nhp thuc tnh . c u tin cao hn php ton ly gi tr con tr *. Thng thng, ta dng cch th nht cho n gin v thun tin.
Chng trnh 3.2 ci t vic khi to v hin th ni dung ca mt con tr cu trc. Chng trnh 3.2
#include<stdio.h> #include<conio.h> #include<string.h> typedef struct { int day; int month; int year; } Date; typedef struct { char name[20]; Date birthDay; char role[20]; float salary; } Employee; /* Khai bo khun mu hm */ void InitStruct(Employee *myEmployee); void Display(Employee *myEmployee); void InitStruct(Employee *myEmployee){ myEmployee = new Employee; cout << Name: ; cin >> myEmployee->name; cout << Day of birth: ; cin >> myEmployee->birthDay.day; cout << Month of birth: ; cin >> myEmployee->birthDay.month; cout << Year of birth: ; cin >> myEmployee->birthDay.year; cout << Role: ; cin >> myEmployee->role; cout << Salary: ; // Tn nhn vin // Ngy sinh ca nhn vin // Chc v ca nhn vin // Lng ca nhn vin
40
V d:
Employee employees[10];
V d, khai bo:
Employee *employees;
va c th coi l khai bo mt con tr thng thng c cu trc Employee, va c th coi l khai bo mt mng ng cc cu trc c kiu cu trc Employee.
41
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];
Chng trnh 3.3 ci t vic khi to mt mng cc nhn vin ca mt phng trong mt cng ty. Sau , chng trnh s tm v in ra thng tin v nhn vin c lng cao nht v nhn vin c lng thp nht trong phng. Chng trnh 3.3
#include<stdio.h> #include<conio.h> #include<string.h> typedef struct { int day; int month; int year; } Date; typedef struct { char name[20]; Date birthDay; char role[20]; float salary; } Employee; /* Khai bo khun mu hm */ void InitArray(Employee *myEmployee, int length); Employee searchSalaryMax(Employee *myEmployee, int length); Employee searchSalaryMin(Employee *myEmployee, int length); void Display(Employee myEmployee); // Tn nhn vin // Ngy sinh ca nhn vin // Chc v ca nhn vin // Lng ca nhn vin
42
43
44
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.
Tuy nhin, nh ngha ny tn ti mt vn , l kch thc (SIZE) ca danh sch cha cc phn t l tnh. Do : Nu ta chn SIZE ln, nhng khi gp ng dng ch cn mt s t phn t cho ngn xp th rt tn b nh. Nu ta khai bo SIZE nh, th khi gp bi ton cn ngn xp c nhiu phn t, ta s khng thm c cc phn t mi vo, chng trnh s c li.
khc phc hn ch ny, ta c th s dng b nh ng (mng ng thng qua con tr) lu danh sch cc phn t ca ngn xp. Khi , nh ngha cu trc ngn xp s c dng nh sau:
typedef struct { int top; int *nodes; } Stack; // V tr ca nh // Danh sch cc phn t
Khi thm mt phn t mi vo ngn xp, ta lm cc bc nh sau: 1. S phn t trong ngn xp c l (top+1). Do , ta cp pht mt vng nh mi lu c (top+1+1) = (top+2) phn t. 2. Sao chp (top+1) phn t c sang vng mi. Nu danh sch ban u rng (top = -1) th khng cn thc hin bc ny. 3. Thm phn t mi vo cui vng nh mi 4. Gii phng vng nh ca danh sch c
45
5. Cho danh sch nodes tr vo vng nh mi. Chng trnh 3.4a ci t th tc thm mt phn t mi vo ngn xp. Chng trnh 3.4a
void push(Stack *stack, int node){ int *tmpNodes = new int[stack->top + 2];// Cp pht vng nh mi stack->top ++; for(int i=0; i<stack->top; i++) tmpNodes[stack->top] = node; delete [] stack->nodes; stack->nodes = tmpNodes; return; } // Tng ch s ca node nh // Sao chp sang vng nh mi // Thm node mi vo nh // Gii phng vng nh c // Tr vo vng nh mi
tmpNodes[i] = stack->nodes[i];
Khi ly ra mt phn t ca ngn xp, ta lm cc bc nh sau: Kim tra xem ngn xp c rng (top = -1) hay khng. Nu khng rng th thc hin cc bc tip theo. Ly phn t nh ngn xp ra Cp pht mt vng nh mi c (top+1) -1 = top phn t Sao chp top phn t t danh sch c sang vng nh mi (tr phn t nh). Gii phng vng nh c Cho con tr danh sch tr vo vng nh mi. Tr v gi tr phn t nh ly ra.
46
p dng
Ngn xp c s dng trong cc ng dng tho mn nguyn tc: ci no t vo trc s c ly ra sau. Chng trnh 3.4c minh ho vic dng ngn xp o ngc mt xu k t c nhp vo t bn phm. Chng trnh 3.4c
#include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct { int top; int *nodes; } Stack; /* Khai bo nguyn mu hm */ void init(Stack *stack); void push(Stack *stack, int node); int pop(Stack *stack); void release(Stack *stack); void init(Stack *stack){ stack = new Stack; stack->top = -1; } void push(Stack *stack, int node){ int *tmpNodes = new int[stack->top + 2];// Cp pht vng nh mi stack->top ++; for(int i=0; i<stack->top; i++) tmpNodes[stack->top] = node; delete [] stack->nodes; stack->nodes = tmpNodes; return; } int pop(Stack *stack){ if(stack->top < 0){ // Kim tra ngn xp rng // Tng ch s ca node nh // Sao chp sang vng nh mi // Thm node mi vo nh // Gii phng vng nh c // Tr vo vng nh mi // Cp pht vng nh cho con tr // Khi to ngn xp rng // V tr node nh // Danh sch phn t
tmpNodes[i] = stack->nodes[i];
47
3.4.2 Hng i
Hng i (queue) cng l mt cu trc tuyn tnh cc phn t. Trong , cc phn t lun c thm vo mt u, gi l u cui hng i, v vic ly ra cc phn t lun c thc hin u cn li, gi l u mt ca hng i. Hng i hot ng theo nguyn l: phn t no c a vo trc, s c ly ra trc.
48
Nu dng b nh ng lu gi hng i, th phn t front lun l phn t th 0 ca danh sch. V rear s bng di danh sch tr i 1. Cu trc ng ca hng i:
typedef struct { int front, rear; int *nodes; } Queue; // V tr ca nh u, nh cui // Danh sch cc phn t
Thao tc thm mt phn t vo cui hng i vi b nh ng c thc hin tng t vi ngn xp. Chng trnh 3.5a ci t th tc thm mt phn t vo cui hng i ng. Chng trnh 3.5a
void insert(Queue *queue, int node){ int *tmpNodes = new int[queue->rear + 2];// Cp pht vng nh mi queue->rear ++; if(queue->front == -1) queue->front = 0; for(int i=0; i<queue->rear; i++) tmpNodes[queue->rear] = node; delete [] queue->nodes; queue->nodes = tmpNodes; return; } // Tng ch s ca node ui // Nu hng i c rng // th cp nht front // Sao chp sang vng nh mi // Thm node mi vo ui // Gii phng vng nh c // Tr vo vng nh mi
tmpNodes[i] = queue->nodes[i];
Thao tc ly ra mt phn t u ca hng i thc hin theo cc bc: 1. Kim tra tnh rng (front = rear = -1) ca hng i. Nu khng rng mi thc hin tip
49
2. Ly phn t nodes[0] ra. 3. Sao chp danh sch cn li sang vng nh mi 4. Gii phng vng nh c 5. a danh sch tr vo vng nh mi 6. Tr v gi tr phn t ly ra Chng trnh 3.5b ci t th tc ly ra mt phn t ca hng i ng. Chng trnh 3.5b
int remove(Queue *queue){ if((queue-front < 0)||(queue-rear < 0)){// Kim tra hng i rng cout << Queue is empty! << endl; return 0; } // Lu gi gi tr phn t u int result = queue->nodes[queue->front]; int *tmpNodes; if(queue->rear > 0){ // Nu c hn 1 phn t tmpNodes = new int[queue->rear];// Cp pht vng nh mi for(int i=0; i<queue->rear; i++)// Sao chp sang vng nh mi tmpNodes[i] = queue->nodes[i]; }else queue->front --; queue->rear --; delete [] queue->nodes; queue->nodes = tmpNodes; return result; } // Nu ch c 1 phn t // Hng i thnh rng // Gim ch s ca node ui // Gii phng vng nh c // Tr vo vng nh mi // Tr v gi tr node u
p dng
Hng i c p dng trong cc bi ton cn c ch qun l ci no vo trc s c ly ra trc. Chng trnh 3.5c minh ho c ch qun l tin trnh n gin nht ca h iu hnh: cc tin trnh c qun l theo m tin trnh, khi xut hin, tin trnh c a vo cui ca mt hng i. Khi no CPU rnh th s ly tin trnh u hng i ra thc hin. Chng trnh 3.5c
#include<stdio.h> #include<conio.h> typedef struct { int front, rear; // V tr ca nh u, nh cui
50
tmpNodes[i] = queue->nodes[i];
51
52
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.
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
53
Vic chn thm mt node vo v tr th n trong danh sch c thc hin theo cc bc: 1. Nu n<=0, chn vo u. Nu n>s phn t ca danh sch, chn vo cui. Trng hp cn li, chn vo gia. 2. Tm node th n: gi vt ca hai node th n-1 v th n. 3. To mt node mi: cho node th n-1 tr tip vo node mi v node mi tr tip vo node th n. Chng trnh 3.6a ci t th tc chn mt node vo v tr th n ca danh sch. Chng trnh 3.6a
void insert(SimpleHeader *list, int position, int value){ SimpleNode *newNode = new SimpleNode; newNode->value = value; if(position <= 0){ newNode->next = list->front; list->front = newNode; if(list->nodeNumber == 0) list->rear = newNode; list->rear->next = newNode; list->rear = newNode; if(list->nodeNumber == 0) list->front = newNode; }else{ int index = 0; while(index < position){ prev = curr; curr = curr->next; index++; } newNode->next = curr; prev->next = newNode; } // chn vo trc node n // v chn vo sau node n-1 // tm node n-1 v n // Chn vo u ds // Chn vo trc node u // Cp nht li node u ds // Nu ds ban u rng th // node ui trng vi node u // Chn vo sau node cui // Cp nht li node cui ds // Nu ds ban u rng th // node u trng node ui // Chn vo gia ds
54
Vic xo mt node v tr th n trong danh sch c thc hin theo cc bc: 1. Nu n<0 hoc n>s phn t ca danh sch, khng xo node no. 2. Tm node th n: gi vt ca ba node th n-1, th n v th n+1. 3. Cho node th n-1 tr tip vo node th n+1, xo con tr ca node th n. 4. Tr v node th n. Chng trnh 3.6b ci t th tc xo mt node v tr th n ca danh sch. Chng trnh 3.6b
SimpleNode* remove(SimpleHeader *list, int position){ if((position < 0)||(position >= list->nodeNumber)) return NULL; SimpleNode* result; if(position == 0){ result = list->front; if(list->nodeNumber == 1) // Xo node u // Gi node cn xo // Nu ds ch c 1 node th // Khng xo node no c
list->front = list->front->next;// Cp nht node u list->rear = list->front;// Cp nht node cui ds }else if(position == list->nodeNumber 1){ result = list->rear; // Gi node cn xo SimpleNode *curr = list->front; while(curr->next != list->rear) curr = curr->next; curr->next = NULL; list->rear = curr; }else{ SimpleNode *prev = list->front, *curr = list->front; int index = 0; while(index < position){ prev = curr; curr = curr->next; index++; } result = curr; prev->next = curr->next; } list->nodeNumber --; return result; // Cp nht s lng node // Tr v node cn xo // Gi node cn xo // Cho node n-1 tr n node n+1 // Tm node n-1 v n // Tm node trc ca node cui // Xo node rear hin ti // Cp nht node cui ds
55
p dng
Chng trnh 3.6c minh ho vic dng danh sch lin kt n qun l nhn vin vn phng vi cc thng tin rt n gin: tn, tui v tin lng ca mi nhn vin. Chng trnh 3.6c
#include<stdio.h> #include<conio.h> #include<string.h> typedef struct{ char name[25]; int age; float salary; } Employee; struct simple{ Employee employee; struct simple *next; }; typedef struct simple SimpleNode; typedef struct{ int nodeNumber; SimpleNode *front, *rear; } SimpleHeader; // S lng cc node // Tr n node u v cui ds // D liu ca node // Tr n node k tip // Tn nhn vin // Tui nhn vin // Lng nhn vin
/* Khai bo cc nguyn mu hm */ void init(SimpleHeader *list); void insert(SimpleHeader *list, int position, Employee employee); SimpleNode* remove(SimpleHeader *list); void travese(SimpleHeader *list); void release(SimpleHeader *list); void init(SimpleHeader *list){ list = new list; list->front = NULL; list->rear = NULL; // Cp pht b nh cho con tr // Khi to danh sch rng
56
list->front = list->front->next;// Cp nht node u if(list->nodeNumber == 1) list->rear = list->front;// Cp nht node cui ds }else if(position == list->nodeNumber 1){ result = list->rear; // Gi node cn xo
57
58
void main(){ clrscr(); SimpleHeader *list; init(list); int function; do{ clrscr(); cout << CAC CHUC NANG: << endl; cout << 1: Them mot nhan vien << endl; cout << 2: Xoa mot nhan vien << endl; cout << 3: Xem tat ca cac nhan vien trong phong << endl; cout << 5: Thoat! << endl; cout << ======================================= << endl; cout << Chon chuc nang: << endl; cin >> function; switch(function){ case 1: // Thm vo ds int position; Employee employee; cout << Vi tri can chen: ; cin >> position; cout << Ten nhan vien: ; cin >> employee.name; cout << Tuoi nhan vien: ; cin >> employee.age; cout << Luong nhan vien: ; cin >> employee.salary; insert(list, position, employee); break; case 2: // Ly ra khi ds int position; cout << Vi tri can xoa: ; cin >> position; SimpleNode* result = remove(list, position); if(result != NULL){ cout << Nhan vien bi loai: << endl; cout << Ten: << result->employee.name << endl; cout << Tuoi: << result->employee.age << endl; cout << Luong: << result->employee.salary << endl; // Khi to ds
59
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.
60
c.
Khi , cch khai bo bin no sau y l ng: a. struct Employee myEmployee; b. struct employee myEmployee; c. Employee myEmployee; d. employee myEmployee; 3. Mt cu trc c nh ngha nh sau:
typedef struct employee{ char name[20]; int age; } Employee;
Khi , cch khai bo bin no sau y l ng: a. Employee myEmployee; b. employee myEmployee; c. struct Employee myEmployee; d. struct employee myEmployee; 4. Vi cu trc c nh ngha nh trong bi 3. Khi , cch khi to bin no sau y l ng: a. Employee myEmployee = {A, 27}; b. Employee myEmployee = {A, 27}; c. Employee myEmployee = (A, 27); d. Employee myEmployee = (A, 27); 5. Vi cu trc c nh ngha nh trong bi 3. Khi , cc cch cp pht b nh cho bin con tr no sau y l ng: a. Employee *myEmployee = new Employee; b. Employee *myEmployee = new Employee(); c. Employee *myEmployee = new Employee(10); d. Employee *myEmployee = new Employee[10]; 6. nh ngha mt cu trc v mn hc ca mt hc sinh c tn Subject, bao gm cc thng tin:
61
Tn mn hc, kiu char[]; im tng kt mn hc, kiu float; Tn hc sinh, kiu char[]; Tui hc sinh, kiu int; Lp hc sinh, kiu char[]; Danh sch im cc mn hc ca hc sinh, kiu l mt mng cc cu trc Subject c nh ngha trong bi tp 6. Xp loi hc lc, kiu char[];
8. Khai bo mt bin c cu trc l Student nh ngha trong bi 7. Sau , thc hin tnh im trung bnh ca tt c cc mn hc ca hc sinh , v vit mt th tc xp loi hc sinh da vo im trung bnh cc mn hc: Nu im tb nh hn 5.0, xp loi km Nu im tb t 5.0 n di 6.5, xp loi trung bnh. Nu im tb t 6.5 n di 8.0, xp loi kh Nu im tb t 8.0 tr ln, xp loi gii.
9. Vit mt chng trnh qun l cc hc sinh ca mt lp, l mt dy cc cu trc c kiu Stupid nh ngha trong bi 7. S dng th tc ci t trong bi 8 thc hin cc thao tc sau: Khi to danh sch v im ca cc hc sinh trong lp. Tnh im trung bnh v xp loi cho tt c cc hc sinh. Tm tt c cc hc sinh theo mt loi nht nh
10. S dng cu trc ngn xp nh ngha trong bi i mt s t kiu thp phn sang kiu nh phn: Chi s nguyn cho 2, mi cho n khi thng <2, lu cc s d vo ngn xp. Sau , c cc gi tr d t ngn xp ra, ta s thu c chui nh phn tng ng. 11. M rng cu trc hng i nh ngha trong bi tr thnh hng i c u tin: Cho mi node thm mt thuc tnh l u tin ca node Khi thm mt node vo hng i, thay v thm vo cui hng i nh thng thng, ta tm v tr c u tin ph hp chn node vo, sao cho dy cc node trong hng i l mt danh sch c u tin ca cc node l gim dn. Vic ly ra l khng thay i: ly ra phn t u hng i, chnh l phn t c u tin cao nht.
12. p dng hng i c u tin trong bi 11 xy dng chng trnh qun l tin trnh c u tin ca h iu hnh, m rng ng dng trong bi ngn xp. 13. M rng cu trc danh sch lin kt n trong bi thnh danh sch lin kt kp: Mi node c thm mt con tr prev tr n node trc n i vi node header, cng cn 2 con tr: tr n node u tin v node cui cng ca danh sch
62
Ring vi node u tin (front) ca danh sch, con tr prev ca n s tr n NULL. Ging nh con tr next ca node rear.
14. Ci t li hai tho tc thm vo mt node v xo mt node mt v tr xc nh trong mt cu trc danh sch lin kt kp nh ngha trong bi 13. 15. p dng cc nh ngha v thao tc trong cc bi 13 v 14. Ci t li chng trnh qun l nhn vin chng trnh 3.6c bng danh sch lin kt kp.
63
Chng 4: Vo ra trn tp
CHNG 4 VO RA TRN TP
Ni dung chng ny tp trung trnh by cc vn lin quan n cc thao tc trn tp d liu trong ngn ng C++: Khi nim tp, tp vn bn v tp nh phn Cc thao tc vo ra trn tp Phng thc truy nhp tp trc tip
Khai bo bin tp
Trong C++, khi khai bo mt bin tp, ng thi ta s m tp tng ng theo c php tng qut bng cch dng kiu fstream nh sau:
fstream <Tn bin tp>(<Tn tp>, <Ch m tp>);
Trong : Tn bin tp: c tnh cht nh mt tn bin thng thng, n s c dng thc hin cc thao tc vi tp gn vi n. Tn bin tp cng phi tun th theo quy tc t tn bin trong C++. Tn tp: l tn tp d liu m ta cn thao tc trn n. Ch m tp: l cc hng kiu bt c nh ngha sn bi C++. N ch ra rng ta ang m tp tin ch no: c hoc ghi, hoc c c ln ghi.
fstream myFile(abc.txt, ios::in);
V d, khai bo: l khai bo mt bin tp, c tn l myFile, dng m tp tin c tn l abc.txt v tp tin ny c m ch c d liu (bt ch th ios::in). Lu :
64
Chng 4: Vo ra trn tp
Tn tp tin c dng mt chui k t, nu khai bo tn tp c ng dn th mc \ th mi du \ phi c vit thnh \\ trnh b nhm ln vi cc k t c bit trong C nh \n, \d
fstream myFile(myDir\\abc.txt, ios::in);
Cc ch m tp tin
Cc ch m tp tin c nh ngha bi cc bt ch th: Lu : Khi mun m mt tp tin ng thi nhiu ch khc nhau, ta kt hp cc bt ch th tng ng bng php ton hp bt |.
M mt tp tin c. M mt tp tin c sn ghi. M mt tp tin c sn thm d liu vo cui tp. M tp tin v t con tr tp tin vo cui tp. Nu tp tin c sn th d liu ca n s b mt.
ios::nocreate: M mt tp tin, tp tin ny bt buc phi tn ti. ios::noreplace: Ch m tp tin khi tp tin cha tn ti. ios::binary: ios::text:
M mt tp tin ch nh phn. M mt tp tin ch vn bn.
V d, mun m mt tp tin abc.txt c (ios::in) ng thi vi ghi (ios::out) di ch vn bn (ios::text), ta khai bo nh sau:
fstream myFile(abc.txt, ios::in|ios::out|ios::text);
4.1.2 Tp vn bn
m mt tp tin di ch vn bn, ta dng c php sau:
fstream <Tn bin tp>(<Tn tp>, ios::text);
Khi , cc thao tc c, ghi trn bin tp c thc hin theo n v l cc t, c phn cch bi du trng (space bar) hoc du xung dng (enter). V d, mun m tp tin baitho.txt di ch vn bn, ta khai bo nh sau:
fstream myBaiTho(baitho.txt, ios::text);
4.1.3 Tp nh phn
m mt tp tin di ch nh phn, ta dng c php sau:
fstream <Tn bin tp>(<Tn tp>, ios::binary);
Khi , cc thao tc c, ghi trn bin tp c thc hin theo n v byte theo kch thc cc bn ghi (cu trc) c ghi trong tp. V d, mun m tp tin baitho.txt di ch nh phn, ta khai bo nh sau:
fstream myBaiTho(baitho.txt, ios::binary);
65
Chng 4: Vo ra trn tp
4.2 VO RA TRN TP
4.2.1 Vo ra tp vn bn bng >> v << Ghi tp vn bn bng <<
Cc bc thc hin ghi d liu vo mt tp tin nh sau: 1. M tp tin theo ch ghi bng i tng ofstream (m tp tin ch ghi):
ofstream <Tn bin tp>(<Tn tp tin>, ios::out);
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.
66
Chng 4: Vo ra trn tp
do{ cin >> input; fileOut << input << ; }while((input != e)&&(fileOut)); fileOut << endl; /* ng tp tin */ fileOut.close(); return; } // ng tp tin // Xung dng cui tp tin // c k t t bn phm // Ghi k t vo tp tin
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.
67
Chng 4: Vo ra trn tp
ifstream fileIn(fileName, ios::in); // Khai bo v m tp tin if(!fileIn){ exit(1); } /* c d liu t tp tin ra mn hnh */ while(fileIn){ fileIn >> output; cout << output; } cout << endl; /* ng tp tin */ fileIn.close(); return; } // ng tp tin // Xung dng trn mn hnh // c k t t tp tin // Ghi k t ra mn hnh // Khng m c tp cout << Khong the mo duoc tep tin << fileName << endl;
Chng trnh 4.3 minh ho vic copy ton b ni dung ca mt tp tin sang mt tp tin mi: Tn tp tin ngun v tp tin ch c nhp t bn phm bi ngi dng. Tp tin ngun c m ch c. Tp tin ch c m ch ghi. c tng k t t tp tin ngun v ghi ngay vo tp tin ch. ng cc tp tin khi kt thc.
68
Chng 4: Vo ra trn tp
/* M tp tin ngun */ ifstream fileIn(sourceFile, ios::in);// Khai bo v m tp ngun if(!fileIn){ << sourceFile << endl; exit(1); } /* M tp tin ch */ ofstream fileOut(targetFile, ios::out);// Khai bo v m tp ch if(!fileOut){ << targetFile << endl; exit(1); } /* c d liu t tp tin ra tp ch */ while(fileIn){ fileIn >> data; fileOut << data; } /* ng cc tp tin */ fileIn.close(); fileOut.close(); return; } // ng tp tin ngun // ng tp tin ch // c k t t tp ngun // Ghi k t ra tp ch // Khng m c tp ch cout << Khong the tao duoc tep tin dich // Khng m c tp ngun cout << Khong the mo duoc tep tin nguon
Lu : Tn bin tp, sau khi dng xong vi mt tp xc nh, c th s dng m mt tp khc, vi mt ch m tp khc bng php ton open() ca bin tp.
<Tn bin tp>.open(<Tn tp mi>, <ch m mi>);
V d, on chng trnh:
ofstream myFile(abc.txt, ios::out); // ghi vao file abc.txt myFile.close(); myFile.open(xyz.txt, ios::out|ios::app); // Them vao cuoi file xyz.txt myFile.close();
s dng bin tp myFile (c kiu ofstream) hai ln: mt ln l dng vi tp tin abc.txt ch m ghi t u. Mt ln khc l vi tp tin xyz.txt ch m ghi thm vo cui.
69
Chng 4: Vo ra trn tp
Trong , thao tc write nhn hai tham s u vo nh sau: Tham s th nht l con tr kiu char tr n vng d liu cn ghi vo tp. V con tr bt buc c kiu char nn khi mun ghi d liu c kiu khc vo tp, ta dng hm chuyn kiu:
reinterpret_cast<char *>(<D liu>);
Tham s th hai l kch c d liu c ghi vo tp. Kch c ny c tnh theo byte, nn thng thng ta dng ton t:
sizeof(<Kiu d liu>);
Lu : Khi mun c, ghi cc d liu c cu trc (struct) vo tp th ta phi dng ch c/ghi tp nh phn m khng th dng ch c/ghi ch vn bn. Khi c/ghi d liu c kiu cu trc, ton t sizeof() thc hin chnh xc th cc thnh vin ca cu trc khng c l kiu con tr. V ton t sizeof() i vi con tr ch cho kch c ca con tr m khng cho kch c tht ca vng d liu m con tr tr ti. Tn tp tin v s lng bn ghi c ngi dng t nhp vo t bn phm. Chng trnh s ghi vo tp cc bn ghi c cu trc do ngi dng g vo t bn phm.
Chng trnh 4.4 minh ho vic ghi d liu vo tp tin nh phn, d liu l kiu cu trc:
70
Chng 4: Vo ra trn tp
int year; } Date; typedef struct { char name[20]; Date birthDay; char role[20]; float salary; } Employee; void main(){ clrscr(); char fileName[length]; cout << Ten tep tin: ; cin >> setw(length) >> fileName; int recordNumber; cout << So luong ban ghi: ; cin >> recordNumber; /* M tp tin */ // Khai bo v m tp tin fstream fileOut(fileName, ios::out|ios::binary); if(!fileOut){ exit(1); } /* Ghi d liu vo tp tin */ Employee myEmployee; for(int i=0; i<recordNumber; i++){ cout << Ban ghi thu << i+1 << endl; cout << Name: ; cin >> myEmployee.name; cout << Day of birth: ; cin >> myEmployee.birthDay.day;// Nhp ngy sinh cout << Month of birth: ; cin >> myEmployee.birthDay.month;// Nhp thng sinh cout << Year of birth: ; cin >> myEmployee.birthDay.year;// Nhp nm sinh cout << Role: ; cin >> myEmployee.role; cout << Salary: ; // Nhp chc v // Nhp tn nhn vin // Khng m c tp cout << Khong the tao duoc tep tin << fileName << endl; // Nhp s lng bn ghi // Nhp tn tp tin // S lng bn ghi // Tn tp tin // Tn nhn vin // Ngy sinh ca nhn vin // Chc v ca nhn vin // Lng ca nhn vin // Nm
71
Chng 4: Vo ra trn tp
cin >> myEmployee.salary; // Ghi d liu vo tp fileOut.write(reinterpret_cast<char *>(&myEmployee), sizeof(Employee)); } /* ng tp tin */ fileOut.close(); return; } // ng tp tin // Nhp tin lng
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.
72
Chng 4: Vo ra trn tp
typedef struct { char name[20]; Date birthDay; char role[20]; float salary; } Employee; void main(){ clrscr(); char fileName[length]; cout << Ten tep tin: ; cin >> setw(length) >> fileName; /* M tp tin */ // Khai bo v m tp tin fstream fileIn(fileName, ios::in|ios::binary); if(!fileIn){ exit(1); } /* c d liu t tp tin ra mn hnh */ Employee myEmployee; while(fileIn){ fileIn.read(reinterpret_cast<char *>(&myEmployee), sizeof(Employee)); cout << myEmployee.name << << myEmployee.birthDay.day << / << myEmployee.birthDay.month << / << myEmployee.birthDay.year << << myEmployee.role << << myEmployee.salary << endl; // Ghi k t ra mn hnh } /* ng tp tin */ fileIn.close(); return; } // ng tp tin // c k t t tp tin // Khng m c tp cout << Khong the mo duoc tep tin << fileName << endl; // Nhp tn tp tin // Tn tp tin // Tn nhn vin // Ngy sinh ca nhn vin // Chc v ca nhn vin // Lng ca nhn vin
73
Chng 4: Vo ra trn tp
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
Chng trnh 4.6a minh ho vic xc nh v tr hin thi ca con tr tp sau mt s thao tc c tp trc . Chng trnh 4.6a
#include<stdlib.h> #include<iostream.h> #include<fstream.h> #include<conio.h> const int length = 25; void main(){ clrscr(); char fileName[length], output; cout << Ten tep tin: ; cin >> setw(length) >> fileName; // Nhp tn tp tin // di ti a tn tp tin
74
Chng 4: Vo ra trn tp
/* M tp tin */ ifstream fileIn(fileName, ios::in); // Khai bo v m tp tin if(!fileIn){ exit(1); } /* c d liu t tp tin ra mn hnh * Ghi vi tr con tr tp ra mn hnh c sau 5 ln c k t */ int index = 0; while(fileIn){ fileIn >> output; cout << output; if(index % 5 == 0) // c k t t tp tin // Ghi k t ra mn hnh // Ghi ra v tr con tr tp // Khng m c tp cout << Khong the mo duoc tep tin << fileName << endl;
cout<< endl << Vi tri con tro tep: << fileIn.tellg() << endl; index ++; } cout << endl; /* ng tp tin */ fileIn.close(); return; } // ng tp tin // Xung dng trn mn hnh
Chng trnh 4.6b minh ho vic xc nh v tr hin thi ca con tr tp sau mt s thao tc ghi vo tp trc . Chng trnh 4.6b
#include<stdlib.h> #include<iostream.h> #include<fstream.h> #include<conio.h> const int length = 25; void main(){ clrscr(); char fileName[length], input; cout << Ten tep tin: ; cin >> setw(length) >> fileName; // Nhp tn tp tin // di ti a tn tp tin
75
Chng 4: Vo ra trn tp
/* M tp tin */ ofstream fileOut(fileName, ios::out);// Khai bo v m tp tin if(!fileOut){ exit(1); } /* Ghi d liu vo tp tin * Hin ra mn hnh v tr con tr tp sau khi ghi uc 5 k t*/ int index = 0; do{ cin >> input; fileOut << input << ; if(index%5 == 0) // c k t t bn phm // Ghi k t vo tp tin // Hin th v tr con tr tp // Khng m c tp cout << Khong the tao duoc tep tin << fileName << endl;
cout << Vi tri con tro tep: << fileOut.tellp() << endl; index++; }while((input != e)&&(fileOut)); fileOut << endl; /* ng tp tin */ fileOut.close(); return; } // ng tp tin // Xung dng cui tp tin
Trong : Kch thc: l tham s m t khong cch dch chuyn so vi v tr mc dch chuyn. n v tnh ca kch thc l byte, c kiu l s nguyn. Mc dch chuyn: l v tr gc xc nh khong cch dch chuyn ca con tr tp. C ba tham s hng v kiu mc dch chuyn: -
ios::beg: Mc dch chuyn l u tp tin. ios::cur: Mc dch chuyn l v tr hin thi ca con tr tp. ios::end: Mc dch chuyn l v tr cui cng ca tp tin.
76
Chng 4: Vo ra trn tp
V d:
ifstream fileIn(abc.txt, ios::in); fileIn.seekg(sizeof(char)*7, ios::beg);
s dch chuyn con tr tp tin n k t (kiu char) th 7+1 = 8 trong tp tin abc.txt c (gi s tp tin abc.txt lu cc k t kiu char). Lu : V khong cch cch dch chuyn c kiu s nguyn (int) cho nn c th nhn gi tr m hoc dng. Nu gi tr dng, dch chuyn v pha sau v tr lm mc, nu gi tr m, dch chuyn v pha trc v tr lm mc. Nu v tr dch chuyn n nm ngoi phm vi tp tin (pha sau v tr cui cng ca tp hoc pha trc v tr u tin ca tp) s ny sinh li, khi <Tn bin tp> = false.
Chng trnh 4.7 ci t chng trnh truy nhp tp tin trc tip c gi tr k t (kiu char) trong tp: Tn tp tin (cha d liu kiu char) do ngi dng nhp vo t bn phm. Sau , mi khi ngi dng nhp vo mt s nguyn, chng trnh s dch chuyn n v tr mi, cch v tr c ng bng tng y k t, tnh t v tr hin thi ca con tr tp. Chng trnh s kt thc khi ngi dng nhp vo s 0.
77
Chng 4: Vo ra trn tp
int index = 1; do{ cout << So ki tu dich chuyen: ; cin >> index; // Dch chuyn con tr tp t v tr hin thi fileIn.seekg(sizeof(char)*index, ios::cur); if(fileIn){ fileIn >> output; // ng // c k t t tp tin
// Ghi k t ra mn hnh cout << Vi tri: << fileIn.tellg() << output; }else{ fileIn.clear(); } }while(index); /* ng tp tin */ fileIn.close(); return; } // ng tp tin // Ra khi phm vi tp // V v tr u tp
TNG KT CHNG 4
Ni dung chng 4 tp trung trnh by cc vn lin quan n cc thao tc trn tp tin trong ngn ng C++. Bao gm: Cc bc tun t khi thao tc vi mt tp tin: M tp tin c/ghi d liu trn tp tin ng tp tin
Thao tc m tp tin vi nhiu ch bng kiu fstream. Thao tc m tp tin ch c vi kiu ifstream Thao tc m tp tin ch ghi vi thao tc ofstream. c d liu t tp tin vn bn vi thao tc >>. Ghi d liu vo tp tin vn bn bng thao tc <<. c tp tin nh phn bng thao tc read(). Ghi vo tp tin nh phn bng thao tc write(). Xc nh v tr hin thi ca con tr tp tin vi cc thao tc tellg() v tellp(). Dch chuyn v tr ca con tr tp vi cc thao tc seekg() v seekp(). Thit lp li trng thi cho con tr tp tin bng thao tc clear().
78
Chng 4: Vo ra trn tp
CU HI V BI TP CHNG 4
1. Mun m mt tp tin tn l abc.txt c d liu, lnh m tp no sau y l ng: a. fstream b. fstream c. d.
myFile(abc.txt, ios::in); myFile(abc.txt, ios::out);
2. Mun m mt tp tin abc.txt nm trong th mc xyz ghi d liu vo. Lnh m no sau y l ng: a. fstream b. fstream c. d.
myFile(xyz\abc.txt, ios::out); myFile(xyz\\abc.txt, ios::out);
3. Mun m mt tp tin abc.txt ghi thm d liu vo cui tp, lnh no sau y l ng: a. fstream b. fstream c. d.
myFile(abc.txt, ios::out); myFile(abc.txt, ios::app);
Nhn nh no sau y l ng: a. myFile1 v myFile2 c chc nng ging nhau. b. myFile1 v myFile2 c chc nng khc nhau 5. Xt hai lnh khai bo sau:
fstream myFile1(abc.txt, ios::in); ifstream myFile2(abc.txt, ios::in);
Nhn nh no sau y l ng: a. myFile1 v myFile2 c chc nng ging nhau. b. myFile1 v myFile2 c chc nng khc nhau 6. Xt on chng trnh sau:
ofstream myFile(abc.txt, ios::out); if(myFile) myFile << abc.txt;
Chng trnh s lm g? a. Ghi ra mn hnh dng ch abc.txt b. Ghi vo tp tin abc.txt dng ch abc.txt c. c t tp tin abc.txt dng ch abc.txt
79
Chng 4: Vo ra trn tp
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(); }
80
Chng 4: Vo ra trn tp
Chng trnh s in ra mn hnh kt qu g? a. 0 b. 5 c. 10 d. 80 12. Vit mt chng trnh gp ni dung ca hai tp tin c sn vo mt tp tin th ba. Tn cc tp tin c nhp vo t bn phm. 13. Vit mt chng trnh tm kim trn tp nh phn c cu trc c to bi chng trnh 4.4: Tm tt c cc nhn vin c tn l X, X c nhp t bn phm. Hin th kt qu l tt c cc thng tin v cc nhn vin c tm thy. 14. Vit mt chng trnh tm kim trn tp nh phn c cu trc c to bi chng trnh 4.4: Tm tt c cc nhn vin c nm sinh l X, X c nhp t bn phm. Hin th kt qu l tt c cc thng tin v cc nhn vin c tm thy. 15. Vit mt chng trnh tm kim trn tp nh phn c cu trc c to bi chng trnh 4.4: Tm tt c cc nhn vin c lng cao hn hoc bng mt gi tr X, X c nhp t bn phm. Hin th kt qu l tt c cc thng tin v cc nhn vin c tm thy. 16. Vit mt chng trnh sao chp mt on u ni dung ca mt tp tin vo mt tp tin th hai. Tn cc tp tin v di on ni dung cn sao chp c nhp t bn phm. 17. Vit mt chng trnh sao chp mt on cui ni dung ca mt tp tin vo mt tp tin th hai. Tn cc tp tin v di on ni dung cn sao chp c nhp t bn phm.
81
Chng 5: Lp
CHNG 5 LP
Ni dung chng ny tp trung trnh by cc vn lin quan n lp i tng trong C++: Khi nim, khai bo v s dng lp Khai bo v s dng cc thnh phn ca lp: cc thuc tnh v cc phng thc ca lp Phm vi truy nhp lp Khai bo v s dng cc phng thc khi to v hu b ca lp S dng lp thng qua con tr i tng, mng cc i tng.
Trong : V d:
class Car{ };
class: l tn t kha bt buc nh ngha mt lp i tng trong C++. Tn lp: do ngi dng t nh ngha. Tn lp c tnh cht nh tn kiu d liu s dng sau ny. Cch t tn lp phi tun th theo quy tc t tn bin trong C++.
l nh ngha mt lp xe t (Car). Lp ny cha c bt k mt thnh phn no, vic nh ngha cc thnh phn cho lp s c trnh by trong mc 5.2. Lu : T kha class l bt buc nh ngha mt lp i tng trong C++. Hn na, C++ c phn bit ch hoa ch thng trong khai bo cho nn ch class phi c vit bng ch thng. V d:
class Car{ }; // nh ngha ng
nhng:
Class Car{ }; // Li t kha
82
Chng 5: Lp
Bt buc phi c du chm phy ; cui nh ngha lp v C++ coi nh ngha mt lp nh nh ngha mt kiu d liu, cho nn phi c du chm phy cui nh ngha (tng t nh ngha kiu d liu kiu cu trc). phn bit vi tn bin thng thng, ta nn (nhng khng bt buc) t tn lp bt u bng mt ch in hoa v cc tn bin bt u bng mt ch in thng.
Trong : Tn lp: l tn lp i tng c nh ngha trc khi khai bo bin. Tn bin lp: l tn i tng c th. Tn bin lp s c s dng nh cc bin thng thng trong C++, ngoi tr vic n c kiu lp i tng.
V d, mun khai bo mt th hin (bin) ca lp Car c nh ngha trong mc 5.1.1, ta khai bo nh sau:
Car myCar;
Sau , ta c th s dng bin myCar trong chng trnh nh cc bin thng thng: truyn tham s cho hm, gn cho bin khc Lu : Khi khai bo bin lp, ta khng dng li t kha class na. T kha class ch c s dng khi nh ngha lp m khng dng khi khai bo bin lp.
Car myCar; // ng // Li c php
l sai c php.
Trong :
83
Chng 5: Lp
private: l t kha ch tnh cht ca C++ ch ra rng cc thnh phn c khai bo trong phm vi t kha ny l ring t i vi lp i tng. Cc i tng ca cc lp khc khng truy nhp c cc thnh phn ny. protected: cc thnh phn c khai bo trong phm vi t kha ny u c bo v. Qui nh loi i tng no c truy nhp n cc thnh phn c bo v s c m t chi tit trong mc 5.3. public: cc thnh phn cng cng. Cc i tng ca cc lp khc u c th truy nhp n cc thnh phn cng cng ca mt i tng bt k. Cc thnh phn ch d liu ca lp, c gi l thuc tnh ca lp Cc thnh phn ch hnh ng ca lp, c gi l phng thc ca lp.
Trong : Kiu d liu: c th l cc kiu d liu c bn ca C++, cng c th l cc kiu d liu phc tp do ngi dng t nh ngha nh struct, hoc kiu l mt lp c nh ngha trc . Tn thuc tnh: l tn thuc tnh ca lp, c tnh cht nh mt bin thng thng. Tn thuc tnh phi tun theo quy tc t tn bin ca C++.
class Car{ private: int speed; public: char mark[20]; };
V d, khai bo:
l khai bo mt lp xe t (Car), c hai thuc tnh: thuc tnh tc (speed) c tnh cht private, thuc tnh nhn hiu xe (mark) c tnh cht public. Lu : Khng c khi to gi tr ban u cho cc thuc tnh ngay trong lp. V cc thuc tnh ch c gi tr khi n gn vi mt i tng c th, l mt th hin (bin) ca lp. V d:
class Car{ private: int speed; // ng int weight = 500; // li
84
Chng 5: Lp
};
Kh nng truy nhp thuc tnh ca lp l ph thuc vo thuc tnh y c khai bo trong phm vi ca t kha no: private, protected hay public. Thng thng, do yu cu ng gi d liu ca hng i tng, ta nn khai bo cc thuc tnh c tnh cht ring t (ptivate). Nu mun cc i tng khc truy nhp c vo cc thuc tnh ny, ta xy dng cc hm public truy nhp (get / set) n thuc tnh .
V d, vi nh ngha lp:
class Car{ private: int speed; public: char mark[20]; };
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>;
Trong : Kiu tr v: l kiu d liu tr v ca phng thc. Kiu c th l cc kiu d liu c bn ca C++, cng c th l kiu do ngi dng nh ngha, hoc kiu lp c nh ngha.
85
Chng 5: Lp
Tn phng thc: do ngi dng t t tn, tun theo quy tc t tn bin ca C++. Cc tham s: Cc tham s u vo ca phng thc, c biu din bng kiu d liu tng ng. Cc tham s c phn cch bi du phy ,. Cc tham s l ty chn (Phn trong du ngoc vung [] l ty chn).
class Car{ private: int speed; char mark[20]; public: void show(); };
V d, khai bo:
l nh ngha mt lp Car c hai thuc tnh cc b l speed v mark, v khai bo mt phng thc show() m t i tng xe tng ng. Show() l mt phng thc khng cn tham s v kiu tr v l void. Lu : Kh nng truy nhp phng thc t bn ngoi l ph thuc vo phng thc c khai bo trong phm vi ca t kha no: private, protected hay public.
Nu ci t phng thc bn ngoi phm vi nh ngha lp, ta phi dng ch th phm vi :: ch ra rng y l mt phng thc ca lp m khng phi l mt hm t do trong chng trnh:
<Kiu tr v> <Tn lp>::<Tn phng thc>([<Cc tham s>]){ // Ci t chi tit }
V d, nu ci t phng thc show() ca lp Car ngay trong phm vi nh ngha lp, ta ci t nh sau:
class Car{ private: int char public: void show(){ // Khai bo phng thc ngay trong lp cout << This is a << mark << having a speed of speed; mark[20]; // Tc // Nhn hiu
86
Chng 5: Lp
<< speed << km/h! << endl; return; } };
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.
V d, vi nh ngha lp:
class Car{ private: int char public: void show(); // Gii thiu xe speed; mark[20]; // Tc // Nhn hiu
87
Chng 5: Lp
}; /* Khai bo phng thc bn ngoi lp */ void Car::show(){ cout << This is a << mark << having a speed of << speed << km/h! << endl; return; }
Lu : Khi dng phng thc bn trong cc phng thc khc ca lp, m phng thc li b trng vi cc phng thc t do ca chng trnh, ta phi ch r vic dng phng thc ca lp (m khng phi dng phng thc t do) bng cch dng ch th phm vi lp :: vi c php:
<Tn lp>::<Tn phng thc>([<Cc i s>]);
Chng trnh 5.1 ci t y mt lp xe t (Car) vi cc thuc tnh c tnh cht cc b: Tc xe (speed) Nhn hiu xe (mark) Gi xe (price) Khi to cc tham s (init) Gii thiu xe (show) Cc phng thc truy nhp (get/set) cc thuc tnh
Sau , chng trnh main s s dng lp Car ny nh ngha cc i tng c th v s dng cc phng thc ca lp ny. Chng trnh 5.1
#include<stdio.h> #include<conio.h> #include<string.h> /* nh ngha lp */ class Car{ private: int char public: void setSpeed(int); // Gn tc cho xe speed; mark[20]; // Tc // Nhn hiu // Gi xe
float price;
88
Chng 5: Lp
int void void void void }; /* Khai bo phng thc bn ngoi lp */ void Car::setSpeed(int speedIn){ speed = speedIn; } int Car::getSpeed(){ return speed; } void Car::setMark(char markIn){ strcpy(mark, markIn); } char[] Car::getMark(){ return mark; } void Car::setPrice(float priceIn){ price = priceIn; } float Car::getPrice(){ return price; } void Car::init(int speedIn, char markIn[], float priceIn){ speed = speedIn; strcpy(mark, markIn); price = priceIn; return; } void Car::show(){ // Phng thc gii thiu xe // c gi xe // Gn gi cho xe // c nhn xe // Gn nhn cho xe // c tc xe // Gn tc cho xe getSpeed(); setMark(char); setPrice(float); // c tc xe // Gn nhn cho xe // c nhn xe // Gn gi cho xe // c gi xe // Gii thiu xe
cout << This is a << mark << having a speed of << speed << km/h and its price is $ << price << endl; return; } // Hm main, chng trnh chnh
89
Chng 5: Lp
void main(){ clrscr(); Car myCar; // Khi to ln th nht cout << Xe thu nhat: << endl; myCar.init(100, Ford, 3000); cout << Toc do (km/h): << myCar.getSpeed() << endl; cout << Nhan hieu : << myCar.getMark() << endl; cout << Gia ($): << myCar.getPrice() << endl; // Thay i thuc tnh xe cout << Xe thu hai: << endl; myCar.setSpeed(150); myCar.setMark(Mercedes); myCar.setPrice(5000); myCar.show(); return; } // Khai bo bin lp
90
Chng 5: Lp
Trong phm vi truy nhp lp, ta ch quan tm n hai phm vi ln nht, l phm vi lp v phm vi chng trnh. Trong C++, phm vi truy nhp lp c quy nh bi cc t kha v thuc tnh truy nhp: private: Cc thnh phn ca lp c thuc tnh private th ch c th c truy nhp trong phm vi lp. protected: Trong cng mt lp, thuc tnh protected cng c nh hng tng t nh thuc tnh private: cc thnh phn lp c thuc tnh protected ch c th c truy nhp trong phm vi lp. Ngoi ra n cn c th c truy nhp trong cc lp con khi c k tha (s c trnh by trong chng 6). public: cc thnh phn lp c thuc tnh public th c th c truy nhp trong phm vi chng trnh, c ngha l n c th c truy nhp trong cc hm t do, cc phng thc bn trong cc lp khc
V d, thuc tnh price ca lp Car c tnh cht private nn ch c th truy nhp bi cc phng thc ca lp Car. Khng th truy nhp t bn ngoi lp (phm vi chng trnh), chng hn trong mt hm t do ngoi lp Car.
void Car::setPrice(float priceIn){ price = priceIn; } // ng, v setPrice l mt phng thc // ca lp Car
nhng:
void freeFunction(Car myCar){ myCar.price = 3000;// Li, v freeFunction l mt hm t do // nm ngoi phm vi lp Car }
Khi , hm freeFunction phi truy nhp gin tip n thuc tnh price thng qua phng thc truy nhp c tnh cht public nh sau:
void freeFunction(Car myCar){ myCar.setPrice(3000);// ng, v setPrice l mt phng thc ca // lp Car c thuc tnh public }
Tuy nhin, C++ cho php mt cch c bit truy nhp n cc thnh phn private v protected ca mt lp bng khi nim hm bn v lp bn ca mt lp: trong cc hm bn v lp bn ca mt lp, c th truy nhp n cc thnh phn private v protected nh bn trong phm vi lp .
5.3.2 Hm bn
C hai kiu hm bn c bn trong C++: Mt hm t do l hm bn ca mt lp Mt hm thnh phn (phng thc) ca mt lp l bn ca mt lp khc Mt hm l bn ca nhiu lp
91
Chng 5: Lp
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>]); };
Lu : Mc d hm bn c khai bo khun mu hm trong phm vi lp, nhng hm bn t do li khng phi l mt phng thc ca lp. N l hm t do, vic nh ngha v s dng hm ny hon ton tng t nh cc hm t do khc. Vic khai bo khun mu hm bn trong phm vi lp v tr no cng c: hm bn khng b nh hng bi cc t kha private, protected hay public trong lp. Trong hm bn, c th truy nhp trc tip n cc thnh phn private v protected ca i tng c kiu lp m n lm bn (truy nhp thng qua i tng c th).
Chng trnh 5.2 minh ha vic nh ngha mt hm bn ca lp Car, hm ny so snh xem hai chic xe, chic no t hn. Chng trnh 5.2
#include<stdio.h> #include<conio.h> #include<string.h> /* nh ngha lp */ class Car{ private: int char public: void init(int, char[], float);// Khi to thng tin v xe // Khai bo hm bn ca lp friend void moreExpensive(Car, Car); }; speed; mark[20]; // Tc // Nhn hiu // Gi xe
float price;
92
Chng 5: Lp
/* Khai bo phng thc bn ngoi lp */ void Car::init(int speedIn, char markIn[], float priceIn){ speed = speedIn; strcpy(mark, markIn); price = priceIn; return; } /* nh ngha hm bn t do */ void moreExpensive(Car car1, Car car2){ if(car1.price > car2.price)//Truy nhp n cc thuc tnh private cout << xe thu nhat dat hon << endl; else if(car1.price < car2.price) cout << xe thu nhat dat hon << endl; else cout << hai xe dat nhu nhau << endl; return; } // Hm main, chng trnh chnh void main(){ clrscr(); Car car1, car2; // Khi to xe th nht, th hai car1.init(100, Ford, 3000); car2.init(150, Mercedes, 3500); // So snh gi hai xe moreExpensive(car1, car2); return; } // S dng hm bn t do // Khai bo bin lp
93
Chng 5: Lp
class A;
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.
94
Chng 5: Lp
public: void init(char[], int); int permission(Car); }; /* nh ngha lp Car */ class Car{ private: int char public: void init(int, char[], float);// Khi to thng tin v xe // Khai bo hm bn ca lp friend int Person::permission(Car); }; /* Khai bo phng thc bn ngoi lp */ void Person::init(char nameIn[], int ageIn){ strcpy(name, nameIn); age = ageIn; return; } void Car::init(int speedIn, char markIn[], float priceIn){ speed = speedIn; strcpy(mark, markIn); price = priceIn; return; } /* nh ngha hm bn */ int Person::permission(Car car){ if(age < 18) return 0; //Truy nhp thuc tnh private thng qua i tng car if((age < 21)&&(car.speed > 150)) return 0; return 1; } // Hm main, chng trnh chnh void main(){ speed; mark[20]; // Tc // Nhn hiu // Gi xe // Khi to thng tin v ngi // Xc nh quyn iu khin xe
float price;
95
Chng 5: Lp
clrscr(); // Khai bo cc bin lp Car car; Person person; // Khi to cc i tng car.init(100, Ford, 3000); person.init(Vinh, 20); // Xc nh quyn iu khin xe if(person.permission(car)) else cout << Khong co quyen dieu khien << endl; return; } // S dng hm bn cout << Co quyen dieu khien << endl;
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;
Lu : Trong trng hp ny, lp B l lp bn ca lp A nhng khng c ngha l lp A cng l bn ca lp B: tt c cc phng thc ca lp B c th truy nhp cc thnh phn private ca lp A (thng qua cc i tng c kiu lp A) nhng cc phng thc ca lp A li khng th truy nhp n cc thnh phn private ca lp B.
96
Chng 5: Lp
Mun cc phng thc ca lp A cng truy nhp c n cc thnh phn private ca lp B, th phi khai bo thm l lp A cng l lp bn ca lp B.
5.4 HM KHI TO V HU B
5.4.1 Hm khi to
Hm khi to c gi mi khi khai bo mt i tng ca lp. Ngay c khi khng c khai bo tng minh, C++ cng gi hm khi to ngm nh khi i tng c khai bo.
Khai bo hm khi to
Hm khi to ca mt lp c khai bo tng minh theo c php sau:
class <Tn lp>{ public: <Tn lp>([<Cc tham s>]); }; // Khai bo hm khi to
V d:
class Car{ int char public: Car(int speedIn, char markIn[], float priceIn){ speed = speedIn; strcpy(mark, markIn); price = priceIn; } }; speed; mark[20];
float price;
l khai bo mt hm khi to vi ba tham s ca lp Car. Lu : Hm khi to phi c tn trng vi tn ca lp Hm khi to khng c gi tr tr v Hm khi to c tnh cht public C th c nhiu hm khi to ca cng mt lp
S dng hm khi to ca lp
Hm khi to c s dng khi khai bo bin lp. Khi , ta c th va khai bo, va khi to gi tr cc thuc tnh ca i tng lp theo c php sau:
<Tn lp> <Tn i tng>([<Cc i s khi to>]);
Trong : Tn lp: l tn kiu lp c nh ngha Tn i tng: l tn bin c kiu lp, tun th theo quy tc t tn bin ca C++
97
Chng 5: Lp
Cc i s khi to: L cc i s tng ng vi hm khi to ca lp tng ng. Tng t nh vic truyn i s khi dng cc li gi hm thng thng.
V d, nu lp Car c hm khi to Car(int, char[], float) th khi khai bo bin c kiu lp Car, ta c th s dng hm khi to ny nh sau:
Car myCar(100, Ford, 3000);
Lu : Khi s dng hm khi to, phi truyn ng s lng v ng kiu ca cc tham s ca cc hm khi to c nh ngha ca lp. Khi mt lp c t nht mt hm khi to tng minh, th khng c s dng hm khi to ngm nh ca C++. Do , khi khai bo t nht mt hm khi to, nu mun khai bo bin m khng cn tham s, lp tng ng phi c t nht mt hm khi to khng c tham s. V d, nu lp Car ch c duy nht mt hm khi to nh sau:
class Car{ public: Car(int, char[], float); };
Trong trng hp dng hm khi to khng c tham s, ta khng cn phi s dng cp du ngoc n () sau tn bin i tng. Vic khai bo tr thnh cch khai bo thng thng.
Chng trnh 5.4a minh ha vic nh ngha v s dng lp Car vi hai hm khi to khc nhau. Chng trnh 5.4a
#include<stdio.h> #include<conio.h> #include<string.h> /* nh ngha lp */ class Car{ private: int char public: Car(); void }; show(); // Khi to khng tham s // Gii thiu xe Car(int, char[], float);// Khi to y tham s speed; mark[20]; // Tc // Nhn hiu // Gi xe
float price;
98
Chng 5: Lp
/* Khai bo phng thc bn ngoi lp */ Car::Car(){ speed = 0; strcpy(mark, ); price = 0; } // Khi to c y tham s Car::Car(int speedIn, char markIn[], float priceIn){ speed = speedIn; strcpy(mark, markIn); price = priceIn; } void Car::show(){ // Phng thc gii thiu xe // Khi to khng tham s
cout << This is a << mark << having a speed of << speed << km/h and its price is $ << price << endl; return; } // Hm main, chng trnh chnh void main(){ clrscr(); Car myCar1; // S dng hm khi to khng tham s Car myCar2(150, Mercedes, 5000);// Dng hm khi to tham s // Gii thiu xe th nht cout << Xe thu nhat: << endl; myCar1.show(); // Gii thiu xe th hai cout << Xe thu hai: << endl; myCar2.show(); return; }
99
Chng 5: Lp
L do l xe th nht s dng hm khi to khng c tham s nn xe khng c tn, tc v gi u l mc nh (0). Trong khi , xe th hai c khi to y c ba tham s nn thng tin gii thiu xe c y . Tuy nhin, khi i tng c nhiu thuc tnh ring, trnh trng hp phi nh ngha nhiu hm khi to cho cc trng hp thiu vng mt vi tham s khc nhau. Ta c th s dng hm khi to vi cc gi tr khi u ngm nh. Chng trnh 5.4b cho kt qu hon ton ging chng trnh 5.4a, nhng n gin hn v ch cn nh ngha mt hm khi to vi cc tham s c gi tr ngm nh. Chng trnh 5.4b
#include<stdio.h> #include<conio.h> #include<string.h> /* nh ngha lp */ class Car{ private: int char public: // Khi to vi cc gi tr ngm inh cho cc tham s Car(int speedIn=0, char markIn[]=, float priceIn=0); void }; /* Khai bo phng thc bn ngoi lp */ Car::Car(int speedIn, char markIn[], float priceIn){ speed = speedIn; strcpy(mark, markIn); price = priceIn; } void Car::show(){ // Phng thc gii thiu xe show(); // Gii thiu xe speed; mark[20]; // Tc // Nhn hiu // Gi xe
float price;
cout << This is a << mark << having a speed of << speed << km/h and its price is $ << price << endl; return; } // Hm main, chng trnh chnh void main(){ clrscr(); Car myCar1; // Cc tham s nhn gi tr mc nh
100
Chng 5: Lp
Car myCar2(150, Mercedes, 5000);// Dng hm khi to tham s // Gii thiu xe th nht cout << Xe thu nhat: << endl; myCar1.show(); // Gii thiu xe th hai cout << Xe thu hai: << endl; myCar2.show(); return; }
5.4.2 Hm hy b
Hm hy b c t ng gi n khi m i tng c gii phng khi b nh. Nhim v ca hm hy b l dn dp b nh trc khi i tng b gii phng. C php khai bo hm hy b nh sau:
class <Tn lp>{ public: ~<Tn lp>([<Cc tham s>]); }; // Khai bo hm khi to
V d:
class Car{ int char public: ~Car(){ delete [] mark; }; }; speed; *mark;
float price;
l khai bo mt hm hy b ca lp Car vi thuc tnh mark c kiu con tr. Hm ny s gii phng vng nh cp pht cho con tr kiu char ca thuc tnh nhn hiu xe. Lu : Hm hy b phi c tn bt u bng du ~, theo sau l tn ca lp tng ng. Hm hy b khng c gi tr tr v. Hm hy b phi c tnh cht public Mi lp ch c nhiu nht mt hm hy b. Trong trng hp khng khai bo tng minh hm hy b, C++ s s dng hm hy b ngm nh.
101
Chng 5: Lp
Ni chung, khi c t nht mt trong cc thuc tnh ca lp l con tr, th nn dng hm hy b tng minh gii phng trit cc vng nh ca cc thuc tnh, trc khi i tng b gii phng khi b nh.
Chng trnh 5.5 minh ha vic nh ngha lp Car vi mt hm khi to c cc tham s vi gi tr mc nh v mt hm hy b tng minh. Chng trnh 5.5
#include<stdio.h> #include<conio.h> #include<string.h> /* nh ngha lp */ class Car{ private: int char public: // Khi to vi cc gi tr ngm inh cho cc tham s Car(int speedIn=0, char *markIn=NULL, float priceIn=0); void }; /* Khai bo phng thc bn ngoi lp */ Car::Car(int speedIn, char *markIn, float priceIn){ speed = speedIn; mark = markIn; price = priceIn; } void Car::show(){ // Phng thc gii thiu xe show(); // Gii thiu xe // Hm hy b tng minh ~Car(); speed; *mark; // Tc // Nhn hiu // Gi xe
float price;
cout << This is a << *mark << having a speed of << speed << km/h and its price is $ << price << endl; return; } Car::~Car(){ delete [] mark; cout << The object has been destroyed! << endl; } // Hm hy b tng minh
102
Chng 5: Lp
// Hm main, chng trnh chnh void main(){ clrscr(); Car myCar(150, Mercedes, 5000);// Dng hm khi to tham s // Gii thiu xe cout << Gioi thieu xe: << endl; myCar.show(); return; }
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.
103
Chng 5: Lp
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
Con tr i tng c th tr n a ch ca mt i tng c sn, cng lp theo c php sau: V d, ta c mt con tr v mt i tng ca lp Car:
Car *ptrCar, myCar(100, Ford,3000);
Khi mun truy nhp n cc thnh phn ca con tr i tng, ta dng c php sau:
<Tn con tr i tng> -> <Tn thnh phn lp>([<Cc i s>]);
V d, on chng trnh sau s thc hin phng thc gii thiu xe ca lp Car thng qua con tr ptrCar:
Car *ptrCar = new Car(100, Ford,3000); ptrCar->show();
Lu : Danh sch cc i s phi tng thch vi tn phng thc tng ng. Cc quy tc phm vi truy nhp vn p dng trong truy nhp cc thnh phn lp thng qua con tr.
104
Chng 5: Lp
V d:
Car *ptrCar = new Car();// Khai bo v cp pht b nh delete ptrCar; // S dng con tr ptrCar // Gii phng b nh.
Lu : Thao tc delete ch c dng khi trc , con tr c cp pht b nh qua thao tc new:
Car *ptrCar = new Car(); delete ptrCar; // ng.
Chng trnh 5.6 minh ha vic dng con tr i tng c kiu lp l Car. Chng trnh 5.6
#include<stdio.h> #include<conio.h> #include<string.h> /* nh ngha lp */ class Car{ private: int char public: // Khi to vi cc gi tr ngm inh cho cc tham s Car(int speedIn=0, char markIn[]=, float priceIn=0); void }; /* Khai bo phng thc bn ngoi lp */ Car::Car(int speedIn, char markIn[], float priceIn){ speed = speedIn; strcpy(mark, markIn); price = priceIn; show(); // Gii thiu xe speed; mark[20]; // Tc // Nhn hiu // Gi xe
float price;
105
Chng 5: Lp
} void Car::show(){ // Phng thc gii thiu xe
cout << This is a << mark << having a speed of << speed << km/h and its price is $ << price << endl; return; } // Hm main, chng trnh chnh void main(){ clrscr(); // Khai bo con tr, cp pht b nh dng hm khi to tham s Car *myCar = new Car(150, Mercedes, 5000); // Gii thiu xe cout << Gioi thieu xe: << endl; myCar->show(); // Gii phng con tr delete myCar; return; }
V d:
Car cars[10];
L khai bo mt mng c 10 i tng c cng kiu lp Car. Lu : C th khai bo mng tnh cc i tng m cha cn khai bo di mng, cch ny thng dng khi cha bit chnh xc di mng:
Car cars[];
106
Chng 5: Lp
Mun khai bo c mng tnh cc i tng, lp tng ng phi c hm khi to khng c tham s. V khi khai bo mng, tng ng vi khai bo mt dy cc i tng vi hm khi to khng c tham s.
V d:
Car *cars = new Car[10];
Sau khi c s dng, mng ng cc i tng cng cn phi gii phng b nh:
delete [] <Tn bin mng ng>;
V d:
Car *cars = new Car[10];// Khai bo v cp pht ng delete [] cars; // S dng bin mng ng // Gii phng b nh ca mng ng
V d:
Car cars[10]; cars[5].show();
s thc hin phng thc show() ca i tng c ch s th 5 (tnh t ch s 0) trong mng cars. Chng trnh 5.7 s ci t mt chng trnh, trong nhp vo di mng, sau yu cu ngi dng nhp thng tin v mng cc xe. Cui cng, chng trnh s tm kim v hin th thng tin v chic xe c gi t nht trong mng. Chng trnh 5.7
#include<stdio.h> #include<conio.h> #include<string.h> /* nh ngha lp Car */ class Car{ private: int char public: void setSpeed(int); // Gn tc cho xe speed; mark[20]; // Tc // Nhn hiu // Gi xe
float price;
107
Chng 5: Lp
int void void getSpeed(); setMark(char); setPrice(float); // c tc xe // Gn nhn cho xe // c nhn xe // Gn gi cho xe // c gi xe
Car(int speedIn=0, char markIn[]=, float priceIn=0); void }; /* Khai bo phng thc bn ngoi lp */ Car::Car(int speedIn, char markIn[], float priceIn){ speed = speedIn; strcpy(mark, markIn); price = priceIn; } void Car::setSpeed(int speedIn){ speed = speedIn; } int Car::getSpeed(){ return speed; } void Car::setMark(char markIn){ strcpy(mark, markIn); } char[] Car::getMark(){ return mark; } void Car::setPrice(float priceIn){ price = priceIn; } float Car::getPrice(){ return price; } void Car::show(){ // Phng thc gii thiu xe // c gi xe // Gn gi cho xe // c nhn xe // Gn nhn cho xe // c tc xe // Gn tc cho xe show(); // Gii thiu xe
cout << This is a << mark << having a speed of << speed << km/h and its price is $ << price << endl; return; } // Hm main, chng trnh chnh
108
Chng 5: Lp
void main(){ clrscr(); int length; float maxPrice = 0; int index = 0; Car *cars; // Chiu di mng // Gi t nht // Ch s ca xe t nht // Khai bo mng i tng
// Nhp s lng xe, tc l chiu di mng cout << So luong xe: ; cin >> length; // Cp pht b nh ng cho mng cars = new Car[length]; // Khi to cc i tng trong mng for(int i=0;i<length; i++){ int speed; char mark[20]; float price; // (Bin tm) tc // (Bin tm) nhn hiu // (Bin tm) gi xe
cout << Xe thu << i << : <<endl; cout << Toc do (km/h): ; cin >> speed; cars[i].setSpeed(speed); cout << Nhan hieu : ; cin >> mark; cars[i].setMark(mark); cout << Gia ($): ; cin >> price; cars[i].setPrice(price); if(maxPrice < price){ maxPrice = price; index = i; } } // Tm xe t nht for(int i=0; i<length; i++) if(i == index){ cars[i].show(); break; } // Gii phng b nh ca mng delete [] cars; return; // Gii thiu xe t nht // Nhp gi xe // Nhp nhn xe // Nhp tc
109
Chng 5: Lp
}
TNG KT CHNG 5
Ni dung chng 5 tp trung trnh by cc vn c bn v lp i tng trong ngn ng C++: Khai bo, nh ngha lp bng t kha class S dng bin lp nh nhng i tng c th Khai bo, nh ngha cc thuc tnh v cc phng thc ca lp: nh ngha cc phng thc trong hoc ngoi phm vi khai bo lp Khai bo phm vi truy nhp lp bng cc t kha ch phm vi: private, protected v public. Gii thiu cc kiu hm c th truy nhp phm vi bt quy tc: hm bn v lp bn vi t kha friend. Khai bo, nh ngha tng minh hm khi to ca lp v s dng khi khai bo bin lp Khai bo, nh ngha tng minh hm hy b ca lp, nhm dn dp, gii phng b nh trc khi i tng b gii phng khi b nh. Khai bo, cp pht b nh, s dng v gii phng b nh cho con tr i tng Khai bo, cp pht b nh ng, s dng v gii phng vng nh ca mng cc i tng.
CU HI V BI TP CHNG 5
1. Trong cc khai bo lp sau, nhng khai bo no l ng: a. class MyClass; b. Class MyClass; c. class MyClass{}; d. Class MyClass{}; 2. Gi s ta nh ngha lp MyClass, by gi ta khai bo mt i tng thuc kiu lp ny. Khai bo no l ng: a. class MyClass me; b. MyClass me; c. MyClass me(); d. MyClass me{}; 3. Trong cc khai bo thuc tnh ngay trong phm vi ca khai bo lp nh sau, nhng khai bo no l ng: a. int myAge; b. private int myAge; c. public int myAge; d. private: int myAge;
110
Chng 5: Lp
4. Trong cc khai bo phng thc ngay trong phm vi ca khai bo lp MyClass nh sau, nhng khai bo no l ng: a. public: void show(); b. void show(); c. void show(){cout << hello!;}; d. void MyClass::show(){cout << hello!;} 5. Xt on chng trnh sau:
class MyClass{ int age; public: int getAge(); }; MyClass me;
Khi , trong cc lnh sau, lnh no c th thm vo cui on chng trnh trn: a. cout << MyClass::age; b. cout << me.age; c. cout << me.getAge(); d. cin >> me.age; 6. Trong cc khai bo hm khi to cho lp MyClass nh sau, nhng khai bo no l ng: a. myClass(); b. MyClass(); c. MyClass(MyClass); d. void MyClas(); e. MyClass MyClass(); 7. Trong cc khai bo hm hy b cho lp MyClass nh sau, nhng khai bo no l ng: a. ~myClass(); b. ~MyClass(); c. ~MyClass(MyClass); d. void ~MyClas(); e. MyClass ~MyClass(); 8. Gi s ta khai bo lp MyClass c mt thuc tnh age v mt hm khi to:
class MyClass{ int age; public: MyClass(MyClass me){ }; int getAge(){return age}; };
111
Chng 5: Lp
Trong cc dng lnh sau, nhng dng no c th xut hin trong hm khi to trn: a. age = MyClass.age; b. age = me.age; c. age = MyClass.getAge(); d. age = me.getAge(); e. age = 10; 9. Xt khai bo lp nh sau:
class MyClass{ public: MyClass(MyClass); MyClass(int); };
Khi , trong s cc khai bo i tng sau, nhng khai bo no l ng: a. MyClass me; b. MyClass me(); c. MyClass me(10); d. MyClass me1(10), me2(me1); 10. Xt khai bo lp nh sau:
class MyClass{ public: MyClass(); };
Khi , trong s cc khai bo con tr i tng sau, nhng khai bo no l ng: a. MyClass *me; b. MyClass *me(); c. MyClass *me = new me(); d. MyClass *me = new MyClass(); 11. Xt khai bo lp nh sau:
class MyClass{ public: MyClass(int i=0, int j=0, float k=0); };
Khi , trong s cc khai bo con tr i tng sau, nhng khai bo no l ng: a. MyClass *me; b. MyClass *me = new MyClass(); c. MyClass *me = new MyClass(1, 20); d. MyClass *me = new MyClass(1, 20, 30); 12. Khai bo mt lp nhn vin, c tn l Employee, vi ba thuc tnh c tnh cht private: Tn nhn vin, c dng mt con tr kiu char
112
Chng 5: Lp
Tui nhn vin, c kiu int Lung nhn vin, c kiu float. set/get gi tr thuc tnh tn nhn vin set/get gi tr thuc tnh tui nhn vin set/get gi tr thuc tnh lung nhn vin.
14. Vit mt hm khi to khng c tham s cho lp Employee trong bi 13, cc thuc tnh ca lp nhn gi tr mc nh: gi tr thuc tnh tn nhn vin, mc nh l chui k t rng gi tr thuc tnh tui nhn vin, mc nh l 18 gi tr thuc tnh lung nhn vin, mc nh l $100.
15. Vit thm mt hm khi to vi y ba tham s tng ng vi ba thuc tnh ca lp Employee trong bi 14. 16. Thm vo lp Employee mt phng thc show() gii thiu v tn, tui v lng ca i tng nhn vin. 17. Vit mt hm hy b tng minh cho lp Employee nhm gii phng vng nh ca con tr char, l kiu ca thuc tnh tn nhn vin. 18. Vit mt chng trnh s dng lp Employee c xy dng sau bi 17 vi cc thao tc sau: Khai bo mt i tng kiu Employee, dng hm khi to khng tham s Dng hm show() gii thiu v i tng
19. Vit mt chng trnh s dng lp Employee c xy dng sau bi 17 vi cc thao tc sau: Khai bo mt i tng kiu Employee, dng hm khi to khng tham s Nhp t bn phm gi tr cc thuc tnh tn, tui, lng nhn vin. Gn cc gi tr ny cho cc thuc tnh ca i tng khai bo, dng cc hm set Dng hm show() gii thiu v i tng
20. Vit mt chng trnh s dng lp Employee c xy dng sau bi 17 vi cc thao tc sau: Khai bo mt i tng kiu Employee, dng hm khi to vi 3 tham s Dng hm show() gii thiu v i tng
21. Vit mt chng trnh s dng lp Employee c xy dng sau bi 17 vi cc thao tc sau: Khai bo mt con tr i tng kiu Employee Cp pht b nh, dng hm khi to vi 3 tham s Dng hm show() gii thiu v i tng m con tr ny ang tr ti
22. Vit mt chng trnh nhp d liu cho mt mng ng cc i tng ca lp Employee trong bi 17. Chiu di mng ng cng c nhp t bn phm.
113
Chng 5: Lp
23. Vit mt chng trnh tm kim trn mng ng c xy dng trong bi 22: tm kim v gii thiu v nhn vin tr nht v nhn vin gi nht trong mng . 24. Vit mt chng trnh tm kim trn mng ng c xy dng trong bi 22: tm kim v gii thiu v nhn vin c lng cao nht v nhn vin c lng thp nht trong mng . 25. Vit mt chng trnh tm kim trn mng ng c xy dng trong bi 22: tm kim v gii thiu v nhn vin c tn xc nh, do ngi dng nhp t bn phm.
114
Trong : Tn lp dn xut: l tn lp c cho k tha t lp khc. Tn lp ny tun th theo quy tc t tn bin trong C++. Tn lp c s: l tn lp c nh ngha trc cho lp khc k tha. Tn lp ny cng tun th theo quy tc t tn bin ca C++. T kha dn xut: l t kha quy nh tnh cht ca s k tha. C ba t kha dn xut l private, protected v public. Mc tip theo s trnh by ngha ca cc t kha dn xut ny.
class Bus: public Car{ }; // Khai bo cc thnh phn
V d:
115
l khai bo mt lp Bus (xe but) k tha t lp Car (xe t) vi tnh cht k tha l 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.
116
V d:
Bus():Car(){ } // Khi to cc thuc tnh mi b sung ca lp Bus
l mt nh ngha mt hm khi to ca lp Bus k tha t lp Car. nh ngha ny c thc hin trong phm vi khai bo lp Bus. y l mt hm khi to khng tham s, n gi ti hm khi to khng tham s ca lp Car. Lu : Nu nh ngha hm khi to bn ngoi phm vi lp th phi thm tn lp dn xut v ton t phm vi :: trc tn hm khi to. Gia tn hm khi to ca lp dn xut v hm khi to ca lp c s, ch c mt du hai chm :, nu l hai du :: th tr thnh ton t phm vi lp.
117
Nu khng ch r hm khi to ca lp c s sau du hai chm : chng trnh s t ng gi hm khi to ngm nh hoc hm khi to khng c tham s ca lp c s nu hm c nh ngha tng minh trong lp c s. V d, nh ngha hm khi to:
Bus():Car(){ }; // Khi to cc thuc tnh mi b sung ca lp Bus
C th thay bng:
Bus(){ }; // Gi hm khi to khng tham s ca lp Car // Khi to cc thuc tnh mi b sung ca lp Bus
Chng trnh 6.1 nh ngha lp Car c 3 thuc tnh vi hai hm khi to, sau nh ngha lp Bus c thm thuc tnh label l s hiu ca tuyn xe but. Lp Bus s c ci t hai hm khi to tng minh, gi n hai hm khi to tng ng ca lp Car. Chng trnh 6.1
#include<string.h> /* nh ngha lp Car */ class Car{ int char public: Car(); Car(int, char[], float); }; Car::Car(){ speed = 0; strcpy(mark, ); price = 0; } // Khi to tham s Car::Car(int speedIn, char markIn[], float priceIn){ speed = speedIn; strcpy(mark, markIn); price = priceIn; } /* nh ngha lp Bus k tha t lp Car */ // Khi to khng tham s // Khi to khng tham s // Khi to tham s speed; mark[20]; // Tc // Nhn hiu // Gi xe
float price;
118
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.
Lu : Hm hy b ca lp dn xut ch gii phng phn b nh c cp pht ng cho cc thuc tnh mi b sung trong lp dn xut, nu c, m khng c gii phng b nh c cp cho cc thuc tnh trong lp c s (phn ny l do hm hy b ca lp c s m nhim). Khng phi gi tng minh hm hy b ca lp c s trong hm hy b ca lp dn xut. Ngay c khi lp dn xut khng nh ngha tng minh hm hy b (do khng cn thit) m lp c s li c nh ngha tng minh. Chng trnh vn gi hm hy b ngm nh ca lp dn xut, sau vn gi hm hy b tng minh ca lp c s.
Chng trnh 6.2 ci t lp Bus k tha t lp Car: lp Car c mt thuc tnh c dng con tr nn cn gii phng bng hm hy b tng minh. Lp Bus c thm mt thuc tnh c dng con
119
tr l danh sch cc ng ph m xe but i qua (mng ng cc chui k t *char[]) nn cng cn gii phng bng hm hy b tng minh. Chng trnh 6.2
#include<string.h> /* nh ngha lp Car */ class Car{ char public: ~Car(); }; Car::~Car(){ delete [] mark; } /* nh ngha lp Bus k tha t lp Car */ class Bus: public Car{ char *voyage[]; public: ~Bus(); }; Bus::~Bus(){ delete [] voyage; } // Hy b tng minh // Hy b tng minh // Hnh trnh tuyn xe // Hy b tng minh // Hy b tng minh *mark; // Nhn hiu xe
Trong hm hy b ca lp Bus, ta ch c gii phng vng nh c cp pht cho thuc tnh voyage (hnh trnh ca xe but), l thuc tnh c b sung thm ca lp Bus. M khng c gii phng vng nh cp pht cho thuc tnh mark (nhn hiu xe), vic ny l thuc trch nhim ca hm hy b ca lp Car v thuc tnh mark c khai bo trong lp Car.
120
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
Bng 6.3 tng kt phm vi truy nhp t hm bn v i tng ca lp dn xut vo cc thnh phn ca lp c s, c quy nh bi cc t kha dn xut.
121
Kiu dn xut
private
protected
public
protected public
i vi con tr i tng:
<Tn i tng>-><Tn thnh phn>([Cc i s]);
Chng trnh 6.3 minh ha vic s dng cc thnh phn lp c s t i tng lp dn xut: lp Bus k tha t lp Car. Lp Bus c nh ngha b sung mt s phng thc v thuc tnh mi. Khi , i tng ca lp Bus c th gi cc hm public ca lp Bus cng nh ca lp Car. Chng trnh 6.3
#include<stdio.h> #include<conio.h> #include<string.h> /* nh ngha lp Car */ class Car{ private: int speed; // Tc
122
float price;
Car(int speedIn=0, char markIn[]=, float priceIn=0); void }; /* Khai bo phng thc bn ngoi lp */ Car::Car(int speedIn, char markIn[], float priceIn){ speed = speedIn; strcpy(mark, markIn); price = priceIn; } void Car::setSpeed(int speedIn){ speed = speedIn; } int Car::getSpeed(){ return speed; } void Car::setMark(char markIn){ strcpy(mark, markIn); } char[] Car::getMark(){ return mark; } void Car::setPrice(float priceIn){ price = priceIn; } float Car::getPrice(){ return price; } void Car::show(){ // Phng thc gii thiu xe // c gi xe // Gn gi cho xe // c nhn xe // Gn nhn cho xe // c tc xe // Gn tc cho xe show(); // Gii thiu xe
cout << This is a << mark << having a speed of << speed << km/h and its price is $ << price << endl;
123
124
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.
khi , phng thc show() ca lp Bus c coi l phng thc np chng t phng thc show() ca lp Car.
125
i vi con tr i tng:
<Tn i tng>-><Tn thnh phn>([Cc i s]);
s gi n phng thc show() c nh ngha trong lp Bus. Trong trng hp, t mt i tng ca lp dn xut, mun truy nhp n mt phng thc ca lp c s ( b nh ngha li lp dn xut) th phi s dng ch th phm vi lp trc phng thc c gi: V d:
Bus myBus; myBus.Car::show();
i vi con tr i tng:
<Tn i tng>-><Tn lp c s>::<Tn thnh phn>([Cc i s]);
s gi n phng thc show() c nh ngha trong lp Car t mt i tng ca lp Bus. Chng trnh 6.4 minh ha vic nh ngha chng hm show() trong lp Bus v vic s dng hai phng thc show() ca hai lp t mt i tng ca lp dn xut. Chng trnh 6.4
#include<stdio.h> #include<conio.h> #include<string.h> /* nh ngha lp Car */ class Car{ private: int char public: int getSpeed(); // c tc xe // c nhn xe // c gi xe char[] getMark(); float getPrice(); // Khi to thng tin v xe speed; mark[20]; // Tc // Nhn hiu // Gi xe
float price;
126
cout << This is a << mark << having a speed of << speed << km/h and its price is $ << price << endl; return; } /* nh ngha lp Bus k tha t lp Car */ class Bus: public Car{ int label; public: // Khi to tham s Bus(int sIn=0, char mIn[]=, float pIn=0, int lIn=0); void show(); }; // Khi to tham s Bus::Bus(int sIn, char mIn[], float pIn, int lIn):Car(sIn, mIn, pIn){ label = lIn; } // Gii thiu xe bus // S hiu tuyn xe
127
// nh ngha np chng phng thc void Bus::show(){ // Gii thiu xe bus cout << This is a bus of type << getMark() << , on the line << label << , having a speed of << getSpeed() << km/h and its price is $ << getPrice() << endl; return; } // Chng trnh chnh void main(){ clrscr(); Bus myBus(80, Mercedes, 5000, 27);// Bin i tng ca lp Bus cout << Gioi thieu xe: << endl; myBus.Car::show(); myBus.show(); return; } // Phng thc ca lp Car // Phng thc ca lp Bus cout << Gioi thieu xe bus: << endl;
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.
128
th chp nhn c, nhng php gn: th khng chp nhn c. Lu : Nguyn tc chuyn kiu ny cng ng vi cc php gn con tr: mt con tr i tng lp c s c th tr n a ch ca mt i tng lp dn xut. Nhng mt con tr i tng lp dn xut khng th tr n a ch mt i tng lp c s. Nguyn tc chuyn kiu ny cng ng vi truyn i s cho hm: c th truyn mt i tng lp dn xut vo v tr ca tham s c kiu lp c s. Nhng khng th truyn mt i tng lp c s vo v tr mt tham s c kiu lp dn xut.
Chng trnh 6.5 minh ha vic chuyn kiu gia cc i tng ca lp c s v lp dn xut. Chng trnh 6.5
#include<stdio.h> #include<conio.h> #include<string.h> /* nh ngha lp Car */ class Car{ private: int char public: int getSpeed(); // c tc xe // c nhn xe // c gi xe char[] getMark(); float getPrice(); // Khi to thng tin v xe Car(int speedIn=0, char markIn[]=, float priceIn=0); void }; /* Khai bo phng thc bn ngoi lp */ Car::Car(int speedIn, char markIn[], float priceIn){ speed = speedIn; strcpy(mark, markIn); price = priceIn; } show(); // Gii thiu xe speed; mark[20]; // Tc // Nhn hiu // Gi xe
float price;
129
cout << This is a << mark << having a speed of << speed << km/h and its price is $ << price << endl; return; } /* nh ngha lp Bus k tha t lp Car */ class Bus: public Car{ int label; public: // Khi to tham s Bus(int sIn=0, char mIn[]=, float pIn=0, int lIn=0); void show(); }; // Khi to tham s Bus::Bus(int sIn, char mIn[], float pIn, int lIn):Car(sIn, mIn, pIn){ label = lIn; } // nh ngha np chng phng thc void Bus::show(){ // Gii thiu xe bus cout << This is a bus of type << getMark() << , on the line << label << , having a speed of << getSpeed() << km/h and its price is $ << getPrice() << endl; return; } // Chng trnh chnh void main(){ clrscr(); Car myCar(100, Ford, 3000); // Bin i tng lp Car Bus myBus(80, Mercedes, 5000, 27);// Bin i tng lp Bus // nh ngha chng phng thc // S hiu tuyn xe
130
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; }
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.
V d:
class Bus: public Car, public PublicTransport{ }; // Khai bo cc thnh phn b sung
131
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.
float price;
132
Lu : Trong trng hp dng hm khi to ngm nh hoc khng c tham s, ta c th khng cn gi tng minh cc hm khi to ca cc lp c s, trnh bin dch s t ng gi ti chng theo ng th t dn xut
133
V d, trong chng trnh 6.6, hai cch nh ngha hm khi to khng tham s ca lp Bus sau l tng ng:
Bus::Bus(): Car(), Transport(){// Theo th t dn xut label = 0; }
l tng ng vi:
Bus::Bus(){ label = 0; } // Theo th t dn xut ngm nh
Hm hu b trong a k tha
V hm hu b l duy nht ca mi lp, hn na hm hu b ca lp c s s c t ng gi n khi gii phng i tng ca lp dn xut. Cho nn hm hu b trong a k tha hon ton tng t hm hu b trong n k tha: Hm hu b ca lp dn xut ch gii phng b nh cho cc thnh phn b sung, nu c, ca lp dn xut. Hm hu b ca lp dn xut s c gi n sm nht. Sau cc hm hu b ca cc lp c s s c gi n. Qu trnh ny c trnh bin dch thc hin t ng.
V d, ta nh ngha lp Bus k tha t hai lp c s: Car v PublicTransport. Nhng c ba lp ny u nh ngha mt phng thc show() t gii thiu:
class Car{ public: void show(); }; class PublicTransport{ public: void show(); }; class Bus: public Car, public PublicTransport{ public: void show(); };
134
v li gi hm:
myBus.show(); myBus.Car::show(); // Gi n hm ca lp Bus // Gi n hm ca lp Car
myBus.PublicTransport::show();// Gi n hm ca lp PublicTransport
Chng trnh 6.7 minh ho vic truy nhp n cc thnh phn trng nhau trong cc lp c s v c nh ngha li trong lp dn xut.
float price;
float getSpeed(){return speed;}; char[] getMark(){return mark;}; float getPrice(){return price;}; }; Car::Car(){ speed = 0; strcpy(mark, ); price = 0; } // Khi to tham s Car::Car(int speedIn, char markIn[], float priceIn){ speed = speedIn; strcpy(mark, markIn); price = priceIn; } // Khi to khng tham s
135
136
Dng th nht l kt qu ca phng thc show() ca lp Car, dng th hai, tng ng l kt qu phng thc show() ca lp PublicTransport, dng th ba l kt qu phng thc show() ca lp Bus.
137
Car
PublicTransport
Bus
Khi , ny sinh mt s vn nh sau: Cc thnh phn d liu ca lp Engine b lp li trong lp Bus hai ln: mt ln do k tha theo ng Bus::Car::Engine, mt ln theo ng Bus::PublicTransport::Engine. iu ny l khng an ton. Khi khai bo mt i tng ca lp Bus, hm khi to ca lp Engine cng c gi hai ln: mt ln do gi truy hi t hm khi to lp Car, mt ln do gi truy hi t hm khi to lp PublicTransport. Khi gii phng mt i tng ca lp Bus, hm hu b ca lp Engine cng s b gi ti hai ln.
trnh cc vn ny, C++ cung cp mt khi nim l k tha t lp c s tru tng. Khi , ta cho cc lp Car v PublicTransport k tha tru tng t lp Engine. Bng cch ny, cc thnh phn ca lp Engine ch xut hin trong lp Bus ng mt ln. Lp Engine c gi l lp c s tru tng ca cc lp Car v PublicTransport.
V d:
class Engine{ // Cc thnh phn lp Engine
138
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
Lu : Trong trng hp lp Engine khng phi l lp c s tru tng ca cc lp Car v PublicTransport, th trong hm khi to ca lp Bus khng cn gi hm khi to ca lp 139
Engine, m ch cn gi ti cc hm khi to ca cc lp c s trc tip ca lp Bus l lp Car v lp PublicTransport. Chng trnh 6.8 minh ho vic khai bo v s dng lp c s tru tng: lp Engine l lp c s tru tng ca cc lp Car v lp PublicTransport. Hai lp ny, sau , li lm lp c s ca lp Bus. Chng trnh 6.8
#include<stdio.h> #include<conio.h> #include<string.h> /* nh ngha lp Engine */ class Engine{ int public: Engine(){power = 0;}; void show(); }; // Gii thiu void Engine::show(){ cout << This is an engine having a power of << power << KWH << endl; return; } /* nh ngha lp Car dn xut t lp c s tru tng Engine*/ class Car: public virtual Engine{ int char public: Car(); void show(); // Khi to khng tham s // Gii thiu Car(int, int, char[], float); // Khi to tham s float getSpeed(){return speed;}; char[] getMark(){return mark;}; float getPrice(){return price;}; }; speed; mark[20]; // Tc // Nhn hiu // Gi xe // Khi to khng tham s // Gii thiu Engine(int pIn){power = pIn;};// Khi to tham s float getPower(){return power;}; power; // Cng sut
float price;
140
141
142
Hai dng u l kt qu ca phng thc show() ca lp Engine: mt ln gi qua lp Car, mt ln gi qua lp PublicTransport, chng cho kt qu nh nhau. Dng th ba l kt qu phng thc show() ca lp Car. Dng th t, tng ng l kt qu phng thc show() ca lp PublicTransport. Dng th nm l kt qu phng thc show() ca lp Bus.
6.6 A HNH
6.6.1 t vn
S k tha trong C++ cho php c s tng ng gia lp c s v cc lp dn xut trong s tha k: Mt con tr c kiu lp c s lun c th tr n a ch ca mt i tng ca lp dn xut. Tuy nhin, khi thc hin li gi mt phng thc ca lp, trnh bin dch s quan tm n kiu ca con tr ch khng phi i tng m con tr ang tr ti: phng thc ca lp m con tr c kiu c gi ch khng phi phng thc ca i tng m con tr ang tr ti c gi.
class Car{ public: void show(); }; class Bus: public Car{ public: void show(); };
143
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.
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.
144
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.
float price;
145
/* nh ngha lp Bus k tha t lp Car */ class Bus: public Car{ int label; public: // Khi to tham s Bus(int sIn=0, char mIn[]=, float pIn=0, int lIn=0); void show(); }; // Khi to tham s Bus::Bus(int sIn, char mIn[], float pIn, int lIn):Car(sIn, mIn, pIn){ label = lIn; } // nh ngha np chng phng thc tru tng void Bus::show(){ // Gii thiu xe bus cout << This is a bus of type << getMark() << , on the line << label << , having a speed of << getSpeed() << km/h and its price is $ << getPrice() << endl; return; } // Chng trnh chnh void main(){ clrscr(); Car *ptrCar, myCar(100, Ford, 3000); Bus myBus(150, Mercedes, 5000, 27);// Bin i tng ca lp Bus ptrCar = &myCar; ptrCar->show(); ptrCar = &myBus; ptrCar->show(); return; } // Tr n i tng lp Car // Phng thc ca lp Car // Tr n i tng lp Bus // Phng thc ca lp Bus // Gii thiu xe // S hiu tuyn xe
Dng th nht l kt qu khi con tr ptrCar tr n a ch ca i tng myCar, thuc lp Car nn s gi phng thc show() ca lp Car vi cc d liu ca i tng myCar: (100, Ford, 146
3000). Dng th hai tng ng l kt qu khi con tr ptrCar tr n a ch ca i tng myBus, thuc lp Bus nn s gi phng thc show() ca lp Bus, cng vi cc tham s ca i tng myBus: (150, Mercedes, 5000, 27). Lu : Trong trng hp lp dn xut khng nh ngha li phng thc tru tng, th chng trnh s gi phng thc ca lp c s, nhng vi d liu ca lp dn xut.
V d, nu trong chng trnh 6.9, lp Bus khng nh ngha chng phng thc tru tng show() th kt qu hin th s l hai dng thng bo ging nhau, ch khc nhau d liu ca hai i tng khc nhau:
This is a Ford having a speed of 100km/h and its price is $3000 This is a Mercedes having a speed of 150km/h and its price is $5000
TNG KT CHNG 6
Ni dung chng 6 trnh by cc vn c bn lin quan n tha k v tng ng bi trong C++ nh sau: Khai bo mt lp dn xut k tha t mt lp c s bng khai bo k tha : i km vi mt t kho dn xut. C ba loi dn xut khc nhau, c quy nh bi ba t kho dn xut khc nhau: private, protected v public. Kiu dn xut ph bin l dn xut public. S k tha to ra mi quan h tng ng gia lp c s v lp dn xut: c th chuyn kiu ngm nh (trong php gn, php truyn i s, php tr a ch) t mt i tng lp c s n mt i tng lp dn xut. Nhng khng th chuyn kiu ngc li t lp dn xut vo lp c s. Hm khi to ca lp dn xut c th gi tng minh hoc gi ngm nh hm khi to ca lp c s. Hm khi to lp c s bao gi cng c thc hin trc hm khi to lp dn xut. Hm hu b ca lp dn xut lun gi ngm nh hm hu b ca lp c s. Tri vi hm khi to, hm hu b lp c s lun c thc hin sau hm hu b ca lp dn xut. C th truy nhp cc phng thc ca lp c s t lp dn xut, phm vi truy nhp l ph thuc vo kiu dn xut: private, protected hoc public. iu ny cho php s dng li m ngun ca lp c s, m khng cn nh ngha li lp dn xut. Trong lp dn xut, c th nh ngha chng mt s phng thc ca lp c s. Khi c nh ngha chng, mun truy nhp vo phng thc lp c s, phi dng ton t phm vi lp <Tn lp>::. C++ cn cho php mt lp c th c dn xut t nhiu lp c s khc nhau, gi l a k tha. Trong a k tha, quan h gia lp dn xut vi mi lp c s l tng t nh trong n k tha. Trong a k tha, hm khi to lp dn xut s gi tng minh (hoc ngm nh) hm khi to cc lp c s, theo th t khai bo k tha. Hm hu b lp dn xut li gi ngm nh cc hm hu b ca cc lp c s.
147
C++ cung cp khi nim k tha t lp c s tru tng trnh trng hp trng lp d liu lp dn xut, khi cc lp c s li cng c dn xut t mt lp khc. C++ cng cho php c ch tng ng bi (a hnh) bng cch nh ngha mt phng thc l tru tng trong s tha k. Khi , mt con tr lp c s c th tr n a ch ca mt i tng lp dn xut, v phng thc c thc hin l tu thuc vo kiu ca i tng m con tr ang tr ti.
CU HI V BI TP CHNG 6
1. Trong cc khai bo sau, khai bo no l ng c php k tha lp: a. class A: b. class A: c. class A: d. class A::
public class B{}; public B{}; class B{}; public B{};
2. Trong cc kiu dn xut sau, t cc phng thc lp dn xut, khng th truy nhp n cc thnh phn private ca lp c s: a. private b. protected c. public d. C ba kiu trn 3. Trong cc kiu dn xut sau, t i tng ca lp dn xut, c th truy nhp n cc thnh phn ca lp c s: a. private b. protected c. public d. C ba kiu trn 4. A l lp dn xut public t lp c s B. Gi s c cc kiu khai bo:
A myA, *ptrA; B myB, *ptrB;
Khi , cc lnh no sau y l khng c li: a. myA = myB; b. myB = myA; c. ptrA = &myB; d. ptrB = &myA; e. ptrA = ptrB; f. ptrB = ptrA; 5. A l lp dn xut public t lp c s B. Gi s c cc kiu khai bo v nguyn mu hm:
A myA; B myB; void show(A, B);
148
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(); };
khi , nu myA l mt i tng lp A, lnh no sau y l chp chn c: a. myA.x; b. myA.getx(); c. C hai lnh trn.
149
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(); };
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(); };
khi , nu myA l mt i tng lp A, mun thc hin phng thc show() ca lp B th lnh no sau y l chp chn c: a. myA.show(); b. myA.B::show(); c. B::myA.show();
150
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);
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)
151
18. B sung cc phng thc truy nhp cc thuc tnh ca lp Human, cc phng thc ny c tnh cht public. 19. B sung thm cc thuc tnh ca lp Person: a ch v s in thoi. Thm cc phng thc truy nhp cc thuc tnh ny trong lp Person. 20. Xy dng hai hm khi to cho lp Human: mt hm khng tham s, mt hm vi ba tham s tng ng vi ba thuc tnh ca n. Sau , xy dng hai hm khi to cho lp Person c s dng cc hm khi to ca lp Human: mt hm khng tham s, mt hm nm tham s (ng vi hai thuc tnh ca lp Person v ba thuc tnh ca lp Human). 21. Xy dng mt hm main, trong c yu cu nhp cc thuc tnh to mt i tng c kiu Human v mt i tng c kiu Person, thng qua cc hm set thuc tnh xy dng. 22. Xy dng hm show() cho hai lp Human v Person. Thay i hm main: dng mt i tng c kiu lp Person, gi hm show() ca lp Person, sau li gi hm show() ca lp Human t chnh i tng . 23. Khai bo thm mt lp ngi lao ng (Worker), k tha t lp Human, c thm thuc tnh l s gi lm vic trong mt thng (hour) v tin lng ca ngi (salary). Sau , khai bo thm mt lp nhn vin (Employee) k tha ng thi t hai lp: Person v Worker. Lp Employee c b sung thm mt thuc tnh l chc v (position). 24. Chuyn lp Human thnh lp c s tru tng ca hai lp Person v Worker. Xy dng thm hai hm show() ca lp Worker v lp Employee. Trong hm main, khai bo mt i tng lp Employee, sau gi n cc hm show() ca cc lp Employee, Person, Worrker v Human. 25. Chuyn hm show() trong cc lp trn thnh phng thc tru tng. Trong hm main, khai bo mt con tr kiu Human, sau , cho n tr n ln lt cc i tng ca cc lp Human, Person, Worker v Employee, mi ln u gi phng thc show() hin th thng bo ra mn hnh.
152
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
push_back(): Thm mt phn t vo cui vt cha push_front(): Thm mt phn t vo u vt cha erase(): pop_back(): pop_front(): Loi b mt (hoc mt s) phn t khi vt cha Loi b phn t cui ca vt cha Loi b phn t u ca vt cha.
Ngoi ra, tu vo cc lp c th m c mt s ton t v phng thc c trng ca lp . Cc ton t v phng thc ny s c trnh by chi tit trong ni dung tng lp tip theo.
153
Trong : V d:
Set<int>::iterator iter;
Tn lp: l tn ca lp c bn ta ang dng, v d lp Set, lp List T: l tn kiu lp ca cc phn t cha trong vt cha. Kiu c th l cc kiu c bn trong C++, cng c th l cc kiu phc tp do ngi dng t nh ngha. Tn con chy: l tn bin s c s dng lm bin chy trong vt cha.
l khai bo mt bin con chy iter cho lp tp hp (Set), trong , cc phn t ca lp vt cha c kiu c bn int. Hoc:
List<Person>::iterator iter;
l khai bo mt bin con chy iter cho lp danh sch (List), trong , cc phn t c kiu lp do ngi dng t nh ngha l Person.
Lu : Bin con chy phi c khi u bng phng thc begin() v kt thc bng phng thc end() ca i tng cn duyt tng ng. Mt con chy c th c s dng nhiu ln cho nhiu i tng nu chng c cng kiu lp vt cha v cc phn t ca chng cng cng kiu.
154
7.2 LP TP HP
Lp tp hp (Set) cha cc phn t c cng kiu, khng phn bit th t gia cc phn t nhng li phn bit gia cc phn t: cc phn t l khc nhau tng i mt. Mun s dng lp tp hp, phi c ch th u tp:
#include<set.h> // Th vin ring ca lp tp hp // Th vin chung cho cc lp vt cha
hoc:
#include<stl.h>
7.2.1 Hm khi to
Lp tp hp c ba kiu khi to chnh: Khi to khng tham s:
Set<T> Tn_i_tng;
Trong : V d:
Set<int> mySet;
T: l tn kiu ca cc phn t ca tp hp. Kiu ny c th l kiu c bn ca C++, cng c th l cc kiu cu trc (struct) hoc lp (class) do ngi dng t nh ngha.
l khai bo mt i tng mySet ca lp tp hp, mySet khi u cha c phn t no, cc phn t ca i tng ny c kiu c bn int. Hoc:
Person *myPerson = new Person[10]; Set<Person> mySet(myPerson, 10); // Khi to mng i tng // Khai bo tp hp
l khai bo mt i tng mySet ca lp tp hp, c 10 phn t tng ng vi cc phn t trong mng ng myPerson, cc phn t c kiu lp Person.
7.2.2 Ton t
Cc ton t trn lp tp hp l tng ng vi cc ton t s hc trn tp hp thng thng: OR |, AND &, XOR ^ v php tr -.
Php ton | v |=
Php ton ny tr v php hp (OR) ca hai i tng ca lp tp hp, kt qu cng l mt i tng ca lp tp hp:
<i_tng_1> = <i_tng_2> | <i_tng_3>; <i_tng_1> |= <i_tng_2>;
V d, mySet1 cha hai phn t kiu int {1,2}, mySet2 cha ba phn t kiu int {2,3,4}, v:
mySet3 = mySet1 | mySet2;
155
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;
Php ton ^ v ^=
Php ton ny tr v php hp ngoi (XOR) gia hai i tng tp hp, kt qu cng l mt i tng tp hp:
<i_tng_1> = <i_tng _2> <i_tng_1> ^= <i_tng_2>; ^ <i_tng_3>;
V d, mySet1 cha hai phn t kiu int {1,2}, mySet2 cha ba phn t kiu int {2,3,4}, v:
mySet3 = mySet1 ^ mySet2;
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;
Thm mt phn t vo tp hp
C hai c php thm mt phn t vo tp hp:
pair<iterator, bool> insert(T&); iterator insert(<V tr con chy>, T&);
Trong :
156
Phng thc th nht thm mt phn t vo tp hp, nu phn t c mt trong tp hp, tr v false v v tr con chy ca phn t . Nu phn t cha tn ti, tr v true v v tr con chy ca phn t mi thm vo. Phng thc th hai cng thm vo mt phn t, nhng ch kim tra xem phn t tn ti hay cha bt u t v tr con chy c ch ra trong bin <v tr con chy>. Phng thc ny tr v v tr con chy ca phn t mi thm vo (nu thnh cng) hoc v tr ca phn t c mt.
mySet.insert(10);
V d, mySet l mt tp hp kiu int: s thm mt phn t c gi tr 10 vo tp hp. Lu : Do tun th theo l thuyt tp hp, nn khi chn vo tp hp nhiu ln vi cng mt gi tr phn t. Trong tp hp ch tn ti duy nht mt gi tr phn t , khng c trng lp.
Trong : T: l tn kiu cc phn t ca tp hp. Phng thc th nht xo phn t c gi tr c ch r trong tham s u vo. Phng thc th hai loi b phn t v tr ca con chy c xc nh bi tham s u vo. Phng thc th ba loi b mt s phn t nm trong phm vi t <v tr bt u> cho n <v tr kt thc> ca con chy.
mySet.erase(10);
Trong :
157
Phng thc th nht tm phn t c gi tr xc nh bi tham s u vo, kt qu l v tr con chy ca phn t . Phng th th hai ch kim tra xem phn t c xut hin trong tp hp hay khng: tr v 1 nu c mt, tr v 0 nu khng c mt.
Set<int>::iterator index = mySet.find(10); cout << index;
7.2.4 p dng
Chng trnh 7.1 minh ho mt s thao tc trn mt tp hp cc phn t c kiu char: thm phn t, loi b phn t, duyt cc phn t. Chng trnh 7.1
#include<stdio.h> #include<conio.h> #include<set.h> void main(){ clrscr(); Set<char> mySet; int function; do{ clrscr(); cout << CAC CHUC NANG: << endl; cout << 1: Them mot phan tu vao tap hop << endl; cout << 2: Loai bo mot phan tu khoi tap hop << endl; cout << 3: Xem tat ca cac phan tu cua tap hop << endl; cout << 5: Thoat! << endl; cout << ===================================== << endl; cout << Chon chuc nang: << endl; cin >> function; switch(function){ case 1: char phantu; cout << Ki tu them vao: ; cin >> phantu; mySet.insert(phantu); break; case 2: char phantu; cout << Loai bo ki tu: << endl; cin >> phantu; // Loi ra // Thm vo
158
7.3 LP CHUI
Lp chui (String) cng l mt loi lp cha, n cha mt tp cc phn t l mt dy cc k t c phn bit th t, cc phn t khng nht thit phi phn bit nhau. Mun s dng lp String, cn thm vo ch th u tp:
#include <string.h>
7.3.1 Hm khi to
Lp String c ba hm khi to chnh: V d:
String myStr;
Hm khi to t mt mng cc k t:
String <tn bin>(char*, <chiu di mng>);
Trong trng hp khi to bng mt chui khc, ta c th truyn vo mt i s c kiu c bn khc, trnh bin dch s t ng chuyn i s sang dng string.
159
7.3.2 Ton t
Lp String c cc ton t c bn l: Php gn chui Php cng chui Php so snh chui Php vo/ra
Php gn chui =
C php php gn chui l tng t c php gn cc i tng c bn:
<Tn bin 1> = <Tn bin 2>;
V d:
String s1(12), s2; s2 = s1;
th chui s2 cng cha hai phn t nh s1 {1, 2}. Lu : C th gn trc tip cc i tng c bn cho chui:
String myStr = 12; String myStr = 12+1.5; // myStr c hai phn t {1, 2} // tng ng myStr = 13.5
V d:
String s1(12), s2(3); s1+= s2;
160
Lu : V d:
chui_1 == chui_2;
Php so snh khc (khng bng) !=: chui_1 != chui_2; Php so snh chui thc hin so snh m ASCII ca tng k t hai chui theo th t tng ng cho n khi c s khc nhau u tin gia hai k t. Php so snh l php so snh da trn t in, c phn bit ch hoa v ch thng.
12 < a; a <= A; // c gi tr ng // c gi tr sai
Php vo/ra
V d:
String s(hello!); cout << s;
Ly chiu di chui
C php:
<bin_chui>.length();
s in ra mn hnh di chui s l 6.
Tm mt chui con
C php:
<bin_chui>.find(<Chui con>, <V tr bt u>, <Kiu so khp>);
Trong :
161
V d:
Tham s th nht l chui con cn tm. Tham s th hai l v tr bt u tm, mc nh l bt u tm t phn t c ch s 0. Tham s th ba ch ra cch so khp c phn bit ch hoa vi ch thng: SM_IGNORE l khng phn bit, SM_SENSITIVE l c phn bit. Phng thc ny tr v kt qu dng bool, tng ng l c tm thy hay khng.
s.find(12, 0, SM_IGNORE);
s tm trong chui s xem c s xut hin ca chui 12 hay khng, v tr bt u tm l 0, vi cch tm khng phn bit ch hoa ch thng.
Trong : V d:
s.insert(0, 12);
Tham s th nht l v tr ch s m ti , chui con s c chn vo Tham s th hai l chui con cn chn, chui con ny cng c th l mt k t.
Xo mt chui con
C php:
<bin_chui>.delete(<v tr bt u>, < di chui xo>);
Trong : V d:
s.delete(0, 2);
s xo hai k t u ca chui s.
Chuyn kiu k t
V d:
s.toUpper(); s.toLower(); // chuyn chui s thnh k t hoa // chuyn chui s thnh k t thng
<bin_chui>.toUpper(); <bin_chui>.toLower();
162
7.3.4 p dng
Chng trnh 7.2 minh ho mt s thao tc c bn trn lp chui, c s dng th vin lp chui chun ca C++: cng thm mt chui, chn thm mt chui con, xo mt chui con, tm mt chui con Chng trnh 7.2
#include<stdio.h> #include<conio.h> #include<string.h> void main(){ clrscr(); String myStr; int function; do{ clrscr(); cout << CAC CHUC NANG: << endl; cout << 1: Cong them mot chuoi << endl; cout << 2: Chen them mot chuoi << endl; cout << 3: Xoa di mot chuoi << endl; cout << 4: Tim mot chuoi con << endl; cout << 5: Chuyen thanh chu hoa << endl; cout << 6: Chuyen thanh chu thuong << endl; cout << 7: Xem noi dung chuoi << endl; cout << 8: Xem chieu dai chuoi << endl; cout << 9: Thoat! << endl; cout << ===================================== << endl; cout << Chon chuc nang: << endl; cin >> function; switch(function){ case 1: String subStr; cout << Chuoi them vao: ; cin >> subStr; myStr += subStr; break; case 2: String subStr; int position; cout << Chuoi them vao: ; cin >> subStr; cout << Vi tri chen:; cin >> position; // Chn vo chui // Thm vo cui
163
164
Hm khi to
Lp Stack c hai cch khi to: Khi to khng tham s:
Stack<T> bin_ngn_xp;
Trong : V d:
Stack<int> myStack;
T: l kiu ca cc phn t cha trong ngn xp. T c th l cc kiu c bn, cng c th l cc kiu phc tp do ngi dng t nh ngha.
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 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);
165
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();
p dng
Trong phn ny, ta s vit li chng trnh 3.4c c minh ho trong phn vit v cu trc ngn xp (chng 3). Nhng thay v phi nh ngha cu trc ngn xp, ta dng lp ngn xp ca th vin C++: o ngc mt xu k t c nhp vo t bn phm. Chng trnh 7.3
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<stack.h> void main(){ clrscr(); Stack<char> myStack; char strIn[250]; cout << Nhap chuoi: ; cin >> strIn; // Nhp chui k t t bn phm // t vo ngn xp // Ly ra t ngn xp for(int i=0; i<strlen(strIn); i++) myStack.push(strIn[i]); while(!myStack.empty()) cout << myStack.pop(); return; }
7.4.2 Lp hng i
Lp hng i (queue) cng l mt loi lp vt cha, n cha cc phn t cng kiu, khng bt buc phi phn bit nhau nhng c phn bit v th t: cc thao tc thm phn t c thc hin mt u, cc thao tc ly phn t ra c thc hin mt u cn li ca hng i. Phn t no c thm vo trc th s b ly ra trc. Mun dng lp Queue phi dng ch th u tp:
#include<queue.h>
Hm khi to
Lp Queue c hai cch khi to:
166
Trong : V d:
Queue<int> myQueue;
T: l kiu ca cc phn t cha trong hng i. T c th l cc kiu c bn, cng c th l cc kiu phc tp do ngi dng t nh ngha.
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 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 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();
p dng
Trong phn ny, ta s ci t li chng trnh trong phn cu trc hng i (chung 3). Nhng thay v phi t nh ngha cu trc hng i, ta dng lp Queue ca th vin C++ m phng chng trnh qun l tin trnh ca h iu hnh.
167
168
hoc:
#include<stl.h>
7.5.1 Hm khi to
Lp List c ba kiu khi to: Khi to khng tham s:
List<T> bin_danh_sch;
Trong : V d:
List<int> myList;
T: l kiu ca cc phn t cha trong danh sch lin kt. T c th l cc kiu c bn, cng c th l cc kiu phc tp do ngi dng t nh ngha.
s tr v mt gi tr kiu bool, tng ng vi vic hai danh sch ny c bng nhau hay khng. Vic so snh c tin hnh trn tng phn t v tr tng ng nhau. Lu : Ngoi ra cn c cc php ton so snh khc cng c th thc hin trn danh sch: <, >, <=, >=, !=.
169
Trong : V d:
List<int> myList; myList.push_front(7);
Phng thc th nht chn mt phn t vo mt v tr bt k ca danh sch, v tr chn c ch ra bi tham s th nht. Phng thc th hai chn mt phn t vo u danh sch Phng thc th ba chn mt phn t vo cui danh sch.
Xo i mt phn t
C php:
<bin danh sch>.erase(<v tr xo>); <bin danh sch>.pop_front(); <bin danh sch>.pop_back();
Trong : V d:
List<int> myList; cout << myList.pop_front();
Phng thc th nht xa mt phn t mt v tr bt k ca danh sch, v tr xo c ch ra bi tham s th nht. Phng thc th hai xo mt phn t u danh sch Phng thc th ba xo mt phn t cui danh sch.
tr v gi tr bool, tng ng vi trng thi hin ti ca bin danh sch l rng hay khng.
V d: 170
Trong : V d:
List<int> myList; cout << myList.get();
Phng thc th nht tr v phn t v tr hin ti ca con chy Phng thc th hai tr v phn t tip theo, v con chy cng di chuyn sang phn t .
7.5.4 p dng
Trong phn ny, ta ci t li chng trnh 3.6c c trnh by trong phn cu trc danh sch lin kt (chng 3). Nhng thay v t to danh sch lin kt, ta dng lp List trong th vin ca C++ qun l nhn vin vn phng. Chng trnh 7.5
#include<stdio.h> #include<conio.h> #include<string.h> #include<list.h> typedef struct{ char name[25]; int age; float salary; } Employee; void main(){ clrscr(); List<Employee> myList; int function; do{ clrscr(); cout << CAC CHUC NANG: << endl; cout << 1: Them mot nhan vien << endl; cout << 2: Xoa mot nhan vien << endl; cout << 3: Xem tat ca cac nhan vien trong phong << endl; // Tn nhn vin // Tui nhn vin // Lng nhn vin
171
172
TNG KT CHNG 7
Ni dung chng 7 trnh by mt s lp c bn ca lp vt cha (Container) trong th vin ca C++: Lp tp hp (Set) Lp chui (String) Lp ngn xp (Stack) Lp hng i (Queue) Lp danh sch lin kt (List)
Hu ht cc lp vt cha ny u c th cha cc phn t vi kiu bt k: c th l kiu c bn, cng c th l kiu phc tp do ngi dng t nh ngha. Ngoi tr lp chui, ch cha cc phn t c kiu char. Cc lp vt cha ny c mt s phng thc tng t nhau, nhng cch thc hin li khc nhau: Thm vo mt phn t Ly ra mt phn t Kim tra tnh rng Kim tra s lng phn t.
Ngi dng c th p dng cc lp c sn trong th vin ny ca C++ gii quyt cc bi ton khc nhau m khng phi t nh ngha li cc lp.
CU HI V BI TP CHNG 7
1. Dng th vin lp stack kim tra mt s t nhin nhp vo t bn phm c phi l mt s parlindom hay khng: Mt s t nhin l parlindom nu i ngc th t cc ch s, ta vn thu c chnh s , v d, 87278 l mt s nh vy. 2. Vit li chng trnh 7.1 dng lp tp hp, nhng dng kiu ca cc phn t l lp Car c nh ngha trong chng 5. 3. Dng th vin lp String vit chng trnh chia nh mt chui ban u thnh mt s chui con, ranh gii phn chia l mt chui con c nhp vo t bn phm. V d abc acb, m chia nh theo chui con c s thu c cc chui: ab, ca, cb. 4. Dng th vin lp String vit chng trnh thay th cc chui con ca mt chui ban u bng mt chui con khc. Cc chui con c nhp t bn phm. 5. Vit li chng trnh 7.5 , vn dng th vin lp List, nhng thay th kiu phn t bng kiu lp Car c nh ngha trong chng 5.
173
Hng dn tr li cu hi v n tp
HNG DN TR LI CU HI V BI TP
Chng 1
Chng 2
1. c v e. 2. a v d. 3. c. 4. b. 5. c. 6. c. 7. d. 8. b v c. 9. b. 10. c. 11. d. 12. c. 13. d.
Chng 3
1. a. 2. c. 3. a. 4. b. 5. b v d. 6. Gi :
struct Subject{ char subject[20]; float note; };
Hoc:
typedef struct { char subject[20]; float note; }Subject;
7. Gi :
typedef struct { char name[20];
174
Hng dn tr li cu hi v n tp
int age; char class[20]; Subject* subjects; char type[20]; }Student;
Chng 4
1. a. 2. b. 3. c. 4. a. 5. a. 6. b. 7. c. 8. d. 9. a. 10. b. 11. c.
Chng 5
1. a v c. 2. b. 3. d. 4. a, b v c. 5. c. 6. b v c. 7. b v c. 8. b, d v e. 9. c v d. 10. a v d. 11. a, b, c v d. 12. Gi (t bi 12 n bi 17):
class Employee{ char* name; int age; float salary; public: Employee(); Employee(char* salaryIn=100); nameIn=, int ageIn=18, float
175
Hng dn tr li cu hi v n tp
void setName(char*); char* getName(); void setAge(int); int getAge(); void setSalary(float); float getSalary(); void show(); ~Employee(); };
Chng 6
1. b. 2. d. 3. c. 4. b, d v f. 5. b v d. 6. d. 7. a, b, c v d. 8. a v c. 9. d. 10. d. 11. b. 12. b. 13. c v d. 14. a, b, c v d. 15. c v d. 16. b v c. 17. Gi (t bi 17 n bi 25):
class Human{ char* name; int age; int sex; public: Human(); Human(char*, int, int); void setName(char*); char* getName(); void setAge(int); int getAge(); void setSex(int);
176
Hng dn tr li cu hi v n tp
int getSex(); void show(); ~Human(); }; class Person: public virtual Human{ char* address; char* phone; public: Person(); Person(char*, int, int, char*, char*); void setAddress(char*); char* getAddress(); void setPhone(char*); char* getPhone(); void show(); ~Person(); }; class Worker: public virtual Human{ int hour; float salary; public: Worker(); Worker(int, float); void setHour(int); int getHour(); void setSalary(float); float getSalary(); void show(); }; class Employee: public Person, public Worker{ char* position; public: Employee(); Employee(char*, char*); void setPosition(char*); char* getPosition(); void virtual show(); ~Employee(); }; int, int, char*, char*, int, float,
Chng 7
2. Gi
177
Hng dn tr li cu hi v n tp
void main(){ clrscr(); Set<Car> mySet; int function; do{ clrscr(); cout << CAC CHUC NANG: << endl; cout << 1: Them mot phan tu vao tap hop << endl; cout << 2: Loai bo mot phan tu khoi tap hop << endl; cout << 3: Xem tat ca cac phan tu cua tap hop << endl; cout << 5: Thoat! << endl; cout << =========================================== << endl; cout << Chon chuc nang: << endl; cin >> function; switch(function){ case 1: Car car = new Car(); cout << O to them vao: << endl; cout << Toc do: ; int speed; cin >> speed; car.setSpeed(speed); cout << Nhan hieu:; char[] mark; cin >> mark; car.setMark(mark); float price; cout << Gia xe:; cin >> price; car.setPrice(price); mySet.insert(car); break; case 2: // Loi ra Set<Car>::iterator index; cout << Loai bo xe o vi tri: ; cin >> index; if(index >= mySet.begin())&&(index < mySet.end()) mySet.erase(mySet[index]); break; case 3: // Duyt cout<<Cac phan tu cua tap hop la:<<endl; Set<char>::iterator i; for(i=mySet.begin(); i<mySet.end(); i++){ cout << mySet[i].getSpeed() << ; cout << mySet[i].getMark() << ; cout << mySet[i].getPrice() << ; } // Thm vo
178
Hng dn tr li cu hi v n tp
break; }while(function != 5); return; }
5. Gi
void main(){ clrscr(); List<Car> myList; int function; do{ clrscr(); cout << CAC CHUC NANG: << endl; cout << 1: Them mot xe o to << endl; cout << 2: Xoa mot xe o to << endl; cout << 3: Xem tat ca cac o to << endl; cout << 5: Thoat! << endl; cout << ======================================= << endl; cout << Chon chuc nang: << endl; cin >> function; switch(function){ case 1: int possition; Car car = new Car(); cout << Vi tri can chen: ; cin >> possition; cout << Toc do: ; int speed; cin >> speed; car.setSpeed(speed); cout << Nhan hieu:; char[] mark; cin >> mark; car.setMark(mark); float price; cout << Gia xe:; cin >> price; car.setPrice(price); myList.insert(possition, car); break; case 2: int possition; cout << Vi tri can xoa: ; cin >> possition; Car result = myList.erase(possition); if(result != NULL){ cout << O to bi loai: endl; cout<<Toc do:<<result.getSpeed()<<endl; // Ly ra khi ds // Thm vo ds
179
Hng dn tr li cu hi v n tp
cout << Nhan hieu: << result.getMark() << endl; cout<<Gia: <<result.getPrice()<<endl; } break; case 3: // Duyt ds cout << Cac o to hien co: << endl; Car result = myList.front(); do{ cout << result.getSpeed() << << result.getMark() << << result.getPrice() << endl; result = myList.next(); }while(result != NULL); break; }while(function != 5); return; }
180
Cc a ch web
1. 2. 3. 4. 5. http://www.angelfire.com/country/aldev0/cpphowto/ http://www.gnacademy.org/text/cc/Tutorial/tutorial.html http://sophia.dtp.fmph.uniba.sk/cpptut/tutorial.us.html http://www.brpreiss.com/books/opus4/html/book.html http://www.fredosaurus.com/notes-cpp/index.html
181
Mc lc
MC LC
GII THIU .....................................................................................................................................3 CHNG 1.......................................................................................................................................5 GII THIU V CC PHNG PHP LP TRNH ...................................................................5 1.1 LP TRNH TUYN TNH...................................................................................................5 1.2 LP TRNH HNG CU TRC .......................................................................................5 1.2.1 c trng ca lp trnh hng cu trc............................................................................5 1.2.2 Phng php thit k trn xung (top-down) ..................................................................6 1.3 LP TRNH HNG I TNG .....................................................................................7 1.3.1 Lp trnh hng i tng ...............................................................................................7 1.3.2 Mt s khi nim c bn..................................................................................................8 1.3.3 Lp trnh hng i tng trong C++ .............................................................................9 TNG KT CHNG 1............................................................................................................10 CHNG 2.....................................................................................................................................11 CON TR V MNG ...................................................................................................................11 2.1 KHI NIM CON TR .......................................................................................................11 2.1.1 Khai bo con tr.............................................................................................................11 2.1.2 S dng con tr ..............................................................................................................11 2.2 CON TR V MNG .........................................................................................................14 2.2.1 Con tr v mng mt chiu ............................................................................................14 2.2.2 Con tr v mng nhiu chiu .........................................................................................17 2.3 CON TR HM...................................................................................................................18 2.4 CP PHT B NH NG...............................................................................................20 2.4.1 Cp pht b nh ng cho bin .....................................................................................21 2.4.2 Cp pht b nh cho mng ng mt chiu...................................................................22 2.4.3 Cp pht b nh cho mng ng nhiu chiu ................................................................23 TNG KT CHNG 2............................................................................................................25 CU HI V BI TP CHNG 2........................................................................................26 CHNG 3.....................................................................................................................................30 KIU D LIU CU TRC .........................................................................................................30 3.1 NH NGHA CU TRC..................................................................................................30 3.1.1 Khai bo cu trc ...........................................................................................................30 3.1.2 Cu trc lng nhau .........................................................................................................31 3.1.3 nh ngha cu trc vi t kho typedef........................................................................32 3.2 THAO TC TRN CU TRC ..........................................................................................33 3.2.1 Khi to gi tr ban u cho cu trc .............................................................................33 3.2.2 Truy nhp n thuc tnh ca cu trc...........................................................................34 3.3 CON TR CU TRC V MNG CU TRC ...............................................................38 3.3.1 Con tr cu trc..............................................................................................................38 3.3.2 Mng cu trc ................................................................................................................41 3.4 MT S KIU D LIU TRU TNG.........................................................................44 3.4.1 Ngn xp ........................................................................................................................45 3.4.2 Hng i.........................................................................................................................48 3.4.3 Danh sch lin kt..........................................................................................................53 TNG KT CHNG 3............................................................................................................60 CU HI V BI TP CHNG 3........................................................................................60 CHNG 4.....................................................................................................................................64
182
Mc lc
VO RA TRN TP ..................................................................................................................... 64 4.1 KHI NIM TP................................................................................................................. 64 4.1.1 Tp d liu .................................................................................................................... 64 4.1.2 Tp vn bn................................................................................................................... 65 4.1.3 Tp nh phn.................................................................................................................. 65 4.2 VO RA TRN TP ........................................................................................................... 66 4.2.1 Vo ra tp vn bn bng >> v <<......................................................................... 66 4.2.2 Vo ra tp nh phn bng read v write......................................................................... 70 4.3 TRUY NHP TP TRC TIP.......................................................................................... 74 4.3.1 Con tr tp tin ............................................................................................................... 74 4.3.2 Truy nhp v tr hin ti ca con tr tp ........................................................................ 74 4.3.3 Dch chuyn con tr tp ................................................................................................ 76 TNG KT CHNG 4........................................................................................................... 78 CU HI V BI TP CHNG 4....................................................................................... 79 CHNG 5.................................................................................................................................... 82 LP ................................................................................................................................................ 82 5.1 KHI NIM LP I TNG......................................................................................... 82 5.1.1 nh ngha lp i tng .............................................................................................. 82 5.1.2 S dng lp i tng................................................................................................... 83 5.2 CC THNH PHN CA LP......................................................................................... 83 5.2.1 Thuc tnh ca lp ........................................................................................................ 84 5.2.2 Phng thc ca lp ..................................................................................................... 85 5.3 PHM VI TRUY NHP LP............................................................................................. 90 5.3.1 Phm vi truy nhp lp ................................................................................................... 90 5.3.2 Hm bn ........................................................................................................................ 91 5.3.3 Lp bn ......................................................................................................................... 96 5.4 HM KHI TO V HU B ......................................................................................... 97 5.4.1 Hm khi to................................................................................................................. 97 5.4.2 Hm hy b................................................................................................................. 101 5.5 CON TR I TNG V MNG I TNG........................................................ 103 5.5.1 Con tr i tng ........................................................................................................ 103 5.5.2 Mng cc i tng..................................................................................................... 106 TNG KT CHNG 5......................................................................................................... 110 CU HI V BI TP CHNG 5..................................................................................... 110 CHNG 6.................................................................................................................................. 115 TNH K THA V A HNH ................................................................................................. 115 6.1 KHI NIM K THA .................................................................................................... 115 6.1.1 Khai bo tha k ......................................................................................................... 115 6.1.2 Tnh cht dn xut....................................................................................................... 116 6.2 HM KHI TO V HU B TRONG K THA ...................................................... 117 6.2.1 Hm khi to trong k tha......................................................................................... 117 6.2.2 Hm hy b trong k tha........................................................................................... 119 6.3 TRUY NHP TI CC THNH PHN TRONG K THA LP ............................... 120 6.3.1 Phm vi truy nhp ....................................................................................................... 120 6.3.2 S dng cc thnh phn ca lp c s t lp dn xut ............................................... 122 6.3.3 nh ngha chng cc phng thc ca lp c s ...................................................... 125 6.3.4 Chuyn i kiu gia lp c s v lp dn xut......................................................... 128 6.4 A K THA ................................................................................................................... 131 6.4.1 Khai bo a k tha..................................................................................................... 131 6.4.2 Hm khi to v hm hu b trong a k tha ........................................................... 132 6.4.3 Truy nhp cc thnh phn lp trong a k tha .......................................................... 134 183
Mc lc
6.5 LP C S TRU TNG .............................................................................................138 6.5.1 t vn ....................................................................................................................138 6.5.2 Khai bo lp c s tru tng .....................................................................................138 6.5.3 Hm khi to lp c s tru tng..............................................................................139 6.6 A HNH ............................................................................................................................143 6.6.1 t vn ....................................................................................................................143 6.6.2 Khai bo phng thc tru tng................................................................................144 6.6.3 S dng phng thc tru tng a hnh .................................................................144 TNG KT CHNG 6..........................................................................................................147 CU HI V BI TP CHNG 6......................................................................................148 CHNG 7...................................................................................................................................153 MT S LP QUAN TRNG ....................................................................................................153 7.1 LP VT CHA ...............................................................................................................153 7.1.1 Giao din ca lp Container ........................................................................................153 7.1.2 Con chy Iterator..........................................................................................................154 7.2 LP TP HP....................................................................................................................155 7.2.1 Hm khi to................................................................................................................155 7.2.2 Ton t .........................................................................................................................155 7.2.3 Phng thc .................................................................................................................156 7.2.4 p dng........................................................................................................................158 7.3 LP CHUI .......................................................................................................................159 7.3.1 Hm khi to................................................................................................................159 7.3.2 Ton t .........................................................................................................................160 7.3.3 Phng thc .................................................................................................................161 7.3.4 p dng........................................................................................................................163 7.4 LP NGN XP V HNG I.....................................................................................165 7.4.1 Lp ngn xp ...............................................................................................................165 7.4.2 Lp hng i ................................................................................................................166 7.5 LP DANH SCH LIN KT ..........................................................................................169 7.5.1 Hm khi to................................................................................................................169 7.5.2 Ton t .........................................................................................................................169 7.5.3 Phng thc .................................................................................................................170 7.5.4 p dng........................................................................................................................171 TNG KT CHNG 7..........................................................................................................173 CU HI V BI TP CHNG 7......................................................................................173 HNG DN TR LI CU HI V BI TP .................................................................174 Chng 1...............................................................................................................................174 Chng 2...............................................................................................................................174 Chng 3...............................................................................................................................174 Chng 4...............................................................................................................................175 Chng 5...............................................................................................................................175 Chng 6...............................................................................................................................176 Chng 7...............................................................................................................................177 TI LIU THAM KHO.........................................................................................................181 MC LC.................................................................................................................................182
184