Professional Documents
Culture Documents
Giaotrinh C++
Giaotrinh C++
C++
LP TRNH HNG
I TNG
Ti liu hc tp
Trang | 1
PH LC
GII THIU
.............................................................................................................7
C BN V C++ ............................................................................ 23
CHNG 2.
T kha ................................................................................................................................ 26
Kiu d liu nguyn thy.............................................................................................. 27
Khai bo bin ..................................................................................................................... 28
Phm vi tc dng ca bin............................................................................................ 29
Khi to gi tr cho bin ................................................................................................ 30
Khi to gi tr cho bin tnh static .......................................................................... 31
Gii thiu v xu k t .................................................................................................... 32
CHNG 3.
HNG .............................................................................................. 34
Hng s nguyn................................................................................................................. 34
Hng s thc c du chm ng ................................................................................ 34
Hng k t v hng xu k t ........................................................................................ 35
Hng logic ............................................................................................................................ 36
nh ngha mt hng #define ..................................................................................... 36
Khai bo hng const ........................................................................................................ 37
CHNG 4.
TON T ....................................................................................... 38
Ton t gn ......................................................................................................................... 38
Ton t thc hin php ton s hc ........................................................................ 39
Ton t gn hp nht ..................................................................................................... 40
Ton t tng v{ gim ...................................................................................................... 40
Ton t logic ...................................................................................................................... 42
Ton t iu kin ............................................................................................................. 43
Ton t phn tch ............................................................................................................ 45
Trang |2
C++
Ton t so snh................................................................................................................. 41
HM................................................................................................. 72
CON TR ........................................................................................ 93
C++
C++
Hm bn v lp bn ..................................................................................................... 144
Chng cht ton t ....................................................................................................... 147
Tnh k tha - Inheritance......................................................................................... 153
Cc mc truy cp ........................................................................................................... 156
Tnh a k tha Multiple Inheritance ............................................................... 159
Tnh a hnh Polymorphism ................................................................................. 160
Tnh tru tng ha - Abstraction ........................................................................ 172
Hm mu Template Function ............................................................................... 173
Lp mu Template class ......................................................................................... 173
CHNG 14. NAMESPACE ............................................................................... 178
T kha namespace ..................................................................................................... 178
T kha using ................................................................................................................. 179
Phm vi ca namespace ............................................................................................. 180
T|i nh danh cho namespace ................................................................................. 181
Namespace std ............................................................................................................... 181
CHNG 15. NGOI L .................................................................................... 182
Mnh trycatch ....................................................................................................... 182
Mnh throw ............................................................................................................... 182
Th vin chun exception ......................................................................................... 183
CHNG 16. LM VIC VI FILE................................................................... 186
M file ................................................................................................................................ 186
ng file ............................................................................................................................ 188
File vn bn...................................................................................................................... 188
Kim tra trng thi ca cc c hiu ....................................................................... 189
Con tr get v put .......................................................................................................... 190
File nh phn.................................................................................................................... 192
CHNG 17. CC LP TH VIN ................................................................. 194
1. Lp s phc complex .............................................................................................. 194
Trang |5
C++
B m v{ ng b ha .............................................................................................. 193
C++
Trang |6
GII THIU
1. Cu trc ca gio trnh
Gi|o trnh c chia ra lm 17 chng v mi chng c chia lm
cc mc khc nhau. C|c chng c sp xp theo trnh t t lp trnh
hng th tc trn C++ n lp trnh hng i tng v cc lp th
vin c bn. c gi c th truy cp vo mc bt k t phn ph lc nm
u sch. Nhiu mc bao gm cc v d m t cch s dng. Ti
khuyn cc bn nn c cc v d ny v c th hiu mi on m
chng trnh trc khi c chng tip theo.
Mt cch thc tt tng lng kin thc nhn c l{ h~y chnh
sa, b sung m lnh mi da trn v d mu, theo hng t duy ca
ca bn thn, t c th hiu mt c|ch y v ni dung m ta
tip thu c.
Sau khi c xong gio trnh, ti cn cung cp mt s bi tp thc hnh
ngh c gi nn th nghim. Hy gii nhng bi tp ny, chng s
rt hu ch v gip cc bn cng c li kin thc mn hc cng nh hiu
su sc hn phn l thuyt.
Mt iu na m c gi cn lu : h~y c trang cui cng ca cun
s|ch, nm c mt s thut ng anh-vit tng ng c s dng
trong gio trnh ny. Ti cng c gng s dng tn gi ph hp nht vi
i a s cc gio trnh hin hnh. Tuy nhin, c gi cng nn nm cc
thut ng ting anh tng ng, c th tham kho thm cc ti liu
chuyn mn ting anh.
C++
Khi vit gio trnh ny, ti khng th trnh khi sai st. Rt mong s
ng gp kin qu bu ca cc bn c gi cng nh c|c bn ng
nghip. Mi s ng gp xin lin h theo a ch email:
dnhthanh@hueic.edu.vn. Hi vng vi cc kin ng gp ca cc bn,
gio trnh ny s ngy cng hon thin hn.
http://ftp.jaist.ac.jp/pub/eclipse/technology/epp/downloads/release/helios/R/eclipse-cpp-helioswin32.zip
2 http://nchc.dl.sourceforge.net/project/mingw/Automated%20MinGW%20Installer/mingw-getinst/mingw-get-inst-20100831/mingw-get-inst-20100831.exe
1
Trang |8
C++
C++
Trang |9
C++
C++
2. Eclipse Helios
Sau khi ti xong Eclipe Helios v my, hy tin hnh gii nn tp tin.
Chng trnh Eclipse khng yu cu chng ta phi c{i t, nhng n c th
lm vic nu trn my tnh ~ c{i mt my o Java. ti v my o Java,
chng ta c th truy cp vo trang ch ca Sun (nay l Oracle) ti a ch
sau }y3.
xy dng mt chng trnh C/C++ trn Eclipse, chng ta cn:
- Eclipse Helios for C/C++ (nu phin bn ti v l dnh cho Java, ta cn
phi c{i t thm plugin h tr); hoc c th s dng mt n bn c hn
ca Eclipse nh Galileo, Europa.
- Cng c bin dch GCC MingW.
- My o Java JVM.
Cc bc cu hnh trn Eclipse Helios
Bc 1. C{i t my o Java.
Bc 2. Ci MinGW.
Bc 3. Gii nn Eclipse Helios, sau khi ng n (nhp vo tp tin
eclipse.exe). Thng thng, Eclipse s t ng cu hnh MinGW gip ta. Nu
khng, hy thc hin bc 4.
Bc 4. Vo menu Project > Properties. Trong hp thoi xut hin, hy
chn C/C++ Build > Settings.
http://javadl.sun.com/webapps/download/AutoDL?BundleId=41723
T r a n g | 12
C++
Trong th Tool Settings, ta chn GCC Assembler > General. Sau , nhp vo
biu tng c du cng mu xanh. Hp thoi sau s hin ra:
Sau , hy nhp vo tn d n v
nhp Next (nu cha cu hnh
MinGW), hoc nhp Finish (nu ~ hon tt vic cu hnh).
Hnh 5 - To mi d n
T r a n g | 13
C++
src
cpps
headers
Main.cpp
Hnh 6 - Cu trc th mc ca mt d n
Bin dch mt d n
bin dch mt d n, hy nhp vo biu tng sau }y trn thay cng c
ca Eclipse.
T r a n g | 14
C++
C++
hin ra, hy chn cc thuc tnh cn to phng thc getter v setter, sau
nhp Ok.
Mt s phm tt khc
Phm tt
Ctrl+Space
main Ctrl+Space
Ctrl+Shift+F
Ctrl+/
Cng dng
Bt ch gi nhc lnh.
Khi to nhanh hm main.
nh dng nhanh m ngun.
Comment vng m~ ~ c bi en, nu
vng bi en ~ ch comment, th du
comment s b hy b.
Tab
Dch ton b ni dung b bi en sang phi
mt tab.
Shift+Tab
Dch ton b ni dung b bi en sang tr|i
mt tab.
Ctrl+1
Chnh sa nhanh ton b cc t ging vi
t ang c bi en. Sau khi chnh sa
xong, nhp Enter kt thc.
Ctrl+Shift+/
To mt khi comment cho vng vn bn
~ b bi en.
Ctrl+Shift+\
Hy b vng vn bn b comment bi khi
comment.
Trn }y, ti ~ gii thiu s qua hai chng trnh son tho min ph
lp trnh C/C++: CodeBlocks v Eclipse. Vi CodeBlocks, ch cn ti v ci
t. Mi trng h tr bin dch GCC ~ c tch hp sn. Vi Eclipse, ta
phi thc hin cu hnh kt hp vi trnh bin dch GCC. Nu l{ ngi c
nhiu tri nghim v my tnh, th nn chn Eclipse bi n l{ chng trnh
son tho rt chuyn nghip. Nu l{ ngi mi tip xc my tnh, hy chn
CodeBlock v c{i t n gin.
C++
Win32 m khng tho lun thm v Visual C++ for Net bi v n thuc mt
phm tr tng i khc so vi Visual C++ for Win32.
Khi ng Visual Studio 2010.
khi ng VS 2010, ta c th thc hin mt trong hai cch sau:
Nhp i chut vo biu tng VS 2010 trn nn Desktop.
Vo Start > All Programs > Microsoft Visual Studio 2010, chn biu
tng VS 2010.
T r a n g | 17
C++
C++
C++
T r a n g | 19
T r a n g | 20
C++
C++
T r a n g | 22
C++
Chng 1. C bn v C++
CHNG 1.
C BN V C++
Kt qu
Hello, world !
C++
Chng 1. C bn v C++
trong trng hp ny c thc s quan trng ? Chng ta nn lun khai
bo hm main c kiu d liu tr v l kiu int. S d nh vy l v khi
hm main tr v kiu int th theo quy c, nu chng trnh c li, n s
tr v mt m~ int kh|c 0 v{ ngc li, nu chng trnh khng c li, n
s tr v m int 0. Li }y l{ li chng trnh lin quan n qu trnh
bin dch, ch khng phi l li lin quan n c php. Chng ta s nhn
thy m m n tr v trong dng thng bo cui cng khi bin dch:
process returned 0 (0x0).
Tn hm l main. Tip theo l cp du ngoc n dng cha tham s
nh km. Thng thng mt chng trnh ng dng s cha hai tham
s trong hm main l int argc v char* args[]. Cc tham s ny gi l
tham s dng lnh. Tip theo l du {}. Bn trong cp du n{y l{ chng
trnh chnh.
[5.] Du m khi.
[6.] i tng cout (c l C-out) l chun dng xut d liu ra mn
hnh. Chng ta cn lu hm printf vn hot ng tt trong trng hp
ny. Nu dng hm printf th ta khng cn khai b|o th vin iostream v
namespace std trn. Khi s dng i tng cout, chng ta cng c th
b qua dng lnh [3.] v{ thay v{o ta s vit std::cout. Khi s dng i
tng cout, chng ta c thm mt cch thc xung dng thay v dng
\n, l{ endl. i tng cout thng i vi ton t xut <<. Chng ta c
th s dng nhiu ton t ny khi mun xut nhiu phn t ring bit:
cout<<string1<<string2<<.<<endl.
[7.] Cu lnh return dng tr v gi tr ca hm main. Nu hm c tr
v gi tr, th cn return mt gi tr n{o cng kiu d liu tr v vi
hm. Nu hm l void, th khng cn return.
[8.] Du ng khi tng ng vi m khi [5].
C++
Ch :
Chng 1. C bn v C++
du ng (thng thng cc trnh son tho s h tr mt cch t
ng). Sau h~y nhp ni dung cn thit vo bn trong cp du ny.
iu s trnh khi s nhm ln khi chng trnh c qu| nhiu du
ng m.
nhn bit c phm vi nh hng ca cc khi lnh hy s dng
phm tab to ra s li lm khi vit m~ chng trnh. Nh trong v d
trn, i tng cout v hm return s nhy vo mt tab so vi du khi
lnh tng ng. ng bao gi tit kim s dng phm tab v phm
enter. Nu s dng hp l, chng trnh s rt sng sa v d c.
C++
Bi tp 1.
1. Hy vit chng trnh in ra dng ch Chao ban, ban co khoe khong.
2. Hy vit chng trnh in ra hai dng ch trn hai dng phn bit
Vietnam v{ Hoa ky.
3. Hy vit chng trnh in ra tam gi|c u vi c|c nh l cc du *.
*
* *
T r a n g | 25
CHNG 2.
T r a n g | 26
C++
T kha
Tn
char
M t
K t hoc s nguyn b
short
S nguyn ngn
int
S nguyn
long
S nguyn di
Gi tr logic true/false
S thp phn
S thp phn chm ng
S thp phn chm ng
T r a n g | 27
Kch thc
Vng gi tr
1 byte
signed: -128 ->127
unsigned: 0 -> 255
2 byte
signed: -215 -> 215-1
unsigned: 0 -> 216-1
4 byte
signed: -231 -> 231-1
unsigned: 0 -> 232-1
4 byte
signed: -231 -> 231-1
unsigned: 0 -> 232-1
8 byte
signed: -263 -> 263-1
unsigned: 0 -> 264-1
1 byte
true v false
4 byte
7 s thp phn
8 byte
15 s thp phn
8 byte
15 s thp phn
C++
Khai bo bin
Nh v d trn, ta thy rng, mun s dng mt bin trong C++, ta
cn khai bo bin vi kiu d liu m ta mong mun. Cu trc khai bo
<Tn kiu d liu> <Tn bin>;
V d
int a; //Khai bo bin a kiu nguyn
float mynumber; //Khai bo bin mynumber kiu float
bool istrue; //Khai bo bin istrue kiu bool
long num1, num2, num3; //Khai bo ba bin num1, num2, num3 cng kiu
long
Ch :
Nu khi khai bo bin thuc cc kiu nguyn m ta khng s dng khai bo
c du (signed) hoc khng du (unsigned), th chng trnh dch mc nh
s quy nh l kiu nguyn c du.
int mynum;
T r a n g | 28
C++
Kt qu
#include <iostream>
[1.]
[2.]
#include <iostream>
using namespace std;
[3.]
[4.]
[5.]
int a;
char c;
unsigned int d;
[6.]
[7.]
int main()
{//Khi lnh 1
T r a n g | 29
C++
Chng trnh
signed long m;
float n;
{//Khi lnh 2
double x;
x = 1;
cout<<x;
}
}
Gii thch:
Cc bin khai bo c|c dng [3.], [4.] v{ [5.] c khai bo ngoi mi
khi lnh, n c tc dng trong ton b chng trnh v{ n c gi l bin
ton cc (global variable). Cc bin c khai bo trong khi lnh 1 (tng
ng [8.] v [9.]) v khi lnh 2 (tng ng [11.] v [12.]) gi l bin cc b
(local variable), n c tc dng trong khi lnh trc tip cha n. C ngha
l bin x ch c tc dng trong khi lnh 2; bin m, n c tc dng trong khi
lnh 1.
Cc bin ton cc c th c s dng trong ton b chng trnh, n
c th c gi trong cc hm, trong hm chnh main. Cn bin cc b c
khai bo trong khi lnh no, th n ch c th c s dng trong khi lnh
.
Trong mt s tnh hung, bin c th c khai bo trong du ngoc
n (tnh hung ny thng gp khi nghin cu cc lnh c cu trc), th
bin n{y cng gi l bin cc b
for (int a = 0; i<10; i++){
nhp ni dung.
}
Lc ny, bin s c tc dng trong khi lnh tng ng (khi lnh nm
trong vng lp for).
Khi mt bin cc b c khai bo, gi tr mc nh ca n s cha
c to ra. V vy, mun s dng c bin, ta cn phi khi to gi tr
cho bin. C hai c|ch khi to gi tr ca bin trong C++.
T r a n g | 30
C++
V d
int a = 0;
int a (0);
#include <iostream>
#include <iostream>
int main()
int main()
{
int a = 5;
int a (5);
int b = 2;
int b (2);
a = a + 1; // a=6
a = a + 1; // a=6
cout<<result<<endl;
cout<<result<<endl;
result 0;
result 0;
Bi tp 2.
1. Hy vit mt chng trnh tng ng, s dng c hai kiu khi to
trn.
2. Hy chn mt cch khi to ty , vit chng trnh tnh gi| tr ca
biu thc delta = b*b-4*a*c, vi a, b, c ln lt nhn cc gi tr 1, 5, 3.
T r a n g | 31
C++
Kt qu
3
4
5
6
7
int main()
{
for (int i=0; i<5; i++)
{
static int x = 2;
x++;
cout<<x<<endl;
}
}
Gii thch: bin x c khi to trong vng lp for, nu khng c t kha
static, th trong mi ln lp, bin ny s c khi to li v gi tr in ra s
lun l 3. Tuy nhin, trong trng hp ny, ta s dng t kha static, do ,
gi tr ca bin x ch c khi to mt ln duy nht. Trong nhng ln lp
tip theo, gi tr ca x vn c lu li. Kt qu ta nhn c nh trn.
Gii thiu v xu k t
Mt bin c th dng lu mt loi d liu khng phi s, nhng n
li cha nhiu k t (khng nh kiu char) m chng ta s gi n l kiu xu
k t.
#include <iostream>
#include <iostream>
#include <string>
T r a n g | 32
C++
int main()
char a[] = abc;
char* b = abc;
string a = abc;
return 0;
return 0;
C++
bit thm thng tin v kiu string, cc bn nn tham kho thm thng
tin v lp string c cung cp trong mc 4 ca chng 17 trong cng gio
trnh ny.
T r a n g | 33
Chng 3. Hng
CHNG 3.
HNG
Hng s nguyn
Hng s nguyn l cc hng c gi tr l s nguyn. Hng s nguyn
c th c biu din di dng thp phn, bt phn, hoc thp lc phn.
Nu hng s nguyn di dng thp phn th c gi tr nh s thp
ph}n bnh thng. Nu l hng s nguyn bt phn, th n bt u bng s 0
(v d 011). Nu l hng s nguyn thp lc phn, th n bt u bng 0x (v
d 0x1b). Cc quy tc chuyn i s qua li gia cc h ~ c nghin cu
trong hc phn Nhp mn tin hc.
Nu hng s l s nguyn c du hoc khng du, c th c mt vi
c|ch khai b|o tng ng.
Hng nguyn c du v khng du
75 //int
75u //unsigned int
75l //long
75ul //unsigned long
Cc tin t v hu t trong hai cch s dng trn c th vit thng hoc
vit hoa (0x12 hay 0X12 l{ nh nhau; hoc 75ul hay 75UL l{ nh nhau).
Chng ta kho st s thc di dng s thp phn du chm ng
hoc di dng khoa hc (hay cn gi l dng ly tha dng E tng ng
vi ly tha 10). V d 314.159e-2 tng ng vi 3.14159 hay 6.02e23
tng ng vi 6.02*1023
T r a n g | 34
C++
Chng 3. Hng
Mt hng s thc mc nh l double. Nu mun ch nh kiu d liu
cho n, ta c th s dng c ph|p tng t nh i vi hng s nguyn
(3.1415L tng ng long double, 3.1415F tng ng vi float).
Cc k t e, f, l c th biu din di dng ch hoa hoc ch thng.
Hng k t v hng xu k t
Hng k t c s dng trong du nh|y n, cn hng xu k t
c s dng trong du nhy kp.
x
Tn bin
x K t x
x Xu k t x
Trong hng xu k t, c th cha cc k t c bit nh k t xung
dng, t tab Sau }y l{ mt vi k t c bit v{ ngha ca chng.
K hiu
\n
\r
\t
\v
\b
\f
\a
\,
\\
ngha
Xung dng
Di chuyn ton b k t sau du \r ln c|c k t trc .
Nu s k t sau nhiu hn s k t trc du \r, th kt qu in
ra s l ton b k t nm sau. V d abc\r1234 -> s in ra
1234, nu abc\r12 -> s in ra 12c.
t tab
t tab dc
t backspace
t du form feed
To m thanh beep
\, \?, To cc k t , , ?, \
T r a n g | 35
Xu k t ghp
C++
Chng 3. Hng
Khi s dng hng xu k t vi kiu d liu l wchar_t, ta cn thm
tin t L bn trc xu k t . V d LXau ki tu wchar_t.
Cc quy tc trn c th p dng cho bt k hng xu k t thuc kiu
d liu no (char*, wchar_t*, string hoc mng k t tng ng).
Hng logic
Hng logic c hai gi tr l true (ng) v false (sai). Mt biu thc
logic s c kiu d liu l bool. N ch c th nhn mt trong hai gi tr true
v false. Trong C, ta ch c th s dng kiu s nguyn (short, int, long)
quy nh gi tr ca biu thc logic: nu gi tr nhn c l 0 tng ng
vi gi tr sai; ngc li, nu gi tr nhn c l khc 0 tng ng vi gi
tr ng. C|ch quy nh ny vn cn hot ng tt trn C++. Tuy nhin,
trong C++, ngi ta ~ nh ngha hai hng s true v false v kiu d liu
bool. Hng s true tng ng vi gi tr 1 v hng s false tng ng vi
gi tr 0. Ta hon ton c th s dng gi tr true (hoc 1) v false (hoc 0).
V d
#define PI 3.14
#define NewLine \n
Kt qu
#include <iostream>
3.14
#define PI 3.14
int main()
T r a n g | 36
C++
Chng 3. Hng
{
double r = 1;
double s;
s = PI*r*r;
cout<<s;
return 0;
}
Thc cht, #define khng phi l mt cu lnh trong C++, n ch l
mt nh hng tin x l (directive for the preprocessor). Cho nn, ta cn
lu rng, kt thc phn khai bo ny, khng c du chm phy (;).
V d
const int a = 10;
const char x = \t;
C++
T r a n g | 37
Chng 4. To|n t
CHNG 4.
TON T
Ton t gn
Ton t g|n dng gn gi tr cho mt bin. V d a = 5;
Cu lnh gn s thc hin gn gi tr bn phi cho bin bn tri. Ta cng
c th gn gi tr ca hai bin cho nhau. V d a = b;
Hy quan st v suy ngm on chng trnh sau:
Chng trnh
[1.]
[2.]
[3.]
[4.]
[5.]
[6.]
[7.]
[8.]
[9.]
[10.]
[11.]
[12.]
#include <iostream>
using namespace std;
int main()
{
int a, b;
a = 10;
b = 4;
a = b;
b = 7;
cout<<a=<<a<<, b=<<b<<endl;
return 0;
}
Dng lnh [5.] khai bo hai bin nguyn a, b. Khi gi| tr ca chng
cha c khi to. Dng lnh [6.] khi to gi tr cho bin a l 10, bin b
cha c kh to. Dng lnh [7.] khi to gi tr cho bin b l 4, bin a vn
khng thay i (10). Dng lnh [8.] thc hin vic gn gi tr ca bin b cho
bin a, khi b vn khng thay i; a nhn gi tr ca b, tc l 4. Dng lnh
T r a n g | 38
C++
Gii thch:
Chng 4. To|n t
[9.] gn gi tr ca bin b l 7, bin a khng thay i. Do , gi| tr cui cng
ca a l 4, b l 7. Output ca chng trnh s l a=4, b=7.
Chng ta cn ch rng, ton t gn thc hin theo nguyn tc phisang-tr|i. Ngha l{ lun ly gi tr v phi gn cho v tr|i. Khi , gi| tr
ca bin v tr|i thay i, cn v phi khng thay i. Ton t gn c th
thc hin trong cc biu thc phc tp hn.
a = b + 2;
a = a + 1;
a = b = c = 5;
T r a n g | 39
C++
Chng 4. To|n t
Khai bo 3 v 2 l cc s thc (bng c|ch quy nh kiu d liu nh float
a = 3, float b = 2 hoc 3.0, 2.0).
Chuyn i kiu d liu (Xem thm phn ton t chuyn i kiu d
liu).
Ton t gn hp nht
Khi mun thay i gi tr ca mt bin, chng ta c th s dng cch
vit thng thng, nhng trong C++ n h tr cc ton t vit tt.
Ton t
+=
-=
*=
/=
%=
&=
|=
^=
>>=
<<=
V d
a+=b
a-=b
a*=b
a/=b
a%=b
a&=b
a|=b
a^=b
a>>=b
a<<=b
ngha
a=a+b
a=a-b
a=a*b
a=a/b
a=a%b
a=a&b
a=a|b
a=a^b
a=a>>b
a=a<<b
Phm vi
Php ton s hc
Php ton s hc
Php ton s hc
Php ton s hc
Php ton s hc
Php ton bit
Php ton bit
Php ton bit
Php ton bit
Php ton bit
int a = 1;
T r a n g | 40
ngha
Thc hin php to|n trc, sau mi thc hin ton t.
Thc hin ton t trc, sau mi thc hin php ton.
Tng t a++;
Tng t ++a;
Cch thc thi
a = 1, b cha khi to
C++
Php ton
a++;
++a;
a--;
--a;
V d
Chng 4. To|n t
int b = 1;
a = 1, b = 1
a+=b++;
a+=++b;
Ton t so snh
thc hin vic so snh gi tr ca hai bin hoc hai biu thc; ta c
th s dng ton t so snh. Gi tr ca php ton so snh tr v kiu bool.
Ton
t
==
!=
>
<
>=
<=
V d
Tn gi
#include <iostream>
Kt qu 1: 1
Kt qu 2: 0
int main()
Kt qu 3: 1
int a = 1;
T r a n g | 41
C++
Chng 4. To|n t
int b =2;
cout<<Kt qu 1:<<(a==a);
cout<<Kt qu 2:<< (a>=b);
cout<<Kt qu 3:<< (a<=b);
}
Ta cn ch trong v d ny, cng ging C, C++ chp nhn gi tr 0 v
1 quy nh cho kiu logic. Theo quy c: true tng ng vi gi tr 1
(hoc khc 0), false tng ng vi gi tr 0. Mc d C++ h tr kiu d liu
bool, nhng n vn dng s nguyn 0 v{ 1 biu din tnh ng sai. Ta c
th tm hiu true v false l hai hng s ~ c nh ngha sn, tng ng
vi 1 v 0 (nh vo #define). Nu mong mun in ra gi tr l true/false, ta
cn s dng nh dng d liu cho i tng cout. Chi tit, hy tham kho
mc 8, chng 17 trong gi|o trnh n{y.
Ch :
Hy s dng kiu d liu bool thay v dng kiu d liu int biu din
tnh ng sai. Khi s dng kiu bool, hy nh rng gi tr ng tng
ng vi true; gi tr sai tng ng vi false (ch chng c vit
thng).
Hy cn thn khi s dng ton t so snh bng. Hy ch rng ton t
so snh bng l ==, khc vi ton t gn =.
Ton t hi
&&
Php ton
Php ton
mt ngi !a
Php ton
hai ngi
a&&b
Ton t tuyn
||
Php ton
hai ngi
a||b
Ton t ph
nh !
T r a n g | 42
a
true
false
true
true
false
false
true
true
false
false
b
true
false
true
false
true
false
true
false
Kt qu
false
true
true
false
false
false
true
true
true
false
C++
Ton t logic
Chng 4. To|n t
V d
Kt qu
#include <iostream>
Kt qu 1: 1
Kt qu 2: 0
int main()
Kt qu 3: 0
{
int a = true;
int b =false;
cout<<Kt qu 1:<<(a&&a);
cout<<Kt qu 2:<< (!a&&b);
cout<<Kt qu 3:<< !(a||b);
}
Gii thch:
Kt qu 1 tng ng vi biu thc a&&a=a, ngha l{ true 1.
Kt qu 2 tng ng vi !a&&b. !a=false, false&&false=false 0.
Kt qu 3 tng ng vi !(a||b), a||b=true||false=true, !(a||b)=!true=false
0.
Bi tp 3.
Hy lp trnh kim tra tnh ng n ca nh lut De Morgan:
a. !(a||b)=!a&&!b
b. !(a&&b)=!a||!b
Ton t iu kin
(bt_iu_kin)?(kt_qu_1):(kt_qu_2);
Gii thch: tr v gi tr kt_qu_1 nu bt_iu_kin l{ ng, ngc li,
nu bt_iu_kin l sai, th tr v gi tr kt_qu_2.
Chng trnh
T r a n g | 43
Kt qu
C++
Chng 4. To|n t
#include <iostream>
Max l: 2
using namespace std;
int main()
{
int a = 1;
int b = 2;
int max = (a>b)?a:b;
cout<<Max l{: <<max;
return 0;
}
Gii thch: chng trnh trn tnh gi| tr ln nht gia hai s a v b. Ton t
iu kin kim tra iu kin ca biu thc a>b, v a=1, b=2, nn gi tr ca
n l false. Chnh v vy, biu thc iu kin s nhn kt qu tng ng vi
kt qu 2, tc l b.
Ton t iu kin lun tr v mt gi tr c th. Nh trong v d trn, ta
thy nu biu thc a>b ng, th gi| tr max nhn c l s a; ngc li l
s b. Tuy nhin, khng nht thit cn phi c mt gi tr x|c nh cho ton
t iu kin. V d sau }y s minh ha iu ny
T r a n g | 44
C++
Chng trnh
Kt qu
#include <iostream>
2 lon hon
using namespace std;
int main()
{
int a = 1;
int b = 2;
(a>b)?(cout<<a<< lon hon):(cout<<b<< lon hon);
return 0;
}
Gii thch: trong v d minh ha ny, ton t iu kin khng tr v mt gi
tr c th no. N ch n thun kim tra iu kin, nu a>b ng, th in ra
cu a ln hn, ngc li s in ra cu b ln hn. Ta cn lu rng, khi cc
cu lnh nm trong cp du ngoc ca ton t iu kin, th kt thc cu
lnh khng bao gi c du chm phy (;).
Chng 4. To|n t
Chng trnh
Kt qu
#include <iostream>
|a-b|=1
using namespace std;
int main()
{
int a = 1;
int b = 2;
int c;
(a>b)?(c = a-b,cout<<|a-b|=<<c):( c = b-a,cout<<|a-b|=<<c);
return 0;
}
Gii thch: Trong v d n{y, chng trnh s in ra gi tr tuyt i ca a-b.
Nu a>b, th gi tr tuyt i |a-b| = a-b; ngc li nu a<b, th gi tr tuyt
i |a-b| = b-a. Trong cp du ngoc n ca ton t iu kin, cu lnh gn
c=a-b (hoc c=b-a) v{ cout c phn tch bng du phy (,). Mt iu cn
lu , chng ta khng c php khai bo bin trong cp du ngoc n
ny. Vic khai bo bin trong du ngoc n, ch p dng duy nht cho cu
lnh lp for.
C++
V d
Kt qu
3
int a;
int b;
int c;
c = (a=1, b=2, a+b);
cout<<c;
Gii thch: trong biu thc phc hp, bn trong du ngoc n l{ c|c biu
thc n c phn tch bng ton t phn tch. Trong mt dy cc ton
t phn tch, n s u tin thc hin t tri sang phi (xem thm phn
u tin ca ton t c trnh by trong mc sau ca chng n{y), ngha l{
a=1, sau b=2 v{ cui cng l c=a+b=1+2=3.
Chng 4. To|n t
Ton t
~
Kt qu
Ton t ph nh bit. Cc bit 1 s chuyn th{nh 0 v{ ngc li.
V d ~101=010.
Ton t hi bit. Hi ca hai bit 1 bng 1. Trong mi trng hp cn
li, ta nhn c 0.
V d.
1
& 0
&
Ngha l{ 11&5=1.
Ton t tuyn bit. Tuyn ca hai bit 0 bng 0. Trong mi trng
hp cn li, ta nhn c 1.
V d.
|
|
Ngha l{ 11|1=11.
Ton t tuyn loi bit. Tuyn loi ca hai bit khc nhau bng 1.
Trong mi trng hp cn li, ta nhn c 0.
V d.
^
^
Ngha l{ 11^1=10.
Ton t dch bit sang phi. Dch chuyn ton b dy bit sang phi
theo s bit c ch nh. Nu l s dng, ta b sung cc bit 0 vo
u. Nu l s m, ta b sung cc s 1 v{o u.
T r a n g | 46
C++
>>
Chng 4. To|n t
V d.
i vi s dng
0 1
>>
Ngha l{ 11>>1=5.
i vi s m
1 1
>>
Ngha l{ -11>>2=-3.
Cc bn cng cn lu rng, trong cc biu din trn, nu h
thng c chn l 32 bit, th chng ta cn lp y s bit ny:
- Nu s dng th c|c bit cn li s c b sung 0 v{o pha trc.
- Nu s m th cc bit cn li s c b sung 1 v{o pha trc.
Trong cc v d trn, phn d~y bit trng tng ng vi bit du
1 tng ng vi v{ 0 tng ng vi +.
Ton t dch bit sang tri. Dch chuyn ton b dy bit sang tri
theo s bit c ch nh.
V d.
i vi s dng
+
0 0 1 0
1 1
<<
1 0 1 1
Ngha l{ 11<<2=44.
T r a n g | 47
C++
<<
Chng 4. To|n t
&=
|=
^=
>>=
<<=
Cc ton t hi bit, tuyn bit, tuyn loi bit v ph nh bit c tnh nh
sau: chng ta chuyn i cc s thp phn sang nh ph}n tng ng, sau
s dng c|c php to|n tng ng cho tng bit theo v tr ca n. V d nh
trn 210=102, 310=112 v ta s thc hin c|c php to|n tng ng vi tng
bit. Bit th nht (t phi sang tri) l 0&1=1, bit th hai 1&1=1, nh vy kt
qu ca php ton 2&3 l 112 hay 310. Tng t cho cc php ton cn li.
Nu hai s c di bit khc nhau, th ta ch vic b sung thm 0 s c
di bit ngn hn, sau thc hin c|c php to|n nh ~ nu. Trong trng
hp ny, ta cn lu rng php ton tuyn loi s c chn tr l 1 nu hai
bit tng ng l khc nhau, nu ging nhau th tng ng l 0(1^1=0^0=0,
1^0=0^1=1). Cc php ton hi, tuyn v ph nh vn cn ng nh php
ton hi, tuyn v ph nh trn kiu d liu logic.
Cc ton t dch tri bit << v dch phi bit >> nu thc hin trc tip
trn s nguyn h thp phn, s c tnh nh sau: a<<b=a*2b v
a>>b=a/2b.
Cch biu din s chuyn i mt bin thuc kiu d liu ny, sang
kiu khc ch c th thc hin nu kiu ca chng tng ng. Ta c th
chuyn s thnh s (sau ny khi hc v hng i tng, ta c th chuyn
T r a n g | 48
C++
Ton t n{y dng chuyn i mt bin hay hng thuc kiu d liu
ny sang kiu d liu khc. Gi s ta c bin int a = 3, int b = 2. Khi thc
hin php chia nhn c kt qu thc, ta ch cn vit nh sau:
(float)3/2. Hy lu rng s 3 }y ~ b chuyn thnh kiu thc, v vic
thc hin php chia mt s thc cho s nguyn s tr v kiu thc 1.5. Nu
ta vit 3/(float)2, kt qu cng tng t. Ngc li, nu vit (float)(3/2) th
kt qu li khc. S d nh vy l v, n s thc hin php chia nguyn 3/2
(kt qu l{ 1), sau n s chuyn gi tr 1 nguyn ny sang 1 thc. Do ,
gi tr thu c vn l{ 1, nhng thuc kiu s thc (tc l 1.0f).
Chng 4. To|n t
gia c|c i tng trong cng mt cy ph h). Ta khng th chuyn i t
s th{nh x}u, hay ngc li (bng cch thc hin php ton chuyn i
kiu). Ta c th chuyn i mt xu s thnh s v mt s thnh xu s
bng nhiu c|ch kh|c nhau, nhng vic s dng ton t chuyn i kiu l
khng c php. Khi chuyn i, ta s dng mt trong cc c php sau:
(kiu_d_liu)bin hoc (kiu_d_liu)(bin) hoc kiu_d_liu(bin).
Chng ta nn s dng kiu th 2 hoc 3 trnh cc nhm ln |ng tic khi
biu thc phc tp.
Cc ton t khc
Trong phn lp trnh hng i tng, chng ta s lm quen thm
nhiu ton t khc. Theo trnh t trnh by trong cun gio trnh ny,
chng ta s cha tho lun thm v chng. Ta s tm hiu chi tit trong
phn hng i tng ca cun gio trnh ny.
Th t u tin ca cc ton t
Trong ton hc, chng ta bit rng khi tnh gi tr ca mt biu thc,
th lun c s u tin ca cc ton t nh: php nh}n thc hin trc php
cng, php chia v nhn thc hin ng thi, u tin t tri sang phi
Trong cc ngn ng lp trnh ni chung cng nh C++ ni ring, cc ton t
cng c nhng u tin nht nh. Trong mt biu thc phc tp, ta cn
ch n u tin ca cc ton t, iu ny rt d gy ra sai st. Trong
bng sau }y, ti xin a ra th t u tin ca cc ton t trong lp trnh
C++.
u tin cng loi
::
Tri-sang-phi
() [] . -> ++ -- (hu t) dynamic_cast Tri-sang-phi
static_cast reinterpret_cast const_cast
typeid
++ -- (tin t) ~ ! sizeof new delete
Phi-sang-tri
*&
+ - (du dng m)
(type) (chuyn i kiu)
Phi-sang-tri
.* ->*
Tri-sang-phi
*/%
Tri-sang-phi
+ - (php ton cng, tr)
Tri-sang-phi
<< >>
Tri-sang-phi
< > <= >=
Tri-sang-phi
1
2
3
4
5
6
7
8
9
T r a n g | 49
C++
Mc u tin Ton t
Chng 4. To|n t
10
== !=
Tri-sang-phi
11
&
Tri-sang-phi
12
^
Tri-sang-phi
13
|
Tri-sang-phi
14
&&
Tri-sang-phi
15
||
Tri-sang-phi
16
?:
Phi-sang-tri
17
= *= /= %= += -= >>= <<= &= ^= |=
Phi-sang-tri
18
,
Tri-sang-phi
Cc ton t c thc hin theo mc u tin t trn xung. Nu cc ton
t cng mc, n s c thc hin theo u tin cng loi.
V d:
C++
a = (b=0, c=0, b+c). Ton t g|n = c u tin 17, c|c to|n t cng +
c u tin 7, to|n t () c u tin 2 v{ to|n t , c u tin 18.
Do , to|n t () s c thc hin trc. By gi ta xt cc ton t
trong du (), ch rng cc biu thc b=0, c=0, b+c l cc biu thc ring
bit, chng c phn tch bi ton t phn tch (,). Theo th t u tin
ca ton t phy, n s thc hin t tri-sang-phi. Ngha l{ b=0, c=0 sau
l{ b+c. Cui cng n s thc hin ton t gn gi tr ca biu thc
phc hp bn phi cho bn tri. Kt qu l 0.
a = (1+2)*3/2++. Ton t g|n ( u tin 17), to|n t + ( u tin 7),
ton t * ( u tin 6), to|n t / ( u tin 6), to|n t ++ hu t (
u tin 2) v{ to|n t () ( u tin 2). Ton t hu t ++ v ton t () s
thc hin trc. Theo u tin cng loi, n s thc thi t tri-sangphi. Nh vy, ton t () s c thc hin u tin. Ngha l{ ta nhn
c biu thc a = 3*3/2++. Tip theo, n thc hin ton t hu t ++,
tuy nhin ton t ny ch tng gi| tr ca 2 ln 1 sau khi thc hin xong
cc php ton trong biu thc. n thi im ny, ta nhn c biu
thc a=3*3/2. Ton t * v{ / c cng u tin, n s c thc hin
theo th tr t tri sang phi, ngha l{ a=9/2=4. Kt qu 4.
Chng 4. To|n t
a = (b=2, (1+2)*3/b++)
C++
Bi tp 4.
Tnh ton cc biu thc sau, da v{o u tin ca ton t, sau , vit
chng trnh trn C++ kim tra kt qu.
a. 2+2*4%3+ ++2;
b. 2++ + ++2*(3-- - --2)
c. 5++ - 3== --2-(4+2%3)
d. 5>>2^3*(1+2)
T r a n g | 51
CHNG 5.
XUT NHP C BN
cout<<bin_1<<<<bin_n;
Trong , bin_1,,bin_n: l cc bin s. Chng ~ c khi to gi
tr. Nu bin cha khi to gi tr, ta s nhn c mt li khi thc thi
chng trnh. Chng trnh dch s thng bo v vic s dng bin m
T r a n g | 52
C++
C php:
int age;
cin>>age;
float f;
cin>>f;
string s;
cin>>s;
Ch rng kiu d liu ca bin c s dng trong i tng cin
ny. Nu c mt s vi phm no v kiu d liu (v d bin l{ int, nhng khi
T r a n g | 53
C++
cin>>bin_1>>>>bin_n;
Cc bin s bin_1,, bin_n cn c khai b|o. Thng thng,
nhng bin n{y cha c khi to gi tr. Sau }y l{ mt vi v d v vic
s dng i tng cout:
T r a n g | 54
C++
int main()
T r a n g | 55
C++
#include<sstream>
Kt qu
1:2:3:4:5
Sum = 15
int main()
{
string temp, s;
getline(cin, s);
istringstream ss(s);
double sum = 0;
while (getline(ss, temp, ':') )
{
float a;
stringstream(temp)>>a;
sum+=a;
}
cout<<Sum = <<sum;
return 0;
}
T r a n g | 56
C++
http://www.msdn.microsoft.com/en-us/visualc/default.aspx
T r a n g | 57
C++
}else
{
}
V d
if (x%2==0)
cout<<x<< la so chan;
else
cout<<x<< la so le;
V d
if(x>0)
T r a n g | 59
C++
(|
Cu trc lp
Trong thc t, chng ta gp nhiu tnh hung lp i lp li. Vi mc ch
ny, ngn ng C++ cung cp cho chng ta cc cu trc lp tng ng.
1. Vng lp while
C php:
V d
Kt qu
#include<iostream>
Nhap n:5
T r a n g | 60
C++
while (biu_thc_iu_kin_ng)
{
.
}
Gii thch: Nu biu_thc_iu_kin ng, c|c lnh bn trong vng lp s
c thc hin cho n khi n nhn gi tr sai.
3
int n;
cout<<Nhap n:;
cin>>n;
while (n>0){
cout<<n<<endl;
n--;
}
return 0;
}
Gii thch: u tin nhp vo gi tr cho bin n. N nhp vo }y l{ 5. Vng
lp while kim tra iu kin n>0. iu kin n{y ng, nn c|c lnh trong
vng lp s c thc hin. N s in ra gi tr ca n l{ 5. Sau , gi| tr ca n
gim i 1, tc l n = 4. Vng lp li tip tc thc hin, v n>0 cn ng. Qu|
trnh ny c tip tc, cho n khi n=0. Khi , iu kin n>0 l{ sai. Do ,
vng lp s dng li. Gi tr in ra mn hnh l cc s t 5 gim n 1.
Lu : khi s dng vng lp while cn lu c|c im sau }y:
Vng lp phi c tnh dng. Ngha l{ biu_thc_iu_kin phi c trng
hp sai. Trong mt s tnh hung, ngi ta vn s dng vng lp v hn,
nhng cn c c ch thot khi vng lp khi cn thit.
Nu c nhiu lnh chu s chi phi ca while, th chng cn c t
trong du khi lnh.
2. Vng lp dowhile
do
{
.
}while (biu_thc_iu_kin_ng);
T r a n g | 61
C++
C php:
Kt qu
#include<iostream>
Nhap n:5
int main(){
int n;
cout<<Nhap n:;
cin>>n;
do {
cout<<n<<endl;
n--;
}while(n>0);
return 0;
}
Gii thch: u tin nhp vo gi tr cho bin n. Gi tr n nhp vo }y l{ 5.
Vng lp dowhile s thc thi cc lnh bn trong n. N s in ra gi tr ca
n l{ 5. Sau , gi| tr ca n gim i 1, tc l n = 4. Vng lp kim tra gi tr
ca biu thc n>0. V biu thc n{y ng, nn n tip tc lp. Qu trnh ny
c tip tc cho n khi n=0. Gi tr n=0 vn c in ra, sau khi kim tra n>0
khng cn ng na, vng lp kt thc. Khc vi vng lp while trn, n
s in ra gi tr t 5 gim n 0.
C++
Kt qu
#include<iostream>
Nhap n:5
int main()
2
int n, i;
cout<<Nhap n:;
cin>>n;
T r a n g | 63
C++
Kt qu
#include<iostream>
Nhap n:5
int main()
2
int n;
cout<<Nhap n:;
cin>>n;
Lnh break dng thot ra khi vng lp. Thng thng, khi ta s
dng cc vng lp khng x|c nh c s ln lp, trnh lp v hn,
ngi ta thng s dng cu lnh break thot khi vng lp.
T r a n g | 64
C++
4. Cc cu lnh nhy
a. Cu lnh break
Kt qu
#include<iostream>
2
using namespace std;
1
int main()
0
{
int n = 2;
for(;;){
cout<<n<<endl;
n--;
if (n<0) break;
}
return 0;
}
Gii thch: Gi tr khi to ca n = 2. Vng lp for s tin hnh in gi tr ca
n, sau , gim gi tr ca n i 1. C}u lnh iu kin bn trong for s kim
tra iu kin ca n. Nu n<0, th lnh break s c thc hin v vng lp b
hy.
b. Cu lnh continue
V d
Kt qu
#include<iostream>
using namespace std;
int main()
{
for(int i=0;i<10;i++){
if (i%2!=0)
continue;
cout<<i<<endl;
}
return 0;
}
0
2
4
6
8
T r a n g | 65
C++
#include <iostream>
5
using namespace std;
4
int main()
3
{
2
int n = 5;
1
loop://Tn nhn
cout<<n<<endl;
n--;
if(n>0) goto loop;
return 0;
}
Gii thch: Gi tr khi to ca bin n l{ 5. Nh~n c t tn l loop. Nhn
c th hiu nh mt v tr c |nh du (bookmark). Chng trnh tin
hnh in gi tr ca bin n. Sau , gim gi tr ca n i. C}u lnh iu kin,
kim tra gi tr ca biu thc n>0, nu ng thi lnh goto c gi v n s
c chuyn n v tr ~ c |nh du l loop. Chng trnh li thc thi
thm ln na k t v tr loop . Nu n<=0, lnh goto khng c gi.
Chng trnh kt thc. Vic s dng cc cu lnh lp, hon ton c th thay
T r a n g | 66
C++
Chng trnh
default:
T r a n g | 67
C++
nhm_cc_lnh;
#include <iostream>
Ban la nam hay nu b/g:b
using namespace std;
Nam
int main()
{
char n;
cout<<Ban la nam hay nu b/g:<<endl;
cin>>n;
switch(n)
{
case b:
cout<<Nam;
break;
case g:
cout<<Nu;
break;
default:
cout<<Khong xac dinh;
}
return 0;
}
Gii thch: chng trnh buc ngi dng nhp vo mt k t (b boy) hay
(g girl). Nu ngi dng nhp vo mt k t kh|c, chng trnh vn tnh
n trng hp ny. K t m{ ngi dng nhp v{o c lu trong bin n.
Cu lnh switch s kim tra bin nhp v{o c nm trong danh sch hng
hay khng (danh sch hng }y l{ b v{ g). Nu c, th tng ng vi b
n s thc hin trng hp case b, nu l{ g n s thc hin trng hp
case g. Lnh break trong mi trng hp c tc dng l thot ra khi cu
lnh la chn (cng mang tnh lp), nu khng c lnh break, tt c cc
trng hp u c xt duyt v nu ri v{o trng hp no th cc lnh
tng ng s c thc thi, ng thi lnh trng hp bn di n cng
T r a n g | 68
C++
Chng trnh
T r a n g | 69
Lin tc
Ri rc
C++
int a = 1;
switch(a>0)
{
case true:
cout<<"Duong";
break;
case false:
cout<<"Am";
break;
default:
cout<<"Khong";
}
int a = 1;
switch(a)
{
case 1: case 2: case 3:
cout<<"Xuan";
break;
case 4: case 5: case 6:
cout<<"Ha";
break;
case 7: case 8: case 9:
cout<<"Thu";
break;
case 10: case 11: case 12:
cout<<"Dong";
break;
default:
cout<<"Khong phai thang cua nam";
Tn lnh
ifelse
switch
for
while
dowhile
break
T r a n g | 70
Cch dng
Khi cn kim tra mt hoc mt v{i iu kin mang
tnh cht logic.
Khi cn kim tra iu kin hoc tnh thuc vo ca
mt bin s/biu thc trong mt danh sch hng
tng ng.
Lp c s vng lp x|c nh
Cn kim tra iu kin lp trc khi thc hin
lnh, lp khng x|c nh s vng lp.
Kim tra iu kin lp sau khi thc hin lnh, lp
khng x|c nh s vng lp.
Cn thot khi vng lp.
C++
Bi tp 6.
1. S dng cc cu trc lp for, while, dowhile, goto xy dng cc
chng trnh tnh tch ph}n sau (vi mi cu trc xy dng mi
chng trnh) bng phng ph|p hnh ch nht (tri, phi hoc
trung ta).
( )
(
(
)
)
C++
( )
vi n, x nhp vo t bn phm. Yu cu xy dng hm.
T r a n g | 71
Chng 7. Hm
CHNG 7.
HM
Th vin 2
Th vin 1
Hm 1
Hm 1
Hm 2
Hm 2
Hm 3
Hm 3
Hm 1
Hm main{
Gi H{m 1 (Th vin 1);
Gi H{m 2 (Th vin 2);
Gi H{m 3 (Th vin n);
Gi H{m 1 (chng trnh chnh)
Trong lc n{y, c|c h{m c vit trong c|c th vin khc nhau.
Trong chng trnh chnh, chng ta c th gi c|c h{m trong c|c th vin,
ln c|c h{m c khai bo trong chng trnh chnh.
Nh vo vic s dng hm, chng ta c th ph}n chia chng trnh
thnh cc modul nh. i lc, ngi ta gi c|ch ph}n chia chng trnh
Trang | 72
Chng 7. H{m
th{nh c|c h{m nh th ny l cch gii quyt b{i to|n theo phng ph|p
chia tr. Cch phn chia ny c rt nhiu u im:
Lm cho chng trnh tr nn gn gng d c hn.
D ci bin chng trnh.
D kim tra theo cc modul.
l{ tng xy dng hm. Vy h{m c khai bo v s dng nh th
no. Chng ta s tm hiu trong chng n{y.
Khai bo v s dng hm
C php:
kiu_d_liu tn_hm(danh_sch_tham_s)
{
Thn hm;
}
Trong ,
o kiu_d_liu: l kiu d liu m hm tr v.
o tn_hm: l tn ca h{m, do ngi lp trnh t. Tn h{m khng c
cha k t c bit, khng c bt u bng s, khng cha k t trng,
khng trng vi t kha.
o danh_sch_tham_s: l danh sch cc tham s dng nh c|c bin cc
b. Nu c nhiu tham s, th chng s c phn tch theo cc du
phy.
o Thn hm: l ni dung m{ ngi lp trnh xy dng nn. Nu hm tr v
kiu d liu khc void, ta cn s dng lnh return tr v bin cha
kt qu v c cng kiu d liu vi kiu d liu ca hm. Nu hm tr v
kiu d liu void th iu ny l khng cn thit.
V d
Kt qu
#include <iostream>
T r a n g | 73
C++
Chng 7. H{m
return a+b;
}
int main()
{
cout<<add(1, 2);
return 0;
}
Gii thch: Mi chng trnh trong C++ lun bt u bi h{m main. iu
c ngha l{ c|c lnh trong hm main s c thc thi mt cch tun t. i
tng cout s in gi tr ca hm add(1,2). Khi gi n hm add, n s nh x
n h{m add ~ c khai bo trn, n ch to ra mt li gi h{m n
h{m ~ c xy dng c tn tng ng (chng ta cn lu n iu ny
phn bit vi khi nim hm ni tuyn s c tm hiu trong cc mc
tip theo). Vi a, b l cc tham s hnh thc, chng s c thay th bng
cc gi tr c th l 1 v 2. Hm add ny s tr v gi tr l tng ca a v b
nh t kha return.
Cch khai bo hm trong v d trn c gi l khai bo trc tip. Chng ta
cng cn mt cch khai bo hm gin tip na, m{ ta thng gi l khai bo
h{m prototype nh sau:
V d
Kt qu
#include <iostream>
return 0;
T r a n g | 74
C++
cout<<add(1, 2);
Chng 7. H{m
}
int add(int a, int b)
{
return a+b;
}
Trong khai bo hm dng ny, cu trc khai bo hm khuyt phn thn
hm. Ch c khai bo phn tn ca hm theo c php chun. Ta c th t
hm xy dng hon chnh bt k v tr no. Cch khai bo hm prototype
c nhiu u im:
- Khng cn quan t}m n th t khai bo hm. Nu khng s dng khai
bo prototype, th hm khai bo sau mi c php gi h{m khai b|o trc
n. iu ngc li l{ khng c php. Nhng i vi khai bo prototype
th ta hon ton khng cn quan t}m n iu ny.
- Ta c th tch phn khai b|o prototype v{ t n vo trong mt tp tin
mi, thng l tp tin tiu .h (vi tn gi ty v{o ngi lp trnh quy
nh), phn thn hm li cha trong mt tp kh|c, thng l .cpp hoc
trong chnh tp cha chng trnh chnh. C|ch l{m n{y gip chng trnh
sng sa hn rt nhiu. Trong cc d n lp trnh ln, ngi ta thng
phn tch theo dng ny. Chng ta s xt v d minh ha sau.
Trong v d minh ha ny, d n ca ti gm c hai tp: tieude.h cha
khai b|o prototype v{ main.cpp cha thn hm v hm main.
i vi Codeblocks, hy thc hin theo c|c bc sau:
- To mi mt d |n C++ v{ lu li. Trong d n ny, mc nh Codeblocks
s to mt tp main.cpp.
T r a n g | 75
C++
- Vo New > File > chn C/C++ header. Sau , h~y chn v tr lu tr tp
tiu (thng thng, ta nn to c|c th mc kh|c nhau lu tp .h cng
nh tp .cpp nh ti ~ trnh b{y trn).
Chng 7. H{m
- Kch chut phi v{o th mc cn t tp .cpp, chn New > Source File.
i vi Visual Studio 2010, kch chut phi vo tn d n, chn Add New
Item. Sau chn header file .h.
Tp tieude.h
#ifndef TIEUDE_H_INCLUDED
#define TIEUDE_H_INCLUDED
Tp main.cpp
#include <iostream>
#include "tieude.h"
using namespace std;
int sum(int, int);
int main()
void showmsg(void);
{
showmsg();
#endif // TIEUDE_H_INCLUDED
return 0;
}
void showmsg(){
cout<<sum(1, 3);
}
int sum(int a, int b){
return a+b;
}
Trong tp tieude.h, ta ch vic nhp cc khai bo prototype vo gia #define
v #endif. Trong tp main.cpp, ta cn b sung khai b|o th vin #include
tieude.h. Ch rng, tn tp tiu nm trong du nh|y kp , m khng
phi l du <>. C|c h{m trong chng trnh chnh c th s dng m khng
cn quan t}m n th t khai b|o. Nh chng ta thy, cc hm khai bo sau
hm main (iu ny ch c th c php i vi khai bo prototype). Hm
showmsg khai b|o trc h{m sum nhng c th gi c hm sum. Th t
tiu ca hm trong tp tiu hon ton khng quan trng v n khng
nh hng vic s dng cc hm theo th t trc sau.
C++
Lu :
Chng 7. H{m
include n trong main.cpp. Gi s headers v cpps nm trong cng th
mc src. Khi , trong tp main.cpp, hy khai b|o nh sau:
#include../headers/headers.h. Trong , du ../ dch li mt mc
trong cu trc c}y th mc (dch li t th mc headers mt mc chnh
l{ th mc src), sau l{ headers/headers.h.
Gii thch
#include <iostream>
int global;
int add(int a, int b)
{
local result = a + b;
return result;
}
int main()
{
int local1;
if(local1>0)
{
int local2;
T r a n g | 77
C++
Chng 7. H{m
}
return 0;
}
Hm khng tr v gi tr - Hm void.
Nh chng ta ~ thy trong cc v d trn, cc hm m chng ta s
dng l cc hm c gi tr tr v. i vi cc loi h{m n{y, hm tr v
mt gi tr n{o , ta s dng t kha return. Gi tr hm tr v phi c kiu
d liu cng loi vi kiu d liu m{ ta quy nh khi khai bo hm.
Chng ta cng bt gp tnh hung: nhiu lc hm m ta xy dng khng tr
v mt gi tr no, hoc tr v nhiu hn mt gi tr. Khi , chng ta s
dng khai bo hm void. i vi hm khng tr v gi tr, ta c th tham
kho v d sau. Cn i vi hm tr v nhiu hn mt gi tr, chng ta s
tho lun k hn trong phn tham bin.
V d
Kt qu
#include<iostream>
Hello, world !
}
Ch :
T r a n g | 78
C++
return 0;
Chng 7. H{m
V hm c kiu d liu tr v lun tr v mt gi tr c th, nn chng
ta c th s dng trc tip loi hm ny trong cc biu thc tnh ton (v d
a=b+sin(x)). iu ny l khng th i vi hm void.
Khi s dng cc hm khng c tham s hnh thc, nu ta gi hm theo
cch sau: tn_hm(); l cch gi h{m ng. Nu gi hm theo cch:
tn_hm;, th d chng trnh dch khng bo li, nhng kt qu nhiu khi
khng chnh xc. V vy, chng ta nn gi hm theo cch u tin.
Gii thch
#include <iostream>
int b = 1;
setNum(b);
return 0;
T r a n g | 79
C++
cout<<b;
Chng 7. H{m
}
Nu mun thay i gi tr ca bin khi truyn tham s trong hm, ta
s dng khai bo tham bin. Vi vic quy nh cc tham s truyn theo
tham bin, th khi khai bo ta ch b sung vo du & trc tn tham s .
Bng cch ny, cc bin l{ i s trong li gi hm s b l{m thay i gi tr
sau khi kt thc li gi hm.
V d
Gii thch
#include <iostream>
{
int b = 1;
setNum(b);
cout<<b;
return 0;
}
V d
T r a n g | 80
Kt qu
C++
Chng 7. H{m
#include <iostream>
m= 2, n=1
T r a n g | 81
C++
Chng 7. H{m
V d
Kt qu
#include <iostream>
m= 2, n=1
Chng trnh
Kt qu
#include<iostream>
T r a n g | 82
C++
Chng 7. H{m
using namespace std;
{
return a+b+c;
}
int main()
{
cout<<add(1)<<endl;
cout<<add(1,2)<<endl;
cout<<add(1,2,3)<<endl;
return 0;
}
Gii thch: H{m add c khai bo vi ba tham s hnh thc. Tham s th
nht l khng th thiu, v n khng quy nh gi tr mc nh. Vi hai tham
s b, c cn li, ta c th khuyt. Trong trng hp khuyt, n s nhn
gi tr mc nh m{ ta ~ g|n cho n (c th }y l{ 0). Do , khi gi hm
add(1), n s tng ng vi li gi hm add(1,0,0), tc gi tr l tng ca
1+0+0 bng 1. Tng t, khi gi hm add(1,2) th s tng ng vi
add(1,2,0) v cho kt qu l 3. Khi gi h{m y ba tham s add(1,2,3) s
cho kt qu l 6.
Chng cht hm
V d
Kt qu
#include<iostream>
T r a n g | 83
C++
Trong C++, hai hm khc nhau c th c cng tn, nhng danh sch
tham s ca chng phi khc nhau. Chng c bit n vi tn gi l
chng cht hm. Khi nim chng cht hm khc hon ton vi khi nim
qu ti hm m chng ta s tm hiu trong phn lp trnh hng i tng.
Chng 7. H{m
#include<string>
abcd
T r a n g | 84
C++
Hm ni tuyn
Chng 7. H{m
inline type tn_hm(danh_sch_tham_s)
{
Thn hm;
}
Trong hu ht cc trnh bin dch hin i, vic quy nh hm l inline
l khng cn thit. Nu mt hm c th s dng khai bo inline, th chng
trnh dch s t ng ti u m~ ngun c th s dng n. Ngc li, nu
mt hm khng th s dng khai b|o inline, th chng trnh dch s b qua
khai bo ny. Ch nh inline ch c tc dng nh hng cho chng trnh
dch.
Hm quy
H{m quy l nhng hm gi li chnh n. N hu dng trong cc
tc v nh sp xp (Quicksort) hoc tnh ton cc biu thc truy hi, gii
cc bi ton bng gii thut cng tn H{m quy tng ng vi khi
nim quy np trong ton hc. Ta c th s dng nh ngha giai tha theo
quy np ton hc nh sau
{
Kt qu
#include <iostream>
return 1;
}
T r a n g | 85
C++
else
Chng 7. H{m
int main()
{
long num = 3;
cout<<Fac(num);
return 0;
}
Gii thch: hm Fac s tnh gi tr giai tha ca a theo cng thc tnh trn.
Nu a>0, th hm s tr v gi tr l a*Fac(a-1), hm Fac(a-1) li gi n
chnh n, v qu trnh ny c tip tc cho n khi gi tr a = 0. Vic s dng
li gi hm Fac(0) s cho kt qu tng ng l 1.
Lu : h{m quy cng nh vng lp, n c th lp v hn, nu iu kin
dng khng c m bo.
Ta xt thm mt v d s dng quy. Tnh tng:
T phn tch ny, ta d dng thy cng thc di dng truy hi:
{
V d
Kt qu
#include <iostream>
{
if(n == 1)
T r a n g | 86
C++
long S(int n)
Chng 7. H{m
return 1;
else
return n+S(n-1);
}
int main()
{
int n = 3;
cout<<S(n);
return 0;
}
Bi tp 7.
1. Xy dng hm gii phng trnh
( )
2. Xy dng hm tnh tng ca n s nguyn t u tin, vi n l s nhp
vo t bn phm.
3. Xy dng hm kim tra mt s c phi l s chnh phng hay khng.
S chnh phng l{ s nguyn c th biu din di dng ly tha
ca mt s nguyn.
4. Xy dng h{m quy tnh tng ca n s nguyn dng t 0 n n.
5. Xy dng h{m quy tnh x|c nh s hng th n ca d~y sau }y
{
C++
T r a n g | 87
int
Khai bo mng
kiu_d_liu tn_mng[s_phn_t];
V d
string humans[5]; //Khai bo mng humans c 5 phn t xu k t
int numbers[10]; //Khai bo mng numbers c 5 phn t s nguyn
Cc ch s ca mng c |nh th t t v tr 0. truy cp n
phn t mng, chng ta truy cp theo ch s nh sau humans[0],
humans[1], tng ng vi cc phn t th nht, tha hai trong mng
humans.
Khi to mng
Vic khi to gi tr cho mng c th s dng cp du {}.
string humans[5] = {Lan, Nam, Binh, Hoa, Hieu};
Khi truy cp vo mng theo ch s, th humans[0]=Lan,
humans[1]=Nam,
Trang | 88
0
1
matrix[1][3]
2
3
4
C++
C++
Mng l tham s hnh thc: khi s dng mng lm tham s hnh thc, cn
lu c|c im sau }y:
C++
Xu k t
b a n \0
0 1 2 3 4 5 6 7
9 10 11 12 13 14 15 16 17 18 19
C++
Vic khai bo xu theo kiu mng k t hay theo kiu string l hon
to{n tng ng nhau. V vy, chng ta c th ty la chn cch x l
chng. Ngoi ra, mng cng c th c khai b|o nh con tr. V vy, vi
xu k t, chng ta c ba cch khai bo: s dng mng k t, s dng con tr
v khai bo xu string. Chi tit v con tr, chng ta s hc trong chng sau.
T r a n g | 92
Chng 9. Con tr
CHNG 9.
CON TR
Chng 9. Con tr
Gi s bin andy c lu v{o trong b nh ti nh 1776. Chng ta
c th minh ha on chng trnh sau bng lc bn di
int andy = 25;
int fred = andy;
int* ted = &andy;
andy
25
1775
1776
1777
fred
& -ted
Hnh 17 Tham chiu trong con tr
T r a n g | 94
C++
beth = *ted;
Chng 9. Con tr
ted
1776
1775
1776
1777
25
b nh
25
beth
Hnh 18 Tham chiu ngc trong con tr
andy == 25;
&andy == ted;//=1776
*ted == 25;
T r a n g | 95
C++
Chng 9. Con tr
Ta c th pht biu tng qut biu thc *ted = &andy nh sau: con tr *ted
tr v{o a ch ca andy, tng ng vi a ch ny ca nh, ta c th nhn
c gi tr tng ng l gi tr lu ti nh ny.
V d
Kt qu
#include<iostream>
4
using namespace std;
4
int main()
4
{
8
int *pint;
long long *pll;
cout<<sizeof(pint)<<endl;
cout<<sizeof(pll)<<endl;
cout<<sizeof(*pint)<<endl;
cout<<sizeof(*pll)<<endl;
return 0;
}
Gii thch: trong v d ny, bin pint v{ pll dng lu a ch ca con tr,
chng lun c kch thc mc nh l 4 bytes. Cc bin *pint v *pll l cc
T r a n g | 96
C++
int *pint;
char *pchar;
float *pfloat;
Trong v d trn, chng ta khai bo ba con tr c kiu d liu khc
nhau, nhng v bn cht, chng pint, pchar, pfloat l nhng con tr v
chng c cng s nh trong khng gian b nh (trn h thng windows
32bit, chng chim 4byte ta c th s dng hm sizeof kim tra kch
thc thc trn h thng m|y tnh ang s dng). Tuy nhin, d liu m
cc con tr tr n li c kch thc kh|c nhau tng ng vi int, char v
float m chng ta ~ tm hiu (tng ng trn h windows 32 bit ln lt l
4, 1, 4).
Chng 9. Con tr
bin tr vo cc kiu d liu int v{ long long tng ng. Bin int c kch
thc 4 bytes v bin long long c kch thc 8 bytes.
Lu , trong khai b|o n{y, du * khng phi l ton t tham chiu
ngc, n n thun l con tr. Chng c cng k hiu, nhng l{ hai th
hon ton khc nhau.
V d
Kt qu
#include<iostream>
10
using namespace std;
20
int main()
{
int fval, sval;
int *p;
p = &fval;
*p = 10;
p = &sval;
*p=20;
cout<<fval<<endl;
cout<<sval<<endl;
return 0;
}
Gii thch: Bng cch s dng bin con tr *p, chng ta ~ l{m thay i gi
tr ca bin fval v sval. Bin tr ny trong ln u tin, n tr n a ch
ca bin fval, t nh ca a ch ny, n nh x n gi tr m ta khi gn
l{ 10. Do , gi| tr ca bin fval cng |nh x tng ng n 10. Tng t
cho bin sval.
minh ha con tr c th to ra s sai khc gi tr trong cng mt
chng trnh, chng ta tham kho v d sau
T r a n g | 97
Kt qu
10
20
C++
V d
#include<iostream>
using namespace std;
int main()
{
int fval=5, sval=15;
int *p1, *p2;
p1 = &fval;
p2 = &sval;
*p1 = 10;
Chng 9. Con tr
*p2 = *p1;
p1 = p2;
*p1 = 20;
cout<<fval<<endl;
cout<<sval<<endl;
return 0;
}
Gii thch: Cc bin *p1 v *p2 tr n a ch ca fval v{ sval. Nh vy,
*p1=10, s to cho vng a ch m n tr n, nh x n gi tr 10 (c
ngha l{ ti thi im ny fval = 10, sval = 15). Dng lnh *p2=*p1 s lm
cho bin tr *p2 tr n gi tr m *p1 tr n (tc *p2 = 10). V ti thi
im ny, bin sval c gi tr tng ng l 10 (do nh x theo vng a ch
m *p2 tr n). Dng lnh p1=p2 s g|n a ch m p2 tr n (a ch ca
bin sval) cho a ch m p1 tr n (a ch ca bin fval), nh vy, ti thi
im ny sval=fval=10. Dng lnh *p1=20 s to cho vng a ch m *p1
tr n (cng l{ a ch ca bin *p2 v fval) nh x n gi tr 20, ngha l{
fval = 20. V vy, khi kt thc chng trnh, fval = 10, sval = 20. C hai bin
*p1 v{ *p2 u tr n a ch ca bin fval.
Mt con tr c khai bo d liu ca n l mt loi d liu n{o .
Do , nu c mt bin khng phi l con tr c cng kiu d liu, chng ta
c th s dng khai bo thu gn
int *p1, *p2, num;
T r a n g | 98
C++
Chng 9. Con tr
p = numbers;//p l con tr, numbers l mng
Th hai: khi to trc tip cho tng phn t
Chng trnh
Kt qu
#include<iostream>
Nhap do dai: 4
using namespace std;
6
void Input(int *p, int length)
8
{
9
for (int i=0; i<length; i++){
0
cin>>*(p+i);
========
}
6890
}
void Output(int *p, int length)
{
for (int i=0; i<length; i++){
cout<<*(p+i)<< ;
}
}
int main()
{
int *a;
int lengtha;
cout<<Nhap do dai: ;
cin>>lengtha;
Input(a, lengtha);
cout<<========<<endl;
Output(a, lengtha);
return 0;
}
Gii thch: bin con tr lun c truyn theo kiu tham bin, do , chng
ta khng cn b sung du & v{o bn trc tn bin. H{m Input dng
nhp mng s nguyn c d{i length, h{m Output dng xut d liu t
mng nguyn . Khi truy xut t bin con tr, ngoi cch xut nh trn, ta
T r a n g | 99
C++
int *p;
for (int i=0; i<20; i++){
*(p+i)=numbers[i];
}
Chng trnh nhp xut d liu bng vic s dng con tr.
Chng 9. Con tr
cn c th vit p[i] tng ng nh mng p[i] v{ *(p+i) u l phn t th
i. Ngha l{ ta hon ton c th vit
cin>>p[i];
cout<<p[i];
cin>>*(p+i);
cout<<*(p+i);
int c = p[i]+q[j]; int c = *(p+i)+*(q+j);
Vic s dng con tr thay cho x}u cng ho{n to{n tng t. Nhng hy
lu , phn t cui cng ca n l phn t \0.
Kt qu
int *p;
*(p+i)=i;
cout<<*(p+i)<<" "<<(p+i)<<endl;
T r a n g | 100
C++
Chng 9. Con tr
}
Ta c th thy gi tr v{ vng a ch ca bin tr nguyn nh trong kt qu
trn. D nhn thy rng a ch tng theo 4 byte (0x7ffd5000 tip theo
0x7ffd5004,)
hiu r hn, ta c th quan st lc sau }y
1000
1001
pchar pchar++
2000
pshort
3000 3001 3002
plong
2001 2002
2003
pshort++
3003 3004 3005
3006
3007
plong++
Hnh 19 Tng/Gim a ch ca con tr
T r a n g | 101
C++
*p++;
Do ton t ++ c u tin cao hn to|n t *, nn biu thc n{y tng ng
vi *(p++). V vy, biu thc n{y c ngha l{ ly gi tr nh x bi nh tip
theo.
Chng 9. Con tr
Trong biu thc ny, du () c u tin cao nht, nn biu thc *p s thc
hin trc, do , gi| tr ca biu thc ny l gi tr nh x bi nh hin
ti cng thm 1.
Biu thc
*p++ = *q++;
Bi v ton t ++ c u tin cao hn to|n t *, c hai bin p v{ q u
tng, nhng bi v chng u l ton t hu t, nn ton t * s c thc
hin trc, sau mi tng a ch ca bin tng ng. Nh vy, biu thc
trn tng ng vi
*p = *q;
++p; // hay p=p+1;
++q; // hay q=q+1
Trong trng hp ny, chng ta nn s dng du () c mt cch nhn
nhn r r{ng hn.
Con tr tr vo con tr
C++ cho php s dng con tr a tng, ngha l{ con tr tr vo con
tr. khai bo con tr loi ny, chng ta ch cn b sung thm vo bin tr
mt ton t *.
7230
8092
7230
8092
10502
T r a n g | 102
C++
char a;
char *b;
char **c;
a = z;
b = &a;
c = &b;
minh ha iu ny, chng ta c th to mt a ch ngu nhin
trong b nh cho mi bin, v d l 7230, 8092 v 10502.
Chng 9. Con tr
ca bin b nh x n gi tr ca nh bin a tc gi tr l{ z. Bin c tr
v{o a ch ca b, n s nh x gin tip n gi tr ca a tc gi tr z.
S tng ng gia con tr tr vo con tr khc v mng hai chiu
Chng trnh
Kt qu
#include <iostream>
012
using namespace std;
123
int main()
234
{
//Khai bo ma trn
int **matrix;
//Khi to ma trn
matrix = new int*[3];//dng
for(int i=0; i<3; i++)//phn t
matrix[i] = new int[3];
//Nhp ma trn
for (int i=0; i<3; i++)
for (int j=0; j<3; j++)
{
*(*(matrix+i)+j)=i+j;
}
//Xut ma trn
for (int i=0; i<3; i++){
for (int j=0; j<3; j++)
cout<<*(*(matrix+i)+j)<< ;
cout<<endl;
}
//Xa ma trn
delete[] matrix;
return 0;
}
T nay tr i, khi x l bi ton trn mng, ta hon ton c th s dng con
tr x l. Chng ho{n to{n tng ng nhau. Ch c duy nht mt s
khc bit trong khai bo: nu khai bo theo kiu truyn thng, ta cn ch ra
kch thc ngay khi khai bo, cn khai bo theo kiu con tr, ta c th ch
nh kch thc sau nh vo ton t new. Chng ta s tm hiu chi tit v
ton t new trong chng tip theo.
T r a n g | 103
C++
Chng 9. Con tr
Con tr void
Con tr void l loi con tr c bit. Trong C++, void dng quy nh
s khng tn ti ca mt kiu d liu (hay kiu d liu rng). V vy, con
tr void l con tr tr vo gi tr c kiu d liu void (cng v l , m{ n
khng x|c nh di v thuc tnh tham chiu ngc).
Chng trnh
Kt qu
#include<iostream>
y, 1603
using namespace std;
void increase(void* data, int psize)
{
if(psize==sizeof(char))
{
char* pchar;
pchar=(char*)data;
++(*pchar);
}else if(psize==sizeof(int))
{
int* pint;
pint = (int*)data;
++(*pint);
}
}
int main()
{
char a = x;
int b = 1602;
increase(&a, sizeof(a));
increase(&b, sizeof(b));
cout<<a<<, <<b<<endl;
return 0;
}
Gii thch: hm increase c hai tham s: tham s data l mt con tr void,
tham s psize l{ kch thc ca con tr data. Cu lnh if s kim tra iu
kin xem bin tr data thuc kiu d liu no nu psize==sizeof(char) th
T r a n g | 104
C++
Chng 9. Con tr
n l con tr kiu char, tng t nu psize==sizeof(int) th n l con tr
kiu int. V }y, ta cha x|c nh c n l con tr kiu g, nn ta s s
dng tham s l con tr void. Nu l con tr char, ta s s dng bin tr
pchar khi to gi tr cho n bng cch p kiu t con tr void. Hon
to{n tng t cho bin tr pint. Mc ch ca hm increase l tm gi tr
tip theo ca tham s data. Trong hm main, ta s dng hai bin char v int.
Gi tr tip theo ca k t x l{ k t y, ca s 1602 l 1603.
Con tr null
Mt con tr null l con tr dng khi gn cho mt bin tr c kiu
d liu bt k. Trong C++, n c quy nh l 0.
int *p;
p = 0;
char *c;
c = 0;
Ta khng nn nhm ln gia con tr null v con tr void. Mt con tr
null l mt gi tr c th m mi con tr u c th tr n, v n c th tr
n mi v tr. Trong khi , con tr void l con tr c bit, n c th tr
n v{i v tr.
Con tr hm
C++ cho php thc thi tnh ton vi con tr tr vo hm. Khi thc thi
iu ny, n s xem h{m nh l{ mt tham s tr vo mt hm khc, nhng
chng khng tn ti tham chiu ngc. khai bo mt con tr hm, chng
ta cn khai bo n nh khai b|o prototype cho mt hm, nhng tn ca
hm s c bao trong du () ng thi b sung * pha trc tn ca n.
T r a n g | 105
Kt qu
12
8
C++
Chng trnh
#include<iostream>
using namespace std;
int addition(int a, int b)
{
return a+b;
}
int substraction(int a, int b)
{
return a-b;
Chng 9. Con tr
}
int operation (int x, int y, int (*functocall) (int, int))
{
int g;
g=(*functocall)(x,y);
return (g);
}
int main()
{
int m, n;
int (*minus)(int, int) = substraction;
m = operation(7, 5, addition);
cout<<m<<endl;
n = operation(20, m, minus);
cout<<n;
return 0;
}
Gii thch: Hai hm addition v substraction thc hin cc chc nng cng
v tr hai s nguyn. Hm operation s gi h{m tng ng vi con tr hm
c ch nh. Trong hm main, con tr hm minus s tng ng vi hm
substraction. Khi gi hm operation, ty theo con tr h{m quy nh tham
s th ba, n s tr n h{m tng ng c ch nh: operation(7, 5,
addition) tr n hm addition, tc cng hai s 7 v{ 5. Tng t,
operation(20, m, minus) s tng ng vi operation(20, m, substraction)
v cho kt qu l php tr 20 cho m.
T r a n g | 106
( )
( )
C++
Bi tp 9.
1. Hy xy dng ba hm cng hai s nguyn addi, cng hai s thc addf v
cng hai xu adds bng cch s dng con tr hm. Hm tng qut s c
t tn l add.
2. S dng con tr h{m xy dng hm gii phng trnh bc nht v
phng trnh bc 2.
3. S dng con tr h{m tnh cc tch phn sau bng phng ph|p hnh
thang hoc hnh ch nht (phi, tri hoc trung v).
Chng 10. B nh ng
CHNG 10. B NH NG
Mc ch to ra bin con tr l khng ch x l cc tc v tnh ton,
m cn c th qun l b nh m|y tnh. thc hin iu ny, chng ta cn
khai bo s nh cung cp cho mi bin con tr, khi khng cn cn dng
n chng na, chng ta c th gii phng cc nh n{y i. thc hin
c nhng tc v ny, trong C++ cung cp cho ta hai ton t l new v
delete.
Chng 10. B nh ng
//khi to bin tr tng 1
for (int i=0; i<length; i++)
num[i]=new int*[length];
//khi to bin tr tng 2
for (int i=0; i<length; i++)
for(int j=0; j<length; j++)
num[i][j]=new int[length];
truy cp n tng nh, ta c th truy cp theo num[i][j][k] hoc
*(*(*(num+i)+j)+k). Nh vy, ta c th thy rng, thc cht con tr cng l{
mt mng. Ch c mt im khc bit c bn l mng c kch thc c nh
ngay khi khai bo, con con tr c kch thc c ch nh khi ta cn s
dng bi ton t new.
B nh ng c yu cu bi chng trnh, v{ h iu hnh s cung
cp cho n t b nh heap. Tuy nhin, b nh m|y tnh cng hu hn, v n
c th b cn kit. Chnh v l , chng ta cn n mt k thut kim tra
tnh trng ny ca b nh. C++ (v thm ch C) cung cp cho ta hai phng
thc chun kim tra: vt qua ngoi l (throw bad_alloc) v khng vt
qua ngoi l (nothrow bad_alloc).
Bng vic s dng mt ngoi l l bad_alloc, h thng s b qua khi
qu trnh cung ng nh b tht bi (theo mc nh). Ngoi l l mt tnh
nng mnh m ca C++, chng ta s tm hiu chi tit nhng chng sau.
Nu gp mt ngoi l, chng ta cn cho bit c b qua tip tc chy
chng trnh hay khng. Ton t new cung cp theo phng thc mc nh
l vt qua (throw bad_alloc).
T r a n g | 108
C++
Chng 10. B nh ng
hung ny. Chi tit, chng ta s tho lun k hn trong phn sau. Lu rng,
hai ngoi l ny nm trong th vin <new>.
C++
Chng trnh
Kt qu
#include <iostream>
Allocation is ok
#include <new>
Allocation is ok
using namespace std;
Allocation is ok
int main()
Allocation is ok
{
Allocation fail
double *ptr[ 5];
for ( int i = 0; i < 5; i++ )
{
ptr[ i ] = new (nothrow) double[ 50000000 ];
if (ptr[i]!=0)
cout << "Allocation is ok";
else
cout<<Allocation fail;
}
delete[] ptr;
return 0;
}
Trong ANSI-C, hm malloc, calloc, realloc v{ free c dng thay cho
new v delete v hin nhin chng cng hot ng trn C++. Chng ta
khng tho lun chi tit v h{m n{y, v theo xu hng ca lp trnh C++
hin i, ngi ta s dng hai ton t new v delete m ta tho lun trn.
T r a n g | 109
Struct
Mt d liu struct l mt nhm cc phn t c th c kiu d liu
kh|c nhau c t cng mt tn. Cc phn t d liu n{y c gi l cc
thnh vin ca struct. Cu trc khai b|o struct trong C++ nh sau
struct tn_struct{
type thnh_vin_1;
type thnh_vin_2;
} [tn_i_tng_struct];
Trong :
struct l mt t kha.
tn_struct l tn kiu d liu struct m{ ta nh ngha.
thnh_vin_1, l{ c|c phn t thnh vin ca struct.
tn_i_tng_struct: l tn bin thuc kiu tn_struct.
Hai c|ch khai b|o sau }y l{ tng ng.
V d 1
V d 2
struct product{
struct product{
int weight;
int weight;
float price;
float price;
}
}apple, banana, melon;
product apple;
product banana, melon;
Gii thch: trong hai v d trn product l kiu d liu struct m ta to ra.
N gm c hai th{nh vin l{ weight v{ price. Tng ng vi kiu d liu
Trang | 110
C++
T r a n g | 111
T r a n g | 112
Kt qu
Buy apples
weight and price
100
2
Continue to buy apples (y/n) ?y
weight and price
200
3
Continue to buy apples (y/n) ?n
Buy bananas
weight and price
150
1
Continue to buy bananas (y/n)
?y
weight and price
250
3
Continue to buy bananas (y/n)
?n
Total weight: 0.7
No Promotion
C++
Chng trnh
#include<iostream>
using namespace std;
#define MAX 10
struct product{
int weight;
float price;
}apples[MAX], bananas[MAX];
/*
Khai bo hm
*/
void buyProducts(product pd, string
name, int &weight, float &price)
{
int i = 0;
cout<<Buy <<name<<endl;
while (true){
cout<<weight and price: <<endl;
cin>>pd[i].weight;
cin>>pd[i].price;
weight += pd[i].weight;
price += pd[i].price;
cout<<Continue to buy <<name<<
(y/n) ?;
char yn;
cin>>yn;
if((yn==n)||(yn==N)) break;
else i++;
}
}
int main()
{
Trong phn thc thi chng trnh, ngi tiu dng ~ mua hai qu
to v hai qu chui. Qu to th nht c khi lng 100g v gi 2$, qu to
th hai 200g v 3$. Qu chui th nht c khi lng 150g v gi 1$, qu
chui th hai 250g v 3$.
T r a n g | 113
C++
Con tr struct
Tng ng vi mng struct, ta cng c con tr tr vo struct. Vi con
tr tr vo struct, ta c th to ra mt mng struct ng.
Khai bo con tr struct: c hai cch khai bo
struct product{
int weight;
float price;
}*apples;
struct product{
int weight;
float price;
};
product* apples;
Tham chiu: ho{n to{n tng t nh con tr tr vo kiu d liu nguyn
thy.
struct product{
int weight;
float price;
}apples1;
products* apples2;
apples2 = &apples1;
Truy cp gi tr ca phn t thnh vin: c hai cch truy cp
apples2->weight
*(apples2.weight)
apples2->price
*(apples2.price)
struct product{
int weight;
float price;
}*apples2;
.
apples2->weight
T r a n g | 114
struct product{
int *weight;
float price;
}apples2;
*apples2.weight
C++
Khai bo tun t
struct children{
string son;
string daughter;
};
struct family{
string father;
string mother;
children first, second;
}myfamily;
Khi , vic truy cp cng tng t nh trn
myfamily.first.son
.
Nu l con tr, ta cng c c|ch truy cp tng t.
struct family{
string father;
string mother;
struct children{
string son;
string daughter;
}*first, second;
}*myfamily;
myfamily->first->son
myfamily->second.son
T r a n g | 115
C++
cout<<sizeof(mynum);
//12
Gii thch:
V d 2
struct number{
char a;
char c;
int b;
}mynum;
cout<<sizeof(mynum);
//8
char
T r a n g | 116
char
int
C++
Trong v d 1:
Trong v d 2:
char 1byte
Cng tng t v d 1. D liu thnh
int 4byte
vin char th nht chim 1 byte, h
u tin, d liu thnh vin char s thng cung cp 4 byte, nh vy tha
lp y nhm 4byte, char chim 3 byte. Kiu d liu thnh vin tip
1byte nn cn tha 3 byte. D liu theo cng kiu char, chim 1byte, n
thnh vin tip theo l int. V int c th lp vo s byte cn tha. Ti
chim 4byte, nhng ch tha c 3 thi im ny, cn tha 2 byte. Tip
byte, n khng ch cho int. Do , theo, ta xt n d liu thnh vin
h thng s t ng cung cp thm 3 int. D liu ny chim 4 byte, nhng
byte lp y phn cn tha. Tip ch cn tha 2 byte, do h thng
theo, s cung cp nhm 4 byte cho s lp y 2 byte ny v cung cp
int. Khng c byte tha trong trng thm 4 byte mi cho int. Nh vy, s
hp ny. Kiu d liu thnh vin byte trong trng hp ny l
char cn li chim 1byte, nhng h (1+1+2)+4=8 byte.
thng cung cp cho n 4 byte, cn
tha 3 byte. S byte tha ny s
c lp y. Nh vy, s byte trong
trng
hp
ny
l
(1+3)+4+(1+3)=12 byte.
Nh vy, ty vo kiu d liu thnh vin, ta cn chn mt cch sp xp hp
l c mt kt qu ti u v b nh. Hy quan st lc sp xp b nh
hng ti u nh bn di (trng hp 2).
C mychar;
pchar p;
string50 str;
}bin_kiu_d_liu_union;
Khi khi bo kiu union, cc d liu thnh vin s c khai bo trn cng
mt khng gian b nh vt l. Kch thc ca n l{ kch thc ca kiu d
liu thnh vin ln nht.
V d
union myType{
char C;
double Db;
} newType;
//8 byte, v double = 8byte, char = 1byte.
Trang | 117
//S dng
bin_kiu_d_liu_union.tn_thnh_vin
};
Khi khai bo bin thuc kiu union n danh, ta c th khai b|o nh sau
V d
C++
enum Tn_kiu_enum{
gi_tr_1;
gi_tr_2;
}Tn_th_hin_enum;
Chng ta c th tham kho thm cc v d sau }y
C++
int main()
{
for(int i=0; i<3; i++)
if (colors(i)==green) cout<<"green"<<endl;
return 0;
}
T r a n g | 119
Trang | 120
C++
C++
Trong hai v d minh ha trn, chng ta thy rng hng tip cn theo
lp trnh hng i tng l rt gn gi vi cuc sng thc. Chng ta
khng quan t}m n nhng kha cnh khng cn thit ca i tng,
chng ta ch tp trung v{o c|c c trng v{ c|c h{nh ng ca i tng.
K t thi im ny tr i, chng ta s gi cc c trng ca i tng l
cc thuc tnh thnh vin ca i tng (hoc d liu thnh vin, bin
thnh vin ca i tng) v{ c|c h{nh ng ca i tng l{ c|c phng
thc thnh vin (hay hm thnh vin) ca i tng. Cc cch gi d liu
thnh vin, thuc tnh thnh vin, bin thnh vin hay thuc tnh (tng
ng phng thc th{nh vin, h{m th{nh vin, phng thc) l khng c
s phn bit. Ti ch a ra nhiu cch gi kh|c nhau chng ta c th
quen khi tham kho cc gio trnh khc nhau. Bi l, nhiu gio trnh chn
la cc cch gi khc nhau. Cc cch gi n{y cng ty thuc vo ngn ng
lp trnh (trong C++ thng thng ngi ta s dng khi nim d liu
thnh vin member data hoc bin thnh vin member variable v hm
thnh vin member function, trong khi , c|c ngn ng nh Java, Delphi
hay C# li s dng khi nim phng thc method v thuc tnh
property). Khi nim thnh vin s p dng cho c d liu thnh vin ln
hm thnh vin.
Phng ch}m ca lp trnh hng th tc theo gi|o s Niklaus Wirth
Chng trnh = Cu trc d liu + Gii thut
Cn phng ch}m ca lp trnh hng i tng l
Chng trnh = i tng + D liu
Thuc tnh
T r a n g | 123
C++
Phng thc
C++
Hnh 20 Minh ha s lp
T r a n g | 125
C++
Lp v i tng
Lp l s biu din ca i tng trong lp trnh v{ ngc li i
tng l s th hin ca lp. Mt i tng gm c: thuc tnh v{ phng
thc. Chng ta c th xem mt lp nh l{ mt kiu d liu, cn i tng l
bin. Lp c khai bo nh t kha class
class tn_lp{
cc_thuc_tnh
cc_phng_thc
} [tn_i_tng];
tn_lp: l tn ca lp.
tn_i_tng: l tn ca i tng.
Khai bo lp tng i ging khai bo struct.
Cc thuc tnh c khai b|o nh khai b|o bin. C|c phng thc c
khai b|o nh khai b|o h{m. Chng c th c ch nh bng mt trong ba
t kha: private, protected v public.
o private: cc thnh vin (bin thnh vin hoc hm thnh vin) ca cng
mt lp hoc t mt hm bn ca n c th truy cp.
o protected: cc thnh vin ca cng mt lp hoc t mt hm bn ca n
hoc t mt lp dn xut ca n hoc bn ca mt lp dn xut ca n
u c th truy cp. Mc truy cp ln nht trong trng hp ny l bn
ca lp dn xut. Chng ta s tho lun thm trong nhng phn sau.
o public: cc thnh vin c th truy cp ln nhau t mi lp.
class Humans{
string name;
int age;
public:
void setName(string);
void setAge(string);
string getName(void);
int getAge(void);
T r a n g | 126
C++
Chng trnh
Kt qu
#include<iostream>
The man: Jack, age 21
using namespace std;
class Humans{
string name;
int age;
public:
void setName(string);
void setAge(int);
string getName(void);
int getAge(void);
};
void Humans::setName(string s){
name = s;
}
void Humans::setAge (int a){
age = a;
}
string Humans::getName(void){
return name;
}
int Humans::getAge(void){
return age;
}
int main(){
Humans man;
man.setName(Jack);
man.setAge(21);
cout<<The man: <<man.getName()<<, age
T r a n g | 127
C++
class Humans{
string name;
int age;
public:
void setName(string);
void setAge(int);
string getName(void);
int getAge(void);
};
void Humans::setName(string s){
name = s;
T r a n g | 128
Kt qu
Name and
1
Nam
21
Name and
2
Binh
22
Name and
3
Xuan
22
Name and
4
Tuan
age of Student
age of Student
age of Student
age of Student
C++
Chng trnh
#include<iostream>
using namespace std;
21
Name and age of Student
5
Lan
22
=====Students=====
The man: Nam, age 21
The man: Binh, age 22
The man: Xuan, age 22
The man: Tuan, age 21
The man: Lan, age 22
T r a n g | 129
C++
int main(){
Humans man[MAX];
for(int i=0; i<MAX; i++){
string s;
int a;
cout<<"Name and age of Student "
<<(i+1)<<endl;
cin>>s;
cin>>a;
man[i].setName(s);
man[i].setAge(a);
}
cout<<"=====Students====="<<endl;
for(int i=0; i<MAX; i++)
cout<<"The man: "<<man[i].getName()<<",
age "<<man[i].getAge()<<endl;
return 0;
}
Trong trng hp ny, bin man l mt mng c|c i tng Humans.
Chng trnh minh ha cho vic nhp tn sinh vin, tui ca h v{ lu v{o
mt mng. Sau , xut kt qu ra mn hnh. D l cng l s th hin ca
lp Humans, nhng c|c i tng man[1], man[2], c c|c thuc tnh hon
ton khc nhau.
Hm to v hm hy
Chng trnh
V d
#include<iostream>
The man: Jack, age 21
using namespace std;
class Humans{
string name;
int age;
public:
Humans(string, int);
string getName(void);
int getAge(void);
};
Humans::Humans (string s, int a){
name = s;
age = a;
}
string Humans::getName(void){
return name;
}
int Humans::getAge(void){
return age;
}
int main(){
Humans man(Jack, 21);
cout<<The man: <<man.getName()<<, age
<<man.getAge();
return 0;
}
Hm to khng c kiu d liu tr v - tng ng vi kiu void. Tuy nhin
chng ta s khng s dng t kha void trc khai bo hm to.
T r a n g | 130
C++
Chng trnh
V d
#include<iostream>
The man: Jack, age 21
using namespace std;
class Humans{
string name;
int age;
public:
Humans(string, int);
~Human();
string getName(void);
int getAge(void);
};
Humans::Humans (string s, int a){
name = s;
age = a;
}
Humans::~Humans()
{
//do something
//delete pointer;
}
string Humans::getName(void){
return name;
}
int Humans::getAge(void){
return age;
}
int main(){
Humans man(Jack, 21);
cout<<The man: <<man.getName()<<, age
<<man.getAge();
T r a n g | 131
C++
return 0;
Chng cht hm to
Cng nh c|c h{m kh|c trong C++ cho php chng cht hm, hm to
cng c th b chng cht. Khi chng cht hm to th danh sch tham s
phi khc nhau (kiu d liu hoc s lng tham s). Chng ta cn nh
rng, khi chng cht hm th trnh bin dch s gi mt h{m tng ng vi
danh sch tham s ca n. Trong trng hp chng cht hm to, th qu
trnh gi l t ng khi i tng c to ra, do , mt hm to s c
gi t ng tng ng vi danh sch tham s ca n.
T r a n g | 132
V d
The man: Jack, age 21
The default: Default, age
21
C++
Chng trnh
#include<iostream>
using namespace std;
class Humans{
string name;
int age;
public:
Humans(void);
Humans(string, int);
string getName(void);
int getAge(void);
};
Humans::Humans (void){
name = Default;
age = 21;
}
Humans::Humans (string s, int a){
name = s;
age = a;
}
string Humans::getName(void){
return name;
}
int Humans::getAge(void){
return age;
}
int main(){
Humans man(Jack, 21);
Humans default;
Sao chp hm to
C++
Tham chiu hng. Phng thc sao chp hm to (hoc tng qut l cc
phng thc c s dng tham chiu hng n lp i tng) c th thc
hin theo tham chiu hoc tham chiu hng (tng ng vi khng hoc c
t kha const), nhng hy lun quy nh l tham chiu (c ton t &). Khi
quy nh tham chiu, i tng tham chiu s tham chiu n a ch ca
i tng gc. D liu ca i tng tham chiu s c nh x theo a ch
ca i tng c tham chiu (khng thc hin vic sao chp trc tip m
l gin tip thng qua a ch ca bin tham chiu). Tuy nhin, cng v l do
n{y m{ i tng c tham chiu c th b thay i gi tr (tng t nh
truyn theo tham bin). iu ny lm vi phm tnh ng gi trong lp trnh
hng i tng. Cng v l do n{y, C++ cung cp cho ta t kha const
quy nh mt i tng khi c tham chiu s khng b lm thay i d
liu th{nh vin v{ n c gi l tham chiu hng. Nh vy, ta cn phn
bit ba cch truyn tham s i tng trong mt phng thc: truyn theo
tham tr d liu ca i tng c th c thay i bn trong phng
thc nhng s thay i ny khng lu li, vic sao chp d liu trong
trng hp ny l thc thi trc tip nn thng ch p dng cho cc kiu
d liu nguyn thy n gin; truyn theo tham chiu d liu ca i
tng c th b thay i trong phng thc v n c lu li, n thc hin
vic sao chp d liu mt cch gin tip nn d liu c cu trc phc tp
(nh lp i tng, con tr) c th c sao chp nhanh hn rt nhiu so
vi truyn theo tham tr; tham chiu hng tng t nh tham chiu
nhng khng cho php thay i d liu ca i tng ngay c trong
phng thc.
T r a n g | 134
C++
class Humans{
string name;
int age;
public:
Humans(string, int);
Humans(const Humans&);
string getName(void);
int getAge(void);
};
Humans::Humans(const Humans&
m){
name = m.name;
age = m.age;
}
Khng hp l
class Humans{
string name;
int age;
public:
Humans(string, int);
Humans(const Humans&);
~Human();
string getName(void);
int getAge(void);
};
Humans::Humans(const Humans&
m){
name = m.name;
age = m.age = 22;//Error
}
class PhanSo
T r a n g | 135
V d Tham chiu
class PhanSo
C++
};
private:
int Tu;
int Mau;
public:
//Khai bo cc hm to
PhanSo Nhan(const PhanSo&);
int GetTu(void);
int GetMau(void);
PhanSo PhanSo::Nhan(const
PhanSo& p)
{
return PhanSo(Tu*p.Tu,
Mau*p.Mau);
//khng c php vit
PhanSo(Tu*p.GetTu(),
Mau*p.GetMau());
}
int PhanSo::GetTu(void)
{
return Tu;
}
};
private:
int Tu;
int Mau;
public:
//Khai bo cc hm to
PhanSo Nhan(PhanSo&);
int GetTu(void);
int GetMau(void);
PhanSo PhanSo::Nhan(PhanSo& p)
{
return PhanSo(Tu*p.GetTu(),
Mau*p.GetMau());
//hoc PhanSo(Tu*p.Tu,
Mau*p.Mau);
}
int PhanSo::GetTu(void)
{
return Tu;
}
int PhanSo::GetMau(void)
{
return Mau;
}
int PhanSo::GetMau(void)
{
return Mau;
}
Trong trng hp ta mun s dng phng thc cho i tng tham chiu
hng, th cn khai b|o phng thc GetTu v{ GetMau l{ phng thc hng.
Khi , chng ta s dng c ph|p sau }y:
int GetTu(void) const;
C++
T r a n g | 136
class PhanSo
{
private:
int Tu;
int Mau;
public:
//Khai bo cc hm to
PhanSo Nhan(const PhanSo&);
int GetTu(void) const;
int GetMau(void) const;
};
PhanSo PhanSo::Nhan(const PhanSo& p)
{
return PhanSo(Tu*p.Tu, Mau*p.Mau);
//hoc PhanSo(Tu*p.GetTu(), Mau*p.GetMau());
}
int PhanSo::GetTu(void) const
{
return Tu;
}
int PhanSo::GetMau(void) const
{
return Mau;
}
Vic b sung t kha const v{o sau khai b|o phng thc s gip cho i
tng tham chiu hng c th gi phng thc hng ny.
Chng trnh
#include <iostream>
using namespace std;
T r a n g | 137
C++
int main () {
complex c;
c.getreal() = 2;
c.getimg() = 1;
cout<<c.getreal()<<" + I*"<<c.getimg();
}
Trong v d ny, chng ta thy c|c phng thc getter c khai bo l
phng thc tham chiu. Ta c th gn trc tip gi tr cho c|c phng
thc n{y. Trong trng hp n{y, phng thc getter c c hai tnh nng:
T r a n g | 138
C++
Tnh ng gi Encapsulation
V d trn a ra cho ta hai phng |n: nn hay khng nn s dng
t kha const. Cu tr li l h~y nn quy nh vic sao chp hm to l
truyn theo tham chiu hng, bi l c|c i tng khc nhau, khng c
quyn chnh sa d liu thnh vin ca nhau, n ch c th truyn thng
ip cho nhau m thi, vic chnh sa d liu thnh vin l do bn thn ca
i tng . iu ny l s th hin tnh ng gi trong lp trnh hng
i tng. Tnh ng gi ca lp trnh hng i tng cn th hin cc
mc cho php truy cp i vi d liu v hm thnh vin tng ng
vi t kho| private, protected v{ public m{ ta ~ tho lun trn.
Khi nim: tnh ng gi l{ tnh cht khng cho php ngi dng hay
i tng kh|c thay i d liu thnh vin ca i tng ni ti. Ch c cc
hm thnh vin ca i tng mi c quyn thay i trng thi ni ti
ca n m thi. C|c i tng khc mun thay i thuc tnh thnh vin ca
i tng ni ti, th chng cn truyn thng ip cho i tng, v vic
quyt nh thay i hay khng vn do i tng ni ti quyt nh.
T r a n g | 139
C++
Con tr i tng
Chng ta ~ l{m quen vi mng i tng v{ chng ta cng ~ bit
rng c s tng ng 1-1 gia mng v con tr. Trong phn ny, chng ta
s tho lun v con tr i tng. Chng ta vn s dng lp Humans trn
cho cc v d minh ha trong phn ny. Vic khai bo con tr i tng
ho{n to{n tng t nh khai b|o con tr d liu.
Humans *man;
truy cp n c|c phng thc thnh vin bn ngoi lp (hm thnh
vin), ta s dng du -> (v ch c c|c phng thc th{nh vin c ch
nh l public). Khi gi phng thc khi to, ta c th gi theo cch m ta
~ s dng cho con tr d liu. Hoc c th s dng ton t new.
Chng trnh
Kt qu
Andy, 22
int main()
Jack, 21
{
Humans man(Andy, 22);
Humans *man0 = &man;
//Hoc
Humans *man1 = new Humans(Jack, 21);
cout<<man0->getName()<<, <<endl<<man0>getAge()<<endl;
cout<<man1->getName()<<endl<<man1->getAge();
return 0;
T r a n g | 140
C++
Cch c
tr bi x
a ch ca x
thnh vin y ca i tng x
thnh vin y ca i tng tr bi x
thnh vin y ca i tng tr bi x
i tng th i tr bi x
Con tr this
Con tr this tr vo d liu thnh vin ca chnh n. iu ny c
ngha l{ con tr this ch c phm vi tc dng trong mt lp. Mt iu cc k
T r a n g | 141
C++
V d
Kt qu
#include<iostream>
0
using namespace std;
1
class Complex{
float real;
float img;
public:
Complex(float, float);
bool isMe(const Complex&);
};
Complex::Complex(float real, float img){
this->real = real;
this->img = img;
}
bool Complex::isMe(const Complex& c){
if(&c==this)
return true;
else
return false;
}
int main(){
Complex a(3, 2);
Complex b(2, 2);
Complex *c = &a;
cout<<a.isMe(b)<<endl;
cout<<a.isMe(*c);
return 0;
}
Gii thch: vi vic s dng con tr this trong hm to, ta c th t tn cc
tham s trong hm to trng vi tn cc d liu ca lp. truy cp n
cc thuc tnh ca lp, ta s dng con tr this. Hm thnh vin isMe s kim
tra mt i tng c phi l chnh n hay khng (c cng a ch trn b
T r a n g | 142
C++
T r a n g | 143
Kt qu
---Call by NonStatic method--Name: Ford
Serial: 123
---Call by Static method--Name: Ford
Serial: 123
Count: 2
C++
V d
#include <iostream>
using namespace std;
class Car
{
public:
string name;
int serial;
public:
static int count;
static void Show()
{
Car vehicle;
}
static void CallShowStatic(){
Show();
}
void CallShowNonStatic(){
Show();
}
};
int Car::count = 2;
int main()
{
Car a;
cout<<"---Call by NonStatic method---";
a.CallShowNonStatic();
cout<<"\n---Call by Static method---";
Car::CallShowStatic();
cout << "\n\nCount: " <<Car::count;
return 0;
}
Gii thch: Hm thnh vin Show l static, nn mun truy cp n cc d
liu th{nh vin khng tnh th n cn to mt s th hin ca lp l{ i
tng vehicle. Hm CallShowStatic l static, hm CallShowNonStatic l
non-static u c th truy cp n hm Show l static mt cch trc tip.
Trong hm main, cc hm non-static c gi thng qua mt s th hin
lp, cn h{m static c gi thng qua ton t phm vi. D liu static l
count cng c truy cp thng qua ton t phm vi.
Mc d thnh vin static c th c truy cp trc tip thng qua ton t
phm vi, nhng n cng chu s chi phi ca cc mc truy cp (private,
protected, public).
Ch c cc thnh vin khng tnh mi c th s dng con tr this.
Hm bn: nu mt thnh vin ca lp c quy nh l private hoc
protected th ch c cc hm thnh vin ca lp mi c quyn truy cp n
n. Nu mt phng thc khng phi l thnh vin ca lp mun truy cp
T r a n g | 144
C++
Hm bn v lp bn
V d
#include <iostream>
using namespace std;
T r a n g | 145
Kt qu
Square: 5x5
C++
C++
class Rectangle
{
private:
int w;
int h;
public:
Rectangle(int, int);
friend class MakeSquare;
};
class MakeSquare{
private:
int w;
int h;
public:
MakeSquare(Rectangle);
void ShowSquare(void);
};
MakeSquare::MakeSquare(Rectangle rec){
this->w = max(rec.w, rec.h);
this->h = max(rec.w, rec.h);
}
void MakeSquare::ShowSquare(void){
cout<<"Square: "<<w<<"x"<<h;
}
int main()
{
Rectangle rec(2, 5);
MakeSquare mk(rec);
mk.ShowSquare();
return 0;
}
Gii thch: Lp Rectangle c quy nh l lp bn ca lp Square, do ,
lp Square c quyn truy cp n cc thuc tnh private v protected ca
lp Rectangle. Hm to ca lp Square truy cp n cc d liu thnh vin
ca lp Rectangle ly chiu di v chiu rng ca i tng rec (d
chng l{ private), to nn i tng mk. i tng Square c to mi
vi cnh ca n l s o ln nht cc cnh ca i tng Rectangle.
T r a n g | 147
Kt qu
2 + 3*I
4 + 3*I
C++
V d
#include<iostream>
using namespace std;
class Complex{
float real;
float img;
public:
Complex(float, float);
Complex operator +(const Complex&);
Complex operator ++(void);
void toString(void);
};
Complex::Complex(float a, float b){
real = a;
img = b;
}
Complex Complex::operator +(const Complex& b){
Complex c(0, 0);
c.real = real + b.real;
}
Complex Complex::operator ++(void){
Complex c(0, 0);
c.real += ++real;
c.img += ++img;
return c;
}
void Complex::toString(void){
cout<<real<<" + "<<img<<"*I"<<endl;
}
int main(){
Complex a(3, 2);
Complex b(-1, 1);
(a+b).toString();
(++a).toString();
return 0;
}
Ta lu rng, trong phng thc ton t, s tham s hnh thc lun
bng hng ca ton t tr 1. iu n{y c ngha l{ vi php ton mt ngi s
khng c tham s hnh thc, vi ton t hai ngi s c mt tham s hnh
thc. iu ny l d hiu, bi ~ c mt tham s mc nh chnh l{ bn
th}n i tng ni ti (i tng tng ng vi con tr this). Php ton
cng, s cng i tng ni ti vi mt i tng kh|c. Php to|n tng mt
n v thc, mt n v o s l{m thay i gi tr ca n v thc v{ n v
o ca i tng ni ti ln 1. V cc ton t ny tr v kiu s phc, nn ta
hon ton c th thc hin php ton phc hp vi chng (tc l mt biu
thc c nhiu ton t loi ny thc hin trn cc hng t l cc s phc).
T r a n g | 148
C++
(a+ ++b+(a+b)).toString();
Bng vic s dng chng cht ton t, biu thc tnh ton s tr nn n
gin hn. Ta cng c th s dng cch gi a.operator+(b). Hai cch ny cho
kt qu nh nhau. i vi hm ton t + v ++ trn, ta c th vit ngn
gn hn m{ khng cn khai bo thm mt bin tm:
Kt qu
4 + 1*I
};
Complex::Complex(float a, float b){
real = a;
img = b;
}
void Complex::toString(void){
cout<<real<<" + "<<img<<"*I"<<endl;
}
Complex operator -(const Complex &a, const Complex
&b){
return Complex(a.real - b.real, a.img - b.img);
}
int main(){
T r a n g | 149
C++
Complex(float, float);
void toString(void);
}
Gii thch: trong v d ny, hm ton t - khng phi l hm thnh vin ca
lp Complex. Do , mun truy cp n cc thuc tnh ca n, ta phi quy
nh cc thuc tnh ny l public hoc phi to thm c|c phng thc getter
thu thp d liu hoc quy nh n l hm bn. Cng v n khng phi l
hm thnh vin ca lp Complex, nn s tham s trong php ton mt ngi
l 1, trong php ton hai ngi l 2.
i vi chng cht ton t nhp xut - IO overloading, chng ta c mt
s ch :
+ Nu khai bo hm ton t l mt thnh vin ca lp.
V d
#include <iostream>
Kt qu
(4, 5)
class Vector2D{
private:
int x, y;
public:
Vector2D(){
x = 0;
y = 0;
}
Vector2D(int x1, int y1){
x = x1;
y = y1;
}
ostream& operator<<(ostream& os){
os<<"("<<x<<", "<< y<<")";
return os;
}
};
int main()
{
T r a n g | 150
C++
}
Gii thch: hm ton t << s thc thi vic in gi tr ca i tng ni ti (v
n l thnh vin ca lp Vector2D). N l ton t n hng, do , trong
hm ton t khng c mt tham s Vector2D. i vi cch s dng ny, ta
ch c th gi n trong hm main bng mt trong hai cch sau:
ab.operator<<(cout) hoc ab<<(cout). C hai cch gi n{y u khng trng
khp vi ton t xut (hay ton t chn d liu). Thng thng, ta s xut
d liu theo chun cout<<d_liu. thc hin iu ny, ta cn s dng
cch hai.
+ Nu khai bo hm ton t khng phi l thnh vin ca lp.
V d
#include <iostream>
Kt qu
(4, 5)
T r a n g | 151
C++
class Vector2D{
private:
int x, y;
public:
Vector2D(){
x = 0;
y = 0;
}
Vector2D(int x1, int y1){
x = x1;
y = y1;
}
friend ostream& operator<<(ostream&, const Vector2D&);
};
Kt qu
(4, 5)
C++
class Vector2D{
private:
int x, y;
public:
Vector2D(){
this->x = 0;
this->y = 0;
}
Vector2D(int x, int y){
this->x = x;
this->y = y;
}
friend istream& operator>>(istream&, Vector2D&);
};
int main()
{
Vector2D ab;
cin>>ab;
return 0;
}
Cc kiu d liu ostream& v istream& nm trong th vin iostream ca
namespace std (du & quy nh l truyn theo tham chiu hoc phng
thc tham chiu).
T r a n g | 153
C++
V d
Kt qu
#include <iostream>
using namespace std;
class Animal{
protected:
string name;
int weight;
public:
Animal(void);
Animal(string, int);
void move(void);
void eat(void);
};
class Cat:public Animal{
private:
T r a n g | 154
C++
class Animal{
};
class Cat: T_kha_mc_truy _cp Animal{
};
class Fish: T_kha_mc_truy _cp Animal{
};
Theo cu trc khai bo ny, th Cat v Fish l lp con ca lp c s Animal.
string colorf;
string colore;
public:
Cat(string, int, string, string);
void catchmouse(void);
void climb(void);
};
void Animal::move(void){
cout<<"I can move"<<endl;
}
void Animal::eat(void){
cout<<"I can eat"<<endl;
}
Animal::Animal(){
this->name = "";
this->weight = 0;
}
Animal::Animal(string name, int weight){
this->name = name;
this->weight = weight;
}
void Cat::catchmouse(void){
cout<<"I can catch mouse"<<endl;
}
void Cat::climb(void){
cout<<"I can climb tree"<<endl;
}
Cat::Cat(string name, int weight, string colorfc,
string colorec){
this->name = name;
this->weight = weight;
this->colorf = colorf;
this->colore = colore;
}
int main()
{
T r a n g | 155
C++
Cc mc truy cp
Phm vi
public
protected
private
c php
c php
c php
c php
c php
khng c php
Cn li
c php
khng c php
khng c php
T r a n g | 156
C++
int main()
{
T r a n g | 157
Kt qu
20
C++
V d
#include <iostream>
using namespace std;
class Polygon{
protected:
int w, h;
public:
void SetValue(int w, int h){
this->w = w;
this->h = h;
}
};
class Rectangle:public Polygon{
public:
int GetArea(){
return w*h;
}
};
}
Gii thch: bn lu trong phng thc GetArea ca i tng Rectangle.
N s dng cc bin th{nh vin c tha k t lp Polygon. Nhng bin
th{nh vin n{y c khai b|o l{ protected, do , n c quyn truy cp n.
Trong trng hp, bn ca mt lp dn xut, ta c th quan st v d minh
ha sau }y:
int main()
{
Rectangle rec;
rec.SetValue(4, 5);
ShowWH(rec);
return 0;
}
T r a n g | 158
Kt qu
4x5
C++
V d
#include <iostream>
using namespace std;
class Polygon{
protected:
int w, h;
public:
void SetValue(int w, int h){
this->w = w;
this->h = h;
}
};
class Rectangle:public Polygon{
public:
int GetArea(){
return w*h;
}
friend void ShowWH(Rectangle);
};
void ShowWH(Rectangle p){
cout<<p.w<<"x"<<p.h;
}
V d
Kt qu
#include <iostream>
using namespace std;
class A{
int a;
public:
void showA(void);
};
class B{
int b;
public:
void showB(void);
};
Im A
Im B
Im C
T r a n g | 159
C++
+ Lp A gi l lp con; lp B, C, D gi l cc lp c s.
C++
Con tr tr vo lp c s
V d
Kt qu
#include <iostream>
using namespace std;
class Polygon{
protected:
int w, h;
public:
void setValue(int w, int h){
this->w = w;
this->h = h;
}
};
class Rectangle:public Polygon{
public:
int area(){
return w*h;
}
};
class Triangle:public Polygon{
public:
int area(){
return w*h/2;
}
};
int main()
{
Rectangle rec;
Triangle tri;
Polygon *pol1 = &rec;
Polygon *pol2 = &tri;
pol1->setValue(4, 5);
pol2->setValue(4, 5);
Area of Rectangle: 20
Area of Triangle: 10
T r a n g | 161
C++
thc th{nh vin ring. Phng thc thnh vin ny cng ni dung, nhng
li c cch th hin khc nhau (cng tnh din tch, nhng din tch hnh
ch nht v hnh tam gic c cng thc tnh khc nhau).
V d
Kt qu
#include <iostream>
using namespace std;
class Polygon{
protected:
int w, h;
public:
void setValue(int w, int h){
Area of Rectangle: 20
Area of Triangle: 10
Area of Polygon: 0
T r a n g | 162
C++
T r a n g | 163
"<<pol1"<<pol2"<<pol3-
C++
};
class Rectangle:public Polygon{
public:
int area(){
return w*h;
}
};
class Triangle:public Polygon{
public:
int area(){
return w*h/2;
}
};
int main()
{
Rectangle rec;
Triangle tri;
Polygon pol;
Polygon *pol1 = &rec;
Polygon *pol2 = &tri;
Polygon *pol3 = &pol;
pol1->setValue(4, 5);
pol2->setValue(4, 5);
pol3->setValue(4, 5);
cout<<"Area
of
Rectangle:
>area()<<endl;
cout<<"Area
of
Triangle:
>area()<<endl;
cout<<"Area
of
Polygon:
>area()<<endl;
Hnh 22 Lp c s o
T r a n g | 164
C++
Kt qu
#include<iostream>
error
C2385:
ambiguous access of 'a'
T r a n g | 165
C++
class C
{
public:
int c;
};
Kt qu
#include<iostream>
Khng li
class A
{
public:
int a;
};
class B
T r a n g | 166
C++
int main()
{
F f;
f.a = 1;
return 0;
}
T r a n g | 167
C++
V d
Kt qu
#include <iostream>
using namespace std;
class Polygon{
protected:
int w, h;
public:
void setValue(int w, int h){
this->w = w;
this->h = h;
}
virtual int area() = 0;
};
Area of Rectangle: 20
Area of Triangle: 10
T r a n g | 168
C++
C++
V d
Kt qu
#include <iostream>
#include <math.h>
C++
int main()
{
Point2D v2;
Point2D u2;
cout<<".::-----Nhap toa do cho hai Point2D u
va v-----::."<<endl;
cout<<"+ Toa do u:"<<endl;
cin>>v2.getX();
cin>>v2.getY();
cout<<"+ Toa do v:"<<endl;
cin>>u2.getX();
cin>>u2.getY();
Point* u = &v2;
Point* v = &u2;
cout<<"D(u,v) = "<<u->KhoangCach(v);
Point3D v3;
Point3D u3;
cout<<endl<<".::-----Nhap toa do cho hai
T r a n g | 171
C++
float Point3D::KhoangCach(void* p)
{
Point3D* q = (Point3D*)(p);
return sqrt(pow(q->x-x,2)+pow(q->yy,2)+pow(q->z-z,2));
}
C++
Hm mu Template Function
Trong nhiu trng hp chng ta cn xy dng hm m kiu d liu
ca cc tham s v kiu d liu ca hm tr v l{ khng tng minh (c
ngha l{ chng c dng tng qut, c th l s nguyn, s nguyn d{i, x}u).
Khi , gii quyt vn ny, chng ta c th s dng qu ti h{m nh
trn, con tr hm v thm mt cch thc na, l{ h{m mu template
function. khai bo kiu d liu khng tng minh ny, chng ta c th
khai b|o nh sau:
template <class T>
V d sau }y minh ha vic s dng hm mu template function.
V d
Kt qu
#include <iostream>
3
using namespace std;
abcd
template <class T>
T add(T a, T b)
{
return a+b;
}
int main()
{
cout<<add<int>(1, 2)<<endl;
cout<<add<string>(ab, cd)<<endl;
}
Gii thch: khai bo hm mu template function c dng to mt kiu
d liu khng tng minh. Vic xy dng hm add vi kiu d liu tr v l
kiu T v cc tham s ca n cng l{ kiu T. Do , h{m add n{y c th s
dng di dng tng qu|t, dng cng s, cng x}u quy nh l cng
s, ta c th quy nh ngay sau tn hm: tn_hm<kiu_d_liu>. Nh vy,
trong v d trn, i tng cout th nht in ra gi tr tng ca hai s nguyn
1 v{ 2. i tng cout th hai in ra gi tr ghp ni ca hai x}u ab v{ cd.
Tng t hm template, ta cng c khai b|o lp template.
template <class T>
T r a n g | 173
C++
Lp mu Template class
V d
#include <iostream>
using namespace std;
template <class T>
T r a n g | 174
Kt qu
real=1
image=2
real=3
image=4
4+I*6
C++
C++
int main () {
complex<int> c;
complex<int> d;
cin>>c>>d;
complex<int> x = c + d;
cout<<x;
return 0;
}
Gii thch: trong v d ny, khng c nhiu s khc bit so vi lp s phc
thng thng. Chng ta ch n thun b sung khai bo template<class T>
v{o bn trc khai bo lp v{ khai b|o phng thc c s dng kiu d
liu dng chung T. Ring i vi phng thc nhp xut d liu, cn lu :
ta khng th s dng kiu d liu thng thng l ostream& v istream&,
m{ thay v{o l{ basic_ostream<?, ?> v{ basic_istream<?,?>. }y cng l{
hai lp template vi hai i s. iu ny gii thch ti sao trc cc ton t
nhp/xut li b sung thm khai bo template<class T, class charT, class
traits>. Chng ta cng cn ch thm mt im, tt c cc t complex trong
v d trn c phn thnh hai nhm: nhm kiu d liu complex v nhm
T r a n g | 176
C++
- Tnh tha k (hay k tha - inheritance): l tnh cht cho php c|c i
tng tip nhn d liu t mt i tng khc m n tha k. Nh vo tnh
tha k, c|c i tng c th s dng c|c tnh nng ca i tng khc.
Tnh tha k chia lm hai loi: n tha k v{ a tha k. n tha k l
tnh cht ch cho php mt lp tha k t mt lp c s; cn tnh a tha
k cho php mt lp k tha t nhiu lp c s. C++ l ngn ng lp trnh
h tr a tha k.
T r a n g | 177
C++
Trang | 178
T kha using
T kha using c s dng a mt tn gi t namespace sang vng
khai bo hin ti. Khi s dng using namespace tn_namespace, chng ta
khng cn s dng tn_namespace khi gi n thc th ca n.
V d
Kt qu
#include <iostream>
5
using namespace std;
5
namespace first
{
int x = 5;
int y = 5;
}
namespace second
{
double x = 1.60;
double y = 3.14;
}
int main()
{
using namespace first;
cout<<x <<endl;
cout<<y<<endl;
return 0;
}
Trong trng hp ny, khi s dng namespace first, chng ta c th s
dng cc bin trong namespace ca n m khng cn gi n tn ca
namespace. Nhng cng lu rng, nu using c hai namespace th trong
trng hp ny, ta khng th truy cp n cc bin x v y theo cch ny (v
chng trng tn), m ch c th truy cp theo cch s dng ton t phm vi
::
Ta cng c th s dng t kha using nh sau
T r a n g | 179
Kt qu
5
3.14
C++
V d
#include <iostream>
using namespace std;
namespace first
{
int x = 5;
int y = 5;
Phm vi ca namespace
Mt namespace c khai bo s dng bng t kha using ch c tc dng
trong phm vi m{ n c khai b|o. iu c ngha l{ nu ta using
namespace tn_namespace, th n ch c tc dng trong khi lnh m ta
khai bo.
T r a n g | 180
Kt qu
5
5
1.6
3.14
C++
V d
#include <iostream>
using namespace std;
namespace first
{
int x = 5;
int y = 5;
}
namespace second
{
double x = 1.60;
double y = 3.14;
}
int main()
{
{
using namespace first;
cout<<x<<endl;
cout<<y<<endl;
}
{
}
return 0;
Namespace std
C++
T r a n g | 181
Mnh trycatch
Nu vit mt chng trnh c kh nng ny sinh ngoi l, chng ta cn t
n vo trong khi lnh ca t kha try, nu ngoi l ph|t sinh, h{nh ng
x l s c t trong khi lnh ca t kha catch.
V d
Kt qu
#include <iostream>
20
using namespace std;
int main()
{
int a;
try{
throw 20;
}catch(int e){
cout<<e;
}
return 0;
}
Gii thch: Trong chng trnh n{y, lnh throw ang c vt qua mt ngoi
l tng ng vi m 20, nhng ngoi l ny b nm bt bi cu lnh
trycatch. Do ngoi l pht sinh, nn lnh trong mnh catch c thc
thi.
Nu c nhiu ngoi l pht sinh, ta c th s dng cu trc a tng ca
mnh catch: try{}catch(){}catch(){}
Mnh throw
Khi khai bo mt hm, nu trong h{m c kh nng ph|t sinh ngoi l,
chng ta c th ch nh t kha throw cho n
type tn_hm(danh_sch_tham_s) throw (int)
Trang | 182
Kt qu
Co ngoai le !
C++
Kt qu
Chia cho 0
};
}
MyNumber(float, float);
float DivMe(void);
MyNumber::MyNumber(float x, float y)
{
this->x = x;
this->y = y;
}
int main()
{
MyNumber m(1, 0);
try
{
m.DivMe();
throw m;
}
catch(exception& e)
{
cout<<e.what();
}
T r a n g | 184
C++
float MyNumber::DivMe(void)
{
x/y;
}
C++
}
Gii thch: trong v d ny, lp khai bo c kh nng ph|t sinh ngoi l v
n thc hin php chia (ngoi l tng ng l{ chia cho 0). iu ny gii
thch v sao ta cn cho n tha k t lp exception. Mi khi gi tr nhp vo
cho bin thnh vin y l 0, th ngoi l Chia cho 0 s pht sinh. Khi ngoi l
pht sinh, ta s dng c ph|p try bao bc quanh vng lnh pht sinh ra
ngoi l (c th l m.DivMe()). Khi ngoi l pht sinh, mnh catch s thc
thi v in ra li tng ng vi hm thnh vin what tc l{ Chia cho 0.
T r a n g | 185
M file
m file trong chng trnh bng mt i tng stream, chng ta s
dng hm thnh vin open(tn_file, ch__m).
Trong ,
Trang | 186
Gii thch
ios::in
ios::out
ios::binary
M file c.
M file ghi.
M file ch nh ph}n (thng p dng cho cc
file m ha).
ios::ate
Thit lp v tr khi to ti v tr cui cng ca file.
Nu c hiu ny khng thit lp bt k gi tr no, v
tr khi to s t u file.
ios::app
Mi d liu c ghi ra file s tin hnh b sung vo
cui file (khng ghi ln file). C hiu ny ch c th
s dng trong tc v m file ghi.
ios::trunc
Nu mt file c m ghi ~ tn ti, n s ghi
ln ni dung c.
Cc c hiu ny c th c kt hp bng cch s dng ton t dch bit OR
(|). V d, ti mun m mt file nh phn example.bin ghi d liu v b
sung d liu cui file ny, ti c th vit nh sau
Lp
ch__m mc nh
ofstream
ios::out
ifstream
ios::in
fstream
ios::in|ios::out
Nu tham s c n nh mt gi tr c th, th tham s c s dng s
ghi ln tham s mc nh m khng phi l kt hp vi tham s mc
nh. V d, nu s dng ofstream m file vi tham s ch__m c
T r a n g | 187
C++
ofstream myfile;
myfile.open(example.bin, ios::out|ios::app|ios::binary);
Thnh vin open ca cc lp ofstream, ifstream v fstream c tham s
ch__m mc nh (trong trng hp tham s n{y khng c ch nh)
c a ra trong bng sau:
ng file
Khi chng ta hon tt cng vic vi mt file, chng ta cn thc hin thao tc
ng file li. Tc v ny l bt buc nu ta ~ ho{n tt cc tc v trn file.
Khi , ta ch n thun triu gi phng thc thnh vin close
myfile.close();
Nu phng thc hy ca i tng c triu gi, phng thc close s
t ng c gi theo.
File vn bn
i vi mt file vn bn, th c hiu ios::binary s khng bao gi c s
dng. Nhng file vn bn ch n thun cha vn bn. c ghi d liu
trn file ny ta s dng ton t xut nhp d liu (<< v >>).
Ghi d liu ln file vn bn
#include <iostream>
#include<fstream>
int main(){
ofstream myfile (example.txt);
if (myfile.is_open(){
myfile<<Dong 1 da ghi\n;
myfile<<Dong 2 da ghi\n;
myfile.close();
}
else cout<<Khong the ghi du lieu len file;
T r a n g | 188
C++
}
V d trn cho thy vic ghi d liu ln file vn bn nh vo ton t <<. V
d tip theo sau }y s minh ha cho vic c d liu t file vn bn bng
ton t >>.
c d liu t file vn bn
#include <iostream>
#include<fstream>
#include<string>
using namespace std;
int main(){
ifstream myfile (example.txt);
if (myfile.is_open(){
while(!myfile.eof()){
getline(myfile, line);
cout<<line<<endl;
}
myfile.close();
}
else cout<<Khong the ghi du lieu len file;
return 0;
}
Trong v d ny, chng ta c s dng hm thnh vin eof ca i tng
ifstream. Hm thnh vin ny c chc nng kim tra v tr c ~ l v tr
cui cng ca file hay cha, nu cha, d liu t file s tip tc c c.
Ngc li, n s dng vic c d liu.
Trng thi
bad()
fail()
eof()
T r a n g | 189
Gii thch
Nu tc v c/ghi file b li, n s tr v gi tr true;
ngc li, n s tr v gi tr false.
Tr v gi tr true trong trng hp nh bad(), nhng
nu gp li v nh dng, n cng tr v gi tr true (v
d c s t mt file vn bn).
Tr v gi tr true nu file ~ c c n v tr cui
C++
Prototype th hai:
seekg(v_tr, kiu);
T r a n g | 190
C++
V d
Kt qu
1.
#include <iostream>
Size=10 bytes
2.
#include <fstream>
3.
using namespace std;
4.
int main(){
5.
long begin, end;
6.
ifstream myfile(example.txt);
7.
begin = myfile.tellg();
8.
myfile.seekg(0, ios::end);
9.
end = myfile.tellg();
10.
myfile.close();
11.
cout<<Size=<<(end-begin)<< bytes;
12.
return 0;
13. }
Gii thch: trong chng trnh trn chng ta ang m mt file example.txt.
Chng ta m kch thc ca file ny. Khi m file, con tr get s t vo v
tr u file. Khi , dng lnh 7 s gn gi tr khi u cho bin begin (trong
trng hp ny s l 0). Dng lnh 8 s t con tr get vo v tr cui cng
ca file (v tr 0 k t cui file tnh ln). Dng lnh 9 s gn v tr hin ti v
tr cui file cho bin end. iu c ngha l{ gi| tr end-begin chnh l kch
T r a n g | 191
C++
Ta hy quan st v d sau }y
File nh phn
i vi file nh phn, vic c ghi d liu bng ton t tch trch >> v ton
t chn << cng nh h{m getline l{ khng c hiu lc, bi chng khng
c nh dng theo kiu vn bn nh i vi file vn bn trn (khng
dng phm space to khong cch, khng c k t xung dng).
Cc lung ca file gm hai h{m th{nh vin c v ghi d liu l read v
write. Hm thnh vin write l hm thnh vin ca lp ostream tha k cho
ofstream. V hm read l thnh vin ca lp istream tha k cho ifstream.
C|c i tng ca lp fstream c c hai hm thnh vin ny. Chng c
prototype nh sau:
write(khi_b_nh, kch_thc);
read(khi_b_nh, kch_thc);
V d
#include<iostream>
#include<fstream>
using namespace std;
ifstream::pos_type size;
char* memblock;
int main(){
ifstream file(example.bin, ios::in|ios::binary|ios::ate);
if(file.is_open()){
size = file.tellg();
memblock = new char[size];
file.seekg(0, ios::beg);
file.read(memblock, size);
file.close();
cout<<Hoan tat !;
//Lm vic vi d liu trong con tr memblock
T r a n g | 192
C++
}
else cout<<Khong mo duoc file.;
return 0;
}
Gii thch: trong chng trnh, ta m file example.bin. Ch m file
c (ios::in), theo kiu file nh phn (ios::binary), t con tr get vo cui
file (ios::ate). Sau khi m file, hm file.tellg() s cho bit kch thc thc
ca file. Sau h{m file.seekg s t v tr con tr get v{o u file (v tr 0 k
t v tr u tin) v tin h{nh c theo khi b nh nh vo file.read. Sau
khi hon tt, phng thc close c triu gi kt thc vic c file. Khi
, d liu t file ~ c vo mng memblock. Chng ta c th b sung tc
v thao tc vi d liu nu mun. Cui cng, con tr memblock s b xa
gii phng b nh.
Khi thc thi cc tc v c/ghi d liu vi file, chng ta thc thi nh trn
nhng thng qua mt b m c kiu d liu streambuf. B m ny l mt
khi b nh ng vai tr trung gian gia cc lung v file vt l. V d, vi
ofstream, mi thi im h{m put c gi, k t khng ghi trc tip ln file
m n s c ghi ln b m. Khi b m y, mi d liu cha trong
s c ghi ln file (nu l{ lung ghi d liu) hay xa b lm rnh b
nh (nu l lung c d liu). Tin trnh n{y c gi l{ ng b ha v
c cc tnh hung sau }y:
- Khi file ~ ng: trc khi ng mt file, tt c d liu trong b nh nu
cha y vn c ng b v chun b c/ghi ln file.
- Khi b nh y: b m c kch thc gii hn. Khi n y, n s t ng
ng b ha.
- B iu phi: khi cc b iu phi c s dng trn lung, mt tin trnh
ng b dt im s c din ra. Nhng b iu phi ny bao gm: flush
v endl.
- Hm thnh vin sync(): nu hm thnh vin sync() c triu gi, tin
trnh ng b ha s din ra. Hm ny tr v mt kiu integer (int) tng
ng vi -1, nu lung khng c b m lin kt hoc trong trng hp
c/ghi tht bi. Ngc li, n s tr v gi tr 0.
T r a n g | 193
C++
B m v ng b ha
Mc truy cp
private
Chc nng
Phn thc v phn o.
public
real()
public
operator=
operator+=
operator-=
operator*=
operator/=
public
_Add(complex)
_Sub(complex)
_Mul(complex)
_Div(complex)
protected
Trang | 194
public
Tn phng thc
operator +
operator
operator *
operator /
operator =
operator ==
operator !=
operator >>
operator <<
real(complex)
imag(complex)
abs(complex)
norm(complex)
conj(complex)
polar(float, float)
cos(complex)
sin(complex)
tan(complex)
cosh(complex)
sinh(complex)
tanh(complex)
exp(complex)
sqrt(complex)
log(complex)
log10(complex)
pow(complex, <T>)
T r a n g | 195
Chc nng
Ton t cng hai s phc.
Ton t tr hai s phc.
Ton t nhn hai s phc.
Ton t chia hai s phc.
Ton t gn s phc.
Ton t so snh bng.
Ton t so snh khc.
Ton t nhp s phc.
Ton t xut s phc.
Tr v phn thc ca s phc.
Tr v phn o ca s phc.
Tr v gi tr modul ca s phc. Modul ca s
phc c tnh theo cng thc
.
Tr v gi tr l chun ca s phc. Chun ca s
phc l{ bnh phng gi| tr ca modul, tc l
.
Tr v s phc lin hp. S phc lin hp ca s
phc a nhn c bng cch thay phn o ca a
bng a.
Tr v mt s phc trong h ta Decac. Hai
tham s truyn v{o tng ng vi modul v
argument ca s phc.
(
)
{
(
)
Tr v gi tr cosin ca s phc.
Tr v gi tr sin ca s phc.
Tr v gi tr tan ca s phc.
Tr v gi tr cosin hyperbol ca s phc.
Tr v gi tr sinh hyperbol ca s phc.
Tr v gi tr tan hyperbol ca s phc.
Tr v gi tr e ly tha ca s phc.
Tr v gi tr cn bc hai ca s phc.
Tr v gi tr logarith c s t nhin (logarith
nepe) ca s phc.
Tr v gi tr logarith c s 10 ca s phc.
Tr v ly tha ca s phc. Tham s th hai c
th l s phc, s thc, s nguyn.
C++
2. Lp ngn xp stack
Lp stack cng l{ mt lp template. N lm vic theo nguyn tc hng i
v{o trc ra sau. Lp stack cung cp c|c phng thc lm vic theo
nguyn tc Lifo nh trong hc phn cu trc d liu v gii thut.
Khai bo mt i tng thuc lp stack:
stack<int> s;
Tn phng thc
stack<?>c;
stack<?,deque, allocator>
Mc truy cp
public
empty()
public
size()
public
top()
public
push()
public
pop()
public
T r a n g | 196
Chc nng
Hm to. i vi hm to th
hai, ta cn s dng c|c i
tng deque v{ allocator. }y
cng l{ c|c lp template.
Phng thc hng. Tr v
kiu bool. Nhn gi tr true
nu stack rng v{ ngc li
stack khng rng th nhn gi
tr false.
Phng thc hng. Tr v
kiu s nguyn l{ kch thc
ca stack (tc s phn t ca
stack).
C hai phng thc top c
qu ti: hng v khng hng.
N tr v phn t nm nh
ca stack (tc phn t c
a v{o sau cng).
B sung mt phn t mi vo
trong stack.
Ly ra mt phn t trong
stack. Phng thc ny khng
tr v gi tr ca phn t va
c ly ra.
C++
3. Lp hng i queue
Queue l mt lp template. s dng queue, ta cn khai b|o th vin
queue tng ng. Queue lm vic theo nguyn tc Fifo tc v{o trc th
ra trc. Sau }y l{ v d v vic to mt i tng queue:
queue<int> q;
Tn phng thc
Mc truy cp Chc nng
queue<?>
public
Hm to. i vi hm to th
queue<?, deque, allocator>
hai, ta cn s dng c|c i
tng deque v{ allocator. }y
cng l{ c|c lp template.
empty()
public
Phng thc hng. Tr v
kiu bool. Nhn gi tr true
nu queue rng v{ ngc li
queue khng rng th nhn gi
tr false.
size()
public
Phng thc hng. Tr v
kiu s nguyn l{ kch thc
ca queue (tc s phn t ca
queue).
front()
public
C hai phng thc front
c qu ti: hng v khng
hng. N tr v phn t nm
u ra (tc phn t c a
vo u tin).
back()
public
C hai phng thc front
c qu ti: hng v khng
hng. N tr v phn t nm
u vo (tc phn t c
a v{o sau cng).
push()
public
B sung mt phn t mi vo
trong queue. Phn t c
a v{o theo hng back.
pop()
public
Ly ra mt phn t trong
queue. Phng thc ny
khng tr v gi tr ca phn
T r a n g | 197
C++
3. Lp vector
Cn lu rng, lp vector c cu trc tng i ging vi mng. Vector
khng phi l mt lp i tng nh trong hnh hc. Cc phn t ca
vector c sp xp lin tc trong b nh. Chng ta khng th ri rc ha
cc phn t (khi b sung cc phn t, cn b sung mt cch lin tc; nu
khng s b li cp pht b nh). Chng ta c th truy cp n cc phn t
ca vector thng qua ch s hoc iterator.
Kt qu
Theo chi so:
10
20
22
Theo con tro iterator:
10
20
22
int main()
{
vector<int> v;
v.push_back(10);
v.push_back(20);
v.push_back(22);
//=====Cch 1=====
cout<<"Theo chi so:"<<endl;
for (unsigned i=0; i<v.size(); i++)
cout<<v[i]<<endl;
//=====Cch 2=====
cout<<"Theo con tro iterator:"<<endl;
vector<int>::iterator it;
for (it=v.begin(); it<v.end();++it)
cout<<*it<<endl;
return 0;
}
Theo cch 1, chng ta truy cp n cc phn t ca vector theo cch truy
cp nh i vi mng; cch th hai cho php ta truy cp thng qua con tr
iterator. Sau }y, chng ta s tham kho c|c phng thc thnh vin ca
lp vector.
T r a n g | 198
C++
Chng trnh
#include <iostream>
#include <vector>
Tn phng thc
vector<?>
vector<?, allocator>
~vector()
operator =
begin()
end()
public
rbegin()
public
rend()
public
size()
max_size()
public
public
resize(int)
resize(int, ?)
public
capacity()
public
empty()
public
reserve(int)
public
operator[int]
public
at(int)
public
T r a n g | 199
public
public
public
Hm hy.
Ton t gn.
Tr v iterator tng ng vi
iterator u tin ca vector.
Tr v iterator tng ng vi
iterator cui ca vector.
Tr v iterator nghch o ca
iterator u tin ca vector.
Tr v iterator nghch o ca
iterator cui ca vector.
Tr v kch thc ca vector.
Tr v kch thc cc i ca
vector.
Thay i kch thc ca vector.
N c hai chng cht hm, tham
s int th nht tng ng vi
kch thc mi ca vector; tham
s template th hai tng ng
vi gi tr c b sung mc
nh.
Tr v kch thc b nh ~ cp
pht cho cc phn t ca vector.
Cn lu , c ch cp pht ny
trong C++ l t ng v lun
m bo size()<=capacity().
Tr v gi tr true nu vector
rng v{ ngc li.
Thay i kch thc cho vng
b nh lu tr cc phn t ~
khi to ca vector. Tham s
ca h{m tng ng vi gi tr
tr v ca phng thc
capacity.
Tr v phn t tng ng vi v
tr c ch nh (nh i vi
mng).
Tham chiu n phn t tng
ng vi ch s c ch nh.
Phng thc n{y tng t nh
C++
front()
public
back()
public
assign(iterator, iterator)
assign(int, ?)
push_back(?)
public
pop_back()
public
public
iterator(iterator, ?)
public
insert(iterator, ?)
insert(iterator, int , ?)
insert(iterator, iterator,
iterator)
erase(iterator)
erase(iterator, iterator)
public
swap(vector&)
clear()
public
public
get_allocator()
public
ton t [] trn.
Tr v phn t u tin (khng
phi l{ iterator nh begin).
Tr v phn t cui cng (khng
phi l{ iterator nh end).
Khi gn gi tr cho vector.
B sung mt phn t vo cui
vector.
Loi b phn t pha cui ca
vector.
Phng thc th nht tr v
iterator, ba phng thc cn li
tr v void. Vector s c ni
rng bng cch b sung thm
cc phn t mi. Phng thc
u tin tr v iterator cui
cng ca vector sau khi ni rng
kch thc ca n.
Xa b cc phn t ca vector.
Phng thc u xa mt phn
t, phng thc hai xa cc
phn t trong vng gia hai
tham s c ch nh. Sau khi
xa b, n tr v iterator ca
phn t cui.
Ho|n i gi tr ca hai vector.
Xa b hon ton cc phn t
ca vector. Sau khi xa b, kch
thc ca n l 0.
Tr v s lng c|c i tng
c cp pht b nh s dng
khi kh to vector.
4. Lp string
Tn phng thc
string()
string(const string&)
T r a n g | 200
C++
T r a n g | 201
public
public
public
public
public
public
Tr v di ca xu.
Cng dn xu.
B sung xu hoc mt phn
ca x}u v{o x}u c. Cc
tham s n{y tng t nh
trong phng thc khi
to.
B sung mt k t vo xu.
Xem lp vector.
Chn xu con vo xu. Cc
phng thc s dng tham
s iterator hon ton
tng t nh trng hp
lp vector. Phng thc 1
s chn xu con vo xu
ban u ti v tr int.
Phng thc hai tng t,
nhng x}u con ch ly t
tham s int th 2 vi
di l tham s int th 3.
Phng thc 3 tng t
phng thc 1. Phng
thc 4 s chn k t char
vo v tr tham s int th
nht vi s ln l tham s
public
public
public
C++
replace
public
c_str
public
data
get_allocator
copy(char*, int, int=0)
find(const string&, int=0)
find(const char*, int, int)
find(const char*, int=0)
find(char, int=0)
find_fist_of
find_last_of
find_fist_not_of
find_last_not_of
substr(int, int)
public
public
public
public
compare
public
public
public
int th 2.
Thay th mt phn ca xu
theo cc tham s tng t
nh phng thc khi to.
Chuyn sang xu dng C
tng ng.
Tr v mng cc k t.
Xem lp vector.
Sao chp xu.
Tm kim xu con trong
mt xu.
Tm kim xu u tin,
cui cng, khng phi l
u tin, khng phi l cui
cng.
Tr v xu con t v tr int
th nht vi di int th
hai.
So snh hai xu. Nhn gi
tr 0, nu hai xu bng
nhau v{ ngc li.
Cc hm ton cc.
Tn phng thc
operator+
Chc nng
Cng hai xu.
swap(string&, string&)
operator==
operator!=
operator<
operator>
operator>=
operator<=
getline
operator<<
operator>>
C++
Nhp xu.
Chn xu v chuyn ha thnh lung stream.
T r a n g | 202
5. Lp list
Tn phng thc
list<?>(allocator)
list<?>(int, ?, allocator)
list<?>(list)
~list()
begin, end, rbegin, rend
empty, size, max_size, resize
front,
back,
push_front,
push_back,
pop_front,
pop_back, insert, erase, swap,
clear.
splice(iterator, list)
remove(const T&)
public
remove_if
public
unique
merge
sort
reverse
public
public
public
public
get_allocator
public
public
public
public
public
Hm hy.
Xem lp vector.
Xem lp vector.
Xem lp vector.
public
Chuyn cc phn t t
danh sch list sang danh
sch cha t v tr c ch
nh.
Xa cc phn t c gi tr
c ch nh.
Xa phn t v dn danh
sch li.
Xa cc phn t trng lp.
Nhp hai danh sch li.
Sp xp danh sch.
o ngc th t cc phn
t trong danh sch.
Xem lp vector.
6. Lp map
Tn phng thc
map<?,?>
~map()
begin, end, rbegin, rend
empty, size, max_size, resize
insert, erase, swap, clear.
operator[]
public
public
public
public
public
T r a n g | 203
Hm hy.
Xem lp vector.
Xem lp vector.
Xem lp vector.
Xem lp vector.
C++
public
public
find
public
count
lower_bound
upper_bound
equal_range
get_allocator
public
Tr v key ca i tng.
Tr v gi tr ca i
tng.
Tr v ch s dng iterator
ca kha tm kim.
m s i tng c kha
ch nh.
Tr v iterator ca bin
di.
Tr v iterator ca bin
trn.
Tr v cp cn trn v cn
di.
Xem lp vector.
7. Lp set
Set l mt dng cu trc d liu m mi phn t ca n l mt kha (ngha
l khng cho php cha cc phn t trng lp). C|c phng thc ca set
ho{n to{n tng t nh ca map. Set cng l{ mt lp template.
T r a n g | 204
C++
C++
Cc i tng chun
Lp ios_base
Lp ios
Lp istream
Lp ostream
Lp ifstream
T r a n g | 206
C++
Lp ofstream
Lp fstream
Lp istringstream
Lp ostringstream
Lp streambuf
Lp filebuf
Lp stringbuf
2) Cc i tng
i tng cin
Xem chng Nhp xut c bn. C|c phng thc v thuc tnh khc
xem thm lp istream.
i tng cout
Xem chng Nhp xut c bn. C|c phng thc v thuc tnh ca lp
khc xem thm lp ostream.
i tng cerr
Thuc lp ostream c s dng in lung li c bn. Mc nh, hu
ht h thng u c mt chun li c bn in ra mn hnh. Bi v cerr l
mt i tng ca lp ostream, chng ta c th vit cc k t theo d liu
c nh dng nh vo ton t chn << hoc khng nh dng d liu
nu s dng hm thnh vin write.
int main()
{
int num;
std::cin>>num;
if (std::cin.good())
{
std::cout<<"Good !";
}else
{
std::cerr<<"Error";
//Hoc std::cerr.write("Error",
sizeof(std::streamsize));
T r a n g | 207
C++
#include <iostream>
}
Nu s nguyn nhp v{o ng nh dng th s thc hin chc nng in ra
Good, ngc li s in ra Error.
i tng clog
Tng t nh cerr, clog dng biu din lung ng nhp chun.
3) Cc kiu d liu
Kiu fpos: x|c nh v tr trong lung. V bn cht n l mt lp
template. N c hai th{nh vin getter v{ setter tng ng l: state() v
state(stateT).
Kiu streamoff: x|c nh v tr ca offset trong lung. Ta hon ton c
th chuyn i n thnh streamsize, fpos hoc streampos.
Kiu streampos: tng t vi fpos.
Kiu streamsize: biu din kch thc lung.
4) Cc thao tc thc hin
boolalpha: thng s dng kt hp vi ton t nhp >> hoc xut <<.
Nu tham s l boolalpha th tham s bool l{ 1 v{ 0 tng ng s c
hiu l true v false.
#include <iostream>
int main()
{
bool num;
std::cin>>std::boolalpha>>num;
std::cout<<num;
return 0;
}
true
true
#include <iostream>
int main()
T r a n g | 208
true
true
C++
}
endl: chn du xung dng. Tng t nh \n.
ends: chn k t trng \0.
fixed: p dng cho nh dng s thc c du chm. Khi
cout.precision(int) c triu gi, th s ch s thp phn (tham s
int) s c p dng nu chun xut d liu c s dng fixed (khc vi
none - s p dng theo mc nh v khng ph thuc vo vic triu gi
phng thc trn).
#include <iostream>
3.14 1
//Khng bt
fixed
int main()
{
float a = 3.141516f, b = 1.00f;
3.142 1.000
std::cout.precision(3);
//Bt fixed
std::cout<<a<<"\t"<<b<<std::endl;
std::cout<<std::fixed<<a<<"\t"<<b;
return 0;
}
flush: ng b ha b m vi con tr lung. iu n{y c ngha l{ tt c
cc k t cha c ghi trong b m s c ghi ra lin tc.
#include <fstream>
using namespace std;
int main () {
ofstream outfile
("test.txt");
for (int n=0; n<100; n++)
outfile << n << flush;
return 0;
T r a n g | 209
C++
outfile.close();
C++
cout<<hex<<15;
C++
T r a n g | 211
BI THC HNH S 2
Xy dng Lp v Lm vic vi i Tng
1. Xy dng lp HangHoa gm c c|c phng thc v thuc tnh sau:
Tn gi
Mc truy cp
Loi
Gii thch
tenHang
private
Tn mt hng
ngaySanXuat
private
Ngy sn xut
Thuc
tnh
donGia
private
n gi|
soLuong
private
S lng
SetTenHang
public
Thit lp tn hng
GetTenHang
public
Tip nhn tn hng
SetNgaySanXuat
public
Thit lp ngy sn xut
GetNgaySanXuat
public
Tip nhn ngy sn xut
Phng
SetDonGia
public
Thit lp n gi|
thc
GetDonGia
public
Tip nhn n gi|
SetSoLuong
public
Thit lp s lng
GetSoLuong
public
Tip nhn s lng
TinhTien
public
Tnh tin
C|c phng thc trn bao gm setter v{ getter. Phng thc TinhTien l
phng thc dng tnh s tin m khch hng mua. Tnh tin s bng
donGia*soLuong.
Tn gi
Mc truy cp
Loi
Gii thch
username
private
Thuc Tn ti khon ngi dng
tnh
password
private
Mt khu ngi dng
SetUsername public
Lp ti khon ngi dng
GetUsername public
Tip nhn ti khon ngi dng
Phng
SetPassword public
Lp mt khu ngi dng
thc
GetPassword public
Tip nhn mt khu ngi dng
MuaHang
public
Mua hng
C|c phng thc setter v getter ho{n to{n tng t nh trn. Phng
thc MuaHang s triu gi c|c phng thc thit lp tn hng, ngy sn
xut, v tnh tin ca i tng HangHoa trn. Phng thc mua hng
T r a n g | 213
C++
BI THC HNH S 3
Hm to, sao chp hm to, hm bn, con tr this
Lu : trong bi thc hnh chng ny, ch cho php s dng con tr i
tng thc hin. Mi phng n s dng khai bo i tng thng
thng s khng c chp nhn !
1. Quay tr li vi bi thc hnh s 2. Hy to chng trnh bng cch thay
th c|c phng thc setter bng cc hm to tng ng. Hy s dng con
tr this trong trng hp ny. B sung phng thc ResetHangHoa cho
lp HangHoa a v cc tham s mc nh cho cc thuc tnh (xu k t
th thit lp v , s nguyn/thc th thit lp v 0). B sung phng thc
HuyBo cho i tng KhachHang hy b vic mua h{ng. Trong chng
trnh chnh, hy to con tr i tng thc hin h{nh ng mua hng v
h{nh ng hy b.
T r a n g | 214
C++
BI THC HNH S 4
Chng cht Ton t trong C++
Xy dng 2 lp s phc v lp phn s. S dng chng cht ton t thc
hin cc thao tc tnh ton sau:
- Lp s phc: phng thc khi to (hoc phng thc setter), phng
thc sao chp hm to, phng thc + (cng hai s phc), - (tr hai s
phc), * (nhn hai s phc), / (chia hai s phc) v{ phng thc tnh
modul v argument ca s phc. Xy dng hm chng cht ton t
nhp/xut d liu vi lp s phc ny.
- Lp phn s: phng thc khi to, phng thc sao chp hm to,
phng thc + (cng hai phn s), phng thc (tr hai phn s),
phng thc * (nhn hai phn s), phng thc / (chia hai phn s). Xy
dng hm chng cht ton t nhp/xut d liu vi lp phn s ny.
BI THC HNH S 5
K thut tha k trong C++
Xy dng lp HinhKhoi, cha thuc tnh chiu cao (chieucao). Xy dng
hm to tng ng v{ phng thc sao chp hm to.
Xy dng lp HinhKhoi1 tha k t lp HinhKhoi. B sung thm thuc tnh
chiu di (chieudai). B sung hm to v{ phng thc sao chp hm to.
Xy dng tip hm tnh th tch cho HinhKhoi1 (bng chieucao*chieudai2).
Xy dng lp lp HinhKhoi2 tha k t lp HinhKhoi1. B sung thm thuc
tnh chiu rng (chieurong). B sung hm to v{ phng thc sao chp
hm to. Qu ti hm tnh th tch cho HinhKhoi2 (bng
chieucao*chieudai*chieurong).
C++
T r a n g | 215
BI THC HNH S 6
Lp c s tru tng trong C++
Xy dng mt lp c s tru tng Vector cha ba phng thc o thun
ty: TinhDoDai (tnh di), SinGoc (tnh sin ca gc gia hai Vector),
TrucGiao (tm vector trc giao tc vector vung gc vi vector trn), hai
thuc tnh thnh vin l ta x v{ y, hai phng thc setter (khng s
dng hm to trong trng hp ny, v lp tru tng khng c kh nng
to ra mt s th hin, v hm to cng khng c tha k); hoc s dng
phng thc tham chiu getter.
Xy dng lp Vector2D tha k t lp c s tru tng Vector thc thi
c|c phng thc o thun ty nu trn.
Xy dng lp Vector3D tha k t lp c s tru tng Vector (b sung
thm ta z v{ c|c phng thc getter, setter tng ng) thc thi cc
phng thc o thun ty nu trn.
Trong , Vector2D l{ vector 2 chiu (ch c hai ta x v y); Vector3D l
vector 3 chiu (c ba ta x, y v z).
THANG IM NH GI K NNG
Bi thc hnh s
1
2
3
4
im
20
15
20
15
Ngng t
60-70
Cng im
70-80
80-90
Quy i
+1
+1.5
5
20
6
10
90-100
+2
T r a n g | 216
C++
C++
T r a n g | 217
Phn Bi tp
BI TP NNG CAO
Bi tp 1.
Xy dng c|c h{m tnh cc tng sau }y:
)
(
Phn Bi tp
, s thay th ton b dy k t ging nhau ny bng s k t m c
sau l{ k t tng ng. V d:
Xu ban u: aaaabbbbcdddAA
Xu sau khi nn: 4a4b1c3d2A
+ Hy xy dng h{m RLE nn d liu. Vi d liu nhp vo t bn phm.
+ Hy xy dng h{m IRLE gii nn d liu. Vi d liu nhp vo t bn
phm.
Bi tp 3.
Xy dng cc hm thc hin cc chc nng sau }y trn mng mt chiu
bng hai cch: khai bo theo kiu thng thng v khai bo bng con tr.
- Hm nhp d liu cho mng 1 chiu.
- Hm xut d liu cho mng 1 chiu.
- Hm tnh tng cc phn t ca mng.
- Hm tnh tng cc phn t ca mng l s nguyn t.
- Hm tnh tng cc phn t ca mng l s chnh phng.
- Hm tnh tng cc s nguyn t ca mng ln hn 10 v{ nh hn 100.
- Hm tnh tng cc phn t ca mng l s chnh phng chn.
- Hm m s phn t ca mng l s nguyn t.
- Hm m s phn t ca mng l s chnh phng.
- Hm m s phn t ca mng l s nguyn t ln hn 10 v{ nh hn 50.
- Hm m s phn t ca mng l s chnh phng chn.
- Hm tm kim ch s phn t c gi tr x ca mng.
- Hm tm ch s ca phn t c gi tr nh nht.
- Hm tm ch s ca phn t c gi tr ln nht.
T r a n g | 219
C++
Phn Bi tp
- Hm sp xp mng theo th t tng dn (c th s dng thut ton sp
xp bt k).
- Hm tnh gi tr trung bnh ca cc phn t ca mng c gi tr chn.
- Hm dn tt c cc phn t chn v mt pha, cc phn t l v mt pha.
V d, mng ban u l: 1 4 5 6 2 3 th kt qu s l 1 5 3 4 6 2.
- H{m x|c nh phn t c gi tr gn vi gi tr trung bnh ca mng nht.
- H{m y cc phn t ca mng ln n v tr. V d mng ban u l 1 3 2 5 4
7 9. Nu n = 2, th mng thu c s l 7 9 1 3 2 5 4.
B sung hm main v{ c|c th vin nhn c mt chng trnh hon
chnh. Cc hm cn c khai bo theo prototype.
Bi tp 4.
Xy dng c|c h{m thc hin cc chc nng sau }y trn mng hai chiu
bng hai cch khai bo: theo kiu thng thng v khai bo bng con tr.
- Hm nhp gi tr cho mng hai chiu.
- Hm xut gi tr ca mng hai chiu theo dng ma trn.
- Hm cng hai ma trn.
- Hm nhn hai ma trn.
- Hm thay th tt c cc phn t c gi tr l ca ma trn thnh 0.
- Hm thay th tt c cc phn t m ca ma trn bng phn t dng
tng ng.
- Hm thay th cc phn t c gi tr nh hn gi| tr trung bnh ca ma trn
bng phn t 0.
T r a n g | 220
C++
Phn Bi tp
Hy chn la c|c phng ph|p ph hp trong lp trnh hng i tng
lp trnh gii c|c b{i to|n sau }y.
a) Xy dng lp TamGiac (tam gic) gm c ba cnh vi c|c phng thc
sau:
- Cc phng thc khi to cho tam gic: khng tham s, c tham s v sao
chp hm to.
- Cc phng thc Getter.
- Phng thc KiemTra cho bit n c phi l mt tam gic thc s
khng.
- Phng thc tnh din tch tam gic nu n l mt tam gic thc s.
- Cc phng thc nhp/xut cho tam gic. Xy dng theo ton t.
b) Xy dng lp Diem (im) gm c 3 ta x, y, z v{ c|c phng thc
sau:
- C|c phng thc khi to.
- C|c phng thc Getter.
- Phng thc tnh khong cch gia hai im.
Xy dng lp Vector gm c hai thuc tnh tng ng vi hai i tng
Diem (im u v{ im mt). Hy b sung c|c phng thc sau cho lp
Vector:
- C|c phng thc khi to.
- C|c phng thc Getter.
- Phng thc tnh di ca vector.
- Phng thc cng hai vector. Xy dng theo ton t.
T r a n g | 221
C++
Phn Bi tp
Xy dng lp HinhCau (hnh cu) gm hai thuc tnh l{ i tng Diem
tng ng vi tm hnh cu v bn knh R. Hy b sung c|c phng thc
sau cho lp HinhCau:
- C|c phng thc khi to.
- C|c phng thc Getter.
- Phng thc tnh din tch hnh cu.
- Phng thc x|c nh v tr tng i gia hnh cu v mt im.
- Phng thc x|c nh v tr tng i gia hai hnh cu.
Yu cu chung: hy b sung cc hm ton t nhp xut cho mi lp i
tng trn.
Bi 6.
Xy dng lp ConNguoi gm c hai thuc tnh thnh vin l: tn v tui. Cc
phng thc khi to v{ c|c phng thc Getter tng ng.
Lp NhanVien tha k t lp ConNguoi, bng cch b sung thm hai thuc
tnh l{: m~ nh}n vin, lng v{ mc ng gp (tnh theo lng). B sung
phng thc khi to v{ c|c phng thc Getter.
Cc cng ty qun l nhn vin ca mnh. i tng CongTy c cc thuc
tnh: tn cng ty, mc ng gp chun, ngn sch hin c, ngun thu theo
thng, ngun chi theo thng. Gi s ngun chi ny khng bao gm chi ph
tr lng cho nh}n vin. i tng CongTy c phng thc tuyn dng
tuyn thm nh}n vin, v{ phng thc sa thi sa thi nhn vin.
Mt nhn vin s b sa thi, nu mc ng gp ca h nh hn mc ng
gp chun ca cng ty.
Bi 7.
Hy xy dng chng trnh ng dng theo m t sau.
T r a n g | 222
C++
Mt cng ty s tuyn b ph sn nu vn iu l ca h b m. Vn iu l l
tng ngn sch hin c cng vi mc ng gp ca mi nhn vin tr cho
ngun chi theo thng v tr tip cho tng lng chi tr cho ton b nhn
vin. Hy xy dng chng trnh thc thi m t ny.
Phn Bi tp
- Lp i tng ngi dng gm cc thuc tnh: username, password, cu
hi bo mt v cu tr li. B sung c|c phng thc tng ng cho ph
hp. Khi chy chng trnh, ngi dng nhp vo username v password.
Nu trng khp vi username v password ~ to trong h thng th thng
b|o ng nhp thnh cng.
- Sau khi ng nhp th{nh cng, ngi dng c quyn triu gi c|c phng
thc tnh ton ca lp s phc v phn s (cn xy dng thm hai lp ny).
- Nu ngi dng ng nhp khng thnh cng, yu cu h xc minh rng
c phi h ~ qun mt khu hay khng bng mt cu hi bo mt. Nu tr
li ng, th cho php h thay i mt khu.
- Nu ng nhp khng thnh cng v tr li sai cu hi bo mt, hy in ra
thng b|o Bn cha phi l thnh vin, h~y chn y ng k v{ chn
n thot.
Bi 8.
Mi i tng Shape trong Microsoft Word u c c cc thuc tnh: mu
vin, mu nn, ni dung vn bn bn trong, th bc, tnh trng ang c
chn hay khng v{ c|c phng thc khi to, thay i gi tr cho mi thuc
tnh (phng thc setter).
Hy to ra mt mng 10 phn t Shape. Cc gi tr th bc khng c
trng nhau (v phn b t 0-9). Trong 10 i tng ny, ti mi thi im,
ch c ng mt i tng ang tnh trng chn. Nu i tng tnh
trng chn, th ta mi c quyn thay i gi tr cho n.
Hy b sung thm c|c phng thc cn thit thc hin cc yu cu trn.
Bi 9.
C++
Hy phn tch m hnh qun l sinh vin trong trng i hc. T m hnh
ph}n tch c, hy xy dng chng trnh qun l sinh vin. Trong m
hnh ny, yu cu qun l khng di 10 lp i tng.
Phn Bi tp
H~y ph}n tch theo hng i tng m hnh qun l Nh{ nc thu nh
c cho bn di }y. T m hnh ph}n tch , h~y x}y dng chng
trnh qun l Nh{ nc thu nh. Bit rng, tng t|c gia c|c i tng
c tnh bc cu.
B GD
S GD
B Y t
S Y t
B Cng Thng
B Quc Phng
B Nng Nghip
K tha
C s
Tng t|c
C++
T r a n g | 224
Phn Bi tp
BI TP LN
D n 1. Phn tch, thit k v xy dng chng trnh qun l th vin.
Trong chng trnh n{y, cn m bo cc chc nng sau }y:
- Trong m hnh qun l ny cn m bo cc thng tin: m sch, tn sch,
tn tc gi, nm xut bn, nh xut bn, s trang, gi v s lng.
- Cho php b sung thm mt hoc nhiu quyn sch.
- Cp nhp li s lng s|ch khi c ngi mn/tr sch.
- Tm kim sch theo tn tc gi hoc tn sch.
- Kim tra tnh trng sch cn hay khng.
- Chng trnh thc thi trn mn hnh Console. C menu ty chn. D liu
c lu tr vo tp tin data.dat di dng m ha nh phn.
C++
- Chng trnh thc thi trn mn hnh Console. C menu ty chn. D liu
c lu tr vo tp tin data.dat di dng m ha nh phn.
Phn Bi tp
- Trong m hnh qun l ny, cn m bo cc thng tin: m nhn vin, h
tn nh}n vin, ng{y th|ng nm sinh, h s lng, nm bt u cng tc, tnh
trng hn nhn, b phn lm vic.
- Tm kim nhn vin theo h tn.
- Thng k s lng nhn vin theo b phn lm vic
- B sung (tuyn dng) hoc xa b (kt thc hp ng).
- Chng trnh thc thi trn mn hnh Console. C menu ty chn. D liu
c lu tr vo tp tin data.dat di dng m ha nh phn.
T r a n g | 226
C++
Phn Bi tp
C++
T r a n g | 227
Trang | 228
TRA CU T KHA
MT S THUT NG ANH-VIT C S DNG TRONG GIO TRNH
Dch sang ting Vit
Lp c s tru tng
Tnh tru tng
Ton t s hc
Ton t gn
Lp c s/ Lp cha
Ton t dch bit
Lp con
Lp
Ton t phn tch
Ton t gn hp nht
Ton t iu kin
Tnh ng gi
Ngoi l
Ton t chuyn i kiu d liu
Ton t tng gim
Che du/n du thng tin
Tnh tha k/ Tnh k tha
S th hin
Ton t logic
Tnh a tha kt/Tnh a k tha
i tng
Ton t
Chng cht ton t
Chng cht
Qu ti
Tnh a hnh
Nguyn mu
Hm o thun ty
Tham chiu
Ton t quan h v so snh
C++
T r a n g | 229
C++
[1]. http://publib.boulder.ibm.com/infocenter/comphelp/v8v101/index.
jsp // Mc: XL C/C++ V8.0 for AIX // Language Reference
[2]. http://msdn.microsoft.com/enus/library/3bstk3k5%28v=VS.80%29.aspx
[3]. Ivor Horton// Beginning Visual C++ 2010// Wrox pub.
[4]. C++ for Mathematicians// An introduction for Student and
Professional//Edward Scheinerman//Chapman & Hall/CRC.
T r a n g | 230