NGÔN NGỮ LẬP TRÌNH (1)
-
Upload
nguyen-van-thuan -
Category
Documents
-
view
239 -
download
0
Transcript of NGÔN NGỮ LẬP TRÌNH (1)
-
8/13/2019 NGN NG LP TRNH (1)
1/137
NGN NG LP TRNH
C/C++
V Song Tng
1
-
8/13/2019 NGN NG LP TRNH (1)
2/137
NI DUNG
c im ca C/C
Cc thnh phn c bn
Biu thc v ton t
Hm, mng v con tr
Kiu d liu tru tng
Cc cu trc d liu c bn
2
3
5
22
45
77
123
-
8/13/2019 NGN NG LP TRNH (1)
3/137
I. cimcaC/C++
3
Ngn nglptrnh hm
Linh hottrong vicsdngcc kiubin
Truy cptrctipbnhthng qua cc con
tr nhnghacc kiubinmibngccstruct
C thchia nhchngtrnh thnh nhium-un
-
8/13/2019 NGN NG LP TRNH (1)
4/137
I. cimcaC/C++
4
Kthacc cimcaC
ahnh bngkthutxpchng(overload)
Hngitngbngcc lp(class)
Sdnglicc m bngkthutktha(inheritance)
-
8/13/2019 NGN NG LP TRNH (1)
5/137
-
8/13/2019 NGN NG LP TRNH (1)
6/137
II. Cc thnh phncbn
6
Chci thng: az
Chci hoa : AZ Chs: 09 Phnlncc du(tr@ v $)
V d
#include
voidmain()
{ intArr[] = { 1, 2, 3, 4 };for(inti = 0; i < 4; i++)
std::cout
-
8/13/2019 NGN NG LP TRNH (1)
7/137
II. Cc thnh phncbn
7
Dng m tmthm hay mtonchngtrnh
// Hm tnh x^n
// x - s thc, n - s nguyn dng
doublepower(doublex, intn){
/*
double g = 1;
for (int i = 0; i < n; i++)
g *= x;
return g;
*/
if(n == 0)
return1; // x^0 = 1
returnx * power(x, n - 1);
}
M thm
C thdng btmthimtonchngtrnh
Lm r ngha
-
8/13/2019 NGN NG LP TRNH (1)
8/137
II. Cc thnh phncbn
8
Tn ctcho cc hm, cc bin, cc kiudliu
v.v Cc quy tcnhdanh Chcdng cc chci, chshocdugchni K tutin khng l chs Khng cphp trng tkha
Ch . Ngn ngC/C++ phn bitchci hoa v chcithng
V d
void_foo() // ngquy cch{
intso nguyen; // sai v c chaducchintsoNguyen; // ngquy cch
}
-
8/13/2019 NGN NG LP TRNH (1)
9/137
II. Cc thnh phncbn
9
Cc gi trcthtrong chngtrnh
C thl snguyn, sthc, k thocxu kt
V d
5 // snguyn kiuint05 // snguyn biudintrong h8
0x5 // snguyn biudintrong h16
5u // U hocu snguyn kiuunsigned
5l // L hocl snguyn kiulong
5.0 // snguyn kiudouble'5' // k tc gi trs(m ASCII) bng53
'A' // k tc gi trs(m ASCII) bng65
"5" // xu k tgmk t'5' v k tNULL
-
8/13/2019 NGN NG LP TRNH (1)
10/137
II. Cc thnh phncbn
10
Bng2.1. Cc k tcbit
K t M t
\t TAB
\n ENTER
\ Nhy n\ Nhy kp
\\ \
\0 K tNULL (gi trbng0)
-
8/13/2019 NGN NG LP TRNH (1)
11/137
II. Cc thnh phncbn
11
L mtvng trong bnhRAM dng lutrtmthicc gi trcxc nhbngmttn bin
Phn loi Binn Binmng
Bincon tr
-
8/13/2019 NGN NG LP TRNH (1)
12/137
-
8/13/2019 NGN NG LP TRNH (1)
13/137
II. Cc thnh phncbn
13
Bng2.2. Cc kiubin
KiuKch thc
(byte)Vng gi tr
Snguy
n
char 1 -128 127
short 2 32,768 32,767
int 4 2,147,483,648 2,147,483,647unsigned 4 0 4,294,967,295
long 4 2,147,483,648 2,147,483,647
long long 8 9,223,372,036,854,775,808 9,223,372,036,854,775,807
Sthc float 4 3.4E38
double 8 1.7E308
long double 8 1.7E308
-
8/13/2019 NGN NG LP TRNH (1)
14/137
-
8/13/2019 NGN NG LP TRNH (1)
15/137
II. Cc thnh phncbn
15
Mtvi ch Kch thccacc kiuphthucvo hthngm
chngtrnh cbin dch
Dng ton tsizeof(...)lykch thccamtkiu, mthnghay mtbin
// Chngtrnh Win32 Console Application
intsz;
sz = sizeof(sz); // sz = 4
sz = sizeof(longlong); // sz = 8
sz = sizeof("12345"); // sz = 6
-
8/13/2019 NGN NG LP TRNH (1)
16/137
II. Cc thnh phncbn
16
Kiulitk Dng nhdanh cho cc gi trkiuint
enum tn_kiu{ danh sch tn };
V d
enumBoolean { False, True };
// False = 0, True = 1
enumKeys { Enter = 13, Escape = 27, A = 65, B, C };
// B = 66, C = 67
-
8/13/2019 NGN NG LP TRNH (1)
17/137
II. Cc thnh phncbn
17
Dng cc chunvo/ra trong thviniostream
lm vicvimn hnh v bn phm Chunvo (cin) sdngton tlungvo (>>) Cc chunra (cout, cerr) sdngton tlungra (> b >> c; // Dng ducch, TAB hocENTER phn bitcc lung
if(a != 0)
{
cout
-
8/13/2019 NGN NG LP TRNH (1)
18/137
-
8/13/2019 NGN NG LP TRNH (1)
19/137
II. Cc thnh phncbn
19
PhuongTrinhBac2.cpp
#include // thvinvo/ra
usingnamespacestd; // ni khai bo cc thnh phnchun
voidmain()
{
doublea, b, c;cout > a >> b >> c;
if(a != 0) {
// on biu thc gii v binlunphngtrnh //
}
else
cerr
-
8/13/2019 NGN NG LP TRNH (1)
20/137
II. Cc thnh phncbn
20
PhuongTrinhBac2.cpp
// Giiv binlunphngtrnh
doubled = b*b - 4*a*c;
if(d >= 0)
{
if(d > 0){
cout
-
8/13/2019 NGN NG LP TRNH (1)
21/137
-
8/13/2019 NGN NG LP TRNH (1)
22/137
III. Biuthcv ton t
Biu thc
Cc ton t n
Cc ton t c cu trc
22
-
8/13/2019 NGN NG LP TRNH (1)
23/137
V d
III. Biuthcv ton t
23
Tphpcacc ton hngv ton t
Ktthc bngduchmphy
C thrng
(-b sqrt(d)) / (2 * a)
Cc ton t: () - / *
Cc ton hng: Bin: a, b, d Hng: 2 Hm: sqrt
-
8/13/2019 NGN NG LP TRNH (1)
24/137
III. Biuthcv ton t
24
Bng3.1. Phn loicc ton tn
Nhm Cc ton t Ghi ch
Gn =
Shc + - * / % C thkthpvi=
Tng/Gim ++ --
So snh == != > < >= C thkthpvi=
Con tr & * new delete
Truy cpthnh vin :: . ->Cc loikhc {} () [] ,
Thtutin cc ton ttham khotihttp://www.cplusplus.com/doc/tutorial/operators/
http://www.cplusplus.com/doc/tutorial/operators/http://www.cplusplus.com/doc/tutorial/operators/ -
8/13/2019 NGN NG LP TRNH (1)
25/137
III. Biuthcv ton t
25
Ton tgn:
a = 5; // gn 5 vo a
a = b = c = 5; // tng ng: c= 5; b = c; a = b;
a = b + (c = 5); // tng ng: c= 5; a = b + c;
C php lvalue = rvalue
lvalue tn_bin, rvalue mtbiuthc
V d
-
8/13/2019 NGN NG LP TRNH (1)
26/137
V d
III. Biuthcv ton t
26
Cc ton tshc
a = 1 / 5; // a = 0a = 1.0 / 5; // a = 0.2a = (double)1 / 5; // a = 0.2a = 11 % 3; // a = 2
// Kt hp vi ton t gna += b; // tng ng: a = a + b;a *= b + 1; // tng ng: a = a * (b + 1);
+ Cng / Chia
- Trhocidu % Chia d
* Nhn
-
8/13/2019 NGN NG LP TRNH (1)
27/137
V d
III. Biuthcv ton t
27
Cc ton ttng/gim
++a; // tng ng: a = a + 1;
a++; // tng ng: a = a + 1;
a = b++; // tng ng: a = b; b = b + 1;
a = ++b; // tng ng: b = b + 1; a = b;
++ Tng1
-- Gim1
-
8/13/2019 NGN NG LP TRNH (1)
28/137
III. Biuthcv ton t
28
Cc ton tso snh
5 == 3 // cho gi tr 0
5 != 3 // cho gi tr 1
5 > 3 // cho gi tr 15 < 3 // cho gi tr 0
5 >= 3 // cho gi tr 1
5 Lnhn >= Lnhnhocbng
< Nhhn
-
8/13/2019 NGN NG LP TRNH (1)
29/137
III. Biuthcv ton t
29
Ton tkimtra:
Biu thc logic? Biu thc 1: Biu thc 2
V d
5 == 3? 5: 3 // cho gi tr 3
5 != 3? 5: 3 // cho gi tr 5
a > b? a: b // cho gi tr ln nht ca a v b
a < 0? a: a // cho gi tr tuyt i ca a
h
-
8/13/2019 NGN NG LP TRNH (1)
30/137
III. Biuthcv ton t
30
Cc ton tlogic
V d
!(a == b) // tng ng: a != bx >= a && x b // kim tra x ngoi khong [a, b]
&& V
|| Hoc
! Phnh
III i h
-
8/13/2019 NGN NG LP TRNH (1)
31/137
III. Biuthcv ton t
31
Cc ton tlogic Cc gi trkhc 0ccoi l 1
Trong biuthcA && B, nuA = 0th khng cnxc nhB
Trong biuthcA || B, nuA = 1th khng cnxc nhB
!!5 // cho gi tr 1
x >= a && x b // kim tra x ngoi khong [a, b]
V d
III Bi h
-
8/13/2019 NGN NG LP TRNH (1)
32/137
III. Biuthcv ton t
32
Cc ton txl bit
V d
5 & 0xFE // cho gi tr 4
5 | 2 // cho gi tr 7
5 ^ 4 // cho gi tr 1~5 // cho gi tr 0xFFFFFFFA
5 > 1 // cho gi tr 2
& AND ~ NOT
| OR > SHR (dchphi)
III Bi th t t
-
8/13/2019 NGN NG LP TRNH (1)
33/137
III. Biuthcv ton t
33
Bng 3.2. Mt vi phng n s dng
Cc ton txl bit
Biuthc M t
a &= 0xFE Xa bit a0(a thuckiu1 byte)
(a & (1
-
8/13/2019 NGN NG LP TRNH (1)
34/137
III. Biuthcv ton t
34
Ton tduphy:Dng phn bithai hay nhiubiuthc
void_foo(intx, inty) // cc tham s ca hm
{
intA[] = { 1, 2, 3, 4 };// cc biu thc khi to mng
inta, b; // cc biu thc khai bo bin
a = (b = 3, b + 2); // tng ng: b = 3; a = b+2;_foo(a, b); // cc biu thc truyn cho hm
}
III Biu thc v ton t
-
8/13/2019 NGN NG LP TRNH (1)
35/137
III. Biuthcv ton t
35
Ton tiukin: if
if(biu thc logic)
khi biu thc
// tm tr tuyt i ca x
a = x;if(a < 0)
a = -x;
V d
III Biu thc v ton t
-
8/13/2019 NGN NG LP TRNH (1)
36/137
III. Biuthcv ton t
36
Ton tiukin: if elseif(biu thc logic)
khi biu thc 1
else
khi biu thc 2
// tm gi tr nh nht ca a v b
if(a < b)
min = a;
else
min = b;
V d
-
8/13/2019 NGN NG LP TRNH (1)
37/137
III Biu thc v ton t
-
8/13/2019 NGN NG LP TRNH (1)
38/137
III. Biuthcv ton t
38
Ton tlp: dowhile
do
khi biu thc
while(biu thc logic);
//
V d
III Biu thc v ton t
-
8/13/2019 NGN NG LP TRNH (1)
39/137
III. Biuthcv ton t
39
Ton tlp: for
for(bt khi to; bt logic; bt bin i)
khi biu thc
// tm N!
int gt = 1;for(inti = 2; i
-
8/13/2019 NGN NG LP TRNH (1)
40/137
III. Biuthcv ton t
40
Ton tlachn: switch
switch(biu thc)
{
casegi_tr_1: cc biu thc #1
break;
...
casegi_tr_n: cc biu thc #n
break;
default: cc biu thc #khc}
#k khi (biu thc) c gi tr = gi_tr_k
#khc khi gi tr ca (biu thc) khc cc gi tr lit k
-
8/13/2019 NGN NG LP TRNH (1)
41/137
III Biu thc v ton t
-
8/13/2019 NGN NG LP TRNH (1)
42/137
III. Biuthcv ton t
42
Ton tiukhin: breakvcontinue breakacon trchngtrnh ra khicc vng lpv khiswitch
continueacon trchngtrnh vucc vng lp
// tm tng cc gi tr chn v l// ca cc s nguyn dng nhp vo t bn phmint odd = 0, even = 0, input;while(1) { // vng lp v cng
cin >> input;if(input < 0) continue;if(input == 0) break;
if(input & 1)even += input;
elseodd += input;
}
V d
III Biu thc v ton t
-
8/13/2019 NGN NG LP TRNH (1)
43/137
III. Biuthcv ton t
43
Vitchngtrnh in ra mn hnh cc gi trt1 nkdidngma
trnmxnvik= mxn, mv nckhitotrong hm main().
Vitchngtrnh xc nhdngtam gic ccho bi3 cnha, b, c lcc sthc. Yu cu:
Nhp3 cnhcatam gic
In ra mn hnh kiucatam gic: Tam giac thuong
Tam giac vuong
Tam giac can
Tam giac vuong can
Tam giac deu Chngtrnh chktthc khi a, b, c khng tothnh tam gic
III. Biu thc v ton t
-
8/13/2019 NGN NG LP TRNH (1)
44/137
III. Biuthcv ton t
44
Vitchngtrnh in ra mn lchcanmnay theo mucanm2000:
Thang 1
CN T2 T3 T4 T5 T6 T7
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 2223 24 25 26 27 28 29
30 31
Thang 2
CN T2 T3 T4 T5 T6 T7
1 2 3 4 56 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
-
8/13/2019 NGN NG LP TRNH (1)
45/137
IV. Hm, mngv con tr
Mng
Con tr v tham chiu
Hm
45
IV. Hm, mng v con tr
-
8/13/2019 NGN NG LP TRNH (1)
46/137
IV. Hm, mngv con tr
46
Khai bo binmng
kiu tn_bin[kch thc];// kch thcphi l hng s nguyn
kiu tn_bin[kch thc] = { danh sch biu thc };// s biu thc trong danh sch biu thc phi nh// hn hoc bng kch thc
kiu tn_bin[] = { danh sch biu thc };
// kch thc ca mng bng s biu thc trong// danh sch biu thc
IV. Hm, mngv con tr
-
8/13/2019 NGN NG LP TRNH (1)
47/137
, g co t
47
Khai bo binmngV d
intA[2];
shortB[] = { 10, 256, 1024 };
charS[100] = { 'A', 'B', 'C', 0 };
A
A[0]
A[1]
0x0A
0x00
0x00
0x010x00
0x04
B
B[0]
B[2]
B[1]
0x41
0x42
0x43
0x00
S[0]
S[99]
S
S[3]
IV. Hm, mngv con tr
-
8/13/2019 NGN NG LP TRNH (1)
48/137
, g
48
Xu k t(string) Mngcc k t, ktthc bngk tNULL
Binxu k tckhai bo bngmtmngkiuchar(biuthckhitoc thl mthngxu k t)
V d
// nhpv kimtra mtkhucharpwd[] = "12345678";chars[100];
cout
-
8/13/2019 NGN NG LP TRNH (1)
49/137
, g
49
Thit k v ci t chng trnh thc hin cc thao tc sau:
Khai bo mt mng cha 1000 s nguyn t gi tr ngu nhin t 1 .. 1000 cho cc phn t ca mng (dng hm
rand())
m s lng s chn, s l v s chia ht cho 8 ca mng
Vit chng trnh thc hin cc thao tc sau: Nhp gi tr cho xu k t s(cha c nhiu nht 49 k t khc NULL)
In sra mn hnh vi cc ch ci thng (VD. s = 123ABC123abc)
i sthnh s nguyn v gn cho bin a(VD. s = 123abca = 123)
IV. Hm, mngv con tr
-
8/13/2019 NGN NG LP TRNH (1)
50/137
, g
50
Cc khi nim Con trl mtbincbit, dng chaach
camtbinkhc
Tham chiul mtbinidincho duy nhtmtbinno
Kiucon tr kiu*
Truy cpnidung con tr *tn_bin_con_tr
Lyach &tn_bin
Kiutham chiu kiu&
Bng 4.1. Cc ton t ca con tr v tham chiu
IV. Hm, mngv con tr
-
8/13/2019 NGN NG LP TRNH (1)
51/137
g
51
Cc khi nimV d
inta; // gi s a nm a ch 0x000000A0
int b; // gi s b nm a ch 0x000000B0
int*p = &a; // p trvo a -> p = 0x000000A0int&r = a; // r l tham chiu ca a
r = 10; // -> a = 10
b = *p; // p ang tr vo a -> b = 10
p = &b; // p trvo b -> p = 0x000000B0
*p = 5; // -> b = 5
-
8/13/2019 NGN NG LP TRNH (1)
52/137
IV. Hm, mngv con tr
-
8/13/2019 NGN NG LP TRNH (1)
53/137
53
Cppht bnhng Cpbnhcho mtbintheo nhu cucthca
chngtrnh
Binccpbnhphil con tr
Sdngton tnew
Giiphng bnhbngton tdelete
newkiunewkiu[kch_thc]
deletetn_bin;delete[]tn_bin;
IV. Hm, mngv con tr
-
8/13/2019 NGN NG LP TRNH (1)
54/137
54
Cppht bnhngV d
int*p;
p = newint; // cpvng nh4 byte cho p
// . . .deletep;
p = newint[10]; // cpvng nh40 byte cho p
// . . .
delete[]p;
p = newint[5]; // cpvng nh20 byte cho p
// . . .
delete[]p;
IV. Hm, mngv con tr
-
8/13/2019 NGN NG LP TRNH (1)
55/137
55
Thit k v ci t chng trnh thc hin cc thao tc sau:
Khai bo mt mng cha ns nguyn vi nc nhp t bn phm t gi tr ngu nhin t 1 .. 1000 cho cc phn t ca mng (dng hmrand())
m s lng s chn, s l v s chia ht cho 8 ca mng
Debug on biu thc sau:
chars[100] = "1234567890"; short*p = (short*)s;
*(p += 2) = 0x41; cout
-
8/13/2019 NGN NG LP TRNH (1)
56/137
56
Cutrc cahm
kiu tn_hm(danh sch tham s)
{
cc biu thc
}
Vi d
intfactorial(intn) { ... }
doublepower(doublex, intn) { ... }
void main() { ... }
IV. Hm, mngv con tr
-
8/13/2019 NGN NG LP TRNH (1)
57/137
57
prototype cahm
kiu tn_hm(danh sch kiu);
Vi d
intfactorial(int);
doublepower(double, int );
IV. Hm, mngv con tr
-
8/13/2019 NGN NG LP TRNH (1)
58/137
58
Bng 4.2. Quy tc tham s
Tham s Khai bo
Tham tr kiu tn
Mng kiu tn*+
Con tr kiu tn
Tham chiu kiu & tn
Ch :
Dng tham s con tr thay cho mng trong prototype ca hm
VD. intsum(int*, int);
C th dng t kha const cm thay i gi tr cc tham s trong hm VD. intmax(constint, constint);
IV. Hm, mngv con tr
-
8/13/2019 NGN NG LP TRNH (1)
59/137
59
Tham smcnh
ctsngi tr Khai bo cuidanh sch tham s Chcntruyniskhi gi trcaiskhc gi tr
mcnh
V d
doublepower(doublex, intN = 2) {...
}
a = power(3); // N = 2
a = power(3, 4); // N = 4
IV. Hm, mngv con tr
-
8/13/2019 NGN NG LP TRNH (1)
60/137
60
Ton treturn
return;
// thot khi hm
// dng cho cc hm kiu void
Vi d
voidmain()
{
// cc biu thc
if(a == 0)return;
// cc biu thc
}
IV. Hm, mngv con tr
-
8/13/2019 NGN NG LP TRNH (1)
61/137
61
Ton treturn
return(biu thc);
// thot khi hm
// dng cho cc hm khc kiu void
// tr v cho hm gi tr ca biu thc
Vi d
// hm tnh gi tr ln nht ca a v b
intmax(inta, intb)
{
if(a > b) //returna; // return (a > b? a: b);
returnb; //
}
IV. Hm, mngv con tr
-
8/13/2019 NGN NG LP TRNH (1)
62/137
62
Gihm
tn_hm(danh sch i s)
//tn_hm phi c khai bo trc khi gi
// danh sch i s phi ph hp vi danh sch tham s
// v s lng v kiu
Vi d
voidmain()
{
intf = Factorial(5);doublep = power(2.5, 3);
}
IV. Hm, mngv con tr
-
8/13/2019 NGN NG LP TRNH (1)
63/137
63
Bng4.2. Quy tc truyn i s
is/ Tham s Tham tr Mng Con trThamchiu
Hng gi tr - - -
Binn tn - &tn tn
Tham chiu tn - &tn tn
Con tr *tn tn tn *tn
Mng - tn tn -
IV. Hm, mngv con tr
-
8/13/2019 NGN NG LP TRNH (1)
64/137
64
Quy tc truyn i s
// hm tnh tng N phn t ca mng A
intsum(intA[], intN)
{
ints = 0;
for(inti = 0; i < N; i++)
s += A[i];
returns;
}
voidmain()
{intarr[] = { 1, 2, 3, 4 };
ints = sum(arr, 4);
}
-
8/13/2019 NGN NG LP TRNH (1)
65/137
IV. Hm, mngv con tr
-
8/13/2019 NGN NG LP TRNH (1)
66/137
66
Cc m hnh nhnghahm
// 1.cpp
voidfoo(inta){
// khng thgigoo}
voidgoo(inta, intb){
// c thgifoo}
// 2.cpp
// prototype cafoo v gooexternvoidfoo(int);externvoidgoo(int, int);
// 1.cpp
// prototype cafoo v gooexternvoidfoo(int);externvoidgoo(int, int);
IV. Hm, mngv con tr
-
8/13/2019 NGN NG LP TRNH (1)
67/137
67
Cc m hnh nhnghahm
// 1.cpp
// prototype cafoo v goovoidfoo(int);voidgoo(int, int);
voidfoo(inta){
// c thgigoo}
voidgoo(inta, intb)
{// c thgifoo
}
// 2.cpp
// prototype cafoo v gooexternvoidfoo(int);externvoidgoo(int, int);
// 3.cpp
// prototype cafoo v gooexternvoidfoo(int);externvoidgoo(int, int);
IV. Hm, mngv con tr
-
8/13/2019 NGN NG LP TRNH (1)
68/137
68
Cc m hnh nhnghahm
// 1.cpp#include "1.h"
voidfoo(inta){
// c thgigoo}
voidgoo(inta, intb){
// c thgifoo}
#include "1.h"// c thgittc
// cc hm khai bo// trong 1.h
// 1.h#pragma once
voidfoo(int);voidgoo(int, int);
IV. Hm, mngv con tr
-
8/13/2019 NGN NG LP TRNH (1)
69/137
69
Hm inline
Chng trnh dchthay cc biuthccahm inlinevo biuthcgihm
Khng nn cha cc vng lp
V d
inlinedoublemodul(doublea, doubleb)
{
returnsqrt(a * a + b * b);
}
voidmain(){
cout
-
8/13/2019 NGN NG LP TRNH (1)
70/137
70
Con tr hmV d
intfoo(int n) {
if(n < 2) return1;
returnn * foo(n 1);
}intgoo(inta) { returna * a; }
intget(intx, int(*f)(int)) { returnf(x); }
voidmain(){
cout
-
8/13/2019 NGN NG LP TRNH (1)
71/137
71
Hm tr v tham chiuV d
int& max(int&a, int&b) {
return(a > b? a: b);
}
voidmain()
{
intx = 5, y = 10;
cout
-
8/13/2019 NGN NG LP TRNH (1)
72/137
72
Cc hm xpchng(overload)
Cc hm cng tn Phn bitbngkiuhocdanh sch tham s
doublepower(double
x) {returnx * x;}doublepower(doublex, intN) {
if(N == 0) return 1;if(N < 0) return 1/power(x, -N);returnx * power(x, N 1);
}doublepower(doublex, doubley) {
returnexp(y * log(x));}
V d
IV. Hm, mngv con tr
-
8/13/2019 NGN NG LP TRNH (1)
73/137
73
Cc hm xpchng(overload)
Chngtrnh dchstgihm ph hpdavocc istruyncho hm
doublea;
a = power(2); // gihm: double power(double)
a = power(2, 3); // gihm: double power(double, int)
a = power(2, 3.0); // gihm: double power(double, double)
IV. Hm, mngv con tr
-
8/13/2019 NGN NG LP TRNH (1)
74/137
74
Hm mu
Dng sinh ra cc hm c cutrc gingnhau, chphn bitvkiucacc tham s
V d
template
_T abs(_T x){
return(x < 0? x: x);
}
void main()
{
cout
-
8/13/2019 NGN NG LP TRNH (1)
75/137
IV. Hm, mngv con tr
-
8/13/2019 NGN NG LP TRNH (1)
76/137
76
Ci thm sau:
IsSorted 1. . ; *0, 1 0, 1
1 1 = 1 > + 1 0
= 0 < + 1 0
1
Ci tcc hm spxpv tm kim
Vitchngtrnh so snh cc thutton spxpvicc mng100,
1000, 10000 v 100000 phnt
-
8/13/2019 NGN NG LP TRNH (1)
77/137
V. Kiudliutrutng
Cc khi nim
Xy dng ADT
Cc ton t
K tha
77
V. Kiudliutrutng
-
8/13/2019 NGN NG LP TRNH (1)
78/137
78
Kiudliutrutng(ADT)kiuc
nhngham tcho mtsvtCc tnh cht
nggicc binv cc hm ckhai bo trong
mtkhi, cho php che ducc thnh vin KthaADT (dnxut) cxy dngtrn nnmtADT khc (cs), c thsdnglicc thnhphncaADT cs
itngmtbinthucmtADT
-
8/13/2019 NGN NG LP TRNH (1)
79/137
V. Kiudliutrutng
-
8/13/2019 NGN NG LP TRNH (1)
80/137
80
V d(struct):structRectangle
{
doublex1, y1;
doublex2, y2;
doubleArea() { return(y2 - y1) * (x2 - x1); }
};
structElipse : publicRectangle
{
doubleArea()
{returnRectangle::Area() * 3.14 / 4;
}
};
V. Kiudliutrutng
-
8/13/2019 NGN NG LP TRNH (1)
81/137
81
V d(class):classRectangle{public:
doublex1, y1;doublex2, y2;doubleArea() { return(y2 - y1) * (x2 - x1); }
};
classElipse : publicRectangle{public:
doubleArea()
{returns = Rectangle::Area() * 3.14 / 4;
}};
V. Kiudliutrutng
-
8/13/2019 NGN NG LP TRNH (1)
82/137
82
V d(cc itng):
voidmain()
{
Rectangle r = { 1, 1, 6, 3 };
Elipse e;
e.x1 = 12; e.y1 = 2;
e.x2 = 17; e.y2 = 7;
cout
-
8/13/2019 NGN NG LP TRNH (1)
83/137
83
Cc vng truy cp
protectedpublic private
V. Kiudliutrutng
-
8/13/2019 NGN NG LP TRNH (1)
84/137
84
Cutrc caADTclasstn_ADT
{
private|protected|public:
// cc binthnh vin (cc thuctnh)
private|protected|public:
// cc hm topublic:
// hm hy
private|protected|public:
// cc hm thnh vin khc (cc phngthc)
public:
// cc ton tthnh vin
// cc hm v cc ton tfriend
};
-
8/13/2019 NGN NG LP TRNH (1)
85/137
V. Kiudliutrutng
-
8/13/2019 NGN NG LP TRNH (1)
86/137
86
Cutrc caADT Cc hm phctpnn nhnghangoi khikhai
bo ADT
classtn_ADT
{kiutn_hm(danh sch tham s);
};
kiutn_ADT::tn_hm(danh sch tham s)
{// cc biuthc
}
V. Kiudliutrutng
-
8/13/2019 NGN NG LP TRNH (1)
87/137
87
Hm tov hm hyHm to(constructor)
Dng thitlpgi trcho cc binhoccpphtbnhcho cc mngng
cgitrong cc biuthckhai bo itnghoccppht bnh
Hm hy(destructor)
Dng giiphng bnhcppht cgikhi ktthc khikhai bo itnghoc
trong biuthcgiiphng bnh
V. Kiudliutrutng
-
8/13/2019 NGN NG LP TRNH (1)
88/137
88
Hm tov hm hy
classtn_ADT
{
public:
tn_ADT(); // hm tomcnh
tn_ADT(danh sch tham s); // hm tothitlp
tn_ADT(const tn_kiu&); // hm tocopy
~tn_ADT(); // hm hy
};
V. Kiudliutrutng
-
8/13/2019 NGN NG LP TRNH (1)
89/137
89
nhnghahm to(inline)
classtn_ADT
{
public:
tn_ADT(danh sch tham s): tn_bin(biuthc)
, ...
{
// cc biuthc
}
};
V. Kiudliutrutng
-
8/13/2019 NGN NG LP TRNH (1)
90/137
90
V d(class Time)classTime
{
longticks;
public:
Time() { ticks = 0; }
Time(longvalue) : ticks(value) { }
Time(constTime & t) : ticks(t.ticks) { }
~Time() { }
public:
longSeconds() { returnticks / 1000; }longMinutes() { returnSeconds() / 60; }
longHours() { returnSeconds() / 3600; }
};
V. Kiudliutrutng
-
8/13/2019 NGN NG LP TRNH (1)
91/137
91
V d(class Time)
voidmain(){
Time *p;Time t1; // giTime()Time t2(1000); // giTime(long)
Time t3 = t2; // giTime(const Time &)
p = newTime(100); // giTime(long)
cout
-
8/13/2019 NGN NG LP TRNH (1)
92/137
92
V d(class String)
Cc binthnh vin v cc hm static
classString
{
char*data; // Vng dliuchacc k tintlen; // Sk t
public:
// Lydi xu src
static intGetLength(constchar* src);
// copy xu src vo dst
static voidCopy(char* dst, constchar* src);
V. Kiudliutrutng
-
8/13/2019 NGN NG LP TRNH (1)
93/137
93
V d(class String)
Cc hm privateprivate:
// Hm toilngchacn k tString(intn) { createData(n); }
// copy xu src vo datavoidcopyData(constchar* src) { Copy(data, src); }
// Tovng dliuchan k tvoidcreateData(intn){
len = n;data = newchar[n + 1];data[n] = 0;
}
V. Kiudliutrutng
-
8/13/2019 NGN NG LP TRNH (1)
94/137
94
V d(class String)
Cc hm tov hm hypublic:
String() { createData(0); }
String(constchar* src) {createData(GetLength(src));copyData(src);
}
String(constString & src) {createData(src.len);
copyData(src.data);}
~String() { delete[] data; }
V. Kiudliutrutng
-
8/13/2019 NGN NG LP TRNH (1)
95/137
95
V d(class String)
Cc hm public
public:
// Lysk t
intLength() { returnlen; }
// So snh viitngsrc
intCompare(constString & src) const
{
returnCompare(src.data);
}
// So snh vixu src
intCompare(constchar* src) const;
V. Kiudliutrutng
-
8/13/2019 NGN NG LP TRNH (1)
96/137
96
V d(class String)
Cc ton t
public:String operator=(constchar* src);
String operator=(String & src);
// Cc ton tkhc
}; // class String
V. Kiudliutrutng
-
8/13/2019 NGN NG LP TRNH (1)
97/137
97
V d(class String)
nhnghacc hm
intString::GetLength(constchar* src)
{
registerinti = 0;
while(src[i]) ++i;returni;
}
voidString::Copy(char*dst, constchar* src)
{ for(registerinti = 0; src[i]; i++)
dst[i] = src[i];
}
V. Kiudliutrutng
-
8/13/2019 NGN NG LP TRNH (1)
98/137
98
V d(class String)
nhnghacc hm
intString::Compare(constchar*src) const
{
for(inti = 0; i src[i]? 1: -1);
}
return0;
}
V. Kiudliutrutng
-
8/13/2019 NGN NG LP TRNH (1)
99/137
99
Ton tgn
{
Time t1, t2;
String s1, s2;
t1 = t2;
s1 = s2;
}
t1.ticks = t2.ticks
s1.len = s2.lens1.data = s2.data
delete[] s2.datadelete[] s1.data sinh ra liv s1.data bxa
V. Kiudliutrutng
-
8/13/2019 NGN NG LP TRNH (1)
100/137
100
Ton tgn
// Bsung ton tgn cho String
String& operator=(const String & right)
{
delete[] data; // xa vng dliuc
createData(right.len); // tovng dliumi
copyData(right.data); // copy dliutsrc
return*this; // trvbnthn itng
}
V. Kiudliutrutng
-
8/13/2019 NGN NG LP TRNH (1)
101/137
101
Cc ton tshc// Bsung ton tshccho TimeTime operator+(const Time right)
{
returnTime(ticks + right.ticks);
}
// Bsung ton tshccho String
String operator+(constString & right)
{
String s(len + right.len);
copy(s.data, data);
copy(s.data + len, right.data);
returns;
}
(const Time right)(const String & right)
C g khc nhau ?
V. Kiudliutrutng
-
8/13/2019 NGN NG LP TRNH (1)
102/137
102
Cc ton tkthp// Bsung ton tkthpcho TimeTime & operator+=(const Time right) {
ticks += right.ticks;return*this;
}
// Bsung ton tkthpcho StringString operator+=(constString & right) {
String s(len + right.len);copy(s.data, data);copy(s.data + len, right.data);
len = s.len;char*p = data; data = s.data; s.data = p;return*this;
}
-
8/13/2019 NGN NG LP TRNH (1)
103/137
-
8/13/2019 NGN NG LP TRNH (1)
104/137
V. Kiudliutrutng
-
8/13/2019 NGN NG LP TRNH (1)
105/137
105
Ton thm
kiuoperator()(danh sch tham s) { ... }
V d
Lygi trcahm theo mttpcc is Truy cpphntcamngn chiu
V. Kiudliutrutng
-
8/13/2019 NGN NG LP TRNH (1)
106/137
106
Cc ton ttng/gim// Bsung ton t++ cho Time
// Trnghpton t bn phi
Time & operator++() {
ticks++;
return*this;
}
// Trnghpton t bn tri
friendTime & operator++(Time & right) {
right.ticks++;
returnright;
}
V. Kiudliutrutng
-
8/13/2019 NGN NG LP TRNH (1)
107/137
107
Cc ton tlungvo/ra// Bsung ton tlungra cho Timefriendostream & operator
-
8/13/2019 NGN NG LP TRNH (1)
108/137
108
Cc ton tp kiu
// Bsung ton tp sang kiulong cho Time
operatorlong() { returnticks; }
// Bsung ton tp sang kiuxu k tcho String
operatorchar*() { returndata; }
V. Kiudliutrutng
-
8/13/2019 NGN NG LP TRNH (1)
109/137
109
Xy dng class PhanSo m t kiu phn s gm cc thnh phn sau:
Hai bin a, bcha t s v mu s
Cc hm to
Cc ton t cng, tr, nhn, chia v kt hp
Ton t lung ra
VD. PhanSo a(2, 4); cout
-
8/13/2019 NGN NG LP TRNH (1)
110/137
110
M hnh
classADT_c_s{
protected|public:
virtualvoidfoo() { ... }
};
classADT_dn_xut: public|protected|privateADT_c_s{protected|public:
void foo()
{
// phnmrng
ADT_c_s::foo();// phnmrng
}
};
V. Kiudliutrutng
-
8/13/2019 NGN NG LP TRNH (1)
111/137
ADT_dn_xut: public ADT_c_s
111
Cc vng truy cp
ADT_c_s
protectedpublic private
V. Kiudliutrutng
-
8/13/2019 NGN NG LP TRNH (1)
112/137
112
V d v s k thaclassB {protected: intx;public:
B(inta = 0) : x(a) { }virtualvoidPrint() { cout
-
8/13/2019 NGN NG LP TRNH (1)
113/137
113
V d v s k tha
voidmain()
{
B b(5);
D d(1, 2);
d.Inc();
B *p = &b;
p->Print(); // giB::Print() -> 5
p = &d;p->Print(); // giD::Print() -> 1, 3
}
V. Kiudliutrutng
-
8/13/2019 NGN NG LP TRNH (1)
114/137
114
Lp c s trutng
classADT_c_s{
...
virtualvoidfoo() = 0;
};
classADT_dn_xut: public|protected|privateADT_c_s{
...
void foo()
{
// ...}
};
V. Kiudliutrutng
-
8/13/2019 NGN NG LP TRNH (1)
115/137
115
Lp c s tru tng
classShape
{
String _name;
public:
Shape(constchar*name) : _name(name) { }
voidPrint()
{
cout
-
8/13/2019 NGN NG LP TRNH (1)
116/137
116
K tha t lp c s tru tng
classRectangle : publicShape
{
int_w, _h;public:
Rectangle(inta, intb)
: Shape("Rectangle"), _w(a), _h(b) { }
doubleArea() { return_w * _h; }
};
V. Kiudliutrutng
-
8/13/2019 NGN NG LP TRNH (1)
117/137
117
K tha lp c s tru tng
classTriangle : publicShape
{
int_a, _b, _c;
public:
Triangle(inta, intb, intc): Shape("Triangle"), _a(a), _b(b), _c(c) { }
doubleArea()
{
doubles = (_a + _b + _c) / 2;
returnsqrt(s * (s - _a) * (s - _b) * (s - _c));}
};
V. Kiudliutrutng
-
8/13/2019 NGN NG LP TRNH (1)
118/137
118
V dvoidmain()
{
Shape *s[2];
s[0] = newRectangle(2, 5);
s[1] = newTriangle(3, 4, 5);
for(inti = 0; i < 2; i++)
{
s[i]->Print();
deletes[i];
}
}
Rectangle: Area = 10
Triangle: Area = 12
VI. Cc cutrc dliucbn
-
8/13/2019 NGN NG LP TRNH (1)
119/137
119
ADT mutemplate classShape{
_T edge[n]; // cc cnhpublic:
_T Bound();};
template _T Shape::Bound(){
intc = 0;for(inti = 0; i < n; i++) c += edge[i];returnc;
}
voidmain(){
Shape tamGiac; // tora class Shape c 3 cnhkiuintShape tuGiac;// tora class Shape c 4 cnhkiudouble
}
V. Kiudliutrutng
-
8/13/2019 NGN NG LP TRNH (1)
120/137
120
class Matrix m t mt ma trn c cho di y
template classMatrix {
_T **data;introws, cols; // s hng v s ct
voidcreateData(); // to vng d liu t rows v cols
voidcreateData(intm, intn); // to vng d liu m hng, n ct
voiddeleteData(); // xa d liu
public:
Matrix() : data(0) { }
Matrix(intm, intn = 0); // to ma trn mxn hoc mxm
Matrix(intm, intn, const_T*); // to ma trn mxn kiu u tin
// hng t mng 1 chiu
Matrix(constMatrix& M);
~Matrix() { deleteData(); }
_T& operator()(inti, intj) { returndata[i][j]; }
};
V. Kiudliutrutng
-
8/13/2019 NGN NG LP TRNH (1)
121/137
121
nh ngha cc hm ca Matrix
template voidMatrix::createData()
{
data = new_T *[rows];
for(inti = 0; i < rows; i++)
data[i] = new_T[cols];
}
template voidMatrix::deleteData()
{
if(data == 0) return;
for(inti = 0; i < rows; i++)delete[]data[i];
deletedata;
}
V. Kiudliutrutng
-
8/13/2019 NGN NG LP TRNH (1)
122/137
122
Cc yu cu: Hon thnh tt c cc hm ca class Matrix
B sung ton t gn, v cng ma trn Xy dng class Graphic m t th c hng khng trng s k
tha t Matrix v c th s dng trong on biu thc sau:
intM[] = {
0, 1, 1, 0, 1,1, 0, 1, 0, 0,
1, 0, 0, 1, 1,
0, 0, 1, 0, 1,
0, 1, 0, 1, 0
};Graphic g(5, M);
g.DFT(2); // in ra mn hnh ch s cc nh
// theo chiu su bt u t nh 2
VI. Cc cutrc dliucbn
-
8/13/2019 NGN NG LP TRNH (1)
123/137
Array, BoundStack vBoundQueue
LinkedList
Binary Search Tree
123
Link n file code y :https://docs.google.com/open?id=0B4vBa0QnLWSraGRyVkJKaFUwekE
VI. Cc cutrc dliucbn
-
8/13/2019 NGN NG LP TRNH (1)
124/137
124
template classArray {
protected:
T *data;
intsize;
public:
Array();
Array(intlength);
Array(constArray& a);~Array();
public:
voidCopyFrom(T *);
intSize();
public:
T& operator[](intindex);
Array& operator=(constArray& a);
};
VI. Cc cutrc dliucbn
-
8/13/2019 NGN NG LP TRNH (1)
125/137
125
template classBoundStack : protectedArray {
inttop;public:
BoundStack();
BoundStack(intsize);
public:
voidPush(T value);
T Pop();
T Top();
intIsEmpty();
intIsFull();
intCount();T operator[](intindex);
};
VI. Cc cutrc dliucbn
-
8/13/2019 NGN NG LP TRNH (1)
126/137
126
template classBoundQueue : protectedArray {
intfront, rear;
intcount;
voidInc(int&i);
public:
BoundQueue();
BoundQueue(intsize);
public:voidEnqueue(T value);
T Dequeue();
intIsEmpty();
intIsFull();
intCount();
T operator[](intindex);
};
VI. Cc cutrc dliucbn
-
8/13/2019 NGN NG LP TRNH (1)
127/137
127
ngdngstack trong QuickSort
template classSort {classSegment {public:
intLb, Ub;Segment() { }Segment(intl, intr) : Lb(l), Ub(r) { }
voidSwap(T &a, T &b) { T t = a; a = b; b = t; }intDoPart(Array &); // Phn onArray
// Sp xp Array trong on [Lb, Ub] bngInsertSortvoidDoSort(Array &);
}; // Segmentpublic:
staticvoidDoSort(Array &);};
VI. Cc cutrc dliucbn
-
8/13/2019 NGN NG LP TRNH (1)
128/137
128
ngdngstack trong QuickSorttemplate voidSort::DoSort(Array &a)
{
intn0 = 10, len = a.Size();
BoundStack s(len/n0 + 1);
s.Push(Segment(0, len - 1));
while(!s.IsEmpty()) {Segment b = s.Pop();
if(b.Ub - b.Lb + 1 > n0) {
intj = b.DoPart(a);
if(b.Lb < j - 1) s.Push(Part(b.Lb, j - 1));
if(b.Ub > j + 1) s.Push(Part(j + 1, b.Ub));
} else
b.DoSort(a);
}
}
VI. Cc cutrc dliucbn
-
8/13/2019 NGN NG LP TRNH (1)
129/137
129
S dng class Sort#include"stdafx.h"
#include"ds.h"
#include
usingnamespacestd;
intmain(){
intv[] = { 7, 5, 4, 8, 9, 1, 3, 2, 0, 6 };
Array a(10);
a.CopyFrom(v);
Sort::DoSort(a);
for(inti = 0; i < a.Size(); i++) cout
-
8/13/2019 NGN NG LP TRNH (1)
130/137
130
class LinkedListtemplate classLinkedList{protected:
// on nh ngha cc lp con //baseList h;intn;
public:
LinkedList() : n(0) { }~LinkedList() { h.makeEmpty(); }
intIsEmpty() { returnn == 0; }intCount() { returnn; }
_Ti PopBegin();
_Ti PopEnd();voidRemoveAll() { h.makeEmpty(); n = 0; }voidPushBegin(const_Ti& i);voidPushEnd(const_Ti& i)
};
VI. Cc cutrc dliucbn
-
8/13/2019 NGN NG LP TRNH (1)
131/137
131
Cc lp conclassbaseList {
public:
baseList *next, *prev;
baseList() { next = prev = this; }
voidinsertAfter(const_Ti& info);voidremove();
voidmakeEmpty();
};
classinfoList : publicbaseList {
public:_Ti info;
infoList(const_Ti& i) : info(i) { }
};
-
8/13/2019 NGN NG LP TRNH (1)
132/137
VI. Cc cutrc dliucbn
-
8/13/2019 NGN NG LP TRNH (1)
133/137
133
class c s
template classbaseBST {
public:
baseBST() { }
virtualbaseBST * insert(const_Ti& ) = 0;
virtualbaseBST * contents(const_Ti& ) { return0 ; }
virtualbaseBST * remove(const_Ti& ) { returnthis; }
virtualbaseBST * getSuccessor() { return0; }
virtualvoidmakeEmpty() { }
virtual_Ti * Info() { return0; }
};
template
int_compare(const_Ti& a, const_Ti& b){
return(a < b? -1: a > b);
}
VI. Cc cutrc dliucbn
-
8/13/2019 NGN NG LP TRNH (1)
134/137
134
class BSTtemplateclassBST {
// on nh ngha cc class con //nullBST nullBST;baseBST * root;
public:BST() { root = (baseBST *)&nullBST; }
~BST() { root->makeEmpty(); }
voidInsert(const_Ti& info) {root = root->insert(info);
}voidDelete(const_Ti& i) {
root = root->remove(i);
}boolContents(const_Ti& i) {
returnroot->contents(i);}
};
VI. Cc cutrc dliucbn
-
8/13/2019 NGN NG LP TRNH (1)
135/137
135
nh ngha cc class conclassnullBST : baseBST {public:
baseBST * insert(const_Ti& i) { returnnewinfoBST(i, this); }};
classinfoBST : baseBST {_Ti info;
baseBST *left, *right;public:
infoBST(const_Ti& i, baseBST *nullBST) : info(i) {left = right = nullBST;
}
voidmakeEmpty();
baseBST * insert(const_Ti& );baseBST * contents(const_Ti& );baseBST * remove(const_Ti& );baseBST * getSuccessor();
};
VI. Cc cutrc dliucbn
-
8/13/2019 NGN NG LP TRNH (1)
136/137
136
ng dng kim tra khai bo bin#include"ds.h"#include
usingnamespacestd;
classVarDef
{
public:string name;
intline;
VarDef() { }
VarDef(constchar* s, intl) : name(s), line(l) { }
staticintcompare(constVarDef& a, constVarDef& b)
{
returna.name.compare(b.name);
}
};
VI. Cc cutrc dliucbn
-
8/13/2019 NGN NG LP TRNH (1)
137/137
ng dng kim tra khai bo binvoidmain(){
charvars[][100] ={ "x", "y", "a", "b", "x", "k", "i", "k", "m", "n"};
BST bst;BoundQueue e(10);
for(inti = 0; i < 10; i++) {VarDef v(vars[i], i + 1);if(!bst.Contents(v)) bst.Insert(v);elsee.Enqueue(v);
}
for(inti = 0; i < e.Count(); i++) {
VarDef v(e[i]);cout