Tải bản đầy đủ (.pdf) (358 trang)

bài giảng kỹ thuật lập trình căn bản

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (2.93 MB, 358 trang )

1
MỤC LỤC
Phần 1: Mở đầu 9
Bài 1. Các ngôn ngữ lập trình 9
1.1. Ngôn ngữ lập trình 9
1.2. Ra lệnh cho máy tính làm việc 10
1.3. Phân loại Ngôn ngữ lập trình cấp thấp và cấp cao 12
1.4. Tổng quát và chuyên biệt 13
1.5. Mô hình tính toán của một NNLT 14
1.6. Chọn NNLT 14
1.6.1. Yếu tố kỹ thuật 14
1.6.2. Yếu tố phi kỹ thuật 14
1.6.3. Chọn đúng công cụ cho công việc 15
1.6.4. Sự lựa chọn của các nhà phát triển 15
1.7. CÁC NGÔN NGỮ LẬP TRÌNH 16
Bài 2. Giới thiệu ngôn ngữ C / C++ 23
2.1. Ngôn ngữ C 23
2.2. C – Ngôn ngữ bậc trung 23
2.3. C - Ngôn ngữ cấu trúc 24
2.4. C++ 25
2.5. Biên dịch chương trình C/C++ 25
2.6. Tại sao dùng C/C++?? 26
Phần 2. Lập trình cấu trúc C (8 tuần) 27
Bài 3. Phân tích và thiết kế chương trình 27
3.1. Cấu trúc chương trình C 27
3.1.1. Ðịnh nghĩa Hàm 28
3.1.2. Dấu phân cách (Delimiters) 28
3.1.3. Dấu kết thúc câu lệnh (Terminator) 28
3.1.4. Dòng chú thích (Comment) 28
3.1.5. Thư viện C (Library) 28
3.2. Biên dịch và thực thi một chương trình (Compiling and Running) 29


2
3.3. Các bước lập trình giải quyết vấn đề 30
3.3.1. Mã giả (pseudo code) 31
3.3.2. Lưu đồ (Flowcharts) 33
Bài 4. Cài đặt và làm quen với môi trường lập trình C/C++ với Visual Studio 49
4.1. Giới thiệu Microsoft Visual C++ 49
4.2. Các đặc trưng 49
4.3. Lịch sử 49
Bài 5. Biến, kiểu, dữ liệu, Toán tử, Biểu Thức 57
5.1. Biến và Kiểu dữ liệu 57
5.1.1. Biến (variable) 57
5.1.2. Hằng (constant) 59
5.1.3. Các nguyên tắc cho việc chỉ đặt tên 60
5.1.4. Các kiểu dữ liệu (Data types) 61
5.1.5. Những kiểu dữ liệu cơ bản và dẫn xuất 64
5.1.6. Các toán tử số học (Arithmetic Operators) 68
5.2. Toán tử và Biểu thức 74
Mục tiêu: 74
5.2.1. Biểu thức (Expressions) 74
5.2.2. Toán tử quan hệ (Relational Operators) 76
5.2.3. Toán tử luận lý (Logical Operators) và biểu thức 77
5.2.4. Toán tử luận lý nhị phân (Bitwise Logical Operators) và biểu thức 78
5.2.5. Biểu thức dạng hỗn hợp & Chuyển đổi kiểu 79
5.2.6. Độ ưu tiên của toán tử (Precedence) 81
Bài 6. Nhập và Xuất trong C 90
6.1. Tập tin tiêu đề <stdio.h> 91
6.2. Nhập và xuất trong C (Input and Output) 91
6.2.1. printf() 91
6.2.2. scanf() 102
6.3. Bộ nhớ đệm Nhập và Xuất (Buffered I/O) 109

6.3.1.getchar() 110
3
6.3.2. putchar() 111
Bài 7. Điều kiện 117
7.1. Câu lệnh điều kiện là gì ? 117
7.2. Các câu lệnh lựa chọn: 118
7.2.1. Câu lệnh ‘if’: 118
7.2.2 Câu lệnh ‘if … else’: 120
7.2.3. Nhiều lựa chọn – Các câu lệnh ‘if … else’: 122
7.2.4 Các cấu trúc if lồng nhau: 125
7.2.5 Câu lệnh ‘switch’: 131
Bài 8. Vòng lặp 139
8.1. Vòng lặp: 139
8.2. Vòng lặp ‘for’: 139
8.1.2. Vòng lặp ‘while’: 146
8.2. Các lệnh nhẩy: 153
8.2.1. Lệnh ‘return’: 153
8.2.2. Lệnh ‘goto’: 153
8.2.3. Lệnh ‘break’: 155
8.2.4. Lệnh ‘continue’: 156
8.2.5. Hàm ‘exit()’: 157
Bài 9. Mảng 161
9.1. Các phần tử mảng và các chỉ mục: 162
9.2. Việc quản lý mảng trong C: 164
9.3. Mảng hai chiều: 171
Bài 10. Các thao tác với BITs và kỹ thuật lập trình với bit 181
10.1. Bit 181
10.2. Các toán tử thao tác bit 181
Bài 11. Macro 185
11.1 Chỉ thị #define 185

11.1.1 Hằng tượng trưng 185
11.1.2 Macro rỗng 185
4
11.1.3 Macro có tham số 186
11.1.4 Truyền một số lượng tham số không định trước vào macro 186
11.2 Chỉ thị undef 188
11.3 Toán tử macro 188
11.3.1. Toán tử # 188
11.4. Toán tử defined 189
11.5. Chỉ thị có điều kiện (#ifdef, #ifndef, #if, #endif, #else and #elif) 189
11.6. Chỉ thị #line 190
11.7. Chỉ thị #error 191
11.8. Chỉ thị #pragma 192
Bài 12. Kỹ thuật lập trình với hàm 192
12.1 Sử dụng các hàm 193
12.2 Cấu trúc hàm 194
12.2.1 Các đối số của một hàm 194
12.2.2 Sự trả về từ hàm 196
12.2.3 Kiểu của một hàm 197
12.3 Gọi hàm 197
12.4 Khai báo hàm 198
12.5 Các nguyên mẫu hàm 199
12.6 Các biến 200
12.6.1 Biến cục bộ 200
12.6.2 Tham số hình thức 202
12.6.3 Biến toàn cục 203
12.7 Lớp lưu trữ (Storage Class) 205
12.7.1 Biến tự động 206
12.7.2 Biến ngoại 206
12.7.3 Biến tĩnh 208

12.7.4 Biến thanh ghi 210
12.8 Các qui luật về phạm vi của một hàm 212
12.9 Gọi hàm 213
5
12.9.1 Truyền bằng giá trị 213
12.9.2 Truyền bằng tham chiếu 215
12.10 Sự lồng nhau của lời gọi hàm 218
12.11 Hàm trong chương trình nhiều tập tin 219
12.12 Con trỏ đến hàm 220
Bài 13. Kỹ thuật lập trình với con trỏ 222
13.1 Con trỏ là gì? 222
13.1.2 Tại sao con trỏ được dùng? 223
13.2 Các biến con trỏ 223
13.3 Các toán tử con trỏ 224
13.4 Con trỏ và mảng một chiều 228
13.4.1 Con trỏ và mảng nhiều chiều 231
13.5 Cấp phát bộ nhớ 234
Bài 14 Kỹ thuật lập trình với chuỗi ký tự 246
14.1 Các biến và hằng kiểu chuỗi 247
14.1.1 Con trỏ trỏ đến chuỗi 248
14.1.2 Các thao tác nhập xuất chuỗi 248
14.2 Các hàm về chuỗi 251
14.2.1 Hàm strcat() 251
14.2.2 Hàm strcmp() 252
14.2.3 Hàm strchr() 254
14.2.4 Hàm strcpy() 256
14.2.5 Hàm strlen() 257
14.3 Truyền mảng vào hàm 258
14.4 Truyền chuỗi vào hàm 261
Bài 15. CHUYỂN ĐỔI KIỂU DỮ LIỆU & CẤP PHÁT BỘ NHỚ ĐỘNG 265

15.1. Nhu cầu chuyển đổi dữ liệu 265
15.2. Chuyển đổi dữ liệu kiểu tự động 265
15.3. Ép kiểu tường minh 265
15.4. Cấp phát động trong C 266
6
Bài 16. Kỹ thuật lập trình cấu trúc 267
16.1 Cấu trúc 268
16.1.1 Định nghĩa một cấu trúc 269
16.1.2 Khai báo biến kiểu cấu trúc 270
16.1.3 Khởi tạo biến cấu trúc 272
16.1.4 Thực hiện cấu lệnh gán với cấu trúc 273
16.1.5 Cấu trúc lồng trong cấu trúc 273
16.1.6 Truyền tham số kiểu cấu trúc 275
16.1.7 Mảng các cấu trúc 277
16.1.8 Khởi tạo các mảng cấu trúc 278
16.1.9 Con trỏ đến cấu trúc 279
16.1.10 Truyền con trỏ cấu trúc như là các tham số 280
16.2 Từ khóa typedef 280
Bài 17. Kỹ thuật lập trình đệ quy 284
17.1 Mục tiêu 284
17.2 Nội dung 284
17.3. Sử dụng đệ quy hay vòng lặp 287
Bài 18. Dữ liệu cơ bản và nâng cao, thuật toán và giải thuật Quick Sort 289
18.1. Sắp xếp mảng (Sorting Arrays) 289
18.1.1. Bubble Sort 289
18.1.2. Insertion Sort 292
Bài 19. Lập trình vào ra 296
19.1. File Streams 296
19.1.1. Streams văn bản 297
19.1.2. Streams nhị phân 297

19.2. Các hàm về tập tin và structure FILE 297
19.2.1. Các hàm cơ bản về tập tin 298
19.2.2. Con trỏ tập tin 298
19.3. Các tập tin văn bản 299
19.3.1. Mở một tập tin văn bản 299
7
19.3.2. Đóng một tập tin văn bản 300
19.3.3. Ghi một ký tự 301
19.3.4. Đọc một ký tự 301
19.3.5. Nhập xuất chuỗi 303
19.4. Các tập tin nhị phân 304
19.4.1. Mở một tập tin nhị phân 304
19.4.2. Đóng một tập tin nhị phân 304
19.4.3. Ghi một tập tin nhị phân 305
19.4.4. Đọc một tập tin nhị phân 305
19.5. Các hàm xử lý tập tin 308
19.5.1. Hàm feof() 308
19.5.2. Hàm rewind() 308
19.5.3. Hàm ferror() 310
19.5.4. Xóa tập tin 311
19.5.5. Làm sạch các stream 311
19.5.6. Các stream chuẩn 312
19.5.7. Con trỏ kích hoạt hiện hành 313
19.5.8. Hàm fprintf() và fscanf() 315
Phần 3. Lập trình hướng đối tượng C++ (4 tuần) 321
Bài 20. Lập trình hướng đối tượng 321
20.1. Giới thiệu 321
20.2. Trừu tượng hóa (Abstraction) 322
20.3. Đối tượng (object) 322
20.4. Lớp (Class) 325

20.5. Thuộc tính (Attribute) 326
20.6. Phương thức (Method) 326
20.7. Thông điệp (Message) 327
20.8. Tính bao gói (Encapsulation) 328
20.9. Tính thừa kế (Inheritance) 329
20.10.Tính đa hình (Polymorphism) 329
8
20.1 Trình bày các định nghĩa của các thuật ngữ: 330
20.2 Phân biệt sự khác nhau giữa lớp và đối tượng, giữa thuộc tính và giá trị, giữa
thông điệp và truyền thông điệp. 330
20.3 Trình bày các đặc điểm của OOP. 330
20.4 Những lợi ích có được thông qua thừa kế và bao gói. 330
20.5 Những thuộc tính và phương thức cơ bản của một cái máy giặt. 330
20.6 Những thuộc tính và phương thức cơ bản của một chiếc xe hơi. 330
20.7 Những thuộc tính và phương thức cơ bản của một hình tròn. 330
20.8 Chỉ ra các đối tượng trong hệ thống rút tiền tự động ATM. 330
20.9 Chỉ ra các lớp có thể kế thừa từ lớp điện thoại, xe hơi, và động vật. 330
Bài 21. Lập trình cơ bản với C++ 331
21.1. Chương trình lập trình cơ bản với C++ 331
Các chú thích. 333
21.2. Câu lệnh vào \ ra trong C++ 334
Bài 22. Kỹ thuật lập trình cơ bản với lớp 337
22.1. Lớp đơn giản 338
22.2. Các hàm thành viên nội tuyến 339
22.3. Ví dụ: Lớp Set 339
Bài 23. Hàm xây dựng (Constructor) và Hàm hủy (Destructor) 345
23.1. Hàm xây dựng (Constructor) 345
23.2. Hàm hủy (Destructor) 347
Bài 24. Kỹ thuật lập trình Thừa kế 349
24.1. Ví dụ minh họa 350

24.2. Lớp dẫn xuất đơn giản 355
24.3. Ký hiệu thứ bậc lớp 357

9
Phần 1: Mở đầu
Bài 1. Các ngôn ngữ lập trình
Mục tiêu:
Kết thúc bài học này, bạn có thể:
Các ngôn ngữ lập trình phổ biến hiện nay
Phân biệt sự khác nhau giữa Câu lệnh, Chương trình và Phần mềm
Giới thiệu
Ngày nay, khoa học máy tính thâm nhập vào mọi lĩnh vực. Tự động hóa hiện
đang là ngành chủ chốt điều hướng sự phát triển thế giới. Bất cứ ngành nghề nào cũng
cần phải hiểu biết ít nhiều về Công nghệ Thông tin và lập trình nói chung. Ðầu tiên
chúng ta tìm hiểu sự khác nhau của những khái niệm: Lệnh (Command), Chương trình
(Program) và Phần mềm (Software).
1.1. Ngôn ngữ lập trình
Ngôn ngữ lập trình (tiếng Anh: programming language) là một tập con của ngôn
ngữ máy tính. Đây là một dạng ngôn ngữ được thiết kế và chuẩn hóa (đối lập với ngôn
ngữ tự nhiên) để truyền các chỉ thị cho máy tính (hoặc máy khác có bộ xử lí). Ngôn
ngữ lập trình có thể được dùng để tạo ra các chương trình nhằm mục đích điều khiển
máy tính hoặc mô tả các thuật toán để người khác đọc hiểu.
Như vậy Ngôn ngữ lập trình (NNLT) là phương tiện để giao tiếp và ra lệnh cho
máy tính thực hiện những công việc cụ thể. Máy tính chỉ có thể hiểu các con số 0 và 1,
nhưng con người lại không thành thạo kiểu suy nghĩ với các con số này để ra lệnh cho
máy tính. Vì vậy người ta đã phát triển các dạng câu lệnh mà con người có thể đọc
hiểu, tập các câu lệnh này được gọi là mã nguồn (source code). Mã nguồn phải tuân
thủ một tập các từ vựng, cú pháp và qui tắc do những người thiết kế NN đặt ra. Ví dụ,
đoạn mã nguồn mẫu ra lệnh cho máy tính hiển thị dòng chữ “Xin chào.” trên màn
hình:

#!/usr/bin/perl
print“Xinchào.”
Mã nguồn được một phần mềm thiết kế đặc biệt có thể hiểu các câu lệnh và dịch
thành dạng mã mà máy có thể hiểu và thực thi.
10
1.2. Ra lệnh cho máy tính làm việc
Khi một máy tính được khởi động, nó sẽ tự động thực thi một số tiến trình và
xuất kết quả ra màn hình. Ðiều này diễn ra thế nào? Câu trả lời đơn giản là nhờ vào Hệ
điều hành cài đặt bên trong máy tính. Hệ điều hành (operating system) được xem như
phần mềm hệ thống. Phần mềm này khởi động máy tính và thiết lập các thông số ban
đầu trước khi trao quyền cho người dùng. Để làm được điều này, hệ điều hành phải
được cấu tạo từ một tập hợp các chương trình. Mọi chương trình đều cố gắng đưa ra
lời giải cho một hay nhiều Bài toán nào đó. Mọi chương trình cố gắng đưa ra giải pháp
cho một hay nhiều vấn đề. Mỗi chương trình là tập hợp các câu lệnh giải quyết một
Bài toán cụ thể. Một nhóm lệnh tạo thành một chương trình và một nhóm các chương
trình tạo thành một phần mềm.
Để rõ hơn, chúng ta hãy xem xét một thí dụ: Một người bạn đến nhà chúng ta
chơi và được mời món sữa dâu. Anh ta thấy ngon miệng và muốn xin công thức làm.
Chúng ta hướng dẫn cho anh ta làm như sau :
Lấy một ít sữa.
Đổ nước ép dâu vào
Trộn hỗn hợp này và làm lạnh.
Bây giờ nếu bạn của chúng ta theo những chỉ dẫn này, họ cũng có thể tạo ra món sữa
dâu tuyệt vời.
Chúng ta hãy phân tích chỉ thị (lệnh) ở trên
Lệnh đầu tiên : Lệnh này hoàn chỉnh chưa ? Nó có trả lời được câu hỏi lấy sữa ‘ở
đâu’?.
Lệnh thứ hai : Một lần nữa, lệnh này không nói rõ nước ép dâu để ‘ở đâu’.
May mắn là bạn của chúng ta đủ thông minh để hiểu được công thức pha chế nói trên,
dù rằng còn nhiều điểm chưa rõ ràng. Do vậy nếu chúng ta muốn phổ biến cách làm,

chúng ta cần bổ sung các bước như sau :
Rót một ly sữa vào máy trộn.
Đổ thêm vào một ít nước dâu ép.
Ðóng nắp máy trộn
Mở điện và bắt đầu trộn
Dừng máy trộn lại
11
Nếu đã trộn đều thì tắt máy, ngược lại thì trộn tiếp.
Khi đã trộn xong, rót hỗn hợp vào tô và đặt vào tủ lạnh.
Ðể lạnh một lúc rồi lấy ra dùng.
So sánh hai cách hướng dẫn nêu trên, hướng dẫn thứ hai chắc chắn hoàn chỉnh,
rõ ràng hơn, ai cũng có thể đọc và hiểu được.
Tương tự, máy tính cũng xử lý dữ liệu dựa vào tập lệnh mà nó nhận được. Ðương
nhiên các chỉ thị đưa cho máy vi tính cũng cần phải hoàn chỉnh và có ý nghĩa rõ ràng.
Những chỉ thị này cần phải tuân thủ các quy tắc:
Tuần tự
Có giới hạn
Chính xác.
Mỗi chỉ thị trong tập chỉ thị được gọi là “câu lệnh” và tập các câu lệnh được gọi là
“chương trình”.
Chúng ta hãy xét trường hợp chương trình hướng dẫn máy tính cộng hai số. Các
lệnh trong chương trình có thể là :
Nhập số thứ nhất và nhớ nó.
Nhập số thứ hai và nhớ nó.
Thực hiện phép cộng giữa số thứ nhất và số thứ hai, nhớ kết quả phép cộng.
Hiển thị kết quả.
Kết thúc.
Tập lệnh trên tuân thủ tất cả các quy tắc đã đề cập. Vì vậy, tập lệnh này là một
chương trình và nó sẽ thực hiện thành công việc cộng hai số trên máy tính.
Ghi chú: Khả năng nhớ của con người được biết đến như là trí nhớ, khả năng nhớ dữ

liệu được đưa vào máy tính được gọi là “bộ nhớ”. Máy tính nhận dữ liệu tại một thời
điểm và làm việc với dữ liệu đó vào thời điểm khác, nghĩa là máy tính ghi dữ liệu vào
trong bộ nhớ rồi sau đó đọc ra để truy xuất các giá trị dữ liệu và làm việc với chúng.
Khi khối lượng công việc giao cho máy tính ngày càng nên nhiều và phức tạp thì
tất cả các câu lệnh không thể được đưa vào một chương trình, chúng cần được chia ra
thành một số chương trình nhỏ hơn. Tất cả các chương trình này cuối cùng được tích
hợp lại để chúng có thể làm việc với nhau. Một tập hợp các chương trình như thế được
gọi là phần mềm.
12
Mối quan hệ giữa ba khái niệm câu lệnh, chương trình và phần mềm có thể được biểu
diễn bằng sơ đồ trong hình 1.1:








Hình 1.1: Phần mềm, chương trình và câu lệnh

1.3. Phân loại Ngôn ngữ lập trình cấp thấp và cấp cao
Một cách tổng quát, một NNLT có 2 thành phần chính: (1) tập các thành phần cơ
bản của NN (lệnh, hàm, thủ tục ) có thể kết hợp thành chương trình, và (2) bộ biên
dịch để chuyển mã nguồn thành mã máy.Những NNLT thế hệ đầu tiên gần gũi với mã
máy và thường gắn chặt với nền tảng phần cứng, các thế hệ NNLT mới hơn gần gũi
với con người hơn và ít lệ thuộc nền tảng phần cứng hơn. Xét theo khía cạnh này, có
thể phân các NNLT thành 3 nhóm.
- Các NNLT cấp thấp: (LLL - Low Level Language), 'hướng đến máy tính“,
tương tác trực tiếp với phần cứng. Các NN này có tập lệnh tương ứng với tập lệnh

của CPU. Có 2 loại NNLT cấp thấp: NN mã máy dùng các con số và NN Assembly
dùng các từ gợi nhớ. Các NNLT cấp thấp nhanh và hiệu quả trong việc tương tác
với phần cứng.
- NNLT cấp cao (HLL - High Level Language), 'hướng đến nhiệm vụ“, có từ
vựng giống tiếng Anh giúp dễ dàng trong việc viết chương trình. Các NN này có cú
pháp chặt chẽ, có khả năng chạy trên nhiều hệ thống phần cứng khác nhau. Đa
phần các phần mềm được phát triển dùng các NN này. Các NNLT quen thuộc trong
nhóm này như C, C++, Pascal, Java
- NNLT cấp rất cao (VHLL - Very High Level Language), 'hướng đến con
người“, được thiết kế để phát triển các ứng dụng chuyên biệt mà không đòi hỏi
Software
Program 2
Program 1
Commands
Commands
Commands
13
nhiều kiến thức về lập trình. Các NN này khá mới và vẫn đang tiếp tục phát triển.
VHLL tương tự HLL nhưng dễ học và dễ sử dụng hơn. VHLL có nhiều loại, có thể
kể 2 loại thông dụng nhất:
- Các NN tương tác (authoring) như NN đánh dấu (HTML, DHTML, XML) và
NN mô hình (VRML) dùng để tạo trang web và nội dung đa phương tiện.
- Các NN kịch bản (scripting) như JavaScript dùng để viết các chương trình
nhỏ đi kèm
các trang web để tạo các hiệu ứng động và tương tác.
1.4. Tổng quát và chuyên biệt
Xét ở cấp độ tổng quát, tất cả các NNLT đều tương tự nhau. Chúng đều yêu cầu
bạn 'mô tả“vấn đề cần giải quyết và đều đòi hỏi các kỹ năng tương tự. Nếu nắm vững
một NN, bạn sẽ có đất để sử dụng những kỹ năng của mình với một NN khác. Nhưng
thực tế ứng dụng có những NN thực hiện những kỹ thuật hay giải quyết những dạng

vấn đề chuyên biệt dễ hơn những NN khác, và có những NN có khả năng thực hiện
nhiều dạng ứng dụng.
Không có lằn ranh rõ ràng giữa các NN chuyên biệt và NN tổng quát. Tuy nhiên
có thể phân định một cách đơn giản như sau: Các NN tổng quát được thiết kế để viết
các chương trình lớn, có cú pháp phức tạp, thời gian biên dịch dài và phải thực hiện
biên dịch trước, và có bộ thư viện riêng. Nói chung các NN tổng quát có thể dùng cho
bất kỳ công việc tính toán nào, tuy nhiên thực tế thường mỗi NN thích hợp hơn với
một lĩnh vực nhất định nào đó: Fortran thích hợp cho tính toán khoa học; Java dùng
cho ứng dụng phân tán không lệ thuộc nền tảng hệ thống; C dùng cho lập trình hệ
thống và trình biên dịch;
Pascal thích hợp cho việc giảng dạy về lập trình
Các NN chuyên biệt được thiết kế cho các chương trình nhỏ, cú pháp đơn giản,
thường được biên dịch lúc thực thi, và có nhiều tác vụ xây dựng sẵn. Nói chung, các
NN chuyên biệt chỉ dùng trong các ứng dụng chuyên biệt: Matlab dùng trong toán học,
SQL dùng trong cơ sở dữ liệu, PHP dùng để tạo trang web
Một số lĩnh vực ứng dụng đặc thù có thể dùng các NN tổng quát nhưng phải bổ sung
thêm các hàm thư viện và môi trường đặc biệt. Ví dụ, lập trình đồ hoạ có thể dùng bất
kỳ NN tổng quát nào kết hợp với một tập các hàm đồ hoạ.
14
1.5. Mô hình tính toán của một NNLT
Mô hình tính toán của một NNLT tổng quát có ảnh hưởng đến khả năng sử dụng
của nó trong một lĩnh vực đặc thù. Có các mô hình tính toán chính: lệnh hay thủ tục
(imperative, procedural), khai báo hay phi thủ tục (declarative, non-procedural), hướng
đối tượng (object-oriented) và kịch bản (scripting).
Với các NN lệnh, chương trình bao gồm chuỗi lệnh mô tả cách thức thay đổi dữ liệu
(trạng thái). Fortran, Cobol, C và Pascal thuộc nhóm này.
Trong khi các NN lệnh chú trọng đến cách thức giải quyết vấn đề, các NN khai
báo quan tâm đến vấn đề cần giải quyết, định nghĩa đầu vào và đầu ra của chương
trình. Có 2 loại NN khai báo: NNLT chức năng như Lisp và Haskell, và NNLT luận lý
như Prolog. Ở các NNLT hướng đối tượng, toàn bộ thông tin để giải quyết vấn đề (dữ

liệu và tác vụ) được nhóm chung lại thành các đối tượng. Các NN hướng đối tượng
thuần tuý như Smalltalk và Java chỉ hỗ trợ mô hình này, còn có NN lai như C++ hỗ trợ
cả các mô hình khác.
1.6. Chọn NNLT
Hiện có rất nhiều NNLT (con số có thể lên đến hàng trăm). Mỗi NNLT đều có
những điểm mạnh và điểm yếu. Có một số yếu tố kỹ thuật và cả phi kỹ thuật tác động
đến việc chọn NNLT.
1.6.1. Yếu tố kỹ thuật
- Yêu cầu của ứng dụng: có những NN phù hợp với những ứng dụng đặc thù.
- Nền tảng hệ thống: Ứng dụng sẽ chạy trên nền Intel, Sun, HP hay máy chủ IBM?
và hệ điều hành Windows, Sun Solaris, Linux hay IBM OS? Không phải tất cả các
NNLT đều có thể chạy trên mọi nền tảng hệ thống.
- Phát triển và bảo trì: NN có hỗ trợ phát triển ứng dụng nhanh và dễ bảo trì?
- Công cụ hỗ trợ và tài liệu: Công cụ hỗ trợ thường là một trong những yếu tố then
chốt trong việc chọn NN. Các NN có công cụ hỗ trợ và tài liệu tốt thường dễ phổ biến,
ví dụ như Visual Basic.
1.6.2. Yếu tố phi kỹ thuật
- Sự phổ biến của NN: Sự phổ biến, theo nghĩa thị phần và số lập trình viên sử dụng
NN, có ảnh hưởng đến việc chọn lựa NN. Với một NN phổ biến như C bạn sẽ dễ dàng
tìm thấy nhiều nguồn tài liệu và sự trợ giúp hơn là một NN ít được dùng hơn như Ada.
15
- Kinh tế: NN có được hỗ trợ tốt bởi các tổ chức thương mại hay cộng đồng phát
triển phần mềm miễn phí? (Nghĩa là trình biên dịch và môi trường phát triển của NN
sẽ được tiếp tục phát triển trong tương lai).
1.6.3. Chọn đúng công cụ cho công việc
Thực sự, khó có thể nói NNLT nào tốt hơn. Với bất kỳ NN nào cũng đều có
những chương trình được viết rất tốt hay dở tệ. Chất lượng của chương trình chịu ảnh
hưởng bởi chất lượng của lập trình viên nhiều hơn là chất lượng của NN. NNLT khó
nhất chính là NN đầu tiên mà bạn học. Có một số NN có thể giúp cho việc viết chương
trình dễ hơn đối với một số dạng ứng dụng, và ngược lại. Ví dụ C rất mạnh về lập trình

hệ thống nhưng nếu dùng để viết ứng dụng quản lý dữ liệu thì bạn sẽ phải vất vả xây
dựng những thứ đã có sẵn trong dBase hay Foxpro.
Việc xác định các yêu cầu và mục đích sẽ giúp bạn chọn được NN thích hợp. Hãy
chọn NN phù hợp với công việc, hay tốt hơn, chọn cả hai. Nếu bạn định viết ứng dụng
có yêu cầu xử lý giao diện, nên chọn NN có hỗ trợ đồ họa, như Visual Basic chẳng
hạn. Bạn có thể đặt câu hỏi 'NN nào thực hiện việc này dễ hơn?“ thay vì 'Làm thế nào
để thực hiện việc này với C++?“.
Có thể ứng dụng của bạn có nhiều phần với nhiều yêu cầu khác nhau. Chẳng hạn
như chương trình game, có những phần (gồm trí tuệ nhân tạo, luật chơi, giao diện
người dùng ) chỉ yêu cầu việc xây dựng và thay đổi dễ dàng, nhưng không yêu cầu
tốc độ; nhưng có những phần (như đồ họa) lại đòi hỏi tốc độ.
Một cái áo không bắt buộc dùng chỉ một màu. Trong lập trình cũng vậy, không nhất
thiết phải dùng một NN cho toàn bộ chương trình. Có các cách thức cho phép bạn
'nhúng“ gần như bất kỳ NN nào vào một NN khác. Cách này giúp cho bạn khai thác ưu
điểm của từng NN. Tuy nhiên nên cẩn thận, có quá nhiều 'màu sắc“ sẽ làm bạn rối trí!
Và một điều nên lưu ý: Không hẳn các NN mới hơn luôn là lựa chọn tốt hơn. C++
mới hơn C, thế nhưng C vẫn tồn tại vì vẫn có ưu thế về tốc độ và kích thước nhỏâ gọn.
Trở lại câu hỏi ban đầu, 'Nên học hay dùng ngôn ngữ lập trình nào?“, có thể bạn tìm
thấy lời giải với vấn đề được đặt ngược lại: 'Để làm gì?“.
1.6.4. Sự lựa chọn của các nhà phát triển
Theo số báo cáo Worldwide IT Benchmark 2003 của META Group, C++ và Java
tiếp tục là các NNLT được lựa chọn hàng đầu để phát triển ứng dụng, chiếm tỉ lệ lần
16
lượt là 18% và 16,7%. HTML, JavaScript, ASP và XML cũng là nhóm NNLT quan
trọng chiếm vị trí thứ 3 với tỉ lệ 13,6%, năm trước nhóm NNLT này chiếm tỉ lệ 9,7%.
Việc dễ lập trình cùng với xu hướng phát triển của web có lẽ là lý do của sự gia tăng
này. Tuy rất nổi tiếng với công cụ phát triển mạnh và được nhiều người dùng nhưng vị
trí của Visual Basic trong ngành công nghiệp phần mềm khá khiêm tốn, chiếm vị trí
thứ 4 với tỉ lệ 9,8%.
Báo cáo cũng cho thấy Windows vẫn duy trì vị trí dẫn đầu trong lựa chọn nền

tảng phát triển, chiếm tỉ lệ áp đảo 61,9% (năm 2002, 53,1%). Nền tảng IBM chiếm vị
trí thứ 2 với tỉ lệ 18,3%. Vị trí thứ 3 thuộc về Sun Solaris, 9,4%.
Nhìn chung, số liệu của META Group có sự tương đồng (ngoại trừ trường hợp
của VB) với số liệu của một trong những công ty phần mềm hàng đầu ở Việt nam,
công ty ParagonSolutions (PSV).
1.7. CÁC NGÔN NGỮ LẬP TRÌNH
Đây là danh sách các NNLT, từ những NN đã có cách đây hàng chục năm đến
những NN mới xuất hiện gần đây, chủ yếu là các NN tổng quát. Các NN được nhóm
theo các tính năng tương đồng. Vì giá trị lịch sử, có một số NN “chết” hay ít được sử
dụng hiện diện trong danh sách. Danh sách này có thể chưa đầy đủ.
- NGÔN NGỮ MÁY dùng các số 0 và 1 để “ra lệnh” cho bộ xử lý. Tập lệnh chỉ
tương thích trong cùng họ CPU và rất khó lập trình.
- NGÔN NGỮ ASSEMBLY gần giống như NN máy nhưng có ưu điểm là tập
lệnh dễ đọc . Nói chung mỗi lệnh trong Assembly (như MOV A,B) tương ứng với một
lệnh mã máy (như 11001001). Chương trình Assembly được biên dịch trước khi thực
thi. Nếu cần tốc độ và kích thước chương trình thật nhỏ, Assembly là giải pháp.
- C đạt được sự thỏa hiệp giữa việc viết code hiệu quả của Assembly và sự tiện
lợi và khả năng chạy trên nhiền nền tảng của NNLT cấp cao có cấu trúc. NN hơn 20
năm tuổi này hiện vẫn được tin dùng trong lĩnh vực lập trình hệ thống. Có các công cụ
thương mại và miễn phí cho gần như mọi HĐH.
- C++ là NN được dùng nhiều nhất hiện nay, đa số phần mềm thương mại được
viết bằng C++. Tên của NN có lý do: C++ bao gồm tất cả ưu điểm của C và bổ sung
thêm các tính năng hướng đối tượng. Có các công cụ thương mại và miễn phí cho gần
như mọi HĐH.
17
- C# [phát âm 'C sharp“] là lời đáp của Microsoft đối với Java. Do không đạt
được thỏa thuận với Sun về vấn đề bản quyền, Microsoft đã tạo ra NN với các tính
năng tương tự nhưng chỉ chạy trên nền Windows.
- JAVA là phiên bản C++ được thiết kế lại hợp lý hơn, có khả năng chạy trên
nhiều nền tảng; tuy nhiên tốc độ không nhanh bằng C++. Có các công cụ miễn phí và

thương mại hỗ trợ cho hầu hết các HĐH hiện nay. Tuy Microsoft đã gỡ bỏ hỗ trợ Java
khỏi cài đặt mặc định của các phiên bản Windows mới, nhưng việc bổ sung rất dễ
dàng.
- PASCAL được thiết kế chủ yếu dùng để dạy lập trình, tuy nhiên nó đã trở nên
phổ biến bên ngoài lớp học. Pascal yêu cầu tính cấu trúc khá nghiêm ngặt. Có các công
cụ thương mại và miễn phí cho DOS, Windows, Mac, OS/2 và các HĐH họ Unix.
Trình soạn thảo website BBEdit được viết bằng Pascal.
- DELPHI là phiên bản hướng đối tượng của Pascal được hãng Borland phát triển
cho công cụ phát triển ứng dụng nhanh có cùng tên. Môi trường Delphi được thiết kế
để cạnh tranh với Visual Basic của Microsoft, hỗ trợ xây dựng giao diện nhanh bằng
cách kéo thả các đối tượng và gắn các hàm chức năng. Khả năng thao tác CSDL là một
ưu điểm khác của NN. Borland, có các công cụ thương mại cho Windows và Linux.
- BASIC ['Beginner’s All-purpose Symbolic Instruction Code“] là NNLT đầu
tiên dùng cho máy vi tính thời kỳ đầu. Các phiên bản hiện đại của BASIC có tính cấu
trúc hơn. Có các công cụ thương mại và miễn phí cho DOS, Windows, Mac và các
HĐH họ Unix.
- VISUAL BASIC [phiên bản của Basic cho môi trường đồ hoạ] là NN đa năng
của Microsoft. Nó bao gồm BASIC, NN macro của Microsoft Office (VBA – Visual
Basic for Application), và công cụ phát triển ứng dụng nhanh. Tiếc là ứng dụng VB
chỉ có thể chạy trên Windows và bạn bị lệ thuộc vào những chính sách thay đổi của
Microsoft. (Chương trình viết bằng VB 6 hay các phiên bản trước sẽ không hoàn toàn
tương thích với VB.NET)
- ADA phần lớn dựa trên Pascal, đây là một dự án của Bộ Quốc Phòng Mỹ. ADA
có nhiều điểm mạnh, như cơ chế kiểm soát lỗi, dễ bảo trì và sửa đổi chương trình.
Phiên bản hiện thời có cả các tính năng hướng đối tượng.
18
- ICON là NN thủ tục cấp cao. Xử lý văn bản là một trong những điểm mạnh của
nó. Có các phiên bản cho Windows, HĐH họ Unix và các môi trường Java; các phiên
bản cũ hơn hỗ trợ các HĐH khác.
- SMALLTALK môi trường phát triển hướng đối tượng và đồ hoạ của Smalltalk

chính là nguồn cảm hứng cho Steve Jobs và Bill Gates 'phát minh“ giao diện Mac OS
và Windows.
- RUBY hợp một số tính năng tốt nhất của nhiều NN khác. Đây là NN hướng đối
tượng thuần túy như Smalltalk, nhưng có cú pháp trong sáng hơn. Nó có khả năng xử
lý văn bản mạnh tương tự như Perl nhưng có tính cấu trúc hơn và ổn định hơn.
- PERL thường được xem đồng nghĩa với “CGI Scripting”. Thực tế, Perl “lớn
tuổi” hơn web. Nó 'dính“ vào công việc lập trình web do khả năng xử lý văn bản
mạnh, rất linh động, khả năng chạy trên nhiều nền tảng và miễn phí.
- TCL (phát âm 'tickle“) có thể tương tác tốt với các công cụ dùng văn bản như
trình soạn thảo, trình biên dịch dùng trên các HĐH họ Unix, và với phần mở rộng
TK nó có thể truy cập tới các giao diện đồ hoạ như Windows, Mac OS và X-Windows,
đóng vai trò kết dính các thành phần lại với nhau để hoàn thành các công việc phức
tạp. Phương pháp mô-đun này là nền tảng của Unix
- PYTHON là NN nguồn mở, hướng đối tượng, tương tác và miễn phí. Ban đầu
được phát triển cho Unix, sau đó 'bành trướng“ sang mọi HĐH từ DOS đến Mac OS,
OS/2, Windows và các HĐH họ Unix. Trong danh sách người dùng của nó có NASA
và RedHat Linux.
- PIKE cũng là NN nguồn mở, miễn phí được phát triển cho nhu cầu cá nhân, và
hiện được công ty Roxen Internet Software của Thuỵ Điển phát triển dùng cho máy
chủ web trên nền Roxen. Đây là NN hướng đối tượng đầy đủ, có cú pháp tương tự C,
và có thể mở rộng để tận dụng các mô-đun và thư viện C đã biên dịch để tăng tốc độ.
Nó có thể dùng cho các HĐH họ Unix và Windows.
- PHP (Hypertext Pre-Processor) là NN mới nổi lên được cộng đồng nguồn mở
ưa chuộng và là mô-đun phổ biến nhất trên các hệ thống Apache (web server). Giống
như CFML, mã lệnh nằm ngay trong trang web. Nó có thể dễ dàng truy cập tới các tài
nguyên hệ thống và nhiều CSDL. Nó miễn phí và tính khả chuyển đối với các HĐH họ
Unix và Windows.
19
- MACROMEDIA COLDFUSION có mã lệnh CFML (Cold Fusion Markup
Language) được nhúng trong trang web rất giống với thẻ lệnh HTML chuẩn. Rất

mạnh, có các công cụ để truy cập nhiều CSDL và rất dễ học. Hạn chế chính của nó là
giá cả, tuy nhiên có phiên bản rút gọn miễn phí. Chạy trên Windows và các HĐH họ
Unix.
- ASP (ACTIVE SERVER PAGES) được hỗ trợ miễn phí với máy chủ web của
Microsoft (IIS). Thực sự nó không là NNLT, mà được gọi, theo Microsoft, là 'môi
trường lập kịch bản phía máy chủ“.Nó dùng VBScript hay JScript để lập trình. Chỉ
chạy trên Windows NT/2K. Microsoft đã thay NN này bằng ASP.NET, tuy có tên
tương tự nhưng không phải là bản nâng cấp.
- JSP (jaVASERVER PAGES ) là NN đầy hứa hẹn. Nó dùng Java, có phần mềm
máy chủ nguồn mở và miễn phí (Tomcat). Có thể chạy trên hầu hết các máy chủ web,
gồm Apache, iPlanet và cả Microsoft IIS.
- LISP ['LISt Processing“] là NNLT 'có thể lập trình“, được xây dựng dựa trên
khái niệm đệ quy và có khả năng thích ứng cao với các đặc tả không tường minh. Nó
có khả năng giải quyết những vấn đề mà các NN khác không thể, đó là lý do NN hơn
40 năm tuổi này vẫn tồn tại. Yahoo Store dùng Lisp.
- PROLOG [“PROgramming in Logic”] được thiết kế cho các Bài toán luận lý, ví
dụ như “A bao hàm B, A đúng, suy ra B đúng” – một công việc khá khó khăn đối với
một NN thủ tục.
- COBOL [“Common Business-Oriented Language”] có tuổi đời bằng với điện
toán thương mại, bị buộc tội không đúng về vụ Y2K, và dù thường được dự đoán đến
hồi cáo chung nhưng nó vẫn tồn tại nhờ tính hữu dụng trong các ứng dụng xử lý dữ
liệu và lập báo cáo kinh doanh truyền thống. Hiện có phiên bản với các tính năng
hướng đối tượng và môi trường phát triển tích hợp cho Linux và Windows.
- FORTRAN [“FORmula TRANslation”] là NN xưa nhất vẫn còn dùng. Nó xuất
sắc trong công việc đầu tiên mà máy tính được tin cậy: xử lý các con số. Theo đúng
nghĩa đen, đây là NN đưa con người lên mặt trăng (dùng trong các dự án không gian),
một số tính năng của NN đã được các NN khác hiện đại hơn “mượn”.
- dBase [“DataBASE”] là NN lệnh cho chương trình quản lý CSDL mang tính
đột phá của Ashton-Tate. Khi chương trình phát triển, NN cũng phát triển và nó trở
20

thành công cụ phát triển. Tới thời kỳ xuất hiện nhiều công cụ và trình biên dịch cạnh
tranh, nó chuyển thành chuẩn.
- Foxpro là một nhánh phát triển của dBase dưới sự “bảo hộ” của Microsoft.
Thực ra nó là công cụ phát triển hơn là NN. Tuy có lời đồn đại về sự cáo chung, nhưng
NN vẫn phát triển. Hiện Foxpro có tính đối tượng đầy đủ và có công cụ phát triển
mạnh (Visual Foxpro).
- Erlang [“Ericsson LNAGuage”] thoạt đầu được hãng điện tử Ericsson phát triển
để dùng riêng nhưng sau đó đưa ra bên ngoài như là phần mềm nguồn mở. Là NN cấp
thấp xét theo việc nó cho phép lập trình điều khiển những thứ mà thường do HĐH
kiểm soát, như quản lý bộ nhớ, xử lý đồng thời, nạp những thay đổi vào chương trình
khi đang chạy rất hữu ích trong việc lập trình các thiết bị di động. Erlang được dùng
trong nhiều hệ thống viễn thông lớn của Ericsson.
- HASKELL là NN chức năng, nó được dùng để mô tả vấn đề cần tính toán chứ
không phải cách thức tính toán.
- Microsoft Visual Studio làm cho mọi thứ trở nên dễ dàng miễn là bạn phát triển
ứng dụng trên HĐH của Microsoft và sử dụng các NN cũng của Microsoft!
- Borland cung cấp các công cụ phát triển tích hợp đầu tiên với tên “Turbo” và
nhiều năm nay “lăng xê” một loạt các công cụ có thể chạy trên nhiều nền tảng. C++
Builder và Delphi là các công cụ mạnh để phát triển nhanh các ứng dụng Windows với
C++ và Object Pasccal. Kylix đem các công cụ này sang Linux. JBuilder cung
cấp các công cụ tương tự để làm việc với Java (có các phiên bản cho Windows, Mac
OS, Linux và Solaris).
- Metrowerks CodeWarrior hỗ trợ nhiều nền tảng hơn bất kỳ công cụ phát triển
nào (có thể kể một số như Windows, Mac OS, Linux, Solaris, Netware, PalmOS,
PlayStation, Nintendo ). Công cụ có thể làm việc với nhiều NN: C, C++, Java và
Assembly.
- Macromedia Studio MX cung cấp mọi thứ cần thiết để tạo các ứng dụng
internet và đa phương tiện, được xem như là giải pháp thay thế cho các công cụ lập
trình truyền thống. Bộ công cụ kết hợp Dreamweaver và Flash, với các công cụ đồ hoạ
Fireworks và Freehand, và máy chủ ColdFusion. Dreamweaver có thể dùng một mình,

cho phép phát triển website có CSDL, lập trình với JSP, PHP, Cold Fusion và ASP.
21
Flash cũng là môi trường lập trình mạnh, dùng để tạo ứng dụng đồ hoạ tương tác. Gần
như các công cụ chính đều chạy trên Windows và Mac OS.
- IBM VisualAge bành trướng gần như mọi hệ thống, từ máy tính lớn đến máy
tính để bàn và thiết bị cầm tay. Các NN bao gồm, C++, Java, Smalltalk, Cobol, PL/I và
PRG. VisualAge for Java là một trong các công cụ phát triển Java phổ biến nhất.
- NetBeans là môi trường phát triển mô-đun, nguồn mở cho Java, được viết bằng
Java. Điều này có nghĩa nó có thể dùng trên bất kỳ hệ thống nào có hỗ trợ Java (hầu
hết các HĐH). Nó là cơ sở đề Sun xây dựng Sun One Studio, BEA dùng nó cho một
phần của WebLogic.
Sun có các công cụ phát triển hiệu quả trong lĩnh vực của mình. Sun ONE
Studio cho Java với cả bản thương mại và miễn phí. Sun ONE Studio Compiler
Collection cho các nhà phát triển Unix, dùng C/C++. Với tính toán tốc độ cao, hãng có
Forte for Fortran và High-Performance Computing.
- Oracle JDeveloper thuộc bộ công cụ Internet Developer Suite. Nó chủ yếu dùng
để phát triển các thành phần như servlet cho các ứng dụng web, và kết hợp tốt với
CSDL Oracle.
- WebGain VisualCafé chuyên hỗ trợ phát triển các ứng dụng phía server dùng
Java. Công cụ gồm 2 phần: expert (cho ứng dụng phía client), và enteprise (cho ứng
dụng server). Cả hai đều dùng Macromedia Dreamweaver Ultradev để xây dựng khung
ứng dụng.
- GNU Compiler Collection (GCC) là bộ công cụ miễn phí dùng để biên dịch
chương trình chạy trên HĐH bất kỳ thuộc họ Unix. Hỗ trợ các NN: C, C++, Objective
C, C, Fortran, Java và Ada. Một số công cụ đã được đưa sang DOS, Windows và
PalmOS. Đây là các công cụ được lựa chọn của hầu hết các dự án nguồn mở và bản
thân chúng cũng là nguồn mở. GCC không có môi trường phát triển ứng dụng tích
hợp.
- KDevelop là công cụ phát triển nguồn mở dùng để xây dựng các ứng dụng
Linux dùng C++. Mặc dù có tên như vậy nhưng nó hỗ trợ giao diện GNOME cũng như

KDE, ngoài các ứng dụng dùng Qt hay không có thành phần đồ họa.
- Black Adder là công cụ phát triển mạnh cho các NN Python và Ruby. Có thể
chạy trên Linux và Windows. Nó sinh mã để dùng các thành phần đồ họa Qt.
22
- Intel/KAI cung cấp các công cụ phát triển nhắm đến các hệ thống đa xử lý và
các HĐH họ Unix, dùng C/C++ và Fortran. Công cụ KAP cho phép chuyển các ứng
dụng xử lý đơn sang kiến trúc đa xử lý.
23
Bài 2. Giới thiệu ngôn ngữ C / C++
 Biết được quá trình hình thành C/C++
 Nên dùng C/C++ khi nào và tại sao
2.1. Ngôn ngữ C
Vào đầu những năm 70 tại phòng thí nghiệm Bell, Dennis Ritchie đã phát triển
ngôn ngữ C. C được sử dụng lần đầu trên một hệ thống cài đặt hệ điều hành UNIX. 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, đây là người khởi thủy ra C.
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).
C liên kết chặt chẽ với hệ thống UNIX nhưng không bị trói buộc vào bất cứ một
máy tính hay hệ điều hành nào. C rất hiệu quả để viết các chương trình thuộc nhiều
những lĩnh vực khác nhau.
C cũng được dùng để lập trình hệ thống. Một chương trình hệ thống có ý nghĩa
liên quan đến hệ điều hành của máy tính hay những tiện ích hỗ trợ nó. Hệ điều hành
(OS), trình thông dịch (Interpreters), trình soạn thảo (Editors), chương trình Hợp Ngữ
(Assembly) là các chương trình hệ thống. Hệ điều hành UNIX được phát triển dựa vào
C. C đang được sử dụng rộng rãi bởi vì tính hiệu quả và linh hoạt. Trình biên dịch
(compiler) C có sẵn cho hầu hết các máy tính. 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áy khác chỉ cần thay đổi rất ít hoặc không thay đổi gì
cả. Trình biên dịch C dịch nhanh và cho ra mã đối tượng không lỗi.

C khi thực thi cũng rất nhanh như hợp ngữ (Assembly). Lập trình viên có thể tạo ra và
bảo trì thư viện hàm mà chúng sẽ được tái sử dụng cho chương trình khác. Do đó,
những dự án lớn có thể được quản lý dễ dàng mà tốn rất ít công sức.
2.2. C – Ngôn ngữ bậc trung
C được hiểu là ngôn ngữ bậc trung bởi vì nó kết hợp những yếu tố của những
ngôn ngữ cấp cao và những chức năng của hợp ngữ (ngôn ngữ cấp thấp). C cho phép
thao tác trên những thành phần cơ bản của máy tính như bits, bytes, địa chỉ…. Hơn
nữa, mã C rất dễ di chuyển nghĩa là phần mềm viết cho loại máy tính này có thể chạy
trên một loại máy tính khác. Mặc dù C có năm kiểu dữ liệu cơ bản, nhưng nó không
24
được xem ngang hàng với ngôn ngữ cao cấp về mặt kiểu dữ liệu. C cho phép chuyển
kiểu dữ liệu. Nó cho phép thao tác trực tiếp trên bits, bytes, word và con trỏ (pointer).
Vì vậy, nó được dùng cho lập trình mức hệ thống.
2.3. C - Ngôn ngữ cấu trúc
Thuật ngữ ngôn ngữ cấu trúc khối (block-structured language) không áp dụng với
C. Ngôn ngữ cấu trúc khối cho phép thủ tục (procedures) hay hàm (functions) được
khai báo bên trong các thủ tục và hàm khác. C không cho phép việc tạo hàm trong hàm
nên nó không phải là ngôn ngữ cấu trúc khối. Tuy nhiên, nó được xem là ngôn ngữ cấu
trúc vì nó có nhiều điểm giống với ngôn ngữ cấu trúc ALGOL, Pascal và một số ngôn
ngữ tương tự khác.
C cho phép có sự tổng hợp của mã lệnh và dữ liệu. Ðiều này là một đặc điểm
riêng biệt của ngôn ngữ cấu trúc. Nó liên quan đến khả năng tập hợp cũng như ẩn dấu
tất cả thông tin và các lệnh khỏi phần còn lại của chương trình để dùng cho những tác
vụ riêng biệt. Ðiều này có thể thực hiện qua việc dùng các hàm hay các khối mã lệnh
(Code Block). Các hàm được dùng để định nghĩa hay tách rời những tác vụ được yêu
cầu trong chương trình. Ðiều này cho phép những chương trình hoạt động như trong
một đơn vị thống nhất. Khối mã lệnh là một nhóm các câu lệnh chương trình được nối
kết với nhau theo một trật tự logic nào đó và cũng được xem như một đơn vị thống
nhất. Một khối mã lệnh được tạo bởi một tập hợp nhiều câu lệnh tuần tự giữa dấu
ngoặc mở và đóng xoắn như dưới đây:

do
{
i = i + 1;
.
.
.
} while (i < 40);
Ngôn ngữ cấu trúc hỗ trợ nhiều cấu trúc dùng cho vòng lặp (loop) như là while,
do-while, và for. Những cấu trúc lặp này giúp lập trình viên điều khiển hướng thực thi
trong chương trình.
25
2.4. C++
- Lịch sử ngôn ngữ C++
- Ra đời năm 1979 bằng việc mở rộng ngôn ngữ C. Tác giả: Bjarne Stroustrup
- Mục tiêu:
 Thêm các tính năng mới
 Khắc phục một số nhược điểm của C
 Bổ sung những tính năng mới so với C:
 Lập trình hướng đối tượng (OOP)
 Lập trình tổng quát (template)
 Nhiều tính năng nhỏ giúp lập trình linh hoạt hơn nữa
(thêm kiểu bool, khai báo biến bất kỳ ở đâu, kiểu mạnh,
định nghĩa chồng hàm, namespace, xử lý ngoại lệ,…)
2.5. Biên dịch chương trình C/C++
Biên dịch chương trình C/C++ Là quá trình chuyển đổi từ mã nguồn (do người
viết) thành chương trình ở dạng mã máy để có thể thực thi được
- Cho phép dịch từng file riêng rẽ giúp:
 Dễ phân chia và quản lý từng phần của chương trình
 Khi cần thay đổi, chỉ cần sửa đổi file liên quan
->giảm thời gian bảo trì, sửa đổi

 Chỉ cần dịch lại những file có thay đổi khi cần thiết
->giảm thời gian dịch
 Các trình biên dịch hiện đại còn cho phép tối ưu hoá
dữ liệu và mã lệnh
 Một số trình biên dịch thông dụng: MS Visual C++, gcc, Intel C++ Compiler,
Watcom C/C++,…

×