Professional Documents
Culture Documents
B MN TIN HC XY DNG
KHOA CNG NGH THNG TIN I HC XY DNG
LP TRNH C++
Ti liu lu hnh ni b
version 0.0.2
Lp trnh C++
Nguyn Ph Qung
Mc lc
I. M U.............................................................................................................................4
I.1. Mi trng pht trin.................................................................................................................... ..........4
I.2. Chng trnh u tin...................................................................................................... ......................4
I.3. Input & Output................................................................................................................ ........................5
III. LNH.................................................................................................................................9
III.1. Lnh dng biu thc.......................................................................................................................... ...9
III.2. Khi lnh.................................................................................................................. ............................9
III.3. Lnh r nhnh.............................................................................................................. ........................9
III.4. Vng lp for...................................................................................................................... ..................10
III.5. Vng lp while................................................................................................................. ...................13
III.6. Vng lp do...while........................................................................................................ .....................13
III.7. Nhy khng iu kin......................................................................................................... ................13
IV. HM................................................................................................................................13
IV.1. nh ngha hm................................................................................................................. .................13
IV.2. V d khai bo hm........................................................................................................................... ..14
IV.3. Khi no s dng hm...................................................................................................... ...................14
IV.4. Hm c gi nh th no?........................................................................................ ......................14
IV.5. Hm gi quy........................................................................................................... .......................15
V. MNG..............................................................................................................................17
V.1. nh ngha............................................................................................................................ ...............17
V.2. Truy cp phn t ca mng............................................................................................................. ....17
V.3. Khi to mng......................................................................................................................... ............17
V.4. Mng nhiu chiu.............................................................................................................. ..................17
V.5. S dng mng lm tham s ca hm................................................................................................ ..17
VII. STRUCT........................................................................................................................17
VII.1. nh ngha Struct.................................................................................................... ..........................17
VII.2. Khai bo bin................................................................................................................. ...................18
VII.3. Truy cp trng...................................................................................................... ..........................18
VIII. Stream..........................................................................................................................18
VIII.1. File stream............................................................................................................... ........................18
VIII.2. String stream............................................................................................................................ ........19
VIII.3. Ghi c nh dng............................................................................................................... ...............19
Lp trnh C++
Nguyn Ph Qung
XI. LP................................................................................................................................21
XII. MU...............................................................................................................................21
XIII. TH VIN CHUN......................................................................................................21
XIII.1. Cc khi nim......................................................................................................... .........................21
XIII.2. Kiu vector..................................................................................................................... ..................22
XIII.3. Kiu string...................................................................................................................... ..................26
XIII.4. Kiu list (danh sch).................................................................................................................... .....29
XIII.5. Kiu set (tp hp)................................................................................................. ...........................32
XIII.6. Kiu map (nh x).................................................................................................................. ..........32
XIII.7. Kiu hash_map (nh x dng mng bm)................................................................ .......................34
XIII.8. Kiu hash_set (tp hp)............................................................................................................ .......35
XIII.9. Thut ton (Algorithm).................................................................................................................... ..35
Lp trnh C++
I.
Nguyn Ph Qung
M U
I.1.
thun tin cho vic hc ngn ng, chng ti xin gii thiu 2 mi trng quen thuc bn c
th thc hnh lp trnh C++.
Microsoft Visual C++ (6.0, 7.0, 7.1): phn mm ny nm trong b phn mm Microsoft Visual
Studio.
DevC++ 5.0: Bn c th ti min ph t a ch http://www.bloodshed.net/devcpp.html, chng ti
khuyn khch cc bn s dng phn mm min ph ny.
Ton b chng trnh minh ha u c th chy trn c 2 mi trng VC++ v DevC.
I.2.
#include <iostream>
#include <stdio.h>
using namespace std;
int main() {
cout << "Hello every body!" << endl;
getchar();
}
Lp trnh C++
Nguyn Ph Qung
Dng 07: getchar() l hm gip chng trnh dng li v i ngi dng g mt phm bt k. Thc
cht, trong v d ny khng cn phi dng chng trnh. Nhng do c tnh ca mi trng DevC
v VC l mn hnh output s bin mt sau khi chng trnh chy xong, do chng ti a thm
lnh ny dng chng trnh li, gip cc bn quan st thy xu k t in trn mn hnh.
I.3.
II.
NGN NG
II.1.
C bn v ngn ng
Khi bn tho mt ngn ng lp trnh, vic hc mt ngn ng khc l tng i n gin (cng
nh bn hc ting Anh th c th hc ting Php rt nhanh v hai ngn ng ny c nhiu t tng
ng vi nhau).
Vic hc ngn C++ (cng nh hc ting Anh) em li cho bn li th rt ln v y l ngn ng
c s dng ph bin nht. Hn th na c rt nhiu cc ngn ng lp trnh khc c xy dng
trn c s c php ca C++ (gi l cc ngn ng ging-C C-like), do bn c th tip cn rt
nhanh vi cc ngn ng ny nu thng tho vi C++.
II.2.
II.2.1.
Kiu
Cc kiu c bn
Phn ny trnh by cc kiu d liu c bn ca C++. Trong gii hn ca ti liu ny, ti khng trnh
by v con tr. Mc d con tr l mt trong nhng c im ni bt ca C++ nhng tnh phc tp
ca con tr d gy nhm ln cho ngi mi lm quen. Chng ta s gii quyt cc bi ton trn C++
m khng hoc hn ch ti a s dng con tr.
a.
Kiu s
S nguyn
-
Vic la chn kiu d liu trong bi ton phc thuc vo vng gi tr ca bin. Khong gi
tr cng ln, bin cng chim nhiu b nh. Chng trnh C++ dch trn DevC hot ng
trn mi trng Windows thng l h iu hnh 32 bit, s nguyn c s dng ph bin
nht l kiu int.
5
Lp trnh C++
Nguyn Ph Qung
V d
char a;
int b = 20;
long c = 30;
unsign char d = 200;
S thc
-
Logic
-
II.2.2.
Cc kiu phc
a.
Kiu mng
-
V d
int a[100];
//
//
//
//
//
long b[10];
int a[3][3];
a[1][1] = 5;
b.
//
//
//
//
//
//
//
//
Kiu struct
Struct l kiu d liu cho php bn tp hp nhiu thnh phn vo trong cng mt bin. Ly v d
thng tin ca mt im gm 2 ta x, y, thng tin ca mt on thng gm im u v im
cui.
Struct l kiu d liu, do bn phi khai bo kiu d liu bng lnh typedef ri mi c th khai
bo c cc bin thuc kiu ny. C php khai bo struct nh sau:
struct <Tn_kiu> {
// Khai bo kiu struct
<Kiu_trng_1> <Tn_trng_1>;
// Trng ca struct (ging khai bo bin)
<Kiu_trng_2> <Tn_trng_2>, <Tn_trng_3>;
};
<Tn_kiu> <bin_1>, <bin_2>;
<bin_1>.<Tn_trng_1> = <Gi_tr>;
Cc thnh phn khai bo bn trong struct c gi l trng (field). Mt struct gm nhiu trng,
bin thuc kiu struct
Lp trnh C++
II.2.3.
Nguyn Ph Qung
Cc kiu stl
a.
Kiu string
b.
Kiu vector
c.
Kiu vector
II.3.
II.4.
II.4.1.
Biu thc
II.4.2.
Ton t
a.
Cc php ton s hc
-
Php cng +
o a+b
Php tr o a-b
Php nhn *
o a*b
10 / 3 cho gi tr 3
Php ly d: %
o 10 % 3 cho gi tr 1
b.
So snh bng ==
o 10 == 3 cho gi tr false
o 10 == 10 cho gi tr true
So snh khc !=
o 10 != 3 cho gi tr true
7
Lp trnh C++
Nguyn Ph Qung
So snh ln hn >
So snh nh hn <
c.
Php ton or ||
o 10==3 || 5>4: cho gi tr true
o 10==3 || 5<4 cho gi tr false
d.
e.
Php tng 1 n v
o i++ (ch dnh cho bin c gi tr nguyn)
Php gim 1 n v
o i
Lp trnh C++
III.
Nguyn Ph Qung
LNH
III.1.
III.1.1.
Php gn
III.2.
Khi lnh
Cc khi lnh phn chng trnh thnh nhiu khi con. Vic phn khi gip chng trnh r
rng, d hiu hn theo nguyn tc chia tr. Mt khi lnh c t trong cp ngoc { } v c
coi nh mt lnh n.
C++ cho php khai bo bin ti bt k ni no trong chng trnh. Bin khai bo trong khi lnh
no th ch tn ti trong khi chng trnh (bin khai bo trong khi chng trnh trong khng
th s dng trong khi chng trnh ngoi).
V d v vic s dng cc khi chng trnh.
if (a>b) {
int m;
//
m = 1;
//
if (d>e) {
m = 5; //
}
} else {
m = 10;
//
}
III.3.
Lnh r nhnh
Lnh if s dng c hay khng thc hin mt on chng trnh theo mt iu kin (gi l r
nhnh). Lnh if gm 2 dng: rt gn v y
-
o <iu_kin> c th l
Lp trnh C++
Nguyn Ph Qung
#include <iostream>
#include <stdlib.h>
using namespace std;
int main ()
{
int gio;
cout << "Nhap vao gio (0-24): ";
cin >> gio;
if (gio<12)
{
cout << "Chao buoi sang";
} else
{
cout << "Chao buoi chieu";
}
getchar();
getchar();
}
III.4.
Vng lp for
III.4.1.
Vng lp for ca C++ khi qut hn vng lp for ca Pascal. Bn c th s dng vng lp vi c
php rt mm do cho nhiu hon cnh khc nhau. C php ca vng lp for nh sau:
for (<Lnh_khi_to> ; <iu_kin> ; <Lnh_thay_i>)
{
<Lnh_lp>;
}
Lp li bc kim tra
Lp trnh C++
Nguyn Ph Qung
Lp li bc kim tra
Lp li bc kim tra
Nh vy, vi vng lp nu trn, chng trnh thc hin lnh lp 3 ln, vit ra mn hnh 3 dng
i=0
i=1
i=2
Vng lp kt thc khi i = 3 (iu kin kim tra sai)
III.4.2.
V d s dng vng lp for lng nhau vit bng cu chng ra mn hnh. Trong trng hp ny
vng lp for s hot ng nh sau:
i=0
- Thc hin vng lp for vi j = 0, 1, 2,... , 8, 9 (10 ln lp, mi ln vit ra tch i*j), sau
vit xung dng.
i= 1
- Thc hin vng lp vi j = 0, 1, 2,... 9
i=2
- ....
i=9
- Thc hin vng lp vi j = 0, 1, 2,... 9
#include <iostream>
#include <stdlib.h>
#include <iomanip>
using namespace std;
int main ()
{
for (int i=0; i<10; i++)
{
for (int j=0; j<10; j++) cout << setw(4) << i*j;
cout << endl;
}
getchar();
11
Lp trnh C++
Nguyn Ph Qung
Vng lp for ca C++ c th thay th vng lp for... downto ca Pascal bng cch thay i iu kin
kim tra v lnh tng thnh lnh gim. V d sau vit ra 100 s t 990, 980, 970 n 0
#include <iostream>
#include <stdlib.h>
#include <iomanip>
using namespace std;
int main ()
{
for (int i=990; i>=0; i-=10)
{
cout << i << " ";
}
getchar();
}
III.4.3.
// Xt tng s
// Xt tt c cc s t 2 n cn 2 ca i
for (j=2, m = sqrt(i); j<=m; j++) {
if (i%j==0) break; // Nu c 1 s l c th thot
}
// Nu thot khi i chia ht cho j th i ko phi l s nguyn t
// Nu i khng chia ht cho j, s i l nguyn t
if (i%j!=0) cout << i << " ";
}
getchar();
}
12
Lp trnh C++
Nguyn Ph Qung
III.5.
Vng lp while
C php
while (<iu_kin>)
{
<Lnh_lp>;
}
III.6.
Vng lp do...while
do
{
<Lnh_lp>;
} while (<iu_kin>);
III.7.
Lnh goto s dng nhy n mt v tr trong chng trnh. Lnh goto ph v tnh cu trc ca
chng trnh nhng nu bit tn dng s lm gim phc tp ca chng trnh. Vn vi v d vit
ra cc s nguyn t, bn c th chnh sa chng trnh cho n gin hn bng cch s dng goto:
#include <iostream>
#include <stdlib.h>
#include <math.h>
using namespace std;
int main()
{
int n = 100;
int i, j, m;
for (i=1; i<=n; i++) {
for (j=2, m = sqrt(i); j<=m; j++) {
// Nu i chia ht cho j, nhy n v tr "KoNguyenTo"
if (i%j==0) goto KoNguyenTo;
}
// Nu i khng chia ht cho bt c j no, i l s nguyn t
cout << i << " ";
// Nu i chia ht cho 1 s j, Chng trnh s nhy trc tip n
// v tr KoNguyenTo
KoNguyenTo:;
}
getchar();
}
IV.
HM
IV.1.
nh ngha hm
C php:
<Kiu_hm> <Tn_hm>([Danh_sch_tham_s])
{
<Lnh>;
return <Gi_tr_tr_v>;
<Lnh>;
}
Trong :
- <Kiu_hm>: Kiu gi tr tr v ca hm, (nu hm khng tr v gi tr, kiu hm l void)
13
Lp trnh C++
Nguyn Ph Qung
IV.2.
V d khai bo hm
#include <iostream>
#include <fstream>
#include <stdio.h>
using namespace std;
// Hm tnh tng ca 2 s
// C 2 tham s a, b (kiu int)
// Tr v tng ca a v b (kiu int)
int Tong(int a, int b)
{
return a+b;
}
int main()
{
cout << "Ham tinh tong: " << Tong(20,34) << endl;
getchar();
}
IV.3.
Khi no s dng hm
IV.4.
Hm c gi nh th no?
Lp trnh C++
Nguyn Ph Qung
- Sau khi thot khi hm, vng b nh cp cho cc tham s v bin trong hm c khi
phc, stack tr v trng thi c
- Cc hm c th gi ln nhau, mi ln gi hm stack li y thm. Stack cha thng tin th
t cc hm gi nhau v cc bin trong hm (thng tin ny gi l Call stack)
IV.5.
Hm gi quy
Chng trnh trn tnh giai tha ca mt s bng cch s dng hm GiaiThua. Bn thn hm ny s
dng cng thc truy hi n! = n * (n-1)! Hm GiaiThua(n) gi hm GiaiThua(n-1), GiaiThua(n-1)
gi GiaiThua(n-2). C tun t cho n hm GiaiThua(1), hm ny qu n gin v cho gi tr 1 nn
khng gi quy.
Nh vy, hm GiaiThua(n) c tnh bng cch gi quy n ln thay v dng vng lp. cc bn
hiu r hn v quy, chng ta phn tch hot ng ca hm GiaiThua(n) vi n=4.
Begin
End
return
4*6=24
4>=1
return
3*2=6
4*GiaiThua(3)
return
2*1=2
3*GiaiThua(2)
2>=1
2*GiaiThua(1
)
return
1
1>=1
Chng ta hy th phn tch qu trnh hot ng ca cc hm khi gi quy qua bng sau
15
Lp trnh C++
Nguyn Ph Qung
Bc
M t
main()
gi GiaiThua(4)
Hm GiaiThua(4)
GiaiThua(3)
gi GiaiThua(3)
Stack
gi
hm
4
gi GiaiThua(2)
Hm GiaiThua(3)
GiaiThua(2)
gi
hm
2
3
4
gi GiaiThua(1)
Hm GiaiThua(2)
GiaiThua(1)
gi
hm
1
2
3
4
1
2
3
4
2
3
4
3
4
Lp trnh C++
Nguyn Ph Qung
Thot tr v hm gi hm
ny (l hm main())
V.
MNG
V.1.
nh ngha
V.2.
V.3.
Khi to mng
V.4.
V.5.
VI.
CON TR
VI.1.
Khai bo con tr
VI.2.
VI.3.
Con tr v mng
VI.4.
Con tr hm
VII.
VII.1.
STRUCT
nh ngha Struct
17
Lp trnh C++
Nguyn Ph Qung
VII.2.
Khai bo bin
VII.3.
Truy cp trng
VIII.
Stream
VIII.1.
File stream
VIII.1.1.
Ghi file
ghi d liu ra file text, bn s dng kiu d liu ofstream (o = output, f = file). Kiu d liu ny
yu cu bn phi khai bo header l <fstream>.
iostream c cc phng thc sau:
-
f.close(): ng file
#include <iostream>
#include <fstream>
using namespace std;
int main () {
ofstream myfile;
myfile.open ("c:/vidu.txt");
myfile << "Ghi thong tin ra file." << endl;
myfile << 123.43 << endl;
myfile.close();
return 0;
}
VIII.1.2.
-
c file
Tng t ghi file, c file text s dng kiu d liu ifstream (i = input, f = file).
#include <iostream>
#include <fstream>
#include <stdio.h>
using namespace std;
int main () {
ifstream myfile;
myfile.open ("c:/vidu.txt");
int a, b, c, d, e;
myfile >> a >> b >> c >> d >> e;
myfile.close();
cout << a << " " << b << " " << c << " " << d << " " << e << endl;
getchar();
return 0;
Lp trnh C++
Nguyn Ph Qung
f.get(): c 1 k t trn file: S dng c k t xung dng sau khi dng cc ton t dn
hng t stream ra bin (tham kho v d). Tr v k t va c c.
/*
c vo t file readfile.txt vi cu trc
Dng 1: S dng ca mng 2 chiu
Cc dng tip theo, mi dng l cc phn t ca mng 2 chiu (lu , s phn t
mi dng c th khc nhau, khng c s ghi s lng phn t u)
*/
#include <iostream>
#include <fstream>
// header cho c ghi file
#include <sstream>
// header cho c ghi trn string
#include <stdio.h>
#include <vector>
using namespace std;
int main () {
int n;
typedef vector<int> dong;
vector<dong> a;
string line;
int b;
ifstream f("readfile.txt");
// M file
f >> n; f.get();
// c s dng, f.get(): xung dng
a.resize(n);
// t s dng cho mng 2 chiu
for (int i=0; i<n; i++)
{
getline(f, line);
// c t dng vo xu line
istringstream fs(line);
// To stream fs t xu line
while (fs >> b) a[i].push_back( b ); // c tng s t stream fs
}
f.close();
// ng file
for (int i=0; i<a.size(); i++)
// In cc phn t ca mng
{
for (int j=0; j<a[i].size(); j++) cout << a[i][j] << " ";
cout << endl;
}
}
getchar();
VIII.2.
String stream
VIII.2.1.
istringstream
VIII.2.2.
ostringstream
VIII.3.
Ghi c nh dng
C h tr c ghi theo nh dng (v d: s lng ch s sau du phy) bng cch s dng cc tham
s % trong phn nh dng.
19
Lp trnh C++
Nguyn Ph Qung
C++ cng cho php lm tng t vi th vin iomanip (vit tt ca manipulate). s dng th
vin ny, bn khai bo
#include <iomanip>
VIII.3.1.
VIII.3.2.
Ghi vi s lng k t xc nh
{
<< setw(10) << 123 << setw(10) << 456 << endl;
<< setw(10) << 123 << 456 << endl;
<< left << setw(10) << 123 << setw(10) << 456 << endl;
//
//
// 123
123
123456
456
456
getchar();
VIII.3.3.
Ghi vi h c s 8, 10, 16
// 7b
// 7b
// 173
// 0x7b
// 123
// 0173
// 7b
20
Lp trnh C++
Nguyn Ph Qung
IX.
X.
CP PHT B NH NG
XI.
LP
XII.
MU
XIII.
TH VIN CHUN
XIII.1.
XIII.1.1.
Cc khi nim
Container
Container (thng cha) l khi nim ch cc i tng lu tr cc i tng (gi tr) khc. i
tng container s cung cp cc phng thc truy cp cc thnh phn (element) ca n. C th
hn, tt c cc container u cha cc b lp (iterator) cho php duyt qua ton b cc element
ca container.
Cc container c phn loi theo tnh cht th t ca cc element, bao gm cc loi sau:
-
Forward container
Reversible container
Mt s container hay c s dng nht gm vector (tng t nh mng), vector l Random access
container (ngi dng c th truy cp trc tip bt c phn t no trn vector).
XIII.1.2.
Iterator
Lp trnh C++
Nguyn Ph Qung
Khi nim iterator cho php bn lm vic mt cch tng qut vi bt k mt kiu d liu no, t
nhng kiu d liu truy cp ngu nhin (vector) n cc nh x (map), tp hp (set), danh sch (list)
cho n nhng kiu d liu n gin nh mng.
Do , iterator gn lin vi tt c cc loi container, y l khi nim bn cn nm rt vng nu
mun lm vic tt vi STL.
XIII.1.3.
M t
a.begin()
Tr v iterator bt u ca container
a.end()
a.size()
a.max_size()
a.empty()
a.swap(b)
XIII.2.
Kiu vector
Kiu vector c th coi l kiu mng trong lp trnh C truyn thng. Mng l tp hp cc gi tr cng
kiu, c sp xp ni tip nhau. Cc phn t ca mng c th c truy cp ngu nhin qua ch s.
Vn t ra: Nu vector l mng th ti sao li phi s dng vector khi bn qu quen thuc vi
mng? Chng ti xin phn tch mt s nhc im sau ca mng:
-
Nu bn s dng mng ng: Bn phi xin cp pht b nh, lm vic vi con tr. Con tr l
khi nim hay trong C, C++, nhng n l nguyn nhn ca rt nhiu rc ri trong lp trnh.
vector l mt container cung cp kh nng s dng mng mm do, c kim sot range check khi
cn thit, vi kch thc ty (m khng cn phi s dng con tr). Ngoi ra vector cho php bn
chn thm hoc xa i mt s phn t ch bng 1 lnh (khng phi s dng vng lp nh i vi
mng).
s dng vector, bn phi khai bo file header vi c php
#include <vector>
22
Lp trnh C++
XIII.2.1.
Nguyn Ph Qung
V d 1
V d trn cho bn thy vic s dng vector rt n gin, hon ton ging vi mng nhng b nh
c qun l t ng, bn khng phi quan tm n gii phng cc vng b nh xin cp pht.
XIII.2.2.
V d 2
Tuy nhin, vic s dng vector khng ch dng li nhng u im trn, chng ta hy nghin cu
v d tip theo thy c cc u im khc ca vector.
#include <iostream>
#include <vector>
#include <stdio.h>
using namespace std;
int main() {
int i;
vector<int> V;
for (i=0; i<5; i++)
V.push_back(i);
cout << endl << "Mang truoc khi insert" << endl;
for (i=0; i<V.size(); i++)
// Ghi li ni dung ca mng ra mn hnh
cout << V[i] << endl;
V.insert( V.begin()+3, 100 );
cout << endl << "Mang sau khi insert" << endl;
for (i=0; i<V.size(); i++)
// In ni dung ca vector sau khi chn
cout << V[i] << endl;
// vector s c 6 phn t, phn t 100 chn vo
// V tr th 3 ca vector
V.erase( V.begin()+3 );
// Xa phn t va chn vo i
cout << endl << "Mang sau khi erase" << endl;
for (i=0; i<V.size(); i++)
// In ni dung ca vector sau khi xa
cout << V[i] << endl;
// Vector li ging nh lc mi khi to
getchar();
}
Lp trnh C++
Nguyn Ph Qung
XIII.2.3.
V d 3
24
Lp trnh C++
XIII.2.4.
Nguyn Ph Qung
V d 4
<<
<<
<<
<<
"V[0]="
"V[1]="
"V[2]="
"V[3]="
<<
<<
<<
<<
V[0]
V[1]
V[2]
V[3]
<<
<<
<<
<<
endl;
endl;
endl;
endl;
<<
<<
<<
<<
<<
endl;
endl;
endl;
endl;
endl;
endl;
//
//
//
//
//
//
//
//
//
//
s dng try...catch by li
Khi to vector gm 3 thnh phn
Tt c gn gi tr 10
a thnh phn 0 ra mn hnh
a thnh phn 1 ra mn hnh
a thnh phn 2 ra mn hnh
Thnh phn 3 (lnh ny hot ng khng
ng v V ch c 3 thnh phn 0,1,2
Thnh phn 4 (cng khng ng)
Nhng 2 lnh trn u khng gy li
//
//
//
//
Khng
Thnh
Thnh
Thnh
s dng
phn 1,
phn 2,
phn 3:
<-- OK
<-- OK
<-- OK
<-- Sai, ko c gi tr ny
<-- Sai
<-- OK
<-- OK
<-- OK
<-- Thng bo li khi s dng phn t khng hp l
Phng thc at(ch_s) c tc dng tng t nh dng k hiu [], nhng c mt s khc
bit l thao tc ny c kim tra ch s hp l. Minh chng cho nhn xt ny trong v d khi
chng trnh chy n v tr lnh V.at(3), lnh ny khng cho ra kt qu m to thnh thng
bo li.
XIII.2.5.
V d 5
#include <iostream>
#include <vector>
#include <stdio.h>
using namespace std;
int main() {
typedef vector<long> vlong;
vector<vlong> V(3, vlong(3) );
int i, j;
for (i=0; i<3; i++)
25
Lp trnh C++
Nguyn Ph Qung
for (j=0; j<3; j++) V[i][j] = rand() % 10;
V d ny minh ha vic s dng mng 2 chiu, thc cht y l mt vector ca vector. Mng 2
chiu s dng bin php ny c th c kch thc khc nhau gia cc dng (v d mng 2 chiu l
na trn ca ma trn)
XIII.2.6.
#include
#include
#include
#include
#include
XIII.3.
Kiu string
Lp trnh C++
XIII.3.1.
Nguyn Ph Qung
Hm chn xu (insert)
XIII.3.2.
Hm xa xu (erase)
XIII.3.3.
Hm thay th xu k t (replace)
XIII.3.4.
Hm ly xu con (string)
27
// "Con"
// "chay"
Lp trnh C++
XIII.3.5.
Nguyn Ph Qung
XIII.3.6.
// 7
// -1
XIII.3.7.
// 7
// 16
V d 1
In k t u tin ca xu
In k t th 2
In k t th 3
Ni xu k t
endl;
Xa 1 on trn xu k t
endl;
XIII.3.8.
V d 2: Tch xu k t
28
Lp trnh C++
Nguyn Ph Qung
#include <stdio.h>
#include <string>
using namespace std;
int main() {
string S = "Xin
chao tat ca cac
ban";
string::iterator t, t2;
vector<string> split;
for (t=S.begin(); t<S.end();) {
t2=find(t, S.end(), ' ');
// k t v tr t
if (t!=t2) split.push_back(string(t, t2));
t = t2+1;
}
for (int i=0; i<split.size(); i++) {
cout << split[i] << endl;
}
getchar();
return 0;
}
//
//
//
//
//
Khi to gi tr ca xu
Cc bin lp
Mng cc xu (lu kt qu tch)
Lp t v tr bt u
Tm k t space ' ' u tin
// Ly xu k t gia 2 v tr
// Chuyn sang v tr sau
// In mng cc xu k t
XIII.4.
list l kiu danh sch lin kt 2 chiu (hy lin h vi cc kin thc ca mn Cu trc d liu v
Gii thut). Khc bit ca kiu danh sch lin kt vi kiu mng ch:
-
Mng cn nhiu thi gian thm hoc xa phn t (dch chuyn cc phn t pha sau sang
phi hoc sang tri), cn danh sch lin kt thc hin cc thao tc thm, xa vi thi gian
khng ng k (ch cn ct t lin kt c, to ra lin kt mi).
Mng cho php truy xut cc phn t ngay lp tc thng qua ch s (truy cp ngu nhin random access), cn danh sch lin kt phi truy cp cc phn t theo th t tun t.
29
Lp trnh C++
Nguyn Ph Qung
c. empty ()
c.max_size()
c1 == c2
c1 != c2
c1 < c2
c.front()
c.back()
c.begin()
c.end()
c.sort()
c1.merge(c2) Trn danh sch c1 vi danh sch c2 (vi iu kin c 2 danh sch u
sp xp vi ton t <). Danh sch c trn cng s c sp xp vi
ton t <. y l thut ton trn 2 ng vi 2 danh sch c sp
xp ( phc tp l tuyn tnh)
XIII.4.1.
#include
#include
#include
#include
getchar();
30
Lp trnh C++
XIII.4.2.
#include
#include
#include
#include
Nguyn Ph Qung
getchar();
XIII.4.3.
V d 3: Tch list
XIII.4.4.
V d 4: Sp xp list
#include
#include
#include
#include
<iostream>
<algorithm>
<stdlib.h>
<list>
XIII.4.5.
#include
#include
#include
#include
V d 5: Trn list
<iostream>
<algorithm>
<stdlib.h>
<list>
31
Lp trnh C++
Nguyn Ph Qung
list<int>::iterator vi;
cout << endl << "Danh sach A sau khi sap xep" << endl;
Va.sort();
for (vi=Va.begin(); vi!=Va.end(); vi++) {
cout << *vi << endl;
}
cout << endl << "Danh sach B sau khi sap xep" << endl;
Vb.sort();
for (vi=Vb.begin(); vi!=Vb.end(); vi++) {
cout << *vi << endl;
}
cout << endl << "Danh sach A sau khi tron voi danh sach B" << endl;
Va.merge(Vb);
for (vi=Va.begin(); vi!=Va.end(); vi++) {
cout << *vi << endl;
}
getchar();
}
XIII.5.
#include <iostream>
#include <set>
#include <stdio.h>
using namespace std;
int main() {
set<int> A;
A.insert(5);
A.insert(7);
A.insert(10);
A.insert(15);
cout << (A.find(3)!=A.end()) << endl;
cout << (A.find(5)!=A.end()) << endl;
cout << (A.find(7)!=A.end()) << endl;
cout << (A.find(10)!=A.end()) << endl;
getchar();
}
XIII.6.
XIII.6.1.
32
Lp trnh C++
Nguyn Ph Qung
Nu thc hin tm kim bnh thng trn mt mng N phn t, bn phi mt trung bnh N/2 php
tm kim. D liu ca cc key c t chc di dng cy heap (l tri nh hn gc, l phi ln
hn gc) nn vic tm kim cc cp theo kha rt nhanh, thi gian trung bnh l log 2N (v su
ca cy l log2N).
Nu bn bit tn dng, map c th ng dng gii rt nhiu dng bi ton khc nhau. Trong phn
ny, chng ti xin gii thiu mt s ng dng ca map
-
m s lng ca mt thnh phn (cho mt lot cc phn t, tm xem c bao nhiu phn t
v mi phn t xut hin bao nhiu ln)
S dng lu ma trn tha (ma trn tha l ma trn gm rt nhiu phn t bng 0). Trong
cc bi thi Tin hc, nhiu trng hp cc bn gp phi nhng ma trn c kch thc rt ln
(1 triu x 1 triu chng hn) nhng s lng phn t khc 0 ch khong vi trm nghn.
Trng hp ny s dng map lu ma trn l rt thch hp.
XIII.6.2.
Cc phng thc
Phng thc M t
c.size()
c1 == c2
c1 != c2
c1 < c2
c.begin()
c.end()
c[k]
c.find(k)
XIII.6.3.
V d: s dng map
#include <iostream>
#include <stdlib.h>
#include <map>
using namespace std;
int main() {
int a[] = {2,4,1,3,5,3,5,3,2,1,2,3,4,4,3,1,2};
int n = sizeof(a)/sizeof(a[0]);
map<int, int> m;
for (int i=0; i<n; i++) {
m[a[i]] ++;
}
map<int, int>::iterator j;
for (j=m.begin(); j!=m.end(); j++)
cout << "Phan tu " << j->first << " xuat hien "
<< j->second << " lan " << endl;
getchar();
33
Lp trnh C++
XIII.6.4.
Nguyn Ph Qung
V d: t in
#include <iostream>
#include <stdio.h>
#include <map>
using namespace std;
class sv {
public:
int maso;
string ten;
string lop;
};
void print() {
cout << "****************************************" << endl
<< "Ma so: " << maso << endl
<< "Ho ten: " << ten << endl
<< "Lop: " << lop << endl;
}
int main () {
sv a[] = {
{1342,
"Mai", "48th"},
{43212, "Lan", "47th"},
{33133, "Cuc", "47th"},
{43321, "Truc", "45th"},
{1234,
"Dao", "42th"}};
int n = sizeof(a)/sizeof(a[0]);
map<int, sv> m;
for (int i=0; i<n; i++) m[a[i].maso] = a[i];
m[43212].print();
m[1234].print();
getchar();
return 0;
XIII.6.5.
V d: m
#include <iostream>
#include <stdlib.h>
#include <map>
using namespace std;
int main() {
string a[] = {"chuoi", "na", "oi", "tao", "chuoi", "oi", "na", "tao", "oi"};
int n = sizeof(a)/sizeof(a[0]);
map<string, int> m;
for (int i=0; i<n; i++) {
m[a[i]] ++;
}
map<string, int>::iterator j;
for (j=m.begin(); j!=m.end(); j++)
cout << "Xau ky tu '" << j->first << "' xuat hien "
<< j->second << " lan " << endl;
getchar();
XIII.6.6.
XIII.7.
V d: ma trn tha
Kiu hash_map (nh x dng mng bm)
Kiu map cho php nh x gia tp kha v tp gi tr vi thi gian O(logN). Map s dng cu trc
d liu kiu cy nn phc tp l log2N. Tuy nhin, bn c th s dng cu trc d liu mnh hn
l mng bm (hash_map). Hash_map c th tm kim theo kha vi phc tp O(1).
34
Lp trnh C++
XIII.8.
Nguyn Ph Qung
Trong lp trnh gii cc bi ton Tin hc bng Pascal, nhiu bn qun mt mt kiu d liu rt
mnh l kiu tp hp (kiu d liu ny cho php kim tra xem mt phn t c nm trong tp hp
hay khng, tm phn giao, hp, hiu ca hai tp hp vi nhau). Pascal l mt trong t ngn ng c
kiu d liu nguyn thy l tp hp. C v C++ khng c kiu d liu ny. Tuy nhin, bn c th s
dng kiu d liu tp hp trong STL. Tp hp trong STL cn mnh hn tp hp trong Pascal rt
nhiu v n h tr tt c cc kiu d liu (tp hp trong Pascal ch h tr dng s) vi s lng phn
t khng hn ch (tp hp ca Pascal ch c ti a 256 phn t).
XIII.9.
Nh gii thiu trong cc phn trc, STL cung cp cc thut ton c bn nhm mc ch gip
bn khng phi code li nhng gii thut qu c bn nh (sp xp, thay th, tm kim...). Cc cng
c ny khng nhng gip bn rt ngn thi gian lp trnh m cn c thi gian g ri khi thut ton
c bn c ci t khng chnh xc. Ngoi ra, vi STL Algorithm, bn c nhiu la chn cho
nhng thut ton c bn. V d, vi thut ton sp xp, bn c th la chn gia thut ton sp xp
nhanh (quicksort) cho kt qu rt nhanh vi phc tp NlogN trong a s cc trng hp, nhng
li c phc tp N*N trong trng hp xu nht v thut ton sp xp vung ng (heapsort) chy
chm hn quicksort nhng c phc tp trong mi trng hp l NlogN.
Ch rng cc thut ton ca STL Algorithm c th p dng cho mi kiu iterator, k c con tr
thng (khng phi l iterator ca STL). Nh vy, cc thut ton sp xp, tm kim, thay th khng
nhng p dng c cho cc kiu vector, list... m cn c th p dng cho mng thng thng.
khai bo s dng STL algorithm, cc bn phi inlucde file header algorithm
#include <algorithm>
Do th vin <algorithm> gm rt nhiu hm khc nhau, ngi ta phn thnh cc nhm hm sau:
-
Nhm cc hm sp xp
Nhm cc hm trn
Nhm cc hm tm min/max
XIII.9.1.
a.
#include <iostream>
#include <stdio.h>
#include <algorithm>
using namespace std;
int main() {
int A[] = {3,4,2,6,3,1,2,3,2,3,4,5,6,4,3,2,1};
int N = sizeof(A) / sizeof(*A);
int first = find(A, A+N, 1) - A;
cout << "So thu tu cua phan tu dau tien = 1: " << first << endl;
getchar();
return 0;
}
#include <iostream>
35
Lp trnh C++
Nguyn Ph Qung
#include <stdio.h>
#include <algorithm>
using namespace std;
int main() {
int A[] = {3,4,2,6,3,1,2,3,2,3,4,5,6,4,3,2,1};
int B[] = {1,2,3};
int NA = sizeof(A) / sizeof(*A);
int NB = sizeof(B) / sizeof(*B);
int vitri = search(A, A+NA, B, B+NB) - A;
cout << "Vi tri dau tien xuat hien B trong A: " << vitri << endl;
getchar();
return 0;
}
#include
#include
#include
#include
<iostream>
<stdio.h>
<algorithm>
<string>
b.
Cc thut ton m
#include
#include
#include
#include
<iostream>
<stdio.h>
<vector>
<algorithm>
"So
"So
"So
"So
luong so
luong so
nho nhat
lon nhat
1 trong mang:
3 trong mang:
trong mang: "
trong mang: "
1) << endl;
3) << endl;
A+N) << endl;
A+N) << endl;
getchar();
return 0;
XIII.9.2.
a.
<<
<<
<<
<<
// myvector: 0 0 0 0 0 0 0 0
fill (myvector.begin(),myvector.begin()+4,5);
36
// myvector: 5 5 5 5 0 0 0 0
Lp trnh C++
Nguyn Ph Qung
fill (myvector.begin()+3,myvector.end()-2,8);
// myvector: 5 5 5 8 8 8 0 0
b.
Thay th cc gi tr (replace)
c.
getchar();
d.
// 1 2 3 4 5 6 7 8 9
// 0 2 0 4 0 6 0 8 0
37
Lp trnh C++
Nguyn Ph Qung
#include <stdlib.h>
using namespace std;
int main () {
vector<int> a;
// set some values:
for (int i=1; i<10; ++i) a.push_back(i); // 1 2 3 4 5 6 7 8 9
reverse(a.begin(),a.end());
// 9 8 7 6 5 4 3 2 1
// print out content:
cout << "a contains:";
int i, n = a.size();
for (i=0; i<n; i++)
cout << a[i] << " ";
XIII.9.3.
Nhm cc hm sp xp
a.
Cc thut ton sp xp
#include
#include
#include
#include
<iostream>
<stdio.h>
<vector>
<algorithm>
#include <iostream>
#include <stdio.h>
#include <algorithm>
using namespace std;
int main() {
int A[] = {3,4,2,6,3,1,2,3,2,1};
int N = sizeof(A) / sizeof(*A);
int i;
cout << "Sap xep danh sach theo chieu tang dan" << endl;
sort(A, A+N);
for (i=0; i<N; i++)
cout << A[i] << endl;
cout << "Sap xep danh sach theo chieu giam dan" << endl;
sort(A, A+N, greater<int>() );
for (i=0; i<N; i++)
cout << A[i] << endl;
getchar();
return 0;
}
#include <iostream>
#include <stdio.h>
#include <algorithm>
using namespace std;
38
Lp trnh C++
Nguyn Ph Qung
class sv {
public:
double diem;
char *ten;
bool operator < (const sv &b) const {
return diem < b.diem;
}
};
int main () {
sv a[] = {{6,"Mai"},{7,"Lan"},{5,"Cuc"},{4,"Truc"},{3,"Dao"}};
int n = sizeof(a)/sizeof(*a);
sort(a, a+n);
for (int i=0; i<n; i++) {
cout << a[i].diem << " " << a[i].ten << endl;
}
getchar();
return 0;
}
XIII.9.4.
Mt s thut ton nh tm kim, thm vo danh sch... hot ng nhanh hn ( phc tp l log 2n
thay v n). Th vin <algorithm> h tr mt s hm lm vic ring vi cc danh sch sp xp
theo th t tng dn.
a.
Hm lower_bound(first, last, value) tr v iterator ca element cui cng trong danh sch sp
xp c gi tr khng vt qu [value].
Hm upper_bound(first, last, value) tr v iterator ca element u tin c gi tr ln hn
[value].
// lower_bound/upper_bound example
#include <iostream>
#include <algorithm>
#include <vector>
#include <stdlib.h>
using namespace std;
int main () {
int myints[] = {10,20,30,30,20,10,10,20};
int size = sizeof(myints)/sizeof(myints[0]);
vector<int> v(myints,myints+size);
// 10 20 30 30 20 10 10 20
vector<int>::iterator low,up;
sort (v.begin(), v.end());
// 10 10 10 20 20 20 30 30
low=lower_bound (v.begin(), v.end(), 20); //
^
up= upper_bound (v.begin(), v.end(), 20); //
^
cout << "lower_bound tro vao vi tri: " << int(low- v.begin()) << endl;
cout << "upper_bound tro vao vi tri: " << int(up - v.begin()) << endl;
}
b.
getchar();
Tm kim (binary_search)
39
Lp trnh C++
Nguyn Ph Qung
vector<int> v(myints,myints+9);
// 1 2 3 4 5 4 3 2 1
c.
d.
// inplace_merge example
#include <iostream>
#include <algorithm>
#include <vector>
#include <stdlib.h>
using namespace std;
int main () {
int first[] = {5,10,15,20,25};
int second[] = {50,40,30,20,10};
vector<int> v(10);
vector<int>::iterator it;
sort (first,first+5);
sort (second,second+5);
copy (first,first+5,v.begin());
copy (second,second+5,v.begin()+5);
inplace_merge (v.begin(),v.begin()+5,v.end());
cout << "The resulting vector contains:";
for (it=v.begin(); it!=v.end(); ++it)
cout << " " << *it;
}
getchar();
40
Lp trnh C++
e.
Nguyn Ph Qung
// 0
// 5 10 10 20 25
// 10 20 30 40 50
f.
// 0
// 5 10 15 20 25
// 10 20 30 40 50
XIII.9.5.
a.
Cc hm trn heap
To heap (make_heap)
41
Lp trnh C++
Nguyn Ph Qung
b.
Kt qu
initial max heap
:
max heap after pop :
max heap after push:
final sorted range :
c.
30
20
99
5 10 15 20 99
return 0;
42
Lp trnh C++
Nguyn Ph Qung
Kt qu
initial max heap
:
max heap after pop :
max heap after push:
final sorted range :
d.
30
20
99
5 10 15 20 99
Sp xp heap (sort_heap)
Kt qu
initial max heap
:
max heap after pop :
max heap after push:
final sorted range :
XIV.
30
20
99
5 10 15 20 99
XIV.1.
XIV.1.1.
Tn file: SVIEN.*
D liu vo: t file B1.INP, gm:
-
Yu cu: Tm v lit k:
-
Lp trnh C++
o
o
o
o
o
o
Nguyn Ph Qung
Ten lop
s sinh vin ca lp, s lng a phng (m)
s lng sinh vin qu a phng 1, tn a phng 1
s lng sinh vin qu a phng 2, tn a phng 2
...
s lng sinh vin qu a phng m, tn a phng m
B1.INP
B1.OUT
Nguyen Van A
46pm1
46pm1
2 1
Hung Yen
2 Hung Yen
Tran Van B
47th1
47th1
3 2
Hai Duong
2 Hai Duong
Nguyen Thi C
1 Binh Dinh
46pm1
Hung Yen
Vu Van D
47th1
Binh Dinh
Cao Thi E
47th1
Hai Duong
XIV.1.2.
#include
#include
#include
#include
Bi gii
<iostream>
<fstream>
<string>
<map>
// M file input
// S lng sinh vin
// c xung dng (sau n)
// c tn (ko s dng)
// c tn lp
// Thm s sinh vin ca lp
// c qu
// Thm s sinh vin thuc qu ca lp
44
Lp trnh C++
Nguyn Ph Qung
}
fi.close();
// ng file input
ofstream fo;
fo.open(OUTPUT);
// M file output
map<string, int>::iterator j;
fo << lop.size() << endl;
// Ghi s lng lp
for (j=lop.begin(); j!=lop.end(); j++) {// Lp qua tng lp
fo << j->first << endl;
// Ghi tn lp (thnh phn u ca pair)
map<string, int> &quei = que[j->first];
// Gn bin tham chiu n bin m qu
// Ca lp tng ng
fo << j->second << " " << quei.size() << endl;
// Ghi s lng sinh vin ca lp v
// s lng qu qun ca sv trong lp
map<string, int>::iterator t;
for (t=quei.begin(); t!=quei.end(); t++) {
// Vi mi vng qu, ghi s lng sv
// qu v tn qu
fo << t->second << " " << t->first << endl;
}
}
fo.close();
// ng file output
}
/********************* Test1 ***************************
5
Nguyen Van A
46pm1
Hung Yen
Tran Van B
47th1
Hai Duong
Nguyen Thi C
46pm1
Hung Yen
Vu Van D
47th1
Binh Dinh
Cao Thi E
47th1
Hai Duong
********************************************************/
XIV.2.
XIV.2.1.
Ro t
bi
Tn file: RAO.*
-
45
Lp trnh C++
XIV.2.2.
XIV.3.
Nguyn Ph Qung
Bi gii
Robot
XIV.3.1.
bi
XIV.3.2.
#include
#include
#include
#include
Bi gii
<iostream>
<fstream>
<string>
<map>
// c n khi ht file
// c xu k t
46
Lp trnh C++
Nguyn Ph Qung
switch (s[0]) {
// Kim tra k t u
case 'R':
// R: Quay phi
huong = (huong+1)%4;
break;
case 'L':
// L: Quay tri
huong = (huong+3)%4;
break;
case 'G':
// Tin theo hng hin ti
fi >> n;
// c thm gi tr n
for (i=0; i<n-1; i++) {
x += dx[huong];
// dch chuyn tng bc
y += dy[huong];
// m cc nu trng thi chi l h xung
if (choi) A[diem(x, y)] ++;
}
break;
case 'U':
// Nhc chi
choi = false;
break;
case 'D':
// H chi
choi = true;
A[diem(x, y)] ++;
// m lun va h
break;
}
}
fi.close();
ofstream fo;
fo.open(OUTPUT);
fo << A.size();
fo.close();
XIV.4.
Dijsktra
XIV.4.1.
bi
XIV.4.2.
Bi gii
XIV.5.
XIV.5.1.
Cho n hnh ch nht c cnh song song vi cc trc Ox, Oy. Tm tng din tch khng gian b che
bi cc hnh ch nht ny (Din tch phn hp ca cc hnh ch nht);
XIV.5.2.
Bi gii
Lp trnh C++
Nguyn Ph Qung
. Ko di cc cnh ng
. Ko di cc cnh ngang
. Cc cnh ny chia khng gian thnh mt li hnh ch nht.
- Mi hnh ch nht s che mt s trong li ny
- m tng din tch ca cc b che, bn tnh c din tch ca phn che ph ca tt c
cc hnh ch nht.
/*
Cho 1 danh sach cac hinh chu nhat co canh song song voi man hinh
Tim hinh chu nhat co dien tich la hop cua cac hinh chu nhat nay
*/
#include
#include
#include
#include
#include
<iostream>
<fstream>
<vector>
<map>
<algorithm>
// Bng nh du cc b che
// Danh sch cc hnh ch nht
// Ta cc li dc v ngang
// Hm i ch 2 s thc
// Hm khai bo inline chy nhanh hn
int main()
{
fstream f(input);
f >> n; f.get();
// S hnh ch nht
cn.resize(n);
for (int i=0; i<n; i++)
// c thng tin tng hnh ch nht
{
chunhat &a = cn[i];
// i ch nu cc ta khng hp l
f >> a.xmin >> a.ymin >> a.xmax >> a.ymax; f.get();
if (a.xmin>a.xmax) swap(a.xmin, a.xmax);
if (a.ymin>a.ymax) swap(a.ymin, a.ymax);
tx.push_back(a.xmin);
tx.push_back(a.xmax);
ty.push_back(a.ymin);
ty.push_back(a.ymax);
// To mng tx: ta cc li ng
// To mng ty: ta cc li ngang
}
f.close();
sort(tx.begin(), tx.end());
sort(ty.begin(), ty.end());
// Sp xp cc ta li dng v ngang
a.resize(2*n);
// To mng (2n)*(2n), ton s 0
for (int i=0; i<2*n; i++) a[i].resize(2*n, 0);
48
Lp trnh C++
Nguyn Ph Qung
double dt = 0;
for (int i=0; i<n; i++)
{
chunhat b = cn[i];
int xmin = mx[b.xmin];
int ymin = my[b.ymin];
int xmax = mx[b.xmax];
int ymax = my[b.ymax];
//
//
//
//
}
/*
2
0 0 1 1
0 0 2 2
*/
XV.
INPUT V OUTPUT
49