19. Nguy畛n C担ng Huy Khoa CNTT&TT 19
Hm v c畉u tr炭c ch動董ng tr狸nh
Hm
C炭 ph叩p :
<Ki畛u tr畉 v畛> <T棚n hm> (Danh s叩ch ki畛u v tham s畛)
{ [ Khai b叩o d畛 li畛u c畛c b畛 ]
[ Th但n hm ]
[ C但u l畛nh return ]
}
VD: int Max ( int x, int y) {
int somax;
somax = (x>y) ? x : y;
return somax;
}
20. Nguy畛n C担ng Huy Khoa CNTT&TT 20
Hm v c畉u tr炭c ch動董ng tr狸nh
Hm
Khai b叩o prototype :
<Ki畛u tr畉 v畛> <T棚n hm> ( Danh s叩ch ki畛u );
VD: int Max ( int , int );
int Min ( int , int );
void main() {
int a =10 , b =5;
cout<<So max= << Max(a,b)<<endl;
cout<<So min= << Min(a,b)<<endl;
}
int Max (int x , int y) { ... }
int Min (int x , int y) { ... }
21. Nguy畛n C担ng Huy Khoa CNTT&TT 21
Hm v c畉u tr炭c ch動董ng tr狸nh
Hm
C叩ch g畛i :
T棚n hm(tham s畛 theo th畛 t畛 t畛 tr叩i sang)
Tham s畛 v 畛i s畛:
int Max ( int x, int y) {
if(x>y) return x;
return y;
}
void main() {
int a =10 , b = 5;
cout<<So max= << Max ( a , b ) << endl;
}
Tham s畛 (h狸nh th畛c)
畛i s畛
(Tham s畛 th畛c t畉)
37. Nguy畛n C担ng Huy Khoa CNTT&TT 37
T叩i 畛nh ngh挑a hm
V鱈 d畛 1
int Max (int a, int b)
{ return (a>b) ? a : b; }
float Max (float a, float b)
{ return (a>b) ? a : b; }
SinhVien Max (SinhVien a, SinhVien b) {
return (a.diemtb > b.diemtb) ? a :
b; }
void main() {
int x1=1, y1=2;
float x2=3, y2=4;
long x3=5, y3=6;
cout << Max(x1,y1)<<t<<Max(x2,y2)<<endl;
cout << Max(x3,y1) <<endl;
cout << Max(x3,y2) <<endl;
cout << Max(x3,y3) <<endl;
}
38. Nguy畛n C担ng Huy Khoa CNTT&TT 38
T叩i 畛nh ngh挑a hm
V鱈 d畛 2
int F (int a=0, int b=1)
{ }
float F (float a=5, float b=9)
{ }
void main() {
int x1=1, y1=2;
float x2=3, y2=4;
long x3=5, y3=6;
cout << F(x1)<<t<<F(y2)<<endl;
cout << F(x3) << F() << endl;
}
39. Nguy畛n C担ng Huy Khoa CNTT&TT 39
Hm inline
L 1 hm nh動ng t叩c d畛ng t動董ng t畛 nh動 m畛t macro.
Kh畉c ph畛c 動畛c c叩c nh動畛c i畛m c畛a hm v macro.
Gi畉m th畛i gian th畛c thi ch動董ng tr狸nh.
Tng k鱈ch th動畛c c畛a m達 l畛nh th畛c thi.
Ch畛 n棚n 畛nh ngh挑a inline khi hm c坦 k鱈ch th動畛c nh畛.
C炭 ph叩p : th棚m t畛 kh坦a inline vo tr動畛c hm.
VD: inlineinline float sqr(float x) {
return (x*x);
}
inlineinline int Max(int a, int b) {
return ((a>b) ? a : b) ;
}
40. Nguy畛n C担ng Huy Khoa CNTT&TT 40
Tham chi畉u
Kh叩i ni畛m
L 1 lo畉i 畛i t動畛ng d畛 li畛u tham chi畉u 畉n 1
畛i t動畛ng c坦 s畉n.
L 1 b鱈 danh nh動 con tr畛, nh動ng kh担ng c畉n c坦
t叩c t畛 *.
VD: int x = 10;
int *px; px = &x;
int &rx = x;
3 c叩ch thay 畛i gi叩 tr畛 c畛a x :
x = 5;
*px = 5;
rx = 5;
1010
1036H
x
10361036
1080H
*px
&rx
41. Nguy畛n C担ng Huy Khoa CNTT&TT 41
Tham chi畉u
Tham chi畉u d湛ng nh動 m畛t bi畉n
Kh畛i t畉o : int x=5; int &rx = x;
int &a; int &b=5; // SAI
Tham chi畉u h畉ng : kh担ng th畛 s畛a 畛i gi叩 tr畛.
const int &n=10;
<=> int x=3; const int &n=x;
n=5; // B叩o l畛i v狸 n l炭c ny l h畉ng s畛
G叩n tr畛 l畉i :
Kh担ng th畛 s畛a 畛i 畛i t動畛ng tham chi畉u.
Ch畛 l thay 畛i gi叩 tr畛.
int x = 5, y = 20; int &rx = x;
rx = y; // Ch鱈nh l g叩n x=20
// kh担ng ph畉i l rx tham chi畉u 畉n y
42. Nguy畛n C担ng Huy Khoa CNTT&TT 42
Tham chi畉u
Tham chi畉u d湛ng nh動 畛i s畛 c畛a hm
Lm thay 畛i gi叩 tr畛 c畛a tham s畛.
H畛u 鱈ch cho hm tr畉 v畛 nhi畛u k畉t qu畉.
Ti畉t ki畛m 動畛c 担 nh畛 trung gian (tham s畛 h狸nh th畛c)
trong hm.
void Nhap (int& a, float& b) {
cout<< Nhap tham so 1 : ; cin>>a;
cout<< Nhap tham so 2 : ; cin>>b;
}
void main() {
int n; float m;
Nhap( n , m );
}
43. Nguy畛n C担ng Huy Khoa CNTT&TT 43
Tham chi畉u
Tham chi畉u d湛ng nh動 tr畛 tr畉 v畛 c畛a hm
畛i t動畛ng tr畉 v畛 v畉n b畛n v畛ng khi hm k畉t th炭c.
Tr畛 tr畉 v畛 l 1 畛i t動畛ng ton c畛c hay 1 v湛ng nh畛 c畛c
b畛.
VD: long a[1000];
long& GiaTri(int i) { return a[i]; }
void main() {
GiaTri(1) = 1; GiaTri(2) = 1;
for( int i= 3; i<1000; i++)
GiaTri(i) = GiaTri(i-1) + GiaTri(i-2);
}
=> ch l畛i : che i c叩ch bi畛u di畛n c畛a d畛 li畛u.
( Ch畉ng h畉n : ta 畛i l畉i d湛ng CTDL l danh s叩ch li棚n k畉t
=> ch畛 vi畉t l畉i hm GiaTri(int ) m th担i )
44. Nguy畛n C担ng Huy Khoa CNTT&TT 44
Truy畛n tham s畛
Truy畛n theo gi叩 tr畛
Gi叩 tr畛 tham s畛 khi ra kh畛i hm s畉 kh担ng thay 畛ikh担ng thay 畛i.
void Swap1(int a, int b) {
int temp = a;
a = b;
b = temp;
}
void main(){
int x = 5, y = 10;
Swap1( x , y );
cout << x = << x
<< y = << y
<< endl;
}
55
1010
xx
yy
aa
bb
mainmain Swap1Swap1
STEPSTEP
0101
55
1010
xx
yy
55
1010
aa
bb
mainmain Swap1Swap1
STEPSTEP
0202
55
1010
xx
yy
1010
55
aa
bb
mainmain Swap1Swap1
STEPSTEP
0303
45. Nguy畛n C担ng Huy Khoa CNTT&TT 45
Truy畛n tham s畛
Truy畛n theo 畛a ch畛 (con tr畛)
Gi叩 tr畛 tham s畛 khi ra kh畛i hm c坦 th畛 thay 畛ic坦 th畛 thay 畛i.
void Swap2(int* a, int* b) {
int temp = *a;
*a = *b;
*b = temp;
}
void main(){
int x = 5, y = 10;
Swap2( &&x , &&y );
cout << x = << x
<< y = << y
<< endl;
}
55
1010
xx
yy
aa
bb
mainmain Swap2Swap2
STEPSTEP
0101
100
200
55
1010
xx
yy
100100
200200
aa
bb
mainmain Swap2Swap2
STEPSTEP
0202
100
200
1010
55
xx
yy
100100
200200
aa
bb
mainmain Swap2Swap2
STEPSTEP
0303
100
200
46. Nguy畛n C担ng Huy Khoa CNTT&TT 46
Truy畛n tham s畛
Truy畛n theo tham chi畉u:
Gi叩 tr畛 tham s畛 khi ra kh畛i hm c坦 th畛 thayc坦 th畛 thay 畛i.
void Swap3(int&& a, int&& b) {
int temp = a;
a = b;
b = temp;
}
void main(){
int x = 5, y = 10;
Swap3( x , y );
cout << x = << x
<< y = << y
<< endl;
}
55 1010xx yy
mainmain
STEPSTEP
0101
aa bb
Swap3Swap3
1010 55xx yy
mainmain
STEPSTEP
0202
aa bb
Swap3Swap3
1010 55xx yy
mainmain
STEPSTEP
0303