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

Giáo trình lập trình ngôn ngữ C doc

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.54 MB, 298 trang )
















Giáo trình
Lập trình ngôn ngữ C

Bài
1


Mục t
i

K
ế
t th
ú

¾ P


h
¾ Bi
ế
¾ N
ê
¾ N

¾ Hi
¾ V

¾ Li


Giới t
h

Ngày
n
điều h
ư
nghệ
T
viên c

Ðầu ti
(Progr
a

1.1
R


Khi m

hình.
Ð
tính.
H
máy t
này, h

đưa ra
hay n
h
lệnh t


Để rõ
h
sữa dâ
u
sau :
1.
2.
3.

Bây gi
Chúng
¾
¾


1

i
êu:
ú
c bài học nà
y
h
ân biệt sự kh
á
ế
t được quá t
r
ê
n dùng C kh
i

m được c

u
t

u rõ khái ni


lưu đ

(flo
w


t kê các ký
h
h
iệu
n
ay, khoa họ
c
ư
ớng sự phá
t
T
hông tin và
l

n phải bi
ế
t.
V
ên chúng ta
a
m) và Ph

n
m
R
a lệnh cho
m

t máy tính
đ

Ð
iều này diễ
n
H
ệ điều hành
ính và thi
ế
t
l

đi

u hành
p
lời giải cho
m
h
i

u v

n đ

.
M

o thành một
c
h
ơn, chúng t

a
u
. Anh ta th
ấy
L

y một ít
s
Đổ nước é
p
Trộn hỗn h

ờ n
ế
u bạn củ
a
ta hãy phân
t
Lệnh đầu ti
Lệnh thứ h
a
y
, bạn có th
ể:
á
c nhau giữa
r
ình hình thà
n
i

nào và tại s
a
t
rúc một chư
ơ

m giải thuật
w
chart)
h
iệu dùng tro
n
c
máy tính th
t
tri

n th
ế
gi

l
ập trình nói
c
V
ì th
ế
, trong
tìm hi


u sự
mề
m (Softw
a
m
á
y
tính làm
đ
ược khởi đ

n
ra th
ế

n
ào?
(operating s
y
l
ập các thôn
g
p
hải được c
ấu
m
ột hay nhi

M
ỗi chương t

r
c
hương trình
a
hãy xem xé
t
y
ngon miện
g
s
ữa.
p
dâu vào.

p này và là
m
a
chúng ta th
e
t
ích chỉ thị (l

ê
n : Lệnh nà
y
a
i : Một l

n n


:

Câu lệnh, C
h
n
h C
a
o
ơ
ng t
r
ình C
(algorithms)
n
g lưu đồ
âm nhập vào

i. B

t cứ n
g
c
hung. Cụ th

giáo t
r
ình n
à
khác nhau
c

a
re).
việc

ng, nó sẽ tự
Câu t
r
ả lời
đ
y
stem) được
x
g
s

ban đ

u
t
u
tạo từ một
t
u bài toán n
à
r
ình là tập h

và một nhó
m
t

một thí dụ :
g
và mu

n xi
n
m
lạnh.
e
o những chỉ

nh) ở trên
y
hoàn chỉnh
c

a, lệnh này
k
Nhữn
g

k
h
ương trình v
à
mọi lĩnh vự
c
g
ành nghề nà
o


, C là một
n
à
y, chúng ta s
c
ủa những k
h
động thực t
h
đ
ơn giản là n
h
x
em như ph

tr
ước khi tra
o
t
ập hợp các
c
à
o đóMọi ch
ư

p các câu lệ
n
m
các chương

Một người
b
n
công thức l
à
dẫn này, họ
c
c
hưa ? Nó c
ó
k
hông nói rõ
k
hái niệ
m
à
Phần mềm
c
. Tự động h
ó
o
cũng c

n
p
n
gôn ngữ lập
ẽ nghiên cứ
u
h

ái niệm: L

h
i một s

ti
ến
h
ờ vào Hệ đ
i
n m

m hệ th
o
quy

n cho
n
hương trình.
ư
ơng t
r
ình c


n
h giải quy
ế
t
trình tạo thà

n
b
ạn đ
ế
n nhà
c
à
m. Chúng t
a
c
ũng có th

t

ó
t
r
ả lời được
nước ép dâu

m
cơ bản v

ó
a hiện đang
p
hải hi

u bi
ết

t
r
ình c

p ca
o
u
chi ti
ế
t cấu

nh (Comma
n
n
t
r
ình và x
u
iề
u hành cài
đ

ng. Ph

n m

n
gười dùng.
Mọi chương
g


ng đưa ra
một bài toán
n
h một ph

n
m
c
húng ta chơi
a
hướng dẫn
c

o ra món sữ
a
câu hỏi l

y s

đ

‘ở đâu’.

n
g
ôn n
gữ
là ngành ch


t
ít nhi

u v


o
mà mọi lập
trúc n
g
ôn n
g
n
d), Chương
u
ất kết quả r
a
đ
ặt bên tron
g

m này khởi
Để làm đượ
c
t
r
ình đ

u c



giải pháp ch
o
cụ th

. Một
n
mề
m.
và được mờ
i
c
ho anh ta là
m
a
dâu tuyệt v


a ‘ở đâu’ ?.


C

ch

t
Công
t
r
ình

g
ữ C.
trình
a
màn
g
máy
động
c
đi

u
g

ng
o
một
n
hóm
i
món
m
như

i.


2 Lập trình cơ bản C

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 :
1. Rót một ly sữa vào máy trộn.
2. Đổ thêm vào một ít nước dâu ép.
3. Ðóng nắp máy trộn
4. Mở điện và bắt đầu trộn
5. Dừng máy trộn lại
6. Nế
u đã trộn đều thì tắt máy, ngược lại thì trộn tiếp.
7. Khi đã trộn xong, rót hỗn hợp vào tô và đặt vào tủ lạnh.
8. Ðể 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:
1. Tuần tự
2. Có giới hạn
3.
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à :

1. Nhập số thứ nhất và nhớ nó.
2. Nhập số thứ hai và nhớ nó.
3. 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.

4. Hiển thị kết quả.
5. 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.

Mối
q
bằng
s















1.2
N

Vào đ

dụng l

Marti
n
người
k

Trong
ki

u d


C liên
hành
n

C cũn
g
hành
c

trình s
o
hành
U
Trình
b
thể đư

dịch C

C khi
t
hàm
m
lý dễ
d

1.2.1
C

C đượ
c
những
của m
á
loại m
nhưng
ki

u d


dùng c

1.2.2
C

q
uan hệ giữ
a
s
ơ đồ trong
h

Ng
ôn n
g
ữ C

u những nă
m

n đ

u t
r
ên
m
n
Richards ph
k

hởi thủy ra
C
khi BCPL
v

liệu chính
g
k
ế
t chặt chẽ
v
n
ào. C r

t hiệ
u
g
được dùng
đ
c
ủa máy tín
h
o
ạn thảo (E
d
U
NIX được p
h
b
iên dịch (co


c biên dịch
v
dịch nhanh
v
t
hực thi cũng
m
à chúng sẽ
đ
d
àng mà t

n r

C
– Ngôn ng

c
hi

u là ng
ô
chức năng c

á
y tính như
b
áy tính này
c

nó không đ
ư

liệu. Nó ch
o
ho lập trình
m
C
- Ngôn ng

a
ba khái ni

h
ình 1.1:
Hình
m
70 tại phòn
g
m
ột hệ th

ng
át tri

n. BCP
C
.
v
à B không

h
gồ
m : ki

u ký
v
ới hệ th

ng
u
quả đ

vi
ế
t
c
đ
ể lập trình
h
h
hay những
t
d
itors), chươ
n
h
át tri

n dựa
v

mpiler) C có
v
à chạy trên
m
v
à cho ra mã
r

t nhanh nh
đ
ược tái sử d


t ít công sức

bậc trun
g

ô
n ngữ bậc tr
u

a hợp ngữ (
n
b
its, bytes, đị
a
c
ó th


chạy
t
ư
ợc xem nga
n
o
phép thao t
á
m
ức hệ th

ng

cấu trúc
P
Command
s

m câu lện
h
1.1: Phần m

g
thí nghiệm
B
cài đặt hệ đ
i
L sau đó đã
đ
h

ỗ trợ ki

u d

tự (characte
r
UNIX nhưn
g
c
ác chương t
r
h
ệ th

ng. Mộ
t
t
iện ích hỗ tr

n
g t
r
ình Hợp
v
ào C. C đa
n
sẵn cho h

u
m

áy khác ch

đối tượng k
h
ư hợp ngữ (
A

ng cho chư
ơ
.
u
ng bởi vì n
ó
n
gôn ngữ c

p
a
chỉ…. Hơn
tr
ên một loại
n
g hàng với n
g
á
c trực ti
ế
p t
r
.

P
ro
g
ram 1

s

h
, chương tr
ì

m, chươn
g

t
B
ell, Dennis
iề
u hành U
N
đ
ược Ken Th

liệu, thì C
đ
r
), ki

u s


ng
u
g
không bị tr
ó
r
ình thuộc nh
i
t
chương trìn
h

nó. Hệ đi
ều
Ngữ (Asse
m
n
g được sử d

h
ế
t các máy

c

n thay đ
ổi
h
ông lỗi.
A

ssembly). L

ơ
ng t
r
ình khá
c
ó
k
ế
t hợp nh

th

p). C cho
nữa, mã C r

máy tính k
h
g
ôn ngữ cao
r
ên bits, byte
s
Software

Comman
d
ì
nh và phần

t
r
ì
nh và câu
Ritchie đã p
h
N
IX. C có ng
u
ompson phát
đ
ã có nhi

u
k
u
yên (interge
r
ó
i buộc vào b
iề
u những lĩ
n
h
hệ th

ng c
ó
u
hành (OS),

m
bly) là các c

ng rộng
r
ãi b
tính. Mã lệ
n
i
r

t ít hoặc
k

p t
r
ình viên
c
c
. Do đó, nh


ng y
ế
u t

c

phép thao tá
c


t dễ di chuy
h
ác. Mặc dù
C
c

p v

mặt k
i
s
, word và co
n
Program
2
d
s


mềm có th

lệnh
h
át tri

n ngô
n
u


n g

c từ n
g
triển thành
n
k
i

u dữ liệu
k
r
) và ki

u s


t

t cứ một m
á
n
h vực khác
n
ó
ý nghĩa liê
n
trình thông
d
hương t

r
ình
h
ởi vì tính hiệ
u
n
h vi
ế
t b

ng
C
k
hông thay đ

c
ó th

tạo ra

ng dự án lớ
n

a những ng
ô
c
trên những

n nghĩa là
p

C
có năm ki

iể
u dữ liệu.
C
n
trỏ (pointe
r
2


Command
s

được biểu
n
ngữ C. C đ
ư
g
ôn ngữ BC
P
n
gôn ngữ B,
đ
k
hác nhau.
N
t
hực (float).

á
y tính hay h

n
hau.
n
quan đ
ế
n h

d
ịch (Interpr
e
h
ệ th

ng. H

u
quả và linh
C
trên máy n

i gì cả. Trìn
h
và bảo trì th
ư
n
có th


được
ô
n ngữ c

p c
a
thành phần c
ơ
p
h

n m

m vi
ế

u dữ liệu c
ơ
C
cho phép c
h
r
). Vì vậy, nó
s


diễn
ư
ợc sử
P

L do
đ
ây là
N
hững

đi

u

đi

u
e
ters),

đi

u
hoạt.
ày có
h
biên
ư
viện
quản
a
o và
ơ
bản

ế
t cho
ơ
bản,
h
uy

n
được


4 Lập trình cơ bản 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.

1.3 Cấu trúc chương trình C

C có một số từ khóa, chính xác là 32. 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.

Vài 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)
- Hàm main() luôn là hàm đầu tiên được gọi đến khi một chương trình bắt đầu chạy (chúng ta sẽ
xem xét kỹ hơn ở phần sau)

Xem xét đoạn mã chương trình:


main ()
{
/* This is a sample program */
int i = 0;
i = i + 1;
.
.
}


Ghi
c
xem

1.3.1
Ð

Chươ
n
main()
thi. Tê
n
những

1.3.2
D

Sau đị
n

ngoặc
đánh
d
mã lệ
n

Hơn n

cho c
ấu
1.3.3
D

Dòng
k
ế
t th
ú
phím
s
một h
à
thúc b


1.3.4
D

Nhữn
g

chươn
g
thúc b

hiệu n
à
sampl
e
Ví dụ:

int a =

1.3.5
T

T

t cả
đặt C
đ
Khi lậ
p
Một h
à
chươn
g
khi s




1.4
B

Nhữn
g
hiện n
h

¾
So

c
hú: Những
k
như là đoạn
m
Ð
ịnh n
g
hĩa
H
n
g t
r
ình C đ
ư
. Hệ điều hà
n
n
hàm luôn

đ
tham s

(par
a
D
ấu phân cá
n
h nghĩa hà
m
xo

n đóng }
d

u đi

m b

t
đ
n
h đó. Trong
đ

a, đ

i với h
à
u

trúc vòng l

D
ấu kết thú
c
int i =
0
ú
c b

ng d

u c
s
pacebar hay
à
ng nhưng m


ng d

u ch
ấm
D
òn
g
chú th
í
g
chú thích t

h
g
t
r
ình. Trìn
h

ng */. T
r
ườ
n
à
y, toàn bộ c
h
e
program" l
à
0; // Bi
ế
n ‘a’
T
hư viện C (
t
r
ình biên dị
đ
ặt thư viện
t
p
t

r
ình, nhữn
g
à
m (được vi
ế
g
t
r
ình khi đ
ư
khác lại yêu
c
B
iên dịch và
g
bước khác
n
h
ư sau :
ạn thảo/Xử
l
k
hía cạnh khá
c
m
ã mẫu, nó sẽ
H
àm
ư

ợc chia thà
n
n
h luôn trao
q
đ
ược theo sau
a
meters).
ch (Delimite
m
sẽ là d

u n
g
sau câu lện
h
đầ
u của một
đ
oạn mã mẫu
à
m, d

u ngoặ
c

p và lệnh đi

c

câu lệnh (T
0
; trong đoạ
n
h

m ph

y (;
)
m
ột khoảng

i câu lệnh p
h
m
ph

y được
x
í
ch (Comme
n
h
ường được
v
h
biên
d
ịch sẽ

n
g hợp chú t
h
h
ương trình s

à
dòng chú t
h
đã được kha
Librar
y
)
ch C chứa
m
t
rong một tậ
p
g
hàm được
c
ế
t bởi một lậ
p
ư
ợc yêu c

u.
V
c


u tạo một t
h
thực thi mộ
t
n
hau của việ
c

từ
c
nhau của ch
ư
được dùng lạ
i
n
h từng đơn
v
q
uy

n đi

u
k
là cặp d

u n
g
rs)

g
oặc xo

n m

h
cu

i trong
h
khối mã lện
h
có 2 câu lện
h
c
xo

n cũng
d

u kiện
erminator)

n
mã mẫu là
m
)
. C không hi

cách do dùn

g
h
ải được k
ế
t
x
em như một
n
t)
v
i
ế
t đ

mô tả
không dịch
c
h
ích có nhi
ều

bị coi như
l
h
ích. Trong tr
ư
i báo như là
m
m
ột thư viện

h
p
tin (file) lớ
n
c
hứa trong th
ư
p
t
r
ình viên)
V
ài trình biê
n
h
ư viện riêng
t
chương tr
ìn
c
dịch một c
h
ư
ơng t
r
ình C
đ
i
trong suốt p
h

v
ị gọi là hà
m
k
hi

n cho hà
m
g
oặc đơn ().
T

{. Nó thôn
g
h
àm chỉ ra đ
i
h
, d

u ngoặc
x
h
giữa 2 d

u
n
d
ùng đ


phân
m
ột câu lện
h

u việc xu

n
g
g
phím tab.
C
thúc b

ng d

câu lệnh sai.

công việc c

c
húng. Tron
g
u
dòng, ta ph
l
à một chú th
í
ư
ờng hợp ch

ú
m
ột ki

u s

n
h
àm chuẩn d
ù
n
trong khi đ
a
ư
viện có th


có thể được
n
dịch cho ph
.
n
h (Compili
n
h
ương trình
C
đ
ược xem xét
h

ần còn lại củ
a
m
. Ð
oạn mã
m
m
main() khi
T
rong
d

u ng
o
g
báo đi

m b
iể
m k
ế
t thúc
x
o

n đóng đ
á
n
goặc xo


n.
định những
đ
h
(statement).
g
dòng dùng
p
C
ó th

có nhi

u ch

m ph
ẩy

a một lệnh
đ
g
C, chú thíc
h
ải chú ý ký
h
í
ch. Trong đ
o
ú
thích chỉ t

r
ê
guyên (inter
g
ù
ng cho nhữ
n
a
s

còn lại c
h
được dùng c
h
đặt trong th
ư
ép hàm được
ng
and Run
n
C
từ mã ngu


qua đoạn
m
ã
t
a
giáo trình n

à
m
ẫu
chỉ có
d
một chương
o
ặc đơn có t
h

t đ

u của h
à
của hàm. D

á
nh d

u đi
ểm
đ
oạn mã tron
g
Một câu lện
h
p
hím Enter,
k


u hơn một
c
y
. Một câu lệ
n
đ
ặc biệt, mộ
t
h
b

t đ

u b

n
g
h
iệu k
ế
t thúc
o
ạn
m
ã mẫu
d
ê
n
m
ột dòng

g
er)

n
g tác vụ chu
n
h
ứa nó trong
h
o nhi

u loại
ư
viện và đư

thêm vào th
ư
n
in
g
)

n thành mã
t
t
rên. Ðoạn m
ã
à
y.
d

uy nh

t mộ
t
t
r
ình C đượ
c
h

có hay khô
n
à
m. Tương t


u ngoặc xo

m
k
ế
t thúc củ
a
g
t
r
ường hợp
h
trong C thì
k

hoảng tr

ng
c
âu lệnh trên
n
h không đư

t
hàm hay to
à
g
ký hiệu /*
v
(*/), n
ế
u thi
ế
d
òng chữ "Th
i
ta có thể dù
n
n
g. Một vài
b
nhi

u tập ti
n

tác vụ khác
n

c dùng bởi
n
ư
viện chu

n
t
hực thi đượ
c

ã
này
t
hàm
c
thực
ng có

, d

u

n mở
a
kh

i

dùng
được
d
ùng
cùng

c k
ế
t
à
n bộ
v
à kết
ế
u ký
i
s is a
n
g //.
b
ộ cài
n
nhỏ.
nhau.
n
hi

u
trong
c

thực


6 Lập trình cơ bản C

Ta 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. Vài trình biên dịch
(compiler) cung cấp môi trường lập trình (xem phụ lục) gồm trình soạn thảo.

¾ 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). Điều này sẽ được giải thích sau. 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


M
ã

Ti
ế

























1.5

Chúng
trước
r

Giả s

chúng

BƯỚ
C
BƯỚ
C

BƯỚ
C
BƯỚ
C

Thủ tụ
tập hợ
p

Một g
i
giải q
u

Qua p
h
đó, k
ế

m

u t
h


nạp (Load
e
ã
thực thi đư


ế
n t
r
ình trên
đ
Các bước l
ta thường g

rồ
i sau đó m


chúng ta m
u
ta cần hiểu
n
C
1 : Rời phò
n
C
2 : Ð
ế
n c

u
C
3 : Xu

ng t


C
4 : Ði ti
ế
p đ
c trên liệt kê
p
các bước n
h
i
ải thuật (cò
n
u
y
ế
t v

n đ

.
N
h
ần trên, chú
n
đ
ế
n chúng t
a
h
ông tin đó.
C

# includ
e
Tập tin th
ê
Library
Thư vi

e
r)

c thi hành b

đ
ược mô tả q
u
Hình 1
ập trình giả
i

p phải nhữn
g

i hoạch định
uố
n đi từ ph
ò
n
ó rồi tìm ra c
n
g

thang

ng h

m
ế
n quán ăn t

tập hợp các
b
h
ư vậy gọi là
n
gọi là thuật
N
ó g

m một t

n
g ta thấy rõ
a
c

n tập hợ
p
C
u

i cùng, ch

ú
e
file
ê
m vào
File

n

i bộ nạp của
u
a lưu đ

1.2
.2: Biên dịc
h
i
qu
y
ết vấn
đ
g
bài toán. Đ
các bước c
ần
ò
ng học đ
ế
n
ác bước

g
iải

phục vụ
b
ước thực hi

giải thuật (A
l
toán) có th



p hợp các b
ư
ràng đ

giải
p
t

t cả nhữn
ú
ng ta cho ra
S
o
Chư
ơ
C
o

T
rìn
O
b
Tập t
L
B

Exe
c
Tập
hệ th

ng.
sau :

h
và thực thi
đ


giải quy
ế
t
n
n
làm .
quán ăn tự
p
qu

y
ết trước

n được xác
đ
l
gorithm hay
được định n
g
ư
ớc giúp đạt
đ
quy
ế
t được
m
g thông tin l
i
lời giải của
b
o
urce file
ơ
n
g
trình gốc
o
mpiler
h biên dịch
b

ject File
in đối tượng
L
inker

liên kết
c
utable File
tin thực thi
một chươn
g

n
hững bài to
á
p
hục vụ ở t
ần
khi thực thi
c
đ
ịnh
r
õ ràng
c
gọi v

n tắt l
à
g

hĩa như là
m
đ
ược lời giải.
m
ột bài toán,
i
ên quan tới
n
b
ài toán đó.

t

trình
á
n đó, chúng
n
g h

m. Ð

t
c
ác bước đó:
c
ho việc giải
à
algo ).
m

ột thủ tục, c
ô

trước tiên ta
n
ó. Bước k
ế

Other Us
e
generat
e
Object F
i
Các tập tin
t
t
hi khác của
n
dùng
ta cần hiểu
c
hực hiện việ
c
quy
ế
t v

n đ


ô
ng thức ha
y
phải hiểu bà
i
sẽ là xử lý
n
e
r-
e
d
i
le
t
hực
ng
ười

c
húng
c
này
. Một
y
cách
i
toán
n
hững



8 Lập trình cơ bản C

Giải thuật chúng ta có là một tập hợp các bước được liệt kê dưới dạng ngôn ngữ đơn giản. Rất có thể
rằng các bước trên do hai người khác nhau viết vẫn tương tự nhau nhưng ngôn ngữ dùng diễn tả các
bước có thể khác nhau. Do đó, cần thiết có những phương pháp chuẩn mực cho việc viết giải thuật để
mọi người dễ dàng hiểu nó. Chính vì vậy , giải thuật được viế
t bằng cách dùng hai phương pháp chuẩn
là mã giả (pseudo code) và lưu đồ (flowchart).

Cả hai phương pháp này đều dùng để xác định một tập hợp các bước cần được thi hành để có được lời
giải. Liên hệ tới vấn đề đi đến quán ăn tự phục vụ trên, chúng ta đã vạch ra một kế hoạch (thuật toán)
để đến đích. Tuy nhiên, để đến nơi, chúng ta phải cần thi hành những bước này thật s
ự. Tương tự, mã
giả và lưu đồ chỉ đưa ra những bước cần làm. Lập trình viên phải viết mã cho việc thực thi những
bước này qua việc dùng một ngôn ngữ nào đó.

Chi tiết về về mã giả và lưu đồ được trình bày dưới đây.

1.5.1 Mã giả (pseudo code)


Nhớ rằng mã giả không phải là mã thật. Mã giả sử dụng một tập hợp những từ tương tự như mã thật
nhưng nó không thể được biên dịch và thực thi như mã thật.

Chúng ta hãy xem xét mã giả qua ví dụ sau.Ví dụ này sẽ hiển thị câu 'Hello World!'.

Ví dụ 1:

BEGIN

DISPLAY 'Hello World!'
END

Qua ví dụ trên, mỗi đoạn mã giả phải bắt đầu với từ BEGIN hoặc START, và kết thúc vớ
i từ END hay
STOP. Ðể hiển thị giá trị nào đó, từ DISPLAY hoặc WRITE được dùng. Khi giá trị được hiển thị là
một giá trị hằng (không đổi), trong trường hợp này là (Hello World), nó được đặt bên trong dấu nháy.
Tương tự, để nhận một giá trị của người dùng, từ INPUT hay READ được dùng.

Ðể hiểu điều này rõ hơn, chúng ta xem xét ví dụ 2, ở ví dụ này ta sẽ nhập hai số và máy sẽ hiển thị
tổng c
ủa hai số.

Ví dụ 2:

BEGIN
INPUT A, B
DISPLAY A + B
END

Trong đoạn mã giả này, người dùng nhập vào hai giá trị, hai giá trị này được lưu trong bộ nhớ và có
thể được truy xuất như là A và B theo thứ tự. Những vị trí được đặt tên như vậy trong bộ nhớ gọi là
biến. Chi tiết về biến sẽ được giải thích trong phần sau của chương này. Bước kế tiếp trong đoạn mã
gi
ả sẽ hiển thị tổng của hai giá trị trong biến A và B.

Tuy nhiên, cũng đoạn mã trên, ta có thể bổ sung để lưu tổng của hai biến trong một biến thứ ba rồi
hiển thị giá trị biến này như trong ví dụ 3 sau đây.

Ví dụ 3:


BEGIN
INPUT A, B

C
D
I
END

Một t

c

u tr
ú
Chúng
đi

m
đ

1.5.2

Một l
ư
hoạt đ


Ð


hi

‘Hello


Lưu đ

hay S
T
nhiên,
tương


= A + B
I
SPLAY C

p hợp những
ú
c : tu

n tự, c
h
được gọi n
h
đầ
u tiên. Hai
l
Lưu đồ (Fl
ư

u đồ là một

ng trong mộ

u đi

u này r
õ
World!’.

gi

ng với
đ
T
OP. Tương
t
ở đây, mọi t


ng được trì
n
chỉ thị hay
c
h
ọn lựa và l

h
ư vậy vì nh


l
oại c

u trúc
c
owcharts)
hình ảnh mi
n
t ti
ế
n trình.
M
õ
hơn, chún
g
đ
oạn mã giả
l
t
ự, từ khóa
D

khóa thì n

n
h bày ở bản
g
c
ác bước tro
n


p lại. Trong
đ

ng chỉ thị đ
ư
c
òn lại sẽ đư

n
h hoạ cho
g
M
ỗi hoạt độn
g
g
ta xem lưu
đ
DIS P L

n
l
à cùng b

t đ

D
ISPLAY đ
ư


m trong nhữ
n
g
trong Hình
1
Hình 1.4:
n
g mã giả thì
đ
oạn mã giả
t
ư
ợc thi hành

c đ

cập tro
n
g
iải thuật. Nó
g
như vậy đư

đ
ồ trong hìn
h
START
AY 'Hello W o
r
STO P

n
h 1.3: Lưu
đ


u với từ B
E
ư
ợc dùng đ


h
n
g ký hiệu.
N
1
.4.

K
ý
hiệu tro
n
được gọi ch
u
t
a vi
ế
t ở t
r
ên,

tuần tự, cái
n
n
g những chư
ơ
vẽ ra bi

u
đ

c bi

u diễn
q
h
1.3 dùng h
i
r
ld!'

đ

E
GIN hoặc S
T
h
i

n thị giá t
r

N
hững ký hiệ
u
ng
lưu đồ

u
ng là một c

chúng ta dù
n
n
ày sau cái
k
ơ
ng sau.
đồ
của lu

ng
q
ua những ký
i

n thị thông
T
ART, và k
ết
r
ị nào đó đ

ến
u
khác nhau
m


u trúc. Có b
a
n
g c

u trúc tu

k
hác và b

t
đ
chỉ thị hay
n
hiệu.
điệp truy

n
t
t
thúc với từ
n
người dùng
m

ang một ý
n

a
loại

n tự.
đầ
u từ
n
hững
t
h

ng
END
. Tuy
n
ghĩa


10 Lập trình cơ bản C

Ta hãy xét lưu đồ cho ví dụ 3 như ở Hình 1.5 dưới đây.



Hình 1.5: Lưu đồ cộng hai số

Tại bước mà giá trị của hai biến được cộng và gán cho biến thứ ba thì xem như là một xử lý và được

trình bày bằng một hình chữ nhật.

Lưu đồ mà chúng ta xét ở đây là đơn giản.Thông thường, lưu đồ trải rộng trên nhiều trang giấy. Trong
trường hợp như thế, biểu tượng bộ nối được dùng để chỉ đi
ểm nối của hai phần trong một chương trình
nằm ở hai trang kế tiếp nhau. Vòng tròn chỉ sự nối kết và phải chứa ký tự hoặc số như ở hình 1.6. Như
thế, chúng ta có thể tạo liên kết giưa hai lưu đồ chưa hoàn chỉnh.


Hình 1.6: Bộ nối

Bởi vì lưu đồ được sử dụng để viết chương trình, chúng cần được trình bày sao cho mọi lập trình viên
hiểu chúng dễ dàng. Nếu có ba lập trình viên dùng ba ngôn ngữ lập trình khác nhau để viết mã, bài
toán họ cần giải quyết phải như nhau. Trong trường hợp này, mã giả đưa cho lập trình viên có thể
giống nhau mặc dù ngôn ngữ lập trình họ dùng và tất nhiên là cú pháp có thể khác nhau. Nhưng kết
quả cuối cùng là mộ
t. Do đó, cần thiết phải hiểu rõ bài toán và mã giả phải được viết cẩn thận. Chúng
ta cũng kết luận rằng mã giả độc lập với ngôn ngữ lập trình.

Vài điểm cần thiết khác phải chú ý khi vẽ một lưu đồ :
¬ Lúc đầu chỉ tập trung vào khía cạnh logic của bài toán và vẽ các luồng xử lý chính của lưu đồ
¬ Một lưu đồ phải có duy nhất m
ột điểm bắt đầu (START) và một điểm kết thúc (STOP).
Ký hiệu bắt đầu: Dùng ở đây để bắt
đầu lưu đồ
Ký hiệu xuất/nhập: Dùng ở đây để
nhập hai số A, B
Ký hiệu xử lý: Dùng ở đây để cộng
hai số
Ký hiệu xuất/nhập: Dùng ở đây để

hiển thị tổng C
Ký hiệu kết thúc: Dùng ở đây kết thúc
lưu đồ

¬
K
h


Chúng
chỉ thị
các đi

như là
đây:

¾
C


C

đó
ch
ư
10

Ði




C



n

M

qu
y
(k
h

u

C
h



Y
ê
ta
x

B
E
E
N


Ð
o
ph

L
ư

h
ông c

n thi
ết
ý ngh
ĩ
a c

n
t
ta tuân theo
b

t đ

u từ c
h

u kiện này h
ư
c


u trúc chọ
n

u trúc IF (
N

u trúc chọn
l
khách hàng
ư
ơng t
r
ình sẽ
% của t

ng s


u này được
m
IF khách h
à

u trúc dùng

n
h thức chun
IF Đi


u kiệ
n


c

END IF

t c

u trúc ‘
I
y

n đi

u khi

h
ông thỏa đi

u
lệnh sau E
N
h
úng ta xem
v
dụ 4:
ê
u c


u: Ki

m
x
ử lý như sa
u
E
GIN
INPUT nu
m
r = num M
O
IF r=0
Di
s
END IF
N
D

o
ạn mã trên
n

n
d
ư có b

n
g

ư
u đ

cho đo

t
phải mô tả t

t
hi
ế
t.
những c

u t
r
h
ỉ thị đ

u tiê
n
ư
ớng thực th
i
n
lựa, c

u trú
N
ếu)

l
ựa cơ bản là
được giảm g
i
ki

m t
r
a xe
m

ti

n trả, ng
ư
m
inh họa sơ
l
à
ng mua trên

đây là câu l

g cho câu lệ
n
n

c
câu
l

ệnh
I
F’ b

t đ

u l
à

n sẽ được c
h

u kiện), nhữ
n
N
D IF (ch

m
d
v
í
d
ụ 4 cho c

xem một s


l
u
:

m

O
D 2
s
play “Numb
e
n
hập một s

t

g
0 hay khôn
g

n mã giả trê
n

ng bước củ
a
r
úc tu

n tự,
m
n
. Chúng ta
c
i

của chương
c đi

u kiện h
c

u trúc ‘IF

i
á n
ế
u mua t
r
m
lượng ti

n
t
ư
ợc lại thì kh
ô
l
ược qua mã
g
100 thì giảm

nh IF.
n
h IF (c


u trú
c

à
IF theo sau
h
uy

n đ
ế
n cá
c
n
g câu lệnh ở
d
ứt c

u trúc
I

u trúc IF.
l
à chẵn hay k
h
e
r is even”

người dùn
g
g

. N
ế
u b

ng
0
n
th

hiện qu
a
a
chương trìn
h
m
à trong đó l
u
c
ó th

b

t gặ
p
t
r
ình có th


ay rẽ nhánh.


. Ð

hi

u c
ấu
r
ên 100 đ

n
g
t
rả có quá 10
0
ô
ng giảm giá
.
g
iả như sau:
giá 10%
c
IF) như sau

P

là đi

u kiện.
c

câu lệnh tr
o
ph

n thân k
h
I
F). C

u trúc
I
h
ông và hi

n
g
, thực hiện t
o
0
hi

n thị thô
n
a
hình 1.7.
h
trong lưu đ

u


ng thực th
i
p
các đi

u ki

rẽ nhánh. N
h
Những c

u t
r
u
trúc này ch
ú
g
. Mỗi l

n kh
á
0
đ

ng khôn
g
.

:
P

h

n thân củ
a
N
ế
u đi

u k
i
o
ng ph

n thâ
n
h
ông được th

I
F phải được
thị thông điệ
p
o
án tử MOD
n
g điệp, ngư



mà chỉ c


n
i
chương trìn
h

n trong chư
ơ
h
ững c

u trúc
r
úc này được
ú
ng ta hãy x
e
á
ch hàng trả
t
g
?. N
ế
u đúng
a
c

u trúc IF
i
ện là đúng (

t
n
đ

thực thi.

c thi và chư
ơ
k
ế
t thúc b

n
g
p
báo n
ế
u đú
n
(l

y ph

n
d
ư

c lại thoát r
a
các bước chí

n
h
đi qua t

t
c
ơ
ng t
r
ình, dự
a
cho việc rẽ
n
đ

cập chi ti
ế
e
m xét ví
d

t
i

n, một đo

th
ế
thì sẽ giả
m

t
hỏa đi

u kiệ
n
N
ế
u đi

u ki

ơ
ng t
r
ình nhả
y
g
END IF.
n
g là s

chẵn
ư
) và ki

m tr
a
a
.


n
h và
c
ả các
a
t
r
ên
n
hánh
ế
t sau
trong

n mã
m
giá
n
) thì

n sai
y
đ
ế
n
,
a
xem



12 Lập trình cơ bản C

START
INPUT num
r = num MOD 2
r = 0
DISPLAY "Number is Even"
STOP

Hình 1.7 : Kiểm tra số chẵn

Cú pháp của lệnh IF trong C như sau:

if (Điều kiện)
{
Câu lệnh
}

¾ Cấu trúc IF…ELSE

Trong ví dụ 4, sẽ hay hơn nếu ta cho ra thông điệp báo rằng số đó không là số chẵn tức là số lẻ
thay vì chỉ thoát ra. Ðể làm điều này ta có thể thêm câu lệnh IF khác để kiểm tra xem trường hợp
số đó không chia hết cho 2. Ta xem ví dụ 5.

Example 5:

BEGIN
INPUT num
r = num MOD 2
IF r=0

DISPLAY “Even number”
END IF

IF r<>0
DISPLAY “Odd number”
END IF
END

Ngôn ngữ lập trình cung cấp cho chúng ta cấu trúc
IF…ELSE. Dùng cấu trúc này sẽ hiệu quả và
tốt hơn để giải quyết vấn đề. Cấu trúc IF …ELSE giúp lập trình viên chỉ làm một phép so sánh và
sau đó thực thi các bước tùy theo kết quả của phép so sánh là True (đúng) hay False (sai).

Cấu trúc chung của câu lệnh IF…ELSE như sau:

IF Điều kiện
No
Yes


C
ú


N
ế
b
a
o
ra




B
E
E
N

L
ư



u

ELSE


u

END IF
ú
pháp của c
ấu
if(Đi

u kiệ
n
{


u
}
else
{

u
}
ế
u đi

u kiện
t
o
giờ cả hai
đ
như ví dụ 6.
dụ 6:
E
GIN
INPUT nu
m
r = num M
O
IF r = 0
DI
S
ELSE
DI
S
END IF

N
D
ư
u đ

cho đo

u
lệnh 1
u
lệnh 2
u
trúc if…els
n
)
u
lệnh 1
u
lệnh 2
t
hỏa (True),
c
đ
ược thực thi
m

O
D 2
S
PLAY “Eve

n
S
PLAY “Od
d

n mã giả trê
n
e trong C nh
ư
c
âu lệnh 1 đ
ư
cùng lúc. Vì
n
Number”
d
Number”
n
th

hiện qu
a
ư
sau:
ư
ợc thực thi.
N
vậy, đoạn m
ã
a

Hình 1.8.
N
gược lại, câ
u
ã
tối ưu hơn
c

u lệnh 2 đượ
c
ho ví dụ tì
m
c thực thi.
K
m
số chẵn đượ
c

K
hông
c
vi
ế
t


14 Lập trình cơ bản C

START
INPUT num

r = num MOD 2
r = 0
DISPLAY "Number is Even"
STOP
DISPLAY "Number is Odd"

Hình 1.8: Số chẵn hay số lẻ

¾ Ða điều kiện sử dụng AND/OR

Cấu trúc IF…ELSE làm giảm độ phức tạp, gia tăng tính hữu hiệu. Ở một mức độ nào đó, nó cũng
nâng cao tính dễ đọc của mã. Các thí dụ IF chúng ta đã đề cập đến thời điểm này thì khá đơn giản.
Chúng chỉ có một điều kiện trong IF để đánh giá. Thỉnh thoảng chúng ta phải ki
ểm tra cho hơn
một điều kiện, thí dụ: Ðể xem xét nhà cung cấp có đạt MVS (nhà cung cấp quan trọng nhất)
không?, một công ty sẽ kiểm tra xem nhà cung cấp đó đã có làm việc với công ty ít nhất 10 năm
không? và đã có tổng doanh thu ít nhất 5,000,000 không?. Hai điều kiện thỏa mãn thì nhà cung
cấp được xem như là một MVS. Do đó toán tử AND có thể được dùng trong câu lệnh ‘IF’ như
trong ví dụ 7 sau:

Ví dụ 7:

BEGIN
INPUT yearsWithUs
INPUT bizDone
IF yearsWithUs >= 10 AND bizDone >=5000000
DISPLAY “Classified as an MVS”
ELSE
DISPLAY “A little more effort required!”
END IF

END

Ví dụ 7 cũng khá đơn giản, vì nó chỉ có 2 điều kiện. Ở tình huống thực tế, chúng ta có thể có nhiều
điều kiện cần được kiểm tra. Nhưng chúng ta có thể dễ dàng dùng toán tử AND để nối những điều
kiện lại giống như ta đã làm ở trên.

Bây giờ, giả sử công ty trong ví dụ trên đổi quy định, họ quyết định đưa ra điều ki
ện dễ dàng hơn.
Như là : Hoặc làm việc với công ty trên 10 năm hoặc có doanh số (giá trị thương mại,giao dịch)
No Yes

từ
ra

¾
C


M

lệ
n
nh

V
í

B
E
E

N

Ð
o
IF
tr
a
th

qu

u
N
ế
th
ì

L
ư

5,000,000 tr

giá t
r
ị True (
đ

u trúc IF lồ
n


t cách khác
đ
n
h IF này n
ằm
au ở ví dụ 8
n
í
dụ 8:
E
GIN
INPUT y
e
INPUT b
i
IF year
s
IF bi
DI
S
EL
S
DISPL
END I
ELSE
DISPL
END IF
N
D
o

ạn mã trên t
h
(ki

m tra xe
m
a
xem years
W

i gian nhà c
u
ả trả v

là F
a
u
lệnh IF thứ
ế
u thỏa đi

u
k
một thông đ
i
ư
u đồ cho mã

lên. Vì vâỵ
,

đ
úng) n
ế
u ch

ng
nhau
để
thực hiện
m
trong tron
g
n
hư sau:
e
arsWithU
s
i
zDone
s
WithUs >
=
zDone >=
5
S
PLAY “Cl
S
E
AY “A li
t

F
AY “A li
t
h
ực hiện cùn
g
m
bizDone l

W
ithUs lớn h
ơ
u
ng cấp làm
v
a
lse), nó sẽ k
h
hai, nó sẽ ki

k
iện (k
ế
t quả
t
i
ệp báo r

ng
đ

giả của ví d

,
ta thay th
ế

t

c

n một đi
ều
ví dụ 7 là sử
g
câu lệnh IF
s

=
10
5
000000
assified
t
tle more
t
tle more
g
nhiệm vụ n
h


n hơn hoặc
b
ơ
n hoặc b

ng
v
iệc với côn
g
h
ông công n
h

m tra tới đi

t
rả v

là Tru
e
đ
ó không là
m

8 được trình
t
oán tử AND
u
kiện là Tru
e

dụng c

u trú
c
khác. Chún
g
as an
M
V
S
effort r
effort r
h
ưng không
c
bằ
ng 5,000,0
0
10 hay khôn
g
g
ty có lớn h
ơ
h
ận nhà cung

u kiện bizD
o
e
) lúc đó nhà

m
ột MVS.
bày qua hìn
h
b

ng toán t

e
.
c
IF l

ng nh
a
g
ta vi
ế
t lại v
í
S

equired!

equired!

c
ó ‘AND’. T
u
0

0 hay không
?
g
?). Câu lện
h
ơ
n 10 năm ha
y
cấp là một
M
o
ne lớn hơn h
o
cung cấp đư

h
1.9.


OR. Nhớ r
ằn
a
u. C

u trúc I
F
í
dụ 7 sử dụ
n





u
y nhiên, ch
ú
?
) bên trong
l
h
IF đ

u tiên
y
không. N
ếu
M
VS; N
ế
u th

o
ặc b

ng 5,0
0

c xem là mộ
t
n

g toán tử O
R
F
l

ng nhau
l
n
g c

u trúc I
F
ú
ng ta có một
l
ệnh IF khác
(
kiểm tra đi
ều
u
dưới 10 nă
m

a đi

u kiện
n
0
0,000 hay k
h

t
MVS, n
ế
u
k

R
cho
l
à câu
F
l

ng
lệnh
(
ki

m
u
kiện
m
(k
ế
t
n
ó xét
h
ông.
k

hông


16 Lập trình cơ bản C

START
INPUT yearsWithUs
INPUT bizDone
yearsWithUs >= 10
DISPLAY "A little more effort required!"
bzDone > 5000000
DISPLAY "Classified as an MVS" DISPLAY "A little more effort required!"
STOP


Hình 1.9: Câu lệnh IF lồng nhau

Mã giả trong trường hợp này của cấu trúc IF lồng nhau tại ví dụ 8 chưa hiệu quả. Câu lệnh thông
báo không thỏa điều kiện MVS phải viết hai lần. Hơn nữa lập trình viên phải viết thêm mã nên
trình biên dịch phải xét hai điều kiện của lệnh IF, do đó lãng phí thời gian. Ngược lại, nếu dùng
toán tử AND chỉ xét tới điều kiện của câu lệnh IF mộ
t lần. Ðiều này không có nghĩa là cấu trúc IF
lồng nhau nói chung là không hiệu quả. Nó tùy theo tình huống cụ thể mà ta dùng nó. Có khi dùng
toán tử AND hiệu quả hơn, có khi dùng cấu trúc IF lồng nhau hiệu quả hơn. Chúng ta sẽ xét một
ví dụ mà dùng cấu trúc IF lồng nhau hiệu quả hơn dùng toán tử AND.

Một công ty định phần lương cơ bản cho công nhân dựa trên tiêu chuẩn như trong bảng 1.1.

Grade Experience Salary
E 2 2000

E 3 3000
M 2 3000
M 3 4000

Bảng 1.1: Lương cơ bản

Vì vậy, nếu một công nhân được xếp loại là E và có hai năm kinh nghiệm thì lương là 2000, nếu
ba năm kinh nghiệm thì lương là 3000.

Mã giả dùng toán tử AND cho vấn đề trên như ví dụ 9:

Yes No
No Yes



B
E
E
N

C
â
ng
h

ơ
N
ế
ki

n
Gi
th
e
tại
củ
a

t
kh

c

B
â

dụ 9:
E
GIN
INPUT g
r
INPUT e
x
IF grad
e
salar
ELSE
IF gr
sa
l

END I
END IF

IF grad
e
salar
ELSE
IF gr
sa
l
END I
END IF
N
D
â
u lệnh IF đ
ầu
h
iệm là 2 nă
m
ơ
ng là 3000.
ế
u cả 2 đi

u
k
n
h nghiệm ch
ả sử x

ế
p loại
e
o mệnh đ

I
F
mệnh đ

IF
a
câu lệnh I
F
t
qua. Trong
oảng 15 loại
t
c
định tại câ
u
â
y giờ chúng
t
r
ade
x
p
e
=”E” AN
D

y=2000
ade = “E

l
ary=3000
F
e
=”M” AN
D
y=3000
ade = “M

l
ary=4000
F
u
tiên ki

m tr
a
m
thì lương l
à
k
iện không th

o công nhân
đ
của một côn
g

F
đ

u tiên. P
h
thứ hai sẽ đ
ư
F
thứ 2 và k
ết
ví dụ, ta ch

t
hì sẽ t

n th

u
lệnh IF đ

u
t
t
a xét mã giả
D
exp =2

AND exp
=


D
exp =2

AND exp
=

a
x
ế
p loại và
k
à
2000, ngoài

a thì câu lệ
n
để
phân định
g
nhân là E
v
h
ần còn lại c

ư
ợc xét và t
ất
t
quả cũng là


có hai câu
l

i gian và tài
n
t
iên. Ðây dứt

d
ùng c

u tr
ú
=
3
=
3
kinh nghiệm
ra n
ế
u x
ế
p l
o
n
h IF thứ hai
c
lương.
v
à có hai nă

m

a câu lệnh I
F
t
nhiên là kh
ô
False. Ðây
q
l
ệnh IF bởi
v
n
guyên máy
t
khoát không
ú
c IF l

ng nh
a
của công nh
â
o
ại E, nhưng
c
c
ũng tương t

m

kinh nghiệ
m
F
thứ nh

t đư

ô
ng thỏa, do
q
uả là những
v
ì ta chỉ xét
c
t
ính cho việc
phải là mã n
g
a
u đã được s


â
n. N
ế
u x
ế
p l
o
c

ó 3 năm kin
h

sẽ ki

m đi
ều
m
. Lương ng
ư

c bỏ qua. T
u
đó nó ki

m
t
bước thừa
m
c
ó hai loại l
à
tính toán thừ
a
g
uồn hiệu qu

a đ

i trong

v
o
ại là E và ki
n
h
nghiệm thì
u
kiện x
ế
p lo

ư
ời đó sẽ đượ
c
u
y nhiên, đi
ều
t
ra mệnh đ


E
m
à chương trì
n
à
E và M. N
ế
a
mặc dù lươ

n
ả.
v
í dụ 10.

n
h

i và
c
tính
u
kiện
E
LSE
n
h đã
ế
u có
n
g đã


18 Lập trình cơ bản C

Ví dụ 10:

BEGIN
INPUT grade
INPUT exp

IF grade=”E”
IF exp=2
salary = 2000
ELSE
IF exp=3
salary=3000
END IF
END IF
ELSE
IF grade=”M”
IF exp=2
Salary=3000
ELSE
IF exp=3
Salary=4000
END IF
END IF
END IF
END IF
END


Ðoạn mã trên nhìn khó đọc. Tuy nhiên, nó đem lại hiệu suất cao hơn. Chúng ta xét cùng ví dụ như
trên. Nếu công nhân được xếp loại là E và kinh nghiệm là 2 năm thì lương được tính là 2000 ngay
trong bước đầu của câu lệnh IF. Sau đó, chương trình sẽ thoát ra vì không cần thực thi thêm bất cứ
lệnh ELSE nào. Do đó, không có sự lãng phí và đoạn mã này mang lại hiệu suất cho chương trình
và chương trình chạy nhanh hơn.

¾ Vòng lặp


Một chương trình máy tính là một tập các câu l
ệnh sẽ được thực hiện tuần tự. Nó có thể lặp lại một
số bước với số lần lặp xác định theo yêu cầu của bài toán hoặc đến khi một số điều kiện nhất định
được thỏa.

Chẳng hạn, ta muốn viết chương trình hiển thị tên của ta 5 lần. Ta xét mã giả dưới đây.

Ví dụ 11:

BEGIN
DISPLAY “Scooby”
DISPLAY “Scooby”
DISPLAY “Scooby”
DISPLAY “Scooby”
DISPLAY “Scooby”
END

N
ếu để hiển thị tên ta 1000 lần, nếu ta viết DISPLAY “Scooby” 1000 lần thì rất tốn công sức. Ta
có thể tinh giản vấn đề bằng cách viết câu lệnh DISPLAY chỉ một lần, sau đó đặt nó trong cấu trúc
vòng lặp, và chỉ thị máy tính thực hiện lặp 1000 lần cho câu lệnh trên.


T
a



D
o


E
n

N
h
10
lặ
p

u





B
E
E
N


L
ư


Chú ý
phân
n
(flow

_
a
xem mã giả
dụ 12:
o
loop 10
0
DISPLAY
n
d loop
h
ững câu lện
h
00 l

n. Nhữ
n
p
. C

u trúc v
ò
u
c

u thực th
i
dụ sau là cá
c
dụ 13:

E
GIN
cnt=0
WHILE
(
c
DO
DISPL
cnt=c
END DO
N
D
ư
u đồ cho mã
rằng Hình 1.
1
n
hánh đ

ki
ểm
_
lines).
của c

u trúc
v
0
0 times
“Scooby”

h
n

m giữa
D
n
g câu lệnh n
ò
ng lặp giúp
l
i
hàng ngàn
c
c
h vi
ế
t khác
n
c
nt < 100
0
AY “Scoo
b
nt+1
giả trong ví
d
1
0 không có
k
m

tra đi

u k
i
v
òng lặp tro
n
D
o loop và E
n
ày cùng với
c
l
ập t
r
ình viê
n
c
âu lệnh. Do
l
n
hưng cũng d
ù
0
)
b
y”
d
ụ 13 được
v

c
DIS
P
c
Hình 1.1
0
k
ý hiệu đặc
b
i
ện và quản
N
n
g ví dụ 12
n
n
d loop (tron
g
c
ác lệnh do
l
n
phát tri

n t
h
l
oop…end lo
ù
ng c


u trúc
v
v
ẽ trong Hình
START
cnt=0
c
nt < 1000
P
LAY "Scooby"
c
nt=cnt+1
STOP

0
: Cấu trúc
v

b
iệt nào đ

bi

lý hướng đi
N
o
n
hư sau:
g

ví dụ trên l
à
l
oop và end
l
h
ành những c
h
op là một dạ
n
v
òng lặp.
1.10.

v
òng lặp

u diễn cho v
ò
của của ch
ư
Yes

à
lệnh DISPL
A
l
oop được g

h

ương trình l

n
g thức t

ng
q
ò
ng lặp. Chú
n
ư
ơng t
r
ình b
ằn
A
Y) được th


i là c

u trúc

n trong đó
c
q
uát của vòn
g
n
g ta

d
ùng k
ý
n
g các dòng


c thi
vòng
c
ó th


g
lặp.
ý
hiệu
chảy


20 Lập trình cơ bản C

Tóm tắt bài học

¾ Phần mềm là một tập hợp các chương trình.

¾ Một chương trình là một tập hợp các chỉ thị (lệnh).

¾ Những đoạn mã lệnh là cơ sở cho bất kỳ một chương trình C nào.


¾ Ngôn ngữ C có 32 từ khóa.

¾ Các bước cần thiết để giải quyết một bài toán là nghiên cứu chi tiết bài toán đó, thu thập thông tin
thích hợp, xử lý thông tin và đi đến k
ết quả.

¾ Một giải thuật là một danh sách rút gọn và logic các bước để giải quyết vấn đề. Giải thuật được
viết bằng mã giả hoặc lưu đồ.

¾ Mã giả là sự trình bày của giải thuật trong ngôn ngữ tương tự như mã thật

¾ Một lưu đồ là sự trình bày dưới dạng biểu đồ của một giải thuật.

¾ Lưu đồ có thể chia nhỏ thành nhiều phần và đầu nối dùng cho việc nối chúng lại tại nơi chúng bị
chia cắt.

¾ Một chương trình có thể gặp một điều kiện dựa theo đó việc thực thi có thể được phân theo các
nhánh rẽ khác nhau. Cấu trúc lệnh như vậy gọi là cấu trúc chọn lựa, điều kiện hay cấu trúc rẽ
nhánh.

¾ Cấu trúc ch
ọn cơ bản là cấu trúc “IF”.

¾ Cấu trúc IF …ELSE giúp lập trình viên chỉ làm so sánh đơn và sau đó thực thi các bước tùy theo
kết quả của phép so sánh là True (đúng) hay False (sai).

¾ Cấu trúc IF lồng nhau là câu lệnh IF này nằm trong câu lệnh IF khác.

¾ Thông thường ta cần lặp lại một số bước với số lần lặp xác định theo yêu cầu của bài toán hoặc
đến khi một số điều kiện nhất định đượ

c thỏa. Những cấu trúc giúp làm việc này gọi là cấu trúc
vòng lặp.


Kiểm
t

1. C
c

2. M

đ
ư

3. L
ư

4. M


5. M

đú
n







t
ra tiến độ h
c
ho phép _
_

t
ư
ợc thực thi n
h
ư
u đ

giúp ch
ú

t lưu đ

có t
h

t ____ cơ b

n
g (True) ha
y
ọc tập
_
__________

là một
s
hằ
m đạt đượ
c
ú
ng ta xem x
é
hể
có tuỳ ý s


n là việc th

y
sai (False).
của mã và d

s
ự t
r
ình bày
d
c
một lời giải.
é
t lại và gỡ r


đi


m b

t đ


c thi tu

n t


liệu.
d
ạng bi

u đ




i chương trì
n

u và s

đi

m

những câu

l
minh họa tí
n
n
h một cách
d
k
ế
t thúc.
l
ệnh đ
ế
n khi

n
h tu

n tự củ
a
d
ễ dàng.
một đi

u kiệ
n
a
những hoạt
(True / F
a
(True / F

a
n
cụ th

nào

động
a
lse)

a
lse)
đó là


22 Lập trình cơ bản C

Bài tập tự làm

1. Viết một đoạn mã giả và vẽ một lưu đồ để nhập một giá trị là độ
0
C (Celsius) và chuyển nó sang
độ
0
F (Fahrenheit). [Hướng dẫn: C/5 = (F-32)/9]

2. Viết một đoạn mã giả và vẽ một lưu đồ để nhập điểm của một sinh viên cho các môn : Vật lý, Hóa
học, và Sinh học. Sau đó hiển thị điểm trung bình và tổng của những điểm này.























Biến và Kiểu dữ liệu 1
Bài 2 Biến và Kiểu dữ liệu


Mục tiêu:

Kết thúc bài học này, bạn có thể:

¾ Hiểu và sử dụng được biến (variables)
¾ Phân biệt sự khác nhau giữa biến và hằng (constants)

¾ Nắm vững và sử dụng các kiểu dữ liệu khác nhau trong chương trình C
¾ Hiểu và sử dụng các toán tử số học.

Giới thiệu

Bất cứ chương trình ứng dụng nào cần xử lý dữ liệu c
ũng cần có nơi để lưu trữ tạm thời dữ liệu ấy.
Nơi mà dữ liệu được lưu trữ gọi là bộ nhớ. Những vị trí khác nhau trong bộ nhớ có thể được xác định
bởi các địa chỉ duy nhất. Những ngôn ngữ lập trình trước đây yêu cầu lập trình viên quản lý mỗi vị trí
ô nhớ thông qua địa chỉ, cũng như giá trị lưu trong nó. Các lập trình viên dùng nh
ững địa chỉ này để
truy cập hoặc thay đổi nội dung của các ô nhớ. Khi ngôn ngữ lập trình phát triển, việc truy cập hay
thay đổi giá trị ô nhớ đã được đơn giản hoá nhờ sự ra đời của khái niệm biến .

2.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ớ.

Trước đây, các lập trình viên phải viết chương trình theo ngôn ngữ máy gồm các mã 1 và 0. Nếu muốn
lưu trữ một giá trị tạm thời, vị trí chính xác nơi mà dữ liệu được lưu trữ trong bộ nhớ máy tính phải
được chỉ định. Vị trí này là một con số cụ thể, gọi là địa chỉ 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.

Chúng ta đã quen với cách sử dụng các ký tự đại diện trong một công thức. Ví dụ, diệ
n tích hình chữ
nhật được tính bởi :

Diện tích = A = chiều dài x chiều rộng = L x B

Cách tính lãi suất đơn giản được cho như sau:

Tiền lãi = I = Số tiền ban đầu x Thời gian x Tỷ lệ/100 = P x T x R /100

Các ký tự A, L, B, I, P, T, R là các biến và là các ký tự viết tắt đại diện cho các giá trị khác nhau.


2 Lập trình cơ bản C

Xem ví dụ sau đây :

Tính tổng điểm cho 5 sinh viên và hiển thị kết quả. Việc tính tổng được thực hiện theo hướng dẫn sau.

Hiển thị giá trị tổng của 24, 56, 72, 36 và 82

Khi giá trị tổng được hiển thị, giá trị này không còn được lưu trong bộ nhớ máy tính. Giả sử, nếu
chúng ta muốn tính điểm trung bình, thì giá trị tổng đó phải được tính một lần nữa.

Tố
t hơn là chúng ta sẽ lưu kết quả vào bộ nhớ máy tính, và sẽ lấy lại nó khi cần đến.


sum = 24 + 56 + 72 + 36 + 82

Ở đây, sum là biến được dùng để chứa tổng của 5 số. Khi cần tính điểm trung bình, có thể thực hiện
như sau:
Avg = sum / 5

Trong C, tất cả biến cần phải được khai báo trước khi dùng chúng.

Chúng ta hãy xét ví dụ nhập hai số và hiển thị tổng của chúng trong ví dụ 1.

Ví dụ 1:


BEGIN
DISPLAY ‘Enter 2 numbers’
INPUT A, B
C = A + B
DISPLAY C
END

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ớ).
Và để 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. Trong ví
dụ trên, giá trị của hai biến được nhập từ người dùng và chúng được lưu trữ nơi nào đó trong bộ nhớ.
Những vị trí này có thể được truy cập thông qua các tên biến A và B. Trong bước kế tiếp, giá trị của
hai biến được cộng và kết quả được lưu trong biến thứ 3 là biến C. Cuối cùng, giá trị biến C được hi
ển
thị.


Trong khi một vài ngôn ngữ lập trình cho phép hệ điều hành xóa nội dung trong ô nhớ và cấp phát bộ
nhớ này để dùng lại thì những ngôn ngữ khác như C yêu cầu lập trình viên xóa vùng nhớ không sử
dụng thông qua mã chương trình. Trong cả hai trường hợp, hệ điều hành đều lo việc cấp phát và thu
hồi ô nhớ.


Hệ điều hành hoạt động như một giao diện giữa các ô nhớ và lập trình viên. Lập trình viên không cần
lưu tâm về vị trí ô nhớ mà để cho hệ điều hành đảm nhiệm. Vậy việc điều khiển bộ nhớ (vị trí mà dữ
liệu thích hợp lưu trữ) sẽ do hệ điều hành đảm trách, chứ không phải lập trình viên.

2.2 Hằng (constant)

Trong trường hợp ta 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ã này có thể truy cập giá trị của

×