1. Trang chủ
  2. » Công Nghệ Thông Tin

Tổng quan về C và C++

71 394 0
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Tổng quan về C và C++
Trường học Đại học Bách Khoa Hà Nội
Chuyên ngành Lập trình và phát triển phần mềm
Thể loại Tổng quan
Thành phố Hà Nội
Định dạng
Số trang 71
Dung lượng 0,98 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

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 1

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

Trang 2

Câ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 3

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ỉ ữ ọ à ả ữ

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 4

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 ỗ

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 5

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

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 6

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 ạ ỗ ứ ể ả

Trang 7

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

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 8

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:ụ

#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 9

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ả ử à ộ ỏ đ ẽ à ị

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 12

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

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 13

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 ư ể ễ ố ệ ắ

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 14

chỉ 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 15

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ư

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 16

Ch ươ 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 18

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 ể à ố

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 19

có 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 20

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à à ỏ à ế ạ

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 21

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)

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 22

void f(int x[],int);

Trang 23

Ch ươ 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 24

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ị

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 26

Sau 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 27

T *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 28

Ch ươ 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 29

Khi 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 30

cout<<"\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 31

Cá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 32

for(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 33

pmenu[1]="Kiem tra so lieu";

pmenu[2]="In bao cao ";

Trang 34

Ch ươ 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 35

Cá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

Ngày đăng: 14/06/2014, 22:32

HÌNH ẢNH LIÊN QUAN

Hình   đồ   th   l   hi n   các   i m   v i   các   m u   khác ị à ệ đ ể ớ à - Tổng quan về C  và C++
nh đồ th l hi n các i m v i các m u khác ị à ệ đ ể ớ à (Trang 35)

TỪ KHÓA LIÊN QUAN

w