Giáo trình cấu trúc dữ liệu và giải thuật phần 1 tài liệu, ebook, giáo trình
C++ 2011 april_draft
1. Mc lc
Gii thieu...........................................................................................................6
Chơng 1. M dâu .........................................................................................8
1.1. Chơng trình là gì?.............................................................................8
1.2. Lap trình là gì? ...................................................................................8
1.2.1. M
c cao doc lap vi máy tính ......................................................8
1.2.2. M
c thâp ph thuoc vào máy tính ..............................................10
1.3. Ngôn ng
lap trình và chơng trình dch ..........................................10
1.4. Môi trng lap trình bac cao.............................................................11
1.5. Loi và tìm loi ....................................................................................13
1.6. Lch s C và C++ .............................................................................14
1.7. Chơng trình C++ dâu tiên ...............................................................15
Bài tap .........................................................................................................19
Chơng 2. Biên, kieu d
lieu và các phép toán ............................................20
2.1. Kieu d
lieu......................................................................................22
2.1.1. Kieu d
lieu cơ bn ....................................................................22
2.1.2. Kieu d
lieu dan xuât .................................................................24
2.2. Khai báo và s dng biên .................................................................24
2.2.1. Dnh danh và cách dat tên biên...................................................24
2.2.2. Khai báo biên .............................................................................25
2.3. Hang.................................................................................................25
2.4. Các phép toán cơ bn........................................................................26
2.4.1. Phép gán.....................................................................................26
2.4.2. Các phép toán sô hc..................................................................26
2.4.3. Các phép toán quan he................................................................27
1
2. 2.4.4. Các phép toán lô-gic...................................................................28
2.4.5. Do u tiên ca các phép toán......................................................28
2.4.6. Tơng thích gi
a các kieu ..........................................................29
Bài tap .........................................................................................................30
Chơng 3. Các câu trúc diêu khien ..............................................................32
3.1. Luông diêu khien..............................................................................32
3.2. Các câu trúc re nhánh .......................................................................33
3.2.1. Lenh if-else ...........................................................................33
3.2.2. Lenh switch .............................................................................39
3.3. Các câu trúc lap ................................................................................43
3.3.1. Vòng while...............................................................................43
3.3.2. Vòng do-while ........................................................................46
3.3.3. Vòng for ...................................................................................49
3.4. Các lenh break và continue .........................................................54
3.5. Bieu th
c diêu kien trong các câu trúc diêu khien.............................57
Bài tap .........................................................................................................59
Chơng 4. Hàm............................................................................................61
4.1. Các hàm có san.................................................................................62
4.2. Câu trúc chung ca hàm ...................................................................63
4.3. Cách s dng hàm............................................................................64
4.4. Biên toàn cc và biên da phơng.....................................................65
4.4.1. Ph m vi ca biên ........................................................................65
4.4.2. Thi gian sông ca biên..............................................................67
4.5. Tham sô, dôi sô, và cơ chê truyên tham sô cho hàm.........................68
4.5.1. Truyên giá tr..............................................................................68
2
3. 4.5.2. Truyên tham chiêu......................................................................69
4.5.3. Tham sô mac dnh ......................................................................72
4.6. Hàm trùng tên...................................................................................74
4.7. Hàm de quy ......................................................................................76
Bài tap .........................................................................................................78
Chơng 5. Mng ..........................................................................................80
5.1. Mng mot chiêu................................................................................80
5.1.1. Khai báo và khi t o mng .........................................................81
5.1.2. !ng dng ca mng ...................................................................83
5.1.3. Trách nhiem kiem soát tính hp le ca ch# sô mng....................85
5.1.4. Mng làm tham sô cho hàm........................................................85
5.2. Mng nhiêu chiêu .............................................................................86
5.3. Mng và xâu kí t$.............................................................................88
5.3.1. Khi t o giá tr cho xâu kí t$......................................................90
5.3.2. Th vien x lý xâu kí t$ .............................................................90
5.4. Tìm kiêm và sap xêp d
lieu trong mng ..........................................91
5.4.1. Tìm kiêm tuyên tính ...................................................................91
5.4.2. Tìm kiêm nh phân .....................................................................92
5.4.3. Sap xêp chn ..............................................................................94
Bài tap .........................................................................................................96
Chơng 6. Con tr và bo nh.......................................................................99
6.1. Bo nh máy tính ...............................................................................99
6.2. Biên và da ch# ca biên....................................................................99
6.3. Biên con tr ....................................................................................100
6.4. Mng và con tr..............................................................................105
3
4. 6.5. Bo nh dong ...................................................................................107
6.5.1. Câp phát bo nh dong...............................................................107
6.5.2. Gii phóng bo nh dong ...........................................................108
6.6. Mng dong và con tr.....................................................................109
6.7. Truyên tham sô là con tr ...............................................................111
Bài tap .......................................................................................................115
Chơng 7. Các kieu d
lieu tr'u tng ......................................................118
7.1. Dnh nghia kieu d
lieu tr'u tng bang câu trúc struct .................118
7.2. Dnh nghia kieu d
lieu tr'u tng bang câu trúc class ...............124
7.2.1. Quyên truy nhap.......................................................................127
7.2.2. Toán t ph m vi và dnh nghia các hàm thành viên ..................128
7.2.3. Hàm khi t o và hàm hy.........................................................129
7.3. Li ích ca lap trình hng dôi tng.............................................132
7.4. Biên dch riêng re ...........................................................................133
Bài tap .......................................................................................................137
Chơng 8. Vào ra d
lieu...........................................................................140
8.1. Khái niem dòng d
lieu ..................................................................140
8.2. Tep van bn và tep nh phân ...........................................................141
8.3. Vào ra tep .......................................................................................141
8.3.1. M tep......................................................................................142
8.3.2. Dóng tep...................................................................................143
8.3.3. X lý tep van bn .....................................................................144
8.3.4. X lý tep nh phân....................................................................147
Bài tap .......................................................................................................151
Ph lc A. Phong cách lap trình .................................................................153
4
5. Ph lc B. Dch chơng trình C++ bang GNU C++...................................157
Ph lc C. X lý xâu bang th vien cstring................................................160
Tài lieu tham kho .........................................................................................162
5
6. 6
Gii thieu
Lap trình là mot trong nh
ng bc quan trng nhât trong quy trình gii quyêt
mot bài toán. Nhiêu ngôn ng
lap trình dã dc ra di nham giúp chúng ta gii
quyêt các bài toán mot cách hieu qu nhât. Moi ngôn ng
lap trình có nh
ng thê
m nh và nhc diem riêng. Các ngôn ng
lap trình có the chia ra thành hai lo i
chính là ngôn ng
lap trình bac thâp (gân gui vi ngôn ng
máy), và ngôn ng
lap trình bac cao (ngân gui vi ngôn ng
t$ nhiên ca con ngi).
Giáo trình này trang b cho sinh viên nh
ng kiên th
c cơ bn vê lap trình. Ngôn
ng
lap trình C++ dc s dng de minh ha cho viec lap trình. Viec l$a chn
C++ bi vì nó là mot ngôn ng
lap trình hng dôi tng chuyên nghiep dc
s dng rong rãi trên toàn thê gii de phát trien các chơng trình t' dơn gin
dên ph
c t p. Hơn thê n
a, s$ mêm d+o ca C++ cho phép chúng ta gii quyêt
nh
ng bài toán th$c tê mot cách nhanh chóng, ngoài ra cho phép chúng ta qun
lý và tơng tác tr$c tiêp dên he thông, bo nh de nâng cao hieu qu ca chơng
trình.
Giáo trình dc chia thành 8 chơng, moi chơng trình bày mot vân dê lý
thuyêt trong lap trình. Các vân dê lý thuyêt dc mô t bang các ví d th$c tê.
Kêt thúc moi chơng là phân bài tap de sinh viên gii quyêt và nam rõ hơn vê lý
thuyêt. Câu trúc ca giáo trình nh sau:
• Chơng 1: gii thieu các khái niem cơ bn vê lap trình và quy trình gii
quyêt mot bài toán. Sinh viên se hieu vê ngôn ng
lap trình bac cao và ngôn
ng
lap trình bac thâp. Cuôi chơng chúng tôi gii thieu vê môi trng lap
trình cung nh ngôn ng
lap trình C++.
• Chơng 2: Chúng tôi gii thieu các khái niem cơ bn vê biên sô, hang sô,
các kieu d
lieu cơ bn và các phép toán cơ bn. Sau khi hc, sinh viên se
biêt cách khai báo và s dng biên sô, hang sô, và các phép toán trên biên và
hang sô.
• Chơng 3: Trơng này gii thieu vê câu trúc chơng trình cung nh các câu
trúc diêu khien. C the là các câu re nhánh (if-else, switch), câu trúc lap (for,
while, do-while) se dc gii thieu.
• Chơng 4: Chơng trình con và hàm se dc gii thieu de sinh viên hieu
dc chiên lc lap trình “chia de tr”. Chúng tôi se trình bày chi tiêt vê
7. cách khai báo và s dng hàm, cung nh cách truyên tham sô, truyên giá tr
cho hàm.
• Chơng 5: Chơng này trình bày câu trúc d
lieu kieu mng và xâu kí t$.
Cách khai báo và s dng mng mot chiêu cung nh mng nhiêu chiêu và ví
d liên quan dc trình bày chi tiêt chơng này.
• Chơng 6: Dây là mot chơng tơng dôi dac thù cho C++, khi chúng tôi
trình bày vê bo nh và kieu d
lieu con tr. Câu trúc bo nh, cách qun lý
và xin câp phép bo nh dong thông qua viec s dng biên con tr se dc
trình bày.
• Chơng 7: Trong chơng này chúng tôi se trình bày vê câu trúc d
lieu tr'u
tng (c the là struct và class trong C++). Sinh viên se hieu và biêt cách
t o ra nh
ng câu trúc d
lieu tr'u tng phù hp vi các kieu dôi tng d
lieu cân bieu dien. Cuôi chơng, chúng tôi cung gii thieu vê lap trình hng
dôi tng, mot thê m nh ca ngôn ng
lap trình C++.
• Chơng 8: Chúng tôi gii thieu vê cách vào ra d
lieu. Sinh viên se dc
gii thieu chi tiêt vê cách làm viec vi các tep d
lieu.
7
8. 8
Chơng 1. M dâu
Trong chơng này, chúng tôi se gii thieu qua mot sô khái niem cơ bn vê:
chơng trình, lap trình, ngôn ng
lap trình.
1.1. Chơng trình là gì?
B n chac chan dã dùng qua nhiêu chơng trình khác nhau, ví d nh chơng
trình so n tho van bn “Microsoft Word”. Chơng trình, hay phân mêm, dc
hieu dơn gin là mot tap các lenh de máy tính th$c hien theo. Khi b n da cho
máy tính mot chơng trình và yêu câu máy tính th$c hien theo các lenh ca
chơng trình, b n dang ch y chơng trình dó.
1.2. Lap trình là gì?
Lap trình là có the hieu dơn gin là quá trình viêt ra các lenh hng dan máy
tính th$c hien de gii quyêt mot bài toán c the nào dó. Lap trình là mot bc
quan trng trong quy trình gii quyêt mot bài toán nh mô t Hình 1.1.
bút/giây
bút/giây
trình son tho
chng trình dch
Hình 1.1: Quy trình gii quyêt mot bài toán.
Quy trình trên có the dc chia ra thành hai m
c: m
c cao doc lap vi máy tính
(machine independent) và m
c thâp ph thuoc vào máy tính (machine specific).
1.2.1. M c cao doc lap vi máy tính
M
c cao doc lap vi máy tính thng dc chia thành ba bc chính là: xác
dnh vân dê, thiêt kê thuat toán và lap trình.
9. Xác dnh vân dê: Bc này dnh nghia bài toán, xác dnh d
lieu dâu vào, các
ràng buoc, yêu câu cân gii quyêt và kêt qu dâu ra. Bc này thng s dng
bút/giây và ngôn ng
t$ nhiên nh tiêng Anh, tiêng Viet de mô t và xác dnh
vân dê cân gii quyêt.
Thiêt kê thuat toán: Mot thuat toán là mot bo các ch# dan nham gii quyêt mot
bài toán. Các ch# dan này cân dc dien d t mot cách hoàn ch#nh và chính xác
sao cho mi ngi có the hieu và tiên hành theo. Thuat toán thng dc mô t
di d ng mã gi (pseudocode). Bc này có the s dng giây bút và thng
không ph thuoc vào ngôn ng
lap trình. Ví d vê thuat toán “tìm c sô chung
ln nhât (UCLN) ca hai sô x và y” viêt bang ngôn ng
t$ nhiên:
• Bc 1: Nêu xy thì thay x bang phân d ca phép chia x/y.
• Bc 2: Nêu không, thay y bang phân d ca phép chia y/x.
• Bc 3: Nêu trong hai sô x và y có mot sô bang 0 thì kêt luan UCLN
9
là sô còn l i.
• Bc 4: Nêu không, quay l i Bc 1.
hoac bang mã gi:
repeat
if x y then x := x mod y
else y := y mod x
until x = 0 or y = 0
if x = 0 then UCLN := y
else UCLN := x
Lap trình là bc chuyen doi thuat toán sang mot ngôn ng
lap trình, pho biên
là các ngôn ng
lap trình bac cao, ví d nh các ngôn ng
C++, Java. Bc
này, lap trình viên s dng mot chơng trình so n tho van bn de viêt chơng
trình. Trong và sau quá trình lap trình, ngi ta phi tiên hành kiem th và sa
loi chơng trình. Có ba lo i loi thng gap: loi cú pháp, loi trong thi gian
ch y, và loi lô-gic (xem chi tiêt Mc 1.5).
10. 1.2.2. M c thâp ph thuoc vào máy tính
Các ngôn ng
lap trình bac cao, ví d nh C, C++, Java, Visual Basic, C#, dc
thiêt kê de con ngi tơng dôi de hieu và de s dng. Tuy nhiên, máy tính
không hieu dc các ngôn ng
bac cao. Do dó, trc khi mot chơng trình viêt
bang ngôn ng
bac cao có the ch y dc, nó phi dc dch sang ngôn ng
máy, hay còn gi là mã máy, mà máy tính có the hieu và th$c hien dc. Viec
dch dó dc th$c hien bi mot chơng trình máy tính gi là chơng trình dch.
1.3. Ngôn ng lap trình và chơng trình dch
Nh chúng ta thây, quá trình gii quyêt mot bài toán thông qua các bc khác
nhau de chuyen doi t' ngôn ng
t$ nhiên mà con ngi hieu dc sang ngôn
ng
máy mà máy tính có the hieu và th$c hien dc. Ngôn ng
lap trình thng
dc chia ra thành hai lo i: ngôn ng
lap trình bac thâp và ngôn ng
lap trình
bac cao.
Ngôn ng lap trình bac thâp nh hp ng
(assembly language) hoac mã máy
là ngôn ng
gân vi ngôn ng
máy mà máy tính có the hieu dc. Dac diem
chính ca các ngôn ng
này là chúng có liên quan chat che dên phân c
ng ca
máy tính. Các h máy tính khác nhau s dng các ngôn ng
khác nhau. Chơng
trình viêt bang các ngôn ng
này có the ch y mà không cân qua chơng trình
dch. Các ngôn ng
bac thâp có the dùng de viêt nh
ng chơng trình cân tôi u
hóa vê tôc do. Tuy nhiên, chúng thng khó hieu dôi vi con ngi và không
thuan tien cho viec lap trình.
Ngôn ng lap trình bac cao nh Pascal, Ada, C, C++, Java, Visual Basic,
Python, … là các ngôn ng
có m
c do tr'u tng hóa cao, gân vi ngôn ng
t$
nhiên ca con ngi hơn. Viec s dng các ngôn ng
này cho viec lap trình do
dó de dàng hơn và nhanh hơn rât nhiêu so vi ngôn ng
lap trình bac thâp. Khác
vi ngôn ng
bac thâp, chơng trình viêt bang các ngôn ng
bac cao nói chung
có the s dng dc trên nhiêu lo i máy tính khác nhau.
Các chơng trình viêt bang mot ngôn ng
bac cao muôn ch y dc thì phi
dc dch sang ngôn ng
máy bang cách s dng chơng trình dch. Chơng
trình dch có the chia ra thành hai lo i là trình biên dch và trình thông dch.
Mot sô ngôn ng
bac cao nh C, C++ yêu câu lo i chơng trình dch dc gi
là trình biên dch (compiler). Trình biên dch dch mã nguôn thành mã máy –
d ng có the th$c thi dc. Kêt qu ca viec dch là mot chơng trình th$c thi
dc và có the ch y nhiêu lân mà không cân dch l i. Ví d, vi ngôn ng
C++
10
11. mot trình biên dch rât pho biên là gcc/g++ trong bo GNU Compiler Collection
(GCC) ch y trong các môi trng Unix/Linux cung nh Windows. Ngoài ra,
Microsoft Visual C++ là trình biên dch C++ pho biên nhât trong môi trng
Windows. Mot sô ngôn ng
bac cao khác nh Perl, Python yêu câu lo i chơng
trình dch gi là trình thông dch (interpreter). Khác vi trình biên dch, thay
vì dch toàn bo chơng trình mot lân, trình thông dch v'a dch v'a ch y
chơng trình, dch dên dâu ch y chơng trình dên dó.
Trong môn hc này, C++ dc chn làm ngôn ng
the hien. Dây là mot trong
nh
ng ngôn ng
lap trình chuyên nghiep dc s dng rong rãi nhât trên thê
gii. Trong ph m vi nhap môn ca môn hc này, C++ ch# dc gii thieu m
c
rât cơ bn, rât nhiêu tính nang m nh ca C++ se không dc nói dên hoac ch#
dc gii thieu sơ qua. Ngi hc nên tiêp tc tìm hieu vê ngôn ng
C++, vt
ra ngoài gii h n ca cuôn sách này.
1.4. Môi trng lap trình bac cao
De lap trình gii quyêt mot bài toán bang ngôn ng
lap trình bac cao, b n cân có
công c chính là: chơng trình so n tho, chơng trình dch dành cho ngôn ng
s dng, và các th vien chuan ca ngôn ng
s dng (standard library), và
chơng trình tìm loi (debugger).
Các bc cơ bn de xây d$ng và th$c hien mot chơng trình:
1. Son tho: Mã nguôn chơng trình dc viêt bang mot phân mêm so n tho
van bn d ng text và lu trên o dia. Ta có the dùng nh
ng phân mêm so n
tho van bn dơn gin nhât nh Notepad (trong môi trng Windows) hay vi
(trong môi trng Unix/Linux), hoac các công c so n tho trong môi trng
tích hp de viêt mã nguôn chơng trình. Mã nguôn C++ thng dat trong
các tep vi tên có phân m rong là .cpp, cxx, .cc, hoac .C (viêt hoa).
2. Dch: Dùng trình biên dch dch mã nguôn chơng trình ra thành các do n
mã máy riêng l+ (gi là “object code”) lu trên o dia. Các trình biên dch pho
biên cho C++ là vc.exe trong bo Microsoft Visual Studio hay gcc trong bo
GNU Compiler vi các tham sô thích hp de dch và liên kêt de t o ra tep
ch y dc. Vi C++, ngay trc khi dch còn có giai do n tiên x lý
(preprocessing) khi các dnh hng tiên x lý dc th$c thi de làm các thao
tác nh bo sung các tep van bn cân dch hay thay thê mot sô chuoi van bn.
Mot sô dnh hng tiên x lý quan trng se dc gii thieu dân trong cuôn
sách này.
11
12. 3. Liên kêt: Mot tep mã nguôn thng không ch
a dây d nh
ng phân cân
thiêt cho mot chơng trình hoàn ch#nh. Nó thng dùng dên d
lieu hoac
hàm dc dnh nghia trong các tep khác hoac trong th vien chuan. Trình
liên kêt (linker) kêt nôi các do n mã máy riêng l+ vi nhau và vi các th
vien có san de t o ra mot chơng trình mã máy hoàn ch#nh ch y dc.
4. Np: Trình n p (loader) se n p chơng trình di d ng mã máy vào bo nh.
Các thành phân bo sung t' th vien cung dc n p vào bo nh.
5. Chy: CPU nhan và th$c hien lân lt các lenh ca chơng trình, d
lieu và
kêt qu thng dc ghi ra màn hình hoac o dia.
Thng thì không phi chơng trình nào cung ch y dc và ch y dúng ngay
lân ch y th dâu tiên. Chơng trình có the có loi cú pháp nên không qua dc
bc dch, hoac chơng trình dch dc nhng gap loi trong khi ch y. Trong
nh
ng trng hp dó, lap trình viên phi quay l i bc so n tho de sa loi và
th$c hien l i các bc sau dó.
Hình 1.2: Các bc cơ bn de xây d ng mot chơng trình.
De thuan tien cho viec lap trình, các công c so n tho, dch, liên kêt, ch y...
nói trên dc kêt hp l i trong mot môi trng lap trình tích hp (IDE –
integrated development environment), trong dó, tât c các công do n dôi vi
ngi dùng ch# còn là viec ch y các tính nang trong mot phân mêm duy nhât.
IDE rât h
u ích cho các lap trình viên. Tuy nhiên, dôi vi nh
ng ngi mi hc
lap trình, thi gian dâu nên t$ th$c hien các bc dch và ch y chơng trình
thay vì thông qua các ch
c nang ca IDE. Nh vay, ngi hc se có the nam
dc bn chât các bc ca quá trình xây d$ng chơng trình, hieu dc bn
12
13. chât và dac diem chung ca các IDE, tránh tình tr ng b ph thuoc vào mot IDE
c the.
Ví d vê các IDE pho biên là Microsoft Visual Studio – môi trng lap trình
thơng m i cho môi trng Windows, và Eclipse – phân mêm mien phí vi các
phiên bn cho c môi trng Windows cung nh Unix/Linux, c hai dêu ho tr
nhiêu ngôn ng
lap trình.
Dành cho C++, mot sô môi trng lap trình tích hp pho biên là Microsoft
Visual Studio, Dev-C++, Code::Blocks, KDevelop. Moi môi trng có the ho
tr mot hoac nhiêu trình biên dch. Chang h n Code::Blocks ho tr c GCC và
MSVC Do C++ có các phiên bn khác nhau.
Có nh
ng bn cài dat khác nhau ca C++. Các bn ra di trc chuan C++ 1998
(ISO/IEC 14882) có the không ho tr dây d các tính nang dc dac t trong
chuan ANSI/ISO 1998. Bn C++ do Microsoft phát trien khác vi bn C++ ca
GNU. Tuy nhiên, các trình biên dch hien d i hâu hêt ho tr C++ chuan, ta cung
nên chn dùng các phân mêm này. Ngôn ng
C++ dc dùng trong cuôn sách
này tuân theo chuan ISO/IEC 14882, còn gi là C++ thuân túy (pure C++).
1.5. Loi và tìm loi
Trong và sau quá trình lap trình, chúng ta phi tiên hành kiem th và sa loi
chơng trình. Có ba lo i loi thng gap: loi cú pháp, loi run-time và loi lô-gic.
Loi cú pháp là do lap trình viên viêt sai vi các quy tac cú pháp ca ngôn ng
lap trình, chang h n thiêu dâu châm phy cuôi lenh. Chơng trình biên dch se
phát hien ra các loi cú pháp và cung câp thông báo vê v trí mà nó cho là có loi.
Nêu trình biên dch nói rang chơng trình có loi cú pháp thì chac chan là có loi
cú pháp trong chơng trình. Tuy nhiên, loi là cho nào thì trình biên dch ch# có
the doán, và nó có the doán sai.
Loi run-time là loi xuât hien trong khi chơng trình dang ch y. Loi d ng này se
gây ra thông báo loi và ng'ng chơng trình. Ví d là khi chơng trình th$c hien
phép chia cho 0.
Loi lô-gic có nguyên nhân là do thuat toán không dúng, hoac do lap trình viên
gap sai sót khi the hien thuat toán bang ngôn ng
lap trình (ví d viêt nhâm dâu
cong thành dâu tr'). Khi có loi lô-gic, chơng trình ca b n có the dch và ch y
bình thng, nhng kêt qu ca chơng trình da ra l i có trng hp sai hoac
13
14. ho t dong ca chơng trình không nh mong di. Loi lô-gic là lo i loi khó tìm
ra nhât.
Nêu chơng trình ca b n dch và ch y không phát sinh thông báo loi, tham chí
chơng trình cho ra kêt qu có dúng vi mot vài bo d
lieu test, diêu dó không
có nghia chơng trình ca b n hoàn toàn không có loi. De có the chac chan hơn
vê tính dúng dan ca chơng trình, b n cân ch y th chơng trình vi nhiêu bo
d
lieu khác nhau và so sánh kêt qu mà chơng trình t o ra vi kêt qu mong
di.
1.6. Lch s C và C++
Ngôn ng
lap trình C dc t o ra bi Dennis Ritchie (phòng thí nghiem Bell) và
dc s dng de phát trien he diêu hành UNIX. Mot trong nh
ng dac diem noi
bat ca C là doc lap vi phân c
ng (portable), t
c là chơng trình có the ch y
trên các lo i máy tính và các he diêu hành khác nhau. Nam 1983, ngôn ng
C dã
dc chuan hóa và dc gi là ANSI C bi Vien chuan hóa quôc gia Hoa Ky
(American National Standards Institute). Hien nay ANSI C van là ngôn ng
lap
trình chuyên nghiep và dc s dng rong rãi de phát trien các he thông tính
toán hieu nang cao.
Ngôn ng
lap trình C++ do Bjarne Stroustrup (thuoc phòng thí nghiem Bell)
phát trien trên nên là ngôn ng
lap trình C và cm h
ng chính t' ngôn ng
lap
trình Simula67. So vi C, C++ là ngôn ng
an toàn hơn, kh nang dien d t cao
hơn, và ít dòi hi các ky thuat bac thâp. Ngoài nh
ng thê m nh th'a kê t' C,
C++ ho tr tr'u tng hóa d
lieu, lap trình hng dôi tng và lap trình tong
quát, C++ giúp xây d$ng de dàng hơn nh
ng he thông ln và ph
c t p.
Bat dâu t' phiên bn dâu tiên nam 1979 vi cái tên C with Classes (C kèm lp
dôi tng)1 vi các tính nang cơ bn ca lap trình hng dôi tng, C++ dc
phát trien dân theo thi gian. Nam 1983, cái tên C++ chính th
c ra di, các
tính nang nh hàm o (virtual function), hàm trùng tên và dnh nghia l i toán t
(overloading), hang ... dc bo sung. Nam 1989, C++ có thêm lp tr'u tng,
da th'a kê, hàm thành viên tinh, hang hàm, và thành viên kieu protected. Các bo
sung cho C++ trong thap k# sau dó là khuôn mau (template), không gian tên
(namespace), ngo i le (exception), các toán t doi kieu d
lieu mi, và kieu d
1 Theo li ke ca Bjarne Stroustrup t i trang cá nhân ca ông t i trang web ca phòng thí nghiem ATT
http://www2.research.att.com/~bs/bs_faq.html#invention
14
15. lieu Boolean. Nam 1998, lân dâu tiên C++ dc chính th
c chuan hóa quôc tê
bi to ch
c ISO, kêt qu là chuan ISO/IEC 148822.
Di kèm vi s$ phát trien ca ngôn ng
là s$ phát trien ca th vien chuan C++.
Bên c nh viec tích hp th vien chuan truyên thông ca C vi các sa doi nh
cho phù hp vi C++, th vien chuan C++ còn có thêm th vien stream I/O
phc v viec vào ra d
lieu d ng dòng. Chuan C++ nam 1998 tích hp thêm
phân ln th vien STL (Standard Template Library – th vien khuôn mau
chuan)3. Phân này cung câp các câu trúc d
lieu rât h
u ích nh vector, danh
sách, và các thuat toán nh sap xêp và tìm kiêm.
Hien nay, C++ là mot trong các ngôn ng
lap trình chuyên nghiep dc s dng
rong rãi nhât.
1.7. Chơng trình C++ dâu tiên
Chơng trình dơn gin trong Hình 1.3 se hien ra màn hình dòng ch
“Hello
world!”. Trong chơng trình có nh
ng dac diem quan trng ca C++. Ta se xem
xét t'ng dòng.
2 Van bn này (ISO/IEC 14882:1998) sau dó dc phát hien loi ch#nh sa vào nam 2003, thành phiên bn
ISO/IEC 14882:2003.
3 STL vôn không nam trong th vien chuan mà là mot th vien riêng do HP và sau dó là SGI phát trien.
15
16. Hình 1.3: Chơng trình C++ dâu tiên.
Hai dòng dâu tiên bat dâu bang chuoi // là các dòng chú thích chơng trình. Dó
là kieu chú thích dòng dơn. Các dòng chú thích không gây ra ho t dong gì ca
chơng trình khi ch y, trình biên dch b qua các dòng này. Ngoài ra còn có
d ng chú thích kieu C dùng chuoi /* và */ de dánh dâu diem bat dâu và kêt thúc
chú thích. Các lap trình viên dùng chú thích de gii thích và gii thieu vê noi
dung chơng trình.
Dòng th
ba, #include iostream là mot dnh hng tiên x lý
(preprocessor directive) – ch# dan vê mot công viec mà trình biên dch cân th$c
hien trc khi dch chơng trình. #include là khai báo vê th vien se dc s
dng trong chơng trình, trong trng hp này là th vien vào ra d
lieu
iostream trong th vien chuan C++.
Tiêp theo là hàm main, phân không the thiêu ca moi chơng trình C++. Nó bat
dâu t' dòng khai báo header ca hàm:
16
int main()
Moi chơng trình C++ thng bao gôm mot hoac nhiêu hàm, trong dó có dúng
mot hàm có tên main, dây là nơi chơng trình bat dâu th$c hien và kêt thúc.
Bên trái t' main là t' khóa int, nó có nghia là hàm main se tr vê mot giá tr là
sô nguyên. T' khóa là nh
ng t' dac biet mà C++ dành riêng cho nh
ng mc
17. dích c the. Chơng 4 se cung câp thông tin chi tiêt vê khái niem hàm và viec
hàm tr vê giá tr.
Thân hàm main dc bat dâu và kêt thúc bi cap ngoac {}, bên trong dó là
chuoi các lenh mà khi chơng trình ch y chúng se dc th$c hien tuân t$ t'
lenh dàu tiên cho dên lenh cuôi cùng. Hàm main trong ví d dang xét có ch
a
hai lenh. Moi lenh dêu kêt thúc bang mot dâu cham phy, các dnh hng tiên
x lý thì không.
Lenh th
nhât gôm cout, toán t , xâu kí t$ Hello world!, và dâu châm
phy. Nó ch# th cho máy tính th$c hien mot nhiem v: in ra màn hình chuoi kí
t$ nam gi
a hai dâu nháy kép – Hello world!. Khi lenh dc th$c thi, chuoi kí
t$ Hello world se dc gi cho cout – luông d
lieu ra chuan ca C++,
thng dc nôi vi màn hình. Chi tiêt vê vào ra d
lieu se dc nói dên trong
Chơng 8. Chuoi kí t$ nam gi
a hai dâu nháy kép dc gi là mot xâu kí t
(string). De ý dòng
17
using namespace std;
nam gân dâu chơng trình. Tât c thành phân ca th vien chuan C++, trong
dó có cout dc dùng dên trong hàm main, dc khai báo trong mot không gian
tên (namespace) có tên là std. Dòng trên thông báo vi trình biên dch rang
chơng trình ví d ca ta se s dng dên mot sô thành phân nam trong không
gian tên std. Nêu không có khai báo trên, tiên tô std:: se phi di kèm theo tên
ca tât c các thành phân ca th vien chuan dc dùng trong chơng trình,
chang h n cout se phi dc viêt thành std::cout. Chi tiêt vê không gian tên
nam ngoài ph m vi ca cuôn sách này, ngi dc có the tìm hieu t i các tài lieu
[1] hoac [2]. Nêu không có lu ý dac biet thì tât c các chơng trình ví d trong
cuôn sách này dêu s dng khai báo s dng không gian tên std nh trên.
Lenh th
hai nhy ra khi hàm và tr vê giá tr 0 làm kêt qu ca hàm. Dây là
bc có tính chât quy trình do C++ quy dnh hàm main cân tr l i mot giá tr là
sô nguyên cho biêt tr ng thái kêt thúc ca chơng trình. Giá tr 0 dc tr vê
cuôi hàm main có nghia rang hàm dã kêt thúc thành công.
De ý rang tât các lenh nam bên trong cap ngoac {} ca thân hàm dêu dc lùi
dâu dòng mot m
c. Vi C++, viec này không có ý nghia vê cú pháp. Tuy nhiên,
nó l i giúp cho câu trúc chơng trình de thây hơn và chơng trình de hieu hơn
dôi vi ngi lap trình. Dây là mot trong các diem quan trng trong các quy c
vê phong cách lap trình. Ph lc A se hng dan chi tiêt hơn vê các quy c
này.
18. Dên dây ta có the sa chơng trình trong Hình 1.3 de in ra li chào Hello
world! theo các cách khác nhau. Chang h n, ta có the in ra cùng mot noi dung
nh cu nhng bang hai lenh gi cout:
cout Hello ; cout world!;
hoac in ra li chào trên nhiêu dòng bang cách chèn vào gi
a xâu kí t$ các kí t$
xuông dòng (kí t$ dac biet dc kí hieu là n):
cout Hello n world!n;
Ph lc B hng dan vê cách s dng bo công c GNU C++ de dch và ch y
chơng trình.
18
19. 19
Bài tap
1. Trình bày các bc chính de gii quyêt mot bài toán. Phân tích noi dung
và dac diem chính ca t'ng bc.
2. T i sao cân phi có chơng trình dch, s$ khác biet gi
a trình biên dch
và trình thông dch? Liet kê các ngôn ng
lap trình cân có trình biên dch,
và các ngôn ng
lap trình cân có trình thông dch.
3. S$ khác biet, u diem và nhc diem gi
a ngôn ng
lap trình bac cao và
ngôn ng
lap trình bac thâp? Nêu mot ví d mà nên s dng ngôn ng
lap
trình bac thâp de gii quyêt, và mot ví d mà nên s dng ngôn ng
lap
trình bac cao de gii quyêt.
4. Trình bày các ngôn ng
lap trình bac thâp mà b n biêt, nêu ra các dac
diem noi bat ca t'ng ngôn ng
lap trình dó.
5. Trình bày các ngôn ng
lap trình bac cao mà b n biêt, nêu ra các dac
diem noi bat ca t'ng ngôn ng
lap trình dó.
6. Trình bày s$ khác biet, u diem và nhc diem gi
a ngôn ng
lap trình C
và C++.
7. Trình bày các lo i loi thng gap khi lap trình. Phân tích dac diem ca
t'ng lo i loi trên.
8. Trình bày 5 ví d vê loi logic mà b n có the gap trong lap trình.
9. Làm quen vi môi trng lap trình Dev-C++. Liet kê ra các ch
c nang
chính ca môi trng Dev-C++. Tìm hieu và so sánh các môi trng lap
trình khác cho C và C++.
10. Viêt mot chơng trình C++ de hien ra màn hình tên ca b n. S dng
biên dch dòng lenh bang bo công c GNU C++ de dch và ch y chơng
trình.
20. Chơng 2. Biên, kieu d lieu và các phép toán
Da sô chơng trình không ch# có nh
ng ho t dong dơn gin nh là hien th mot
xâu kí t$ ra màn hình mà còn phi thao tác vi d
lieu. Trong mot chơng trình,
biên là tên ca mot vùng bo nh dc dùng de lu d
lieu trong khi chơng
trình ch y. D
lieu lu trong mot biên dc gi là giá tr ca biên dó. Chúng ta
có the truy nhap, gán hay thay doi giá tr ca các biên, khi biên dc gán mot
giá tr mi, giá tr cu se b ghi dè lên.
20
Khai báo biên toàn cc
totalApples kieu int
Khai báo biên da phng
numberOfBaskets
sau dó gán giá tr 5 cho nó
#include iostream
using namespace std;
int total(pples;
int main()
{
int number)f*askets + ,;
int apple-er*asket;
cout .nter number apples per baskets: ;
cin apple-er*asket;
total(pples + number)f*askets / apple-er*asket;
cout 0umber of apples is total(pples;
return 1;
}
Gán giá tr nhap t- bàn phím
cho biên applePerBasket
Hình 2.1: Khai báo và s d
21. ng biên.
Hình 2.1 minh ha viec khai báo và s dng biên. Trong dó, các dòng
int total(pples;
int number)f*askets + ,;
int apple-er*asket;
là các dòng khai báo biên. total(pples, number)f*askets, và
apple-er*asket là các tên biên. Các khai báo trên có nghia rang total(pples,
number)f*askets, và apple-er*asket là d
lieu thuoc kieu int, nghia là các
biên này se gi
giá tr kieu nguyên. Dòng khai báo number)f*askets có mot
diem khác vi hai dòng còn l i, dó là number)f*askets dc khi t o vi giá
tr 5. C++ quy dnh rang tât c các biên dêu phi dc khai báo vi mot cái tên
22. và mot kieu d
lieu trc khi biên dó dc s dng. Các biên thuoc cùng mot
kieu có the dc khai báo trên cùng mot dòng, cách nhau bi mot dâu phy.
Chang h n, có the thay hai dòng khai báo cho number)f*askets, và
apple-er*asket bang:
int number)f*askets + ,, apple-er*asket;
Chơng trình trong Hình 2.1 yêu câu ngi dùng nhap sô táo trong moi gi
(apple-er*asket), tính tong sô táo (total(pples) vi d
kien dã biêt là sô gi
táo (number)f*asket), rôi in ra màn hình. C the, dòng
cout .nter number apples per baskets: ;
in ra màn hình xâu kí t$ .nter number apples per baskets: . Dó là li mi
nhap d
lieu, là hng dan dành cho ngi s dng chơng trình.
Dòng tiêp theo
21
cin apple-er*asket;
dc d
lieu dc ngi dùng nhap vào t' dâu vào chuan – thng là t' bàn
phím. Khi ch y lenh này, chơng trình se di ngi dùng nhap vào mot giá tr
cho biên apple-er*asket. Ngi dùng dáp
ng bang cách gõ vào mot sô
nguyên di d ng chuoi các ch
sô rôi nhân phím Enter de gi các ch
sô dó
cho máy tính. Dên lt nó, máy tính biên doi chuoi các ch
sô nó nhan dc
thành mot giá tr kieu nguyên rôi chép giá tr này vào biên apple-er*asket.
Tơng
ng vi cout là dôi tng qun lý dòng d
lieu ra chuan ca th vien
C++, cin là dôi tng qun lý dòng d
lieu vào chuan, thng là t' bàn phím.
Tiêp theo là lenh gán
total(pples + number)f*askets / apple-er*asket;
Lenh này tính tích giá tr ca hai biên number)f*askets và apple-er*asket
rôi gán kêt qu cho biên total(pples, trong dó / là kí hieu ca phép nhân và +
là kí hieu ca phép gán.
Lenh in kêt qu ra màn hình
cout 0umber of apples is total(pples;
hien th liên tiêp hai thành phân: xâu kí t$ 0umber of apples is và giá tr
ca biên total(pples.
23. Ngoài viec in giá tr ca mot biên, C++ còn cho phép ta in kêt qu ca mot bieu
th
c. Do dó, ta có mot l$a chn khác là gop công viec ca hai lenh trên (tính
tích hai biên và in tích ra màn hình) vào mot lenh:
cout 0umber of apples is number)f*askets /
apple-er*asket;
Khi dó, biên total(pples vôn dc dùng de lu tr
kêt qu ca phép tính tr
nên không còn cân thiêt, ta có the xóa b dòng khai báo biên này. De ý là lenh
trên dài và chiêm c sang dòng th
hai. C++ cho phép mot lenh nam trên nhiêu
dòng, dâu châm phy cuôi moi lenh se giúp trình biên dch hieu dâu là kêt thúc
ca lenh.
2.1. Kieu d lieu
Moi biên phi dc khai báo de lu gi
giá tr thuoc mot kieu d
lieu nào dó.
Ngôn ng
lap trình bac cao thng có hai lo i kieu d
lieu: các kieu d
lieu cơ
bn và các kieu d
lieu dan xuât.
2.1.1. Kieu d lieu cơ bn
Kieu d
lieu cơ bn là kieu d
lieu do ngôn ng
lap trình dnh nghia san. Ví d
nh các kieu sô nguyên – char, int, long int. Biên thuoc kieu nguyên dc
dùng de lu các sô có giá tr nguyên. Dôi vi kieu cơ bn chúng ta thng quan
tâm dên kích thc bo nh ca kieu d
lieu, gii h n giá tr mà kieu d
lieu dó
có the lu gi
. Dôi vi các kieu dâu châm dong (floating-point) de lu các giá
tr thuoc kieu sô th$c, chúng ta còn quan tâm dên do chính xác ca kieu d
lieu
dó. Tài lieu chuan C++ không quy dnh chính xác sô byte cân dùng de lu các
biên thuoc các kieu d
lieu cơ bn trong bo nh mà ch# quy dnh yêu câu vê
kích thc ca kieu d
lieu này so vi kieu d
lieu kia. Các kieu nguyên có dâu,
signed char, short int, int và long int, phi có kích thc tang dân. Moi kieu
nguyên có dâu tơng
ng vi mot kieu nguyên không dâu vi cùng kích thc.
Các kieu nguyên không dâu không the bieu dien giá tr âm nhng có the bieu
dien sô giá tr dơng nhiêu gâp dôi kieu có dâu tơng
ng. Tơng t$, các kieu
châm dong, float, double và long double cung phi có kích thc tang dân.
Bng 2.1 liet kê mot sô kieu d
lieu cơ bn ca C++ vi kích thc dc nhiêu
bn cài dat C++ s dng.
22
24. 23
Kieu Mô t
Kích thc
thông dng
(byte)
Phm vi (tơng ng vi kích thc)
char
ký t$ /
sô nguyên nh
1
các kí t$ ASCII
signed char: -128 2 127, hoac
unsighed char: 0 2 255
bool giá tr Boolean 1 true hoac false
short sô nguyên 2
signed short: -327672 32767
unsigned short: 02 65536
int sô nguyên ln 4
signed int: 2147483648 2 2147483647
unsigned int: 0 2 -4294967296
long
sô nguyên
rât ln
4
signed long: 2147483648 2 2147483647
unsigned long: 0 2 -4294967296
float sô th$c 4 +/- 1.4023x10-45 2 3.4028x10+38
double
sô th$c vi
do chính xác cao
8 +/- 4.9406x10-324 2 1.7977x10308
long
double
sô th$c vi
do chính xác
rât cao
8 +/- 4.9406x10-324 2 1.7977x10308
Bng 2.1: Mot sô kieu d lieu cơ bn trong C++.
Mot sô lu ý:
• Kích thc và ph m vi ca các kieu d
lieu cơ bn ph thuoc vào he thông
mà chơng trình dc biên dch t i dó. Tuy nhiên, tât c các he thông, kieu
char bao gi cung có kích thc là 1 byte; các kieu d
lieu char, short,
int, long phi có kích thc tang dân; còn các kieu float, double, long
double phi có do chính xác cao dân.
• Kieu char dùng de lu các kí t$ dơn (có mã nh hơn 256), chang h n nh
ch
cái La-tinh, ch
sô, hay các kí hieu. Trong C++, mot kí t$ dơn dc
dóng trong cap nháy dơn, ví d '('. De lu các kí t$ có mã ln hơn 255, ta
có the s dng kieu wchar_t.
25. • Kieu d
lieu bool ch# có hai giá tr true và false. Ta có the dùng biên
thuoc kieu này de lu câu tr li ca nh
ng câu hi dúng/sai chang h n nh
Có phi index ln hơn 100? hay lu các tr ng thái Ta dã tìm thây giá tr
âm cha?. Các giá tr true và false trong C++ th$c ra ch# là 0 và 1.
2.1.2. Kieu d lieu dan xuât
Kieu d
lieu dan xuât là kieu d
lieu dc xây d$ng t' các kieu d
lieu cơ bn
bang các toán t nh * (con tr), (tham chiêu), [] (mng), () hàm, hoac dc
dnh nghia bang cơ chê struct hay class. Các kieu d
lieu dc dnh nghia
bang cơ chê struct hay class còn dc gi là các kieu d
lieu có câu trúc hoac
kieu d
lieu tr'u tng. Chi tiêt vê các kieu d
lieu dan xuât se dc trình bày
dân dân trong các chơng sau.
2.2. Khai báo và s dng biên
De bat dâu s dng mot biên, chúng ta phi tiên hành hai bc: dat cho biên
mot cái tên hp le và khai báo biên.
2.2.1. Dnh danh và cách dat tên biên
Dnh danh (identifier) là thuat ng
trong ngôn ng
lap trình khi nói dên tên (tên
biên, tên hàm, tên lp…). Dnh danh là mot chuoi kí t$ (bao gôm các ch
cái
a..z, A..Z, ch
sô 0..9, dâu g ch chân ‘_’) viêt liên nhau. Dnh danh không dc
bat dâu bang ch
sô và không dc trùng vi các t khóa (nh
ng t' mang ý
nghia dac biet) ca ngôn ng
lap trình. Lu ý, C++ phân biet ch
cái hoa và ch
cái thng.
Cách dat tên biên tuân th theo cách dat tên dnh danh. Ví d vê các tên biên:
• _sinhvien, sinhvien_11, sinhVien_11 là các tên biên hp le khác nhau
• 11sinhvien, sinhviên, sinhvien là các tên biên không hp le
Tên biên nên de dc, và gi nh dên công dng ca biên hay kieu d
lieu mà
biên se lu tr
. Ví d, nêu cân dùng mot biên de lu sô lng qu táo, ta có the
dat tên là total(pples. Không nên s dng các tên biên ch# gôm mot kí t$ và
không có ý nghia nh a hay b.
24
26. 2.2.2. Khai báo biên
Các ngôn ng
lap trình dnh kieu m nh, trong dó có C++, yêu câu moi biên
trc khi dùng phi dc khai báo và biên phi thuoc vê mot kieu d
lieu nào
dó. Có the chia các biên thành hai lo i:
• các biên dc khai báo ngoài tât c các chơng trình con là biên toàn cc,
có hieu l$c trên toàn bo chơng trình, chang h n biên total(pples trong
Hình 2.1.
• các biên dc khai báo t i mot chơng trình con là biên da phơng, có
hieu l$c bên trong chơng trình con dó, chang h n number)f*askets và
apple-er*asket trong Hình 2.1 là các biên da phơng ca hàm main và ch#
có hieu l$c bên trong hàm main.
Chơng 4 se nói ki hơn vê hai lo i biên trên.
Trong C++, biên có the dc khai báo gân nh bât c
dâu trong chơng trình,
mien là trc dòng dâu tiên s dng dên biên dó (xem Hình 2.1).
Mot biên da phơng dã dc khai báo nhng cha dc gán mot giá tr nào
dc gi là biên cha dc khi t o. Giá tr ca biên cha dc khi t o thng
là không xác dnh. De tránh tình tr ng này, ta có the khi t o giá tr ca các biên
bang cách gán giá tr ngay t i lenh khai báo biên.
2.3. Hang
Hang là mot lo i biên dac biet mà giá tr ca nó dc xác dnh t i thi diem
khai báo và không dc thay doi trong suôt chơng trình. De khai báo mot
hang, ta thêm t' khóa const vào phía trc lenh khai báo biên. Ví d:
const float -I + 3.141,926,3,;
const float SCR..0_WIDTH + 317.24;
Hang dc dùng de dat tên cho các giá tr không thay doi dc dùng trong
chơng trình, chang h n nh do rong màn hình nh trong ví d trên. Công dng
ca hang là moi khi cân thay doi giá tr dó, ta ch# cân sa lenh khai báo hang
thay vì tìm và sa giá tr tơng
ng t i tât c các v trí dùng dên nó. Ngoài ra,
mot cái tên có ý nghia dat cho mot giá tr dc dùng di dùng l i se giúp cho
chơng trình de dc và de hieu hơn.
25
27. 2.4. Các phép toán cơ bn
2.4.1. Phép gán
Phép gán là cách gan mot giá tr cho mot biên hoac thay doi giá tr ca mot
biên. Lenh gán trong C++ là:
26
biên = bieu thc;
trong dó dâu bang (“=”) dc gi là dâu gán hay toán t gán. Lu ý, dâu bang
trong C++ không dùng de so sánh giá tr nh trong mot sô ngôn ng
lap trình
khác. Ví d
symbol + '(';
là phép gán giá tr ‘A’ cho biên symbol, không phi là bieu th
c so sánh xem
giá tr ca symbol có phi là 'A' hay không.
Công viec ca phép gán là tính giá tr ca bieu th
c bên phi dâu gán rôi lu giá
tr dó vào trong biên nam bên trái dâu gán.
Bieu th
c có the là mot sô, mot biên, hoac mot bieu th
c ph
c t p. Lu ý rang
mot biên có the xuât hien c hai bên ca dâu gán. Ví d lenh sau tang giá tr
ca biên apples thêm 2.
apples + apples + 2;
Diem dac biet ca C++ là bn thân phép gán cung chính là mot bieu th
c vi
giá tr tr vê là kêt qu ca phép gán. Ví d, phép gán x = 3 là mot bieu th
c có
giá tr bang 3.
2.4.2. Các phép toán sô hc
C++ ho tr nam phép toán sô hc sau: + (cong), - (tr'), / (nhân), / (chia), %
(modulo – lây phân d ca phép chia). Phép chia dc th$c hien cho hai giá tr
kieu nguyên se cho kêt qu là thơng nguyên. Ví d bieu th
c 4 / 3 cho kêt qu
bang 1, còn 3 / 5 cho kêt qu bang 0.
Mot sô phép gán kèm theo bieu th
c xuât hien nhiêu lân trong mot chơng
trình, vì vay C++ cho phép viêt các phép gán bieu th
c dó mot cách gan ngn
hơn, s dng các phép gán ph
c hp (++, -+, /+, /+, %+, +, +, +, ^+, |+).
Cách s dng phép gán ph
c hp ++ nh sau:
biên += bieu thc; tơng dơng biên = biên + bieu thc;
28. 27
Ví d:
apples ++ 2; tơng dơng apples + apples + 2;
Các phép gán ph
c hp khác dc s dng tơng t$.
C++ còn cung câp các phép toán ++ (hay --) de tang (gim) giá tr ca biên lên
mot dơn v. Ví d:
apples++ hay ++apple có tác dng tang apples thêm 1 dơn v
apples-- hay --apple có tác dng gim apples di 1 dơn v
Khác biet gi
a viec viêt phép tang/gim trc biên (tang/gim trc) và viêt
phép tang/gim sau biên (tang/gim sau) là thi diem th$c hien phép
tang/gim, the hien giá tr ca bieu th
c. Phép tang/gim trc dc th$c hien
trc khi bieu th
c dc tính giá tr, còn phép tang/gim sau dc th$c hien sau
khi bieu th
c dc tính giá tr. Ví d, nêu apples vôn có giá tr 1 thì các bieu
th
c ++apples hay apples++ dêu có hieu
ng là apples dc tang t' 1 lên 2.
Tuy nhiên, ++apples là bieu th
c có giá tr bang 2 (tang apples trc tính giá
tr), trong khi apples++ là bieu th
c có giá tr bang 1 (tang apples sau khi tính
giá tr bieu th
c). Nêu ta ch# quan tâm dên hieu
ng tang hay gim ca các phép
++ hay – thì viec phép toán dc dat trc hay dat sau không quan trng. Dó
cung là cách dùng pho biên nhât ca các phép toán này.
Lu ý, cân hêt s
c can than khi s dng các phép tang và gim trong các bieu
th
c. Viec này không dc khuyên khích vì tuy nó có the tiêt kiem dc mot
hai dòng lenh nhng l i làm gim tính trong sáng ca chơng trình.
2.4.3. Các phép toán quan he
Các phép toán quan he dc s dng de so sánh giá tr hai bieu th
c. Các phép
toán này cho kêt qu bang 0 nêu dúng và khác 0 nêu sai. Ta s dng giá tr ca
mot bieu th
c quan he nh là mot giá tr thuoc kieu bool. Ví d:
bool enough(pples + (total(pples 11);
Các phép toán quan he trong ngôn ng
C++ dc liet kê trong Bng 2.2.
29. Ký hieu toán hc Toán t ca C++ Ví d Ý nghia
x y x ln hơn y
x y x nh hơn y
³ + x + y x ln hơn hoac bang y
£ + x + y x nh hơn hoac bang y
+ ++ x ++ y x bang y
¹ !+ x !+ y x khác y
Bng 2.2: Các phép toán quan he.
Chú ý tránh nhâm lan gi
a phép gán giá tr “+” và phép so sánh bang “++”.
Nh
ng nhâm lan gi
a các phép toán kieu này thng dan dên nh
ng loi lôgic
rât khó phát hien.
2.4.4. Các phép toán lô-gic
Toán t C++ Ý nghia Ví d Ý nghia ca ví d
and x y Cho giá tr dúng khi c x và y dúng,
ngc l i cho giá tr sai.
|| or x || y Cho giá tr dúng khi hoac x dúng hoac y
dúng, ngc l i cho giá tr sai
28
! not !x
Ph dnh ca x. Cho giá tr dúng khi x sai;
cho giá tr sai khi x dúng
Bng 2.3: Các phép toán lô-gic.
Các phép toán lô-gic dành cho các toán h ng là các bieu th
c quan he hoac các
giá tr bool. Kêt qu ca bieu th
c lôgic là giá tr bool.
Ví d:
bool enough(pples + (apples 3) (apples 11);
có kêt qu là biên enough(pples nhan giá tr là câu tr li ca câu hi biên
apples có giá tr ln hơn 3 và nh hơn 10 hay không?.
2.4.5. Do u tiên ca các phép toán
Di dây là m
c do u tiên ca mot sô phép toán thng gap. Th
t$ ca chúng
nh sau:
30. Các phép toán nam trong cap dâu ngoac ( ) có do u tiên ln nhât. Ví d:
29
2 * (1 + 3) cho kêt qu bang 8
Các phép toán /, /, +, -. Trong dó /, / có do u tiên nh nhau và cao hơn +, -.
Ví d:
2 * 1 + 3 cho kêt qu là 5
Các phép toán so sánh , , =, =. Ví d:
3 + 4 2 + 6 cho kêt qu dúng
Các phép toán lô-gic có th
th
t$ u tiên nh sau: !, , ||. Ví d:
1 || 0 0 tơng dơng vi 1 || (0 0) và cho kêt qu 1
2.4.6. Tơng thích gia các kieu
Vê cơ bn, giá tr gán cho mot biên nên cùng kieu vi biên dó. Khi mot biên
dc gán mot giá tr không dúng vi kieu d
lieu ca biên dó, thì giá tr dó se
dc chuyen doi sang kieu ca biên (type conversion). Mot vài trng hp
thng gap trong viec chuyen kieu là:
Chuyen doi gi
a sô th$c và sô nguyên
int x + 2.,; // x nhan giá tr 2
double y + 3.,; // y nhan giá tr 3,,
x + y; // x nhan giá tr 3
Phép chia ca sô nguyên
int divisor + 4;
int dividend + 6;
int quo + dividend/divisor; // quo nhan giá tr 1.
Lu ý: Phép chia mot sô nguyên cho mot sô nguyên se cho kêt qu là mot sô
nguyên. Muôn kêt qu là mot sô th$c thì ít nhât mot trong hai sô phi là sô th$c.
31. Bài tap
1. Viêt chơng trình tính dien tích ca mot hình tròn. Bán kính là mot sô th$c
và dc nhap vào t' bàn phím. Dien tích hình tròn dc hien ra màn hình.
2. Nhap t' bàn phím hai sô nguyên là chiêu cao ca Peter và Essen. Hãy tính
xem Peter cao gâp bao nhiêu lân Essen. Ví d, nêu chiêu cao ca Peter là
180, chiêu cao ca Essen là 150, thì hien ra màn hình dòng ch
“Peter is 1.2
times as tall as Essen”.
3. Nhap t' bàn phím mot sô nguyên là nhiet do di d ng do F (Fahrenheit),
hãy hien ra màn hình nhiet do di d ng do C (Celsius). Sinh viên t$ tìm
hieu công th
c chuyen doi.
4. Viêt mot chơng trình trong dó có hai hang sô WIDTH vi giá tr bang
3.17654, và hang sô LENGTH vi giá tr bang 10.03212. Tính và hien ra
màn hình dien tích ca hình ch
nhat vi hai c nh là WIDTH và LENGTH.
5. Nhap t' bàn phím bôn sô nguyên a, b, c, d. Hãy tính và hien ra màn hình giá
30
tr ca bieu th
c:
(a + b) (c + d) || (a - b) (c - d)
6. Trình bày s$ khác biet gi
a biên da phơng và biên toàn cc. Khi nào thì
nên dùng biên da phơng, khi nào thì nên dùng biên toàn cc. Nêu các lu y
khi s dng biên toàn cc.
7. Viêt mot chơng trình có ch
a hai biên: biên da phơng bonus và biên toàn
cc score. Nhap giá tr hai biên t' bàn phím, tính và hien ra màn hình tong
ca score và bonus.
8. Hãy tính (không dùng chơng trình) giá tr ca các bieu th
c sau:
a) 1 + 3 2 * 4 – 1 1
b) 2 * 2 – 1 + 5 / 1 4 – 3
c) (2 – 3 * 1) 0 / 5 * 2 + 1
9. Tính giá tr ca biên c t' do n chơng trình sau:
a) int a = 3; int b = 2; int c = a/b;
b) double a = 3.1; int b = 2; int c = a/b;
32. c) int a = 3; int b = 2; double c = a/b;
10. Nhap hai sô nguyên dơng x và y t' bàn phím, hãy tính:
a) Thơng ca phép toán x chia cho y
b) Tích ca phép toán x nhân y
c) Phân nguyên ca x chia cho y
d) Phân d ca x chia cho y
11. Nhap t' bàn phím 3 sô th$c x, y, và z. Hãy tính
a) Trung bình cong ca ba sô trên
b) Hien ra màn hình sô 1 nêu x là sô ln nhât trong ba sô trên, ngc l i
31
hien ra màn hình sô 0.
c) Hien ra màn hình sô 1 nêu z là sô nh trong ba sô trên, ngc l i hien ra
màn hình sô 0.
12. Tính giá tr (không dùng chơng trình) ca bieu th
c so sánh di dây:
a) x = 1; y = 2; x++ y
b) x = 2; y = 1; x-- y++
c) x = 2; y = 2; x++ == y
33. Chơng 3. Các câu trúc diêu khien
Nh dã nói phân trên, chơng trình máy tính mà chúng ta lap trình t o ra th$c
chât là mot tap các lenh. Các chơng trình dc viêt bang ngôn ng
bac cao
thng ch
a mot hàm chính (trong C++ là hàm main), nơi chơng trình bat dâu
th$c hien các lenh.
Trong chơng này chúng ta se tìm hieu th
t$ th$c hien các lenh trong mot
chơng trình.
3.1. Luông diêu khien
Luông diêu khien ca chơng trình là th
t$ các lenh (hành dong) mà chơng
trình th$c hien. Cho dên chơng này, chúng ta mi gap th
t$ dơn gin: th
t$
tuân t$, nghia là các hành dong dc th$c hien dúng theo th
t$ mà chúng dc
viêt trong chơng trình. Ví d, Hình 3.1 là sơ dô minh ha mot câu trúc tuân t$
dien hình, trong dó hai hành dong và các mui tên bieu dien th
t$ th$c hien các
hành dong.
Hình 3.1: Sơ dô chuyen trng thái ca mot don lenh có th t th c thi tuân t .
Trong chơng này, ta se làm quen vi các luông diêu khien ph
c t p hơn. Hâu
hêt các ngôn ng
lap trình, trong dó có C++, cung câp hai lo i lenh de kiem soát
luông diêu khien:
• lenh re nhánh (branching) chn mot hành dong t' danh sách gôm nhiêu
32
hành dong.
• lenh lap (loop) th$c hien lap di lap l i mot hành dong cho dên khi mot
diêu kien d'ng nào dó dc tha mãn.
34. Hai lo i lenh dó t o thành các câu trúc diêu khien (control structure) bên trong
chơng trình.
3.2. Các câu trúc re nhánh
3.2.1. Lenh if-else
Lenh if-else (hay gi tat là lenh if) cho phép re nhánh bang cách l$a chn
th$c hien mot trong hai hành dong. Ví d, trong mot chơng trình xêp lo i diem
thi, nêu diem ca sinh viên nh hơn 60, sinh viên dó dc coi là trt, nêu
không thì dc coi là do.
[score 60] [score = 60]
in Failed in Passed
Hình 3.2: Sơ dô mot lenh if.
Thuat toán nh này dc the hien bang sơ dô trong Hình 3.2. Trong dó hình qu
trám bieu dien diem re nhánh, nơi chơng trình da ra quyêt dnh xem nên re
theo hng nào. T' diem re nhánh có các mui tên di ra, moi mui tên kèm theo
mot diêu kien. Luông diêu khien se di theo mui tên nào mà diêu kien ca nó
dc tha mãn.
Cung có the trình bày thuat toán bang mã gi nh sau:
33
If student’s score is less than 60
print “Failed”
else
print “Passed”
The hien thuat toán trên bang mot lenh if-else ca C++, ta có do n mã:
35. 34
if (score 61)
cout Failed;
else
cout -assed;
Khi chơng trình ch y mot lenh if-else, dâu tiên nó kiem tra bieu th
c diêu
kien nam trong cap ngoac dơn sau t' khóa if. Nêu bieu th
c có giá tr bang
true thì lenh nam sau t' khóa if se dc th$c hien. Ngc l i, lenh nam sau
else se dc th$c hien. Chú ý là bieu th
c diêu kien phi dc dat trong mot
cap ngoac dơn.
#include iostream
using namespace std;
int main()
{
int score;
cout .nter your score: ;
cin score; //get the score from the keyboard
if (score 61)
cout Sorry. NouOve failed the course.n;
else
cout Congratulations! NouOve passed the course.n;
return 1;
}
ê
45. vê câu trúc -.
Chơng trình ví d trong Hình 3.3 yêu câu ngi dùng nhap diem rôi in ra các
thông báo khác nhau tùy theo diem sô d do hoac trt. De ý rang các lenh nam
bên trong khôi - cân dc lùi dâu dòng mot m
c de chơng trình trông
sáng sa de dc.
46. Trong câu trúc re nhánh -, ta có the b phân nêu không muôn
chơng trình th$c hien hành dong nào nêu diêu kien không tha mãn. Chang
h n, nêu muôn thêm mot li khen dac biet cho diem sô xuât sac t' 90 tr lên, ta
có the thêm lenh sau vào trong chơng trình t i Hình 3.3.
35
(
48. .x ;
Ta có the dùng các câu trúc - lông nhau de t o ra diêu kien re nhánh
ph
c t p. Hình 3.3 là mot ví d dơn gin vi ch# hai trng hp và mot lenh .
Xét mot ví d ph
c t p hơn: cho trc diem sô (lu t i biên
49. kieu ),
xác dnh xêp lo i hc l$c A, B, C, D, F tùy theo diem dó. Quy tac xêp lo i là:
nêu diem t' 90 tr lên thì d t lo i A, diem t' 80 ti di 90 d t lo i B, v.v.. T i
do n mã xét các trng hp ca xêp lo i diem, ta có the dùng câu trúc -
lông nhau nh sau:
(
53. =61)
='D';
='F';
De ý rang moi khôi lenh - sau nam trong phân ca khôi lenh -
liên trc. Nêu
54. không di 90, diêu kien ca c bôn lenh -
dêu cho kêt qu
. Tuy nhiên, do diêu kien ca lenh - ngoài cùng
tha mãn, ch# có lenh gán dâu tiên
= 'A' dc th$c thi, còn toàn bo
phân ca lenh - ngoài cùng, bao gôm ba lenh - còn l i, b
b qua.
Vi các khôi lenh - lông nhau nh trên, khi phi lùi dâu dòng quá xa
vê bên phi, dòng còn l i quá ngan khiên moi lenh có the phi tri trên vài dòng,
dan dên viec chơng trình khó dc. Do dó, da sô lap trình viên C++ thng
55. dùng kieu lùi dâu dòng nh di dây. (Hai cách lùi dâu dòng này là nh nhau
dôi vi trình biên dch vì nó b qua các kí t$ trang.)
36
(
70. Q
=
;
1;
Hình 3.4: Câu trúc if-else lông nhau.
Mot diêu cân dac biet lu ý là nêu muôn th$c hien nhiêu hơn mot lenh trong
moi trng hp ca lenh -, ta cân dùng cap ngoac {} bc tap lenh dó
thành mot khôi chơng trình. Ví d, phiên bn ph
c t p hơn ca lenh trong
Hình 3.3:
80. ;
De tránh loi quên cap ngoac, có mot li khuyên là tap thói quen dùng cap ngoac
ngay c khi khôi lenh ch# bao gôm dúng mot lenh. Chang h n, xét khôi lenh
lông nhau di dây:
(
Q
=='A')
(
Q
=='A')
87. ;
Thông báo trong phân dáng ra cân dc th$c thi khi xêp h ng ca môn
Toán (
Q
) không d t A. Tuy nhiên, trong th$c tê, trình biên dch l i
hieu rang phân dó cùng cap vi lenh th
hai – lenh gân nhât, nghia
là:
(
Q
=='A')
(
Q
=='A')
94. ;
Các loi lôgic d ng này thng khó phát hien. Dôi vi C++, viec lùi dâu dòng
ch# nham mc dích de lap trình viên de dc chơng trình ch
không có ý nghia
vi trình biên dch. Cách gii quyêt là s dng cap ngoac {} de ch# rõ cho trình
biên dch rang lenh th
hai nam trong lenh ngoài cùng và rang phân
cùng cap vi lenh ngoài cùng dó:
38
102. ;
3.2.2. Lenh swi
Khi chúng ta muôn viêt mot câu trúc re nhánh có nhiêu l$a chn, ta có the s
dng nhiêu lenh - lông nhau. Tuy nhiên, trong trng hp viec l$a chn
re nhánh ph thuoc vào giá tr (kieu sô nguyên hoac kí t$) ca mot biên hay
bieu th
c, ta có the s dng câu trúc w
de chơng trình de hieu hơn. Lenh
w
dien hình có d ng nh sau:
w
(bieu_thc)
hang_1$
tap_lenh_1;b
k;
hang_2$
tap_lenh_2;b
k;
$
tap_lenh_mac_d
103. nh;
Khi lenh w
dc ch y, bieu_thc dc tính giá tr và so sánh vi hang_1.
Nêu bang nhau, chuoi lenh ke t' tap_lenh_1 dc th$c thi cho dên khi gap lenh
b
k dâu tiên, dên dây chơng trình se nhy ti diem kêt thúc câu trúc w
.
Nêu bieu_thc không có giá tr bang hang_1, nó se dc so sánh vi hang_2,
nêu bang nhau, chơng trình se th$c thi chuoi lenh ke t' tap_lenh_2 ti khi gap
lenh b
k dâu tiên thì nhy ti cuôi câu trúc w
. Quy trình c
tiêp dien
nh vay. Cuôi cùng, nêu bieu_thc có giá tr khác vi tât c các giá tr dã dc
liet kê (hang_1, hang_2, ...), chơng trình se th$c thi tap_lenh_mac_d
104. nh nam
sau nhãn $ nêu nh có nhãn này (không bat buoc).
Ví d, lenh sau so sánh giá tr ca biên
vi các hang kí t$ 'A', 'B', 'C' và
in ra các thông báo khác nhau cho t'ng trng hp.
39
117. ;
Lu ý, các nhãn trong câu trúc w
phi là hang ch
không the là biên
hay bieu th
c. Nêu cân so sánh vi biên hay bieu th
c, ta nên dùng khôi lenh
- lông nhau.
Vân dê dac biet ca câu trúc w
là các lenh b
k. Nêu ta không t$ gan mot
lenh b
k vào cuôi chuoi lenh cân th$c hien cho moi trng hp, chơng trình
se ch y tiêp chuoi lenh ca trng hp sau ch
không t$ dong nhy ti cuôi câu
trúc w
. Ví d, do n chơng trình sau se ch y lenh in th
nhât nêu grade
nhan mot trong ba giá tr 'A', 'B', 'C' và ch y lenh in th
hai trong trng hp
còn l i:
40
123. ;
Chơng trình trong Hình 3.5 là mot ví d hoàn ch#nh s dng câu trúc w
de in ra các thông báo khác nhau tùy theo xêp lo i hc l$c (
) mà ngi
dùng nhap t' bàn phím. Trong dó, 'A' kêt thúc vi b
k sau ch# mot
lenh, còn 'B' ch y tiêp qua '', 'D' rôi mi gap b
k và thoát
khi lenh w
. Nhãn dc dùng de x lý trng hp biên grade gi
giá tr không hp le dôi vi xêp lo i hc l$c. Trong nhiêu chơng trình, phân
thng dc dùng de x lý các trng hp không mong di, chang
h n nh de bat loi các kí hieu hc l$c không hp le mà ngi dùng có the nhap
sai trong Hình 3.5.
41
148. 3.3. Các câu trúc lap
Các chơng trình thng cân phi lap di lap l i mot ho t dong nào dó. Ví d,
mot chơng trình xêp lo i hc l$c se ch
a các lenh re nhánh de gán xêp lo i A,
B, C… cho mot sinh viên tùy theo diem sô ca sinh viên này. De xêp lo i cho
c mot lp, chơng trình se phi lap l i thao tác dó cho t'ng sinh viên trong lp.
Phân chơng trình lap di lap l i mot lenh hoac mot khôi lenh dc gi là mot
vòng lap. Lenh hoac khôi lenh dc lap di lap l i dc gi là thân ca vòng lap.
Câu trúc lap cho phép lap trình viên ch# th cho chơng trình lap di lap l i mot
ho t dong trong khi mot diêu kien nào dó van dc tha mãn.
Khi thiêt kê mot vòng lap, ta cân xác dnh thân vòng lap th$c hien hành dong gì.
Ngoài ra, ta còn cân mot cơ chê de quyêt dnh khi nào vòng lap se kêt thúc.
Mc này se gii thieu vê các lenh lap mà C++ cung câp.
3.3.1. Vòng wile
Vòngwilelap di lap l i chuoi hành dong, gi là thân vòng lap, nêu nh diêu
kien lap van còn dc tha mãn. Cú pháp ca vòng lap w
nh sau:
43
w
(diêu_kien_lap)
thân_vòng_lap
Câu trúc này bat dâu bang t' khóa w
, tiêp theo là diêu kien lap dat trong
mot cap ngoac dơn, cuôi cùng là thân vòng lap. Thân vòng lap hay ch
a nhiêu
hơn mot lenh và khi dó thì phi dc gói trong mot cap ngoac {}.
Khi th$c thi mot câu trúc w
, dâu tiên chơng trình kiem tra giá tr ca bieu
th
c diêu kien, nêu bieu th
c cho giá tr (th$c chât là bang 0) thì nhy
dên diem kêt thúc lenh w
, còn nêu diêu kien lap có giá tr
(th$c chât là
mot giá tr nào dó khác 0) thì tiên hành th$c hien tap lenh trong thân vòng lap
rôi quay tr l i kiem tra diêu kien lap, nêu không tha mãn thì kêt thúc, nêu tha
mãn thì l i th$c thi thân vòng lap rôi quay l i... Tap lenh thân vòng lap có the
làm thay doi giá tr ca bieu th
c diêu kien t'
sang (th$c chât là t'
khác 0 sang bang 0) de d'ng vòng lap.
Ví d, xét mot chơng trình có nhiem v dêm t' 1 dên mot ng4ng b
cho
trc. Do n mã dêm t' 1 dên b
có the dc viêt nh sau:
157. dc tang lên 2. Vòng lap quay vê diem xuât phát: kiem
tra diêu kien lap, gi là 2 5 2, van tha mãn. Thân vòng lap dc ch y lân th
hai (in giá tr 2 ca
159. lên 3) trc khi quay l i diem xuât
phát ca vòng lap. T i lân kiem tra diêu kien lap này, bieu th
c 3 5 2 cho giá tr
, vòng lap kêt thúc do diêu kien lap không còn dc tha mãn, chơng
trình ch y tiêp lenh nam sau câu trúc w
dang xét.
Câu trúc w
trong do n mã trên có the dc bieu dien bang sơ dô trong Hình
3.6. Trong sơ dô, mui tên sau chuoi hành dong in biên
163. b
, vòng while di dên diem kêt thúc, trao diêu khien cho lenh tiêp theo
trong chuoi lenh ca chơng trình.
Hình 3.6: Sơ dô mot vòng lap while.
Chơng trình hoàn ch#nh trong Hình 3.7 minh ha cách s dng vòng lap w
de in ra các sô nguyên (biên
164. ) t' 1 cho dên mot ng4ng giá tr do ngi
dùng nhap vào t' bàn phím (lu t i biên b
). Kèm theo là kêt qu ca các
lân ch y khác nhau vi các giá tr khác nhau ca b
. Dac biet, khi ngi
44
165. dùng nhap giá tr 0 cho b
, thân vòng w
không ch y mot lân nào, the
hien viec không mot sô nào dc in ra màn hình. Lí do là vì nêu b
bang
0 thì bieu th
c
176. vê vòng lap while.
Vòng lap vô tan
Mot trong nh
ng loi chơng trình thng gap là mot vòng lap không the kêt
thúc, thân vòng lap dó dc lap di lap l i mà không bao gi ng'ng. Mot vòng
lap nh vay dc gi là vòng lap vô tan. Thông thng, mot vài lenh trong
thân mot vòng w
hay
177. -w
se làm thay doi giá tr ca mot vài biên de
bieu th
c diêu kien cho giá tr (hoac 0), chang h n lenh tang biên dêm
178.
179. trong Hình 3.7. Nêu (các) biên dó không dc thay doi giá tr mot cách
thích hp hoac khi diêu kien lap dc viêt không chính xác (có the do thuat toán
sai hay nhâm lan khi viêt mã chơng trình), ta se nhan dc mot vòng lap vô
tan do diêu kien lap không bao gi nhan giá tr .
Hình 3.8 minh ha mot vòng lap vô tan khi biên
180. tang dân dên vô h n
nhng luôn nhan giá tr l+ và không bao gi có the có giá tr bang 12 de kêt thúc
vòng lap w
. Dây có the gi là loi lô-gic. Nêu do n chơng trình có nhiem
v tính tong các sô 1, 3, 5, 7, 9, 11 thì diêu kien lap nên dc sa thành (
188. vê vòng lap vô tan.
3.3.2. Vòng do-wile
Vòng do-wile rât giông vi vòng w
, khác biet chính là cho thân vòng
lap se dc th$c hien trc, sau dó mi kiem tra diêu kien lap, nêu dúng thì
quay l i ch y thân vòng lap, nêu sai thì d'ng vòng lap. Khác biet dó có nghia
rang thân ca vòng
189. -w
luôn dc ch y ít nhât mot lân, trong khi thân
vòng w
có the không dc ch y lân nào.
204. =b
);
Hai do n mã ch# khác nhau cho mot bên trái dùng vòng w
, bên phi dùng
vòng
205. -w
, còn l i, các phân thân vòng lap, diêu kien, khi t o dêu giông
het nhau. Do n bên trái dc lây t' ví d trong mc trc, nó in ra các sô t' 1
dên b
. Do n mã dùng vòng
206. -w
bên phi cung th$c hien công viec
giông het do n bên trái, ngo i tr' mot diem: khi b
nh hơn 1 thì nó van
dêm 1 trc khi d'ng vòng lap – thân vòng lap ch y 01 lân trc khi kiem tra
diêu kien.
De minh ha rõ hơn, ta xem xét Hình 3.9 là bn sa doi ca ví d trong Hình
3.7 bang cách thay câu trúc w
bang câu trúc
207. -w
và gi
nguyên các
phân còn l i. Kêt qu ch y chơng trình cho thây ho t dong ca chơng trình
trong Hình 3.9 không hoàn toàn nh mong muôn. C the, khi b
dc nhap
giá tr 0, chơng trình van dêm mot lân trong khi dáng ra không nên dêm lân
nào nh chơng trình nguyên gôc trong Hình 3.7. Dó là mot minh ha vê s$
khác biet gi
a ho t dong ca hai câu trúc w
và
220. vê vòng lap do-wile.
Tan dng dac diem ch y mot lân trc khi kiem tra diêu kien, chơng trình
trong Hình 3.10 làm nhiem v nhap t' bàn phím mot chuoi sô kêt thúc bang sô
0 và tính tong ca chúng. Công viec lap di lap l i là nhap vào mot sô () rôi
cong dôn giá tr ca sô dó vào tong (). Diêu kien lap là sô v'a nhap phi
khác 0. Rõ ràng, không cân và không nên kiem tra diêu kien lap trc khi lân
dâu th$c hien thân vòng lap. Trong trng hp này, câu trúc
221. -w
là l$a
chn tôt hơn so vi câu trúc w
.
Chơng trình trong Hình 3.10 còn là mot ví d vê mot vòng lap không dùng con
dêm de diêu khien vòng lap mà dùng mot biên canh hay c tr ng thái de dánh
222. dâu diem kêt thúc. 6 dây, 0 là giá tr canh dánh dâu phân t d
lieu cuôi cùng
mà ngi dùng nhap vào chơng trình.
49
238. E
Hình 3.10: Vòng lap do-while dùng biên canh.
3.3.3. Vòng fo
Vòng fo là câu trúc ho tr viec viêt các vòng lap mà sô lân lap dc kiem soát
bang biên dêm. Chang h n, do n mã gi sau dây mô t thuat toán in ra các sô t'
1 dên b
:
250. ( khi_to; diêu_kien_lap; cap_nhat)
thân_vòng_lap
Trong dó, bieu th
c khi_to thng khi t o con dêm diêu khien vòng lap,
diêu_kien_lap xác dnh xem thân vòng lap có nên ch y tiêp hay không (diêu
kien này thng ch
a ng4ng cuôi cùng ca con dêm), và bieu th
c cap_nhat
làm tang hay gim con dêm. Cung tơng t$ nh các câu trúc , w
..., nêu
thân_vòng_lap có nhiêu hơn mot lenh thì cân phi bc nó trong mot cap ngoac
{}. Lu ý rang cap ngoac dơn bao quanh bo ba khi_to, diêu_kien_lap,
cap_nhat, cung nh hai dâu châm phy ngan cách ba thành phân dó, là các
thành bat buoc ca cú pháp câu trúc
251. . Ba thành phân dó cung có the là bieu
th
c rong nêu cân thiêt, nhng ke c khi dó van phi có d hai dâu châm phy.
Trong hâu hêt các trng hp, câu trúc
252. tong quát trên tơng dơng vi
câu trúc lap w
sau (ngo i le dc nói dên trong Mc 0):
khi_to;
w
(diêu_kien_lap)
thân_vòng_lap
cap_nhat;
Ta có the khai báo biên ngay trong phân khi_to ca vòng
253. , chang h n dôi
vi biên con dêm. Nhng các biên dc khai báo t i dó ch# có hieu l$c bên
trong câu trúc lap (chi tiêt vê ph m vi ca biên se dc nói dên trong Mc 4.4).
Ví d:
259. de tính diem trung bình t' diem
ca 10 môn hc (sô môn hc lu trong biên bj ). Ngi dùng se dc
yêu câu nhap t' bàn phím diem sô ca 10 môn hc trong khi chơng trình cong
dôn tong ca 10 diem sô này. Công viec mà chơng trình cân lap di lap l i 10
lân là: nhap diem ca mot môn hc, cong dôn diem dó vào tong diem. Dâu tiên
vòng
260. se tiên hành bc khi t o vi mc dích chính là khi t o biên dêm.
Viec khi t o ch# dc tiên hành duy nhât mot lân. Trong ví d này, biên
280. vê vòng lap for.
Xét mot bài toán khác: Tính lãi gi tiên tiêt kiem. Mot ngi gi mot so tiêt
kiem kì h n 12 tháng vi sô tiên ban dâu là 1.000.000 VND, lãi suât 12% mot
nam. Gi s tiên lãi hàng nam không dc rút ra mà gop chung vào vôn. Sô tiên
281. nam trong so tiêt kiem sau moi nam (kì h n 12 tháng) dc tính theo công th
c
sau:
amount = principal * (1 + interest_rate)year
trong dó amount là sô tiên trong so tiêt kiem, principal là vôn ban dâu,
interest_rate là lãi xuât hàng nam, và year là sô nam dã gi. Hãy tính và in ra sô
tiên trong so tiêt kiem vào thi diem cuôi các kì 12 tháng hàng nam trong vòng
5 nam theo d ng
52
N
A
282. 1 xxxx
xxxx
Thuat toán cho bài toán dó nh sau:
Khi to các biên amount, principal, interestRate
In dê mc hai cot Year và Amount in deposit ra màn hình
Vi year chy t 1 dên 5, thc hien các công viec sau:
tính amount sau year nam theo công thc
in amount theo cot
Chơng trình hoàn ch#nh cho trong Hình 3.12. Trong dó có mot sô diem cân
chú ý.
Th
nhât, vân dê dnh d ng các giá tr sô khi in ra màn hình. Dnh d ng mac
dnh khi in ra màn hình là dnh d ng khoa hc, chang h n sô 1120000 he thap
phân se có d ng 1.12e+006. Ta se nhìn thây kêt qu này nêu xóa b dòng sau
khi chơng trình:
285. Dòng trên không hien th gì ra màn hình mà ch# dat câu hình cho các lân in tiêp
theo. C the, x giúp quy dnh rang các giá tr th$c in ra theo d ng có dâu
châm thap phân (he do lng Anh-My, tơng dơng vi dâu phy thap phân
ca he mét), còn
286. () quy dnh rang các giá tr th$c dc in ra
vi do chính xác 2 ch
sô sau dâu châm. Dó là hai trong nhiêu phép dnh d ng
luông d
lieu (stream manipulator). Các phép dnh d ng này nam trong th vien
iomanip ca th vien chuan. Do dó, de s dng chúng, ta phi có dnh hng
tiên x lý
287. dâu tep mã nguôn (xem phân dâu ca chơng
trình trong Hình 3.12).
288. Th
hai là s dng hàm th vien toán hc de tính luy th'a. C++ không có phép
tính luy th'a. Thay vào dó, th vien cmath trong th vien chuan C++ cung
câp hàm