Professional Documents
Culture Documents
C++ Tep, Struc, Canban PDF
C++ Tep, Struc, Canban PDF
H HC CM M
L PH HIU
Bin son
< <
= +
n z y x
z y x
2 2 2
6) Cho trc s t nhin n (vi 1500 < n < 2000). Vit
chng trnh cho hin ra mn hnh cc cch phn tch s n
thnh dng tng lp phng ca 2 s t nhin x, y nh sau:
n = x
3
+y
3
.
7) S hon thin (perfect number) l s t nhin c tng cc
c s (k c 1) bng chnh n. VD: s t nhin 28 l s
hon thin. Vit chng trnh hin th ra mn hnh tt c
cc s hon thin < 1000.
8) Vit chng trnh tm s t nhin b nht c t nht 2 cch
biu din n thnh tng ca 4 s chnh phng i mt
khc nhau. V d, 78=9+16+9+4=36+25+16+1
9) Vit chng trnh nhp vo s n > 0. Sau tnh cc biu
thc tng gm n s hng nh sau:
S1 = 1 + 2 + 3 + . . .
S2 = 1 2 + 3 4 + . . .
S3 = 1 + 3 + 5 + 7 + . . .
S4 = 1 + 2 + 4 + . . .
S5 = 1! + 2! + 3! + . . .
95
10) Cho s t nhin n. Hy tnh:
2
n
n!
+
2 2 2
1
1
2
1
1
1
1
1
n
L
2 2 2 2 + + + + K (n du cn)
=
chan n neu
le n neu
n
!... 6 !. 4 !. 2
!... 5 !. 3 !. 1
! !
11) Cho s thc a v s t nhin n. Hy tnh:
a
n
a(a+1) (a+n-1)
) ( ) 1 (
1
...
) 1 (
1 1
n a a a a a a + +
+ +
+
+
K
12) Vit chng trnh m s ch s ca s t nhin n nhp
vo t bn phm.
13) Cho trc s t nhin n. Vit chng trnh tnh tng ca
cc ch s ca s n.
14) Cho trc s t nhin n. Vit chng trnh tnh v in tr o
ngc ca s n.
15) Cho trc s t nhin n. Vit chng trnh kim tra tnh
i xng ca s n. V d, vi n = 12321 th hin th thng
bo s 12321 l s i xng.
16) Cho trc s t nhin n. Vit chng trnh kim tra tnh
tun hon v in ra s chu k (nu c) ca s n. V d, vi
n=12121212 th in ra s 12121212 tun hon vi cc chu
k 12, 1212.
96
17) Cho trc s t nhin n. Vit chng trnh tnh s i ng
ca s n. V d, vi n = 1047 th s i ng l 9063.
18) Cho trc s t nhin n. Hy cho bit:
n c bao nhiu ch s ?
Tnh tng cc ch s ca n.
Tnh tch cc ch s ca n.
Tm ch s u tin ca n.
19) Cho 2 s t nhin a, b. Hy:
Tm c s chung ln nht ca chng.
Tm bi s chung nh nht ca chng.
20) Cho s t nhin n. Hy xy dng s m bng cch loi b i
trong s n tt c cc ch s 0 v ch s 5 (th t ban u
ca cc ch s c gi nguyn). V d, vi n = 50915509
th m = 919.
21) Vit chng trnh in ra mn hnh bng cu chng theo
chiu dc v theo chiu ngang.
22) Trm tru n c, tru ng n 5. tru nm n 3, ba tru gi
n 1. Vit chng trnh hin th s tru theo tng loi.
23) Vit chng trnh kim tra xem 2 s t nhin a, b c
nguyn t cng nhau?
24) Vit chng trnh nhp s nguyn n > 0 v mt s nguyn
h ch h (c gi tr 2, 8 hoc 16). Sau hin th ra mn
hnh tr tng ng ca N di dng ch nh bi h h (nh
phn, bt phn, hoc thp lc phn).
VD: nhp n = 65, h = 2 In ra : 0000000001000001 B
97
25) Vit chng trnh kim tra xem s n > 0 nhp vo t bn
phm c phi l s nguyn t?
26) Vit chng trnh nhp vo s n > 0 v hin th ra mn hnh
tt c cc s nguyn t < n.
27) Vit chng trnh nhp vo s n > 0 v hin th ra mn hnh
n s nguyn t u tin.
28) Dy s Fibonacci: 1 1 2 3 5 8 13 21 34 55 Vit
chng trnh kim tra xem s N nhp vo c phi l s
Fibonacci?
29) Vit chng trnh nhp vo s n>0 v hin th ra mn hnh
cc s Fibonacci < n.
30) Vit chng trnh nhp vo s n>0 v hin th ra mn hnh
n s Fibonacci u tin.
31) Vit chng trnh v cc hnh sau y vi h l chiu cao
nhp vo t bn phm: VD: vi h = 5
* * * * * * * * * * * *
* * * * * * * * * * * *
* * * * * * * * * * * *
* * * * * * * * * * * *
* * * * * * * * * * * *
* * * * * * * * * * * *
* * * * * * * *
* * * * * * * *
* * * * * * * *
98
* * * * * * * * * * * *
* *
* * * * *
* * * * * * *
* * * * * * * * *
* * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * *
* * * * * * * * *
* * * * * * *
* * * * *
* *
32) Vit chng trnh nhp vo s n > 0 v hin th ra mn hnh
theo dng sau:
VD: vi n = 5
1 2 3 4 5 A B C D E
2 3 4 5 1 B C D E A
3 4 5 1 2 C D E A B
4 5 1 2 3 D E A B C
99
5 1 2 3 4 E A B C D
33) Vit chng trnh ln lt nhp vo cc tr nguyn cho n
khi nhp tr 0 th dng. Hy tnh:
S lng cc s nhp tha tiu chun P (V d: l s
m, l s l, l s nguyn t, l s Fibonacci, )
Tng cc s nhp tha tiu chun P.
Trung bnh tng cc s nhp tha tiu chun P.
34) Vit chng trnh phn tch s nguyn n > 0 thnh tch cc
tha s nguyn t theo cc dng sau: V d, vi n = 120 th:
Dng 1: 120 = 2 * 2 * 2 * 3 * 5
Dng 2: 120 = 2 ^ 3 * 3 * 5
35) Vit chng trnh nhp vo cp ta x, y < 10. Sau v
du * ti ta (x,y) va nhp nh sau: V d, nhp x =
8, y = 5
1 2 3 4 5 6 7 8 9 10
1 .
2 .
3 .
100
4 .
5 . . . . . . . . . . . . . . . . *
6
7
8
9
10
36) Vit chng trnh tnh cn bc 2, cn bc 3, cn bc 4, cn
bc N ca s nguyn A, (N > 0, A > 0) theo h thc truy
hi sau:
Cn bc 2:
+
=
=
2
1
1
1
0
n
n
n
x
A
x
x
x
Cn bc 3:
+
=
=
3
2
1
2
1
1
0
n
n
n
x
A
x
x
x
Cn bc 4:
101
+
=
=
4
3
1
3
1
1
0
n
n
n
x
A
x
x
x
Mt cch tng qut vi cn bc N:
+
=
=
n
x
A
x n
x
x
n
n
n
n
1
1
1
0
) 1 (
1
37) Cho trc sai s . Vit chng trnh tnh E
x
, Sin(x),
Cos(x) theo cc cng thc khai trin sau:
...
! 3 ! 2 ! 1
1
3 2
+ + + + =
x x x
E
x
...
! 7 ! 5 ! 3
) sin(
7 5 3
+ + =
x x x
x x
...
! 6 ! 4 ! 2
1 ) cos(
6 4 2
+ + =
x x x
x
102
CHNG 4. HM (FUNCTION)
1. Khi nim
gii quyt mt vn tng i ln, phc tp, ta thng c
khuynh hng phn chia vn ban u thnh nhng vn con nh
hn. V t nhng vn con ny, ta li tip tc phn r thnh nhng
vn con nh hn na (nu c) ... cho n khi gp vn con s
cp c th thy ngay cch gii quyt. Cch tip cn ny p dng t
tng chia tr v c gi l phng php phn tch t trn
xung (Top Down Analysis). Mi vn con l mt n th
(module) m trch gii quyt mt chc nng c th, xc nh. Cc
n th lin lc vi nhau thng qua cc thng s.
Ta c th xem hot ng ca hm nh hot ng ca mt hp en.
Cng mt d kin vo s cho ra cng kt qu.
Hu ht cc NNLT cp cao (C, C++, PASCAL, FOX . . .) u h
tr phng php lp trnh cu trc cho php t chc chng trnh my
tnh thnh nhiu n th (module). Mi n th chng trnh tng
ng vi 1 hm (trong C/C++).
C 2 loi hm trong NNLT C/C++:
Hm th vin do chng trnh dch cung cp.
Hm t to do USE R nh ngha.
Hm th vin (library functions): chng trnh dch C/C++
cung cp mt th vin s cc hm tin ch gip gim nh cng sc
lp trnh v cho php USER tp trung nhiu hn vo logic ca vn
ang gii quyt. s dng cc hm ny trong chng trnh, cn chn
vo u chng trnh cc tp tin tiu cha cc khai bo v nh
103
ngha hng, bin, hm nguyn mu, . . . bng cc ch th tin x l
#include <tn tp tin>.
Hm t to: Ngoi ra, C/C++ cho php USER nh ngha thm
cc hm khc phc v cho nhu cu lp trnh ca mnh.
2. Khai bo v nh ngha hm
Gm c 2 phn: dng tiu v phn thn hm
[<kiu gi tr tr v>] <tn hm>([<danh sch cc tham s>])
{
// cc khai bo cc b
. . . .
// cc cu lnh
. . . .
}
Trong :
<kiu gi tr tr v>:
M t kiu d liu ca gi tr m hm s tr v cho ni
gi n. Ni chung, gi tr tr v ca hm c th thuc mt
kiu d liu hp l bt k, ngoi tr C/C++ khng cho
php tr v mt bin kiu mng.
Nu ta b qua, khng m t <kiu gi tr tr v> th
chng trnh dch s ngm hiu l kiu int.
104
M t <kiu gi tr tr v> l void nu ta mun hm
khng tr v gi tr no (hm ny tng ng vi th
tc trong PASCAL).
<tn hm>: l danh hiu hp l
<danh sch cc tham s> c dng:
<tn kiu> <tn bin>, <tn kiu> <tn bin>,
Phn thn hm t trong cp du { }, v cha cc cu lnh
m t hot ng ca hm.
3. Lnh return
Hm sau khi c khai bo v nh ngha, c th c gi thc
hin bng li gi hm trong chng trnh. Hot ng ca c kt
thc theo 1 trong 3 cch nh sau:
Trng hp hm c gi tr tr v l void: hm kt thc hot
ng sau khi thc hin cu lnh cui trc du } sau cng,
hoc nu ta mun hm kt thc sm trong iu kin no
th dng lnh return;
Trng hp hm c gi tr tr v khc void: Khi gp lnh
return <biu thc>; chng trnh dch s kt thc hot
ng ca hm, v tr ca <biu thc> c tr v cho ni gi
hm.
4. Cc dng hm
4.1. Hm khng c tham s
V d 1: hm in dng ch HELLO C
105
void PrintHello()
{
cout << Hello C++\n;
}
Cch gi hm:
PrintHello();
V d 2: hm gii phng trnh bc 2:
void GiaiPTBac2()
{
double a, b, c;
cout << Nhap cac he so a, b, c : ; cin >> a >> b >> c;
double delta = b*b-4*a*c;
if (delta<0)
cout << Phuong trinh vo nghiem\n;
else if (delta==0)
cout << Phuong trinh co nghiem kep X = << -b/2/a;
else // delta>0
cout << Phuong trinh co 2 nghiem phan biet:
106
<< \nX1 = << (-b-sqrt(delta))/2/a
<< \nX2 = << (-b+sqrt(delta))/2/a;
}
Cch gi hm:
GiaiPTBac2();
4.2. Hm vi nhiu tham s
V d 1, hm tnh s max ca 2 s nguyn:
int Max(int a, int b)
{
return (a > b ? a : b);
}
Cch gi hm:
Max(x, y); // voi x, y co kieu int
V d 2, hm v hnh vung c chiu cao h:
void Draw(int h)
{
for (int i=1; i<=h; ++i) // lap h dong
107
{
for (int j=1; j<=h; ++j) // lap h cot
cout << setw(3) << *;
cout << endl;
}
}
Cch gi hm:
Draw(5)
Hoc
Draw(h), vi h c kiu int
4.3. Hm nguyn mu (function prototype)
Hm nguyn mu c dng cung cp thng tin cho chng
trnh dch v tn hm, kiu gi tr tr v, s lng, th t v kiu ca
cc tham s ca hm. Chng trnh dch cn c vo cc thng tin ny
kim tra cc li gi hm trong chng trnh.
Hm nguyn mu c t sau phn khai bo ton cc v ngay
trc hm main() hoc c th t trong tp tin khc.
Khai bo:
[<kiu gi tr tr v>] <tn hm>([<danh sch cc tham s>]) ;
108
Trong :
<kiu gi tr tr v> m t kiu ca gi tr tr v bi hm
<tn hm> l danh hiu hp l v nn t tn sao cho th
hin c chc nng ca hm
<danh sch cc tham s> m t cc kiu d liu v tn bin
i din ca tng tham s., mi cp kiu d liu v tn bin
c phn cch bi du phy ,
V d: Khai bo hm nguyn mu c chc nng xc nh tr min
gia 2 s nguyn.
int Min(int, int) ;
hay
int Min(int a, int b) ; // nn dng cch khai bo ny
4.4. T chc mt chng trnh C/C++ (trn cng 1 tp tin)
Cch 1: chng trnh gm 3 phn
PHN KHAI BO TON CC
PHN KHAI BO V NH NGHA HM
HM main()
Cch 2: chng trnh gm 4 phn (nn dng cch ny)
PHN KHAI BO TON CC
PHN KHAI BO HM NGUYN MU
109
HM main()
PHN NH NGHA HM
5. Cc phng php truyn tham s
Tham s thc (actual parameter) l tham s trong li gi hm.
Tham s hnh thc (formal parameter) l tham s trong phn khai
bo v nh ngha. Tham s hnh thc ch l tn i din cho tham s
thc tng ng. Kiu ca tham s hnh thc s qui nh kiu ca tham
s thc.
C 2 cch truyn tham s cho hm:
Truyn bng gi tr (ch yu trong C/C++): Trong phng
php ny, chng trnh dch cp pht vng nh ring cho
tng tham s hnh thc, sau sao chp gi tr ca tham s
thc tng ng vo cc tham s hnh thc. Sau khi kt thc
thc hin hm, chng trnh dch s thu hi cc vng nh
cp pht cho cc tham s hnh thc, v cc bin cc b khai
bo bn trong hm. Nh vy, mi s thay i tr ca cc
tham s hnh thc u khng nh hng n cc tham s
thc bn ngoi hm.
Truyn bng tham chiu (cn gi l truyn bng a ch):
Ch c trong C++.Thay v cp pht vng nh ring nh trong
phng php truyn bng gi tr, chng trnh dch s truyn
a ch ca cc tham s thc tng ng cho cc tham s hnh
thc. iu c ngha l ta c th xem tham s hnh thc
cng chnh l tham s thc, hay ni cch khc tham s hnh
thc l tn gi khc ca tham s thc. Nh vy, mi s thay
110
i tr ca tham s hnh thc bn trong hm chnh l thay i
tr ca tham s thc bn ngoi hm.
phn bit cch truyn tham chiu, vi cch truyn tr,
ta t k hiu & trc tn bin hnh thc.
V d: Khai bo hm nguyn mu c chc nng hon i tr ca 2
bin nguyn:
void Swap(int &,int &); // truyn bng tham chiu
hay
void Swap(int & a,int & b); // truyn bng tham chiu
void F(int, int ); // truyn bng tr
hay
void F(int a, int b); // truyn bng tr
Ch :
Trong cch truyn tham chiu, tham s thc tng ng phi
l mt bin. Cn trong cch truyn tr, tham s thc tng
ng c th l bin, hng, li gi hm, hoc mt biu thc
cng kiu vi tham s hnh thc.
Cc tham s hnh thc trong cch truyn bng gi tr c
gi l tham tr. Cn cc tham s hnh thc trong cch truyn
bng tham chiu c gi l tham bin.
111
6. Phm vi (scope) v cp lu tr (storage class) ca cc i
tng
ti u ha vic s dng b nh v qun l vic truy xut cc
i tng (bin, hng, hm) trong chng trnh, C/C++ a ra cc
khi nim phm vi v cp lu tr.
6.1. Phm vi
Phm vi l vng chng trnh m i tng c nhn bit v c
th c s dng. Ni chung, phm vi ca mt i tng tri di t
ni n c khai bo n cui khi, hm, hay tp tin cha i tng
. C cc loi phm vi sau:
Phm vi cuc b (local scope)
Phm vi khi (Block scope)
Phm vi hm (Function scope)
Phm vi ton cuc (global scope)
Phm vi tp tin (File scope)
Phm vi chng trnh (Program scope)
V d v phm vi:
#include <iostream.h>
int x=3; // bin x ton cc
const int MAX = 10;
void fct(int x);
112
void main(){
int x=1; // x cc b ca hm main()
fct(x);
{
int y=4;
x += y;
}
cout<<Y = <<y; // Sai v bin y b hy, khng th truy
xut
cout<<X ca hm main() = <<x;
cout<<X ton cc = <<::x;
}
void fct(int x){
x += MAX;
cout<<X bn trong hm fct() = <<x<<endl;
}
Bin khai bo bn trong khi hay hm c gi l bin cc b
(local variable) ca khi, hm v ch c th c truy xut bn
trong phm vi khi hay hm m thi. Cn bin khai bo bn ngoi
113
mi hm, mi khi uc gi l bin ton cc (global variable) v c
th c truy xut mi ni trong chng trnh.
Cc bin cc b c thi gian tn ti tng i ngn. Chng s b
hy mi khi ra khi khi hay kt thc thc hin hm cha n.
Ngc li, cc bin ton cc c thi gian tn ti l thi gian ca
chng trnh.
6.2. Cp lu tr
Cp lu tr (storage class) l cch thc NNLT cp pht vng nh
v lu tr bin. Cp lu tr ca mt bin c xc nh bng cc t
kha sau: auto, register, static, extern.
Bin auto (cn gi l bin t ng, bin cc b)
Mi bin khai bo bn trong mt khi hay hm mc nhin c tnh
cht auto, tr khi xc nh r cp lu tr khc.
V d, khai bo int x; tng ng vi khai bo auto int x;.
Bin auto c phm vi cc b bn trong hm hay khi v c thi
gian tn ti ngn, do c cp pht trong vng nh STACK.
Bin register (t dng)
tng tc truy xut bin (thng l cc bin m trong vng
lp for), ta t t kha register trc khai bo bin, yu cu chng
trnh dch lu tr bin trong thanh ghi. Ch , chng trnh dch c
114
th b qua khng p ng li yu cu ny nu c qu nhiu li
ngh loi ny hoc nu khng cn thanh ghi cp pht.
Bin static (cn gi l bin tnh)
L bin c cp pht trong vng nh DATA (trnh by s s
dng b nh ca mt chng trnh C/C++), v do c tnh cht c
nh, lu di. Thi gian tn ti ca bin static l thi gian ca chng
trnh. Nh vy bin static khai bo bn trong mt khi, hay hm s
khng b hy khi ra khi khi hay hm o, v vn lu gi gi tr c
ca ln gi hm trc. Ch , bin static phi c khi to gi tr khi
khai bo. Chng trnh dch s ch khi to gi tr cho bin static duy
nht mt ln trong ln gi hm u tin.
Bin extern
Mt chng trnh C/C++ c th c t chc trn nhiu tp tin
khc nhau. V phm vi ca mt bin no trong chng trnh c th
c tri di trn nhiu tp tin nh vo t kha extern nh sau: ( v
hnh )
T kha extern ng trc khai bo bin c ngha l bin
c khai bo v nh ngha ni khc trong chng trnh (trong
cng tp tin hay trong tp tin khc), chng trnh dch s khng cp
pht thm vng nh cho bin c khai bo extern m s dng chung
vng nh cp pht trc .
Tm tt v cp lu tr bin (Storage class)
115
V tr khai bo
bin
T kha Thi gian tn ti Phm vi
Hm auto
(default)
Hm Hm
Hm register Hm Hm
Hm static Chng trnh Hm
Bn ngoi hm static Chng trnh File
Bn ngoi hm ----- Chng trnh File
Bn ngoi hm extern Chng trnh Nhiu File
V d 1:
Minh ha tm vc, phm vi ca bin (Visibility (Scope) of
variables)
116
File1.cpp
int a; __
int b; __ ______________________________________________
int c; __
int d; __ _______________________________________
void main()
{
int e; _
auto int f; _
register int i; __
static int j;
}
int k; __ __________________________________
void F1()
{
117
int m; ______________________________
}
File2.cpp
extern int a; _
void F2()
{
extern int b;
}
extern int c; _
118
void F3()
{
extern int d;
}
V d 2:
#include <iostream.h>
#include "file3.cpp"
const int MAX=10;
int x=3;
void main()
{
const int MAX = 5;
int x = 1;
x += ::MAX;
119
cout<<"X cuc bo trong ham main() = "<<x<<endl;
cout<<"X toan cuc = "<<::x<<endl;
f1();
f2();
}
File3.cpp
#include <iostream.h>
extern int x; // dung chung bien x da khai bao o noi khac
extern const int MAX; // dung chung hang MAX da khai bao o noi
khac
void F1()
{
int x=2; // x cuc bo
cout<<"X cuc bo trong ham f1() = "<<x<<endl;
cout<<"X toan cuc da khai bao trong ham main() =
"<<::x<<endl;
}
void F2()
120
{
const int MAX=15; // hang cuc bo
cout<<"Hang MAX cuc bo trong ham f2() = "<<MAX<<endl;
cout<<"Hang MAX toan cuc da khai bao trong File1 = "
<<::MAX<<endl;
cout<<"Bien x toan cuc da khai bao trong File1 =
"<<::x<<endl;
}
7. C ch gi hm v b nh stack
Mt chng trnh C/C++ l tp hp cc hm trong hm
main() l quan trng nht v khng th thiu do y l im u vo
ca chng trnh. Khi ta cho thc hin chng trnh th hm main()
c gi thc hin trc tin. Khi , hm main() c th gi chy cc
hm khc, v cc hm ny li c th gi chy cc hm khc na,
Khi mt hm c gi th C/C++ s to ra mt khung kch hot
(activation frame) trong vng nh stack. Khung kch hat cha cc
bin cc b v mu tin hot ng (active record) ca hm. Mu tin
hot ng cha a ch tr v (return address) ca hm gi n v cc
thng s khc. Sau khi kt thc thc hin hm, trnh bin dch s xa
cc bin cc b cp pht cho hm (cc tham s hnh thc tr, cc
bin cc b khai bo bn trong hm) v chuyn iu khin v dng
lnh ti a ch tr v ca hm gi n.
V d, xt chng trnh sau:
121
void A();
void B();
void C();
void D();
void E();
void main(){
D();
E();
}
void A()
{
B();
}
void B()
122
{
C();
}
void C()
{
}
void D()
{
A();
}
void E()
{
123
C();
}
Ta c hnh nh sau:
8. Hm c tham s vi gi tr ngm nh (Function with default
arguments)
C++ cho php ci t hm vi tham s c gi tr ngm nh. Cc
tham s ny phi c khai bo lin tc v theo th t t phi sang
tri.
Khai bo:
<return type> <function name>(<type> <param1>=<val1>,
<type> <param>=<val2>, );
Thi gian chy chng trnh
B
n
h
S
T
A
C
K
M M
D
M
D
A
M
D
A
B
M
D
A
B
C
M
D
A
B
M
D
A
M
D
M M
E
M
E
B
M
E
M
C
B
E
M
124
Phn nh ngha c thc hin nh hm thng thng.
<return type> <function name>(<type> <param1>, <type>
<param2>,)
{
// cc cu lnh
}
9. Np chng hm (Function overloading)
C++ cho php dng chung mt danh hiu t tn cho cc hm
khc nhau. Ta gi l np chng hm.
Thng thng, ta ch np chng hm i vi nhng hm ging
nhau v bn cht, nhng khc nhau s lng, v kiu d liu ca cc
tham s.
V d, tm tr max ca 2 s nguyn, 3 s nguyn, , hoc 2 s
thc, 3 s thc, trong C chun, ta vit nhiu hm khc nhau, mi
hm phi c t tn khc nhau. Trong C++, ta c th np chng,
i.e., ta c th dng chung tn hm (VD max) cho tt c cc hm ny.
Cc hm c np chng c th ging nhau v kiu ca tr tr v,
nhng bt buc phi khc nhau s lng, hoc kiu ca cc tham s.
Chng trnh dch s cn c vo cc yu t ny xc nh hm cn
thc hin mi khi gp li gi hm c np chng.
125
Ch
Kh nng np chng hm kt hp vi hm c tham s vi gi tr
ngm nh c th gy ra tnh trng nhp nhng, m h nh sau:
void F(int=2, double=3.0);
void F(int);
void F(double);
void main()
{
double x = 20.0;
int y = 10;
F(x, y); // m h! chng trnh dch khng bit gi hm no
}
void F(int, double)
{
}
void F(int)
{
126
}
void F(double)
{
}
10. Mt s gi khi thit k hm
Xc nh r chc nng, nhim v ca hm.
Ch nn thit k hm theo phng chm mi hm ch
thc hin mt nhim v duy nht, v nn thit k sao cho
c th s dng li hm h tr cho cc vic khc
(reusable).
t tn hm sao cho c tnh gi nh (Mnemonic)
Nn t ch thch, ghi r cc thng tin v hm nh chc
nng, iu kin d liu vo, xc nh d liu ra ca hm, . . .
Xc nh tr tr v: hm c cn tr v gi tr? Nu c, xc
nh r kiu tr v. i vi cc hm c chc nng nhp/xut
d liu, tr tr v thng l void (tng ng vi th tc
trong Pasccal). Cn i vi loi hm kim tra mt tnh cht
P no , ta thng tr v gi tr 0 hoc 1, i.e. tr v tr ca
mt biu thc logic.
Xc nh s lng tham s v kiu ca tng tham s: hm
c nhn tham s hay khng? Bao nhiu tham s? Kiu ca
tng tham s?
Xc nh r phng php truyn tham s: nu khng c
nhu cu lm thay i tr ca tham s thc truyn vo cho
127
hm th p dng phng php truyn bng gi tr. Cn
ngc li th p dng cch truyn bng tham chiu.
11. Mt s v d minh ha
12. Cu hi
Nu cch khai bo hm, nh ngha hm, cch gi hm.
Phm vi ca mt i tng (bin, hng) trong chng trnh ?
Trnh by cc phng php truyn tham s cho hm (truyn
bng gi tr, bng tham chiu, v bng tham tr)
Nu cch thit k hm m theo Anh (Ch) cho l t yu cu.
Cho v d v hm xut/nhp.
Cho v d v hm kim tra mt gi tr nguyn tha tnh cht
P no .
Cho v d v hm xc nh gi tr nguyn tha tnh cht P
no .
Trnh by cch t chc mt chng trnh C/C++.
Trnh by cp lu tr ca mt i tng (auto, register,
static, extern).
Khai bo cc hm nguyn mu sau:
Gii phng trnh bc 2 ax
2
+ bx + c = 0
Gii phng trnh bc 4 ax
4
+ bx
2
+ c = 0
In bng cu chng theo chiu dc.
In bng cu chng theo chiu ngang.
V hnh tam gic vi chiu cao h dng
Phn tch s n > 0 thnh tch cc tha s nguyn t theo
dng n = 120 = 2*2*2*3*5.
128
Phn tch s n > 0 thnh tch cc tha s nguyn t theo
dng n = 120 = 2^3*3*5.
Kim tra nm y c phi l nm nhun ?
Kim tra 1 b ngy, thng, nm c hp l hay khng ?
Kim tra s t nhin n > 0 c phi l s nguyn t ?
Kim tra 2 s t nhin c nguyn t cng nhau ?
Kim tra s t nhin n > 0 c phi l s thuc dy s
Fibonacci ?
Kim tra s n > 0 c phi l s i xng ?
Kim tra s n [100 999] c phi l s tha tnh cht P
= c tng cc ch s bng tch cc ch s ?
Kim tra s n > 0 c phi l s hon thin ?
Tnh tr max ca 2 s nguyn.
Tnh tr min ca 2 s nguyn.
Tnh USCLN ca 2 s t nhin.
Tnh tng S ca n > 0 s hng u tin theo cng thc
cho trc.
Tnh tr o ca s t nhin.
Tnh tr i ng b 10 ca s t nhin.
Tnh s ngy ti a ca thng m, nm y.
Tnh ngy hm sau ca 1 b ngy thng nm.
Tnh khong cch gia 2 b ngy, thng, nm.
nh ngha cc hm nguyn mu trn, v vit chng
trnh ng dng.
Cho chng trnh sau y:
#include <iostream.h>
129
void mul(int&,int,int&);
int main( ) {
int x = 4, y = 3, z = 2;
mul( y, z, x );
cout << "\nX = " << x;
cout << "\nY = " << y;
cout << "\nZ = " << z;
return 0;
}
void mul( int & x,int y, int & z ) {
x *= y;
y *= z;
z *= x;
}
Hy cho bit tr in ra mn hnh ca cc bin x, y, v z. Gii thch
theo mu bng sau:
Cu
lnh
Hm main() Hm mul()
X Y Z X Y Z
130
Cho chng trnh sau y:
#include <iostream.h>
void f( int x, int & y, int z );
void g( int & x, int y, int & z );
int main() {
int x = 2, y = 3, z = 4;
f( y, z, x );
cout << "\nX = " << x;
cout << "\nY = " << y;
cout << "\nZ = " << z;
return 0;
}
void f( int x, int & y, int z ){
g( z, y, x );
x += y;
y += z;
z += x;
}
131
void g( int & a, int b, int & c ) {
a *= b;
b *= c;
c *= a;
}
Hy cho bit tr in ra mn hnh ca cc bin x, y, v z. Gii thch
theo mu bng sau:
Cu
lnh
Hm main() Hm f() Hm g()
X Y Z X Y Z A B C
13. Bi tp
1) Vit hm xc nh s Max trong 2 s nguyn. Sau vit
chng trnh p dng in ra mn hnh s Max trong 5 s
nguyn.
2) Vit hm hon i tr 2 bin nguyn. Sau vit chng
trnh ng dng.
3) Vit hm xc nh USCLN ca 2 s t nhin. Sau vit
chng trnh p dng nhp vo 2 s t nhin v cho bit 2
s c nguyn t cng nhau ? Sau tnh BSCNN ca 2
s ny.
4) Cho trc s t nhin n. Vit hm xc nh s nguyn t
th n. Sau vit chng trnh p dng.
5) Cho trc s t nhin n. Vit hm xc nh s Fibonacci
th n. Sau vit chng trnh p dng.
132
6) Cho trc s t nhin n. Vit hm kim tra s n c phi l
s nguyn t hay khng ? Sau vit chng trnh p
dng.
7) Vit hm kim tra 2 s c nguyn t cng nhau hay khng
? Sau vit chng trnh p dng.
8) Cho trc s t nhin n. Vit hm kim tra s n c phi l
s Fibonacci hay khng ? Sau vit chng trnh p
dng.
9) Cho trc s t nhin n. Vit hm kim tra s n c phi l
s i xng hay khng ? Sau vit chng trnh p dng.
10) Cho tnh cht P=Tng cc ch s ca 1 s nguyn bng
tch ca cc ch s ca n. Vit hm kim tra mt s (gm
3 ch s) c tha tnh cht P hay khng ? Sau vit
chng trnh p dng.
11) Vit hm in ra mn hnh bng cu chng dc (ngang).
Sau vit chng trnh p dng.
12) Vit cc hm in ra mn hnh cc loi tam gic c v rng
vi chiu cao h. Sau vit chng trnh p dng to mt
menu cho php chn dng hnh tam gic in ra mn hnh.
13) Vit chng trnh bao gm cc hm sau:
Hm kim tra nm y cho trc c nhun hay khng ?
Hm xc nh s ngy ti a ca thng m trong nm y
cho trc.
Hm kim tra tnh hp l ca mt b ngy, thng, nm
cho trc.
Hm xc nh ngy k tip ca mt b ngy, thng, nm
cho trc.
133
Hm xc nh N ngy k tip ca mt b ngy, thng,
nm cho trc.
Vit chng trnh p dng cc hm trn.
14) Vit chng trnh tnh khong cch ngy gia 2 b ngy
thng nm.
134
CHNG 5. KIU MNG (ARRAY)
1. Khi nim
Kiu mng cho php gii quyt nhiu bi ton lp trnh lin quan
n mt lng ln d liu mt cch gn, sc tch. V d: bi ton xc
nh s min, max ca nhiu s nguyn, tm kim, sp xp trn 1 dy
cc s liu, . . .
Mng l kiu d liu c cu trc bao gm nhiu phn t cng
kiu v c b tr vng nh lin tc.
Kiu ca cc phn t mng gi l kiu c s. Mi phn t mng l
mt bin c kiu c s.
Mng c kch thc l s phn t trong mng. Kch thc mng
bt buc phi l biu thc hng nguyn c th cp pht vng nh
lc bin dch.
Mng c th c 1 chiu hay nhiu chiu. Mng n chiu (n>1) c
th c coi nh mng 1 chiu m mi phn t l mng n-1 chiu. S
phn t ca mng nhiu chiu bng tch ca kch thc cc chiu.
V d: mng cc s nguyn, cc s thc, cc k t,
2. Khai bo & khi to gi tr cc phn t mng trong C/C++
<kiu c s> <tn bin mng> [<kch thc>];
Trong :
<kiu c s> c th l kiu d liu hp l bt ky trong
C/C++.
135
<tn bin mng> l 1 danh hiu hp l v c gi tr l a ch
ca vng nh ca phn t u tin ca mng.
<kch thc> l mt gi tr hng nguyn hoc mt biu thc
hng nguyn (khng th l 1 bin) v c t trong cp du
[]. Trng hp mng c nhiu chiu, th mi chiu phi
c xc nh r kch thc bng [<kch thc 1>][<kch
thc 2>]. . .
V d:
khai bo mng nguyn 1 chiu c tn arr1D gm 5 phn t.
int arr1D[5];
khai bo mng nguyn 2 chiu c tn arr2D gm 6 phn t (2
dng 3 ct)
int arr2D[2][3];
Ta c th khi to gi tr ban u cho cc phn t ca mng 1
chiu nh sau:
int arr1D[5] = {3,5,4,6,2};
int arr1D[ ] = {3,5,4,6,2};
int arr1D[5] = {3}; //phn t u = 3, cc phn t cn li = 0
khai bo v khi to mng 1 chiu vi tt c cc phn t c tr
= 0:
int arr1D[5] = {0};
136
Ta c th khi to gi tr ban u cho cc phn t ca mng 2
chiu nh sau:
int arr2D[2][3] = {3,5,6,2,4,1};
int arr2D[ ][3] = {3,5,6,2,4,1};
int arr2D[2 ][3] = {{3,5,6},{2,4,1}};
int arr2D[ ][3] = {{3,5,6},{2,4,1}};
khai bo v khi to mng 2 chiu vi tt c cc phn t c tr
= 0:
int arr2D[2 ][3] = {0};
3. Truy xut cc phn t ca mng
Cc phn t mng c th c truy xut thng qua ch s ca n
trong mng.
Cc phn t mng c nh s th t bt u t 0, s th t ny
gi l ch s mng. Cc phn t mng c th c truy xut nh sau:
<tn bin mng>[ch s]
V d: mng 1 chiu
V d: mng 2 chiu
22 55 44 11 33
a
0 1 2 3 4
137
Ch
Chng trnh dch C/C++ khng kim tra vic vi phm
bin mng.
Kch thc ca mng phi l biu thc hng
4. Truyn tham s mng cho hm
Trong phn khai bo v nh ngha hm, i vi mng 1 chiu
ta ghi cp du [] ngay sau tn kiu c s ca mng. i vi mng
nhiu chiu, ta phi ghi y s lng cp du [] bng ng s chiu
v t ngay sau tn kiu c s, cc chiu phi ghi r kch thc, ngoi
tr kch thc ca chiu u tin trng nh i vi mng 1 chiu.
Trong li gi hm, ta ch cn ghi tn bin mng ti v tr tng
ng vi tham s mng hnh thc.
Thc cht ca vic truyn tham s mng cho hm l s truyn gi
tr a ch ca tham s thc cho tham s mng hnh thc. iu ny c
ngha l trc khi cho thc hin hm chng trnh dch s cp pht
vng nh ring cho tham s mng hnh thc nh mt bin cc b.
Tham s cc b ny nhn tr ban u l bn sao gi tr a ch ca
vng nh u tin ca mng truyn vo cho hm v s b hy khi kt
thc thc hin hm. Tuy nhin, do tham s thc truyn a ch ca n
22 55 44
66 33 11
a
0 1 2
0
1
138
cho tham s hnh thc nn mi s thay i tr ca cc phn t mng
trong hm s lm thay i tr ca cc phn t mng bn ngoi hm.
5. Cc thao tc c bn trn mng 1 chiu
Nhp gi tr cho cc phn t mng.
Xut gi tr cc phn t mng (ra mn hnh).
Thm 1 phn t vo mng.
Xa mt phn t ra khi mng.
Tm kim trn mng.
Sp xp mng.
Cc thao tc trn thc cht l duyt mng v x l trn tng
phn t mng nh vo cu trc lp mt cch tng qut nh sau:
i vi mng 1 chiu gm MAX phn t:
for (i=0; i<MAX; i++)
x l phn t a[i];
i vi mng 2 chiu gm ROWS dng, COLS ct:
for (i=0; i<ROWS; i++)
for (j=0; j<ROWS; j++)
x l phn t a[i][j];
5.1. Nhp gi tr cho cc phn t mng.
Gi s khai bo mng 1 chiu cc s nguyn gm MAX=20
phn t
139
Hm nhp gi tr cho cc phn t mng t bn phm
void Input(int a[], int n)
{
for (int i=0; i<n; i++)
{
cout << a[ << i << ] = ; cin >> a[i];
}
}
Hm to gi tr ngu nhin cho cc phn t mng trong on [-M
M]
void InitArray(int a[], int n)
{
//hm khi ng b to s ngu nhin khai bo trong <stdlib.h>
srand(time(0));
for (int i=0; i<n; i++)
a[i] = rand()(2*M+1) M;
}
Hm to gi tr ngu nhin tng dn cho cc phn t mng, phn
t u tin c tr trong on [x y], vi 0<x<y.
140
void InitArray(int a[], int n, int x, int y)
{
srand(time(0));
a[0] = rand()%(b-a+1) + a;
for (int i=1; i<n; i++)
a[i] = a[i-1]+ rand()%10;
}
5.2. Xut gi tr cc phn t mng (ra mn hnh).
Hm xut gi tr cho cc phn t mng 1 chiu ra mn hnh
void Output(const int a[], int n)
{
for (int i=0; i<n; i++)
cout << setw(4) <<a [i];
cout << endl;
}
// Hm xut gi tr cho cc phn t mng 2 chiu gm ROWS
dng, COLS ct ra mn hnh
void Output(const int a[][COLS], int m, int n)
141
{
for (int i=0; i<m; i++)
{
for (int j=0; j<n; j++)
cout << setw(4) << a[i][j];
cout << endl;
}
}
5.3. Thm 1 phn t vo mng.
Hm thm gi tr x vo cui mng
void InsertLast(int a[], int &n, int x)
{
a[n] = x;
n++;
}
Hm thm gi tr x vo mng ti v tr c ch s pos th t tng
quan ban u ca cc phn t mng l khng quan trng
void Insert(int a[], int &n, int x, int pos)
142
{
a[n] = a[pos];
a[pos] = x;
n++;
}
Hm thm gi tr x vo mng ti v tr c ch s pos th t tng
quan ban u ca cc phn t mng khng thay i
void Insert(int a[], int &n, int x, int pos)
{
for (int i=n; i>pos; i--)
a[i] = a[i-1];
a[pos] = x;
n++;
}
5.4. Xa mt phn t ra khi mng.
Hm xo phn t ti v tr c ch s pos ra khi mng, th t mng
l khng quan trng
void Remove(int a[], int &n, int pos)
{
143
a[pos] = a[n];
n--;
}
Hm xo phn t ti v tr c ch s pos ra khi mng, th t mng
l quan trng
void Remove(int a[], int &n, int pos)
{
for (int i=pos; i<n-1; i++)
a[i] = a[i+1];
n--;
}
5.5. Tm kim trn mng.
Hm tm kim gi tr x, tr v ch s ca phn t u tin c tr =
x, nu khng tm thy th tr v tr 1 (hoc n).
Hm tm kim tuyn tnh trn mng cha c th t
int LinearSearch(const int a[], int n, int x)
{
for (int i=0; i<n; i++)
if (a[i]==x)
144
return i;
return 1;
}
Hm tm kim gi tr x, tr v ch s ca phn t u tin c tr=x,
tr v tr 1 (hoc n) nu khng tm thy, mng c th t tng dn
Tm kim tuyn tnh
int LinearSearch(const int a[], int n, int x)
{
for (int i=0; i<n && a[i]<x; i++)
if (a[i]==x) return i;
return 1;
}
Tm kim nh phn
int BinarySearch(const int a[], int n, int x)
{
int first=0, last=n-1, mid;
while(first<=last) {
mid = (first + last) / 2;
145
if (a[mid]<x)
first= mid + 1; // tm x phn na sau ca mng
else if (a[mid]>x) last = mid 1;
else // a[mid]==x
return i;
}
return 1;
}
5.6. Sp xp mng.
sp xp mng gm n phn t, ta tm cch t (n-1) phn t vo
ng v tr ca n theo tiu chun sp xp. ln xp phn t th i, ta
so snh phn t ny vi cc phn t cn li ca mng v thc hin i
ch khi cn thit tha mn tiu chun sp xp. Cui cng ta c mt
mng c xp th t.
a. Phng php sp xp n gin (simple sort)
Ni dung phng php: bc th i (i=0, 1, . . . , n-2) ta so snh
phn t a[i] vi cc phn t a[j] cn li (j=i+1, . . . , n-1) xc nh
phn t nh nht, sau i ch phn t nh nht ny vi a[i].
void Swap (int &x, int &y)
{
146
int z = x;
x = y; y = z;
}
void SimpleSort(int a[], int n)
{
int i, j;
for (i=0; i<n-1; i++)
for (j=i; j<n; j++)
if (a[i] > a[j])
swap(a[i],a[j]);
}
b. Phng php sp xp la chn (selection sort)
void SelectionSort(int a[], int n)
{
int i, j, min, tam;
for (i=0; i<n-1; i++)
{
tam = a[i];
147
min = i;
for (j=i; j<n; j++)
if (a[min] > a[j]) min = j;
a[i] = a[min];
a[min] = tam;
}
}
c. Phng php sp xp ni bt (bubble sort)
Ni dung phng php: bc th i (i=0, 1, . . . , n-2) ta ln
lt so snh tng cp phn t a[j], a[j-1], vi (j=i+1, . . . , n-1), sau
i ch 2 phn t ny nu a[j-1]>a[j].
void BubbleSort(int a[], int n)
{
int i, j;
for (i=0; i<n-1; i++)
for (j=n-1; j>i; j--)
if (a[j-1] > a[j])
swap(a[j-1],a[j]);
}
148
d. Phng php sp xp chn (insertion sort)
Ni dung phng php: Gi s dy con (a[0] . . a[i-1]) c
sp. bc th i (i=1, . . ., i<n-1), ta xc nh v tr thch hp ca a[i]
chn vo dy con c sp th t bng phng php tm kim
tun t t a[i] tr v a[0].
void InsertionSort(int a[], int n)
{
int i, j, tam;
for (i=1; i<n; i++)
{
tam = a[i];
for (j=i-1; j>=0; j--) {
if (a[j]<=tam) break;
a[j+1] = a[j];
}
a[j+1] = tam;
}
}
149
e. Phng php sp xp l tng chn gim
Ni dung phng php: Cch tin hnh ging nh thut ton
simple sort, ch khc tiu chun so snh thc hin vic hon i
tr ca cc phn t.
6. Cu hi
Nu li ch ca vic dng mng.
Nu cch khai bo v khi to gi tr cho bin mng mt
chiu, bin mng hai chiu.
Nu cch truyn tham s mng cho hm, cch gi hm c
tham s mng.
Trnh by cc thao tc c bn trn kiu mng (1 chiu):
Nhp/Xut gi tr cho cc phn t mng
Thm phn t mi vo mng
Xa mt phn t trong mng tha tiu chun P no .
Tm kim trn mng
Sp xp mng.
7. Bi tp
Mng 1 chiu
1) Cho trc n>0. Lit k tt c cc s nguyn t n dng
phng php sng Erathosthene.
2) Cho trc mng nguyn kch thc MAX=100. Cho trc
tiu chun P (V d: L s chn, L s dng, L s
chnh phng, L s nguyn t, ). Xy dng cc hm
sau y v vit chng trnh p dng:
150
Lit k tt c cc phn t mng tha tiu chun P.
m s lng cc phn t mng tha tiu chun P.
Tnh tng cc phn t mng tha tiu chun P.
Tnh trung bnh tng cc phn t mng tha tiu chun
P.
Cho trc mng nguyn kch thc MAX=100. Vit
chng trnh thng k s ln xut hin cc phn t trong
mng.
3) Cho trc mng nguyn c kch thc gm MAX=100.
Vit cc hm sau y:
Khi to gi tr cho cc phn t ca mng (nhp t bn
phm).
Khi to gi tr ngu nhin cho cc phn t ca mng,
mi phn t c tr trong on [ab], vi 0<a<b.
Khi to gi tr ngu nhin cho cc phn t ca mng,
sao cho mng c th t tng dn.
Xut gi tr ca cc phn t ca mng ra mn hnh.
Kim tra mng c th t tng ? gim ? hay khng c th
t?
o ngc th t cc phn t trong mng.
Xoay tri/phi cc phn t trong mng k>0 ln.
Tm kim gi tr x trong mng.
Xa phn t u tin trong mng tha tiu chun P.
Xa tt c cc phn t trong mng tha tiu chun P.
Sp xp mng theo th t tng dn.
Sp xp mng theo th t l tng chn gim.
151
Sp xp theo th t tng dn v loi b cc phn t trng
nhau.
m s dy con tng dn trong mng v xut cc dy con
ny ra mn hnh, mi dy con trn 1 dng.
Xut dy con tng dn c s lng phn t nhiu nht.
Xut dy con tng dn c tng cc phn t ln nht.
Vit chng trnh p dng cc hm xy dng trn.
4) Cho trc mng nguyn c kch thc gm MAX=100.
Vit chng trnh sp xp mng theo th t tng, ng thi
loi b cc phn t trng nhau.
5) Vit chng trnh trn 2 mng nguyn c th t
tng/gim dn, thnh mng nguyn mi cng c th t
tng/gim dn.
6) Vit hm v biu ng, v hm v biu ngang. Vit
chng trnh p dng.
V d, vi mng nguyn int a[5]={4, 7, 10, 6, 3} ta c:
Biu ngang Biu ng
* * * * *
* * * * * * * *
* * * * * * * * * * *
* * * * * * * *
* * * * * *
152
* * *
* * * *
* * * * *
* * * * *
* * * * *
Mng 2 chiu
1) Vit chng trnh in ma phng bc l.
2) Vit chng trnh in mng 2 chiu kch thc MAX*MAX
theo th t xon c sau:
V d, vi MAX = 4:
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
3) Tng t nh bi trn, vit chng trnh sp xp mng 2
chiu theo th t xon c vi cc phn t mng c tr ngu
nhin.
4) Vit chng trnh xc nh cc phn t yn nga (nu
c) ca mng 2 chiu cho trc. Phn t yn nga c gi
tr min dng v max ct hoc max dng v min ct.
153
CHNG 6. CON TR (POINTER)
1. Khi nim
Con tr (Pointer) l kiu d liu c bit, c gi tr l a ch
vng nh ca mt i tng (bin, hm).
Tng ng vi mi kiu d liu s c mt kiu bin tr
ring bit. VD ta c con tr char*, int*, float*, double*, . . .
cha a ch ca bin char, int, float, double.
Tu theo h my, kch thc ca bin tr l 2 bytes (h my
PC) hoc 4 bytes (h my tnh ln).
Bin tr cho php truy xut i tng mt cch gin tip, i.e.
thm chiu n 1 i tng khc thng qua a ch ca n.
Vic cp pht ng cho mng c thc hin thng qua con
tr.
nm bt kiu con tr, cn phn bit ni dung ca vng
nh v a ch ca n.
2. Khai bo bin con tr
<type> * <tn bin tr>;
trong :
<type> l kiu d liu ca bin m con tr ang tr n,.
<tn bin tr> l danh hiu hp l.
Nh vy, <type> * l kiu con tr.
Cng nh cc kiu d liu khc, ta c th khai bo ng thi khi
to gi tr cho bin tr nh sau:
154
int x;
int *px = &x; // px cha a ch ca bin x.
Ch :
int *px, x, *py, y;
3. Truy xut bin tr
Sau khi khai bo bin tr, ta c th truy xut n thng qua tn bin
nh mt bin thng thng. Khi , ta c gi tr (ni dung) ca bin
tr l a ch ca mt vng nh no . Nu mun truy xut ni dung
ca vng nh m bin tr ang tr n, ta dng ton t * (gi l kh
tham chiu dereference) t trc tn bin tr nh sau:
*<tn bin tr>
Gi s c cc khai bo sau:
int x =5, y= 7;
int *px, *py;
Ta c th gn tr ca px, py nh sau:
px = &x;
py = &y;
Cc bin x, y c th c truy xut gin tip nh sau:
*px = 2; // tng ng vi cu lnh gn x = 2;
155
*py = 3; // tng ng vi cu lnh gn y = 3;
Ch :
Cn phn bit
*px = *py; //gn tr ca vng nh m py ang tr n cho vng
nh m px ang tr n.
vi
px = py; //sau lnh ny px v py cng tr n cng 1 vng nh.
Con tr NULL l con tr khng cha a ch ca bt k vng nh
no. Nn khi to gi tr NULL hoc a ch ca vng nh no cho
bin tr lc khai bo. Cn lu , vic truy xut vng nh thng qua
con tr NULL l li v c php.
int *py = NULL; // py khng tr n bt k vng nh no.
Con tr void * l con tr a nng, v tng thch vi mi kiu d
liu m 1 bin tr tr n, i.e. ta c th gn gi tr ca con tr thuc
mt kiu bt k no cho con tr void *. Khng c php thc
hin cc php tnh s hc trn con tr void*.
4. S hc con tr
Ngoi php gn tr ca 1 bin tr cho bin tr khc cng kiu vi
n, ta c th thc hin cc php ton s hc sau trn bin tr:
156
Php cng con tr ptr vi mt s nguyn N s cho kt qu a
ch vng nh cch con tr ptr N v tr nh sau: (v hnh)
Php tr 2 bin tr cng kiu ptr1 v ptr2 s cho kt qu khong
cch (s phn t) gia 2 bin tr trn nh sau: (v hnh)
Php so snh 2 con tr cng kiu vi nhau c thc hin da
trn v tr vng nh tng ng vi 2 bin tr (v kt qu tr v l tr 0
hoc 1).
5. Lin h gia con tr v mng
Do tn bin mng l 1 gi tr hng a ch ca phn t u tin ca
mng, nn ta c th gn gi tr a ch ny cho con tr c kiu nn
cng kiu vi kiu c s ca bin mng.
Gi s c cc khai bo sau:
int a[5];
int *pa=a;
Khi , ta c th truy xut cc phn t mng v a ch ca chng
nh sau:
a[0] *(a+0) *(pa+0) pa[0] &a[0] a+0 pa+0
&pa[0]
a[1] *(a+1) *(pa+1) pa[1] &a[1] a+1 pa+1
&pa[1]
a[2] *(a+2) *(pa+2) pa[2] &a[2] a+2 pa+2
&pa[2]
157
a[3] *(a+3) *(pa+3) pa[3] &a[3] a+3 pa+3
&pa[3]
a[4] *(a+4) *(pa+4) pa[4] &a[4] a+4 pa+4
&pa[4]
6. Con tr a cp
Bn thn bin tr cng c a ch, do ta c th cha a ch ca
n trong 1 bin tr khc. Ta gi bin tr ny l con tr tr n con tr,
hay con tr 2 cp. S lng du * xc nh cp ca 1 bin tr. Ta c
con tr 2 cp, con tr 3 cp, . . .
Con tr 2 cp c lin quan mt thit vi mng 2 chiu.
Gi s c cc khai bo sau:
int a[2][3];
int **ppa = new int*[2];
ppa[0] = a[0];
ppa[1] = a[1];
Khi , ta c th truy xut cc phn t mng nh sau:
a[0][0] *(*(a+0)+0) *(*(ppa+0)+0) ppa[0][0]
a[0][1] *(*(a+0)+1) *(*(ppa+0)+1) ppa[0][1]
a[0][2] *(*(a+0)+2) *(*(ppa+0)+2) ppa[0][2]
a[1][0] *(*(a+1)+0) *(*(ppa+1)+0) ppa[1][0]
158
a[1][1] *(*(a+1)+1) *(*(ppa+1)+1) ppa[1][1]
a[1][2] *(*(a+1)+2) *(*(ppa+1)+2) ppa[1][2]
truy xut a ch cc phn t mng:
&a[0][0] &(a+0) &(ppa+0)
&a[0][1] &(a+0) &(ppa+1)
&a[0][2] &(a+0) &(ppa+2)
&a[1][0] &(a+1) &(ppa+0)
&a[1][1] &(a+1) &(ppa+1)
&a[1][2] &(a+1) &(ppa+2)
7. Truyn tham s con tr cho hm
Trong phn khai bo v nh ngha hm, ta khai bo kiu d liu
con tr l <type> *.
Cn trong li gi hm, ta phi cung cp biu thc c tr l a ch
ca vng nh cng kiu vi kiu ca tham s bin tr tng ng.
V d: hm Swap( int*, int* ); // c 2 tham s l bin tr
8. Mng cc con tr
Kiu phn t ca bin mng c th l kiu con tr Khi ta s c
mt mng cc con tr, v ta c th xem cc bin c a ch cha trong
cc phn t mng con tr l mt mng, nhng c vng nh khng
lin tc. (V hnh)
159
9. T kha const vi con tr
Ta bit mt cng dng ca t kha const trong vic nh ngha
mt bin hng. Khi ta khai bo const int MAX = . . .; th TBD s cp
pht vng nh cho hng MAX ( y l 2 bytes) v khng cho php
USER thay i gi tr ca MAX trong chng trnh.
Tng t, cc khai bo sau:
// px v *px c th thay i gi tr.
<datatype>* px;
// px l con tr tr n vng nh c gi tr khng i, i.e. px c th
thay i, *px th khng c php thay i.
const <datatype>* px;
// px l con tr hng, i.e. *px c th thay i, px th khng c
php thay i.
<datatype>* const px;
// px l con tr hng tr n vng nh c gi tr khng i.
const <datatype>* const px;
160
10. Cp pht ng
Cp pht ng l cp pht vng nh lc thc hin chng trnh.
Cn cp pht vng nh lc bin dch c gi l cp pht tnh.
Vng nh ca cc i tng (bin) cp pht ng s c t ti
HEAP. Vic cp pht ng c thc hin nh vo cc hm cp pht
b nh sau:
Trong C, dng cc hm malloc( . . . ), calloc( . . . ), realloc( . . . ), .
. . c khai bo trong <alloc.h>, <stdlib.h>
// size_t l kiu d liu nh ngha trong <stdlib.h> v tng
ng vi mt unsigned int.
void* malloc(size_t size);
void* calloc(size_t nitems, size_t size);
void* realloc(void * ptr, size_t size);
Trong C++, dng ton t new :
// xin cp pht vng nh trn HEAP c kch thc =
sizeof(<type>)
<bin> = new <type>;
// xin cp pht vng nh trn HEAP kch thc =
sizeof(<type>)*n
<bin> = new <type>[n];
161
Khi khng cn s dng cc vng nh cp pht ng, ta phi thu
hi chng, c th s dng vo vic khc. Nu khng lm nh vy
th b nh s nhanh chng cn kit. Vic thu hi cc vng nh cp
pht ng c thc hin nh vo hm sau:
Trong C, dng hm free(ptr) , vi ptr l bin tr ch n vng nh
c cp pht ng bng cc hm malloc(), calloc(),
realloc()
Trong C++, dng ton t delete:
delete <bin>;
delete [] <bin>;
// Chng trnh cp pht ng mng mt chiu
#include <iostream.h>
#include <iomanip.h>
#include <stdlib.h>
#include <alloc.h>
void randomInit( int* a, int n );
void output( const int* a, int n );
void main() {
int* a;
int n;
162
cout << Cho bit s phn t ? : ; cin >> n;
// a = (int* ) calloc( n, sizeof( int ) );
a = new int [ n ];
randomInit( a, n );
output( a, n );
// free( a );
delete [] a;
}
void randomInit( int* a, int n ) {
for ( int i = 0; i < n; i++ )
a[ i ] = rand()% 100;
}
void output( const int* a, int n ) {
for ( int i = 0; i < n; i++ )
cout << setw( 4 ) << a[ i ];
cout << endl;
// Chng trnh cp pht ng mng 2 chiu
#include <iostream.h>
163
#include <iomanip.h>
#include <stdlib.h>
#include <alloc.h>
void randomInit( int** a, int m, int n );
void output( const int** a, int m, int n );
void main() {
int** a;
int m, n;
cout << Cho bit s dng ? : ; cin >> m;
cout << Cho bit s ct ? : ; cin >> n;
a = new int [ m ];
for ( int i = 0; i < m; i++ )
a[ i ] = new int [ n ];
randomInit( a, m, n );
output( a, m, n );
for ( i = 0; i < m; i++ )
delete [] a[ i ];
delete [] a;
164
}
void randomInit( int** a, int m, int n )
{
for ( int i = 0; i < m; i++ )
for ( int j = 0; j < n; j++ )
a[ i ][ j ] = rand()% 100;
}
void output( const int** a, int m, int n )
{
for ( int i = 0; i < m; i++ )
{
for ( int j = 0; j < n; j++ )
cout << setw( 4 ) << a[ i ][ j ];
cout << endl;
}
}
11. Con tr hm
Trong NNLT C/C++, tn hm l a ch vng nh ca ch th
u tin ca hm v do ta c th gn gi tr a ch ny cho 1 bin
165
tr c kiu nn cng kiu vi kiu gi tr tr v ca hm. Ta gi con
tr ny l con tr hm. Ta c th gi thc hin mt cch gin tip mt
hm no thng qua con tr hm. Mt khc, mt hm no c th
c dng lm tham s cho mt hm khc nh vo con tr hm.
Con tr hm c khai bo nh sau:
<type> (* <tn con tr hm>) ([Danh sch cc tham s]);
Gi s c cc khai bo sau:
int a, b;
void swap( int* px, int* py );
void (* pf) ( int *, int* );
Khi ta c th gi thc hin hm swap mt cc gin tip nh
sau:
pf = swap;
pf( &a, &b );
12. Con tr v chui k t
Chui ( string ) l mt dy cc k t lin tip trong b nh c
kt thc bng k t NUL (\0). Nh vy s dng bin chui cha
MAX k t, ta khai bo nh sau: char s[MAX+1];
Ta cng c th khai bo bin chui nh sau:
char* s;
166
C th khi to bin chui nh sau:
char s[ ] = Hello C++;
C th nhp/xut chui k t bng lnh cin ( dng km vi >> ) v
cout ( dng km vi << ). Tuy nhin cn lu , lnh cin >> s; ch cho
php nhp vo chui k t khng c khong trng.
Hm nhp chui ca i tng cin:
// c cc k t t cin vo s, k c k t khong trng.
getline( char* s, int size, char delim=\n );
read( char* s, int size ); // cin.read( s, 5 );
// cho php c tng k t t cin vo trong ch v tr v tr 1. Hm
tr v tr 0 nu gp k t \n.
get( char ch );
Hm xut chui ca i tng cout:
put( char ); // cout.put( ch ).put( ch );
write( const char* s, int size ); // cout.write( s, 1 ).write( s+1, 2
);
Mt s hm thng dng khai bo trong <string.h> cho php thao
tc, x l chui t t:
size_t strlen( const char* s );
167
int strcmp( const char* s1, const char* s2 );
int strcmpi( const char* s1, const char* s2 );
char* strcpy( char* dest, const char* src );
char* strcat( char* dest, const char* src );
13. ng dng con tr
Sp xp mng cc con tr
Danh sch lin kt
Cp pht mng ng
14. S lc v kiu tham chiu (Reference) - Ch c trong C++.
NNLT C++ cung cp kh nng tham chiu n a ch vng nh
ca bin tn ti trc . V bn cht, tham chiu l b danh ca
mt i tng (bin) xc nh trong chng trnh.
Sau khi khai bo 1 bin, ta c th khai bo bin tham chiu n
bin nh sau:
int x;
int &rx = x; // rx l bin tham chiu n bin x.
Sau cu lnh trn, ta c th xem rx l tn gi khc (b danh) ca
bin x.
168
Ch , bin kiu tham chiu phi tham chiu n mt bin tn
ti, i.e. bin khai bo trc. Khng th c khai bo bin tham chiu
nh sau:
int ℞ // sai !! rx l b danh ca bin no ???
Ta thng dng kiu tham chiu trong vic truyn tham s cho
hm. Cc tham s thc tng ng (theo v tr) c th b thay i gi tr
ngay bn trong hm.
V d: hm swap(int &, int &);
Hng tham chiu khc c th tham chiu n mt bin hay mt
hng trc kin no . V d, ta c cc khai bo sau:
int x = 5, y = 7;
const int &rx = 123; // ok
const int &ry = y;
ry++; // sai
Tuy nhin hng tham chiu khc vi bin tham chiu ch: ta
khng th dng hng tham chiu lm thay i vng nh m n
tham chiu n.
15. Bi tp
1) Gi s c cc khai bo sau:
int i1 = 11,
169
i2 = 22;
double d1 = 3.45,
d2 = 6.78;
Vit cc khai bo sao cho bin p1 v p2 c gi tr ca n
l a ch trong b nh, ni m mt gi tr double c th
cha.
Vit cu lnh gn a ch ca d1 cho p1, hoc gii
thch ti sao iu ny khng th thc hin.
Vit cu lnh gn a ch ca i2 cho p2, hoc gii thch
ti sao iu ny khng th thc hin.
Vit cc khai bo khi to bin ptr1 v ptr2 tr n i1
v i2 tng ng.
Vit cu lnh p1 v p2 tr n cng mt a ch.
Vit cu lnh chp gi tr c cha ti a ch m
ptr2 tr n vo a ch m ptr1 tr n.
Vit cc cu lnh s dng p1 v p2 hon i gi tr ca
d1 v d2.
2) Vit chng trnh C++ thc hin tng bc cc yu cu
sau:
Khai bo bin con tr kiu char c tn l charPtr.
3) Cp pht mt vng nh nc danh v cho charPtr tr n .
4) Nhp mt k t v cha n vo vng nh nc danh.
5) Hin th ni dung trong vng nh nc danh.
6) Nu ni dung ca vng nh nc danh l k t hoa th
chuyn thnh k t thng v hin th kt qu ra mn hnh.
170
7) Vit chng trnh C++ thc hin tng bc cc yu cu
sau:
Khai bo bin con tr kiu double c tn l doublePtr.
Cp pht vng nh nc danh cho mt mng c n (nhp t
bn phm) phn t kiu double v cha a ch ca n vo
doublePtr.
Nhp gi tr cho tt c cc phn t trong mng.
Tnh v hin th trung bnh cng cc gi tr trong mng.
Gii phng vng nh cp pht cho mng.
Hin th a ch v gi tr ca 3 phn t u tin trong
mng c vng nh va c gii phng.
8) Vit chng trnh khi to mt con tr tr n mng
unsigned int c 20 phn t. Sau gn gi tr cho cc phn
t trong mng l nhng s chn bt u t 2, hin th cc
gi tr ny ra mn hnh theo nhiu cch khc nhau (nu c
th) thnh 4 dng, mi dng c 5 phn t.
9) Vit chng trnh c tn l binary khi thc hin ti du
nhc lnh
10) C:\>binary DecimalValue
11) chng trnh s tnh v hin th gi tr nh phn ng vi gi
tr thp phn nhp. Trong , DecimalValue l gi tr
thp phn 2 byte (32768 n 32767).
12) Gi tr trung bnh ca mt dy c n s l mt s thc v
c nh ngha l gi tr m n c n/2 gi tr ln hn n,
v n/2 gi tr nh hn n. Vit chng trnh c tn l
median khi thc hin ti du nhc lnh
13) C:\>median FileName
171
14) chng trnh s tnh v hin th gi tr trung bnh ca cc
gi tr trong tp tin FileName, nhng nu g lnh
15) C:\>median
16) chng trnh s tnh v hin th gi tr trung bnh ca n (2
n 10) gi tr c nhp t bn phm.
17) Vit chng trnh thc hin sao chp tp tin File1 thnh
tp tin File2:
18) C:\>copy File1 File2
19) Vit chng trnh khi thc hin lnh
20) C:\>page File
21) th ni dung tp tin c ch nh s hin th ln mn hnh
theo tng trang (23 dng), ngi s dng c th n phm
bt k xem trang k tip.
22) Vit chng trnh x l chui k t bao gm cc chc nng
sau: (Ch : dng con tr ci t v khng c dng
hm th vin)
Tnh chiu di ca chui nhp.
Sao chp 2 chui vi nhau.
So snh 2 chui vi nhau.
Tm mt k t trong chui nhp.
Tm chui con trong chui nhp.
Thm chui con vo trong chui nhp ti v tr k.
Xo chui con trong chui nhp.
Loi b cc khong trng tha (k t Space, Tab) trong
chui nhp.
Chun ha chui nhp.
o ngc chui nhp.
172
Kim tra 2 chui nhp c gm cng cc k t hay khng ?
Kim tra chui nhp c i xng hay khng ?
Kim tra chui nhp c tun hon hay khng ?
m tn s xut hin ca cc k t trong chui nhp.
m s t trong chui nhp.
m s k t, s t v s dng trong chui nhp.
Chuyn t cui cng thnh t u tin trong chui nhp.
23) Vit chng trnh khai bo chui c tn l last_first c ni
dung l Smith, Bill, sau tch tn v h ca chui ny
ri kt hp chng li thnh Bill Smith v gn cho
chui first_last. Hin th hai chui ra mn hnh.
24) nh ngha mt hm c ba tham s, mi tham s l mt
chui k t gm: tn, tn lt, v h. Hm ny tr v mt
chui cha ba tham s trn theo th t h, tn, v k t u
ca tn lt. V d, nu ba tham s ln lt c ni dung l
John, Quincy, v Doe th hm tr v chui Doe,
John Q.. Vit chng trnh p dng.
25) Tng t nh cu 2, nhng nh ngha hm ch c mt
tham s. V d, nu tham s c ni dung l John Quincy
Doe th hm tr v chui Doe, John Q..
26) nh ngha mt hm nhn vo s th t ca mt thng v
tr v tn ca thng . Vit chng trnh p dng.
27) nh ngha mt hm nhn vo tn ca mt thng v tr v
s th t ca thng . Vit chng trnh p dng.
28) nh ngha hai hm: hm th nht chuyn chui k t bt
k thnh chui k t thng, hm th hai chuyn thnh
chui k t hoa. Vit chng trnh p dng.
173
29) Vit chng trnh c nh ngha mt hm vi tn l
replace_all, biu thc replace_all(str, substring,
newSubstring) tr v mt chui m tt c nhng xut hin
ca substring trong str c thay th bng newSubstring.
30) Mt chui c gi l i xng (palindrome) nu n khng
thay i khi th t ca cc k t c o ngc. V d:
madam, 463364, ABLE WAS I ERE I SAW ELBA l cc
chui i xng. Vit hm nhn vo mt chui v cho bit
chui ny c i xng khng. Vit chng trnh p dng.
31) Vit chng trnh c nh ngha mt hm nhn vo hai
chui v cho bit chui th nht c phi l mt hon v ca
cc k t trong chui th hai hay khng. V d chui
dear l mt hon v ca chui read hay dare.
32) Khng s dng cc hm th vin x l chui ca C++. Gi
s chiu di chui khng ln hn 80 k t v chui c
nhp t bn phm. Hy vit chng trnh c nh ngha cc
hm cho mi yu cu sau:
Sao chp chui s1 sang chui s2. Hin th hai chui ln
mn hnh.
Ly n (gi tr nhp) k t u tin ca chui ngun, hin
th chui ngun v chui kt qu ra mn hnh.
Ly n (gi tr nhp) k t cui cng ca chui ngun,
hin th chui ngun v chui kt qu ra mn hnh.
Chn mt chui vo chui khc ti v tr c ch nh
(nu v tr ch nh khng hp l th chng trnh s
khng thc hin thao tc ny). Hin th chui kt qu ra
mn hnh.
174
Xo mt s k t trong mt chui ti v tr bt u v s
k t cn xo c ch nh (cn kim tra tnh hp l ca
hai tham s ny). Hin th chui cn li ra mn hnh.
33) Vit chng trnh c vo mt chui ti a 80 k t v
nh ngha cc hm thc hin cc yu cu sau:
Hin th s ln m k t xut hin trong chui. Cc k
t c sp theo th t alphabet. V d nhp Le Van B,
th hin th k t 'a' c mt ln, 'b' c mt ln, 'c' khng
c, ...
Hin th s ln m cc t mt k t, hai k t, ba k t, ...
xut hin trong chui. Gi s chiu di ti a ca mt t
l 10 k t.
175
CHNG 7. KIU STRUCT
1. Khi nim
Khc vi kiu mng, struct l kiu d liu c cu trc bao gm
nhiu thnh phn c th thuc nhiu kiu d liu khc nhau.
Kiu struct cho php lu tr thng tin v mt i tng vi y
cc thuc tnh ca n trong mt bin. Mi thuc tnh l mt bin thnh
phn. Kiu d liu ca cc bin ny c th l kiu c s hay kiu
mng, thm ch mt kiu struct khc.
2. Khai bo v truy xut bin struct trong C
Cch 1:
struct <tn cu trc>{
<kiu> <tn bin thnh phn>;
};
struct <tn cu trc> <danh sch bin cu trc>;
Cch 2:
struct <tn cu trc>{
<kiu> <tn bin thnh phn>;
176
} <danh sch bin kiu struct>;
Cch 3:
struct {
<kiu> <tn bin thnh phn>;
} <danh sch bin kiu struct>;
Mi khai bo struct l s m t mt kiu d liu mi, v ch l s
m t cu trc khung chung cho mi bin th hin ca n. Mi bin
kiu struct sau khi khai bo u bao gm bn trong n cc thnh
phn thuc tnh c m t trong phn khai bo kiu struct. Cc thnh
phn thuc tnh ca mi bin th hin c th c truy xut nh vo
ton t du chm . nh sau:
<tn bin struct>.<tn bin thnh phn>
Du chm . c gi l ton t truy nhp thnh phn cu trc.
Nu bn thn thnh phn cu trc cng li l mt kiu struct khc th
vn p dng ton t ny xc nh thnh phn su hn trong cc cu
trc thnh phn.
<tn bin struct>.<tn bin struct thnh phn>.<tn bin tp>
177
3. Lnh typedef
Cho php t tn mi cho mt kiu d liu khai bo v nh
ngha trc:
typedef <tn kiu c> <tn mi>;
V d:
typedef unsigned char byte;
Sau cu lnh ny, byte l tn gi khc ca kiu unsigned char.
Khi , 2 khai bo sau y l tng ng nhau:
byte c;
v
unsigned char c;
Lnh typedef thng c s dng nh ngha cc kiu d liu
phc hp thnh mt tn duy nht. V d: lnh
typedef int * PTR_INT;
nh ngha kiu d liu con tr nguyn. Sau ny khi cn khai bo
mt con tr nguyn, ta ch cn vit:
PTR_INT px; // tng ng vi khai bo int * px;
178
Ta c th n gin cch vit khai bo bin cu trc bng cch s
dng lnh typedef nh sau:
typedef struct{
<kiu> <tn bin thnh phn>;
} <tn mi>;
V d: ta nh ngha phn s nh l kiu cu trc
typedef struct{
int tuso, mauso;
}PHANSO;
Sau , ta nh ngha cc bin kiu PHANSO
PHANSO ps1, ps2;
4. Kiu enum
Cho php dng danh hiu t tn cc gi tr nguyn mt
cch gi nh. Cc tr nguyn trong enum c bt u t tr
0, tr khi xc nh r tr khc. Cc tr nguyn k tip c gi
tr bng tr nguyn trc cng thm mt.
Khai bo
179
enum <tn kiu enum>{Danh sch cc tr nguyn};
V d:
enum Weekdays{Sunday, Monday, Tuesday, Wedneday,
Thirsday, Friday, Satyurday};
Khi : Sunday c tr = 0, Monday c tr = 1, Tuesday c tr = 2,
5. Mng cc struct
const MAX = 20;
const MONHOC = 3;
typedef struct{
int d, m, y;
}NGAYSINH;
typedef struct{
char * ho;
char * ten;
NGAYSINH ngsinh;
float diem[MONHOC];
// . . . .
}SINHVIEN;
180
SINHVIEN sv[MAX];
6. Con tr tr n bin kiu struct
typedef struct{
<kiu> <tn bin thnh phn>;
} <tn mi>;
<tn mi> * <tn bin tr>;
V d:
typedef struct{
int tuso, mauso;
}PHANSO;
PHANSO *pps;
Ta truy xut cc bin thnh phn ca pps nh sau:
(*pps).tuso
(*pps).mauso
hay
181
pps->tuso
pps->mauso
7. Truyn tham s kiu struct cho hm
Truyn bng tham tr: chng trnh s chm i do phi tn thi
gian sao chp gi tr ca bin cu trc dng lm tham s thc cho
tham s hnh thc.
Truyn bng tham bin hay tham tr: d kch thc ca bin cu
trc c ln th a ch ca bin vn ch l kch thc ca a ch vng
nh.
8. Kiu union
Mt bin kiu union cng bao gm nhiu thnh phn ging nh
mt bin cu trc, nhng khc nhau ch: cc trng thuc tnh trong
bin cu trc c cp pht cc vng nh khc nhau, cn cc trng
ca bin union c cp pht chung vng nh. di ca bin union
bng di ca thnh phn di nht trong bin.
Khai bo bin union ging nh khai bo bin struct
V d:
typedef union
{
unsigned int n;
unsigned char ch[2];
182
}VAL;
VAL x;
x.n=0x1B1A;
khi :
ch[0] = 1A v ch[1]=1B
9. Bi tp
1) Cho trc mt thi im gi, pht, giy. Vit chng trnh
tnh thi im 1 giy sau, 1 giy trc.
2) Vit chng trnh tnh khong cch (s giy) gia 2 thi
im cho trc.
3) Cho trc mt b ngy, thng, nm. Vit chng trnh tnh
ngy hm sau, ngy hm trc.
4) Vit chng trnh tnh khong cch (s ngy) gia 2 b
ngy, thng, nm cho trc.
5) Vit chng trnh thc hin cc php tnh (+, -, *, /) trn
phn s.
6) Vit chng trnh thc hin cc php tnh (+, -, *, /) trn s
phc.
7) Vit chng trnh thc hin php cng, v php nhn 2 ma
trn.
183
CHNG 8. File
1. Gii thiu chung
File l c ch cho php lu tr d liu mt cch lu di, vi s
lng ln (v mt l thuyt l khng hn ch).
C++ xem File ch n thun l mt dy cc byte. File c nh
du kt thc bng k hiu c bit (CTRL+Z cho DOS v CTRL+D
cho UNIX, . . .)
c th lm vic vi File a, trc ht ta phi lin kt file vi
dng (stream) nhp/xut bng cch to ra i tng File thuc lp:
fstream (dng cho vic Vo/Ra File), ofstream(dng cho Ghi ra File),
ifstream (dng cho c File). Cc lp ny c khai bo trong tp tin
tiu <fstream.h>.
C 2 loi Vo/Ra file a c bn trong C++: Vo/Ra file nh
dng (formatted file I/O), v Vo/Ra file nh phn (binary file I/O)
Quy trnh thao tc file: m file kim tra x l file ng file
2. Thao tc trn kiu file
2.1. M File ( lin kt knh nhp/xut vi file a )
Dng hm thit lp: <fstream> filevar( <filename> );
Hoc dng hm thnh phn open ca i tng lung nhp/xut:
<fstream> filevar;
filevar.open( <filename>, <i/o mode> );
Cc ch m file:
184
Ch M t
ios::in M c ( mc nh cho
ifstream )
ios::out M ghi ( mc nh cho
ofstream )
ios::ate Bt u c/ghi cui file
ios::app Bt u ghi cui file
ios::trunc Ct b file (TRUNCate)
ios::nocreate Li nu file khng tn ti
ios::noreplace Li khi m ghi ra nu file
tn ti, tr khi ate hoc app
c thit lp
ios::binary M file trong ch nh phn (
mc nh l vn bn)
2.2. X l File
Trc khi c/ghi file, cn kim tra file c m thnh cng
hay khng: if (!file) else
Trong qu trnh lm vic vi file, cn dng hm kim tra kt thc
tp tin trong vng lp: while(!file.eof())
Vo/Ra k t: hm get() v put() lm cc hm thnh phn ca
ofstream v ifstream cho php c k t t file, v ghi k t ra file.
Vo/Ra file nh phn: hm read() v write() cho php thc hin
vic c/ghi mt s lng ln cc byte d liu t b m sang file.
Cc tham s cho hm read() v write() l a ch ca b m d liu
v kch thc ca chng. a ch phi p thnh kiu char v kch
thc c tnh bng byte.
185
Vo/Ra i tng (objects I/O): dng ch m file nh phn, v
cc hm read(), write().
Con tr file: mi i tng file kt hp vi n 2 gi tr nguyn
gi l get pointer ( con tr c ) v put pointer ( con tr ghi ). Hai gi
tr ny cho bit v tr c v v tr ghi hin ti ca con tr trong qu
trnh lm vic vi file. iu khin con tr file phc v cho vic
c/ghi file ti v tr ty , ta dng hm seekg(), seekp() ( di chuyn
con tr file n v tr mong mun), tellg(), tellp() ( c v tr hin
hnh ca con tr file). Hm seekg() v tellg() cho php thit lp v
kim tra con tr c, cn cc hm seekp() v tellp() thc hin tng t
i vi con tr ghi. Hm seekg() v seekp() c 2 tham s: tham s th
1 biu din lch (offset), tnh t v tr c th xc nh bi tham s
th 2 (ios::beg, ios::cur, ios:end)
2.3. ng File
Dng hm close() ca i tng file.
2.4. V d Vo/Ra File nh dng
Hm ghi file s nguyn
void WriteIntFile() {
ofstream outf( test.dat, ios::out );
if ( ! outf ) {
cerr << Cannot open file test.dat . . .\n;
exit( 1 );
186
}
for ( int i = 0; i < 100; i++ )
outf << i + 1 << ;
outf.close();
}
Hm c file s nguyn
void ReadIntFile() {
ifstream inf( test.dat, ios::in );
if ( ! inf ) {
cerr << Cannot open file test.dat . . .\n;
exit( 1 );
}
int i;
while ( ! inf.eof() ) {
inf >> i;
cout << setw( 4 ) << i;
}
inf.close();
187
}
Hm c/ghi file s nguyn
void IntFile() {
fstream file;
file.open( test.dat, ios::out | ios::in );
if ( ! file ) {
cerr << Cannot open file test.dat . . .\n;
exit( 1 );
}
for ( int i = 0; i < 100; i++ )
outf << i + 1 << ;
file.seekg( 0, ios::beg ); // ve dau file
while ( ! file.eof() ) {
inf >> i;
cout << setw( 4 ) << i;
}
file.close();
}
188
2.5. V d Vo/Ra k t
Hm ghi k t ra file
void ReadCharFile() {
ofstream outf( test.txt, ios::out );
if ( ! outf ) {
cerr << Cannot open file test.txt \n;
exit( 1 );
}
char str[] = KHOA TIN HOC;
int i = 0;
while ( s[ i ] ) {
outf.put( s[ i ] ); // outf << s[ i ]
i++;
}
outf.close();
}
Hm c k t t file
void ReadCharFile() {
189
ifstream inf( test.txt, ios::in );
if ( ! inf ) {
cerr << Cannot open file test.txt . . .\n;
exit( 1 );
}
char ch;
while ( ! inf.eof() ) {
inf.get( ch );
cout << ch;
}
inf.close();
}
2.6. V d Vo/Ra File nh phn
#include <iostream.h>
#include <fstream.h>
const int MAX = 100;
void main() {
int buffer[ MAX ] = { 0 };
190
for ( int i = 0; i < MAX; i++ )
buffer[ i ] = i;
ofstream outf( test.dat, ios::binary );
if ( ! outf ) {
cout << Cannot open file test.dat . . .\n;
exit( 1 );
}
outf.write( ( char* ) buffer, MAX * sizeof( int ) );
for ( i = 0; i < MAX; i++ )
buffer[ i ] = 0;
ifstream inf( test.dat, ios::binary );
if ( ! inf ) {
cout << Cannot open file test.dat . . .\n;
exit( 1 );
}
inf.read( ( char* ) buffer, MAX * sizeof( int ) );
for ( i = 0; i < MAX; i++ )
if ( buffer[ i ] = i ) {
191
cerr << Du lieu khong dung . . .\n;
return;
}
cout << Du lieu dung . . .\n;
}
3. Bi tp
1) Vit chng trnh ni hai tp tin vn bn, tp tin th hai
c ni vo cui tp tin th nht. Hin th ni dung ca
tp tin sau khi ni ra mn hnh. Tn hai tp tin c nhp
t bn phm.
2) Vit chng trnh c mt tp tin vn bn, tn tp tin c
nhp t bn phm. Sau m s t trong tp tin v hin
th ra mn hnh.
3) Vit chng trnh c mt tp tin vn bn, m s ln xut
hin ca mt chui (nu c) trong tp tin v hin th ra mn
hnh. Tn tp tin v chui cn tm c nhp t bn phm.
4) Vit chng trnh sao chp mt tp tin vn bn thnh mt
tp tin vn bn khc v mi dng trong tp tin ch phi
c nh s th t pha bn tri. Tn hai tp tin c
nhp t bn phm.
5) Vit chng trnh c mt tp tin vn bn c tn c nhp
t bn phm, m s k t trn mi dng. Chng trnh
phi hin th s dng, chiu di ca dng ngn nht, di
nht, v gi tr trung bnh ca cc k t trn mi dng.
192
6) Vit chng trnh chun ho mt tp tin vn bn thnh tp
tin khc, tn hai tp tin c nhp t bn phm. Chng
trnh s b nhng dng trng v khong trng d tha vi
qui c nh sau: Ch gi li mt khong trng sau du
phy hay du chm v c 5 khong trng cho mi u
dng. Gi s tp tin ch cha cc k t ch ci, khong
trng, du phy, v du chm.
7) Vit chng trnh c tp tin vn bn, m s k t khc
trng, s dng khc trng, s t, v s cu. Sau tnh
trung bnh s k t trn mi t v s t trn mi cu. Gi
s tp tin ch cha cc k t ch ci, khong trng, du
phy, du chm, du chm phy, v du hai chm. Mt t
l mt dy cc k t ch ci lin tip nhau, mt cu l mt
dy cc t c phn cch bng khong trng, du phy,
du chm phy, hay du hai chm v kt thc bng du
chm.
8) Vit chng trnh c tp tin vn bn v hin th ni dung
ca n trong mt khi c ti a 20 dng. Nu sau khi hin
th m ni dung tp tin vn cha c c ht th cn thng
bo cho ngi s dng bit c mun hin th khi k tip
khng. Ngc li, kt thc chng trnh.
9) Gi s mi dng trong tp tin vn bn cha thng tin v
mt sinh vin, bao gm: S th t (t 1 n 100), h tn,
v im (s thc). Vit chng trnh nhp mt s th t
t bn phm v hin th thng tin v sinh vin c s th t
tng ng.
193
TI LIU THAM KHO
1. Nguyn xun Huy, Thut ton, Nh xut bn Khoa Hc v K
Thut.
2. Hong Kim, Gii mt bi ton trn my tnh nh th no, Nh
xut bn Gio dc.
3. Nguyn Thanh Thy (ch bin), Nhp mn lp trnh Ngn
ng C, Nh xut bn Khoa hc v K thut.
4. Trn Vn Lng, Lp trnh hng i tng s dng C++, Nh
xut bn Thng K.
5. GS. Phm Vn t, C++ v lp trnh hng i tng, Nh
xut bn Khoa hc v K thut.
6. Nguyn Thanh Thy, Lp trnh hng i tng, Nh xut
bn Khoa hc v K thut.
7. T Oai Hng, Gio trnh C s lp trnh s dng ngn ng
C++, Ti liu lu hnh ni b (Trng i Hc M TP. HCM)
8. Joel Adams & Larry Nyhoff, C++ An Introduction to
Computing, Prentice Hall 2002, Third Edition.
9. H.M. Deiteil & P.J. Deitel, C++ How to Program, Prentice
Hall, New Jersey, 2003, Fourth Edition.
10. Bjarne Stroustrup, The C++ Programming Language,
Addition Wesley Longman, 1997, Third Edition.
194
Bin son L PH HIU