T
T
R
R
Ư
Ư
N
N
G
G
Đ
Đ
I
I
H
H
C
C
M
M
T
T
P
P
.
.
H
H
C
C
M
M
LÊ PHÚ HIU
Biên son
GIÁO TRÌNH L
P TRÌNH C++
2
TRƯỜNG ĐẠI HC M TP.HCM
GIÁO TRÌNH LP TRÌNH C++
DÙNG CHO SINH VIÊN
THUC KHI NGÀNH K THUT
KHÔNG CHUYÊN V CÔNG NGH THÔNG TIN
Tác gi Lê Phú Hiếu
THÀNH PH H CHÍ MINH
3
LI NÓI ĐẦU
C++ hin là ngôn ng lp trình (NNLT) được ưa chung và
s dng rng rãi do tính năng mnh m, đa dng ca nó.
Đây là NNLT được nhiu trường đại hc và cao đẳng trong
và ngoài nước s dng để ging dy lp trình ban đầu cho
sinh viên.
Giáo trình “Lp trình C++” này được viết nhm phc v cho
đối tượng là sinh viên các h Cao đẳng và Đại hc thuc
khi ngành K thut (Không chuyên v Công ngh Thông
Tin). Mc tiêu ca giáo trì
nh nhm cung cp kiến thc cơ
bn v ngôn ng lp trình C++, đủ để gii quyết nhng bài
toán lp trình trong nhiu lĩnh vc khác nhau như: tính toán,
k thut, sinh hc, qun lý, …
Vi s lượng trang khiêm tn, giáo trình này gii hn,
không đề cp đến cách tiếp cn lp trình hướng đối tượng
mà ch nhn mnh đến kiu lp trình truyn thng,
lp trình
đơn th (module), theo tiếp cn hướng cu trúc. Kiu lp
trình truyn thng là quan trng và theo ý kiến cá nhân là
bt buc phi ging dy cho người mi bt đầu hc lp trình
trước khi chuyn sang hc lp trình theo tiếp cn hướng đối
tượng.
Giáo trình được t chc thành 8 chương, cui mi chương
đều có câu hi và bài tp để cũng c kiến thc phn lý
thuyết. Phn lý thuyết được trình bày cô đọng, tp t
rung vào
nhng kiến ct lõi, cn thiết để áp dng trong viết mã
4
chương trình. Phn gii bài tp s được thc hin trong tài
liu khác. Các chương trình ví d minh ha trong tài liu đã
được th nghim và chy tt trong môi trường Visual C++
6.0.
Giáo trình này có th được dùng làm tài liu cho sinh viên
t hc. Ging viên cũng có th s dng để tham kho trong
ging dy môn lp trình.
Mc dù có nhiu c gng nhưng không th tránh khi thiếu
sót, rt mong nhn được s nhn xét, phê bình ca đồng
nghip và bn đọc để tài liu được hoàn thin hơn.
Tác gi
5
Mc lc
B GIÁO DC VÀ ĐÀO TO _________________________________ 1
CHƯƠNG 1. MT S KHÁI NIM CƠ BN V LP TRÌNH
_____ 13
1. Thut toán (Algorithm)
________________________________ 13
1.1. Khái nim ________________________________________ 13
1.2. Các đặc trưng ca th
ut toán __________________________ 13
1.3. Các công c biu din thut toán
_______________________ 14
2. Ngôn ng lp trình (NNLT)
_____________________________ 15
3. Chương trình (máy tính)
_______________________________ 16
4. Các bước xây dng chương trình ________________________ 17
5. Câu hi và bài tp _____________________________________ 18
CHƯƠNG 2. CÁC YU T CƠ BN CA NNLT C/C++
__________ 21
1. B
t (character set) ________________________________ 21
2. Danh hiu (identifi
er) __________________________________ 21
3. T khóa (keyw
ord) ____________________________________ 22
4. Chú thích (comment)
__________________________________ 22
5. Các kiu d liu cơ bn (base
type) ______________________ 23
5.1. S nguyên
________________________________________ 23
6
5.2. S thc (độ chính xác đơn – 6 ch s l) ________________ 23
5.3. S thc (độ chính xác kép – 15 ch s l): _______________ 24
5.4. Kí t _____________________________________________ 24
6. Hng (constant)
_______________________________________ 25
Mt s kí t đặc bit: ________________________________________ 26
7. Biến (variable)
________________________________________ 27
8. Biu thc (expression) _________________________________ 29
9. Chuyn đổi k
iu (type conversion) _______________________ 29
10. Các toán t (operator)
_________________________________ 30
10.1. Toán t s hc _____________________________________ 30
10.2. Toán t quan h (so sánh)
____________________________ 30
10.3. Toán t logic
______________________________________ 31
10.4. Toán t gán
_______________________________________ 31
10.5. Toán t điu kin ( ? : )
_____________________________ 32
10.6. Toán t tăng (++), gim
(––) mt đơn v _________________ 33
Biu thc có dng __________________________________________ 33
10.7. Toán t dch chuyn s hc ___________________________ 34
10.8. Toán t th
ao tác trên tng bít _________________________ 34
7
10.9. Toán t ép kiu (đã nói trên) ________________________ 34
10.10.Toán t “ly địa ch ca” ( & )
________________________ 34
10.11.Toán t sizeof:
_____________________________________ 34
11. Độ ưu tiên và trt t kết hp các toán t (preced
ence and
associativity) _____________________________________________ 35
12. Câu lnh (statement, instruction)
________________________ 36
13. Xut / Nhp d liu đơn gin trong C/C++
________________ 37
14. Mt vài chương trình C/C++ đơn gin ___________________ 39
15. Câu hi ______________________________________________ 46
16. Bài tp v phép toán và biu thc ________________________ 49
CHƯƠNG 3. CÁC CU TRÚC ĐIU KHIN (CONTROL
STRUCTURES) ____________________________________________ 62
1. Cu trúc r nhánh (if … then … else …)
__________________ 62
2. Cu trúc la chn (sw
itch . . .) ___________________________ 66
3. Cu trúc lp w
hile (…) _________________________________ 69
4. Cu trúc lp do … w
hile (…) ____________________________ 71
5. Cu trúc lp for (…)
___________________________________ 74
6. Câu lnh break
_______________________________________ 77
7. Câu lnh continue (ít dùng)
_____________________________ 78
8
8. Câu lnh goto ________________________________________ 78
9. Câu hi ______________________________________________ 79
10. Bài tp ______________________________________________ 91
10.1. Cu trúc r nhánh
___________________________________ 91
10.2. Cu trúc la chn ___________________________________ 92
10.3. Cu trúc lp _______________________________________ 93
CHƯƠNG 4. HÀM (FUNCTION)
____________________________ 102
1. Khái nim __________________________________________ 102
2. Khai báo và định nghĩa hàm
___________________________ 103
3. Lnh return
_________________________________________ 104
4. Các dng hàm
_______________________________________ 104
4.1. Hàm không có tham
s _____________________________ 104
4.2. Hàm vi n
hiu tham s _____________________________ 106
4.3. Hàm nguyên mu (function prot
otype) _________________ 107
4.4. T chc mt chương trình “C/C++” (trên cùng 1 tp tin)
___ 108
5. Các phương pháp truyn tham s _______________________ 109
6. Phm vi (scope) và cp lưu tr (storage class) ca các đối
tượng __________________________________________________ 111
6.1. Phm vi
_________________________________________ 111
9
6.2. Cp lưu tr _______________________________________ 113
7. Cơ chế gi hàm và b nh stack
________________________ 120
8. Hàm có t
ham s vi giá tr ngm định (Function with
default arguments) ______________________________________ 123
9. Np chng hàm (Function overloading)
__________________ 124
10. Mt s gi ý k
hi thiết kế hàm __________________________ 126
11. Mt s ví d minh ha ________________________________ 127
12. Câu hi _____________________________________________ 127
13. Bài tp _____________________________________________ 131
CHƯƠNG 5. KIU MNG (ARRAY
) _________________________ 134
1. Khái nim __________________________________________ 134
2. Khai báo & k
hi to giá tr các phn t mng trong
“C/C++” _______________________________________________ 134
3. Truy xut các phn t ca mng _______________________ 136
4. Truyn tham s mng cho hàm
_________________________ 137
5. Các thao tác cơ bn trên mng 1 chiu ___________________ 138
5.1. Nhp giá tr cho các phn t mng. ____________________ 138
5.2. Xut giá tr các phn t mng (ra màn hình).
____________ 140
5.3. Thêm 1 phn t vào mng. __________________________ 141
10
5.4. Xóa mt phn t ra khi mng. _______________________ 142
5.5.
m kiếm trên mng. _______________________________ 143
5.6. Sp xếp mng. ____________________________________ 145
6. Câu hi _____________________________________________ 149
7. Bài tp _____________________________________________ 149
Mng 1 chiu _____________________________________________ 149
Mng 2 chiu _____________________________________________ 152
CHƯƠNG 6. CON TR (POINTER)
__________________________ 153
1. Khái nim __________________________________________ 153
2. Khai báo biến con tr _________________________________ 153
3. Truy xut biến tr ___________________________________ 154
4. S hc con tr _______________________________________ 155
5. Liên h gia con tr và mng __________________________ 156
6. Con tr đa cp _______________________________________ 157
7. Truyn tham s con tr cho hàm
_______________________ 158
8. Mng các con tr ____________________________________ 158
9. T khóa const vi con tr _____________________________ 159
10. Cp phát động _______________________________________ 160
11
11. Con tr hàm ________________________________________ 164
12. Con tr và chui k
í t ________________________________ 165
13. ng dng con tr ____________________________________ 167
14. Sơ lược v kiu tham chiếu (
Reference) - Ch có trong C++. _ 167
15. Bài tp _____________________________________________ 168
CHƯƠNG 7. KIU STRUCT
________________________________ 175
1. Khái nim __________________________________________ 175
2. Khai báo và truy xut biến struct trong ‘C’
______________ 175
3. Lnh typedef ________________________________________ 177
4. Kiu enum
__________________________________________ 178
Khai báo _________________________________________________ 178
5. Mng các struct
______________________________________ 179
6. Con tr tr đến biến k
iu struct ________________________ 180
7. Truyn tham s kiu struct cho hàm
____________________ 181
8. Kiu union
__________________________________________ 181
9. Bài tp _____________________________________________ 182
CHƯƠNG 8. File
__________________________________________ 183
1. Gii thiu chung
_____________________________________ 183
12
2. Thao tác trên kiu file ________________________________ 183
2.1. M File ( liên kết kênh nhp/xut vi file đĩa )
___________ 183
2.2. X lý File
________________________________________ 184
2.3. Đóng File
________________________________________ 185
2.4. Ví d Vào
/Ra File định dng _________________________ 185
2.5. Ví d Vào
/Ra kí t _________________________________ 188
2.6. Ví d Vào
/Ra File nh phân __________________________ 189
3. Bài tp _____________________________________________ 191
TÀI LIU THAM KHO ___________________________________ 193
13
CHƯƠNG 1. MT S KHÁI NIM CƠ BN V LP
TRÌNH
1. Thut toán (Algorithm)
1.1. Khái nim
Thut toán là khái nim cơ s ca toán hc và tin hc.
Thut toán là phương pháp th hin li gii ca vn đề – bài
toán.
Thut toán là dãy các thao tác, các hướng dn rõ ràng, được
sp xếp t
heo mt trình t xác định, sao cho 2 b x
(người/máy) khác nhau, vi cùng điu kin đầu vào như
nhau thì sau mt s bước hu hn thc hin, s cho kết qu
ging nha
u mà không cn biết ý nghĩa ca các thao tác này.
Cn chú ý là không phi mi dãy thao tác, ch dn nào cũng
đều to ra thut toán. Phương pháp nu ăn, cách dùng thuc,.
.. đều không phi là thut toán do các thao tác, các ch dn là
không xác định, không rõ ràng.
1.2. Các đặc t
rưng ca thut toán
Tính xác định: Các thao tác ca thut toán phi xác định, không
được nhp nhng, mơ h để có th d dàng cài đặt trên mt h t động
hóa.
Tính dng: Thut toán phi dng sau mt s hu hn bước thc
hin.
Tính đúng đắn: Thut toán phi cho kết qu đúng theo yêu cu
ca bài toán đặt ra.
14
Tính ph dng: Thut toán có th được s dng li để gii mt
lp bài toán tương t.
Tính hiu qu: Thut toán cn ti ưu v s dng b nhđáp
ng yêu cu ca bài toán trong thi gian ngn nht có th được. Thc
tế rt khó đạt được c 2 yêu cu này trong mt thut toán.
1.3. Các công c biu din thut toán
Ngôn ng t nhiên: là ngôn ng lit kê các bước, mô
t thut
toán theo ngôn ng t nhiên ca con người.
Ví d: Thut toán xác định tr ln nht trong 5 s nguyên.
B1. Gi a, b, c, d, e là 5 biến lưu tr các tr nguyên cho trước (nhp t
bàn phím).
B2. Gi max là biến lưu tr tr ln nht trong 5 s nguyên trên, và gi
s a có tr ln nht.
B3. Ln lượt so sánh tr ca max vi các biến b, c, d, e còn li. Nếu tr
ca max n
h hơn bt k biến nào thì gán tr ca biến đó cho max.
B4. Xut kết qu tr biến max ra màn hình
Lưu đồ thut toán hay sơ đồ khi (Flow chart): là công c cho
phép biu din thut toán mt cách trc quan. Thường ch có th dùng
công c lưu đồ đối vi các thut toán tương đối ngn, có th được biu
din trong mt trang giy. Các hình cơ bn s dng trong lưu đồ:
15
Hình oval mô t đim xut phát /
kết thúc.
Hình ch nht mô t mt hay
nhiu ch th máy cn thc hin.
Hình bình hành mô t thao tác
nhp/xut d liu.
Hình thoi mô t s r nhánh, la
chn, phép kim tra điu kin
Mũi tên ch hướng lưu chuyn
ca các thao tác.
Mã gi (Pseudo code) gn ging như ngôn ng t nhiên, nhưng
có s dng các cu trúc chun hóa (khai báo biến, chú thích, cu trúc
điu khin, . . .) do người thiết kế quy định.
Ngôn ng lp trình (Programming language) là h thng các ký
hiu cho phép mô t các quy trình tính toán dưới dng văn bn.
2. Ngôn ng lp trình (NNLT)
Các thành phn cơ bn ca NNLT b
ao gm:
B kí t (character set) hay bng ch cái dùng để viết
chương trình.
Cú pháp (syntax) là b quy tc để viết chương trình.
Ng nghĩa (semantic) xác định ý nghĩa các thao tác, hành
động cn phi thc hin, ng cnh (context) ca các câu lnh
trong chương trình.
Hin đã có hàng nghìn NNLT được thiết kế, và hàng năm li có
thêm nhiu NNLT mi xut hin. S phát trin ca NNLT gn lin
16
vi s phát trin ca ngành tin hc. Mi loi NNLT phù hp vi mt
s lp bài toán nht định.
Phân loi NNLT:
Ngôn ng máy (machine language) hay còn gi là NNLT
cp thp có tp lnh ph thuc vào mt h máy c th.
Chương trình viết bng ngôn ng máy s dng bng ch cái
ch gm 2 kí t 0, 1. Chương trình ngôn ng máy được np
trc tiếp vào b nh và thc hin ngay.
Ngôn ng lp trình cp cao nói chung không ph th
uc vào
loi máy tính c th. Chương trình viết bng NNLT cp cao
s dng b kí t phong phú hơn, và phi được chuyn đổi
sang dng mã máy để máy tính có th hiu được bng
chương trình dch. Mt s NNLT cp cao thông dng hin
nay: Pascal, C, C++, Java, Smalltalk, Basic, Ruby, Fortran,
Algol, Lisp, Prolog, Cobol, …
3. Chương trình (máy tính)
Là tp hp hu hn các ch th máy được b trí, sp xếp theo mt
trt t xác định, nhm g
ii quyết yêu cu ca bài toán đặt ra. Chương
trình được viết bng mt NNLT c th nào đó.
Các chương trình C/C++ (trong môi trường DOS) được to ra
bng 1 trình son tho văn bn (EDITOR) như: SK, NC Editor, VRES
. . . Hin nay, các chương trình dch đều tích hp sn editor riêng cho
phép USER son thn, biên dch, kim li, liên kết và thc hin
chương trình mt cách d dàng.
17
Các chương trình này (mã ngun – source code), thc cht là
dng ngôn ng t nhiên, do đó phi được biên dch li dưới dng mã
máy (object code) mà máy tính có th hiu được. Vic này được thc
hin bi chương trình dch.
Có 2 loi chương trình dch:
Trình thông dch (interpreter): mi lnh được dch sang mã máy
và cho thc hin ngay.
Trình biên dch (compiler): toàn b chương trình ngun được
dch sang mã máy (tp tin.obj), sau đó trình liên kết (linker) s
kết ni cá
c module chương trình để to thành tp tin EXE.
Nói chung, mt chương trình máy tính được b cc thành 3 phn:
4. Các bước xây dng chương trình
B1. Xác định đúng yêu cu ca bài toán: Cn xác định phm vi, các
gii hn, ràng buc, các gi thiết ca bài toán. Đặc bit cn khc
phc sc ì v mt tâm lý trong quá trình tìm hiu bài toán.
B2. Xây
dng thut gii: Cn có kiến thc liên quan đến vn đề đang
gii quyết. Cn xác định rõ thut toán s tác động trên nhng đối
tượng (thông tin) nào ? Có bao nhiêu đối tượng (biến) cn x lý?
Mi biến có th được lưu tr dưới dng nào, kiu gì ? Giá tr ban
đầu ca các biến ? Hình dung t
rước kết xut DL sau khi x lý s
như thế nào?
Nhp X Xut
18
B3. Th hin thut gii bng lưu đồ thut toán (nếu được).
B4. Cài đặt thut toán bng mt NNLT c th: Dùng mt trình son
tho VB để to chương trình ngun (source code) theo mt NNLT
nào đó.
B5. Th nghim thut toán, nếu sai quay li B2. Cn xác định li ca
thut toán thuc loi nào: li v mt cú pháp (syntax error), li lúc
thc hin chương trình (run-time error), và li logic. Li cú pháp
xy ra lúc biên dch chương trình, do vi phm các q
uy định v mt
cú pháp ca NNLT đang s dng. Li này tương đối d khc phc.
Li run-time error như: divide by zero, stack overflow, không đủ
b nh, … Li logic (logic error) khó phát hin hơn nhiu.
B6. Kết thúc.
5. Câu hi và bài tp
Thut toán (Algorithm
)
Thut toán là gì?
Nêu các đặc trưng cn có ca mt thut toán.
Các cách biu din mt thut toán?
Ngôn ng lp trình (Programming language) là gì?
Nêu các bước xây dng thut toán.
Danh hiu (Identifier)
Danh hiu được dùng để làm gì?
Như thế nào là mt danh hiu hp l?
Nguyên tc s dng danh hiu?
19
T khóa là gì?
Đặc đim ca các t khóa trong NNLT “C/C++”?
Kiu d liu (Data type)
Trình bày các kiu d liu đơn gin mà Anh (Ch) đã
biết.
Hng (Constant)
Hng là gì?
Hng được s dng khi nào?
Cho biết cách thc khai báo mt hng?
Cho ví d v cách biu din hng nguyên, thc, ký t,
chui kí t.
Biến (Variable)
Biến là gì?
Biến được s dng để làm gì?
Cho biết cách thc k
hai báo mt biến?
Hãy cho biết cách thc làm thay đổi ni dung (giá tr) ca
mt biến?
Biu thc (Expression)
Biu thc là gì?
Kiu ca biu thc do . . . . . . . . . . . . . . . .. quyết định?
Khi nào xy ra vic ép kiu t động?
Khi nào cn phi s dng t
oán t ép kiu?
20
Trình bày nguyên tc NNLT “C/C++” tính tr các biu
thc?
Toán t
Hãy trình bày các toán t mà Anh (Ch) biết.
Cho ví d v toán t điu kin (.. .? .. ..: .. .).
Hãy viết biu thc tương đương không có toán t ‘!’:
! (x <= 5)
! (x > 5)
! (x > 2 && y!= 3)
! (x > 2 || y == 3)
! (x == 1 &&! (x!= 3) || x > 10)
! (x > 100 || x < 0 &&! (x == 0))
Câu lnh (Statement, Instruction)
Cho biết các loi câu lnh trong “C/C++” ? Cho ví d.

Preview text:


TRƯỜNG ĐẠI HỌC MỞ TP.HCM
GIÁO TRÌNH LẬP TRÌNH C++ LÊ PHÚ HIẾU Biên soạn
TRƯỜNG ĐẠI HỌC MỞ TP.HCM
GIÁO TRÌNH LẬP TRÌNH C++ DÙNG CHO SINH VIÊN
THUỘC KHỐI NGÀNH KỸ THUẬT
KHÔNG CHUYÊN VỀ CÔNG NGHỆ THÔNG TIN
Tác giả Lê Phú Hiếu
THÀNH PHỐ HỒ CHÍ MINH 2 LỜI NÓI ĐẦU
C++ hiện là ngôn ngữ lập trình (NNLT) được ưa chuộng và
sử dụng rộng rãi do tính năng mạnh mẽ, đa dụng của nó.
Đây là NNLT được nhiều trường đại học và cao đẳng trong
và ngoài nước sử dụng để giảng dạy lập trình ban đầu cho sinh viên.
Giáo trình “Lập trình C++” này được viết nhằm phục vụ cho
đối tượng là sinh viên các hệ Cao đẳng và Đại học thuộc
khối ngành Kỹ thuật (Không chuyên về Công nghệ Thông
Tin). Mục tiêu của giáo trình nhằm cung cấp kiến thức cơ
bản về ngôn ngữ lập trình C++, đủ để giải quyết những bài
toán lập trình trong nhiều lĩnh vực khác nhau như: tính toán,
kỹ thuật, sinh học, quản lý, …
Với số lượng trang khiêm tốn, giáo trình này giới hạn,
không đề cập đến cách tiếp cận lập trình hướng đối tượng
mà chỉ nhấn mạnh đến kiểu lập trình truyền thống, lập trình
đơn thể (module), theo tiếp cận hướng cấu trúc. Kiểu lập
trình truyền thống là quan trọng và theo ý kiến cá nhân là
bắt buộc phải giảng dạy cho người mới bắt đầu học lập trình
trước khi chuyển sang học lập trình theo tiếp cận hướng đối tượng.
Giáo trình được tổ chức thành 8 chương, cuối mỗi chương
đều có câu hỏi và bài tập để cũng cố kiến thức phần lý
thuyết. Phần lý thuyết được trình bày cô đọng, tập trung vào
những kiến cốt lõi, cần thiết để áp dụng trong viết mã 3
chương trình. Phần giải bài tập sẽ được thực hiện trong tài
liệu khác. Các chương trình ví dụ minh họa trong tài liệu đã
được thử nghiệm và chạy tốt trong môi trường Visual C++ 6.0.
Giáo trình này có thể được dùng làm tài liệu cho sinh viên
tự học. Giảng viên cũng có thể sử dụng để tham khảo trong
giảng dạy môn lập trình.
Mặc dù có nhiều cố gắng nhưng không thể tránh khỏi thiếu
sót, rất mong nhận được sự nhận xét, phê bình của đồng
nghiệp và bạn đọc để tài liệu được hoàn thiện hơn. Tác giả 4 Mục lục
BỘ GIÁO DỤC VÀ ĐÀO TẠO _________________________________ 1
CHƯƠNG 1. MỘT SỐ KHÁI NIỆM CƠ BẢN VỀ LẬP TRÌNH _____ 13
1. Thuật toán (Algorithm) ________________________________ 13
1.1. Khái niệm ________________________________________ 13
1.2. Các đặc trưng của thuật toán __________________________ 13
1.3. Các công cụ biểu diễn thuật toán _______________________ 14
2. Ngôn ngữ lập trình (NNLT) _____________________________ 15
3. Chương trình (máy tính) _______________________________ 16
4. Các bước xây dựng chương trình ________________________ 17
5. Câu hỏi và bài tập _____________________________________ 18
CHƯƠNG 2. CÁC YẾU TỐ CƠ BẢN CỦA NNLT C/C++ __________ 21
1. Bộ ký tự (character set) ________________________________ 21
2. Danh hiệu (identifier) __________________________________ 21
3. Từ khóa (keyword) ____________________________________ 22
4. Chú thích (comment) __________________________________ 22
5. Các kiểu dữ liệu cơ bản (base type) ______________________ 23
5.1. Số nguyên ________________________________________ 23 5
5.2. Số thực (độ chính xác đơn – 6 chữ số lẻ) ________________ 23
5.3. Số thực (độ chính xác kép – 15 chữ số lẻ): _______________ 24
5.4. Kí tự _____________________________________________ 24
6. Hằng (constant) _______________________________________ 25
Một số kí tự đặc biệt: ________________________________________ 26
7. Biến (variable) ________________________________________ 27
8. Biểu thức (expression) _________________________________ 29
9. Chuyển đổi kiểu (type conversion) _______________________ 29
10. Các toán tử (operator) _________________________________ 30
10.1. Toán tử số học _____________________________________ 30
10.2. Toán tử quan hệ (so sánh) ____________________________ 30
10.3. Toán tử logic ______________________________________ 31
10.4. Toán tử gán _______________________________________ 31
10.5. Toán tử điều kiện ( ? : ) _____________________________ 32
10.6. Toán tử tăng (++), giảm (––) một đơn vị _________________ 33
Biểu thức có dạng __________________________________________ 33
10.7. Toán tử dịch chuyển số học ___________________________ 34
10.8. Toán tử thao tác trên từng bít _________________________ 34 6
10.9. Toán tử ép kiểu (đã nói ở trên) ________________________ 34
10.10. Toán tử “lấy địa chỉ của” ( & ) ________________________ 34
10.11. Toán tử sizeof: _____________________________________ 34
11. Độ ưu tiên và trật tự kết hợp các toán tử (precedence and
associativity) _____________________________________________ 35
12. Câu lệnh (statement, instruction) ________________________ 36
13. Xuất / Nhập dữ liệu đơn giản trong C/C++ ________________ 37
14. Một vài chương trình C/C++ đơn giản ___________________ 39
15. Câu hỏi ______________________________________________ 46
16. Bài tập về phép toán và biểu thức ________________________ 49
CHƯƠNG 3. CÁC CẤU TRÚC ĐIỀU KHIỂN (CONTROL
STRUCTURES) ____________________________________________ 62
1. Cấu trúc rẽ nhánh (if … then … else …) __________________ 62
2. Cấu trúc lựa chọn (switch . . .) ___________________________ 66
3. Cấu trúc lặp while (…) _________________________________ 69
4. Cấu trúc lặp do … while (…) ____________________________ 71
5. Cấu trúc lặp for (…) ___________________________________ 74
6. Câu lệnh break _______________________________________ 77
7. Câu lệnh continue (ít dùng) _____________________________ 78 7
8. Câu lệnh goto ________________________________________ 78
9. Câu hỏi ______________________________________________ 79
10. Bài tập ______________________________________________ 91
10.1. Cấu trúc rẻ nhánh ___________________________________ 91
10.2. Cấu trúc lựa chọn ___________________________________ 92
10.3. Cấu trúc lặp _______________________________________ 93
CHƯƠNG 4. HÀM (FUNCTION) ____________________________ 102
1. Khái niệm __________________________________________ 102
2. Khai báo và định nghĩa hàm ___________________________ 103
3. Lệnh return _________________________________________ 104
4. Các dạng hàm _______________________________________ 104
4.1. Hàm không có tham số _____________________________ 104
4.2. Hàm với nhiều tham số _____________________________ 106
4.3. Hàm nguyên mẫu (function prototype) _________________ 107
4.4. Tổ chức một chương trình “C/C++” (trên cùng 1 tập tin) ___ 108
5. Các phương pháp truyền tham số _______________________ 109
6. Phạm vi (scope) và cấp lưu trữ (storage class) của các đối
tượng __________________________________________________ 111
6.1. Phạm vi _________________________________________ 111 8
6.2. Cấp lưu trữ _______________________________________ 113
7. Cơ chế gọi hàm và bộ nhớ stack ________________________ 120
8. Hàm có tham số với giá trị ngầm định (Function with
default arguments) ______________________________________ 123
9. Nạp chồng hàm (Function overloading) __________________ 124
10. Một số gợi ý khi thiết kế hàm __________________________ 126
11. Một số ví dụ minh họa ________________________________ 127
12. Câu hỏi _____________________________________________ 127
13. Bài tập _____________________________________________ 131
CHƯƠNG 5. KIỂU MẢNG (ARRAY) _________________________ 134
1. Khái niệm __________________________________________ 134
2. Khai báo & khởi tạo giá trị các phần tử mảng trong
“C/C++” _______________________________________________ 134
3. Truy xuất các phần tử của mảng _______________________ 136
4. Truyền tham số mảng cho hàm _________________________ 137
5. Các thao tác cơ bản trên mảng 1 chiều ___________________ 138
5.1. Nhập giá trị cho các phần tử mảng. ____________________ 138
5.2. Xuất giá trị các phần tử mảng (ra màn hình). ____________ 140
5.3. Thêm 1 phần tử vào mảng. __________________________ 141 9
5.4. Xóa một phần tử ra khỏi mảng. _______________________ 142
5.5. Tìm kiếm trên mảng. _______________________________ 143
5.6. Sắp xếp mảng. ____________________________________ 145
6. Câu hỏi _____________________________________________ 149
7. Bài tập _____________________________________________ 149
Mảng 1 chiều _____________________________________________ 149
Mảng 2 chiều _____________________________________________ 152
CHƯƠNG 6. CON TRỎ (POINTER) __________________________ 153
1. Khái niệm __________________________________________ 153
2. Khai báo biến con trỏ _________________________________ 153
3. Truy xuất biến trỏ ___________________________________ 154
4. Số học con trỏ _______________________________________ 155
5. Liên hệ giữa con trỏ và mảng __________________________ 156
6. Con trỏ đa cấp _______________________________________ 157
7. Truyền tham số con trỏ cho hàm _______________________ 158
8. Mảng các con trỏ ____________________________________ 158
9. Từ khóa const với con trỏ _____________________________ 159
10. Cấp phát động _______________________________________ 160 10
11. Con trỏ hàm ________________________________________ 164
12. Con trỏ và chuỗi kí tự ________________________________ 165
13. Ứng dụng con trỏ ____________________________________ 167
14. Sơ lược về kiểu tham chiếu (Reference) - Chỉ có trong C++. _ 167
15. Bài tập _____________________________________________ 168
CHƯƠNG 7. KIỂU STRUCT ________________________________ 175
1. Khái niệm __________________________________________ 175
2. Khai báo và truy xuất biến struct trong ‘C’ ______________ 175
3. Lệnh typedef ________________________________________ 177
4. Kiểu enum __________________________________________ 178
Khai báo _________________________________________________ 178
5. Mảng các struct ______________________________________ 179
6. Con trỏ trỏ đến biến kiểu struct ________________________ 180
7. Truyền tham số kiểu struct cho hàm ____________________ 181
8. Kiểu union __________________________________________ 181
9. Bài tập _____________________________________________ 182
CHƯƠNG 8. File __________________________________________ 183
1. Giới thiệu chung _____________________________________ 183 11
2. Thao tác trên kiểu file ________________________________ 183
2.1. Mở File ( liên kết kênh nhập/xuất với file đĩa ) ___________ 183
2.2. Xử lý File ________________________________________ 184
2.3. Đóng File ________________________________________ 185
2.4. Ví dụ Vào/Ra File định dạng _________________________ 185
2.5. Ví dụ Vào/Ra kí tự _________________________________ 188
2.6. Ví dụ Vào/Ra File nhị phân __________________________ 189
3. Bài tập _____________________________________________ 191
TÀI LIỆU THAM KHẢO ___________________________________ 193 12
CHƯƠNG 1. MỘT SỐ KHÁI NIỆM CƠ BẢN VỀ LẬP TRÌNH
1. Thuật toán (Algorithm) 1.1. Khái niệm
• Thuật toán là khái niệm cơ sở của toán học và tin học.
• Thuật toán là phương pháp thể hiện lời giải của vấn đề – bài toán.
• Thuật toán là dãy các thao tác, các hướng dẫn rõ ràng, được
sắp xếp theo một trình tự xác định, sao cho 2 bộ xử lý
(người/máy) khác nhau, với cùng điều kiện đầu vào như
nhau thì sau một số bước hữu hạn thực hiện, sẽ cho kết quả
giống nhau mà không cần biết ý nghĩa của các thao tác này.
Cần chú ý là không phải mọi dãy thao tác, chỉ dẫn nào cũng
đều tạo ra thuật toán. Phương pháp nấu ăn, cách dùng thuốc,.
.. đều không phải là thuật toán do các thao tác, các chỉ dẫn là
không xác định, không rõ ràng.
1.2. Các đặc trưng của thuật toán
Tính xác định: Các thao tác của thuật toán phải xác định, không
được nhập nhằng, mơ hồ để có thể dễ dàng cài đặt trên một hệ tự động hóa.
Tính dừng: Thuật toán phải dừng sau một số hữu hạn bước thực hiện.
Tính đúng đắn: Thuật toán phải cho kết quả đúng theo yêu cầu của bài toán đặt ra. 13
Tính phổ dụng: Thuật toán có thể được sử dụng lại để giải một
lớp bài toán tương tự.
Tính hiệu quả: Thuật toán cần tối ưu về sử dụng bộ nhớ và đáp
ứng yêu cầu của bài toán trong thời gian ngắn nhất có thể được. Thực
tế rất khó đạt được cả 2 yêu cầu này trong một thuật toán.
1.3. Các công cụ biểu diễn thuật toán
Ngôn ngữ tự nhiên: là ngôn ngữ liệt kê các bước, mô tả thuật
toán theo ngôn ngữ tự nhiên của con người.
Ví dụ: Thuật toán xác định trị lớn nhất trong 5 số nguyên.
B1. Gọi a, b, c, d, e là 5 biến lưu trữ các trị nguyên cho trước (nhập từ bàn phím).
B2. Gọi max là biến lưu trữ trị lớn nhất trong 5 số nguyên trên, và giả
sử a có trị lớn nhất.
B3. Lần lượt so sánh trị của max với các biến b, c, d, e còn lại. Nếu trị
của max nhỏ hơn bất kỳ biến nào thì gán trị của biến đó cho max.
B4. Xuất kết quả trị biến max ra màn hình
Lưu đồ thuật toán hay sơ đồ khối (Flow chart): là công cụ cho
phép biểu diễn thuật toán một cách trực quan. Thường chỉ có thể dùng
công cụ lưu đồ đối với các thuật toán tương đối ngắn, có thể được biểu
diễn trong một trang giấy. Các hình cơ bản sử dụng trong lưu đồ: 14
Hình oval mô tả điểm xuất phát / kết thúc.
Hình chữ nhật mô tả một hay
nhiều chỉ thị máy cần thực hiện.
Hình bình hành mô tả thao tác nhập/xuất dữ liệu.
Hình thoi mô tả sự rẻ nhánh, lựa
chọn, phép kiểm tra điều kiện
Mũi tên chỉ hướng lưu chuyển của các thao tác.
Mã giả (Pseudo code) gần giống như ngôn ngữ tự nhiên, nhưng
có sử dụng các cấu trúc chuẩn hóa (khai báo biến, chú thích, cấu trúc
điều khiển, . . .) do người thiết kế quy định.
Ngôn ngữ lập trình (Programming language) là hệ thống các ký
hiệu cho phép mô tả các quy trình tính toán dưới dạng văn bản.
2. Ngôn ngữ lập trình (NNLT)
Các thành phần cơ bản của NNLT bao gồm:
• Bộ kí tự (character set) hay bảng chữ cái dùng để viết chương trình.
• Cú pháp (syntax) là bộ quy tắc để viết chương trình.
• Ngữ nghĩa (semantic) xác định ý nghĩa các thao tác, hành
động cần phải thực hiện, ngữ cảnh (context) của các câu lệnh trong chương trình.
Hiện đã có hàng nghìn NNLT được thiết kế, và hàng năm lại có
thêm nhiều NNLT mới xuất hiện. Sự phát triển của NNLT gắn liền 15
với sự phát triển của ngành tin học. Mỗi loại NNLT phù hợp với một
số lớp bài toán nhất định. Phân loại NNLT:
Ngôn ngữ máy (machine language) hay còn gọi là NNLT
cấp thấp có tập lệnh phụ thuộc vào một hệ máy cụ thể.
Chương trình viết bằng ngôn ngữ máy sử dụng bảng chữ cái
chỉ gồm 2 kí tự 0, 1. Chương trình ngôn ngữ máy được nạp
trực tiếp vào bộ nhớ và thực hiện ngay.
Ngôn ngữ lập trình cấp cao nói chung không phụ thuộc vào
loại máy tính cụ thể. Chương trình viết bằng NNLT cấp cao
sử dụng bộ kí tự phong phú hơn, và phải được chuyển đổi
sang dạng mã máy để máy tính có thể hiểu được bằng
chương trình dịch. Một số NNLT cấp cao thông dụng hiện
nay: Pascal, C, C++, Java, Smalltalk, Basic, Ruby, Fortran,
Algol, Lisp, Prolog, Cobol, …
3. Chương trình (máy tính)
Là tập hợp hữu hạn các chỉ thị máy được bố trí, sắp xếp theo một
trật tự xác định, nhằm giải quyết yêu cầu của bài toán đặt ra. Chương
trình được viết bằng một NNLT cụ thể nào đó.
Các chương trình C/C++ (trong môi trường DOS) được tạo ra
bằng 1 trình soạn thảo văn bản (EDITOR) như: SK, NC Editor, VRES
. . . Hiện nay, các chương trình dịch đều tích hợp sẵn editor riêng cho
phép USER soạn thản, biên dịch, kiểm lỗi, liên kết và thực hiện
chương trình một cách dễ dàng. 16
Các chương trình này (mã nguồn – source code), thực chất là ở
dạng ngôn ngữ tự nhiên, do đó phải được biên dịch lại dưới dạng mã
máy (object code) mà máy tính có thể hiểu được. Việc này được thực
hiện bởi chương trình dịch.
Có 2 loại chương trình dịch:
Trình thông dịch (interpreter): mỗi lệnh được dịch sang mã máy và cho thực hiện ngay.
Trình biên dịch (compiler): toàn bộ chương trình nguồn được
dịch sang mã máy (tập tin.obj), sau đó trình liên kết (linker) sẽ
kết nối các module chương trình để tạo thành tập tin EXE.
Nói chung, một chương trình máy tính được bố cục thành 3 phần: Nhập Xử lý Xuất
4. Các bước xây dựng chương trình
B1. Xác định đúng yêu cầu của bài toán: Cần xác định phạm vi, các
giới hạn, ràng buộc, các giả thiết của bài toán. Đặc biệt cần khắc
phục sức ì về mặt tâm lý trong quá trình tìm hiểu bài toán.
B2. Xây dựng thuật giải: Cần có kiến thức liên quan đến vấn đề đang
giải quyết. Cần xác định rõ thuật toán sẽ tác động trên những đối
tượng (thông tin) nào ? Có bao nhiêu đối tượng (biến) cần xử lý?
Mỗi biến có thể được lưu trữ dưới dạng nào, kiểu gì ? Giá trị ban
đầu của các biến ? Hình dung trước kết xuất DL sau khi xử lý sẽ như thế nào? 17
B3. Thể hiện thuật giải bằng lưu đồ thuật toán (nếu được).
B4. Cài đặt thuật toán bằng một NNLT cụ thể: Dùng một trình soạn
thảo VB để tạo chương trình nguồn (source code) theo một NNLT nào đó.
B5. Thử nghiệm thuật toán, nếu sai quay lại B2. Cần xác định lỗi của
thuật toán thuộc loại nào: lỗi về mặt cú pháp (syntax error), lỗi lúc
thực hiện chương trình (run-time error), và lỗi logic. Lỗi cú pháp
xảy ra lúc biên dịch chương trình, do vi phạm các quy định về mặt
cú pháp của NNLT đang sử dụng. Lỗi này tương đối dễ khắc phục.
Lỗi run-time error như: divide by zero, stack overflow, không đủ
bộ nhớ, … Lỗi logic (logic error) khó phát hiện hơn nhiều. B6. Kết thúc.
5. Câu hỏi và bài tập • Thuật toán (Algorithm) − Thuật toán là gì?
− Nêu các đặc trưng cần có của một thuật toán.
− Các cách biểu diễn một thuật toán?
• Ngôn ngữ lập trình (Programming language) là gì?
• Nêu các bước xây dựng thuật toán. • Danh hiệu (Identifier)
− Danh hiệu được dùng để làm gì?
− Như thế nào là một danh hiệu hợp lệ?
− Nguyên tắc sử dụng danh hiệu? 18 • Từ khóa là gì?
− Đặc điểm của các từ khóa trong NNLT “C/C++”?
• Kiểu dữ liệu (Data type)
− Trình bày các kiểu dữ liệu đơn giản mà Anh (Chị) đã biết. • Hằng (Constant) − Hằng là gì?
− Hằng được sử dụng khi nào?
− Cho biết cách thức khai báo một hằng?
− Cho ví dụ về cách biểu diễn hằng nguyên, thực, ký tự, chuỗi kí tự. • Biến (Variable) − Biến là gì?
− Biến được sử dụng để làm gì?
− Cho biết cách thức khai báo một biến?
− Hãy cho biết cách thức làm thay đổi nội dung (giá trị) của một biến?
• Biểu thức (Expression) − Biểu thức là gì?
− Kiểu của biểu thức do . . . . . . . . . . . . . . . .. quyết định?
• Khi nào xảy ra việc ép kiểu tự động?
− Khi nào cần phải sử dụng toán tử ép kiểu? 19
− Trình bày nguyên tắc NNLT “C/C++” tính trị các biểu thức? • Toán tử
− Hãy trình bày các toán tử mà Anh (Chị) biết.
− Cho ví dụ về toán tử điều kiện (.. .? .. ..: .. .).
• Hãy viết biểu thức tương đương không có toán tử ‘!’: − ! (x <= 5) − ! (x > 5)
− ! (x > 2 && y!= 3) − ! (x > 2 || y == 3)
− ! (x == 1 &&! (x!= 3) || x > 10)
− ! (x > 100 || x < 0 &&! (x == 0))
• Câu lệnh (Statement, Instruction)
− Cho biết các loại câu lệnh trong “C/C++” ? Cho ví dụ. 20