Ngon Ngu Lap Trinh C++

  • Upload
    ak-gold

  • View
    53

  • Download
    1

Embed Size (px)

DESCRIPTION

Bai giang C++

Citation preview

  • HC VIN CNG NGH BU CHNH VIN THNG

    NGN NG LP TRNH C++

    (Dng cho sinh vin h o to i hc t xa)

    Lu hnh ni b

    H NI - 2006

  • NGN NG LP TRNH C++

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

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

  • 2

  • 3

    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++.

    Ni dung ti liu c t chc thnh 7 chng:

    Chng 1: Gii thiu tng quan v cc phng php lp trnh Trnh by cc phng php lp trnh tuyn tnh, lp trnh cu trc v c bit, lm quen vi cc khi nim trong lp trnh hng i tng.

    Chng 2: Con tr v mng Trnh by cch khai bo v s dng cc kiu con tr v mng trong ngn ng C++.

    Chng 3: Kiu d liu c cu trc Trnh by cch biu din v ci t mt s kiu cu trc d liu tru tng trong C++. Sau , trnh by cch p dng cc kiu d liu ny trong cc ng dng c th.

    Chng 4: Vo ra trn tp Trnh by cc thao tc c, ghi d liu trn cc tp tin khc nhau: tp tin vn bn v tp tin nh phn. Trnh by cc cch truy nhp tp tin trc tip.

    Chng 5: Lp i tng Trnh by cc khi nim m u cho lp trnh hng i tng trong C++, bao gm cch khai bo v s dng lp, cc thuc tnh ca lp; cch khi to v hu b i tng, cc quy tc truy nhp n cc thnh phn ca lp.

    Chng 6: Tnh k tha v tng ng bi Trnh by cch thc k tha gia cc lp trong C++, cc nguyn tc truy nhp trong k tha, nh ngha np chng cc phng thc v tnh a hnh trong lp trnh hng i tng vi C++.

    Chng 7: Mt s lp quan trng Trnh by cch s dng mt s lp c sn trong th vin chun ca C++, bao gm cc lp: lp tp hp, lp chui, lp ngn xp, lp hng i v lp danh sch lin kt.

    c c cun sch ny, sinh vin phi quen bit cc khi nim c bn v lp trnh, c mt s k nng lp trnh vi ngn ng C hoc C++. Cun sch ny cng c th dng ti liu tham kho cho nhng sinh vin mun tm hiu cc k thut lp trnh nng cao v lp trnh hng i tng

  • 4

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

  • Chng 1: Gii thiu v cc phng php lp trnh

    5

    CHNG 1

    GII THIU V CC PHNG PHP LP TRNH Ni dung ca chng ny tp trung trnh by cc phng php lp trnh:

    Phng php lp trnh tuyn tnh Phng php lp trnh hng cu trc Phng php lp trnh hng i tng.

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

    c trng

    Lp trnh tuyn tnh c hai c trng:

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

    trong lung .

    Tnh cht

    u im: Do tnh n gin, lp trnh tuyn tnh c ng dng cho cc chng trnh n gin v c u im d hiu.

    Nhc im: Vi cc ng dng phc tp, ngi ta khng th dng lp trnh tuyn tnh gii quyt.

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

    1.2 LP TRNH HNG CU TRC

    1.2.1 c trng ca lp trnh hng cu trc

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

    c trng

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

  • Chng 1: Gii thiu v cc phng php lp trnh

    6

    Chng trnh = Cu trc d liu + Gii thut Trong :

    Cu trc d liu l cch t chc d liu cho vic x l bi mt hay nhiu chng trnh no .

    Gii thut l mt quy trnh thc hin mt cng vic xc nh Trong chng trnh, gii thut c quan h ph thuc vo cu trc d liu:

    Mt cu trc d liu ch ph hp vi mt s hn ch cc gii thut. Nu thay i cu trc d liu th phi thay i gii thut cho ph hp. Mt gii thut thng phi i km vi mt cu trc d liu nht nh.

    Tnh cht

    Mi chng trnh con c th c gi thc hin nhiu ln trong mt chng trnh chnh. Cc chng trnh con c th c gi n thc hin theo mt th t bt k, tu thuc

    vo gii thut trong chng trnh chnh m khng ph thuc vo th t khai bo ca cc chng trnh con.

    Cc ngn ng lp trnh cu trc cung cp mt s cu trc lnh iu khin chng trnh. u im

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

    Nhc im

    Lp trnh cu trc khng h tr mnh vic s dng li m ngun: Gii thut lun ph thuc cht ch vo cu trc d liu, do , khi thay i cu trc d liu, phi thay i gii thut, ngha l phi vit li chng trnh.

    Khng ph hp vi cc phn mm ln: t duy cu trc vi cc gii thut ch ph hp vi cc bi ton nh, nm trong phm vi mt modul ca chng trnh. Vi d n phn mm ln, lp trnh cu trc t ra khng hiu qu trong vic gii quyt mi quan h v m gia cc modul ca phn mm.

    Vn

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

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

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

  • Chng 1: Gii thiu v cc phng php lp trnh

    7

    na. Ngha l khi mi bi ton con u c th gii quyt bng mt chng trnh con vi mt gii thut n gin. V d, s dng phng php top-down gii quyt bi ton xy mt cn nh mi. Chng ta c th phn r bi ton theo cc bc nh sau:

    mc th nht, chia bi ton xy nh thnh cc bi ton nh hn nh lm mng, ct, trn, xy tng, lp mi.

    mc th hai, phn r cc cng vic mc th nht nh vic lm mng nh c th phn r tip thnh cc cng vic o mng, gia c nn, lm khung st, b tong; cng vic ct c phn r thnh

    mc th ba, phn r cc cng vic ca mc th hai nh vic o mng c th phn chia tip thnh cc cng vic nh o c, cm mc, chng dy, o v kim tra mng. Vic gia c nn c phn r thnh

    Qu trnh phn r c th dng mc ny, bi v cc cng vic con thu c nh o c, cm mc, chng dy, o c th thc hin c ngay, khng cn chia nh thm na. Lu :

    Cng s dng phng php top-down vi cng mt bi ton, nhng c th cho ra nhiu kt qu khc nhau. Nguyn nhn l do s khc nhau trong tiu ch phn r mt bi ton thnh cc bi ton con.

    V d, vn p dng phng php top-down gii quyt bi ton xy nh, nhng nu s dng mt cch khc phn chia bi ton, ta c th thu c kt qu khc bit so vi phng php ban u:

    mc th nht, chia bi ton xy nh thnh cc bi ton nh hn nh lm phn g, lm phn st, lm phn b tng v lm phn gch.

    mc th hai, phn r cc cng vic mc th nht l lm phn g c th chia thnh cc cng vic nh x g, gia cng g, to khung, lp vo nh. Vic lm st c th chia nh thnh

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

    1.3 LP TRNH HNG I TNG

    1.3.1 Lp trnh hng i tng

    Trong lp trnh hng i tng:

    Ngi ta coi cc thc th trong chng trnh l cc i tng v sau tru tng ho i tng thnh lp i tng.

    D liu c t chc thnh cc thuc tnh ca lp. Ngui ta ngn chn vic thay i tu tin d liu trong chng trnh bng cc cch gii hn truy nhp nh ch cho php truy nhp d liu thng qua i tng, thng qua cc phng thc m i tng c cung cp

    Quan h gia cc i tng l quan h ngang hng hoc quan h k tha: Nu lp B k tha t lp A th A c gi l lp c s v B c gi l lp dn xut.

  • Chng 1: Gii thiu v cc phng php lp trnh

    8

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

    c trng

    Lp trnh hng i tng c hai c trng c bn:

    ng gi d liu: d liu lun c t chc thnh cc thuc tnh ca lp i tng. Vic truy nhp n d liu phi thng qua cc phng thc ca i tng lp.

    S dng li m ngun: vic s dng li m ngun c th hin thng qua c ch k tha. C ch ny cho php cc lp i tng c th k tha t cc lp i tng khc. Khi , trong cc lp dn xut, c th s dng cc phng thc (m ngun) ca cc lp c s m khng cn phi nh ngha li.

    u im

    Lp trnh hng i tng c mt s u im ni bt:

    Khng cn nguy c d liu b thay i t do trong chng trnh. V d liu c ng gi vo cc i tng. Nu mun truy nhp vo d liu phi thng qua cc phng thc c cho php ca i tng.

    Khi thay i cu trc d liu ca mt i tng, khng cn thay i m ngun ca cc i tng khc, m ch cn thay i mt s thnh phn ca i tng dn xut. iu ny hn ch s nh hng xu ca vic thay i d liu n cc i tng khc trong chng trnh.

    C th s dng li m ngun, tit kim ti nguyn, chi ph thi gian. V nguyn tc k tha cho php cc lp dn xut s dng cc phng thc t lp c s nh nhng phng thc ca chnh n, m khng cn thit phi nh ngha li.

    Ph hp vi cc d n phn mm ln, phc tp.

    1.3.2 Mt s khi nim c bn

    Trong mc ny, chng ta s lm quen vi mt s khi nim c bn trong lp trnh hng i tng. Bao gm:

    Khi nim i tng (object) Khi nim ng gi d liu (encapsulation) Khi nim k tha (inheritance) Khi nim a hnh (polymorphism)

    i tng (Object)

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

    i tng = d liu + phng thc

  • Chng 1: Gii thiu v cc phng php lp trnh

    9

    Lp (Class)

    Khi c nhiu i tng ging nhau v mt d liu v phng thc, chng c nhm li vi nhau v gi chung l lp:

    Lp l s tru tng ho ca i tng i tng l mt th hin ca lp.

    ng gi d liu (Encapsulation)

    Cc d liu c ng gi vo trong i tng. Mi d liu c mt phm vi truy nhp ring.

    Khng th truy nhp n d liu mt cch t do nh lp trnh cu trc Mun truy nhp n cc d liu c bo v, phi thng qua cc i tng, ngha l

    phi s dng cc phng thc m i tng cung cp mi c th truy nhp n d liu ca i tng .

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

    K tha (Inheritance)

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

    a hnh (Polymorphsim)

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

    1.3.3 Lp trnh hng i tng trong C++

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

    Nhng c trng hng i tng ca C++

    Cho php nh ngha lp i tng. Cho php ng gi d liu vo cc lp i tng. Cho php nh ngha phm vi truy nhp

    d liu ca lp bng cc t kho phm vi: public, protected, private.

  • Chng 1: Gii thiu v cc phng php lp trnh

    10

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

    Nhng hn ch hng i tng ca C++

    Nhng hn ch ny l do C++ c pht trin t mt ngn ng lp trnh thun cu trc C.

    Cho php nh ngha v s dng cc bin d liu t do. Cho php nh ngha v s dng cc hm t do. Ngay c khi d liu c ng gi vo lp, d liu vn c th truy nhp trc tip nh d

    liu t do bi cc hm bn, lp bn (friend) trong C++.

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

    Lp trnh tuyn tnh Lp trnh hng cu trc Lp trnh hng i tng.

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

  • Chng 2: Con tr v mng

    11

    CHNG 2

    CON TR V MNG Ni dung ca chng ny tp trung trnh by cc vn c bn lin quan n cc thao tc trn kiu d liu con tr v mng trong C++:

    Khi nim con tr, cch khai bo v s dng con tr. Mi quan h gia con tr v mng Con tr hm Cp pht b nh cho con tr

    2.1 KHI NIM CON TR

    2.1.1 Khai bo con tr

    Con tr l mt bin c bit cha a ch ca mt bin khc. Con tr c cng kiu d liu vi kiu d liu ca bin m n tr ti. C php khai bo mt con tr nh sau:

    *; Trong :

    Kiu d liu: C th l cc kiu d liu c bn ca C++, hoc l kiu d liu c cu trc, hoc l kiu i tng do ngi dng t nh ngha.

    Tn con tr: Tun theo qui tc t tn bin ca C++: - Ch c bt u bng mt k t (ch), hoc du gch di _. - Bt u t k t th hai, c th c kiu k t s. - Khng c du trng (space bar) trong tn bin. - C phn bit ch hoa v ch thng. - Khng gii hn di tn bin.

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

    Lu

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

    int *pointerInt; int* pointerInt;

    Cc cch khai bo con tr nh sau l sai c php: *int pointerInt; // Khai bo sai con tr int pointerInt*; // Khai bo sai con tr

    2.1.2 S dng con tr

    Con tr c s dng theo hai cch:

  • Chng 2: Con tr v mng

    12

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

    Dng con tr lu a ch ca bin

    Bn thn con tr s c tr vo a ch ca mt bin c cng kiu d liu vi n. C php ca php gn nh sau:

    = &; Lu

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

    int x, *px; px = &x;

    s cho con tr px c kiu int tr vo a ch ca bin x c kiu nguyn. Php ton & 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: *;

    Lu

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

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

    Qu trnh din ra nh sau:

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

    Php gn gia cc con tr

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

    Lu

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

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

    px = &y; x = 12 y = 0 px

    px = x; x = 12 y=x =12 px

  • Chng 2: Con tr v mng

    13

    Hai con tr phi cng kiu. Trong trng hp hai con tr khc kiu, phi s dng cc phng thc p kiu tng t nh trong php gn cc bin thng thng c kiu khc nhau.

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

    con tr py cng tr vo a ch ca bin x nh con tr px. Khi *py cng c gi tr 12 ging nh *px v l gi tr ca bin x. Chng trnh 2.1 minh ho vic dng con tr gia cc bin ca mt chng trnh C++.

    Chng trnh 2.1 #include #include void main(void){ int x = 12, *px, *py; cout

  • Chng 2: Con tr v mng

    14

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

    2.2 CON TR V MNG

    2.2.1 Con tr v mng mt chiu

    Mng mt chiu

    Trong C++, tn mt mng c coi l mt kiu con tr hng, c nh v ti mt vng nh xc nh v a ch ca tn mng trng vi a ch ca phn t u tin ca mng. V d khai bo:

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

    A = &A[0];

    Quan h gia con tr v mng

    V tn ca mng c coi nh mt con tr hng, nn n c th c gn cho mt con tr c cng kiu. V d khai bo:

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

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

    pa = A; pa = &A[0];

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

    Php ton trn con tr v mng

    Khi mt con tr tr n mng, th cc php ton tng hay gim trn con tr s tng ng vi php dch chuyn trn mng. V d khai bo:

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

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

    int *pa = A;

    pa

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

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

  • Chng 2: Con tr v mng

    15

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

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

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

    Lu :

    Hai php ton pa++ v *pa++ c tc dng hon ton khc nhau trn mng, pa++ l thao tc trn con tr, tc l trn b nh, n s a con tr pa tr n a ch ca phn t tip theo ca mng. *pa++ l php ton trn gi tr, n tng gi tr hin ti ca phn t mng ln mt n v. V d:

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

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

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

    int *pa = &A[2];

    pa

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

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

    pa = pa + 1;

    pa

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

    pa = pa - 2;

    pa

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

  • Chng 2: Con tr v mng

    16

    Trong trng hp:

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

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

    V mng A l con tr hng, cho nn khng th thc hin cc php ton trn A m ch c

    th thc hin trn cc con tr tr n A: cc php ton pa++ hoc pa--l hp l, nhng cc php ton A++ hoc A--l khng hp l.

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

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

    int *pa = &A[2];

    pa

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

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

    pa ++;

    pa

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

    pa = &A[0];

    pa

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

    null

    pa --;

    pa

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

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

    int *pa = &A[2];

    pa

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

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

    pa ++;

    pa

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

    Nhng *pa ++;

    pa

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

  • Chng 2: Con tr v mng

    17

    Chng trnh 2.2a void SortArray(int A[], int n){ int temp; for(int i=0; i

  • Chng 2: Con tr v mng

    18

    Khi , a ch ca ma trn A chnh l a ch ca hng u tin ca ma trn A, v cng l a ch ca phn t u tin ca hng u tin ca ma trn A:

    a ch ca ma trn A: A = A[0] = *(A+0) = &A[0][0]; a ch ca hng th nht: A[1] = *(A+1) = &A[1][0]; a ch ca hng th i: A[i] = *(A+i) = &A[i][0]; a ch phn t &A[i][j] = (*(A+i)) + j; Gi tr phn t A[i][j] = *((*(A+i)) + j);

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

    c th thay th bng: int (*A)[3];

    Con tr tr ti con tr

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

    int A[3][3]; int (*A)[3]; int **A;

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

    Khai bo con tr hm

    Con tr hm c khai bo tng t nh khai bo nguyn mu hm thng thng trong C++, ngoi tr vic c thm k hiu con tr * trc tn hm. C php khai bo con tr hm nh sau:

    (*)([]); Trong :

    Kiu d liu tr v: l cc kiu d liu thng thng ca C++ hoc kiu do ngi dng t nh ngha.

    Tn hm: tn do ngi dng t nh ngha, tun th theo quy tc t tn bin trong C++. Cc tham s: c th c hoc khng (phn trong du [] l tu chn). Nu c nhiu tham

    s, mi tham s c phn cch nhau bi du phy. V d khai bo:

    int (*Calcul)(int a, int b); l khai bo mt con tr hm, tn l Calcul, c kiu int v c hai tham s cng l kiu int. Lu :

  • Chng 2: Con tr v mng

    19

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

    // Khai bo mt con tr hm int (*Calcul)(int a, int b); // Khai bo mt hm tr v kiu con tr int *Calcul(int a, int b);

    S dng con tr hm

    Con tr hm c dng khi cn gi mt hm nh l tham s ca mt hm khc. Khi , mt hm c gi phi c khun mu ging vi con tr hm c khai bo. V d, vi khai bo:

    int (*Calcul)(int a, int b); th c th gi cc hm c hai tham s kiu int v tr v cng kiu int nh sau:

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

    nhng khng c gi cc hm khc kiu tham s hoc kiu tr v nh sau: int add(float a, int b); int add(int a); char* sub(char* a, char* b);

    Chng trnh 2.3 minh ho vic khai bo v s dng con tr hm.

    Chng trnh 2.3 #include #include // 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 input;

  • Chng 2: Con tr v mng

    20

    char reply; cout > reply; if(reply == l) // Hin th theo dng lowercase Display(str, tolower); else // Hin th theo dng uppercase Display(str, toupper); return;

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

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

    int tolower(int c); int toupper(int c);

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

    2.4 CP PHT B NH NG Xt hai trng hp sau y:

    Trng hp 1, khai bo mt con tr v gn gi tr cho n: int *pa = 12;

    Trng hp 2, khai bo con tr n phn t cui cng ca mng ri tng thm mt n v cho n:

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

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

  • Chng 2: Con tr v mng

    21

    2.4.1 Cp pht b nh ng cho bin

    Cp pht b nh ng

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

    = new ; V d, khai bo:

    int *pa; pa = new int;

    s cp pht b nh hp l cho con tr pa. Lu :

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

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

    Gii phng b nh ng

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

    delete ; V d:

    int *pa = new int(12); // Khai bo con tr pa, cp pht b nh // v gn gi tr ban u cho pa l 12.

    delete pa; // Gii phng vng nh va cp cho pa. Lu :

    Mt con tr, sau khi b gii phng a ch, vn c th c cp pht mt vng nh mi hoc tr n mt a ch mi:

    int *pa = new int(12); // Khai bo con tr pa, cp pht b nh // v gn gi tr ban u cho pa l 12.

    delete pa; // Gii phng vng nh va cp cho pa. int A[5] = {5, 10, 15, 20, 25}; pa = A; // Cho pa tr n a ch ca mng A

    Nu c nhiu con tr cng tr vo mt a ch, th ch cn gii phng b nh ca mt con tr, tt c cc con tr cn li cng b gii phng b nh:

    int *pa = new int(12); // *pa = 12 int *pb = pa; // pb tr n cng a ch pa. *pb += 5; // *pa = *pb = 17 delete pa; // Gii phng c pa ln pb

  • Chng 2: Con tr v mng

    22

    Mt con tr sau khi cp pht b nh ng bng thao tc new, cn phi phng b nh trc khi tr n mt a ch mi hoc cp pht b nh mi:

    int *pa = new int(12); // pa c cp b nh v *pa = 12 *pa = new int(15); // pa tr n a ch khc v *pa = 15. // a ch c ca pa vn b coi l bn

    2.4.2 Cp pht b nh cho mng ng mt chiu

    Cp pht b nh cho mng ng mt chiu

    Mng mt chiu c coi l tng ng vi mt con tr cng kiu. Tuy nhin, c php cp pht b nh cho mng ng mt chiu l khc vi c php cp pht b nh cho con tr thng thng:

    = new []; Trong :

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

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

    s khai bo mt mng A c 5 phn t kiu int c cp pht b nh ng. Lu :

    Khi cp pht b nh cho con tr c khi to thng thng, ta dng du (), khi cp pht b nh cho mng, ta dng du []. Hai lnh cp pht sau l hon ton khc nhau:

    // Cp pht b nh v khi to cho mt con tr int int *A = new int(5); // Cp pht b nh cho mt mng 5 phn t kiu int int *A = new int[5];

    Gii phng b nh ca mng ng mt chiu

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

    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

  • Chng 2: Con tr v mng

    23

    A[i] = 0; return;

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

    2.4.3 Cp pht b nh cho mng ng nhiu chiu

    Cp pht b nh cho mng ng nhiu chiu

    Mt mng hai chiu l mt con tr n mt con tr. Do vy, ta phi cp pht b nh theo tng chiu theo c php cp pht b nh cho mng ng mt chiu. V d:

    int **A; const int length = 10; A = new int*[length]; // Cp pht b nh cho s dng ca ma trn A for(int i=0; i

  • Chng 2: Con tr v mng

    24

    Chng trnh 2.5 #include #include /* Khai bo nguyn mu hm */ void InitArray(int **A, int row, int colum); void AddArray(int **A, int **B, int row, int colum); void DisplayArray(int **A, int row, int colum); void DeleteArray(int **A, int row); void InitArray(int **A, int row, int colum){

    A = new int*[row]; for(int i=0; i

  • Chng 2: Con tr v mng

    25

    void main(){ clrscr(); int **A, **B, row, colum; cout > row; cout > colum; /* Khi to cc ma trn */ cout

  • Chng 2: Con tr v mng

    26

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

    CU HI V BI TP CHNG 2 1. Trong cc khai bo con tr sau, nhng khai bo no l ng:

    a. int A*; b. *int A; c. int* A, B; d. int* A, *B; e. int *A, *B;

    2. Vi khai bo: int a = 12; int *pa;

    Cc php gn no sau y l hp l:

    a. pa = &a; b. pa = a; c. *pa = &a; d. *pa = a;

    3. Vi khai bo: int A[5] = {10, 20, 30, 40, 50}; int *pa = A+2;

    Khi , *pa = ? a. 10 b. 20 c. 30 d. 40 e. 50

    4. Vi on chng trnh: int A[5] = {10, 20, 30, 40, 50}; int *pa = A; *pa += 2;

    Khi , *pa = ? a. 10 b. 12 c. 30 d. 32

    5. Vi on chng trnh: int A[5] = {10, 20, 30, 40, 50}; int *pa = A;

  • Chng 2: Con tr v mng

    27

    pa += 2; Khi , *pa = ?

    a. 10 b. 12 c. 30 d. 32

    6. Vi on chng trnh: int A[5] = {10, 20, 30, 40, 50}; int *pa = A; pa += 2;

    Khi , pa = ?

    a. &A[0] b. A[2] c. &A[2] d. Khng xc nh

    7. Vi on chng trnh: int A[5] = {10, 20, 30, 40, 50}; int *pa = A; pa -= 2;

    Khi , pa = ?

    a. &A[0] b. &A[2] c. &A[4] d. Khng xc nh

    8. Vi on chng trnh: int A[3][3] = {

    {10, 20, 30}, {40, 50, 60}, {70, 80, 90} };

    int *pa; Khi , c c kt qu *pa = 50, cc lnh no sau y l ng?

    a. pa = A + 4; b. pa = (*(A+1)) + 1; c. pa = &A[1][1]; d. pa = *((*(A+1)) + 1);

    9. Gi s ta khai bo mt hm c s dng con tr hm vi khun mu nh sau: int Calcul(int a, int b, int (*Xcalcul)(int x, int y)){}

    V ta c ci t mt s hm nh sau:

  • Chng 2: Con tr v mng

    28

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

    Khi , li gi hm no sau y l ng:

    a. Calcul(5, 10, add); b. Calcul(5, 10, add(2, 3)); c. Calcul(5, 10, cal); d. Calcul(5, 10, squere);

    10. Ta mun cp pht b nh cho mt con tr kiu int v khi u gi tr cho n l 20. Lnh no sau y l ng:

    a. int *pa = 20; b. int *pa = new int{20}; c. int *pa = new int(20); d. int *pa = new int[20];

    11. Ta mun cp pht b nh cho mt mng ng kiu int c chiu di l 20. Lnh no sau y l ng:

    a. int *pa = 20; b. int *pa = new int{20}; c. int *pa = new int(20); d. int *pa = new int[20];

    12. Xt on chng trnh sau: int A[5] = {10, 20, 30, 40, 50}; int *pa = A; pa = new int(2);

    Khi , *pa = ? a. 10 b. 30 c. 2 d. Khng xc nh

    13. Xt on chng trnh sau: 1> int A[5] = {10, 20, 30, 40, 50}; 2> int *pa = A; 3> pa += 15; 4> delete pa;

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

  • Chng 2: Con tr v mng

    29

    14. Vit chng trnh thc hin cc php ton cng, tr, nhn, chia trn a thc. Cc a thc c biu din bng mng ng mt chiu. Bc ca a thc v cc h s tng ng c nhp t bn phm.

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

  • Chng 3: Kiu d liu cu trc

    30

    CHNG 3

    KIU D LIU CU TRC Ni dung chng ny tp trung trnh by cc vn lin quan n kiu d liu c cu trc trong C++:

    nh ngha mt cu trc S dng mt cu trc bng cc php ton c bn trn cu trc Con tr cu trc, khai bo v s dng con tr cu trc Mng cc cu trc, khai bo v s dng mng cc cu trc Mt s kiu d liu tru tng khc nh ngn xp, hng i, danh sch lin kt.

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

    3.1.1 Khai bo cu trc

    Trong C++, mt cu trc do ngi dng t nh ngha c khai bo thng qua t kho struct: struct { ;

    ;

    ; };

    Trong :

    struct: l tn t kho khai bo mt cu trc, bt buc phi c khi nh ngha cu trc. Tn cu trc: l tn do ngi dng t nh ngha, tun th theo quy tc t tn bin trong

    C++. Tn ny s tr thnh tn ca kiu d liu c cu trc tng ng.

    Thuc tnh: mi thuc tnh ca cu trc c khai bo nh khai bo mt bin thuc kiu d liu thng thng, gm c kiu d liu v tn bin tng ng. Mi khai bo thuc tnh phi kt thc bng du chm phy ; nh mt cu lnh C++ thng thng.

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

    Tn Tui Chc v Lng

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

  • Chng 3: Kiu d liu cu trc

    31

    struct Employeee{ char name[20]; // Tn nhn vin

    int age; // Tui nhn vin char role[20]; // Chc v ca nhn vin

    float salary; // Lng ca nhn vin };

    Lu :

    Cu trc ch cn nh ngha mt ln trong chng trnh v c th c khai bo bin cu trc nhiu ln. Khi cu trc c nh ngha, vic khai bo bin ln khc trong chng trnh c thc hin nh khai bo bin thng thng:

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

    Employee myEmployeee;

    3.1.2 Cu trc lng nhau

    Cc cu trc c th c nh ngha lng nhau khi mt thuc tnh ca mt cu trc cng cn c kiu l mt cu trc khc. Khi , vic nh ngha cu trc cha c thc hin nh mt cu trc bnh thng, vi khai bo v thuc tnh l mt cu trc con:

    struct { ; // C kiu cu trc

    ;

    ; };

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

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

    khi , cu trc Employee tr thnh: struct Employee{ char name[20]; // Tn nhn vin

    Date birthDay; // Ngy sinh ca nhn vin char role[20]; // Chc v ca nhn vin

    float salary; // Lng ca nhn vin };

  • Chng 3: Kiu d liu cu trc

    32

    Lu :

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

    3.1.3 nh ngha cu trc vi t kho typedef

    trnh phi dng t kho struct mi khi khai bo bin cu trc, ta c th dng t kha typedef khi nh ngha cu trc:

    typedef struct { ;

    ;

    ; } ;

    Trong :

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

    V d, mun c kiu d liu c cu trc nhn vin, c tn l Employee, ta dng t kho typedef nh ngha cu trc nh sau:

    typedef struct { char name[20]; // Tn nhn vin

    int age; // Tui nhn vin char role[20]; // Chc v ca nhn vin

    float salary; // Lng ca nhn vin } Employee;

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

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

    cu trc Employee tr thnh: typedef struct { char name[20]; // Tn nhn vin

    Date birthDay; // Ngy sinh ca nhn vin char role[20]; // Chc v ca nhn vin

    float salary; // Lng ca nhn vin } Employee;

  • Chng 3: Kiu d liu cu trc

    33

    Lu :

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

    Khi dng t kho typedef th khng th khai bo bin ng thi vi nh ngha cu trc.

    3.2 THAO TC TRN CU TRC Cc thao tc trn cu trc bao gm:

    Khai bo v khi to gi tr ban u cho bin cu trc Truy nhp n cc thuc tnh ca cu trc

    3.2.1 Khi to gi tr ban u cho cu trc

    Khi to bin c cu trc n

    Bin cu trc c khai bo theo cc cch sau: ;

    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:

    = { ,

    ,

    }; Trong :

    Gi tr thuc tnh: l gi tr khi u cho mi thuc tnh, c kiu ph hp vi kiu d liu ca thuc tnh. Mi gi tr ca thuc tnh c phn cch bng du phy ,.

    V d, vi nh ngha cu trc: typedef struct { char name[20]; // Tn nhn vin

    int age; // Tui nhn vin char role[20]; // Chc v ca nhn vin

    float salary; // Lng ca nhn vin } Employee;

    th c th khai bo v khi to cho mt bin nh sau: Employee myEmployee1 = { Nguyen Van A, 27, Nhan vien, 300f

  • Chng 3: Kiu d liu cu trc

    34

    };

    Khi to cc bin c cu trc lng nhau

    Trong trng hp cc cu trc lng nhau, php khi to cng thc hin nh thng thng vi php khi to cho tt c cc cu trc con. V d vi khai bo cu trc nh sau:

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

    v: typedef struct { char name[20]; // Tn nhn vin

    Date birthDay; // Ngy sinh ca nhn vin char role[20]; // Chc v ca nhn vin

    float salary; // Lng ca nhn vin } Employee;

    Th khai bo v khi to mt bin c kiu Employee c th thc hin nh sau: Employee myEmployee1 = { Nguyen Van A, {15, 05, 1980}, // Khi to cu trc con Nhan vien, 300f };

    3.2.2 Truy nhp n thuc tnh ca cu trc

    Vic truy nhp n thuc tnh ca cu trc c thc hin bng c php: .

    V d, vi mt bin cu trc kiu Employee n: Employee myEmployee1 = { Nguyen Van A, 27, Nhan vien, 300f };

    ta c th truy xut nh sau: cout

  • Chng 3: Kiu d liu cu trc

    35

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

    ta c th truy xut nh sau: cout

  • Chng 3: Kiu d liu cu trc

    36

    {Nguyen Van A, 27, Nhan vien, 300f}; cout myEmployee.age; cout > myEmployee.role;

    cout > myEmployee.salary;

    cout

  • Chng 3: Kiu d liu cu trc

    37

    void Display(Employee myEmployee){ cout

  • Chng 3: Kiu d liu cu trc

    38

    3.3 CON TR CU TRC V MNG CU TRC

    3.3.1 Con tr cu trc

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

    Khai bo con tr cu trc

    Con tr cu trc c khai bo theo c php: *;

    V d, vi kiu khai bo cu trc: typedef struct { int day; int month; int year; } Date;

    v: typedef struct { char name[20]; // Tn nhn vin

    Date birthDay; // Ngy sinh ca nhn vin char role[20]; // Chc v ca nhn vin

    float salary; // Lng ca nhn vin } Employee;

    th ta c th khai bo mt con tr cu trc nh sau: Employee *ptrEmployee;

    Lu :

    Cng nh khai bo con tr thng thng, du con tr * c th nm ngay trc tn bin hoc nm ngay sau tn kiu cu trc.

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

    Cho n tr n a ch ca mt bin cu trc Cp pht cho n mt vng nh xc nh.

    Gn a ch cho con tr cu trc

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

    V d, khai bo v php gn: Employee *ptrEmployee, myEmployee; ptrEmployee = &myEmployee;

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

  • Chng 3: Kiu d liu cu trc

    39

    Cp pht b nh ng cho con tr cu trc

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

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

    Employee *ptrEmployee; ptrEmployee = new Employee;

    hoc cp pht ngay khi khai bo: Employee *ptrEmployee = new Employee;

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

    delete ; V d:

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

    Lu :

    Thao tc delete ch c thc hin i vi con tr m trc , n c cp pht b nh ng thng qua thao tc new:

    Employee *ptrEmployee = new Employee; delete ptrEmployee; //ng

    m khng th thc hin vi con tr ch tr n a ch ca mt bin cu trc khc: Employee *ptrEmployee, myEmployee; ptrEmployee = &myEmployee; delete ptrEmployee; //li

    Truy nhp thuc tnh ca con tr cu trc

    Thuc tnh ca con tr cu trc c th c truy nhp thng qua hai cch: Cch 1:

    -> ; Cch 2:

    (*).; V d, thuc tnh tn nhn vin ca cu trc Employee c th c truy nhp thng qua hai cch:

    Employee *ptrEmployee = new Employee; cin >> ptrEmployee -> name;

    hoc:

  • Chng 3: Kiu d liu cu trc

    40

    cin >> (*ptrEmployee).name; Lu :

    Trong cch truy nhp th hai, phi c du ngoc n () quanh tn con tr v php ton truy nhp thuc tnh . c u tin cao hn php ton ly gi tr con tr *.

    Thng thng, ta dng cch th nht cho n gin v thun tin. Chng trnh 3.2 ci t vic khi to v hin th ni dung ca mt con tr cu trc.

    Chng trnh 3.2 #include #include #include typedef struct {

    int day; int month; int year;

    } Date; typedef struct {

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

    } Employee; /* Khai bo khun mu hm */ void InitStruct(Employee *myEmployee); void Display(Employee *myEmployee); void InitStruct(Employee *myEmployee){ myEmployee = new Employee;

    cout > myEmployee->name;

    cout > myEmployee->birthDay.day; cout > myEmployee->birthDay.month; cout > myEmployee->birthDay.year; cout > myEmployee->role;

    cout

  • Chng 3: Kiu d liu cu trc

    41

    cin >> myEmployee->salary; } void Display(Employee myEmployee){ cout

  • Chng 3: Kiu d liu cu trc

    42

    Tuy nhin, cch cp pht b nh ng cho mng cc cu trc khc vi mt con tr. y l cch chng trnh nhn bit ta ang dng mt con tr cu trc hay mt mng ng c cu trc. C php cp pht b nh cho mng ng nh sau:

    = new []; V d, khai bo:

    Employee *employees = new Employee[10]; s cp pht b nh cho mt mng ng employees c 10 phn t kiu cu trc Employee.

    Truy nhp n phn t ca mng cu trc

    Vic truy nhp n cc phn t ca mng cu trc c thc hin nh truy cp n phn t ca mng thng thng. V d mun truy nhp n thuc tnh tn nhn vin phn t nhn vin th i trong mng cu trc, ta vit nh sau:

    Employee *employees = new Employee[10]; employees[i].name;

    Chng trnh 3.3 ci t vic khi to mt mng cc nhn vin ca mt phng trong mt cng ty. Sau , chng trnh s tm v in ra thng tin v nhn vin c lng cao nht v nhn vin c lng thp nht trong phng.

    Chng trnh 3.3 #include #include #include typedef struct {

    int day; int month; int year;

    } Date; typedef struct {

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

    } Employee; /* Khai bo khun mu hm */ void InitArray(Employee *myEmployee, int length); Employee searchSalaryMax(Employee *myEmployee, int length); Employee searchSalaryMin(Employee *myEmployee, int length); void Display(Employee myEmployee);

  • Chng 3: Kiu d liu cu trc

    43

    void InitArray(Employee *myEmployee, int length){ myEmployee = new Employee[length]; for(int i=0; i myEmployee[i].birthDay.year; cout > myEmployee[i].role;

    cout > myEmployee[i].salary;

    } return; } Employee searchSalaryMax(Employee *myEmployee, int length){ int index = 0; int maxSalary = myEmployee[0].salary; for(int i=1; i maxSalary){ maxSalary = myEmployee[i].salary; index = i;

    } return myEmployee[index]; } Employee searchSalaryMin(Employee *myEmployee, int length){ int index = 0; int minSalary = myEmployee[0].salary; for(int i=1; i

  • Chng 3: Kiu d liu cu trc

    44

    cout

  • Chng 3: Kiu d liu cu trc

    45

    3.4.1 Ngn xp

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

    nh ngha cu trc ngn xp

    V ta ch cn quan tm n hai thuc tnh ca ngn xp l:

    Danh sch cc phn t ca ngn xp V tr nh ca ngn xp

    nn ta c th nh ngha cu trc ngn xp nh sau (cc phn t ca ngn xp c kiu int): typedef SIZE 100; typedef struct { int top; // V tr ca nh int nodes[SIZE]; // Danh sch cc phn t } Stack;

    Tuy nhin, nh ngha ny tn ti mt vn , l kch thc (SIZE) ca danh sch cha cc phn t l tnh. Do :

    Nu ta chn SIZE ln, nhng khi gp ng dng ch cn mt s t phn t cho ngn xp th rt tn b nh.

    Nu ta khai bo SIZE nh, th khi gp bi ton cn ngn xp c nhiu phn t, ta s khng thm c cc phn t mi vo, chng trnh s c li.

    khc phc hn ch ny, ta c th s dng b nh ng (mng ng thng qua con tr) lu danh sch cc phn t ca ngn xp. Khi , nh ngha cu trc ngn xp s c dng nh sau:

    typedef struct { int top; // V tr ca nh int *nodes; // Danh sch cc phn t } Stack;

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

    Cc thao tc trn ngn xp

    i vi cc thao tc trn ngn xp, ta quan tm n hai thao tc c bn:

    Thm mt phn t mi vo nh ngn xp, gi l push. Ly ra mt phn t t nh ngn xp, gi l pop.

    Khi thm mt phn t mi vo ngn xp, ta lm cc bc nh sau: 1. S phn t trong ngn xp c l (top+1). Do , ta cp pht mt vng nh mi lu

    c (top+1+1) = (top+2) phn t. 2. Sao chp (top+1) phn t c sang vng mi. Nu danh sch ban u rng (top = -1) th

    khng cn thc hin bc ny. 3. Thm phn t mi vo cui vng nh mi 4. Gii phng vng nh ca danh sch c

  • Chng 3: Kiu d liu cu trc

    46

    5. Cho danh sch nodes tr vo vng nh mi. Chng trnh 3.4a ci t th tc thm mt phn t mi vo ngn xp.

    Chng trnh 3.4a void push(Stack *stack, int node){ int *tmpNodes = new int[stack->top + 2];// Cp pht vng nh mi stack->top ++; // Tng ch s ca node nh for(int i=0; itop; i++) // Sao chp sang vng nh mi tmpNodes[i] = stack->nodes[i]; tmpNodes[stack->top] = node; // Thm node mi vo nh delete [] stack->nodes; // Gii phng vng nh c stack->nodes = tmpNodes; // Tr vo vng nh mi return; }

    Khi ly ra mt phn t ca ngn xp, ta lm cc bc nh sau:

    Kim tra xem ngn xp c rng (top = -1) hay khng. Nu khng rng th thc hin cc bc tip theo.

    Ly phn t nh ngn xp ra Cp pht mt vng nh mi c (top+1) -1 = top phn t Sao chp top phn t t danh sch c sang vng nh mi (tr phn t nh). Gii phng vng nh c Cho con tr danh sch tr vo vng nh mi. Tr v gi tr phn t nh ly ra.

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

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

  • Chng 3: Kiu d liu cu trc

    47

    }

    p dng

    Ngn xp c s dng trong cc ng dng tho mn nguyn tc: ci no t vo trc s c ly ra sau. Chng trnh 3.4c minh ho vic dng ngn xp o ngc mt xu k t c nhp vo t bn phm.

    Chng trnh 3.4c #include #include #include typedef struct {

    int top; // V tr node nh int *nodes; // Danh sch phn t

    } Stack; /* Khai bo nguyn mu hm */ void init(Stack *stack); void push(Stack *stack, int node); int pop(Stack *stack); void release(Stack *stack); void init(Stack *stack){ stack = new Stack; // Cp pht vng nh cho con tr stack->top = -1; // Khi to ngn xp rng } void push(Stack *stack, int node){ int *tmpNodes = new int[stack->top + 2];// Cp pht vng nh mi stack->top ++; // Tng ch s ca node nh for(int i=0; itop; i++) // Sao chp sang vng nh mi tmpNodes[i] = stack->nodes[i]; tmpNodes[stack->top] = node; // Thm node mi vo nh delete [] stack->nodes; // Gii phng vng nh c stack->nodes = tmpNodes; // Tr vo vng nh mi return; } int pop(Stack *stack){ if(stack->top < 0){ // Kim tra ngn xp rng

  • Chng 3: Kiu d liu cu trc

    48

    cout top];// Lu gi gi tr nh int *tmpNodes = new int[stack->top];// Cp pht vng nh mi for(int i=0; itop; i++) // Sao chp sang vng nh mi tmpNodes[i] = stack->nodes[i]; stack->top --; // Gim ch s ca node nh delete [] stack->nodes; // Gii phng vng nh c stack->nodes = tmpNodes; // Tr vo vng nh mi return result; // Tr v gi tr node nh } void release(Stack *stack){ delete [] stack->nodes; // Gii phng vng danh sch delete stack; // Gii phng con tr return; } void main(){ clrscr(); Stack *stack;

    init(stack); // Khi to ngn xp char strIn[250]; // Nhp chui k t t bn phm cout > strIn; for(int i=0; itop > -1) // Ly ra t ngn xp cout

  • Chng 3: Kiu d liu cu trc

    49

    nh ngha cu trc hng i

    Hng i c cc thuc tnh:

    Mt danh sch cc phn t c mt trong hng i. Ch s ca phn t ng u ca danh sch (front). Ch s phn t cui ca danh sch (rear).

    Nu dng cu trc tnh nh ngha, hng i c cu trc nh sau: typedef SIZE 100; typedef struct { int front, rear; // V tr ca nh u, nh cui int nodes[SIZE]; // Danh sch cc phn t } Queue;

    Nu dng b nh ng lu gi hng i, th phn t front lun l phn t th 0 ca danh sch. V rear s bng di danh sch tr i 1. Cu trc ng ca hng i:

    typedef struct { int front, rear; // V tr ca nh u, nh cui int *nodes; // Danh sch cc phn t } Queue;

    Thao tc trn hng i

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

    Thao tc thm mt phn t vo cui hng i vi b nh ng c thc hin tng t vi ngn xp. Chng trnh 3.5a ci t th tc thm mt phn t vo cui hng i ng.

    Chng trnh 3.5a void insert(Queue *queue, int node){ int *tmpNodes = new int[queue->rear + 2];// Cp pht vng nh mi queue->rear ++; // Tng ch s ca node ui if(queue->front == -1) // Nu hng i c rng queue->front = 0; // th cp nht front for(int i=0; irear; i++) // Sao chp sang vng nh mi tmpNodes[i] = queue->nodes[i]; tmpNodes[queue->rear] = node; // Thm node mi vo ui delete [] queue->nodes; // Gii phng vng nh c queue->nodes = tmpNodes; // Tr vo vng nh mi return; }

    Thao tc ly ra mt phn t u ca hng i thc hin theo cc bc:

    1. Kim tra tnh rng (front = rear = -1) ca hng i. Nu khng rng mi thc hin tip

  • Chng 3: Kiu d liu cu trc

    50

    2. Ly phn t nodes[0] ra. 3. Sao chp danh sch cn li sang vng nh mi 4. Gii phng vng nh c 5. a danh sch tr vo vng nh mi 6. Tr v gi tr phn t ly ra

    Chng trnh 3.5b ci t th tc ly ra mt phn t ca hng i ng.

    Chng trnh 3.5b int remove(Queue *queue){ if((queue-front < 0)||(queue-rear < 0)){// Kim tra hng i rng cout 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; irear; i++)// Sao chp sang vng nh mi tmpNodes[i] = queue->nodes[i]; }else // Nu ch c 1 phn t queue->front --; // Hng i thnh rng

    queue->rear --; // Gim ch s ca node ui delete [] queue->nodes; // Gii phng vng nh c queue->nodes = tmpNodes; // Tr vo vng nh mi return result; // Tr v gi tr node u }

    p dng

    Hng i c p dng trong cc bi ton cn c ch qun l ci no vo trc s c ly ra trc. Chng trnh 3.5c minh ho c ch qun l tin trnh n gin nht ca h iu hnh: cc tin trnh c qun l theo m tin trnh, khi xut hin, tin trnh c a vo cui ca mt hng i. Khi no CPU rnh th s ly tin trnh u hng i ra thc hin.

    Chng trnh 3.5c #include #include typedef struct { int front, rear; // V tr ca nh u, nh cui

  • Chng 3: Kiu d liu cu trc

    51

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

  • Chng 3: Kiu d liu cu trc

    52

    queue->front --; // Hng i thnh rng queue->rear --; // Gim ch s ca node ui delete [] queue->nodes; // Gii phng vng nh c queue->nodes = tmpNodes; // Tr vo vng nh mi return result; // Tr v gi tr node u } void travese(Queue *queue){ if(queue->front < 0){ // Khi danh sch rng cout

  • Chng 3: Kiu d liu cu trc

    53

    cin >> maso; insert(queue, maso); break; case 2: // Ly ra khi hng i cout

  • Chng 3: Kiu d liu cu trc

    54

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

    Cc thao tc trn danh sch lin kt n

    Cc thao tc c bn trn danh sch n bao gm:

    Chn thm mt node vo v tr th n trong danh sch Loi ra mt node v tr th n trong danh sch

    Vic chn thm mt node vo v tr th n trong danh sch c thc hin theo cc bc: 1. Nu ns 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 next = list->front; // Chn vo trc node u

    list->front = newNode; // Cp nht li node u ds if(list->nodeNumber == 0) // Nu ds ban u rng th list->rear = newNode; // node ui trng vi node u

    }else if(position >= list->nodeNumber){// Chn vo cui ds list->rear->next = newNode; // Chn vo sau node cui list->rear = newNode; // Cp nht li node cui ds

    if(list->nodeNumber == 0) // Nu ds ban u rng th list->front = newNode; // node u trng node ui

    }else{ // Chn vo gia ds SimpleNode *prev = list->front, *curr = list->front; int index = 0; while(index < position){ // tm node n-1 v n prev = curr; curr = curr->next; index++;

    } newNode->next = curr; // chn vo trc node n prev->next = newNode; // v chn vo sau node n-1

    }

  • Chng 3: Kiu d liu cu trc

    55

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

    Vic xo mt node v tr th n trong danh sch c thc hin theo cc bc:

    1. Nu ns phn t ca danh sch, khng xo node no. 2. Tm node th n: gi vt ca ba node th n-1, th n v th n+1. 3. Cho node th n-1 tr tip vo node th n+1, xo con tr ca node th n. 4. Tr v node th n.

    Chng trnh 3.6b ci t th tc xo mt node v tr th n ca danh sch.

    Chng trnh 3.6b SimpleNode* remove(SimpleHeader *list, int position){ if((position < 0)||(position >= list->nodeNumber)) return NULL; // Khng xo node no c SimpleNode* result; if(position == 0){ // Xo node u result = list->front; // Gi node cn xo list->front = list->front->next;// Cp nht node u if(list->nodeNumber == 1) // Nu ds ch c 1 node th list->rear = list->front;// Cp nht node cui ds

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

    } result = curr; // Gi node cn xo prev->next = curr->next; // Cho node n-1 tr n node n+1

    } list->nodeNumber --; // Cp nht s lng node return result; // Tr v node cn xo

  • Chng 3: Kiu d liu cu trc

    56

    }

    p dng

    Chng trnh 3.6c minh ho vic dng danh sch lin kt n qun l nhn vin vn phng vi cc thng tin rt n gin: tn, tui v tin lng ca mi nhn vin.

    Chng trnh 3.6c #include #include #include typedef struct{ char name[25]; // Tn nhn vin int age; // Tui nhn vin float salary; // Lng nhn vin } Employee; struct simple{ Employee employee; // D liu ca node struct simple *next; // Tr n node k tip }; typedef struct simple SimpleNode; typedef struct{ int nodeNumber; // S lng cc node SimpleNode *front, *rear; // Tr n node u v cui ds } SimpleHeader; /* Khai bo cc nguyn mu hm */ void init(SimpleHeader *list); void insert(SimpleHeader *list, int position, Employee employee); SimpleNode* remove(SimpleHeader *list); void travese(SimpleHeader *list); void release(SimpleHeader *list); void init(SimpleHeader *list){ list = new list; // Cp pht b nh cho con tr list->front = NULL; // Khi to danh sch rng list->rear = NULL;

  • Chng 3: Kiu d liu cu trc

    57

    list->nodeNumber = 0; return; } void insert(SimpleHeader *list, int position, Employee employee){ SimpleNode *newNode = new SimpleNode; newNode->employee = employee; if(position next = list->front; // Chn vo trc node u

    list->front = newNode; // Cp nht li node u ds if(list->nodeNumber == 0) // Nu ds ban u rng th list->rear = newNode; // node ui trng vi node u

    }else if(position >= list->nodeNumber){// Chn vo cui ds list->rear->next = newNode; // Chn vo sau node cui list->rear = newNode; // Cp nht li node cui ds

    if(list->nodeNumber == 0)// Nu ds ban u rng th list->front = newNode; // node u trng node ui

    }else{ // Chn vo gia ds SimpleNode *prev = list->front, *curr = list->front; int index = 0; while(index < position){// tm node n-1 v n prev = curr; curr = curr->next; index++;

    } newNode->next = curr; // chn vo trc node n prev->next = newNode; // v chn vo sau node n-1

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

    return; } SimpleNode* remove(SimpleHeader *list, int position){ if((position < 0)||(position >= list->nodeNumber)) return NULL; // Khng xo node no c SimpleNode* result; if(position == 0){ // Xo node u result = list->front; // Gi node cn xo list->front = list->front->next;// Cp nht node u if(list->nodeNumber == 1) // Nu ds ch c 1 node th list->rear = list->front;// Cp nht node cui ds

    }else if(position == list->nodeNumber 1){ result = list->rear; // Gi node cn xo

  • Chng 3: Kiu d liu cu trc

    58

    SimpleNode *curr = list->front; while(curr->next != list->rear) curr = curr->next;// Tm node trc ca node cui curr->next = NULL; // Xo node rear hin ti list->rear = curr; // Cp nht node cui ds }else{ SimpleNode *prev = list->front, *curr = list->front; int index = 0; while(index < position){// Tm node n-1 v n prev = curr; curr = curr->next; index++;

    } result = curr; // Gi node cn xo prev->next = curr->next;// Cho node n-1 tr n node n+1

    } list->nodeNumber --; // Cp nht s lng node return result; // Tr v node cn xo

    } void travese(SimpleHeader *list){ if(list->nodeNumber

  • Chng 3: Kiu d liu cu trc

    59

    void main(){ clrscr(); SimpleHeader *list; init(list); // Khi to ds int function; do{ clrscr(); cout

  • Chng 3: Kiu d liu cu trc

    60

    } break; case 3: // Duyt ds cout

  • Chng 3: Kiu d liu cu trc

    61

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

    }; 2. Mt cu trc c nh ngha nh sau:

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

    Khi , cch khai bo bin no sau y l ng:

    a. struct Employee myEmployee; b. struct employee myEmployee; c. Employee myEmployee; d. employee myEmployee;

    3. Mt cu trc c nh ngha nh sau: typedef struct employee{ char name[20]; int age; } Employee;

    Khi , cch khai bo bin no sau y l ng:

    a. Employee myEmployee; b. employee myEmployee; c. struct Employee myEmployee; d. struct employee myEmployee;

    4. Vi cu trc c nh ngha nh trong bi 3. Khi , cch khi to bin no sau y l ng:

    a. Employee myEmployee = {A, 27}; b. Employee myEmployee = {A, 27}; c. Employee myEmployee = (A, 27); d. Employee myEmployee = (A, 27);

    5. Vi cu trc c nh ngha nh trong bi 3. Khi , cc cch cp pht b nh cho bin con tr no sau y l ng:

    a. Employee *myEmployee = new Employee; b. Employee *myEmployee = new Employee(); c. Employee *myEmployee = new Employee(10); d. Employee *myEmployee = new Employee[10];

    6. nh ngha mt cu trc v mn hc ca mt hc sinh c tn Subject, bao gm cc thng

    tin:

  • Chng 3: Kiu d liu cu trc

    62

    Tn mn hc, kiu char[]; im tng kt mn hc, kiu float;

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

    Tn hc sinh, kiu char[]; Tui hc sinh, kiu int; Lp hc sinh, kiu char[]; Danh sch im cc mn hc ca hc sinh, kiu l mt mng cc cu trc Subject

    c nh ngha trong bi tp 6.

    Xp loi hc lc, kiu char[]; 8. Khai bo mt bin c cu trc l Student nh ngha trong bi 7. Sau , thc hin tnh

    im trung bnh ca tt c cc mn hc ca hc sinh , v vit mt th tc xp loi hc sinh da vo im trung bnh cc mn hc:

    Nu im tb nh hn 5.0, xp loi km Nu im tb t 5.0 n di 6.5, xp loi trung bnh. Nu im tb t 6.5 n di 8.0, xp loi kh Nu im tb t 8.0 tr ln, xp loi gii.

    9. Vit mt chng trnh qun l cc hc sinh ca mt lp, l mt dy cc cu trc c kiu Stupid nh ngha trong bi 7. S dng th tc ci t trong bi 8 thc hin cc thao tc sau:

    Khi to danh sch v im ca cc hc sinh trong lp. Tnh im trung bnh v xp loi cho tt c cc hc sinh. Tm tt c cc hc sinh theo mt loi nht nh

    10. S dng cu trc ngn xp nh ngha trong bi i mt s t kiu thp phn sang kiu nh phn: Chi s nguyn cho 2, mi cho n khi thng

  • Chng 3: Kiu d liu cu trc

    63

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

    14. Ci t li hai tho tc thm vo mt node v xo mt node mt v tr xc nh trong mt cu trc danh sch lin kt kp nh ngha trong bi 13.

    15. p dng cc nh ngha v thao tc trong cc bi 13 v 14. Ci t li chng trnh qun l nhn vin chng trnh 3.6c bng danh sch lin kt kp.

  • Chng 4: Vo ra trn tp

    64

    CHNG 4

    VO RA TRN TP Ni dung chng ny tp trung trnh by cc vn lin quan n cc thao tc trn tp d liu trong ngn ng C++:

    Khi nim tp, tp vn bn v tp nh phn Cc thao tc vo ra trn tp Phng thc truy nhp tp trc tip

    4.1 KHI NIM TP

    4.1.1 Tp d liu

    Trong C++, khi thao tc vi mt tp d liu, cn thc hin tun t theo cc bc nh sau: 1. M tp tin 2. Thc hin cc thao tc c, ghi trn tp tin ang m 3. ng tp tin

    thc hin cc thao tc lin quan n tp d liu, C++ cung cp mt th vin cha cc lp v cc hm phc v cho cc thao tc ny. Do vy, trong cc chng trnh lm vic vi tp tin, ta cn khai bo ch th dng th vin ny ngay t u chng trnh:

    #include

    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 (, ); Trong :

    Tn bin tp: c tnh cht nh mt tn bin thng thng, n s c dng thc hin cc thao tc vi tp gn vi n. Tn bin tp cng phi tun th theo quy tc t tn bin trong C++.

    Tn tp: l tn tp d liu m ta cn thao tc trn n. Ch m tp: l cc hng kiu bt c nh ngha sn bi C++. N ch ra rng ta

    ang m tp tin ch no: c hoc ghi, hoc c c ln ghi. V d, khai bo:

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

  • Chng 4: Vo ra trn tp

    65

    Tn tp tin c dng mt chui k t, nu khai bo tn tp c ng dn th mc \ th mi du \ phi c vit thnh \\ trnh b nhm ln vi cc k t c bit trong C nh \n, \d

    V d, mun m mt tp tn l abc.txt trong th mc myDir c, ta phi khai bo nh sau: fstream myFile(myDir\\abc.txt, ios::in);

    Cc ch m tp tin

    Cc ch m tp tin c nh ngha bi cc bt ch th:

    ios::in: M mt tp tin c. ios::out: M mt tp tin c sn ghi. ios::app: M mt tp tin c sn thm d liu vo cui tp. ios::ate: M tp tin v t con tr tp tin vo cui tp. ios::trunc: Nu tp tin c sn th d liu ca n s b mt. ios::nocreate: M mt tp tin, tp tin ny bt buc phi tn ti. ios::noreplace: Ch m tp tin khi tp tin cha tn ti. ios::binary: M mt tp tin ch nh phn. ios::text: M mt tp tin ch vn bn.

    Lu :

    Khi mun m mt tp tin ng thi nhiu ch khc nhau, ta kt hp cc bt ch th tng ng bng php ton hp bt |.

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

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

    4.1.2 Tp vn bn

    m mt tp tin di ch vn bn, ta dng c php sau: fstream (, 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 (, ios::binary);

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

    fstream myBaiTho(baitho.txt, ios::binary);

  • Chng 4: Vo ra trn tp

    66

    4.2 VO RA TRN TP

    4.2.1 Vo ra tp vn bn bng >> v

  • Chng 4: Vo ra trn tp

    67

    do{ cin >> input; // c k t t bn phm fileOut >:

    >> ; 3. ng tp tin bng lnh close():

    .close(); Chng trnh 4.2 minh ho vic c d liu t tp tin va s dng trong chng trnh 4.1 ra mn hnh:

    Tn tp tin c ngi dng t nhp vo t bn phm. Chng trnh s c cc k t trong tp v hin th ra mn hnh, mi k t c phn cch

    nhau bi du trng (space bar).

    Chng trnh dng li khi kt thc tp tin.

    Chng trnh 4.2 #include #include #include #include const int length = 25; // di ti a tn tp tin void main(){ clrscr(); char fileName[length], output; cout > setw(length) >> fileName; // Nhp tn tp tin /* M tp tin */

  • Chng 4: Vo ra trn tp

    68

    ifstream fileIn(fileName, ios::in); // Khai bo v m tp tin if(!fileIn){ // Khng m c tp cout sourceFile; // Nhp tn tp tin ngun cout > setw(length) >> targetFile; // Nhp tn tp tin ch

  • Chng 4: Vo ra trn tp

    69

    /* M tp tin ngun */ ifstream fileIn(sourceFile, ios::in);// Khai bo v m tp ngun if(!fileIn){ // Khng m c tp ngun cout

  • Chng 4: Vo ra trn tp

    70

    4.2.2 Vo ra tp nh phn bng read v write

    Ghi vo tp nh phn bng write

    Cc bc thc hin ghi d liu vo mt tp nh phn nh sau: 1. M tp tin theo ch ghi nh phn bng i tng fstream:

    fstream (, ios::out|ios::binary); 2. Ghi d liu vo tp bng thao tc write():

    .write(char* , int );

    3. ng tp tin bng lnh close(): .close();

    Trong , thao tc write nhn hai tham s u vo nh sau:

    Tham s th nht l con tr kiu char tr n vng d liu cn ghi vo tp. V con tr bt buc c kiu char nn khi mun ghi d liu c kiu khc vo tp, ta dng hm chuyn kiu:

    reinterpret_cast(); 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(); Lu :

    Khi mun c, ghi cc d liu c cu trc (struct) vo tp th ta phi dng ch c/ghi tp nh phn m khng th dng ch c/ghi ch vn bn.

    Khi c/ghi d liu c kiu cu trc, ton t sizeof() thc hin chnh xc th cc thnh vin ca cu trc khng c l kiu con tr. V ton t sizeof() i vi con tr ch cho kch c ca con tr m khng cho kch c tht ca vng d liu m con tr tr ti.

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

    Tn tp tin v s lng bn ghi c ngi dng t nhp vo t bn phm. Chng trnh s ghi vo tp cc bn ghi c cu trc do ngi dng g vo t bn phm.

    Chng trnh 4.4 #include #include #include #include #include const int length = 25; // di ti a tn tp tin typedef struct {

    int day; // Ngy int month; // Thng

  • Chng 4: Vo ra trn tp

    71

    int year; // Nm } Date; typedef struct {

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

    } Employee; void main(){ clrscr(); char fileName[length]; // Tn tp tin cout > setw(length) >> fileName; // Nhp tn tp tin int recordNumber; // S lng bn ghi cout > recordNumber; // Nhp s lng bn ghi /* M tp tin */ // Khai bo v m tp tin fstream fileOut(fileName, ios::out|ios::binary); if(!fileOut){ // Khng m c tp cout

  • Chng 4: Vo ra trn tp

    72

    cin >> myEmployee.salary; // Nhp tin lng // Ghi d liu vo tp

    fileOut.write(reinterpret_cast(&myEmployee), sizeof(Employee));

    } /* ng tp tin */ fileOut.close(); // ng tp tin return;

    }

    c d liu t tp nh phn bng read

    Cc bc thc hin c d liu t mt tp tin nh phn nh sau: 1. M tp tin theo ch c nh phn bng i tng fstream (m tp tin ch ghi):

    fstream (, ios::in|ios::binary); 2. c d liu t tp bng thao tc read():

    .read(char* , int );

    3. ng tp tin bng lnh close(): .close();

    Chng trnh 4.5 minh ho vic c d liu t tp tin vo bin c cu trc:

    Tn tp tin c ngi dng t nhp vo t bn phm. Chng trnh s c cc cu trc nhn vin trong tp v hin th ra mn hnh. Chng trnh dng li khi kt thc tp tin.

    Chng trnh 4.5 #include #include #include #include #include const int length = 25; // di ti a tn tp tin typedef struct {

    int day; // Ngy int month; // Thng int year; // Nm

    } Date;

  • Chng 4: Vo ra trn tp

    73

    typedef struct {

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

    } Employee; void main(){ clrscr(); char fileName[length]; // Tn tp tin cout > setw(length) >> fileName; // Nhp tn tp tin /* M tp tin */ // Khai bo v m tp tin fstream fileIn(fileName, ios::in|ios::binary); if(!fileIn){ // Khng m c tp cout

  • Chng 4: Vo ra trn tp

    74

    4.3 TRUY NHP TP TRC TIP

    4.3.1 Con tr tp tin

    Con tr tp tin c vai tr nh mt u c tr vo mt v tr xc nh ca tp v thao tc truy nhp tp din ra tun t:

    Ti mi thi im, con tr tp tin xc nh mt v tr trn tp m ti , thao tc truy nhp tp (c/ghi) c thc hin.

    Sau thao tc truy nhp, con tr tp t ng chuyn n v tr tip theo da vo kch thc n v d liu c truy nhp.

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

    Truy nhp v tr hin ti ca con tr tp tin Dch chuyn con tr tp tin n mt v tr xc nh

    4.3.2 Truy nhp v tr hin ti ca con tr tp

    C php truy nhp n v tr hin thi ca con tr tp ph thuc vo kiu bin tp ang dng l c hay ghi.

    Nu bin tp l kiu m tp c ifstream th c php l: .tellg();

    Nu bin tp l kiu m tp ghi ofstream th c php l: .tellp();

    Chng trnh 4.6a minh ho vic xc nh v tr hin thi ca con tr tp sau mt s thao tc c tp trc .

    Chng trnh 4.6a #include #include #include #include const int length = 25; // di ti a tn tp tin void main(){ clrscr(); char fileName[length], output; cout > setw(length) >> fileName; // Nhp tn tp tin

  • Chng 4: Vo ra trn tp

    75

    /* M tp tin */ ifstream fileIn(fileName, ios::in); // Khai bo v m tp tin if(!fileIn){ // Khng m c tp cout

  • Chng 4: Vo ra trn tp

    76

    /* M tp tin */ ofstream fileOut(fileName, ios::out);// Khai bo v m tp tin if(!fileOut){ // Khng m c tp cout

  • Chng 4: Vo ra trn tp

    77

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

    s dch chuyn con tr tp tin n k t (kiu char) th 7+1 = 8 trong tp tin abc.txt c (gi s tp tin abc.txt lu cc k t kiu char). Lu :

    V khong cch cch dch chuyn c kiu s nguyn (int) cho nn c th nhn gi tr m hoc dng. Nu gi tr dng, dch chuyn v pha sau v tr lm mc, nu gi tr m, dch chuyn v pha trc v tr lm mc.

    Nu v tr dch chuyn n nm ngoi phm vi tp tin (pha sau v tr cui cng ca tp hoc pha trc v tr u tin ca tp) s ny sinh li, khi = false.

    Chng trnh 4.7 ci t chng trnh truy nhp tp tin trc tip c gi tr k t (kiu char) trong tp:

    Tn tp tin (cha d liu kiu char) do ngi dng nhp vo t bn phm. Sau , mi khi ngi dng nhp vo mt s nguyn, chng trnh s dch chuyn n v

    tr mi, cch v tr c ng bng tng y k t, tnh t v tr hin thi ca con tr tp.

    Chng trnh s kt thc khi ngi dng nhp vo s 0.

    Chng trnh 4.7 #include #include #include #include const int length = 25; // di ti a tn tp tin void main(){ clrscr(); char fileName[length], output; cout > setw(length) >> fileName; // Nhp tn tp tin /* M tp tin */ ifstream fileIn(fileName, ios::in); // Khai bo v m tp tin if(!fileIn){ // Khng m c tp cout

  • Chng 4: Vo ra trn tp

    78

    int index = 1; do{ cout > index; // Dch chuyn con tr tp t v tr hin thi fileIn.seekg(sizeof(char)*index, ios::cur); if(fileIn){ // ng

    fileIn >> output; // c k t t tp tin

    // Ghi k t ra mn hnh cout

  • Chng 4: Vo ra trn tp

    79

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

    CU HI V BI TP CHNG 4 1. Mun m mt tp tin tn l abc.txt c d liu, lnh m tp no sau y l ng:

    a. fstream myFile(abc.txt, ios::in); b. fstream myFile(abc.txt, ios::out); c. fstream myFile(abc.txt, ios::app); d. fstream myFile(abc.txt, ios::ate);

    2. Mun m mt tp tin abc.txt nm trong th mc xyz ghi d liu vo. Lnh m no sau y l ng:

    a. fstream myFile(xyz\abc.txt, ios::out); b. fstream myFile(xyz\\abc.txt, ios::out); c. fstream myFile(xyz/abc.txt, ios::out); d. fstream myFile(xyz//abc.txt, ios::out);

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

    4. Xt hai lnh khai bo sau: fstream myFile1(abc.txt, ios::out); ofstream myFile2(abc.txt, ios::out);

    Nhn nh no sau y l ng: a. myFile1 v myFile2 c chc nng ging nhau. b. myFile1 v myFile2 c chc nng khc nhau

    5. Xt hai lnh khai bo sau: fstream myFile1(abc.txt, ios::in); ifstream myFile2(abc.txt, ios::in);

    Nhn nh no sau y l ng: a. myFile1 v myFile2 c chc nng ging nhau. b. myFile1 v myFile2 c chc nng khc nhau

    6. Xt on chng trnh sau: ofstream myFile(abc.txt, ios::out); if(myFile) myFile

  • Chng 4: Vo ra trn tp

    80

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

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

    Chng trnh s lm g, nu tp tin abc.txt c ni dung l dng ch abc.txt? a. Ghi ra mn hnh dng ch abc.txt b. Ghi vo tp tin abc.txt dng ch abc.txt c. c t tp tin abc.txt dng ch abc.txt d. Chng trnh s bo li.

    8. Xt on chng trnh sau: fstream myFile(abc.txt, ios::out); if(myFile) myFile > text; cout c; cout

  • Chng 4: Vo ra trn tp

    81

    b. 1 c. 8 d. 16

    11. Xt on chng trnh sau, nu tp abc.txt cha mt s lng k t ln: ifstream myFile(abc.txt, ios::in); if(myFile){

    myFile.seekg(sizeof(char)*5, ios::beg); myFile.seekg(sizeof(char)*5, ios::cur); cout

  • Chng 5: Lp

    82

    CHNG 5

    LP Ni dung chng ny tp trung trnh by cc vn lin quan n lp i tng trong C++:

    Khi nim, khai bo v s dng lp Khai bo v s dng cc thnh phn ca lp: cc thuc tnh v cc phng thc ca lp Phm vi truy nhp lp Khai bo v s dng cc phng thc khi to v hu b ca lp S dng lp thng qua con tr i tng, mng cc i tng.

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

    5.1.1 nh ngha lp i tng

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

    Trong :

    class: l tn t kha bt buc nh ngha mt lp i tng trong C++. Tn lp: do ngi dng t nh ngha. Tn lp c tnh cht nh tn kiu d liu s

    dng sau ny. Cch t tn lp phi tun th theo quy tc t tn bin trong C++. V d:

    class Car{ };

    l nh ngha mt lp xe t (Car). Lp ny cha c bt k mt thnh phn no, vic nh ngha cc thnh phn cho lp s c trnh by trong mc 5.2. Lu :

    T kha class l bt buc nh ngha mt lp i tng trong C++. Hn na, C++ c phn bit ch hoa ch thng trong khai bo cho nn ch class phi c vit bng ch thng. V d:

    class Car{ // nh ngha ng };

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

  • Chng 5: Lp

    83

    Bt buc phi c du chm phy ; cui nh ngha lp v C++ coi nh ngha mt lp nh nh ngha mt kiu d liu, cho nn phi c du chm phy cui nh ngha (tng t nh ngha kiu d liu kiu cu trc).

    phn bit vi tn bin thng thng, ta nn (nhng khng bt buc) t tn lp bt u bng mt ch in hoa v cc tn bin bt u bng mt ch in thng.

    5.1.2 S dng lp i tng

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

    ; Trong :

    Tn lp: l tn lp i tng c nh ngha trc khi khai bo bin. Tn bin lp: l tn i tng c th. Tn bin lp s c s dng nh cc bin thng

    thng trong C++, ngoi tr vic n c kiu lp i tng. V d, mun khai bo mt th hin (bin) ca lp Car c nh ngha trong mc 5.1.1, ta khai bo nh sau:

    Car myCar; Sau , ta c th s dng bin myCar trong chng trnh nh cc bin thng thng: truyn tham s cho hm, gn cho bin khc Lu :

    Khi khai bo bin lp, ta khng dng li t kha class na. T kha class ch c s dng khi nh ngha lp m khng dng khi khai bo bin lp.

    V d, khai bo: Car myCar; // ng

    l ng, nhng khai bo: class Car myCar; // Li c php

    l sai c php.

    5.2 CC THNH PHN CA LP Vic khai bo cc thnh phn ca lp c dng nh sau:

    class { private:

    protected:

    public: };

    Trong :

  • Chng 5: Lp

    84

    private: l t kha ch tnh cht ca C++ ch ra rng cc thnh phn c khai bo trong phm vi t kha ny l ring t i vi lp i tng. Cc i tng ca cc lp khc khng truy nhp c cc thnh phn ny.

    protected: cc thnh phn c khai bo trong phm vi t kha ny u c bo v. Qui nh loi i tng no c truy nhp n cc thnh phn c bo v s c m t chi tit trong mc 5.3.

    public: cc thnh phn cng cng. Cc i tng ca cc lp khc u c th truy nhp n cc thnh phn cng cng ca mt i tng bt k.

    Cc thnh phn ca lp c chia lm hai loi:

    Cc thnh phn ch d liu ca lp, c gi l thuc tnh ca lp Cc thnh phn ch hnh ng ca lp, c gi l phng thc ca lp.

    5.2.1 Thuc tnh ca lp

    Khai bo thuc tnh

    Thuc tnh ca lp l thnh phn cha d liu, c trng cho cc tnh cht ca lp. Thuc tnh ca lp c khai bo theo c php sau:

    ; Trong :

    Kiu d liu: c th l cc kiu d liu c bn ca C++, cng c th l cc kiu d liu phc tp do ngi dng t nh ngha nh struct, hoc kiu l mt lp c nh ngha trc .

    Tn thuc tnh: l tn thuc tnh ca lp, c tnh cht nh mt bin thng thng. Tn thuc tnh phi tun theo quy tc t tn bin ca C++.

    V d, khai bo: class Car{ private: int speed; public: char mark[20]; };

    l khai bo mt lp xe t (Car), c hai thuc tnh: thuc tnh tc (speed) c tnh cht private, thuc tnh nhn hiu xe (mark) c tnh cht public. Lu :

    Khng c khi to gi tr ban u cho cc thuc tnh ngay trong lp. V cc thuc tnh ch c gi tr khi n gn vi mt i tng c th, l mt th hin (bin) ca lp. V d:

    class Car{ private: int speed; // ng int weight = 500; // li

  • Chng 5: Lp

    85

    }; Kh nng truy nhp thuc tnh ca lp l ph thuc vo thuc tnh y c khai bo trong

    phm vi ca t kha no: private, protected hay public.

    Thng thng, do yu cu ng gi d liu ca hng i tng, ta nn khai bo cc thuc tnh c tnh cht ring t (ptivate). Nu mun cc i tng khc truy nhp c vo cc thuc tnh ny, ta xy dng cc hm public truy nhp (get / set) n thuc tnh .

    S dng thuc tnh

    Thuc tnh c th c s dng cho cc chng trnh nm ngoi lp thng qua tn bin lp hoc s dng ngay trong lp bi cc phng thc ca lp.

    Nu thuc tnh c dng bn ngoi phm vi lp, c php phi thng qua tn bin lp (cch ny ch s dng c vi cc bin c tnh cht public):

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

    ; V d, vi nh ngha lp:

    class Car{ private: int speed; public: char mark[20]; };

    ta khai bo mt bin lp: Car myCar;

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

  • Chng 5: Lp

    86

    Tn phng thc: do ngi dng t t tn, tun theo quy tc t tn bin ca C++. Cc tham s: Cc tham s u vo ca phng thc, c biu din bng kiu d liu

    tng ng. Cc tham s c phn cch bi du phy ,. Cc tham s l ty chn (Phn trong du ngoc vung [] l ty chn).

    V d, khai bo: class Car{ private: int speed; char mark[20]; public: void show(); };

    l nh ngha mt lp Car c hai thuc tnh cc b l speed v mark, v khai bo mt phng thc show() m t i tng xe tng ng. Show() l mt phng thc khng cn tham s v kiu tr v l void. Lu :

    Kh nng truy nhp phng thc t bn ngoi l ph thuc vo phng thc c khai bo trong phm vi ca t kha no: private, protected hay public.

    nh ngha phng thc

    Trong C++, vic ci t chi tit ni dung ca phng thc c th tin hnh ngay trong phm vi lp hoc bn ngoi phm vi nh ngha lp. C php ch khc nhau dng khai bo tn phng thc.

    Nu ci t phng thc ngay trong phm vi nh ngha lp, c php l: ([]){

    // Ci t chi tit }

    Nu ci t phng thc bn ngoi phm vi nh ngha lp, ta phi dng ch th phm vi :: ch ra rng y l mt phng thc ca lp m khng phi l mt hm t do trong chng trnh:

    ::([]){ // Ci t chi tit

    } V d, nu ci t phng thc show() ca lp Car ngay trong phm vi nh ngha lp, ta ci t nh sau:

    class Car{ private: int speed; // Tc char mark[20]; // Nhn hiu public: void show(){ // Khai bo phng thc ngay trong lp cout

  • Chng 5: Lp

    87

  • Chng 5: Lp

    88

    }; /* Khai bo phng thc bn ngoi lp */ void Car::show(){ cout

  • Chng 5: Lp

    89

    int getSpeed(); // c tc xe void setMark(char); // Gn nhn cho xe char[] getMark(); // c nhn xe void setPrice(float); // Gn gi cho xe float getPrice(); // c gi xe

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

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

    cout

  • Chng 5: Lp

    90

    void main(){ clrscr(); Car myCar; // Khai bo bin lp // Khi to ln th nht cout

  • Chng 5: Lp

    91

    Trong phm vi truy nhp lp, ta ch quan tm n hai phm vi ln nht, l phm vi lp v phm vi chng trnh. Trong C++, phm vi truy nhp lp c quy nh bi cc t kha v thuc tnh truy nhp:

    private: Cc thnh phn ca lp c thuc tnh private th ch c th c truy nhp trong phm vi lp.

    protected: Trong cng mt lp, thuc tnh protected cng c nh hng tng t nh thuc tnh private: cc thnh phn lp c thuc tnh protected ch c th c truy nhp trong phm vi lp. Ngoi ra n cn c th c truy nhp trong cc lp con khi c k tha (s c trnh by trong chng 6).

    public: cc thnh phn lp c thuc tnh public th c th c truy nhp trong phm vi chng trnh, c ngha l n c th c truy nhp trong cc hm t do, cc phng thc bn trong cc lp khc

    V d, thuc tnh price ca lp Car c tnh cht private nn ch c th truy nhp bi cc phng thc ca lp Car. Khng th truy nhp t bn ngoi lp (phm vi chng trnh), chng hn trong mt hm t do ngoi lp Car.

    void Car::setPrice(float priceIn){ price = priceIn; // ng, v setPrice l mt phng thc

    // ca lp Car }

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

    Khi , hm freeFunction phi truy nhp gin tip n thuc tnh price thng qua phng thc truy nhp c tnh cht public nh sau:

    void freeFunction(Car myCar){ myCar.setPrice(3000);// ng, v setPrice l mt phng thc ca // lp Car c thuc tnh public }

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

    5.3.2 Hm bn

    C hai kiu hm bn c bn trong C++:

    Mt hm t do l hm bn ca mt lp Mt hm thnh phn (phng thc) ca mt lp l bn ca mt lp khc

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

    Mt hm l bn ca nhiu lp

  • Chng 5: Lp

    92

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

    Mt hm bn ca mt lp c khai bo bng t kha friend khi khai bo khun mu hm trong lp tng ng.

    class { // Khai bo cc thnh phn lp nh thng thng // Khai bo hm bn friend ([]); };

    Khi , nh ngha chi tit hm bn c thc hin nh nh ngha mt hm t do thng thng: ([]){ // C th truy nhp trc tip cc thnh phn private

    // ca lp khai bo }

    Lu :

    Mc d hm bn c khai bo khun mu hm trong phm vi lp, nhng hm bn t do li khng phi l mt phng thc ca lp. N l hm t do, vic nh ngha v s dng hm ny hon ton tng t nh cc hm t do khc.

    Vic khai bo khun mu hm bn trong phm vi lp v tr no cng c: hm bn khng b nh hng bi cc t kha private, protected hay public trong lp.

    Trong hm bn, c th truy nhp trc tip n cc thnh phn private v protected ca i tng c kiu lp m n lm bn (truy nhp thng qua i tng c th).

    Chng trnh 5.2 minh ha vic nh ngha mt hm bn ca lp Car, hm ny so snh xem hai chic xe, chic no t hn.

    Chng trnh 5.2 #include #include #include /* nh ngha lp */ class Car{

    private: int speed; // Tc char mark[20]; // Nhn hiu float price; // Gi xe public: void init(int, char[], float);// Khi to thng tin v xe // Khai bo hm bn ca lp friend void moreExpensive(Car, Car);

    };

  • Chng 5: Lp

    93

    /* Khai bo phng thc bn ngoi lp */ void Car::init(int speedIn, char markIn[], float priceIn){ speed = speedIn; strcpy(mark, markIn); price = priceIn; return; } /* nh ngha hm bn t do */ void moreExpensive(Car car1, Car car2){

    if(car1.price > car2.price)//Truy nhp n cc thuc tnh private cout

  • Chng 5: Lp

    94

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

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

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

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

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

    Lu :

    Trong trng hp ny, hm f ch c nh ngha chi tit mt khi lp A c nh ngha chi tit. Do vy, ch c th nh ngha chi tit hm f ngay trong lp A ( bc 3) hoc sau khi nh ngha lp A ( bc 4), m khng th nh ngha chi tit hm f ngay trong lp B ( bc 2).

    Hm f c th truy nhp n cc thnh phn private v protected ca c hai lp A v B. Tuy nhin, mun f truy nhp n cc thnh phn ca lp A th phi thng qua mt i tng c th c kiu lp A.

    Chng trnh 5.3 minh ha vic ci t v s dng mt hm permission() ca lp Person, l hm bn ca lp Car. Hm ny thc hin vic kim tra xem mt ngi c quyn iu khin xe hay khng, theo lut sau:

    Vi cc loi xe thng thng, ngi iu khin phi 18 tui. Vi cc loi xe c tc cao hn 150km/h, ngi iu khin phi 21 tui.

    Chng trnh 5.3 #include #include #include class Car; // Khai bo nguyn mu lp /* nh ngha lp Person */ class Person{ private: char name[25]; // Tn int age; // Tui

  • Chng 5: Lp

    95

    public: void init(char[], int); // Khi to thng tin v ngi int permission(Car); // Xc nh quyn iu khin xe }; /* nh ngha lp Car */ class Car{

    private: int speed; // Tc char mark[20]; // Nhn hiu float price; // Gi xe public: void init(int, char[], float);// Khi to thng tin v xe