M c l cụ ụ
Ch ng 1. T ng quan v C v C++ ươ ổ ề à . .1
1.1. Ngôn ng l p trình v thu t toánữ ậ à ậ 1
1.1.1. Ngôn ng l p trìnhữ ậ 1
1.1.2. Thu t toán (Algorithm)ậ 2
1.1.3. S ra i v phát tri n c a ngôn ự đơ à ể ủ
ng Cữ 2
1.2. Các ph n t c b n trong ngôn ng ầ ử ơ ả ữ
C 2
1.2.1. B ký t (character set)ộ ự 2
1.2.2. Các t khóa (key words, reserved ừ
words) 2
1.2.3. Tên v cách t tên (identifier)à đặ . .2
1.2.4. L i gi i thích (comment)ờ ả 2
1.2.5. M t v i ch ng trình C n ộ à ươ đơ
gi nả 2
1.3. C u trúc ch ng trình trong Cấ ươ 2
1.3.1. Các th nh ph n c a m t ch ng à ầ ủ ộ ươ
trình C 2
1.3.2. So n th o v ch y m t ch ng ạ ả à ạ ộ ươ
trình C 3
Ch ng 2. H ng, bi n v m ng ươ ằ ế à ả 5
2.1. Các ki u d li u c s ể ữ ệ ơ ở 5
2.2. H ng ằ 5
2.3. Ki u enumể 6
2.4. Bi n ế 6
2.5. M ng v chu iả à ỗ 7
2.6. nh ngh a ki u b ng typedef Đị ĩ ể ằ 7
2.7. Kh i l nh ố ệ 7
2.8. V i nét v h m v ch ng trình à ề à à ươ 7
2.9. Bi n, m ng t ng ế ả ự độ 7
2.10. Bi n, m ng ngo i ế ả à 8
2.11. Toán t sizeof ử 8
2.12. Bi n t nh, m ng t nh ế ĩ ả ĩ 8
Ch ng 3. Bi u th c ươ ể ứ 9
3.1. Khái ni m bi u th c(expression) ệ ể ứ 9
3.2. Phép toán s h c ố ọ 9
3.3. Các phép thao tác bit 9
3.4. Các phép toán quan h v logic ệ à 9
3.5. Phép chuy n i ki u giá tr ể đổ ể ị 9
3.6. Phép toán t ng gi m ă ả 9
3.7. Câu l nh gán v bi u th c ệ à ể ứ 9
3.8. Bi u th c i u ki nể ứ đ ề ệ 9
3.9. Th t u tiên các phép toánứ ự ư 9
Ch ng 4. V o ra ươ à 10
4.1. H m printf à 10
4.2. H m scanf à 10
4.3. a ra máy in- h m fprintf Đư à 11
4.4. Dòng v o stdin v các h m nh p à à à ậ
d li u ữ ệ 11
4.5. Nh p /xu t s li u cho chu i v ậ ấ ố ệ ỗ à
ký t ự 12
4.6. M t s h m x lý chu i ộ ố à ử ỗ 12
4.7. S khác bi t gi a m ng v chu i ự ệ ữ ả à ỗ
12
4.8. Các h m v o ra v d ch chuy n v à à à ị ể ị
trí trên m n hình à 13
4.9. Các lu ng nh p xu t cin,cout ồ ậ ấ . .13
Ch ng 5. Các toán t đi u khi n ươ ử ề ể
14
5.1. Nh c l i khái ni m câu l nh v ắ ạ ệ ệ à
kh i l nh ố ệ 14
5.2. Toán t if ử 14
5.3. else if 14
5.4. Toán t switch ử 14
5.5. Toán t goto v nhãn ử à 14
5.6. Toán t for ử 14
5.6. Toán t while ử 14
5.7. do while 14
5.8. L nh break v l nh continue ệ à ệ 14
Ch ng 6. H m v c u trúc ch ng ươ à à ấ ươ
trình 16
6.1. Khai báo v nh ngh a h m à đị ĩ à 16
6.2. Các h m void à 16
6.3. L i g i h m ờ ọ à 17
6.4. S d ng h m assert() ki m tra ử ụ à để ể
i u ki n tr c đ ề ệ ướ 17
6.5. Các i s m c nh đố ố ặ đị 17
6.6. Truy n tham s cho h m ề ố à 17
6.7. H m ch ng(Overloaded function) à ồ
19
6.8. Các m u (template) ẫ 19
6.9. H m v i các tham s l m ng à ớ ố à ả . .19
Ch ng 7. Con tr , c p phát đ ng ươ ỏ ấ ộ
v h m à à 21
7.1. Con tr v a ch ỏ à đị ỉ 21
7.2. Con tr v m ng m t chi u ỏ à ả ộ ề 22
7.3. Con tr t i h m ỏ ớ à 22
7.4. Kh n ng quy c a h m ả ă đệ ủ à 23
7.5. H m main có i (tham kh o t i à đố ả à
li u [2], trang 198)ệ 23
Ch ng 8. C u trúc ươ ấ 24
8.1. Ki u c u trúc ể ấ 24
8.2. Truy nh p n th nh ph n c u ậ đế à ầ ấ
trúc 24
8.3. Phép gán c u trúc ấ 24
8.4. C u trúc trong C++ ấ 24
8.5. Th nh ph n ki u fields à ầ ể 25
8.6. Union 25
Ch ng 9. Thao tác trên t p ươ ệ 26
Ch ng 10. Qu n lý m n hình v n ươ ả à ă
b n ả 29
10.1. Ch n ki u m n hình v n b n ọ ể à ă ả 29
10.3. S khác bi t gi a các h m nh p ự ệ ữ à ậ
xu t d li u ấ ữ ệ 29
10.4. M t s h m thao tác m n hình ộ ố à à
khác 29
10.5. Ví d ng d ng: T o th c n ụ ứ ụ ạ ự đơ
trên c a s ử ổ 30
Ch ng 11. h a ươ Đồ ọ 32
11.1. Khái ni m v h a ệ ề đồ ọ 32
11.2. phân gi i m n hình h a Độ ả à đồ ọ
32
11.3. V hình trong m n hình h a ẽ à đồ ọ
33
11.4. t m u n n, m u v , m u tô Đặ à ề à ẽ à 33
11.5. V m t s ng v hình c ẽ ộ ố đườ à ơ
b n ả 33
11.6. C a s (viewport) ử ổ 34
11.7. X lý v n b n trên m n hình ử ă ả à đồ
h a ọ 36
11.8. T o hình nh chuy n ng ạ ả ể độ 38
Ch ng 12. m thanh, âm nh c ươ Â ạ 40
Ch ng 13. Tính đóng gói, th a k ươ ừ ế
v đa hìnhà 41
13.1. M u ở đầ 41
Câu h i v b i t p ôn t p chu n b ỏ à à ậ ậ ẩ ị
cho thi h t mônế 44
Ph l c. Các ch ng trình m uụ ụ ươ ẫ 50
01. Tìm c s chung l n nh t c a 2 s ướ ố ớ ấ ủ ố
nguyên 53
02. Chuy n i m t s th p phân sang ể đổ ộ ố ậ
d ng nh phânạ ị 53
03. Chuy n i m t s th p phân sang sể đổ ộ ố ậ ố
có c s b t kơ ố ấ ỳ 53
04. Chuy n i m t s th p phân sang sể đổ ộ ố ậ ố
có c s 11ơ ố 53
05. Nh p v s p x p danh sách các s ậ à ắ ế ố
th cự 54
06. o l i m t chu i ký t Đả ạ ộ ỗ ự 54
07. M t s ch ong trình quy: tính ộ ố ư đệ
giai th a c a m t s nguyên không âm, ừ ủ ộ ố
tính s Fibonacci, tìm c s chung l n ố ướ ố ớ
nh t c a hai s nguyên không âm, b i ấ ủ ố à
toán tháp H n i. à ộ 54
08. S ng Erastothen li t kê các s nguyênà ệ ố
t không v t quá m t s t nhiên n choố ượ ộ ố ự
tr c.ướ 55
09. Tìm s l n nh t trong dãy các s th cố ớ ấ ố ự
55
10. Tìm xem m t s th c x có xu t hi n ộ ố ự ấ ệ
trong dãy s th c hay không ố ự 55
11. Tính giá tr a th c b c n theo ị đ ứ ậ
ph ng pháp Horner ươ 56
12. Tìm t h p c a các lo i gi y b c ổ ợ ủ ạ ấ ạ . .56
13. Lo i tr các d u cách th a trong ạ ừ ấ ừ
chu i tên (ch l i m t d u cách) ỗ ỉ để ạ ộ ấ 56
14. m s ch trong chu i ký t Đế ố ữ ỗ ự 57
15. Tính s ố
π
theo công th c: ứ 57
16. Nh p v in danh sách sinh viên (phiênậ à
b n 1)ả 58
17. Nh p v in danh sách sinh viên (phiênậ à
b n 2)ả 58
18. Nh p, s p x p v in danh sách sinh ậ ắ ế à
viên (phiên b n 3)ả 59
19. Nh p, s p x p, tìm ki m v in danh ậ ắ ế ế à
sách sinh viên (phiên b n 4)ả 59
20. Nh p, s p x p, tìm ki m v in danh ậ ắ ế ế à
sách sinh viên (phiên b n 5)ả 60
21. Nh p, s p x p, tìm ki m v in danh ậ ắ ế ế à
sách sinh viên (phiên b n 6)ả 61
22. Danh sách c i t b ng danh sách à đặ ằ
liên k t (phiên b n 1)ế ả 62
23. Danh sách c i t b ng danh sách à đặ ằ
liên k t (phiên b n 2)ế ả 63
24. Danh sách c i t trên t p (phiên b nà đặ ệ ả
1) 65
25. Danh sách c i t trên t p (phiên b nà đặ ệ ả
2) 66
2
Ch ng 1. T ng quan v C v C++ ươ ổ ề à
1.1. Ngôn ng l p trình v thu t toánữ ậ à ậ
1.1.1. Ngôn ng l p trìnhữ ậ
Trong ph n “Nh p môn tin h c” chúng ta ãầ ậ ọ đ
tìm hi u Winword v Excel, l các ph n m m ngể à à ầ ề ứ
d ng trong công vi c so n th o v n b n v l m cácụ ệ ạ ả ă ả à à
b ng tính toán c. c i m c a các ph n m mả đượ Đặ đ ể ủ ầ ề
ng d ng l luôn nh rõ ph m vi ng d ng v cungứ ụ à đị ạ ứ ụ à
c p c ng nhi u c ng t t các công c ho n th nhấ à ề à ố ụ để à à
ch c n ng ó. Tuy nhiên ng i s d ng c ng h uứ ă đ ườ ử ụ ũ ầ
nh b bó bu c trong ph m vi quy nh c a ch ngư ị ộ ạ đị ủ ươ
trình. Ch ng h n ta khó có th dùng Excel gi iẳ ạ ể để ả
m t b i toán g m nhi u b c tính toán nh tínhộ à ồ ề ướ ư
nghi m g n úng m t ph ng trình vi phân hay gi iệ ầ đ ộ ươ ả
m t h ph ng trình tuy n tính. M c d u các ph nộ ệ ươ ế ặ ầ ầ
m m ng d ng ng y c ng nhi u v thu c cácề ứ ụ à à ề à ộ đủ
l nh v c nh xây d ng, thi t k , h i h a, âmĩ ự ư ự ế ế ộ ọ
nh c nh ng không th bao trùm h t các v n n yạ ư ể ế ấ đề ẩ
sinh trong th c t vô cùng phong phú. Rõ r ng khôngự ế à
ch nh ng chuyên gia tin h c m ngay c nh ngỉ ữ ọ à ả ữ
ng i s d ng, nh t l các cán b k thu t, r t c nườ ử ụ ấ à ộ ỹ ậ ấ ầ
n nh ng ph n m m uy n chuy n v m m d ođế ữ ầ ề ể ể à ề ẻ
h n, có kh n ng th c hi n c nhi u h n các chơ ả ă ự ệ đượ ề ơ ỉ
th c a ng i s d ng giúp h gi i quy t nh ngị ủ ườ ử ụ để ọ ả ế ữ
công vi c a d ng b ng máy tính. Ph n m m cóệ đ ạ ằ ầ ề
tính ch t nh th c g i l ngôn ng l p trình.ấ ư ế đượ ọ à ữ ậ
Chính xác h n ơ ngôn ng l p trình l m t ngônữ ậ à ộ
ng nhân t o bao g m m t t p các t v ng ữ ạ ồ ộ ậ ừ ự (m taà
s g i l t khóa phân bi t v i ngôn ng thôngẽ ọ à ừ để ệ ớ ữ
th ng)ườ v m t t p các quy t c à ộ ậ ắ (g i l Syntax - cúọ à
pháp) m ta có th s d ng biên so n các l nhà ể ử ụ để ạ ệ
cho máy tính th c hi n. ự ệ
Nh ta ã bi t, các ô nh c a máy tính ch có thư đ ế ớ ủ ỉ ể
bi u di n các s 0 v 1. Vì v y ngôn ng m máyể ễ ố à ậ ữ à
có th hi u tr c ti p l ngôn ng trong ó các l nhể ể ự ế à ữ đ ệ
l các dãy s nh phân v do ó c g i l ngônà ố ị à đ đượ ọ à
ng máy (machine language) . M i ngôn ng khácữ ọ ữ
u ph i thông d ch ho c biên d ch sang ngôn ngđề ả ị ặ ị ữ
máy (Interpreter - thông d ch v cho ch y t ng l nh.ị à ạ ừ ệ
Compiler - biên d ch th nh 1 ch ng trình ngôn ngị à ươ ữ
máy ho n ch nh, do v y ch y nhanh h n thông d ch).à ỉ ậ ạ ơ ị
Có nhi u lo i ngôn ng l p trình, v h u h t cácề ạ ữ ậ à ầ ế
nh khoa h c v máy tính u cho r ng không cóà ọ ề đề ằ
m t ngôn ng c nh t n o có kh n ng ph cộ ữ độ ấ à đủ ả ă ụ
v cho các yêu c u c a t t c các l p trình viên.ụ ầ ủ ấ ả ậ
Theo truy n th ng, các ngôn ng l p trình cề ố ữ ậ đượ
phân l m 2 lo i: các ngôn ng b c th p v ngôn ngà ạ ữ ậ ấ à ữ
b c cao.ậ
Ngôn ng l p trình b c th p (low-levelữ ậ ậ ấ
programming language):
Ngôn ng máy, h p ng (asembler: ch ng trìnhữ ợ ữ ươ
d ch h p ng , assembly language: ngôn ng h pị ợ ữ ữ ợ
ng ). H p ng l ngôn ng m t b c t ngôn ngữ ợ ữ à ữ ộ ậ ừ ữ
máy. Nó ch khác v i ngôn ng máy trong vi c sỉ ớ ữ ệ ử
d ng các mã bi u th các ch c n ng chính m máyụ ể ị ứ ă à
th c hi n.ự ệ
L p trình b ng h p ng r t phi n toái: có n v i táậ ằ ợ ữ ấ ề đế à
dòng mã c n thi t ch th c hi n phép c ng 2 conầ ế ỉ để ự ệ ộ
s . Các ch ng trình h p ng r t khó vi t; chúngố ươ ợ ữ ấ ế
không có c u trúc ho c modun hóa rõ r ng. Ch ngấ ặ à ươ
trình h p ng c ng không d chuy n t lo i máyợ ữ ũ ễ ể ừ ạ
tính n y sang lo i máy tính khác. Các ch ng trìnhà ạ ươ
n y c vi t theo các t p l nh c thù c a lo i bà đượ ế ậ ệ đặ ủ ạ ộ
vi x lý nh t nh. L p trình b ng h p ng thì mãử ấ đị ậ ằ ợ ữ
g n v ch y nhanh. Do ó h u h t các ch ng trìnhọ à ạ đ ầ ế ươ
i u h nh h th ng u c vi t b ng h p ng .đ ề à ệ ố đề đượ ế ằ ợ ữ
Tuy nhiên do s ph c t p c a công vi c l p trìnhự ứ ạ ủ ệ ậ
nên các hãng s n xu t ph n m m chuyên d ng thíchả ấ ầ ề ụ
vi t ch ng trình b ng ngôn ng C (do Bellế ươ ằ ữ
Laboratories c a hãng AT&T xây d ng) l lo i ngônủ ự à ạ
ng k t h p c c u trúc c a ngôn ng b c caoữ ế ợ đượ ấ ủ ữ ậ
hi n i v i t c v tính hi u qu c a h p ngệ đạ ớ ố độ à ệ ả ủ ợ ữ
b ng cách cho phép nhúng các l nh h p ng v oằ ệ ợ ữ à
ch ng trình.ươ
Ngôn ng l p trình b c caoữ ậ ậ :
Các ngôn ng l p trình b c cao nh Basic, Pascal, C,ữ ậ ậ ư
C++ cho phép các l p trình viên có th di n tậ ể ễ đạ
ch ng trình b ng các t khóa v các câu l nh g nươ ằ ừ à ệ ầ
gi ng v i ngôn ng t nhiên. Các ngôn ng n yố ớ ữ ự ữ à
d c g i l “b c cao” vì chúng gi i phóng các l pượ ọ à ậ ả ậ
trình viên kh i nh ng quan tâm v t ng l nh sỏ ữ ề ừ ệ ẽ
c máy tính ti n h nh nh th n o, b ph nđượ ế à ư ế à ộ ậ
thông d ch ho c biên d ch c a ch ng trình s gi iị ặ ị ủ ươ ẽ ả
quy t các chi ti t n y khi mã ngu n c bi n iế ế à ồ đượ ế đổ
th nh ngôn ng máy. M t câu l nh trong ngôn ngà ữ ộ ệ ữ
b c cao t ng ng v i m t s l nh ngôn ng máy,ậ ươ ứ ớ ộ ố ệ ữ
cho nên b n có th th o ch ng theo ngôn ng b cạ ể ả ươ ữ ậ
cao nhanh h n so v i b c th p. Tuy nhiên b n c ngơ ớ ậ ấ ạ ũ
ph i tr giá cho vi c n y. Ch ng trình ngôn ngả ả ệ à ươ ữ
máy c d ch ra t mã ngu n c vi t b ng ngônđượ ị ừ ồ đượ ế ằ
ng b c cao ch a r t nhi u chi ti t th a, do ó t cữ ậ ứ ấ ề ế ừ đ ố
ch y s ch m h n nhi u so v i ch ng trìnhđộ ạ ẽ ậ ơ ề ớ ươ
vi t b ng h p ng . Thông th ng m t trình biênế ằ ợ ữ ườ ộ
d ch c tr ng th ng sinh ra s l nh mã máy g p 2ị đặ ư ườ ố ệ ấ
l n hay nhi u h n s l nh c n thi t n u vi t b ngầ ề ơ ố ệ ầ ế ế ế ằ
mã máy.
M t cách phân lo i khác c a các ngôn ng l pộ ạ ủ ữ ậ
trình:
Ngôn ng th t cữ ủ ụ (Procedural Language) v à ngôn
ng khai báoữ (Declarative Language)
Ngôn ng th t c: L p trình viên ph i xác nh m tữ ủ ụ ậ ả đị ộ
th t c m máy tính s tuân theo ho n th nhủ ụ à ẽ để à à
m t công vi c nh tr c. Thí d : Basic, C,ộ ệ đị ướ ụ
Fortran,
Ngôn ng khai báo: Ngôn ng s nh ngh a m t lo tữ ữ ẽ đị ĩ ộ ạ
các y u t v các quan h , ng th i cho phép b nế ố à ệ đồ ờ ạ
có th ti n h nh x p h ng i v i nh ng k t quể ế à ế à đố ớ ữ ế ả
xác nh. Thí d : Prolog, SQL (Structured Queryđị ụ
Language)
i u then ch t trong vi c l p trình chuyên d ng lĐ ề ố ệ ậ ụ à
môdun hóa ngôn ng - ó l s phát tri n sao choữ đ à ự ể
nhi m v l p trình có th phân ph i c cho cácệ ụ ậ ể ố đượ
th nh viên c a m t nhóm l p trình, v k t qu tà ủ ộ ậ à ế ả đạ
c l các b ph n khác nhau s ho t ng phùđượ à ộ ậ ẽ ạ độ
h p v i nhau khi nhi m v c a t ng ng i ho nợ ớ ệ ụ ủ ừ ườ à
th nh. Ngôn ng l p trình môdun, nh Module-2à ữ ậ ư
ho c ngôn ng h ng i t ng nh C++, s choặ ữ ướ đố ượ ư ẽ
phép t ng l p trình viên có th t p trung v o vi cừ ậ ể ậ à ệ
l p mã, biên d ch v g r i các module ch ng trìnhậ ị à ỡ ố ươ
riêng bi t, ng th i có th cho ch y (ki m tra th )ệ đồ ờ ể ạ ể ử
riêng t ng module c a mình. Khi t ng module riêngừ ủ ừ
ã ch y t t chúng s c liên k t v i nhau mđ ạ ố ẽ đượ ế ớ à
không gây tr c tr c n o.ụ ặ à
1.1.2. Thu t toán (Algorithm)ậ
Thu t ng Algorithm c d ch ra ti ng Vi t l ậ ữ đượ ị ế ệ à
thu t toán, thu t gi i ho c gi i thu t. ây chúng ậ ậ ả ặ ả ậ ở đ
tôi dùng t thu t toán l cách g i quen thu c v i ừ ậ à ọ ộ ớ
nhi u ng i.ề ườ
Thu t toán l m tậ à ộ dãy h u h nữ ạ các b c, m i ướ ỗ
b c mô t chính xác các phép toán ho c h nh ướ ả ặ à
ng c n th c hi n, độ ầ ự ệ gi i quy t m t v n để ả ế ộ ấ đề.
hi u y ý ngh a c a khái ni m thu t toán,Để ể đầ đủ ĩ ủ ệ ậ
chúng ta nêu ra 6 c tr ng sau ây c a thu t toán:đặ ư đ ủ ậ
1. Input M i thu t toán th ng có m t s ỗ ậ ườ ộ ố
d li u v o.ữ ệ à
2. Ouput M i thu t toán th ng có m t s ỗ ậ ườ ộ ố
d li u ra.ữ ệ
3. Tính xác nh đị (Definiteness) M i b c c ỗ ướ đượ
mô t chính xác, ch có m t cách hi u duy nh t ả ỉ ộ ể ấ
v n gi n có th th c hi n c.à đủ đơ ả để ể ự ệ đượ
4. Tính d ngừ (Finiteness) Thu t toán ph i d ng ậ ả ừ
sau m t s h u h n b c th c hi n ộ ố ữ ạ ướ ự ệ
5. Tính hi u quệ ả (Effectiveness) Các phép toán
trong các b c ph i n gi n có th th cướ ả đủ đơ ả để ể ự
hi n c.ệ đượ
6. Tính t ng quátổ (Generalness) Thu t toán ph i ậ ả
có tính t ng quát, có th áp d ng cho m t l p ổ ể ụ ộ ớ
i t ng. đố ượ
Ví d :ụ
Thu t toán Euclid: Tìm c s chung l n nh tậ ướ ố ớ ấ
c a hai s t nhiên m,n.ủ ố ự
Input: m,n nguyên d ngươ
Output: g l c s chung l n nh t c a mà ướ ố ớ ấ ủ
v nà
Ph ng pháp:ươ
1. r= m mod n
2. N u r=0 thì g:=nế
Ng c l i (r>0) m:=n; n:=r v quay l i b cượ ạ à ạ ướ
1.
1.1.3. S ra i v phát tri n c a ngôn ng Cự đơ à ể ủ ữ
N m 1970 Ken Thompson sáng t o ra ngôn ng Bă ạ ữ
dùng trong môi tr ng h i u h nh UNIX trên máyườ ệ đ ề à
i n toán DEC PD-7. B l ký t u c a c m chđ ệ à ự đầ ủ ụ ữ
vi t t t BCPL (Basic Combined Programmingế ắ
Language) do Martin Richards vi t. N m 1972ế ă
Dennis Ritchie c a hãng Bell Laboratories (v Kenủ à
Thompson) sáng t o nên ngôn ng C nh m t ngạ ữ ằ ă
hi u qu cho ngôn ng B. Lúc u ngôn ng Cệ ả ữ đầ ữ
không c m i ng i a dùng. Nh ng sau khiđượ ọ ườ ư ư
D.Ritchie cho xu t b n cu n "The C Programmingấ ả ố
Language" thì ngôn ng C c chú ý v cữ đượ à đượ
s d ng r ng rãi. Ng i ta ã dùng C vi t hử ụ ộ ườ đ để ế ệ
i u h nh a nhi m UNIX, O/S 2 v ngôn ngđ ề à đ ệ à ữ
Dbase. C ã c c i ti n qua nhi u phiên b n:đ đượ ả ế ề ả
trình biên d ch Turbo C t phiên b n 1 n phiênị ừ ả đế
b n 5, Microsoft C t phiên b n 1 n phiên b nả ừ ả đế ả
6. Hi n nay, C l i c phát tri n th nh C++ệ ạ đượ ể để à
v i 3 trình biên d ch: Borland C++ (dùng trong DOSớ ị
v trong Windows), Visual C++ (dùng trong DOS và à
trong Windows) v Turbo C++ (dùng trong DOS).à
Có th nói r ng hi n nay h u h t các ph n m mể ằ ệ ầ ế ầ ề
ng d ng u c vi t tr c ti p ho c gián ti pứ ụ đề đượ ế ự ế ặ ế
b ng C ho c C++ằ ặ
Trong t i li u n y chúng tôi s gi i thi u C v m tà ệ à ẽ ớ ệ à ộ
s l nh c a C++. ố ệ ủ
1.2. Các ph n t c b n trong ngôn ng Cầ ử ơ ả ữ
1.2.1. B ký t (character set)ộ ự
1.2.2. Các t khóa (key words, reserved words)ừ
Các t khóa thông d ng trong Cừ ụ
auto default float long static
break do for register struct
base double goto return switch
char else if short typedef
continue extern int sizeof union
1.2.3. Tên v cách t tên (identifier)à đặ
i v i C, m i tên c n ph i khai báo tr c khi sĐố ớ ọ ầ ả ướ ử
d ng. Tên ta dãy các ký t li n nhau, b t u b ngụ ự ề ắ đầ ằ
ký t ho c d u g ch d i, ti p theo l các ký t , cácự ặ ấ ạ ướ ế à ự
s ho c d u g ch d i. ố ặ ấ ạ ướ
Chú ý: Tên không ch a d u cách. C phân bi t chứ ấ ệ ữ
hoa v ch th ng. à ữ ườ
1.2.4. L i gi i thích (comment)ờ ả
L i gi i thích t m t vi trí n cu i dòng: //ờ ả ừ ộ đế ố
L i gi i thích trên m t ho c nhi u dòng: /* */ờ ả ộ ặ ề
1.2.5. M t v i ch ng trình C n gi nộ à ươ đơ ả
Chương trình C đơn giản nhất chạy không báo lỗi:
Không làm gì cả
void main()
{
}
Hiện câu chào
//002CHAO1.cpp Hien cau chao tren man hinh
#include <stdio.h>
void main()
{printf("\nTurbo C xin chao ban");
}
Xóa màn hình rồi hiện câu chào
#include <stdio.h>
#include <conio.h>
void main()
{clrscr();
printf("Turbo C xin chao ban!");
getch();
}
1.3. C u trúc ch ng trình trong Cấ ươ
1.3.1. Các th nh ph n c a m t ch ng trình C à ầ ủ ộ ươ
Ph n quan tr ng nh t không th thi u c a m tầ ọ ấ ể ế ủ ộ
ch ng trình C l h m main(). Thông th ng h mươ à à ườ à
main() có d ngạ
void main()
{
//các l nh ệ
}
ho cặ
int main()
L p trình C v C++ - Ch ng 1. T ng quan v C v C++ ậ à ươ ổ ề à
2
{
//các l nh ệ
return(0);
}
Thông th ng m t ch ng trình C y có cácườ ộ ươ đầ đủ
ph n sau:ầ
• Ch d n ti n x lý (preprocessor directive)ỉ ẫ ề ử
- Các bao h m (#include)à
- Các v l nh (#define)ĩ ệ
• Khai báo to n c cà ụ
- Khai báo các nguyên m u cho h m (functionẫ à
prototype)
- Khai báo các bi n to n c cế à ụ
• H m main()à
• nh ngh a chi ti t các h m do ng i s d ngĐị ĩ ế à ườ ử ụ
v a khai báo trên.ừ
Ph n " nh ngh a chi ti t các h m " có th t ầ Đị ĩ ế à ể đặ ở
ngay sau ph n khai báo to n c c.ầ à ụ
M t s h m c b n v các t p bao h m t ng ng:ộ ố à ơ ả à ệ à ươ ứ
T p bao h mệ à Các h m c nh ngh a trong t pà đượ đị ĩ ệ
stdio.h printf,scanf,gets
conio.h getch,clrscr
math.h sqrt,abs,fabs
stdlib.h abs,random,randomize,calloc,malloc,atof,atoi
ctype.h toupper,islower,isdigit
string.h strcmp,strcmpi,strcpy,strcat,strlen,strlwr,strupr
iostream.h cin,cout
iomanip.h setw,setprecision, (cout<<oct<<a<<hex<<b;)
1.3.2. So n th o v ch y m t ch ng trình C ạ ả à ạ ộ ươ
a. So n th o ch ng trìnhạ ả ươ
M i câu l nh c a C có th vi t trên m t dòng hayỗ ệ ủ ể ế ộ
nhi u dòng nh ng ph i ề ư ả k t thúc b ng d u ;ế ằ ấ Tuy
nhiên khi nh p ậ m t chu i ký tộ ỗ ự m mu n à ố chuy nể
sang dòng khác ta ph i ả thêm d u \ tr c khiấ ướ
xu ng dòngố .
b. D ch v ch y ch ng trìnhị à ạ ươ
Khi nh n F9 thì u tiên ch ng trình c d chấ đầ ươ đượ ị
sang t p có uôi l *.obj, sau ó liên k t các t p vệ đ à đ ế ệ à
d ch sang t p có uôi *.exe có th ch y c trongị ệ đ ể ạ đượ
môi tr ng DOS.ườ
Khi d ch ch ng trình có th xu t hi n 3 lo i l i sauị ươ ể ấ ệ ạ ỗ
ây:đ
L i c thông báo b i t khóa error (l i cúỗ đượ ở ừ ỗ
pháp):
L i n y th ng x y ra do khi ta so n th o ch ngỗ à ườ ả ạ ả ươ
trình không tuân theo úng nh ng quy t c c a C, thíđ ữ ắ ủ
d int thì ta gõ th nh Int; hay ta gõ thi u ngo c n,ụ à ế ặ đơ
ngo c kép ch ng h n ặ ẳ ạ
Sau ây l m t s thông báo l i th ng g p lo iđ à ộ ố ỗ ườ ặ ạ
n y.à
Unknown preprocessor directive
Ch th ti n x lý không úng. Trong tr ng h p n yỉ ị ề ử đ ườ ợ à
b n ph i xem l i các l nh #include xem b n có vi tạ ả ạ ệ ạ ế
sai không.
Declaration terminated incorrectly
Khai báo k t thúc không úng. Ví d b n ánh d u ế đ ụ ạ đ ấ ;
sau h m main nh sau:à ư
void main();
ch ng h n. Nên l u ý l sau tên h m không cẳ ạ ư à à đượ
ánh d u ; nh trên ây. Sau tên h m ph i l d uđ ấ ư đ à ả à ấ
{ v k t thúc h m l d u à ế à à ấ }.
Unexpected }
Th a d u ừ ấ }. M i l n ánh d u { thì b n nên ánhỗ ầ đ ấ ạ đ
d u } r i sau ó gõ các l nh v o o n gi a, nhấ ồ đ ệ à đ ạ ữ ư
v y tránh c tình tr ng th a thi u d u ậ đượ ạ ừ ế ấ { ho c ặ }.
Compound statement missing }
Thi u d u ế ấ }.
Declaration syntax error
Khai báo sai. Ví d b n vi tụ ạ ế
int a,b
printf("Chao");
thì máy báo l i dòng th 2. S d nh v y l vì khiỗ ở ứ ở ĩ ư ậ à
c qua dòng th nh t không có d u ; máy cho r ngđọ ứ ấ ấ ằ
l nh ch a k t thúc v còn chuy n ti p sang dòng thệ ư ế à ể ế ứ
2. Tuy nhiên sang dòng th 2 thì máy l i th y l nhứ ạ ấ ệ
không phù h p nên báo l i dòng n y. Cách vi tợ ỗ ở à ế
trên ây t ng ng v i cách vi t: đ ươ đươ ớ ế
int a,b printf("Chao");
V máy th y r ng ây l m t l nh không úng. Cònà ấ ằ đ à ộ ệ đ
n u ta s l i các l nh trên l ế ử ạ ệ à
int a,b
;printf("Chao");
thì máy không còn báo l i n a vì nó chuy n xu ngỗ ữ ể ố
dòng th 2 g p d u ứ ặ ấ ; v bi t l l nh à ế à ệ int a,b;
c khai báo úng.đượ đ
Undefined symbol
B n ã s d ng m t bi n n o ó m ch a khai báo.ạ đ ử ụ ộ ế à đ à ư
Ví d b n ch a khai báo bi n n nh ng l i s d ngụ ạ ư ế ư ạ ử ụ
trong l nh:ệ
printf("%d",n);
ch ng h n thì máy báo l Undefined symbol 'n'ẳ ạ à
Function should have a prototype
Ví d trong l nh trên b n vi t sai lụ ệ ạ ế à
prinf("%d",n);
thì máy báo l Function 'prinf' should have aà
prototype. Ngh a c a câu n y l : h m prinf c nĩ ủ à à à ầ
ph i có nguyên m u.ả ẫ
L i c thông báo b i t khóa Warning (l iỗ đượ ở ừ ỗ
c nh báo)ả :
L i n y th ng x y ra do khi ta khai báo bi n nh ngỗ à ườ ả ế ư
không s d ng t i. ử ụ ớ
Ví dụ
is assigned a value that is never used
Khai báo v ã gán giá tr cho bi n nh ng không sà đ ị ế ư ử
d ng.ụ
Ví d b n vi t các l nh ụ ạ ế ệ
int n; n=10;
L p trình C v C++ - Ch ng 1. T ng quan v C v C++ ậ à ươ ổ ề à
3
nh ng trong các ph n ti p theo không s d ng n (ư ầ ế ử ụ để
hi n ra m n hình ch ng h n, hay dùng tính giáệ à ẳ ạ để
tr c a bi n khác ) thì máy báo l ị ủ ế à
'n' is assigned a value that is never used
tuy nhiên ây ch l thông báo (warning). Khi b nđ ỉ à ạ
nh n F9 d ch ch ng trình thì máy v n báo lấ để ị ươ ẫ à
success
Hai lo i l i trên ây c thông báo ngay khi d chạ ỗ đ đượ ị
ch ng trình th nh file *.objươ à
Lo i l i th 3 có th x y ra trong quá trình liênạ ỗ ứ ể ả
k tế :
L i n y th ng x y thí d khi có l i g i h mỗ à ườ ả ụ ờ ọ à
nh ng h m ch m i có nguyên m u m ch a có khaiư à ỉ ớ ẫ à ư
báo chi ti t.ế
D ch v ch y ch ng trìnhị à ạ ươ :
N u ch ng trình ch a vi t xong ta có th ế ươ ư ế ể nh n F9ấ
d chđể ị v s a l i. Khi ch ng trình ã t ng ià ử ỗ ươ đ ươ đố
ho n ch nh thì ta có th nh n à ỉ ể ấ Ctrl+F9 d ch vđể ị à
ch yạ ch ng trình.ươ
L p trình C v C++ - Ch ng 1. T ng quan v C v C++ ậ à ươ ổ ề à
4
Ch ng 2. H ng, bi n v m ng ươ ằ ế à ả
2.1. Các ki u d li u c s ể ữ ệ ơ ở
C có m t s ki u d li u c s nh sau:ộ ố ể ữ ệ ơ ở ư
Ki uể Mi n xác nhề đị
char (signed char)
-128 → 127
unsigned char
0 → 255
int
≈ -32 000 → 32 000
long
≈ -2 t ỷ → 2 t ỷ
unsigned int
≈ 0 → 65 000
unsigned long
≈ 0 → 4 t ỷ
float
3.4e-38 → 3.4e+38
double
1.7e-308 → 1.7e+308
long double
3.4e-4932 → 3.4e+4932
1. Ki u charể
M t giá tr ki u char chi m m t byte v c bi uộ ị ể ế ộ à đượ ể
di n m t ký t t ng ng trong b ng ASCII. Khácễ ộ ự ươ ứ ả
v i Pascal, trong C giá tr c a bi n char có th cớ ị ủ ế ể đượ
hi u l s . Thí d n u ta khai báo char ch; thì cóể à ố ụ ế
hai cách gán ch=65 hay ch='A' cùng cho m t k tộ ế
qu . Khi hi n th ch n u ta dùng khuôn d ng "%d"ả ể ị ế ạ
thì c giá tr 65, còn dùng khuôn d ng "%c" thìđượ ị ạ
c ký t A. B ng sau ây cho s khác bi t gi ađượ ự ả đ ự ệ ữ
char v unsigned char.à
Mã ASCII 0 1 . . . 127
Giá tr bi n ki u charị ế ể 0 1 . . . 127
Giá tr bi n ki u unsignedị ế ể
char
0 1 . . . 127
N u ta khai báo m t bi n ch có ki u ký t b ngế ộ ế ể ự ằ
l nhệ
char ch;
v sau ó gán ch=200 thì th c ch t ch ch nh nà đ ự ấ ỉ ậ
giá tr -56, do ó phép th ch= = 200 s cho k tị đ ử ẽ ế
qu sai. Nói chung, có th th y r ng n u ta dùngả ể ấ ằ ế
l nh gán ch=n , trong ó 0ệ đ ≤n≤255, sau ó dùng l nhđ ệ
printf(“%d”,ch) in giá tr c a ký t ch thì n uđể ị ủ ự ế
n u n ế ≤ 127 ta s th y giá tr n trên m n hình, cònẽ ấ ị à
n u 128 ế ≤ n ≤ 255 thì ta s th y giá tr -(255-m+1)ẽ ấ ị
.
Phân lo i ký t : ạ ự
Các ký t có th phân l m 3 nhóm: 0-31,32-126, 127-ự ể à
254; trong ó các ký t t 0 n 32 l các ký tđ ự ừ đế à ự
i u khi n, không th nhìn th y trên m n hình. đ ề ể ể ấ à
Chú ý:Trong ch ng trình m t ký t ph i c baoươ ộ ự ả đượ
trong d u nháy n. Thí d char ch='A'; ch='1' sấ đơ ụ ẽ
cho ta ch=49, còn ch=1 l i cho ta ch bi u di n ký tạ ể ễ ự
coa mã ASCII l 1. à
2. Ki u nguyênể
V y có th xem ki u ký t c ng l m t d ng cậ ể ể ự ũ à ộ ạ đặ
bi t c a ki u nguyên. Khi ta dùng khuôn d ng "%c"ệ ủ ể ạ
hi n m t s nguyên n > 255 thì ký t n%256 sđể ệ ộ ố ự ẽ
c hi n. Thí d n u n = 304 thì ký t ng v iđượ ệ ụ ế ự ứ ớ
mã ASCII l 48 c in, t c l ký t '0'. à đượ ứ à ự
3. Ki u d u ph y ngể ấ ẩ độ
float chi m 4 byte, double chi m 8 byte.ế ế
2.2. H ng ằ
H ng l các i l ng (có th có tên ho c không) ằ à đạ ượ ể ặ
m giá tr c a nó không th thay i trong quá trình à ị ủ ể đổ
ch y ch ng trình.ạ ươ
1. H ng ký tằ ự
Ví d ; 'a', '1', 'B', ụ
2. H ng s nguyên (h 10,8,16)ằ ố ệ
H ng int trong h 8 (Octal) c b t u b ng s 0,ằ ệ đượ ắ đầ ằ ố
còn h ng int trong h 16 (Hexadecimal)ằ ệ
b t u b ng s 0 v ký t x (in th ng ho c inắ đầ ằ ố à ự ườ ặ
hoa). Thí dụ
011 = 9
0x11 = 17
Chú ý. Khi hi n m t s nguyên d i d ng bát phânệ ộ ố ướ ạ
b ng l nh printf() ta dùng khuôn d ng % v ch 0,ằ ệ ạ à ữ
còn v i d ng th p l c phân thì dùng % v ký t xớ ạ ậ ụ à ự
(in th ng ho c in hoa). Ví dườ ặ ụ
printf("%o",9) ho c printf("%x",17) cho k t quặ ế ả
trên m n hình l 11à à
printf("%o",011) ho c printf("%x",0x11) cho k tặ ế
qu trên m n hình l 11ả à à
3. float v doubleà (s th c v s th c có chính ố ự à ố ự độ
xác g p ôi)ấ đ
Ví d ; 12.5, 36.98, ụ
4. M t s h ng có s n: M_PI, M_E, ộ ố ằ ẵ (trong
math.h)
5. Các h ng ký t c bi t ằ ự đặ ệ
'\'', '\"', '\n', '\0',
L u ý: h ng '0' có mã l 48, còn '\0' ng v i ký t \ư ằ à ứ ớ ự
0, có mã l 0.à
6. H ng xâu ký t ằ ự
L m t dãy ký t b t k t trong 2 d u "", thí dà ộ ự ấ ỳ đặ ấ ụ
"Ha noi".
Chú ý: 'a' l h ng ký t g m m t byte, còn "a" là ằ ự ồ ộ à
h ng xâu ký t g m 2 byte, 1 byte ch a ký t a, ằ ự ồ ứ ự byte
cu i cùng ch a ký t '\0' l ký t báo k t thúc xâuố ứ ự à ự ế .
Chú ý:
Khi ta dùng h m strlen(st) xác nh d i c aà để đị độ à ủ
chu i ký t thì ký t '\0' không c tính v o ỗ ự ự đượ à độ
d i n y. Thí d 3 bi n st1,st2,st3 sau ây u cóà à ụ ế đ đề
d i l 3độ à à
char st1[]="123";
char st2[7]="123";
char *st="123";
Tuy nhiên th c ra trong b nh l u tr m t chu iự ộ ớ để ư ữ ộ ỗ
d i 3 thì máy c n 4 v trí vì m t v trí l u trà ầ ị ộ ị để ư ữ
ký t '\0'. Do ó khác v i thao tác v i m ng, khi thaoự đ ớ ớ ả
tác v i chu i ta không nên nh p s li u cho v tríớ ỗ ậ ố ệ ị
cu i cùng. Thí d n u khai báo char st[10] thì taố ụ ế
không nên nh p s li u cho v trí 9. i u n y có thậ ố ệ ị Đ ề à ể
th y c qua ví d sau:ấ đượ ụ
Gi s ta khai báo:ả ử
char st[5]="123";
thì khi ó chu i có d i 3, 3 v trí ch a s li u lđ ỗ độ à ị ứ ố ệ à
st[0]=='1', st[1]=='2', st[2]=='3'; v trí st[3]=='\0'. Cònị
n u ta khai báoế
char st[3]="012";
Thì tuy máy không báo l i nh ng th c ra có m t sỗ ư ự ộ ố
i u không h p lý. N u ta dùng h m strlen(st) đ ề ợ ế à để
ki m tra d i thì th y r ng d i l 4 (m cể độ à ấ ằ độ à à ặ
d uth c ra d i c a st l 3), v trí st[3] khôngầ ự độ à ủ à ị
ph i l '\0' m l m t ký t n o ó, ký t v tríả à à à ộ ự à đ ự ở ị
st[4] m i l '\0'. Do ó n u ta dùng l nhớ à đ ế ệ
while(st[i]!='\0') putch(st[i]);
ch ng h n thì sau khi máy in ra các ký t '0', '1', '2'ẳ ạ ự
thì còn in ti p m t ký t n o ó n a r i m i d ng. ế ộ ự à đ ữ ồ ớ ừ
7. Tên h ng v cách gán giá tr cho h ngằ à ị ằ
#define max 100
#define str "Ha Noi"
const float a=10.123;
const char str2[]="Hai Phong";
const char *str3="Tay Ho";
Không nên dùng const char str2[5]= "Hai Phong"
ch ng h n, vì có th d i c a h ng v t quá ẳ ạ ể độ à ủ ằ ượ độ
d i nh ngh a.à đị ĩ
Chú ý: H ng có th l các bi n chi m d ng b nhằ ể à ế ế ụ ộ ớ
thí d int m =10; nh ng c ng có th l nh ng giá trụ ư ũ ể à ữ ị
t m th i, không c phân ph i b nh thí dạ ờ đượ ố ộ ớ ụ
M_PI, M_E, printf("\n%s","Ha Noi");
2.3. Ki u enumể
Gi s ta ph i ti n h nh m t s công vi c l p l iả ử ả ế à ộ ố ệ ặ ạ
theo các ng y trong tu n. Trong ch ng trình ta vi tà ầ ươ ế
for(int i=2;i<=8;i++) [l nh]ệ
Tuy nhiên theo cách n y thì các con s 2, 3, khôngà ố
cho ta ý ngh a g i nh ó l các ng y trong tu n. Cĩ ợ ớ đ à à ầ
cho ta ta nh ngh a bi n ki u li t kê ph c v chođị ĩ ế ể ệ ụ ụ
m c ích n y. Ta có th l m nh sauụ đ à ể à ư
enum ngay_tt {hai, ba, tu, nam, sau, bay, chunhat};
ngay_tt i;
for(i=hai;i<=chunhat;i++) {các l nh}ệ
Gi s các l nh l printf("%d ",i); thì ta có k tả ử ệ à ế
qu l 0 1 2 3 4 5 6ả à
Vì bi n enum th c ch t l bi n nguyên, do ó cácế ự ấ à ế đ
dòng l nh trên có th vi t n gi n h n nh sau:ệ ể ế đơ ả ơ ư
enum {hai, ba, tu, nam, sau, bay, chunhat};
int i;
for(i=hai;i<=chunhat;i++) [l nh]ệ
Ta có th kh i gán các giá tr cho bi n enum. Ví dể ở ị ế ụ
n u ta vi t:ế ế
enum {hai=2, ba, tu, nam, sau, bay, chunhat};
thì khi ó ta s có hai=2,ba=3, đ ẽ
2.4. Bi n ế
M i bi n ph i c khai báo tr c khi s d ng.ọ ế ả đượ ướ ử ụ
Vi c khai báo c th c hi n theo m u sau:ệ đượ ự ệ ẫ
<Ki u bi n> <tên bi n 1>,<tên bi n 2>, ,<tên bi nể ế ế ế ế
n>;
Có th khai báo ngay khi s d ng, thí dể ử ụ ụ
for(int i=0;i<n;i++) [các l nh]ệ
1. V trí c a các khai báoị ủ
Trong C++ thì bi n có th khai báo t i v trí b t kế ể ạ ị ấ ỳ
trong ch ng trình.ươ
2. Kh i u cho các bi nở đầ ế
float a=10.123;
char str2[]="Hai Phong";
char *str3="Tay Ho";
int x[] = {1,2,3};
float y[4] = {1.2, 3.2, 4.3, 6.5};
Nh ng ư không th vi tể ế :
float *py = {1.2, 3.2, 4.3, 6.5};//Vi t nh th n y lế ư ế à à
sai.
Nh ng ư v i chu i thì l i cớ ỗ ạ đượ :
char st1[]="123";
char st2[7]="123";
char *st="123";
3. L y a ch c a bi nấ đị ỉ ủ ế
M i bi n c c p phát m t vùng nh g m m t sỗ ế đượ ấ ộ ớ ồ ộ ố
byte liên ti p. a ch c a byte u tiên l a chế Đị ỉ ủ đầ à đị ỉ
c a bi n. a ch c a bi n có th nh n c b ngủ ế Đị ỉ ủ ế ể ậ đượ ằ
phép toán
&<tên bi n>ế
Chú ý:
Ta ch có th l y a ch c a m t bi n. Thí d cácỉ ể ấ đị ỉ ủ ộ ế ụ
l nh sau ây l saiệ đ à
int *p;
const int m=10;
pn=&m;//Dòng l nh n y saiệ à
int k;
p=&(k+1);//Dòng l nh n y saiệ à
Ta ch có th gán m t con tr b ng a ch c a m tỉ ể ộ ỏ ằ đị ỉ ủ ộ
bi n cùng ki u v i nó. Ví d phép gán sau l sai:ế ể ớ ụ à
int *p;
const int m=10;
p=&m;//Dòng l nh n y saiệ à
Ph i s a l i lả ử ạ à
L p trình C v C++ - Ch ng 2.H ng, bi n v m ngậ à ươ ằ ế à ả
6
const int *p;
const int m=10;
p=&m;
4. Bi n a chế đị ỉ
a ch c a m t bi n l s nguyên nh ng ta khôngĐị ỉ ủ ộ ế à ố ư
th thao tác chúng nh các s nguyên thông th ng.ể ư ố ườ
Thí d ta không th gánụ ể
int m; float x;
m=&x;
a ch c a m t bi n ngo i l n ch v trí c aĐị ỉ ủ ộ ế à độ ớ ỉ ị ủ
bi n trong b nh còn mang thông tin ó l a chế ộ ớ đ à đị ỉ
c a bi n lo i gì. Ta bi t r ng a ch c a 2 bi nủ ế ạ ế ằ đị ỉ ủ ế
nguyên liên ti p thì cách nhau 2 byte, 2 s th c liênế ố ự
ti p cách nhau 4 byte, có th l u tr v th cế Để ể ư ữ à ự
hi n các phép toán trên các giá tr a ch , C nhệ ị đị ỉ đị
ngh a m t ki u bi n nguyên c bi t m giá tr c aĩ ộ ể ế đặ ệ à ị ủ
chúng l a ch c a các bi n v g i bi n n y l conà đị ỉ ủ ế à ọ ế à à
tr . Khi nh ngh a con tr ta ph i ch rõ ó l conỏ đị ĩ ỏ ả ỉ đ à
tr c a bi n lo i gì. Thí d khai báo m t con trỏ ủ ế ạ ụ để ộ ỏ
ki u nguyên ta vi tể ế
int *p;
V khi ó ta có th gán p = &x; trong ó x l bi nà đ ể đ à ế
nguyên n o ó.à đ
4. L y giá tr c a m t bi n thông qua a chấ ị ủ ộ ế đị ỉ
Gi s ta p l m t con tr . Khi ó *p s l giá trả ử à ộ ỏ đ ẽ à ị
c ch a trong vùng b nh m p tr t i.đượ ứ ộ ớ à ỏ ớ
Nh v y v i bi n x b t k thì ta có *&x chính lư ậ ớ ế ấ ỳ à
giá tr x. ị
2.5. M ng v chu iả à ỗ
Trong ph n trên ta hi u bi n l m t vùng b nhầ ể ế à ộ ộ ớ
c t tên v có th l u tr m t ki u giá tr n ođượ đặ à ể ư ữ ộ ể ị à
ó. bi u di n nhi u giá tr ta ph i dùng nhi uđ Để ể ễ ề ị ả ề
bi n. Tuy nhiên nhi u khi s bi n l i ph thu c m tế ề ố ế ạ ụ ộ ộ
tham s n o ó. Thí d s th nh ph n c a m tố à đ ụ ố à ầ ủ ộ
vect ph thu c v o m t s n, còn s các ph n tơ ụ ộ à ộ ố ố ầ ử
c a m t ma tr n l i ph thu c s h ng v s c t.ủ ộ ậ ạ ụ ộ ố à à ố ộ
Trong nh ng tr ng h p n y ng i ta dùng m t ki uữ ườ ợ à ườ ộ ể
d li u có c u trúc l m ng bi u di n s li u.ữ ệ ấ à ả để ể ễ ố ệ
M ng l m t t p h p nhi u ph n t có cùng m tả à ộ ậ ợ ề ầ ử ộ
ki u giá tr v có chung m t tên. V m t n o ó cóể ị à ộ ề ặ à đ
th coi m ng c ng l bi n, nh ng l bi n có c uể ả ũ à ế ư à ế ấ
trúc ph c t p h n.ứ ạ ơ
nh ngh a m ngĐị ĩ ả
Khai báo int a[10] s d nh 10 v trí liên ti p trongẽ à ị ế
b nh , m i v trí g m 2 byte có th l u tr cộ ớ ỗ ị ồ ể ư ữ đượ
m t s nguyên v các v trí n y t ng ng l a[0],ộ ố à ị à ươ ứ à
a[1], , a[9]
Khai báo int a[8][10] s d nh 80 v trí liên ti pẽ à ị ế
trong b nh , m i v trí g m 2 byte có th l u trộ ớ ỗ ị ồ ể ư ữ
c m t s nguyên v các v trí n y t ng ng lđượ ộ ố à ị à ươ ứ à
a[0][0], a[0][1], , a[0][9], a[1][0], a[1][1], , a[1]
[9], . . ., a[7][0], a[7][1], , a[7][9].
Chú ý: Khi ta khai báo m t m ng có kích c nhộ ả ỡ đị
tr c, thí dướ ụ
int a[10]; thì a l m t h ng a ch , do ó ta khôngà ộ ằ đị ỉ đ
th gán a = < a ch >. Tuy nhiên n u ta nh ngh aể đị ỉ ế đị ĩ
m t bi n con tr , thí d int *pn; thì ta có th dùngộ ế ỏ ụ ể
phép gán cho pn. V i m t chu iớ ộ ỗ
char *s="123"; ch ng h n, ta có s l a ch c aẳ ạ à đị ỉ ủ
bi n u tiên c a chu i, t c l s[0], do ó *sế đầ ủ ỗ ứ à đ
chính l giá tr c a s[0], còn *(s+1) l giá tr c aà ị ủ à ị ủ
s[1],
2.6. nh ngh a ki u b ng typedef Đị ĩ ể ằ
typedef int ng;
typedef int matran[8][10];
ng x,y;
matran a,b;
Các bi n x,y có ki u nguyên v a,b có ki u l maế ể à ể à
tr n c p 8 x 10 v i các ph n t nguyên. ậ ấ ớ ầ ử
báo r ng m t identifier n o ó l ki u d li uĐể ằ ộ à đ à ể ữ ệ
ch không ph i l bi n, ta ch vi t nh khai báoứ ả à ế ỉ ế ư
identifier ó l bi n, sau ó thêm t khóa typedef đ à ế đ ừ ở
phía tr c. Ví d l nh ướ ụ ệ
float a[20][20];
khai báo m t bi n a có ki u l m ng th c haiộ ế ể à ả ự
chi u c 20x20. Còn l nhề ỡ ệ
typedef float a[20][20];
l i khai báo ki u d li u a l ki u m ng th c 2ạ ể ữ ệ à ể ả ự
chi u có c 20x20. ề ỡ
2.7. Kh i l nh ố ệ
Các kh i l nh l ng nhau, ph m vi ho t ng c a cácố ệ ồ ạ ạ độ ủ
bi n:ế
Kh i l nh l t p h p các l nh c bao trong haiố ệ à ậ ợ ệ đượ
d u { }. Kh i l nh có th g m nhi u kh i l nhấ ố ệ ể ồ ề ố ệ
khác. M t bi n c khai báo trong kh i l nh thìộ ế đượ ố ệ
mi n tác d ng c a nó l kh i l nh trong cùng ch aề ụ ủ à ố ệ ứ
khai báo c a bi n ó. N u có các bi n cùng tên thìủ ế đ ế ế
bi n c khai báo sau cùng s l bi n tích c c,ế đượ ẽ à ế ự
t c l th c s tham gia trong m i phép toán có tênứ à ự ự ọ
bi n chung. ế
2.8. V i nét v h m v ch ng trình à ề à à ươ
Khác v i Pascal, C không cho phép các h m l ngớ à ồ
nhau. Ch ng trình có th có nhi u h m trong óươ ể ề à đ
h m main() l th nh ph n b t bu c.à à à ầ ắ ộ
2.9. Bi n, m ng t ng ế ả ự độ
1. nh ngh aĐị ĩ
Các bi n c khai nbáo bên trong thân h m (k cế đượ à ể ả
h m main()) c g i l bi n t ng hay c c b .à đượ ọ à ế ự độ ụ ộ
2. Ph m vi ho t ng v th i gian t n t iạ ạ độ à ờ ồ ạ
Bi n t ng ch t n t i trong kh i l nh m nó cế ự độ ỉ ồ ạ ố ệ à đượ
nh ngh ađị ĩ
Ví dụ
void main()
{auto int x;
}
Bi n t ng l ng m nh cho các bi n c c b , doế ự độ à ầ đị ế ụ ộ
L p trình C v C++ - Ch ng 2.H ng, bi n v m ngậ à ươ ằ ế à ả
7
ó t khóa auto th ng c b qua. đ ừ ườ đượ ỏ
Chú ý: Bi n t ng ch c khai báo trong cácế ự độ ỉ đượ
h m. Sau ây l ví d có l nh khai báo sai:à đ à ụ ệ
auto int i; //Dòng l nh n y saiệ à
void main()
{auto int x;
}
l sai.à
3.Kh i u cho bi n v m ng t ngở đầ ế à ả ự độ
Bi n ngo i (to n c c) khi khai báo thì c tế à à ụ đượ ự
ng gán b ng 0 ho c r ng. Nh ng v i bi n tđộ ằ ặ ỗ ư ớ ế ự
ng khi khai báo xong m không gán giá tr kh iđộ à ị ở
u ho c gán giá tr thì giá tr không xác nh, lđầ ặ ị ị đị à
m t giá tr vô ngh a n o ó.ộ ị ĩ à đ
Khác v i C, trong C++ có th kh i u cho m ngớ ể ở đầ ả
ho c bi n, thí dặ ế ụ
void main()
{float a[4] = {2.3,1.5,2.6,3.8};
int b[][3] = {1,2,3,4,5,6};
int c[2][3] ={2,3,4,5,6,7};
}
2.10. Bi n, m ng ngo i ế ả à
1. nh ngh aĐị ĩ
Các bi n c khai báo bên ngo i h m (k c h mế đượ à à ể ả à
main()) c g i l bi n ngo i.đượ ọ à ế à
2. Ph m vi ho t ng v th i gian t n t iạ ạ độ à ờ ồ ạ
Bi n ngo i t n t i t v trí c khai báo cho nế à ồ ạ ừ ị đượ đế
h t ch ng trình.ế ươ
Ví dụ:
void v1();
void v2();
void main()
{clrscr();
v1();
v2();
getch();
}
int i;
void v1()
{i=10;
printf("%d",i);
}
void v2()
{
printf("%d",i);
}
Ch ng trình trên cho k t qu lươ ế ả à
10
10
Còn n u ta thêm l nhế ệ
printf("%d",i);
trong ch ng trình main() thì máy s báo l i lươ ẽ ỗ à
bi n i ch a c nh ngh a.ế ư đượ đị ĩ
Chú ý:
• N u trong m t h m n o ó ta khai báo m t bi nế ộ à à đ ộ ế
cùng tên v i bi n ngo i thì bi n ngo i không cóớ ế à ế à
tác d ng trong h m n y. Khi ta dùng n bi nụ à à đế ế
cùng tên ó thì bi n luôn c hi u l bi n ađ ế đượ ể à ế đị
ph ng.ươ
Ví d sau minh h a cho i u n y:ụ ọ đ ề à
void v1();void v2();void main()
{clrscr(); v1(); v2(); getch();
}int i;void v1() {int i=10;
printf("\n%d",i); }void v2()
{printf("\n%d",i); }
K t qu ch y ch ng trình lế ả ạ ươ à
10
0
• N u ch ng trình vi t trên nhi u t p v các t pế ươ ế ề ệ à ệ
c d ch c l p, thì ph m vi s d ng c ađượ ị độ ậ ạ ử ụ ủ
bi n, m ng ngo i có th m r ng t t p n yế ả à ể ở ộ ừ ệ à
sang t p khác b ng t khóa extern (xem ch ngệ ằ ừ ươ
11)
3. Kh i u cho bi n v m ng ngo iở đầ ế à ả à
Bi n ngo i (to n c c) khi khai báo thì c t ngế à à ụ đượ ự độ
gán b ng 0 ho c r ng. Quy t c khai báo v kh i uằ ặ ỗ ắ à ở đầ
c ng gi ng nh bi n t ng. Tuy nhiên v i bi n tũ ố ư ế ự độ ớ ế ự
ng thì sau khi khai báo bi n có th nh n m t giáđộ ế ể ậ ộ
tr vu v n o ó.ị ơ à đ
2.11. Toán t sizeof ử
sizeof(Ki u d li u)ể ữ ệ
sizeof( i t ng d li u)Đố ượ ữ ệ
ng d ngứ ụ :
int x[] = {1,2,3,4};
int n = sizeof(x)/sizeof(int);// Xác nh c c a m ng.đị ỡ ủ ả
2.12. Bi n t nh, m ng t nh ế ĩ ả ĩ
ý ngh a c a bi n t nh có th th y rõ qua ví d sau:ĩ ủ ế ĩ ể ấ ụ
void vv()
{static int i=1;
printf("%d ",i++);
}
void main()
{clrscr();
for(int j=1;j<=3;j++) vv();
getch();
}
K t qu ch y ch ng trình l :ế ả ạ ươ à
1 2 3
L p trình C v C++ - Ch ng 2.H ng, bi n v m ngậ à ươ ằ ế à ả
8
Ch ng 3. Bi u th c ươ ể ứ
3.1. Khái ni m bi u th c(expression) ệ ể ứ
Bi u th c l m t giá tr c t o nên do s k t h pể ứ à ộ ị đượ ạ ự ế ợ
các phép toán v i các h ng, bi n, ph n t m ng,ớ ằ ế ầ ử ả
h m Nh v y b n thân các h ng, bi n, ph n tà ư ậ ả ằ ế ầ ử
m ng, h m c ng l các bi u th c.ả à ũ à ể ứ
3.2. Phép toán s h c ố ọ
+, - *, / %
3.3. Các phép thao tác bit
& : Phép h i các bit, ví d : 3 & 5 = 0000 0000 0000ộ ụ
0011 & 0000 0000 0000 0101 = 1
| : Phép tuy n các bit, ví d 3 | 5 =7ể ụ
^ : Phép tuy n có lo i tr , ví d 3 ^ 5 = 6 ể ạ ừ ụ
<< :Phép d ch trái (d ch dãy bit k v trí v phía tráiị ị ị ề
d u ph y, t c l nhân s d ch chuy n v i 2ấ ẩ ứ à ố ị ể ớ
k
), ví dụ
11 << 2 = 44 (1011 -> 101100)
m<<k = m* 2
k
>> :Phép d ch ph i (d ch dãy bit k v trí v phía ph iị ả ị ị ề ả
d u ph y, t c l chia s d ch chuy n cho 2ấ ẩ ứ à ố ị ể
k
), ví dụ
11 >> 2 = 2 (1011 -> 10)
m>>k = m/ 2
k
~ : Phép l y ph n bù (trong chu i bit 0 -> 1 vấ ầ ỗ à
ng c l i)ượ ạ
3.4. Các phép toán quan h v logic ệ à
>, >=, <, <=, = =, !=
&&, ||
3.5. Phép chuy n i ki u giá tr ể đổ ể ị
int(a), float(b),
sqrt(float(n));
3.6. Phép toán t ng gi m ă ả
n++, ++n, n , n
Ví dụ:
int m,n,x,y;
m=n=5;
x = m++;
y = ++n;
printf("\n%d %d %d %d",x,y,m,n);
Cho k t qu l 5 6 6 6ế ả à
3.7. Câu l nh gán v bi u th c ệ à ể ứ
i+=2;
i*=2;
x*=y+3 //x=x*(y+3)
3.8. Bi u th c i u ki nể ứ đ ề ệ
e1?e2:e3
e1 l bi u th c logicà ể ứ
Ví dụ:
max = a>b? a:b;
Câu l nhệ
printf("\n%8.2f",a<b?a:b);
s in ra c c ti u c a hai bi n th c a v b.ẽ ự ể ủ ế ự à
3.9. Th t u tiên các phép toánứ ự ư
Ch ng 4. V o ra ươ à
4.1. H m printf à
int printf(const char *dk, [danh sách các i]);đố
i dk l con tr ki u char ch a a ch c a chu iĐố à ỏ ể ứ đị ỉ ủ ỗ
i u khi n.đ ề ể
1. Chu i i u khi nỗ đ ề ể g m 3 lo i ký t :ồ ạ ự
- Các ký t i u khi n nh : \n Xu ng dòng, \t D uự đ ề ể ư ố ấ
tab
- Các c t chuy n d ng v t o khuôn (g i t t lđặ ả ể ạ à ạ ọ ắ à
c t )đặ ả
- Các ký t hi n th ra m n hình. i v i m t sự để ể ị à Đố ớ ộ ố
ký t c bi t nh d u ', '', \ thì có cách vi t cự đặ ệ ư ấ ế đặ
bi t h n: Tr c các ký t ó có thêm ký t \. ệ ơ ướ ự đ ự
Ph n quan tr ng v áng chú ý nh t trong chu iầ ọ à đ ấ ỗ
i u khi n l đ ề ể à ph n c tầ đặ ả có d ng t ng quát nhạ ổ ư
sau:
%[-][fw][.pp]<Ký t chuy n d ng>ự ể ạ
V y m t c t ph i b t u b ng d u % v k tậ ộ đặ ả ả ắ đầ ằ ấ à ế
thúc b ng ký t chuy n d ngằ ự ể ạ .
a. fw l r ng d nh cho tr ng ra. N u fw <à độ ộ à ườ ế
r ng tr ng thì r ng in ra b ng độ ộ ườ độ độ ộ ằ độ
r ng th c t c a tr ng. N u fw b t uộ ự ế ủ ườ ế ắ đầ
b ng s 0 thì v trí tr ng bên trái c thayằ ố ị ố đượ
b ng các s 0. fw có th c thay b ng d u,ằ ố ể đượ ằ ấ
thí d printf("%*.2f ",a); Khi ó r ng c aụ đ độ ộ ủ
i t ng ng l r ng th c t đố ươ ứ à độ ộ ự ế
b. D u tr (-): N u có d u - thì d n trái, không cóấ ừ ế ấ ồ
thì d n ph i. ồ ả
c. pp ch nên dùng cho s th c. pp l s ch sỉ ố ự à ố ữ ố
sau d u ch m th p phân, n u không có thìấ ấ ậ ế
c hi u l pp=6.đượ ể à
d. Ký t chuy n d ng: quy nh d ng in ra c aự ể ạ đị ạ ủ
i t ng, thí d d l s nguyên, f l s th c,đố ượ ụ à ố à ố ự
o l s bát phân, x l s th p l c phân à ố à ố ậ ụ
B ng các ký t chuy n d ng ả ự ể ạ
Ký t chuy n d ngự ể ạ Ki u c a iể ủ đố i c hi n th nhĐố đượ ể ị ư
c char ký tự
d ho c iặ int s nguyên h 10 ố ệ
ld ho c liặ long S nguyên d iố à
u int S nguyên không âmố
o int S nguyên không âm h 8ố ệ
lo long S nguyên không âm h 8ố ệ
x int S nguyên không âm h 16ố ệ
lx long S nguyên không âm h 16ố ệ
f float ho c doubleặ S th c d ng th p phân ố ự ạ ậ
e float ho c doubleặ S th c d ng khoa h c.ố ự ạ ọ
g float ho c doubleặ D ng khoa h c ho c th p phân tu thu c lo i n oạ ọ ặ ậ ỳ ộ ạ à
ng n h n. Không có các s 0 vô ngh a.ắ ơ ố ĩ
s Xâu ký tự Các ký tự
Ví dụ:
Ta c n in ra dòng thông tin: ầ
N ng su t t ng 19.25%ă ấ ă
Trong ó giá tr 19.25 l giá tr c a bi n th c ns, tađ ị à ị ủ ế ự
vi t:ế
printf("\nNang suat tang %5.2f%",ns);
Gi s ta c n in raả ử ầ
N ng su t t ng 19.25% trong n m 2000ă ấ ă ă
Trong ó giá tr 19.25 l giá tr c a bi n th c ns,đ ị à ị ủ ế ự
2000 l giá tr c a bi n nguyên nam có th thay ià ị ủ ế ể đổ
tu thu c t ng tr ng h p, n u ta vi t:ỳ ộ ừ ườ ợ ế ế
printf("\nNang suat tang %5.2f% trong nam
%4d",ns,nam);
thì v m t cú pháp l úng nh ng l nh không in raề ặ à đ ư ệ
i u ta mong mu n. Trong tr ng h p n y ta nênđ ề ố ườ ợ à
tách l m 2 l nh: à ệ
printf("\nNang suat tang %5.2f%",ns);
printf(" trong nam %4d",nam);
2. Danh sách các iđố
Các i c n c phân cách nhau b i d u ph y.đố ầ đượ ở ấ ẩ
i có th l h ng, bi n, h m hay l k t h p c aĐố ể à ằ ế à à ế ợ ủ
chúng b ng các phép toán. V y các i chính l cácằ ậ đố à
bi u th c. Nói chung có bao nhiêu c t thì có b yể ứ đặ ả ấ
nhiêu i. N u s i nhi u h n s c t thì cácđố ế ố đố ề ơ ố đặ ả
i không có c t t ng ng s b b qua. Cònđố đặ ả ươ ứ ẽ ị ỏ
n u s i ít h n s c t thì máy s b r i v cóế ố đố ơ ố đặ ả ẽ ị ố à
th d n n nh ng k t qu sai.ể ẫ đế ữ ế ả
4.2. H m scanf à
int scanf(const char *dk, [danh sách các i]);đố
1. Danh sách các iđố
Các i c n c phân cách nhau b i d u ph y.đố ầ đượ ở ấ ẩ
i ph i l m t con tr ch a a ch c a m t bi nĐố ả à ộ ỏ ứ đị ỉ ủ ộ ế
n o ó. Vì tên c a chu i ký t l a ch nên khôngà đ ủ ỗ ự à đị ỉ
c n d u l y a ch ng tr c tên chu i.ầ ấ ấ đị ỉ đứ ướ ỗ
2. Chu i i u khi nỗ đ ề ể
G m các ký t c t chuy n d ng. M i c tồ ự đặ ả ể ạ ỗ đặ ả
th ng có m t i t ng ngườ ộ đố ươ ứ
ph n c tầ đặ ả có d ng t ng quát nh sau:ạ ổ ư
%[*][dr]<Ký t chuy n d ng>ự ể ạ
a. N u có d u * thì tr ng v o v n c cế ấ ườ à ẫ đượ đọ
nh ng giá tr c a nó không c l u trong bư ị ủ đượ ư ộ
nh . Thí d :ớ ụ
scanf("%d%*d%d,&a,&b);
V khi ch ng trình ch y l nh n y ta nh pà ươ ạ ệ à ậ
các s 1 2 3 thì ta có a=1,b=3 còn giá tr 2ố ị
thì b b qua. Cách n y trong th c t ít khiị ỏ à ự ế
dùng.
b. dr nói chung v ng m t, n u có m t thì ý ngh aắ ặ ế ặ ĩ
c a nó có th hi u qua ví d sau:ủ ể ể ụ
char a,b;
scanf("%2s%3s,&a,&b);
N u ta nh p dòng v o l 12345678 ch ngế ậ à à ẳ
h n thì 2 ký t 12 c gán cho a, 3 ký tạ ự đượ ự
ti p theo c gán cho b, t c l 345. các kýế đượ ứ à
t còn l i b b qua.ự ạ ị ỏ
Nói chung c t ch g m ký t % v c tđặ ả ỉ ồ ự à đặ ả
chuy n d ng c th ng kê trong b ng sau:ể ạ đượ ố ả
B ng các ký t chuy n d ng ả ự ể ạ
Ký t chuy n d ngự ể ạ Ki u c a iể ủ đố i c hi n th nhĐố đượ ể ị ư
c char ký tự
d ho c iặ int s nguyên h 10 ố ệ
ld ho c liặ long S nguyên d iố à
u int S nguyên không âmố
o int S nguyên không âm h 8ố ệ
lo long S nguyên không âm h 8ố ệ
x int S nguyên không âm h 16ố ệ
lx long S nguyên không âm h 16ố ệ
f ho c eặ float S d u ph y ng ố ấ ẩ độ
lf ho c leặ double S d u ph y ngố ấ ẩ độ
g (Không có) Không có d ng n yạ à
s Xâu ký tự Các ký tự
Chú ý: Ký t chuy n d ng c a s nguyên khôngự ể ạ ủ ố
âm h 8 l ch o, s nguyên không âm h 16 lệ à ữ ố ệ à
ox; nh ng bi u di n s nguyên không âm h 8 b tư ể ễ ố ệ ắ
u b ng s 0, còn s h 16 thì b t u b ngđầ ằ ố ố ệ ắ đầ ằ
s 0 v ch x.ố à ữ
Các dòng nghiêng v m chính l s khác bi tà đậ à ự ệ
gi a h m scanf v printf.ữ à à
Ta có th nh p các tr ng v o liên ti p nhau, saoể ậ ườ à ế
cho m i tr ng cách nhau ít nh t m t kho ngỗ ườ ấ ộ ả
tr ng. Trong ó kho tng tr ng c hi u l d uắ đ ả ắ đượ ể à ấ
cách, d u tab ho c d u xu ng dòng. Nh v yấ ặ ấ ố ư ậ
gi a các tr ng v o có th ch a m t s kho ngữ ườ à ể ứ ộ ố ả
tr ng tu ý. Nh v y ta không th nh p m tắ ỳ ư ậ ể ậ ộ
chu i ký t có ch a kho ng tr ng.ỗ ự ứ ả ắ
Ví d v h m scanfụ ề à :
int n;float a;double b;char st[5]
scanf("%d%f%lf%s",&n,&a,&b,st);
Nh v y có th th y s khác bi t c a chu i i uư ậ ể ấ ự ệ ủ ỗ đ ề
khi n trong h m printf v h m scanf l : chu iể à à à à ỗ
i u khi n trong h m printf có th coá 3 th nhđ ề ể à ể à
ph n: các ký t i u khi n, các ký t c t vầ ự đ ề ể ự đặ ả à
các ký t hi n trên m n hình; còn trong l nhự ệ à ệ
scanf thì ch có các ký t c tỉ ự đặ ả.
4.3. a ra máy in- h m fprintf Đư à
int fprintf(stdprn,const char *dk, [danh sách các i]);đố
T t c nh ng i u ã nói l nh printf u úng.ấ ả ữ đ ề đ ở ệ đề đ
Ch có m t i m khác bi t: trong l nh printf thi t bỉ ộ đ ể ệ ệ ế ị
ra l m n hình còn v i l nh fprintf thì thi t b ra là à ớ ệ ế ị à
máy in.
4.4. Dòng v o stdin v các h m nh p d li u à à à ậ ữ ệ
Trước hết ta hãy chạy thử đoạn chương trình đơn giản
sau:
char ca,cb;
ca=cb='z';
scanf("%c",&ca);
scanf("%c",&cb);
printf("\n%c %c",ca,cb);
Nếu ta gõ a ↵ thì lệnh scanf thứ 2 bị bỏ qua.
Lệnh printf tiếp theo chỉ hiện lên màn hình ký tự
a
mặc dù ta đã gán cb='z'. Như vậy lệnh scanf thứ 2
tuy có vẻ như không được thực hiện, nhưng trong thực
tế giá trị của cb đã thay đổi.
Trước khi giải thích hiện tượng trên đây chúng tôi giới
thiệu thêm một vài khái niệm liên quan đến các thao
tác vào ra.
Turbo C định nghĩa một số dòng xuất nhập chuẩn, thực
chất là các vùng đệm chuyên cho các thao tác vào ra.
Các dòng này được đặt tên và có thể thao tác trong
chương trình.
Predefined streams automatically
opened when the program is started.
Name Meaning
stdin
stdout
stderr
stdaux
stdprn
Standard input device
Standard output device
Standard error output device
Standard auxiliary device
Standard printer
Khi gặp một lệnh nhập số liệu và ta bắt đầu gõ từ bàn
phím thì các ký tự được gửi vào stdin. Chương trình sẽ
chờ cho đến khi ta gõ phím ↵ báo hiệu kết thúc lệnh
nhập số liệu thì chương trình bắt đầu đọc các ký tự từ
stdin để gán cho các trường nhập. Nếu số liệu trong
stdin chưa đủ thì chương trình lại dừng để ta nhập tiếp.
Còn nếu số liệu có nhiều hơn thì chương trình chỉ lấy
vừa đủ để gán cho các trường vào, phần còn lại vẫn
còn lại trong stdin. Khi gặp lệnh nhập số liệu tiếp theo
thì trước hết chương trình xem trong stdin có số liệu
không, nếu có đủ số liệu thì chương trình lấy ngay các
số liệu đó để gán cho trường vào mới và lệnh nhập số
liệu đó bị bỏ qua. Ta có cảm giác là lệnh không được
thực hiện nhưng thực ra đã được thực hiện nhưng có
thể không như ý ta muốn.
Trở lại đoạn chương trình trên đây. Khi nhập số liệu
cho ca ta đã gõ a và nhấn ↵ thì cả ký tự a và ký tự
↵ (\n, LF có mã là 10) đều được đưa vào stdin. Lệnh
scanf đọc ký tự a từ stdin nhưng không loại ký tự \n
ra khỏi stdin. Do vậy khi tới lệnh scanf tiếp theo thì
chương trình lấy ngay giá trị \n để gán cho cb mà
không cần chờ người sử dụng nhập số liệu mới. Khi
hiện ra màn hình thì ký tự \n không nhìn thấy do đó ta
L p trình C v C++ - Ch ng 4.V o raậ à ươ à
11
chỉ thấy chữa a mà thôi. Nếu bây giờ ta sửa lại lệnh
printf thành
printf("\n%d %d",ca,cb);
Ta sẽ thấy kết quả là
97 10
97 là mã của a, còn 10 là mã của \n.
Turbo C đã khắc phục vấn đề này bằng cách cung cấp
hàm làm sạch vùng đệm stdin như sau:
fflush(stdin);
Hàm này sẽ làm sạch vùng đệm bàn phím, như vậy sẽ
xóa hết hậu quả của các thao tác nhập số liệu trước một
một thao tác nhập số liệu mới. Chương trình trên đây
có thể thêm lệnh này trước khi thực hiện lệnh scanf
thứ 2 như sau:
char ca,cb;
ca=cb='z';
scanf("%c",&ca);
fflush(stdin);
scanf("%c",&cb);
printf("\n%c %c",ca,cb);
Và ta không còn gặp điều bất thường trên đây nữa. Sau
lệnh scanf thứ nhất máy sẽ chờ để ta nhập số liệu cho
lệnh thứ 2. Kết quả hiện ra trên màn hình là những ký
tự ta đã nhập vào.
Có một cách khác để khử ký tự '\n' là trong lệnh scanf
thư nhất thêm đặc tả %*c
scanf("%c%*c",&ca);
Khi đó ký tự '\n' cũng được đọc (không lưu vào biến
nào cả) và bị loại khỏi stdin.
Tuy nhiên như ta sẽ thấy, không phải lệnh nhập số liệu
nào cũng hoạt động như lệnh scanf. Cũng có lệnh loại
bỏ dấu \n sau khi đọc số liệu trước đó. Thí dụ trong
đoạn chương trình sau đây nếu sau khi gõ a ↵ thì
máy vẫn chờ để ta nhập tiếp dữ liệu cho lệnh scanf tiếp
theo.
char a,b;
a=b='z';
cin>>a;//Lệnh C++, cần tới <iostream.h>
cin>>b; //Lệnh C++
printf("\n%c %c",a,b);
4.5. Nh p /xu t s li u cho chu i v ký t ậ ấ ố ệ ỗ à ự
Một số hàm thao tác trên ký tự và chuỗi:
int getc(FILE *stream);
int putc(int c, FILE *stream);
int getch(void);//Nhận ký tự trực tiếp từ bàn
phím, ký tự không hiện trên màn hình
int getche(void); //Nhận ký tự trực tiếp từ bàn
phím, ký tự hiện trên màn hình
int putch(int ch); //Màu tuỳ thuộc vào lệnh
textcolor
int getchar(void);//Nhận ký tự từ stdin
int putchar(int c); //Luôn hiện màu đen
trắng
char *gets(char *s);
int puts(const char *s);
Các hàm scanf, cin chỉ nhập được chuỗi không có dấu
cách.
Hàm gets nhập được chuỗi chứa dấu cách: Nhận dãy
ký tự từ stdin cho đến khi gặp ký tự '\n'. Ký tự '\n' bị
loại khỏi stdin nhưng không được đặt vào cuối chuỗi.
Chuỗi được bổ sung ký tự kết thúc '\0'.
Các hàm printf, cout và puts có thể hiện được các
chuỗi có chứa dấu cách
4.6. M t s h m x lý chu i ộ ố à ử ỗ
strcmp(st1,st2)>0 nghĩa là st1>st2, phân biệt chữ hoa
chữ thường
strcmpi(st1,st2)>0 nghĩa là st1>st2, không phân biệt
chữ hoa chữ thường
strcat(st1,st2) ghép st2 vào st1
char* strchr(char *s, int kt);
Tìm lần xuất hiện đầu tiên của kt trong s. Nếu tìm thấy
trả về địa chỉ của ký tự tìm được, nếu không trả về
NULL.
strcpy(st1,st2); thục chất là gán st1=st2;
strlen(st); cho độ dài chuỗi st.strlwr(st) chuyển thành
chữ thường (giống tolower(ch) đối với ký tự).
strupr(st);
4.7. S khác bi t gi a m ng v chu i ự ệ ữ ả à ỗ
Trước hết ta chạy thử đoạn chương trình sau đây
int a[]={1,2,3};
cout<<endl<<&a;
cout<<endl<<a;
cout<<endl<<*a;
cout<<endl;
char *b="123";
cout<<endl<<&b;
cout<<endl<<b;
cout<<endl<<*b;
Ta có kết quả có dạng:
0x8f90fff0
0x8f90fff0
1
0x8f9fffee
123
1
L p trình C v C++ - Ch ng 4.V o raậ à ươ à
12
Như vậy tên mảng hay tên chuỗi biểu thị địa chỉ
của phần tử đầu tiên. Vì vậy *a hay *b đều cho
giá trị của phần tử đầu tiên. Theo cách hiểu này thì
đáng lẽ ra &a và a phải như nhau, &b và b
cũng như nhau. Nhưng điều này chỉ đúng với mảng.
Đối với chuỗi thì cout<<b lại cho toàn bộ chuỗi.
Đây là điểm khác biệt giữa chuỗi và mảng. Nếu với
mảng ta chỉ có thể nhập số liệu và cho hiện từng
phần tử của mảng thì nếu ta cũng đòi hỏi như vậy
với chuỗi thì sẽ làm cho công việc lập trình rất rắc
rối. Chuỗi có thể xem như mảng, nhưng đồng thời
phải được truy xuất như một phần tử. Không thể
thao tác với tên người, tên địa danh mà coi như hợp
thành của nhiều phần tử, mỗi phần tử là một ký tự
được. Chính vì vậy các nhà sáng tạo ngôn ngữ C
đã chọn một trong 2 ký hiệu &b và b một ký
hiệu dùng để thao tác toàn bộ chuỗi. Vì vậy khi
dùng lệnh
scanf("%s",b); ta có thể nhập toàn bộ chuỗi
còn lệnh
printf("%s",b); sẽ in toàn bộ chuỗi.
Nếu b là mảng thì các lệnh trên đây không thực
hiện được và máy sẽ báo lỗi.
Ta có thể khởi đầu các giá trị cho chuỗi ký tự như
ví dụ sau
char a[]="123";
char a1[4]="123";
char *a3="123";
Hoặc khai báo và dùng phép gán:
char *a;
a="123";
Tuy nhiên nếu ta viết:
char a[4];
a = "123";
Thì máy báo lỗi. Nguyên nhân là vì a là mảng đã
được định sẵn kích cỡ, không thể thay đổi được, a
không phải là biến con trỏ nên không thể đứng phía
bên trái trong phép gán.
4.8. Các h m v o ra v d ch chuy n v trí trên à à à ị ể ị
m n hình à
Hàm gotoxy(cm,rn); sẽ đưa con trỏ đến vị trí ở cột thứ
cm và hàng thứ rn trên màn hình.
Hàm kbhit() nhận giá trị 1 nếu có phím được bấm.
4.9. Các lu ng nh p xu t cin,cout ồ ậ ấ
C++ cung cấp các dòng (stream được chứa trong
iostream.h) cin và cout để nhập xuất số liệu. Sau đây
là vài ví dụ:
float a;int m;
cin>>a;
cin>>m;
cout<<endl<<setw(8)<<setprecision(4)<<a;
cout<<'\n'<<oct<<m;
cout<<'\n'<<hex<<m;
L p trình C v C++ - Ch ng 4.V o raậ à ươ à
13
Ch ng 5. Các toán t đi u khi n ươ ử ề ể
5.1. Nh c l i khái ni m câu l nh v kh i l nh ắ ạ ệ ệ à ố ệ
5.2. Toán t if ử
if <bi u th c> <l nh 1>ể ứ ệ
if <bi u th c> <l nh 1> else <l nh 2>ể ứ ệ ệ
Thí dụ:
if(a>b) max=a; else max=b;
5.3. else if
Khi mu n th c hi n m t trong n l nh ta có th số ự ệ ộ ệ ể ử
d ng if nhh sauụ ư
if <bi u th c 1>ể ứ
<l nh 1>ệ
else if <bi u th c 2>ể ứ
<l nh 2>ệ
. . .
else if <bi u th c n-1>ể ứ
<l nh n-1>ệ
else
<l nh n>ệ
5.4. Toán t switch ử
switch<bi u th c nguyên>ể ứ
{case n1: <Các l nh>ệ
case n2: <Các l nh>ệ
. . .
case nk: <Các l nh>ệ
[default: <Các l nh>]ệ
}
Cách ho t ng: N u <bi u th c nguyên> =ni thìạ độ ế ể ứ
ch ng trình b t u th c hi n t case ni cho nươ ắ đầ ự ệ ừ đế
h t kh i l nh. Nh v y n u mu n thoát kh i kh iế ố ệ ư ậ ế ố ỏ ố
l nh o n gi a thì ta ph i dùng l nh break. N uệ ở đ ạ ữ ả ệ ế
không có giá tr ni n o trùng v i <bi u th c nguyên>ị à ớ ể ứ
thì ch ng trình nh y n default, ho c ra kh iươ ả đế ặ ỏ
l nh switch n u không có default.ệ ế
5.5. Toán t goto v nhãn ử à
nhan: x+=y;
. . .
goto nhan;
5.6. Toán t for ử
for([các l nh ệ A]; [bi u th c ể ứ B]; [các l nh ệ C]) [l nhệ
D];
[l nh ệ E];
Chú ý r ng ba ph n A, B, C cách nhau b ng d u ;ằ ầ ằ ấ
cách ho t ng c a toán t for nh sau: ạ độ ủ ử ư
1. N u có [các l nh A] thì th c hi n các l nhế ệ ự ệ ệ
n y. N u ph n n y g m nhi u l nh thì các l nhà ế ầ à ồ ề ệ ệ
cách nhau b ng d u , (ch không ph i l d u ;),ằ ấ ứ ả à ấ
ví d các l nh A có th l int i=1, int j=2; Sauụ ệ ể à
khi th c hi n các l nh A thì chuy n sang b cự ệ ệ ể ướ
th 2 sau ây. ứ đ
2. Xác nh [bi u th c B], đị ể ứ n u bi u th c n y saiế ể ứ à
thì k t thúc l nh forế ệ t c l chuy n sang b c 4,ứ à ể ướ
n u B úng thì th c hi n [l nh D] sau óế đ ự ệ ệ đ
chuy n sang b c 3 sau ây.ể ướ đ
3. Th c hi n các l nh C, (thông th ng các l nhự ệ ệ ườ ệ
n y l m thay i giá tr bi u th c B), tr l ià à đổ ị ể ứ ở ạ
b c 2. Ví d có th l i++, ho c i++, j++ướ ụ ể à ặ
4. K t thúc l nh for, t c l chuy n sang th c hi nế ệ ứ à ể ự ệ
[l nh E] ngay sau l nh for.ệ ệ
Nh v y n u [bi u th c B] luôn luôn úng thì vòngư ậ ế ể ứ đ
l p s vô h n. Trong tr ng h p [bi u th c B] v ngặ ẽ ạ ườ ợ ể ứ ắ
m t ch ng h n, thì c hi u l bi u th c B luônặ ẳ ạ đượ ể à ể ứ
luôn úng. Trong ph n B có th không ph i l m tđ ầ ể ả à ộ
bi u th c duy nh t, m có th có các bi u th c cáchể ứ ấ à ể ể ứ
nhau b ng d u , ví d i<10, j<20 . Lúc n y bi uằ ấ ụ à ể
th c B c hi u l i<10 && j<20.ứ đượ ể à
Ví d v l nh for:ụ ề ệ
Ví d 1: Tính t ng S = 1+2+3+ +100ụ ổ
int i,s;
s=0;
for(i=1;i<=100;i++) s=s+i;
Ví d 2: Tính t ng S = 1+1+2+2+3+3.+4+4ụ ổ
int i,s;
s=0;
for(i=1,j=1;i<=4, j<=4;i++,j++) s=s+i+j;
5.6. Toán t while ử
while(<bi u th c ể ứ A>) <l nh ệ B>;
[l nh C];ệ
<bi u th c A> l bi u th c logic, th ng l m tể ứ à ể ứ ườ à ộ
bi u th c nh n giá tr s . N u giá tr c a nó khác 0ể ứ ậ ị ố ế ị ủ
thì nh n giá tr úng, n u giá tr c a nó =0 thì nh nậ ị đ ế ị ủ ậ
giá tr sai. ị
Cách ho t ng: ạ độ
1. N u <bi u th c A> sai thì <l nh B> khôngế ể ứ ệ
c th c hi n, chuy n sang b c 3.đượ ự ệ ể ướ
2. N u <bi u th c A> úng thì th c hi nế ể ứ đ ự ệ
<l nh B> sau ó quay l i b c 1. (Thôngệ đ ạ ướ
th ng <l nh B> l m thay i giá tr <bi uườ ệ à đổ ị ể
th c A>).ứ
3. K t thúc l nh while, chuy n sang th c hi nế ệ ể ự ệ
<l nh C> v các l nh sau ó.ệ à ệ đ
Ví d 1: Tính t ng S = 1+2+3+ +100ụ ổ
int i,s;
s=0;i=1;
while(i<=100) s+=i++;
5.7. do while
do
<l nh A>ệ
while<bi u th c B> ể ứ
Dù <bi u th c B> sai hay úng thì <l nh A> ítể ứ đ ệ
nh t c th c hi n m t l n. Do ó ng i ta g iấ đượ ự ệ ộ ầ đ ườ ọ
l nh n y l l nh “ti n tr m h u t u”.ệ à à ệ ề ả ậ ấ
5.8. L nh break v l nh continue ệ à ệ
Ví d 1: Tính t ng S =1+2+3+4+5ụ ổ
s=0;
i=1;
for(i=1;i<=10;i++)
L p trình C v C++ - Ch ng 5. Các toán t i u khi nậ à ươ ử đ ề ể
{if(i==6) break;
s=s+i;
}
Ví d 2: Tính t ng S =1+2+3+4+5+7+8+9+10ụ ổ
s=0;
i=1;
for(i=1;i<=10;i++)
{if(i==6) continue;
s=s+i;
}
ví d 1 S= 1+2+3+4+5 = 15ở ụ
ví d 2 S= 1+2+3+4+5+7+8+9+10 = 49ở ụ
K thu t l p trình C - Ch ng 5.Các toán t i u khi nỹ ậ ậ ươ ử đ ề ể
15
Ch ng 6. H m v c u trúc ch ngươ à à ấ ươ
trình
6.1. Khai báo v nh ngh a h m à đị ĩ à
T ng t nh m t bi n, m t h m ph i khai báoươ ự ư ộ ế ộ à ả
tr c khi nó c g i. M t khai báo h m có 3 ph n:ướ đượ ọ ộ à ầ
Ki u cho ra, tên v danh sách tham s . ể à ố
H m có vai trò ngang nhau, C++ không cho phépà
xây d ng m t h m bên trong h m khácự ộ à à .
Ví dụ: Khai báo h mà :
double power(double x, int n);
Trong ó double l ki u cho ra, power l tên c ađ à ể à ủ
h m v (double x,int n) l danh sách các tham s .à à à ố
H m n y có 2 tham s l x v n. Các tham s n yà à ố à à ố à
còn c g i l các tham s hình th c. Danh sáchđượ ọ à ố ứ
các tham s có th tr ng, nh ng các d u ngo c nố ể ỗ ư ấ ặ đơ
v n c n thi t. M t khai báo h m còn c g i lẫ ầ ế ộ à đượ ọ à
các nguyên m u h m (prototype). Ph n n y ch a cácẫ à ầ à ứ
thông tin t i thi u m b biên d ch c n biên d chố ể à ộ ị ầ để ị
các l nh g i n h m. Vì v y trong ph n khai báoệ ọ đế à ậ ầ
có th b b t tên các tham s ch ng h n nh : ể ỏ ớ ố ẳ ạ ư
double max(double,double);
Tuy nhiên n u bi n l m ng thì không th b tênế ế à ả ể ỏ
bi n c. Ta ch có th vi t m t cách n gi nế đượ ỉ ể ế ộ đơ ả
h n, ví d ơ ụ
int x[],float y[][10]
ch ng h n. L u ý l v i m ng 2 chi u ph i cóẳ ạ ư à ớ ả ề ả
thông tin v s c t.ề ố ộ
Ph n khai báo ph i v trí tr c l i g i h mầ ả ở ị ướ ờ ọ à
trong ch ng trình. Tuy nhiên nh ta có th th y,ươ ư ể ấ
ph n khai báo ch a xác nh m t h m. H mầ ư đủ để đị ộ à à
còn có ph n nh ngh a n m v trí b t k trongầ đị ĩ ằ ở ị ấ ỳ
ch ng trình (t t nhiên l không ph i bên trong m tươ ấ à ả ộ
h m khác).à
Ví dụ: nh ngh a h mĐị ĩ à :
double max(double x,double y)
{return (x>y?x:y);
}
Chú ý:
N u nh ngh a h m n m tr c l i g i nó thìế đị ĩ à ằ ướ ờ ọ
không c n khai báo m u n a.ầ ẫ ữ
Trong thân h m có th khai báo các bi n c c b .à ể ế ụ ộ
Các bi n n y không c trùng tên v i các thamế à đượ ớ
số. Trong thân h m ta có th s d ng các thamà ể ử ụ
s m không khai báo l i. N u ta khai báo l iố à ạ ế ạ
thì ch ng trình s báo l i.ươ ẽ ỗ
Trong ph n nh ngh a h m không c b tênầ đị ĩ à đượ ỏ
các tham s nh trong ph n khai báo.ố ư ầ
N u h m có ki u cho ra thì cu i thân h m ph iế à ể ố à ả
có l nh return <bi u th c>; trong ó <bi uệ ể ứ đ ể
th c> có cùng ki u giá tr v i h m. Trong thânứ ể ị ớ à
h m có th có m t ho c nhi u l nh return <bi uà ể ộ ặ ề ệ ể
th c>; Khi ch ng trình g p l nh n y thì giá trứ ươ ặ ệ à ị
h m c tr v v ch ng trình thoát kh ià đượ ả ề à ươ ỏ
h m.à
Tên h m c ng l m t identifier, do ó khôngà ũ à ộ đ
c t tên h m trùng v i tên bi n ho cđượ đặ à ớ ế ặ
ng c l i.ượ ạ
Khi ta khai báo tham s l m ng m t chi u hayố à ả ộ ề
con tr thì khi g i có th g i tham s th c lỏ ọ ể ọ ố ự à
con tr ho c m ng. Thí d khai báo char st[];ỏ ặ ả ụ
v char *st; l ho n to n t ng ng. Tuyà à à à ươ đươ
nhiên v i m ng 2 chi u thì không còn úng n a.ớ ả ề đ ữ
Thí d o n ch ng trình sau ây l ụ đ ạ ươ đ à không
h p lợ ệ:
void v(int **mm)
{printf("\n%d",mm[0][0]);
}
void main()
{clrscr();
int m[2][3]={1,2,3,4};
v(m);
getch();
}
Sau ây l ví d úng v khai báo v g i h m: đ à ụ đ ề à ọ à
#include <malloc.h>
void v(int **a,int m,int n)
{for(int i=0;i<m;i++)
{printf("\n");
for(int j=0;j<n;j++) printf("%d
",a[i][j]);
}
};
void main(void)
{clrscr();
int m=2,n=3,i,j;
int **b;
b = (int**) malloc(sizeof(int*)*2);
//(1)
for(i=0;i<2;i++) b[i]=(int*)
malloc(sizeof(int)*3); //(2)
for(i=0;i<m;i++)
for(j=0;j<n;j++) b[i][j]=i*3+j;
v(b,2,3);
getch();
}
Chú ý.
lệnh (1) có thể thay bằng
b=new int* [2];
lệnh (2) có thể thay bằng
b[i]=new int [3];
6.2. Các h m void à
void ti ng Anh có ngh a l tr ng r ng, khuy t. H mế ĩ à ố ỗ ế à
ki u void l m t h m có ki u cho ra l void. i uể à ộ à ể à Đ ề
n y có ngh a l nó không cho ra giá tr , gi ng nhà ĩ à ị ố ư
procedure trong Pascal. Trong h m có th có ho cà ể ặ
không có l nh return; nh ng l nh n y n u có thì chệ ư ệ à ế ỉ
L p trình C v C++ - Ch ng 5. Các toán t i u khi nậ à ươ ử đ ề ể
có d ng n gi n l return; khi ch ng trình g pở ạ đơ ả à ươ ặ
l nh n y thì ch ng trình thoát kh i h m. N uệ à ươ ỏ à ế
không có l nh return thì ch ng trình ch y n h tệ ươ ạ đế ế
thân h m r i m i thoát kh i h m.à ồ ớ ỏ à
Ví dụ:
Bây gi ta xét m t ví d l in ra ng y trong tu n tờ ộ ụ à à ầ ừ
th 2 n th 7 b ng ti ng Anh khi cho ng y b ngứ đế ứ ằ ế à ằ
s , thí d 2 l th 2, 3 l th 3, . . . v vi t h mố ụ à ứ à ứ à ế à
b ng 2 cách: có ki u cho ra v ki u cho ra l void.ằ ể à ể à
Cách 1:
char* weekday(int n)
{switch(n)
{case 2: return "Monday";
case 3: return "Tuesday";
case 4: return "Wednesday";
case 5: return "Thursday";
case 6: return "Friday";
case 7: return "Saturday";
}
return “”;
}
Trong ch ng trình main() ta s dùng l nhươ ẽ ệ
printf("%s",weekday(n)) in ra các ng y.để à
Cách 2:
void weekday(int n)
{switch(n)
{case 2: printf("\n%s","Monday");break;
case 3: printf("\n%s","Tuesday"); break;
case 4: printf("\n%s","Wednesday"); break;
case 5: printf("\n%s","Thursday"); break;
case 6: printf("\n%s","Friday"); break;
case 7: printf("\n%s","Saturday"); break;
}
return;
}
6.3. L i g i h m ờ ọ à
Khi khai báo h m các tham s c g i l tham sà ố đượ ọ à ố
hình th c. Khi s d ng h m các tham s c thayứ ử ụ à ố đượ
b ng các tham s có ki u t ng ng. Khi g i h m taằ ố ể ươ ứ ọ à
không c n ch rõ các tham s có ki u gì vì ki u c aầ ỉ ố ể ể ủ
chúng ã c khai báo tr c khi g i. Ch có tên c ađ đượ ướ ọ ỉ ủ
các tham s c thay v o các v trí t ng ng c aố đượ à ị ươ ứ ủ
các tham s hình th c. Thí d xác nh maxố ứ ụ để đị
trong 2 s a,b ta g iố ọ
t=max(a,b);
6.4. S d ng h m assert() ki m tra i u ki nử ụ à để ể đ ề ệ
tr c ướ
H u h t các h m không th c thi t t trên t t c cácầ ế à ự ố ấ ả
giá tr c a các tham s . Thí d h m doubleị ủ ố ụ à
power(double x,int n) m chúng ta s xét t i sau âyà ẽ ớ đ
ch có ngh a v i x>0. i v i các h m có tr v giáỉ ĩ ớ Đố ớ à ả ề
tr khác v i ki u void thì ôi khi r t khó tìm m tị ớ ể đ ấ để ộ
ki u ra t ng ng v i các tr ng h p không thíchể ươ ứ ớ ườ ợ
h p. Trong các tr ng h p n y ta có th dùng h mợ ườ ợ à ể à
assert() c nh ngh a trong assert.h ki m trađượ đị ĩ để ể
tr c các i u ki n. Khi i u ki n ó không th aướ đ ề ệ đ ề ệ đ ỏ
mãn thì ch ng trình d ng th c hi n h m v kèmươ ừ ự ệ à à
l i thông báo.ờ
Ví dụ:
double power(double x,int n)
{assert(x>0);
double y=1.0;int m=abs(n);//N u l double thì dùngế à
fabs()
for(int i=0;i<m;i++) y*=x;
if(n<0) y=1/y;
return y;
}
6.5. Các i s m c nh đố ố ặ đị
N u ta s a l i h m nh sauế ử ạ à ư
double power(double x=1.0,int n=2)
{assert(x>0);
double y=1.0;int m=abs(n);//N u l double thì dùngế à
fabs()
for(int i=0;i<m;i++) y*=x;
if(n<0) y=1/y;
return y;
}
Thì ta có th g i h m power() m không có tham s .ể ọ à à ố
Khi ó tham s c hi u l các tham s m c nh.đ ố đượ ể à ố ặ đị
Nh thí d trên ây ta có:ư ụ đ
printf("\n%f",power());
s cho k t qu l 1.ẽ ế ả à
6.6. Truy n tham s cho h m ề ố à
1. Truy n b ng tham tr ề ằ ị (value parameter)
(Chú ý r ng tên m ng l con tr do ó h m có thamằ ả à ỏ đ à
s l m ng luôn c t ng truy n theo a ch .ố à ả đượ ự độ ề đị ỉ
Th m chí n u ta vi t void vv(double &a[2][3]) ch ngậ ế ế ẳ
h n thì máy s báo l i. Tuy nhiên n u ta ã nhạ ẽ ỗ ế đ đị
ngh a tr c typedef double kmatran[2][3]; thì l i cóĩ ướ ạ
th vi t ể ế
void vv(kmtran &a);)
Ta xét o n ch ng trình sau:đ ạ ươ
void f1(int x)
{x*=3;
printf("\n%d",x);
}
void main()
{int a=1;
printf("\n%d",a);
f1(a);
printf("\n%d",a);
}
K t qu trên m n hình l :ế ả à à
1
3
1
M c d u trong thân h m ta thay i giá tr c a bi nặ ầ à đổ ị ủ ế
x nh ng khi ra kh i thì ch ng trình x l i l y giá trư ỏ ươ ạ ấ ị
c . Nguyên nhân l vì h m ã c nh ngh a theoũ à à đ đượ đị ĩ
ki u truy n tham tr , nên khi m t tham s c g iể ề ị ộ ố đượ ọ
L p trình C v C++ - Ch ng 6.H m v c u trúc ch ng trìnhậ à ươ à à ấ ươ
17
thì không ph i b n thân tham s ó m b n sao c aả ả ố đ à ả ủ
nó c thay v o h m. Khi ra kh i h m bi n x l iđượ à à ỏ à ế ạ
c hi u l bi n tr c khi g i h m.đượ ể à ế ướ ọ à
Truy n b ng tham tr h ngề ằ ị ằ (const value parameter):
N u h m f1 c s a l i nh sau:ế à đượ ử ạ ư
void f1(const int x)
{x*=3;
printf("\n%d",x);
}
Thì máy s báo l i. Vì khi khai báo ki u tham trẽ ỗ ể ị
h ng thì trong thân h m không c phép thay iằ à đượ đổ
giá tr c a bi n ki u tham tr h ng.ị ủ ế ể ị ằ
2. Truy n theo a chề đị ỉ
Ta xét o n ch ng trình sau:đ ạ ươ
void f1(int *px)
{*px*=3;
printf("\n%d",*px);
}
void main()
{int a=1;
printf("\n%d",a);
f1(&a);
printf("\n%d",a);
}
K t qu trên m n hình l :ế ả à à
1
3
3
Ngh a l sau khi ra kh i ch ng trình thì x l y giáĩ à ỏ ươ ấ
tr ã thay i trong ch ng trình con. ây l cáchị đ đổ ươ Đ à
truy n tham s theo a ch . Qua cách truy n n y thìề ố đị ỉ ề à
ch ng trình con l m vi c tr c ti p v i giá tr mươ à ệ ự ế ớ ị à
tham s a ch tr t i, t c l giá tr th c s c aố đị ỉ ỏ ớ ứ à ị ự ự ủ
bi n. Do v y n u trong h m giá tr bi n b thay iế ậ ế à ị ế ị đổ
thì khi thoát kh i h m nh ng s thay i ó v nỏ à ữ ự đổ đ ẫ
c gi l i. Khi truy n tham s theo a ch ta c nđượ ữ ạ ề ố đị ỉ ầ
chú ý t i nh ng i m sau:ớ ữ đ ể
• M ng ch có th truy n cho h m qua a ch , doả ỉ ể ề à đị ỉ
ó i v i d li u ki u m ng thì m i s thayđ đố ớ ữ ệ ể ả ọ ự
i trong h m v n còn tác d ng khi ra kh i h m.đổ à ẫ ụ ỏ à
• Có th dùng 2 cách khai báo bi n <ki u dể ế ể ữ
li u>* <tên bi n con tr > ho c <ki u d li u>ệ ế ỏ ặ ể ữ ệ
*<tên bi n con tr > (thí d int* pi ho c intế ỏ ụ ặ
*pi, trong ó pi l con tr ki u int). C 2 cáchđ à ỏ ể ả
n y ho n to n t ng ng. Cách th nh tà à à ươ đươ ứ ấ
th ng c dùng khi khai báo nguyên m uườ đượ ẫ
h m, vì khi ó ta ch khai báo ki u c a bi n,à đ ỉ ể ủ ế
ch a c n khai náo tên.ư ầ
• Con tr không c n ph i kh i t o khi khai báoỏ ầ ả ở ạ
nh ng ph i kh i t o tr c khi s d ng.ư ả ở ạ ướ ử ụ
• Không c gán giá tr khác ki u cho con tr .đượ ị ể ỏ
Thí d trong h m trên ây ta không th g iụ à đ ể ọ
f1(2); ho c f1(&(x+1)); ặ
3. Truy n b ng tham chi uề ằ ế (reference parameter):
Trong C++ ng i ta còn a thêm khái ni m bi nườ đư ệ ế
tham chi u. Có th xem bi n tham chi u l m tế ể ế ế à ộ
b c ti n c a con tr . Ta hãy xét o n ch ng trìnhướ ế ủ ỏ đ ạ ươ
sau:
int i=10;
int& j=i;
j=20;
printf("\n%d",i);
o n ch ng trình trên ây s cho k t qu l Đ ạ ươ đ ẽ ế ả à
20
ngh a l giá tr i ã b thay i m c d u trongĩ à ị đ ị đổ ặ ầ
ch ng trình không có l nh n o l m thay i giá trươ ệ à à đổ ị
i. Nguyên do l vì bi n j c ng chi m vùng b nhà ế ũ ế ộ ớ
nh bi n i. Do ó m i s thay i c a i u t ngư ế đ ọ ự đổ ủ đề ươ
ng v i thay i trên j v ng c l i. V y ta cóđươ ớ đổ à ượ ạ ậ
th hình dung m t bi n tham chi u gi ng nh bíể ộ ế ế ố ư
danh c a bi n khác. Ta có m y i u chú ý sau âyủ ế ấ đ ề đ
v bi n tham chi u:ề ế ế
• Bi n tham chi u c ng ch a a ch c a m t h cế ế ũ ứ đị ỉ ủ ộ ự
th nh các bi n khác.ể ư ế
• Bi n tham chi u c n ph i c kh i t o khiế ế ầ ả đượ ở ạ
khai báo. Thí d n u ta khai báo int& i; thì máyụ ế
s báo l i. i u n y c ng d hi u, vì bi n thamẽ ỗ Đ ề à ũ ễ ễ ế
chi u l bi n " n theo", do ó ph i c kh iế à ế ă đ ả đượ ở
t o khi khai báo. T t nh t l ta kh i t o bi nạ ố ấ à ở ạ ế
tham chi u theo m t bi n khác ã có. Còn n u taế ộ ế đ ế
kh i t o b ng m t h ng, thí d int &m=2; thìở ạ ằ ộ ằ ụ
máy không báo l i nh ng có dòng c nh báoỗ ư ả
Temporary used to initialize 'm' .
• Không c p phát b nh ng cho bi n thamấ ộ ớ độ ế
chi u.ế
• Không dùng các phép toán nh t ng ho c gi mư ă ặ ả
a ch i v i bi n tham chi u.đị ỉ đố ớ ế ế
M c dù b n ch t c a bi n tham chi u l con tr ,ặ ả ấ ủ ế ế à ỏ
nh ng ta có th s d ng tên bi n tham chi u truyư ể ử ụ ế ế để
nh p n giá tr c a nó. ây l i m khác bi t gi aậ đế ị ủ Đ à đ ể ệ ữ
bi n thu c ki u tham chi u v bi n ki u con tr .ế ộ ể ế à ế ể ỏ
N u trong o n ch ng trình trên ay ta s a l i lế đ ạ ươ đ ử ạ à
const int i=10;
int& j=i;
j=20;
printf("\n%d",i);
Thì k t qu l ế ả à
10
Ngh a l giá tr c a i không b thay i. i u n y cóĩ à ị ủ ị đổ Đ ề à
v nh mâu thu n v i i u ta nói trên ây l bi n jẻ ư ẫ ớ đ ề đ à ế
th c ra l bí danh c a i m thôi. Chúng tôi s khôngự à ủ à ẽ
i sâu thêm v v n n y m ch mu n nh c nhđ ề ấ đề à à ỉ ố ắ ở
c gi m t i u l ta ph i vi t các dòng l nh saođộ ả ộ đ ề à ả ế ệ
cho chúng có ngh a. Thí d n u ta ã không mu nĩ ụ ế đ ố
thay i giá tr c a i thì không nên gán bí danh chođổ ị ủ
L p trình C v C++ - Ch ng 6.H m v c u trúc ch ng trìnhậ à ươ à à ấ ươ
18
nó n a. ữ
Truy n tham s theo ki u tham chi uề ố ể ế :
Tr l i v n truy n tham s cho h m, n u trongở ạ ấ đề ề ố à ế
ch ng trình trên ta s a l i h m f1 nh sau:ươ ử ạ à ư
void f1(int &x)
{x*=3;
printf("\n%d",x);
}
void main()
{int a=1;
printf("\n%d",a);
f1(a);
printf("\n%d",a);
}
Thì k t qu trên m n hình s l :ế ả à ẽ à
1
3
3
Nh v y giá tr x ã th c s b thay i khi ra kh iư ậ ị đ ự ự ị đổ ỏ
h m. Lý do l vì khi có l i g i h m thì m t bi nà à ờ ọ à ộ ế
tham chi u n bi n x tham gia v o các tính toánế đế ế à
trong thân h m, v nh v y giá tr g c c a x ã bà à ư ậ ị ố ủ đ ị
thay i. đổ
N u ta khai báo các tham s h m theo ki u thamế ố à ể
chi u thì khi g i không c n g i theo a ch nhế ọ ầ ọ đị ỉ ư
tr ng h p truy n theo a ch m ch c n vi t tênườ ợ ề đị ỉ à ỉ ầ ế
bi n nh trong tr ng h p truy n theo giá tr . ế ư ườ ợ ề ị
6.7. H m ch ng(Overloaded function) à ồ
Trong khi s p x p các dãy s ta th ng xuyên ph iắ ế ố ườ ả
i ch 2 ph n t . kh i ph i l p l i m t s l nhđổ ỗ ầ ử Đế ỏ ả ặ ạ ộ ố ệ
gi ng nhau ta nh ngh a h m swap nh sau:ố đị ĩ à ư
void swap(int &x, int &y)
{int tmp=x;
x=y;
y=tmp;
}
Tuy nhiên h m n y ch có th i ch cho 2 sà à ỉ ể đổ ỗ ố
nguyên. Ta bi t r ng C không cho phép nh ngh a 2ế ằ đị ĩ
h m cùng tên, v n u mu n vi t h m i ch 2 sà à ế ố ế à đổ ỗ ố
th c ta l i ph i vi t h m khác v i tên khác. Tuyự ạ ả ế à ớ
nhiên vi c nh ngh a n y l i h p l trong C++. Taệ đị ĩ à ạ ợ ệ
có th nh ngh a thêm 2 h m swap cho s th c floatể đị ĩ à ố ự
v double nh sau:à ư
void swap(float &x, float &y)
{float tmp=x;
x=y;
y=tmp;
}
void swap(double &x, double &y)
{double tmp=x;
x=y;
y=tmp;
}
Khi ta g i h m b ng l nh swap(a,b); ch ng h n thìọ à ằ ệ ẳ ạ
C++ s xem ki u c a a, b m ch n ki u h m thíchẽ ể ủ à ọ ể à
h p.ợ
C++ s d ng h th ng trong ó các h m c nh nử ụ ệ ố đ à đượ ậ
bi t duy nh t b ng tên v lo i tham s c a chúng.ế ấ ằ à ạ ố ủ
Trong quá trình biên d ch tên h m c bi n iị à đượ ế đổ
th nh m t tên m i thông qua quá trình g i l "máyà ộ ớ ọ à
cán tên" (name-mangling). Trong quá trình n y, tênà
c a h m v danh sách các ki u tham s c nh pủ à à ể ố đượ ậ
chung th nh m t tên duy nh t. Thí d có 2 h mđể à ộ ấ ụ à
f(int,int); v f(float,float); s c b biên d ch ià ẽ đượ ộ ị đổ
tên th nh hai tên khác bi t nhauà ệ
_f_int_int
_f_float_float
Nh v y trong tên m i không có s tham gia c aư ậ ớ ự ủ
ki u giá tr h m. ể ị à Do ó b biên d ch s không cóđ ộ ị ẽ
kh n ng phân bi t hai h m có cùng tên danh sáchả ă ệ à
tham s nh ng có ki u tr v khác nhau.ố ư ể ả ề
6.8. Các m u (template) ẫ
Trên ây ta ph i nh ngh a 3 h m cho th t c traođ ả đị ĩ à ủ ụ
i giá tr 2 bi n. C++ có m t ph ng pháp t t h nđổ ị ế ộ ươ ố ơ
thay i ki u ph n t m không c n ghi rõ ki uđể đổ ể ầ ử à ầ ể
ph n t khi khai báo hay nh ngh a. Ph ng phápầ ử đị ĩ ươ
n y c th c hi n v i m u.à đượ ự ệ ớ ẫ
M u h m:ẫ à
Ta có th nh ngh a h m swap v i m u nh sau:ể đị ĩ à ớ ẫ ư
template <class T>
void swap(T& x, T& y)
{T tmp=x;
x=y;
y=tmp;
}
Khi ta g i h m swap, thí d swap(a,b); thì ki u c aọ à ụ ể ủ
các tham s s c b biên d ch thay v o h m. Thíố ẽ đượ ộ ị à à
d n u ki u c a a,b l float thì th c ch t b biênụ ế ể ủ à ự ấ ộ
d ch t o nh ngh a h m sau ây: ị ạ đị ĩ à đ
void swap(float &x, float &y)
{float tmp=x;
x=y;
y=tmp;
}
Chú ý:
m u template <class T>ẫ
ph i ng tr c ph n khai báo v c ph n nhả đứ ướ ầ à ả ầ đị
ngh a h m.ĩ à
6.9. H m v i các tham s l m ng à ớ ố à ả
Trong Pascal m ng không th xu t hi n v i khai báoả ể ấ ệ ớ
tr c ti p trong ph n khai báo các tham s h m, m taự ế ầ ố à à
ph i nh ngh a b ng l nh type tr c.ả đị ĩ ằ ệ ướ
Trong C thì i u ó có th c. Vi c dùng h mđ ề đ ể đượ ệ à
có tham s l các m ng có th c minh h a b ngố à ả ể đượ ọ ằ
2 ví d sau ây:ụ đ
M ng 1 chi uả ề :
L p trình C v C++ - Ch ng 6.H m v c u trúc ch ng trìnhậ à ươ à à ấ ươ
19
void f(int x[],int);
//======================
void main()
{clrscr();
int n=2;
int x[4]={1,2,3,4};
f(x,4);
getch();
}
//=======================
void f(int x[],int n)
{for(int i=0;i<n;i++)
printf("\n%d",x[i]);
return;
}
M ng 2 chi uả ề :
void f(int x[][2],int);
//======================
void main()
{clrscr();
int n=2;
int x[2][2]={1,2,3,4};
f(x,n);
getch();
}
//=======================
void f(int x[][2],int n)
{for(int i=0;i<n;i++)
{printf("\n");
for(int j=0;j<n;j++)
printf("%d ",x[i][j]);
}
return;
}
L p trình C v C++ - Ch ng 6.H m v c u trúc ch ng trìnhậ à ươ à à ấ ươ
20
Ch ng 7. Con tr , c p phát đ ng vươ ỏ ấ ộ à
h m à
7.1. Con tr v a ch ỏ à đị ỉ
Trong ch ng 2 chúng ta ã c p n lo i bi nươ đ đề ậ đế ạ ế
a ch . Trong ph n n y ta s kh o sát k h n m tđị ỉ ầ à ẽ ả ỹ ơ ộ
chút v n n y.ấ đề à
1. a ch v bi n con trĐị ỉ à ế ỏ
Liên quan n m t bi n ta ã có khái ni m:đế ộ ế đ ệ
- Tên bi nế
- Ki u bi nể ế
- Giá tr c a bi nị ủ ế
Ví d câu l nh ụ ệ
float a=12.5;
nh ngh a m t bi n có tên l a, ki u l th c vđị ĩ ộ ế à ể à ự à
nh n giá tr l 12.5. ậ ị à Ki u bi n v tên bi n sau khiể ế à ế
ã nh ngh a thì không th thay i, nh ng giáđ đị ĩ ể đổ ư
tr c a nó thì có th thay i ị ủ ể đổ b ng các l nh c aằ ệ ủ
ch ng trình. Ta bi t r ng m t bi n float chi m 4ươ ế ằ ộ ế ế
byte b nh . Khi bi n c khai báo thì 4 byte n yộ ớ ế đượ à
c ng c xác nh trong b nh . Ta bi t r ng cácũ đượ đị ộ ớ ế ằ
byte c a b nh u c ánh s v s th t c aủ ộ ớ đề đượ đ ố à ố ứ ự ủ
chúng c g i l a ch . T t nhiên a ch n yđượ ọ à đị ỉ ấ đị ỉ à
c máy t ng tính ra, ch không ánh s trênđượ ự độ ứ đ ố
các byte nh ánh s nh . V y khi khai báo m tư đ ố à ậ ộ
bi n thì a ch c a nó c xác nh. a ch c aế đị ỉ ủ đượ đị Đị ỉ ủ
các bi n tuy l s nguyên nh ng không c ánhế à ố ư đượ đ
ng v i các s nguyên bình th ng khác vì nó cóđồ ớ ố ườ
m t s c thù riêng. a ch c a m t bi n l m tộ ố đặ Đị ỉ ủ ộ ế à ộ
i l ng khá quan tr ng vì v y ng i ta nh ngh ađạ ượ ọ ậ ườ đị ĩ
thêm ki u bi n a ch d thao tác. Các bi n n yể ế đị ỉ để ễ ế à
c g i l các con tr , vì th c ra nó tr t i cácđượ ọ à ỏ ự ỏ ớ
vùng nh l u tr các bi n. M c d u a ch l m tớ ư ữ ế ặ ầ đị ỉ à ộ
khái ni m chung cho các bi n, nh ng các bi n conệ ế ư ế
tr l i c phân lo i theo ki u bi n m nó tr t i.ỏ ạ đượ ạ ể ế à ỏ ớ
Nh v y có bao nhiêu ki u d li u thì có b y nhiêuư ậ ể ữ ệ ấ
ki u con tr . C ng nh b t k m t bi n n o khác,ể ỏ ũ ư ấ ỳ ộ ế à
m t con tr c n khai báo tr c khi s d ng. Vi cộ ỏ ầ ướ ử ụ ệ
khai báo c th c hi n theo m u sau:đượ ự ệ ẫ
<ki u d li u m con tr tr n>* <tên con tr >;ể ữ ệ à ỏ ỏ đế ỏ
ho cặ
<ki u d li u m con tr tr n> *<tên con tr >;ể ữ ệ à ỏ ỏ đế ỏ
C 2 cách n y ho n to n t ng ng. Cách thả à à à ươ đươ ứ
nh t th ng c dùng khi khai báo nguyên m uấ ườ đượ ẫ
h m, vì khi ó ta ch khai báo ki u c a bi n, ch aà đ ỉ ể ủ ế ư
c n khai báo tên.ầ
Ta c ng có th dùng l nh typedef nh ngh aũ ể ệ đề đị ĩ
tr c m t ki u d li u con tr v khai báo bi n conướ ộ ể ữ ệ ỏ à ế
tr theo m u sau:ỏ ẫ
<Ki u bi n con tr > <tên con tr >;ể ế ỏ ỏ
Ví d :ụ
typedef double* pdouble;
Sau ó ta có th khai báo:đ ể
pdouble pa,pb;
L nhệ
int m, n, *p;
Khai báo 2 bi n nguyên m, n v 1 bi n con tr pế à ế ỏ
có ki u nguyên (t c l tr t i các bi n nguyên).ể ứ à ỏ ớ ế
L u ý r ng m c d u *p nh n giá tr nguyên nên vư ằ ặ ầ ậ ị ề
hình th c có th xem l nh khai báo trên l khai báo 3ứ ể ệ à
bi n nguyên m, n v *p. Tuy nhiên v n có s khácế à ẫ ự
bi t r t l n ây: trong b nh ch d nh ch choệ ấ ớ ở đ ộ ớ ỉ à ỗ
các bi n m, n v con tr p. M c d u con tr n yế à ỏ ặ ầ ỏ à
ch n vùng nh ch a giá tr nguyên, nh ng vùngỉ đế ớ ứ ị ư
n y ch a c b o m. N u vùng nh ch a *p bà ư đượ ả đả ế ớ ứ ị
thay i b i ch ng trình khác, v d m t ph nđổ ở ươ ị ụ ộ ầ
m m n o ó trong Windows ch ng h n, thì giá trề à đ ẳ ạ ị
*p b thay i theo. Ch khi ta c p phát b nh choị đổ ỉ ấ ộ ớ
các vùng con tr ch t i thì các vùng n y m i cỏ ỉ ớ à ớ đượ
b o m. Nh v y ta th y r ng n u dùng con tr taả đả ư ậ ấ ằ ế ỏ
ã t n hai l n b nh : b nh cho con tr v b nhđ ố ầ ộ ớ ộ ớ ỏ à ộ ớ
chúng ch t i.ỉ ớ
Vì con tr p có ki u a ch nguyên do ó n u cóỏ ể đị ỉ đ ế
m t bi n nguyên x n o ó thì phép gánộ ế à đ
p=&x
l ho n to n có ngh a. à à à ĩ
Sau phép gán n y thì giá tr x v *p ho n to n cóà ị à à à
th thay th nhau trong các bi u th c.ể ế ể ứ
Thí d ta có th thay l nhụ ể ệ
y=x+3
b ng l nhằ ệ
y= *p +3
2. Con tr NULLỏ
Khi khai báo m ch a s d ng (t c l ch a gán choà ư ử ụ ứ à ư
con tr m t giá tr a ch n o ó ã c c p phátỏ ộ ị đị ỉ à đ đ đượ ấ
b nh , ho c ch a c p phát b nh cho con tr ) thìộ ớ ặ ư ấ ộ ớ ỏ
con tr có th ch n m t vùng vu v n o ó trongỏ ể ỉ đế ộ ơ à đ
b nh . Vùng n y có th ch a s li u m ch ngộ ớ à ể ứ ố ệ à ươ
trình ang ho c s s d ng. có th a con trđ ặ ẽ ử ụ Để ể đư ỏ
ch a s d ng v v trí an to n ng i ta nh ngh aư ử ụ ề ị à ườ đị ĩ
con tr r ng, v i tên l NULL. Con tr NULL ch vỏ ỗ ớ à ỏ ỉ ề
a ch 0x0, t c l byte u tiên trong b nh . Ch cđị ỉ ứ à đầ ộ ớ ắ
ch n byte n y n m ngo i b t k phân o n b nhắ à ằ à ấ ỳ đ ạ ộ ớ
ã c p phát cho m t ch ng trình. đ ấ ộ ươ
3. H m có i l con trà đố à ỏ
Con tr có th l tham s c a m t h m. Khi g i h mỏ ể à ố ủ ộ à ọ à
nh v y thì i con tr ph i l bi n con tr ho cư ậ đố ỏ ả à ế ỏ ặ
a ch c a m t bi n n o ó. Khi ta g i h m v i ađị ỉ ủ ộ ế à đ ọ à ớ đị
ch c a m t bi n n o ó v trong ch ng trình n yỉ ủ ộ ế à đ à ươ à
ta dùng a ch thay i giá tr bi n thì ó l sđị ỉ để đổ ị ế đ à ự
thay i th c s , ngh a l khi ra kh i h m thì sđổ ự ự ĩ à ỏ à ự
thay i ó v n còn tác ng lên bi n.đổ đ ẫ độ ế
Ví dụ:
L p trình C v C++ - Ch ng 7. Con tr , c p phát ng v h mậ à ươ ỏ ấ độ à à
Trong ch ng tr c ta ã dùng ki u truy n tham sươ ướ đ ể ề ố
theo ki u tham chi u vi t h m trao i giá tr 2ể ế để ế à đổ ị
bi n. Bây gi ta s vi t h m ó b ng các dùng bi nế ờ ẽ ế à đ ằ ế
con tr .ỏ
void swap(float *px, float *py)
{float tmp=*px;
*px=*py;
*py=tmp;
}
Khi ó gi s trong ch ng trình chính có các dòngđ ả ử ươ
l nhệ
float x=2,y=3;
swap(&x,&y)
Thì giá tr c a x v y th c s c trao i choị ủ à ự ự đượ đổ
nhau.
B n c hãy suy ngh v tr l i xem vì sao n u trongạ đọ ĩ à ả ờ ế
h m trên ta vi t là ế à
void swap(float *px, float *py)
{float* tmp=px;
px=py;
py=tmp;
}
Thì th c ra ta ch a trao i c các giá tr x v yự ư đổ đượ ị à
khi g i swap(&x,&y);ọ
Tuy nhiên cách dùng tham chi u v n n gi n h n,ế ẫ đơ ả ơ
vì v y chúng tôi khuyên b n c l nói chung nênậ ạ đọ à
dùng ki u truy n tham chi u n u mu n gi l iể ề ế ế ố ữ ạ
nh ng thay i c a các bi n trong ch ng trình.ữ đổ ủ ế ươ
7.2. Con tr v m ng m t chi u ỏ à ả ộ ề
1. Phép toán l y a chấ đị ỉ
Ví d sau ây minh h a cho quan h gi a tên m ngụ đ ọ ệ ữ ả
v a ch m ngà đị ỉ ả
void main()
{clrscr();
float *px,x[]={1,2,3};
px=x;
printf("\n%f",*px);
printf("\n%f",*(px+1));
printf("\n%f",*(px+2));
getch();
}
K t qu l ế ả à
1
2
3
Nh v y n u px = x thì px+1 == &x[1], px+2 = =ư ậ ế
&x[2],
Chú ý:
Có th vi tể ế
float y[] = {1.2, 3.2, 4.3, 6.5};
Nh ng ư không th vi tể ế :
float *py = {1.2, 3.2, 4.3, 6.5};//Dòng l nh n y saiệ à
Nh ng ư v i chu i thì l i cớ ỗ ạ đượ :
char st1[]="123";
char st2[7]="123";
char *st="123";
2. H m v i i l m ng m t chi uà ớ đố à ả ộ ề
N u tham s hình th c c a h m l m ng m t chi uế ố ứ ủ à à ả ộ ề
có ki u l int, float, double, thì tham s t c có thể à ố ự ể
l con tr có ki u int, float, double, v ng c l i,à ỏ ể à ượ ạ
thí dụ
void f1(int *pa,float *pb);
cách khai báo n y t ng ng nh khai báo sau:à ươ đươ ư
void f1(int pa[],float pb[]);
3. M ng, con tr v xâu ký tả ỏ à ự
C ng gi ng nh tên m ng, xâu ký t l m t h ngũ ố ư ả ự à ộ ằ
a ch bi u th a ch u c a m ng ch a nó. Tuyđị ỉ ể ị đị ỉ đầ ủ ả ứ
nhiên nh chúng tôi ã nói t i, a ch u c a chu iư đ ớ đị ỉ đầ ủ ỗ
st c truy xu t b i &st, còn st thì c dùng đượ ấ ở đượ để
truy xu t to n b chu i.ấ à ộ ỗ
C p phát b nh :ấ ộ ớ
#include <stdlib.h>
void main()
{clrscr();
double *a,*b,*c;
a=new double [7];
b= (double*) malloc(7*sizeof(double));
c= (double*) calloc(7,sizeof(double));
*a=15;//Tức là a[0]=15;
int **q;
q=new int*;
*q=new int;
**q=10;// Tức là q[0][0]=10;
printf("\n%d",**q);
getch();
}
7.3. Con tr t i h m ỏ ớ à
Trong m t s b i toán th c t , nh t l các b i toánộ ố à ự ế ấ à à
kh o sát các h m s nh v th , tìm nghi m, taả à ố ư ẽ đồ ị ệ
th ng ph i l p ch ng trình liên quan n h m sườ ả ậ ươ đế à ố
f(x), trong ó f(x) l m t h m s có d ng t ng quát.đ à ộ à ố ạ ổ
tính toán trên f thì ta ph i bi t d ng c a f cĐể ả ế ạ ủ ụ
th , m n u ta l p trình cho tr ng h p c th thìể à ế ậ ườ ợ ụ ể
m i l n g p m t h m m i ta l i ph i s a ch ngỗ ầ ặ ộ à ớ ạ ả ử ươ
trình, nh th r t b t ti n. C cung c p cho chúng taư ế ấ ấ ệ ấ
m t công c gi i quy t v n n y: ó l conộ ụ để ả ế ấ đề à đ à
tr tr t i h m, m cách s d ng b n c có thỏ ỏ ớ à à ử ụ ạ đọ ể
nh n bi t c qua ch ng trình sau ây:ậ ế đượ ươ đ
//CHIADOI.CPP
L p trình C v C++ - Ch ng 7.Con tr , c p phát ng v h mậ à ươ ỏ ấ độ à à
22
/*Phuong phap chia doi de tim
nghiem*/
#include <dos.h>
#define epsix 1.0E-03
#define epsiy 1.0E-03
#define kmax 10
double g(double);
double h(double x);
int chiadoi(double (*f)
(double),double &x, double a, double
b, int kmax);
double g(double x)
{return sin(x)-x*x*cos(x);
}
//===================================
============
double h(double x)
{return x*x*x-x-1;
}
//===================================
============
//Ham de tim nghiem.
int chiadoi(double (*f)
(double),double &x, double a, double
b, int kmax)
{clrscr();
double c;int k;
k=0;
if(f(a)==0) {x=a;return true;}
if(f(b)==0) {x=b;return true;}
if(f(a)*f(b)>0)
{printf("\nf(a) va f(b) khong trai
dau",);delay(1000);return false;}
while(b-a>epsix)
{c = (a+b)/2;
if(fabs(f(c))<epsiy) break;//f(c)
= 0
if(f(a)*f(c)<0) b=c; else a=c;
k++;
if(k>kmax)
{printf("\n Lap chua hoi tu sau
%d buoc",k);
delay(1000);return false;
}
}
x=c;
return(true);
}
//===================================
============
void main()
{double x;
chiadoi(g,x,1.0,2.0,20);
printf("\nNghiem la: %f",x);
getch();
}
7.4. Kh n ng quy c a h m ả ă đệ ủ à
Trong phần định nghĩa của một hàm (tức là trong thân
hàm) có thể có lời gọi đến chính nó. Khả năng này
được gọi là khả năng đệ quy của hàm. Ví dụ ta có thể
định nghĩa hàm tính giai thừa của một số tự nhiên như
sau:
long gt(long n)
{return((n==0||n==1)?1:n*gt(n-1));
}
7.5. H m main có i à đố (tham kh o t i li u [2], ả à ệ
trang 198)
L p trình C v C++ - Ch ng 7.Con tr , c p phát ng v h mậ à ươ ỏ ấ độ à à
23