Dòng 1: #include : bï lánh tiÃn xċ lý, thông báo cho trình biên dách C đã thêm táp tiêu đà stdio.h trong ch¤¢ng trình tr¤ñc khi biên dách mã nguén, stdio là các chuÁn đ¿u vào/đ¿u ra, cho
Trang 1Bî GIAO THÔNG VÀN TÀI
TR£òNG Đ¾I HâC CÔNG NGHÈ GIAO THÔNG VÀN TÀI
LÊ CHÍ LU ÀN (Chă biên)
GIÁO TRÌNH
NHÀ XUÂT BÀN KHOA HâC TĎ NHIÊN VÀ CÔNG NGHà
Trang 3M ĀC LĀC
DANH M ĀC BÀNG 12
DANH M ĀC HÌNH 13
DANH M ĀC CHĊ VIÀT TÂT 14
L òI NÓI ĐÄU 15
Ch¤¢ng 1 CÁC KHÁI NI ÈM C¡ BÀN CĂA NGÔN NGĊ C 21
1.1 GIðI THIàU NGÔN NGČ C 21
1.1.1 Lách sċ ngôn ngč lÁp trình C 21
1.1.2 Các tính chÃt cąa ngôn ngč C 22
1.2 TÀP KÝ TĎ HĀP Là TRONG C 23
1.2.1 TÁp ký tď 23
1.2.2 Tĉ khóa 24
1.2.3 Đánh danh 24
1.3 MîT Sæ QUY £ðC KHI VIÀT CH£¡NG TRÌNH 25
1.3.1 Ch¤¢ng trình đ¿u tiên 25
1.3.2 CÃu trúc ch¤¢ng trình viÁt trong C 26
1.3.2.1 Ph ần tài liệu 28
1.3.2.2 Phần liên kết (Bao hàm tệp) 29
1.3.2.3 Ph ần định nghĩa marco 30
1.3.2.4 Khai báo nguyên m ẫu 31
1.3.2.5 Ph ần định nghĩa các cấu trúc 31
1.3.2.6 Định nghĩa hàm 32
1.3.2.7 Hàm main() 32
1.3.2.8 Câu l ệnh 33
1.3.2.9 Chú thích 34
1.3.3 Trình tď các b¤ñc thďc thi mït ch¤¢ng trình viÁt bÁng C 35
1.4 KIÄU DČ LIàU TRONG C 37
1.4.1 KiÅu dč liáu nguyên thąy 39
Trang 41.4.1.1 Ki ểu ký tự 39
1.4.1.2 Kiểu nguyên 39
1.4.1.3 Ki ểu thực 39
1.4.1.4 Ki ểu void 40
1.4.2 KiÅu dč liáu d¿n xuÃt 40
1.4.2.1 B ổ từ signed và unsigned 41
1.4.2.2 B ổ từ short và long 42
1.4.3 KiÅu dč liáu do ng¤ói dùng đánh ngh*a 43
1.5 BIÀN VÀ HÀNG 43
1.5.1 BiÁn 43
1.5.1.1 Định nghĩa 43
1.5.1.2 Khai báo bi ến 44
1.5.1.3 Khai báo và kh ởi tạo giá trị cho các biến 44
1.5.1.4 Ph ạm vi của biến 45
1.5.2 HÁng 46
1.5.2.1 Định nghĩa 46
1.5.2.2 Khai báo h ằng sử dụng từ khóa const 48
1.5.2.3 Khai báo h ằng sử dụng chỉ thị #define 48
1.5.2.4 Phân lo ại hằng 49
1.6 BIÄU THĆC VÀ PHÉP TOÁN 51
1.6.1 Toán tċ gán 51
1.6.2 Ép kiÅu dč liáu 51
1.6.3 BiÅu thćc 53
1.6.3.1 Định nghĩa biểu thức 53
1.6.3.2 Bi ểu thức số học 53
1.6.3.3 Bi ểu thức logic 54
1.6.3.4 Biểu thức điều kiện 55
1.6.4 Các toán tċ 55
1.6.4.1 Toán t ử số học 56
1.6.4.2 Toán t ử quan hệ 57
Trang 51.6.4.3 Toán t ử logic 59
1.6.4.4 Toán tử tăng giảm 60
1.6.4.5 Toán t ử gán 62
1.6.4.6 Toán t ử bit 63
1.7 MîT Sæ TOOL SĊ DĂNG 68
1.7.1 Turbo C 68
1.7.1.1 G ọi Turbo C 68
1.7.1.2 So ạn thảo ch°¡ng trình mới 69
1.7.1.3 Ghi ch°¡ng trình đang soạn thảo vào đĩa 71
1.7.1.4 Th ực hiện ch°¡ng trình 72
1.7.1.5 Ch ạy ch°¡ng trình 72
1.7.2 DevC 72
1.7.2.1 So ạn thảo ch°¡ng trình C bằng DevC++ 72
1.7.2.2 Th ực hiện ch°¡ng trình 74
BÀI TÀP CH£¡NG 1 76
A BÀI TÀP CÓ LòI GIÀI 76
B BÀI TÀP TĎ GIÀI 80
Ch¤¢ng 2 CÁC L ÈNH NHÀP - XUÂT DĊ LIÈU TRONG C 89
2.1 NHÀP XUÂT DČ LIàU 89
2.1.1 Hàm kÁt xuÃt dč liáu printf() 89
2.1.2 Hàm nhÁp liáu scanf() 96
2.1.3 Hàm đãc và ghi táp trong C 102
2.1.3.1 Hàm fprintf() 102
2.1.3.2 Hàm fscanf() 103
2.2 HÀM NHÀP/XUÂT KÍ TĎ VÀ DÒNG VÀO STDIN 104
2.2.1 Dòng vào stdin 104
2.2.1.1 Hàm gets() 105
2.2.1.2 Hàm getchar() 107
2.2.2 Các hàm xuÃt ký tď puts(), putchar() 110
2.2.2.1 Hàm puts() 110
Trang 62.2.2.2 Hàm putchar() 111
2.2.3 Các hàm vào ra trên màn hình, bàn phím 112
2.2.3.1 Hàm getch() 112
2.2.3.2 Hàm getche() 113
2.2.3.3 Hàm putch() 114
2.2.3.4 Hàm kbhit() 115
2.3 MîT Sæ VÍ DĂ 115
BÀI TÀP CH£¡NG 2 118
A BÀI TÀP CÓ LòI GIÀI 118
B BÀI TÀP TĎ GIÀI 123
Ch¤¢ng 3 CÁC C ÂU TRÚC PHÂN NHÁNH VÀ VÒNG L¾P 125
3.1 CÂU TRÚC PHÂN NHÁNH 126
3.1.1 Câu lánh điÃu kián If 126
3.1.1.1 Câu l ệnh điều kiện dạng khuyết 126
3.1.1.2 Câu l ệnh điều kiện đầy đủ 129
3.1.1.3 Câu l ệnh điều kiện else… if 131
3.1.1.4 Câu l ệnh điều kiện lồng nhau 135
3.1.2 CÃu trúc switch 144
3.1.3 Toán tċ goto và nhãn 152
3.1.3.1 Cú pháp 152
3.1.3.2 Ho ạt động 152
3.2 CÂU TRÚC VÒNG LÀP (FOR, WHILE, DO& WHILE) 156
3.2.1 CÃu trúc vòng lÁp For 157
3.2.1.1 Cú pháp 157
3.2.1.2 Ho ạt động 157
3.2.1.3 S¡ đồ khối 158
3.2.2 CÃu trúc vòng lÁp while 167
3.2.2.1 Cú pháp 167
3.2.2.2 Ho ạt động 168
3.2.2.3 S¡ đồ khối 168
Trang 73.2.3 CÃu trúc vòng lÁp do & while 173
3.2.3.1 Cú pháp 173
3.2.3.2 Ho ạt động 173
3.2.3.3 S¡ đồ khối 173
3.3 CÂU LàNH BREAK, CONTINUE 184
3.3.1 Câu lánh break 184
3.3.2 Câu lánh continue 186
BÀI TÀP CH£¡NG 3 188
A BÀI TÀP CÓ LòI GIÀI 188
B BÀI TÀP TĎ GIÀI 204
Ch¤¢ng 4 HÀM 211
4.1 KHÁI NIàM HÀM 211
4.1.1 Khái niám 211
4.1.1.1 Định nghĩa 211
4.1.1.2 Phân lo ại hàm 213
4.1.1.3 ¯u điểm của hàm do ng°ời dùng định nghĩa 214
4.1.1.4 Cách xác định một hàm 214
4.1.2 Khai báo hàm 214
4.1.2.1 C ấu trúc ch°¡ng trình chứa hàm 214
4.1.2.2 Khai báo hàm 215
4.2 SĊ DĂNG HÀM 218
4.2.1 Vá trí viÁt hàm 218
4.2.2 Lói gãi hàm và truyÃn tham sç 219
4.2.2.1 L ời gọi hàm 219
4.2.2.2 Truy ền tham số 221
BÀI TÀP CH£¡NG 4 259
A BÀI TÀP CÓ LòI GIÀI 259
B BÀI TÀP TĎ GIÀI 272
C h¤¢ng 5 MÀNG VÀ CON TRä 275
5.1 MÀNG 275
Trang 85.1.1 MÁng mït chiÃu 275
5.1.1.1 Khai báo mảng 275
5.1.1.2 Truy c ập các phần tử của mảng 276
5.1.1.3 Các d ạng bài tập mảng một chiều 278
5.1.2 MÁng hai chiÃu 297
5.1.2.1 Khai báo m ảng hai chiều 297
5.1.2.2 Truy c ập đến phần tử của mảng hai chiều 299
5.1.2.3 Các d ạng bài tập mảng một chiều 300
5.2 CON TRä 314
5.2.1 Đáa chß trong C 315
5.2.2 Khai báo con trå 317
5.2.3 Mçi quan há giča con trå và mÁng 323
5.2.4 Con trå và hàm 326
5.2.5 QuÁn lý bï nhñ đïng 328
5.2.5.1 Hàm malloc() 329
5.2.5.2 Hàm calloc() 329
5.2.5.3 Phân bi ệt giữa malloc() và calloc() 329
5.2.5.4 Hàm free() 330
5.2.6 Mït sç bài tÁp sċ dăng con trå 332
5.3 CHUìI KÝ TĎ 334
5.3.1 Đánh ngh*a 334
5.3.2 Khai báo 337
5.3.2.1 Khai báo b ằng mảng 337
5.3.2.2 Khai báo và kh ởi tạo giá trị 337
5.3.2.3 Khai báo b ằng con trỏ 338
5.3.3 Thao tác nhÁp xuÃt chuíi ký tď 339
5.3.3.1 Nhập xuất chuỗi ký tự 339
5.3.3.2 Xu ất chuỗi ký tự ra màn hình 341
5.3.4 Các hàm xċ lý chuíi ký tď c¢ bÁn 343
5.3.4.1 Hàm xác định độ dài chuỗi 343
Trang 95.3.4.2 Hàm so sánh hai chu ỗi ký tự 345
5.3.4.3 Hàm sao chép chuỗi 348
5.3.4.4 Hàm ghép chu ỗi 351
5.3.4.5 Hàm xác định chuỗi nghịch đảo 355
5.3.4.6 Chuy ển đổi ký tự hoa sang ký tự th°ờng và ng°ợc lại 359
5.3.4.7 Tóm t ắt các hàm trong th° viện string.h 362
5.3.5 Mït sç d¿ng bài tÁp và chuíi ký tď 363
BÀI TÀP CH£¡NG 5 372
A BÀI TÀP CÓ LòI GIÀI 372
B BÀI TÀP TĎ GIÀI 412
CH£¡NG 6 KI ÄU CÂU TRÚC 421
6.1 ĐàNH NGH)A 421
6.1.1 Khai báo kiÅu cÃu trúc 421
6.1.2 Truy cÁp đÁn các thành ph¿n cąa kiÅu cÃu trúc 424
6.1.3 Khõi t¿o kiÅu cÃu trúc 429
6.1.4 Khai báo vñi tĉ khóa typedef 430
6.1.5 Phép gán các biÁn cùng có kiÅu cÃu trúc 432
6.1.6 CÃu trúc léng nhau 434
6.1.6.1 Định nghĩa cấu trúc riêng biệt 434
6.1.6.2 Định nghĩa cấu trúc nhúng 434
6.1.6.3 Truy c ập đến thành phần của cấu trúc lồng 435
6.1.6.4 Minh họa cấu trúc lồng 435
6.1.7 CÃu trúc đ¤āc sċ dăng nh¤ mït tham sç cąa hàm 436
6.1.8 CÃu trúc và con trå 437
6.2 MÀNG CÂU TRÚC 439
6.2.1 Đánh ngh*a mÁng cÃu trúc 442
6.2.2 CÃp phát bï nhñ đïng cho kiÅu cÃu trúc 445
6.2.3 Mït sç d¿ng bài tÁp vñi cÃu trúc 446
6.3 CASE STYDY 462
6.3.1 Phát biÅu bài toán 462
Trang 106.3.2 H¤ñng giÁi quyÁt vÃn đà 462
6.3.2.1 Lựa chọn cấu trúc dữ liệu để giải quyết bài toán 462
6.3.2.2 Gi ải quyết vấn đề 475
BÀI TÀP CH£¡NG 6 488
A BÀI TÀP CÓ LòI GIÀI 488
B BÀI TÀP TĎ GIÀI 493
CH£¡NG 7 T ÈP 499
7.1 KHÁI NIàM VÂ TàP TIN 499
7.1.1 Khái niám táp 499
7.1.2 Phân lo¿i táp 500
7.1.2.1 T ệp văn bản 500
7.1.2.2 T ệp nhị phân 500
7.2 THAO TÁC XĊ LÝ VðI TàP 500
7.2.1 Các thao tác vñi táp tin 500
7.2.2 Khai báo táp tin 501
7.2.3 Mõ táp tin 501
7.2.4 Đóng táp 503
7.2.5 Đãc và ghi vñi táp văn bÁn 503
7.2.6 Đãc và ghi táp nhá phân 506
7.2.6.1 Ghi vào t ệp nhị phân 506
7.2.6.2 Đọc nội dung từ tệp nhị phân 507
7.2.6.3 Lấy dữ liệu với hàm fseek() 508
7.2.7 Mït sç hàm khác đ¤āc sċ dăng đÅ xċ lý táp 512
7.2.7.1 Hàm fputs() 512
7.2.7.2 Hàm fgets() 513
7.2.7.3 Hàm fputc() 513
7.2.7.4 Hàm fgetc() 514
7.3 MîT Sæ VÍ DĂ VÂ TàP 515
BÀI TÀP CH£¡NG 7 532
A BÀI TÀP CÓ LòI GIÀI 532
Trang 11B BÀI TÀP TĎ GIÀI 549
CH£¡NG 8 Đè HâA 555
8.1 GIðI THIàU 555
8.1.1 Ch¤¢ng trình đ¿u tiên 555
8.1.2 GiÁi thích và các lánh 555
8.2 CÁC HÀM Đè HâA 557
8.2.1 ThiÁt lÁp chÁ đï đé hãa 557
8.2.2 ThiÁt lÁp màu s¿c 558
8.2.3 Các hàm đé hãa đÅ v¿ hình 560
8.3 MîT Sæ VÍ DĂ 564
BÀI TÀP CH£¡NG 8 577
A BÀI TÀP CÓ LòI GIÀI 577
B BÀI TÀP TĎ GIÀI 579
PHĂ LĂC 1: TĈ KHÓA TRONG C 581
PHĂ LĂC 2: TêNG HĀP MîT Sæ TH£ VIàN C CHUÀN 583
PHĂ LĂC 3: BÀNG MÃ ASCII 587
PHĂ LĂC 4: MĆC Đî £U TIÊN CĄA CÁC TOÁN TĊ 588
PHĂ LĂC 5: MÃ ĐàNH D¾NG 589
TÀI LIàU THAM KHÀO 591
Trang 12DANH MĀC BÀNG
B ảng 1.1 Các kiểu dữ liệu - kích th°ớc và phạm vi 38
B ảng 1.2 Kiểu dữ liệu char 42
B ảng 1.3 Hằng ký tự đặc biệt 50
B ảng 1.4 Toán tử số học 56
B ảng 1.5 Toán tử quan hệ 57
B ảng 1.6 Toán tử logic 59
B ảng 1.7 Toán tử tăng giảm 60
B ảng 1.8 Toán tử gán 62
B ảng 1.9 Các toán tử bit 63
B ảng 1.10 Bù 2 của một số nguyên 66
B ảng 1.11 Các phím di chuyển con trỏ 69
B ảng 1.12 Các phím xóa ký tự 70
B ảng 1.13 Các phím chèn ký tự/dòng 70
B ảng 1.14.Tổ hợp phím xử lý khối 70
B ảng 1.15 Một số phím khác 71
B ảng 2.1 Mã định dạng t°¡ng ứng với các kiểu dữ liệu 97
B ảng 2.2 Danh sách các tệp tiêu chuẩn 104
B ảng 7.1 Mở tệp tin trong chế độ chuẩn I/O 502
B ảng 8.1 Bảng màu đ°ợc sử dụng trong ch°¡ng trình đồ họa 559
B ảng 8.2.Các hàm trong Graphics.h đ°ợc sử dụng để vẽ đồ hoạ 561
Trang 13DANH MĀC HÌNH
Hình 1.1 Quá trình th ực thi ch°¡ng trình 36
Hình 1.2 Các ki ểu dữ liệu của ngôn ngữ C 37
Hình 1.3 D ịch trái 1 bit 67
Hình 1.4 D ịch phải 1 bit 67
Hình 1.5 Giao di ện màn hình của Turbo C 69
Hình 1.6 Kh ởi động soạn thảo ch°¡ng trình C bằng DevC++ 73
Hình 1.7 Màn hình New Project 73
Hình 1.8 Màn hình so ạn thảo ch°¡ng trình C bằng DevC++ 74
Hình 1.9 Màn hình khi biên d ịch thành công 75
Hình 1.10 Màn hình k ết quả 75
Hình 3.1 Phân c ấp các câu lệnh trong ch°¡ng trình C 125
Hình 3.2 S¡ đồ khối biểu diễn câu lệnh if dạng khuyết 127
Hình 3.3 S¡ đồ khối biểu diễn câu lệnh if đầy đủ 130
Hình 3.4 S¡ đồ khối biểu diễn câu lệnh else if 132
Hình 3.5 S¡ đồ khối biểu diễn câu lệnh if else lồng nhau 136
Hình 3.6 S¡ đồ khối biểu diễn câu lệnh switch 145
Hình 3.7 S¡ đồ khối biểu diễn vòng lặp for 158
Hình 3.8 S¡ đồ khối biểu diễn vòng lặp while 168
Hình 3.9 Chuy ển số thập phân sang số nhị phân 172
Hình 3.10 S¡ đồ khối biểu diễn vòng lặp do… while 173
Hình 4.1 Minh h ọa cách thức thực thi hàm functionName() 215
Hình 4.2 Minh h ọa cách truyền tham số 220
Trang 15LòI NÓI ĐÄU
Năm 2016, C là ngôn ngč lÁp trình ho¿t đïng m¿nh thć 8 trên GitHub xÁp sau các ngôn ngč nh¤ Javascript, Java, Python, Ruby, PHP, C#, C++ Tuy nhiên, GitHub ch¤a phÁi là hình Ánh chính xác nhÃt đÅ đánh giá bõi GitHub luôn thiên vá vñi nhčng ngôn ngč mã nguén mõ và hāp thói Trên thďc tÁ, t¿p chí IEEE Spectrum xÁp ngôn ngč C nh¤ là ngôn ngč hàng đ¿u trong năm 2017 tr¤ñc cÁ Java, C # và Javascript Có mït sç lý do đÅ các b¿n sinh viên nên b¿t đ¿u vñi ngôn ngč lÁp trình C Thć nhÃt, C là ngôn ngč cÃp thÃp so vñi ngôn ngč trìu t¤āng khác B¿n có thÅ viÁt mã g¿n gũi vñi ph¿n cćng và trďc tiÁp điÃu khiÅn bï nhñ MÁc dù đây là mït trong nhčng ph¿n khiÁn ng¤ói hãc khó hãc C nh¤ng
đó cũng chính là lý do t¿i sao các lÁp trình viên ngôn ngč này có xu h¤ñng phù hāp h¢n vñi cách ho¿t đïng cąa máy tính ĐÅ viÁt mã C tçt, b¿n c¿n suy ngh* nh¤ máy tính
Thć hai, nhiÃu lÁp trình viên nói rÁng: Khi đã biÁt mït ngôn ngč lÁp trình, b¿n s¿ biÁt tÃt cÁ nhčng ngôn ngč khác nča Câu nói này có vẻ đúng, đÁc biát là đçi vñi ngôn ngč C Ví dă, viác hãc tĉ ngôn ngč cÃp thÃp nh¤ C sang mït ngôn ngč cÃp cao h¢n nh¤ Python, Ruby khá dß dàng nh¤ng đÅ hãc ng¤āc l¿i thì không hà đ¢n giÁn BÁng cách hãc C, b¿n chą yÁu s¿ hãc các nÃn tÁng cąa ngôn ngč lÁp trình hián đ¿i NÁu b¿n thďc sď hiÅu C, b¿n s¿ có thÅ hãc bÃt cć ngôn ngč nào khác mït cách dß dàng bõi h¿u hÁt các ngôn ngč hián đ¿i th¤óng cao cÃp h¢n C
Lý do thć ba, h¿u hÁt các ngôn ngč hián đ¿i đÃu đ¤āc sinh ra đÅ đáp ćng nhčng thiÁu sót cąa ngôn ngč khác: ngôn ngč C++ ra đói đáp ćng nhčng thiÁu sót cąa ngôn ngč C, tiÁp theo sď ra đói cąa Java đáp ćng nhčng điÅm ch¤a hoàn thián cąa C++ và C# ra đói đÅ cÁi thián Java v.v
Vì thÁ bÁng cách hãc C, b¿n có thÅ hiÅu rõ lý do t¿i sao mït sç ngôn ngč đ¤āc thiÁt kÁ theo cách đó và có khÁ năng đánh giá tçt h¢n và sď tián lāi
mà các ngôn ngč cao h¢n cung cÃp
Lý do thć t¤, h¿u hÁt các ngôn ngč lÁp trình hián đ¿i đÃu đ¤āc sċ dăng cho ba măc đích, đó là các ćng dăng kinh doanh, các ćng dăng web
và di đïng, cuçi cùng là phân tích dč liáu Tuy nhiên, nÁu b¿n muçn phát triÅn ph¿n mÃm đ¤āc kÁt nçi trďc tiÁp vñi ph¿n cćng, b¿n s¿ c¿n mït ngôn ngč thÃp h¢n - và C là ngôn ngč đ¤āc sċ dăng nhiÃu nhÃt Các ćng dăng đáng chú ý bao gém há điÃu hành, ngôn ngč lÁp trình, trình biên
Trang 16dách, các há thçng nhúng, v.v Chẳng h¿n, Linux kernel đ¤āc viÁt bÁng ngôn ngč C và Assembly Các ngôn ngč phë biÁn nh¤ Python, PHP, Perl
và Ruby đÃu đ¤āc thďc hián trong C ThÁm chí, C cũng đ¤āc viÁt bÁng chính nó Bõi nhiÃu há thçng nhúng có giñi h¿n tài nguyên nghiêm ngÁt nên C th¤óng là ngôn ngč đ¤āc lďa chãn nhiÃu nhÃt vì tçn ít chi phí Trong ch¤¢ng trình môn hãc cąa ngành Há thçng thông tin và mñi nhÃt là ngành Công nghá thông tin, C là môn hãc đ¤āc đ¤a vào sñm nhÃt
đÅ giÁng d¿y nÃn tÁng lÁp trình cho sinh viên cąa khoa Công nghá thông tin, Tr¤óng Đ¿i hãc Công nghá Giao thông vÁn tÁi
Vì nhčng lý do đó, nhóm tác giÁ vñi sď nhiát huyÁt cąa mình, vñi kinh nghiám đã giÁng d¿y môn hãc nhiÃu năm cho các thÁ há sinh viên tĉ K64 đÁn K68 ngành Há thçng thông tin đã biên so¿n cuçn <Giáo trình Ngôn ngč lÁp trình C= Giáo trình nhÁm cung cÃp nhčng kiÁn thćc nÃn tÁng cąa mït ngôn ngč đã có tĉ lâu đói, là nÃn tÁng, cïi nguén cąa các ngôn ngč hián đ¿i ngày nay, đÅ tĉ đây nhóm tác giÁ hy vãng các b¿n sinh viên có thÅ l*nh hïi và làm chą kiÁn thćc và mït ngôn ngč lÁp trình nào
đó mà mình theo đuëi, là hành trang trên giÁng đ¤óng đ¿i hãc và lÁp nghiáp sau này
Giáo trình gém 8 ch¤¢ng:
CH£¡NG 1: CÁC KHÁI NIàM C¡ BÀN CĄA NGÔN NGČ C
Một số vấn đề trọng tâm đ°ợc trình bày trong Ch°¡ng 1 bao gồm:
nghĩa của từng từ Ngoài ra, Ch°¡ng 1 còn giới thiệu cấu trúc, thành
CH£¡NG 2: CÁC LàNH NHÀP - XUÂT DČ LIàU TRONG C
liệu vào ch°¡ng trình để xử lý và đ°a dữ liệu sau khi xử lý ra ngoài Ch°¡ng 2, đề cập đến các lệnh đ°ợc sử dụng để đ°a dữ liệu từ bàn phím
chuỗi ký tự, có thể là dữ liệu dạng số nguyên, số thực, v.v Vì vậy một nội
Trang 17dung khá quan tr ọng của Ch°¡ng 2, giới thiệu các mã định dạng, để đ°a
CH£¡NG 3: CÁC CÂU TRÚC PHÂN NHÁNH VÀ VÒNG LÀP
Hầu hết các ngôn ngữ lập trình đều cố gắng diễn đạt các hoạt động
nào viết tr°ớc thì đ°ợc xử lý tr°ớc, thứ hai là cấu trúc điều kiện, hay còn
một công việc nào đó đ°ợc lặp đi lặp lại, có thể vô hạn, dựa vào một biểu
Ch°¡ng 3, giới thiệu các câu lệnh điều kiện if, cấu trúc lựa chọn
định với hai câu lệnh do… while và while Với từng cấu trúc của các lệnh
năng hoạt động thông qua các ví dụ minh họa đ°ợc trình bày khá chi tiết trong giáo trình
CH£¡NG 4: HÀM
lập trình, là xây dựng một ch°¡ng trình gọn gàng với số dòng mã ít, tối
°u Làm thế nào để phân chia ch°¡ng trình hợp lý nhất, sử dụng code nh° thế nào cho hợp lý, tránh tr°ờng hợp một đoạn code xuất hiện nhiều
ngữ thuần C Có rất nhiều ví dụ đ°ợc đ°a ra trong Ch°¡ng 4, giúp cách
đúng cách
CH£¡NG 5: MÀNG VÀ CON TRä
Trang 18M ảng, chuỗi ký tự là những kiểu dữ liệu nh° vậy Ch°¡ng 5, trình bày
Ngoài ra, Ch°¡ng 5 còn trình bày một vấn đề, có thể nói là khá khó với
nh°ng thông qua biến con trỏ có thể xử lý các đối t°ợng mà con trỏ đó đang
CH£¡NG 6: KIÄU CÂU TRÚC
định nghĩa, kiểu bản ghi (kiểu cấu trúc), phản ánh cho sự đa dạng của
chúng ta loay hoay tìm một kiểu dữ liệu phù hợp cho một đối t°ợng thực
phim, v.v Rõ ràng các đối t°ợng này có rất nhiều thuộc tính, chẳng hạn nh° cuốn sách có các thuộc tính nh° mã sách, tên sách, tác giả của cuốn sách, năm xuất bản, v.v Vậy đối t°ợng này khi đ°a vào để xử lý phải làm nh° thế nào? Kiểu cấu trúc cho phép lập trình viên định nghĩa ra một cấu
nên khá đ¡n giản, khi lập trình xử lý các biến thuộc kiểu Sach giống nh°
Trong Ch°¡ng 6, đề cập đến định nghĩa kiểu cấu trúc, cách thức
t°ợng nh° C++ hoặc Java Chẳng hạn với lập trình h°ớng đối t°ợng, khi
thành phần: các thuộc tính và các ph°¡ng thức (tức là các hàm), trong
t°ợng) chỉ phải khai báo các thuộc tính của các đối t°ợng, các hàm tác động lên kiểu cấu trúc đó đ°ợc xây dựng hoàn toàn độc lập, v.v
Trang 19CH£¡NG 7: TàP
Trong đề c°¡ng của môn học đối với sinh viên ngành Hệ thống thông
đối với một lập trình viên, không thể không biết cách làm việc và xử lý trên tệp, vì đó là x°¡ng sống của hầu hết các ứng dụng Chính vì thế
thêm Ch°¡ng 7, là một nội dung để các bạn tham khảo và h¡n cả là làm
ghi tệp, đóng tệp Nắm đ°ợc nguyên tắc c¡ bản này, trong hầu hết các ứng dụng, các bạn đều phải tuần tự thực hiện việc tạo tệp, dùng lệnh để
CH£¡NG 8: Đè HâA
Nội dung của Ch°¡ng 8, giới thiệu những kiến thức c¡ bản về đồ
để tạo ra những hình ảnh chuyển động Ch°¡ng 8, thực sự mới chỉ mang đến cho các bạn cái nhìn tổng quan, nhóm tác giả hy vọng trong những lần tái bản sau sẽ đem đến một nội dung đầy đủ và phong phú h¡n
Cuçi míi ch¤¢ng đÃu xây dďng há thçng câu håi và bài tÁp đÅ sinh viên ôn tÁp, rèn luyán và cąng cç lý thuyÁt môn hãc <Giáo trình Ngôn ngč lÁp trình C= đ¤āc biên so¿n công phu, nghiêm túc dďa trên kinh nghiám giÁng d¿y môn hãc cho sinh viên tĉ khóa 64 đÁn khóa 68 t¿i Tr¤óng Đ¿i hãc Công nghá Giao thông vÁn tÁi cąa các giÁng viên bï môn
Há thçng thông tin Khi biên so¿n giáo trình này, nhóm tác giÁ có tham khÁo mït sç giáo trình viÁt và ngôn ngč C cąa mït sç tr¤óng đ¿i hãc có
uy tín õ Viát Nam, mït sç chuyên gia nëi tiÁng và mït sç tài liáu uy tín cąa n¤ñc ngoài, đ¤āc sď tham gia và đóng góp ý kiÁn cąa nhiÃu th¿y cô
đã và đang giÁng d¿y môn Ngôn ngč lÁp trình C õ các tr¤óng đ¿i hãc trên đáa bàn Hà Nïi Nhóm tác giÁ chân thành cÁm ¢n NCS.ThS Tr¿n Nguyên H¤¢ng, giÁng viên Tr¤óng Đ¿i hãc Kinh doanh và Công nghá Hà Nïi, đã góp nhiÃu ý kiÁn quý báu, chia sẻ nhiÃu kinh nghiám trong quá trình nhóm biên so¿n cuçn giáo trình này
Trang 20Trong quá trình biên so¿n, nhóm tác giÁ đã rÃt cç g¿ng đÅ có đ¤āc mït tài liáu tham khÁo có chÃt l¤āng, tuy nhiên không thÅ tránh khåi nhčng thiÁu sót RÃt mong đ¤āc sď đóng góp ý kiÁn đÅ giáo trình đ¤āc cÁp nhÁt và hoàn thián h¢n
Trang 21Ch¤¢ng 1 CÁC KHÁI NIÈM C¡ BÀN CĂA NGÔN NGĊ C
chẳng hạn nh° ngôn ngữ đó sử dụng tập ký hiệu nào là hợp lệ, quy cách
đại l°ợng nh° biến và hằng trong một ch°¡ng trình và kiểu dữ liệu của
nào để soạn thảo và biên dịch ch°¡ng trình Những vấn đề này sẽ đ°ợc
đa sç nhčng ng¤ói làm Tin hãc đã khá quen biÁt vñi ph¤¢ng pháp lÁp trình này
Năm 1972, t¿i phòng thí nghiám Bell, lÁp trình viên Dennis Ritchie
đã t¿o ra mït ngôn ngč mñi có tên C (Фāc dùng đÅ thay thÁ ngôn ngč lÁp trình cũ mà anh ta đang sċ dăng là ngôn ngč B C có nguén gçc tĉ ngôn ngč BCPL do Martin Richards phát triÅn, BCPL sau đó đã đ¤āc Ken Thompson phát triÅn thành ngôn ngč B Trong khi BCPL và B không
hí trā kiÅu dč liáu, thì C đã có nhiÃu kiÅu dč liáu khác nhau Nhčng kiÅu
dč liáu chính gém: kiÅu ký tď (character), kiÅu sç nguyên (interger) và kiÅu sç thďc (float))
Ngôn ngč C đ¤āc thiÁt kÁ vñi mït măc tiêu: Sċ dăng đÅ viÁt há điÃu hành (Ban đ¿u, ngôn ngč C đ¤āc phát triÅn đÅ sċ dăng trong há điÃu hành UNIX Nó kÁ thĉa nhiÃu tính năng cąa các ngôn ngč tr¤ñc đây nh¤
B và BCPL) Ngôn ngč cďc kỳ đ¢n giÁn và linh ho¿t và sñm đ¤āc sċ dăng cho nhiÃu lo¿i ch¤¢ng trình khác nhau Nó nhanh chóng trõ thành mït trong nhčng ngôn ngč lÁp trình phë biÁn nhÃt trên thÁ giñi
Trang 22Sď phë biÁn cąa C là do hai yÁu tç chính Đ¿u tiên là ngôn ngč không cÁn trõ lÁp trình viên Anh ta có thÅ làm bÃt cć điÃu gì bÁng cách
sċ dăng cÃu trúc C thích hāp Lý do thć hai mà C phë biÁn là trình biên dách C có s¿n cho h¿u hÁt các máy tính Do đó, mãi ng¤ói có thÅ đính kèm trình biên dách C cho máy cąa hã mït cách dß dàng và ít chi phí Các
mã lánh viÁt bÁng C trên máy này có thÅ đ¤āc biên dách và ch¿y trên mït máy khác chß c¿n thay đëi rÃt ít hoÁc không phÁi thay đëi gì cÁ
Năm 1980, Bjarne Stroustrup b¿t đ¿u làm viác vñi mït ngôn ngč mñi, đ¤āc gãi là <C++= Ngôn ngč này đ¤āc cÁi thián và tăng c¤óng trên
C bÁng cách thêm mït sç tính năng mñi
Mït trong nhčng ngôn ngč mñi nhÃt, Java, dďa trên C++, Java là đ¤āc thiÁt kÁ đÅ trõ thành <C++ vñi các líi đã đ¤āc sċa=
1.1.2 Các tính chÃt căa ngôn ngċ C
C là ngôn ngč đ¤āc sċ dăng rïng rãi C có nhčng tính chÃt sau đây:
- Đ¢n giÁn
cận có cấu trúc (để giải quyết vấn đề thành nhiều phần), tập hợp phong phú các hàm th° viện, kiểu dữ liệu, v.v
- Máy đïc lÁp và linh ho¿t
Không giống nh° ngôn ngữ Assembly, các ch°¡ng trình C có thể đ°ợc thực thi trên các máy khác nhau với một số thay đổi cụ thể của máy
Do đó, C là một ngôn ngữ độc lập máy
- Ngôn ng ċ lÁp trình bÁc trung
Ban đầu, C đ°ợc dự định để làm lập trình cấp thấp Nó đ°ợc sử
v.v Nó cũng hỗ trợ các tính năng của ngôn ngữ cấp cao Đó là lý do tại sao nó đ°ợc gọi là ngôn ngữ bậc trung
- Ngôn ng ċ lÁp trình cÃu trúc
ch°¡ng trình thành các phần bằng các hàm Vì vậy, nó rất dễ hiểu và sửa đổi Các hàm cũng cung cấp khả năng sử dụng lại mã
- Th¤ viÉn phong phú
trình
- Qu Án lý bï nhñ
Trang 23C h ỗ trợ tính năng phân bổ bộ nhớ động Trong ngôn ngữ C, chúng
dụng các con trỏ cho bộ nhớ, cấu trúc, hàm, mảng, v.v
- ĐÉ quy
ph°¡ng pháp quay lui
- Mõ rïng
các trình dịch, các th° viện và các phần mềm thông dịch của các ngôn
1.2 TÀP KÝ TČ HþP LÈ TRONG C
1.2.1 TÁp ký tč
Míi ngôn ngč lÁp trình đÃu đ¤āc xây dďng tĉ mït bï ký tď riêng cąa nó Các ký tď đ¤āc nhóm l¿i theo nhiÃu cách khác nhau đÅ t¿o nên các tĉ Sau đó các tĉ l¿i đ¤āc liên kÁt theo mït nguyên t¿c nào đó đÅ t¿o thành các câu lánh Mït ch¤¢ng trình bao gém nhiÃu câu lánh đÅ dißn đ¿t mït thuÁt toán nào đó
Ngôn ngč C đ¤āc xây dďng trên bï ký tď gém:
- 26 chč cái latinh: a, b, c,&, x, y, z hoÁc chč cái hoa: A, B, C, ,
Trang 24 Ví d ā 1.1
<Ha noi= chća 6 ký tď, bao gém các ký tď H, a, dÃu cách, n, o và i
<Hanoi= chća 5 ký tď, bao gém các ký tď H, a, n, o, i
Cho khai báo: int bien_dem;
Trong đó: int là tĉ khóa đÅ chß ra rÁng bien_dem là mït biÁn kiÅu int (kiÅu sç nguyên)
Ngôn ngč C phân biát giča hoa và chč th¤óng, vì vÁy tÃt cÁ các tĉ khóa phÁi đ¤āc viÁt bÁng chč th¤óng Sau đây là danh sách các tĉ khóa đ¤āc sċ dăng trong C:
1.2.3 Đánh danh
Khái niám đánh danh rÃt quan trãng trong quá trình lÁp trình, nó không nhčng thÅ hián rõ ý ngh*a trong ch¤¢ng trình mà còn dùng đÅ xác đánh các đ¿i l¤āng khác nhau khi thďc hián ch¤¢ng trình Đánh danh th¤óng đ¤āc đÁt cho hÁng, biÁn, mÁng, con trå, nhãn, v.v ChiÃu dài tçi
đa cąa đánh danh là 32 ký tď
Quy t Ãc đ¿t đánh danh:
- Đánh danh phÁi là duy nhÃt
- Mït đánh danh hāp lá chća các chč cái (cÁ chč hoa và chč th¤óng), chč sç, dÃu g¿ch d¤ñi
Trang 25- Ký tď đ¿u tiên cąa đánh danh phÁi là chč cái hoÁc dÃu g¿ch d¤ñi
- Không sċ dăng tĉ khóa làm đánh danh
- ChiÃu dài tçi đa cąa đánh danh là 32 ký tď
L¤u ý: Nên đÁt đánh danh có ý ngh*a trong các bài toán că thÅ
Ví d ā 1.3
Mït sç đánh danh đúng: delta, a_1, x, x1, x2, Num_ODD;
Mït sç đánh danh sai:
a-1 (sċ dăng dÃu g¿ch ngang)
L¤u ý:
Trong C, đánh danh đ¤āc phân biát bõi chč hoa và chč th¤óng
Ví dă number khác Number;
case khác Case (case là tĉ khóa, do đó b¿n đÁt tên là Case v¿n đúng)
1.3 MîT Sæ QUY £ðC KHI VIÀT CH£¡NG TRÌNH
- Sċ dăng DevC, gõ các dòng code trên;
- L¤u ch¤¢ng trình vñi tên hello.c
- NhÃn F9 đÅ biên dách
- NhÃn F10 đÅ ch¿y ch¤¢ng trình, dòng chč <Hello, World= s¿ hiÅn thá trên màn hình console
Gi Ái thích:
Trang 26Dòng 1: #include <stdio.h>: bï lánh tiÃn xċ lý, thông báo cho trình biên dách C đã thêm táp tiêu đà stdio.h trong ch¤¢ng trình tr¤ñc khi biên dách mã nguén, stdio là các chuÁn đ¿u vào/đ¿u ra, cho phép sċ dăng các lánh đ¤āc chća trong táp stdio.h
Dòng 2: int main(): hàm chính, n¢i b¿t đ¿u thďc thi ch¤¢ng trình Dòng 4: /* Chuong trinh dau tien trong C */: s¿ đ¤āc trình biên dách
bå qua, đ¤āc sċ dăng đÅ thêm các chú thích trong ch¤¢ng trình
Dòng 5: printf("Hello, World! \n");: là mït chćc năng có s¿n trong C, hiÅn thá ra màn hình dòng Hello, World
Dòng 6: return 0; : chÃm dćt hàm main() và trÁ và giá trá 0
1.3.2 CÃu trúc ch¤¢ng trình viÁt trong C
Mït ch¤¢ng trình trong C đ¤āc phân chia thành nhiÃu ph¿n Xem xét
Ví dă 1.4 sau đây:
Trang 279 { Ph¿n hàm main() là
ph¿n quan trãng nhÃt cąa bÃt kỳ ch¤¢ng trình C nào Trình biên dách b¿t đ¿u thďc hián ch¤¢ng trình C tĉ hàm main() Hàm main() là b¿t buïc trong lÁp trình C Nó có hai ph¿n:
Ph¿n khai báo: TÃt cÁ các biÁn đ¤āc sċ dăng sau này trong ph¿n thi hành đ¤āc khai báo trong ph¿n này
Ph¿n thďc thi: Ph¿n này chća các câu lánh s¿ đ¤āc thďc hián bõi trình biên dách
Khi biên dách ch¤¢ng trình, căn cć vào các lói gãi hàm, mà các
mã ch¤¢ng trình cąa các hàm t¤¢ng ćng đ¤āc thďc thi
Trang 283
[Ph¿n đánh ngh*a marco]
Xác đánh các hÁng t¤āng tr¤ng trong ch¤¢ng trình HÁng t¤āng tr¤ng là các đ¿i l¤āng có giá trá không thay đëi trong ch¤¢ng trình Ph¿n này không b¿t buïc phÁi có
4
[Ph¿n khai báo nguyên hàm m¿u]
Khai báo các nguyên m¿u hàm Ph¿n này không b¿t buïc, trong tr¤óng hāp ph¿n đánh ngh*a các hàm đ¤āc đÁt õ vá trí này thì bå qua các nguyên hàm m¿u
5
[Ph¿n đánh ngh*a các cÃu trúc]
Ph¿n này đ¤āc sċ dăng khi c¿n đánh ngh*a các kiÅu dč liáu
do ng¤ói dùng đánh ngh*a Không b¿t buïc phÁi có
6
<kiÅu trÁ vÃ> main(tham sç) {
Thân hàm main(): chća các khai báo và các lánh thďc thi, chća các lói gãi hàm;
} Đây là ph¿n b¿t buïc phÁi có Ch¤¢ng trình khi biên dách đ¤āc thďc hián b¿t đ¿u tĉ đây
7
[Đánh ngh*a hàm cąa ng¤ói dùng]
NÁu có lói gãi hàm thì ph¿n này b¿t buïc phÁi có Có hai
Khi biên dách, ch¤¢ng trình s¿ bå qua ph¿n này, bõi vì tÃt cÁ nhčng nïi dung trong ph¿n này, đ¤āc ch¤¢ng trình hiÅu là các chú thích
Các chú thích trong C đ¤āc thÅ hián d¤ñi hai d¿ng:
Trang 29Ghi chú thích trên 1 dòng, sċ dăng ký hiáu //:
Ten tep: tinhtong.c
Tac gia: Le Thi Chi
Cú pháp cąa mït dòng bao hàm táp:
#include <tên_táp> hoÁc #include <tên_táp=
T rong đó: tên_táp là tên có thÅ có cÁ đ¤óng d¿n cąa táp tiêu đà (.h)
mà chúng ta c¿n sċ dăng, míi lánh bao hàm táp trên mït dòng
Ví d ā 1.6
Cho các khai báo bao hàm táp sau đây:
#include<stdio.h>
#include <conio.h>
Trang 30#include <phanso.h=
Sď khác nhau giča cÁp < > và < = bao quanh tên táp là vñi cÁp < >, ch¤¢ng trình dách tìm tên táp tiêu đà trong th¤ măc ng¿m đánh xác đánh bõi đ¤óng d¿n trong măc Option/Directories, còn vñi cÁp < = ch¤¢ng trình dách tìm táp trong th¤ măc hián t¿i, nÁu không có mñi tìm trong th¤ măc các táp tiêu đà ng¿m đánh nh¤ tr¤óng hāp < >
Khái niám macro là gì? GiÁ sċ trong ch¤¢ng trình có mït nïi dung (giá trá) nào đó và chúng ta muçn sċ dăng nó nhiÃu l¿n trong ch¤¢ng trình, nh¤ng chúng ta không muçn viÁt trďc tiÁp nó vào ch¤¢ng trình lúc so¿n thÁo, vì mït vài lý do nào đó (chẳng h¿n nh¤ nó s¿ làm ch¤¢ng trình khó đãc, khó hiÅu, hoÁc khi thay đëi s¿ khó, v.v.) Lúc này chúng ta hãy gán cho nïi dung đó mït <tên= và b¿n sċ dăng <tên= đó đÅ viÁt trong ch¤¢ng trình nguén Khi biên dách ch¤¢ng trình, ch¤¢ng trình dách s¿ tď đïng thay thÁ nïi dung cąa <tên= vào đúng vá trí cąa <tên= đó Thao tác này gãi là phép thÁ macro và chúng ta gãi <tên= là tên cąa macro và nïi dung cąa nó đ¤āc gãi là nïi dung cąa macro
Mït macro đ¤āc đánh ngh*a nh¤ sau:
#define tên_macro nïi_dung
Trong đó, tên macro là mït tên hāp lá, nïi dung (giá trá) cąa macro đ¤āc coi thu¿n tuý là mït xâu c¿n thay thÁ vào vá trí xuÃt hián tên cąa macro t¤¢ng ćng, giča tên và nïi dung cách nhau mït hay nhiÃu khoÁng trçng (dÃu cách) Nïi dung cąa macro b¿t đ¿u tĉ kí tď khác dÃu trçng đ¿u tiên sau tên macro cho tñi hÁt dòng
Ví d ā 1.7
#define SOCOT 20
#define max(a,b) (a > b ? a:b)
Vñi hai ví dă trên, khi gÁp tên SOCOT, ch¤¢ng trình dách s¿ tď đïng thay thÁ bõi 20 và max(a, b) s¿ đ¤āc thay thÁ bõi (a > b ? a : b);
Trang 31kÁt quÁ không nh¤ chúng ta mong đāi Trong tr¤óng hāp này chúng ta nên sċ dăng dÃu ngoÁc cho các tham sç cąa macro #define bp(a) (a)*(a)
Trong ph¿n này chúng ta nêu mït sç thông tin và khai báo nguyên m¿u đÅ giÁi thích cÃu trúc ch¤¢ng trình chć không có ý đánh trình bày và hàm, chi tiÁt và hàm s¿ đ¤āc trình bày trong ph¿n đánh ngh*a hàm
Nguyên m¿u mït hàm là dòng khai báo cung cÃp các thông tin: tên hàm, kiÅu hàm, sç đçi sç và kiÅu tĉng đçi sç cąa hàm
Cú pháp khai báo nguyên m¿u
<kiÅu_hàm> <tên_hàm> ([khai báo đçi]);
Ví dā 1.8
Cho các khai bao nguyên m¿u sau đây:
int min (int, int);
float binhphuong (float y);
float giatri(int, float);
L¤u ý:
Ph¿n khai báo đçi cąa nguyên m¿u, măc đích là xác đánh sç đçi sç và kiÅu cąa tĉng đçi sç, do vÁy b¿n có thÅ không viÁt tên cąa đçi sç nh¤ng kiÅu cąa chúng thì phÁi có và b¿n phÁi liát kê đ¿y đą kiÅu cąa tĉng đçi sç
typedef <mô_tÁ_kiÅu> <tên_kiÅu_mñi>;
Trong đó <tên_kiÅu_mñi> là tên kiÅu c¿n t¿o do ng¤ói lÁp trình đÁt theo quy t¿c và tên cąa ngôn ngč và <mô_tÁ_kiÅu> là ph¿n chúng ta đánh ngh*a các thành ph¿n cÃu thành lên kiÅu mñi
Ví dā 1.9
Cho hai đánh ngh*a cÃu trúc sau đây:
typedef unsigned char byte;
typedef long nguyen_dai;
Trang 32Sau đánh ngh*a này các tên mñi byte đ¤āc dùng vñi ý ngh*a là tên kiÅu
dč liáu nó t¤¢ng tď nh¤ unsigned charvà nguyen_dai t¤¢ng tď nh¤ long Chúng ta có thÅ đánh ngh*a biÁn a, b kiÅu byte nh¤ sau:
byte a, b; (byte đ¤āc sċ dăng là kiÅu dč liáu vĉa đ¤āc đánh ngh*a unsigned char)
1.3.2.6 Định nghĩa hàm
Trong ph¿n này chúng ta đánh ngh*a các hàm cąa ng¤ói dùng, mït đánh ngh*a hàm bao gém dòng tiêu đà cąa hàm và thân cąa hàm, vñi cú pháp nh¤ sau:
<kiÅu_hàm> <tên_hàm> ([khai báo đçi])
{
< thân hàm >
}
Ví d ā 1.10
Xây dďng hàm tìm sç bé nhÃt cąa hai sç nguyên a, b
int max( int a, int b)
Trong đánh ngh*a mït hàm nói chung đÃu có hai ph¿n đó là tiêu đà cąa hàm, dòng này bao gém các thông tin: Tên hàm, kiÅu hàm (kiÅu giá trá hàm trÁ vÃ), các tham sç hình thćc (tên tham sç và kiÅu cąa chúng) Ph¿n thć hai là thân cąa hàm, đây là tÁp các lánh (hoÁc khai báo) thďc hián các thao tác theo yêu c¿u và chćc năng cąa hàm đó Hàm main() cũng chß là mït tr¤óng hāp riêng cąa hàm nh¤ng có tên cç đánh là main,
Trang 33có thÅ có hoÁc không có các đçi sç và có thÅ trÁ và giá trá, kiÅu cąa giá trá này đ¤āc xác đánh bõi <kiÅu_hàm> (chi tiÁt và đçi, kiÅu cąa hàm main() s¿ đ¤āc đà cÁp kỹ h¢n trong các ph¿n sau)
Thân hàm main() đ¤āc bao bõi cÁp dÃu mõ ngoÁc { và dÃu đóng ngoÁc } có thÅ gém các lánh, các khai báo hoÁc đánh ngh*a biÁn, hÁng, kiÅu, các thành ph¿n này trõ thành căc bï trong hàm main()
L¤u ý:
- Các thành ph¿n cąa ch¤¢ng trình mà chúng ta vĉa nêu, trĉ hàm main() là thành ph¿n phÁi có và duy nhÃt trong mït ch¤¢ng trình viÁt bÁng ngôn ngč C, còn các thành ph¿n khác là tuỳ chãn, có thÅ không có hoÁc có
- Thć tď các thành ph¿n không b¿t buïc theo trÁt tď nh¤ trên mà chúng có thÅ xuÃt hián theo trÁt tď tuỳ ý nh¤ng phÁi đÁm bÁo yêu c¿u mãi thành ph¿n phÁi đ¤āc khai báo hay đánh ngh*a tr¤ñc khi sċ dăng
- Các biÁn, hÁng khai báo ngoài mãi hàm có ph¿m vi sċ dăng là toàn căc (tćc là có thÅ sċ dăng tĉ sau lánh khai báo cho tñi hÁt ch¤¢ng trình) Các hÁng, biÁn khai báo trong mït hàm (hoÁc trong mït khçi) là thành ph¿n căc bï (có ph¿m vi sċ dăng trong hàm hoÁc trong khçi đó mà thôi)
- Các hàm trong C là mït mćc (tćc là trong hàm không chća đánh ngh*a hàm khác)
Ch¤¢ng trình C đ¤āc të chćc thành nhiÃu câu lánh, míi câu lánh có thÅ thďc hián mït công viác nào đó, cuçi míi câu lánh phÁi đ¤āc kÁt thúc bÁng dÃu chÃm phÁy (;) Trên mït dòng có thÅ viÁt nhiÃu câu lánh và mït câu lánh cũng có thÅ viÁt trên nhiÃu dòng
T¿i nhčng vá trí cąa câu lánh mà cho phép xuÃt hián mït hoÁc nhiÃu dÃu khoÁng cách thì ta có thÅ ng¿t ph¿n còn l¿i cąa câu lánh xuçng dòng tiÁp theo
Trang 34và đÅ ng¤ói khác đãc vào dß hiÅu Trong C có các kiÅu ghi chú sau:
- // nïi dung ghi chú Khi đó nïi dung ghi chú đ¤āc ghi trên mït dòng hoÁc ph¿n còn l¿i cąa mït dòng
Trang 35- /* nïi dung ghi chú */ Khi đó nïi dung ghi chú có thÅ ghi trên mït dòng, trên nhiÃu dòng hoÁc trên ph¿n còn l¿i cąa mït dòng
B¤ñc 1: Mã nguén cąa ch¤¢ng trình C (C program, táp simple.c)
đ¤āc gċi đÁn bï tiÃn xċ lý (preprocessor) Bï tiÃn xċ lý có trách nhiám chuyÅn đëi các chß thá tiÃn xċ lý thành các giá trá t¤¢ng ćng cąa chúng
Bï tiÃn xċ lý t¿o ra mït mã nguén mõ rïng (Expanded source code, táp simple.i)
Trang 36Hình 1.1 Quá trình thďc thi ch¤¢ng trình
Trang 37B¤ñc 2: Mã nguén mõ rïng (táp simple.i) đ¤āc gċi đÁn trình biên
dách (compiler) đÅ biên dách mã và chuyÅn đëi nó thành mã assembly (mã máy, táp simple.s)
B¤ñc 3: Mã asembly (táp simple.s) đ¤āc gċi đÁn trình biên dách mã
(assembler) chuyÅn đëi simple.s thành mã đçi t¤āng (Object code) Bây gió mït táp tin simple.obj đ¤āc t¿o ra
B¤ñc 4: Mã đçi t¤āng (táp simple.obj) đ¤āc gċi đÁn trình liên kÁt
liên kÁt nó vñi th¤ vián, chẳng h¿n nh¤ các táp tiêu đà Sau đó, nó đ¤āc chuyÅn đëi thành mã thďc thi (executable code) Mït tÁp tin đ¢n simple.exe đ¤āc t¿o ra
B¤ñc 5: Mã thďc thi (táp simple.exe) đ¤āc gċi đÁn trình tÁi (loader)
s¿ tÁi vào bï nhñ và sau đó nó đ¤āc thďc thi Sau khi thďc hián, đ¿u ra đ¤āc gċi đÁn bàn điÃu khiÅn
1.4 KIÄU DĊ LIÈU TRONG C
KiÅu dč liáu đ¤āc há thçng dùng đÅ xác đánh các thuïc tính c¢ bÁn khác nhau và dč liáu đ¤āc l¤u trong bï nhñ Các thuïc tính đó bao gém: lo¿i dč liáu, ph¿m vi cąa dč liáu, sç byte bá chiÁm dăng, v.v
Các kiÅu dč liáu trong C đ¤āc phân chia thành 3 nhóm chính:
Hình 1.2 Các kiÅu dč liáu cąa ngôn ngč C
array
struct
union
enum
Trang 38long long int
signed long long
signed long long int
unsigned long long
unsigned long long
int
Trang 391.4.1 KiÅu dċ liÉu nguyên thăy
Ngôn ngč C hí trā bçn kiÅu dč liáu nguyên thąy, bao gém char, int, float và void Các kiÅu dč liáu nguyên thąy còn đ¤āc gãi là các kiÅu
BÃt kỳ mït ký tď đ¢n trong C đÃu đ¤āc biÅu dißn bÁng kiÅu char Kích th¤ñc cąa kiÅu char là 1 byte và có thÅ l¤u trč 128 ký tď
Ví dā 1.15
Cho khai báo sau:
char test = >A?;
Trong ngôn ngč C, tĉ khóa int đ¤āc sċ dăng đÅ xác đánh dč liáu d¿ng sç nguyên Kích th¤ñc cąa int là 2 byte hoÁc 4 byte (phă thuïc vào trình biên dách) và có thÅ l¤u trč các giá trá trong ph¿m vi [-32.768, 32.767] (2 byte) hoÁc [-2.147.483.648, 2.147.483.647] (4 byte)
Trang 40hoÁc double, trong đó tĉ khóa float xác đánh mït sç chÃm đïng chính xác đ¢n trong ph¿m vi [1.2E-38, 3.4E+38], tĉ khóa double xác đánh mït sç chÃm đïng chính xác kép trong ph¿m vi [2.3E-308, 1.7E+308] Sç chč sç
có ngh*a sau dÃu thÁp phân đ¤āc gãi là đï chính xác, đï chính xác cąa kiÅu float là 6 chč sç thÁp phân và double là 15 chč sç thÁp phân
Giçng nh¤ tên, kiÅu void không xác đánh giá trá Tĉ khóa void đ¤āc
sċ dăng đÅ xác đánh hàm không trÁ và giá trá hoÁc kiÅu con trå
Ví dā 1.18
void * p; //Đánh ngh*a con trå p kiÅu void
1.4.2 KiÅu dċ liÉu d¿n xuÃt
Các kiÅu dč liáu nguyên thąy đ¤āc trình bày trong 1.4.1 đ¤āc sċ dăng cho viác khai báo các biÁn trong ch¤¢ng trình, tùy thuïc vào ph¿m
vi sċ dăng Nhčng kiÅu dč liáu này có thÅ đ¤āc sċa đëi cho phù hāp vñi nhčng tình huçng khác nhau KÁt quÁ cąa viác sċa đëi đó, chúng ta có đ¤āc nhčng kiÅu dč liáu d¿n xuÃt tĉ các kiÅu nguyên thąy này
Mït kiÅu dč liáu d¿n xuÃt đ¤āc xác đánh bÁng cách xác đánh các bë
tĉ chß kích th¤ñc hoÁc dÃu cùng vñi các kiÅu dč liáu nguyên thąy Các kiÅu d¿n xuÃt đ¤āc t¿o bÁng các dč liáu nguyên thąy cùng vñi các hành vi hay thuïc tính đ¤āc sċa đëi Các bë tĉ đ¤āc sċ dăng đÅ kÁt hāp trong C bao gém: signed, unsigned, long và short Các bë tĉ trên đ¤āc áp dăng vñi kiÅu dč liáu ký tď và kiÅu dč liáu sç nguyên, bë tĉ long cũng có thÅ đ¤āc áp dăng vñi kiÅu double
ĐÅ khai báo kiÅu dč liáu d¿n xuÃt, ta đÁt các bë tĉ tr¤ñc các kiÅu dč liáu nguyên thąy
Ví dā 1.19
signed int a;
unsigned int b;
signed char c;