Tải bản đầy đủ (.docx) (339 trang)

giáo trình lập trình C

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.14 MB, 339 trang )

LỜI NÓI ĐẦU
Ngôn ngữ lập trình C là ngôn ngữ được sử dụng rộng rãi và phổ biến đối với các lập trình
viên chuyên nghiệp cũng như các nhà phát triển phần mềm. Cho đến nay, ngôn ngữ lập trình C
vẫn được coi là ngôn ngữ lập trình cơ bản nhất đối với hầu hết sinh viên các trường đại học.
Giáo trình ngôn ngữ lập trình C được biên soạn làm giáo trình cho sinh viên bậc đại học và
cao đẳng chuyên ngành Công nghệ thông tin của khoa Công nghệ Thông tin - trường Đại học
Điện lực. Giáo trình này cũng có thể làm tài liệu tham khảo cho các giảng viên trong quá trình
giảng dạy.
Nội dung giáo trình tập trung vào các kiến thức căn bản nhất của ngôn ngữ lập trình C giúp
người đọc bước đầu tiếp cận dễ dàng với ngôn ngữ lập trình này. Các nội dung chính được
trình bày trong giáo trình bao gồm:
Chương 1: Những khái niệm cơ bản về ngôn ngữ C
Chương 2: Toán tử và biểu thức
Chương 3: Các cấu trúc điều khiển
Chương 4: Sử dụng hàm trong C
Chương 5: Mảng, xâu kí tự
Chương 6: Con trỏ
Chương 7: Kiểu dữ liệu cấu trúc
Chương 8: Quản lý tệp tin trong C
Trong quá trình biên soạn giáo trình này, chúng tôi đã cố gắng để hoàn chỉnh. Tuy nhiên
không thể tránh khỏi thiếu sót. Vì vậy, rất mong nhận được các ý kiến đóng góp từ các bạn
đồng nghiệp, các em sinh viên để giáo trình ngày càng hoàn thiện hơn.
Các tác giả xin gửi lời cảm ơn chân thành tới Giannini, Mario, Kernighan, Brian W.;
Ritchie, Dennis M, King, K. N, Thompson, Ken, Phạm Văn Ất, Scott Robert Ladd, tập đoàn
Aptech, là các tác giả các tài liệu tham khảo [1,2,3,4,5,6,7] làm cơ sở chính cho việc biên soạn
giáo trình.
Các tác giả gửi lời chân thành cảm ơn đến PGS.TS Ngô Quốc Tạo, Viện CNTT, TS. Đào
Nam Anh, trường Đại học Điện lực đã có những nhận xét quí báu trong quá trình biên soạn
giáo trình này.
Hà nội, ngày 01 tháng 07 năm 2013
Nhóm biên soạn


1
MỤC LỤC
LỜI NÓI ĐẦU
1
CHƯƠNG 1
6
NHỮNG KHÁI NIỆM CƠ BẢN VỀ NGÔN NGỮ C
6
GIỚI THIỆU
6
1.1 CÁC CHƯƠNG TRÌNH DỊCH C CƠ BẢN
6
1.2 ĐẶC ĐIỂM CỦA NGÔN NGỮ C
7
1.3 CẤU TRÚC CƠ BẢN CỦA MỘT CHƯƠNG TRÌNH C
7
1.4 BIÊN DỊCH VÀ THỰC THI MỘT CHƯƠNG TRÌNH
9
1.5 BIẾN, HẰNG, ĐỊNH DANH
10
1.5.1 Biến (variable)
10
1.5.2 Hằng (constant)
10
1.5.3 Định danh (identifier)
11
1.5.4 Từ khóa (Keywords)
12
1.6 CÁC KIỂU DỮ LIỆU CƠ SỞ VÀ DẪN XUẤT
12

1.6.1 Những kiểu dữ liệu cơ sở
12
1.6.2 Những kiểu dữ liệu dẫn xuất
14
1.7 NHẬP VÀ XUẤT TRONG C
15
1.7.1 Xuất dữ liệu - hàm printf
16
1.7.2 Cách xuất dữ liệu dạng có quy cách
17
1.7.3 Phương thức nhập dữ liệu
18
1.7.4 Bộ nhớ đệm Nhập và Xuất (Buffered I/O)
19
1.8 SỬ DỤNG TRÌNH BIÊN DỊCH DEV-C/C++
20
CHƯƠNG 2
28
TOÁN TỬ VÀ BIỂU THỨC
28
GIỚI THIỆU
28
2.1 BIỂU THỨC
28
2.2 CÁC TOÁN TỬ SỐ HỌC
29
2.2.1 Các toán tử một ngôi (unary)
29
2.2.2 Các toán tử hai ngôi (binary)
30

2.3 TOÁN TỬ GÁN
31
2.4 TOÁN TỬ QUAN HỆ
31
2.5 TOÁN TỬ LUẬN LÝ
32
2.6 TOÁN TỬ LUẬN LÝ NHỊ PHÂN
32
2.7 ÉP KIỂU TRONG C
33
2.8 ĐỘ ƯU TIÊN CỦA TOÁN TỬ
35
CHƯƠNG 3
39
CÁC CẤU TRÚC ĐIỀU KHIỂN
39
GIỚI THIỆU
39
3.1 CẤU TRÚC LỰA CHỌN
39
3.1.1 Câu lệnh if
40
3.1.2 Câu lệnh if then else
41
3.1.3 Nhiều lựa chọn các câu lệnh if then else
43
3.1.4 Các cấu trúc if lồng nhau
45
2
3.1.5 Toán tử ?

47
3.1.6 Câu lệnh switch
47
3.2 VÒNG LẶP
50
3.2.1 Vòng lặp for
50
3.2.2 Vòng lặp while
55
3.2.3 Vòng lặp do while
57
3.3 CÁC LỆNH NHẨY
59
3.3.1 Lệnh break
59
3.3.2 Lệnh continue
59
3.3.3 Lệnh return
60
CHƯƠNG 4
61
SỬ DỤNG HÀM TRONG C
61
GIỚI THIỆU
61
4.1 SỬ DỤNG HÀM TRONG C
61
4.2 CẤU TRÚC HÀM
62
4.2.1 Các đối số của một hàm

62
4.2.2 Sự trả về từ một hàm
63
4.2.3 Kiểu giá của một hàm
64
4.3 NGUYÊN MẪU HÀM
65
4.4 ĐỊNH NGHĨA HÀM
65
4.5 GỌI HÀM
66
4.5.1 Truyền tham số cho hàm
67
4.5.2 Sự lồng nhau giữa các lời gọi hàm
69
4.5.3 Hàm trong chương trình nhiều tập tin
70
4.6 PHẠM VI CỦA BIẾN
70
4.6.1 Biến cục bộ
70
4.6.2 Tham số hình thức
71
4.6.3 Biến toàn cục
72
4.7 LỚP LƯU TRỮ
73
4.7.1 Biến tự động (auto)
74
4.7.2 Biến ngoại (extern)

74
4.7.3 Biến tĩnh (static)
75
4.7.4 Biến thanh ghi (register)
76
4.8 ĐỆ QUI
77
4.9 MỘT SỐ THƯ VIỆN THÔNG DỤNG TRONG C
79
CHƯƠNG 5
81
MẢNG, XÂU KÍ TỰ
81
GIỚI THIỆU
81
5.1 KIỂU DỮ LIỆU MẢNG
81
5.1.1 Mảng một chiều
81
5.1.2 Mảng đa chiều
88
5.3 CHUỖI KÍ TỰ
93
5.3.1 Khai báo chuỗi
93
5.3.2 Xuất chuỗi
93
5.3.3 Nhập chuỗi
94
5.3.4 Truyền chuỗi vào hàm

95
5.3.5 Mảng chuỗi kí tự
96
3
5.3.6 Một số hàm trong thư viện string.h
98
CHƯƠNG 6
99
KIỂU DỮ LIỆU CON TRỎ
99
GIỚI THIỆU
99
6.1 MỘT SỐ KHÁI NIỆM CƠ BẢN
99
6.1.1 Cách lưu trữ biến trong bộ nhớ
99
6.1.2 Khái niệm con trỏ
99
6.1.3 Các trường hợp sử dụng con trỏ
100
6.1.4 Khai báo con trỏ
100
6.1.5 Làm việc với con trỏ
100
6.2 CÁC PHÉP TOÁN TRÊN CON TRỎ
102
6.2.1 Gán giá trị cho con trỏ
102
6.2.2 Phép toán số học trên con trỏ
103

6.2.3 Phép toán so sánh con trỏ
104
6.2.4 Con trỏ không kiểu (void) và phép ép kiểu con trỏ
105
6.2.5 Con trỏ đa cấp
106
6.3 TRUYỀN CON TRỎ VÀO HÀM
107
6.4 CON TRỎ VÀ MẢNG MỘT CHIỀU
108
6.5 CON TRỎ VÀ MẢNG NHIỀU CHIỀU
111
6.5.1 Khai báo mảng hai chiều dưới dạng con trỏ
111
6.5.2 Truy xuất đến các phần tử của mảng haichiều:
112
6.6 CON TRỎ VÀ CHUỖI KÍ TỰ
115
6.7 CON TRỎ HÀM
116
6.7.1 Khai báo con trỏ hàm
116
6.7.2 Gán giá trị cho con trỏ hàm
116
6.7.3 So sánh các con trỏ hàm
116
6.7.4 Gọi một hàm thông qua con trỏ hàm
117
6.7.5 Truyền con trỏ hàm như một tham số
118

6.7.6 Trả về một con trỏ hàm
119
6.7.7 Sử dụng mảng các con trỏ hàm
120
6.8 CẤP PHÁT BỘ NHỚ
121
6.8.1 Hàm malloc()
122
6.8.2 Hàm free()
127
6.8.3 Hàm calloc()
127
6.8.4 Hàm realloc()
129
CHƯƠNG 7
131
KIỂU DỮ LIỆU CẤU TRÚC
131
GIỚI THIỆU
131
7.1 KHÁI NIỆM KIỂU DỮ LIỆU CẤU TRÚC
131
7.1.1 Định nghĩa cấu trúc
132
7.1.2 Khai báo biến cấu trúc
133
7.1.3 Truy cập tới các thành phần của một cấu trúc
134
7.1.4 Khởi tạo biến cấu trúc
136

7.1.5 Phép gán đối với biến cấu trúc
137
7.1.6 Cấu trúc lồng trong cấu trúc
137
7.2 MẢNG CẤU TRÚC
139
7.2.1 Khai báo mảng cấu trúc
139
4
7.2.2 Khởi tạo mảng cấu trúc
141
7.3 CON TRỎ CẤU TRÚC
141
7.3.1 Con trỏ tới biến cấu trúc
141
7.3.2 Con trỏ và mảng cấu trúc
143
7.4 TRUYỀN THAM SỐ CẤU TRÚC CHO HÀM
145
7.4.1 Truyền biến cấu trúc vào hàm
145
7.4.2 Truyền mảng cấu trúc vào hàm
150
CHƯƠNG 8
152
QUẢN LÝ TẬP TIN
152
GIỚI THIỆU
152
8.1 KHÁI NIỆM STREAM VÀ TẬP TIN (FILE)

152
8.1.1 Stream văn bản
152
8.1.2 Stream nhị phân
152
8.2 CÁC HÀM VỀ TẬP TIN VÀ CẤU TRÚC FILE
152
8.2.1 Các hàm cơ bản về tập tin
153
8.2.2 Con trỏ tập tin
153
8.3 CÁC TẬP TIN VĂN BẢN
154
8.3.1 Mở một tập tin văn bản
154
8.3.2 Đóng một tập tin văn bản
155
8.3.3 Hàm fprintf()
155
8.3.4 Hàm fscanf()
156
8.3.5 Hàm fputc()
157
8.3.6 Hàm fgetc()
157
8.3.7 Hàm fputs()
158
8.3.8 Hàm fgets()
159
8.4 TẬP TIN NHỊ PHÂN

160
8.4.1 Mở, đóng một tập tin nhị phân
160
8.4.2 Ghi dữ liệu vào một tập tin nhị phân
160
8.4.3 Đọc dữ liệu từ tập tin nhị phân
162
8.5 CÁC HÀM XỬ LÝ TẬP TIN
164
8.5.1 Hàm feof()
164
8.5.2 Hàm rewind()
165
8.5.3 Hàm ferror()
165
8.5.4 Hàm remove()
166
8.5.5 Hàm rename()
166
8.5.6 Hàm fflush()
167
8.5.7 Hàm ftell()
168
8.5.8 Hàm fseek()
169
8.5.9 Các stream chuẩn
170
5
CHƯƠNG 1
NHỮNG KHÁI NIỆM CƠ BẢN VỀ NGÔN NGỮ C

Chương này trình bày các vấn đề sau:
 Giới thiệu
 Các chương trình
dịch C cơ bản
 Đặc điểm của ngôn
ngữ C
 Cấu trúc chương
trình C
 Biên dịch và thực thi một
chương trình C  Các kiểu dữ
liệu cơ sở và dẫn xuất
 Biến, hằng, định danh
 Nhập và xuất trong C
 Sử dụng trình biên dịch Dev-C/C++.
GIỚI THIỆU
Ngôn ngữ C do Brian W.Kernighan và Dennis M.Ritchie phát triển vào đầu
những năm 70 với mục đích ban đầu là phát triển hệ điều hành UNIX. Xuất phát từ
nhu cầu thay thế cho ngôn
ngữ lập trình Assembly vừa nặng nề, độ tin cậy thấp,
khó chuyển đổi giữa các hệ máy tính
khác nhau và khó khăn khi lập trình và nắm
bắt nó.
Trong hệ điều hành UNIX, trên 90% các chương trình nguồn được viết bằng
C, chỉ có
chưa đầy 10% được viết bằng hợp ngữ Assembly. Ngoài ra C được sử dụng nhiều
trong những
bài toán về tin học: Xử lý số, xử lý văn bản, cơ sở dữ liệu, cấu trúc dữ liệu, lập
trình hướng đối
tượng
Vào năm 1978, sách viết về C đầu tiên ra đời mang tên “The Programming

Language” do
Kernighan và Ritchie viết. Sau đó C được Viện Tiêu chuẩn hoá
của Mỹ (ANSI: American
National Standard Institute) làm thành tiêu chuẩn với
tên gọi ANSI C.
C rất hiệu quả để viết các chương trình thuộc nhiều 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ó.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 khả 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 và ít bị lỗi. C có năm kiểu dữ liệu cơ
bản, nhưng nó
không đượ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 bit, byte, word
và con trỏ
(pointer). Vì vậy, nó được dùng cho lập trình mức hệ thống.
1.1 CÁC CHƯƠNG TRÌNH DỊCH C CƠ BẢN
Ngôn ngữ lập trình C hiện tại thường sử dụng các trình dịch sau đây:
- Turbo C/C++, Borland C/C++ của hãng Borland International Inc.
- C-Free của của hãng phần mềm ProgramArts.
- Dev C/C++ của hãng Bloodshed Software.
- Các phần mềm mã nguồn mở Code::Blocks, Eclipse
6
- MSC, VC của Microsoft Corp.
- Lattice C của Lattice.
Sau này, C++ đã được phát triển từ C, bổ sung các yếu tố về lập trình hướng đối
tượng từ C.

1.2 ĐẶC ĐIỂM CỦA NGÔN NGỮ C
Ngôn ngữ lập trình C có một số đặc điểm sau đây:
 C là ngôn ngữ lập trình cấu trúc. Tuy nhiên, C không phải là ngôn ngữ cấu
trúc khối,
không cho phép việc tạo hàm trong hàm.
 C là ngôn ngữ có độ thích nghi cao. Bởi các kiểu dữ liệu và cấu trúc điều
khiển của C
có hầu hết trên các máy tính nên thư viện lúc chạy cần để cài đặt chương
trình khá gọn.
 C độc lập với kiến trúc máy đặc thù, mọi chương trình chạy không liên quan
tới sự thay
đổi về phần cứng của máy tính.
 C được sử dụng rộng rãi trong các lĩnh vực chuyên nghiệp vì đáp ứng được
yêu cầu và
có tính hiệu quả cao.
 C cung cấp những cấu trúc điều khiển như các câu lệnh lựa chọn, lệnh lặp
giống ở
Pascal.
 C cung cấp con trỏ và khả năng định địa chỉ số học.
 C cho phép hàm được gọi đệ quy và các biến cục bộ của hàm sẽ được tự
động sinh ra
hoặc được tạo mới với mỗi lần gọi mới.
 C tương đối thoải mái trong chuyển đổi dữ liệu.
1.3 CẤU TRÚC CƠ BẢN CỦA MỘT CHƯƠNG TRÌNH C
C có chính xác là 32 từ khóa. Những từ khóa này kết hợp với cú pháp của C
hình thành
ngôn ngữ C. Nhưng nhiều trình biên dịch cho C đã thêm vào những từ
khóa dùng cho việc tổ
chức bộ nhớ ở những giai đoạn tiền xử lý nhất định.
Một số quy tắc khi lập trình C như sau:

 Tất cả từ khóa là chữ thường (không in hoa).
 Ðoạn mã trong chương trình C có phân biệt chữ thường và chữ hoa. Ví dụ :
do while thì
khác với DO WHILE.
 Từ khóa không thể dùng cho các mục đích khác như đặt tên biến (variable
name) hoặc
tên hàm (function name).
Cấu trúc cơ bản nhất của C gồm 5 phần: Phần tiền xử lý, phần khai báo các
biến ngoài, các
hàm nguyên mẫu, định nghĩa các hàm và phần chương trình chính.
Một chương trình C thông
thường có dạng như sau:
#include<stdio.h> //Gọi tiền xử lý
#define // định nghĩa hằng xâu ký tự
typedef // Định nghĩa kiểu dữ liệu
function prototype // Nguyên mẫu các hàm
int x,y; // Phần khai báo các biến ngoài
7
void main // Chương trình chính
{
f
l
o
a
t

a
;

i

n
t

k
=
6
;

p
r
i
n
t
f

(
)
;

s
c
a
n
f
(
)
;

các câu lệnh,
lời gọi hàm



getch();
}
function 1//
Định nghĩa hàm
{
các câu lệnh trong thân của hàm
}
function 2
{
các câu lệnh trong thân của hàm
}
Hình 1. 1: Cấu trúc một chương trình C.
 Phần tiền xử lý: Sử dụng các thư viện cần dùng trong chương trình bắt đầu
bằng dấu #
và từ khoá include. Tên thư viện được đặt sau từ khoá include và đặt trong
dấu <>.
Tất cả trình biên dịch C chứa một thư viện hàm chuẩn dùng cho
những tác vụ
chung. Một vài bộ cài đặt C đặt thư viện trong một tập tin (file) lớn trong
khi đa số còn
lại chứa nó trong nhiều tập tin nhỏ. Khi lập trình, những hàm được chứa
trong thư viện
có thể được dùng cho nhiều loại tác vụ khác nhau. Một hàm (được viết bởi
một lập trình
viên) có thể được đặt trong thư viện và được dùng bởi nhiều chương trình
khi được yêu
cầu. Vài trình biên dịch cho phép hàm được thêm vào thư viện chuẩn trong
khi số khác

lại yêu cầu tạo một thư viện riêng.
 Phần khai báo các biến ngoài: Đây là khu vực các biến toàn cục, được
khai báo tại
phần các biến ngoài của chương trình C.
 Khai báo các hàm nguyên mẫu: Trong Pascal chương trình con có 2 loại:
thủ tục và
hàm, ở trong C chỉ có một loại chương trình con duy nhất đó là hàm. Hàm
trong C có
thể trả về giá trị hay không trả về giá trị. Trong các hàm có sử dụng khai
báo các biến
dùng trong phạm vi hàm đó.
 Phần định nghĩa các hàm: Chương trình C được chia thành từng đơn vị
gọi là hàm.
Tên hàm luôn được theo sau là cặp dấu ngoặc đơn (). Trong dấu ngoặc đơn
có thể có
hay không có các tham số (parameters). Một định nghĩa hàm thường gồm
các câu lệnh,
lời gọi hàm, chúng đều được nằm giữa 2 dấu {}. Dấu ngoặc nhọn mở
{ đánh dấu điểm
bắt đầu của một khối mã lệnh, dấu ngoặc nhọn đóng } đánh dấu điểm kết
thúc của khối
mã lệnh đó.
 Phần chương trình chính - Hàm main(): Hàm main() là hàm đầu tiên được
gọi đến khi
một chương trình bắt đầu chạy. Hệ điều hành luôn trao quyền điều khiển cho
hàm main()
8
khi một chương trình C được thực thi. Lệnh getch() cuối thân chương trình
dùng để lưu lại trên màn hình các kết quả.
 Dấu kết thúc câu lệnh: Dòng int x,y; trong đoạn mã mẫu là một

câu lệnh
(statement). Một câu lệnh trong C được kết thúc bằng dấu chấm phẩy (;). C
không hiểu
việc xuống dòng dùng phím enter, khoảng trắng dùng phím spacebar hay
một khoảng
cách do dùng phím tab. Có thể có nhiều hơn một câu lệnh trên cùng một
hàng nhưng
mỗi câu lệnh phải được kết thúc bằng dấu chấm phẩy. Một câu lệnh
không được kết
thúc bằng dấu chấm phẩy được xem như một câu lệnh sai.
 Dòng chú thích (Comment): Những chú thích thường được viết để mô tả
công việc
của một lệnh đặc biệt, một hàm hay toàn bộ chương trình. Trình biên dịch
sẽ không dịch
chúng. Trong C, chú thích bắt đầu bằng ký hiệu /* và kết thúc bằng */.
Trường hợp chú
thích có nhiều dòng, ta phải chú ý ký hiệu kết thúc (*/), nếu thiếu ký hiệu
này, toàn bộ
chương trình sẽ bị coi như là một chú thích. Trong trường hợp chú thích
chỉ trên một
dòng ta có thể dùng //. Ví dụ:
float a; // Biến ‘a’ đã được khai báo như là một kiểu số thực (float)
Giống như trong ngôn ngữ Pascal, ngoài một số phần bắt buộc như phần tiền
xử lý và phần thân chương trình, ngoài ra các phần khác trong chương trình không
nhất thiết phải có. Tới khi nào cần dùng ta sẽ khai báo.
1.4 BIÊN DỊCH VÀ THỰC THI MỘT CHƯƠNG TRÌNH
Những bước khác nhau của việc dịch một chương trình C từ mã nguồn thành
mã thực thi
được thực hiện như sau :
# include file Source file

Tập tin thêm vào Chương trình gốc
Other User-
Library File Compiler
generated
Thư viện Trình biên dịch
Object File
C
ác
tậ
p
tin
th
ực
thi
kh
ác
củ
a
Object File
người dùng
Tập tin đối tượng
Linker
Bộ liên kết
Executable File
Tập tin thực thi
 Soạn thảo/Xử lý từ: Lập trình viên dùng một trình xử lý từ (word processor) hay
trình soạn
thảo (editor) để viết mã nguồn (source code). C chỉ chấp nhận loại mã nguồn
viết dưới dạng
tập tin văn bản chuẩn. Một số trình biên dịch (compiler) C căn bản đã được

liệt kê trong
mục 1.1.
9
 Mã nguồn: Ðây là đoạn văn bản của chương trình mà người dùng có thể đọc.
Nó là đầu
vào của trình biên dịch C.
 Bộ tiền xử lý C: Từ mã nguồn, bước đầu tiên là chuyển nó qua bộ tiền xử lý của C.
Bộ tiền xử
lý này sẽ xem xét những câu lệnh bắt đầu bằng dấu #. Những câu lệnh này gọi
là các chỉ thị
tiền biên dịch (directives). Chỉ thị tiền biên dịch thường được đặt nơi bắt đầu
chương trình mặc
dù nó có thể được đặt bất cứ nơi nào khác. Chỉ thị tiền biên dịch là những tên
ngắn gọn được
gán cho một tập mã lệnh.
 Mã nguồn mở rộng C: Bộ tiền xử lý của C khai triển các chỉ thị tiền biên dịch
và đưa ra
kết quả. Ðây gọi là mã nguồn C mở rộng, sau đó nó được chuyển cho trình biên
dịch C.
 Trình biên dịch C (Compiler): Trình biên dịch C dịch mã nguồn mở rộng thành
ngôn ngữ
máy để máy tính hiểu được. Nếu chương trình quá lớn nó có thể được chia
thành những tập
tin riêng biệt và mỗi tập tin có thể được biên dịch riêng rẽ. Ðiều này giúp ích
khi mà một
tập tin bị thay đổi, toàn chương trình không phải biên dịch lại.
 Bộ liên kết (Linker): Mã đối tượng cùng với những thủ tục hỗ trợ trong thư
viện chuẩn và
những hàm được dịch riêng lẻ khác kết nối lại bởi bộ liên kết để cho ra mã có
thể thực thi

được.
 Bộ nạp (Loader): Mã thực thi được thi hành bởi bộ nạp của hệ thống.
1.5 BIẾN, HẰNG, ĐỊNH DANH
1.5.1 Biến (variable)
Một chương trình ứng dụng có thể quản lý nhiều loại dữ liệu. Trong
trường hợp này,
chương trình phải chỉ định bộ nhớ cho mỗi đơn vị dữ liệu. Khi
chỉ định bộ nhớ, có hai điểm
cần lưu ý như sau :
1. Bao nhiêu bộ nhớ sẽ được gán?
2. Mỗi đơn vị dữ liệu được lưu trữ ở đâu trong bộ nhớ?
Các ngôn ngữ lập trình hiện đại cho phép chúng ta sử dụng các tên tượng
trưng gọi là biến
(variable), chỉ đến một vùng bộ nhớ nơi mà các giá trị cụ thể được lưu trữ. Kiểu dữ
liệu quyết
định tổng số bộ nhớ được chỉ định. Những tên được gán cho biến giúp chúng ta sử
dụng lại dữ
liệu khi cần đến.
Khai báo biến:
<Kiểu dữ liệu> danh sách tên các biến;
Ví dụ:
int a; // khai báo biến a có kiểu dữ liệu là số nguyên
float b; // khai báo biến a có kiểu dữ liệu là số thực.
char c; // khai báo biến a có kiểu dữ liệu là ký tự
Các kí hiệu a, b và c trong đoạn mã trên là các biến. Tên biến giúp chúng ta
tránh phải nhớ địa chỉ của vị trí bộ nhớ. Khi đoạn mã được viết và thực thi, hệ
điều hành đảm nhiệm việc cấp không gian nhớ còn trống cho những biến này. Hệ
điều hành ánh xạ một tên biến đến một vị trí
xác định trong bộ nhớ (ô nhớ). Để
tham chiếu tới một giá trị riêng biệt trong bộ nhớ, chúng ta

chỉ cần chỉ ra tên của
biến.
1.5.2 Hằng (constant)
Khi dùng biến, giá trị được lưu sẽ thay đổi. Một biến tồn tại từ lúc khai báo
đến khi thoát
khỏi phạm vi dùng nó. Những câu lệnh trong phạm vi khối mã lệnh này có thể truy
cập giá trị
10
của biến, thậm chí có thể thay đổi giá trị của biến. Trong thực tế, đôi khi cần sử
dụng một vài
khoản mục mà giá trị của chúng không bao giờ bị thay đổi. Một hằng là một giá trị
không bao giờ
bị thay đổi. Chẳng hạn, 5 là một hằng số, giá trị toán học luôn là 5 và không thể bị
thay đổi.
 Khai báo hằng:
const <Kiểu dữ liệu> <Tên hằng> = Giá trị hằng;
Ví dụ:
const int a = 6;
const float b = 7.5;
 Định nghĩa hằng bằng #define
#define <Tên hằng> <Nhãn của hằng>;
Ví dụ:
#define laptrinh
“ngonnguC”;  Biểu diễn
hằng ký tự:
Trong C, biểu diễn hằng ký tự bằng ký hiệu trong bảng mã ASCII đặt giữa
hai dấu nháy
đơn ví dụ ‘A’ hoặc bằng số thứ tự của ký tự đó trong bảng mã ASCII và đặt
giữa dấu ‘\’ ví
dụ ‘\65’

Ngoài ra còn có một số hằng ký tự đặc biệt ví dụ:
‘\n’: ký tự xuống dòng
‘\0’: ký tự null
‘\t’: ký tự tab.
1.5.3 Định danh (identifier)
Tên của các biến (variables), các hàm (functions), các nhãn (labels) và các đối
tượng khác
nhau do người dùng định nghĩa gọi là định danh. Những định danh
này có thể chứa một hay
nhiều ký tự. Ký tự đầu tiên của định danh phải là một
chữ cái hoặc dấu gạch dưới. Các ký tự
tiếp theo có thể là các chữ cái, các con số
hay dấu gạch dưới.
Ví dụ:
X, sum, m_ncount, Array10: Là những
định danh đúng. 2sum, print!, #Multiple: Là
những định danh sai.
Các định danh có thể có chiều dài tuỳ ý, nhưng số ký tự trong một biến được
nhận diện bởi trình biên dịch thì thay đổi theo trình biên dịch. Các định danh trong
C có phân biệt chữ hoa và chữ thường, cụ thể While sẽ khác while.
 Một số nguyên tắc cho việc chỉ đặt tên định danh
Các quy tắc đặt tên biến khác nhau tuỳ ngôn ngữ lập trình. Tuy nhiên, vài quy
ước chuẩn
được tuân theo như :
 Tên biến phải bắt đầu bằng một ký tự chữ cái.
 Các ký tự theo sau ký tự đầu bằng một chuỗi các chữ cái hoặc con số và cũng
có thể bao
gồm ký tự đặc biệt như dấu gạch dưới.
 Tránh dùng ký tự O tại những vị trí mà có thể gây lầm lẫn với số không (0) và
tương tự chữ

cái l (chữ thường của chữ hoa L) có thể lầm lẫn với số 1.
 Tên riêng nên tránh đặt tên cho biến.
11
 Theo tiêu chuẩn C các chữ cái thường và hoa thì xem như khác nhau chẳng hạn,
biến ADD,
add và Add là khác nhau.
 Việc phân biệt chữ hoa và chữ thường khác nhau tuỳ theo ngôn ngữ lập trình.
Do đó, tốt
nhất nên đặt tên cho biến theo cách thức chuẩn.
 Tên một biến nên có ý nghĩa, gợi tả và mô tả rõ kiểu dữ liệu của nó. Ví dụ, nếu
tìm tổng
của hai số thì tên biến lưu trữ tổng nên đặt là sum (tổng). Nếu đặt tên là s
hay ab12 thì
không hay lắm.
1.5.4 Từ khóa (Keywords)
Tất cả các ngôn ngữ dành một số từ nhất định cho mục đích riêng được gọi là
“từ khóa”.
Những từ này được sử dụng mặc định và có một ý nghĩa đặc biệt
trong ngữ cảnh của từng
ngôn ngữ. Khi đặt tên cho các biến, chúng ta cần bảo
đảm rằng không dùng bất cứ từ khóa nào làm tên biến. C định nghĩa 32 từ khoá
sau đây:
auto double int struct
break else long switch
case enum register typedef
char extern return union
const float short unsigned
continue for signed void
default goto sizeof volatile
do if static while

Bảng 1.1: Từ khóa trong C
Ngoài một số từ khoá dùng để khai báo các kiểu dữ liệu như long, int,
double, float,
còn có các từ khoá của các câu lệnh như if, for, while,
1.6 CÁC KIỂU DỮ LIỆU CƠ SỞ VÀ DẪN XUẤT
Kiểu dữ liệu thường được dùng trong các công cụ lập trình có thể được
phân chia thành:  Kiểu dữ liệu số - lưu trữ giá trị số.
 Kiểu dữ liệu ký tự - lưu trữ thông tin mô tả.
Những kiểu dữ liệu này có thể có tên khác nhau trong các ngôn ngữ lập trình
khác nhau. Ví
dụ, một kiểu dữ liệu số được gọi trong C là int trong khi đó với
Pascal được gọi là integer.
Tương tự, một kiểu dữ liệu ký tự được đặt tên là
char[ ] trong C trong khi đó trong Visual
Basic nó được đặt tên là string. Trong
bất cứ trường hợp nào, các dữ liệu được lưu trữ luôn
giống nhau. Ðiểm khác duy
nhất là các biến được dùng trong một công cụ phải được khai báo theo tên của
kiểu dữ liệu được hỗ trợ bởi chính công cụ đó.
1.6.1 Những kiểu dữ liệu cơ sở
C có 5 kiểu dữ liệu cơ bản là int, float, double, character và void. Tất cả
những kiểu dữ
liệu khác dựa vào một trong số những kiểu này.
 Kiểu dữ liệu int
Là kiểu dữ liệu lưu trữ dữ liệu số nguyên và là một trong những kiểu dữ liệu cơ
bản trong
bất cứ ngôn ngữ lập trình nào. Nó bao gồm một chuỗi của một hay nhiều
con số.
Trong C, để lưu trữ một giá trị số nguyên trong một biến tên là num1, ta khai
báo như sau: int num1;

12
Kích thước của kiểu dữ liệu int được xác định tùy thuộc vào hệ điều hành. Cụ
thể, với hệ
điều hành 16 bit (MS-DOS), mỗi biến được khái báo kiểu int sẽ được
cấp phát 16 bit (2 byte) bộ nhớ, cho phép lưu trữ các số nguyên trong phạm vi
-32768 tới 32767. Với hệ điều hành 32
bit (Windows 9x/2000/NT/XP), kiểu dữ
liệu này có kích thước 4 byte, cho phép lưu trữ các số nguyên trong phạm vi
-2147483648 tới 2147483647.
 Kiểu dữ liệu float
Một biến có kiểu dữ liệu số thực được dùng để lưu trữ các giá trị chứa phần
thập phân.
Trình biên dịch phân biệt các kiểu dữ liệu float và int. Ðiểm khác nhau chính
của chúng là
kiểu dữ liệu int chỉ bao gồm các số nguyên, trong khi kiểu dữ liệu float có thể lưu
giữ thêm cả
các phân số.
Trong C, để lưu trữ một giá trị float trong một biến tên gọi là num2, việc khai
báo như sau: float num2;
Biến đã khai báo là kiểu dữ liệu float có thể lưu giá trị thập phân có độ chính
xác tới 6 con số. Biến này được cấp phát 32 bit (4 byte) của bộ nhớ.
 Kiểu dữ liệu double
Kiểu dữ liệu double được dùng khi giá trị được lưu trữ vượt quá giới hạn về
dung lượng
của kiểu dữ liệu float. Biến có kiểu dữ liệu là double có thể lưu trữ
nhiều hơn khoảng hai lần
số các chữ số của kiểu float. Số các chữ số chính xác mà
kiểu dữ liệu float hoặcdouble có thể lưu trữ tùy thuộc vào hệ điều hành cụ thể của
máy tính.
Các con số được lưu trữ trong kiểu dữ liệu float haydouble được xem như

nhau trong hệ
thống tính toán. Tuy nhiên, sử dụng kiểu dữ liệu float tiết kiệm bộ nhớ một nửa so
với kiểu dữ
liệu double.
Trong C, để lưu trữ một giá trị double trong một biến có tên là num3, sẽ
được khai báo
như sau :
float num3;
Kiểu dữ liệu double cho phép độ chính xác cao hơn (tới 10 con số). Một
biến khai báo
kiểu dữ liệu double chiếm 64 bit (8 byte) trong bộ nhớ.
 Kiểu dữ liệu char
Kiểu dữ liệu char chiếm 1 byte bộ nhớ và được dùng để lưu trữ một ký tự đơn.
Một kiểu dữ liệu char có thể lưu một ký tự đơn được bao đóng trong hai dấu nháy
đơn (‘’). Ví dụ kiểu
dữ liệu char như: ‘a’, ‘m’, ‘$’ ‘%’.
Có thể lưu trữ những chữ số như những ký tự bằng cách bao chúng bên trong
cặp dấu nháy
đơn. Không nên nhầm lẫn chúng với những giá trị số. Ví dụ, ‘1’,
‘5’ và ‘9’ sẽ không được
nhầm lẫn với những số 1, 5 và 9.
 Kiểu dữ liệu void
C có một kiểu dữ liệu đặc biệt gọi là void. Kiểu dữ liệu này chỉ cho trình biên
dịch C biết
rằng không có dữ liệu của bất cứ kiểu nào. Trong C, các hàm số
thường trả về dữ liệu thuộc
một kiểu nào đó. Tuy nhiên, khi một hàm không có

Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×