Tài liệu tổng quan về ngôn ngữ lập trình C và C ++ cũng như Ngôn ngữ lập trình và thuật toán, Hằng, biến và mảng, Biểu thức, Vào ra, Các toán tử điều khiển, Hàm và cấu trúc chương trình, Con trỏ, cấp phát động và hàm
Trang 1M 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
Trang 2Câu h i v b i t p ôn t p chu n b ỏ à à ậ ậ ẩ ị
cho thi h t môn ế 44
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 ộ ố ự
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
Trang 3ch 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ỉ ữ ọ à ả ữ
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úọ à
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ị ợ ữ ữ ợ
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: 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
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ìnhriêng bi t, ệ đồng th i có th cho ch y (ki m tra th )ờ ể ạ ể ử
Trang 4riê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 ỗ
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 ộ ố
Input: m,n nguyên dương
Output: g l à ướ ốc s chung l n nh t c a mớ ấ ủ
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ừ ụ
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
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");
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
Trang 5nhiê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
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("%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ĩ ủ à à à ầ
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
Trang 6nh 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 ạ ỗ ứ ể ả
Trang 7float 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
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ụ ẽ
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
011 = 90x11 = 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)ấ đ
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 achu 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";
Trang 8Tuy 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:ụ
#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");
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]ệ
char str2[]="Hai Phong";
char *str3="Tay Ho";
c a bi n a ch c a bi n có th nh n ủ ế Đị ỉ ủ ế ể ậ được b ngằ phép toán
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
Trang 9tr 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ả ử à ộ ỏ đ ẽ à ị
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],
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 ụ ệ
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ứ à ự ự ọ
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 ụ ộ
}
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
Trang 10ó 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ệ à
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.ọ à ế à
• 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
{static int i=1;
printf("%d ",i++);
}void main() {clrscr();
Trang 11>> :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ụ
Trang 12Ch ươ 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
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ạ ọ ặ ậ ỳ ộ ạ à
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
printf(" trong nam %4d",nam);
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.ỗ
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ắ ặ ế ặ ĩ
Trang 13Chú ý: 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 ư ể ễ ố ệ ắ
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ể à ấ
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
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
stdin stdout stderrstdaux stdprn
Standard input deviceStandard output deviceStandard error output deviceStandard auxiliary deviceStandard 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
Trang 14chỉ thấy chữa a mà thôi Nếu bây giờ ta sửa lại lệnh
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
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
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ừ stdinint 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
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
0x8f9fffee1231
L p trình C v C++ - Ch ậ à ươ ng 4.V o ra à 12
Trang 15Như 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ư
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
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
Trang 16Ch ươ ng 5 Các toán t đi u khi n ử ề ể
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
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
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;
<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;
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 ử đ ề ể
Trang 18Ch ươ 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 ể à ố
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à ậ ầ
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,ư ể ấ
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ỏ
v char *st; l ho n to n tà à à à ương đương Tuynhiê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ằngb=new int* [2];
lệnh (2) có thể thay bằngb[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 ử đ ề ể
Trang 19có d ng ở ạ đơn gi n l return; khi chả à ương trình g pặ
{case 2: return "Monday";
case 3: return "Tuesday";
case 4: return "Wednesday";
case 5: return "Thursday";
case 6: return "Friday";
case 7: return "Saturday";
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ứ ủ
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đ ề ệ đ ề ệ đ ỏ
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;
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
Trang 20thì 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à à ỏ à ế ạ
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
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
• 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)); ặ
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ìnhsau:
chương trình không có l nh n o l m thay ệ à à đổi giá trị
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ự à ủ à ẽ
L p trình C v C++ - Ch ậ à ươ ng 6.H m v c u trúc ch à à ấ ươ ng trình 18
Trang 21nó 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)
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ế ằ đị ĩ
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 ộ ị đổ itê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ó đ ộ ị ẽ
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ự ế ầ ố à à
Trang 22void f(int x[],int);
Trang 23Ch ươ ng 7 Con tr , c p phát đ ng v ỏ ấ ộ à
h m à 7.1 Con tr v a ch ỏ à đị ỉ
nh n giá tr l 12.5 ậ ị à Ki u bi n v tên bi n sau khi ể ế à ế
tr c a nó thì có th thay ị ủ ể đổ b ng các l nh c a i ằ ệ ủ
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à
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.ầ
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
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
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ộ ớ à ể ứ ố ệ à ươ ngtrì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
Ví dụ:
L p trình C v C++ - Ch ậ à ươ ng 7 Con tr , c p phát ỏ ấ độ ng v h m à à
Trang 24Trong 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ị
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
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();
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ỗ ầ ặ ộ à ớ ạ ả ử ươ ngtrì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
Trang 25/*Phuong phap chia doi de tim
nghiem*/
#include <dos.h>
#define epsix 1.0E-03
#define epsiy 1.0E-03
if(f(a)==0) {x=a;return true;}
if(f(b)==0) {x=b;return true;}
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ó à đố (tham kh o t i li u [2], i ả à ệtrang 198)
L p trình C v C++ - Ch ậ à ươ ng 7.Con tr , c p phát ỏ ấ độ ng v h m à à 23
Trang 26Sau khi ã nh ngh a ki u c u trúc theo m t trong 2đ đị ĩ ể ấ ộ
cách trên, ta có th khai báo m t ho c nhi u bi n cóể ộ ặ ề ế
8.2 Truy nh p ậ đế n th nh ph n c u trúc à ầ ấ
o n ch ng trình sau mô t cách truy nh p n
th nh ph n c u trúc:à ầ ấvoid main() {clrscr();
struct ngay {int day,month,year;}; struct ns
{char *ten;ngay ngsinh;int tuoi,luong;};
ns v;
v.ten="Nguyen Kien Cuong";
v.ngsinh.day=10;v.ngsinh.month=7;v.ngsinh.year=99;
v.tuoi=50;v.luong=500;
printf("\n%s", v.ten);
ns* pv;
pv=&v;
printf("\n%s", pv->ten);
//Hoac printf("\n%s",(*pv).ten);
L p trình C v C++ - Ch ậ à ươ ng 8 C u trúc ờ
Trang 27T *a; //the stack itself: a
dynamic array of T;
int max; //the maximum number
of elements on the stack
int top; //the element at the top
of stack top<=max-1
int delta; //Increment size
of storage array
int grow(); //Function to
increase Stack size
T viewtop();//return the element
at the top of stack
{int a:8; int b:6;int c:8;int d:2;} x;
Khi ó sizeof(date)= 3 byte đ
8.6 Union
Các th nh ph n c a union à ầ ủ được c p phát m t vùngấ ộ
nh chung.ớ
K thu t l p trình C - Ch ỹ ậ ậ ươ ng 8.C u trúc ấ 25
Trang 28Ch ươ ng 9 Thao tác trên t p ệ
Chương trình sau mô t các thao tác trên t p:ả ệ
//ZFILE.CPP
//===================================
==================================
/*Chuong trinh sau day dung, mo tep o
dang nhi phan, nhu vay ky tu
EOF khong dong nhat voi feof() Ky
tu EOF co the nam khoang giua
tep.Neu ta mo tep o dang van ban thi
chuong trinh hoat dong khong
dung vi may ly do:
- Khi doc duoc ky tu co ma ASCII la
10, thi chuong trinh tu dong them
ma 13 vao tep f2 Nhu vay tep f2
se them 1 byte
- Khi doc duoc ky tu c==EOF thi
chuong trinh cung hieu la feof(), va
dung qua trinh, nhu vay chi mot
phan tep duoc doc Vi voi tep van ban
thi ky tu ket thuc tep la EOF (Ky
tu EOF khong duoc tinh vao do lon
cua tep neu no duoc tu dong them
vao cuoi tep, nhu vay tep chi co mot
ky tu co do lon la 1 byte Con neu
ta doc ky tu EOF va ghi vao tep f2
sau do dong tep thi may tu dong
them mot ky tu EOF nua vao cuoi tep,
ky tu EOF do ta ghi vao duoc tinh
vao do lon tep va co hien thi khi
ta soan thao, con ky tu may them
vao thi khong tinh va khong hien
thi neu ta soan thao)
Neu ta mo tep o dang nhi phan nhung
lai thao tac nhu sau:
- Neu ta thay if(feof(f1)) break;
bang lenh if(c==EOF) break; thi cung
sai, vi voi tep nhi phan c==EOF
chua co nghia la feof()
- Neu ta thay lenh trong chuong
trinh bang lenh
while(!feof(f1))
fputc(fgetc(f1),f2);
thi cung sai, vi sau ky tu cuoi
cung feof() van nhan gia tri false
do do byte sau do ung voi feof()
van duoc doc va ghi sang f2
Chi sau do thi con tro tep f1 moi
o vi tri feof() Nhu vay tep f2
nhieu hon tep f1 1 byte
while(true) {c=fgetc(f1);
if(feof(f1)) break;
fputc(c,f2);
} fcloseall();
int mcase=2;//1-Text && Binary file, 2-Text file, 3-Binary file
FILE *f;int n,m,i,j;
switch(mcase) {case 1://Text and Binary Files clrscr();
f=fopen("vb.txt","wt");
fputc('A',f);fputc(EOF,f);fputc(10,f)
bo qua Neu mo tep theo kieu nhi phan thi ma 13 cung duoc doc
*/
clrscr();
f=fopen("vb.txt","wb");
fputc('A',f);fputc(EOF,f);fputc(10,f)
Trang 29Khi ghi vao tep nhi phan ma 10
thi ma 13 khong duoc chen vao
Khi copy tep ta phai mo tep theo
kieu nhi phan nhu chuong trinh
fcopy() tren day
Lenh rewind(f),unlink(<tentep>)
hay remove(<tentep>), fflush(f),
fflushall(), fcloseall() cung duoc
dung cho ca 2 loai Cac ham fseek,
ftell cung vay.Thi du doan chuong
trinh sau cho biet so byte cua tep
//Lenh fgets() doc n-1 ky tu cua
mot dong hoac ca dong vao bien str
n=0;//Dat lai gia tri n de dam bao
la n khong phai co tu truoc
f = fopen("DATA.TXT", "rt");
fscanf(f,"%d",&n);
float *x=new float [n+1];
float *y=new float [n+1];
printf("\n%4d%10.2f
%10.2f",i,x[i],y[i]);
getch();
//===================================
",i);scanf("%f",&a[i]);};
f = fopen("A.DAT","wb");//rt: read, r+t:read and write
fwrite(&n,sizeof(n),1,f);
for(i=0;i<n;i++) fwrite(&a[i],sizeof(a[i]),1,f);//sizeof(float)
fclose(f);
f = fopen("A.DAT","r+b");
rewind(f);//fseek(f,0,0);Tro ve dau tep;fseek(f,0,2);Ve cuoi tep //fseek(f,nbytes,0);Nhay qua nbytes byte bat dau tu dau tep //fseek(f,nbytes,1);Nhay qua nbytes byte bat dau tu vi tri hien thoi
//fseek(f,nbytes,2);Nhay qua nbytes byte bat dau tu cuoi tep //nbytes>0 nhay ve phia sau, <0 nhay lui ve phia truoc
K thu t l p trình C - Ch ỹ ậ ậ ươ ng 9 Thao tác trên t p ệ 27
Trang 30cout<<"\nNhap them bao nhieu so
char *fgets(char *s, int n, FILE *stream);
int fputs(const char *s, FILE *stream);
Remarks:
fgets reads characters from stream into the string s It stops when it
reads
either n - 1 characters or a newline character, whichever comes first
fgets retains the newline character at the end of s and appends a null byte
to s to mark the end of the string
fputs copies the null-terminated string s to the given output stream It
does not append a newline character, and the terminating null character is
fgets(s,255,f);
fgets(s,255,f);
for(j=0;j<strlen(s)-1;j++) tmp[i].ten[j]=s[j];
tmp[i].ten[j]='\0';
fscanf(f,"%d",&tmp[i].tuoi); }
for(i=0;i<n;i++) {cout<<endl<<tmp[i].ten;
cout<<endl<<tmp[i].tuoi;
} getch();
}
K thu t l p trình C - Ch ỹ ậ ậ ươ ng 9 Thao tác trên t p ệ 28
Trang 31Các tên h ng ằ Giá tr s ị ố video
LASTMODE -1 mode v n b n tră ả ướ đc ó
h ng (80 c t)à ộChú ý:
(maxco,1) l góc trên bên ph i, (1,25) l góc dà ả à ướ i
bên trái, (maxco,25) l góc dà ưới bên ph i.ả
YELLOW (v ng)à 14WHITE (tr ng)ắ 15Chú ý:
- Các h ng ằ đượ địc nh ngh a trong conio.h vĩ à
graphics.h
- Các h m trên ây không l m thay à đ à đổi m u s c c aà ắ ủ các c a s v các dòng ch ã có t trử ố à ữ đ ừ ước trên m nà hình
c a s thì m n hình ử ổ à được coi nh thu nh v c aư ỏ ề ử
s ổ đố ới v i các l nh ệ clrscr, gotoxy, cprintf, cscanf, cgets, cputs V y ví trí góc bên trái c a c a s bâyậ ủ ử ổ
Trang 32for(i=y1+1;i<y2;i++) {gotoxy(x1,i);putch('³');
gotoxy(x2,i);putch('³');
};
}//===================================
gotoxy(x1,y2);putch('ẩ');
for(i=x1+1;i<x2;i++) putch('Í');putch('ẳ');
for(i=y1+1;i<y2;i++) {gotoxy(x1,i);putch('º');
gotoxy(x2,i);putch('º');
};
}//===================================
==========
void menu(int n) {int maxlen=0,i;char ch;
for(i=0;i<n;i++) if(strlen(pmenu[i])>maxlen) maxlen=strlen(pmenu[i]);
static int dong=0;
while(1) {textmode(C80);
window(1,1,80,25);
textbackground(BLUE);
clrscr();int maxlen)/2,y1=(25-n)/2;
x1=(80-K thu t l p trình C - Ch ỹ ậ ậ ươ ng 10.Qu n lý m n hình v n b n ả à ă ả 30
Trang 33pmenu[1]="Kiem tra so lieu";
pmenu[2]="In bao cao ";
Trang 34Ch ươ ng 11 Đồ ọ h a
Trong chương n y s gi i thi u m t s h m à ẽ ớ ệ ộ ố à để ẽ v
các đường v hình c b n nh à ơ ả ư đường tròn, cung
elip, hình qu t, ạ đường g p khúc, hình a giác,ấ đ
m n hình à đượ đc ánh s t trái sang ph i v t trênố ừ ả à ừ
xu ng dố ưới Trong ch ế độ bình thường thì m nà
<đường d n> l ẫ à đường d n ẫ đến th m c BGI ch aư ụ ứ
các t p tin *bgi i u khi n ệ đ ề ể đồ ọ h a v các t p tinà ệ
initgraph(&mh,&mhmode,"\\TC\\BGI");
<Các l nh x lý m n hình ệ ử à đồ ọ h a>
}Khi ta đặt không úng các tham s , thí d đ ố ụ đặt sai
ng d n ch ng h n, thì ch ng trình c ng không
thông báo gì c Khi ta b t ả ắ đầu dùng ch ế độ đồ ọ h athí d v m t vòng tròn thì chụ ẽ ộ ương trình c ngũ không báo l i nh thông thỗ ư ường m ch hi n dòngà ỉ ệthông báo trên m n hình:à
BGI Error: Graphics not initialized (use 'initgraph')Tuy nhiên ta có th ki m tra k t qu kh i t o b ngể ể ế ả ở ạ ằ
h m graphresult() H m graphresult()==0 có ngh a là à ĩ à
vi c kh i t o th nh công ch ệ ở ạ à ở ế độ ă v n b n h mả à graphresult() c ng b ng 0, do ó ta ch nên ki m traũ ằ đ ỉ ể
h m n y sau khi dùng l nh initgraph o n chà à ệ Đ ạ ươ ngtrình trên ây có th s a l i có thêm ph n ki m trađ ể ử ạ ầ ể
vi c kh i t o ệ ở ạ đồ ọ h a nh sau:ư
#include <graphics.h>
void main() {int mh=DETECT, mhmode;
thướ ớc l n, chi u ngang có 320 i m, chi u ề đ ể ề đứng có
200 i m nh M n hình VGA có đ ể ả à độ phân gi i caoả
h n: m i h ng có 640 i m nh ơ ỗ à đ ể ả đượ đc ánh s tố ừ
L p trình C v C++ - Ch ậ à ươ ng11 Đồ ọ h a
Trang 35Các h m getmaxx()+1, getmaxy()+1 cho s i m nhà ố đ ể ả
theo chi u ngang v chi u ề à ề đứng trong m n hình choà
dù có m t viewport n o ó ang ộ à đ đ được kích ho t ạ
11.3 V hình trong m n hình ẽ à đồ ọ h a
M n hình à đồ ọ h a g m nhi u i m nh ồ ề đ ể ả được s pắ
x p trên các ế đườg th ng n m ngang v th ng ằ ằ à ẳ đứng
Nguyên t c chung ắ để hi n th hình nh trên m nể ị ả à
trên m n hình Tuy nhiên vi c v theo ki u n y t nà ệ ẽ ể à ố
r t nhi u công s c, do ó ngấ ề ứ đ ười ta ã nh ngh ađ đị ĩ
nhi u h m tr giúp v các ề à ợ ẽ đường v các hình cà ơ
Các m u tô ẫ (pattern) thường dùng