You are on page 1of 308

I HC QUC GIA H NI TRNG I HC CNG NGH Khoa Cng ngh Thng tin

PHM HNG THI

Bi ging

NGN NG LP TRNH C/C++

H Ni 2003

LI NI U
Ngn ng lp trnh (NNLT) C/C++ l mt trong nhng ngn ng lp trnh hng i tng mnh v ph bin hin nay do tnh mm do v a nng ca n. Khng ch cc ng dng c vit trn C/C++ m c nhng chng trnh h thng ln u c vit hu ht trn C/C++. C++ l ngn ng lp trnh hng i tng c pht trin trn nn tng ca C, khng nhng khc phc mt s nhc im ca ngn ng C m quan trng hn, C++ cung cp cho ngi s dng (NSD) mt phng tin lp trnh theo k thut mi: lp trnh hng i tng. y l k thut lp trnh c s dng hu ht trong cc ngn ng mnh hin nay, c bit l cc ngn ng hot ng trong mi trung Windows nh Microsoft Access, Visual Basic, Visual Foxpro Hin nay NNLT C/C++ c a vo ging dy trong hu ht cc trng i hc, Cao ng thay th mt s NNLT c nh FORTRAN, Pascal Tp bi ging ny c vit ra vi mc ch , trang b kin thc v k nng thc hnh cho sinh vin bt u hc vo NNLT C/C++ ti Khoa Cng ngh, i hc Quc gia H Ni. ph hp vi chng trnh, tp bi ging ny ch cp mt phn nh n k thut lp trnh hng i tng trong C++, l cc k thut ng gi d liu, phng thc v nh ngha mi cc ton t. Tn gi ca tp bi ging ny ni ln iu , c ngha ni dung ca bi ging thc cht l NNLT C c m rng vi mt s c im mi ca C++. V k thut lp trnh hng i tng (trong C++) s c trang b bi mt gio trnh khc. Tuy nhin ngn gn, trong tp bi ging ny tn gi C/C++ s c chng ti thay bng C++. Ni dung tp bi ging ny gm 8 chng. Phn u gm cc chng t 1 n 6 ch yu trnh by v NNLT C++ trn nn tng ca k thut lp trnh cu trc. Cc chng cn li (chng 7 v 8) s trnh by cc cu trc c bn trong C++ l k thut ng gi (lp v i tng) v nh ngha php ton mi cho lp. Tuy c nhiu c gng nhng do thi gian v trnh ngi vit c hn nn chc chn khng trnh khi sai st, v vy rt mong nhn c s gp ca bn c bi ging ngy cng mt hon thin hn. Tc gi.

Chng 1. Cc khi nim c bn ca C++

CHNG 1

CC KHI NIM C BN CA C++


Cc yu t c bn Mi trng lm vic ca C++ Cc bc to v thc hin mt chng trnh Vo/ra trong C++

I. CC YU T C BN Mt ngn ng lp trnh (NNLT) bc cao cho php ngi s dng (NSD) biu hin tng ca mnh gii quyt mt vn , bi ton bng cch din t gn vi ngn ng thng thng thay v phi din t theo ngn ng my (dy cc k hiu 0,1). Hin nhin, cc tng NSD mun trnh by phi c vit theo mt cu trc cht ch thng c gi l thut ton hoc gii thut v theo ng cc qui tc ca ngn ng gi l c php hoc vn phm. Trong gio trnh ny chng ta bn n mt ngn ng lp trnh nh vy, l ngn ng lp trnh C++ v lm th no th hin cc tng gii quyt vn bng cch vit thnh chng trnh trong C++. Trc ht, trong mc ny chng ta s trnh by v cc qui nh bt buc n gin v c bn nht. Thng thng cc qui nh ny s c nh dn trong qu trnh hc ngn ng, tuy nhin c mt vi khi nim tng i h thng v NNLT C++ chng ta trnh by s lc cc khi nim c bn . Ngi c tng lm quen vi cc NNLT khc c th c lt qua phn ny.
1. Bng k t ca C++

Hu ht cc ngn ng lp trnh hin nay u s dng cc k t ting Anh, cc k hiu thng dng v cc con s th hin chng trnh. Cc k t ca nhng ngn ng khc khng c s dng (v d cc ch ci ting Vit). Di y l bng k t c php dng to nn nhng cu lnh ca ngn ng C++. Cc ch ci la tinh (vit thng v vit hoa): a .. z v A .. Z. Cng mt ch ci nhng vit thng phn bit vi vit hoa. V d ch ci 'a' l khc vi 'A'. Du gch di: _ Cc ch s thp phn: 0, 1, . ., 9.

Chng 1. Cc khi nim c bn ca C++

Cc k hiu ton hc: +, -, *, /, % , &, ||, !, >, <, = ... Cc k hiu c bit khc: , ;: [ ], {}, #, du cch, ...
2. T kho

Mt t kho l mt t c qui nh trc trong NNLT vi mt ngha c nh, thng dng ch cc loi d liu hoc kt hp thnh cu lnh. NSD c th to ra nhng t mi ch cc i tng ca mnh nhng khng c php trng vi t kho. Di y chng ti lit k mt vi t kho thng gp, ngha ca cc t ny, s c trnh by dn trong cc mc lin quan.
auto, break, case, char, continue, default, do, double, else, externe, float, for, goto, if, int, long, register, return, short, sizeof, static, struct, switch, typedef, union, unsigned, while ...

Mt c trng ca C++ l cc t kho lun lun c vit bng ch thng.


3. Tn gi

phn bit cc i tng vi nhau chng cn c mt tn gi. Hu ht mt i tng c vit ra trong chng trnh thuc 2 dng, mt dng c sn trong ngn ng (v d cc t kho, tn cc hm chun ...), mt s do NSD to ra dng t tn cho hng, bin, kiu, hm ... cc tn gi do NSD t t phi tun theo mt s qui tc sau: L dy k t lin tip (khng cha du cch) v phi bt u bng ch ci hoc gch di. Phn bit k t in hoa v thng. Khng c trng vi t kha. S lng ch ci dng phn bit tn gi c th c t tu . Ch cc tn gi c sn ca C++ cng tun th theo ng qui tc trn. Trong mt chng trnh nu NSD t tn sai th trong qu trnh x l s b (trc khi chy chng trnh) my s bo li (gi l li vn phm). V d 1 : Cc tn gi sau y l ng (c php): i, i1, j, tinhoc, tin_hoc, luu_luong Cc tn gi sau y l sai (khng c php): 1i, tin hoc, luu-luong-nuoc Cc tn gi sau y l khc nhau: ha_noi, Ha_noi, HA_Noi, HA_NOI, ...

Chng 1. Cc khi nim c bn ca C++

4. Ch thch trong chng trnh

Mt chng trnh thng c vit mt cch ngn gn, do vy thng thng bn cnh cc cu lnh chnh thc ca chng trnh, NSD cn c php vit vo chng trnh cc cu ghi ch, gii thch lm r ngha hn chng trnh. Mt ch thch c th ghi ch v nhim v, mc ch, cch thc ca thnh phn ang c ch thch nh bin, hng, hm hoc cng dng ca mt on lnh ... Cc ch thch s lm cho chng trnh sng sa, d c, d hiu v v vy d bo tr, sa cha v sau. C 2 cch bo cho chng trnh bit mt on ch thch: Nu ch thch l mt on k t bt k lin tip nhau (trong 1 dng hoc trn nhiu dng) ta t on ch thch gia cp du ng m ch thch /* (m) v */ (ng). Nu ch thch bt u t mt v tr no cho n ht dng, th ta t du // v tr . Nh vy // s dng cho cc ch thch ch trn 1 dng. Nh nhc trn, vai tr ca on ch thch l lm cho chng trnh d hiu i vi ngi c, v vy i vi my cc on ch thch s c b qua. Li dng c im ny ca ch thch i khi tm thi b qua mt on lnh no trong chng trnh (nhng khng xo hn khi phi g li khi cn dng n) ta c th t cc du ch thch bao quanh on lnh ny (v d khi chy th chng trnh, g li ...), khi cn s dng li ta c th b cc du ch thch. Ch : Cp du ch thch /* ... */ khng c php vit lng nhau, v d dng ch thch sau l khng c php
/* y l on ch thch /* cha on ch thch ny */ nh on ch thch con */

cn phi sa li nh sau: hoc ch gi li cp du ch thch ngoi cng


/* y l on ch thch cha on ch thch ny nh on ch thch con */

hoc chia thnh cc on ch thch lin tip nhau


/* y l on ch thch */ /*cha on ch thch ny*/ /*nh on ch thch con */

II. MI TRNG LM VIC CA C++


1. Khi ng - Thot khi C++

Khi ng C++ cng nh mi chng trnh khc bng cch nhp p chut ln biu tng ca chng trnh. Khi chng trnh c khi ng s hin ra giao din gm c menu cng vic v mt khung ca s bn di phc v cho son tho. Mt con

Chng 1. Cc khi nim c bn ca C++

tr nhp nhy trong khung ca s v chng ta bt u nhp ni dung (vn bn) chng trnh vo trong khung ca s son tho ny. Mc ch ca gio trnh ny l trang b nhng kin thc c bn ca lp trnh thng qua NNLT C++ cho cc sinh vin mi bt u nn chng ti vn chn trnh by giao din ca cc trnh bin dch quen thuc l Turbo C hoc Borland C. V cc trnh bin dch khc c gi c th t tham kho trong cc ti liu lin quan. kt thc lm vic vi C++ (son tho, chy chng trnh ...) v quay v mi trng Windows chng ta n Alt-X.
2. Giao din v ca s son tho a. M t chung

Khi gi chy C++ trn mn hnh s xut hin mt menu x xung v mt ca s son tho. Trn menu gm c cc nhm chc nng: File, Edit, Search, Run, Compile, Debug, Project, Options, Window, Help. kch hot cc nhm chc nng, c th n Alt+ch ci biu th cho menu ca chc nng (l ch ci c gch di). V d m nhm chc nng File n Alt+F, sau dch chuyn hp sng n mc cn chn ri n Enter. thun tin cho NSD, mt s cc chc nng hay dng cn c gn vi mt t hp cc phm cho php ngi dng c th chn nhanh chc nng ny m khng cn thng qua vic m menu nh m t trn. Mt s t hp phm c th s c trnh by vo cui phn ny. Cc b chng trnh dch h tr ngi lp trnh mt mi trng tch hp tc ngoi chc nng son tho, n cn cung cp nhiu chc nng, tin ch khc gip ngi lp trnh va c th son tho vn bn chng trnh va gi chy chng trnh va g li Cc chc nng lin quan n son tho phn ln ging vi cc b son tho khc (nh WinWord) do vy chng ti ch trnh by tm tt m khng trnh by chi tit y.
b. Cc chc nng son tho

Ging hu ht cc b son tho vn bn, b son tho ca Turbo C hoc Borland C cng s dng cc phm sau cho qu trnh son tho: Dch chuyn con tr: cc phm mi tn cho php dch chuyn con tr sang tri, phi mt k t hoc ln trn, xung di 1 dng. dch chuyn nhanh c cc phm nh Home (v u dng), End (v cui dng), PgUp, PgDn (ln, xung mt trang mn hnh). dch chuyn xa hn c th kt hp cc phm ny cng phm Control (Ctrl, ^) nh ^PgUp: v u tp, ^PgDn: v cui tp. Chn, xo, sa: Phm Insert cho php chuyn ch son tho gia chn v . Cc phm Delete, Backspace cho php xo mt k t ti v tr con tr v

Chng 1. Cc khi nim c bn ca C++

trc v tr con tr (xo li). Cc thao tc vi khi dng: nh du khi dng (thc cht l khi k t lin nhau bt k) ta a con tr n v tr u n Ctrl-KB v Ctrl-KK ti v tr cui. Cng c th thao tc nhanh hn bng cch gi phm Shift v dng cc phm dch chuyn con tr qut t v tr u n v tr cui, khi khi k t uc nh du s chuyn mu nn. Mt khi c nh du c th dng ct, dn vo mt ni khc trong vn bn hoc xo khi vn bn. thc hin thao tc ct dn, u tin phi a khi nh du vo b nh m bng nhm phm Shift-Delete (ct), sau dch chuyn con tr n v tr mi cn hin ni dung va ct v n t hp phm Shift-Insert. Mt on vn bn c ghi vo b nh m c th c dn nhiu ln vo nhiu v tr khc nhau bng cch lp li t hp phm Shift-Insert ti cc v tr khc nhau trong vn bn. xo mt khi dng nh du m khng ghi vo b nh m, dng t hp phm Ctrl-Delete. Khi mt ni dung mi ghi vo b nh m th n s xo (ghi ) ni dung c c, do vy cn cn nhc s dng phm Ctrl-Delete (xo v khng lu li ni dung va xo vo b m) v Shift-Delete (xo v lu li ni dung va xo) mt cch ph hp. T hp phm Ctrl-A rt thun li khi cn nh du nhanh ton b vn bn.
c. Chc nng tm kim v thay th

Chc nng ny dng dch chuyn nhanh con tr vn bn n t cn tm. thc hin tm kim bm Ctrl-QF, tm kim v thay th bm Ctrl-QA. Vo t hoc nhm t cn tm vo ca s Find, nhm thay th (nu dng Ctrl-QA) vo ca s Replace v nh du vo cc tu chn trong ca s bn di sau n Enter. Cc tu chn gm: khng phn bit ch hoa/thng, tm t c lp hay ng trong t khc, tm trong ton vn bn hay ch trong phn c nh du, chiu tm i n cui hay ngc v u vn bn, thay th c hi li hay khng hi li dch chuyn con tr n cc vng khc nhau trong mt menu hay ca s cha cc tu chn ta s dng phm Tab.
d. Cc chc nng lin quan n tp

Ghi tp ln a: Chn menu File\Save hoc phm F2. Nu tn tp cha c (cn mang tn Noname.cpp) my s yu cu cho tn tp. Phn m rng ca tn tp c mc nh l CPP. Son tho tp mi: Chn menu File\New. Hin ra ca s son tho trng v tn file tm thi ly l Noname.cpp. Son tho tp c: Chn menu File\Open hoc n phm F3, nhp tn tp hoc dch chuyn con tr trong vng danh sch tp bn di n tn tp cn son ri n Enter. Cng c th p dng cch ny son tp mi khi khng nhp

Chng 1. Cc khi nim c bn ca C++

vo tn tp c th. Ghi tp ang son tho ln a vi tn mi: Chn menu File\Save As v nhp tn tp mi vo ri n Enter.
e. Chc nng dch v chy chng trnh

Ctrl-F9: Khi ng chc nng dch v chy ton b chng trnh. F4: Chy chng trnh t u n dng lnh hin ti (ang cha con tr) F7: Chy tng lnh mt ca hm main(), k c cc lnh con trong hm. F8: Chy tng lnh mt ca hm main(). Khi mi li gi hm c xem l mt lnh (khng chy tng lnh trong cc hm c gi). Cc chc nng lin quan n dch chng trnh c th c chn thng qua menu Compile (Alt-C).
f. Tm tt mt s phm nng hay dng

Cc phm kch hot menu: Alt+ch ci i din cho nhm menu . V d Alt-F m menu File chn cc chc nng c th trong n nh Open (m file), Save (ghi file ln a), Print (in ni dung vn bn chng trnh ra my in), Alt-C m menu Compile chn cc chc nng dch chng trnh. Cc phm dch chuyn con tr khi son tho. F1: m ca s tr gip. y l chc nng quan trng gip ngi lp trnh nh tn lnh, c php v cch s dng. F2: ghi tp ln a. F3: m tp c ra sa cha hoc son tho tp mi. F4: chy chng trnh n v tr con tr. F5: Thu hp/m rng ca s son tho. F6: Chuyn i gia cc ca s son tho. F7: Chy chng trnh theo tng lnh, k c cc lnh trong hm con. F8: Chy chng trnh theo tng lnh trong hm chnh. F9: Dch v lin kt chng trnh. Thng dng chc nng ny tm li c php ca chng trnh ngun trc khi chy. Alt-F7: Chuyn con tr v ni gy li trc . Alt-F8: Chuyn con tr n li tip theo.

Chng 1. Cc khi nim c bn ca C++

Ctrl-F9: Chy chng trnh. Ctrl-Insert: Lu khi vn bn c nh du vo b nh m. Shift-Insert: Dn khi vn bn trong b nh m vo vn bn ti v tr con tr. Shift-Delete: Xo khi vn bn c nh du, lu n vo b nh m. Ctrl-Delete: Xo khi vn bn c nh du (khng lu vo b nh m). Alt-F5: Chuyn sang ca s xem kt qu ca chng trnh va chy xong. Alt-X: thot C++ v li Windows.
3. Cu trc mt chng trnh trong C++

Mt chng trnh C++ c th c t trong mt hoc nhiu file vn bn khc nhau. Mi file vn bn cha mt s phn no ca chng trnh. Vi nhng chng trnh n gin v ngn thng ch cn t chng trn mt file. Mt chng trnh gm nhiu hm, mi hm ph trch mt cng vic khc nhau ca chng trnh. c bit trong cc hm ny c mt hm duy nht c tn hm l main(). Khi chy chng trnh, cc cu lnh trong hm main() s c thc hin u tin. Trong hm main() c th c cc cu lnh gi n cc hm khc khi cn thit, v cc hm ny khi chy li c th gi n cc hm khc na c vit trong chng trnh (tr vic gi quay li hm main()). Sau khi chy n lnh cui cng ca hm main() chng trnh s kt thc. C th, thng thng mt chng trnh gm c cc ni dung sau: Phn khai bo cc tp nguyn mu: khai bo tn cc tp cha nhng thnh phn c sn (nh cc hng chun, kiu chun v cc hm chun) m NSD s dng trong chng trnh. Phn khai bo cc kiu d liu, cc bin, hng ... do NSD nh ngha v c dng chung trong ton b chng trnh. Danh sch cc hm ca chng trnh (do NSD vit, bao gm c hm main()). Cu trc chi tit ca mi hm s c cp n trong chng 4. Di y l mt on chng trnh n gin ch gm 1 hm chnh l hm main(). Ni dung ca chng trnh dng in ra mn hnh dng ch: Cho cc bn, by gi l 2 gi.
#include <iostream.h> void main() { // khai bo tp nguyn mu // c s dng ton t in cout <<

Chng 1. Cc khi nim c bn ca C++

int h = 2, }

// Khai bo v khi to bin h = 2 // in ra mn hnh

cout << Cho cc bn, by gi l << h << " gi" ;

Dng u tin ca chng trnh l khai bo tp nguyn mu iostream.h. y l khai bo bt buc v trong chng trnh c s dng phng thc chun cout << (in ra mn hnh), phng thc ny c khai bo v nh ngha sn trong iostream.h. Khng ring hm main(), mi hm khc u phi bt u tp hp cc cu lnh ca mnh bi du { v kt thc bi du }. Tp cc lnh bt k bn trong cp du ny c gi l khi lnh. Khi lnh l mt c php cn thit trong cc cu lnh c cu trc nh ta s thy trong cc chng tip theo. III. CC BC TO V THC HIN MT CHNG TRNH
1. Qui trnh vit v thc hin chng trnh

Trc khi vit v chy mt chng trnh thng thng chng ta cn: 1. Xc nh yu cu ca chng trnh. Ngha l xc nh d liu u vo (input) cung cp cho chng trnh v tp cc d liu cn t c tc u ra (output). Cc tp hp d liu ny ngoi cc tn gi cn cn xc nh kiu ca n.V d gii mt phng trnh bc 2 dng: ax2 + bx + c = 0, cn bo cho chng trnh bit d liu u vo l a, b, c v u ra l nghim x1 v x2 ca phng trnh. Kiu ca a, b, c, x1, x2 l cc s thc. 2. Xc nh thut ton gii. 3. C th ho cc khai bo kiu v thut ton thnh dy cc lnh, tc vit thnh chng trnh thng thng l trn giy, sau bt u son tho vo trong my. Qu trnh ny c gi l son tho chng trnh ngun. 4. Dch chng trnh ngun tm v sa cc li gi l li c php. 5. Chy chng trnh, kim tra kt qu in ra trn mn hnh. Nu sai, sa li chng trnh, dch v chy li kim tra. Qu trnh ny c thc hin lp i lp li cho n khi chng trnh chy tt theo yu cu ra ca NSD.
2. Son tho tp chng trnh ngun

Son tho chng trnh ngun l mt cng vic n gin: g ni dung ca chng trnh ( vit ra giy) vo trong my v lu li n ln a. Thng thng khi lu li chng trnh ln a ln sau s khng cn phi g li. C th son chng trnh ngun trn cc b son tho (editor) khc nhng phi chy trong mi trng tch hp

Chng 1. Cc khi nim c bn ca C++

C++ (Borland C, Turbo C). Mc ch ca son tho l to ra mt vn bn chng trnh v a vo b nh ca my. Vn bn chng trnh cn c trnh by sng sa, r rng. Cc cu lnh cn ging thng ct theo cu trc ca lnh (cc lnh cha trong mt lnh cu trc c trnh by tht vo trong so vi im bt u ca lnh). Cc ch thch nn ghi ngn gn, r ngha v ph hp.
3. Dch chng trnh

Sau khi son tho xong chng trnh ngun, bc tip theo thng l dch (n t hp phm Alt-F9) tm v sa cc li gi l li c php. Trong khi dch C++ s t con tr vo ni gy li (vit sai c php) trong vn bn. Sau khi sa xong mt li NSD c th dng Alt-F8 chuyn con tr n li tip theo hoc dch li. chuyn con tr v ngc li li trc c th dng Alt-F7. Qu trnh sa li dch c lp li cho n khi vn bn c sa ht li c php. Sn phm sau khi dch l mt tp mi gi l chng trnh ch c ui EXE tc l tp m my thc hin.Tp ny c th lu tm thi trong b nh phc v cho qu trnh chy chng trnh hoc lu li trn a tu theo tu chn khi dch ca NSD. Trong v sau khi dch, C++ s hin mt ca s cha thng bo v cc li (nu c), hoc thng bo chng trnh c dch thnh cng (khng cn li). Cc li ny c gi l li c php. dch chng trnh ta chn menu \Compile\Compile hoc \Compile\Make hoc nhanh chng hn bng cch n t hp phm Alt-F9.

4. Chy chng trnh

n Ctrl-F9 chy chng trnh, nu chng trnh cha dch sang m my, my s t ng dch li trc khi chy. Kt qu ca chng trnh s hin ra trong mt ca s kt qu NSD kim tra. Nu kt qu cha c nh mong mun, quay li vn bn sa v li chy li chng trnh. Qu trnh ny c lp li cho n khi chng trnh chy ng nh yu cu ra. Khi chng trnh chy, ca s kt qu s hin ra tm thi che khut ca s son tho. Sau khi kt thc chy chng trnh ca s son tho s t ng hin ra tr li v che khut ca s kt qu. xem li kt qu hin n Alt-F5. Sau khi xem xong quay li ca s son tho n phm bt k. IV. VO/RA TRONG C++ Trong phn ny chng ta lm quen mt s lnh n gin cho php NSD nhp d liu vo t bn phm hoc in kt qu ra mn hnh. Trong phn sau ca gio trnh chng ta s kho st cc cu lnh vo/ra phc tp hn

Chng 1. Cc khi nim c bn ca C++

1. Vo d liu t bn phm

nhp d liu vo cho cc bin c tn bin_1, bin_2, bin_3 chng ta s dng cu lnh:
cin >> bin_1 ; cin >> bin_2 ; cin >> bin_3 ;

hoc:
cin >> bin_1 >> bin_2 >> bin_3 ; bin_1, bin_2, bin_3 l cc bin c s dng lu tr cc gi tr NSD nhp

vo t bn phm. Khi nim bin s c m t c th hn trong chng 2, y bin_1, bin_2, bin_3 c hiu l cc tn gi ch 3 gi tr khc nhau. Hin nhin c th nhp d liu nhiu hn 3 bin bng cch tip tc vit tn bin vo bn phi sau du >> ca cu lnh. Khi chy chng trnh nu gp cc cu lnh trn chng trnh s "tm dng" ch NSD nhp d liu vo cho cc bin. Sau khi NSD nhp xong d liu, chng trnh s tip tc chy t cu lnh tip theo sau ca cc cu lnh trn. Cch thc nhp d liu ca NSD ph thuc vo loi gi tr ca bin cn nhp m ta gi l kiu, v d nhp mt s c cch thc khc vi nhp mt chui k t. Gi s cn nhp di hai cnh ca mt hnh ch nht, trong cnh di c qui c bng tn bin cd v chiu rng c qui c bi tn bin cr. Cu lnh nhp s nh sau:
cin >> cd >> cr ;

Khi my dng ch nhp d liu NSD s g gi tr c th ca cc chiu di, rng theo ng th t trong cu lnh. Cc gi tr ny cn cch nhau bi t nht mt du trng (ta qui c gi du trng l mt trong 3 loi du c nhp bi cc phm sau: phm spacebar (du cch), phm tab (du tab) hoc phm Enter (du xung dng)). Cc gi tr NSD nhp vo cng c hin th trn mn hnh NSD d theo di. V d nu NSD nhp vo 23 11 th chng trnh s gn gi tr 23 cho bin cd v 11 cho bin cr. Ch : gi s NSD nhp 2311 (khng c du cch gia 23 v 11) th chng trnh s xem 2311 l mt gi tr v gn cho cd. My s tm dng ch NSD nhp tip gi tr cho bin cr.
2. In d liu ra mn hnh

in gi tr ca cc biu thc ra mn hnh ta dng cu lnh sau:


cout << bt_1 ;

10

Chng 1. Cc khi nim c bn ca C++

cout << bt_2 ; cout << bt_3 ;

hoc:
cout << bt_1 << bt_2 << bt_3 ;

cng ging cu lnh nhp y chng ta cng c th m rng lnh in vi nhiu hn 3 biu thc. Cu lnh trn cho php in gi tr ca cc biu thc bt_1, bt_2, bt_3. Cc gi tr ny c th l tn ca bin hoc cc kt hp tnh ton trn bin. V d in cu "Chiu di l " v s 23 v tip theo l ch "mt", ta c th s dng 3 lnh sau y:
cout << "Chiu di l" ; cout << 23 ; cout << "mt";

hoc c th ch bng 1 lnh:


cout << "Chiu di l 23 mt" ;

Trng hp cha bit gi tr c th ca chiu di, ch bit hin ti gi tr ny c lu trong bin cd (v d c nhp vo l 23 t bn phm bi cu lnh cin >> cd trc ) v ta cn bit gi tr ny l bao nhiu th c th s dng cu lnh in ra mn hnh.
cout << "Chiu di l" << cd << "mt" ;

Khi trn mn hnh s hin ra dng ch: "Chiu di l 23 mt". Nh vy trong trng hp ny ta phi dng n ba ln du php ton << ch khng phi mt nh cu lnh trn. Ngoi ra ph thuc vo gi tr hin c lu trong bin cd, chng trnh s in ra s chiu di thch hp ch khng ch in c nh thnh "chiu di l 23 mt". V d nu cd c nhp l 15 th lnh trn s in cu "chiu di l 15 mt". Mt gi tr cn in khng ch l mt bin nh cd, cr, ... m cn c th l mt biu thc, iu ny cho php ta d dng yu cu my in ra din tch v chu vi ca hnh ch nht khi bit cd v cr bng cc cu lnh sau:
cout << "Din tch = " << cd * cr ; cout << "Chu vi = " << 2 * (cd + cr) ;

hoc gp tt c thnh 1 cu lnh:


cout << Din tch = " << cd * cr << \n << " Chu vi = " << 2 * (cd + cr) ;

y c mt k t c bit: l k t '\n' k hiu cho k t xung dng, khi gp k t ny chng trnh s in cc phn tip theo u dng k tip. Do kt qu ca cu lnh trn l 2 dng sau y trn mn hnh: 11

Chng 1. Cc khi nim c bn ca C++

Din tch = 253 Chu vi = 68

y 253 v 68 ln lt l cc gi tr m my tnh c t cc biu thc cd * cr, v 2 * (cd + cr) trong cu lnh in trn. Ch : s dng cc cu lnh nhp v in trong phn ny, u chng trnh phi c dng khai bo #include <iostream.h>. Thng thng ta hay s dng lnh in in cu thng bo nhc NSD nhp d liu trc khi c cu lnh nhp. Khi trn mn hnh s hin dng thng bo ny ri mi tm dng ch d liu nhp vo t bn phm. Nh vo thng bo ny NSD s bit phi nhp d liu, nhp ni dung g v nh th no ... v d:
cout << "Hy nhp chiu di: "; cin >> cd; cout << "V nhp chiu rng: "; cin >> cr;

khi my s in dng thng bo "Hy nhp chiu di: " v ch sau khi NSD nhp xong 23 , my s thc hin cu lnh tip theo tc in dng thng bo "V nhp chiu rng: " v ch n khi NSD nhp xong 11 chng trnh s tip tc thc hin cc cu lnh tip theo. V d 2 : T cc tho lun trn ta c th vit mt cch y chng trnh tnh din tch v chu vi ca mt hnh ch nht. chng trnh c th tnh vi cc b gi tr khc nhau ca chiu di v rng ta cn lu gi tr ny vo trong cc bin (v d cd, cr).
#include <iostream.h> void main() { float cd, cr ; // khai bo cc bin c tn cd, cr cha di cc cnh // nhp d liu // in kt qu cout << "Hy nhp chiu di: " ; cin >> cd ; cout << "Hy nhp chiu rng: " ; cin >> cr ; cout << "Din tch = " << cd * cr << '\n' ; cout << "Chu vi = " << 2 * (cd + cr) << '\n'; return ; } // khai bo tp nguyn mu dng c cin, cout // y l hm chnh ca chng trnh

Chng trnh ny c th g vo my v chy. Khi chy n cu lnh nhp, chng trnh dng ch nhn chiu di v chiu rng, NSD nhp cc gi tr c th, chng trnh s tip tc thc hin v in ra kt qu. Thng qua cu lnh nhp d liu v 2 bin cd, cr NSD c th yu cu chng trnh cho kt qu ca mt hnh ch nht bt

12

Chng 1. Cc khi nim c bn ca C++

k ch khng ch trong trng hp hnh c chiu di 23 v chiu rng 11 nh trong v d c th trn.

3. nh dng thng tin cn in ra mn hnh

Mt s nh dng n gin c chng ti trnh by trc y. Cc nh dng chi tit v phc tp hn s c trnh by trong cc phn sau ca gio trnh. s dng cc nh dng ny cn khai bo file nguyn mu <iomanip.h> u chng trnh bng ch th #include <iomanip.h>. endl: Tng ng vi k t xung dng '\n'. setw(n): Bnh thng cc gi tr c in ra bi lnh cout << s thng theo l tri vi rng ph thuc vo rng ca gi tr . Phng thc ny qui nh rng dnh in ra cc gi tr l n ct mn hnh. Nu n ln hn di thc ca gi tr, gi tr s in ra theo l phi, trng phn tha (du cch) trc. setprecision(n): Ch nh s ch s ca phn thp phn in ra l n. S s c lm trn trc khi in ra. setiosflags(ios::showpoint): Phng thc setprecision ch c tc dng trn mt dng in. c nh cc gi tr t cho mi dng in (cho n khi t li gi tr mi) ta s dng phng thc setiosflags(ios::showpoint). V d sau minh ho cch s dng cc phng thc trn. V d 3 :
#include <iostream.h> #include <iomanip.h> #include <conio.h> void main() { clrscr();
// xo mn hnh // s dng cout << // s dng cc nh dng // s dng cc hm clrscr() v getch()

cout << "CHI TIU" << endl << "=======" << endl ; cout << setiosflags(ios::showpoint) << setprecision(2) ; cout << "Sch v" << setw(20) << 123.456 << endl; cout << "Thc n" << setw(20) << 2453.6 << endl; cout << "Qun o lnh" << setw(15) << 3200.0 << endl;

13

Chng 1. Cc khi nim c bn ca C++

getch(); return ; }

// tm dng ( xem kt qu) // kt thc thc hin hm main()

Chng trnh ny khi chy s in ra bng sau: CHI TIU ======== Sch v Thc n Qun o lnh

123.46 2453.60 3200.00

Ch : ton t nhp >> ch yu lm vic vi d liu kiu s. nhp k t hoc xu k t, C++ cung cp cc phng thc (hm) sau: cin.get(c): cho php nhp mt k t vo bin k t c, cin.getline(s,n): cho php nhp ti a n-1 k t vo xu s. cc hm trn khi thc hin s ly cc k t cn li trong b nh m (ca ln nhp trc) gn cho c hoc s. Do ton t cin >> x s li k t xung dng trong b m nn k t ny s lm tri cc lnh sau nh cin.get(c), cin.getline(s,n) (my khng dng nhp cho c hoc s). V vy trc khi s dng cc phng thc cin.get(c) hoc cin.getline(s,n) nn s dng phng thc cin.ignore(1) ly ra k t xung dng cn st li trong b m. V d on lnh sau cho php nhp mt s nguyn x (bng ton t >>) v mt k t c (bng phng thc cin.get(c)):
int x; char c; cin >> x; cin.ignore(1); cin.get(c);

4. Vo/ra trong C

Trong phn trn chng ti trnh by 2 ton t vo/ra v mt s phng thc, hm nhp v nh dng trong C++. Phn ny chng ti trnh by cc cu lnh nhp xut theo khun dng c trong C. Hin nhin cc cu lnh ny vn dng c trong chng trnh vit bng C++, tuy nhin ch nn s dng hoc cc cu lnh ca C++ hoc ca C, khng nn dng ln ln c hai v d gy nhm ln. Do mc ny ch c

14

Chng 1. Cc khi nim c bn ca C++

gi tr tham kho bn c c th hiu c cc cu lnh vo/ra trong cc chng trnh vit theo NNLT C c.
a. In kt qu ra mn hnh

in cc gi tr bt_1, bt_2, , bt_n ra mn hnh theo mt khun dng mong mun ta c th s dng cu lnh sau y:
printf(dng nh dng, bt_1, bt_2, ..., bt_n) ;

trong dng nh dng l mt dy k t t trong cp du nhy kp () qui nh khun dng cn in ca cc gi tr bt_1, bt_2, , bt_n. Cc bt_i c th l cc hng, bin hay cc biu thc tnh ton. Cu lnh trn s in gi tr ca cc bt_i ny theo th t xut hin ca chng v theo qui nh c cho trong dng nh dng. V d, gi s x = 4, cu lnh:
printf(%d %0.2f, 3, x + 1) ;

s in cc s 3 v 5.00 ra mn hnh, trong 3 c in di dng s nguyn (c qui nh bi %d) v x + 1 (c gi tr l 5) c in di dng s thc vi 2 s l thp phn (c qui nh bi %0.2f). C th, cc k t i sau k hiu % dng nh dng vic in gm c: d in s nguyn di dng h thp phn o in s nguyn dng h 8 x, X in s nguyn dng h 16 u in s nguyn dng khng du c in k t s in xu k t e, E in s thc dng du phy ng f in s thc dng du phy tnh Cc k t trn phi i sau du %. Cc k t nm trong dng nh dng nu khng i sau % th s c in ra mn hnh. Mun in % phi vit 2 ln (tc %%). V d cu lnh: printf(T l hc sinh gii: %0.2f %%, 32.486) ; s in cu T l hc sinh gii: , tip theo s in s 32.486 c lm trn n 2 s l thp phn lp vo v tr ca %0.2f, v cui cng s in du % (do c %% trong dng nh dng). Cu c in ra mn hnh s l:
T l hc sinh gii: 32.49%

Ch : Mi bt_i cn in phi c mt nh dng tng ng trong dng nh dng.

15

Chng 1. Cc khi nim c bn ca C++

V d cu lnh trn cng c th vit:


printf(%s %0.2f , T l hc sinh gii: , 32.486);

trong cu lnh ny c 2 biu thc cn in. Biu thc th nht l xu k t T l hc sinh gii: c in vi khun dng %s (in xu k t) v biu thc th hai l 32.486 c in vi khun dng %0.2f (in s thc vi 2 s l phn thp phn). Nu gia k t % v k t nh dng c s biu th rng cn in th gi tr in ra s c ging ct sang l phi, trng cc du cch pha trc. Nu rng m (thm du tr pha trc) s ging ct sang l tri. Nu khng c rng hoc rng bng 0 (v d %0.2f) th rng c t iu chnh ng bng rng ca gi tr cn in. Du + trc rng in gi tr s km theo du (dng hoc m) Trc cc nh dng s cn thm k t l (v d ld, lf) khi in s nguyn di long hoc s thc vi chnh xc gp i double. V d 4 :
main() { int i = 2, j = 3 ; printf(Chng trnh tnh tng 2 s nguyn:\ni + j = %d, i+j); }

s in ra:
Chng trnh tnh tng 2 s nguyn: i + j = 5.

b. Nhp d liu t bn phm scanf(dng nh dng, bin_1, bin_2, ..., bin_n) ;

Lnh ny cho php nhp d liu vo cho cc bin bin_1, , bin_n. Trong dng nh dng cha cc nh dng v kiu bin (nguyn, thc, k t ) c vit nh trong m t cu lnh printf. Cc bin c vit di dng a ch ca chng tc c du & trc mi tn bin. V d cu lnh:
scanf(%d %f %ld, &x, &y, &z) ;

cho php nhp gi tr cho cc bin x, y, z trong x l bin nguyn, y l bin thc v z l bin nguyn di (long). Cu lnh:

16

Chng 1. Cc khi nim c bn ca C++

scanf(%2d %f %lf %3s, &i, &x, &d, s);

cho php nhp gi tr cho cc bin i, x, d, s, trong i l bin nguyn c 2 ch s, f l bin thc ( di ty ), d l bin nguyn di v s l xu k t c 3 k t. Gi s NSD nhp vo dy d liu: 12345 67abcd th cc bin trn s c gn cc gi tr nh sau: i = 12, x = 345, d = 67 v s = abc. K t d v du enter () s c lu li trong b nh v t ng gn cho cc bin ca ln nhp sau. Cui cng, chng trnh trong v d 3 c vit li vi printf() v scanf() nh sau: V d 5 :
#include <stdio.h> #include <conio.h> void main() { clrscr(); // xo mn hnh printf("CHI TIU\n=======\n") ; printf("Sch v %20.2f\n" , 123.456) ; printf("Thc n %20.2f\n" , 2453.6) ; printf(Qun o lnh %15.2f\n" , 3200.0) ; getch(); return ; } // tm dng ( xem kt qu) // kt thc thc hin hm main() // s dng cc hm printf() v scanf() // s dng cc hm clrscr() v getch()

BI TP
1. Nhng tn gi no sau y l hp l:
x RADIUS 123variabe one.0 tin_hoc number# toan tin so-dem Radius nam2000

2. 3.

Bn hy th vit mt chng trnh ngn nht c th c. Tm cc li c php trong chng trnh sau:

17

Chng 1. Cc khi nim c bn ca C++

#include (iostream.h) void main(); { cout << 'Day la chng trnh: Gptb1.\nXin chao cac ban'; getch(); } / Gii phng trnh bc 1

4.

Vit chng trnh in ni dung mt bi th no .

5. Vit chng trnh in ra 4 dng, 2 ct gm cc s sau v ging ct: 0.63 64.1 thng theo l tri 12.78 -11.678 thng theo l phi thng theo du chm thp phn 6. 7. -124. 6 65.7 Hy vit v chy cc chng trnh trong cc v d 3, 5. Chng trnh sau khai bo 5 bin k t a, b, c, d, e v mt bin s nam. Hy in thm cc cu lnh vo cc dng chng trnh thc hin nhim v sau: Nhp gi tr cho bin nam Nhp gi tr cho cc bin k t a, b, c, d, e. In ra mn hnh dng ch c ghp bi 5 k t nhp v ch "nm" sau in s nhp (nam). V d nu 5 ch ci nhp l 'H', 'A', 'N', 'O', 'I' v nam c nhap l 2000, th mn hnh in ra dng ch: HANOI nm 2000. Nhp chng trnh sa vo my v chy kim tra kt qu.
#include <iostream.h> #include <conio.h> main() { int nam; char a, b, c, d, e; clrscr(); cin >> nam ; ; cin.get(a); cin.get(b); cin.get(c); ; ;

59.002 -1200.654

18

Chng 1. Cc khi nim c bn ca C++

// in kt qu cout << a << << << << << " nam " << ; getch(); }

19

Chng 2. Kiu d liu, biu thc v cu lnh

CHNG 2

KIU D LIU, BIU THC V CU LNH


Kiu d liu n gin Hng - khai bo v s dng hng Bin - khai bo v s dng bin Php ton, biu thc v cu lnh Th vin cc hm ton hc

I. KIU D LIU N GIN


1. Khi nim v kiu d liu

Thng thng d liu hay dng l s v ch. Tuy nhin vic phn chia ch 2 loai d liu l khng . d dng hn cho lp trnh, hu ht cc NNLT u phn chia d liu thnh nhiu kiu khc nhau c gi l cc kiu c bn hay chun. Trn c s kt hp cc kiu d liu chun, NSD c th t t ra cc kiu d liu mi phc v cho chng trnh gii quyt bi ton ca mnh. C ngha lc mi i tng c qun l trong chng trnh s l mt tp hp nhiu thng tin hn v c to thnh t nhiu loi (kiu) d liu khc nhau. Di y chng ta s xt n mt s kiu d liu chun c qui nh sn bi C++. Mt bin nh bit l mt s nh lin tip no trong b nh dng lu tr d liu (vo, ra hay kt qu trung gian) trong qu trnh hot ng ca chng trnh. qun l cht ch cc bin, NSD cn khai bo cho chng trnh bit trc tn bin v kiu ca d liu c cha trong bin. Vic khai bo ny s lm chng trnh qun l cc bin d dng hn nh trong vic phn b b nh cng nh qun l cc tnh ton trn bin theo nguyn tc: ch c cc d liu cng kiu vi nhau mi c php lm ton vi nhau. Do , khi cp n mt kiu chun ca mt NNLT, thng thng chng ta s xt n cc yu t sau: tn kiu: l mt t dnh ring ch nh kiu ca d liu. s byte trong b nh lu tr mt n v d liu thuc kiu ny: Thng thng s byte ny ph thuc vo cc trnh bin dch v h thng my khc nhau, y ta ch xt n h thng my PC thng dng hin nay. Min gi tr ca kiu: Cho bit mt n v d liu thuc kiu ny s c th ly

20

Chng 2. Kiu d liu, biu thc v cu lnh

gi tr trong min no, v d nh nht v ln nht l bao nhiu. Hin nhin cc gi tr ny ph thuc vo s byte m h thng my qui nh cho tng kiu. NSD cn nh n min gi tr ny khai bo kiu cho cc bin cn s dng mt cch thch hp. Di y l bng tm tt mt s kiu chun n gin v cc thng s ca n c s dng trong C++. Loi d liu K t S nguyn Tn kiu
char unsigned char int unsigned int short long

S nh 1 byte 1 byte 2 byte 2 byte 2 byte 4 byte 4 byte 8 byte

Min gi tr 128 .. 127 0 .. 255 32768 .. 32767 0 .. 65535 32768 .. 32767 215 .. 215 1 10 -37 . . 10 +38 10 -307 . . 10 +308

S thc

float double

Bng 1. Cc loi kiu n gin Trong chng ny chng ta ch xt cc loi kiu n gin trn y. Cc loi kiu c cu trc do ngi dng nh ngha s c trnh by trong cc chng sau.
2. Kiu k t

Mt k t l mt k hiu trong bng m ASCII. Nh bit mt s k t c mt ch trn bn phm (v d cc ch ci, ch s) trong khi mt s k t li khng (v d k t biu din vic li li mt trong vn bn, k t ch vic kt thc mt dng hay kt thc mt vn bn). Do vy biu din mt k t ngi ta dng chnh m ASCII ca k t trong bng m ASCII v thng gi l gi tr ca k t. V d pht biu "Cho k t 'A'" l cng tng ng vi pht biu "Cho k t 65" (65 l m ASCII ca k t 'A'), hoc "Xo k t xung dng" l cng tng ng vi pht biu "Xo k t 13" v 13 l m ASCII ca k t xung dng. Nh vy mt bin kiu k t c th c nhn gi tr theo 2 cch tng ng ch hoc gi tr s: v d gi s c l mt bin k t th cu lnh gn c = 'A' cng tng ng vi cu lnh gn c = 65. Tuy nhin s dng gi tr s ca mt k t c no ta phi yu cu i c sang gi tr s bng cu lnh int(c). Theo bng trn ta thy c 2 loi k t l char vi min gi tr t -128 n 127 v

21

Chng 2. Kiu d liu, biu thc v cu lnh

unsigned char (k t khng du) vi min gi tr t 0 n 255. Trng hp mt bin

c gn gi tr vt ra ngoi min gi tr ca kiu th gi tr ca bin s c tnh theo m b (256 c). V d nu gn cho char c gi tr 179 (vt khi min gi tr c qui nh ca char) th gi tr thc s c lu trong my s l (256 179) = 77. V d 1 :
char c, d ; unsigned e ; c = 65 ; d = 179 ; e = 179; f = 330 ; cout << c << int(c) ; cout << d << int(d) ; cout << e << int(e) cout << f << int(f) // c, d c php gn gi tr t -128 n 127 // e c php gn gi tr t 0 n 255 // d c gi tr ngoi min cho php // f c gi tr ngoi min cho php // in ra ch ci 'A' v gi tr s 65 // in ra l k t '|' v gi tr s -77 // in ra l k t '|' v gi tr s 179 // in ra l k t 'J' v gi tr s 74

Ch : Qua v d trn ta thy mt bin nu c gn gi tr ngoi min cho php s dn n kt qu khng theo suy ngh thng thng. Do vy nn tun th qui tc ch gn gi tr cho bin thuc min gi tr m kiu ca bin qui nh. V d nu mun s dng bin c gi tr t 128 .. 255 ta nn khai bo bin di dng k t khng du (unsigned char), cn nu gi tr vt qu 255 ta nn chuyn sang kiu nguyn (int) chng hn.
3. Kiu s nguyn

Cc s nguyn c phn chia thnh 4 loi kiu khc nhau vi cc min gi tr tng ng c cho trong bng 1. l kiu s nguyn ngn (short) tng ng vi kiu s nguyn (int) s dng 2 byte v s nguyn di (long int) s dng 4 byte. Kiu s nguyn thng c chia lm 2 loi c du (int) v khng du (unsigned int hoc c th vit gn hn l unsigned). Qui tc m b cng c p dng nu gi tr ca bin vt ra ngoi min gi tr cho php, v vy cn cn nhc khi khai bo kiu cho cc bin. Ta thng s dng kiu int cho cc s nguyn trong cc bi ton vi min gi tr va phi (c gi tr tuyt i b hn 32767), chng hn cc bin m trong cc vng lp, ...
4. Kiu s thc

s dng s thc ta cn khai bo kiu float hoc double m min gi tr ca chng c cho trong bng 1. Cc gi tr s kiu double c gi l s thc vi chnh xc gp i v vi kiu d liu ny my tnh c cch biu din khc so vi kiu

22

Chng 2. Kiu d liu, biu thc v cu lnh

float m bo s s l sau mt s thc c th tng ln m bo tnh chnh xc cao hn so vi s kiu float. Tuy nhin, trong cc bi ton thng dng thng ngy chnh xc ca s kiu float l dng.

Nh nhc n trong phn cc lnh vo/ra chng 1, lin quan n vic in n s thc ta c mt vi cch thit t dng in theo mun, v d rng ti thiu in mt s hay s s l thp phn cn in ... V d 2 : Chng trnh sau y s in din tch v chu vi ca mt hnh trn c bn knh 2cm vi 3 s l.
#include <iostream.h> #include <iomanip.h> void main() { float r = 2 ; // r l tn bin dng cha bn knh cout << "Din tch = " << setiosflags(ios::showpoint) ; cout << setprecision(3) << r * r * 3.1416 ; getch() ; }

II. HNG - KHAI BO V S DNG HNG Hng l mt gi tr c nh no v d 3 (hng nguyn), 'A' (hng k t), 5.0 (hng thc), "Ha noi" (hng xu k t). Mt gi tr c th c hiu di nhiu kiu khc nhau, do vy khi vit hng ta cng cn c dng vit thch hp.
1. Hng nguyn

kiu short, int: 3, -7, ... kiu unsigned: 3, 123456, ... kiu long, long int: 3L, -7L, 123456L, ... (vit L vo cui mi gi tr) Cc cch vit trn l th hin ca s nguyn trong h thp phn, ngoi ra chng cn c vit di cc h m khc nh h c s 8 hoc h c s 16. Mt s nguyn trong c s 8 lun lun c vit vi s 0 u, tng t vi c s 16 phi vit vi 0x u. V d ta bit 65 trong c s 8 l 101 v trong c s 16 l 41, do 3 cch vit 65, 0101, 0x41 l nh nhau, cng biu din gi tr 65.

23

Chng 2. Kiu d liu, biu thc v cu lnh

2. Hng thc

Mt s thc c th c khai bo di dng kiu float hoc double v cc gi tr ca n c th c vit di mt trong hai dng.
a. Dng du phy tnh

Theo cch vit thng thng. V d: 3.0, -7.0, 3.1416, ...


b. Dng du phy ng

Tng qut, mt s thc x c th c vit di dng: men hoc mEn, trong m c gi l phn nh tr, n gi l phn bc (hay m). S men biu th gi tr x = m x 10n. V d s = 3.1416 c th c vit: = = 0.031416e2 = 0.31416e1 = 3.1416e0 = 31.416e1 = 314.16e2 = v = 0.031416 x 102 = 0.31416 x 101 = 3.1416 x 100 = Nh vy mt s x c th c vit di dng mEn vi nhiu gi tr m, n khc nhau, ph thuc vo du phy ngn cch phn nguyn v phn thp phn ca s. Do vy cch vit ny c gi l dng du phy ng.
3. Hng k t a. Cch vit hng

C 2 cch vit mt hng k t. i vi cc k t c mt ch th hin ta thng s dng cch vit thng dng l t mt ch gia 2 du nhy n nh: 'A', '3', ' ' (du cch) ... hoc s dng trc tip gi tr s ca chng. V d cc gi tr tng ng ca cc k t trn l 65, 51 v 32. Vi mt s k t khng c mt ch ta buc phi dng gi tr (s) ca chng, nh vit 27 thay cho k t c nhn bi phm Escape, 13 thay cho k t c nhn bi phm Enter ... biu din k t bng gi tr s ta c th vit trc tip (khng dng cp du nhy n) gi tr di dng h s 10 (nh trn) hoc t chng vo cp du nhy n, trng hp ny ch dng cho gi tr vit di dng h 8 hoc h 16 theo mu sau: '\kkk': khng qu 3 ch s trong h 8. V d '\11' biu din k t c m 9. '\xkk': khng qu 2 ch s trong h 16. V d '\x1B' biu din k t c m 27. Tm li, mt k t c th c nhiu cch vit, chng hn 'A' c gi tr l 65 (h 10) hoc 101 (h 8) hoc 41 (h 16), do k t 'A' c th vit bi mt trong cc dng sau: 65, 0101, 0x41 hoc 'A' , '\101' , '\x41' Tng t, du kt thc xu c gi tr 0 nn c th vit bi 0 hoc '\0' hoc '\x0', trong cc cch ny cch vit '\0' c dng thng dng nht. 24

Chng 2. Kiu d liu, biu thc v cu lnh

b. Mt s hng thng dng

i vi mt s hng k t thng dng nhng khng c mt ch tng ng, hoc cc k t c dnh ring vi nhim v khc, khi thay v phi nh gi tr ca chng ta c th vit theo qui c sau:
'\n' '\t' '\a' '\r' '\f' '\\' '\?' '\'' '\"' : : : : : : : : : biu th k t xung dng (cng tng ng vi endl) k t tab k t chung (tc thay v in k t, loa s pht ra mt ting 'bp') xung dng ko trang du \ du chm hi ? du nhy n ' du nhy kp " k t c m l kkk trong h 8 k t c m l kk trong h 16

'\kkk' : '\xkk' :

V d:
cout << "Hm nay tri \t nng \a \a \a \n" ;

s in ra mn hnh dng ch "Hm nay tri" sau b mt khong cch bng mt tab (khong 8 du cch) ri in tip ch "nng", tip theo pht ra 3 ting chung v cui cng con tr trn mn hnh s nhy xung u dng mi. Do du cch (phm spacebar) khng c mt ch, nn trong mt s trng hp trnh nhm ln chng ti qui c s dng k hiu <> biu din du cch. V d trong gio trnh ny du cch (c gi tr l 32) c vit ' ' (du nhy n bao mt du cch) hoc r rng hn bng cch vit theo qui c <>.
4. Hng xu k t

L dy k t bt k t gia cp du nhy kp. V d: "Lp K43*", "12A4", "A", "<>", "" l cc hng xu k t, trong "" l xu khng cha k t no, cc xu "<>", "A" cha 1 k t ... S cc k t gia 2 du nhy kp c gi l di ca xu. V d xu "" c di 0, xu "<>" hoc "A" c di 1 cn xu "Lp K43*" c di 8. Ch phn bit gia 2 cch vit 'A' v "A", tuy chng cng biu din ch ci A nhng chng trnh s hiu 'A' l mt k t cn "A" l mt xu k t (do vy chng c b tr khc nhau trong b nh cng nh cch s dng chng l khc nhau). Tng t ta khng c vit '' (2 du nhy n lin nhau) v khng c khi nim k t

25

Chng 2. Kiu d liu, biu thc v cu lnh

"rng". ch xu rng (khng c k t no) ta phi vit "" (2 du nhy kp lin nhau). Tm li mt gi tr c th c vit di nhiu kiu d liu khc nhau v do cch s dng chng cng khc nhau. V d lin quan n khi nim 3 n v c th c cc cch vit sau tuy nhin chng hon ton khc nhau: 3 3L 3.0 '3' "3" : : : : : s nguyn 3 n v s nguyn di 3 n v s thc 3 n v ch s 3 xu cha k t duy nht l 3

5. Khai bo hng

Mt gi tr c nh (hng) c s dng nhiu ln trong chng trnh i khi s thun li hn nu ta t cho n mt tn gi, thao tc ny c gi l khai bo hng. V d mt chng trnh qun l sinh vin vi gi thit s sinh vin ti a l 50. Nu s sinh vin ti a khng thay i trong chng trnh ta c th t cho n mt tn gi nh sosv chng hn. Trong sut chng trnh bt k ch no xut hin gi tr 50 ta u c th thay n bng sosv. Tng t C++ cng c nhng tn hng c t sn, c gi l cc hng chun v NSD c th s dng khi cn thit. V d hng c t sn trong C++ vi tn gi M_PI. Vic s dng tn hng thay cho hng c nhiu im thun li nh sau: Chng trnh d c hn, v thay cho cc con s t c ngha, mt tn gi s lm NSD d hnh dung vai tr, ni dung ca n. V d, khi gp tn gi sosv NSD s hnh dung c chng hn, "y l s sinh vin ti a trong mt lp", trong khi s 50 c th l s sinh vin m cng c th l tui ca mt sinh vin no . Chng trnh d sa cha hn, v d by gi nu mun thay i chng trnh sao cho bi ton qun l c thc hin vi s sinh vin ti a l 60, khi ta cn tm v thay th hng trm v tr xut hin ca 50 thnh 60. Vic thay th nh vy d gy ra li v c th khng tm thy ht cc s 50 trong chng trnh hoc thay nhm s 50 vi ngha khc nh tui ca mt sinh vin no chng hn. Nu trong chng trnh s dng hng sosv, by gi vic thay th tr nn chnh xc v d dng hn bng thao tc khai bo li gi tr hng sosv bng 60. Lc trong chng trnh bt k ni no gp tn hng sosv u c chng trnh hiu vi gi tr 60. khai bo hng ta dng cc cu khai bo sau:

26

Chng 2. Kiu d liu, biu thc v cu lnh

#define tn_hng gi_tr_hng ;

hoc:
const tn_hng = gi_tr_hng ;

V d:
#define sosv 50 ; #define MAX 100 ; const sosv = 50 ;

Nh trn ch mt gi tr hng cha ni ln kiu s dng ca n v vy ta cn khai bo r rng hn bng cch thm tn kiu trc tn hng trong khai bo const, cc hng khai bo nh vy c gi l hng c kiu. V d:
const int sosv = 50 ; const float nhiet_do_soi = 100.0 ;

III. BIN - KHAI BO V S DNG BIN


1. Khai bo bin

Bin l cc tn gi lu gi tr khi lm vic trong chng trnh. Cc gi tr c lu c th l cc gi tr d liu ban u, cc gi tr trung gian tm thi trong qu trnh tnh ton hoc cc gi tr kt qu cui cng. Khc vi hng, gi tr ca bin c th thay i trong qu trnh lm vic bng cc lnh c vo t bn phm hoc gn. Hnh nh c th ca bin l mt s nh trong b nh c s dng lu cc gi tr ca bin. Mi bin phi c khai bo trc khi s dng. Mt khai bo nh vy s bo cho chng trnh bit v mt bin mi gm c: tn ca bin, kiu ca bin (tc kiu ca gi tr d liu m bin s lu gi). Thng thng vi nhiu NNLT tt c cc bin phi c khai bo ngay t u chng trnh hay u ca hm, tuy nhin thun tin C++ cho php khai bo bin ngay bn trong chng trnh hoc hm, c ngha bt k lc no NSD thy cn thit s dng bin mi, h c quyn khai bo v s dng n t tr i. C php khai bo bin gm tn kiu, tn bin v c th c hay khng khi to gi tr ban u cho bin. khi to hoc thay i gi tr ca bin ta dng lnh gn (=).
a. Khai bo khng khi to tn_kiu tn_bin_1 ; tn_kiu tn_bin_2 ;

27

Chng 2. Kiu d liu, biu thc v cu lnh

tn_kiu tn_bin_3 ;

Nhiu bin cng kiu c th c khai bo trn cng mt dng:


tn_kiu tn_bin_1, tn_bin_2, tn_bin_3 ;

V d:
void main() { int i, j ; float x ; char c, d[100] ; unsigned int u ; } b. Khai bo c khi to // khai bo 2 bin i, j c kiu nguyn // khai bo bin thc x // bin k t c, xu d cha ti a 100 k t // bin nguyn khng du u

Trong cu lnh khai bo, cc bin c th c gn ngay gi tr ban u bi php ton gn (=) theo c php:
tn_kiu tn_bin_1 = gt_1, tn_bin_2 = gt_2, tn_bin_3 = gt_3 ;

trong cc gi tr gt_1, gt_2, gt_3 c th l cc hng, bin hoc biu thc. V d:


const int n = 10 ; void main() { int i = 2, j , k = n + 5; float eps = 1.0e-6 ; char c = 'Z'; char d[100] = "Tin hc"; } 2. Phm vi ca bin // khai bo i v khi to bng 2, k bng 15 // khai bo bin thc epsilon khi to bng 10-6 // khai bo bin k t c v khi to bng 'A' // khai bo xu k t d cha dng ch "Tin hc"

Nh bit chng trnh l mt tp hp cc hm, cc cu lnh cng nh cc khai bo. Phm vi tc dng ca mt bin l ni m bin c tc dng, tc hm no, cu lnh

28

Chng 2. Kiu d liu, biu thc v cu lnh

no c php s dng bin . Mt bin xut hin trong chng trnh c th c s dng bi hm ny nhng khng c bi hm khc hoc bi c hai, iu ny ph thuc cht ch vo v tr ni bin c khai bo. Mt nguyn tc u tin l bin s c tc dng k t v tr n c khai bo cho n ht khi lnh cha n. Chi tit c th hn s c trnh by trong chng 4 khi ni v hm trong C++.
3. Gn gi tr cho bin (php gn)

Trong cc v d trc chng ta s dng php gn d n cha c trnh by, n gin mt php gn mang ngha to gi tr mi cho mt bin. Khi bin c gn gi tr mi, gi tr c s c t ng xo i bt k trc n cha gi tr no (hoc cha c gi tr, v d ch mi va khai bo xong). C php ca php gn nh sau:
tn_bin = biu thc ;

Khi gp php gn chng trnh s tnh ton gi tr ca biu thc sau gn gi tr ny cho bin. V d:
int n, i = 3; n = 10; cout << n <<", " << i << endl; i = n / 2; cout << n <<", " << i << endl; // khi to i bng 3 // gn cho n gi tr 10 // in ra: 10, 3 // gn li gi tr ca i bng n/2 = 5 // in ra: 10, 5

Trong v d trn n c gn gi tr bng 10; trong cu lnh tip theo biu thc n/2 c tnh (bng 5) v sau gn kt qu cho bin i, tc i nhn kt qu bng 5 d trc n c gi tr l 2 (trong trng hp ny vic khi to gi tr 2 cho bin i l khng c ngha). Mt khai bo c khi to cng tng ng vi mt khai bo v sau thm lnh gn cho bin (v d int i = 3 cng tng ng vi 2 cu lnh int i; i = 3) tuy nhin v mt bn cht khi to gi tr cho bin vn khc vi php ton gn nh ta s thy trong cc phn sau.
4. Mt s im lu v php gn

Vi ngha thng thng ca php ton (ngha l tnh ton v cho li mt gi tr) th php ton gn cn mt nhim v na l tr li mt gi tr. Gi tr tr li ca php ton gn chnh l gi tr ca biu thc sau du bng. Li dng iu ny C++ cho php chng ta gn "kp" cho nhiu bin nhn cng mt gi tr bi c php:
bin_1 = bin_2 = = bin_n = gt ;

vi cch gn ny tt c cc bin s nhn cng gi tr gt. V d:

29

Chng 2. Kiu d liu, biu thc v cu lnh

int i, j, k ; i = j = k = 1;

Biu thc gn trn c th c vit li nh (i = (j = (k = 1))), c ngha u tin thc hin php ton gn gi tr cho bin i chng trnh phi tnh biu thc (j = (k = 1)), tc phi tnh k = 1, y l php ton gn, gn gi tr 1 cho k v tr li gi tr 1, gi tr tr li ny s c gn cho j v tr li gi tr 1 tip tc gn cho i. Ngoi vic gn kp nh trn, php ton gn cn c php xut hin trong bt k biu thc no, iu ny cho php trong mt biu thc c php ton gn, n khng ch tnh ton m cn gn gi tr cho cc bin, v d n = 3 + (i = 2) s cho ta i = 2 v n = 5. Vic s dng nhiu chc nng ca mt cu lnh lm cho chng trnh gn gng hn (trong mt s trng hp) nhng cng tr nn kh c, chng hn cu lnh trn c th vit tch thnh 2 cu lnh i = 2; n = 3 + i; s d c hn t nht i vi cc bn mi bt u tm hiu v lp trnh. IV. PHP TON, BIU THC V CU LNH
1. Php ton

C++ c rt nhiu php ton loi 1 ngi, 2 ngi v thm ch c 3 ngi. h thng, chng ti tm phn chia thnh cc lp v trnh by ch mt s trong chng. Cc php ton cn li s c tm hiu dn trong cc phn sau ca gio trnh. Cc thnh phn tn gi tham gia trong php ton c gi l hng thc hoc ton hng, cc k hiu php ton c gi l ton t. V d trong php ton a + b; a, b c gi l ton hng v + l ton t. Php ton 1 ngi l php ton ch c mt ton hng, v d a (i du s a), &x (ly a ch ca bin x) Mt s k hiu php ton cng c s dng chung cho c 1 ngi ln 2 ngi (hin nhin vi ng ngha khc nhau), v d k hiu c s dng cho php ton tr 2 ngi a b, hoc php & cn c s dng cho php ton ly hi cc bit (a & b) ca 2 s nguyn a v b
a. Cc php ton s hc: +, -, *, /, %

Cc php ton + (cng), (tr), * (nhn) c hiu theo ngha thng thng trong s hc. Php ton a / b (chia) c thc hin theo kiu ca cc ton hng, tc nu c hai ton hng l s nguyn th kt qu ca php chia ch ly phn nguyn, ngc li nu 1 trong 2 ton hng l thc th kt qu l s thc. V d:
13/5 = 2 13.0/5 = 13/5.0 = 13.0/5.0 = 2.6 // do 13 v 5 l 2 s nguyn // do c t nht 1 ton hng l thc

30

Chng 2. Kiu d liu, biu thc v cu lnh

Php ton a % b (ly phn d) tr li phn d ca php chia a/b, trong a v b l 2 s nguyn. V d:
13%5 = 3 5%13 = 5 // phn d ca 13/5 // phn d ca 5/13

b. Cc php ton t tng, gim: i++, ++i, i--, --i

Php ton ++i v i++ s cng tng i ln 1 n v tc tng ng vi cu lnh i = i+1. Tuy nhin nu 2 php ton ny nm trong cu lnh hoc biu thc th ++i khc vi i++. C th ++i s tng i, sau i mi c tham gia vo tnh ton trong biu thc. Ngc li i++ s tng i sau khi biu thc c tnh ton xong (vi gi tr i c). im khc bit ny c minh ho thng qua v d sau, gi s i = 3, j = 15. Php ton
i = ++j ; // tng trc i = j++ ; // tng sau j = ++i + 5 ; j = i++ + 5 ;

Tng ng
j=j+1;i=j; i=j;j=j+1; i=i+1;j=i+5; j = i + 5; i = i + 1;

Kt qu
i = 16 , j = 16 i = 15 , j = 16 i = 4, j = 9 i = 4, j = 8

Ghi ch: Vic kt hp php ton t tng gim vo trong biu thc hoc cu lnh (nh v d trong phn sau) s lm chng trnh gn nhng kh hiu hn.
c. Cc php ton so snh v lgic

y l cc php ton m gi tr tr li l ng hoc sai. Nu gi tr ca biu thc l ng th n nhn gi tr 1, ngc li l sai th biu thc nhn gi tr 0. Ni cch khc 1 v 0 l gi tr c th ca 2 khi nim "ng", "sai". M rng hn C++ quan nim mt gi tr bt k khc 0 l "ng" v gi tr 0 l "sai". Cc php ton so snh == (bng nhau), != (khc nhau), > (ln hn), < (nh hn), >= (ln hn hoc bng), <= (nh hn hoc bng). Hai ton hng ca cc php ton ny phi cng kiu. V d:
3 == 3 hoc 3 == (4 -1) 3 == 5 3 != 5 3 + (5 < 2) // nhn gi tr 1 v ng // = 0 v sai // = 1 // = 3 v 5<2 bng 0

31

Chng 2. Kiu d liu, biu thc v cu lnh

3 + (5 >= 2)

// = 4 v 5>=2 bng 1

Ch : cn phn bit php ton gn (=) v php ton so snh (==). Php gn va gn gi tr cho bin va tr li gi tr bt k (l gi tr ca ton hng bn phi), trong khi php so snh lun lun tr li gi tr 1 hoc 0. Cc php ton lgic: && (v), || (hoc ), ! (khng, ph nh) Hai ton hng ca loi php ton ny phi c kiu lgic tc ch nhn mt trong hai gi tr "ng" (c th hin bi cc s nguyn khc 0) hoc "sai" (th hin bi 0). Khi gi tr tr li ca php ton l 1 hoc 0 v c cho trong bng sau: a 1 1 0 0 Tm li: Php ton "v" ng khi v ch khi hai ton hng cng ng Php ton "hoc" sai khi v ch khi hai ton hng cng sai Php ton "khng" (hoc "ph nh") ng khi v ch khi ton hng ca n sai. V d:
3 && (4 > 5) (3 >= 1) && (7) !1 ! (4 + 3 < 7) 5 || (4 >= 6) (5 < !0) || (4 >= 6) // = 0 v c hng thc (4>5) sai // = 1 v c hai hng thc cng ng // = 0 // = 1 v (4+3<7) bng 0 // = 1 v c mt hng thc (5) ng // = 0 v c hai hng thc u sai

b 1 0 1 0

a && b 1 0 0 0

a || b 1 1 1 0

!a 0 0 1 1

Ch : vic nh gi biu thc c tin hnh t tri sang phi v s dng khi bit kt qu m khng ch nh gi ht biu thc. Cch nh gi ny s cho nhng kt qu ph khc nhau nu trong biu thc ta "tranh th" a thm vo cc php ton t tng gim. V d cho i = 2, j = 3, xt 2 biu thc sau y:
x = (++i < 4 && ++j > 5) cho kt qu x = 0 , i = 3 , j = 4

32

Chng 2. Kiu d liu, biu thc v cu lnh

y = (++j > 5 && ++i < 4)

cho kt qu y = 0 , i = 2 , j = 4

cch vit hai biu thc l nh nhau (ngoi tr hon i v tr 2 ton hng ca php ton &&). Vi gi thit i = 2 v j = 3 ta thy c hai biu thc trn cng nhn gi tr 0. Tuy nhin cc gi tr ca i v j sau khi thc hin xong hai biu thc ny s c kt qu khc nhau. C th vi biu thc u v ++i < 4 l ng nn chng trnh phi tip tc tnh tip ++j > 5 nh gi c biu thc. Do vy sau khi nh gi xong c i v j u c tng 1 (i=3, j=4). Trong khi vi biu thc sau do ++j > 5 l sai nn chng trnh c th kt lun c ton b biu thc l sai m khng cn tnh tip ++i < 4. C ngha chng trnh sau khi nh gi xong ++j > 5 s dng v v vy ch c bin j c tng 1, t ta c i = 2, j = 4 khc vi kt qu ca biu thc trn. V d ny mt ln na nhc ta ch kim sot k vic s dng cc php ton t tng gim trong biu thc v trong cu lnh.
2. Cc php gn

Php gn thng thng: y l php gn c trnh by trong mc trc. Php gn c iu kin:


bin = (iu_kin) ? a: b ;

iu_kin l mt biu thc logic, a, b l cc biu thc bt k cng kiu vi kiu ca bin. Php ton ny gn gi tr a cho bin nu iu kin ng v b nu ngc li. V d:
x = (3 + 4 < 7) ? 10: 20 x = (3 + 4) ? 10: 20 x = (a > b) ? a: b // x = 20 v 3+4<7 l sai // x = 10 v 3+4 khc 0, tc iu kin ng // x = s ln nht trong 2 s a, b.

Cch vit gn ca php gn: Mt php gn dng x = x @ a ; c th c vit gn di dng x @= a trong @ l cc php ton s hc, x l bit ... V d:
thay cho vit x = x + 2 c th vit x += 2; hoc x = x/2 ; x = x*2 c th c vit li nh x /= 2; x *= 2;

Cch vit gn ny c nhiu thun li khi vit v c chng trnh nht l khi tn bin qu di hoc i km nhiu ch s thay v phi vit hai ln tn bin trong cu lnh th ch phi vit mt ln, iu ny trnh vit lp li tn bin d gy ra sai st. V d thay v vit:
ngay_quoc_te_lao_dong = ngay_quoc_te_lao_dong + 365;

c th vit gn hn bi:
ngay_quoc_te_lao_dong += 365;

33

Chng 2. Kiu d liu, biu thc v cu lnh

hoc thay cho vit :


Luong[Nhanvien[3][2*i+1]] = Luong[Nhanvien[3][2*i+1]] * 290 ;

c th c vit li bi:
Luong[Nhanvien[3][2*i+1]] *= 290; 3. Biu thc

Biu thc l dy k hiu kt hp gia cc ton hng, php ton v cp du () theo mt qui tc nht nh. Cc ton hng l hng, bin, hm. Biu thc cung cp mt cch thc tnh gi tr mi da trn cc ton hng v ton t trong biu thc. V d:
(x + y) * 2 - 4 ; 3 - x + sqrt(y) ; (-b + sqrt(delta)) / (2*a) ; a. Th t u tin ca cc php ton

tnh gi tr ca mt biu thc cn c mt trt t tnh ton c th v thng nht. V d xt biu thc x = 3 + 4 * 2 + 7 nu tnh theo ng trt t t tri sang phi, ta c x = ((3+4) * 2) + 7 = 21, nu u tin du + c thc hin trc du *, x = (3 + 4) * (2 + 7) = 63, nu u tin du * c thc hin trc du +, x = 3 + (4 * 2) + 7 = 18. Nh vy cng mt biu thc tnh x nhng cho 3 kt qu khc nhau theo nhng cch hiu khc nhau. V vy cn c mt cch hiu thng nht da trn th t u tin ca cc php ton, tc nhng php ton no s c u tin tnh trc v nhng php ton no c tnh sau ... C++ qui nh trt t tnh ton theo cc mc u tin nh sau: 1. Cc biu thc trong cp du ngoc () 2. Cc php ton 1 ngi (t tng, gim, ly a ch, ly ni dung con tr ) 3. Cc php ton s hc. 4. Cc php ton quan h, logic. 5. Cc php gn. Nu c nhiu cp ngoc lng nhau th cp trong cng (su nht) c tnh trc. Cc php ton trong cng mt lp c u tin theo th t: lp nhn (*, /, &&), lp cng (+, , ||). Nu cc php ton c cng th t u tin th chng trnh s thc hin t tri sang phi. Cc php gn c u tin cui cng v c thc hin t phi sang tri. V d. theo mc u tin qui nh, biu thc tnh x trong v d trn s c tnh nh x = 3 + (4 * 2) + 7 = 18.

34

Chng 2. Kiu d liu, biu thc v cu lnh

Phn ln cc trng hp mun tnh ton theo mt trt t no ta nn s dng c th cc du ngoc (v cc biu thc trong du ngoc c tnh trc). V d: tnh = b2 - 4ac ta vit delta = b * b 4 * a * c ; tnh nghim phng trnh bc 2: x =
b+ vit : x = b + sqrt(delta) / 2a 2*a; l sai v theo mc u tin x s c tnh nh b + ((sqrt(delta)/2) * a) (th t tnh s l php ton 1 ngi i du b, n php chia, php nhn v cui cng l php cng). tnh chnh xc cn phi vit (b + sqrt(delta)) / (2*a).

Cho a = 1, b = 2, c = 3. Biu thc a += b += c cho gi tr c = 3, b = 5, a = 6. Th t tnh s l t phi sang tri, tc cu lnh trn tng ng vi cc cu lnh sau:
a=1;b=2;c=3; b=b+c; a=a+b; // b = 5 // a = 6

r rng, tt nht nn vit biu thc cn tnh trc trong cc du ngoc.


b. Php chuyn i kiu

Khi tnh ton mt biu thc phn ln cc php ton u yu cu cc ton hng phi cng kiu. V d php gn thc hin c th gi tr ca biu thc phi c cng kiu vi bin. Trong trng hp kiu ca gi tr biu thc khc vi kiu ca php gn th hoc l chng trnh s t ng chuyn kiu gi tr biu thc v thnh kiu ca bin c gn (nu c) hoc s bo li. Do vy khi cn thit NSD phi s dng cc cu lnh chuyn kiu ca biu thc cho ph hp vi kiu ca bin. Chuyn kiu t ng: v mt nguyn tc, khi cn thit cc kiu c gi tr thp s c chng trnh t ng chuyn ln kiu cao hn cho ph hp vi php ton. C th php chuyn kiu c th c thc hin theo s nh sau:
char int long int float double

V d:
int i = 3; float f ; f = i + 2;

trong v d trn i c kiu nguyn v v vy i+2 cng c kiu nguyn trong khi f c kiu thc. Tuy vy php ton gn ny l hp l v chng trnh s t ng chuyn kiu

35

Chng 2. Kiu d liu, biu thc v cu lnh

cu i+2 (bng 5) sang kiu thc (bng 5.0) ri mi gn cho f. p kiu: trong chuyn kiu t ng, chng trnh chuyn cc kiu t thp n cao, tuy nhin chiu ngc li khng th thc hin c v n c th gy mt d liu. Do nu cn thit NSD phi ra lnh cho chng trnh. V d:
int i; float f = 3 ; i=f+2; // t ng chuyn 3 thnh 3.0 v gn cho f // sai v mc d f + 2 = 5 nhng khng gn c cho i

Trong v d trn cu lnh i = f+2 thc hin c ta phi p kiu ca biu thc f+2 v thnh kiu nguyn. C php tng qut nh sau:
(tn_kiu)biu_thc // c php c trong C // c php mi trong C++

hoc:
tn_kiu(biu_thc)

trong tn_kiu l kiu cn c chuyn sang. Nh vy cu lnh trn phi c vit li:
i = int(f + 2) ;

khi f+2 (bng 5.0) c chuyn thnh 5 v gn cho i. Di y ta s xt mt s v d v li ch ca vic p kiu. Php p kiu t mt s thc v s nguyn s ct b tt c phn thp phn ca s thc, ch li phn nguyn. Nh vy tnh phn nguyn ca mt s thc x ta ch cn p kiu ca x v thnh kiu nguyn, c ngha int(x) l phn nguyn ca s thc x bt k. V d kim tra mt s nguyn n c phi l s chnh phng, ta cn tnh cn bc hai ca n. Nu cn bc hai x ca n l s nguyn th n l s chnh phng, tc nu int(x) = x th x nguyn v n l chnh phng, v d:
int n = 10 ; float x = sqrt(n) ; // hm sqrt(n) tr li cn bc hai ca s n if (int(x) == x) cout << "n chnh phng" ; else cout << "n khng chnh phng" ;

bit m ASCII ca mt k t ta ch cn chuyn k t sang kiu nguyn.


char c ; cin >> c ; cout << "M ca k t va nhp l " << int(c) ;

36

Chng 2. Kiu d liu, biu thc v cu lnh

Ghi ch: Xt v d sau:


int i = 3 , j = 5 ; float x ; x = i / j * 10; cout << x ; // x = 6 ?

trong v d ny mc d x c khai bo l thc nhng kt qu in ra s l 0 thay v 6 nh mong mun. L do l v php chia gia 2 s nguyn i v j s cho li s nguyn, tc i/j = 3/5 = 0. T x = 0*10 = 0. php chia ra kt qu thc ta cn phi p kiu hoc i hoc j hoc c 2 thnh s thc, khi php chia s cho kt qu thc v x c tnh ng gi tr. C th cu lnh x = i/j*10 c i thnh:
x = float(i) / j * 10 ; x = i / float(j) * 10 x = float(i/j) * 10 ; ; x = float(i) / float(j) * 10 ; // ng // ng // ng // sai

Php p kiu: x = float(i/j) * 10 ; vn cho kt qu sai v trong du ngoc php chia i/j vn l php chia nguyn, kt qu x vn l 0.
4. Cu lnh v khi lnh

Mt cu lnh trong C++ c thit lp t cc t kho v cc biu thc v lun lun c kt thc bng du chm phy. Cc v d vo/ra hoc cc php gn to thnh nhng cu lnh n gin nh:
cin >> x >> y ; x = 3 + x ; y = (x = sqrt(x)) + 1 ; cout << x ; cout << y ;

Cc cu lnh c php vit trn cng mt hoc nhiu dng. Mt s cu lnh c gi l lnh c cu trc, tc bn trong n li cha dy lnh khc. Dy lnh ny phi c bao gia cp du ngoc {} v c gi l khi lnh. V d tt c cc lnh trong mt hm (nh hm main()) lun lun l mt khi lnh. Mt c im ca khi lnh l cc bin c khai bo trong khi lnh no th ch c tc dng trong khi lnh . Chi tit hn v cc c im ca lnh v khi lnh s c trnh by trong cc chng tip theo ca gio trnh.

37

Chng 2. Kiu d liu, biu thc v cu lnh

V. TH VIN CC HM TON HC Trong phn ny chng ti tm tt mt s cc hm ton hc hay dng. Cc hm ny u c khai bo trong file nguyn mu math.h.
1. Cc hm s hc

abs(x), labs(x), fabs(x) : tr li gi tr tuyt i ca mt s nguyn, s nguyn di v s thc. pow(x, y) : hm m, tr li gi tr x ly tha y (xy). exp(x) : hm m, tr li gi tr e m x (ex). log(x), log10(x) : tr li lgarit c s e v lgarit thp phn ca x (lnx, logx) . sqrt(x) : tr li cn bc 2 ca x. atof(s_number) : tr li s thc ng vi s vit di dng xu k t s_number.
2. Cc hm lng gic

sin(x), cos(x), tan(x) : tr li cc gi tr sinx, cosx, tgx.

BI TP
1. Vit cu lnh khai bo bin lu cc gi tr sau: Tui ca mt ngi di cnh mt tam gic Mt ch s Mt ch ci 2. 3. S lng cy trong thnh ph Khong cch gia cc hnh tinh Nghim x ca phng trnh bc 1 Bit thc ca phng trnh bc 2

Vit cu lnh nhp vo 4 gi tr ln lt l s thc, nguyn, nguyn di v k t. In ra mn hnh cc gi tr ny kim tra. Vit cu lnh in ra mn hnh cc dng sau (khng k cc s th t v du: u mi dng) 1: 2: B Gio dc v o to Cng ho x hi ch ngha Vit Nam

38

Chng 2. Kiu d liu, biu thc v cu lnh

3:

S Gio dc H Ni

c lp - T do - Hnh phc

Ch : khong trng gia ch o to v Cng ho (dng 1) l 2 tab. Dng 2: trng. 4. 5. 6. Vit chng trnh nhp vo mt k t. In ra k t v m ascii ca n. Vit chng trnh nhp vo hai s thc. In ra hai s thc vi 2 s l v cch nhau 5 ct. Nhp, chy v gii thch kt qu t c ca on chng trnh sau:
#include <iostream.h> void main() { char c1 = 200; unsigned char c2 = 200 ; cout << "c1 = " << c1 << ", c2 = " << c2 << "\n" ; cout << "c1+100 = " << c1+100 << ", c2+100 = " << c2+100 ; }

7.

Nhp a, b, c. In ra mn hnh dng ch phng trnh c dng ax^2 + bx + c = 0, trong cc gi tr a, b, c ch in 2 s l (v d vi a = 5.141, b = 2, c = 0.8 in ra 5.14 x^2 2.00 x + 0.80). Vit chng trnh tnh v in ra gi tr cc biu thc sau vi 2 s l: a.
3+ 3+ 3

8.

b.
2+

1 1 2+ 1 2

9.

Nhp a, b, c l cc s thc. In ra gi tr ca cc biu thc sau vi 3 s l: a. a2 2b + ab/c


b 2 4ac b. 2a

c. 3a b3 2 c d.
a 2 / b 4a / bc + 1

10. In ra tng, tch, hiu v thng ca 2 s c nhp vo t bn phm. 11. In ra trung bnh cng, trung bnh nhn ca 3 s c nhp vo t bn phm. 12. Vit chng trnh nhp cnh, bn knh v in ra din tch, chu vi ca cc hnh: vung, ch nht, trn. 13. Nhp a, b, c l di 3 cnh ca tam gic (ch m bo tng 2 cnh phi ln 39

Chng 2. Kiu d liu, biu thc v cu lnh

hn cnh cn li). Tnh chu vi, din tch, di 3 ng cao, 3 ng trung tuyn, 3 ng phn gic, bn knh ng trn ni tip, ngoi tip ln lt theo cc cng thc sau: C = 2p = a + b + c ; S =
ha =
r=
p( p a )( p b )( p c ) ;

2S ; a

ma =
R=

1 2b 2 + 2c 2 a 2 ; 2

ga =

2 b+c

bcp( p a ) ;

S ; p

abc ; 4S

14. Tnh din tch v th tch ca hnh cu bn knh R theo cng thc: S = 4R2 ; V = RS/3 15. Nhp vo 4 ch s. In ra tng ca 4 ch s ny v ch s hng chc, hng n v ca tng (v d 4 ch s 3, 1, 8, 5 c tng l 17 v ch s hng chc l 1 v hng n v l 7, cn in ra 17, 1, 7). 16. Nhp vo mt s nguyn (c 4 ch s). In ra tng ca 4 ch s ny v ch s u, ch s cui (v d s 3185 c tng cc ch s l 17, u v cui l 3 v 5, kt qu in ra l: 17, 3, 5). 17. Hy nhp 2 s a v b. Vit chng trnh i gi tr ca a v b theo 2 cch: dng bin ph t: t = a; a = b; b = t; khng dng bin ph: a = a + b; b = a - b; a = a - b; In kt qu ra mn hnh kim tra. 18. Vit chng trnh on s ca ngi chi ang ngh, bng cch yu cu ngi chi ngh mt s, sau thc hin mt lot cc tnh ton trn s ngh ri cho bit kt qu. My s in ra s m ngi chi ngh. (v d yu cu ngi chi ly s ngh nhn i, tr 4, bnh phng, chia 2 v tr 7 ri cho bit kt qu, my s in ra s ngi chi ngh). 19. Mt sinh vin gm c cc thng tin: h tn, tui, im ton (h s 2), im tin (h s 1). Hy nhp cc thng tin trn cho 2 sinh vin. In ra bng im gm cc chi tit nu trn v im trung bnh ca mi sinh vin. 20. Mt nhn vin gm c cc thng tin: h tn, h s lng, phn trm ph cp (theo long) v phn trm phi ng BHXH. Hy nhp cc thng tin trn cho 2 nhn vin. In ra bng lng gm cc chi tit nu trn v tng s tin cui cng mi nhn vin c nhn.

40

Chng 3. Cu trc iu khin v d liu kiu mng

CHNG 3

CU TRC IU KHIN V D LIU KIU MNG


Cu trc r nhnh Cu trc lp Mng d liu Mng hai chiu

I. CU TRC R NHNH Ni chung vic thc hin chng trnh l hot ng tun t, tc thc hin tng lnh mt t cu lnh bt u ca chng trnh cho n cu lnh cui cng. Tuy nhin, vic lp trnh hiu qu hn hu ht cc NNLT bc cao u c cc cu lnh r nhnh v cc cu lnh lp cho php thc hin cc cu lnh ca chng trnh khng theo trnh t tun t nh trong vn bn. Phn ny chng ti s trnh by cc cu lnh cho php r nhnh nh vy. thng nht mi cu lnh c trnh by v c php (tc cch vit cu lnh), cch s dng, c im, v d minh ho v mt vi iu cn ch khi s dng lnh.
1. Cu lnh iu kin if a. ngha

Mt cu lnh if cho php chng trnh c th thc hin khi lnh ny hay khi lnh khc ph thuc vo mt iu kin c vit trong cu lnh l ng hay sai. Ni cch khc cu lnh if cho php chng trnh r nhnh (ch thc hin 1 trong 2 nhnh).
b. C php

if (iu kin) { khi lnh 1; } else { khi lnh 2; } if (iu kin) { khi lnh 1; } Trong c php trn cu lnh if c hai dng: c else v khng c else. iu kin l mt biu thc lgic tc n c gi tr ng (khc 0) hoc sai (bng 0). Khi chng trnh thc hin cu lnh if n s tnh biu thc iu kin. Nu iu kin ng chng trnh s tip tc thc hin cc lnh trong khi lnh 1, ngc li nu

41

Chng 3. Cu trc iu khin v d liu kiu mng

iu kin sai chng trnh s thc hin khi lnh 2 (nu c else) hoc khng lm g (nu khng c else).
c. c im

c im chung ca cc cu lnh c cu trc l bn thn n cha cc cu lnh khc. iu ny cho php cc cu lnh if c th lng nhau. Nu nhiu cu lnh if (c else v khng else) lng nhau vic hiu if v else no i vi nhau cn phi ch . Qui tc l else s i vi if gn n nht m cha c ghp cp vi else khc. V d cu lnh
if (n>0) if (a>b) c = a; else c = b;

l tng ng vi
if (n>0) { if (a>b) c = a; else c = b;} d. V d minh ho

V d 1 : Bng php ton gn c iu kin c th tm s ln nht max trong 2 s a, b nh sau: max = (a > b) ? a: b ; hoc max c tm bi dng cu lnh if:
if (a > b) max = a; else max = b;

V d 2 : Tnh nm nhun. Nm th n l nhun nu n chia ht cho 4, nhng khng chia ht cho 100 hoc chia ht 400. Ch : mt s nguyn a l chia ht cho b nu phn d ca php chia bng 0, tc a%b == 0.
#include <iostream.h> void main() { int nam; cout << Nam = ; cin >> nam ; if (nam%4 == 0 && year%100 !=0 || nam%400 == 0) cout << nam << "la nam nhuan ; else cout << nam << "la nam khong nhuan ; }

V d 3 : Gii phng trnh bc 2. Cho phng trnh ax2 + bx + c = 0 (a 0), tm x.

42

Chng 3. Cu trc iu khin v d liu kiu mng

#include <iostream.h> #include <math.h> void main() { float a, b, c; float delta; float x1, x2; delta = b*b - 4*a*c ;

// tp cha cc phng thc vo/ra // tp cha cc hm ton hc

// khai bo cc h s // 2 nghiem // qui c nhp a 0

cout << Nhap a, b, c:\n ; cin >> a >> b >> c ; if (delta < 0) cout << ph. trnh v nghim\n ;

else if (delta==0) cout<<ph. trnh c nghim kp:" << -b/(2*a) << '\n'; else { x1 = (-b+sqrt(delta))/(2*a); x2 = (-b-sqrt(delta))/(2*a); cout << nghiem 1 = " << x1 << " v nghiem 2 = " << x2 ; } }

Ch : do C++ quan nim "ng" l mt gi tr khc 0 bt k v "sai" l gi tr 0 nn thay v vit if (x != 0) hoc if (x == 0) ta c th vit gn thnh if (x) hoc if (!x) v nu (x != 0) ng th ta c x 0 v v x 0 nn (x) cng ng. Ngc li nu (x) ng th x 0, t (x != 0) cng ng. Tng t ta d dng thy c (x == 0) l tng ng vi (!x).
2. Cu lnh la chn switch a. ngha

Cu lnh if cho ta kh nng c la chn mt trong hai nhnh thc hin, do nu s dng nhiu lnh if lng nhau s cung cp kh nng c r theo nhiu nhnh. Tuy nhin trong trng hp nh vy chng trnh s rt kh c, do vy C++ cn cung cp mt cu lnh cu trc khc cho php chng trnh c th chn mt trong nhiu nhnh thc hin, l cu lnh switch.
b. C php

43

Chng 3. Cu trc iu khin v d liu kiu mng

switch (biu thc iu khin) { case biu_thc_1: dy lnh 1 ; case biu_thc_2: dy lnh 2 ; case ...: ............... ; case biu_thc_n: dy lnh n ; default: dy lnh n+1; } biu thc iu khin: phi c kiu nguyn hoc k t, cc biu_thc_i: c to t cc hng nguyn hoc k t, cc dy lnh c th rng. Khng cn bao dy lnh bi cp du {}, nhnh default c th c hoc khng v v tr ca n c th nm bt k trong cu lnh (gia cc nhnh case), khng nht thit phi nm cui cng.
c. Cch thc hin

thc hin cu lnh switch u tin chng trnh tnh gi tr ca biu thc iu khin (btk), sau so snh kt qu ca btk vi gi tr ca cc biu_thc_i bn di ln lt t biu thc u tin (th nht) cho n biu thc cui cng (th n), nu gi tr ca btk bng gi tr ca biu thc th i u tin no th chng trnh s thc hin dy lnh th i v tip tc thc hin tt c dy lnh cn li (t dy lnh th i+1) cho n ht (gp du ngoc ng } ca lnh switch). Nu qu trnh so snh khng gp biu thc (nhnh case) no bng vi gi tr ca btk th chng trnh thc hin dy lnh trong default v tip tc cho n ht (sau default c th cn nhng nhnh case khc). Trng hp cu lnh switch khng c nhnh default v btk khng khp vi bt c nhnh case no th chng trnh khng lm g, coi nh thc hin xong lnh switch. Nu mun lnh switch ch thc hin nhnh th i (khi btk = biu_thc_i) m khng phi thc hin thm cc lnh cn li th cui dy lnh th i thng thng ta t thm lnh break; y l lnh cho php thot ra khi mt lnh cu trc bt k.
d. V d minh ho

V d 1 : In s ngy ca mt thng bt k no c nhp t bn phm.


int th; cout << Cho bit thng cn tnh: ; cin >> th ; switch (th)

44

Chng 3. Cu trc iu khin v d liu kiu mng

{ case 1: case 3: case 5: case 7: case 8: case 10: case 12: cout << "thng ny c 31 ngy" ; break ; case 2: cout << "thng ny c 28 ngy" ; break; case 4: case 6: case 9: case 11: cout << "thng ny c 30 ngy" ; break; default: cout << "Bn nhp sai thng, khng c thng ny" ; }

Trong chng trnh trn gi s NSD nhp thng l 5 th chng trnh bt u thc hin dy lnh sau case 5 (khng c lnh no) sau tip tc thc hin cc lnh cn li, c th l bt u t dy lnh trong case 7, n case 12 chng trnh gp lnh in kt qu "thng ny c 31 ngy", sau gp lnh break nn chng trnh thot ra khi cu lnh switch ( thc hin xong). Vic gii thch cng tng t cho cc trng hp khc ca thng. Nu NSD nhp sai thng (v d thng nm ngoi phm vi 1..12), chng trnh thy th khng khp vi bt k nhnh case no nn s thc hin cu lnh trong default, in ra mn hnh dng ch "Bn nhp sai thng, khng c thng ny" v kt thc lnh. V d 2 : Nhp 2 s a v b vo t bn phm. Nhp k t th hin mt trong bn php ton: cng, tr, nhn, chia. In ra kt qu thc hin php ton trn 2 s a, b.
void main() { float a, b, c ; char dau ; // cc ton hng a, b v kt qu c // php ton c cho di dng k t

cout << "Hy nhp 2 s a, b: " ; cin >> a >> b ; cout << "v du php ton: " ; cin >> dau ; switch (dau) { case '+': c = a + b ; break ; case '': c = a - b ; break ; case 'x': case '.': case '*': c = a * b ; break ; case ':': case '/': c = a / b ; break ; } cout << setiosflags(ios::showpoint) << setprecision(4) ; // in 4 s l

45

Chng 3. Cu trc iu khin v d liu kiu mng

cout << "Kt qu l: " << c ; }

Trong chng trnh trn ta chp nhn cc k t x, ., * th hin cho php ton nhn v :, / th hin php ton chia.
3. Cu lnh nhy goto a. ngha

Mt dng khc ca r nhnh l cu lnh nhy goto cho php chng trnh chuyn n thc hin mt on lnh khc bt u t mt im c nh du bi mt nhn trong chng trnh. Nhn l mt tn gi do NSD t t theo cc qui tt t tn gi. Lnh goto thng c s dng to vng lp. Tuy nhin vic xut hin nhiu lnh goto dn n vic kh theo di trnh t thc hin chng trnh, v vy lnh ny thng c s dng rt hn ch.
b. C php

Goto <nhn> ; V tr chng trnh chuyn n thc hin l on lnh ng sau nhn v du hai chm (:).
c. V d minh ho

V d 3 : Nhn 2 s nguyn theo phng php n . Phng php n cho php nhn 2 s nguyn bng cch ch dng cc php ton nhn i, chia i v cng. Cc php nhn i v chia i thc cht l php ton dch bit v bn tri (nhn) hoc bn phi (chia) 1 bit. y l cc php ton c s trong b x l, do vy dng phng php ny s lm cho vic nhn cc s nguyn c thc hin rt nhanh. C th tm tt phng php nh sau: Gi s cn nhn m vi n. Kim tra m nu l th cng thm n vo kq (u tin kq c khi to bng 0), sau ly m chia 2 v n nhn 2. Quay li kim tra m v thc hin nh trn. Qu trnh dng khi khng th chia i m c na (m = 0), khi kq l kt qu cn tm (tc kq = m*n). d hiu phng php ny chng ta tin hnh tnh trn v d vi cc s m, n c th. Gi s m = 21 v n = 11. Cc bc tin hnh c cho trong bng di y: Bc 1 2 3 m (chia 2) 21 10 5 n (nhn 2) 11 22 44 kq (khi to kq = 0) m l, cng thm 11 vo kq = 0 + 11 = 11 m chn, b qua m l, cng thm 44 vo kq = 11 + 44 = 55

46

Chng 3. Cu trc iu khin v d liu kiu mng

4 5 6

2 1 0

88 176

m chn, b qua m l, cng thm 176 vo kq = 55 + 176 = 231 m = 0, dng cho kt qu kq = 231

Sau y l chng trnh c vit vi cu lnh goto.


void main() { long m, n, kq = 0; lap: if (m%2) kq += n; m = m >> 1; n = n << 1; if (m) goto lap; cout << m nhn n = << kq ; } // Cc s cn nhn v kt qu kq // y l nhn chng trnh quay li // nu m l th cng thm n vo kq // dch m sang phi 1 bit tc m = m / 2 // dch m sang tri 1 bit tc m = m * 2 // quay li nu m 0 cout << Nhp m v n: ; cin >> m >> n ;

II. CU TRC LP Mt trong nhng cu trc quan trng ca lp trnh cu trc l cc cu lnh cho php lp nhiu ln mt on lnh no ca chng trnh. Chng hn trong v d v bi ton nhn theo phng php n , lp li mt on lnh chng ta s dng cu lnh goto. Tuy nhin nh lu vic dng nhiu cu lnh ny lm chng trnh rt kh c. Do vy cn c nhng cu lnh khc trc quan hn v thc hin cc php lp mt cch trc tip. C++ cung cp cho chng ta 3 lnh lp nh vy. V thc cht 3 lnh ny l tng ng (cng nh c th dng goto thay cho c 3 lnh lp ny), tuy nhin chng trnh vit c sng sa, r rng, C++ cung cp nhiu phng n cho NSD la chn cu lnh khi vit chng trnh ph hp vi tnh cht lp. Mi bi ton lp c mt c trng ring, v d lp cho n khi s ln nh trc th dng hoc lp cho n khi mt iu kin no khng cn tho mn na th dng vic s dng cu lnh lp ph hp s lm cho chng trnh d c v d bo tr hn. y l ngha chung ca cc cu lnh lp, do vy trong cc trnh by v cu lnh tip theo sau y chng ta s khng cn phi trnh by li ngha ca chng.
1. Lnh lp for

47

Chng 3. Cu trc iu khin v d liu kiu mng

a. C php for (dy biu thc 1 ; iu kin lp ; dy biu thc 2) { khi lnh lp; }

Cc biu thc trong cc dy biu thc 1, 2 cch nhau bi du phy (,). C th c nhiu biu thc trong cc dy ny hoc dy biu thc cng c th trng. iu kin lp: l biu thc lgic (c gi tr ng, sai). Cc dy biu thc v/hoc iu kin c th trng tuy nhin vn gi li cc du chm phy (;) ngn cch cc thnh phn vi nhau.
b. Cch thc hin

Khi gp cu lnh for trnh t thc hin ca chng trnh nh sau: Thc hin dy biu thc 1 (thng thng l cc lnh khi to cho mt s bin), Kim tra iu kin lp, nu ng th thc hin khi lnh lp thc hin dy biu thc 2 quay lai kim tra iu kin lp v lp li qu trnh trn cho n bc no vic kim tra iu kin lp cho kt qu sai th dng. Tm li, biu thc 1 s c thc hin 1 ln duy nht ngay t u qu trnh lp sau thc hin cc cu lnh lp v dy biu thc 2 cho n khi no khng cn tho iu kin lp na th dng.
c. V d minh ho

V d 1 : Nhn 2 s nguyn theo phng php n


void main() { long m, n, kq; // Cc s cn nhn v kt qu kq cout << Nhp m v n: ; cin >> m >> n ; for (kq = 0 ; m ; m >>= 1, n <<= 1) if (m%2) kq += n ; cout << m nhn n = << kq ; }

So snh v d ny vi v d dng goto ta thy chng trnh c vit rt gn. bn c d hiu cu lnh for, mt ln na chng ta nhc li cch hot ng ca n thng qua v d ny, trong cc thnh phn c vit trong c php l nh sau: Dy biu thc 1: kq = 0, iu kin lp: m. y iu kin l ng nu m 0 v sai nu m = 0.

48

Chng 3. Cu trc iu khin v d liu kiu mng

Dy biu thc 2: m >>= 1 v n <<= 1. 2 biu thc ny c ngha m = m >> 1 (tng ng vi m = m / 2) v n = n << 1 (tng ng vi n = n * 2). Khi lnh lp: ch c mt lnh duy nht if (m%2) kq += n ; (nu phn d ca m chia 2 l khc 0, tc m l th cng thm n vo kq). Cch thc hin ca chng trnh nh sau: u tin thc hin biu thc 1 tc gn kq = 0. Ch rng nu kq c khi to trc bng 0 trong khi khai bo (ging nh trong v d 6) th thnh phn biu thc 1 y c th trng (nhng vn gi li du ; phn bit vi cc thnh phn khc). Kim tra iu kin: gi s m 0 (tc iu kin ng) for s thc hin lnh lp tc kim tra nu m l th cng thm n vo cho kq. Quay li thc hin cc biu thc 2 tc chia i m v nhn i n v vng lp c tip tc li bt u bng vic kim tra m n mt bc lp no m s bng 0 (v b chia i lin tip), iu kin khng tho, vng lp dng v cho ta kt qu l kq. V d 2 : Tnh tng ca dy cc s t 1 n 100. Chng trnh dng mt bin m i c khi to t 1, v mt bin kq cha tng. Mi bc lp chng trnh cng i vo kq v sau tng i ln 1 n v. Chng trnh cn lp khi no i cn cha vt qua 100. Khi i ln hn 100 chng trnh dng. Sau y l vn bn chng trnh.
void main() { int i, kq = 0; for (i = 1 ; i <= 100 ; i ++) kq += i ; cout << "Tng = " << kq; }

V d 3 : In ra mn hnh dy s l b hn mt s n no c nhp vo t bn phm. Chng trnh dng mt bin m i c khi to t 1, mi bc lp chng trnh s in i sau tng i ln 2 n v. Chng trnh cn lp khi no i cn cha vt qua n. Khi i ln hn n chng trnh dng. Sau y l vn bn chng trnh.
void main() { int n, i ;

49

Chng 3. Cu trc iu khin v d liu kiu mng

cout << "Hy nhp n = " ; cin >> n ; for (i = 1 ; i < n ; i += 2) cout << i << '\n' ; } d. c im

Thng qua phn gii thch cch hot ng ca cu lnh for trong v d 7 c th thy cc thnh phn ca for c th trng, tuy nhin cc du chm phy vn gi li ngn cch cc thnh phn vi nhau. V d cu lnh for (kq = 0 ; m ; m >>= 1, n <<= 1) if (m%2) kq += n ; trong v d 7 c th c vit li nh sau:
kq = 0; for ( ; m ; ) { if (m%2) kq += n; m >>= 1; n <<= 1; }

Tng t, cu lnh for (i = 1 ; i <= 100 ; i ++) kq += i ; trong v d 8 cng c th c vit li nh sau:
i = 1; for ( ; i <= 100 ; ) kq += i ++ ;

(cu lnh kq += i++; c thc hin theo 2 bc: cng i vo kq v tng i (tng sau)). Trong trng hp iu kin trong for cng trng chng trnh s ngm nh l iu kin lun lun ng, tc vng lp s lp v hn ln (!). Trong trng hp ny dng vng lp trong khi lnh cn c cu lnh kim tra dng v cu lnh break. V d cu lnh for (i = 1 ; i <= 100 ; i ++) kq += i ; c vit li nh sau:
i = 1; for ( ; ; ) { kq += i++; if (i > 100) break; }

Tm li, vic s dng dng vit no ca for ph thuc vo thi quen ca NSD, tuy nhin vic vit y cc thnh phn ca for lm cho vic c chng trnh tr nn d dng hn.
e. Lnh for lng nhau

Trong dy lnh lp c th cha c lnh for, tc cc lnh for cng c php lng nhau nh cc cu lnh c cu trc khc. V d 4 : Bi ton c: va g va ch b li cho trn m 100 chn. Hi c my g

50

Chng 3. Cu trc iu khin v d liu kiu mng

v my con ch, bit tng s con l 36. gii bi ton ny ta gi g l s g v c l s ch. Theo iu kin bi ton ta thy g c th i t 0 (khng c con no) v n ti a l 50 (v ch c 100 chn), tng t c c th i t 0 n 25. Nh vy ta c th cho g chy t 0 n 50 v vi mi gi tr c th ca g li cho c chy t 0 n 25, ln lt vi mi cp (g, c) c th ta kim tra 2 iu kin: g + c == 36 ? (s con) v 2g + 4c == 100 ? (s chn). Nu c 2 iu kin u tho th cp (g, c) c th chnh l nghim cn tm. T ta c chng trnh vi 2 vng for lng nhau, mt vng for cho g v mt vng cho c.
void main() { int g, c ; for (g = 0 ; g <= 50 ; g++) for (c = 0 ; c <= 25 ; c++) if (g+c == 36 && 2*g+4*c == 100) cout << "g=" << g << ", ch=" << c ; }

Chng trnh trn c th c gii thch mt cch ngn gn nh sau: u tin cho g = 0, thc hin lnh for bn trong tc ln lt cho c = 0, 1, , 25, vi c=0 v g=0 kim tra iu kin, nu tho th in kt qu nu khng th b qua, quay li tng c, cho n khi no c>25 th kt thc vng lp trong quay v vng lp ngoi tng g ln 1, li thc hin vng lp trong vi g=1 ny (tc li cho c chy t 0 n 25). Khi g ca vng lp ngoi vt qu 50 th dng. T ta thy s vng lp ca chng trnh l 50 x 25 = 1000 ln lp. Ch : C th gim bt s ln lp bng nhn xt s g khng th vt qu 36 (v tng s con l 36). Mt vi nhn xt khc cng c th lm gim s vng lp, tit kim thi gian chy ca chng trnh. Bn c t ngh thm cc phng n gii khc gim s vng lp n t nht. V d 5 : Tm tt c cc phng n c 100 t cc t giy bc loi 10, 20 v 50.
main() { int t10, t20, t50; sopa = 0; for (t10 = 0 ; t10 <= 10 ; t10++) for (t20 = 0 ; t20 <= 5 ; t20++) for (t50 = 0 ; t50 <= 2 ; t50++) // s t 10, 20, 50 // s phng n

51

Chng 3. Cu trc iu khin v d liu kiu mng

if (t10*10 + t20*20 + t50*50 == 100) { sopa++; if (t10) cout << t10 << "t 10 ; if (t20) cout << "+" << t20 << "t 20 ; if (t50) cout << "+" << t50 << "t 50 ; cout << '\n' ; } cout << Tong so phuong an = << sopa ; } 2. Lnh lp while a. C php

// nu tho th // tng s phng n // in s t 10 nu 0 // thm s t 20 nu0 // thm s t 50 nu0 // xung dng

while (iu kin) { khi lnh lp ; }


b. Thc hin

Khi gp lnh while chng trnh thc hin nh sau: u tin chng trnh s kim tra iu kin, nu ng th thc hin khi lnh lp, sau quay li kim tra iu kin v tip tc. Nu iu kin sai th dng vng lp. Tm li c th m t mt cch ngn gn v cu lnh while nh sau: lp li cc lnh trong khi iu kin vn cn ng.
c. c im

Khi lnh lp c th khng c thc hin ln no nu iu kin sai ngay t u. vng lp khng lp v hn th trong khi lnh thng thng phi c t nht mt cu lnh no gy nh hng n kt qu ca iu kin, v d lm cho iu kin ang ng tr thnh sai. Nu iu kin lun lun nhn gi tr ng (v d biu thc iu kin l 1) th trong khi lnh lp phi c cu lnh kim tra dng v lnh break.
d. V d minh ho

V d 1 : Nhn 2 s nguyn theo phng php n


void main() {

52

Chng 3. Cu trc iu khin v d liu kiu mng

long m, n, kq; kq = 0 ; while (m) { if (m%2) kq += n ; m >>= 1; n <<= 1; } cout << m nhn n = << kq ; }

// Cc s cn nhn v kt qu kq

cout << Nhp m v n: ; cin >> m >> n ;

Trong chng trnh trn cu lnh while (m) c c l "trong khi m cn khc 0 thc hin ", ta thy trong khi lnh lp c lnh m >>= 1, lnh ny s nh hng n iu kin (m), n lc no m bng 0 tc (m) l sai v chng trnh s dng lp. Cu lnh while (m) cng c th c thay bng while (1) nh sau:
void main() { long m, n, kq; kq = 0 ; while (1) { if (m%2) kq += n ; m >>= 1; n <<= 1; if (!m) break ; } cout << m nhn n = << kq ; } // nu m = 0 th thot khi vng lp // Cc s cn nhn v kt qu kq cout << Nhp m v n: ; cin >> m >> n ;

V d 2 : Bi ton c: va g va ch b li cho trn m d 100 chn. Hi c my g v my con ch, bit tng s con l 36.
void main()

53

Chng 3. Cu trc iu khin v d liu kiu mng

{ int g, c ; g=0; while (g <= 36) { c=0; while (c <= 50) { if (g + c == 36 && 2*g + 4*c == 100) cout << g << c ; c++; } g++; } }

V d 3 : Tm c chung ln nht (UCLN) ca 2 s nguyn m v n. p dng thut ton Euclide bng cch lin tip ly s ln tr i s nh khi no 2 s bng nhau th l UCLN. Trong chng trnh ta qui c m l s ln v n l s nh. Thm bin ph r tnh hiu ca 2 s. Sau t li m hoc n bng r sao cho m > n v lp li. Vng lp dng khi m = n.
void main() { int m, n, r; cout << "Nhp m, n: " ; cin >> m >> n ; if (m < n) { int t = m; m = n; n = t; } while (m != n) { r=m-n; if (r > n) m = r; else { m = n ; n = r ; } } cout << "UCLN = " << m ; } // nu m < n th i vai tr hai s

V d 4 : Tm nghim xp x ca phng trnh ex 1.5 = 0, trn on [0, 1] vi chnh xc 10-6 bng phng php chia i. vit chng trnh ny chng ta nhc li phng php chia i. Cho hm f(x) lin tc v i du trn mt on [a, b] no (tc f(a), f(b) tri du nhau hay f(a)*f(b)

54

Chng 3. Cu trc iu khin v d liu kiu mng

< 0). Ta bit vi iu kin ny chc chn th ca hm f(x) s ct trc honh ti mt im x0 no trong on [a, b], tc x0 l nghim ca phng trnh f(x) = 0. Tuy nhin vic tm chnh xc x0 l kh, v vy ta c th tm xp x x' ca n sao cho x' cng gn x0 cng tt. Ly c l im gia ca on [a, b], c s chia on [a, b] thnh 2 on con [a, c] v [c, b] v do f(a), f(b) tri du nn chc chn mt trong hai on con cng phi tri du, tc nghim x0 s nm trong on ny. Tip tc qu trnh bng cch chia i on va tm c cho n khi ta nhn c mt on con (tri du, cha x0) sao cho di ca on con ny b hn xp x cho trc th dng. Khi ly bt k im no trn on con ny (v d hai im mt hoc im gia ca a v b) th chc chn khong cch ca n n x0 cng b hn xp x cho trc, tc c th ly im ny lm nghim xp x ca phng trnh f(x) = 0. Trong v d ny hm f(x) chnh l ex - 1.5 v xp x l 10-6. y l hm lin tc trn ton trc s v i du trn on [0, 1] (v f(0) = 1 1.5 < 0 cn f(1) = e - 1.5 > 0). Sau y l chng trnh.
void main() { float a = 0, b = 1, c; float fa, fc; while (b-a > 1.0e-6) { c = (a + b)/2; fa = exp(a) - 1.5; fc = exp(c) - 1.5; if (fa*fc == 0) break; if (fa*fc > 0) a = c; else b = c; } cout << "Nghiem xap xi cua phuong trinh = " << c ; } // tm im c gia on [a,b] // tnh f(a) v f(c) // f(c) = 0 tc c l nghim // cc im mt a, b v im gia c // gi tr ca f(x) ti cc im a, c // trong khi di on cn ln hn

Trong chng trnh trn cu lnh if (fa*fc > 0) a = c; else b = c; dng kim tra f(a) v f(c), nu cng du (f(a)*f(c) > 0) th hm f(x) phi tri du trn on con [c, b] do t li on ny l [a, b] ( quay li vng lp) tc t a = c v b gi nguyn, ngc li nu hm f(x) tri du trn on con [a, c] th t li b = c cn a gi nguyn. Sau vng lp quay li kim tra di on [a, b] (mi) nu b hn xp x th dng v ly c lm nghim xp x, nu khng th tnh li c v tip tc qu trnh. tnh f(a) v f(c) chng trnh s dng hm exp(x), y l hm cho li kt qu ex, dng hm ny hoc cc hm ton hc ni chung, cn khai bo file nguyn

55

Chng 3. Cu trc iu khin v d liu kiu mng

mu math.h.
3. Lnh lp do ... while a. C php

do { khi lnh lp } while (iu kin) ;


b. Thc hin

u tin chng trnh s thc hin khi lnh lp, tip theo kim tra iu kin, nu iu kin cn ng th quay li thc hin khi lnh v qu trnh tip tc cho n khi iu kin tr thnh sai th dng.
c. c im

Cc c im ca cu lnh do while cng ging vi cu lnh lp while tr im khc bit, l khi lnh trong do while s c thc hin t nht mt ln, trong khi trong cu lnh while c th khng c thc hin ln no (v lnh while phi kim tra iu kin trc khi thc hin khi lnh, do nu iu kin sai ngay t u th lnh s dng, khi lnh khng c thc hin ln no. Trong khi lnh do while s thc hin khi lnh ri mi kim tra iu kin lp cho php thc hin tip hoc dng).
d. V d minh ho

2 1 1 1 1 V d 1 : Tnh xp x s pi theo cng thc Euler = 2 + 2 + 2 + ... + 2 , vi 6 1 2 3 n 1 <10 6 . 2 n


void main() { int n = 1; float S = 0; do S += 1.0/(n*n) while 1.0/(n*n) < 1.0e-6; float pi = sqrt(6*S); cout << "pi = " << pi ; }

V d 2 : Kim tra mt s n c l s nguyn t. kim tra mt s n > 3 c phi l s nguyn t ta ln lt chia n cho cc s i i

56

Chng 3. Cu trc iu khin v d liu kiu mng

t 2 n mt na ca n. Nu c i sao cho n chia ht cho i th n l hp s ngc li n l s nguyn t.


void main() { int i, n ; i=2; do { if (n%i == 0) { cout << n << "l hp s" ; return ; } i++; } while (i <= n/2); cout << n << "l s nguyn t" ; } // dng chng trnh // n: s cn kim tra cout << "Cho bit s cn kim tra: " ; cin >> n ;

V d 3 : Nhp dy k t v thng k cc loi ch hoa, thng, ch s v cc loi khc cn li n khi gp ENTER th dng.
void main() { char c; int n1, n2, n3, n4 ; n1 = n2 = n3 = n4 = 0; cout << Hy nhp dy k t: \n ; do { cin >> c; if (a <= c && c <= z) n1++; else if (A <= c && c <= Z) n2++; else if (0 <= c && c <= 9) n3++; else n4++;
// nu c l ch thng th tng n1

// k t dng cho nhp // s lng cc loi k t

// ch hoa, tng n2 // ch s, tng n3 // loi khc, tng n4

57

Chng 3. Cu trc iu khin v d liu kiu mng

cout << n1 << n2 << n3 << n4 ; } while (c != 10) ; }

// in kt qu
// cn lp khi c cn khc k t

4. Li ra ca vng lp: break, continue a. Lnh break

Cng dng ca lnh dng thot ra khi (chm dt) cc cu lnh cu trc, chng trnh s tip tc thc hin cc cu lnh tip sau cu lnh va thot. Cc v d minh ho bn c c th xem li trong cc v d v cu lnh switch, for, while.
b. Lnh continue

Lnh dng quay li u vng lp m khng ch thc hin ht cc lnh trong khi lnh lp. V d 1 : Gi s vi mi i t 1 n 100 ta cn thc hin mt lot cc lnh no tr nhng s i l s chnh phng. Nh vy tit kim thi gian, vng lp s kim tra nu i l s chnh phng th s quay li ngay t u thc hin vi i tip theo.
int i ; for (i = 1; i <= 100; i++) { if (i l s chnh phng) continue; {
. . .

// dy lnh khc

} }

( kim tra i c l s chnh phng chng ta so snh cn bc hai ca i vi phn nguyn ca n. Nu hai s ny bng nhau th i l s chnh phng. C th nu sqrt(i) = int(sqrt(i)) th i l s chnh phng. y sqrt(x) l hm tr li cn bc hai ca x. s dng hm ny cn phi khai bo file nguyn mu math.h.)
5. So snh cch dng cc cu lnh lp

Thng qua cc v d trnh by bn c c th thy rng v mt thc cht t chc mt vng lp chng ta c th chn mt trong cc cu lnh goto, for, while, do while, c ngha v mt kh nng thc hin cc cu lnh ny l nh nhau. Tuy nhin,

58

Chng 3. Cu trc iu khin v d liu kiu mng

trong mt ng cnh c th vic s dng cu lnh ph hp trong chng lm cho chng trnh sng sa, r rng v tng tin cy ln cao hn. Theo thi quen lp trnh trong mt s ngn ng c trc v da trn c trng ring ca tng cu lnh, cc lnh lp thng c dng trong cc ng cnh c th nh sau: FOR thng c s dng trong nhng vng lp m s ln lp c bit trc, ngha l vng lp thng c t chc di dng mt (hoc nhiu) bin m chy t mt gi tr no v n khi t c n mt gi tr khc cho trc th dng. V d dng thng dng ca cu lnh for l nh sau: for (i = gt1 ; i <= gt2 ; i++) tc i tng t gt1 n gt2 hoc for (i = gt2 ; i >= gt1 ; i--) tc i gim t gt2 xung gt1 Ngc li vi FOR, WHILE v DO WHILE thng dng trong cc vng lp m s ln lp khng bit trc, chng thng c s dng khi vic lp hay dng ph thuc vo mt biu thc lgic. WHILE c s dng khi kh nng thc hin khi lp khng xy ra ln no, tc nu iu kin lp c gi tr sai ngay t u, trong khi DO WHILE c s dng khi ta bit chc chn khi lnh lp phi c thc hin t nht mt ln. III. MNG D LIU
1. Mng mt chiu a. ngha

Khi cn lu tr mt dy n phn t d liu chng ta cn khai bo n bin tng ng vi n tn gi khc nhau. iu ny s rt kh khn cho ngi lp trnh c th nh v qun l ht c tt c cc bin, c bit khi n ln. Trong thc t, hin nhin chng ta gp rt nhiu d liu c lin quan n nhau v mt mt no , v d chng c cng kiu v cng th hin mt i tng: nh cc to ca mt vect, cc s hng ca mt ma trn, cc sinh vin ca mt lp hoc cc dng k t ca mt vn bn Li dng c im ny ton b d liu (cng kiu v cng m t mt i tng) c th ch cn chung mt tn gi phn bit vi cc i tng khc, v phn bit cc d liu trong cng i tng ta s dng cch nh s th t cho chng, t vic qun l bin s d dng hn, chng trnh s gn v c tnh h thng hn. Gi s ta c 2 vect trong khng gian ba chiu, mi vec t cn 3 bin lu 3 to , v vy lu to ca 2 vect chng ta phi dng n 6 bin, v d x1, y1, z1 cho vect th nht v x2, y2, z2 cho vect th hai. Mt kiu d liu mi c gi l mng mt chiu cho php ta ch cn khai bo 2 bin v1 v v2 ch 2 vect, trong mi v1

59

Chng 3. Cu trc iu khin v d liu kiu mng

hoc v2 s cha 3 d liu c nh s th t t 0 n 2, trong ta c th ngm nh thnh phn 0 biu din to x, thnh phn 1 biu din to y v thnh phn c s th t 2 s biu din to z. Tm li, mng l mt dy cc thnh phn c cng kiu c sp k nhau lin tc trong b nh. Tt c cc thnh phn u c cng tn l tn ca mng. phn bit cc thnh phn vi nhau, cc thnh phn s c nh s th t t 0 cho n ht mng. Khi cn ni n thnh phn c th no ca mng ta s dng tn mng v km theo s th t ca thnh phn . Di y l hnh nh ca mt mng gm c 9 thnh phn, cc thnh phn c nh s t 0 n 8. 0 1 2 3 4 5 6 7 8
b. Khai bo <tn kiu> <tn mng>[s thnh phn] ; <tn kiu> <tn mng>[ ] = { dy gi tr } ; // khng khi to // c khi to <tn kiu> <tn mng>[s thnh phn] = { dy gi tr } ; // c khi to

Tn kiu l kiu d liu ca cc thnh phn, cc thnh phn ny c kiu ging nhau. Thnh thong ta cng gi cc thnh phn l phn t. Cch khai bo trn ging nh khai bo tn bin bnh thng nhng thm s thnh phn trong mng gia cp du ngoc vung [] cn c gi l kch thc ca mng. Mi tn mng l mt bin v phn bit vi cc bin thng thng ta cn gi l bin mng. Mt mng d liu c lu trong b nh bi dy cc lin tip nhau. S lng bng vi s thnh phn ca mng v di (byte) ca mi cha thng tin ca mi thnh phn. u tin c nh th t bi 0, tip theo bi 1, v tip tc cho n ht. Nh vy nu mng c n thnh phn th cui cng trong mng s c nh s l n - 1. Dng khai bo th 2 cho php khi to mng bi dy gi tr trong cp du {}, mi gi tr cch nhau bi du phy (,), cc gi tr ny s c gn ln lt cho cc phn t ca mng bt u t phn t th 0 cho n ht dy. S gi tr c th b hn s phn t. Cc phn t mng cha c gi tr s khng c xc nh cho n khi trong chng trnh n c gn mt gi tr no . Dng khai bo th 3 cho php vng mt s phn t, trng hp ny s phn t c xc nh bi s gi tr ca dy khi to. Do nu vng mt c dy khi

60

Chng 3. Cu trc iu khin v d liu kiu mng

to l khng c php (chng hn khai bo int a[] l sai). V d: Khai bo bin cha 2 vect a, b trong khng gian 3 chiu:
float a[3] , b[3] ;

Khai bo 3 phn s a, b, c; trong a = 1/3 v b = 3/5:


int a[2] = {1, 3} , b[2] = {3, 5} , c[2] ;

y ta ngm qui c thnh phn u tin (s th t 0) l t v thnh phn th hai (s th t 1) l mu ca phn s. Khai bo mng L cha c ti a 100 s nguyn di:
long L[100] ;

Khai bo mng dong (dng), mi dng cha c ti a 80 k t:


char dong[80] ;

Khai bo dy Data cha c 5 s thc chnh xc gp i:


double Data[] = { 0,0,0,0,0 }; c. Cch s dng // khi to tm thi bng 0

i.

ch thnh phn th i (hay ch s i) ca mt mng ta vit tn mng km theo ch s trong cp ngoc vung []. V d vi cc phn s trn a[0], b[0], c[0] ch t s v a[1], b[1], c[1] ch mu s ca 3 phn s a,b,c.

ii. Tuy mi mng biu din mt i tng nhng chng ta khng th p dng cc thao tc ln ton b mng m phi thc hin thao tc thng qua tng thnh phn ca mng. V d chng ta khng th nhp d liu cho mng a[10] bng cu lnh:
cin >> a ; // sai

m phi nhp cho tng phn t t a[0] n a[9] ca a. D nhin trong trng hp ny chng ta phi cn n lnh lp for:
int i ; for (i = 0 ; i < 10 ; i++) cin >> a[i] ;

Tng t, gi s chng ta cn cng 2 phn s a, b v t kt qu vo c. Khng th vit:


c=a+b; // sai

m cn phi tnh tng phn t ca c:

61

Chng 3. Cu trc iu khin v d liu kiu mng

c[0] = a[0] * b[1] + a[1] * b[0] ; c[1] = a[1] * b[1] ;

// t s // mu s

khc phc nhc im ny, trong cc chng sau C++ cung cp mt kiu d liu mi gi l lp, v cho php NSD c th nh ngha ring php cng cho 2 mng tu , khi c th vit mt cch n gin v quen thuc c = a + b cng 2 phn s.
d. V d minh ho

V d 1 : Tm tng, tch 2 phn s.


void main() { int a[2], b[2], tong[2], tich[2] ; cout << "Nhp a. T = " ; cin >> a[0] ; cout << "mu = " ; cin >> a[1] ; cout << "Nhp b. T = " ; cin >> b[0] ; cout << "mu = " ; cin >> b[1] ; tong[0] = a[0]*b[1] + a[1]*b[0] ; tong[1] = a[1] * b[1] ; tich[0] = a[0]*b[0]; tich[1] = a[1] * b[1] ; cout << "Tng = " << tong[0] << '/' << tong[1] ; cout << "Tch = " << tich[0] << '/' << tich[1] ; }

V d 2 : Nhp dy s nguyn, tnh: s s hng dng, m, bng khng ca dy.


void main() { float a[50], i, n, sd, sa, s0; cout << "Nhp s phn t ca dy: " ; cin >> n; sd = sa = s0 = 0 ; for (i=1; i<n; i++) { if (a[i] > 0 ) sd++; if (a[i] < 0 ) sa++; if (a[i] == 0 ) s0++; } cout << "S s dng = " << sd << " s s m = " << sa ; // a cha ti a 50 s // nhp s phn t

for (i=0; i<n; i++) { cout << "a[" << i << "] = " ; cin >> a[i]; } // nhp dy s

62

Chng 3. Cu trc iu khin v d liu kiu mng

cout << "S s bng 0 = " << s0 ; }

V d 3 : Tm s b nht ca mt dy s. In ra s ny v v tr ca n trong dy. Chng trnh s dng mng a lu dy s, n l s phn t thc s trong dy,
min lu s b nht tm c v k l v tr ca min trong dy. min c khi to bng

gi tr u tin (a[0]), sau ln lt so snh vi cc s hng cn li, nu gp s hng nh hn, min s nhn gi tr ca s hng ny. Qu trnh so snh tip tc cho n ht dy. V s s hng ca dy l bit trc (n), nn s ln lp cng c bit trc (n-1 ln lp), do vy chng ta s s dng cu lnh for cho v d ny.
void main() { float a[100], i, n, min, k; // a cha ti a 100 s cout << "Nhp s phn t ca dy: " ; cin >> n; for (i=0; i<n; i++) { cout << "a[" << i << "] = " ; cin >> a[i]; } min = a[0]; k = 0; for (i=1; i<n; i++) if (a[i] < min ) { min = a[i]; k = i; } cout << "S b nht l " << min << "ti v tr " << k; }

V d 4 : Nhp v sp xp tng dn mt dy s. Thut ton c tin hnh bng cch sp xp dn tng s hng b nht ln u dy. Gi s sp c i-1 v tr, ta s tm s b nht trong dy cn li (t v tr th i n n-1) v a s ny lp vo v tr th i. thc hin, chng ta so snh a[i] ln lt vi tng s a[j] trong dy cn li (tc j i t i+1 n n), nu gp a[j] b hn a[i] th i ch hai s ny vi nhau.
void main() { float a[100], i, j, n, tam; cout << "Cho bit s phn t n = " ; cin >> n ; for (i=0; i<n; i++) {cout<<"a[" <<i<< "] = "; cin >> a[i] ;} for (i=0; i<n; i++) { for (j=i+1; j<n; j++) if (a[i] > a[j]) { tam = a[i]; a[i] = a[j]; a[j] = tam; } } // i ch // nhp d liu

63

Chng 3. Cu trc iu khin v d liu kiu mng

for (i=0; i<n; i++) cout << a[i] ; getch(); } 2. Xu k t

// in kt qu

Mt xu k t l mt dy bt k cc k t (k c du cch) do vy n c th c lu bng mng k t. Tuy nhin my c th nhn bit c mng k t ny l mt xu, cn thit phi c k t kt thc xu, theo qui c l k t c m 0 (tc '\0') ti v tr no trong mng. Khi xu l dy k t bt u t phn t u tin (th 0) n k t kt thc xu u tin (khng k cc k t cn li trong mng). 0 H H \0 1 E E H 2 L L E 3 L \0 L 4 O L L 5 6 7 \0 O \0 O \0

Hnh v trn minh ho 3 xu, mi xu c cha trong mng k t c di ti a l 8. Ni dung xu th nht l "Hello" c di thc t l 5 k t, chim 6 trong mng (thm cha k t kt thc '\0'). Xu th hai c ni dung "Hel" vi di 3 (chim 4 ) v xu cui cng biu th mt xu rng (chim 1 ). Ch mng k t c khai bo vi di 8 tuy nhin cc xu c th ch chim mt s k t no trong mng ny v ti a l 7 k t.
a. Khai bo char <tn xu>[ di] ; char <tn xu>[ di] = xu k t ; char <tn xu>[] = xu k t ; // khng khi to // c khi to // c khi to

di mng l s k t ti a c th c trong xu. di thc s ca xu ch tnh t u mng n du kt thc xu (khng k du kt thc xu \0). Do mt xu phi c du kt thc xu nn trong khai bo di ca mng cn phi khai bo tha ra mt phn t. Thc cht di ti a ca xu = di mng - 1. V d nu mun khai bo mng s cha c xu c di ti a 80 k t, ta cn phi khai bo char s[81]. Cch khai bo th hai c km theo khi to xu, l dy k t t gia cp du nhy kp. V d:
char hoten[26] ; // xu h tn cha ti a 25 k t

64

Chng 3. Cu trc iu khin v d liu kiu mng

char monhoc[31] = "NNLT C++" ;

xu mn hc cha ti a 30 k t, c khi to vi ni dung "NNLT C++" vi di thc s l 10 k t (chim 11 u tin trong mng monhoc[31]). Cch khai bo th 3 t chng trnh s quyt nh di ca mng bi xu khi to (bng di xu + 1). V d:
char thang[] = "Mi hai" ; b. Cch s dng // di mng = 9

Tng t nh cc mng d liu khc, xu k t c nhng c trng nh mng, tuy nhin chng cng c nhng im khc bit. Di y l cc im ging v khc nhau . Truy cp mt k t trong xu: c php ging nh mng. V d:
char s[50] = "I\'m a student" ; cout << s[0] ; s[1] = 'a' ; char s[20] = "Hello", t[20] ; t = "Hello" ; t=s; if (s < t) // ch k t ' phi c vit l \' // in k t u tin, tc k t 'I' // t li k t th 2 l 'a' // khai bo hai xu s v t // sai, ch gn c khi khai bo // sai, khng gn c ton b mng // sai, khng so snh c hai mng

Khng c thc hin cc php ton trc tip trn xu nh:

Ton t nhp d liu >> vn dng c nhng c nhiu hn ch. V d


char s[60] ; cin >> s ; cout << s ;

nu xu nhp vo l "Tin hc ho" chng hn th ton t >> ch nhp "Tin" cho s (b tt c cc k t ng sau du trng), v vy khi in ra trn mn hnh ch c t "Tin". V cc php ton khng dng c trc tip trn xu nn cc chng trnh dch vit sn cc hm th vin c khai bo trong file nguyn mu string.h. Cc hm ny gii quyt c hu ht cc cng vic cn thao tc trn xu. N cung cp cho NSD phng tin thao tc trn xu nh gn, so snh, sao chp, tnh di xu, nhp, in, s dng c cc hm ny u chng trnh cn c khai bo string.h. Phn ln cc hm ny s c gii thiu trong phn tip sau.

65

Chng 3. Cu trc iu khin v d liu kiu mng

c. Phng thc nhp xu (#include <iostream.h>)

Do ton t nhp >> c hn ch i vi xu k t nn C++ a ra hm ring (cn gi l phng thc) cin.getline(s,n) nhp xu k t. Hm c 2 i vi s l xu cn nhp ni dung v n-1 l s k t ti a ca xu. Ging phng thc nhp k t cin.get(c), khi gp hm cin.getline(s,n) chng trnh s nhn vo b m bn phm ly ra n-1 k t (nu hoc ly tt c k t cn li, tr k t enter) v gn cho s. Nu ti thi im b m ang rng, chng trnh s tm dng ch NSD nhp d liu (dy k t) vo t bn phm. NSD c th nhp vo dy vi di bt k cho n khi nhn Enter, chng trnh s ly ra n-1 k t u tin gn cho s, phn cn li vn c lu trong b m (k c k t Enter) dng cho ln nhp sau. Hin nhin, sau khi gn cc k t cho s, chng trnh s t ng t k t kt thc xu vo tip theo ca xu s. V d 1 : Xt on lnh sau
char s[10] ; cin.getline(s, 10) ; cout << s << endl ; cin.getline(s, 10) ; cout << s << endl ;

gi s ta nhp vo bn phm dng k t: 1234567890abcd . Khi lnh cin.getline(s,10) u tin s gn xu "123456789" (9 k t) cho s, phn cn li vn lu trong b m bn phm. Tip theo s c in ra mn hnh. n lnh cin.getline(s,10) th hai NSD khng phi nhp thm d liu, chng trnh t ng ly nt s d liu cn li (v cha 9 k t) "0abcd" gn cho s. Sau in ra mn hnh. Nh vy trn mn hnh s xut hin hai dng:
123456789 0abcd

V d 2 : Nhp mt ngy thng dng M (mm/dd/yy), i sang ngy thng dng Vit Nam ri in ra mn hnh.
#include <iostream.h> main() { char US[9], VN[9] = " / / " ; cin.getline(US, 9) ; VN[0] = US[3]; VN[1] = US[4] ; VN[3] = US[0]; VN[4] = US[1] ; // khi to trc hai du / // nhp ngy thng, v d "05/01/99" // ngy // thng

66

Chng 3. Cu trc iu khin v d liu kiu mng

VN[6] = US[6]; VN[7] = US[7] ; cout << VN << endl ; } d. Mt s hm x l xu (#include <string.h>)

// nm

strcpy(s, t) ; Gn ni dung ca xu t cho xu s (thay cho php gn = khng c dng). Hm s sao chp ton b ni dung ca xu t (k c k t kt thc xu) vo cho xu s. s dng hm ny cn m bo di ca mng s t nht cng bng di ca mng t. Trong trng hp ngc li k t kt thc xu s khng c ghi vo s v iu ny c th gy treo my khi chy chng trnh. V d:
char s[10], t[10] ; t = "Face" ; s=t; strcpy(t, "Face") ; strcpy(s, t) ; cout << s << " to " << t ; // khng c dng // khng c dng // c, gn "Face" cho t // c, sao chp t sang s // in ra: Face to Face

strncpy(s, t, n) ; Sao chp n k t ca t vo s. Hm ny ch lm nhim v sao chp, khng t ng gn k t kt thc xu cho s. Do vy NSD phi thm cu lnh t k t '\0' vo cui xu s sau khi sao chp xong. V d:
char s[10], t[10] = "Steven"; strncpy(s, t, 5) ; s[5] = '\0' ; // copy 5 k t "Steve" vo s // t du kt thc xu

// in cu: Steve is young brother of Steven cout << s << " is young brother of " << t ;

Mt s dng c ch ca hm ny l copy mt xu con bt k ca t v t vo s. V d cn copy xu con di 2 k t bt u t k t th 3 ca xu t v t vo s, ta vit strncpy(s, t+3, 2). Ngoi ra xu con c copy c th c t vo v tr bt k ca s (khng nht thit phi t u xu s) chng hn t vo t v tr th 5, ta vit: strncpy(s+5, t+3, 2). Cu lnh ny c ngha: ly 2 k t th 3 v th 4 ca xu t t vo 2 th 5 v th 6 ca xu s. Trn c s ny chng ta c th vit cc on chng 67

Chng 3. Cu trc iu khin v d liu kiu mng

trnh ngn thay th mt on con bt k no trong s bi mt on con bt k (c di tng ng) trong t. V d cc dng lnh chuyn i ngy thng trong v d trc c th vit li bng cch dng hm strncpy nh sau:
strncpy(VN+0, US+3, 2) ; strncpy(VN+3, US+0, 2) ; strncpy(VN+6, US+6, 2); // ngy // thng // nm

strcat(s, t); Ni mt bn sao ca t vo sau s (thay cho php +). Hin nhin hm s loi b k t kt thc xu s trc khi ni thm t. Vic ni s m bo ly c k t kt thc ca xu t vo cho s (nu s ch) v vy NSD khng cn thm k t ny vo cui xu. Tuy nhin, hm khng kim tra xem liu di ca s c ch ni thm ni dung, vic kim tra ny phi do NSD m nhim. V d:
char a[100] = "Mn", b[4] = "ti"; strcat(a, v ); strcat(a, b); cout << a char s[100] , t[100] = "Steve" ; strncpy(s, t, 3); s[3] = '\0'; strcat(s, "p"); cout << t << " goes "<< s << " by " <<s // s = "Ste" // s = "Step" // Steve goes Step by Step // Mn v ti

strncat(s, t, n); Ni bn sao n k t u tin ca xu t vo sau xu s. Hm t ng t thm du kt thc xu vo s sau khi ni xong (tng phn vi strncpy()). Cng ging strcat hm i hi di ca s phi cha kt qu. Tng t, c th s dng cch vit strncat(s, t+k, n) ni n k t t v tr th k ca xu t cho s. V d:
char s[20] = "Nh " ; char t[] = "vua cha" strncat(s, t, 3) ; hoc: strncat(s, t+4, 4) ; // s = "Nh cha" // s = "Nh vua"

strcmp(s, t);

68

Chng 3. Cu trc iu khin v d liu kiu mng

Hm so snh 2 xu s v t (thay cho cc php ton so snh). Gi tr tr li l hiu 2 k t khc nhau u tin ca s v t. T , nu s1 < s2 th hm tr li gi tr m, bng 0 nu s1==s2, v dng nu s1 > s2. Trong trng hp ch quan tm n so snh bng, nu hm tr li gi tr 0 l 2 xu bng nhau v nu gi tr tr li khc 0 l 2 xu khc nhau. V d:
if (strcmp(s,t)) cout << "s khc t"; else cout << "s bng t" ;

strncmp(s, t) ; Ging hm strcmp(s, t) nhng ch so snh ti a n k t u tin ca hai xu. V d:


char s[] = "H Ni" , t[] = "H ni" ; cout << strcmp(s,t) ; cout << strncmp(s, t, 3) ; nhau) // -32 (v 'N' = 78, 'n' = 110) // 0 (v 3 k t u ca s v t l nh

strcmpi(s, t) ; Nh strcmp(s, t) nhng khng phn bit ch hoa, thng. V d:


char s[] = "H Ni" , t[] = "h ni" ; cout << strcmpi(s, t) ; // 0 (v s = t)

strupr(s); Hm i xu s thnh in hoa, v cng tr li xu in hoa . V d:


char s[10] = "Ha noi" ; cout << strupr(s) ; cout << s ; // HA NOI // HA NOI (s cng thnh in hoa)

strlwr(s); Hm i xu s thnh in thung, kt qu tr li l xu s. V d:


char s[10] = "Ha Noi" ; cout << strlwr(s) ; cout << s ; // ha noi // ha noi (s cng thnh in thng)

69

Chng 3. Cu trc iu khin v d liu kiu mng

strlen(s) ; Hm tr gi tr l di ca xu s. V d:
char s[10] = "Ha Noi" ; cout << strlen(s) ; // 5

Sau y l mt s v d s dng tng hp cc hm trn. V d 1 : Thng k s ch 'a' xut hin trong xu s.


main() { const int MAX = 100; char s[MAX+1]; int sokitu = 0; cin.getline(s, MAX+1); for (int i=0; i < strlen(s); i++) if (s[i] = 'a ') sokitu++; cout << "S k t = " << sokitu << endl ; }

V d 2 : Tnh di xu bng cch m tng k t (tng ng vi hm strlen())


main() { char s[100]; cin.getline(s, 100); for (int i=0 ; s[i] != '\0' ; i++) ; cout << " di xu = " << i ; } // di ti a l 99 k t // nhp xu s // chy t u n cui xu

V d 3 : Sao chp xu s sang xu t (tng ng vi hm strcpy(t,s))


void main() { char s[100], t[100]; cin.getline(s, 100); int i=0; // nhp xu s

70

Chng 3. Cu trc iu khin v d liu kiu mng

while ((t[i] = s[i]) != '\0') i++; cout << t << endl ; }

// copy c du kt thc xu '\0'

V d 4 : Ct du cch 2 u ca xu s. Chng trnh s dng bin i chy t u xu n v tr u tin c k t khc du trng. T v tr ny sao chp tng k t cn li ca xu v u xu bng cch s dng thm bin j lm ch s cho xu mi. Kt thc sao chp j s v tr cui xu (mi). Cho j chy ngc v u xu cho n khi gp k t u tin khc du trng. t du kt thc xu ti y.
main() { char s[100]; cin.getline(s, 100); int i, j ; i = j = 0; while (s[i++] == ' '); i-- ; while (s[i] != '\0') s[j++] = s[i++] ; while (s[--j] == ' ') ; s[j+1] = '\0' ; cout << s ; } // b qua cc du cch u tin // sao chp phn cn li vo s // b qua cc du cch cui // t du kt thc xu // nhp xu s

V d 5 : Chy dng ch qung co vng trn t phi sang tri gia mn hnh. Gi s hin 30 k t ca xu qung co. Ta s dng vng lp. Ct 30 k t u tin ca xu cho vo bin hien, hin bin ny ra mn hnh. Bc lp tip theo ct ra 30 k t ca xu nhng dch sang phi 1 k t cho vo bin hien v hin ra mn hnh. Qu trnh tip tc, mi bc lp ta dch chuyn ni dung cn hin ra mn hnh 1 k t, do hiu ng ca mt ta thy dng ch s chy t bin phi v bin tri ca mn hnh. qu trnh chy theo vng trn (khi hin n k t cui ca xu s hin quay li t k t u ca xu) chng trnh s dng bin i nh du im u ca xu con cn ct cho vo hien, khi i bng di ca xu chng trnh t li i = 0 (ct li t u xu). Ngoi ra, phn cui xu ni vi phn u (to thnh vng trn) ngay t u chng trnh, xu qung co s c ni thnh gp i. Vng lp tip tc n khi no NSD n phm bt k (chng trnh nhn bit iu ny nh vo hm kbhit() thuc file nguyn mu conio.h) th dng. dng ch chy

71

Chng 3. Cu trc iu khin v d liu kiu mng

khng qu nhanh chng trnh s dng hm tr delay(n) (thuc dos.h, tm dng trong n phn nghn giy) vi n c iu chnh thch hp theo tc ca my. Hm gotoxy(x, y) (thuc conio.h) trong chng trnh t con tr mn hnh ti v tr ct x dng y m bo dng ch lun lun hin ra ti ng mt v tr trn mn hnh.
#include <iostream.h> #include <conio.h> #include <dos.h> main() { char qc[100] = "Qung co min ph: Khng c tin th khng c kem. "; int dd = strlen(qc); char tam[100] ; strcpy(tam, qc) ; strcat(qc, tam) ; clrscr(); char hien[31] ; i = 0; while (!kbhit()) { strncpy(hien, s+i, 30); hien[30] = '\0'; gotoxy(20,10); cout << hien ; delay(100); i++; if (i==dd) i = 0; } } // copy 30 k t t qc[i] sang hien // in hien ti dng 10 cot 20 // tm dng 1/10 giy // tng i // trong khi cha n phm bt k // nhn i dng qung co // xo mn hnh // cha xu di 30 k t hin

V d 6 : Nhp mt khu (khng qu 10 k t). In ra "ng" nu l "HaNoi2000", "sai" nu ngc li. Chng trnh cho php nhp ti a 3 ln. Nhp ring r tng k t (bng hm getch()) cho mt khu. Hm getch() khng hin k t NSD g vo, thay vo chng trnh ch hin k t 'X' che giu mt khu. Sau khi NSD g xong (9 k t) hoc Enter, chng trnh so snh xu va nhp vi "HaNoi2000", nu ng chng trnh tip tuc, nu sai tng s ln nhp (cho php khng qu 3 ln).
#include <iostream.h> #include <conio.h>

72

Chng 3. Cu trc iu khin v d liu kiu mng

#include <string.h> void main() { char pw[11]; int solan = 0; do { clrscr(); gotoxy(30,12) ; int i = 0; while ((pw[i]=getch()) != 13 && ++i < 10) cout << 'X' ; // 13 = Enter pw[i] = '\0' ; cout << endl ; if (!strcmp(pw, "HaNoi2000")) { cout << "Mi vo" ; break; } else { cout << "Sai mt khu. Nhp li") ; solan++ ; } } while (solan < 3); } // Cho phep nhap 3 lan

IV. MNG HAI CHIU thun tin trong vic biu din cc loi d liu phc tp nh ma trn hoc cc bng biu c nhiu ch tiu, C++ a ra kiu d liu mng nhiu chiu. Tuy nhin, vic s dng mng nhiu chiu rt kh lp trnh v vy trong mc ny chng ta ch bn n mng hai chiu. i vi mng mt chiu m thnh phn, nu mi thnh phn ca n li l mng mt chiu n phn t th ta gi mng l hai chiu vi s phn t (hay kch thc) mi chiu l m v n. Ma trn l mt minh ho cho hnh nh ca mng hai chiu, n gm m dng v n ct, tc cha m x n phn t, v hin nhin cc phn t ny c cng kiu. Tuy nhin, v mt bn cht mng hai chiu khng phi l mt tp hp vi m x n phn t cng kiu m l tp hp vi m thnh phn, trong mi thnh phn l mt mng mt chiu vi n phn t. im nhn mnh ny s c gii thch c th hn trong cc phn trnh by v con tr ca chng sau. 0 0 1 2 Hnh trn minh ho hnh thc mt mng hai chiu vi 3 dng, 4 ct. Thc cht 1 2 3

73

Chng 3. Cu trc iu khin v d liu kiu mng

trong b nh tt c 12 phn t ca mng c sp lin tip theo tng dng ca mng nh minh ho trong hnh di y.

dng 0
a. Khai bo

dng 1

dng 2

<kiu thnh phn > <tn mng>[m][n] ; m, n l s hng, s ct ca mng. kiu thnh phn l kiu ca m x n phn t trong mng. Trong khai bo cng c th c khi to bng dy cc dng gi tr, cc dng cch nhau bi du phy, mi dng c bao bi cp ngoc {} v ton b gi tr khi to nm trong cp du {}.
b. S dng

Tng t mng mt chiu cc chiu trong mng cng c nh s t 0. Khng s dng cc thao tc trn ton b mng m phi thc hin thng qua tng phn t ca mng. truy nhp phn t ca mng ta s dng tn mng km theo 2 ch s ch v tr hng v ct ca phn t. Cc ch s ny c th l cc biu thc thc, khi C++ s t chuyn kiu sang nguyn. V d: Khai bo 2 ma trn 4 hng 5 ct A, B cha cc s nguyn:
int A[3][4], B[3][4] ;

Khai bo c khi to:


int A[3][4] = { {1,2,3,4}, {3,2,1,4}, {0,1,1,0} };

vi khi to ny ta c ma trn: 1 3 0 2 2 1 3 1 1 4 4 0

trong : A[0][0] = 1, A[0][1] = 2, A[1][0] = 3, A[2][3] = 0

74

Chng 3. Cu trc iu khin v d liu kiu mng

Trong khai bo c th vng s hng (khng c vng s ct), s hng ny c xc nh thng qua khi to.
float A[][3] = { {1,2,3}, {0,1,0} } ;

trong khai bo ny chng trnh t ng xc nh s hng l 2. Php khai bo v khi to sau y l cng hp l:
float A[][3] = { {1,2}, {0} } ;

chng trnh cng xc nh s hng l 2 v s ct (bt buc phi khai bo) l 3 mc d trong khi to khng th xc nh c s ct. Cc phn t cha khi to s cha c xc nh cho n khi no n c nhp hoc gn gi tr c th. Trong v d trn cc phn t A[0][2], A[1][1] v A[1][2] l cha c xc nh.
c. V d minh ho

V d 1 : Nhp, in v tm phn t ln nht ca mt ma trn.


#include <iostream.h> #include <iomanip.h> #include <conio.h> main() { float a[10][10] ; int m, n ; int i, j ; int amax, imax, jmax ; for (i=0; i<m; i++) for (j=0; j<n; j++) { cout << "a[" << i << "," << j << "] = " ; cin >> a[i][j] ; } amax = a[0][0]; imax = 0; jmax = 0; for (i=0; i<m; i++) for (j=0; j<n; j++) if (amax < a[i][j]) // s hng, ct ca ma trn // cc ch s trong vng lp // s ln nht v ch s ca n

clrscr(); cout << "Nhp s hng v ct: " ; cin >> m >> n ;

75

Chng 3. Cu trc iu khin v d liu kiu mng

{ amax = a[i][j]; imax = i; jmax = j; } cout << "Ma trn nhp\n" ; cout << setiosflags(ios::showpoint) << setprecision(1) ; for (i=0; i<m; i++) for (j=0; j<n; j++) { if (j==0) cout << endl; cout << setw(6) << a[i][j] ; } cout << "S ln nht l " << setw(6) << amax << endl; cout << "ti v tr (" << imax << "," << jmax << ")" ; getch(); }

Ghi ch: Khi lm vic vi mng (1 chiu, 2 chiu) do thi quen chng ta thng tnh ch s t 1 (thay v 0), do vy trong mng ta c th b qua hng 0, ct 0 bng cch khai bo s hng v ct tng ln 1 so vi s hng, ct thc t ca mng v t c th lm vic t hng 1, ct 1 tr i. V d 2 : Nhn 2 ma trn. Cho 2 ma trn A (m x n) v B (n x p). Tnh ma trn C = A x B, trong C c kch thc l m x p. Ta lp vng lp tnh tng phn t ca C. Gi tr ca phn t C ti hng i, ct j chnh l tch v hng ca hng i ma trn A vi ct j ma trn B. trnh nhm ln ta qui c b cc hng, ct 0 ca cc ma trn A, B, C (tc cc ch s c tnh t 1 tr i).
#include <iostream.h> #include <iomanip.h> #include <conio.h> main() { float A[10][10], B[10], C[10][10] ; int m, n, p ; int i, j, k ; // s hng, ct ca ma trn // cc ch s trong vng lp

76

Chng 3. Cu trc iu khin v d liu kiu mng

clrscr(); cout << "Nhp s hng v ct ca 2 ma trn: " ; cin >> m >> n >> p; // Nhp ma trn A for (i=1; i<=m; i++) for (j=1; j<=n; j++) { cout << "A[" << i << "," << j << "] = " ; cin >> A[i][j] ; } // Nhp ma trn B for (i=1; i<=n; i++) for (j=1; j<=p; j++) { cout << "B[" << i << "," << j << "] = " ; cin >> B[i][j] ; } // Tnh ma trn C = A x B for (i=1; i<=m; i++) for (j=1; j<=p; j++) { C[i][j] = 0; for (k=1; k<=n; k++) C[i][j] += A[i][k]*B[k][j] ; } // In kt qu cout << "Ma trn kt qu\n" ; cout << setiosflags(ios::showpoint) << setprecision(2) ; for (i=1; i<m; i++) for (j=1; j<n; j++) { if (j==1) cout << endl; cout << setw(6) << a[i][j] ; } getch(); }

77

Chng 3. Cu trc iu khin v d liu kiu mng

BI TP
Lnh r nhnh

1. 2. 3.

Nhp mt k t. Cho bit k t c phi l ch ci hay khng. Nhp vo mt s nguyn. Tr li s nguyn : m hay dng, chn hay l ? Cho n = x = y v bng: a. 1 b. 2 c. 3 d. 4 Hy cho bit gi tr ca x, y sau khi chy xong cu lnh:
if (n % 2 == 0) if (x > 3) x = 0; else y = 0;

4.

Tnh gi tr hm a.
3x + x f(x) = x e +4 , x>0 , x0

x 2 +1 b. f ( x ) = 3x + 5 2 x + 2 x 1
5. 6. 7.

, x 1 , 1< x <1 , x 1

ax + by = c Vit chng trnh gii h phng trnh bc nht 2 n: dx + ey = f

Nhp 2 s a, b. In ra max, min ca 2 s . M rng vi 3 s, 4 s ? Nhp 3 s a, b, c. Hy cho bit 3 s trn c th l di 3 cnh ca mt tam gic ? Nu l mt tam gic th l tam gic g: vung, u, cn, vung cn hay tam gic thng ? Nhp vo mt s, in ra th tng ng vi s (qui c 2 l th hai, , 8 l ch nht). Nhp 2 s biu th thng v nm. In ra s ngy ca thng nm (c kim tra nm nhun).

8. 9.

10. Ly ngy thng hin ti lm chun. Hy nhp mt ngy bt k trong thng. Cho bit th ca ngy va nhp ?
Lnh lp

78

Chng 3. Cu trc iu khin v d liu kiu mng

11. Gi tr ca i bng bao nhiu sau khi thc hin cu trc for sau:
for (i = 0; i < 100; i++);

12. Gi tr ca x bng bao nhiu sau khi thc hin cu trc for sau:
for (x = 2; i < 10; x+=3) ;

13. Bn b sung g vo lnh for sau:


for ( ; nam < 1997 ; ) ;

khi kt thc nam c gi tr 2000.


14. Bao nhiu k t X c in ra mn hnh khi thc hin on chng trnh sau:
for (x = 0; x < 10; x ++) for (y = 5; y > 0; y --) cout << X;

15. Nhp vo tui cha v tui con hin nay sao cho tui cha ln hn 2 ln tui con. Tm xem bao nhiu nm na tui cha s bng ng 2 ln tui con (v d 30 v 12, sau 6 nm na tui cha l 36 gp i tui con l 18). 16. Nhp s nguyn dng N. Tnh:
1 + 2 + 3 + ... + N N

a. S1 = b. S 2 =

12 + 2 2 + 3 2 + ... + N 2

17. Nhp s nguyn dng n. Tnh:

a. S1 = 3 + 3 + 3 + ... + 3 b. S 2 =
1 2+ 2+ 1 1 2+. . . 1 2

n du cn n du chia

18. Nhp s t nhin n. In ra mn hnh biu din ca n dng nh phn. 19. In ra mn hnh cc s c 2 ch s sao cho tch ca 2 ch s ny bng 2 ln tng ca 2 ch s (v d s 36 c tch 3*6 = 18 gp 2 ln tng ca n l 3 + 6 = 9). 20. S hon chnh l s bng tng mi c ca n (khng k chnh n). V d 6 = 1 + 2 + 3 l mt s hon chnh. Hy in ra mn hnh tt c cc s hon chnh < 1000. 21. Cc s sinh i l cc s nguyn t m khong cch gia chng l 2. Hy in tt c cp s sinh i < 1000.

79

Chng 3. Cu trc iu khin v d liu kiu mng

22. Nhp dy k t n khi gp k t . th dng. Thng k s ch ci vit hoa, vit thng, s ch s v tng s cc k t khc nhp. Loi k t no nhiu nht ? 23. Tm s nguyn dng n ln nht tho mn iu kin:
1 1 1 a. 1 + + + . . . + < 2.101999 . 3 5 2n 1

b. e n 1999 log10 n < 2000 .


24. Cho = 1e6. Tnh gn ng cc s sau:
2 1 1 1 1 a. S pi theo cng thc Euler: = 2 + 2 + 2 + .. . + 2 6 1 2 3 n 1 <10 6 . 2 n

dng lp khi

b. ex theo cng thc: e x = 1 +

xn x1 x 2 xn < 10 6 . + + ... + dng lp khi n! 1! 2! n!

x 2 n +1 x3 x5 x 2 n +1 n < 10 6 . c. sin x = x + + . . . + ( 1 ) , dng lp khi ( 2n + 1 )! 3! 5! ( 2n + 1 )! d.


n=0 a a ( a > 0 ) theo cng thc: s n = 2 , dng khi ( s n 1 + a ) / 2 s n 1 n > 0 6 s n s n 1 <10 .

25. In ra m ca phm bt k c nhn. Chng trnh lp cho n khi nhn ESC thot. 26. Bng phng php chia i, hy tm nghim xp x ( chnh xc 106) ca cc phng trnh sau:

a. ex 1.5 = 0, trn on [0, 1]. b. x2x 1 = 0, trn on [0, 1]. c. a0xn + a1xn-1 + ... + an = 0, trn on [a, b]. Cc s thc ai, a, b c nhp t bn phm sao cho f(a) v f(b) tri du.
Mng

27. Nhp vo dy n s thc. Tnh tng dy, trung bnh dy, tng cc s m, dng v tng cc s v tr chn, v tr l trong dy. Tm phn t gn s trung bnh nht

80

Chng 3. Cu trc iu khin v d liu kiu mng

ca dy.
28. Tm v ch ra v tr xut hin u tin ca phn t x trong dy. 29. Nhp vo dy n s. Hy in ra s ln nht, b nht ca dy. 30. Nhp vo dy s. In ra dy c sp xp tng dn, gim dn. 31. Cho dy c sp tng dn. Chn thm vo dy phn t x sao cho dy vn sp xp tng dn. 32. Hy nhp vo 16 s nguyn. In ra thnh 4 dng, 4 ct. 33. Nhp ma trn A v in ra ma trn i xng ca n. 34. Cho mt ma trn nguyn kch thc m*n. Tnh:

Tng tt c cc phn t ca ma trn. Tng tt c cc phn t dng ca ma trn. Tng tt c cc phn t m ca ma trn. Tng tt c cc phn t chn ca ma trn. Tng tt c cc phn t l ca ma trn.
35. Cho mt ma trn thc kch thc m*n. Tm:

S nh nht, ln nht (km ch s) ca ma trn. S nh nht, ln nht (km ch s) ca tng hng ca ma trn. S nh nht, ln nht (km ch s) ca tng ct ca ma trn. S nh nht, ln nht (km ch s) ca ng cho chnh ca ma trn. S nh nht, ln nht (km ch s) ca ng cho ph ca ma trn.
36. Nhp 2 ma trn vung cp n A v B. Tnh A + B, A B, A * B v A2 - B2.
Xu k t

37. Hy nhp mt xu k t. In ra mn hnh o ngc ca xu . 38. Nhp xu. Thng k s cc ch s '0', s ch s '1', , s ch s '9' trong xu. 39. In ra v tr k t trng u tin t bn tri (phi) mt xu k t. 40. Nhp xu. In ra tt cc cc v tr ca ch 'a' trong xu v tng s ln xut hin ca n. 41. Nhp xu. Tnh s t c trong xu. In mi dng mt t.

81

Chng 3. Cu trc iu khin v d liu kiu mng

42. Nhp xu h tn, in ra h, tn di dng vit hoa. 43. Thay k t x trong xu s bi k t y (s, x, y c c vo t bn phm) 44. Xo mi k t x c trong xu s (s, x c c vo t bn phm). (Gi : nn xo ngc t cui xu v u xu). 45. Nhp xu. Khng phn bit vit hoa hay vit thng, hy in ra cc k t c mt trong xu v s ln xut hin ca n (v d xu Trach Van Doanh c ch a xut hin 3 ln, c(1), d(1), h(2), n(2), o(1), r(1), t(1), (2), space(4)).

82

Chng 4. Hm v chng trnh

CHNG 4

HM V CHNG TRNH
Con tr v s hc a ch Hm qui T chc chng trnh

I. CON TR V S HC A CH Trc khi bn v hm v chng trnh, trong phn ny chng ta s ni v mt loi bin mi gi l con tr, ngha, cng dng v s dng n nh th no. Bin con tr l mt c trng mnh ca C++, n cho php chng ta thm nhp trc tip vo b nh x l cc bi ton kh bng ch vi cu lnh n gin ca chng trnh. iu ny cng gp phn lm cho C++ tr thnh ngn ng gn gi vi cc ngn ng cp thp nh hp ng. Tuy nhin, v tnh n gin, ngn gn nn vic s dng con tr i hi tnh cn thn cao v giu kinh nghim ca ngi lp trnh.
1. a ch, php ton &

Mi chng trnh trc khi chy u phi b tr cc bin do NSD khai bo vo u trong b nh. to iu kin truy nhp d dng tr li cc bin ny, b nh c nh s, mi byte s c ng vi mt s nguyn, c gi l a ch ca byte t 0 n ht b nh. T , mi bin (vi tn bin) c gn vi mt s nguyn l a ch ca byte u tin m bin c phn phi. S lng cc byte phn phi cho bin l khc nhau (nhng t lin nhau t thp n cao) tu thuc kiu d liu ca bin (v tu thuc vo quan nim ca tng NNLT), tuy nhin ch cn bit tn bin hoc a ch ca bin ta c th c/vit d liu vo/ra cc bin . T ngoi vic thng qua tn bin chng ta cn c th thng qua a ch ca chng truy nhp vo ni dung. Tm li bin, nh v a ch c quan h khng kht vi nhau. C++ cung cp mt ton t mt ngi & ly a ch ca cc bin (ngoi tr bin mng v xu k t). Nu x l mt bin th &x l a ch ca x. T cu lnh sau cho ta bit x c b tr u trong b nh:
int x ; cout << &x ; // a ch s c hin di dng c s 16. V d 0xfff4

83

Chng 4. Hm v chng trnh

i vi bin kiu mng, th tn mng chnh l a ch ca mng, do khng cn dng n ton t &. V d a ch ca mng a chnh l a (khng phi &a). Mt khc a ch ca mng a cng chnh l a ch ca byte u tin m mng a chim v n cng chnh l a ch ca phn t u tin ca mng a. Do vy a ch ca mng a l a ch ca phn t a[0] tc &a[0]. Tm li, a ch ca mng a l a hoc &a[0]. Tm li, cn nh:
int x; long y; cout << &x << &y; char s[9]; cout << a; cout << &a[0]; cout << &a[2]; // khai bo bin nguyn x // khai bo bin nguyn di y // in a ch cc bin x, y // khai bo mng k t s // in a ch mng s // in a ch mng s (tc a ch s[0]) // in a ch k t s[2]

Hnh v sau y minh ho mt vi bin v a ch ca n trong b nh.


200 201 500 501 502 503 650 651 658

1 x

3 y

O s

\0

Bin x chim 2 byte nh, c a ch l 200, bin y c a ch l 500 v chim 4 byte nh. Xu s chim 9 byte nh ti a ch 650. Cc byte nh ca mt bin l lin nhau.

Cc php ton lin quan n a ch c gi l s hc a ch. Tuy nhin, chng ta vn khng c php thao tc trc tip trn cc a ch nh t bin vo a ch ny hay khc (cng vic ny do chng trnh dch m nhim), hay vic cng, tr hai a ch vi nhau l v ngha Cc thao tc c php trn a ch vn phi thng qua cc bin trung gian cha a ch, c gi l bin con tr.
2. Con tr a. ngha

Con tr l mt bin cha a ch ca bin khc. Nu p l con tr cha a ch ca bin x ta gi p tr ti x v x c tr bi p. Thng qua con tr ta c th lm vic c vi ni dung ca nhng nh m p tr n. con tr p tr ti x ta phi gn a ch ca x cho p.

84

Chng 4. Hm v chng trnh

lm vic vi a ch ca cc bin cn phi thng qua cc bin con tr tr n bin .


b. Khai bo bin con tr <kiu c tr> <*tn bin> ;

a ch ca mt bin l a ch byte nh u tin ca bin . V vy ly c ni dung ca bin, con tr phi bit c s byte ca bin, tc kiu ca bin m con tr s tr ti. Kiu ny cng c gi l kiu ca con tr. Nh vy khai bo bin con tr cng ging nh khai bo mt bin thng ngoi tr cn thm du * trc tn bin (hoc sau tn kiu). V d:
int *p ; float *q, *r ; // khai bo bin p l bin con tr tr n kiu d liu nguyn. // hai con tr thc q v r.

c. S dng con tr, php ton *

con tr p tr n bin x ta phi dng php gn p = a ch ca x. Nu x khng phi l mng ta vit: p = &x. Nu x l mng ta vit: p = x hoc p = &x[0]. Khng gn p cho mt hng a ch c th. V d vit p = 200 l sai. Php ton * cho php ly ni dung ni p tr n, v d gn ni dung ni p tr n cho bin f ta vit f = *p. & v * l 2 php ton ngc nhau. C th nu p = &x th x = *p. T nu p tr n x th bt k ni no xut hin x u c th thay c bi *p v ngc li. V d 1 :
int i, j ; int *p, *q ; p = &i; q = &j; cout << &i ; cout << q ; i = 2; *q = 5; i++ ; cout << i ; // khai bo 2 bin nguyn i, j // khai bo 2 con tr nguyn p, q // cho p tr ti i // cho q tr ti j // hi a ch bin i // hi a ch bin j (thng qua q) // gn i bng 2 // gn j bng 5 (thng qua q) // tng i v hi i, i = 3

85

Chng 4. Hm v chng trnh

(*q)++ ; cout << j ; (*p) = (*q) * 2 + 1; cout << i ;

// tng j (thng qua q) v hi j, j = 6 // gn li i (thng qua p) // 13

Qua v d trn ta thy mi thao tc vi i l tng ng vi *p, vi j l tng ng vi *q v ngc li.


3. Cc php ton vi con tr

Trn y ta trnh by v 2 php ton mt ngi lin quan n a ch v con tr l & v *. Phn ny chng ta tip tc xt vi cc php ton khc lm vic vi con tr.
a. Php ton gn

Gn con tr vi a ch mt bin: p = &x ; Gn con tr vi con tr khc: p = q ; (sau php ton gn ny p, q cha cng mt a ch, cng tr n mt ni). V d 2 :
int i = 10 ; int *p, *q, *r ; p = q = r = &i ; *p = q**q + 2**r + 1 ; cout << i ; // khai bo v khi to bin i = 10 // khai bo 3 con tr nguyn p, q, r // cng tr ti i // i = 10*10 + 2*10 + 1 // 121

b. Php ton tng gim a ch p n: con tr tr n thnh phn th n sau (trc) p.

Mt n v tng gim ca con tr bng kch thc ca bin c tr. V d gi s p l con tr nguyn (2 byte) ang tr n a ch 200 th p+1 l con tr tr n a ch 202. Tng t, p + 5 l con tr tr n a ch 210. p 3 cha a ch 194. 194 p3 195 196 197 198 199 200 p 201 202 p+1

Nh vy, php ton tng, gim con tr cho php lm vic thun li trn mng. Nu con tr ang tr n mng (tc ang cha a ch u tin ca mng), vic tng con tr ln 1 n v s dch chuyn con tr tr n phn t th hai, T ta c th cho con tr chy t u n cui mng bng cch tng con tr ln tng n v nh trong cu lnh for di y.

86

Chng 4. Hm v chng trnh

V d 3 :
int a[100] = { 1, 2, 3, 4, 5, 6, 7 }, *p, *q; p = a; cout << *p ; p += 5; cout << *p ; q = p - 4 ; cout << *q ; for (int i=0; i<100; i++) cout << *(p+i) ; c. Php ton t tng gim p++, p--, ++p, --p: tng t p+1 v p-1, c ch n tng (gim) trc, sau. // cho p tr n mng a, *p = a[0] = 1 // *p = a[5] = 6 ; // q = a[1] = 2 ; // in ton b mng a

V d 4 : V d sau minh ho kt qu kt hp php t tng gim vi ly gi tr ni con tr tr n. a l mt mng gm 2 s, p l con tr tr n mng a. Cc lnh di y c qui c l c lp vi nhau (tc lnh sau khng b nh hng bi lnh trc, i vi mi lnh p lun lun tr n phn t u (a[0]) ca a.
int a[2] = {3, 7}, *p = a; (*p)++ ; ++(*p) ; *(p++) ; *(++p) ; // tng (sau) gi tr ni p tr tng a[0] thnh 4 // tng (trc) gi tr ni p tr tng a[0] thnh 4 // ly gi tr ni p tr (3) v tng tr p (tng sau), p a[1] // tng tr p (tng trc), p a[1] v ly gi tr ni p tr (7)

Ch : Phn bit p+1 v p++ (hoc ++p): p+1 c xem nh mt con tr khc vi p. p+1 tr n phn t sau p. p++ l con tr p nhng tr n phn t khc. p++ tr n phn t ng sau phn t p tr n ban u. Phn bit *(p++) v *(++p): Cc php ton t tng gim cng l mt ngi, mc u tin ca chng l cao hn cc php ton hai ngi khc v cao hn php ly gi tr (*). C th:
*p++ *++p ++*p *(p++) *(++p) ++(*p)

Cng ging cc bin nguyn vic kt hp cc php ton ny vi nhau rt d gy nhm ln, do vy cn s dng cp du ngoc qui nh trnh t tnh ton.

87

Chng 4. Hm v chng trnh

d. Hiu ca 2 con tr

Php ton ny ch thc hin c khi p v q l 2 con tr cng tr n cc phn t ca mt dy d liu no trong b nh (v d cng tr n 1 mng d liu). Khi hiu p - q l s thnh phn gia p v q (ch p - q khng phi l hiu ca 2 a ch m l s thnh phn gia p v q). V d: gi s p v q l 2 con tr nguyn, p c a ch 200 v q c a ch 208. Khi p - q = 4 v q - p = 4 (4 l s thnh phn nguyn t a ch 200 n 208).
e. Php ton so snh

Cc php ton so snh cng c p dng i vi con tr, thc cht l so snh gia a ch ca hai ni c tr bi cc con tr ny. Thng thng cc php so snh <, <=, >, >= ch p dng cho hai con tr tr n phn t ca cng mt mng d liu no . Thc cht ca php so snh ny chnh l so snh ch s ca 2 phn t c tr bi 2 con tr . V d 5 :
float a[100], *p, *q ; p=a; q = &a[3] ; cout << (p < q) ; cout << (p + 3 == q) ; cout << (p > q - 1) ; cout << (p >= q - 2) ; // p tr n mng (tc p tr n a[0]) // q tr n phn t th 3 (a[3]) ca mng // 1 // 1 // 0 // 0 // in ton b mng a

for (p=a ; p < a+100; p++) cout << *p ;

4. Cp pht ng, ton t cp pht, thu hi new, delete

Khi tin hnh chy chng trnh, chng trnh dch s b tr cc nh c th cho cc bin c khai bo trong chng trnh. V tr cng nh s lng cc nh ny tn ti v c nh trong sut thi gian chy chng trnh, chng xem nh b chim dng v s khng c s dng vo mc ch khc v ch c gii phng sau khi chm dt chng trnh. Vic phn b b nh nh vy c gi l cp pht tnh (v c cp sn trc khi chy chng trnh v khng th thay i tng, gim kch thc hoc v tr trong sut qu trnh chy chng trnh). V d nu ta khai bo mt mng nguyn cha 1000 s th trong b nh s c mt vng nh lin tc 2000 bytes cha d liu ca mng ny. Khi d trong chng trnh ta ch nhp vo mng v lm vic vi mt vi s th phn mng ri cn li vn khng c s dng vo vic khc. y l hn ch th nht ca kiu mng. mt hng khc, mt ln no chy chng trnh ta li

88

Chng 4. Hm v chng trnh

cn lm vic vi hn 1000 s nguyn. Khi vng nh m chng trnh dch dnh cho mng l khng s dng. y chnh l hn ch th hai ca mng c khai bo trc. Khc phc cc hn ch trn ca kiu mng, by gi chng ta s khng khai bo (b tr) trc mng d liu vi kch thc c nh nh vy. Kch thc c th s c cp pht trong qu trnh chy chng trnh theo ng yu cu ca NSD. Nh vy chng ta c s nh lm vic m vn tit kim c b nh, v khi khng dng na ta c th thu hi (cn gi l gii phng) s nh ny chng trnh s dng vo vic khc. Hai cng vic cp pht v thu hi ny c thc hin thng qua cc ton t new, delete v con tr p. Thng qua p ta c th lm vic vi bt k a ch no ca vng c cp pht. Cch thc b tr b nh nh th ny c gi l cp pht ng. Sau y l c php ca cu lnh new.
p = new <kiu> ; p = new <kiu>[n] ; // cp pht 1 phn t // cp pht n phn t

V d:
int *p ; p = new int ; // cp pht vng nh cha c 1 s nguyn // cp pht vng nh cha c 100 s thc p = float int[100] ;

Khi gp ton t new, chng trnh s tm trong b nh mt lng nh cn ri v lin tc vi s lng theo yu cu v cho p tr n a ch (byte u tin) ca vng nh ny. Nu khng c vng nh vi s lng nh vy th vic cp pht l tht bi v p = NULL (NULL l mt a ch rng, khng xc nh). Do vy ta c th kim tra vic cp pht c thnh cng hay khng thng qua kim tra con tr p bng hay khc NULL. V d:
float *p ; int n ; cout << "S lng cn cp pht = "; cin >> n; p = new double[n]; if (p == NULL) { cout << "Khng b nh" ; exit(0) ; }

Ghi ch: lnh exit(0) cho php thot khi chng trnh, s dng lnh ny cn khai bo file tiu <process.h>.

89

Chng 4. Hm v chng trnh

gii phng b nh cp pht cho mt bin (khi khng cn s dng na) ta s dng cu lnh delete. delete p ; delete[] p ; // p l con tr c s dng trong new // p l con tr tr n mng v gii phng ton b mng c cp php thng qua con tr p ta dng cu lnh: Di y l v d s dng tng hp cc php ton trn con tr. V d 1 : Nhp dy s (khng dng mng). Sp xp v in ra mn hnh. Trong v d ny chng trnh xin cp pht b nh cha n s nguyn v c tr bi con tr head. Khi a ch ca s nguyn u tin v cui cng s l head v head+n-1. p v q l 2 con tr chy trn dy s ny, so snh v i ni dung ca cc s ny vi nhau sp thnh dy tng dn v cui cng in kt qu.
main() { int *head, *p, *q, n, tam; head = new int[n] ; for (p=head; p<head+n; p++) { cout << "So thu " << p-head+1 << ": " ; cin >> *p ; } for (p=head; p<head+n-1; p++) for (q=p+1; q<head+n; q++) if (*q < *p) { tam = *p; *p = *q; *q = tam; } for (p=head; p<head+n; p++) cout << *p ; } 5. Con tr v mng, xu k t a. Con tr v mng 1 chiu // i ch // in kt qu // sp xp // head tr n (nh du) u dy // cp pht b nh cha n s nguyn // nhp dy cout << "Cho bit s s hng ca dy: "); cin >> n ;

Vic cho con tr tr n mng cng tng t tr n cc bin khc, tc gn a ch ca mng (chnh l tn mng) cho con tr. Ch rng a ch ca mng cng l a ch ca thnh phn th 0 nn a+i s l a ch thnh phn th i ca mng. Tng t, nu p tr n mng a th p+i l a ch thnh phn th i ca mng a v do *(p+i) =

90

Chng 4. Hm v chng trnh

a[i] = *(a+i). Ch khi vit *(p+1) = *(a+1) ta thy vai tr ca p v a trong biu thc ny l nh nhau, cng truy cp n gi tr ca phn t a[1]. Tuy nhin khi vit *(p++) th li khc vi *(a++), c th vit p++ l hp l cn a++ l khng c php. L do l tuy p v a cng th hin a ch ca mng a nhng p thc s l mt bin, n c th thay i c gi tr cn a l mt hng, gi tr khng c php thay i. V d vit x = 3 v sau c th tng x bi x++ nhng khng th vit x = 3++. V d 1 : In ton b mng thng qua con tr.
int a[5] = {1,2,3,4,5}, *p, i; 1: p = a; for (i=1; i<=5; i++) cout << *(p+i); // p khng thay i // thay i p

hoc:
2: for (p=a; p<=a+4; p++) cout << *p ;

Trong phng n 1, con tr p khng thay i trong sut qu trnh lm vic ca lnh for, truy nhp n phn t th i ca mng a ta s dng c php *(p+i). i vi phng n 2 con tr s dch chuyn dc theo mng a bt u t a ch a (phn t u tin) n phn t cui cng. Ti bc th i, p s tr vo phn t a[i], do ta ch cn in gi tr *p. kim tra khi no p t n phn t cui cng, ta c th so snh p vi a ch cui mng chnh l a ch u mng cng thm s phn t trong a v tr 1 (tc a+4 trong v d trn).
b. Con tr v xu k t

Mt con tr k t c th xem nh mt bin xu k t, trong xu chnh l tt c cc k t k t byte con tr tr n cho n byte '\0' gp u tin. V vy ta c th khai bo cc xu di dng con tr k t nh sau. char *s ; char *s = "Hello" ; Cc hm trn xu vn c s dng nh khi ta khai bo n di dng mng k t. Ngoi ra khc vi mng k t, ta c php s dng php gn cho 2 xu di dng con tr, v d:
char *s, *t = "Tin hc" ; s = t; // thay cho hm strcpy(s, t) ;

Thc cht php gn trn ch l gn 2 con tr vi nhau, n cho php s by gi cng c tr n ni m t tr (tc dy k t "Tin hc" b tr sn trong b nh) Khi khai bo xu dng con tr n vn cha c b nh c th, v vy thng thng km theo khai bo ta cn phi xin cp pht b nh cho xu vi di cn thit. V d:
char *s = new char[30], *t ;

91

Chng 4. Hm v chng trnh

strcpy(s, "Hello") ; t=s;

// trong trng hp ny khng cn cp pht b // nh cho t v t v s cng s dng chung vng nh

nhng:
char *s = new char[30], *t ; strcpy(s, "Hello") ; t = new char[30]; strcpy(t, s) ; // trong trng hp ny phi cp b nh cho t v // c ch strcpy sao chp sang ni dung ca s.

c. Con tr v mng hai chiu

d hiu vic s dng con tr tr n mng hai chiu, chng ta nhc li v mng 2 chiu thng qua v d. Gi s ta c khai bo:
float a[2][3], *p;

khi a c b tr trong b nh nh l mt dy 6 phn t float nh sau

a+1

tuy nhin a khng c xem l mng 1 chiu vi 6 phn t m c quan nim nh mng mt chiu gm 2 phn t, mi phn t l 1 b 3 s thc. Do a ch ca mng a chnh l a ch ca phn t u tin a[0][0], v a+1 khng phi l a ch ca phn t tip theo a[0][1] m l a ch ca phn t a[1][0]. Ni cch khc a+1 cng l tng a ch ca a ln mt thnh phn, nhng 1 thnh phn y c hiu l ton b mt dng ca mng. Mt khc, vic ly a ch ca tng phn t (float) trong a thng l khng chnh xc. V d: vit &a[i][j] (a ch ca phn t dng i ct j) l c i vi mng nguyn nhng li khng ng i vi mng thc. T cc tho lun trn, php gn p = a l d gy nhm ln v p l con tr float cn a l a ch mng (1 chiu). Do vy trc khi gn ta cn p kiu ca a v kiu float. Tm li cch gn a ch ca a cho con tr p c thc hin nh sau: Cch sai:
p=a; // sai v khc kiu // p kiu ca a v con tr float (cng l kiu ca p) // gn vi a ch ca mng a[0] // gn vi a ch s thc u tin trong a

Cc cch ng:
p = (float*)a; p = a[0]; p = &a[0][0];

92

Chng 4. Hm v chng trnh

trong cch dng p = (float*)a; l trc quan v ng trong mi trng hp nn c dng thng dng hn c. Sau khi gn a cho p (p l con tr thc), vic tng gim p chnh l dch chuyn con tr trn tng phn t (thc) ca a. Tc:
p tr ti a[0][0] p+1 tr ti a[0][1] p+2 tr ti a[0][2] p+3 tr ti a[1][0] p+4 tr ti a[1][1] p+5 tr ti a[1][2]

Tng qut, i vi mng m x n phn t:


p + i*n + j tr ti a[i][j] hoc a[i][j] = *(p + i*n + j)

T truy nhp n phn t a[i][j] thng qua con tr p ta nn s dng cch vit sau:
p = (float*)a; cin >> *(p+i*n+j) ; cout << *(p+i*n+j); // nhp cho a[i][j] // in a[i][j]

V d sau y cho php nhp v in mt mng 2 chiu m*n (m dng, n ct) thng qua con tr p. Nhp lin tip m*n s vo mng v in thnh ma trn m dng, n ct.
main() { clrscr(); float a[m][n], *p; int i, j; p = (float*) a; for (i=0; i<m*n; i++) cin >> *(p+i); *(p+2*n+3) = 100; *(p+4*n) = 100; for (i=0; i<m; i++) { for (j=0; j<n; j++) cout << *(p+i*n+j); cout << endl; // nhp nh dy mxn phn t // gn a[2,3] = a[4][0] = 100 // in li di dng ma trn

93

Chng 4. Hm v chng trnh

} getch(); }

Ch : vic ly a ch phn t a[i][j] ca mng thc a l khng chnh xc. Tc: vit p = &a[i][j] c th dn n kt qu sai.
6. Mng con tr a. Khi nim chung

Thc cht mt con tr cng l mt bin thng thng c tn gi (v d p, q, ), do cng ging nh bin, nhiu bin cng kiu c th t chc thnh mt mng vi tn gi chung, y cng vy nhiu con tr cng kiu cng c t chc thnh mng. Nh vy mi phn t ca mng con tr l mt con tr tr n mt mng no . Ni cch khc mt mng con tr cho php qun l nhiu mng d liu cng kiu. Cch khai bo:
<kiu> *a[size];

V d:
int *a[10];

khai bo mt mng cha 10 con tr. Mi con tr a[i] cha a ch ca mt mng nguyn no .
b. Mng xu k t

L trng hp ring ca mng con tr ni chung, trong kiu c th l char. Mi thnh phn mng l mt con tr tr n mt xu k t, c ngha cc thao tc tin hnh trn *a[i] nh i vi mt xu k t. V d 1 : Nhp vo v in ra mt bi th.
main() { clrscr(); char *dong[100]; int i, n; cout << "so dong = "; cin >> n ; // nhp s dng thc s cin.ignore(); for (i=0; i<n; i++) // loi du trong lnh cin trn // khai bo 100 con tr k t (100 dng)

94

Chng 4. Hm v chng trnh

{ dong[i] = new char[80]; cin.getline(dong[i],80); } for (i=0; i<n; i++) cout << dong[i] << endl; // in kt qu getch(); } // cp b nh cho dng i // nhp dng i

II. HM Hm l mt chng trnh con trong chng trnh ln. Hm nhn (hoc khng) cc i s v tr li (hoc khng) mt gi tr cho chng trnh gi n. Trong trng hp khng tr li gi tr, hm hot ng nh mt th tc trong cc NNLT khc. Mt chng trnh l tp cc hm, trong c mt hm chnh vi tn gi main(), khi chy chng trnh, hm main() s c chy u tin v gi n hm khc. Kt thc hm main() cng l kt thc chng trnh. Hm gip cho vic phn on chng trnh thnh nhng mun ring r, hot ng c lp vi ng ngha ca chng trnh ln, c ngha mt hm c th c s dng trong chng trnh ny m cng c th c s dng trong chng trnh khc, d cho vic kim tra v bo tr chng trnh. Hm c mt s c trng: Nm trong hoc ngoi vn bn c chng trnh gi n hm. Trong mt vn bn c th cha nhiu hm, c gi t chng trnh chnh (main), t hm khc hoc t chnh n ( quy), Khng lng nhau. C 3 cch truyn gi tr: Truyn theo tham tr, tham bin v tham tr.
1. Khai bo v nh ngha hm a. Khai bo

Mt hm thng lm chc nng: tnh ton trn cc tham i v cho li gi tr kt qu, hoc ch n thun thc hin mt chc nng no , khng tr li kt qu tnh ton. Thng thng kiu ca gi tr tr li c gi l kiu ca hm. Cc hm thng c khai bo u chng trnh. Cc hm vit sn c khai bo trong cc file nguyn mu *.h. Do , s dng c cc hm ny, cn c ch th #include <*.h> ngay u chng trnh, trong *.h l tn file c th c cha khai bo ca cc hm

95

Chng 4. Hm v chng trnh

c s dng (v d s dng cc hm ton hc ta cn khai bo file nguyn mu math.h). i vi cc hm do NSD t vit, cng cn phi khai bo. Khai bo mt hm nh sau:
<kiu gi tr tr li> <tn hm>(d/s kiu i) ;

trong , kiu gi tr tr li cn gi l kiu hm v c th nhn kiu bt k chun ca C++ v c kiu ca NSD t to. c bit nu hm khng tr li gi tr th kiu ca gi tr tr li c khai bo l void. Nu kiu gi tr tr li c b qua th chng trnh ngm nh hm c kiu l int (phn bit vi void !). V d 1 :
int bp(int); int rand100(); cong(int, int); // Khai bo hm bp, c i kiu int v kiu hm l int // Khng i, kiu hm (gi tr tr li) l int // Hai i kiu int, kiu hm l int (ngm nh).

void alltrim(char[]) ; // i l xu k t, hm khng tr li gi tr (khng kiu).

Thng thng chng trnh c r rng chng ta nn trnh lm dng cc ngm nh. V d trong khai bo cong(int, int); nn khai bo r c kiu hm (trong trng hp ny kiu hm ngm nh l int) nh sau : int cong(int, int);
b. nh ngha hm

Cu trc mt hm bt k c b tr cng ging nh hm main() trong cc phn trc. C th: Hm c tr v gi tr


<kiu hm> <tn hm>(danh sch tham i hnh thc) { khai bo cc b ca hm ; dy lnh ca hm ; return (biu thc tr v); } // c th nm u trong dy lnh. // ch dng ring cho hm ny

Danh sch tham i hnh thc cn c gi ngn gn l danh sch i gm dy cc i cch nhau bi du phy, i c th l mt bin thng, bin tham chiu hoc bin con tr, hai loi bin sau ta s trnh by trong cc phn ti. Mi i c khai bo ging nh khai bo bin, tc l cp gm <kiu i> <tn i>. Vi hm c tr li gi tr cn c cu lnh return km theo sau l mt biu thc. Kiu ca gi tr biu thc ny chnh l kiu ca hm c khai bo

96

Chng 4. Hm v chng trnh

phn tn hm. Cu lnh return c th nm v tr bt k trong phn cu lnh, tu thuc mc ch ca hm. Khi gp cu lnh return chng trnh tc khc thot khi hm v tr li gi tr ca biu thc sau return nh gi tr ca hm. V d 2 : V d sau nh ngha hm tnh lu tha n (vi n nguyn) ca mt s thc bt k. Hm ny c hai u vo (i thc x v s m nguyn n) v u ra (gi tr tr li) kiu thc vi chnh xc gp i l xn.
double luythua(float x, int n) { int i ; double kq = 1 ; return kq; } // bin ch s // lu kt qu

for (i=1; i<=n; i++) kt qu *= x ;

Hm khng tr v gi tr Nu hm khng tr li gi tr (tc kiu hm l void), khi c th c hoc khng c cu lnh return, nu c th ng sau return s khng c biu thc gi tr tr li. V d 3 : Hm xo mn hnh 100 ln, hm ch lm cng vic cn thn xo mn hnh nhiu ln mn hnh tht sch, nn khng c gi tr g tr li.
void xmh() { int i; for (i=1; i<=100; i++) clrscr(); return ; }

Hm main() thng thng c hoc khng c gi tr tr v cho h iu hnh khi chng trnh chy xong, v vy ta thng khai bo kiu hm l int main() hoc void main() v cu lnh cui cng trong hm thng l return 1 hoc return. Trng hp b qua t kho void nhng trong thn hm khng c cu lnh return (ging phn ln v d trong gio trnh ny) chng trnh s ngm hiu hm main() tr li mt gi tr nguyn nhng v khng c nn khi dch chng trnh ta s gp li cnh bo "Cn c gi tr tr li cho hm" (mt li cnh bo khng phi l li, chng trnh vn chy bnh thng). trnh b quy ry v nhng li cnh bo "khng mi" ny chng ta c th t thm cu lnh return 0; (nu khng khai bo void main()) hoc khai bo kiu hm l void main() v t cu lnh return vo cui hm.

97

Chng 4. Hm v chng trnh

c. Ch v khai bo v nh ngha hm

Danh sch i trong khai bo hm c th cha hoc khng cha tn i, thng thng ta ch khai bo kiu i ch khng cn khai bo tn i, trong khi dng u tin ca nh ngha hm phi c tn i y . Cui khai bo hm phi c du chm phy (;), trong khi cui dng u tin ca nh ngha hm khng c du chm phy.

Hm c th khng c i (danh sch i rng), tuy nhin cp du ngoc sau tn hm vn phi c vit. V d clrscr(), lamtho(), vietgiaotrinh(),

Mt hm c th khng cn phi khai bo nu n c nh ngha trc khi c hm no gi n n. V d c th vit hm main() trc (trong vn bn chng trnh), ri sau mi vit n cc hm "con". Do trong hm main() chc chn s gi n hm con ny nn danh sch ca chng phi c khai bo trc hm main(). Trng hp ngc li nu cc hm con c vit (nh ngha) trc th khng cn phi khai bo chng na (v trong nh ngha hm khai bo). Nguyn tc ny p dng cho hai hm A, B bt k ch khng ring cho hm main(), ngha l nu B gi n A th trc A phi c nh ngha hoc t nht cng c dng khai bo v A.
2. Li gi v s dng hm

Li gi hm c php xut hin trong bt k biu thc, cu lnh ca hm khc Nu li gi hm li nm trong chnh bn thn hm th ta gi l quy. gi hm ta ch cn vit tn hm v danh sch cc gi tr c th truyn cho cc i t trong cp du ngoc trn ().
tn hm(danh sch tham i thc s) ;

Danh sch tham i thc s cn gi l danh sch gi tr gm cc gi tr c th gn ln lt cho cc i hnh thc ca hm. Khi hm c gi thc hin th tt c nhng v tr xut hin ca i hnh thc s c gn cho gi tr c th ca i thc s tng ng trong danh sch, sau hm tin hnh thc hin cc cu lnh ca hm ( tnh kt qu). Danh sch tham i thc s truyn cho tham i hnh thc c s lng bng vi s lng i trong hm v c truyn cho i theo th t tng ng. Cc tham i thc s c th l cc hng, cc bin hoc biu thc. Bin trong gi tr c th trng vi tn i. V d ta c hm in n ln k t c vi tn hm inkitu(int n, char c); v li gi hm inkitu(12, 'A'); th n v c l cc i hnh thc, 12 v 'A' l cc i thc s hoc gi tr. Cc i hnh thc n v c s ln lt c gn bng cc gi tr tng ng l 12 v 'A' trc khi tin hnh cc cu lnh trong phn thn hm. Gi s hm in k t c khai bo li thnh inkitu(char

98

Chng 4. Hm v chng trnh

c, int n); th li gi hm cng phi c thay li thnh inkitu('A', 12). Cc gi tr tng ng c truyn cho i phi c kiu cng vi kiu i (hoc C++ c th t ng chuyn kiu c v kiu ca i). Khi mt hm c gi, ni gi tm thi chuyn iu khin n thc hin dng lnh u tin trong hm c gi. Sau khi kt thc thc hin hm, iu khin li c tr v thc hin tip cu lnh sau lnh gi hm ca ni gi. V d 4 : Gi s ta cn tnh gi tr ca biu thc 2x3 - 5x2 - 4x + 1, thay cho vic tnh trc tip x3 v x2, ta c th gi hm luythua() trong v d trn tnh cc gi tr ny bng cch gi n trong hm main() nh sau:
#include <iostream.h> #include <iomanip.h> double luythua(float x, int n) { int i ; double kq = 1 ; for (i=1; i<=n; i++) kt qu *= x ; return kq; } void xmh(int n) { int i; for (i=1; i<=n; i++) clrscr(); return ; } main() { float x ; double f ; cout << "x = " ; cin >> x f = 2*luythua(x,3) - 5*luythua(x,2) - 4*x + 1; xmh(100); // xo tht sch mn hnh 100 ln // tn bin c th trng vi i ca hm // lu kt qu // tnh gi tr 2x3 - 5x2 - 4x + 1 // xo mn hnh n ln // bin ch s // lu kt qu // tr li gi tr xn

99

Chng 4. Hm v chng trnh

cout << setprecision(2) << f << endl ; }

Qua v d ny ta thy li ch ca lp trnh cu trc, chng trnh tr nn gn hn, chng hn hm luythua() ch c vit mt ln nhng c th s dng n nhiu ln (2 ln trong v d ny) ch bng mt cu lnh gi n gin cho mi ln s dng thay v phi vit li nhiu ln on lnh tnh lu tha.
3. Hm vi i mc nh

Mc ny v mc sau chng ta bn n mt vi m rng thit thc ca C++ i vi C c lin quan n hm, l hm vi i mc nh v cch to, s dng cc hm c chung tn gi. Mt m rng quan trng khc l cch truyn i theo tham chiu s c bn chung trong mc truyn tham i thc s cho hm. Trong phn trc chng ta khng nh s lng tham i thc s phi bng s lng tham i hnh thc khi gi hm. Tuy nhin, trong thc t rt nhiu ln hm c gi vi cc gi tr ca mt s tham i hnh thc c lp i lp li. Trong trng hp nh vy lc no cng phi vit mt danh sch di cc tham i thc s ging nhau cho mi ln gi l mt cng vic khng my th v. T thc t C++ a ra mt c php mi v hm sao cho mt danh sch tham i thc s trong li gi khng nht thit phi vit y nu mt s trong chng c sn nhng gi tr nh trc. C php ny c gi l hm vi tham i mc nh v c khai bo vi c php nh sau:
<kiu hm> <tn hm>(1, , n, m1 = gt1, , mm = gtm) ;

Cc i 1, , n v i mc nh m1, , mm u c khai bo nh c ngha l gm c kiu i v tn i. Ring cc i mc nh m1, , mm c gn thm cc gi tr mc nh gt1, , gtm. Mt li gi bt k khi gi n hm ny u phi c y cc tham i thc s ng vi cc 1, , m nhng c th c hoc khng cc tham i thc s ng vi cc i mc nh m1, , mm. Nu tham i no khng c tham i thc s th n s c t ng gn gi tr mc nh khai bo. V d 5 : Xt hm xmh(int n = 100), trong n mc nh l 100, ngha l nu gi xmh(99) th mn hnh c xo 99 ln, cn nu gi xmh(100) hoc gn hn xmh() th chng trnh s xo mn hnh 100 ln. Tng t, xt hm int luythua(float x, int n = 2); Hm ny c mt tham i mc nh l s m n, nu li gi hm b qua s m ny th chng trnh hiu l tnh bnh phng ca x (n = 2). V d li gi luythua(4, 3) c hiu l 43

100

Chng 4. Hm v chng trnh

cn luythua(4) c hiu l 42. Hm tnh tng 4 s nguyn: int tong(int m, int n, int i = 0; int j = 0); khi c th tnh tng ca 5, 2, 3, 7 bng li gi hm tong(5,2,3,7) hoc c th ch tnh tng 3 s 4, 2, 1 bng li gi tong(4,2,1) hoc cng c th gi tong(6,4) ch tnh tng ca 2 s 6 v 4. Ch : Cc i ngm nh phi c khai bo lin tc v xut hin cui cng trong danh sch i. V d:
int tong(int x, int y=2, int z, int t=1); void xoa(int x=0, int y) 4. Khai bo hm trng tn // sai v cc i mc nh khng lin tc // sai v i mc nh khng cui

Hm trng tn hay cn gi l hm chng (). y l mt k thut cho php s dng cng mt tn gi cho cc hm "ging nhau" (cng mc ch) nhng x l trn cc kiu d liu khc nhau hoc trn s lng d liu khc nhau. V d hm sau tm s ln nht trong 2 s nguyn:
int max(int a, int b) { return (a > b) ? a: b ; }

Nu t c = max(3, 5) ta s c c = 5. Tuy nhin cng tng t nh vy nu t c = max(3.0, 5.0) chng trnh s b li v cc gi tr (float) khng ph hp v kiu (int) ca i trong hm max. Trong trng hp nh vy chng ta phi vit hm mi tnh max ca 2 s thc. Mc ch, cch lm vic ca hm ny hon ton ging hm trc, tuy nhin trong C v cc NNLT c in khc chng ta buc phi s dng mt tn mi cho hm "mi" ny. V d:
float fmax(float a, float b) { return (a > b) ? a: b ; }

Tng t tun tin ta s vit thm cc hm


char cmax(char a, char b) { return (a > b) ? a: b ; } long lmax(long a, long b) { return (a > b) ? a: b ; } double dmax(double a, double b) { return (a > b) ? a: b ; }

Tm li ta s c 5 hm: max, cmax, fmax, lmax, dmax, vic s dng tn nh vy s gy bt li khi cn gi hm. C++ cho php ta c th khai bo v nh ngha c 5 hm trn vi cng 1 tn gi v d l max chng hn. Khi ta c 5 hm:
1: 2: 3: 4: int max(int a, int b) { return (a > b) ? a: b ; } float max(float a, float b) { return (a > b) ? a: b ; } char max(char a, char b) { return (a > b) ? a: b ; } long max(long a, long b) { return (a > b) ? a: b ; }

101

Chng 4. Hm v chng trnh

5:

double max(double a, double b) { return (a > b) ? a: b ; }

V li gi hm bt k dng no nh max(3,5), max(3.0,5), max('O', 'K') u c p ng. Chng ta c th t ra vn : vi c 5 hm cng tn nh vy, chng trnh gi n hm no. Vn c gii quyt d dng v chng trnh s da vo kiu ca cc i khi gi quyt nh chy hm no. V d li gi max(3,5) c 2 i u l kiu nguyn nn chng trnh s gi hm 1, li gi max(3.0,5) hng n hm s 2 v tng t chng trnh s chy hm s 3 khi gp li gi max('O','K'). Nh vy mt c im ca cc hm trng tn l trong danh sch i ca chng phi c t nht mt cp i no khc kiu nhau. Mt c trng khc phn bit thng qua cc i l s lng i trong cc hm phi khc nhau (nu kiu ca chng l ging nhau). V d vic v cc hnh: thng, tam gic, vung, ch nht trn mn hnh l ging nhau, chng ch ph thuc vo s lng cc im ni v to ca chng. Do vy ta c th khai bo v nh ngha 4 hm v ni trn vi cng chung tn gi. Chng hn:
void ve(Diem A, Diem B) ; void ve(Diem A, Diem B, Diem C) ; void ve(Diem A, Diem B, Diem C, Diem D) ; // v ng thng AB // v tam gic ABC // v t gic ABCD

trong v d trn ta gi thit Diem l mt kiu d liu lu to ca cc im trn mn hnh. Hm ve(Diem A, Diem B, Diem C, Diem D) s v hnh vung, ch nht, thoi, bnh hnh hay hnh thang ph thuc vo to ca 4 im ABCD, ni chung n c s dng v mt t gic bt k. Tm li nhiu hm c th c nh ngha chng (vi cng tn gi ging nhau) nu chng tho cc iu kin sau: S lng cc tham i trong hm l khc nhau, hoc Kiu ca tham i trong hm l khc nhau. K thut chng tn ny cn p dng c cho cc ton t. Trong phn lp trnh hng i tng, ta s thy NSD c php nh ngha cc ton t mi nhng vn ly tn c nh +, -, *, /
5. Bin, i tham chiu

Mt bin c th c gn cho mt b danh mi, v khi ch no xut hin bin th cng tng ng nh dng b danh v ngc li. Mt b danh nh vy c gi l mt bin tham chiu, ngha thc t ca n l cho php "tham chiu" ti mt bin khc cng kiu ca n, tc s dng bin khc nhng bng tn ca bin tham chiu. Ging khai bo bin bnh thng, tuy nhin trc tn bin ta thm du v (&). C th tm phn bin thnh 3 loi: bin thng vi tn thng, bin con tr vi du * trc tn v bin tham chiu vi du &. 102

Chng 4. Hm v chng trnh

<kiu bin> &<tn bin tham chiu> = <tn bin c tham chiu>;

C php khai bo ny cho php ta to ra mt bin tham chiu mi v cho n tham chiu n bin c tham chiu (cng kiu v phi c khai bo t trc). Khi bin tham chiu cn c gi l b danh ca bin c tham chiu. Ch khng c c php khai bo ch tn bin tham chiu m khng km theo khi to. V d:
int hung, dung ; int &ti = hung; int &teo = dung; // khai bo cc bin nguyn hung, dung // khai bo bin tham chiu ti, teo tham chieu n // hung dung. ti, teo l b danh ca hung, dung

T v tr ny tr i vic s dng cc tn hung, ti hoc dung, teo l nh nhau. V d:


hung = 2 ; ti ++; cout << hung << ti ; teo = ti + hung ; dung ++ ; cout << dung << teo ; // tng ng hung ++; // 3 3 // tng ng dung = hung + hung // tng ng teo ++ // 7 7

Vy s dng thm bin tham chiu lm g ? Cch t chc bn trong ca mt bin tham chiu khc vi bin thng ch ni dung ca n l a ch ca bin m n i din (ging bin con tr), v d cu lnh
cout << teo ; // 7

in ra gi tr 7 nhng thc cht y khng phi l ni dung ca bin teo, ni dung ca teo l a ch ca dung, khi cn in teo, chng trnh s tham chiu n dung v in ra ni dung ca dung (7). Cc hot ng khc trn teo cng vy (v d teo++), thc cht l tng mt n v ni dung ca dung (ch khng phi ca teo). T cch t chc ca bin tham chiu ta thy chng ging con tr nhng thun li hn ch khi truy cp n gi tr ca bin c tham chiu (dung) ta ch cn ghi tn bin tham chiu (teo) ch khng cn thm ton t (*) trc nh trng hp dng con tr. im khc bit ny c ch khi c s dng truyn i cho cc hm vi mc ch lm thay i ni dung ca bin ngoi. T tng ny c trnh by r rng hn trong mc 6 ca chng. Ch : Bin tham chiu phi c khi to khi khai bo.

103

Chng 4. Hm v chng trnh

Tuy ging con tr nhng khng dng c cc php ton con tr cho bin tham chiu. Ni chung ch nn dng trong truyn i cho hm.
6. Cc cch truyn tham i

C 3 cch truyn tham i thc s cho cc tham i hnh thc trong li gi hm. Trong cch ta dng cho n thi im hin nay c gi l truyn theo tham tr, tc cc i hnh thc s nhn cc gi tr c th t li gi hm v tin hnh tnh ton ri tr li gi tr. d hiu cc cch truyn i chng ta s xem qua cch thc chng trnh thc hin vi cc i khi thc hin hm.
a. Truyn theo tham tr

Ta xt li v d hm luythua(float x, int n) tnh xn. Gi s trong chng trnh chnh ta c cc bin a, b, f ang cha cc gi tr a = 2, b = 3, v f cha c gi tr. tnh ab v gn gi tr tnh c cho f, ta c th gi f = luythua(a,b). Khi gp li gi ny, chng trnh s t chc nh sau: To 2 bin mi (tc 2 nh trong b nh) c tn x v n. Gn ni dung cc nh ny bng cc gi tr trong li gi, tc gn 2 (a) cho x v 3 (b) cho n. Ti phn khai bo (ca hm), chng trnh to thm cc nh mang tn kq v i. Tin hnh tnh ton (gn li kt qu cho kq). Cui cng ly kt qu trong kq gn cho nh f (l nh c sn c khai bo trc, nm bn ngoi hm). Kt thc hm quay v chng trnh gi. Do hm luythua hon thnh xong vic tnh ton nn cc nh c to ra trong khi thc hin hm (x, n, kq, i) s c xo khi b nh. Kt qu tnh ton c lu gi trong nh f (khng b xo v khng lin quan g n hm). Trn y l truyn i theo cch thng thng. Vn t ra l gi s ngoi vic tnh f, ta cn mun thay i cc gi tr ca cc nh a, b (khi truyn n cho hm) th c th thc hin c khng ? gii quyt bi ton ny ta cn theo mt k thut khc, nh vo vai tr ca bin con tr v tham chiu.
b. Truyn theo dn tr

Xt v d tro i gi tr ca 2 bin. y l mt yu cu nh nhng c gp nhiu ln trong chng trnh, v d sp xp mt danh sch. Do vy cn vit mt hm thc hin yu cu trn. Hm khng tr kt qu. Do cc bin cn trao i l cha c bit trc ti thi im vit hm, nn ta phi a chng vo hm nh cc tham i, tc hm c hai tham i x, y i din cho cc bin s thay i gi tr sau ny.

104

Chng 4. Hm v chng trnh

T mt vi nhn xt trn, theo thng thng hm tro i s c vit nh sau:


void swap(int x, int y) { int t ; t = x ; x = y ; y = t ; }

Gi s trong chng trnh chnh ta c 2 bin x, y cha cc gi tr ln lt l 2, 5. Ta cn i ni dung 2 bin ny sao cho x = 5 cn y = 2 bng cch gi n hm swap(x, y).
main() { int x = 2; int y = 5; swap(x, y) ; cout << x << y ; } // 2, 5 (x, y vn khng i)

Thc s sau khi chy xong chng trnh ta thy gi tr ca x v y vn khng thay i !?. Nh gii thch trong mc trn (gi hm luythua), vic u tin khi chng trnh thc hin mt hm l to ra cc bin mi (cc nh mi, c lp vi cc nh x, y c sn) tng ng vi cc tham i, trong trng hp ny cng c tn l x, y v gn ni dung ca x, y (ngoi hm) cho x, y (mi). V vic cui cng ca chng trnh sau khi thc hin xong hm l xo cc bin mi ny. Do vy ni dung ca cc bin mi thc s l c thay i, nhng khng nh hng g n cc bin x, y c. Hnh v di y minh ho cch lm vic ca hm swap, trc, trong v sau khi gi hm. Trc x 2 y 5 x 2 Trong y 5 x 2 Sau y 5

t 2 2 2

x' 2 5 5

y' 5 5 2

Cc bin tm b xo khi chy xong hm

105

Chng 4. Hm v chng trnh

Nh vy hm swap cn c vit li sao cho vic thay i gi tr khng thc hin trn cc bin tm m phi thc s thc hin trn cc bin ngoi. Mun vy thay v truyn gi tr ca cc bin ngoi cho i, by gi ta s truyn a ch ca n cho i, v cc thay i s phi thc hin trn ni dung ca cc a ch ny. chnh l l do ta phi s dng con tr lm tham i thay cho bin thng. C th hm swap c vit li nh sau:
void swap(int *p, int *q) { int t; t = *p ; *p = *q ; *q = t ; } // khai bo bin tm t // t gi tr ca t bng ni dung ni p tr ti // thay ni dung ni p tr bng ni dung ni q tr // thay ni dung ni q tr ti bng ni dung ca t

Vi cch t chc hm nh vy r rng nu ta cho p tr ti bin x v q tr ti bin y th hm swap s thc s lm thay i ni dung ca x, y ch khng phi ca p, q. T li gi hm s l swap(&x, &y) (tc truyn a ch ca x cho p, p tr ti x v tng t q tr ti y). Nh vy c th tm tt 3 c trng vit mt hm lm thay i gi tr bin ngoi nh sau: i ca hm phi l con tr (v d int *p) Cc thao tc lin quan n i ny (trong thn hm) phi thc hin ti ni n tr n (v d *p = ) Li gi hm phi chuyn a ch cho p (v d &x). Ngoi hm swap trnh by, y ta a thm v d thy s cn thit phi c hm cho php thay i bin ngoi. V d hm gii phng trnh bc 2 rt hay gp trong cc bi ton khoa hc k thut. Tc cho trc 3 s a, b, c nh 3 h s ca phng trnh, cn tm 2 nghim x1, x2 ca n. Khng th ly gi tr tr li ca hm lm nghim v gi tr tr li ch c 1 trong khi ta cn n 2 nghim. Do vy ta cn khai bo 2 bin "ngoi" trong chng trnh cha cc nghim, v hm phi lm thay i 2 bin ny (tc cha gi tr nghim gii c). Nh vy hm c vit cn phi c 5 i, trong 3 i a, b, c i din cho cc h s, khng thay i v 2 bin x1, x2 i din cho nghim, 2 i ny phi c khai bo dng con tr. Ngoi ra, phng trnh c th v nghim, 1 nghim hoc 2 nghim do vy hm s tr li gi tr l s nghim ca phng trnh, trong trng hp 1 nghim (nghim kp), gi tr nghim s c cho vo x1. V d 6 : Di y l mt dng n gin ca hm gii phng trnh bc 2.

106

Chng 4. Hm v chng trnh

int gptb2(float a, float b, float c, float *p, float *q) { float d ; d = (b*b) - 4*a*c ; if (d < 0) return 0 ; else if (d == 0) { *p = -b/(2*a) ; return 1 ; } else { *p = (-b + sqrt(d))/(2*a) ; *q = (-b - sqrt(d))/(2*a) ; return 2 ; } } // cha

Mt v d ca li gi hm trong chng trnh chnh nh sau:


main() { float a, b, c ; float x1, x2 ; cout << "Nhp h s: " ; cin >> a >> b >> c; switch (gptb2(a, b, c, &x1, &x2)) { case 0: cout << "Phng trnh v nghim" ; break; case 1: cout << "Phng trnh c nghim kp x = " << x1 ; break ; case 2: cout << "Phng trnh c 2 nghim phn bit:" << endl ; cout << "x1 = " << x1 << " v x2 = " << x2 << endl ; break; } } // cc h s // cc nghim

Trn y chng ta trnh by cch xy dng cc hm cho php thay i gi tr ca bin ngoi. Mt c trng d nhn thy l cch vit hm tng i phc tp. Do vy C++ pht trin mt cch vit khc da trn i tham chiu v vic truyn i cho hm c gi l truyn theo tham chiu.

107

Chng 4. Hm v chng trnh

c. Truyn theo tham chiu

Mt hm vit di dng i tham chiu s n gin hn rt nhiu so vi i con tr v ging vi cch vit bnh thng (truyn theo tham tr), trong ch c mt khc bit l cc i khai bo di dng tham chiu. so snh 2 cch s dng ta nhc li cc im khi vit hm theo con tr phi ch n, l: i ca hm phi l con tr (v d int *p) Cc thao tc lin quan n i ny trong thn hm phi thc hin ti ni n tr n (v d *p = ) Li gi hm phi chuyn a ch cho p (v d &x). Hy so snh vi i tham chiu, c th: i ca hm phi l tham chiu (v d int &p) Cc thao tc lin quan n i ny phi thc hin ti ni n tr n, tc a ch cn thao tc. V mt thao tc trn bin tham chiu thc cht l thao tc trn bin c n tham chiu nn trong hm ch cn vit p trong mi thao tc (thay v *p nh trong con tr) Li gi hm phi chuyn a ch cho p. V bn thn p khi tham chiu n bin no th s cha a ch ca bin , do li gi hm ch cn ghi tn bin, v d x (thay v &x nh i vi dn tr). Tm li, i vi hm vit theo tham chiu ch thay i i (l cc tham chiu) cn li mi ni khc u vit n gin nh cch vit truyn theo tham tr. V d 7 : i gi tr 2 bin
void swap(int &x, int &y) { int t = x; x = y; y = t; }

v li gi hm cng n gin nh trong truyn i theo tham tr. V d:


int a = 5, b = 3; swap(a, b); cout << a << b;

Bng di y minh ho tm tt 3 cch vit hm thng qua v d i bin trn.

108

Chng 4. Hm v chng trnh

Tham tr
Khai bo i Cu lnh Li gi Tc dng t = x; x = y; y = t; swap(a, b); a, b khng thay i

Tham chiu
t = x; x = y; y = t; swap(a, b); a, b c thay i

Dn tr
t = *x; *x = *y; *y = t; swap(&a, &b); a, b c thay i

void swap(int x, int y) void swap(int &x, int &y) void swap(int *x, int *y)

7. Hm v mng d liu a. Truyn mng 1 chiu cho hm

Thng thng chng ta hay xy dng cc hm lm vic trn mng nh vect hay ma trn cc phn t. Khi tham i thc s ca hm s l cc mng d liu ny. Trong trng hp ny ta c 2 cch khai bo i. Cch th nht i c khai bo bnh thng nh khai bo bin mng nhng khng cn c s phn t km theo, v d: int x[]; float x[]; Cch th hai khai bo i nh mt con tr kiu phn t mng, v d: int *p; float *p Trong li gi hm tn mng a s c vit vo danh sch tham i thc s, v a l a ch ca phn t u tin ca mng a, nn khi hm c gi a ch ny s gn cho con tr p. V vy gi tr ca phn t th i ca a c th c truy cp bi x[i] (theo khai bo 1) hoc *(p+i) (theo khai bo 2) v n cng c th c thay i thc s (do y cng l cch truyn theo dn tr). Sau y l v d n gin, nhp v in vect, minh ho cho c 2 kiu khai bo i. V d 8 : Hm nhp v in gi tr 1 vect
void nhap(int x[], int n) { int i; for (i=0; i<n; i++) cin >> x[i]; } void in(int *p, int n) { // hoc cin >> *(x+i) // n: s phn t

109

Chng 4. Hm v chng trnh

int i; for (i=0; i<n; i++) cout << *(p+i); } main() { int a[10] ; nhap(a,7); in(a,3); } b. Truyn mng 2 chiu cho hm // mng a cha ti a 10 phn t // vo 7 phn t u tin cho a // ra 3 phn t u tin ca a

i vi mng 2 chiu khai bo i cng nh li gi l phc tp hn nhiu so vi mng 1 chiu. Ta c hai cch khai bo i nh sau: Khai bo theo ng bn cht ca mng 2 chiu float x[m][n] do C++ qui nh, tc x l mng 1 chiu m phn t, mi phn t ca n c kiu float[n]. T , i c khai bo nh mt mng hnh thc 1 chiu (khng cn s phn t - y l s dng) ca kiu float[n]. Tc c th khai bo nh sau:
float x[][n] ; float (*x)[n] ; // mng vi s phn t khng nh trc, mi phn t l n s // mt con tr, c kiu l mng n s (float[n])

truy nhp n n phn t th i, j ta vn s dng c php x[i][j]. Tn ca mng a c vit bnh thng trong li gi hm. Ni chung theo cch khai bo ny vic truy nhp l n gin nhng phng php cng c hn ch l s ct ca mng truyn cho hm phi c nh bng n. Xem mng float x[m][n] thc s l mng mt chiu float x[m*n] v s dng cch khai bo nh trong mng mt chiu, l s dng con tr float *p truy cp c n tng phn t ca mng. Cch ny c hn ch trong li gi: a ch truyn cho hm khng phi l mng a m cn phi p kiu v (float*) ( ph hp vi p). Vi cch ny gi k l th t ca phn t a[i][j] trong mng mt chiu (m*n), ta c quan h gia k, i, j nh sau: k = *(p + i*n + j) i = k/n j = k%n trong n l s ct ca mng truyn cho hm. iu ny c ngha truy cp n a[i][j] ta c th vit *(p+i*n+j), ngc li bit ch s k c th tnh c dng i, ct j

110

Chng 4. Hm v chng trnh

ca phn t ny. u im ca cch khai bo ny l ta c th truyn mng vi kch thc bt k (s ct khng cn nh trc) cho hm. Sau y l cc v d minh ho cho 2 cch khai bo trn. V d 9 : Tnh tng cc s hng trong ma trn
float tong(float x[][10], int m, int n) { float t = 0; int i, j ; for (i=0; i<m; i++) for (j=0; j<n; j++) t += x[i][j] ; return t; } main() { float a[8][10], b[5][7] ; int i, j, ma, na, mb, nb; cout << "nhp s dng, s ct ma trn a: " ; cin >> ma >> na; for (i=0; i<ma; i++) for (j=0; j<na; j++) { cout << "a[" << i << "," << j << "] = " ; cin >> a[i][j] ; } cout << "nhp s dng, s ct ma trn b: " ; cin >> mb >> nb; for (i=0; i<mb; i++) for (j=0; j<nb; j++) { cout << "b[" << i << "," << j << "] = " ; cin >> b[i][j] ; } cout << tong(a, ma, na); cout << tong(b, mb, nb); } // in tng cc s trong ma trn // sai v s ct ca b khc 10 // nhp ma trn b // nhp ma trn a // hoc float tong(float (*x)[10], int m, int n) // m: s dng, n: s ct

V d 10 : Tm phn t b nht ca ma trn


void minmt(float *x, int m, int n) { // m: s dng, n: s ct

111

Chng 4. Hm v chng trnh

float min = *x; int k, kmin; for (k=1; k<m*n; k++)

// gn phn t u tin cho min

if (min > *(x+k)) { min = *(x+k) ; kmin = k; } cout << "Gi tr min la: " << min << " ti dng " << k/n << " ct " << k%n; } main() { float a[8][10], b[5][7] ; int i, j ; for (i=0; i<8; i++) for (j=0; j<10; j++) { cout << "a[" << i << "," << j << "] = " ; cin >> a[i][j] ; } for (i=0; i<5; i++) for (j=0; j<7; j++) { cout << "b[" << i << "," << j << "] = " ; cin >> b[i][j] ; } minmt((float*)a, 8, 10) ; minmt((float*)b, 5, 7) ; } // in gi tr v v tr s b nht trong a // in gi tr v v tr s b nht trong b // nhp ma trn b // nhp ma trn a

V d 11 : Cng 2 ma trn v in kt qu.


void inmt(float *x, int m, int n) { int i, j; for (i=0; i<m; i++) { for (j=0; j<n; j++) cout << *(x+i*n+j); cout << endl; } } void cong(float *x, float *y, int m, int n)

112

Chng 4. Hm v chng trnh

{ float *t = new float[m*n]; int k, i, j ; for (k = 0; k < m*n; k++) *(t+k) = *(x+k) + *(y+k) ; inmt((float*)t, m, n); } main() { float a[8][10], b[5][7] ; int i, j, m, n; cout << "nhp s dng, s ct ma trn: " ; cin >> m >> n; for (i=0; i<m; i++) for (j=0; j<n; j++) { cout << "a[" << i << "," << j << "] = " ; cin >> a[i][j] ; cout << "b[" << i << "," << j << "] = " ; cin >> b[i][j] ; } cong((float*)a, (float*)b, m, n); } // cng v in kt qu a+b // nhp ma trn a, b // t l ma trn kt qu (xem nh dy s)

Xu hng chung l chng ta xem mng (1 hoc 2 chiu) nh l mt dy lin tip cc s trong b nh, tc mt ma trn l mt i con tr tr n thnh phn ca mng. i vi mng 2 chiu m*n khi truyn i a ch ca ma trn cn phi p kiu v kiu con tr. Ngoi ra bc chy k ca con tr (t 0 n m*n-1) tng ng vi cc to ca phn t a[i][j] trong mng nh sau: k = *(p + i*n + j) i = k/n j = k%n t , chng ta c th vit cc hm m khng cn phi bn khon g v kch thc ca ma trn s truyn cho hm.
c. Gi tr tr li ca hm l mt mng

Khng c cch no gi tr tr li ca mt hm l mng. Tuy nhin thc s mi

113

Chng 4. Hm v chng trnh

mng cng chnh l mt con tr, v vy vic hm tr li mt con tr tr n dy d liu kt qu l tng ng vi vic tr li mng. Ngoi ra cn mt cch d dng hn i vi mng 2 chiu l mng kt qu c tr li vo trong tham i ca hm (ging nh nghim ca phng trnh bc 2 c tr li vo trong cc tham i). y chng ta s ln lt xt 2 cch lm vic ny. 1. Gi tr tr li l con tr tr n mng kt qu. Trc ht chng ta xt v d nh sau y:
int* tragiatri1() { int kq[3] = { 1, 2, 3 }; return kq ; } int* tragiatri2() { int *kq = new int[4]; return kq ; } main() { int *a, i; a = tragiatri1(); for (i=0; i<3; i++) cout *(a+i); a = tragiatri2(); for (i=0; i<3; i++) cout *(a+i); } // 1, 2, 3 // khng phi l 1, 2, 3 // cp pht 3 nh nguyn // to mng kt qu vi 3 gi tr 1, 2, 3 // tr li a ch cho con tr kt qu hm *kq = *(kq+1) = *(kq+2) = 0 ; // gi tr tr li l con tr tr n dy s nguyn // to mng kt qu vi 3 gi tr 1, 2, 3 // tr li a ch cho con tr kt qu hm // gi tr tr li l con tr tr n dy s nguyn

Qua v d trn ta thy hai hm tr gi tr u to bn trong n mt mng 3 s nguyn v tr li a ch mng ny cho con tr kt qu hm. Tuy nhin, ch c tragiatri2() l cho li kt qu ng. Ti sao ? Xt mng kq c khai bo v khi to trong tragiatri1(), y l mt mng cc b (c to bn trong hm) nh sau ny chng ta s thy, cc loi bin "tm thi" ny (v c cc tham i) ch tn ti trong qu trnh hm hot ng. Khi hm kt thc cc bin ny s mt i. Do vy tuy hm tr li a

114

Chng 4. Hm v chng trnh

ch ca kq trc khi n kt thc, th nhng sau khi hm thc hin xong, ton b kq s c xo khi b nh v v vy con tr kt qu hm tr n vng nh khng cn cc gi tr nh kq c. T iu ny vic s dng hm tr li con tr l phi ht sc cn thn. Mun tr li con tr cho hm th con tr ny phi tr n dy d liu no sao cho n khng mt i sau khi hm kt thc, hay ni khc hn phi l nhng dy d liu c khi to bn ngoi hm hoc c th s dng theo phng php trong hm tragiatri2(). Trong tragiatri2() mt mng kt qu 3 s cng c to ra nhng bng cch xin cp pht vng nh. Vng nh c cp pht ny s vn cn tn ti sau khi hm kt thc (n ch b xo i khi s dng ton t delete). Do vy hot ng ca tragiatri2() l chnh xc. Tm li, v d trn cho thy nu mun tr li gi tr con tr th vng d liu m n tr n phi c cp pht mt cch tng minh (bng ton t new), ch khng chng trnh t ng cp pht v t ng thu hi. V d sau minh ho hm cng 2 vect v tr li vect kt qu (thc cht l con tr tr n vng nh t kt qu)
int* congvt(int *x, int *y, int n) { int* z = new int[n]; for (int i=0; i<n; i++) z[i] = x[i] + y[i]; return c; } main() { int i, n, a[10], b[10], c[10] ; cout << "n = " ; cin >> n; for (i=0; i<n; i++) cin >> a[i] ; for (i=0; i<n; i++) cin >> b[i] ; c = congvt(a, b, n); for (i=0; i<n; i++) cout << c[i] ; } // in kt qu // nhp s phn t // nhp vect a // nhp vect b // xin cp pht b nh // n s phn t ca vect

Ch : a[i], b[i], c[i] cn c vit di dng tng ng *(a+i), *(b+i), *(c+i). 2. Trong cch ny, mng cn tr li c khai bo nh mt tham i trong danh sch i ca hm. Tham i ny l mt con tr nn hin nhin khi truyn mng khai bo sn ( cha kt qu) t ngoi vo cho hm th mng s thc s nhn c ni dung kt qu (tc c thay i trc v sau khi gi hm

115

Chng 4. Hm v chng trnh

- xem mc truyn tham i thc s theo dn tr). y ta xt 2 v d: bi ton cng 2 vect trong v d trc v nhn 2 ma trn. V d 12 : Cng 2 vect, vect kt qu tr li trong tham i ca hm. So vi v d trc gi tr tr li l void (khng tr li gi tr) cn danh sch i c thm con tr z cha kt qu.
void congvt(int *x, int *y, int *z, int n) { for (int i=0; i<n; i++) z[i] = x[i] + y[i]; } main() { int i, n, a[10], b[10], c[10] ; cout << "n = " ; cin >> n; for (i=0; i<n; i++) cin >> a[i] ; for (i=0; i<n; i++) cin >> b[i] ; congvt(a, b, c, n); for (i=0; i<n; i++) cout << c[i] ; } // in kt qu // nhp s phn t // nhp vect a // nhp vect b // z lu kt qu

V d 13 : Nhn 2 ma trn kch thc m*n v n*p. Hai ma trn u vo v ma trn kt qu (kch thc m*p) u c khai bo di dng con tr v l i ca hm nhanmt(). Nhc li, trong li gi hm a ch ca 3 mng cn c p kiu v (int*) ph hp vi cc con tr tham i.
void nhanmt(int *x, int *y, int *z, int m, int n, int p) { int i, j, k ; for (i=0; i<m; i++) for (j=0; j<p; j++) { *(z+i*p+j) = 0; for (k=0; k<n; k++) *(z+i*p+j) += *(x+i*n+k)**(y+k*p+j) ; // tc z[i][j] += x[i][k]*y[k][j] // tc z[i][j] = 0 // z lu kt qu

116

Chng 4. Hm v chng trnh

} } main() { int a[10][10], b[10][10], c[10][10] ; int m, n, p ; cout << "m, n, p = " ; cin >> m >> n >> p ; for (i=0; i<m; i++) for (j=0; j<n; j++) cout << "a[" << i << "," << j << "] = " ; cin >> a[i][j] ; for (i=0; i<n; i++) for (j=0; j<p; j++) cout << "b[" << i << "," << j << "] = " ; cin >> b[i][j] ; nhanmt((int*)a, (int*)b, (int*)c, m, n, p); for (i=0; i<m; i++) { for (j=0; j<p; j++) cout << c[i][j] ; cout << endl; } } d. i v gi tr tr li l xu k t // gi hm // in kt qu // nhp ma trn b // khai bo 3 mng a, b, c // kch thc cc mng // nhp s phn t // nhp ma trn a

Ging cc trng hp xt vi mng 1 chiu, i ca cc hm xu k t c th khai bo di 2 dng: mng k t hoc con tr k t. Gi tr tr li lun lun l con tr k t. Ngoi ra hm cng c th tr li gi tr vo trong cc i con tr trong danh sch i. V d sau y dng tch h, tn ca mt xu h v tn. V d gm 3 hm. Hm h tr li xu h (con tr k t) vi i l xu h v tn c khai bo dng mng. Hm tn tr li xu tn (con tr k t) vi i l xu h v tn c khai bo dng con tr k t. Thc cht i h v tn trong hai hm h, tn c th c khai bo theo cng cch thc, y chng trnh mun minh ho cc cch khai bo i khc nhau ( cp n trong phn i mng 1 chiu). Hm th ba cng tr li h, tn nhng cho vo trong danh sch tham i, do vy hm khng tr li gi tr (void). n gin ta qui c xu

117

Chng 4. Hm v chng trnh

h v tn khng cha cc du cch u v cui xu, trong h l dy k t t u cho n khi gp du cch u tin v tn l dy k t t sau du cch cui cng n k t cui xu.
char* ho(char hoten[]) { char* kq = new char[10]; int i=0; while (hoten[i] != '\40') i++; strncpy(kq, hoten, i) ; return kq; } char* ten(char* hoten) { char* kq = new char[10]; int i=strlen(hoten); while (hoten[i] != '\40') i--; return kq; } void tachht(char* hoten, char* ho, char* ten) { int i=0; while (hoten[i] != '\40') i++; strncpy(ho, hoten, i) ; i=strlen(hoten); while (hoten[i] != '\40') i--; } main() { // i dng ti du cch cui cng strncpy(ten, hoten+i+1, strlen(hoten)-i-1) ; // copy tn vo ten // i dng ti du cch u tin // copy i k t ca hoten vo ho // i dng ti du cch cui cng strncpy(kq, hoten+i+1, strlen(hoten)-i-1) ; // copy tn vo kq // cp b nh cha tn // hm tr li tn // i dng ti du cch u tin // copy i k t ca hoten vo kq // cp b nh cha h // hm tr li h

118

Chng 4. Hm v chng trnh

char ht[30], *h, *t ; h = ho(ht); t = ten(ht);

// cc bin h tn, h, tn

cout << "H v tn = " ; cin.getline(ht,30) ; // nhp h tn cout << "H = " << h << ", tn = " << t << endl; tachht(ht, h, t); cout << "H = " << h << ", tn = " << t << endl; } e. i l hng con tr

Theo phn truyn i cho hm ta bit thay i bin ngoi i tng ng phi c khai bo di dng con tr. Tuy nhin, trong nhiu trng hp cc bin ngoi khng c nhu cu thay i nhng i tng ng vi n vn phi khai bo di dng con tr (v d i l mng hoc xu k t). iu ny c kh nng do nhm ln, cc bin ngoi ny s b thay i ngoi mun. Trong trng hp nh vy cn thn, cc i con tr nu khng mun thay i (ch ly gi tr) cn c khai bo nh l mt hng con tr bng cch thm trc khai bo kiu ca chng t kho const. T kho ny khng nh bin tuy l con tr nhng n l mt hng khng thay i c gi tr. Nu trong thn hm ta c tnh thay i chng th chng trnh s bo li. V d i hoten trong c 3 hm trn c th c khai bo dng const char* hoten. V d 14 : i l hng con tr. In hoa mt xu k t
void inhoa(const char* s) { char *t; strcpy(t, s); cout << s << strupr(t); } main() { char *s = "abcde" ; inhoa(s); } 8. Con tr hm // abcdeABCDE // khng dng c strupr(s)

Mt hm (tp hp cc lnh) cng ging nh d liu: c tn gi , c a ch lu

119

Chng 4. Hm v chng trnh

trong b nh v c th truy nhp n hm thng qua tn gi hoc a ch ca n. truy nhp (gi hm) thng qua a ch chng ta phi khai bo mt con tr cha a ch ny v sau gi hm bng cch gi tn con tr.
a. Khai bo

<kiu gi tr> (*tn bin hm)(d/s tham i); <kiu gi tr> (*tn bin hm)(d/s tham i) = <tn hm>; Ta thy cch khai bo con tr hm cng tng t khai bo con tr bin (ch cn t du * trc tn), ngoi ra cn phi bao *tn hm gia cp du ngoc (). V d:
float (*f)(int); void (*f)(float, int); // khai bo con tr hm c tn l f tr n hm // c mt tham i kiu int v cho gi tr kiu float. // con tr tr n hm vi cp i (float, int).

hoc phc tp hn:


char* (*m[10])(int, char) // khai bo mt mng 10 con tr hm tr n

// cc hm c cp tham i (int, char), gi tr tr // li ca cc hm ny l xu k t. Ch : phn bit gia 2 khai bo: float (*f)(int) v float *f(int). Cch khai bo trc l khai bo con tr hm c tn l f. Cch khai bo sau c th vit li thnh float* f(int) l khai bo hm f vi gi tr tr li l mt con tr float.
b. Khi to

Mt con tr hm cng ging nh cc con tr, c php khi to trong khi khai bo hoc gn vi mt a ch hm c th sau khi khai bo. Cng ging nh kiu d liu mng, tn hm chnh l mt hng a ch tr n bn thn n. Do vy c php ca khi to cng nh php gn l nh sau: bin con tr hm = tn hm; trong f v tn hm c tr phi ging nhau v kiu tr li v danh sch i. Ni cch khc vi mc ch s dng con tr f tr n hm (lp hm) no th f phi c khai bo vi kiu tr li v danh sch i ging nh hm . V d:
float luythua(float, int); float (*f)(float, int); f = luythua; c. S dng con tr hm // khai bo hm lu tha // khai bo con tr f tng thch vi hm luythua // cho f tr n hm lu tha

120

Chng 4. Hm v chng trnh

s dng con tr hm ta phi gn n vi tn hm c th v sau bt k ni no c php xut hin tn hm th ta u c th thay n bng tn con tr. V d nh cc thao tc gi hm, a hm vo lm tham i hnh thc cho mt hm khc Sau y l cc v d minh ho. V d 15 : Dng tn con tr gi hm
float bphuong(float x) { return x*x; } void main() { float (*f)(float); f = bphuong; cout << "Bnh phng ca 3.5 l " << f(3.5) ; } // hm tr li x2

V d 16 : Dng hm lm tham i. Tham i ca hm ngoi cc kiu d liu bit cn c th l mt hm. iu ny c tc dng rt ln trong cc bi ton tnh ton trn nhng i tng l hm ton hc nh tm nghim, tnh tch phn ca hm trn mt on ... Hm ng vai tr tham i s c khai bo di dng con tr hm. V d sau y trnh by hm tm nghim xp x ca mt hm lin tc v i du trn on [a, b]. hm tm nghim ny s dng c trn nhiu hm ton hc khc nhau, trong hm s cha mt bin con tr hm v hai cn a, b, c th bng khai bo float timnghiem(float (*f)(float), float a, float b). Trong li gi hm f s c thay th bng tn hm c th cn tm nghim.
#define EPS 1.0e-6 float timnghiem(float (*f)(float), float a, float b); float emu(float); float loga(float); void main() { clrscr(); cout << "Nghim ca e m x - 2 trn on [0,1] = "; cout << timnghiem(emu,0,1));

121

Chng 4. Hm v chng trnh

cout << "Nghim ca loga(x) - 1 trn on [2,3] = "; cout << timnghiem(loga,2,3)); getch(); } float timnghiem(float (*f)(float), float a, float b) { float c = (a+b)/2; while (fabs(a-b)>EPS && f(c)!=0) { if (f(a)*f(c)>0) a = c ; else b = c; c = (a+b)/2; } return c; } float emux(float x) float logx(float x) { return (exp(x)-2); } { return (log(x)-1); }

d. Mng con tr hm

Tng t nh bin bnh thng cc con tr hm ging nhau c th c gp li vo trong mt mng, trong khai bo ta ch cn thm [n] vo sau tn mng vi n l s lng ti a cc con tr. V d sau minh ho cch s dng ny. Trong v d chng ta xy dng 4 hm cng, tr, nhn, chia 2 s thc. Cc hm ny ging nhau v kiu, s lng i, Chng ta c th s dng 4 con tr hm ring bit tr n cc hm ny hoc cng c th dng mng 4 con tr tr n cc hm ny. Chng trnh s in ra kt qu cng, tr, nhn, chia ca 2 s nhp vo t bn phm. V d 17 :
void cong(int a, int b) { cout << a << " + " << b << " = " << a+b ; } void tru(int a, int b) { cout << a << " - " << b << " = " << a-b ; } void nhan(int a, int b) { cout << a << " x " << b << " = " << a*b ; } void chia(int a, int b) { cout << a << ": " << b << " = " << a/b ; } main() {

122

Chng 4. Hm v chng trnh

clrscr(); void (*f[4])(int, int) = {cong, tru, nhan, chia}; // khai bo, khi to 4 con tr int m, n; cout "Nhp m, n " ; cin >> m >> n ; for (int i=0; i<4; i++) f[i](m,n); getch(); }

III. QUI
1. Khi nim qui

Mt hm gi n hm khc l bnh thng, nhng nu hm li gi n chnh n th ta gi hm l qui. Khi thc hin mt hm qui, hm s phi chy rt nhiu ln, trong mi ln chy chng trnh s to nn mt tp bin cc b mi trn ngn xp (cc i, cc bin ring khai bo trong hm) c lp vi ln chy trc , t d gy trn ngn xp. V vy i vi nhng bi ton c th gii c bng phng php lp th khng nn dng qui. minh ho ta hy xt hm tnh n giai tha. tnh n! ta c th dng phng php lp nh sau:
main() { int n; doule kq = 1; cout << "n = " ; cin >> n; for (int i=1; i<=n; i++) kq *= i; cout << n << "! = " << kq; }

Mt khc, n! giai tha cng c tnh thng qua (n-1)! bi cng thc truy hi
n! = 1 n! = (n-1)!n double gt(int n) { nu n = 0 nu n > 0

do ta c th xy dng hm qui tnh n! nh sau:

123

Chng 4. Hm v chng trnh

if (n==0) return 1; else return gt(n-1)*n; } main() { int n; cout << "n = " ; cin >> n; cout << gt(n); }

Trong hm main() gi s ta nhp 3 cho n, khi thc hin cu lnh cout << gt(3) in 3! u tin chng trnh s gi chy hm gt(3). Do 3 0 nn hm gt(3) s tr li gi tr gt(2)*3, tc li gi hm gt vi tham i thc s bc ny l n = 2. Tng t gt(2) = gt(1)*2 v gt(1) = gt(0)*1. Khi thc hin gt(0) ta c i n = 0 nn hm tr li gi tr 1, t gt(1) = 1*1 = 1 v suy ngc tr li ta c gt(2) = gt(1)*2 = 1*2 = 2, gt(3) = gt(2)*3 = 2*3 = 6, chng trnh in ra kt qu 6. T v d trn ta thy hm qui c c im: Chng trnh vit rt gn, Vic thc hin gi i gi li hm rt nhiu ln ph thuc vo ln ca u vo. Chng hn trong v d trn hm c gi n ln, mi ln nh vy chng trnh s mt thi gian lu gi cc thng tin ca hm gi trc khi chuyn iu khin n thc hin hm c gi. Mt khc cc thng tin ny c lu tr nhiu ln trong ngn xp s dn n trn ngn xp nu n ln. Tuy nhin, qui l cch vit rt gn, d vit v c chng trnh, mt khc c nhiu bi ton hu nh tm mt thut ton lp cho n l rt kh trong khi vit theo thut ton qui th li rt d dng.
2. Lp cc bi ton gii c bng qui

Phng php qui thng c dng gii cc bi ton c c im: Gii quyt c d dng trong cc trng hp ring gi l trng hp suy bin hay c s, trong trng hp ny hm c tnh bnh thng m khng cn gi li chnh n, i vi trng hp tng qut, bi ton c th gii c bng bi ton cng dng nhng vi tham i khc c kch thc nh hn tham i ban u. V sau mt s bc hu hn bin i cng dng, bi ton a c v trng hp 124

Chng 4. Hm v chng trnh

suy bin. Nh vy trong trng hp tnh n! nu n = 0 hm cho ngay gi tr 1 m khng cn phi gi li chnh n, y chnh l trng hp suy bin. Trng hp n > 0 hm s gi li chnh n nhng vi n gim 1 n v. Vic gi ny c lp li cho n khi n = 0. Mt lp rt rng ca bi ton dng ny l cc bi ton c th nh ngha c di dng qui nh cc bi ton lp vi s bc hu hn bit trc, cc bi ton UCLN, thp H Ni, ...
3. Cu trc chung ca hm qui

Dng thc chung ca mt chng trnh qui thng nh sau:


if (trng hp suy bin) { trnh by cch gii } else { gi li hm vi tham i "b" hn } 4. Cc v d // trng hp tng qut // gi nh c cch gii

V d 1 : Tm UCLN ca 2 s a, b. Bi ton c th c nh ngha di dng qui nh sau: nu a = b th UCLN = a nu a > b th UCLN(a, b) = UCLN(a-b, b) nu a < b th UCLN(a, b) = UCLN(a, b-a) T ta c chng trnh qui tnh UCLN ca a v b nh sau.
int UCLN(int a, int b) { if (a < b) UCLN(a, b-a); if (a == b) return a; if (a > b) UCLN(a-b, b); } // qui uoc a, b > 0

125

Chng 4. Hm v chng trnh

V d 2 : Tnh s hng th n ca dy Fibonaci l dy f(n) c nh ngha: f(0) = f(1) = 1 f(n) = f(n-1) + f(n-2) vi n 2.
long Fib(int n) { long kq; if (n==0 || n==1) kq = 1; else kq = Fib(n-1) + Fib(n-2); return kq; }

V d 3 : Chuyn thp l bi ton c ni ting, ni dung nh sau: Cho mt thp n tng, ang xp ti v tr 1. Yu cu bi ton l hy chuyn ton b thp sang v tr 2 (cho php s dng v tr trung gian 3) theo cc iu kin sau y mi ln ch c chuyn mt tng trn cng ca thp, ti bt k thi im ti c 3 v tr cc tng thp ln hn phi nm di cc tng thp nh hn. Bi ton chuyn thp c minh ho bi hnh v di y. trc khi chuyn sau khi chuyn

Bi ton c th c t ra tng qut hn nh sau: chuyn thp t v tr di n v tr den, trong di, den l cc tham s c th ly gi tr l 1, 2, 3 th hin cho 3 v tr. i vi 2 v tr di v den, d thy v tr trung gian (v tr cn li) s l v tr 6-di-den (v di+den+tg = 1+2+3 = 6). T chuyn thp t v tr di n v tr den, ta c th xy dng mt cch chuyn qui nh sau: chuyn 1 tng t di sang tg, chuyn n-1 tng cn li t di sang den, chuyn tr tng ti v tr tg v li v tr den

126

Chng 4. Hm v chng trnh

hin nhin nu s tng l 1 th ta ch phi thc hin mt php chuyn t di sang den. Mi ln chuyn 1 tng t v tr i n j ta k hiu i j. Chng trnh s nhp vo input l s tng v in ra cc bc chuyn theo k hiu trn. T ta c th xy dng hm qui sau y ;
void chuyen(int n, int di, int den) { if (n==1) cout << di << " " << den << endl; else { cout << di << "" << 6-di-den << endl; // 1 tng t di qua trung gian chuyen(n-1, di, den) ; cout << 6-di-den << "" den << endl; } } main() { int sotang ; cout << "S tng = " ; cin >> sotang; chuyen(sotang, 1, 2); } // n-1 tng t di qua den // 1 tng t tg v li den // n: s tng, di, den: v tr i, n

V d nu s tng bng 3 th chng trnh in ra kt qu l dy cc php chuyn sau y: 1 2 , 1 3 , 2 3 , 1 2 , 3 1 , 3 2 , 1 2. c th tnh c s ln chuyn l 2n - 1 vi n l s tng. IV. T CHC CHNG TRNH
1. Cc loi bin v phm vi a. Bin cc b

L cc bin c khai bo trong thn ca hm v ch c tc dng trong hm ny, k c cc bin khai bo trong hm main() cng ch c tc dng ring trong hm main(). T , tn bin trong cc hm l c php trng nhau. Cc bin ca hm no s ch

127

Chng 4. Hm v chng trnh

tn ti trong thi gian hm hot ng. Khi bt u hot ng cc bin ny c t ng sinh ra v n khi hm kt thc cc bin ny s mt i. Tm li, mt hm c xem nh mt n v c lp, khp kn. Tham i ca cc hm cng c xem nh bin cc b. V d 1 : Di y ta nhc li mt chng trnh nh gm 3 hm: lu tha, xo mn hnh v main(). Mc ch minh ho bin cc b.
float luythua(float x, int n) { int i ; float kq = 1; for (i=1; i<=n; i++) kq *= x; return kq; } void xmh(int n) { int i; for (i=1; i<=n; i++) clrscr(); } main() { float x; int n; cout << "Nhp x v n: "; cin >> x >> n; xmh(5); cout << luythua(x, n); } // xo mn hnh 5 ln // in xn // xo mn hnh n ln // hm tr gi tr xn

Qua v d trn ta thy cc bin i, i n c khai bo trong hai hm: luythua() v xmh(). kq c khai bo trong luythua v main(), ngoi ra cc bin x v n trng vi i ca hm luythua(). Tuy nhin, tt c khai bo trn u hp l v u c xem nh khc nhau. C th gii thch nh sau: Tt c cc bin trn u cc b trong hm n c khai bo.

128

Chng 4. Hm v chng trnh

x v n trong main() c thi gian hot ng di nht: trong sut qu trnh chy chng trnh. Chng ch mt i khi chng trnh chm dt. i x v n trong luythua() ch tm thi c to ra khi hm luythua() c gi n v c lp vi x, n trong main(), ni cch khc ti thi im trong b nh c hai bin x v hai bin n. Khi hm luythua chay xong bin x v n ca n t ng bin mt. Tng t 2 i n, 2 bin i trong luythua() v xo mn hnh cng c lp vi nhau, chng ch c to v tn ti trong thi gian hm ca chng c gi v hot ng.
b. Bin ngoi

L cc bin c khai bo bn ngoi ca tt c cc hm. V tr khai bo ca chng c th t u vn bn chng trnh hoc ti mt mt v tr bt k no gia vn bn chng trnh. Thi gian tn ti ca chng l t lc chng trnh bt u chy n khi kt thc chng trnh ging nh cc bin trong hm main(). Tuy nhin v phm vi tc dng ca chng l bt u t im khai bo chng n ht chng trnh, tc tt c cc hm khai bo sau ny u c th s dng v thay i gi tr ca chng. Nh vy cc bin ngoi c khai bo t u chng trnh s c tc dng ln ton b chng trnh. Tt c cc hm u s dng c cc bin ny nu trong hm khng c bin khai bo trng tn. Mt hm nu c bin trng tn vi bin ngoi th bin ngoi b che i vi hm ny. C ngha nu i c khai bo nh mt bin ngoi v ngoi ra trong mt hm no cng c bin i th nh vy c 2 bin i c lp vi nhau v khi hm truy nhp n i th c ngha l i ca hm ch khng phi i ca bin ngoi. Di y l v d minh ho cho cc gii thch trn. V d 2 : Chng ta xt li cc hm luythua() v xmh(). Ch rng trong c hai hm ny u c bin i, v vy chng ta c th khai bo i nh mt bin ngoi ( dng chung cho luythua() v xmh()), ngoi ra x, n cng c th c khai bo nh bin ngoi. C th:
#include <iostream.h> #include <iomanip.h> float x; int n; int i ; float luythua(float x, int n) { float kq = 1; for (i=1; i<=n; i++) kq *= x; }

129

Chng 4. Hm v chng trnh

void xmh() { for (i=1; i<=n; i++) clrscr(); } main() { cout << "Nhp x v n: "; cin >> x >> n; xmh(5); cout << luythua(x, n); } // xo mn hnh 5 ln // in xn

Trong v d ny ta thy cc bin x, n, i u l cc bin ngoi. Khi ta mun s dng bin ngoi v d i, th bin i s khng c khai bo trong hm s dng n. Chng hn, luythua() v xmh() u s dng i cho vng lp for ca mnh v n khng c khai bo li trong 2 hm ny. Cc i x v n trong luythua() l c lp vi bin ngoi x v n. Trong luythua() khi s dng n x v n (v d cu lnh kq *= x) th y l x ca hm ch khng phi bin ngoi, trong khi trong main() khng c khai bo v x v n nn v d cu lnh cout << luythua(x, n); l s dng x, n ca bin ngoi. Ni chung trong 2 v d trn chng trnh u chy tt v nh nhau. Tuy nhin, vic khai bo khc nhau nh vy c nh hng hoc gy nhm ln g cho ngi lp trnh ? Liu chng ta c nn t t ra mt nguyn tc no trong khai bo bin ngoi v bin cc b trnh nhng nhm ln c th xy ra. Chng ta hy xt tip cng v d trn nhng thay i mt s khai bo v tnh 23 (c th b bt bin n) nh sau:
#include <iostream.h> #include <iomanip.h> float x; int i ; float luythua(float x, int n) { float kq = 1; for (i=1; i<=n; i++) kq *= x; } void xmh() { // khng dng n

130

Chng 4. Hm v chng trnh

for (i=1; i<=n; i++) clrscr(); } main() { x = 2; i = 3; xmh(5); cout << luythua(x, i); } // xo mn hnh 5 ln // in xi, kt qu x = 23 = 8 ?

Nhn vo hm main() ta thy gi tr 23 c tnh bng cch t x = 2, i = 3 v gi hm luythua(x,i). Kt qu ta mong mun s l gi tr 8 hin ra mn hnh, tuy nhin khng ng nh vy. Trc khi in kt qu ny ra mn hnh hm xmh() c gi n xo mn hnh. Hm ny s dng mt bin ngoi i lm bin m cho mnh trong vng lp for v sau khi ra khi for (cng l kt thc xmh()) i nhn gi tr 6. Bin i ngoi ny li c s dng trong li gi luythua(x,i) ca hm main(), tc ti thi im ny x = 2 v i = 6, kt qu in ra mn hnh s l 26 = 64 thay v 8 nh mong mun. Tm li "im yu" dn n sai st ca chng trnh trn l ch lp trnh vin "tranh th" s dng bin i cho 2 hm xmh() v main() (bng cch khai bo n nh bin ngoi) nhng li vi mc ch khc nhau. Do vy sau khi chy xong hm xmh() i b thay i khc vi gi tr i c khi to lc ban u. khc phc li trong chng trnh trn ta cn khai bo li bin i: hoc trong main() khai bo thm i (n s che bin i ngoi), hoc trong c hai xmh() v main() u c bin i (cc b trong tng hm). T , ta nn ra mt vi nguyn tc lp trnh sao cho n c th trnh c nhng li khng ng c nh vy: nu mt bin ch s dng v mc ch ring ca mt hm th nn khai bo bin nh bin cc b trong hm. V d cc bin m ca vng lp, thng thng chng ch c s dng thm ch ch ring trong vng lp ch cng cha phi cho ton b c hm, v vy khng nn khai bo chng nh bin ngoi. Nhng bin cc b ny sau khi hm kt thc chng cng s kt thc, khng gy nh hng n bt k hm no khc. Mt c im c li na cho khai bo cc b l chng to cho hm tnh cch hon chnh, c lp vi mi hm khc, chng trnh khc. V d hm xmh() c th mang qua chy chng trnh khc m khng phi sa cha g nu i c khai bo bn trong hm. Trong khi v d ny hm xmh() vn hot ng c nhng trong chng trnh khc nu khng c i nh mt bin ngoi ( xmh() s dng) th hm s gy li. 131

Chng 4. Hm v chng trnh

vi cc bin mang tnh cht s dng chung r nt (c bit vi nhng bin kch thc ln) m nhiu hm cng s dng chng vi mc ch ging nhau th nn khai bo chng nh bin ngoi. iu ny tit kim c thi gian cho ngi lp trnh v khng phi khai bo chng nhiu ln trong nhiu hm, tit kim b nh v khng phi to chng tm thi mi khi chy cc hm, tit kim c thi gian chy chng trnh v khng phi t chc b nh lu tr v gii phng chng. V d trong chng trnh qun l sinh vin (chng 6), bin sinh vin c dng chung v thng nht trong hu ht cc hm (xem, xo, sa, b sung, thng k ) nn c th khai bo chng nh bin ngoi, iu ny cng tng tnh thng nht ca chng trnh (mi bin sinh vin l nh nhau cho mi hm con ca chng trnh). Tm li, nguyn tc tng qut nht l c gng to hm mt cch c lp, khp kn, khng chu nh hng ca cc hm khc v khng gy nh hng n hot ng ca cc hm khc n mc c th.
2. Bin vi mc ch c bit a. Bin hng v t kho const

s dng hng c th khai bo thm t kho const trc khai bo bin. Phm vi v min tc dng cng nh bin, c ngha bin hng cng c th dng cc b hoc ton th. Bin hng lun lun c khi to trc. C th khai bo t kho const trc cc tham i hnh thc khng cho php thay i gi tr ca cc bin ngoi (c bit i vi vi mng v xu k t, v bn thn cc bin ny c xem nh con tr do hm c th thay i c gi tr ca cc bin ngoi truyn cho hm ny). V d sau th hin hng cng c th c khai bo cc phm vi khc nhau.
const int MAX = 30; void vidu(const int *p) { const MAX = 10; } void main() { const MAX = 5; // cc b // cc b // ton th // cc b

132

Chng 4. Hm v chng trnh

Trong Turbo C, BorlandC v cc chng trnh dch khc c nhiu hng s khai bo sn trong tp values.h nh MAXINT, M_PI hoc cc hng ho trong graphics.h nh WHITE, RED,
b. Bin tnh v t kho static

c khai bo bng t kho static. L bin cc b nhng vn gi gi tr sau khi ra khi hm. Phm vi tc dng nh bin cc b, ngha l n ch c s dng trong hm khai bo n. Tuy nhin thi gian tc dng c xem nh bin ton th, tc sau khi hm thc hin xong bin vn cn tn ti v vn lu li gi tr sau khi ra khi hm. Gi tr ny ny c tip tc s dng khi hm c gi li, tc bin static ch c khi u mt ln trong ln chy hm u tin. Nu khng khi to, C++ t ng gn gi tr 0 (ngm nh = 0). V d:
int i = 1; void bp() { static int lanthu = 0; lanthu++; i = 2 * i; cout << "Hm chy ln th " << lanthu << ", i = " << i ; } main() { ham(); ham(); ham(); } c. Bin thanh ghi v t kho register // Hm chy ln th 1, i = 1 // Hm chy ln th 2, i = 2 // Hm chy ln th 3, i = 4

tng tc tnh ton C++ cho php mt s bin c t trc tip vo thanh ghi thay v b nh. Khai bo bng t kho register ng trc khai bo bin. Tuy

133

Chng 4. Hm v chng trnh

nhin khai bo ny ch c tc dng i vi cc bin c kch thc nh nh bin char, int. V d: register char c; register int dem;
d. Bin ngoi v t kho extern

Nh bit mt chng trnh c th c t trn nhiu file vn bn khc nhau. Mt bin khng th c khai bo nhiu ln vi cng phm vi hot ng. Do vy nu mt hm s dng bin c khai bo trong file vn bn khc th bin ny phi c khai bo vi t kho extern. T kho ny cho php chng trnh dch tm v lin kt bin ny t bn ngoi file ang cha bin. Chng ta hy xt v d gy li sau y v tm phng n khc phc chng.
void in(); void main() { int i = 1; in(); } void in() { cout << i ; }

Li (c php) v i l bin cc b trong main(), trong in() khng nhn bit i, nu trong hoc trc in() khai bo thm i th li ng ngha (tc chng trnh in gi tr i khc khng theo mun ca lp trnh vin). Gi thit khai bo li nh sau:
void in(); void main() { ... } int i; void in() { ... } // B khai bo i trong main() // a khai bo i ra trc in() v sau main()

cch khai bo ny cng gy li v main() khng nhn bit i. Cui cng main() c th nhn bit i th i phi c khai bo di dng bin extern. Thng thng trong trng hp ny cch khc phc hay nht l khai bo trc main() b cc extern (khng cn thit).

134

Chng 4. Hm v chng trnh

Gi thit 2 chng trnh trn nm trong 2 tp khc nhau. lin kt (link) bin i gia 2 chng trnh cn nh ngha tng th i trong mt v khai bo extern trong chng trnh kia.
/* program1.cpp*/ void in(); int i; void main() { i = 1; in(); } /* program2.cpp */ void in() { extern i; cout << i ; }

Hm in() nm trong tp vn bn program2.cpp, c dng in gi tr ca bin i khai bo trong program1.cpp, tm gi l tp gc (hai tp ny khi dch s c lin kt vi nhau). T trong tp gc, i phi c khai bo l bin ngoi, v bt k hm tp khc mun s dng bin i ny u phi c cu lnh khai bo extern int i (nu khng c t kho extern th bin i li c xem l bin cc b, khc vi bin i trong tp gc). lin kt cc tp ngun c th to mt d n (project) thng qua menu PROJECT (Alt-P). Cc phm nng cho php m d n, thm bt tp vo danh sch tp ca d n c hng dn dng cui ca ca s d n.
3. Cc ch th tin x l

Nh bit trc khi chy chng trnh (bt u t vn bn chng trnh tc chng trnh ngun) C++ s dch chng trnh ra tp m my cn gi l chng trnh ch. Thao tc dch chng trnh ni chung gm c 2 phn: x l s b chng trnh v dch. Phn x l s b c gi l tin x l, trong c cc cng vic lin quan n cc ch th c t u tp chng trnh ngun nh #include, #define
a. Ch th bao hm tp #include

135

Chng 4. Hm v chng trnh

Cho php ghp ni dung cc tp c khc vo chng trnh trc khi dch. Cc tp cn ghp thm vo chng trnh thng l cc tp cha khai bo nguyn mu ca cc hng, bin, hm c sn trong C hoc cc hm do lp trnh vin t vit. C hai dng vit ch th ny.
1: #include <tp> 2: #include ng dn\tp

Dng khai bo 1 cho php C++ ngm nh tm tp ti th mc nh sn (khai bo thng qua menu Options\Directories) thng l th mc TC\INCLUDE v tp l cc tp nguyn mu ca th vin C++. Dng khai bo 2 cho php tm tp theo ng dn, nu khng c ng dn s tm trong th mc hin ti. Tp thng l cc tp (th vin) c to bi lp trnh vin v c t trong cng th mc cha chng trnh. C php ny cho php lp trnh vin chia mt chng trnh thnh nhiu mun t trn mt s tp khc nhau d qun l. N c bit hu ch khi lp trnh vin mun to cc th vin ring cho mnh.
b. Ch th macro #define #define tn_macro xaukitu

Trc khi dch b tin x l s tm trong chng trnh v thay th bt k v tr xut hin no ca tn_macro bi xu k t. Ta thng s dng macro nh ngha cc hng hoc thay cm t ny bng cm t khc d nh hn, v d:
#define then #define begin { #define end } #define MAX 100 #define TRUE 1 if (i < MAX) then begin Ok = TRUE; cout << i ; end // thay then bng du cch // thay begin bng du { // thay end bng du } // thay MAX bng 100 // thay TRUE bng 1

t trong chng trnh ta c th vit nhng on lnh nh:

trc khi dch b tin x l s chuyn on chng trnh trn thnh


if (i < 100) {

136

Chng 4. Hm v chng trnh

Ok = 1; cout << i ; }

theo ng c php ca C++ v ri mi tin hnh dch. Ngoi vic ch th #define cho php thay tn_macro bi mt xu k t bt k, n cn cng c php vit di dng c i. V d, tm s ln nht ca 2 s, thay v ta phi vit nhiu hm max (mi hm ng vi mt kiu s khc nhau), by gi ta ch cn thay chng bi mt macro c i n gin nh sau:
#define max(A,B) ((A) > (B) ? (A): (B))

khi trong chng trnh nu c dng x = max(a, b) th n s c thay bi: x = ((a) > (b) ? (a): (b)) Ch : Tn macro phi c vit lin vi du ngoc ca danh sch i. V d khng vit max (A,B). #define bp(x) (x*x) vit sai v bp(5) ng nhng bp(a+b) s thnh (a+b*a+b) (tc a+b+ab). Cng tng t vit #define max(A,B) (A > B ? A: B) l sai (?) v vy lun lun bao cc i bi du ngoc. #define bp(x) ((x)*(x)) vit ng nhng nu gi s lp trnh vin mun tnh bnh phng ca 2 bng on lnh sau:
int i = 1; cout << bp(++i); // 6

th kt qu in ra s l 6 thay v kt qu ng l 4. L do l ch chng trnh dch s thay bp(++i) bi ((++i)*(++i)), v vi i = 1 chng trnh s thc hin nh 2*3 = 6. Do vy cn cn thn khi s dng cc php ton t tng gim trong cc macro c i. Ni chung, nn hn ch vic s dng cc macro phc tp, v n c th gy nn nhng hiu ng ph kh kim sot.
c. Cc ch th bin dch c iu kin #if, #ifdef, #ifndef

Ch th:
#if dy lnh #endif #if dy lnh #else dy lnh #endif,

Cc ch th ny ging nh cu lnh if, mc ch ca n l bo cho chng trnh dch bit on lnh gia #if (iu kin ) v #endif ch c dch nu iu kin ng. V

137

Chng 4. Hm v chng trnh

d:
const int M = 1; void main() { int i = 5; #if M==1 cout << i ; #endif }

hoc:
const int M = 10; void main() { int i = 5; #if M > 8 cout << i+i ; #else cout << i*i ; #endif }

Ch th #ifdef v #ifndef Ch th ny bo cho chng trnh dch bit on lnh c c dch hay khng khi mt tn gi c nh ngha hay cha. #ifdef c hiu l nu tn c nh ngha th dch, cn #ifndef c hiu l nu tn cha c nh ngha th dch. nh ngha mt tn gi ta dng ch th #define tn. Ch th ny c bit c ch khi chn cc tp th vin vo s dng. Mt tp th vin c th c chn nhiu ln trong vn bn do vy n c th s c dch nhiu ln, iu ny s gy ra li v cc bin c khai bo nhiu ln. trnh vic ny, ta cn s dng ch th trn nh v d minh ho sau: Gi s ta vit sn 2 tp th vin l mylib.h v mathfunc.h, trong mylib.h cha hm max(a,b) tm s ln nht gia 2 s, mathfunc.h cha hm max(a,b,c) tm s ln nht gia 3 s thng qua s dng hm max(a,b). Do vy mathfunc.h phi c ch th #include mylib.h s dng c hm max(a,b). Th vin 1. tn tp: MYLIB.H
int max(int a, int b)

138

Chng 4. Hm v chng trnh

{ return (a>b? a: b); }

Th vin 2. tn tp: MATHFUNC.H


#include "mylib.h" int max(int a, int b) { return (a>b? a: b); }

Hm main ca chng ta nhp 3 s, in ra max ca tng cp s v max ca c 3 s. Chng trnh cn phi s dng c 2 th vin.
#include "mylib.h" #include "mathfunc.h" main() { int a, b, c; cout << "a, b, c = " ; cin >> a >> b >> c; cout << max(a,b) << max(b,c) << max(a,c) << max(a,b,c) ; }

Trc khi dch chng trnh, b tin x l s chn cc th vin vo trong tp chnh (cha main()) trong mylib.h c chn vo 2 ln (mt ln ca tp chnh v mt ln ca mathfunc.h), do vy khi dch chng trnh, C++ s bo li (do hm int max(inta, int b) c khai bo hai ln). khc phc tnh trng ny trong mylib.h ta thm ch th mi nh sau:
// tp mylib.h #ifndef _MYLIB_ _MYLIB_ #define _MYLIB_ int max(int a, int b) { return (a>b? a: b); } // nu cha nh ngha tn gi // th nh ngha n // v cc hm khc

139

Chng 4. Hm v chng trnh

#endif

Nh vy khi chng trnh dch x l mylib.h ln u do _MYLIB_ cha nh ngha nn my s nh ngha t ny, v dch on chng trnh tip theo cho n #endif. Ln th hai khi gp li on lnh ny do _MYLIB_ c nh ngha nn chng trnh b qua on lnh ny khng dch. cn thn trong c mathfunc.h ta cng s dng c php ny, v c th trong mt chng trnh khc mathfunc.h li c s dng nhiu ln.

BI TP
Con tr

1. 2. 3. 4. 5. 6.

Hy khai bo bin k t ch v con tr kiu k t pc tr vo bin ch. Vit ra cc cch gn gi tr A cho bin ch. Cho mng nguyn cost. Vit ra cc cch gn gi tr 100 cho phn t th 3 ca mng. Cho p, q l cc con tr cng tr n k t c. t *p = *q + 1. C th khng nh: *q = *p - 1 ? Cho p, q l cc con tr tr n bin nguyn x = 5. t *p = *q + 1; Hi *q ? Cho p, q, r, s l cc con tr tr n bin nguyn x = 10. t *q = *p + 1; *r = *q + 1; *s = *r + 1. Hi gi tr ca bin x ? Chn cu ng nht trong cc cu sau: A: a ch ca mt bin l s th t ca byte u tin my dnh cho bin . B: a ch ca mt bin l mt s nguyn.

C: S hc a ch l cc php ton lm vic trn cc s nguyn biu din a ch ca bin D: a v b ng 7. Chn cu sai trong cc cu sau: A: Cc con tr c th phn bit nhau bi kiu ca bin m n tr n. B: Hai con tr tr n cc kiu khc nhau s c kch thc khc nhau. C: Mt con tr kiu void c th c gn bi con tr c kiu bt k (cn p kiu). D: Hai con tr cng tr n kiu cu trc c th gn cho nhau.

140

Chng 4. Hm v chng trnh

8.

Cho con tr p tr n bin x kiu float. C th khng nh ? A: p l mt bin v *p cng l mt bin B: p l mt bin v *p l mt gi tr hng C: s dng c p cn phi khai bo float *p; v gn *p = x; D: Cng c th khai bo void *p; v gn (float)p = &x;

9.

Cho khai bo float x, y, z, *px, *py; v cc lnh px = &x; py = &y; C th khng nh ? A: Nu x = *px th y = *py C: Nu *px = y + z th *px = *py + z B: Nu x = y + z th *px = y + z D: a, b, c ng

10. Cho khai bo float x, y, z, *px, *py; v cc lnh px = &x; py = &y; C th khng nh ? A: Nu *px = x th *py = y C: Nu *px = y - z th x = y - z B: Nu *px = *py - z th *px = y - z D: a, b, c ng

11. Khng dng mng, hy nhp mt dy s nguyn v in ngc dy ra mn hnh. 12. Khng dng mng, hy nhp mt dy s nguyn v ch ra v tr ca s b nht, ln nht. 13. Khng dng mng, hy nhp mt dy s nguyn v in ra dy c sp xp. 14. Khng dng mng, hy nhp mt dy k t. Thay mi k t a trong dy thnh k t b v in kt qu ra mn hnh.
Con tr v xu k t

15. Gi s p l mt con tr kiu k t tr n xu "Tin hc". Chn cu ng nht trong cc cu sau: A: cout << p s in ra dng "Tin hc" B: cout << p s in ra dng "Tin hc" C: cout << p s in ra ch ci 'T'
char st[] = "tin hc"; main() { char *p; p = new char[10]; for (int i=0; st[i] != '\0'; i++) p[i] = st[i]; }

D: b v c ng

16. Xt chng trnh (khng k cc khai bo file nguyn mu):

141

Chng 4. Hm v chng trnh

Chng trnh trn cha hon chnh v: A: S dng sai c php ton t new B: S dng sai c php p[i] (ng ra l *(p+i)) C: Xu p cha c kt thc D: C a, b, c, u sai 17. tnh di xu mt sinh vin vit on chng trnh sau:
char *st; main() { int len = 0; gets(st); while (st++ != '\0') len++; printf("%d",len); }

Hy chn cu ng nht: A: Chng trnh trn l hon chnh C: Cn thay st++ bi *st++ B: Cn thay len++ bi ++len D: Cn thay st++ != '\0' bi st++ == '\0'

18. Cho xu k t (dng con tr) s. Hy in ngc xu ra mn hnh. 19. Cho xu k t (dng con tr) s. Hy copy t s sang xu t mt on bt u ti v tr m vi di n. 20. Cho xu k t (dng con tr) s. Hy thng k tn xut xut hin ca cc k t c trong s. In ra mn hnh theo th t gim dn ca cc tn xut (tn xut l t l % s ln xut hin ca x trn tng s k t trong s).
Hm

21. Chn cu sai trong cc cu sau y: A: Hm khng tr li gi tr th khng cn khai bo kiu gi tr ca hm. B: Cc bin c khai bo trong hm l cc b, t xo khi hm thc hin xong C: Hm khng tr li gi tr s c kiu gi tr ngm nh l void. D: Hm l n v c lp, khng c khai bo hm lng nhau. 22. Chn cu ng nht trong cc cu sau y: A: Hm phi c kt thc vi 1 cu lnh return B: Phi c t nht 1 cu lnh return cho hm C: Cc cu lnh return c php nm v tr bt k trong thn hm 142

Chng 4. Hm v chng trnh

D: Khng cn khai bo kiu gi tr tr li ca hm nu hm khng c lnh return 23. Chn cu sai trong cc cu sau y: A: S tham s thc s phi bng s tham s hnh thc trong li gi hm B: Cc bin cc b trong thn hm c chng trnh dch cp pht b nh C: Cc tham s hnh thc s c cp pht b nh tm thi khi hm c gi D: Kiu ca tham s thc s phi bng kiu ca tham s hnh thc tng ng vi n trong li gi hm 24. thay i gi tr ca tham bin, cc i ca hm cn khai bo di dng: A: bin bnh thng v tham i c truyn theo gi tr B: bin con tr v tham i c truyn theo gi tr C: bin bnh thng v tham i c truyn theo a ch D: bin tham chiu v tham i c truyn theo gi tr 25. Vit hm tm UCLN ca 2 s. p dng hm ny (AD: ) tm UCLN ca 4 s nhp t bn phm. 26. Vit hm kim tra mt s nguyn n c l s nguyn t. AD: In ra cc s nguyn t b hn 1000. 27. Vit hm kim tra mt s nguyn n c l s nguyn t. AD: In cc cp s sinh i < 1000. (Cc s "sinh i" l cc s nguyn t m khong cch gia chng l 2). 28. Vit hm kim tra mt nm c l nm nhun. AD: In ra cc nm nhun t nm 1000 n 2000. 29. Vit hm xo du cch u tin trong mt xu. AD: Xo tt c du cch trong xu. 30. Vit hm thay 2 du cch bi 1 du cch. AD: Ct cc du cch gia 2 t ca mt xu v cn 1 du cch. 31. Vit hm tro i gi tr ca 2 s. AD: sp xp dy s. 32. Vit hm gii phng trnh bc 2. Dng chng trnh con ny tm nghim ca mt phng trnh chnh phng bc 4. 33. S hon chnh l s bng tng mi c ca n (V d 6 = 1 + 2 + 3). Hy in ra mi s hon chnh t 1 n 100. 34. Tnh tng ca dy phn s. In ra mn hnh kt qu di dng phn s ti gin. 35. Nhp s t nhin chn n > 2. Hy kim tra s ny c th biu din c di dng tng ca 2 s nguyn t hay khng ?. 36. In tng ca n s nguyn t u tin. 143

Chng 4. Hm v chng trnh

37. Tnh phn din tch gii hn bi hnh trn bn knh R v hnh vung ngoi tip ca n. 38. Chun ho mt xu (ct k t trng 2 u, ct bt cc du trng (ch li 1) gia cc t, vit hoa u t). 39. Vit chng trnh nhp s nguyn ln (khng qu mt t), hy c gi tr ca n bng cch in ra xu k t tng ng vi gi tr ca n. V d 1094507 l Mt triu, (khng trm) chn t nghn, nm trm linh by n v. 40. Vit chng trnh sp xp theo tn mt mng h tn no . 41. Tm tt c s t nhin c 4 ch s m trong mi s khng c 2 ch s no ging nhau. 42. Nhp s t nhin n. Hy biu din n di dng tch ca cc tha s nguyn t.
qui

43. Nhp s nguyn dng N. Vit hm qui tnh: a. S1 = b. S 2 = 1.


1 + 2 + 3 + ... + N N

12 + 2 2 + 3 2 + ... + N 2

Nhp s nguyn dng n. Vit hm qui tnh: a. S1 = 3 + 3 + 3 + ... + 3 b. S 2 =


1 2+ 2+ 1 1 2+. . . 1 2

n du cn n du chia

44. Vit hm qui tnh n!. p dng chng trnh con ny tnh t hp chp k theo cng thc truy hi: C(n, k) = n!/(k! (n-k)!) 45. Vit hm qui tnh s fibonaci th n. Dng chng trnh con ny tnh f(2) + f(4) + f(6) + f(8). 46. Vit di dng qui cc hm a. daoxau b. UCLN c. Fibonaci d. Thp H Ni 47. Vit macro tro i ni dung 2 bin. AD: Sp xp dy s.

144

Chng 5. D liu kiu cu trc v hp

CHNG 5

D LIU KIU CU TRC V HP


Kiu cu trc Cu trc t tr v danh sch lin kt Kiu hp Kiu lit k

lu tr cc gi tr gm nhiu thnh phn d liu ging nhau ta c kiu bin mng. Thc t rt nhiu d liu l tp cc kiu d liu khc nhau tp hp li, qun l d liu kiu ny C++ a ra kiu d liu cu trc. Mt v d ca d liu kiu cu trc l mt bng l lch trong mi nhn s c lu trong mt bng gm nhiu kiu d liu khc nhau nh h tn, tui, gii tnh, mc lng I. KIU CU TRC
1. Khai bo, khi to

to ra mt kiu cu trc NSD cn phi khai bo tn ca kiu (l mt tn gi do NSD t t), tn cng vi cc thnh phn d liu c trong kiu cu trc ny. Mt kiu cu trc c khai bo theo mu sau:
struct <tn kiu> { cc thnh phn ; } <danh sch bin>;

Mi thnh phn ging nh mt bin ring ca kiu, n gm kiu v tn thnh phn. Mt thnh phn cng cn c gi l trng. Phn tn ca kiu cu trc v phn danh sch bin c th c hoc khng. Tuy nhin trong khai bo k t kt thc cui cng phi l du chm phy (;). Cc kiu cu trc c php khai bo lng nhau, ngha l mt thnh phn ca kiu cu trc c th li l mt trng c kiu cu trc. Mt bin c kiu cu trc s c phn b b nh sao cho cc thc hin ca n c sp lin tc theo th t xut hin trong khai bo.

145

Chng 5. D liu kiu cu trc v hp

Khai bo bin kiu cu trc cng ging nh khai bo cc bin kiu c s di dng:
struct <tn cu trc> <danh sch bin> ; // kiu c trong C // trong C++

hoc
<tn cu trc> <danh sch bin> ;

Cc bin c khai bo cng c th i km khi to:


<tn cu trc> bin = { gi tr khi to } ;

V d: Khai bo kiu cu trc cha phn s gm 2 thnh phn nguyn cha t s v mu s.


struct Phanso { int tu ; int mau ; };

hoc:
struct Phanso { int tu, mau ; }

Kiu ngy thng gm 3 thnh phn nguyn cha ngy, thng, nm.
struct Ngaythang { int ng ; int th ; int nam ; } holiday = { 1,5,2000 } ;

mt bin holiday cng c khai bo km cng kiu ny v c khi to bi b s 1. 5. 2000. Cc gi tr khi to ny ln lt gn cho cc thnh phn theo ng th t trong khai bo, tc ng = 1, th = 5 v nam = 2000. Kiu Lop dng cha thng tin v mt lp hc gm tn lp v s s sinh vin. Cc bin kiu Lop c khai bo l daihoc v caodang, trong daihoc c khi to bi b gi tr {"K41T", 60} vi ngha tn lp i hc l K41T v s s l 60 sinh vin.
struct Lop { char tenlop[10],

146

Chng 5. D liu kiu cu trc v hp

int soluong; }; struct Lop daihoc = {"K41T", 60}, caodang ;

hoc:
Lop daihoc = {"K41T", 60}, caodang ;

Kiu Sinhvien gm c cc trng hoten lu tr h v tn sinh vin, ns lu tr ngy sinh, gt lu tr gii tnh di dng s (qui c 1: nam, 2: n) v cui cng trng diem lu tr im thi ca sinh vin. Cc trng trn u c kiu khc nhau.
struct Sinhvien { char hoten[25] ; Ngaythang ns; int gt; float diem ; } x, *p, K41T[60]; Sinhvien y = {"NVA", {1,1,1980}, 1} ;

Khai bo cng vi cu trc Sinhvien c cc bin x, con tr p v mng K41T vi 60 phn t kiu Sinhvien. Mt bin y c khai bo thm v km theo khi to gi tr {"NVA", {1,1,1980}, 1}, tc h tn ca sinh vin y l "NVA", ngy sinh l 1/1/1980, gii tnh nam v im thi trng. y l kiu khi to thiu gi tr, ging nh khi to mng, cc gi tr trng phi nm cui b gi tr khi to (tc cc thnh phn b khi to khng c nm xen k gia nhng thnh phn c khi to).V d ny cn minh ho cho cc cu trc lng nhau, c th trong kiu cu trc Sinhvien c mt thnh phn cng kiu cu trc l thnh phn ns.
2. Truy nhp cc thnh phn kiu cu trc

truy nhp vo cc thnh phn kiu cu trc ta s dng c php: tn bin.tn thnh phn hoc tn bin tn thnh phn i vi bin con tr cu trc. C th: i vi bin thng: tn bin.tn thnh phn V d:
struct Lop { char tenlop[10]; int siso;

147

Chng 5. D liu kiu cu trc v hp

}; Lop daihoc = "K41T", caodang ; caodang.tenlop = daihoc.tenlop ; caodang.siso++; // gn tn lp cng bi tn lp hc // tng s s lp caodang ln 1

i vi bin con tr: tn bin tn thnh phn V d:


struct Sinhvien { char hoten[25] ; Ngaythang ns; int gt; float diem ; } x, *p, K41T[60]; Sinhvien y = {"NVA", {1,1,1980}, 1} ; y.diem = 5.5 ; p = new Sinhvien ; strcpy(photen, y.hoten) ; cout << photen << y.hoten; // gn im thi cho sinh vin y // cp b nh cha 1 sinh vin // gn h tn ca y cho sv tr bi p // in hoten ca y v con tr p

i vi bin mng: truy nhp thnh phn mng ri n thnh phn cu trc. V d:
strcpy(K41T[1].hoten, photen) ; K41T[1].diem = 7.0 ; // gn h tn cho sv u tin ca lp // gn im cho sv u tin

i vi cu trc lng nhau. Truy nhp thnh phn ngoi ri n thnh phn ca cu trc bn trong, s dng cc php ton . hoc (cc php ton ly thnh phn) mt cch thch hp.
x.ngaysinh.ng = y.ngaysinh.ng ; x.ngaysinh.th = y.ngaysinh.th ; // gn ngy, // thng,

x.ngaysinh.nam = y.ngaysinh.nam ; // nm sinh ca y cho x. 3. Php ton gn cu trc

Cng ging cc bin mng, lm vic vi mt bin cu trc chng ta phi thc hin thao tc trn tng thnh phn ca chng. V d vo/ra mt bin cu trc phi vit

148

Chng 5. D liu kiu cu trc v hp

cu lnh vo/ra tng cho tng thnh phn. Nhn xt ny c minh ha trong v d sau:
struct Sinhvien { char hoten[25] ; Ngaythang ns; int gt; float diem ; } x, y; cout << " Nhp d liu cho sinh vin x:" << endl ; cin.getline(x.hoten, 25); cin >> x.ns.ng >> x.ns.th >> x.ns.nam; cin >> x.gt; cin >> x.diem cout << "Thng tin v sinh vin x l:" << endl ; cout << "H v tn: " << x.hoten << endl; cout << "Sinh ngy: " << x.ns.ng << "/" << x.ns.th << "/" << x.ns.nam ; cout << "Gii tnh: " << (x.gt == 1) ? "Nam": "N ; cout << x.diem

Tuy nhin, khc vi bin mng, i vi cu trc chng ta c th gn gi tr ca 2 bin cho nhau. Php gn ny cng tng ng vi vic gn tng thnh phn ca cu trc. V d:
struct Sinhvien { char hoten[25] ; Ngaythang ns; int gt; float diem ; } x, y, *p ; cout << " Nhp d liu cho sinh vin x:" << endl ; cin.getline(x.hoten, 25); cin >> x.ns.ng >> x.ns.th >> x.ns.nam; cin >> x.gt;

149

Chng 5. D liu kiu cu trc v hp

cin >> x.diem y=x; // i vi bin mng, php gn ny l khng thc hin c

p = new Sinhvien[1] ; *p = x ; cout << "Thng tin v sinh vin y l:" << endl ; cout << "H v tn: " << y.hoten << endl; cout << "Sinh ngy: " << y.ns.ng << "/" << y.ns.th << "/" << y.ns.nam ; cout << "Gii tnh: " << (y.gt = 1) ? "Nam": "N ; cout << y.diem

Ch : khng gn b gi tr c th cho bin cu trc. Cch gn ny ch thc hin c khi khi to. V d:
Sinhvien x = { "NVA", {1,1,1980}, 1, 7.0}, y ; y = { "NVA", {1,1,1980}, 1, 7.0}; y = x; 4. Cc v d minh ho // c // khng c // c

Di y chng ta a ra mt vi v d minh ho cho vic s dng kiu cu trc. V d 1 : Cng, tr, nhn chia hai phn s c cho di dng cu trc.
#include <iostream.h> #include <conio.h> struct Phanso { int tu ; int mau ; } a, b, c ; void main() { clrscr(); cout << "Nhp phn s a:" << endl ; cout << "T:"; cin >> a.tu; cout << "Mu:"; cin >> a.mau; // nhp a

150

Chng 5. D liu kiu cu trc v hp

cout << "Nhp phn s b:" << endl ; cout << "T:"; cin >> b.tu; cout << "Mu:"; cin >> b.mau; c.tu = a.tu*b.mau + a.mau*b.tu; c.mau = a.mau*b.mau; cout << "a + b = " << c.tu << "/" << c.mau; c.tu = a.tu*b.mau - a.mau*b.tu; c.mau = a.mau*b.mau; cout << "a - b = " << c.tu << "/" << c.mau; c.tu = a.tu*b.tu; c.mau = a.mau*b.mau; cout << "a + b = " << c.tu << "/" << c.mau; c.tu = a.tu*b.mau; c.mau = a.mau*b.tu; cout << "a + b = " << c.tu << "/" << c.mau; getch(); }

// nhp b

// tnh v in a+b

// tnh v in a-b

// tnh v in axb

// tnh v in a/b

V d 2 : Nhp mng K41T. Tnh tui trung bnh ca sinh vin nam, n. Hin danh sch ca sinh vin c im thi cao nht.
#include <iostream.h> #include <conio.h> void main() { struct Sinhvien { char hoten[25] ; Ngaythang ns; int gt; float diem ; } x, K41T[60]; int i, n;

151

Chng 5. D liu kiu cu trc v hp

// nhp d liu cout << "Cho bit s sinh vin: "; cin >> n; for (i=1, i<=n, i++) { cout << "Nhap sinh vien thu " << i); cout << "Ho ten: " ; cin.getline(x.hoten); cout << "Ngy sinh: " ; cin >> x.ns.ng >> x.ns.th >>x.ns.nam ; cout << "Gii tnh: " ; cin >> x.gt ; cout << "im: " ; cin >> x.diem ; cin.ignore(); K41T[i] = x ; } }

// Tnh im trung bnh float tbnam = 0, tbnu = 0; int sonam = 0, sonu = 0 ; for (i=1; i<=n; i++) if (K41T[i].gt == 1) { sonam++ ; tbnam += K41T[1].diem ; } else { sonu++ ; tbnu += K41T[1].diem ; } cout << "im trung bnh ca sinh vin nam l " << tbnam/sonam ; cout << "im trung bnh ca sinh vin n l " << tbnu/sonu ; // In danh sch sinh vin c im cao nht float diemmax = 0; for (i=1; i<=n; i++) // Tm im cao nht if (diemmax < K41T[i].diem) diemmax = K41T[i].diem ; for (i=1; i<=n; i++) { if (K41T[i].diem < diemmax) continue ; // In danh sch

152

Chng 5. D liu kiu cu trc v hp

x = K41T[1] ; cout << x.hoten << '\t' ; cout << x.ns.ng << "/" << x.ns.th << "/" << x.ns.nam << '\t' ; cout << (x.gt == 1) ? "Nam": "N" << '\t' ; cout << x.diem << endl; } }
5. Hm vi cu trc a. Con tr v a ch cu trc

Mt con tr cu trc cng ging nh con tr tr n cc kiu d liu khc, c ngha n cha a ch ca mt bin cu trc hoc mt vng nh c kiu cu trc no . Mt con tr cu trc c khi to bi: Gn a ch ca mt bin cu trc, mt thnh phn ca mng, tng t nu a ch ca mng (cng l a ch ca phn t u tin ca mng) gn cho con tr th ta cng gi l con tr mng cu trc. V d:
struct Sinhvien { char hoten[25] ; Ngaythang ns; int gt; float diem ; } x, y, *p, lop[60]; p = &x ; pdiem = 5.0; p = &lop[10] ; cout << photen; *p = y ; (*p).gt = 2; // cho con tr p tr ti bin cu trc x // gn gi tr 5.0 cho im ca bin x // cho p tr ti sinh vin th 10 ca lp // hin h tn ca sinh vin ny // gn li sinh vin th 10 l y // sa li gii tnh ca sinh vin th 10 l n

Ch : thng qua v d ny ta cn thy mt cch khc na truy nhp cc thnh phn ca x c tr bi con tr p. Khi *p l tng ng vi x, do vy ta dng li c 153

Chng 5. D liu kiu cu trc v hp

php s dng ton t . sau *p ly thnh phn nh (*p).hoten, (*p).diem, Con tr c khi to do xin cp pht b nh. V d:
Sinhvien *p, *q ; p = new Sinhvien[1]; q = new Sinhvien[60];

trong v d ny *p c th thay cho mt bin kiu sinh vin (tng ng bin x trn) cn q c th c dng qun l mt danh sch c ti a l 60 sinh vin (tng ng bin lop[60], v d khi *(p+10) l sinh vin th 10 trong danh sch). i vi con tr p tr n mng a, chng ta c th s dng mt s cch sau truy nhp n cc trng ca cc thnh phn trong mng, v d truy cp hoten ca thnh phn th i ca mng a ta c th vit: p[i].hoten (p+i)hoten *(p+i).hoten Ni chung cc cch vit trn u d nh do suy t kiu mng v con tr mng. C th trong p[i] l thnh phn th i ca mng a, tc a[i]. (p+i) l con tr tr n thnh phn th i v *(p+i) chnh l a[i]. V d sau gn gi tr cho thnh phn th 10 ca mng sinh vin lop, sau in ra mn hnh cc thng tin ny. V d dng minh ho cc cch truy nhp trng d liu ca thnh phn trong mng lop. V d 3 :
struct Sinhvien { char hoten[25] ; Ngaythang ns; int gt; float diem ; } lop[60] ; strcpy(lop[10].hoten, "NVA"); lop[10].gt = 1; lop[10].diem = 9.0 ; Sinhvien *p ; p = &lop ; // khai bo thm bin con tr Sinh vin // cho con tr p tr ti mng lop

154

Chng 5. D liu kiu cu trc v hp

cout << p[10].hoten ; cout << (p+10) gt ; cout << (*(p+10)).diem ;

// in h tn sinh vin th 10 // in gii tnh ca sinh vin th 10 // in im ca sinh vin th 10

Ch : u tin ca ton t ly thnh phn (du chm) l cao hn cc ton t ly a ch (&) v ly gi tr (*) nn cn phi vit cc du ngoc ng cch.
b. a ch ca cc thnh phn ca cu trc

Cc thnh phn ca mt cu trc cng ging nh cc bin, do vy cch ly a ch ca cc thnh phn ny cng tng t nh i vi bin bnh thng. Chng hn a ch ca thnh phn gii tnh ca bin cu trc x l &x.gt (lu u tin ca . cao hn &, nn &x.gt l cng tng ng vi &(x.gt)), a ch ca trng hoten ca thnh phn th 10 trong mng lp l lop[10].hoten (hoten l xu k t), tng t a ch ca thnh phn diem ca bin c tr bi p l &(pdiem). V d:
struct Sinhvien { char hoten[25] ; Ngaythang ns; int gt; float diem ; } lop[60], *p, x = { "NVA", {1,1,1980}, 1, 9.0) }; lop[10] = x; p = &lop[10] ; char *ht; int *gt; float *d; ht = x.ht ; gt = &(lop[10].gt) ; d = &(pdiem) ; cout << ht ; cout << *gt ; cout << *d ; c. i ca hm l cu trc // p tr n sinh vin th 10 trong lop // cc con tr kiu thnh phn // cho ht tr n thnh phn hoten ca x // gt tr n gt ca sinh vin th 10 // p tr n diem ca sv p ang tr // in h tn sinh vin x // in gii tnh ca sinh vin th 10 // in im ca sinh vin p ang tr.

Mt cu trc c th c s dng lm i ca hm di cc dng sau y: L mt bin cu trc, khi tham i thc s l mt cu trc.

155

Chng 5. D liu kiu cu trc v hp

L mt con tr cu trc, tham i thc s l a ch ca mt cu trc. L mt tham chiu cu trc, tham i thc s l mt cu trc. L mt mng cu trc hnh thc hoc con tr mng, tham i thc s l tn mng cu trc. V d 4 : V d sau y cho php tnh chnh xc khong cch ca 2 ngy thng bt k, t c th suy ra th ca mt ngy thng bt k. i ca cc hm l mt bin cu trc. Khai bo
struct DATE { int ngay ; int thang; int nam ; }; // S ngy ca mi thng int n[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31}; // Kiu ngy thng

Hm tnh nm nhun hay khng nhun, tr li 1 nu nm nhun, ngc li tr 0.


int Nhuan(int nm) { return (nam%4==0 && nam%100!=0 || nam%400==0)? 1: 0; }

Hm tr li s ngy ca mt thng bt k. Nu nm nhun v l thng hai s ngy ca thng hai (28) c cng thm 1.
int Ngayct(int thang, int nam) { return n[thang] + ((thang==2) ? Nhuan(nam): 0); }

156

Chng 5. D liu kiu cu trc v hp

Hm tr li s ngy tnh t ngy 1 thng 1 nm 1 bng cch cng dn s ngy ca tng nm t nm 1 n nm hin ti, tip theo cng dn s ngy tng thng ca nm hin ti cho n thng hin ti v cui cng cng thm s ngy hin ti.
long Tongngay(DATE d) { long i, kq = 0; for (i=1; i<d.nam; i++) kq += 365 + Nhuan(i); for (i=1; i<d.thang; i++) kq += Ngayct(i,d.nam); kq += d.ngay; return kq; }

Hm tr li khong cch gia 2 ngy bt k.


long Khoangcach(DATE d1, DATE d2) { return Tongngay(d1)-Tongngay(d2); }

Hm tr li th ca mt ngy bt k. Qui c 1 l ch nht, 2 l th hai, tnh th hm da trn mt ngy chun no ( y l ngy 1/1/2000, c bit l th by). T ngy chun ny nu cng hoc tr 7 s cho ra ngy mi cng l th by. T , tnh khong cch gia ngy cn tnh th v ngy chun. Tm phn d ca php chia khong cch ny vi 7, nu phn d l 0 th th l by, phn d l 1 th th l ch nht
int Thu(DATE d) { DATE curdate = {1,1,2000}; long kc = Khoangcach(d, curdate); int du = kc % 7; if (du < 0) du += 7; return du; } // ngy 1/1/2000 l th by

Hm dch mt s d sang th

157

Chng 5. D liu kiu cu trc v hp

char* Dich(int t) { char* kq = new char[10]; switch (t) { case 0: strcpy(kq, "th by"); break; case 1: strcpy(kq, "ch nht"); break; case 2: strcpy(kq, "th hai"); break; case 3: strcpy(kq, "th ba"); break; case 4: strcpy(kq, "th t"); break; case 5: strcpy(kq, "th nm"); break; case 6: strcpy(kq, "th su"); break; } return kq; }

Hm main()
void main() { DATE d; cout << "Nhap ngay thang nam: " ; cin >> d.ngay >> d.thang >> d.nam ; cout << "Ngy " << d.ngay << "/" << d.thang << "/" << d.nam ; cout << " l " << Dich(Thu(d)); }

V d 5 : Chng trnh n gin v qun l sinh vin. Khai bo.


struct Sinhvien { char hoten[25] ; Ngaythang ns; int gt; // cu trc sinh vin

158

Chng 5. D liu kiu cu trc v hp

float diem ; }; Sinhvien lop[3]; // lp cha ti a 3 sinh vin

Hm in thng tin v sinh vin s dng bin cu trc lm i. Trong li gi s dng bin cu trc truyn cho hm.
void in(Sinhvien x) { cout << x.hoten << "\t" ; cout << x.ns.ng << "/" << x.ns.th << "/" << x.ns.nam << "\t" ; cout << x.gt << "\t"; cout << x.diem << endl; }

Hm nhp thng tin v sinh vin s dng con tr sinh vin lm i. Trong li gi s dng a ch ca mt cu trc truyn cho hm.
void nhap(Sinhvien *p) { cin.ignore(); cout << "H tn: "; cin.getline(photen, 25) ; cout << "Ngy sinh: "; cin >> (pns).ng >> (pns).th >> (pns).nam ; cout << "Gii tnh: "; cin >> (pgt) ; cout << "im: "; cin >> (pdiem) ; }

Hm sa thng tin v sinh vin s dng tham chiu cu trc lm i. Trong li gi s dng bin cu trc truyn cho hm.
void sua(Sinhvien &r) { int chon; do { cout << "1: Sa h tn" << endl ; cout << "2: Sa ngy sinh" << endl ;

159

Chng 5. D liu kiu cu trc v hp

cout << "3: Sa gii tnh" << endl ; cout << "4: Sa im" << endl ; cout << "0: Thi" << endl ; cout << "Sa (0/1/2/3/4) ? ; cin >> chon ; cin.ignore(); switch (chon) { case 1: cin.getline(r.hoten, 25) ; break; case 2: cin >> r.ns.ng >> r.ns.th >> r.ns.nam ; break; case 3: cin >> r.gt ; break; case 4: cin >> r.diem ; break; } } while (chon) ; }

Hm nhapds nhp thng tin ca mi sinh vin trong mng, s dng con tr mng Sinhvien lm tham i hnh thc. Trong li gi s dng tn mng truyn cho hm.
void nhapds(Sinhvien *a) { int sosv = sizeof(lop) / sizeof(Sinhvien) -1; for (int i=1; i<=sosv; i++) nhap(&a[i]) ; } // b phn t 0

Hm suads cho php sa thng tin ca sinh vin trong mng, s dng con tr mng Sinhvien lm tham i hnh thc. Trong li gi s dng tn mng truyn cho hm.
void suads(Sinhvien *a) { int chon; cout << "Chn sinh vin cn sa: " ; cin >> chon ; cin.ignore(); sua(a[chon]) ; }

Hm inds hin thng tin ca mi sinh vin trong mng, s dng hng con tr mng Sinhvien lm tham i hnh thc. Trong li gi s dng tn mng truyn cho hm.

160

Chng 5. D liu kiu cu trc v hp

void hien(const Sinhvien *a) { int sosv = sizeof(lop) / sizeof(Sinhvien) -1; for (int i=1; i<=sosv; i++) in(a[i]) ; } // b phn t 0

Hm main() gi chy cc hm trn nhp, in, sa danh sch sinh vin.


void main() { nhapds(lop) ; inds(lop); suads(lop); inds(lop); } d. Gi tr hm l cu trc

Cng tng t nh cc kiu d liu c bn, gi tr tr li ca mt hm cng c th l cc cu trc di cc dng sau: l mt bin cu trc. l mt con tr cu trc. l mt tham chiu cu trc. Sau y l cc v d minh ho gi tr cu trc ca hm. V d 6 : i v gi tr ca hm l cu trc: Cng, tr hai s phc. Khai bo kiu s phc
struct Sophuc { float thuc; float ao; }; // Khai bo kiu s phc dng chung

Hm cng 2 s phc, tr li mt s phc


Sophuc Cong(Sophuc x, Sophuc y) {

161

Chng 5. D liu kiu cu trc v hp

Sophuc kq; kq.thuc = x.thuc + y.thuc ; kq.ao = x.ao + y.ao ; return kq; }

Hm tr 2 s phc, tr li mt s phc
Sophuc Tru(Sophuc x, Sophuc y) { Sophuc kq; kq.thuc = x.thuc + y.thuc ; kq.ao = x.ao + y.ao ; return kq; }

Hm in mt s phc dng (r + im)


void In(Sophuc x) { cout << "(" << x.thuc << "," << x.ao << ")" << endl ; }

Hm chnh
void main() { Sophuc x, y, z ; cout << "x = " ; cin >> x.thuc >> x.ao ; cout << "y = " ; cin >> y.thuc >> y.ao ; cout << "x + y = " ; In(Cong(x,y)) ; cout << "x - y = " ; In(Tru(x,y)) ; }

V d 7 : Chng trnh nhp v in thng tin v mt lp cng sinh vin c im cao nht lp.

162

Chng 5. D liu kiu cu trc v hp

Khai bo kiu d liu Sinh vin v bin mng lop.


struct Sinhvien { char *hoten ; float diem ; } lop[4] ;

Hm nhp sinh vin, gi tr tr li l mt con tr tr n d liu va nhp.


Sinhvien* nhap() { Sinhvien* kq = new Sinhvien[1]; kq->hoten = new char[15]; // nh cp pht vng nh // cho c con tr hoten

cout << "H tn: "; cin.getline(kq->hoten,30); cout << "im: "; cin >> kq->diem; cin.ignore(); return kq; } // tr li con tr kq

Hm tm sinh vin c im cao nht, gi tr tr li l mt tham chiu n sinh vin tm c.


Sinhvien& svmax() { int sosv = sizeof(lop)/sizeof(Sinhvien)-1; float maxdiem = 0; int kmax; for (int i=1; i<sosv; i++) if (maxdiem < lop[i].diem) { maxdiem = lop[i].diem ; kmax = i; } return lop[kmax]; // tr li sv c im max // ch s sv c im max // b thnh phn th 0

163

Chng 5. D liu kiu cu trc v hp

Hm in thng tin ca mt sinh vin x


void in(Sinhvien x) { cout << x.hoten << "\t"; cout << x.diem << endl; }

Hm chnh
void main() { clrscr(); int i; int sosv = sizeof(lop)/sizeof(Sinhvien)-1; for (i=1; i<=sosv; i++) lop[i] = *nhap(); for (i=1; i<=sosv; i++) in(lop[i]); Sinhvien &b = svmax(); in(b); getch(); } 6. Cu trc vi thnh phn kiu bit a. Trng bit // b thnh phn th 0 // nhp danh sch lp // in danh sch lp // khai bo tham chiu b v cho // tham chiu n sv c im max // in sinh vin c im max

Thng thng cc trng trong mt cu trc thng s dng t nht l 2 byte tc 16 bit. Trong nhiu trng hp mt s trng c th ch cn n s bit t hn, v d trng gioitinh thng thng ch cn n 1 bit lu tr. Nhng trng hp nh vy ta c th khai bo kiu bit cho cc trng ny tit kim b nh. Tuy nhin, cch khai bo ny t c s dng tr khi cn thit phi truy nhp n mc bit ca d liu trong cc chng trnh lin quan n h thng. Mt trng bit l mt khai bo trng int v thm du: cng s bit n theo sau,

164

Chng 5. D liu kiu cu trc v hp

trong 0 n < 15. V d do ln ca ngy khng vt qu 31, thng khng vut qu 12 nn 2 trng ny trong cu trc ngy thng c th khai bo tit kim hn bng 5 v 4 bit nh sau:
struct Date { int ng: 5; int th: 4; int nam; }; b. c im

Cn ch cc c im sau ca mt cu trc c cha trng bit: Cc bit c b tr lin tc trn dy cc byte. Kiu trng bit phi l int (signed hoc unsigned). di mi trng bit khng qu 16 bit. C th b qua mt s bit nu b trng tn trng, v d:
struct tu { int: 8; int x:8; }

mi mt bin cu trc theo khai bo trn gm 2 byte, b qua khng s dng byte thp v trng x chim byte (8 bit) cao. Khng cho php ly a ch ca thnh phn kiu bit. Khng th xy dng c mng kiu bit. Khng c tr v t hm mt thnh phn kiu bit. V d nu b l mt thnh phn ca bin cu trc x c kiu bit th cu lnh sau l sai:
return x.b ; int tam = x.b ; return tam ; // sai

tuy nhin c th thng qua bin ph nh sau: Tit kim b nh Dng trong kiu union ly cc bit ca mt t (xem v d trong phn kiu hp).

165

Chng 5. D liu kiu cu trc v hp

7. Cu lnh typedef

thun tin trong s dng, thng thng cc kiu c NSD to mi s c gn cho mt tn kiu bng cu lnh typedef nh sau:
typedef <kiu> <tn_kiu> ;

V d: to kiu mi c tn Bool v ch cha gi tr nguyn (thc cht ch cn 2 gi tr 0, 1), ta c th khai bo:


typedef int Bool;

khai bo ny cho php xem Bool nh kiu s nguyn. hoc c th t tn cho kiu ngy thng l Date vi khai bo sau:
typedef struct Date { int ng; int th; int nam; };

khi ta c th s dng cc tn kiu ny trong cc khai bo (v d tn kiu ca i, ca gi tr hm tr li ).


8. Hm sizeof()

Hm tr li kch thc ca mt bin hoc kiu. V d:


Bool a, b; Date x, y, z[50]; cout << sizeof(a) << sizeof(b) << sizeof(Bool) ; cout << "S phn t ca z = " << sizeof(z) / sizeof(Date) // in 2 2 2 // in 50

II. CU TRC T TR V DANH SCH LIN KT Thng thng khi thit k chng trnh chng ta cha bit c s lng d liu cn dng l bao nhiu khai bo s bin cho ph hp. c bit l bin d liu kiu mng. S lng cc thnh phn ca bin mng cn phi khai bo trc v chng trnh dch s b tr vng nh c nh cho cc bin ny. Do buc phi khai bo trc s lng thnh phn nn kiu mng thng dn n hoc l lng ph b nh (khi chng trnh khng dng ht) hoc l khng cha d liu (khi chng trnh cn cha d liu vi s lng thnh phn ln hn). khc phc tnh trng ny C++ cho php cp pht b nh ng, ngha l s

166

Chng 5. D liu kiu cu trc v hp

lng cc thnh phn khng cn phi khai bo trc. Bng ton t new chng ta c th xin cp pht vng nh theo nhu cu mi khi chy chng trnh. Tuy nhin, cch lm ny dn n vic d liu ca mt danh sch s khng cn nm lin tc trong b nh nh i vi bin mng. Mi ln xin cp pht bi ton t new, chng trnh s tm mt vng nh ang ri bt k cp pht cho bin v nh vy d liu s nm ri rc trong b nh. T , d dng qun l trt t ca mt danh sch cc d liu, mi thnh phn ca danh sch cn phi cha a ch ca thnh phn tip theo hoc trc n (iu ny l khng cn thit i vi bin mng v cc thnh phn ca chng sp xp lin tc, k nhau). T , mi thnh phn ca danh sch s l mt cu trc, ngoi cc thnh phn cha thng tin ca bn thn, chng cn phi c thm mt hoc nhiu con tr tr n cc thnh phn tip theo hay ng trc. Cc cu trc nh vy c gi l cu trc t tr v cc thnh phn con tr trong cu trc ny s tr n cc vng d liu c kiu chnh l kiu ca chng.
1. Cu trc t tr

Mt cu trc c cha t nht mt thnh phn con tr c kiu ca chnh cu trc ang nh ngha c gi l cu trc t tr. C th khai bo cu trc t tr bi mt trong nhng cch sau: Cch 1:
typedef struct <tn cu trc> <tn kiu> ; struct <tn cu trc> { cc thnh phn cha thng tin ; <tn kiu> *con tr ; }; // nh ngha tn cu trc

V d:
typedef struct Sv Sinhvien ; struct Sv { char hoten[30] ; float diem ; Sinhvien *tiep ; }; // thnh phn cha thng tin // thnh phn cha thng tin // thnh phn con tr cha a ch tip theo // lu phi c t kho struct

167

Chng 5. D liu kiu cu trc v hp

Cch 2:
struct <tn cu trc> { cc thnh phn cha thng tin ; <tn cu trc> *con tr ; }; typedef <tn cu trc> <tn kiu> ; // nh ngha tn cu trc t tr

V d:
struct Sv { char hoten[30] ; float diem ; Sv *tiep ; }; typedef Sv Sinhvien ; // thnh phn cha thng tin // thnh phn cha thng tin // thnh phn con tr cha a ch tip theo

Cch 3:
typedef struct <tn kiu> { cc thnh phn cha thng tin ; <tn kiu> *con tr ; }; // nh ngha tn cu trc t tr

V d:
typedef struct Sinhvien { char hoten[30] ; float diem ; Sinhvien *tiep ; }; // thnh phn cha thng tin // thnh phn cha thng tin // con tr cha a ch thnh phn tip theo

Cch 4:

168

Chng 5. D liu kiu cu trc v hp

struct <tn kiu> { cc thnh phn cha thng tin ; <tn kiu> *con tr ; };

V d:
struct Sinhvien { char hoten[30] ; float diem ; Sinhvien *tiep ; }; // thnh phn cha thng tin // thnh phn cha thng tin // con tr cha a ch ca phn t tip.

Trong cc cch trn ta thy 2 cch khai bo cui cng l n gin nht. C++ quan nim cc tn gi ng sau cc t kho struct, union, enum l cc tn kiu (d khng c t kho typedef), do vy c th s dng cc tn ny khai bo.
2. Khi nim danh sch lin kt

Danh sch lin kt l mt cu trc d liu cho php th hin v qun l danh sch bng cc cu trc lin kt vi nhau thng qua cc con tr trong cu trc. C nhiu dng danh sch lin kt ph thuc vo cc kt ni, v d: Danh sch lin kt n, mi cu trc cha mt con tr tr n cu trc tip theo hoc trc . i vi danh sch con tr tr v trc, cu trc u tin ca danh sch s tr v hng con tr NULL, cu trc cui cng c nh du bi con tr last l con tr tr vo cu trc ny. i vi danh sch con tr tr v cu trc tip theo, cu trc u s c nh du bng con tr head v cu trc cui cng cha con tr NULL. Danh sch lin kt kp gm 2 con tr, mt tr n cu trc trc v mt tr n cu trc sau, 2 u ca danh sch c nh du bi cc con tr head, last. Danh sch lin kt vng gm 1 con tr tr v sau (hoc trc), hai u ca danh sch c ni vi nhau to thnh vng trn. Ch cn mt con tr head nh du u danh sch. Do trong cu trc c cha cc con tr tr n cu trc tip theo v/hoc cu trc ng trc nn t mt cu trc ny chng ta c th truy cp n mt cu trc khc

169

Chng 5. D liu kiu cu trc v hp

(trc v/hoc sau n). Kt hp vi cc con tr nh du 2 u danh sch (head, last) chng ta s d dng lm vic vi bt k phn t no ca danh sch. C th k mt s cng vic thng thc hin trn mt danh sch nh: b sung phn t vo cui danh sch, chn thm mt phn t mi, xo mt phn t ca danh sch, tm kim, sp xp danh sch, in danh sch Hnh v bn di minh ho mt danh sch lin kt n qun l sinh vin, thng tin cha trong mi phn t ca danh sch gm c h tn sinh vin, im. Ngoi ra mi phn t cn cha con tr tiep ni vi phn t tip theo ca n. Phn t cui cng ni vi cu trc rng (NULL). head

NVA 9.0

TTB 7.5

PHT 4.0

NULL

3. Cc php ton trn danh sch lin kt

Di y chng ta m t tm tt cch thc thc hin mt s thao tc trn danh sch lin kt n.
a. To phn t mi

to phn t mi thng thng chng ta thc hin theo cc bc sau y: dng ton t new xin cp pht mt vng nh cha mt phn t ca danh sch. nhp thng tin cn lu tr vo phn t mi. Con tr tiep c t bng NULL. gn phn t va to c vo danh sch. C hai cch: hoc gn vo u danh sch, khi v tr ca con tr head (ch vo u danh sch) c iu chnh li ch vo phn t mi. hoc gn vo cui danh sch bng cch cho con tr tiep ca phn t cui danh sch (ang tr vo NULL) tr vo phn t mi. Nu danh sch c con tr last ch vo cui danh sch th last c iu chnh tr vo phn t mi. Nu danh sch khng c con tr last th tm c phn t cui chng trnh phi duyt t u, bt u t con tr head cho n khi gp phn t tr vo NULL, l phn t cui ca danh sch.

170

Chng 5. D liu kiu cu trc v hp

head

MOI 0.0

NVA 9.0

TTB 7.5

PHT 4.0

NULL

Gn phn t mi vo u danh sch

b. Chn phn t mi vo gia

Gi s phn t mi c chn vo gia phn t th i v i+1. chn ta ni phn t th i vo phn t mi v phn t mi ni vo phn t th i+1. Thut ton s nh sau: Cho con tr p chy n phn t th i. Cho con tr tiep ca phn t mi tr vo phn t th i+1 (tuc p->tiep). Cho con tr tiep ca phn t th i (hin c tr bi p) thay v tr vo phn t th i+1 by gi s tr vo phn t mi. MOI

u 0.0

i 9.0

i+1 7.5

cui 4.0

NULL

Chn phn t mi vo gia phn t i v i+1 a. Xo phn t th i khi danh sch

Vic xo mt phn t ra khi danh sch rt n gin bi ch vic thay i cc con tr. C th gi s cn xo phn t th i ta ch cn cho con tr tiep ca phn t th i-1 tr ("vng qua" phn t th i) vo phn t th i+1. Nh vy by gi khi chy trn danh sch n phn t th i-1, phn t tip theo l phn t th i+1 ch khng cn l phn t th i. Ni cch khc phn t th i khng c ni bi bt k phn t no nn n s

171

Chng 5. D liu kiu cu trc v hp

khng thuc danh sch. C th thc hin cc bc nh sau: Cho con tr p chy n phn t th i-1. t phn t th i vo bin x. Cho con tr tiep ca phn t th i-1 tr vo phn t th i+1 bng cch t tiep = x.tiep. Gii phng b nh c tr bi x bng cu lnh delete x.

i-1 0.0

i 9.0

i+1 7.5 Xa phn t th i

cui 4.0

NULL

c. Duyt danh sch

Duyt l thao tc i qua tng phn t ca danh sch, ti mi phn t chng trnh thc hin mt cng vic g trn phn t m ta gi l thm phn t . Mt php thm c th n gin l hin ni dung thng tin ca phn t ra mn hnh chng hn. duyt danh sch ta ch cn cho mt con tr p chy t u n cui danh sch n khi phn t cui c con tr tiep = NULL th dng. Cu lnh cho con tr p chuyn n phn t tip theo ca n l: p = p tiep ;
d. Tm kim

Cho mt danh sch trong mi phn t ca danh sch u cha mt trng gi l trng kho, thng l cc trng c kiu c s hoc kt hp ca mt s trng nh vy. Bi ton t ra l tm trn danh sch phn t c gi tr ca trng kho bng vi mt gi tr cho trc. Tin trnh thc hin nhim v thccht cng l bi ton duyt, trong thao tc "thm" chnh l so snh trng kho ca phn t vi gi tr cho trc, nu trng nhau ta in kt qu v dng, Nu duyt ht m khng c phn t no c trng kho trng vi gi tr cho trc th xem danh sch khng cha gi tr ny. Ngoi cc thao tc trn, ni chung cn nhiu cc thao tc quen thuc khc tuy nhin chng ta khng trnh by y v n khng thuc phm vi ca gio trnh ny. Di y l mt v d minh ho cho cc cu trc t tr, danh sch lin kt v mt vi thao tc trn danh sch lin kt thng qua bi ton qun l sinh vin.

172

Chng 5. D liu kiu cu trc v hp

Khai bo
struct DATE { int day, month, year; }; struct Sinhvien { char hoten[31]; DATE ns; float diem; Sinhvien *tiep ; }; Sinhvien *dau = NULL, *cuoi = NULL; Sinhvien *cur = NULL; int sosv = 0; // Cc con tr ti u v cui ds // Con tr ti sv hin ti // S sv ca danh sch // cu trc t tr // ngy, thng, nm

To sinh vin mi v nhp thng tin, tr li con tr tr n sinh vin mi.


Sinhvien* Nhap1sv() { Sinhvien *kq = new Sinhvien[1] ; cout << "\nSinh vien thu ", sosv+1 ; cout << "Ho ten = " ; cin.getline(kq->hoten); cout << "Ns = " ; cin >> kq->ns.day >> kq->ns.month >> kq->ns.year; cout << "Diem = " ; cin >> kq->diem ; cin.ignore() ; kq->tiep = NULL; return kq ; } // Cp pht b nh cho kq // To 1 khi d liu cho sv mi

B sung sinh vin mi vo cui danh sch.


void Bosung() { cur = Nhap1sv(); // B sung sv mi vo cui ds

173

Chng 5. D liu kiu cu trc v hp

if (sosv == 0) {dau = cuoi = cur;} else { cuoi->tiep = cur; cuoi = cur; } sosv++; }

Chn sv mi vo trc sinh vin th n.


void Chentruoc(int n) { cur = Nhap1sv(); if (sosv==0) { dau = cuoi = cur; sosv++; return; } if (sosv==1 || n==1) {cur->tiep = dau; dau = cur; sosv++; return;} Sinhvien *truoc, *sau; truoc = dau; sau = dau -> tiep; for (int i=1; i<n-1; i++) truoc = truoc->tiep; sau = truoc->tiep; truoc->tiep = cur; cur -> tiep = sau; sosv ++; } // Chn sv mi vo trc sv th n

Chn sv mi vo sau sinh vin th n.


void Chensau(int n) { cur = Nhap1sv(); if (sosv==0 || sosv<n) { dau = cuoi = cur; sosv++; return; } Sinhvien *truoc, *sau; truoc = dau; sau = dau -> tiep; for (int i=1; i<n; i++) truoc = truoc->tiep; sau = truoc->tiep; truoc->tiep = cur; // Chn sv mi vo sau sv th n

174

Chng 5. D liu kiu cu trc v hp

cur -> tiep = sau; sosv ++; }

Xo sinh vin th n.
void Xoa(int n) { if (sosv==1&&n==1) { delete dau ; dau = cuoi = NULL; sosv--; return; } if (n==1) { cur = dau; dau = cur->tiep; delete cur; sosv--; return; } Sinhvien *truoc, *sau; truoc = dau; sau = dau -> tiep; for (int i=1; i<n-1; i++) truoc = truoc->tiep; cur = truoc->tiep; sau = cur->tiep; truoc->tiep = sau; delete cur ; sosv --; } // Xo sinh vin th n

To danh sch sinh vin.


void Taods() { int tiep = 1; while (tiep) { Bosung(); cout << "Tiep (0/1) ? " ; cin >> tiep ; } } // To danh sch

In danh sch sinh vin.


void Inds() { // In danh sch

175

Chng 5. D liu kiu cu trc v hp

cur = dau;

int i=1;

while (cur != NULL) { cout << "\nSinh vien thu " << i << " ----------------------------\n") ; cout << "Hoten:" << cur->hoten ; cout << "Ngay sinh: " cout << cur -> ns.day << "/" ; cout << cur -> ns.month << "/" ; cout << cur -> ns.year ; cout << "Diem: " << cur->diem ; cur = cur->tiep; i++; } }

Hm chnh.
void main() { clrscr(); Taods(); Inds(); getch(); }

III. KIU HP
1. Khai bo

Ging nh cu trc, kiu hp cng c nhiu thnh phn nhng cc thnh phn ca chng s dng chung nhau mt vng nh. Do vy kch thc ca mt kiu hp l di ca trng ln nht v vic thay i mt thnh phn s nh hng n tt c cc thnh phn cn li.
union <tn kiu> { Danh sch cc thnh phn; };

176

Chng 5. D liu kiu cu trc v hp

2. Truy cp

C php truy cp n cc thnh phn ca hp cng tng t nh kiu cu trc, tc cng s dng ton t ly thnh phn (du chm . hoc cho bin con tr kiu hp). Di y l mt v d minh ho vic s dng khai bo kiu hp tch byte thp, byte cao ca mt s nguyn. V d 1 :
void main() { union songuyen { int n; unsigned char c[2]; } x; cout << "Nhp s nguyn: " ; cin >> x.n ; cout << "Byte thp ca x = " << x.c[0] << endl ; cout << "Byte cao ca x = " << x.c[1] << endl; }

V d 2 : Kt hp cng kiu nhm bit trong cu trc, chng ta c th tm c cc bit ca mt s nh chng trnh sau. Trong chng trnh ta s dng mt bin u c kiu hp. Trong kiu hp ny c 2 thnh phn l 2 cu trc ln lt c tn s v f.
union { struct { unsigned a, b ; } s; struct { unsigned n1: 1; unsigned: 15; unsigned n2: 1; unsigned: 7; unsigned n3: 8; }t; } u;

177

Chng 5. D liu kiu cu trc v hp

vi khai bo trn y khi nhp u.s th n cng nh hng n u.t, c th u.t.n1 l bit u tin (0) ca thnh phn u.s.a u.t.n2 l bit 0 ca thnh phn u.s.b u.t.n3 l byte cao ca u.s.b IV. KIU LIT K C th gn cc gi tr nguyn lin tip (tnh t 0) cho cc tn gi c th bng kiu lit k theo khai bo sau y:
enum tn_kiu { d/s tn cc gi tr };

V d:
enum Bool {false, true};

khai bo kiu mi t tn Bool ch nhn 1 trong 2 gi tr t tn false v true, trong false ng vi gi tr 0 v true ng vi gi tr 1. Cch khai bo kiu enum trn cng tng ng vi dy cc macro sau:
#define false 0 #define true 1

Vi kiu Bool ta c th khai bo mt s bin nh sau:


Bool Ok, found;

hai bin Ok v found s ch nhn 1 trong 2 gi tr false (thay cho 0) hoc true (thay cho 1). C ngha c th gn:
Ok = true;

hoc:

found = false;

Tuy nhin khng th gn cc gi tr nguyn trc tip cho cc bin enum m phi thng qua p kiu. V d:
Ok = 0; Ok = Bool(0) ; hoc Ok = false ; // sai // ng // ng

178

Chng 5. D liu kiu cu trc v hp

BI TP
1. C th truy nhp thnh phn ca cu trc thng qua con tr nh sau (vi p l con tr cu trc v a l thnh phn ca cu trc): A: (*p).a 2. B: *pa C: a v b sai D: a v b ng Cho khai bo struct T {int x; float y;} t, *p, a[10]; Cu lnh no trong cc cu sau l khng hp l: (1) p = &t; (4) p = &a A: 1, 2 v 3 3. Cho cc khai bo sau:
struct ngay {int ng, th, nam;} vaotruong, ratruong; typedef struct {char hoten[25]; ngay ngaysinh;} sinhvien;

(2) p = &t.x;

(3) p = a; C: 1, 3 v 5 D: 2, 4 v 6

(5) p = &a[5]; (6) p = &a[5].y; B: 4, 5 v 6

Hy chn cu ng nht A: Khng c php gn: ratruong = vaotruong; B: sinhvien l tn cu trc, vaotruong, ratruong l bin cu trc C: C th vit: vaotruong.ng, ratruong.th, sinhvien.vaotruong.nam truy nhp n cc thnh phn tng ng. D: a, b, c ng 4. Trong cc khi to gi tr cho cc cu trc sau, khi to no ng:
struct S1 { int ngay, thang, nam; } s1 = {2,3}; struct S2 { char hoten[10]; struct S1 ngaysinh; } s2 = {"Ly Ly",1,2,3}; struct S3 { struct S2 sinhvien; float diem; } s3 = {{{"Cc cc", {4,5,6}}, 7};

179

Chng 5. D liu kiu cu trc v hp

A: S1 v S2 ng ng 5.

B: S2 v S3 ng

C: S3 v S1 ng

D: C 3 cng

i vi kiu cu trc, cch gn no di y l khng c php: A: Gn hai bin cho nhau. B: Gn hai phn t mng (kiu cu trc) cho nhau C: Gn mt phn t mng (kiu cu trc) cho mt bin v ngc li D: Gn hai mng cu trc cng s phn t cho nhau

6.

Cho on chng trnh sau:


struct { int to ; float soluong; } x[10]; for (int i = 0; i < 10; i++) cin >> x[i].to >> x[i].soluong ;

Chn cu ng nht trong cc cu sau: A: on chng trnh trn c li c php B: Khng c php s dng ton t ly a ch i vi cc thnh phn to v soluong C: Ly a ch thnh phn soluong dn n chng trnh hot ng khng ng n D: C a, b, c u sai 7. Chn cu ng nht trong cc cu sau: A: Cc thnh phn ca kiu hp (union) c cp pht mt vng nh chung B: Kch thc ca kiu hp bng kch thc ca thnh phn ln nht C: Mt bin kiu hp c th c t chc cho php thay i c kiu d liu ca bin trong qua trnh chy chng trnh D: a, b, c ng 8. Cho khai bo:
union { unsigned x; unsigned char y[2]; } z = {0xabcd};

180

Chng 5. D liu kiu cu trc v hp

Chn cu ng nht trong cc cu sau: A: Khai bo trn l sai v thiu tn kiu B: Khi to bin z l sai v ch c mt gi tr (0xabcd) C: z.y[0] = 0xab D: z.y[1] = 0xab 9. Cho kiu hp:
union U { char x[1]; int y[2]; float z[3]; } u;

Chn cu ng nht trong cc cu sau: A: sizeof(U) = 1+2+3 = 6 B: sizeof(U) = max(sizeof(char), sizeof(int), sizeof(float)) C: sizeof(u) = max(sizeof(u.x), sizeof(u.y), sizeof(u.z)) D: b v c ng 10. Cho khai bo:
union { unsigned x; struct { unsigned char a, b; } y; } z = {0xabcd};

Gi tr ca z.y.a v z.y.b tng ng: A: 0xab, 0xcd 11. Cho khai bo:
union { struct { unsigned char a, b; } y; unsigned x;

B: 0xcd, 0xab

C: 0xabcd, 0

D: 0, 0xabcd

181

Chng 5. D liu kiu cu trc v hp

} z = {{1,2}};

Gi tr ca z.x bng: A: 513 C: Khng xc nh v khi to sai 12. Xt on lnh:


union U { int x; char y; } u; u.x = 0; u.y = 200;

B: 258 D: Khi to ng nhng z.x cha c gi tr

Tm gi tr ca u.x + u.y ? A: 122 B: 144 C: 200 D: 400 13. Cho s phc di dng cu trc gm 2 thnh phn l thc v o. Vit chng trnh nhp 2 s phc v in ra tng, tch, hiu, thng ca chng. 14. Cho phn s di dng cu trc gm 2 thnh phn l t v mu. Vit chng trnh nhp 2 phn s, in ra tng, tch, hiu, thng ca chng di dng ti gin. 15. Tnh s ngy qua k t u nm cho n ngy hin ti. Qui c ngy c khai bo di dng cu trc v n gin mt nm bt k c tnh 365 ngy v thng bt k c 30 ngy. 16. Nhp mt ngy thng nm di dng cu trc. Tnh chnh xc (k c nm nhun) s ngy qua k t ngy 1/1/1 cho n ngy . 17. Tnh khong cch gia 2 ngy thng bt k. 18. Hin th ca mt ngy bt k no , bit rng ngy 1/1/1 l th hai. 19. Hin th ca mt ngy bt k no , ly ngy th hin ti lm chun. 20. Vit chng trnh nhp mt mng sinh vin, thng tin v mi sinh vin gm h tn v ngy sinh (kiu cu trc). Sp xp mng theo tui v in ra mn hnh 21. biu din s phc c th s dng nh ngha sau:
typedef struct { float re, im; } sophuc;

Cn b sung thm trng no vo cu trc c th lp c mt danh sch lin kt cc s phc. 22. to danh sch lin kt, theo bn sinh vin no di y khai bo ng cu trc t tr s c dng: Sinh vin 1: struct SV {char ht[25]; int tuoi; struct SV *tiep;}; 182

Chng 5. D liu kiu cu trc v hp

Sinh vin 2: typedef struct SV node; struct SV {char ht[25]; int tuoi; node *tiep;}; Sinh vin 3: typedef struct SV {char ht[25]; int tuoi; struct SV *tiep;} node; A: Sinh vin 1 B: Sinh vin 2 C: Sinh vin 2 v 3 D: Sinh vin 1, 2 v 3 23. Lp danh sch lin kt cha bng ch ci A, B, C Hy o phn u t A .. M xung cui thnh N, O, Z, A, M. 24. Vit chng trnh tm ngi cui cng trong tr chi: 30 ngi xp vng trn. m vng trn (bt u t ngi s 1) c n ngi th 7 th ngi ny b loi ra khi vng. Hi ngi cn li cui cng ? 25. Gi s c danh sch lin kt m mi nt ca n lu mt gi tr nguyn. Vit chng trnh sp xp danh sch theo th t gim dn. 26. Gi s c danh sch lin kt m mi nt ca n lu mt gi tr nguyn c sp gim dn. Vit chng trnh cho php chn thm mt phn t vo danh sch sao cho danh sch vn c sp gim dn. 27. To danh sch lin kt cc s thc x1, x2, ..., xn. Gi m l trung bnh cng: x1 + x2 + ... + xn . m= n Hy in ln lt ra mn hnh cc gi tr: m, x1 - m, x2 - m, ..., xn - m. 28. S dng kiu union in ra byte thp, byte cao ca mt s nguyn.

183

Chng 6. ha v m thanh

CHNG 6

HO V M THANH
ho m thanh

I. HO
1. Khi nim ho a. im nh v phn gii

Mn hnh ch ho l tp hp cc im (pixel-picture elements) nh. S im nh v cch b tr theo chiu ngang, dc ca mn hnh c gi l phn gii (resolution). V vy phn gii thng c c trng bi mt cp s ch nh s im nh theo chiu ngang v chiu dc ca mn hnh. V d mn hnh VGA mode 2 c phn gii l 640x480, tc trn mi dng ngang ca mn hnh c th v c 640 im nh v trn mi ct dc v c 480 im nh. Cc ct v dng c nh s t 0, theo chiu t tri sang phi (i vi ct) v t trn xung di (i vi dng). Mt im nh hay cn gi l pixel l giao im ca mt ct v mt dng no trn mn hnh v v tr ca n c th hin bi cp to (x,y) vi x biu din cho ct v y biu din cho dng. V d vi mn hnh trn im nh u tin nm gc trn bn tri ca mn hnh c to (0,0) v im cui cng gc di bn phi c to (639,479). im c to (150,200) l giao im ca ct th 150 v dng 200.
b. Trnh iu khin ho

Mn hnh ho c nhiu loi khc nhau. Mi loi mn hnh cn c trnh iu khin tng ng. C cung cp cc trnh iu khin mn hnh trong th mc BGI t di th mc gc ca C (TC hoc BC) gm c: Tn trnh iu khin ATT.BGI CGA.BGI EGAVGA.BGI Kiu mn hnh ho ATT & T6300 (400 dng) IBMCGA, MCGA v cc my tng thch IBM EGA, VGA v cc my tng thch

184

Chng 6. ha v m thanh

HERC.BGI IBM8514.BGI PC3270.BGI

Hercules mono v cc my tng thch IBM 8514 v cc my tng thch IBM 3270 PC

Ngoi cc trnh iu khin trong th mc BGI cn cha cc file font ch c ui CHR gm: GOTH.CHR LITT.CHR SANS.CHR TRIP.CHR
c. Mt (mode) ho

Mi mn hnh ho c th hot ng di nhiu mt khc nhau. phn gii ca mn hnh ph thuc vo tng mt. V d mn hnh VGA c th hot ng di cc mt 0 (VGALO: phn gii thp 640x200), 1 (VGAMED: phn gii trung bnh 640x350), 2 (VGAHI: phn gii cao 640x480).
2. Vo/ra ch ho

Trong C++ cc hm lin quan n ho c khai bo trong tp <graphics.h>


a. Khi ng ch ho void initgraph(int *graphdriver, int *graphmode, char *drivepath)

drivepath: ng dn ca th mc cha cc trnh iu khin ho. Nu rng s tm trong th mc hin ti. graphdriver, graphmode: Ch nh trnh qun l v mt mn hnh cn s dng. Trong graphdriver c th nhn 1 trong cc gi tr sau: DETECT CGA EGA EGA64 EGAMONO VGA ..................... 0 1 3 4 5 9 ..

185

Chng 6. ha v m thanh

Hin nhin vic chn gi tr ca graphdriver phi tng ng vi mn hnh thc t. Trong trng hp ta khng bit chng loi thc t ca mn hnh c th s dng gi tr DETECT (hoc 0) l gi tr ch nh cho chng trnh t tm hiu v mn hnh v gi trnh iu khin tng ng. Trong trng hp ny graphmode s c gn gi tr t ng vi mode c phn gii cao nht c th. V graphmode c th nhn cc gi tr sau: CGAC0 CGAC1 CGAC2 CGAC3 CGAHI EGALO EGAHI EGA64LO EGA64HI VGALO VGAMED VGAHI 0 1 2 3 4 0 1 0 1 0 0 0 320 x 200 320 x 200 320 x 200 320 x 200 640 x 200 640 x 200 640 x 350 640 x 200 640 x 350 640 x 200 640 x 350 640 x 480 2 color 16 color 16 color 16 color 4 color 16 color 16 color 16 color

Trong qu trnh s dng xo mn hnh ho ta dng hm cleardevice();


b. Kt thc ch ho

kt thc ch ho v li ch vn bn ta s dng hm closegraph();


c. Li ho

- Sau mi thao tc ho, hm graphresult() s cho gi tr 0 nu khng c li, hoc cc gi tr m (-1 .. -18) tng ng vi li. Hm grapherrormsg(n) tr li ni dung li v m li. M li
0 -1 -2

Hng li (graphresult()) Ni dung li (grapherrormsg())


grOk grNoInitGraph grNotDetected No error (BGI) Khng c BGI Graphics hardware not detected

186

Chng 6. ha v m thanh

-3

grFileNotFound

Device driver file not found

........................................................................................................

V d 1 : V d sau y khi to ch ho vi graphdriver = 0 (DETECT) v thng bo li nu khng thnh cng hoc thng bo ch ho cng nh mode mn hnh. bit phn gii ca mn hnh c th dng cc hm getmaxx() (s ct) v getmaxy() (s dng)
void main() { int gd = DETECT, gm, maloi; initgraph(&gd, &gm, "C:\\BC\\BGI"); maloi = graphresult(); if (maloi != grOk) { cout << "Li: " << grapherrormsg(maloi)) << endl; cout << "An phm bt k dng "; getch(); exit(1); } else { cout << "Ch mn hnh = " << gd << endl; cout << "Mode mn hnh = " << gm << endl; cout << " phn gii: " << getmaxx() << "," << getmaxy() << endl; getch(); } closegraph(); }

Cc phn tip theo sau y s cung cp cc cu lnh v trong ch ha.


3. V im, ng, khi, mu sc a. Mu sc

getmaxcolor(): Tr li s hiu (hng) tng ng vi mu ti a ca mn hnh hin ti. Do cc hng mu c tnh t 0 nn s mu s bng hng tr li cng 187

Chng 6. ha v m thanh

thm 1. setbkcolor(mu): t mu nn. C tc dng vi vn bn v cc nt v. setcolor(mu): t mu v. C tc dng vi vn bn v cc nt v. getbkcolor(): Tr li mu nn hin ti. getcolor(): Tr li mu v hin ti (t 0 n getmaxcolor()). V d: In to ti v tr hin ti ca con tr mn hnh. Trong v d ny chng ta s dng cu lnh sprintf(xu s, "dng k", cc biu thc cn in), cu lnh ny s thay vic in cc biu thc ra mn hnh thnh in ra xu s (tc to xu s t cc biu thc). Ngoi ra hm outtextxy(x, y, s) s in xu s ti v tr (x,y).
void intoado(dx, dy, color) { int oldcolor; oldcolor = getcolor(); setcolor(color); char td[10]; sprintf(td, "(%d, %d)", getx(), gety()); outtextxy(getx()+dx, gety()+dy, td); setcolor(oldcolor); } b. V im

putpixel(x, y, c): V im (x, y) vi mu c. getpixel (x, y): Tr li mu ti im (x, y). V d 2 : V bu tri sao
void sky() { int maxx, maxy, maxc; int i, xarr[3001], yarr[3001]; maxx = getmaxx(); maxy = getmaxy(); maxc = getmaxcolor();

188

Chng 6. ha v m thanh

randomize(); for (i=1;i<3001;i++) {xarr[i]=random(maxx);yarr[i]=random(maxy);} while (!kbhit()) { for (i=1;i<3001;i++) { putpixel(xarr[i], yarr[i], random(maxc));delay(1); } for (i=1;i<3001;i++) if (getpitxel(xarr[i], yarr[i]) == random(maxc)) putpitxel(xarr[i], yarr[i], 0); } } c. V ng thng v gp khc

line(x1, y1, x2, y2): V ng thng t (x1, y1) n (x2, y2). Con tr mn hnh vn ng ti v tr c. lineto(x, y): V ng thng t v tr hin ti ca con tr n v tr (x, y). con tr chuyn v (x, y). linerel(dx, dy): Gi (x, y) l v tr hin ti ca con tr, lnh ny s v ng thng ni (x, y) vi im mi c ta (x+dx, y+dy). Tc lnh ny cng tng ng vi lnh lineto(getx()+dx, gety()+dy), trong getx() v gety() l hai hm tr li v tr x, y hin ti ca con tr. Lnh linerel sau khi thc hin xong s t con tr ti v tr cui ca ng thng va v. V d 3 : V hnh bao th bng 1 nt.
void baothu() { setbkcolor(1); setcolor(YELLOW); moveto(100, 100); lineto(300, 100); lineto(300, 200); lineto(100, 200); lineto(100, 100); lineto(200, 50); lineto(300, 100); }

189

Chng 6. ha v m thanh

rectangle(x1, y1, x2, y2): V hnh khung ch nht vi gc trn bn tri c ta (x1, y1) v gc di bn phi c ta (x2, y2). bar(x1, y1, x2, y2): V hnh ch nht c. Mu khung c t bi setcolor v mu nn ln mu t nn c t bi lnh setlinestyle. Mu nn ngm nh l c v mu l getmaxcolor. bar3d(x1, y1, x2, y2, c, top): V hnh tr ch nht vi y l (x1, y1, x2, y2) v cao c, nu top = 1 hnh s c np v nu top = 0 hnh khng c np. V d : V cc hnh khi ch nht vi mu nn v mu t khc nhau.
void main() { int gdriver = DETECT, gmode; initgraph(&gdriver, &gmode, "c:\\borlandc\\bgi"); int midx = getmaxx() / 2; int midy = getmaxy() / 2; for (int i=SOLID_FILL; i<USER_FILL; i++) { setfillstyle(i, i); bar3d(midx-50, midy-50, midx+50, midy+50, 100, 0); getch(); } closegraph(); }

Ghi ch: xo im hoc ng ta v li im hoc ng bng mu nn hin ti. bit mu nn hin ti ta s dng hm getbkcolor().
d. Cc thuc tnh v ng (kiu ng, rng)

setlinestyle(style, pattern, width): t cc thuc tnh v ng v, trong style l kiu ng, pattern l mu t v width l m ca ng v. Cc thuc tnh ny c gii thch bn di. getlinesettings(struct linesettingstype *info): Ly cc thuc tnh v ng v hin ti cho vo bin c tr bi info. Kiu ca bin cha cc thuc tnh ng v:

190

Chng 6. ha v m thanh

struct linesettingstype { int linetsyle; int upattern; int thickness; }

Cc hng s qui nh cc kiu ng (style):


style: SOLID_LINE = 0 DOTTED_LINE = 1 CENTER_LINE = 2 DASHED_LINE = 3 USERBIT_LINE = 4, // Kiu ng do NSD nh ngha

pattern: Do NSD nh ngha theo 2 byte cho mt ng. Ch c tc dng khi style = 4. Cc hng s qui nh m ( dy) ca ng (width):
NORM_WIDTH = 1 THICK_WIDTH = 3

V d 4 :
void netve() { char *lname[] = {"Duong lien net", "Duong cham cham", "Duong trung tam", "Duong dut net", "Duong do NSD dinh nghia" }; int style, midx, midy, mauNSD; midx = getmaxx() / 2; midy = getmaxy() / 2; // Mu ng c nh ngha bi NSD "0000000000000001" mauNSD = 1; for (style=SOLID_LINE; style<=USERBIT_LINE; style++) { setlinestyle(style, mauNSD, 1); line(0, 0, midx-10, midy); rectangle(0, 0, getmaxx(), getmaxy()); outtextxy(midx, midy, lname[style]);

191

Chng 6. ha v m thanh

line(midx, midy+10, midx+8*strlen(lname[style]), midy+10); getch(); cleardevice(); } } e. Cc thuc tnh v hnh (mu t, mu t)

setfillstyle(mu t, mu t): t mu t, mu t setfillpattern(mu t, mu t): nh ngha mu t. getfillsettings(struct fillsettingstype *info): Ly mu t hin ti


struct fillsettingstype { int pattern; int color; };

getfillpattern(mu t): Tr li mu t hin do NSD nh ngha. L mt con tr tr n mng 8 k t. Sau y l mt s mu t v cc hng tng ng
EMPTY_FILL SOLID_FILL LINE_FILL LTSLASH_FILL SLASH_FILL BKSLASH_FILL LTBKSLASH_FILL HATCH_FILL XHATCH_FILL INTERLEAVE_FILL WIDE_DOT_FILL CLOSE_DOT_FILL USER_FILL 0 1 2 3 4 5 6 7 8 9 10 11 12

V d 5 : t mu t.
char caro[8] = {0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55};

192

Chng 6. ha v m thanh

maxx = getmaxx(); maxy = getmaxy(); setfillpattern(caro, getmaxcolor()); // T mn hnh theo mu bar(0, 0, maxx, maxy); getch(); f. V a gic

drawpoly(s nh, v tr nh): V ng a gic theo setlinestyle; fillpoly(s nh, v tr nh): V hnh a gic c theo setfillstyle; V tr nh l con tr tr n dy cc to , thng thng dng mng. v a gic ng phi a ra n+1 to trong to n = to 0. V d 6 :
int poly[10]; poly[0] = 20; poly[1] = maxy / 2; poly[2] = maxx - 20; poly[3] = 20; poly[4] = maxx - 50; poly[5] = maxy - 20; poly[6] = maxx / 2; poly[7] = maxy / 2; poly[8] = poly[0]; poly[9] = poly[1]; // v a gic drawpoly(5, poly); g. V ng cong // nh th nht // nh th hai // nh th ba // nh th t

arc(x, y, gc u, gc cui, bn knh): V cung trn c tm (x, y) vi cc gc v bn knh tng ng. circle(x, y, bn knh): V ng trn c tm ti (x, y). pieslice(x, y, gc u, gc cui, bn knh): V hnh qut trn c vi mu hin ti; ellipse(x, y, gc u, gc cui, bkx, bky): V cung elip vi tm, cc gc v cc bn knh theo hong v tung tng ng. fillellipse(x, y, bkx, bky): V hnh elip c. sector(x, y, gc u, gc cui, bkx, bky): V hnh qut elip.

193

Chng 6. ha v m thanh

Ch : Nu gc u = 0 v gc cui = 360 cung, lnh trn s v ng trn hoc elip. V d 7 : V ng trn v elip.
arc(200, 200, 45, 135, 100) ; arc(200, 200, 0, 360, 100) ; circle(200, 200, 100) ; ellipse(200, 200, 45, 135, 100, 80) ; ellipse(200, 200, 0, 360, 100, 80) ; setfillstyle(EMPTY_FILL, getmaxcolor()); pieslice(200, 200, 45, 135, 100) ; fillellipse(200, 200, 0, 360, 100, 80) ; setfillstyle(SOLID_FILL, getmaxcolor()); pieslice(200, 200, 45, 135, 100); circle(200, 200, 100); fillellipse(200, 200, 0, 360, 100, 80); sector(200, 200, 45, 135, 100, 80); h. T mu // hnh qut trn; // hnh trn; // hnh elip; // hnh qut elip // ng qut trn // ng elip // cung trn // ng trn // ng trn // cung elip // ng elip;

floodfill(x, y, c): T mu mt hnh kn cha im x, y v mu vin c. Mu dng t c t bi hm setfillstyle(kiu t, mu t). V d:


void fill() { rectangle(100, 100, 180, 140); setfillstyle(1, BLUE); floodfill(120, 120, 15); drawpoly(4, tg); setfillstyle(2, RED); floodfill(180, 200, 15); circle(380, 210, 100); setfillstyle(3, GREEN); floodfill(380, 210, 15); // V hnh ch nht // Mu t c, mu xanh // T hnh ch nht v

int tg[8] = {150, 120, 180, 280, 350, 180, 150, 120};

194

Chng 6. ha v m thanh

} void fill2() { int i, x = 0, y = 0, r = 0; for (i=1;i<10;i++) { r = 10*i; y = x += r; circle(x, y, r); setfillstyle(i, i); floodfill(x, y, 15); } } 4. Vit vn bn trong mn hnh ha a. Vit vn bn outtext(s) ; outtextxy(x, y, s) ; // V v t mu dy ng trn lin tip

Cu lnh trn cho php vit xu k t ti v tr con tr trn mn hnh ha. Cu lnh tip theo cho php vit s ra ti v tr (x, y). V tr con tr sau khi thc hin outtext(s) s t ti v tr cui ca xu c in trong khi v tr con tr sau khi thc hin lnh outtextxy(x, y, s) l khng thay i. V d sau in ra mn hnh ha dng ch "y l chng trnh minh ha lnh outtext(s)" ti v tr (100, 20):
moveto(100, 20) ; outtext("y l chng trnh ") ; outtext("minh ha lnh ") ; outtext("outtext(s)") ; // chuyen con tro den cot 100, dong 20 outtext("y l chng trnh minh ha lnh outtext(s)") ; hoc

hoc dng vn bn trn cng c th c in bi lnh outtextxy(x, y, s);


outtextxy(100, 20, "y l chng trnh minh ha lnh outtextxy(x, y, s)"); b. iu chnh font, hng v c ch settextstyle(Font, Hng, C ch);

195

Chng 6. ha v m thanh

a. Font : Gm cc loi font tng ng vi cc hng sau y:


DEFAULT_FONT SMALL_FONT TRIPLEX_FONT SANS_SERIF_FONT GOTHIC_FONT 0 1 2 3 4

Hng : hng vit theo kiu nm ngang hay thng ng, tng ng vi cc hng:
HOIRIZ_DIR VERT_DIR 0 1

C ch : Gm cc c ch nh s tng dn t 1. C ch ngm nh l 1. V d sau ln lt in ti tm mn hnh tn ca cc font vi cc c ch ln dn, theo hng nm ngang.


#include <graphics.h> #include <stdlib.h> #include <stdio.h> #include <conio.h> void main() { char *fname[] = {"ngm nh", "Triplex", "Small", "Sans Serif", "Gothic" }; int gdriver = DETECT, gmode; int font, midx, midy; int size = 1; initgraph(&gdriver, &gmode, "C:\\Borlandc\\BGI"); midx = getmaxx() / 2; midy = getmaxy() / 2; for (font = DEFAULT_FONT; font <= GOTHIC_FONT; font++) { cleardevice(); size = font; settextstyle(font, HORIZ_DIR, size); outtextxy(midx, midy, fname[font]);

196

Chng 6. ha v m thanh

getch(); } closegraph(); } c. iu chnh cch vit

Theo mi hng (nm ngang hay thng ng) c 3 cch vit tng ng vi cc hng s sau: 1. Theo hng nm ngang: LEFT_TEXT = 0 : Vit t tri sang phi. CENTER_TEXT = 1 : Vit t v tr con tr sang hai bn. RIGHT_TEXE = 2 : Vit t phi sang tri. 2. Theo hng thng ng: BOTTOM_TEXT = 0 : Vit t di ln. CENTER_TEXT = 1 : Vit t v tr con tr ln trn v xung di. TOP_TEXT = 2. Vit t trn xung. ch nh mt trong cc cch vit trn ta dng lnh settextjustify(Theo hng ngang, Theo hng dc);
5. Chuyn ng

Nguyn tc: xa hnh v tr c ri v li hnh ti v tr mi theo hng chuyn ng. xo, ta v li hnh ngay ti v tr c nhng vi mu v trng vi mu nn (do hnh v b chm vo nn ging nh b xa). bit mu nn hin ti c th dng hm setcolor(getbkcolor()). Tm li c th a ra s nh sau:
v li hnh vi mu nn ti v tr c delay // xa hnh // tm dng

v li hnh (vi mu ca hnh) ti v tr mi // hnh chuyn n v tr khc

Cc bc trn nu c lp i lp li ta s thy hnh chuyn ng t v tr ny n v tr khc. i vi cc hnh v phc tp, xa nhanh ta c th v li hnh trong ch XOR_PUT nh c trnh by trong phn sau. Chng ta hy xem qua mt s hm phc tp hn v hnh.

197

Chng 6. ha v m thanh

setviewport(x1, y1, x2, y2, clip): To mt ca s mi trong ch ho. Khi ta ca cc im s c tnh li theo ca s mi ny. C th im (x1, y1) ca mn hnh by gi s li c tnh vi ta mi l (0,0). Nu clip = 0 s cho php cc hnh v c m rng khi khung ca s, nu clip = 1 cc phn ca hnh v nm ngoi khung ca s s b ct. getviewsettings(struct viewporttype *vp): Ly to ca s hin ti vo bin con tr vp. Kiu ca cu s l mt cu trc nh sau:
struct viewporttype {int left, top, right, bottom, clip;};

imagesize(x1, y1, x2, y2): Cho li kch thc (byte) ca mt nh bitmap trong khung ch nht c xc nh bi cc ta (x1, y1, x2, y2). getimage(x1, y1, x2, y2, *pict): Lu nh t mn hnh vo vng b nh c tr bi con tr pict. putimage(x1, y1, *pict, op): Ghi ra mn hnh nh c lu ti v tr con tr pict. op l ch qui nh vic hin nh ln mn hnh, mu ca cc im s c qui nh thng qua mu ca nh c lu trong pict v mu hin ti ca im trn mn hnh. Hai mu ny s "trn" theo cc php ton qui nh bi op di y cho ra mu v ca nh:
COPY_PUT = 0 XOR_PUT = 1 OR_PUT = 2 AND_PUT = 3 NOT_PUT = 4 Sn cu th Hoc loi tr (ging nhau th bng 0). xa nh ta c th v li chng vi ch ny. Hoc V Not

V d 8 : V bnh xe xoay
void bx(int x, int y, int r, float phi, int xoa) { int i, x1, x2, y1, y2; if (xoa) setcolor(BLACK); circle(x, y, r); for (i=0; i<6; i++) { x1 = x+int(r*cos(phi)); y1 = y-int(r*sin(phi)); x2 = x-int(r*cos(phi)); y2 = y+int(r*sin(phi)); line(x1, y1, x2, y2); // v cc nan hoa // t mu v bng mu nn // v vnh bnh xe // xo nh nu xoa = 1

198

Chng 6. ha v m thanh

phi = phi + pi/3; } setcolor(WHITE); } void xoay() { int i, x, y, r; static float phi = 0; x = midx; y = midy; r = 100; while (!kbhit()) { bx(x, y, r, phi, 0); delay(100); bx(x, y, r, phi, 1); phi = phi-pi/72; } }

// lch nhau 600

// v bnh xe // tm dng // xa bnh xe // xoay i mt gc phi

V d 8 : V bnh xe ln trn ng nm ngang


void lan() { int i, x, y, r; float phi=0; x = 0; y = maxy-110; r = 60; setlinestyle(SOLID_LINE, 1, 3); line(0, maxy-50, maxx, maxy-50); setlinestyle(SOLID_LINE, 1, 1); while (x-r<=maxx) { bx(x, y, r, phi, 0); delay(20); bx(x, y, r, phi, 1); x += 1; } phi = phi-pi/72;

199

Chng 6. ha v m thanh

} 6. V th ca cc hm ton hc

v th ca mt hm ton hc, ta v tng im mt ca th. Mi im c xc nh bi cp ta (x, y) trn mn hnh. Do vy cn tnh cc im ny theo ta trn mn hnh. Cc bc cn lm gm c: Xc nh h trc ta . Thng thng ta s ly tm mn hnh lm tm h trc bng vic xc nh li ca s mn hnh bi cu lnh:
viewport(midx, midy, maxx, maxy, 0);

trong midx, midy l ta tm mn hnh, maxx, maxy l ta gc di bn phi ca mn hnh. Cu lnh trn to mt ca s l phn t bn phi, pha di ca mn hnh. Tham tr cui (1) cho php cc hnh v s c v ra ngoi khung ca s ny. Nh vy tm mn hnh s bin thnh tm ca h trc ta . Ta ca tm mn hnh by gi c tnh l (0,0). Xc nh t l: Cn xc nh mt n v ca x v y ca hm cn v s tng ng vi bao nhiu im trn trc x v y ca mn hnh. Do s im theo chiu rng v chiu cao ca mn hnh khc nhau v do gi tr ca hm (y) c th rt ln so vi gi tr ca i (x) (v d hm y = x4) hoc rt b (v d hm y = sinx) nn cc t l ny theo x v y c th khc nhau hnh v trn mn hnh c cn i. Vic xc nh cc t l ny ph thuc vo kinh nghim v thng c iu chnh sau khi chy th chng trnh. V h trc : C th v h trc ta hay khng. Hm sau cho php v cc trc ta vi tm nm gia mn hnh.
void vetruc() { line(0, midy, maxx, midy); line(maxx-7, midy-3, maxx, midy); line(maxx-7, midy+3, maxx, midy); line(midx, 0, midx, maxy); line(midx-3, 7, midx, 0); line(midx+3, 7, midx, 0); outtextxy(midx+6, midy+6, "(0, 0)"); } // in toa do (0,0) // truc tung // mui ten // truc hoanh // mui ten // Ve truc toa do

200

Chng 6. ha v m thanh

Cc v d sau s v th ca mt s hm quen thuc.


void Sinx() { int tileX = 20, tileY = 60; int x, y, i; setviewport(midx, midy, maxx, maxy, 0); for (i = -400; i<=400; i++) { x = 2*pi*i*tileX/200; y = sin(2*pi*i/200)*tileY; putpixel(x, y, 1); } setviewport(0, 0, maxx, maxy, 0); } void Sinoverx() { float t; float tileX = 50/pi; float tileY = 80; int x, y; for (x = 30; x < maxx-30; x++) { t = ((x==midx)? 1 : (x-midx))/tileX; y = midy - int(sin(t)/t*tileY); putpixel(x, y, 2); } } Ve do thi theo tham so (x = x(t), y = y(t)) void Hypocycloide() { // Ham x = cos3t, y = sin3t // t [0, 2] // Ham Sinx/x // T l theo X v Y // Do thi ham Sinx

201

Chng 6. ha v m thanh

float t; int i, x, y; for (i = 0; i<1000; i++) { t = (pi/500)*i; x = int(120*pow(cos(t), 3)) + midx; y = int(120*pow(sin(t), 3)) + midy; putpixel(x, y, 3); } } void Trocoide() { float t; int i, x, y; for (i = -1000; i<=1000; i++) { t = 0.01*i; x = int(15*(2*t-3*sin(t))) + midx; y = -int(10*(2-3*cos(t))) + midy; putpixel(x, y, 4); } } void So3() { float t; int i, x, y; for (i = 0; i<=1000; i++) { t = (pi/500)*i; x = int(150*(sin(t)*(1+cos(t)*cos(t)))) + midx; y = int(200*sin(t)*sin(t)*cos(t)) + midy; putpixel(x, y, 5); } } // x = sintcos2t + sint // y = sin2tcost, t [0, 2] // Ham (2t-3sint, 2-3cost) // t [-9, 9]

202

Chng 6. ha v m thanh

Ve do thi theo toa do cuc r = () void Archimede() { int i, x, y; float r, t; for (i = 0;i<=2500;i++) { t = 0.02*i; x = int(3*t*cos(t))+midx; y = -int(3*t*sin(t))+midy; putpixel(x, y, 6); } } void Hoahong() { int i, x, y; float r, t; for (i = 0;i<=2000;i++) { t = (pi/500)*i; x = int(150*(sin(2*t)*cos(t)))+midx; y = int(150*sin(2*t)*sin(t))+midy; putpixel(x, y, 7); } } // Ham r = sin2, [0, 2] // Ham r = , [0, 40]

Chng trnh di y cho php v hai mt trong khng gian 3 chiu c cho sin( x 2 + y 2 ) bi hai hm f = sinx.siny v g = x2 + y2
typedef struct TOADO { int OX, OY, UX, UY, UZ; // truc hoanh, tung va don vi cac truc double Xx, Xy; // goc (OX, ox), (OY, oy)

203

Chng 6. ha v m thanh

}; TOADO gr3 = { 320, 20, 20, 20, 20, 0.8*pi, 0.2*pi }; void Vetruc() { setviewport(0, 0, maxx, maxy, 0); settextstyle(DEFAULT_FONT, HORIZ_HUONG, 0); setcolor(WHITE); line(0, midy, maxx, midy); line(maxx-7, midy-3, maxx, midy); line(maxx-7, midy+3, maxx, midy); line(midx, 0, midx, maxy); line(midx-3, 7, midx, 0); line(midx+3, 7, midx, 0); outtextxy(midx+6, midy+6, "(0, 0)"); outtextxy(maxx-18, midy+6, "x"); outtextxy(midx+8, 6, "y"); setbkcolor(CYAN); setcolor(RED); settextstyle(TRIPLEX_FONT, HORIZ_HUONG, 2); outtextxy(10, 0, "DO THI KHONG GIAN 3 CHIEU"); } int X(double x, double y, double z) { return gr3.OX + x*gr3.UX*cos(gr3.Xx) + y*gr3.UY*cos(gr3.Xy); } int Y(double x, double y, double z) { return gr3.OY + x*gr3.UX*sin(gr3.Xx) + y*gr3.UY*sin(gr3.Xy) z*gr3.UZ; } double f(double x, double y) { return 4*sin(x)*sin(y); } // Ham f(x, y) can ve // doi toa do xyz sang truc Y // doi toa do xyz sang truc X // Ve truc Ox, Oy

204

Chng 6. ha v m thanh

double g(double x, double y) {

// Ham g(x, y) can ve

return 5*sin(sqrt(x*x+y*y))/sqrt(x*x+y*y); } void Vehamf() { double x, y, z; double xa = -6.28, xb = 6.28; double ya = -6.28, yb = 6.28; double xp = 0.2, yp = 0.2; int mat[8]; settextstyle(TRIPLEX_FONT, HORIZ_HUONG, 1); outtextxy(10, 20, "Ham z = sinx.siny"); setviewport(0, midy, maxx, maxy, 0); for (x = xa; x <= xb; x+=xp) for (y = ya; y <= yb; y+=yp) { if (kbhit()) return; z = f(x, y); z = f(x, y+yp); z = f(x+xp, y+yp); z = f(x+xp, y); if ((mat[3]-mat[1]) * (mat[6]-mat[0]) (mat[7]-mat[1]) * (mat[2]-mat[0]) < 0) setfillstyle(1, YELLOW); else setfillstyle(1, GREEN); fillpoly(4, mat); delay(10); // diem A // diem B // diem C // diem D mat[0] = X(x, y, z); mat[1] = Y(x, y, z); mat[2] = X(x, y+yp, z); mat[3] = Y(x, y+yp, z); mat[4] = X(x+xp, y+yp, z); mat[5] = Y(x+xp, y+yp, z); mat[6] = X(x+xp, y, z); mat[7] = Y(x+xp, y, z); // ve mat an

205

Chng 6. ha v m thanh

} getch(); } void Vehamg() { double x, y, z; double xa = -10, xb = 10; double ya = -10, yb = 10; double xp = 0.1, yp = 0.1; settextstyle(TRIPLEX_FONT, HORIZ_DIR, 1); outtextxy(10, 20, "Ham z = sin(sqrt(x*x+y*y))"); outtextxy(100, 30, "------------"); outtextxy(115, 40, "sqrt(x*x+y*y)"); setviewport(0, midy, maxx, maxy, 0); setcolor(BLUE); for (x = xa; x <= xb; x+=xp) for (y = ya; y <= yb; y+=yp) { if (kbhit()) return; z = g(x, y); lineto(X(x, y, z), Y(x, y, z)); delay(10); } getch(); } void main() { Initgraph(); Vetruc(); Vehamf(); cleardevice(); Vetruc(); Vehamg(); closegraph(); }

206

Chng 6. ha v m thanh

II. M THANH m thanh c c trng bi cao (tn s) v trng ( di). Vic to ra mt chui m (bi ht chng hn), l s kt hp lp i lp li ca cc hm sau vi cc tham s n v t c chn thch hp. sound(n): pht m ra loa my tnh vi tn s n. delay(t): ko di trong t miligiy. nosound(): tt m thanh pht. V d 1 : Ting ci bo ng
void coi(int cao; int thap) { do { sound(cao); delay(400); sound(thap); delay(400); } while (!kbhit()) nosound(); }

V d 2 : Ting bng ny
void bong(int cao; int thap) { int sodem = 20; while (sodem > 1) { sound(thap-2*sodem); delay(sodem*500/20); nosound(); delay(100); sound(cao); delay(sodem*500/15); nosound(); delay(150); sodem --; } }

207

Chng 6. ha v m thanh

V d 3 : Ting bom
void bong(int cao; int thap; int t) { int sodem = thap; while (sodem <= cao) { sound(sodem); delay(t/sodem*75); sodem += 10; } for (sodem =1 to 3) { nosound(); sound(40); delay(500); nosound(); delay(100); } sound(40); delay(3000); nosound(); }

to m pht ca mt nt nhc c tn s (cao ) n v di trong t miligiy cn vit hm :


void not(unsigned n, float t); { sound(n); delay(t); nosound(); }

V d 4 : Chi bi ht Tin qun ca trn nn c sao vng.


#include <stdio.h> #include <stdlib.h> #include <graphics.h> #include <dos.h> // cao ca cc nt nhc

#define do1 #define red1

66 78

#define dod1 #define mi1

70 82

#define re1 #define fa1

73 86

208

Chng 6. ha v m thanh

#define #define #define #define #define #define #define #define #define #define #define #define #define #define #define

fad1 la1 do2 re2 fa2 sold2 si2 re3 fa3 sold3 si3 re4 fa4 sold4 si4

91 108 130 148 176 209 247 297 352 415 495 594 704 836 990

#define #define #define #define #define #define #define #define #define #define #define #define #define #define #define

sol1 lad1 dod2 red2 fad2 la2 do3 red3 fad3 la3 do4 red4 fad4 la4 lang

96 #define 115 #define 139 #define 156 #define 188 #define 230 #define 264 #define 313 #define 374 #define 440 #define 528 #define 625 #define 748 #define 880 #define 30000

sold1 si1 re2 mi2 sol2 lad2 dod3 mi3 sol3 lad3 dod4 mi4 sol4 lad4

102 122 148 164 196 233 281 330 396 468 565 660 792 935

void not(unsigned caodo, float truongdo) { sound(caodo); delay(truongdo); nosound(); } void main() { int gdriver = DETECT, gmode; initgraph(&gdriver, &gmode, "c:\\borlandc\\bgi"); int star[20] = {320, 150, 285, 225, 200, 225, 270, 270, 240, 350, 320, 300, 390, 350, 360, 270, 430, 225, 345, 225}; setbkcolor(RED); setcolor(YELLOW); setfillstyle(SOLID_FILL, YELLOW); fillpoly(10, star); // Trng cc nt nhc float d = 300; float tr = 2*d; // en // trng // V l c sao vng

209

Chng 6. ha v m thanh

float tro = 4*d; float md = d/2; float mk = d/4; float m3 = d/8; float m4 = d/16; float dc = 3*d/2; float trc = 3*d; float troc = 6*d; // Choi bai TQC

// trn // mc en // mc kp // mc 3 // mc 4 // en chm // trng chm // trn chm

not(re2, d); not(mi2, d); not(re2, d); not(sol2, tr); not(sol2, tro); not(la2, d); not(sol2, d); not(si2, tr); not(si2, tro); not(la2, d); not(sol2, d); not(mi2, tr); not(sol2, tr); not(sol2, d); not(mi2, tro); not(re2, d); not(si2, d); not(re2, tro); not(sol2, d); not(la2, d); not(si2, tr); not(si2, tr); not(si2, tr); not(la2, d); not(sol2, d); not(re3, tro); not(si2, d); not(sol2, d); not(la2, tr); not(la2, tr); not(si2, tr); not(fad2, d); not(re2, d); not(sol2, tro); not(si2, d); not(do3, d); not(re3, tr); not(re3, tr); not(mi3, tro); not(re3, d); not(si2, tro); not(si2, tr); not(la2, d); not(sol2, tr); not(re2, tr); not(fad2, tr); not(fad2, d); not(la2, d); not(sol2, tr); not(si2, d); not(do3, d); not(re3, tr); not(re3, tr); not(mi3, tro); not(re3, d); not(si2, tro); not(si2, tr); not(la2, d); not(sol2, tr); not(sol2, tr); not(re2, tro); not(re3, tro); not(si2, tr); not(sol2, tr); not(mi3, tro); not(re3, tr); not(si2, d); not(la2, d); not(re2, d); not(la2, tr); not(la2, tro); not(si2, tr); not(sol2, tro); closegraph(); }

210

Chng 6. ha v m thanh

BI TP
1. 2. 3. 4. 5. V hai hnh ch nht, ln lt cho mt tng hnh, ri hin li c hai. Biu din dy 5 gi tr (c nhp t bn phm) bng biu bar. Biu din dy 5 gi tr (c nhp t bn phm) bng biu hnh qut. V mt bn c quc t vi cc en trng. Vit chng trnh v th hm s y = 100*sin(x/4.8) trong khong x [0, 60] vi gi tr mi bc x = 0,1. Yu cu : nn mn hnh mu en. trc ta mu xanh l cy th mu trng. 6. Vit chng trnh v tam gic vi cc ta nh ln lt l A(300, 20), B(100, 220), C(500, 220) v ng trn ngoi tip ca n. Yu cu : nn mn hnh mu en. cc cnh tam gic mu xanh l cy ng trn ngoi tip mu ti. 7. Vit chng trnh v hnh ch nht c ta nh gc trn bn tri l (100,150), chiu ngang 120, chiu dc 90 v ng trn ngoi tip n. Yu cu : nn mn hnh mu en. cc cnh hnh ch nht mu xanh da tri. ng trn ngoi tip mu ti. 8. 9. V tam gic ni tip trong hnh trn, hnh trn ni tip trong elip. T cc mu khc nhau cho cc min to bi cc ng trn. V mt i pht sng. Cc vng sng pht t nh ca thp tm mn hnh lan ta ra chung quanh. Qu trnh lp n khi n phm bt k th dng.

10. V hai hnh ngi i vo t 2 pha mn hnh vi tc khc nhau. Gp nhau hai hnh ngi xoay li v i ngc v 2 pha mn hnh. Chng trnh dng khi c hai i khut vo hai pha ca mn hnh.

211

Chng 7. Lp v i tng

CHNG 7

LP V I TNG
Lp trnh c cu trc v lp trnh hng i tng Lp v i tng i ca phng thc - Con tr this Hm to (contructor) Hm hy (destructor) Cc hm trc tuyn (inline)

I. LP TRNH C CU TRC V LP TRNH HNG I TNG


1. Phng php lp trnh cu trc

Lp trnh cu trc l t chc chng trnh thnh cc chng trnh con. Trong mt s ngn ng nh PASCAL c 2 kiu chng trnh con l th tc v hm, cn trong C++ ch c mt loi chng trnh con l hm. Hm l mt n v chng trnh c lp dng thc hin mt phn vic no nh: Nhp s liu, in kt qu hay thc hin mt s cng vic tnh ton. Hm cn c i v cc bin, mng cc b dng ring cho hm. Vic trao i d liu gia cc hm thc hin thng qua cc i v cc bin ton cc. Mt chng trnh cu trc gm cc cu trc d liu (nh bin, mng, bn ghi) v cc hm, th tc. Nhim v chnh ca vic t chc thit k chng trnh cu trc l t chc chng trnh thnh cc hm, th tc. V d, ta xt yu cu sau: Vit chng trnh nhp to (x,y) ca mt dy im, sau tm mt cp im cch xa nhau nht. Trn t tng ca lp trnh cu trc c th t chc chng trnh nh sau: S dng 2 mng thc ton b x v y cha to dy im. Xy dng 2 hm: Hm nhapsl dng nhp to n im, hm ny c mt i l bin nguyn n v c khai bo nh sau:
void nhapsl(int n);

Hm do_dai dng tnh di on thng i qua 2 im c ch s l i v j,

212

Chng 7. Lp v i tng

n c khai bo nh sau:
float do_dai(int i, int j);

Chng trnh C ca v d trn c vit nh sau:


#include <stdio.h> #include <conio.h> #include <math.h> float x[100],y[100]; float do_dai(int i, int j) { return sqrt(pow(x[i]-x[j],2)+pow(y[i]-y[j],2)); } void nhapsl(int n) { int i; for (i=1; i<=n; ++i) { printf("\n Nhap toa do x, y cua diem thu %d : ",i); scanf(''%f%f",&x[i],&y[i]); } } void main() { int n, i, j, imax,jmax; float d, dmax; printf(''\n So diem N= ''); scanf(''%d'', &n); nhapsl(n); dmax=do_dai(1,2);imax=1; jmax=2; for(i=1; i<=n-1; ++i) for (j=i+1; j<=n; ++j) { d=do_dai(i,j); if (d>dmax)

213

Chng 7. Lp v i tng

{ dmax=d; imax=i; jmax=j; } } printf(''\nDoan thang lon nhat co do dai bang: %0.2f",dmax); printf(''\n Di qua 2 diem co chi so la %d va %d'',imax,jmax); getch(); } 2. Phng php lp trnh hng i tng

L lp trnh c cu trc + tru tng ha d liu. C ngha chng trnh t chc di dng cu trc. Tuy nhin vic thit k chng trnh s xoay quanh d liu, ly d liu lm trung tm. Ngha l tr li cu hi: Chng trnh lm vic vi nhng i tng d liu no, trn cc i tng d liu ny cn thao tc, thc hin nhng g. T gn vi mi i tng d liu mt s thao tc thc hin c nh ring ca i tng d liu , iu ny s qui nh cht ch hn nhng thao tc no c thc hin trn i tng d liu no. Khc vi lp trnh cu trc thun ty, trong d liu c khai bo ring r, tch ri vi thao tc x l, do vic x l d liu thng khng thng nht khi chng trnh c xy dng t nhiu lp trnh vin khc nhau. T lp trnh hng i tng c xy dng da trn c trng chnh l khi nim ng gi. ng gi l khi nim trung tm ca phng php lp trnh hng i tng, trong d liu v cc thao tc x l n s c qui nh trc v "ng" thnh mt "gi" thng nht, ring bit vi cc d liu khc to thnh kiu d liu vi tn gi l cc lp. Nh vy mt lp khng ch cha d liu bnh thng nh cc kiu d liu khc m cn cha cc thao tc x l d liu ny. Cc thao tc c khai bo trong gi d liu no ch x l d liu trong gi v ngc li d liu trong mt gi ch b tc ng, x l bi thao tc khai bo trong gi . iu ny to tnh tp trung cao khi lp trnh, mi i tng trong mt lp s cha cng loi d liu c ch nh v cng c x l bi cc thao tc nh nhau. Mi lp trnh vin khi lm vic vi d liu trong mt gi u s dng cc thao tc nh nhau x l d liu trong gi . C++ cung cp cch thc to mt cu trc d liu mi th hin cc gi ni trn, cu trc d liu ny c gi l lp. minh ho cc khi nim va nu v kiu d liu lp ta tr li xt bi ton tm di ln nht i qua 2 im. Trong bi ton ny ta gp mt thc th l dy im. Cc thnh phn d liu ca lp dy im gm: Bin nguyn n l s im ca dy Con tr x kiu thc tr n vng nh cha dy honh

214

Chng 7. Lp v i tng

Con tr y kiu thc tr n vng nh cha dy tung Cc phng thc cn a vo theo yu cu bi ton gm: Nhp to mt im Tnh di on thng i qua 2 im Di y l chng trnh vit theo thit k hng i tng.
#include <stdio.h> #include <conio.h> #include <math.h> #include <alloc.h> class daydiem { int n; float *x,*y; public: float do_dai(int i, int j) { return sqrt(pow(x[i]-x[j],2)+pow(y[i]-y[j],2)); } void nhapsl(void); }; void daydiem::nhapsl(void) { int i; printf(''\n So diem N= ''); scanf("%d'',&n); x = (float*)malloc((n+1)*sizeof(float)); y = (float*)malloc((n+1)*sizeof(float)); for (i=1; i<=n; ++i) { printf(''\n Nhap toa do x, y cua diem thu %d : '',i); scanf(''%f%f'',&x[i],&y[i]); } }

215

Chng 7. Lp v i tng

void main() { clrscr(); daydiem p; p.nhapsl(); int n,i,j,imax,jmax; float d,dmax; n = p.n; dmax=p.do_dai(1,2);imax=1; jmax=2; for (i=1;i<=n-1;++i) for (j=i+1;j<=n;++j) { d=p.do_dai(i,j); if (d>dmax) { dmax=d; imax=i; jmax=j; } } printf(''\n Doan thang lon nhat co do dai bang: %0.2f",dmax); printf(''\n Di qua 2 diem co chi so la %d va %d" , imax,jmax); getch(); }

II. LP V I TNG Trong lp trnh hng i tng, lp (class) l mt khi nim rt quan trng, n cho php gii quyt cc vn phc tp ca vic lp trnh. Mt lp n (c nh ngha nh struct, union, hoc class) bao gm cc hm v d liu c lin quan. Cc hm ny l cc hm thnh phn (member functon) hay cn l phng thc (method), th hin tc ng ca lp c th c thc hin trn d liu ca chnh lp (data member). Cng ging nh cu trc, lp c th xem nh mt kiu d liu. V vy lp cn gi l kiu i tng v lp c dng khai bo cc bin, mng i tng (nh th dng kiu int khai bo cc bin mng nguyn). Nh vy t mt lp c th to ra (bng cch khai bo) nhiu i tng (bin,

216

Chng 7. Lp v i tng

mng) khc nhau. Mi i tng c vng nh ring ca mnh v v vy ta cng c th quan nim lp chnh l tp hp cc i tng cng kiu.
1. Khai bo lp

khai bo mt lp, ta s dng t kho class nh sau:


class tn_lp { // Khai bo cc thnh phn d liu (thuc tnh) // Khai bo cc phng thc (hm) };

Ch : Vic khai bo mt lp khng chim gi b nh, chcc i tng ca lp mi thc s chim gi b nh. Thuc tnh ca lp c th l cc bin, mng, con tr c kiu chun (int, float, char, char*, long,...) hoc kiu ngoi chun nh ngha trc (cu trc, hp, lp,...). Thuc tnh ca lp khng th c kiu ca chnh lp , nhng c th l con tr ca lp ny, v d:
class A { A x; A* p ; }; 2. Khai bo cc thnh phn ca lp (thuc tnh v phng thc) a. Cc t kha private v public //Khng cho php, v x c kiu lp A //Cho php , v p l con tr kiu lp A

Khi khai bo cc thnh phn d liu v phng thc c th dng cc t kho private v public quy nh phm vi s dng ca cc thnh phn ny. Trong t kha private qui nh cc thnh phn (c khai bo vi t kha ny) ch c s dng bn trong lp (trong thn cc phng thc ca lp). Cc hm bn ngoi lp (khng phi l phng thc ca lp) khng c php s dng cc thnh phn ny. c trng ny th hin tnh che giu thng tin trong ni b ca lp, n c cc thng tin ny cn phi thng qua chnh cc thnh phn hm ca lp . Do vy thng tin c tnh ton vn cao v vic x l thng tin (d liu) ny mang tnh thng nht hn v hu nh d liu trong cc lp u c khai bo vi t kha ny. Ngc li vi private, cc thnh phn c khai bo vi t kha public c php s dng c bn trong v bn ngoi lp, iu ny cho php trong chng trnh c th s dng cc hm ny truy nhp n d liu ca lp. Hin nhin nu cc thnh phn d liu khai bo l privte th cc thnh phn hm phi c t nht mt vi hm c khai bo dng public chng trnh c th truy cp c, nu khng

217

Chng 7. Lp v i tng

ton b lp s b ng kn v iu ny khng gip g cho chng trnh. Do vy cch khai bo lp tng i ph bin l cc thnh phn d liu c dng private v thnh phn hm di dng public. Nu khng quy nh c th (khng dng cc t kho private v public) th C++ hiu l private.
b. Cc thnh phn d liu (thuc tnh)

c khai bo nh khai bo cc thnh phn trong kiu cu trc hay hp. Bnh thng cc thnh phn ny c khai bo l private bo m tnh giu kn, bo v an ton d liu ca lp khng cho php cc hm bn ngoi xm nhp vo cc d liu ny.
c. Cc phng thc (hm thnh vin)

Thng khai bo l public chng c th c gi ti (s dng) t cc hm khc trong chng trnh. Cc phng thc c th c khai bo v nh ngha bn trong lp hoc ch khai bo bn trong cn nh ngha c th ca phng thc c th c vit bn ngoi. Thng thng, cc phng thc ngn c vit (nh ngha) bn trong lp, cn cc phng thc di th vit bn ngoi lp. Mt phng thc bt k ca mt lp, c th s dng bt k thnh phn (thuc tnh v phng thc) no ca lp v bt k hm no khc trong chng trnh (v phm vi s dng ca hm l ton chng trnh). Gi tr tr v ca phng thc c th c kiu bt k (chun v ngoi chun) V d sau s minh ho cc iu ni trn. Chng ta s nh ngha lp m t v x l cc im trn mn hnh ho. Lp c t tn l DIEM. Cc thuc tnh ca lp gm:
int x ; int y ; int m ; // Honh (ct) // Tung (hng) // Mu

Cc phng thc: Nhp d liu mt im Hin th mt im n mt im Lp im c xy dng nh sau:


#include <iostream.h> #include <graphics.h> class DIEM {

218

Chng 7. Lp v i tng

private: int x, y, m ; public: void nhapsl() ; void hien() ; void an() { putpixel(x, y, getbkcolor());} }; void DIEM::nhapsl() { cout <<"\n Nhap hoanh do (cot) va tung do (hang) cua diem: ''; cin >> x >> y ; cout << ''\n Nhap ma mau cua diem: ''; cin >> m ; } void DIEM::hien() { int mau_ht ; mau_ht = getcolor(); putpixel(x, y, m); setcolor(mau_ht); }

Qua v d trn c th rt ra mt s ch sau: + Trong c 3 phng thc (d vit trong hay vit ngoi nh ngha lp) u c php truy nhp n cc thuc tnh x, y v m ca lp. + Cc phng thc vit bn trong nh ngha lp (nh phng thc an() ) c vit nh mt hm thng thng. + Khi xy dng cc phng thc bn ngoi lp, cn dng thm tn lp v ton t phm vi :: t ngay trc tn phng phc quy nh r y l phng thc ca lp no.
3. Bin, mng v con tr i tng

Nh ni trn, mt lp (sau khi nh ngha) c th xem nh mt kiu i tng v c th dng khai bo cc bin, mng i tng. Cch khai bo bin, mng i tng cng ging nh khai bo bin, mng cc kiu khc (nh int, float,

219

Chng 7. Lp v i tng

cu trc, hp,...), theo mu sau:


Tn_lp danh sch i ; Tn_lp danh sch mng ;

V d s dng DIEM trn, ta c th khai bo cc bin, mng DIEM nh sau:


DIEM d1, d2, d3 ; DIEM d[20] ; // Khai bo 3 bin i tng d1, d2, d3 // Khai bo mng i tng d gm 20 phn t

Mi i tng sau khi khai bo s c cp pht mt vng nh ring cha cc thuc tnh ca n. Ch rng s khng c vng nh ring cha cc phng thc cho mi i tng, cc phng thc s c s dng chung cho tt c cc i tng cng lp. Nh vy v b nh c cp pht th i tng ging cu trc. Trong trng hp ny:
sizeof(d1) = sizeof(d2) = sizeof(d3) = 3*sizeof(int) = 6 sizeof(d) = 20*6 = 120 a. Thuc tnh ca i tng

Trong v d trn, mi i tng d1, d2, d3 v mi phn t d[i] u c 3 thuc tnh l x, y, m. Ch l mi thuc tnh u thuc v mt i tng, v vy khng th vit tn thuc tnh mt cch ring r m bao gi cng phi c tn i tng i km, ging nh cch vit trong cu trc ca C. Ni cch khc, cch vit thuc tnh ca i tng nh sau:
tn_i_tng.Tn_thuc_tnh

Vi cc i tng d1, d2, d3 v mng d, c th vit nh sau:


d1.x; d2.x; d3.y; d[2].m; d1.x = 100; d2.y =d1.x; // Thuc tnh x ca i tng d1 // Thuc tnh x ca i tng d2 // Thuc tnh y ca i tng d3 // Thuc tnh m ca phn t d[2] // Gn 100 cho d1.x // Gn d1.x cho d2.y

b. S dng cc phng thc

Cng ging nh hm, mt phng thc c s dng thng qua li gi. Tuy nhin trong li gi phng thc bao gi cng phi c tn i tng ch r phng thc thc hin trn cc thuc tnh ca i tng no. V d li gi sau s thc hin nhp s liu vo cc thnh phn d1.x, d1.y v d1.m: d1.nhapsl(); Cu lnh sau s thc hin nhp s liu vo cc thnh phn d[3].x, d[3].y v d[3].m: d[3].nhapsl() ; Chng ta s minh ha cc iu ni trn bng mt chng trnh n gin s

220

Chng 7. Lp v i tng

dng lp DIEM nhp 3 im, hin ri n cc im va nhp. Trong chng trnh a vo hm kd_do_hoa() dng khi ng h ho.
#include <conio.h> #include <iostream.h> #include <graphics.h> class DIEM { private: int x, y, m ; public: void nhapsl(); void an() { putpixel(x,y,getbkcolor());} void hien(); }; void DIEM::nhapsl() { cout << "\n Nhap hoanh do (cot) va tung do (hang) cua DIEM: '' ; cin>> x >> y ; cout << " \n Nhap ma tran cua diem: " ; cin >> m ; } void DIEM::hien() { int mau_ht; mau_ht = getcolor() ; putpixel(x,y,m); setcolor(mau_ht); } void kd_do_hoa() { int mh, mode ;

221

Chng 7. Lp v i tng

mh=mode=0; initgraph(&mh, &mode, "C:\\TC\BGI"); } void main() { DIEMd1, d2, d3 ; d1.nhapsl(); d2.nhapsl(); d3.nhapsl(); kd_do_hoa(); setbkcolor(BLACK); d1.hien(); d2.hien(); d3.hien(); getch(); d1.an(); d2.an(); d3.an(); getch(); closegraph(); } c. Con tr i tng

Con tr i tng dng cha a ch ca bin, mng i tng. N c khai bo nh sau:


Tn_lp *con tr;

V d dng lp DIEM c th khai bo:


DIEM *p1, *p2, *p3 ; DIEM d1, d2 ; DIEM d[20] ; // Khai bo 3 con tr p1, p2, p3 // Khai bo 2 i tng d1, d2 // Khai bo mng i tng // p1 cha a ch ca d2 , hay p1 tr ti d2 // p2 tr ti u mng d // To mt t v cha a ch ca n vo p3

v c th thc hin cc cu lnh:


p1= &d2 ; p2 = d ; p3 = new DIEM

s dng thuc tnh ca i tng thng qua con tr, ta vit nh sau:
Tn_con_tr Tn_thuc_tnh

Ch : Nu con tr cha a ch u ca mng, c th dng con tr nh tn mng. Nh vy sau khi thc hin cc cu lnh trn th: p1 x v d2.x l nh nhau

222

Chng 7. Lp v i tng

p2[i].y v d[i].y l nh nhau T ta c quy tc s dng thuc tnh: s dng mt thuc tnh ca i tng ta phi dng php . hoc php . Trong chng trnh, khng cho php vit tn thuc tnh mt cch n c m phi i km tn i tng hoc tn con tr theo cc mu sau:
Tn_i_tng.Tn_thuc_tnh Tn_con_tr Tn_thuc_tnh Tn_mng_i_ tng[ch_s].Tn_thuc_tnh Tn_con_tr[ch_s].Tn_thuc_tnh

Chng trnh di y cng s dng lp DIEM nhp mt dy im, hin th v n cc im va nhp. Chng trnh dng mt con tr kiu DIEM v dng ton t new to ta mt dy i tng
#include <conio.h> #include <iostream.h> #include <graphics.h> class DIEM { private: int x, y, m ; public: void nhapsl(); void an() { putpixel(x,y,getbkcolor());} void hien(); }; void DIEM::nhapsl() { cout <<"\n Nhap hoanh do (cot) va tung do (hang) cua diem:'' ; cin >> x >> y ; cout << " \n Nhap ma mau cua DIEM: '' ; cin >> m ; } void DIEM::hien() {

223

Chng 7. Lp v i tng

int mau_ht; mau_ht = getcolor() ; putpixel(x,y,m); setcolor(mau_ht); } void kd_do_hoa() { int mh, mode ; mh=mode=0; initgraph(&mh, &mode, ''C:\\TC\BGI''); } void main() { DIEM *p; int i, n; cout << ''So diem: '' ; cin >> n; p = new DIEM[n+1]; for (i=1;i<=n;++i) p[i].nhapsl(); kd_do_hoa(); for (i=1;i<=n;++i) p[i].hien(); getch(); for (i=1;i<=n;++i) p[i].an(); getch(); closegraph(); }

III. I CA PHNG THC, CON TR THIS


1. Con tr this l i th nht ca phng thc

Chng ta hy xem li phng thc nhapsl ca lp DIEM


void DIEM::nhapsl()

224

Chng 7. Lp v i tng

{ cout <<"\n Nhap hoanh do (cot) va tung do (hang) cua diem:" ; cin >> x >> y ; cout <<'' \n Nhap ma mau cua diem: " ; cin >> m ; }

Trong phng thc ny chng ta s dng tn cc thuc tnh x, y v m mt cch n c. iu ny c v nh mu thun vi quy tc s dng thuc tnh nu trong mc trc. Thc t C++ ngm nh s dng mt con tr c bit vi tn gi this trong cc phng thc trn. Cc thuc tnh vit trong phng thc c hiu l thuc mt i tng do con tr this tr ti. Do , nu tng minh hn, phng thc nhapsl() c th c vit di dng tng ng nh sau:
void DIEM::nhapsl() { cout << ''\n Nhap hoanh do (cot) va tung do (hang) cua diem:'' ; cin >> this x >> this y ; cout << "\n Nhap ma mau cua diem: '' ; cin >>this m; }

Nh vy c th kt lun rng: Phng thc bao gi cng c t nht mt i l con tr this v n lun lun l i u tin ca phng thc.
2. Tham s ng vi i con tr this

Xt mt li gi ti phng thc nhapsl() :


DIEM d1; d1.nhapsl() ;

Trong trng hp ny tham s truyn cho con tr this chnh l a ch ca d1:


this = &d1

Do :
this x chnh l d1.x this y chnh l d1.y this m chnh l d1.m

Nh vy cu lnh:d1.nhapsl() ;s nhp d liu cho cc thuc tnh ca i tng d1. T c th rt ra kt lun sau: Tham s truyn cho i con tr this chnh l a ch ca i tng i km vi

225

Chng 7. Lp v i tng

phng thc trong li gi phng thc.


3. Cc i khc ca phng thc

Ngoi i c bit this (i ny khng xut hin mt cch tng minh), phng thc cn c cc i khc c khai bo th trong cc hm. i ca phng thc c th ckiu bt k (chun v ngoi chun). V d xy dng phng thc v ng thng qua 2 im ta cn a vo 3 i: Hai i l 2 bin kiu DIEM, i th ba kiu nguyn xc nh m mu. V c i ngm nh this l i th nht, nn ch cn khai bo thm 2 i. Phng thc c th vit nh sau:
void DIEM::doan_thang(DIEM d2, int mau) { int mau_ht; mau_ht = getcolor(); setcolor(mau); line(this x, this y,d2.x,d2.y); setcolor(mau_ht); }

Chng trnh sau minh ho cc phng thc c nhiu i. Ta vn dng lp DIEM nhng c mt s thay i: B thuc tnh m (mu) B cc phng thc hien v an a vo 4 phng thc mi:
ve_doan_thang (V on thng qua 2 im) ve_tam_giac (V tam gic qua 3 im) do_dai (Tnh di ca on thng qua 2 im) chu_vi (Tnh chu vi tam gic qua 3 im)

Chng trnh cn minh ho: Vic phng thc ny s dng phng thc khc (phng thc ve_tam_giac s dng phng thc ve_doan_thang, phng thc chu_vi s dng phng thc do_dai) S dng con tr this trong thn cc phng thc ve_tam_giac v chu_vi Ni dung chng trnh l nhp 3 im, v tam gic c nh l 3 im va nhp sau tnh chu vi tam gic.
#include <conio.h>

226

Chng 7. Lp v i tng

#include <iostream.h> #include <graphics.h> #include <math.h> #include <stdio.h> class DIEM { private: int x, y ; public: void nhapsl(); void ve_doan_thang(DIEM d2, int mau) ; void ve_tam_giac(DIEM d2, DIEM d3,int mau) ; double do_dai(DIEM d2) { DIEM d1 = *this ; return sqrt(pow(d1.x - d2.x,2) + pow(d1.y - d2.y,2) ) ; } double chu_vi(DIEM d2, DIEM d3); }; void DIEM::nhapsl() { cout <<'' \n Nhap hoanh do (cot) va tung do (hang) cua diem:'' ; cin >> x >> y; } void kd_do_hoa() { int mh, mode ; mh=mode=0; initgraph(&mh, &mode, ''''); } void DIEM::ve_doan_thang(DIEM d2, int mau) {

227

Chng 7. Lp v i tng

setcolor(mau); line(this x,this y,d2.x,d2.y); } void DIEM:: ve_tam_giac(DIEM d2, DIEM d3,int mau) { (*this).ve_doan_thang(d2,mau); d2.ve_doan_thang(d3,mau); d3.ve_doan_thang(*this,mau); } double DIEM:: chu_vi(DIEM d2, DIEM d3) { double s; s=(*this).do_dai(d2)+ d2.do_dai(d3) + d3.do_dai(*this) ; return s; } void main() { DIEM d1, d2, d3; char tb_cv[20] ; d1.nhapsl(); d2.nhapsl(); d3.nhapsl(); kd_do_hoa(); d1.ve_tam_giac(d2,d3,15); double s = d1.chu_vi(d2,d3); sprintf(tb_cv, "chu_vi = %0.2f", s); outtextxy(10,10,tb_cv); getch(); closegraph(); }

Mt s nhn xt v i ca phng thc v li gi phng thc: + Quan st nguyn mu phng thc:

228

Chng 7. Lp v i tng

void ve_doan_thang(DIEM d2, int mau) ;

s thy phng thc c 3 i: i th nht l mt i tng DIEM do this tr ti i th hai l i tng DIEM d2 i th ba l bin nguyn mu Ni dung phng thc l v mt on thng i qua cc im *this v d2 theo m mu mau. Xem thn ca phng s thy c ni dung ny:
void DIEM::ve_doan_thang(DIEM d2, int mau) ; { setcolor(mau); line(this x,this y,d2.x,d2.y); }

Tuy nhin trong trng hp ny, vai tr ca this khng cao lm, v n c a vo ch ct lm r i th nht. Trong thn phng thc c th b t kha this vn c. + Vai tr ca this tr nn quan trng trong phng thc ve_tam_giac:
voidve_tam_giac(DIEM d2, DIEM d3, int mau)

Phng thc ny c 4 i l: this : tr ti mt i tng kiu DIEM d2 : mt i tng kiu DIEM d3 : mt i tng kiu DIEM mau : mt bin nguyn Ni dung phng thc l v 3 cnh:
cnh 1 i qua *this v d2 cnh 2 i qua d2 v d3 cnh 3 i qua d3 v *this

Cc cnh trn uc v nh s dng phng thc ve_doan_thang:


V cnh 1 dng lnh: (*this).ve_doan_thang(d2,mau) ; V cnh 2 dng lnh: d2.ve_doan_thang(d3,mau); V cnh 3 dng lnh: d3.ve_doan_thang(*this,mau);

Trong trng ny r rng vai tr ca this rt quan trng. Nu khng dng n th cng vic tr nn kh khn, di dng v kh hiu hn. Chng ta hy so snh 2 phng n:

229

Chng 7. Lp v i tng

Phng n dng this trong phng thc ve_tam_giac:


void DIEM::ve_tam_giac(DIEM d2, DIEM d3, int mau) { (*this).ve_doan_thang(d2,mau); d2.ve_doan_thang(d3,mau); d3.ve_doan_thang(*this,mau); }

phng n khng dng this trong phng thc ve_tam_giac:


void DIEM::ve_tam_giac(DIEM d2, DIEM d3, int mau) { DIEM d1; d1.x = x; d1.y = y; d1.ve_doan_thang(d2,mau); d2.ve_doan_thang(d3,mau); d3.ve_doan_thang(d1,mau); }

IV. HM TO (CONSTRUCTOR)
1. Hm to (hm thit lp)

Hm to cng l mt phng thc ca lp (nhng l hm c bit) dng to dng mt i tng mi. Chng trnh dch s cp pht b nh cho i tng sau s gi n hm to. Hm to s khi gn gi tr cho cc thuc tnh ca i tng v c th thc hin mt s cng vic khc nhm chun b cho i tng mi.
a. Cch vit hm to

i.

im khc ca hm to v cc phng thc thng thng:

Khi vit hm to cn 3 s khc bit ca hm to so vi cc phng thc khc nh sau: Tn ca hm to: Tn ca hm to bt buc phi trng vi tn ca lp. Khng khai bo kiu cho hm to. Hm to khng c kt qu tr v. ii. S ging nhau ca hm to v cc phng thc thng thng Ngoi 3 im khc bit trn, hm to c vit nh cc phng thc khc: Hm to c th c xy dng bn trong hoc bn ngoi nh ngha lp.

230

Chng 7. Lp v i tng

Hm to c th c i hoc khng c i. Trong mt lp c th c nhiu hm to (cng tn nhng khc b i). V d sau nh ngha lp DIEM_DH (im ha) c 3 thuc tnh:
int x; int y; int m; // honh (ct) ca im // tung (hng) ca im // mu ca im

v a vo 2 hm to khi gn cho cc thuc tnh ca lp:


// Hm to khng i: Dng cc gi tr c nh khi gn cho x, y, m DIEM_DH() ; // Hm to c i: Dng cc i x1, y1, m1 khi gn cho x, y, m DIEM_DH(int x1, int y1, int m1 = 15) ; class DIEM_DH { private: int x, y, m ; public: // Hm to khng i: khi gn cho x = 0, y = 0, m = 1 // Hm ny vit bn trong nh ngha lp DlEM_DH() { x = y = 0; m = 1; } // Hm to ny xy dng bn ngoi nh ngha lp DIEM_DH(int x1, int y1, int m1 = 15) ; // Cc phng thc khc }; // Xy dng hm to bn ngoi nh ngha lp DIEM_DH:: DIEM_DH(int x1, int y1, int m1) ; { x = x1; y = y1; m = m1; } // i m1 c gi tr mc nh 15 // (mu trng)

231

Chng 7. Lp v i tng

b. Dng hm to trong khai bo

+ Khi xy dng cc hm to, ta c th dng chng trong khai bo to ra mt i tng ng thi khi gn cho cc thuc tnh ca i tng c to. Da vo cc tham s trong khai bo m trnh bin dch s bit cn gi n hm to no. + Khi khai bo mt bin i tng c th s dng cc tham s khi gn cho cc thuc tnh ca bin i tng. + Khi khai bo mng i tng khng cho php dng cc tham s khi gn. + Cu lnh khai bo mt bin i tng s gi ti hm to 1 ln. + Cu lnh khai bo mt mng n i tng s gi ti hm to n ln. V d:
DIEM_DH d; DIEM_DH u(300, 100, 5); DIEM_DH v(400, 200); DIEM_DH p[20] ; // Gi ti hm to khng i. // Gi ti hm to c i. // Gi ti hm to c i. // Gi ti hm to khng i 20 ln

// Kt qu d.x = 0, d.y = 0, d.m = 1 // Kt qu u.x = 300, u.y = 100, d.m = 5 // Kt qu v.x = 400, v.y = 200, d.m = 15 Ch : Vi cc hm c i kiu lp, th i ch xem l cc tham s hnh thc, v vy khai bo i (trong dng u ca hm) s khng to ra i tng mi v do khng gi ti cc hm to.
c. Dng hm to trong cp pht b nh

+ Khi cp pht b nh cho mt i tng c th dng cc tham s khi gn cho cc thuc tnh ca i tng, v d
DIEM_DH *q = new DIEM_DH(40, 20, 4); // Gi ti hm to c i //Gi ti hm to khng i

// Kt qu q x = 40, q y = 20, q m = 4
DIEM_DH *r = new DIEM_DH ;

// Kt qu r x = 0, r y = 0, r m = 1 + Khi cp pht b nh cho mt dy i tng khng cho php dng tham s khi gn, v d:
int n = 30; DIEM_DH *s = new DlEM_DH[n] ; // Gi ti hm to khng i 30 ln.

d. Dng hm to biu in cc i tng hng

232

Chng 7. Lp v i tng

+ Nh bit, sau khi nh ngha lp DIEM_DH th c th xem lp ny nh mt kiu d liu nh int, double, char, ... Vi kiu int chng ta c cc hng int, nh 253. Vi kiu double chng ta c cc hng double, nh 75.42 Khi nim hng kiu int, hng kiu double c th m rng cho hng kiu DIEM_DH + biu din mt hng i tng (hay cn gi: i tng hng) chng ta phi dng ti hm to. Mu vit nh sau:
Tn_lp(danh sch tham s) ;

V d i vi lp DIEM_DH ni trn, c th vit nh sau:


DIEM_DH(234, l 23, 4) // Biu th mt i tng kiu DIEM_DH // c cc thuc tnh x = 234, y = 123, m = 4

Ch : C th s dng mt hng i tng nh mt i tng. Ni cch khc, c th dng hng i tng thc hin mt phng thc, v d nu vit:
DIEM_DH(234, l 23, 4).in();

th c ngha l thc hin phng thc in() i vi hng i tng.


e. V d minh ha

Chng trnh sau y minh ha cch xy dng hm to v cch s dng hm to trong khai bo, trong cp pht b nh v trong vic biu din cc hng i tng.
#include <conio.h> #include <iostream.h> #include <iomanip.h> class DIEM_DH { private: int x, y, m; public: // Hm bn dng in i tng DIEM_DH friend void in(DIEM_DH d) { cout <<"\n '' << d.x << '' ''<< d.y<<" " << d.m ; } // Phng thc dng in i tng DIEM_DH

233

Chng 7. Lp v i tng

void in() { cout <<''\n '' << x << '' ''<< y<<" " << m ; } // Hm to khng i DIEM_DH() { x = y = 0; m = 1; } // Hm to c i, i m1 c gi tr mc nh l 15 (mu trng) DIEM_DH(int x1, int y1, int m1 = 15); }; // Xy dng hm to DIEM_DH::DIEM_DH(int x1, int y1, int m1) { x = x1; y = y1; m = m1; } void main() { DIEM_DH d1; DIEM_DH d2(200, 200, 10); DIEM_DH*d; d = new DIEM_DH(300, 300); clrscr(); in(d1); d2.in(); in(*d); DIEM_DH(2, 2, 2).in(); DIEM_DH t[3]; DIEM_DH*q; int n; //Gi hm bn in() //Gi phng thc in() // Gi hm bn in() // Gi phng thc in() // 3 ln gi hm to khng i // Gi hm to khng i // Gi ti hm to c i // Gi ti hm to khng i // Gi ti hm to c i

234

Chng 7. Lp v i tng

cout << "\n N = "; cin >> n; q = new DIEM_DH[n+1]; for (int i = 0; i< = n; ++i) q[i] = DIEM_DH(300+i, 200+i, 8); //(n+1) ln gi hm to c i for (i = 0; i< = n; ++i) q[i].in(); for (i = 0; i< = n; ++i) DIEM_DH(300+i, 200+i, 8).in(); getch(); } 2. Lp khng c hm to v hm to mc nh a. Nu lp khng c hm to // Gi phng thc in() // Gi phng thc in() // (n+1) ln gi hm to khng i

Chng trnh dch s cung cp mt hm to mc nh khng i (default), hm ny thc cht khng lm g c. Nh vy mt i tng to ra ch c cp pht b nh, cn cc thuc tnh ca n cha c xc nh. Chng ta c th kim chng iu ny, bng cch chy chng trnh sau:
// Hm to mc nh #include <conio.h> #include <iostream.h> class DIEM_DH { private: int x, y, m; public: // Phng thc void in() { cout <<"\n '' << x << '' ''<< y<<'' " << m ; } }; void main() { DIEM_DH d; d.in(); DIEM_DH *p;

235

Chng 7. Lp v i tng

p = new DIEM_DH[10]; clrscr(); d.in(); for (int i = 0; i<10; ++i) (p+i)->in(); getch(); } b. Nu trong lp c t nht mt hm to

Khi hm to mc nh s khng c pht sinh na v mi cu lnh xy dng i tng mi u s gi n mt hm to ca lp. Nu khng tm thy hm to cn gi th chng trnh dch s bo li. iu ny thng xy ra khi chng ta khng xy dng hm to khng i, nhng li s dng cc khai bo khng tham s nh v d sau:
#include <conio.h> #include <iostream.h> class DIEM_DH { private: int x, y, m; public: // Phng thc dng in i tng DIEM_DH void in() { cout <<"\n'' << x << " "<< y<<" " << m ; } //Hm to c i DIEM_DH::DIEM_DH(int x1, int y1 , int m1) { x = x1; y = y1 ; m = m1; } }; void main() { DIEM_DH d1(200, 200, 10); // Gi ti hm to c i

236

Chng 7. Lp v i tng

DIEM_DH d2; // Gi ti hm to khng i d2 = DIEM_DH(300, 300, 8); // Gi ti hm to c i d1.in(); d2.in(); getch(); }

Trong cc cu lnh trn, ch c cu lnh th 2 trong hm main() l b bo li. Cu lnh ny s gi ti hm to khng i, m hm ny cha c xy dng. Gii php: c th chn mt trong 2 gii php sau: Xy dng thm hm to khng i. Gn gi tr mc nh cho tt c cc i x1, y1 v m1 ca hm to xy dng trn. Theo phng n 2, chng trnh c th sa nh sau:
#include <conio.h> #include <iostream.h> class DIEM_DH { private: int x, y, m; public: // Phng thc dng in i tng DIEM_DH void in() { cout <<''\n '' << x << " "<< y<<" " << m ; } // Hm to c i , tt c cc i u c gi tr mc nh DIEM_DH::DIEM_DH(int x1 = 0, int y1 = 0, int m1 = 15) { x = x1; y = y1; m = m1; } }; void main() { // Gi ti hm to, khng dng tham s mc nh DIEM_DH d1(200, 200, 10); // Gi ti hm to, dng 3 tham s mc nh

237

Chng 7. Lp v i tng

DIEM_DH d2; // Gi ti hm to, dng 1 tham s mc nh d2 = DIEM_DH(300, 300); d1.in(); d2.in(); getch(); } 3. Hm to sao chp (Copy Constructor) a. Hm to sao chp mc nh

Gi s nh ngha mt lp no , v d lp PS (phn s). Khi : + Ta c th dng cu lnh khai bo hoc cp pht b nh to cc i tng mi, v d:
PS p1, p2 ; PS *p = new PS ;

+ Ta cng c th dng lnh khai bo to mt i tng mi t mt i tng tn ti, v d:


PS u; PS v(u) ; // To v theo u

ngha ca cu lnh ny nh sau: Nu trong lp PS cha xy dng hm to sao chp, th cu lnh ny s gi ti mt hm to sao chp mc nh (ca C++). Hm ny s sao chp ni dung tng bit ca u vo cc bit tng ng ca v. Nh vy cc vng nh ca u v v s c ni dung nh nhau. R rng trong a s cc trng hp, nu lp khng c cc thuc tnh kiu con tr hay tham chiu, th vic dng cc hm to sao chp mc nh ( to ra mt i tng mi c ni dung nh mt i tng cho trc) l v khng cn xy dng mt hm to sao chp mi. Nu trong lp PS c hm to sao chp (cch vit s ni sau) th cu lnh: PS v(u); s to ra i tng mi v, sau gi ti hm to sao chp khi gn v theo u. V d sau s minh ha cch dng hm to sao chp mc nh: Trong chng trnh a vo lp PS (phn s): + Cc thuc tnh gm: t (t s) v m (mu). + Trong lp khng c phng thc no c m ch c 2 hm bn l cc hm ton t nhp (>>) v xut (<<). 238

Chng 7. Lp v i tng

+ Ni dung chng trnh l: Dng lnh khai bo to mt i tng u (kiu PS) c ni dung nh i tng c d.
// Ham tao sao chep mac dinh #include <conio.h> #include <iostream.h> class PS { private: int t, m ; public: friend ostream& operator<< (ostream&os, const PS &p) { os << " = " << p.t << "/" << p.m; return os; } friend istream& operator>> (istream& is, PS &p) { cout << "\n Nhap tu va mau: " ; is >> p.t >> p.m ; return is; } }; void main() { PS d; cout << "\n Nhap PS d "; cin >> d; cout << "\n PS d " << d; PS u(d); cout << "\n PS u "<< u; getch(); } b. Cch xy dng hm to sao chp

+ Hm to sao chp s dng mt i kiu tham chiu i tng khi gn 239

Chng 7. Lp v i tng

cho i tng mi. Hm to sao chp c vit theo mu:


Tn_lp (const Tn_lp & dt) { // Cc cu lnh dng cc thuc tnh ca i tng dt // khi gn cho cc thuc tnh ca i tng mi }

+ V d c th xy dng hm to sao chp cho lp PS nh sau:


class PS { private: int t, m ; public: PS (const PS &p) { this->t = p.t ; this->m = p.m ; } ... }; c. Khi no cn xy dng hm to sao chp

+ Nhn xt: Hm to sao chp trong v d trn khng khc g hm to sao chp mc nh. + Khi lp khng c cc thuc tnh kiu con tr hoc tham chiu, th dng hm to sao chp mc nh l . + Khi lp c cc thuc tnh con tr hoc tham chiu, th hm to sao chp mc nh cha p ng c yu cu. V d:
class DT { private: int n; // Bac da thuc double *a; // Tro toi vung nho chua cac he so da thuc a0, a1, ... public:

240

Chng 7. Lp v i tng

DT() { this->n0; this->a = NULL; } DT(int n1) { this->n = n1; this->a = new double[n1+1]; } friend ostream& operator << (ostream& os, const DT &d); friend istream& operator>> (istream& is, DT &d); ... };

By gi chng ta hy theo di xem vic dng hm to mc nh trong on chng trnh sau s dn n sai lm nh th no:
DT d ; // To i tng d kiu DT cin >> d ;

/* Nhp i tng d, gm: nhp mt s nguyn dng v gn cho d.n, cp pht vng nh cho d.a, nhp cc h s ca a thc v cha vo vng nh c cp pht */
DT u(d);

/* Dng hm to mc nh xy dng i tng u theo d. Kt qu: u.n = d.n v u.a = d.a. Nh vy 2 con tr u.a v d.a cng tr n mt vng nh */ Nhn xt: Mc ch l to ra mt i tng u ging nh d, nhng c lp vi d. Ngha l khi d thay i th u khng b nh hng g. Th nhng mc tiu ny khng t c, v u v d c chung mt vng nh cha h s ca a thc, nn khi sa i cc h s ca a thc trong d th cc h s ca a thc trong u cng thay i theo. Cn mt trng hp na cng dn n li l khi mt trong 2 i tng u v d b gii phng (thu hi vng nh cha a thc) th i tng cn li cng s khng cn vng nh na. V d sau s minh ha nhn xt trn: Khi d thay i th u cng thay i v ngc li khi u thay i th d cng thay i theo.
#include <conio.h> #include <iostream.h> #include <math.h> class DT { private: int n; // Bac da thuc

241

Chng 7. Lp v i tng

double *a; // Tro ti vung nho chua cac he so da thuc a0, a1 , ... public: DT() { this->n = 0; this->a = NULL; } DT(int n1) { this->n = n1 ; this->a = new double[n1+1]; } friend ostream& operator<< (ostream& os, const DT &d); friend istream& operator>> (istream& is, DT &d); }; ostream& operator<< (ostream& os, const DT &d) { os << " Cac he so (tu ao): "; for (int i = 0 ; i< = d.n ; ++i) os << d.a[i] <<" " ; return os; } istream& operator >> (istream& is, DT &d) { if (d.a! = NULL) delete d.a; cout << " \n Bac da thuc: " ; cin >> d.n; d.a = new double[d.n+1]; cout << ''Nhap cac he so da thuc:\n" ; for (int i = 0 ; i< = d.n ; ++i) { cout << "He so bac "<< i << " = " ; is >> d.a[i] ; } return is; }

242

Chng 7. Lp v i tng

void main() { DT d; clrscr(); cout <<"\n Nhap da thuc d " ; cin >> d; DT u(d); cout << "\n Da thuc d "<< d ; cout << "\n Da thuc u " << u ; cout <<"\n Nhap da thuc d " ; cin >> d; cout << "\nDa thuc d " << d; cout <<"\n Da thuc u " << u ; cout <<"\n Nhap da thuc u " ; cin >> u; cout << "\n Da thuc d "<< d ; cout << "\n Da thuc u " << u ; getch(); } d. V d v hm to sao chp

Trong chng trnh trn ch r: Hm to sao chp mc nh l cha tho mn i vi lp DT. V vy cn vit hm to sao chp xy dng i tng mi (v d u) t mt i tng ang tn ti (v d d) theo cc yu cu sau: + Gn d.n cho u.n + Cp pht mt vng nh cho u.a c th cha c (d.n + 1) h s. + Gn cc h s cha trong vng nh ca d.a sang vng nh ca u.a Nh vy chng ta s to c i tng u c ni dung ban u ging nh d, nhng c lp vi d. p ng cc yu cu nu trn, hm to sao chp cn c xy dng nh sau:
DT::DT(const DT &d) { this n = d.n ; this a = new double[d.n+1]; for (int i = 0; i< = d.n; ++i) this a[i] = d.a[i]; }

243

Chng 7. Lp v i tng

Chng trnh sau s minh ha iu ny: S thay i ca d khng lm nh hng n u v ngc li s thay i ca u khng lm nh hng n d.
// Vit hm to sao chp cho lp DT #include <conio.h> #include <iostream.h> #include <math.h> class DT { private: int n; // Bac da thuc double *a; // Tro toi vung nho chua cac he so da thuc a0, a1 , ... public: DT() { this n = 0; this a = NULL; } DT(int n1) { this n = n1 ; this a = new double[n1+1]; } DT(const DT &d); friend ostream& operator<< (ostream& os, const DT&d); friend istream& operator>> (istream& is, DT&d); }; DT::DT(const DT&d) { this n = d.n; this a = new double[d.n+1]; for (int i = 0; i< = d.n; ++i) this a[i] = d.a[i]; } ostream& operator<< (ostream& os, const DT &d) { os << " Cac he so (tu ao): " ;

244

Chng 7. Lp v i tng

for (int i = 0 ; i< = d.n ; ++i) os << d.a[ i] <<" " ; return os; } istream& operator>> (istream& is, DT &d) { if (d.a! = NULL) delete d.a; cout << "\n Bac da thuc: '' ; cin >> d.n; d.a = new double[d.n+1]; cout << ''Nhap cac he so da thuc:\n'' ; for (int i = 0 ; i< = d.n ; ++i) { cout << "He so bac " << i << " = " ; is >> d.a[i] ; } return is; } void main() { DT d; clrscr(); cout <<"\n Nhap da thuc d " ; cin >> d; DT u(d); cout <<"\n Da thuc d " << d ; cout << "\n Da thuc u " << u ; cout <<"\n Nhap da thuc d " ; cin >> d; cout << "\n Da thuc d "<< d ; cout <<"\n Da thuc u " << u ; cout <<"\n Nhap da thuc u " ; cin >> u; cout << "\n Da thuc d " << d ; cout <<"\n Da thuc u " << u ; getch();

245

Chng 7. Lp v i tng

V. HM HY (DESTRUCTOR) Hm hy l mt hm thnh vin ca lp (phng thc) c chc nng ngc vi hm to. Hm hy c gi trc khi gii phng (xo b) mt i tng thc hin mt s cng vic c tnh ''dn dp'' trc khi i tng c hy b, v d nh gii phng mt vng nh m i tng ang qun l, xo i tng khi mn hnh nu nh n ang hin th, ... Vic hy b mt i tng thng xy ra trong 2 trng hp sau: + Trong cc ton t v cc hm gii phng b nh, nh delete, free, ... + Gii phng cc bin, mng cc b khi thot khi hm, phng thc.
1. Hm hy mc nh

Nu trong lp khng nh ngha hm hy, th mt hm hy mc nh khng lm g c c pht sinh. i vi nhiu lp th hm hy mc nh l , v khng cn a vo mt hm hy mi.
2. Quy tc vit hm hy

Mi lp ch c mt hm hy vit theo cc quy tc sau: + Kiu ca hm: Hm hy cng ging nh hm to l hm khng c kiu, khng c gi tr tr v. + Tn hm: Tn ca hm hy gm mt du ng (ng trc) v tn lp:
~Tn_lp

+ i: Hm hy khng c i V d c th xy dng hm hy cho lp DT (a thc) nh sau:


class DT { private: int n; // Bac da thua double *a; // Tro toi vung nho chua cac he so da thuc a0, a1 , ... public: ~DT() { this n = 0; delete this a;

246

Chng 7. Lp v i tng

} ... }; 3. Vai tr ca hm hy trong lp DT

Trong phn trc nh ngha lp DT (a thc) kh y gm: + Cc hm to + Cc ton t nhp >>, xut << + Cc hm ton t thc hin cc php tnh +, -, *, / Tuy nhin vn cn thiu hm hy gii phng vng nh m i tng kiu DT (cn hy) ang qun l. Chng ta hy phn tch cc khim khuyt ca chng trnh ny: + Khi chng trnh gi ti mt phng thc ton t thc hin cc php tnh cng, tr, nhn a thc, th mt i tng trung gian c to ra. Mt vng nh c cp pht v giao cho n (i tng trung gian) qun l. + Khi thc hin xong php tnh s ra khi phng thc. i tng trung gian b xo, tuy nhin ch vng nh ca cc thuc tnh ca i tng ny c gii phng. Cn vng nh (cha cc h s ca a thc) m i tng trung gian ang qun l th khng h b gii phng. Nh vy s vng nh b chim dng v ch s tng ln. Nhc im trn d dng khc phc bng cch a vo lp DT hm hy trong mc 3 trn.
4. V d

Phn ny chng ti trnh by mt v d tng i hon chnh v lp cc hnh trn trong ch ha. Chng trnh gm: i. Lp HT (hnh trn) vi cc thuc tnh:
int r; int m; int xhien, yhien; char *pht; int hienmh; // Bn knh // Mu hnh trn // V tr hin th hnh trn trn mn hnh // Con tr tr ti vng nh cha nh hnh trn // Trng thi hin (hienmh = 1), n (hienmh = 0)

ii. Cc phng thc + Hm to khng i thc hin vic gn gi tr bng 0 cho cc thuc tnh ca lp. HT(); + Hm to c i. HT(int n, int m1 = 15);

247

Chng 7. Lp v i tng

Thc hin cc vic: Gn r1 cho r, m1 cho m Cp pht b nh cho pht V hnh trn v lu nh hnh trn vo vng nh ca pht + Hm hy: ~HT(); Thc hin cc vic: Xo hnh trn khi mn hnh (nu ang hin th) Gii phng b nh cp cho pht + Phng thc: void hien(int x, int y); C nhim v hin th hnh trn ti (x, y) + Phng thc : void an() C nhim v lm n hnh trn iii. Cc hm c lp:
void ktdh(); void ve_bau_troi(); void ht_di_dong_len(); // Khi to ha // V bu tri sao // V mt cp 2 hnh trn di chuyn ln trn

void ht_di_dong_xuong(); // V mt cp 2 hnh trn di chuyn xung

Ni dung chng trnh l to ra cc chuyn ng xung v ln ca cc hnh trn.


// Lop do hoa // Ham huy // Trong ham huy co the goi PT khac #include <conio.h> #include <iostream.h> #include <math.h> #include <stdlib.h> #include <graphics.h> #include <dos.h> void ktdh(); void ve_bau_troi(); void ht_di_dong_xuong(); void ht_di_dong_len(); // Khi to ha // V bu tri sao // V mt cp 2 hnh trn di chuyn xung // V mt cp 2 hnh trn di chuyn ln trn

248

Chng 7. Lp v i tng

int xmax, ymax; class HT { private: int r, m ; int xhien, yhien; char *pht; int hienmh; public: HT(); HT(int n, int m1 = 15); ~HT(); void hien(int x, int y); void an(); }; HT:: HT() { r = m = hienmh = 0; xhien = yhien = 0; pht = NULL; } HT::HT(int n, int m1) { r = n; m = m1; hienmh = 0; xhien = yhien = 0; if (r<0) r = 0; if (r = = 0) pht = NULL; else { int size; char *pmh; size = imagesize(0, 0, r+r, r+r); pmh = new char[size];

249

Chng 7. Lp v i tng

getimage(0, 0, r+r, r+r, pmh); setcolor(m); circle(r, r, r ); setfillstyle(1, m); floodfill(r, r, m); pht = new char[size]; getimage(0, 0, r+r, r+r, pht); putimage(0, 0, pmh, COPY_PUT); delete pmh; pmh = NULL; } } void HT::hien(int x, int y) { if (pmh! = NULL && !hienmh) // Chua hien { hienmh = 1; xhien = x; yhien = y; putimage(x, y, pht, XOR_PUT); } } void HT::an() { if (hienmh) // Dang hien { hienmh = 0; putimage(xhien, yhien, pht, XOR_PUT); } } HT::~HT() { an();

250

Chng 7. Lp v i tng

if (pht! = NULL) { delete pht; pht = NULL; } } void ktdh() { int mh = 0, mode = 0; initgraph(&mh, &mode, " "); xmax = getmaxx(); ymax = getmaxy(); } void ve_bau_troi() { for (int i = 0; i<2000; ++i) putpixel(random(xmax), random(ymax), 1+random( 15)); } void ht_di_dong_xuong() { HT h(50, 4); HT u(60, 15); h.hien(0, 0); u.hien(40, 0); for (int x = 0; x< = 340; x+ = 10) { h.an(); u.an(); h.hien(x, x); delay(200); u.hien(x+40, x); delay(200);

251

Chng 7. Lp v i tng

} } void ht_di_dong_len() { HT h(50, 4); HT u(60, 15); h.hien(340, 340); u.hien(380, 340); for (int x = 340; x> = 0; x- = 10) { h.an(); u.an(); u.hien(x, x); delay(200); u.hien(x+40, x); delay(200); } }; void main() { ktdh(); ve_bau_troi(); ht_di_dong_xuong(); ht_di_dong_len(); getch(); closegraph(); }

Cc nhn xt: + Trong thn hm hy gi ti phng thc an(). + iu g xy ra khi b i hm hy: Khi gi hm ht_di_dong_xuong() th c 2 i tng kiu HT c to ra. Trong thn hm s dng cc i tng ny v cc hnh trn di

252

Chng 7. Lp v i tng

chuyn xung. Khi thot khi hm th 2 i tng (to ra trn) c gii phng. Vng nh ca cc thuc tnh ca chng b thu hi, nhng vng nh cp pht cho thuc tnh pht cha c gii phng v nh ca 2 hnh trn ( pha di mn hnh) vn khng c ct i. iu tng t xy ra sau khi ra khi hm ht_di_dong_len(): vng nh cp pht cho thuc tnh pht cha c gii phng v nh ca 2 hnh trn ( pha trn mn hnh) vn khng c thu dn. VI. CC HM TRC TUYN (INLINE) Mt s m rng ca C++ i vi C c trnh by trong cc chng trc nh bin tham chiu, nh ngha chng hm, hm vi i mc nh Phn ny ta xem mt c trng khc ca C++ c gi l hm trc tuyn (inline).
1. u nhc im ca hm

Vic t chc chng trnh thnh cc hm c 2 u im r rt: Th nht l chia chng trnh thnh cc n v c lp, lm cho chng trnh c t chc mt cch khoa hc d kim sot, d pht hin li, d pht trin v m rng. Th hai l gim c kch thc chng trnh, v mi on chng trnh thc hin nhim v ca hm c thay bng mt li gi hm. Tuy nhin hm cng c nhc im l lm chm tc chng trnh do phi thc hin mt s thao tc c tnh th tc mi khi gi hm nh: cp pht vng nh cho cc iv bin cc b, truyn d liu ca cc tham s cho cc i, gii phng vng nh trc khi thot khi hm. Cc hm trc tuyn trong C++ c kh nng khc phc c cc nhc im ni trn.
2. Cc hm trc tuyn

bin mt hm thnh trc tuyn ta vit thm t kho inline vo trc khai bo nguyn mu hm. Nu khng dng nguyn mu th vit t kho ny trc dng u tin ca nh ngha hm. V d 1 :
inline float f(int n, float x); float f(int n, float x) { // Cc cu lnh trong thn hm }

253

Chng 7. Lp v i tng

hoc
inline float f(int n, float x) { // Cc cu lnh trong thn hm }

Ch : Trong mi trng hp, t kho inline phi xut hin trc cc li gi hm th trnh bin dch mi bit cn x l hm theo kiu inline. V d hm f trong chng trnh sau s khng phi l hm trc tuyn v t kho inline vit sau li gi hm:
#include <conio.h> #include <iostream.h> void main() { int s ; s = f(5,6); cout << s ; getch(); } inline int f(int a, int b) { return a*b; }

Ch : Trong C++, nu hm c xy dng sau li gi hm th bt buc phi khai bo nguyn mu hm trc li gi. Trong v d trn, trnh bin dch C++ s bt li v thiu khai bo nguyn ngu hm f .
3. Cch bin dch v dng hm trc tuyn

Chng trnh dch x l cc hm inline nh cc macro (c nh ngha trong lnh #define), ngha l n s thay mi li gi hm bng mt on chng trnh thc hin nhim v ca hm. Cch ny lm cho chng trnh di ra, nhng tc chng trnh tng ln do khng phi thc hin cc thao tc c tnh th tc khi gi hm. Phng n dng hm trc tuyn rt ngn c thi gian chy my nhng li lm tng khi lng b nh chng trnh (nht l i vi cc hm trc tuyn c nhiu cu lnh). V vy ch nn dng phng n trc tuyn i vi cc hm nh.

254

Chng 7. Lp v i tng

4. S hn ch ca trnh bin dch

Khng phi khi gp t kho inline l trnh bin dch nht thit phi x l hm theo kiu trc tuyn. C mt s hm m cc trnh bin dch thng khng x l theo cch inline nh cc hm cha bin static, hm cha cc lnh chu trnh hoc lnh goto hoc lnh switch, hm quy. Trong trng hp ny t kho inline l d nhin b b qua. Thm ch t kho inline vn b b qua ngay c i vi cc hm khng c nhng hn ch nu trn nu nh trnh bin dch thy cn thit (v d c qu nhiu hm inline lm cho b nh chng trnh qu ln) V d 2 : Chng trnh sau s dng hm inline tnh chu vi v din tch ca hnh ch nht: Cch 1: Khng khai bo nguyn mu. Khi hm dtcvhcn phi t trc hm main.
#include <conio.h> #include <iostream.h> inline void dtcvhcn(int a, int b, int &dt, int &cv) { dt=a*b; cv=2*(a+b); } void main() { int a[20],b[20],cv[20],dt[20],n; cout << "\n So hinh chu nhat: '' ; cin >> n; for (int i=1; i<=n; ++i) { cout <<"\n Nhap 2 canh cua hinh chu nhat thu " << i << ": "; cin >> a[i] >> b[i]; dtcvhcn(a[i],b[i],dt[i], cv[i]); } clrscr(); for (i=1; i<=n; ++i) { cout << "\n Hinh chu nhat thu "<< i << '' : '';

255

Chng 7. Lp v i tng

cout << "\n Do dai 2 canh= '' << a[i] << '' va '' << b[i] ; cout <<"\n Dien tich= " << dt[i] ; cout << "\n Chu vi= '' << cv[i] ; } getch(); }

Cch 2:S dng khai bo nguyn mu. Khi t kho inline t trc nguyn mu. Ch : Khng c t inline trc nh ngha hm. Trong chng trnh di y nu t inline trc nh ngha hm th hu qu nh sau: Chng trnh vn dch thng, nhng khi chy th chng trnh b qun v khng thot i c.
#include <conio.h> #include <iostream.h> inline void dtcvhcn(int a, int b, int &dt, int &cv); void main() { int a[20],b[20],cv[20],dt[20],n; cout << "\n So hinh chu nhat: '' ; cin >> n; for (int i=1; i<=n; ++i) { cout <<"\n Nhap 2 canh cua hinh chu nhat thu " << i << ": "; cin >> a[i] >> b[i]; dtcvhcn(a[i],b[i],dt[i], cv[i]); } clrscr(); for (i=1; i<=n; ++i) { cout << "\n Hinh chu nhat thu "<< i << '' : ''; cout << "\n Do dai 2 canh= '' << a[i] << '' va '' << b[i] ; cout <<"\n Dien tich= " << dt[i] ; cout << "\n Chu vi= '' << cv[i] ; } getch();

256

Chng 7. Lp v i tng

} void dtcvhcn(int a, int b, int&dt, int &cv) { dt=a*b; cv=2*(a+b); }

257

Chng 8. Hm bn, nh ngha php ton cho lp

CHNG 8

HM BN, NH NGHA PHP TON CHO LP


Hm bn nh ngha php ton cho lp

I. HM BN (FRIEND FUNCTION)
1. Hm bn

mt hm tr thnh bn ca mt lp, c 2 cch vit: Cch 1: Dng t kha friend khai bo hm trong lp v xy dng hm bn ngoi nh cc hm thng thng (khng dng t kha friend). Mu vit nh sau:
class A { private: // Khai bo cc thuc tnh public: ... // Khai bo cc hm bn ca lp A friend void f1(...); friend double f2(...); friend A f3(...) ; ... }; // Xy dng cc hm f1, f2, f3 void f1(...) { ... } double f2(...) {

258

Chng 8. Hm bn, nh ngha php ton cho lp

... } A f3(...) { ... }

Cch 2: Dng t kha friend xy dng hm trong nh ngha lp. Mu vit nh sau:
class A { private: // Khai bo cc thuc tnh public: // Xy dng cc hm bn ca lp A void f1(...) { ... } double f2(...) { ... } A f3(...) { ... } ... }; 2. Tnh cht ca hm bn

Trong thn hm bn ca mt lp c th truy nhp ti cc thuc tnh ca cc i tng thuc lp ny. y l s khc nhau duy nht gia hm bn v hm thng thng. Ch rng hm bn khng phi l phng thc ca lp. Phng thc c mt

259

Chng 8. Hm bn, nh ngha php ton cho lp

i n (ng vi con tr this) v li gi ca phng thc phi gn vi mt i tng no (a ch i tng ny c truyn cho con tr this). Li gi ca hm bn ging nh li gi ca hm thng thng. V d sau s so snh phng thc, hm bn v hm thng thng. Xt lp SP (s phc), hy so snh 3 phng n thc hin vic cng 2 s phc: Phng n 1: Dng phng thc
class SP { private: double a; // phn thc double b; // Phn o public: SP cong(SP u2) { SP u: u.a = this a + u2.a ; u.b = this b + u2.b ; return u; } };

Cch dng:
SP u, u1, u2; u = u1.cong(u2);

Phng n 2: Dng hm bn
class SP { private: double a; // Phn thc double b; // Phn o public: friend SP cong(SP u1 , SP u2)

260

Chng 8. Hm bn, nh ngha php ton cho lp

{ SP u: u.a = u1.a + u2.a ; u.b = u1.b + u2.b ; return u; } };

Cch dng
SP u, u1, u2; u = cong(u1, u2);

Phng n 3: Dng hm thng thng


class SP { private: double a; // phn thc double b; // Phn o public: ... }; SP cong(SP u1, SP u2) { SP u: u.a = u1.a + u2.a ; u.b = u1.b + u2.b ; return u; }

Phng n ny khng c chp nhn, trnh bin dch s bo li trong thn hm khng c quyn truy xut n cc thuc tnh ring (private) a, b ca cc i tng u, u1 v u2 thuc lp SP.
3. Hm bn ca nhiu lp

Khi mt hm l bn ca nhiu lp, th n c quyn truy nhp ti tt c cc thuc tnh ca cc i tng trong cc lp ny.

261

Chng 8. Hm bn, nh ngha php ton cho lp

lm cho hm f tr thnh bn ca cc lp A, B v C ta s dng mu vit nh sau:


class A; class B; class C; class A { // Khai bo f l bn ca A friend void f(...) ; }; // nh ngha lp B class B { // Khai bo f l bn ca B friend void f(...) ; }; // nh ngha lp C class C { // Khai bo f l bn ca C friend void f(...) ; }; // Xy dng hm f void f(...) { ... } // Khai bo trc lp A // Khai bo trc lp B // Khai bo trc lp C

// nh ngha lp A

Chng trnh sau y minh ha cch dng hm bn (bn ca mt lp v bn ca nhiu lp). Chng trnh a vo 2 lp VT (vc t), MT (ma trn) v 3 hm bn thc hin cc thao tc trn 2 lp ny:
// Hm bn vi lp VT dng in mt vc t friend void in(const VT &x); // Hm bn vi lp MT dng in mt ma trn friend void in(const MT &a);

262

Chng 8. Hm bn, nh ngha php ton cho lp

// Hm bn vi c 2 lp MT v VT dng nhn ma trn vi vc t friend VT tich(const MT &a, const VT &x);

Ni dung chng trnh l nhp mt ma trn vung cp n v mt vc t cp n, sau thc hin php nhn ma trn vi vc t va nhp.
#include <conio.h> #include <iostream.h> #include <math.h> class VT; class MT; class VT { private: int n; double x[20]; // Toa do cua diem public: void nhapsl(); friend void in(const VT &x); friend VT tich(const MT &a, const VT &x) ; }; class MT { private: int n; double a[20][20]; public: friend VT tich(const MT &a, const VT &x); friend void in(const MT &a); void nhapsl(); }; void VT::nhapsl() { cout << "\n Cap vec to = ";

263

Chng 8. Hm bn, nh ngha php ton cho lp

cin >> n ; for (int i = 1; i< = n ; ++i) { cout << "\n Phan tu thu " << i <<" = " ; cin >> x[i]; } } void MT::nhapsl() { cout <<"\n Cap ma tran = "; cin >> n ; for (int i = 1; i< = n ; ++i) for (int j = 1; j< = n; ++j) { cout << "\n Phan tu thu: "<<i<< " hang "<< i << " cot " << j << " = "; cin >> a[i][j]; } } VT tich(const MT &a, const VT &x) { VT y; int n = a.n; if (n! = x.n) return x; y.n = n; for (int i = 1; i< = n; ++i) { y.x[i] = 0; for (int j = 1; j< = n; ++j) y.x[i] = a.a[i][j]*x.x[j]; } return y;

264

Chng 8. Hm bn, nh ngha php ton cho lp

} void in(const VT &x) { cout << "\n"; for (int i = 1; i< = x.n; ++i) cout << x.x[i] << " "; } void in(const MT &a) { for (int i = 1; i< = a.n; ++i) { cout << "\n " ; for (int j = 1; j< = a.n; ++j) cout << a.a[i][j] << " "; } } void main() { MT a; VT x, y; clrscr(); a.nhapsl(); x.nhapsl(); y = tich(a, x); clrscr(); cout << "\n Ma tran A:"; in(a); cout << "\n Vec to x: " ; in(x); cout << "\n Vec to y = Ax: " ; in(y); getch(); }

265

Chng 8. Hm bn, nh ngha php ton cho lp

II. NH NGHA PHP TON CHO LP i vi mi lp ta c th s dng li cc k hiu php ton thng dng (+, -, *, ) nh ngha cho cc php ton ca lp. Sau khi c nh ngha cc k hiu ny s c dng nh cc php ton ca lp theo cch vit thng thng. Cch nh ngha ny c gi l php chng ton t (nh khi nim chng hm trong cc chng trc).
1. Tn hm ton t

Gm t kho operator v tn php ton. V d:


operator+(nh ngha chng php +) operator- (nh ngha chng php -) 2. Cc i ca hm ton t

Vi cc php ton c 2 ton hng th hm ton t cn c 2 i. i th nht ng vi ton hng th nht, i th hai ng vi ton hng th hai. Do vy, vi cc php ton khng giao hon (php -) th th t i l rt quan trng. V d: Cc hm ton t cng, tr phn s c khai bo nh sau:
struct PS { int a; int b; }; PS operator+(PS p1, PS p2); PS operator-(PS p1 , PS p2); PS operator*(PS p1, PS p2); PS operator/(PS p1, PS p2); // p1 + p2 // p1 - p2 // p1 *p2 // p1/p2 //T s // Mu s

Vi cc php ton c mt ton hng, th hm ton t c mt i. V d hm ton t i du ma trn (i du tt c cc phn t ca ma trn) c khai bo nh sau:
struct MT { double a[20][20] ; int m ; // Mng cha cc phn t ma trn // S hng ma trn

266

Chng 8. Hm bn, nh ngha php ton cho lp

int n ; }; MT operator-(MT x) ; 3. Thn ca hm ton t

// S ct ma trn

Vit nh thn ca hm thng thng. V d hm i du ma trn c th c nh ngha nh sau:


struct MT { double a[20][20] ; int m ; int n ; }; MT operator-(MT x) { MT y; for (int i=1 ;i<= y.m ; ++i) for (int j =1 ;j<= y.n ; ++j)y.a[i][j] =- x.a[i][j]; return y; } a. Cch dng hm ton t // Mng cha cc phn t ma trn // S hng ma trn // S ct ma trn

C 2 cch dng: Cch 1: Dng nh mt hm thng thng bng cch vit li gi V d:


PS p, q, u, v ; u = operator+(p, q) ; v = operator-(p, q) ; // u = p + q // v= p - q

Cch 2: Dng nh php ton ca C++ V d:


PS p, q, u, v ; u=p+q; v=p-q; // u = p + q //v = p - q

Ch : Khi dng cc hm ton t nh php ton ca C++ ta c th kt hp nhiu

267

Chng 8. Hm bn, nh ngha php ton cho lp

php ton vit cc cng thc phc tp. Cng cho php dng du ngoc trn quy nh th t thc hin cc php tnh. Th t u tin ca cc php tnh vn tun theo cc quy tc ban u ca C++. Chng hn cc php * v / c th t u tin cao hn so vi cc php + v b. Cc v d v nh ngha chng ton t

V d 1 : Trong v d ny ngoi vic s dng cc hm ton t thc hin 4 php tnh trn phn s, cn nh ngha chng cc php ton << v >> xut v nhp phn s. Hm operator<< c 2 i kiu ostream& v PS (Phn s). Hm tr v gi tr kiu ostream& v c khai bo nh sau:
ostream& operator<< (ostream& os, PS p);

Tng t hm operator>> c khai bo nh sau:


istream& operator>> (istream& is,PS &p);

Di y s ch ra cch xy dng v s dng cc hm ton t. Chng ta cng s thy vic s dng cc hm ton t rt t nhin, ngn gn v tin li.
#include <conio.h> #include <iostream.h> #include <math.h> typedef struct { int a,b; } PS; ostream& operator<< (ostream& os, PS p); istream& operator>> (istream& is,PS &p); int uscln(int x, int y); PS rutgon(PS p); PS operator+(PS p1, PS p2); PS operator-(PS p1, PS p2); PS operator*(PS p1, PS p2); PS operator/(PS p1, PS p2); ostream& operator<< (ostream& os, PS p) { os << p.a << '/' << p.b ;

268

Chng 8. Hm bn, nh ngha php ton cho lp

return os; } istream& operator>> (istream& is,PS &p) { cout << "\n Nhap tu va mau: '' ; is >> p.a >> p.b ; return is; } int uscln(int x, int y) { x=abs(x);y=abs(y); if (x*y==0) return 1; while (x!=y) { if (x>y) x-=y; else y-=x; } return x; } PS rutgon(PS p) { PS q; int x; x=uscln(p.a,p.b); q.a = p.a / x ; q.b = p.b/ x ; return q; } PS operator+(PS p1, PS p2) { PS q; q.a = p1.a*p2.b + p2.a*p1.b; q.b = p1 .b * p2.b ;

269

Chng 8. Hm bn, nh ngha php ton cho lp

return rutgon(q); } PS operator-(PS p1, PS p2) { PS q; q.a = p1.a*p2.b - p2.a*p1 .b; q.b = p1.b * p2.b ; return rutgon(q); } PS operator*(PS p1, PS p2) { PS q; q.a = p1.a * p2.a ; q.b = p1.b * p2.b ; return rutgon(q); } PS operator/(PS p1 , PS p2) { PS q; q.a = p1.a * p2.b ; q.b = p1.b * p2.a ; return rutgon(q); } void main() { PS p, q, z, u, v ; PS s; cout <<"\nNhap cac PS p, q, z, u, v: '' ; cin >> p >> q >> z >> u >> v ; s = (p - q*z) / (u + v) ; cout << "\n Phan so s = " << s; getch(); }

270

Chng 8. Hm bn, nh ngha php ton cho lp

V d 2 : Chng trnh a vo cc hm ton t: operator- c mt i dng o du mt a thc operator+ c 2 i dng cng 2 a thc operator- c 2 i dng tr 2 a thc operator* c 2 i dng nhn 2 a thc operator^c 2 i dng tnh gi a thc ti x perator<< c 2 i dng in a thc perator>> c 2 i dng nhp a thc Chng trnh s nhp 4 a thc: p, q, r, s. Sau tnh a thc: f = -(p+q)*(r-s) Cui cng tnh gi tr f(x), vi x l mt s thc nhp t bn phm.
#include <conio.h> #include <iostream.h> #include <math.h> struct DT { double a[20];// Mang chua cac he so da thuc a0, a1,... int n ;// Bac da thuc }; ostream& operator<< (ostream& os, DT d); istream& operator>> (istream& is, DT &d); DT operator-(const DT& d); DT operator+(DT d1, DT d2); DT operator-(DT d1, DT d2); DT operator*(DT d1, DT d2); double operator^(DT d, double x);// Tinh gia tri da thuc ostream& operator<< (ostream& os, DT d) { os << " Cac he so (tu ao): '' ; for (int i=0 ;i<= d.n ;++i) os << d.a[i] <<" " ;

271

Chng 8. Hm bn, nh ngha php ton cho lp

return os; } istream& operator>> (istream& is, DT &d) { cout << " Bac da thuc: '' ; cin >> d.n; cout << ''Nhap cac he so da thuc:" ; for (int i=0 ;i<=d.n ;++i) { cout << "\n He so bac " << i <<" = '' ; is >> d.a[i] ; } return is; } DT operator-(const DT& d) { DT p; p.n = d.n; for (int i=0 ;i<=d.n ;++i) p.a[i] = -d.a[i]; return p; } DT operator+(DT d1, DT d2) { DT d; int k,i; k = d1.n > d2.n ? d1.n : d2.n ; for (i=0;i<=k ;++i) if (i<=d1.n && i<=d2.n) d.a[i] = d1.a[i] + d2.a[i]; else if (i<=d1.n) d.a[i] = d1.a[i]; else d.a[i] = d2.a[i]; i = k; while (i>0 && d.a[i]==0.0) --i;

272

Chng 8. Hm bn, nh ngha php ton cho lp

d.n=i; return d ; } DT operator-(DT d1, DT d2) { return (d1 + (-d2)); } DT operator*(DT d1 , DT d2) { DT d; int k, i, j; k = d.n = d1.n + d2.n ; for (i=0;i<=k;++i) d.a[i] = 0; for (i=0 ;i<= d1 .n ;++i) for (j=0 ;j<= d2.n ;++j) d.a[i+j] += d1 .a[i]*d2.a[j]; return d; } double operator^(DT d, double x) { double s=0.0 , t=1.0; for (int i=0 ;i<= d.n ;++i) { s += d.a[i]*t; t *= x; } return s; } void main() { DT p,q,r,s,f; double x,g; clrscr();

273

Chng 8. Hm bn, nh ngha php ton cho lp

cout <<"\n Nhap da thuc P '' ;cin >> p; cout <<"\n Nhap da thuc Q '' ;cin >> q; cout <<"\n Nhap da thuc R '' ;cin >> r; cout <<"\n Nhap da thuc S '' ;cin >> s; cout << "\n Nhap so thuc x: '' ;cin >> x; f = -(p+q)*(r-s); g = f^x; cout << "\n Da thuc f "<< f ; cout << "\n x = '' << x; cout << "\n f(x) = '' << g; getch(); }

274

Chng 9. Cc dng nhp/xut v file

CHNG 9

CC DNG NHP/XUT V FILE


Nhp/xut vi cin/cout nh dng In ra my in Lm vic vi File Nhp/xut nh phn

Trong C++ c sn mt s lp chun cha d liu v cc phng thc phc v cho cc thao tc nhp/xut d liu ca NSD, thng c gi chung l stream (dng). Trong s cc lp ny, lp c tn ios l lp c s, cha cc thuc tnh nh dng vic nhp/xut v kim tra li. M rng (k tha) lp ny c cc lp istream, ostream cung cp thm cc ton t nhp/xut nh >>, << v cc hm get, getline, read, ignore, put, write, flush Mt lp rng hn c tn iostream l tng hp ca 2 lp trn. Bn lp nhp/xut c bn ny c khai bo trong cc file tiu c tn tng ng (vi ui *.h). S tha k ca 4 lp trn c th hin qua hnh v di y.

ios istream ostream

iostream i tng ca cc lp trn c gi l cc dng d liu. Mt s i tng thuc lp iostream c khai bo sn (chun) v c gn vi nhng thit b nhp/xut c nh nh cc i tng cin, cout, cerr, clog gn vi bn phm (cin) v mn hnh (cout, cerr, clog). iu ny c ngha cc ton t >>, << v cc hm k trn khi lm vic vi cc i tng ny s cho php NSD nhp d liu thng qua bn phm hoc xut kt qu thng qua mn hnh. nhp/xut thng qua cc thit b khc (nh my in, file trn a ), C++

275

Chng 9. Cc dng nhp/xut v file

cung cp thm cc lp ifstream, ofstream, fstream cho php NSD khai bo cc i tng mi gn vi thit b v t nhp/xut thng qua cc thit b ny. Trong chng ny, chng ta s xt cc i tng chun cin, cout v mt s ton t, hm nhp xut c trng ca lp iostream cng nh cch to v s dng cc i tng thuc cc lp ifstream, ofstream, fstream lm vic vi cc thit b nh my in v file trn a. I. NHP/XUT VI CIN/COUT Nh nhc trn, cin l dng d liu nhp (i tng) thuc lp istream. Cc thao tc trn i tng ny gm c cc ton t v hm phc v nhp d liu vo cho bin t bn phm.
1. Ton t nhp >>

Ton t ny cho php nhp d liu t mt dng Input_stream no vo cho mt danh sch cc bin. C php chung nh sau:
Input_stream >> bin1 >> bin2 >>

trong Input_stream l i tng thuc lp istream. Trng hp Input_stream l cin, cu lnh nhp s c vit:
cin >> bin1 >> bin2 >>

cu lnh ny cho php nhp d liu t bn phm cho cc bin. Cc bin ny c th thuc cc kiu chun nh : kiu nguyn, thc, k t, xu k t. Ch 2 c im quan trng ca cu lnh trn. Lnh s b qua khng gn cc du trng (du cch <>, du Tab, du xung dng ) vo cho cc bin (k c bin xu k t). Khi NSD nhp vo dy byte nhiu hn cn thit gn cho cc bin th s byte cn li v k c du xung dng s nm li trong cin. Cc byte ny s t ng gn cho cc bin trong ln nhp sau m khng ch NSD g thm d liu vo t bn phm. Do vy cu lnh
cin >> a >> b >> c;

cng c th c vit thnh


cin >> a; cin >> b; cin >> c;

v ch cn nhp d liu vo t bn phm mt ln chung cho c 3 lnh (mi d liu nhp cho mi bin phi cch nhau t nht mt du trng) V d 1 : Nhp d liu cho cc bin

276

Chng 9. Cc dng nhp/xut v file

int a; float b; char c; char *s; cin >> a >> b >> c >> s;

gi s NSD nhp vo dy d liu : <><>12<>34.517ABC<>12E<>D khi cc bin s c nhn nhng gi tr c th sau:


a = 12 b = 34.517 c = 'A' s = "BC"

trong cin s cn li dy d liu : <>12E<>D . Nu trong on chng trnh tip theo c cu lnh cin >> s; th s s c t ng gn gi tr "12E" m khng cn NSD nhp thm d liu vo cho cin. Qua v d trn mt ln na ta nhc li c im ca ton t nhp >> l cc bin ch ly d liu va cho kiu ca bin (v d bin c ch ly mt k t 'A', b ly gi tr 34.517) hoc cho n khi gp du trng u tin (v d a ly gi tr 12, s ly gi tr "BC" d trong cin vn cn d liu). T ta thy ton t >> l khng ph hp khi nhp d liu cho cc xu k t c cha du cch. C++ gii quyt trng hp ny bng mt s hm (phng thc) nhp khc thay cho ton t >>.
2. Cc hm nhp k t v xu k t a. Nhp k t

cin.get() : Hm tr li mt k t (k c du cch, du ).. V d:


char ch; ch = cin.get();

nu nhp AB, ch nhn gi tr 'A', trong cin cn B. nu nhp A, ch nhn gi tr 'A', trong cin cn . nu nhp , ch nhn gi tr '', trong cin rng. cin.get(ch) : Hm nhp k t cho ch v tr li mt tham chiu ti cin. Do hm tr li tham chiu ti cin nn c th vit cc phng thc nhp ny lin tip trn mt i tng cin. V d:
char c, d; cin.get(c).get(d);

277

Chng 9. Cc dng nhp/xut v file

nu nhp AB th c nhn gi tr 'A' v d nhn gi tr 'B'. Trong cin cn 'C'.


b. Nhp xu k t

cin.get(s, n, fchar) : Hm nhp cho s dy k t t cin. Dy c tnh t k t u tin trong cin cho n khi n 1 k t hoc gp k t kt thc fchar. K t kt thc ny c ngm nh l du xung dng nu b b qua trong danh sch i. Tc c th vit cu lnh trn di dng cin.get(s, n) khi xu s s nhn dy k t nhp cho n khi n-1 k t hoc n khi NSD kt thc nhp (bng du ). Ch : Lnh s t ng gn du kt thc xu ('\0') vo cho xu s sau khi nhp xong. Cc lnh c th vit ni nhau, v d: cin.get(s1, n1).get(s2,n2); K t kt thc fchar (hoc ) vn nm li trong cin. iu ny c th lm tri cc lnh get() tip theo. V d:
struct Sinhvien { char *ht; char *qq; }; void main() { int i; for (i=1; i<=3; i++) { cout << "Nhap ho ten sv thu " << i; cin.get(sv[i].ht, 25); cout << "Nhap que quan sv thu "<< i; cin.get(sv[i].qq, 30); } } // h tn // qu qun

Trong on lnh trn sau khi nhp h tn ca sinh vin th 1, do k t vn nm trong b m nn khi nhp qu qun chng trnh s ly k t ny gn cho qq, do qu qun ca sinh vin s l xu rng. khc phc tnh trng ny chng ta c th s dng mt trong cc cu lnh nhp k t "nhc" du enter cn "ri vi" ra khi b m. C th s dng cc cu lnh sau :
cin.get(); cin.ignore(n); // c mt k t trong b m //c n k t trong b m (vi n=1)

278

Chng 9. Cc dng nhp/xut v file

nh vy on chng trnh trn hot ng tt ta c th t chc li nh sau:


void main() { int i; for (i=1; i<=3; i++) { cout << "Nhap ho ten sv thu " << i; cin.get(sv[i].ht, 25); cin.get(); cin.get() } } // nhc 1 k t (enter) // hoc cin.ignore(1); cout << "Nhap que quan sv thu "<< i; cin.get(sv[i].qq, 30);

cin.getline(s, n, fchar): Phng thc ny hot ng hon ton tng t phng thc cin.get(s, n, fchar), tuy nhin n c th khc phc "li enter" ca cu lnh trn. C th hm sau khi gn ni dung nhp cho bin s s xa k t enter khi b m v do vy NSD khng cn phi s dng thm cc cu lnh ph tr (cin.get(), cin.ignore(1)) loi enter ra khi b m. cin.ignore(n): Phng thc ny ca i tng cin dng c v loi b n k t cn trong b m (dng nhp cin). Ch : Ton t nhp >> cng ging cc phng thc nhp k t v xu k t ch cng li k t enter trong cin. Do vy, chng ta nn s dng cc phng thc cin.get(), cin.ignore(n) loi b k t enter trc khi thc hin lnh nhp k t v xu k t khc. Tng t dng nhp cin, cout l dng d liu xut thuc lp ostream. iu ny c ngha d liu lm vic vi cc thao tc xut (in) s a kt qu ra cout m c mc nh l mn hnh. Do ta c th s dng ton t xut << v cc phng thc xut trong cc lp ios (lp c s) v ostream.
3. Ton t xut <<

Ton t ny cho php xut gi tr ca dy cc biu thc n mt dng Output_stream no vi c php chung nh sau:
Output_stream << bt_1 << bt_2 <<

y Output_stream l i tng thuc lp ostream. Trng hp Output_stream l cout, cu lnh xut s c vit:
cout << bt_1 << bt_2 <<

cu lnh ny cho php in kt qu ca cc biu thc ra mn hnh. Kiu d liu ca

279

Chng 9. Cc dng nhp/xut v file

cc biu thc c th l s nguyn, thc, k t hoc xu k t. II. NH DNG Cc gi tr in ra mn hnh c th c trnh by di nhiu dng khc nhau thng qua cc cng c nh dng nh cc phng thc, cc c v cc b phn khc c khai bo sn trong cc lp ios v ostream.
1. Cc phng thc nh dng a. Ch nh rng cn in cout.width(n) ;

S ct trn mn hnh in mt gi tr c ngm nh bng vi rng thc (s ch s, ch ci v k t khc trong gi t c in). t li rng mn hnh dnh cho gi tr cn in (thng thng ln hn rng thc) ta c th s dng phng thc trn. Phng thc ny cho php cc gi tr in ra mn hnh vi rng n. Nu n b hn rng thc s ca gi tr th my s in gi tr vi s ct mn hnh bng vi rng thc. Nu n ln hn rng thc, my s in gi tr cn theo l phi, v trng cc ct tha pha trc gi tr c in. Phng thc ny ch c tc dng vi gi tr cn in ngay sau n. V d:
int a = 12; b = 345; cout << a; cout.width(7); cout << b; // rng thc ca a l 2, ca b l 3 // chim 2 ct mn hnh // t rng gi tr in tip theo l 7 // b in trong 7 ct vi 4 du cch ng trc

Kt qu in ra s l: 12<><><><>345
b. Ch nh k t chn vo khong trng trc gi tr cn in cout.fill(ch) ;

K t n ngm nh l du cch, c ngha khi rng ca gi tr cn in b hn rng ch nh th my s n cc du cch vo trc gi tr cn in cho vi rng ch nh. C th yu cu n mt k t ch bt k thay cho du cch bng phng thc trn. V d trong dy lnh trn, nu ta thm dng lnh cout.fill('*') trc khi in b chng hn th kt qu in ra s l: 12****345. Phng thc ny c tc dng vi mi cu lnh in sau n cho n khi gp mt ch nh mi.
c. Ch nh chnh xc (s s l thp phn) cn in cout.precision(n) ;

Phng thc ny yu cu cc s thc in ra sau s c n ch s l. Cc s

280

Chng 9. Cc dng nhp/xut v file

thc trc khi in ra s c lm trn n ch s l th n. Ch nh ny c tc dng cho n khi gp mt ch nh mi. V d:


int a = 12.3; b = 345.678; cout << a; cout.width(10); cout.precision(2); cout << b; // rng thc ca a l 4, ca b l 7 // chim 4 ct mn hnh // t rng gi tr in tip theo l 10 // t chnh xc n 2 s l // b in trong 10 ct vi 4 du cch ng trc

Kt qu in ra s l: 12.3<><><><>345.68
2. Cc c nh dng

Mt s cc qui nh v nh dng thng c gn lin vi cc "c". Thng thng nu nh dng ny c s dng trong sut qu trnh chy chng trnh hoc trong mt khong thi gian di trc khi g b th ta "bt" cc c tng ng vi n. Cc c c bt s c tc dng cho n khi c vi nh dng khc c bt. Cc c c cho trong file tiu iostream.h. bt/tt cc c ta s dng cc phng thc sau:
cout.setf(danh sch c); cout.unsetf(danh sch c); // Bt cc c trong danh sch // Tt cc c trong danh sch

Cc c trong danh sch c vit cch nhau bi php ton hp bit (|). V d lnh cout.setf(ios::left | ios::scientific) s bt cc c ios::left v ios::scientific. Phng thc cout.unsetf(ios::right | ios::fixed) s tt cc c ios::right | ios::fixed. Di y l danh sch cc c cho trong iostream.h.
a. Nhm cn l

ios::left : nu bt th gi tr in nm bn tri vng in ra (k t n nm sau). ios::right : gi tr in nm bn phi vng in ra (k t n nm trc), y l trng hp ngm nh nu ta khng s dng c c th. ios::internal : ging c ios::right tuy nhin du ca gi tr in ra s c in u tin, sau mi n k t n v gi tr s. V d:
int a = 12.3; b = 345.678; cout << a; cout.width(10); cout.fill('*') ; cout.precision(2); cout.setf(ios::left) ; // rng thc ca a l 4, ca b l 8 // chim 4 ct mn hnh // t rng gi tr in tip theo l 10 // du * lm k t n // t chnh xc n 2 s l // bt c ios::left

281

Chng 9. Cc dng nhp/xut v file

cout << b; cout.setf(ios::right) ; cout << b; cout.setf(ios::internal) ; cout << b; b. Nhm nh dng s nguyn

// kt qa: 12.3345.68*** // bt c ios::right // kt qa: 12.3***345.68 // bt c ios::internal // kt qa: 12.3***345.68

ios::dec : in s nguyn di dng thp phn (ngm nh) ios::oct : in s nguyn di dng c s 8 ios::hex : in s nguyn di dng c s 16
c. Nhm nh dng s thc

ios::fixed : in s thc dng du phy tnh (ngm nh) ios::scientific : in s thc dng du phy ng ios::showpoint : in n ch s l ca phn thp phn, nu tt (ngm nh) th khng in cc s 0 cui ca phn thp phn. V d: gi s chnh xc c t vi 3 s l (bi cu lnh cout.precision(3)) nu fixed bt + showpoint bt :
123.2500 123.2599 123.2 123.2500 123.2599 123.2 12.3 2.32599 324 12.3 2.32599 324 c in thnh c in thnh c in thnh c in thnh c in thnh c in thnh c in thnh c in thnh c in thnh c in thnh c in thnh c in thnh 123.250 123.260 123.200 123.25 123.26 123.2 1.230e+01 2.326e+00 3.240e+02 1.23e+01 2.326e+00 3.24e+02

nu fixed bt + showpoint tt :

nu scientific bt + showpoint bt :

nu scientific bt + showpoint tt :

282

Chng 9. Cc dng nhp/xut v file

d. Nhm nh dng hin th

ios::showpos : nu tt (ngm nh) th khng in du cng (+) trc s dng. Nu bt trc mi s dng s in thm du cng. ios::showbase : nu bt s in s 0 trc cc s nguyn h 8 v in 0x trc s h 16. Nu tt (ngm nh) s khng in 0 v 0x. ios::uppercase : nu bt th cc k t biu din s trong h 16 (A..F) s vit hoa, nu tt (ngm nh) s vit thng.
3. Cc b v hm nh dng iostream.h cng cung cp mt s b v hm nh dng cho php s dng tin li hn so vi cc c v cc phng thc v n c th c vit lin tip trn dng lnh xut. a. Cc b nh dng dec oct hex endl flush // tng t ios::dec // tng t ios::dec // tng t ios::hex // xut k t xung dng ('\n') // y ton b d liu ra dng xut // cho php in cc k t biu th c s // di dng ch vit hoa // in 0xAB v 0x20

V d :
cout.setf(ios::showbase) ; cout.setf(ios::uppercase) ; int a = 171; int b = 32 ; cout << hex << a << endl << b ;

b. Cc hm nh dng (#include <iomanip.h>) setw(n) setprecision(n) setfill(c) setiosflags(l) resetiosflags(l) // tng t cout.width(n) // tng t cout.precision(n) // tng t cout.fill(c) // tng t cout.setf(l) // tng t cout.unsetf(l)

III. IN RA MY IN Nh trong phn u chng trnh by, lm vic vi cc thit b khc vi mn hnh v a chng ta cn to ra cc i tng (thuc cc lp ifstream, ofstream v fstream) tc cc dng tin bng cc hm to ca lp v gn chng vi

283

Chng 9. Cc dng nhp/xut v file

thit b bng cu lnh:


ofstream Tn_dng(thit b) ;

V d to mt i tng mang tn Mayin v gn vi my in, chng ta dng lnh:


ofstream Mayin(4) ;

trong 4 l s hiu ca my in. Khi mi cu lnh dng ton t xut << v cho ra Mayin s a d liu cn in vo mt b m mc nh trong b nh. Nu b m y, mt s thng tin a vo trc s t ng chuyn ra my in. ch ng a tt c d liu cn li trong b m ra my in chng ta cn s dng b nh dng flush (Mayin << flush << ) hoc phng thc flush (Mayin.flush(); ). V d: Sau khi khai bo mt i tng mang tn Mayin bng cu lnh nh trn in chu vi v din tch hnh ch nht c cnh cd v cr ta c th vit:
Mayin << "Din tch HCN = " << cd * cr << endl; Mayin << "Chu vi HCN = " << 2*(cd + cr) << endl; Mayin.flush();

hoc :
Mayin << "Din tch HCN = " << cd * cr << endl; Mayin << "Chu vi HCN = " << 2*(cd + cr) << endl << flush;

khi chng trnh kt thc mi d liu cn li trong cc i tng s c t ng chuyn ra thit b gn vi n. V d my in s in tt c mi d liu cn st li trong Mayin khi chng trnh kt thc. IV. LM VIC VI FILE Lm vic vi mt file trn a cng c quan nim nh lm vic vi cc thit b khc ca my tnh (v d nh lm vic vi my in vi i tng Mayin trong phn trn hoc lm vic vi mn hnh vi i tng chun cout). Cc i tng ny c khai bo thuc lp ifstream hay ofstream ty thuc ta mun s dng file c hay ghi. Nh vy, s dng mt file d liu u tin chng ta cn to i tng v gn cho file ny. to i tng c th s dng cc hm to c sn trong hai lp ifstream v ofstream. i tng s c gn vi tn file c th trn a ngay trong qu trnh to i tng (to i tng vi tham s l tn file) hoc cng c th c gn vi tn file sau ny bng cu lnh m file. Sau khi gn mt i tng vi file trn a, c th s dng i tng nh i vi Mayin hoc cin, cout. iu ny c ngha trong cc cu lnh in ra mn hnh ch cn thay t kha cout bi tn i tng mi d liu cn in trong cu lnh s c ghi ln file m i tng i din. Cng tng t nu thay cin bi tn i tng, d liu s c c vo t file thay cho t 284

Chng 9. Cc dng nhp/xut v file

bn phm. to i tng dng cho vic ghi ta khai bo chng vi lp ofstream cn dng cho vic c ta khai bo chng vi lp ifstream.
1. To i tng gn vi file

Mi lp ifstream v ofstream cung cp 4 phng thc to file. y chng ti ch trnh by 2 cch (2 phng thc) hay dng. + Cch 1:
<Lp> i_tng; i_tng.open(tn_file, ch_);

Lp l mt trong hai lp ifstream v ofstream. i tng l tn do NSD t t. Ch l cch thc lm vic vi file (xem di). Cch ny cho php to trc mt i tng cha gn vi file c th no. Sau dng tip phng thc open ng thi m file v gn vi i tng va to. V d:
ifstream f; ofstream f; f.open("Baitap"); // to i tng c tn f c hoc // to i tng c tn f ghi // m file Baitap v gn vi f

+ Cch 2:

<Lp> i_tng(tn_file, ch_)

Cch ny cho php ng thi m file c th v gn file vi tn i tng trong cu lnh. V d:


ifstream f("Baitap"); ofstream f("Baitap); // m file Baitap gn vi i tng f // c hoc ghi.

Sau khi m file v gn vi i tng f, mi thao tc trn f cng chnh l lm vic vi file Baitap. Trong cc cu lnh trn c cc ch qui nh cch thc lm vic ca file. Cc ch ny gm c: ios::binary : quan nim file theo kiu nh phn. Ngm nh l kiu vn bn. ios::in : file c (ngm nh vi i tng trong ifstream). ios::out : file ghi (ngm nh vi i tng trong ofstream), nu file c trn a th ni dung ca n s b ghi (b xa).ios::app : b sung vo cui file ios::trunc : xa ni dung file c ios::ate : chuyn con tr n cui file ios::nocreate : khng lm g nu file cha c

285

Chng 9. Cc dng nhp/xut v file

ios::replace : khng lm g nu file c c th ch nh cng lc nhiu ch bng cch ghi chng lin tip nhau vi ton t hp bit |. V d m file bi tp nh mt file nh phn v ghi tip theo vo cui file ta dng cu lnh:
ofstream f("Baitap", ios::binary | ios::app); 2. ng file v gii phng i tng

ng file c i din bi f, s dng phng thc close nh sau:


i_tng.close();

Sau khi ng file (v gii phng mi lin kt gia i tng v file) c th dng i tng gn v lm vic vi file khc bng phng thc open nh trn. V d 2 : c mt dy s t bn phm v ghi ln file. File c xem nh file vn bn (ngm nh), cc s c ghi cch nhau 1 du cch.
#include <iostream.h> #include <fstream.h> #include <conio.h> void main() { ofstream f; int x; f.open("DAYSO"); for (int i = 1; i<=10; i++) { cin >> x; f << x << ' '; } f.close(); } // m file DAYSO v gn vi f // khai bo (to) i tng f

V d 3 : Chng trnh sau nhp danh sch sinh vin, ghi vo file 1, c ra mng, sp xp theo tui v in ra file 2. Dng u tin trong file ghi s sinh vin, cc dng tip theo ghi thng tin ca sinh vin gm h tn vi rng 24 k t, tui vi rng 4 k t v im vi rng 8 k t.
#include <iostream.h> #include <iomanip.h> #include <fstream.h> #include <stdlib.h>

286

Chng 9. Cc dng nhp/xut v file

#include <stdio.h> #include <conio.h> #include <ctype.h> struct Sv { char *hoten; int tuoi; double diem; }; class Sinhvien { int sosv ; Sv *sv; public: Sinhvien() { sosv = 0; sv = NULL; } void nhap(); void sapxep(); void ghifile(char *fname); }; void Sinhvien::nhap() { cout << "\nS sinh vin: "; cin >> sosv; int n = sosv; sv = new Sinhvien[n+1]; for (int i = 1; i <= n; i++) { cout << "\nNhp sinh vin th: " << i << endl; cout << "\nH tn: "; cin.ignore(); cin.getline(sv[i].hoten); cout << "\nTui: "; cin >> sv[i].tuoi; cout << "\nim: "; cin >> sv[i].diem; } } // B phn t th 0

287

Chng 9. Cc dng nhp/xut v file

void Sinhvien::ghi(char fname) { ofstream f(fname) ; f << sosv; f << setprecision(1) << setiosflags(ios::showpoint) ; for (int i=1; i<=sosv; i++) { f << endl << setw(24) << sv[i].hoten << setw(4) << tuoi; f << setw(8) << sv[i].diem; } f.close(); } void Sinhvien::doc(char fname) { ifstream f(fname) ; f >> sosv; for (int i=1; i<=sosv; i++) { f.getline(sv[i].hoten, 25); f >> sv[i].tuoi >> sv[i].diem; } f.close(); } void Sinhvien::sapxep() { int n = sosv; for (int i = 1; i < n; i++) { for (int j = j+1; j <= n; j++) { if (sv[i].tuoi > sv[j].tuoi) { Sinhvien t = sv[i]; sv[i] = sv[j]; sv[j] = t; } } void main() { clrscr();

288

Chng 9. Cc dng nhp/xut v file

Sinhvien x ; x.nhap(); x.ghi("DSSV1"); x.doc("DSSV1"); x.sapxep(); x.ghi("DSSV2"); cout << " xong"; getch(); } 3. Kim tra s tn ti ca file, kim tra ht file

Vic m mt file cha c c s gy nn li v lm dng chng trnh. Khi xy ra li m file, gi tr tr li ca phng thc bad l mt s khc 0. Do vy c th s dng phng thc ny kim tra mt file c trn a hay cha. V d:
ifstream f("Bai tap"); if (f.bad()) { cout << "file Baitap cha c"; exit(1); }

Khi c hoc ghi, con tr file s chuyn dn v cui file. Khi con tr cui file, phng thc eof() s tr li gi tr khc khng. Do c th s dng phng thc ny kim tra ht file hay cha. Chng trnh sau cho php tnh di ca file Baitap. File cn c m theo kiu nh phn.
#include <iostream.h> #include <fstream.h> #include <stdlib.h> #include <conio.h> void main() { clrscr(); long dodai = 0; char ch; ifstream f("Baitap", ios::in | ios::binary) ; if (f.bad()) { cout << "File Baitap khng c"; exit(1); }

289

Chng 9. Cc dng nhp/xut v file

while (!f.eof()) { f.get(ch)); dodai++; } cout << " di ca file = " << dodai; getch(); } 4. c ghi ng thi trn file

c ghi ng thi, file phi c gn vi i tng ca lp fstream l lp tha k ca 2 lp ifstream v ofstream. Khi ch phi c bao gm ch nh ios::in | ios::out. V d:
fstream f("Data", ios::in | ios::out) ;

hoc
fstream f ; f.open("Data", ios::in | ios::out) ; 5. Di chuyn con tr file

Cc phng thc sau cho php lm vic trn i tng ca dng xut (ofstream). i_tng.seekp(n) ; Di chuyn con tr n byte th n (cc byte c tnh t 0) i_tng.seekp(n, v tr xut pht) ; Di chuyn i n byte (c th m hoc dng) t v tr xut pht. V tr xut pht gm: ios::beg : t u file ios::end : t cui file ios::cur : t v tr hin ti ca con tr. i_tng.tellp(n) ; Cho bit v tr hin ti ca con tr. lm vic vi dng nhp tn cc phng thc trn c thay tng ng bi cc tn : seekg v tellg. i vi cc dng nhp ln xut c th s dng c c 6 phng thc trn. V d sau tnh di tp n gin hn v d trn.
fstream f("Baitap"); f.seekg(0, ios::end); cout << " di bng = " << f.tellg();

290

Chng 9. Cc dng nhp/xut v file

V d 4 : Chng trnh nhp v in danh sch sinh vin trn ghi/c ng thi.
#include <iostream.h> #include <iomanip.h> #include <fstream.h> #include <stdlib.h> #include <stdio.h> #include <conio.h> #include <ctype.h> void main() { int stt ; char *hoten, *fname, traloi; int tuoi; float diem; fstream f; cout << "Nhp tn file: "; cin >> fname; f.open(fname, ios::in | ios::out | ios::noreplace) ; if (f.bad()) { cout << "Tp c. Ghi (C/K)?" ; cin.get(traloi) ; if (toupper(traloi) == 'C') { f.close() ; f.open(fname, ios::in | ios::out | ios::trunc) ; } else exit(1); } stt = 0; f << setprecision(1) << setiosflags(ios::showpoint) ; // nhp danh sch while (1) { stt++; cout << "\nNhp sinh vin th " << stt ; cout << "\nH tn: "; cin.ignore() ; cin.getline(hoten, 25); if (hoten[0] = 0) break; cout << "\nTui: "; cin >> tuoi;

291

Chng 9. Cc dng nhp/xut v file

cout << "\nim: "; cin >> diem; f << setw(24) << hoten << endl; f << setw(4) << tuoi << set(8) << diem ; } // in danh sch f.seekg(0) ; stt = 0; clrscr(); cout << "Danh sch sinh vin nhp\n" ; cout << setprecision(1) << setiosflags(ios::showpoint) ; while (1) { f.getline(hoten,25); if (f.eof()) break; stt++; f >> tuoi >> diem; f.ignore(); cout << "\nSinh vin th " << stt ; cout << "\nH tn: " << hoten; cout << "\nTui: " << setw(4) << tuoi; cout << "\nim: " << setw(8) << diem; } f.close(); getch(); } // quay v u danh sch

V. NHP/XUT NH PHN
1. Khi nim v 2 loi file: vn bn v nh phn a. File vn bn

Trong file vn bn mi byte c xem l mt k t. Tuy nhin nu 2 byte 10 (LF), 13 (CR) i lin nhau th c xem l mt k t v n l k t xung dng. Nh vy file vn bn l mt tp hp cc dng k t vi k t xung dng c m l 10. K t c m 26 c xem l k t kt thc file.
b. File nh phn

292

Chng 9. Cc dng nhp/xut v file

Thng tin lu trong file c xem nh dy byte bnh thng. M kt thc file c chn l -1, c nh ngha l EOF trong stdio.h. Cc thao tc trn file nh phn thng c ghi tng byte mt, khng quan tm ngha ca byte. Mt s cc thao tc nhp/xut s c hiu qu khc nhau khi m file di cc dng khc nhau. V d 1 : gi s ch = 10, khi f << ch s ghi 2 byte 10,13 ln file vn bn f, trong khi lnh ny ch khi 1 byte 10 ln file nh phn. Ngc li, nu f la file vn bn th f.getc(ch) s tr v ch 1 byte 10 khi c c 2 byte 10, 13 lin tip nhau. Mt file lun ngm nh di dng vn bn, do vy ch nh file l nh phn ta cn s dng c ios::binary.
2. c, ghi k t

put(c); get(c);

// ghi k t ra file // c k t t file

V d 2 : Sao chp file 1 sang file 2. Cn sao chp v ghi tng byte mt do vy chnh xc ta s m cc file di dng nh phn.
#include <iostream.h> #include <fstream.h> #include <stdlib.h> #include <conio.h> void main() { clrscr(); fstream fnguon("DATA1", ios::in | ios::binary); fstream fdich("DATA2", ios::out | ios::binary); char ch; while (!fnguon.eof()) { fnguon.get(ch); fdich.put(ch); } fnguon.close(); fdich.close(); }

293

Chng 9. Cc dng nhp/xut v file

3. c, ghi dy k t

write(char *buf, int n); read(char *buf, int n); gcount();

// ghi n k t trong buf ra dng xut // nhp n k t t buf vo dng nhp // cho bit s k t read c c

V d 3 : Chng trnh sao chp file trn c th s dng cc phng thc mi ny nh sau:
#include <iostream.h> #include <fstream.h> #include <stdlib.h> #include <conio.h> void main() { clrscr(); fstream fnguon("DATA1", ios::in | ios::binary); fstream fdich("DATA2", ios::out | ios::binary); char buf[2000] ; int n = 2000; while (n) { fnguon.read(buf, 2000); n = fnguon.gcount(); fdich.write(buf, n); } fnguon.close(); fdich.close(); } 4. c ghi ng thi #include <iostream.h> #include <iomanip.h> #include <fstream.h> #include <stdlib.h> #include <stdio.h>

294

Chng 9. Cc dng nhp/xut v file

#include <conio.h> #include <string.h> #include <ctype.h> struct Sv { char *hoten; int tuoi; double diem; }; class Sinhvien { int sosv; Sv x; char fname[30]; static int size; public: Sinhvien(char *fn); void tao(); void bosung(); void xemsua(); }; int Sinhvien::size = sizeof(Sv); Sinhvien::Sinhvien(char *fn) { strcpy(fname, fn) ; fstream f; f.open(fname, ios::in | ios::ate | ios::binary); if (!f.good) sosv = 0; else { sosv = f.tellg() / size; } } void Sinhvien::tao()

295

Chng 9. Cc dng nhp/xut v file

{ fstream f; f.open(fname, ios::out | ios::noreplace | ios::binary); if (!f.good()) { cout << "danh sach da co. Co tao lai (C/K) ?"; char traloi = getch(); if (toupper(traloi) == 'C') return; else { f.close() ; f.open(fname, ios::out | ios::trunc | ios::binary); } } sosv = 0 while (1) { cout << "\nSinh vin th: " << sosv+1; cout << "\nH tn: "; cin.ignore(); cin.getline(x.hoten); if (x.hoten[0] == 0) break; cout << "\nTui: "; cin >> x.tuoi; cout << "\nim: "; cin >> x.diem; f.write((char*)(&x), size); sosv++; } f.close(); } void Sinhvien::bosung() { fstream f; f.open(fname, ios::out | ios::app | ios::binary); if (!f.good()) { cout << "danh sach chua co. Tao moi (C/K) ?"; char traloi = getch(); if (toupper(traloi) == 'C') return; else {

296

Chng 9. Cc dng nhp/xut v file

f.close() ; f.open(fname, ios::out | ios::binary); } } int stt = 0 while (1) { cout << "\nB sung sinh vin th: " << stt+1; cout << "\nH tn: "; cin.ignore(); cin.getline(x.hoten); if (x.hoten[0] == 0) break; cout << "\nTui: "; cin >> x.tuoi; cout << "\nim: "; cin >> x.diem; f.write((char*)(&x), size); stt++; } sosv += stt; f.close(); } void Sinhvien::xemsua() { fstream f; int ch; f.open(fname, ios::out | ios::app | ios::binary); if (!f.good()) { cout << "danh sach chua co"; getch(); return; } cout << "\nDanh sch sinh vin" << endl; int stt ; while (1) { cout << "\nCn xem (sua) sinh vin th (0: dng): " ; cin >> stt; if (stt < 1 || stt > sosv) break; f.seekg((stt-1) * size, ios::beg);

297

Chng 9. Cc dng nhp/xut v file

f.read((char*)(&x), size); cout << "\nH tn: " << x.hoten; cout << "\nTui: " << x.tuoi; cout << "\nim: " << x.diem; cout << "C sa khng (C/K) ?"; cin >> traloi; if (toupper(traloi) == 'C') { f.seekg(-size, ios::cur); cout << "\nH tn: "; cin.ignore(); cin.getline(x.hoten); cout << "\nTui: "; cin >> x.tuoi; cout << "\nim: "; cin >> x.diem; f.write((char*)(&x), size); } } f.close(); } void main() { int chon; Sinhvien SV("DSSV") ; while (1) { clrscr(); cout << "\n1: To danh sch sinh vin"; cout << "\n2: B sung danh sch"; cout << "\n3: Xem sa danh sch"; cout << "\n0: Kt thc"; chon = getch(); chon = chon 48; clrscr(); if (chon == 1) SV.tao(); else if (chon == 2) SV.bosung(); else if (chon == 3) SV.xemsua(); else break;

298

Chng 9. Cc dng nhp/xut v file

} }

BI TP
1. 2. 3. 4. 5. 6. 7. 8. Vit chng trnh m s dng ca mt file vn bn. Vit chng trnh c in tng k t ca file vn bn ra mn hnh, mi mn hnh 20 dng. Vit chng trnh tm xu di nht trong mt file vn bn. Vit chng trnh ghp mt file vn bn th hai vo file vn bn th nht, trong tt c ch ci ca file vn bn th nht phi i thnh ch in hoa. Vit chng trnh in ni dung file ra mn hnh v cho bit tng s ch ci, tng s ch s xut hin trong file. Cho 2 file s thc ( c sp tng dn). In ra mn hnh dy s xp tng dn ca c 2 file. (Cn to c 2 file d liu ny bng Editor ca C++). Vit hm nhp 10 s thc t bn phm vo file INPUT.DAT. Vit hm c cc s thc t file trn v in tng bnh phng ca chng ra mn hnh. Vit hm nhp 10 s nguyn t bn phm vo file vn bn tn INPUT.DAT. Vit hm c cc s nguyn t file trn v ghi nhng s chn vo file EVEN.DAT cn cc s l vo file ODD.DAT. Nhp bng chng trnh 2 ma trn s nguyn vo 2 file vn bn. Hy to file vn bn th 3 cha ni dung ca ma trn tch ca 2 ma trn trn.

9.

10. T chc qun l file sinh vin (H tn, ngy sinh, gii tnh, im) vi cc chc nng : Nhp, xem, xa, sa, tnh im trung chung. 11. Thng tin v mt nhn vin trong c quan bao gm : h v tn, ngh nghip, s in thoi, a ch nh ring. Vit hm nhp t bn phm thng tin ca 7 nhn vin v ghi vo file INPUT.DAT. Vit hm tm trong file INPUT.DAT v in ra thng tin ca 1 nhn vin theo s in thoi c nhp t bn phm.

299

MC LC
Chng 1. CC KHI NIM C BN CA C++
I. CC YU T C BN ................................................................................................1

1. 2. 3. 4.

Bng k t ca C++ ............................................................................................... 1 T kho .................................................................................................................. 2 Tn gi.................................................................................................................... 2 Ch thch trong chng trnh ................................................................................. 3

II. MI TRNG LM VIC CA C++ ............................................................................3

1. Khi ng - Thot khi C++.................................................................................. 3 2. Giao din v ca s son tho ................................................................................ 4 3. Cu trc mt chng trnh trong C++.................................................................... 7
III. CC BC TO V THC HIN MT CHNG TRNH ...................................8

1. 2. 3. 4. 1. 2. 3. 4.

Qui trnh vit v thc hin chng trnh ................................................................ 8 Son tho tp chng trnh ngun ......................................................................... 8 Dch chng trnh .................................................................................................. 9 Chy chng trnh.................................................................................................. 9 Vo d liu t bn phm......................................................................................... 9 In d liu ra mn hnh .......................................................................................... 10 nh dng thng tin cn in ra mn hnh ............................................................... 12 Vo/ra trong C...................................................................................................... 14

IV. VO/RA TRONG C++ ...................................................................................................9

Chng 2. KIU D LIU, BIU THC V CU LNH


I. KIU D LIU N GIN..........................................................................................20

1. 2. 3. 4.

Khi nim v kiu d liu .................................................................................... 20 Kiu k t............................................................................................................. 21 Kiu s nguyn..................................................................................................... 22 Kiu s thc ......................................................................................................... 22

II. HNG - KHAI BO V S DNG HNG ..................................................................23

1. Hng nguyn ........................................................................................................ 23 2. Hng thc ............................................................................................................. 23 3. Hng k t............................................................................................................. 24

300

4. Hng xu k t ...................................................................................................... 25 5. Khai bo hng....................................................................................................... 26


III. BIN - KHAI BO V S DNG BIN ......................................................................27

1. 2. 3. 4. 5. 6. 7. 8.

Khai bo bin ....................................................................................................... 27 Phm vi ca bin .................................................................................................. 28 Gn gi tr cho bin (php gn)............................................................................ 28 Mt s im lu v php gn ............................................................................ 29 Php ton .............................................................................................................. 30 Cc php gn ........................................................................................................ 32 Biu thc .............................................................................................................. 33 Cu lnh v khi lnh........................................................................................... 37

IV. PHP TON, BIU THC V CU LNH.................................................................30

V. TH VIN CC HM TON HC .............................................................................38

1. Cc hm s hc ................................................................................................... 38 2. Cc hm lng gic.............................................................................................. 38

Chng 3. CU TRC IU KHIN V D LIU KIU MNG


I. CU TRC R NHNH ..............................................................................................41

1. Cu lnh iu kin if ............................................................................................ 41 2. Cu lnh la chn switch ..................................................................................... 43 3. Cu lnh nhy goto............................................................................................... 45
II. CU TRC LP ..........................................................................................................47

1. 2. 3. 4. 5.

Lnh lp for .......................................................................................................... 47 Lnh lp while...................................................................................................... 51 Lnh lp do ... while............................................................................................. 55 Li ra ca vng lp: break, continue .................................................................... 57 So snh cch dng cc cu lnh lp ..................................................................... 58

III. MNG D LIU ..........................................................................................................59

1. Mng mt chiu.................................................................................................... 59 2. Xu k t............................................................................................................... 63


IV. MNG HAI CHIU.......................................................................................................73

301

Chng 4. HM V CHNG TRNH


I. CON TR V S HC A CH .................................................................................83

1. 2. 3. 4. 5. 6. 1. 2. 3. 4. 5. 6. 7. 8. 1. 2. 3. 4.

a ch, php ton & ............................................................................................ 83 Con tr.................................................................................................................. 84 Cc php ton vi con tr..................................................................................... 86 Cp pht ng, ton t cp pht, thu hi new, delete........................................... 88 Con tr v mng, xu k t ................................................................................... 90 Mng con tr ........................................................................................................ 94 Khai bo v nh ngha hm................................................................................. 95 Li gi v s dng hm........................................................................................ 98 Hm vi i mc nh ........................................................................................ 100 Khai bo hm trng tn ...................................................................................... 101 Bin, i tham chiu........................................................................................... 102 Cc cch truyn tham i ................................................................................... 104 Hm v mng d liu ......................................................................................... 109 Con tr hm........................................................................................................ 119 Khi nim qui ................................................................................................ 123 Lp cc bi ton gii c bng qui ............................................................. 124 Cu trc chung ca hm qui .......................................................................... 125 Cc v d............................................................................................................. 125

II. HM .............................................................................................................................95

III. QUI.......................................................................................................................123

IV. T CHC CHNG TRNH.....................................................................................127

1. Cc loi bin v phm vi .................................................................................... 127 2. Bin vi mc ch c bit................................................................................. 132 3. Cc ch th tin x l .......................................................................................... 135 Chng 5. D LIU KIU CU TRC V HP
I. KIU CU TRC.......................................................................................................145

1. 2. 3. 4. 5. 6.

Khai bo, khi to .............................................................................................. 145 Truy nhp cc thnh phn kiu cu trc............................................................. 147 Php ton gn cu trc ....................................................................................... 148 Cc v d minh ho............................................................................................. 150 Hm vi cu trc ................................................................................................ 152 Cu trc vi thnh phn kiu bit ........................................................................ 164

302

7. Cu lnh typedef................................................................................................. 165 8. Hm sizeof()....................................................................................................... 166


II. CU TRC T TR V DANH SCH LIN KT....................................................166

1. Cu trc t tr .................................................................................................... 167 2. Khi nim danh sch lin kt ............................................................................. 169 3. Cc php ton trn danh sch lin kt ................................................................ 170
III. KIU HP .................................................................................................................176

1. Khai bo ............................................................................................................. 176 2. Truy cp.............................................................................................................. 176


IV. KIU LIT K............................................................................................................177

Chng 6. HA V M THANH
I. HO.....................................................................................................................184

1. 2. 3. 4. 5. 6.

Khi nim ho ............................................................................................... 184 Vo/ra ch ho.......................................................................................... 185 V im, ng, khi, mu sc.......................................................................... 188 Vit vn bn trong mn hnh ha .................................................................. 195 Chuyn ng ...................................................................................................... 197 V th ca cc hm ton hc.......................................................................... 200

II. M THANH ................................................................................................................207

Chng 7. LP V I TNG
I. LP TRNH CU TRC V LP TRNH HNG I TNG .............................212

1. Phng php lp trnh cu trc .......................................................................... 212 2. Phng php lp trnh hng i tng ............................................................ 214
II. LP V I TNG ..............................................................................................216

1. Khai bo lp ....................................................................................................... 217 2. Khai bo cc thnh phn ca lp (thuc tnh v phng thc) ......................... 217 3. Bin, mng v con tr i tng ....................................................................... 219
III. I CA PHNG THC, CON TR this ............................................................224

1. Con tr this l i th nht ca phng thc .................................................... 224 2. Tham s ng vi i con tr this ....................................................................... 225 3. Cc i khc ca phng thc .......................................................................... 226
IV. HM TO (Constructor) ..........................................................................................230

303

1. Hm to (hm thit lp) .................................................................................... 230 2. Lp khng c hm to v hm to mc nh ................................................... 235 3. Hm to sao chp (Copy constructor) .............................................................. 238
V. HM HY (Destructor) ........................................................................................... 246

1. 2. 3. 4. 1. 2. 3. 4.

Hm hy mc nh ............................................................................................ 246 Quy tc vit hm hy ........................................................................................ 246 Vai tr ca hm hy trong lp DT .................................................................... 247 V d ................................................................................................................. 247 u nhc im ca hm .................................................................................. Cc hm trc tuyn .......................................................................................... Cch bin dch v dng hm trc tuyn ........................................................... S hn ch ca trnh bin dch ......................................................................... 253 253 254 255

VI. CC HM TRC TUYN (inline) ........................................................................... 253

Chng 8. HM BN, NH NGHA PHP TON CHO LP


I. HM BN (friend function) .................................................................................... 258

1. Hm bn ........................................................................................................... 258 2. Tnh cht ca hm bn ..................................................................................... 259 3. Hm bn ca nhiu lp ...................................................................................... 261


II. NH NGHA PHP TON CHO LP .................................................................... 266

1. Tn hm ton t ................................................................................................ 266 2. Cc i ca hm ton t ................................................................................... 266 3. Thn ca hm ton t ....................................................................................... 267 Chng 11. CC DNG NHP/XUT V FILE
I. NHP/XUT VI CIN/COUT ................................................................................... 276

1. Ton t nhp >> ................................................................................................. 276 2. Cc hm nhp k t v xu k t......................................................................... 277 3. Ton t xut << .................................................................................................. 279
II. NH DNG.............................................................................................................. 279

1. Cc phng thc nh dng ............................................................................... 280 2. Cc c nh dng................................................................................................ 281 3. Cc b v hm nh dng ................................................................................... 283
III. IN RA MY IN............................................................................................................283

304

IV. LM VIC VI FILE..................................................................................................284

1. 2. 3. 4. 5. 1. 2. 3. 4.

To i tng gn vi file.................................................................................. 284 ng file v gii phng i tng ..................................................................... 285 Kim tra s tn ti ca file, kim tra ht file...................................................... 289 c ghi ng thi trn file ................................................................................. 290 Di chuyn con tr file......................................................................................... 290 Khi nim v 2 loi file: vn bn v nh phn.................................................... 292 c, ghi k t...................................................................................................... 293 c, ghi dy k t............................................................................................... 293 c ghi ng thi............................................................................................... 294

V. NHP/XUT NH PHN............................................................................................292

305

TI LIU THAM KHO


1. B.W. Kerninghan and D.M. Ritchie. The C Programming Language. PrenticeHall, 1978. Ng Trung Vit (dch). Ngn ng lp trnh C. Vin Tin hc, H Ni 1990. 2. Peter Norton. Advanced C Programming. Nguyn Vit Hi (dch). Lp trnh C nng cao. Nh xut bn Giao thng vn ti. H Ni, 1995. 3. Phm Vn t. K thut lp trnh C. C s v nng cao. Nh xut bn Khoa hc v k thut. H Ni, 1996. 4. Phm Vn t. C++ v lp trnh hng i tng. Nh xut bn Khoa hc v k thut. H Ni, 2000. 5. Scott Robert Ladd. Nguyn Hng (dch). C++ K thut v ng dng. Cng ty c phn t vn v dch v KHKT - SCITEC, 1992. 6. Jan Skansholm. C++ From the Beginning. Addison-Wesley, 1997.

306

You might also like