You are on page 1of 599

HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN

NGÖÕ C

CBGD
*****************
ThS. NGUYEÃN NHAÄT NAM
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

GIAÙO TRÌNH
*****************
1.TIN HOÏC II, TS. ÑAËNG THAØNH TÍN, ÑH
QG TP HCM
2.INTRODUCTION TO COMPUTING
SYSTEMS, YALE N. PATT AND SANJAY J.
PATEL, INTERNATIONAL EDITION
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

CHÖÔNG 1
OÂN LAÏI CAÙC KIEÁN THÖÙC CÔ BAÛN VEÀ
MAÙY TÍNH
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

CHÖÔNG 1
OÂN LAÏI CAÙC KIEÁN THÖÙC CÔ BAÛN VEÀ
MAÙY TÍNH
1. CAÙC HEÄ ÑEÁM
2. CAÙC KHAÙI NIEÄM CÔ BAÛN
3. LÒCH SÖÛ PHAÙT TRIEÅN CUÛA MAÙY TÍNH
4. CAÙC THAØNH PHAÀN CÔ BAÛN CUÛA MAÙY TÍNH
5. PHAÀN MEÀM
6. CAÙC CAÁP CHUYEÅN ÑOÅI
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

1.1 CAÙC HEÄ ÑEÁM


1.1.1 Heä thaäp phaân

Ví duï 1.1: Caùc haèng soá trong heä 10:


102, 3098.34D, 198d
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

1.1 CAÙC HEÄ ÑEÁM


1.1.1 Heä thaäp phaân

Ví duï 1.2: Caùc soá sau ñaây ñöôïc vieát ôû daïng phaân
tích trong heä thaäp phaân
1986D = 1.103 + 9.102 + 8.10 1 + 6.100
234d = 2.102 + 3.10 1 + 4.100
0.163 = 1.10-1 + 6.10-2 + 3.10-3
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

1.1 CAÙC HEÄ ÑEÁM


1.1.2 Heä nhò phaân
Ñaây laø heä ñeám chính thöùc duøng cho maùy tính. Caùc
maïch soá trong maùy tính söû duïng hai möùc ñieän aùp thaáp
vaø cao ñeå quy ñònh cho 2 traïng thaùi soá laøm vieäc laø 0
vaø 1, thöôøng thì möùc ñieän aùp cao quy ñònh cho traïng
thaùi soá 1, vaø möùc ñieän aùp thaáp quy ñònh cho traïng
thaùi soá 0. Traïng thaùi soá nhò phaân ñöôïc goïi laø bit, vieát
taét töø binary digit. Vieäc gheùp caùc kyù soá 0 vaø 1 laïi ñeå
maõ hoùa moïi döõ lieäu ñeå maùy tính xöû lyù laø ñieàu caàn
thieát.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

1.1 CAÙC HEÄ ÑEÁM


1.1.2 Heä nhò phaân
Ví duï 1.3:
Caùc haèng soá trong heä 2:
1011B, 101010b, 1010101.101B

Ví duï 1.4:
10101B = 1.24 + 0.23 + 1.22 + 0.21 + 1.20 = 21D
11.01B = 1.21 + 1.20 + 0.2-1 + 1.2-2 = 3.25D
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

1.1 CAÙC HEÄ ÑEÁM


1.1.2 Heä nhò phaân
Traïng thaùi Thaäp phaân

0 0 … 0 0

1 1 … 1 2n-1

n bit
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

1.1 CAÙC HEÄ ÑEÁM


1.1.3 Heä baùt phaân
Ví duï1.5: Caùc haèng trong heä baùt phaân:
734O, 123.56o, -34.23O
Ví duï1.6:
705 O = 7.82 + 0.81 + 5.80 = 453 D
123.56 O = 1.82 + 2.81 + 380 + 5.8-1 + 6.8-2
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

1.1 CAÙC HEÄ ÑEÁM


1.1.3 Heä baùt phaân Kyù soá Töông
baùt phaân öùng nhò
Töông
öùng
phaân thaäp
phaân
0 000 0
1 001 1
2 010 2
3 011 3
4 100 4
5 101 5
6 110 6
7 111 7
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

1.1 CAÙC HEÄ ÑEÁM


1.1.3 Heä baùt phaân
Ví duï1.5: Caùc haèng trong heä baùt phaân:
734O, 123.56o, -34.23O
Ví duï1.6:
705 O = 7.82 + 0.81 + 5.80 = 453 D
123.56 O = 1.82 + 2.81 + 380 + 5.8-1 + 6.8-2
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

1.1 CAÙC HEÄ ÑEÁM


1.1.3 Heä baùt phaân
Ví duï1.7: Chuyeån soá töø heä 8 qua heä 2 vaø ngöôïc
laïi
1 101 011 011 B = 1533 O
1 5 3 3

245 O = 010 100 101 B = 10100101 B


2 4 5
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

1.1 CAÙC HEÄ ÑEÁM


1.1.4 Heä thaäp luïc phaân
Heä 16 xöû duïng cô soá 16, coù 16 kyù soá khaùc nhau
trong heä thoáng soá ñeám naøy töø 0, 1, … , 9, A, B,
C, D, E, F. Trong ñoù caùc kyù soá töø A tôùi F quy öôùc
cho caùc giaù trò 10, tôùi 15. Caùc haèng heä hex khi
vieát thöôøng ñöôïc vieát theâm kyù töï H hay h phía
sau soá ñaõ coù.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

1.1 CAÙC HEÄ ÑEÁM


1.1.4 Heä thaäp luïc phaân
Ví duï 1.8: Moät soá haèng trong heä hex:
12A H, 234.907 H, B800 h
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

1.1 CAÙC HEÄ ÑEÁM


1.1.4 Heä thaäp luïc phaân
Ví duï 1.9:
F0 H = 15.161 + 0.160 = 240 D
FF H = 15.161 + 15.160 = 255 D
FFFF H= 15.163 + 15.162 + 15.161 + 15.160 =
65535
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
Kyù soá heä Töông öùng Töông öùng
1.1 CAÙC HEÄ ÑEÁM hex
0
nhò phaân thaäp phaân
0000 0
1 0001 1
1.1.4 Heä thaäp luïc phaân 2 0010 2
3 0011 3
4 0100 4
5 0101 5
6 0110 6
7 0111 7
8 1000 8
9 1001 9
A 1010 10
B 1011 11
C 1100 12
D 1101 13
E 1110 14
F 1111 15
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

1.1 CAÙC HEÄ ÑEÁM


1.1.4 Heä thaäp luïc phaân
Ví duï1.10: Chuyeån soá töø heä 16 qua heä 2 vaø
ngöôïc laïi
11 0101 1011 B = 35B H
3 5 B

3B H = 0011 1011 B = 111011 B


3 B
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

1.1 CAÙC HEÄ ÑEÁM


1.1.5 Söï chuyeån ñoåi qua laïi giöõa caùc
heä thoáng soá
Vì ñaëc tính lieân thoâng trong vieäc gom vaø xaû bit giöõa heä 2, vaø
heä 8, heä 16 maø vieäc chuyeån ñoåi qua laïi giöõa caùc soá trong caùc
heä thoáng soá khaùc nhau coù theå quy veà hai nhoùm chuyeån ñoåi
chính: (1) chuyeån töø soá heä 10 sang caùc heä coøn laïi, maø chuû
yeáu laø chuyeån töø heä 10 sang heä 2, sau ñoù töø heä 2 thöïc hieän
vieäc gom bit ñeå coù soá trong heä 8 hay 16; (2) vaø ngöôïc laïi
chuyeån töø caùc heä coøn laïi sang heä 10, thöïc teá ñaây chính laø
daïng phaân tích cuûa caùc soá trong moãi heä.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

1.1 CAÙC HEÄ ÑEÁM


1.1.5 Söï chuyeån ñoåi qua laïi giöõa caùc
heä thoáng soá
Ví duï 1.11: Chuyeån soá 27 trong heä thaäp phaân
sang nhò phaân ?
Ví duï 1.12: Chuyeån soá 367 trong heä thaäp phaân
sang heä baùt phaân ?
Ví duï 1.13: Chuyeån soá 367 trong heä thaäp phaân
sang heä thaäp luïc phaân ?
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

1.2 CAÙC KHAÙI NIEÄM CÔ BAÛN


1.2.1 Tin hoïc

Tin hoïc laø ngaønh khoa hoïc xöû lyù thoâng tin töï
ñoäng baèng maùy tính ñieän töû. Ôû ñaây coù ba khaùi
nieäm chính laø xöû lyù, thoâng tin vaø maùy tính.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

1.2 CAÙC KHAÙI NIEÄM CÔ BAÛN


1.2.1 Tin hoïc
Xöû lyù bao haøm khaùi nieäm tính toaùn caùc döõ lieäu
maø thoâng tin cung caáp; thoâng tin laø caùc döõ lieäu
ñöa vaøo cho maùy tính, ñoù chính laø caùc döõ lieäu
maø ngöôøi söû duïng maùy tính hoaëc töø thieát bò söû
duïng ngoaøi naøo ñoù ñöa vaøo hay laø döõ lieäu do baûn
thaân maùy tính taïo ra; maùy tính laø thieát bò xöû lyù
thoâng tin theo chöông trình.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

1.2 CAÙC KHAÙI NIEÄM CÔ BAÛN


1.2.2 Ñôn vò tin hoïc
1.2.2.1 Bit
Bit laø ñôn vò cô sôû cuûa thoâng tin. Moät bit coù
theå coù hai traïng thaùi. Ñoái vôùi maùy tính moät
bit coù theå coù hai traïng thaùi laø 0 vaø 1.
Neáu coi thoâng tin laø moät caùi nhaø thì bit
coù theå ñöôïc coi nhö laø “vieân gaïch” ñeå taïo neân
thoâng tin.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

1.2 CAÙC KHAÙI NIEÄM CÔ BAÛN


1.2.2 Ñôn vò tin hoïc
1.2.2.2 Byte
Byte laø ñôn vò thoâng tin nhoû nhaát, noù coù theå
ñöôïc duøng ñeå löu maõ cuûa kyù töï. Moät byte coù 8
bit, do ñoù noù coù theå bieãu dieãn ñöôïc 256 traïng
thaùi soá nhò phaân khaùc nhau. Hieän nay boä nhôù
maùy tính cuõng ñöôïc tính theo ñôn vò byte.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

1.2 CAÙC KHAÙI NIEÄM CÔ BAÛN


1.2.2 Ñôn vò tin hoïc
1.2.2.2 Byte
Caùc ñôn vò boäi cuûa byte laø KB (kilo byte), MB
(mega byte), GB (giga byte) vaø TB (tera byte):
1KB = 210 byte = 1024 bytes
1 MB = 210 KB
1 GB = 210 MB
1 TB = 210 GB
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

1.2 CAÙC KHAÙI NIEÄM CÔ BAÛN


1.2.3 Maùy tính
Maùy tính laø thieát bò hay coâng cuï duøng ñeå löu
tröõ vaø xöû lyù thoâng tin theo moät chöông trình
ñònh tröôùc.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

1.2 CAÙC KHAÙI NIEÄM CÔ BAÛN


1.2.3 Maùy tính
Tuøy theo tính naêng vaø muïc ñích söû duïng ngöôøi
ta phaân ra boán loaïi maùy tính:
- Sieâu maùy tính (super computer): toác
ñoä tính töø vaøi chuïc tôùi traêm Mips (Million
instruction per second), thöôøng ñöôïc söû duïng
trong caùc trung taâm tính toaùn hay moâ phoûng
lôùn. Giaù tieàn cuûa caùc maùy tính naøy töø vaøi trieäu
ñoâ la Myõ trôû leân.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

1.2 CAÙC KHAÙI NIEÄM CÔ BAÛN


1.2.3 Maùy tính
Tuøy theo tính naêng vaø muïc ñích söû duïng ngöôøi
ta phaân ra boán loaïi maùy tính:
- Maùy tính lôùn (main frame): toác ñoä
tính töø vaøi Mips tôùi vaøi chuïc Mips, traêm Mips,
nhöng thöôøng ñöôïc söû duïng laøm maùy tính chuû
trong caùc heä thoáng maïng lôùn
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

1.2 CAÙC KHAÙI NIEÄM CÔ BAÛN


1.2.3 Maùy tính
Tuøy theo tính naêng vaø muïc ñích söû duïng ngöôøi
ta phaân ra boán loaïi maùy tính:
- Maùy tính trung (mini computer): coù
toác ñoä tính toaùn keùm hôn maùy tính lôùn. Hieän
nay do coâng ngheä vi maïch ngaøy caøng phaùt trieån
maùy tính trung ngaøy caøng reû tieàn, vaø coù caáu
hình ngaøy caøng maïnh hôn tröôùc.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

1.2 CAÙC KHAÙI NIEÄM CÔ BAÛN


1.2.3 Maùy tính
Tuøy theo tính naêng vaø muïc ñích söû duïng ngöôøi
ta phaân ra boán loaïi maùy tính:
- Maùy vi tính (micro computer), hay coøn
goïi laø maùy tính caù nhaân (personal computer) laø
maùy tính ñöôïc söû duïng roäng raûi trong gia ñình
hay coâng sôû. Coù hai hoï maùy tính caù nhaân phoå
bieán laø PC (do haûng IBM thieát keá) vaø Mac (do
haûng Apple thieát keá).
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

1.2 CAÙC KHAÙI NIEÄM CÔ BAÛN


1.2.4 Xöû lyù döõ lieäu
ÑAÀU VAØO XÖÛ LYÙ ÑAÀU RA

Döõ lieäu nhaäp Tính toaùn Keát quaû


Döõ lieäu xuaát
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

1.2 CAÙC KHAÙI NIEÄM CÔ BAÛN


1.2.5 Boä maõ kyù töï (tham khaûo giaùo
trình)
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

1.3 LÒCH SÖÛ PHAÙT TRIEÅN CUÛA MAÙY


TÍNH
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

1.4 CAÙC THAØNH PHAÀN CÔ BAÛN CUÛA


MAÙY TÍNH

Address bus
CU

Input device
ROM RAM I/O
ALU

Output device

Data bus

Control bus

Register
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

1.5 PHAÀN MEÀM


1.5.1 Ñònh nghóa
Phaàn meàm laø toaøn boä caùc thuû tuïc ñöa vaøo
maùy tính ñeå maùy thöïc hieän caùc chöùc naêng xöû lyù
theo muïc tieâu cuûa ngöôøi laäp trình.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

1.5 PHAÀN MEÀM


1.5.2 Ngoân ngöõ cho maùy tính
Ngoân ngöõ duøng cho maùy tính coøn goïi laø ngoân ngöõ
laäp trình laø toaøn boä caùc leänh, caùc döõ lieäu, caùc thuû
tuïc… ñöôïc keát hôïp laïi vôùi nhau theo nguyeân taéc
keát caáu maõ tin vaø heä leänh maø ta goïi laø cuù phaùp
(syntax), ñöa vaøo maùy tính ñeå maùy thöïc hieän caùc
chöùc naêng xöû lyù theo muïc tieâu cuûa ngöôøi laäp
trình.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

1.5 PHAÀN MEÀM


1.5.2 Ngoân ngöõ cho maùy tính
Coù theå chia ngoân ngöõ maùy tính ra laøm ba caáp
moät caùch toång quaùt: caáp cao, caáp thaáp vaø caáp
maùy
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

1.5 PHAÀN MEÀM


1.5.2 Ngoân ngöõ cho maùy tính
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

1.5 PHAÀN MEÀM


1.5.2 Ngoân ngöõ cho maùy tính
Caáp cao nhaát laø ngoân ngöõ töï nhieân cuûa con
ngöôøi. Caùc ngoân ngöõ caáp cao ñöôïc thieát keá cho
pheùp ngöôøi vieát chöông trình khoâng caàn phaûi
hieåu hoaït ñoäng beân trong cuûa maùy tính. Caùc leänh
cuûa ngoân ngöõ caáp cao thöôøng söû duïng caùc töø tieáng
Anh, caùc pheùp toaùn theo caùc kyù hieäu toaùn hoïc
thoâng thöôøng do ñoù raát deã söû duïng. Ví duï cho caùc
ngoân ngöõ naøy laø Pascal, Basic, Java, C/C++, …
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

1.5 PHAÀN MEÀM


1.5.2 Ngoân ngöõ cho maùy tính
Ñaëc ñieåm cuûa ngoân ngöõ caáp cao laø gaàn vôùi con
ngöôøi, do ñoù chöông trình vieát baèng ngoân ngöõ caáp
cao coù tính khaû chuyeån, töùc coù theå chaïy treân
nhieàu heä maùy khaùc nhau, nhieàu heä ñieàu haønh
khaùc nhau.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

1.5 PHAÀN MEÀM


1.5.2 Ngoân ngöõ cho maùy tính
Ngoân ngöõ caáp thaáp laø trong ñoù moãi leänh töông
öùng vôùi moät leänh cuûa ngoân ngöõ maùy vaø töông öùng
vôùi taäp leänh cuûa CPU. Caùc leänh vaø pheùp toaùn cuûa
ngoân ngöõ caáp thaáp thöôøng coù tính gôïi nhôù
(mnemonic) tôùi moät töø tieáng Anh. Moãi haûng thieát
keá CPU khi thieát keá ra moät CPU môùi ñeàu quy
ñònh taäp leänh cho CPU. Hôïp ngöõ (Assembly
language) laø moät ví duï cho ngoân ngöõ naøy.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

1.5 PHAÀN MEÀM


1.5.2 Ngoân ngöõ cho maùy tính
Ngoân ngöõ maùy laø ngoân ngöõ trong ñoù moïi leänh
ñeàu ñöôïc vieát döôùi daïng maõ nhò phaân. Chöông
trình ôû daïng naøy maùy coù theå thöïc thi ñöôïc ngay.
Chöông trình vieát baèng ngoân ngöõ caáp thaáp vaø
ngoân ngöõ maùy chæ coù theå chaïy treân moät heä maùy
xaùc ñònh naøo ñoù maø thoâi vì moãi hoï CPU chæ coù
theå hieåu ñöôïc maõ maùy maø haûng ñaõ quy ñònh cho
noù.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

1.5 PHAÀN MEÀM


1.5.2 Ngoân ngöõ cho maùy tính
Chöông trình vieát döôùi daïng vaên baûn (ngoân ngöõ
caáp cao hoaëc caáp thaáp) goïi laø chöông trình nguoàn
(source). Chöông trình naøy maùy khoâng hieåu tröïc
tieáp ñöôïc. Vì theá muoán ñöa vaøo thöïc hieän treân
maùy, chöông trình nguoàn phaûi ñöôïc dòch sang
ngoân ngöõ maùy (goïi laø chöông trình thöïc thi) bôûi
caùc chöông trình dòch hay boä dòch (translator). Coù
hai loaïi boä dòch: chöông trình bieân dòch vaø
chöông trình dieãn dòch hay thoâng dòch.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

1.5 PHAÀN MEÀM


1.5.2 Ngoân ngöõ cho maùy tính
Coù hai loaïi boä dòch: chöông trình bieân dòch vaø
chöông trình dieãn dòch hay thoâng dòch.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

1.5 PHAÀN MEÀM


1.5.2 Ngoân ngöõ cho maùy tính
Chöông trình bieân dòch (Compiler) seõ dòch chöông
trình nguoàn moät laàn, thoáng keâ vaø baùo taát caû loãi
moät luùc neáu coù. Caùch dòch naøy khoù trong vieäc
thoáng keâ vaø söõa loãi do toaøn boä loãi ñöôïc baùo moät
laàn, nhöng laïi tieát kieäm nhieàu thôøi gian khi
chöông trình ñaõ ñöôïc dòch vaø lieân keát vì baûn
thaân chöông trình ñöôïc chaïy, khoâng phaûi
compiler ñöôïc chaïy.
.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

1.5 PHAÀN MEÀM


1.5.2 Ngoân ngöõ cho maùy tính
Chöông trình dieãn dòch hay thoâng dòch xem töøng
leänh chöông trình cuûa nguoàn laø döõ kieän ñeå thöïc
thi. Thöïc hieän xong moät leänh neáu coù loãi cuù phaùp
(Syntax) thì baùo, coøn khoâng thì thöïc thi leänh tieáp
theo. Caùch dòch naøy ñôn giaûn duøng ñeå laäp vaø söûa
chöõa chöông trình raát tieän lôïi nhöng toán nhieàu
thôøi gian vì baûn thaân Interpreter ñöôïc chaïy,
khoâng phaûi chöông trình nguoàn ñöôïc chaïy.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

1.5 PHAÀN MEÀM


1.5.3 Chöông trình
Chöông trình laø taäp hôïp caùc leänh ñöôïc saép xeáp
theo moät trình töï hôïp logic ñeå giaûi quyeát moät vaán
ñeà naøo ñoù treân maùy tính. Saûn phaåm cuûa chöông
trình ñaõ ñöôïc dòch goïi laø phaàn meàm (software).
Coù hai loaïi chöông trình: chöông trình phuïc vuï
vaø chöông trình öùng duïng.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

1.5 PHAÀN MEÀM


1.5.3 Chöông trình
Chöông trình phuïc vuï, coøn goïi laø chöông trình heä
thoáng, laø chöông trình baûo ñaûm cho maùy tính
thöïc hieän caùc chöùc naêng cô baûn, nhö ñieàu khieån
söï hoaït ñoäng cuûa CPU, trao ñoåi giöõa trung taâm
(CPU) vôùi ngoaïi vi, thöïc hieän caùc thuû tuïc xöû lyù
dòch caùc ngoân ngöõ ra maõ maùy, caùc thao taùc ñieàu
haønh cô baûn nhö sao cheùp ñóa, taäp tin, caùc dòch
vuï truyeàn nhaän döõ lieäu ….
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

1.5 PHAÀN MEÀM


1.5.3 Chöông trình
Chöông trình öùng duïng laø chöông trình do ngöôøi
söû duïng khai thaùc söû duïng maùy laäp ra ñeå giaûi
quyeát caùc yeâu caàu xöû lyù cuï theå. Ngoân ngöõ söû duïng
chuû yeáu laø ngoân ngöõ baäc cao nhö Pascal, C, Java,
….
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

1.6 CAÙC CAÁP CHUYEÅN ÑOÅI


Vaán ñeà (Problems)
---------------------------------------------------------------------
Giaûi thuaät (Algorithms)
---------------------------------------------------------------------
Ngoân ngöõ (Language)
---------------------------------------------------------------------
Kieán truùc (ISA) maùy (Machine Architecture)
---------------------------------------------------------------------
Vi kieán truùc (Microarchitecture)
--------------------------------------------------------------------
Maïch (Circuits)
--------------------------------------------------------------------
Thieát bò (Devices)
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

1.6 CAÙC CAÁP CHUYEÅN ÑOÅI


1.6.1 Ñaët vaán ñeà
Ñeå vieát ñöôïc moät chöông trình, tröôùc tieân chuùng
ta phaûi moâ taû ñöôïc vaán ñeà caàn giaûi quyeát baèng
ngoân ngöõ töï nhieân nhö tieáng Vieät, tieáng Anh, ….
Tuy nhieân, neáu chuùng ta vieát caùc leänh ñöa vaøo
maùy tính baèng caùc ngoân ngöõ töï nhieân naøy thì
khoâng oån, vì ngoân ngöõ töï nhieân coù raát nhieàu söï
khoâng roû raøng.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

1.6 CAÙC CAÁP CHUYEÅN ÑOÅI


1.6.2 Giaûi thuaät
Vôùi söï khoâng roû raøng cuûa ngoân ngöõ töï nhieân
nhö vaäy, neân ta caàn chuyeån caùc leänh moâ taû vaán
ñeà sang daïng giaûi thuaät, vaø do ñoù ñaõ ñaëc tính
hoaù cuï theå caùc leänh, laøm chuùng xaùc ñònh vôùi thao
taùc trong maùy tính. Moät giaûi thuaät laø moät thuû tuïc
theo trình töï töøng böôùc töø luùc baét ñaàu cho tôùi luùc
keát thuùc. Moãi böôùc ñeàu ñöôïc quy ñònh traïng thaùi
laøm vieäc vaø ñöôïc maùy tính thöïc thi.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

1.6 CAÙC CAÁP CHUYEÅN ÑOÅI


1.6.3 Chöông trình
Böôùc keá tieáp laø chuyeån giaûi thuaät thaønh
chöông trình maùy tính baèng moät trong caùc ngoân
ngöõ laäp trình ñaõ bieát. Caùc ngoân ngöõ laäp trình laø
caùc ngoân ngöõ thuoäc veà maùy, chuùng khaùc vôùi ngoân
ngöõ töï nhieân laø moãi leänh, moãi caâu ñeàu coù yù nghóa
baét maùy tính thöïc thi moät coâng vieäc cuï theå, chöù
khoâng phaûi laø caùc caâu noùi daøi doøng nhöng nhieàu
khi ít yù nghóa.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

1.6 CAÙC CAÁP CHUYEÅN ÑOÅI


1.6.4 Kieán truùc ISA
Chöông trình ôû ngoân ngöõ caáp cao tieáp tuïc ñöôïc
dòch sang taäp leänh cuûa moät maùy tính coù kieán truùc
ñaëc bieät maø töø ñoù noù seõ ñöôïc söû duïng ñeå thöïc thi
coâng vieäc cuûa chöông trình ôû böôùc keá tieáp. Kieán
truùc taäp leänh (Instruction Set Architecture) laø söï
quy ñònh hoaøn chænh cho söï töông taùc giöõa
chöông trình ñaõ ñöôïc vieát vaø phaàn cöùng maùy tính
ñeå thöïc thi taùc vuï cuûa caùc chöông trình.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

1.6 CAÙC CAÁP CHUYEÅN ÑOÅI


1.6.5 Vi kieán truùc
Böôùc keá tieáp laø chuyeån leänh ôû kieán truùc taäp
leänh sang daïng thöïc hieän. Vieäc toå chöùc chi tieát
cuûa quaù trình thöïc hieän leänh naøy ñöôïc goïi vi kieán
truùc (Microarchitecture). Coù theå hieåu, vi kieán truùc
nhö laø moät maùy tính “aûo” maø ngoân ngöõ maùy luùc
naøy laø kieán truùc taäp leänh töông öùng.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

1.6 CAÙC CAÁP CHUYEÅN ÑOÅI


1.6.5 Vi kieán truùc
Moâ hình maùy tính
Von Neuman
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

1.6 CAÙC CAÁP CHUYEÅN ÑOÅI


1.6.6 Maïch luaän lyù
Böôùc naøy seõ hieän thöïc moãi phaàn töû cuûa vi
kieán truùc thaønh nhöõng maïch luaän lyù ñôn giaûn. ÔÛ
böôùc naøy caùc nhaø thieát keá seõ phaûi löïa choïn ñeå
maùy tính khi ñöôïc thieát keá phaûi ñöôïc thò tröôøng
chaáp nhaän, töùc phaûi coù söï phuø hôïp veà giaù caû vaø
khaû naêng xöû lyù cuûa maùy tính.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

1.6 CAÙC CAÁP


CHUYEÅN ÑOÅI
1.6.6 Maïch luaän lyù
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

1.6 CAÙC CAÁP CHUYEÅN ÑOÅI


1.6.7 Thieát bò
Sau cuøng, moãi maïch luaän lyù cô baûn ôû caáp
luaän lyù seõ ñöôïc hieän thöïc töông öùng baèng caùc
maïch ñieän töû cuï theå. Vôùi caùc maïch cöùng naøy, caùc
leänh caáp cao qua nhieàu coâng ñoaïn seõ trôû thaønh
caùc bit 0 vaø 1, ñieàu khieån caùc ñieän töû ñoùng môû
caùc thaønh phaàn maïch, töø ñoù quaù trình thöïc hieän
leänh seõ dieån ra.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

KEÁT THUÙC CHÖÔNG 1


HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

CHÖÔNG 2
CAÙC KIEÅU DÖÕ LIEÄU VAØ THAO TAÙC
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

CHÖÔNG 2
CAÙC KIEÅU DÖÕ LIEÄU VAØ THAO TAÙC

1.KIEÅU DÖÕ LIEÄU SOÁ NGUYEÂN


2.SOÁ NGUYEÂN BUØ 2
3.PHEÙP TOAÙN TREÂN BIT – PHEÙP TOAÙN SOÁ HOÏC
4.PHEÙP TOAÙN TREÂN BIT – PHEÙP TOAÙN LUAÄN
LYÙ
5.KIEÅU DÖÕ LIEÄU DAÁU CHAÁM ÑOÄNG
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

2.1 KIEÅU DÖÕ LIEÄU SOÁ NGUYEÂN

2.1.1 Soá nguyeân khoâng daáu (unsigned integer)


Duøng ñeå bieåu dieãn soá laàn laëp laïi moät taùc vuï nhaát
ñònh, hay chæ ñòa chæ cuûa caùc oâ nhôù.
Ví duï: 102, 101101B
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

2.1 KIEÅU DÖÕ LIEÄU SOÁ NGUYEÂN


2.1.2 Soá nguyeân coù daáu (signed integer)
Ở dạng biểu diễn số âm dùng bit dấu và trị tuyệt ñối, bit có
trọng số cao nhất sẽ quy ñịnh dấu cho số có trị tuyệt ñối
ngay sau, nếu bằng 0  số dương, 1  âm.
Dạng bù 1 sẽ biểu diễn số âm bằng việc ñảo các trạng thái
bit của số dương tương ứng, ñảo từ 1 qua 0, và ngược lại.
Dạng bù 2 (sẽ ñược xét cụ thể ở mục dưới) sẽ biểu diễn số
âm bằng dạng bù 1 của nó công thêm 1.
Trong ba cách, 2 cách ñầu ñơn giản về tư duy, nhưng
không có lợi cho việc thực hiện phép toán hoặc mất trị trong
tầm (2 trị 0, và -0, thực ra là 1 trị).
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
Daïng bieån dieãn Trò ñöôïc bieåu dieãn
Trò tuyeät ñoái coù daáu Buø 1 Buø 2
00000 0 0 0

2.2 SOÁ
00001 1 1 1
00010 2 2 2
00011 3 3 3

NGUYEÂN
00100 4 4 4
00101 5 5 5
00110 6 6 6
00111 7 7 7

BUØ 2
01000 8 8 8
01001 9 9 9
01010 10 10 10
01011 11 11 11
01100 12 12 12
01101 13 13 13
01110 14 14 14
01111 15 15 15
10000 -0 -15 -16
10001 -1 -14 -15
10010 -2 -13 -14
10011 -3 -12 -13
10100 -4 -11 -12
10101 -5 -10 -11
10110 -6 -9 -10
10111 -7 -8 -9
11000 -8 -7 -8
11001 -9 -6 -7
11010 -10 -5 -6
11011 -11 -4 -5
11100 -12 -3 -4
11101 -13 -2 -3
11110 -14 -1 -2
11111 -15 -0 -1
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

2.2 SOÁ NGUYEÂN BUØ 2


Coù hai böôùc trong quy luaät taïo soá buø 2 cuûa moät
soá:
-Laät ngöôïc traïng thaùi bit bieåu dieãu töø 1 qua 0, töø
0 qua 1trong maãu, coøn goïi laø pheùp buø 1.
-Coäng 1 vaøo maãu keát quaû ôû böôùc 1, ñeå coù maãu
keát quaû sau cuøng.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

2.2 SOÁ NGUYEÂN BUØ 2


Thí duï 2.1: Tìm daïng buø 2 cho soá -12
Maãu nhò phaân cuûa trò tuyeät ñoái cuûa toaùn
haïng 12 laø 01100.
Ta thöïc hieän hai böôùc nhö sau:
1. Tìm buø 1 cuûa 01100: 10011
2. Coäng 1 vaøo daïng buø 1: 10100
01100
+ 10100
1 00000
Keát quaû laø 0
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

2.3 PHEÙP TOAÙN TREÂN BIT – PHEÙP


TOAÙN SOÁ HOÏC
2.3.1 Coäng vaø tröø
Ví duï 2.2: Tính bieåu thöùc 11+3.Ta coù:
Trò thaäp phaân 11 ñöôïc bieåu dieãn döôùi daïng 01011
Trò thaäp phaân 3 ñöôïc bieåu dieãn ôû daïng 00011
Toång, coù trò 14, laø 01110
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

2.3 PHEÙP TOAÙN TREÂN BIT – PHEÙP


TOAÙN SOÁ HOÏC
2.3.1 Coäng vaø tröø
Thí duï 2.3: Moâ phoûng thöïc hieän pheùp tröø ôû thao
taùc coäng ôû ALU, tính bieåu thöùc: 12 – 19.
Tröôùc tieân, CPU phaân tích ñeå tính bieåu thöùc
treân ôû daïng: 12 + (-19), sau ñoù tính buø 2 cuûa 19
(010011) ñeå coù -19 (101101). Coäng 12, (001100), vôùi -
19 (101101):
001100
+ 101101
111001
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

2.3 PHEÙP TOAÙN TREÂN BIT – PHEÙP


TOAÙN SOÁ HOÏC
2.3.1 Coäng vaø tröø
Thí duï 2.4: Coäng moät soá vôùi chính noù (x + x),
tính 6 + 6.
Giaû söû ta xeùt caùc maãu coù chieàu daøi 5 bit.
Maãu nhò phaân 5 bit cuûa 6 laø 00110, töùc daïng khai
trieån laø 0.24 + 0.23 + 1.22 + 1.21 + 0.20
Khi ta thöïc hieän 6 + 6, hay 2.6, bieåu thöùc khai trieån
seõ laø 0.25 + 0.24 + 1.23 + 1.22 + 0.21
Ta coù keát quaû: 01100, töùc dòch toaùn haïng ban ñaàu töøng
bit sang traùi moät vò trí.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

2.3 PHEÙP TOAÙN TREÂN BIT – PHEÙP


TOAÙN SOÁ HOÏC
2.3.2 Môû roäng daáu
Thao taùc môû roäng theâm bit daáu (0 vôùi soá döông
vaø 1 vôùi soá aâm) vaøo phía tröôùc daïng buø 2 seõ
khoâng laøm thay ñoåi giaù trò cuûa soá ban ñaàu. Thao
taùc naøy ñöôïc goïi laø thao taùc môû roäng daáu (Sign-
EXTension), vaø thöôøng ñöôïc vieát taét laø SEXT.
Ví duï: 000101 -> 0000000000000101
100101 -> 1111111111100101
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

2.3 PHEÙP TOAÙN TREÂN BIT – PHEÙP


TOAÙN SOÁ HOÏC
2.3.3 Traøn soá
Ví duï: vôùi chieàu daøi toaùn haïng laø 5 bit, tính bieåu
thöùc 9 + 11, ta coù:
01001
+ 01011
10100
Keát quaû ai cuõng bieát laø 20, nhöng ta laïi nhaän
ñöôïc moät soá aâm, do bit troïng soá lôùn nhaát laø 1,
töùc -12!
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

2.4 PHEÙP TOAÙN TREÂN BIT – PHEÙP


TOAÙN LUAÄN LYÙ
Moät caùch toång quaùt, khi ñeà caäp tôùi traïng thaùi
luaän lyù ñuùng, thì ta coù theå nghó ngay noù laø bit 1,
vaø ngöôïc laïi; coøn neáu gaëp traïng thaùi luaän lyù sai,
thì cuõng coù nghóa laø ta coù bit 0.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

2.4 PHEÙP TOAÙN TREÂN BIT – PHEÙP


TOAÙN LUAÄN LYÙ
2.4.1 Pheùp toaùn AND
AND laø moät haøm luaän lyù nhò phaân, noù ñoøi
hoûi hai toaùn haïng nhaäp, moãi toaùn haïng laø moät
trò luaän lyù 0 hoaëc 1. Ta coù theå hình dung toaùn
haïng naøy hoaït ñoäng theo kieåu: caû hai ñuùng thì
noù môùi ñuùng.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

2.4 PHEÙP TOAÙN TREÂN BIT – PHEÙP


TOAÙN LUAÄN LYÙ
2.4.1 Pheùp toaùn AND
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

2.4 PHEÙP TOAÙN TREÂN BIT – PHEÙP


TOAÙN LUAÄN LYÙ
2.4.1 Pheùp toaùn AND
Toaùn haïng naøy coù theå toång quaùt cho caùc maãu n
bit.Ví duï 2.5:
Neáu c laø keát quaû AND cuûa a vaø b, vôùi
a = 0011 1101 vaø b = 0100 0001, thì c baèng bao
nhieâu ?
a : 0011 1101
b : 0100 0001
c : 0000 0001
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

2.4 PHEÙP TOAÙN TREÂN BIT – PHEÙP


TOAÙN LUAÄN LYÙ
2.4.1 Pheùp toaùn AND
Ví duï 2.6:
Giaû söû chuùng ta coù moät maãu nhò phaân 8
bit ñöôïc goïi laø A, trong ñoù hai bit troïng soá nhoû
nhaát beân phaûi cuûa A coù yù nghóa quan troïng. Maùy
tính seõ tuøy vaøo trò cuûa hai bit naøy maø thöïc hieän
moät trong boán taùc vuï coù theå. Laøm sao caùch ly
boán bit naøy ñeå xeùt ?
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

2.4 PHEÙP TOAÙN TREÂN BIT – PHEÙP


TOAÙN LUAÄN LYÙ
2.4.1 Pheùp toaùn AND
Chuùng ta duøng maët naï bit. Moät maët naï bit laø
moät maãu nhò phaân maø coù theå laøm cho ta thaáy
ñöôïc hai phaàn khaùc nhau trong caùc bit cuûa A,
phaàn ta caàn quan taâm vaø phaàn ta muoán boû qua.
Trong tröôøng hôïp naøy, maët naï bit 0000 0011 khi
ñöôïc AND vôùi A seõ taïo ra caùc bit 0 trong caùc bit
töø vò trí 7 tôùi vò trí 2, coøn caùc bit ôû vò trí 1 vaø 0
thì seõ ñöôïc giöõ nguyeân.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

2.4 PHEÙP TOAÙN TREÂN BIT – PHEÙP


TOAÙN LUAÄN LYÙ
2.4.2 Pheùp toaùn OR
OR cuõng laø moät pheùp toaùn luaän lyù nhò phaân.
Noù yeâu caàu hai toaùn haïng ñaàu vaøo laø hai trò luaän
lyù. Khaùc vôùi AND, chæ caàn moät trong hai toaùn
haïng ñaàu vaøo laø 1 thì keát quaû ñaàu ra cuûa OR ñaõ
laø 1.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

2.4 PHEÙP TOAÙN TREÂN BIT – PHEÙP


TOAÙN LUAÄN LYÙ
2.4.2 Pheùp toaùn OR
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

2.4 PHEÙP TOAÙN TREÂN BIT – PHEÙP


TOAÙN LUAÄN LYÙ
2.4.2 Pheùp toaùn OR
Ví duï 2.7:
Neáu c laø keát quaû OR cuûa a vaø b,
vôùi a = 0011 1101 vaø b = 0100 0001, thì c baèng
bao nhieâu ?
a : 0011 1101
b : 0100 0001
c : 0111 1101
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

2.4 PHEÙP TOAÙN TREÂN BIT – PHEÙP


TOAÙN LUAÄN LYÙ
2.4.2 Pheùp toaùn OR
Ví du 2.8:Vôùi moät traïng thaùi bit ñaõ coù, ta
muoán hai bit troïng soá nhoû nhaát cuûa noù phaûi coù
traïng thaùi xaùc ñònh laø 11, thì maët naï xxxx xx11
seõ ñöôïc OR vôùi traïng thaùi bit ñaõ coù. Chaúng haïn
nhö:
0011 1101
0000 0011
0011 1111
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

2.4 PHEÙP TOAÙN TREÂN BIT – PHEÙP


TOAÙN LUAÄN LYÙ
2.4.3 Pheùp toaùn NOT
NOT laø moät haøm luaän lyù ñôn toaùn haïng,
noù chæ caàn moät toaùn haïng nhaäp. Toaùn haïng naøy
coøn ñöôïc goïi laø toaùn haïng buø, vì noù thöïc hieän
thao taùc laät ngöôïc traïng thaùi luaän lyù töø 1 qua 0,
hoaëc töø 0 qua 1.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

2.4 PHEÙP TOAÙN TREÂN BIT – PHEÙP


TOAÙN LUAÄN LYÙ
2.4.3 Pheùp toaùn NOT
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

2.4 PHEÙP TOAÙN TREÂN BIT – PHEÙP


TOAÙN LUAÄN LYÙ
2.4.3 Pheùp toaùn NOT
a: 0100 0001
thì c = NOT a: 10111110
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

2.4 PHEÙP TOAÙN TREÂN BIT – PHEÙP


TOAÙN LUAÄN LYÙ
2.4.4 Pheùp toaùn Exclusive-OR (EX-OR)
Pheùp toaùn naøy coøn ñöôïc goïi ngaén goïn laø
XOR. Ñaây laø toaùn töû hai toaùn haïng. Ñaàu ra cuûa
XOR seõ laø 1 neáu hai ñaàu vaøo laø khaùc nhau
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

2.4 PHEÙP TOAÙN TREÂN BIT – PHEÙP


TOAÙN LUAÄN LYÙ
2.4.4 Pheùp toaùn Exclusive-OR (EX-OR)
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

2.4 PHEÙP TOAÙN TREÂN BIT – PHEÙP


TOAÙN LUAÄN LYÙ
2.4.4 Pheùp toaùn Exclusive-OR (EX-OR)
Ví duï 2.9: Neáu c laø keát quaû XOR cuûa a vaø b, vôùi
a = 0011 1101 vaø b = 0100 0001, thì c baèng bao
nhieâu ?
a : 0011 1101
b : 0100 0001
c : 0111 1100
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

2.5 KIEÅU DÖÕ LIEÄU DAÁU CHAÁM


ÑOÄNG (Floating point data type)
Raát nhieàu pheùp toaùn soá hoïc chuùng ta duøng soá
thöïc, ñeå deå hình dung ta thöôøng söû duïng soá thöïc
daáu chaám tænh, ví duï 2.73, -0.01256, …. Ñoái vôùi
nhöõng soá giaù trò nhoû, vieäc vieát theo daïng naøy seõ
laøm chöông trình ñôn giaûn, tuy nhieân vôùi nhöõng
soá raát nhoû hoaëc raát lôùn, neáu vieát theo caùch naøy
seõ toán raát nhieàu boä nhôù, thaäm chí khoâng theå moâ
taû ñöôïc giaù trò vì ta khoâng ñuû bit ñeå bieåu dieãn
taàm trò.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

2.5 KIEÅU DÖÕ LIEÄU DAÁU CHAÁM


ÑOÄNG (Floating point data type)
Kieåu döõ lieäu daáu chaám ñoäng laø caùch giaûi quyeát
cho vaán ñeà. Hieän nay, haàu heát caùc kieán truùc taäp
leänh (ISA) ñeàu coù moät vaøi kieåu döõ lieäu daáu chaám
ñoäng theo ñònh daïng chuaån IEEE 754.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

2.5 KIEÅU DÖÕ LIEÄU DAÁU CHAÁM


ÑOÄNG (Floating point data type)
Moät trong chuùng laø kieåu float, chieàu daøi 32 bit,
coù caáu truùc nhö sau:
1 bit cho daáu (döông hay aâm)
8 bit cho taàm (vuøng soá muõ-exponent)
23 bit cho ñoä chính xaùc (fraction)

N = (-1)S x 1.fraction x 2exponent-127, 1 ≤ exponent ≤ 254


HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

2.5 KIEÅU DÖÕ LIEÄU DAÁU CHAÁM


ÑOÄNG (Floating point data type)
Phaàn muõ daøi 8 bit nhò phaân, bieåu dieãn 256 trò
khoâng daáu, nhöng ta chæ söû duïng 254 trò trong
ñoù maø thoâi. Vuøng muõ chöùa 0000 0000 (töùc 0),
hay 1111 1111 (töùc 255) seõ cho moät yù nghóa ñaëc
bieät khaùc maø ta seõ xeùt sau.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

2.5 KIEÅU DÖÕ LIEÄU DAÁU CHAÁM


ÑOÄNG (Floating point data type)
5
Ví duï 2.10: Haõy bieåu dieãn soá 6 ôû daïng kieåu döõ
lieäu daáu chaám ñoäng. 8
Ví duï 2.11: Haõy tìm trò cho daïng bieåu dieãn thuoäc
kieåu daáu chaám ñoäng sau:
0 0111101100000000000000000000000
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

2.5 KIEÅU DÖÕ LIEÄU DAÁU CHAÁM


ÑOÄNG (Floating point data type)
Neáu phaàn muõ chöùa 00000000 thì soá muõ seõ ñöôïc
xem laø -126, phaàn trò maëc nhieân baét ñaàu baèng
bit 0 beân traùi daáu chaám nhò phaân, tôùi daáu chaám
nhò phaân, vaø theo sau laø 23 bit phaàn trò bình
thöôøng, cuï theå
(-1)S x 0.fraction x 2-126
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

2.5 KIEÅU DÖÕ LIEÄU DAÁU CHAÁM


ÑOÄNG (Floating point data type)
Ví duï, daïng bieåu dieãn daáu chaám ñoäng
0 00000000 00001000000000000000000
coù bit daáu baèng 0, neân laø soá döông, taùm bit keá
baèng 0, neân soá muõ laø -126, 23 bit cuoái taïo ra
daïng soá 0.00001000000000000000000, töùc baèng
2-5. Nhö vaäy, soá ñöôïc bieåu dieãn laø 2-5 . 2-126, töùc
2-131.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

2.5 KIEÅU DÖÕ LIEÄU DAÁU CHAÁM


ÑOÄNG (Floating point data type)
Thí duï 2.12: Kieåm chöùng trò kieåu daáu chaám
ñoäng cuûa caùc maãu sau:
0 10000011 00101000000000000000000 laø 1.00101x 24 = 18.5
1 10000010 00101000000000000000000 laø -1 x 1.00101x 23 = -9.25
0 11111110 11111111111111111111111 laø 1.111…11 x 2127 ~ 2128
1 00000000 00000000000000000000001 laø -2-149
0 00000000 00000000000000000000000 laø 0+
1 00000000 00000000000000000000000 laø 0-
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

2.5 KIEÅU DÖÕ LIEÄU DAÁU CHAÁM


ÑOÄNG (Floating point data type)
Neáu phaàn muõ chöùa 11111111 thì ta seõ coù hai
khaû naêng xaûy ra:
- Neáu phaàn trò baèng 0, soá seõ laø döông voâ cöïc
(+∞) hay aâm voâ cöïc (-∞) tuøy vaøo bit daáu.
-Neáu phaàn trò khaùc 0, luùc naøy vieäc bieåu dieãn
soá daáu chaám ñoäng seõ khoâng laø moät soá (Not a
Number - NaN), khoâng quan taâm tôùi bit daáu.
Daïng NaN naøy baùo hieäu nhöõng thao taùc khoâng
hôïp leä nhö nhaân zero (0) vôùi voâ cöïc (∞).
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

2.5 KIEÅU DÖÕ LIEÄU DAÁU CHAÁM


ÑOÄNG (Floating point data type)
Töông töï, kieåu double coù chieàu daøi 64 bit theo
ñònh daïng sau:

N = (-1)S x 1.fraction x 2exponent-1023, 1 ≤ exponent ≤


1022
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

2.5 KIEÅU DÖÕ LIEÄU DAÁU CHAÁM


ÑOÄNG (Floating point data type)
BT:
Biểu diễn số 13.828125 D sang kiểu dữ liệu
chấm ñộng.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

KEÁT THUÙC CHÖÔNG 2


HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

CHÖÔNG 6
GIÔÙI THIEÄU VEÀ NGOÂN NGÖÕ LAÄP
TRÌNH C
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

CHÖÔNG 6
GIÔÙI THIEÄU VEÀ NGOÂN NGÖÕ LAÄP
TRÌNH C

1.GIÔÙI THIEÄU VEÀ NGOÂN NGÖÕ C


2.CAÙC VÍ DUÏ
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

6.1 GIÔÙI THIEÄU NGOÂN NGÖÕ C


1- Sô löôïc lòch söû cuûa ngoân ngöõ C
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

6.1 GIÔÙI THIEÄU NGOÂN NGÖÕ C


2- Ñaëc ñieåm cuûa ngoân ngöõ C
C laø ngoân ngöõ khoâng nhaïy kieåu. Caùc kieåu döõ lieäu cuûa
C khi ñöôïc söû duïng ñeå khai baùo bieán, haèng thì bieán,
haèng coù theå nhaän ñöôïc trò khoâng cuøng kieåu vôùi kieåu
maø bieán, haèng ñaõ ñöôïc khai baùo.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

6.1 GIÔÙI THIEÄU NGOÂN NGÖÕ C


2- Ñaëc ñieåm cuûa ngoân ngöõ C
C coù nhieàu kieåu döõ lieäu phong phuù, vôùi nhieàu
kieåu soá nguyeân vaø soá thöïc. Ngoaøi ra, C coøn cho
pheùp ngöôøi laäp trình töï xaây döïng nhöõng kieåu döõ
lieäu khaùc tuøy theo yeâu caàu cuûa mình.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

6.1 GIÔÙI THIEÄU NGOÂN NGÖÕ C


2- Ñaëc ñieåm cuûa ngoân ngöõ C
C coù caùc pheùp toaùn ñaëc bieät cho pheùp laäp trình
vieân thöïc hieän thao taùc leänh hieäu quaû nhaát.
Hieäu quaû ñoù coù ñöôïc do C coù nhieàu toaùn töû khaù
gaàn vôùi caùc leänh cuûa ngoân ngöõ maùy. Ngoaøi ra, C
coøn cung caáp caùc toaùn töû xöû lyù ñeán töøng bit,
byte, ñeán caû ñòa chæ cuûa boä nhôù.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

6.1 GIÔÙI THIEÄU NGOÂN NGÖÕ C


2- Ñaëc ñieåm cuûa ngoân ngöõ C
C coù caùc leänh ñieàu khieån vaø voøng laëp raát thoaùng
vaø khaù logic vaø phuø hôïp vôùi phöông phaùp laäp
trình coù caáu truùc.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

6.1 GIÔÙI THIEÄU NGOÂN NGÖÕ C


2- Ñaëc ñieåm cuûa ngoân ngöõ C
C cho pheùp khai baùo caùc pointer chæ tôùi caùc bieán
vaø haøm, ñaëc bieät laø duøng pointer ñeå quaûn lyù
bieán ñoäng, ñieàu naøy laøm cho moät chöông trình C
raát linh ñoäng trong vieäc khai baùo, söû duïng bieán
vaø haøm.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

6.1 GIÔÙI THIEÄU NGOÂN NGÖÕ C


2- Ñaëc ñieåm cuûa ngoân ngöõ C
C khoâng cung caáp tröïc tieáp caùc thao taùc ñaëc bieät
nhö xuaát nhaäp caùc thieát bò ngoaïi vi, xöû lyù chuoãi,
maûng; caùc thao taùc naøy chæ ñöôïc cung caáp döôùi
daïng nhöõng haøm thö vieän.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

6.2 CAÙC VÍ DUÏ


1- Ví duï 1
main()

{
printf ("Hello, world\n");
}
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

6.2 CAÙC VÍ DUÏ


2- Ví duï 2
#include <stdio.h>
#include <conio.h>
main()
{
double a, b;
clrscr();
printf ("Môøi nhaäp 2 soá nguyeân: ");
scanf ("%lf%lf", &a, &b);
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

6.2 CAÙC VÍ DUÏ


2- Ví duï 2
if (a < b)
printf ("%5.2lf nhoû hôn %5.2lf", a, b);
else if (a == b)
printf ("%5.2lf baèng %5.2lf", a, b);
else /* a > b */
printf ("%5.2lf lôùn hôn %5.2lf", a, b);
}
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

6.2 CAÙC VÍ DUÏ


3- Ví duï 3
#include <stdio.h>
#include <conio.h>
main()
{
int n, n2;
clrscr();
n =1;
while (n <= 10)
{
n2 = n * n;
printf ("%2d%5d \n", n, n2);
n = n + 1;
}
}
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

BAØI TAÄP
1. Vieát chöông trình in ra maøn hình hình sau:
*********
* *
* *
*********
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

BAØI TAÄP
2. Vieát chöông trình in ra maøn hình caùc thoâng
tin sau:
Hoï teân:
Tuoåi:
Ngheà nghieäp:
Ñòa chæ:
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

BAØI TAÄP
3. Vieát chöông trình nhaäp moät soá töø baøn phím,
kieåm tra neáu soá ñoù lôùn hôn hoaëc baèng 0 thì tính
caên baäc hai cuûa noù, coøn neáu soá ñoù nhoû hôn 0 thì
baùo loãi vaø keát thuùc chöông trình. Vôùi sqrt laø
haøm trong C coù prototype naèm trong file math.h
nhö sau:
double sqrt (double x);
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

BAØI TAÄP
4. Nhaäp ba soá töø baøn phím, in ra maøn hình soá
lôùn nhaát vaø soá nhoû nhaát trong ba soá ñoù.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

KEÁT THUÙC CHÖÔNG 6


HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

CHÖÔNG 7
CAÙC THAØNH PHAÀN CÔ BAÛN VAØ CAÙC
KIEÅU DÖÕ LIEÄU CUÛA C
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

CHÖÔNG 7
CAÙC THAØNH PHAÀN CÔ BAÛN VAØ CAÙC
KIEÅU DÖÕ LIEÄU CUÛA C
7.1 Danh hieäu
7.2 Caùc kieåu döõ lieäu chuaån cuûa C
7.3 Haèng (constant)
7.4 Bieán (variable)
7.5 Bieåu thöùc
7.6 Caùc pheùp toaùn cuûa C
7.7 Caáu truùc toång quaùt cuûa moät chöông trình C
Baøi taäp cuoái chöông
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.1 DANH HIEÄU


Danh hieäu laø teân cuûa haèng, bieán, haøm... hoaëc caùc
kyù hieäu ñaõ ñöôïc quy ñònh ñaëc tröng cho moät
thao taùc naøo ñoù. Danh hieäu coù hai loaïi: kyù hieäu
vaø danh hieäu.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.1 DANH HIEÄU


Kyù hieäu (symbol) laø caùc daáu ñaõ ñöôïc C quy ñònh
ñeå bieåu dieãn cho moät thao taùc naøo ñoù.
-Neáu duøng moät daáu ñeå bieåu dieãn cho moät thao
taùc thì ta coù kyù hieäu ñôn (single symbol).
Ví duï: +, -, *, /, %, =, >, <
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.1 DANH HIEÄU


Kyù hieäu (symbol) laø caùc daáu ñaõ ñöôïc C quy ñònh
ñeå bieåu dieãn cho moät thao taùc naøo ñoù.
-Neáu duøng hai daáu trôû leân bieåu dieãn cho moät
thao taùc thì ta coù kyù hieäu keùp (compound
symbol).
Ví duï: ==, >=, <=, /*, */, ++, --, &&, ||, ...
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.1 DANH HIEÄU


Danh hieäu (Identifier) laø caùc töø khoùa cuûa ngoân
ngöõ hoaëc teân cuûa caùc haèng, bieán, haøm trong C.
Danh hieäu bao haøm töø khoùa vaø danh hieäu.
Töø khoùa (keyword) laø caùc danh hieäu maø C ñaõ
ñònh nghóa saün cho laäp trình vieân söû duïng ñeå
thieát keá chöông trình, taäp caùc töø khoùa cuûa C seõ
ñöôïc lieät keâ trong phaàn phuï luïc.
Ví duï: if, for, while...
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.1 DANH HIEÄU


Danh hieäu (Identifier) laø caùc töø khoùa cuûa ngoân
ngöõ hoaëc teân cuûa caùc haèng, bieán, haøm trong C.
Danh hieäu bao haøm töø khoùa vaø danh hieäu.
Danh hieäu laø teân cuûa caùc haèng, bieán, haøm...
-Neáu caùc haèng, bieán, haøm ... naøy do C ñaõ khai
baùo vaø thieát keá saün thì caùc danh hieäu coù ñöôïc
goïi laø caùc danh hieäu chuaån.
Ví duï: main, scanf, printf...
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.1 DANH HIEÄU


Danh hieäu (Identifier) laø caùc töø khoùa cuûa ngoân
ngöõ hoaëc teân cuûa caùc haèng, bieán, haøm trong C.
Danh hieäu bao haøm töø khoùa vaø danh hieäu.
Danh hieäu laø teân cuûa caùc haèng, bieán, haøm...
-Neáu caùc haèng, bieán, haøm ... naøy do laäp trình
vieân khai baùo vaø ñònh nghóa trong quaù trình
thieát keá chöông trình thì caùc danh hieäu ñoù ñöôïc
goïi laø caùc danh hieäu khoâng chuaån.
-Ví duï: a, b, delta
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.1 DANH HIEÄU


Chuù yù raèng C laø moät ngoân ngöõ nhaïy caûm vôùi söï
phaân bieät giöõa kyù töï hoa vaø kyù töï thöôøng, do ñoù
khi vieát While seõ hoaøn toaøn phaân bieät vôùi while.
Caùc töø khoùa cuûa C ñeàu ôû daïng chöõ thöôøng.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.1 DANH HIEÄU


Nhö vaäy danh hieäu khoâng chuaån laø teân cuûa caùc
haèng, bieán, haøm ... do laäp trình vieân töï ñaët, do
ñoù nguyeân taéc ñaët teân cuûa danh hieäu khoâng
chuaån cuõng caàn phaûi ñöôïc neâu cuï theå:
- Danh hieäu khoâng chuaån khoâng truøng vôùi töø
khoùa
- Danh hieäu khoâng chuaån khoâng truøng vôùi danh
hieäu chuaån
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.1 DANH HIEÄU


- Khi ñaët teân cho danh hieäu khoâng chuaån caàn
phaûi theo sô ñoà cuù phaùp sau:
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.1 DANH HIEÄU


Chuù yù:
- Ñoái vôùi oâ vuoâng khi ñi ngang qua ta caàn phaûi
laáy moät phaàn töû trong noù.
- Ñoái vôùi oâ troøn khi ñi ngang qua ta phaûi laáy
phaàn töû trong noù.
- Moät danh hieäu coù theå ñöôïc baét ñaàu baèng daáu
gaïch döôùi
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.1 DANH HIEÄU


Ví duï:
Main ?
-batdau ?
_batdau ?
2thang9 ?
ket thuc ?
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.1 DANH HIEÄU


Ví duï:
Main ?
-batdau ?
_batdau ?
2thang9 ?
ket thuc ?

/* maøu ñoû: danh hieäu sai*/


HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.1 DANH HIEÄU


Chieàu daøi moät danh hieäu khoâng bò haïn cheá, moãi
boä dòch C seõ coù quy ñònh veà chieàu daøi danh hieäu
khaùc nhau, ñoái vôùi caùc boä dòch C/C++ thì danh
hieäu coù theå daøi tuøy yù, tuy nhieân trong caùc boä
dòch Borland C/C++ coù quy ñònh moät giaù trò xaùc
ñònh soá kyù töï ñaàu coù nghóa ñeå phaân bieät söï
gioáng nhau vaø khaùc nhau giöõa hai danh hieäu.
Trong Turbo C 2.0, giaù trò naøy laø 31, trong
Borland C++ 5.02, giaù trò naøy laø 55.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.1 DANH HIEÄU


Ví duï:

ket_thuc_vong_lap_in_ra_ky_tu_khoang_trang
ket_thuc_vong_lap_in_ra_k
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.2 CAÙC KIEÅU DÖÕ LIEÄU CUÛA C


C coù boán kieåu döõ lieäu chuaån: char, int, float vaø
double, moãi kieåu seõ coù yeâu caàu veà boä nhôù vaø taàm
trò nhö sau:
KIEÅU KÍCH THÖÔÙC TAÀM TRÒ BIEÅU DIEÃN

char 8 bit 128 .. + 127

int 16 bit 32768 .. + 32767

float 32 bit 3.4E37 .. 3.4E+38

double 64 bit 1.7E307.. 1.7E+308


HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.2 CAÙC KIEÅU DÖÕ LIEÄU CUÛA C


1- Kieåu char
char laø kieåu nguyeân moät byte, kieåu naøy coù theå
ñöôïc söû duïng ñeå khai baùo bieán, bieán ñoù seõ chieám
kích thöôùc trong boä nhôù laø 1 byte vaø coù theå giöõ
moät kyù töï hoaëc moät giaù trò 8 bit. Moãi boä dòch C
seõ coù quy ñònh khaùc nhau veà taàm trò cuûa kieåu
char, ñoái vôùi boä dòch TURBO C VERSION 2.0
kieåu char laø kieåu coù daáu.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.2 CAÙC KIEÅU DÖÕ LIEÄU CUÛA C


1- Kieåu char
Ví duï: Bieán kieåu char löu trò haèng kyù töï
#include <stdio.h>
main()
{
char c;
c = 'a';
printf (“Ky tu trong bien c la %c ", c);
}
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.2 CAÙC KIEÅU DÖÕ LIEÄU CUÛA C


1- Kieåu char
Ví duï: Bieán kieåu char löu trò soá nguyeân
#include <stdio.h>
main()
{
char c;
c = 89;
printf ("Tri trong bien c la %d ", c);
}
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.2 CAÙC KIEÅU DÖÕ LIEÄU CUÛA C


2- Kieåu int
Kieåu int laø moät kieåu soá nguyeân, coù theå ñöôïc söû
duïng ñeå khai baùo bieán, bieán ñoù coù kích thöôùc
trong boä nhôù laø kích thöôùc cuûa soá nguyeân maø maùy
quy ñònh, ñoái vôùi maùy PC vaø boä dòch Borland
C/C++ thì chieàu daøi cuûa kieåu int laø 16 bit coù daáu,
nhö vaäy moät bieán hay haèng thuoäc kieåu naøy coù taàm
trò bieåu dieãn töø –32768 ñeán 32767 (töùc töø –2–15
ñeán 215 – 1).
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.2 CAÙC KIEÅU DÖÕ LIEÄU CUÛA C


2- Kieåu int
Ví duï :
#include <stdio.h>
main()
{ int i;
i = 1234;
i = i + 123;
printf ("Trò trong bieán i laø %d ", i);
}
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.2 CAÙC KIEÅU DÖÕ LIEÄU CUÛA C


3- Kieåu float vaø double
float laø kieåu soá thöïc daáu chaám ñoäng, coù ñoä chính
xaùc ñôn (7 kyù soá sau daáu chaám thaäp phaân),
double laø kieåu soá thöïc, daáu chaám ñoäng, coù ñoä
chính xaùc keùp (15 kyù soá sau daáu chaám thaäp phaân).
Kieåu double coøn coù theå ñöôïc khai baùo laø long
float, do ñoù khi khai baùo double b; thì cuõng hoaøn
toaøn töông ñöông vôùi long float b;
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.2 CAÙC KIEÅU DÖÕ LIEÄU CUÛA C


3- Kieåu float vaø double
Ñeå xuaát nhaäp cho haèng, bieán, bieåu thöùc float
chuoãi ñònh daïng ñöôïc söû duïng laø "%f" ñoái vôùi kieåu
double thì chuoãi ñònh daïng laø "%lf" cho caùc haøm
printf vaø scanf.
Ví duï:
float a;
double b;
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.2 CAÙC KIEÅU DÖÕ LIEÄU CUÛA C


3- Kieåu float vaø double
Ví duï 1.12:
#include <stdio.h>
#include <conio.h>
#include <math.h>
main()
{
double x, y, luy_thua;
clrscr(); printf ("Moi nhap 2 so:");
scanf ("%lf %lf“, &x, &y);
if (x < 0 && (y - (int)y != 0)), printf ("Ban da nhap sai tri");
else { luy_thua = pow (x, y);
printf ("Luy thua cua %5.2lf voi %5. 2lf la %5.2lf", x, y, luy_thua); }
}
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.2 CAÙC KIEÅU DÖÕ LIEÄU CUÛA C


Ngoaøi ra, ANSI (American National Standards
Institute – ANSI) coøn ñöa theâm moät kieåu döõ lieäu
nöõa laø void. Ñaây laø kieåu khoâng trò, chæ duøng ñeå
bieåu dieãn keát quaû traû veà cuûa haøm vaø khai baùo
pointer khoâng troû ñeán moät kieåu döõ lieäu xaùc ñònh
naøo caû. Kieåu naøy seõ ñöôïc noùi chi tieát hôn ôû caùc
phaàn sau.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.2 CAÙC KIEÅU DÖÕ LIEÄU CUÛA C


Ñeå boå sung cho boán kieåu döõ lieäu cô baûn C coøn ñöa
ra caùc daïng boå sung signed, unsigned, short,
long :
- signed xaùc ñònh kieåu coù daáu.
- unsigned xaùc ñònh kieåu khoâng daáu.
- short xaùc ñònh kieåu ngaén cuûa kieåu cô baûn.
- long xaùc ñònh kieåu daøi cuûa kieåu cô baûn.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.2 CAÙC KIEÅU DÖÕ LIEÄU CUÛA C


HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.2 CAÙC KIEÅU DÖÕ LIEÄU CUÛA C


Chuù yù raèng trong boä nhôù maùy tính, caùc giaù trò ñeàu
ñöôïc löu tröõ döôùi daïng maõ nhò phaân coù nhieàu bit
(8, 16 hoaëc 32 bit tuøy theo kieåu cuûa bieán hoaëc giaù
trò), trong ñoù soá thöù töï cuûa caùc bit ñöôïc ñaùnh soá töø
phaûi sang traùi baét ñaàu töø 0, soá hieäu naøy ñöôïc goïi
laø vò trí cuûa bit. Moãi bit nhö vaäy coù moät troïng soá
laø 2 muõ n, vôùi n laø vò trí cuûa bit ñoù.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.2 CAÙC KIEÅU DÖÕ LIEÄU CUÛA C


Do ñoù, moät soá maø nhò phaân laø 10011110 seõ ñöôïc
bieåu dieãn nhö sau:
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.2 CAÙC KIEÅU DÖÕ LIEÄU CUÛA C


Ví duï: moät giaù trò kieåu integer (coù daáu)

0 0 0 0 0 0 1 0 1 0 0 0 1 0 1 0

29+27+23+21 = 512 + 128 + 8 + 2 = +650


HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.2 CAÙC KIEÅU DÖÕ LIEÄU CUÛA C


Ví duï: moät giaù trò kieåu integer (coù daáu)

1000001010001010

= 29+27+23+21-215
= 512 + 128 + 8 + 2 – 32768 = 650 – 32768
= –32118
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.2 CAÙC KIEÅU DÖÕ LIEÄU CUÛA C


Ví duï: moät giaù trò kieåu unsigned integer (khoâng coù
daáu)

1000001010001010

= 29+27+23+21+215
= 512 + 128 + 8 + 2 + 32768 = 650+32768
= 33418
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.2 CAÙC KIEÅU DÖÕ LIEÄU CUÛA C


Ví duï: :
khi caàn khai baùo moät bieán n coù kieåu laø unsigned
int ta chæ caàn vieát: unsigned int n;
hoaëc goïn hôn unsigned n;

hoaëc chæ caàn vieát: long p; laø ñuû ñeå khai baùo cho
bieán p coù kieåu laø signed long int.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.2 CAÙC KIEÅU DÖÕ LIEÄU CUÛA C


Ta caàn chuù yù laø khi muoán khai baùo ñaây laø moät
char coù hay khoâng coù bit daáu thì neân khai baùo ñaày
ñuû:
signed char c;
hay
unsigned char c;
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.2 CAÙC KIEÅU DÖÕ LIEÄU CUÛA C


Moãi kieåu döõ lieäu chæ bieåu dieãn ñöôïc caùc giaù trò
naèm trong moät giôùi haïn nhaát ñònh. Giôùi haïn naøy
phuï thuoäc vaøo soá bit maø kieåu döõ lieäu ñoù quy ñònh
khi khai baùo bieán vaø do ñoù coøn tuøy thuoäc vaøo loaïi
maùy. Giôùi haïn naøy ta goïi laø taàm trò cuûa kieåu.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.2 CAÙC KIEÅU DÖÕ LIEÄU CUÛA C


HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.3 HAÈNG (CONSTANT)


Haèng laø nhöõng giaù trò coá ñònh coù trò hoaøn toaøn
xaùc ñònh vaø khoâng theå thay ñoåi ñöôïc chuùng trong
quaù trình thöïc thi chöông trình. Trong C, moãi
haèng ñeàu coù moät kieåu döõ lieäu rieâng maø caên cöù vaøo
kieåu döõ lieäu ta coù caùc loaïi haèng sau:
- Haèng soá
- Haèng kyù töï
- Chuoãi kyù töï
- Bieåu thöùc haèng
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.3 HAÈNG (CONSTANT)


1- Haèng soá
Haèng soá laø caùc trò soá ñaõ xaùc ñònh, moät haèng soá coù
theå laø soá nguyeân hoaëc soá thöïc.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.3 HAÈNG (CONSTANT)


1- Haèng soá
Haèng soá nguyeân
Trong ngoân ngöõ C, haèng soá nguyeân coù theå thuoäc
moät trong hai kieåu laø integer hoaëc long integer.
ÖÙng vôùi moãi kieåu, haèng soá coù theå ñöôïc bieåu dieãn ôû
daïng thaäp phaân, baùt phaân(05) hay thaäp luïc
phaân(0x6).
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.3 HAÈNG (CONSTANT)


1- Haèng soá
Haèng soá nguyeân
+ Haèng soá nguyeân ñöôïc vieát moät caùch bình thöôøng
vaø thöôøng chieám moät töø (word) trong boä nhôù, do
ñoù noù coù giaù trò ñi töø –32768 ñeán 32767, coù nghóa
laø MSB cuûa daïng löu tröõ nhò phaân cuûa moät soá
nguyeân luoân laø bit daáu.
Caùc haèng soá nguyeân 10 –4 –23456
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.3 HAÈNG (CONSTANT)


1- Haèng soá
Haèng soá nguyeân
Ta caàn löu yù khi söû duïng haèng soá nguyeân vöôït quaù
taàm quy ñònh.
Ví duï: Xeùt chöông trình sau:
#include <stdio.h>
main()
{
printf ("%d %d %d", 32767, 32767 + 1, 32767 + 2);
}
32767 32768 –2767
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.3 HAÈNG (CONSTANT)


1- Haèng soá
Haèng soá nguyeân
+ Haèng soá nguyeân daïng long integer laïi ñöôïc löu
tröõ trong boä nhôù vôùi chieàu daøi 32 bit, coù nghóa laø
noù coù theå coù trò naèm trong khoaûng -2147483648
ñeán +2147483647, vaø khi vieát caùc haèng soá nguyeân
daïng naøy ta caàn phaûi theâm l hay L ngay sau soá
caàn laøm vieäc.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.3 HAÈNG (CONSTANT)


1- Haèng soá
Haèng soá nguyeân
Ví duï:
#include <stdio.h>
#include <conio.h>
main()
{
clrscr();
printf ("%ld %ld %ld", 32767L, 32768L, 32769L);
getch();
}
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.3 HAÈNG (CONSTANT)


1- Haèng soá
Haèng soá nguyeân
Haèng soá nguyeân coù theå ôû daïng unsigned, khi ñoù ta
seõ theâm u hoaëc U vaøo ngay sau soá ñang laøm vieäc
(soá ñoù coù theå ñang ôû kieåu integer hoaëc long
integer).
Ví duï: Caùc haèng soá sau ñaây ôû daïng unsigned
123U 234u 24UL
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.3 HAÈNG (CONSTANT)


1- Haèng soá
Haèng
soá
nguyeân
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.3 HAÈNG (CONSTANT)


1- Haèng soá
Haèng thöïc
Trong ngoân ngöõ C, soá thöïc coù theå ôû daïng daáu
chaám tónh hoaëc daáu chaám ñoäng.
Ví duï: caùc soá thöïc sau ôû daïng daáu chaám tónh
1.4 –2.34 –10.0234
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.3 HAÈNG (CONSTANT)


1- Haèng soá
Haèng thöïc
Moät haèng thöïc ôû daïng soá daáu chaám ñoäng coù theå coù
caùc thaønh phaàn sau:
- phaàn nguyeân: phaàn naøy laø tuøy yeâu caàu.
- daáu chaám thaäp phaân: baét buoäc phaûi coù.
- phaàn leû: tuøy yeâu caàu.
- caùc kyù töï "e" hoaëc "E" vaø moät soá muõ. Soá muõ baûn
thaân noù coù theå aâm.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.3 HAÈNG (CONSTANT)


1- Haèng soá
Haèng thöïc

Haèng thöïc daáu chaám ñoäng Haèng thöïc töông ñöông

2.1415e4 21415.0

0.2344e–4 0.00002344

.2344e3 234.4
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.3 HAÈNG (CONSTANT)


1- Haèng soá
Caàn löu yù:
- Caùc haèng soá ñöôïc vieát khoâng coù daáu thaäp phaân
hoaëc soá muõ, seõ ñöôïc hieåu laø nguyeân vaø ñöôïc löu tröõ
theo kieåu int, ngöôïc laïi seõ ñöôïc löu tröõ theo kieåu
double.
- Caùc haèng soá nguyeân lôùn hôn khaû naêng moät int
ñöôïc töï ñoäng löu tröõ theo kieåu long.
- Caùc haèng soá nguyeân lôùn hôn moät long ñöôïc löu tröõ
theo kieåu double.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.3 HAÈNG (CONSTANT)


2- Haèng kyù töï
Haèng kyù töï bieåu dieãn moät giaù trò kyù töï ñôn, kyù töï
naøy phaûi ñöôïc vieát giöõa caëp daáu nhaùy ñôn (''), moãi
kyù töï coù moät maõ soá töông öùng trong baûng maõ kyù
töï cuûa maùy, bình thöôøng laø maõ ASCII.
Ví duï:
'a' '/' '9'
'A' coù maõ laø 65 trong baûng maõ ASCII.
'0' coù maõ laø 48 (0x30) trong baûng maõ ASCII.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.3 HAÈNG (CONSTANT)


2- Haèng kyù töï
Ví duï 1.26:
#include <stdio.h>
main()
{
printf ("Kyù töï: %c %c %c \n", 'A', '$', '1' );
printf ("Maõ ASCII (Octal): %o %o %o \n", 'A', '$', '1' );
printf ("Maõ ASCII (Decimal): %d %d %d \n", 'A', '$', '1' );
}
Chöông trình in ra maøn hình keát quaû sau:
Kyù töï: A $ 1
Maõ ASCII (Octal): 101 44 61
Maõ ASCII (Decimal): 65 36 49
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.3 HAÈNG (CONSTANT)


2- Haèng kyù töï
Ví duï:
'\n' laø kyù töï xuoáng doøng (line feed)
'\45' laø kyù töï ASCII coù maõ octal laø 45 hay 37
decimal
'\0' laø kyù töï NUL
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.3 HAÈNG (CONSTANT)


3- Chuoãi kyù töï
Trong ngoân ngöõ C, moät chuoãi kyù töï laø moät loaït
caùc kyù töï naèm trong caëp daáu nhaùy keùp (); caùc kyù
töï naøy coù theå laø kyù töï ñöôïc bieåu dieãn baèng chuoãi
thoaùt.
Ví duï:
"Moät chuoãi kyù töï"
"Chuoãi kyù töï coù chuoãi thoaùt: i can\'t go to school
\n\a"
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.3 HAÈNG (CONSTANT)


3- Chuoãi kyù töï
Ví duï: “string”
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.3 HAÈNG (CONSTANT)


4- Bieåu thöùc haèng
Moät bieåu thöùc ñöôïc xem laø moät bieåu thöùc haèng
neáu giaù trò cuûa bieåu thöùc hoaøn toaøn xaùc ñònh, nhö
vaäy moät bieåu thöùc toaùn hoïc laø moät bieåu thöùc haèng
khi trong bieåu thöùc ñoù caùc toaùn haïng ñeàu laø
nhöõng haèng soá hoaëc haèng kyù töï.
Ví duï: Xeùt caùc bieåu thöùc haèng sau
10 – 13 % 3 seõ ñöôïc tính tröôùc vaø ñöôïc ghi laø 9
'a' – 'A' seõ ñöôïc tính tröôùc vaø ñöôïc ghi laø 32
1 < 8 seõ ñöôïc tính tröôùc vaø ñöôïc ghi laø 1 (true)
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.4 BIEÁN (VARIABLE)


7.4.1 Khai baùo bieán
Taát caû caùc bieán ñöôïc söû duïng trong moät chöông
trình C ñeàu phaûi ñöôïc khai baùo tröôùc. Vieäc khai
baùo naøy giuùp cho chöông trình bieân dòch coù theå
bieát ñöôïc kích thöôùc cuûa bieán ñoù, vò trí cuûa chuùng
trong boä nhôù vaø söï toàn taïi cuûa chuùng trong chöông
trình, khi muoán söû duïng bieán ta chæ caàn goïi teân
bieán, dó nhieân teân bieán phaûi laø moät danh hieäu
khoâng chuaån hôïp leä
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.4 BIEÁN (VARIABLE)


7.4.1 Khai baùo bieán
Ví duï:
bat_dau 
If 

 ñeàu laø caùc danh hieäu hôïp leä
_hoten 
Thu_thang_1_68
printf 
pow 

 ñeàu laø caùc danh hieäu khoâng hôïp leä
31_thang_12
ket thuc 
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.4 BIEÁN (VARIABLE)


7.4.1 Khai baùo bieán
Ví duï:

BIEN
BiEN

Bien  ñeàu laø nhöõng bieán khaùc nhau
biEN 

bien 
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.4 BIEÁN (VARIABLE)


7.4.1 Khai baùo bieán
Cuù phaùp khai baùo bieán
kieåu dsach_tenbien;
Giaûi thích:
kieåu kieåu cuûa caùc bieán caàn khai baùo
dsach_tenbien danh saùch lieät keâ caùc teân bieán caàn
khai baùo, caùc bieán caùch nhau baèng daáu ",“
Ví duï: int lap, count, max;
double he_so_1, he_so_2, delta;
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.4 BIEÁN (VARIABLE)


7.4.1 Khai baùo bieán
Ví duï:
#include <stdio.h>
main()
{
int thu;
thu = 65;
printf ("Trò trong bieán thu laø %d \n", thu);
thu = thu + 10;
printf ("Sau khi gaùn, trò trong bieán thu laø %d \n", thu);
}
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.4 BIEÁN (VARIABLE)


7.4.1 Khai baùo bieán
Bieán cuûa moät chöông trình C coù theå ñöôïc khai baùo
ôû moät trong ba vò trí sau:
-Ngoaøi taát caû caùc haøm khi ñoù ta coù bieán toaøn cuïc.
- Ñaàu phaàn thaân cuûa moät haøm hoaëc moät khoái leänh
khi ñoù ta coù bieán cuïc boä.
-Trong phaàn ñònh nghóa ñoái soá cuûa haøm (goïi laø ñoái
soá haøm hoaëc tham soá haøm).
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.4 BIEÁN (VARIABLE)


7.4.1 Khai baùo bieán
Ví duï:
#include <stdio.h>
int a, b; khai baùo bieán ngoaøi
main()
{ ...
a = 10;
b = a + 24;
... }
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.4 BIEÁN (VARIABLE)


7.4.1 Khai baùo bieán
Ví duï:
int tong()
{ int i, tam; khai baùo bieán trong
...
for (i = 10;...
...
}
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.4 BIEÁN (VARIABLE)


7.4.1 Khai baùo bieán
Ví duï:
int luy_thua (int n, char ket_qua) ñoái soá haøm
{ ...
for (i =1; ...
...
}
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.4 BIEÁN (VARIABLE)


7.4.1 Khai baùo bieán
Moät bieán coù theå ñöôïc khôûi ñoäng trò ngay sau khi
khai baùo baèng pheùp gaùn vôùi giaù trò töông öùng, khi
ñoù cuù phaùp khai baùo bieán nhö sau:
kieåu bien1 = tri1, bien2 = tri2;
vôùi caùc tri1 vaø tri2 phaûi laø nhöõng giaù trò ñaõ xaùc
ñònh.Ví duï:
double he_so_1 = 20.37;
char ky_tu = 'A', ky_tu_moi = ky_tu:
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.4 BIEÁN (VARIABLE)


7.4.2 Caùc boå tuùc kieåu const vaø volatile
Töø khoùa const: khi ñöôïc khai baùo cho bieán thì noù
xaùc ñònh raèng bieán seõ khoâng bò thay ñoåi trò trong
suoát quaù trình thöïc thi chöông trình, moïi söï thay
ñoåi trò ñeàu gaây ra loãi, bieán ñoù ta goïi laø bieán haèng.
Cuù phaùp:
const kieåu teân_bieán [ = trò ñöôïc thay theá];
Ví duï: const double bat_dau = 3.1415:
const int max = 100;
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.4 BIEÁN (VARIABLE)


7.4.2 Caùc boå tuùc kieåu const vaø volatile
Neáu kieåu cuûa bieán haèng khoâng neâu cuï theå thì
bieán haèng ñoù seõ thuoäc loaïi int, ngay caû neáu trò
ñöôïc thay theá laø moät trò khaùc int thì chæ phaàn
nguyeân ñöôïc söû duïng vaø löu vaøo bieán haèng maø
thoâi.
Ví duï :
const max = 100;
const pi = 3.14; khi ñoù bieán pi chæ laø 3 maø thoâi
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.4 BIEÁN (VARIABLE)


7.4.2 Caùc boå tuùc kieåu const vaø volatile
Töø khoùa volatile: chæ ra raèng moät bieán coù theå bò
thay ñoåi trò töø moät taùc nhaân khoâng naèm trong
chöông trình. Töø khoùa naøy laøm cho bieán cuûa C coù
moät tính linh ñoäng raát cao, ví duï nhö bieán cuûa C
coù theå thay ñoåi theo ñoàng hoà heä thoáng hay theo
moät chöông trình neàn naøo ñoù.
Cuù phaùp:
volatile <teân_bieán>;
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.5 BIEÅU THÖÙC


Bieåu thöùc laø moät söï keát hôïp cuûa caùc toaùn haïng laø
caùc bieán, haèng hoaëc pheùp goïi haøm baèng caùc toaùn
töû xaùc ñònh cuûa C ñeå taïo ra ñöôïc moät trò, trò naøy
coù theå ñöôïc söû duïng hoaëc khoâng ñöôïc söû duïng tuøy
nhu caàu cuûa laäp trình vieân.
Ví duï: Ñoái vôùi C, moät bieåu thöùc nhö sau laø hôïp leä:
a = (x = 10) – (y = a + 1) * ( (b += 1) > 12);
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.6 CAÙC PHEÙP TOAÙN CUÛA C


7.6.1 Toaùn töû soá hoïc
C coù caùc toaùn töû soá hoïc bình thöôøng giöõa 2 toaùn
haïng, ñoù laø
- Toaùn töû coäng (+) : thöïc hieän pheùp toaùn coäng
- Toaùn töû tröø (–) : thöïc hieän pheùp toaùn tröø
- Toaùn töû nhaân (*) : thöïc hieän pheùp nhaân
- Toaùn töû chia (/) : thöïc hieän pheùp chia
- Toaùn töû modulo (%): thöïc hieän pheùp toaùn laáy soá
dö cuûa pheùp chia nguyeân
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.6 CAÙC PHEÙP TOAÙN CUÛA C


7.6.1 Toaùn töû soá hoïc
Caùc pheùp toaùn naøy ñeàu thöïc hieän ñöôïc treân taát caû
caùc toaùn haïng laø haèng, bieán hoaëc bieåu thöùc coù
kieåu döõ lieäu char, int, long, float, double, tröø toaùn
töû modulo chæ thöïc hieän pheùp toaùn treân caùc döõ lieäu
thuoäc caùc kieåu nguyeân (char, int, long, unsigned).
Thöù töï keát hôïp theo nguyeân taéc toaùn hoïc: nhaân,
chia, modulo tröôùc; coäng, tröø sau, neáu caùc toaùn
haïng ñeàu ngang caáp thì keát hôïp töø traùi sang phaûi.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.6 CAÙC PHEÙP TOAÙN CUÛA C


7.6.1 Toaùn töû soá hoïc
Ví duï:
float a, b, c:
double y;y = a * b – c;
Pheùp toaùn coäng, tröø cuõng coù theå ñöôïc duøng nhö
pheùp toaùn ñôn haïng (laáy döông vaø aâm cuûa moät
toaùn haïng).
Ví duï:
b = – b; a = + b;
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.6 CAÙC PHEÙP TOAÙN CUÛA C


7.6.1 Toaùn töû soá hoïc
Pheùp nhaân vaø chia caùc soá nguyeân seõ chæ cho keát
quaû nguyeân (C töï ñoäng caét boû phaàn thaäp phaân
neáu coù).
Ví duï:

int a = 10, b = 3, c; double x = 10., y = 3, z;


c = a/b; /* c =3 */ z = x/y; /* z =3.3333 */
c = a % b; /* c =1 */
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.6 CAÙC PHEÙP TOAÙN CUÛA C


7.6.1 Toaùn töû soá hoïc
Moät vaán ñeà ñaët ra laø neáu coù nhieàu toaùn haïng khaùc
kieåu nhau thì C seõ thöïc hieän vieäc tính toaùn bieåu
thöùc ra sao? C seõ thöïc hieän vieäc chuyeån kieåu töï
ñoäng theo quy luaät sau: toaùn haïng thuoäc kieåu coù
trò nhoû hôn seõ ñöôïc chuyeån sang kieåu coù trò lôùn
hôn.Ví duï:
double a = 10, c; int b = 2;
c=a/b;
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.6 CAÙC PHEÙP TOAÙN CUÛA C


7.6.2 Toaùn töû quan heä
- Toaùn töû baèng (==)
- Toaùn töû khaùc (!=)
- Toaùn töû lôùn hôn (<)
- Toaùn töû nhoû hôn (>)
- Toaùn töû lôùn hôn hoaëc baèng (>=)
- Toaùn töû nhoû hôn hoaëc baèng (<=)
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.6 CAÙC PHEÙP TOAÙN CUÛA C


7.6.2 Toaùn töû quan heä
Khi moái quan heä giöõa hai toaùn haïng theo toaùn töû
quan heä trong bieåu thöùc laø ÑUÙNG thì bieåu thöùc
ñoù seõ traû veà moät trò nguyeân laø 1, coøn ngöôïc laïi
moái quan heä ñoù laø SAI thì bieåu thöùc ñoù seõ traû veà
moät trò nguyeân laø 0, ñaây laø caùc trò nguyeân bình
thöôøng maø ta coù theå duøng noù ñeå tính toaùn.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.6 CAÙC PHEÙP TOAÙN CUÛA C


7.6.2 Toaùn töû quan heä
Ví duï :
...
if (delta > 0)
{
...
}
else
...
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.6 CAÙC PHEÙP TOAÙN CUÛA C


7.6.2 Toaùn töû quan heä
Ví duï:
int a, b, c;
char kt;
a = 1;
b = 2;
c = –3;
kt = (a >= 4) * 2 + (b < 3) – c;
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.6 CAÙC PHEÙP TOAÙN CUÛA C


7.6.2 Toaùn töû quan heä
Ví duï:
1/ a = (b == 4); 2/ a = (b = 4);
toaùn töû quan heä toaùn töû gaùn
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.6 CAÙC PHEÙP TOAÙN CUÛA C


7.6.3 Toaùn töû logic
C coù caùc toaùn töû logic not (!), and (&&), or (||).
Caùc toaùn töû naøy cho pheùp laäp trình vieân lieân keát
caùc bieåu thöùc quan heä ñôn laïi vôùi nhau ñeå taïo caùc
bieåu thöùc phöùc taïp hôn.
Caùc toaùn töû naøy coù ñoä öu tieân laø not, and, or; neáu
trong bieåu thöùc caùc toaùn töû ñeàu ngang caáp nhau
thì thöù töï tính toaùn töø traùi sang phaûi.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.6 CAÙC PHEÙP TOAÙN CUÛA C


7.6.3 Toaùn töû logic
Toaùn haïng 1 Toaùn haïng 2 Keát quaû

A B !A A && B A ||B

baèng 0 baèng 0 1 0 0

baèng 0 khaùc 0 1 0 1

khaùc 0 baèng 0 0 0 1

khaùc 0 khaùc 0 0 0 1
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.6 CAÙC PHEÙP TOAÙN CUÛA C


7.6.3 Toaùn töû logic
Ví duï:
int a, b;
a = 4;
b = 5;
Bieåu thöùc: (a > 5) && (b < 3) coù trò laø false (0)
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.6 CAÙC PHEÙP TOAÙN CUÛA C


7.6.3 Toaùn töû logic
Ví duï:
int a, b;
a = 4;
b = 5;
thì bieåu thöùc (a > 5) ¦¦ (b > 3) coù trò laø true (1)
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.6 CAÙC PHEÙP TOAÙN CUÛA C


7.6.3 Toaùn töû logic
Ví duï: trong meänh ñeà if sau ñaây thay vì vieát
if (delta == 0) { ... }
ta coù theå vieát goïn hôn nhö sau:
if (!delta) { ... }
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.6 CAÙC PHEÙP TOAÙN CUÛA C


7.6.3 Toaùn töû logic
Ñieàu caàn löu yù laø caùc pheùp toaùn and (&&) vaø or ( )
ñöôïc thöïc hieän töø traùi sang phaûi vaø vieäc tính
toaùn seõ döøng laïi ngay khi giaù trò cuûa caû bieåu
thöùc logic ñaõ xaùc ñònh trò maø khoâng caàn tính
tieáp caùc phaàn coøn laïi cuûa bieåu thöùc nöõa.

Ví duï:
(c >= 'A') && (c <= 'Z') ¦¦ (c >= 'a') && (c <= 'z')
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.6 CAÙC PHEÙP TOAÙN CUÛA C


7.6.3 Toaùn töû logic
Ví duï:
scanf ("%d", &x);
if ( (x >= 10) && (x <= (y = 100)) )
{
...
}
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.6 CAÙC PHEÙP TOAÙN CUÛA C


7.6.4 Toaùn töû treân bit
C coù saùu toaùn töû ñaëc bieät cho pheùp laäp trình vieân
xöû lyù döõ lieäu kieåu nguyeân (nhö char, int, long,
unsigned hoaëc signed) ôû caáp ñoä bit, caùc toaùn töû
naøy ñöôïc goïi laø toaùn töû treân bit.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.6 CAÙC PHEÙP TOAÙN CUÛA C


7.6.4 Toaùn töû treân bit
- NOT: ~, thöïc hieän vieäc ñaûo bit, töø bit 0 qua 1 vaø
ngöôïc laïi
- AND: &, thöïc hieän vieäc and bit
- OR: | , thöïc hieän vieäc or bit
- XOR: ^ , thöïc hieän vieäc vieäc xor bit
- Dòch traùi: <<, dòch caùc bit sang traùi
- Dòch phaûi: >>, dòch caùc bit sang phaûi
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.6 CAÙC PHEÙP TOAÙN CUÛA C


7.6.4 Toaùn töû treân bit
Bit Bit Pheùp toaùn

A B ~A A&B A|B A^B

0 0 1 0 0 0

0 1 1 0 1 1

1 0 0 0 1 1

1 1 0 1 1 0
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.6 CAÙC PHEÙP TOAÙN CUÛA C


7.6.4 Toaùn töû treân bit
Ví duï :
a = 1030 coù maõ nhò phaân laø 0000 0100 0000 0110
b = 224 coù maõ nhò phaân laø 0000 0000 1110 0000
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.6 CAÙC PHEÙP TOAÙN CUÛA C


7.6.4 Toaùn töû treân bit
Pheùp toaùn AND (&) seõ keát hôïp vôùi moät trò maø ta
goïi laø maët naï che caùc bit döõ lieäu khoâng caàn quan
taâm, nhö vaäy trong giaù trò maët naï taïi nhöõng vò trí
caàn che, bit seõ coù trò laø 0, caùc bit coøn laïi laø 1, vaø
qua ñoù ta coù theå ñaùnh giaù ñöôïc döõ lieäu ñang laøm
vieäc moät caùch chính xaùc.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.6 CAÙC PHEÙP TOAÙN CUÛA C


7.6.4 Toaùn töû treân bit
Ví duï: Nhaäp vaøo moät soá nguyeân, xeùt xem bit coù vò
trí laø 9 coù baèng 1 hay khoâng
#include <stdio.h>
#include <conio.h>
#define MASK 0x0200
main()
{ int a;
clrscr();
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.6 CAÙC PHEÙP TOAÙN CUÛA C


7.6.4 Toaùn töû treân bit
printf ("Moi nhap mot so: ");
scanf ("%d", &a);
if (a & MASK)
printf ("Bit 9 bang 1 \n");
else
printf ("Bit 9 bang 0 \n");
getch();
}
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.6 CAÙC PHEÙP TOAÙN CUÛA C


7.6.4 Toaùn töû treân bit
Pheùp toaùn OR (|) ñöôïc duøng keát hôïp vôùi moät maët
naï ñeå baät caùc bit caàn thieát trong moät giaù trò leân
moät 1 vaø giöõ nguyeân caùc bit khaùc. Ñeå taïo ra moät
trò maët naï, caùc bit taïi caùc vò trí caàn thieát seõ ñöôïc
baät leân 1, coøn laïi giöõ 0. Keát quaû cuûa pheùp OR thu
ñöôïc töø moät giaù trò vaø moät maët naï laø moät giaù trò
maø trong ñoù caùc bit quan taâm seõ ñöôïc gaùn baèng 1.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.6 CAÙC PHEÙP TOAÙN CUÛA C


7.6.4 Toaùn töû treân bit
Ví duï: Nhaäp vaøo moät soá nguyeân, xeùt xem bit coù vò
trí laø 9 coù baèng 1 hay khoâng, neáu noù baèng 0 thì
baät bit ñoù leân 1 vaø in ra keát quaû.
#include <stdio.h>
#include <conio.h>
#define MASK 0x0200
main()
{ int a;
clrscr();
printf ("Moi nhap mot so: ");
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.6 CAÙC PHEÙP TOAÙN CUÛA C


7.6.4 Toaùn töû treân bit
scanf ("%d", &a);
if (a & MASK)
{ printf ("Bit 9 bang 1 \n");
printf ("Tri cua bien a la %d \n", a);
}
else
{ a =a | MASK;
printf ("Bit 9 bang 0 va da duoc bat len 1\n");
printf ("Tri cua bien a la %d \n", a);
}
getch();
}
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.6 CAÙC PHEÙP TOAÙN CUÛA C


7.6.4 Toaùn töû treân bit
Pheùp toaùn XOR (^) keát hôïp vôùi moät maët naï duøng
ñeå ñaûo caùc bit caàn thieát trong moät giaù trò töø 0 leân
1 vaø töø 1 veà 0, giöõ nguyeân caùc bit khaùc. Maët naï
naøy coù caùc bit taïi caùc vò trí caàn thieát seõ ñöôïc baät
leân 1, caùc bit coøn laïi giöõ nguyeân.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.6 CAÙC PHEÙP TOAÙN CUÛA C


7.6.4 Toaùn töû treân bit
Ví duï: Nhaäp vaøo moät soá nguyeân, xeùt xem bit coù vò
trí laø 9 coù baèng 1 hay khoâng, neáu noù baèng 0 thì
baät ñoù leân 1, neáu baèng 1 thì ñöa veà 0 vaø in ra keát
quaû.
#include <stdio.h>
#include <conio.h>
#define MASK 0x0200
main()
{ int a;
clrscr();
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.6 CAÙC PHEÙP TOAÙN CUÛA C


7.6.4 Toaùn töû treân bit
printf ("Moi nhap mot so: ");
scanf (%d, &a);
if (a & MASK) printf ("Bit 9 bang 1 \n");
else printf ("Bit 9 bang 0 \n");
printf ("Tri cua bien a truoc khi dao bit 9 la %d \n", a);
a = a ^ MASK;
if (a & MASK) printf ("Bit 9 sau khi dao bang 1 \n");
else printf ("Bit 9 sau khi dao bang 0 \n");
printf ("Tri cua bien a sau khi dao bit 9 la %d \n", a);
getch();
}
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.6 CAÙC PHEÙP TOAÙN CUÛA C


7.6.4 Toaùn töû treân bit
Toaùn töû NOT (~) cho pheùp thöïc hieän vieäc ñaûo taát
caû caùc bit cuûa moät giaù trò töø 0 leân 1 vaø töø 1 xuoáng
0. Pheùp toaùn nhö vaäy ta goïi laø pheùp buø 1 giaù trò
hieän haønh.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.6 CAÙC PHEÙP TOAÙN CUÛA C


7.6.4 Toaùn töû treân bit
Toaùn töû dòch traùi (<<) vaø dòch phaûi (>>) cho pheùp
thöïc hieän vieäc dôøi caùc bit cuûa toaùn haïng sang beân
traùi hoaëc sang phaûi. Cuù phaùp nhö sau:
bieåu_thöùc_nguyeân << soá_bit_dôøi
bieåu_thöùc_nguyeân >> soá_bit_dôøi
Vôùi bieåu_thöùc_nguyeân vaø soá_bit_dôøi coù theå laø
haèng, bieán hoaëc bieåu thöùc kieåu nguyeân.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.6 CAÙC PHEÙP TOAÙN CUÛA C


7.6.4 Toaùn töû treân bit
Trong pheùp dòch traùi, caùc bit ôû beân phaûi cuûa toaùn
haïng seõ ñöôïc ghi vaøo caùc giaù trò laø 0
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.6 CAÙC PHEÙP TOAÙN CUÛA C


7.6.4 Toaùn töû treân bit

duï:
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.6 CAÙC PHEÙP TOAÙN CUÛA C


7.6.4 Toaùn töû treân bit
Trong pheùp dòch phaûi ta coù hai tröôøng hôïp:
- Neáu toaùn haïng beân traùi coù döõ lieäu thuoäc daïng
unsigned (unsigned int, unsigned long, unsigned
char) thì pheùp dòch phaûi seõ ghi 0 vaøo caùc bit beân
traùi cuûa keát quaû.
- Coøn neáu toaùn haïng beân traùi coù döõ lieäu thuoäc
daïng signed (int, long, char) thì pheùp dòch phaûi
seõ ghi bit daáu vaøo caùc bit beân traùi cuûa keát quaû.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.6 CAÙC PHEÙP TOAÙN CUÛA C


7.6.4 Toaùn töû treân bit
Ví duï:
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.6 CAÙC PHEÙP TOAÙN CUÛA C


7.6.4 Toaùn töû treân bit

duï:
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.6 CAÙC PHEÙP TOAÙN CUÛA C


7.6.5 Toaùn töû taêng giaûm
Trong C coù hai toaùn töû ñaëc bieät goïi laø toaùn töû
taêng (++) vaø toaùn töû giaûm (--) duøng ñeå taêng hoaëc
giaûm moät bieán naøo ñoù ñi 1.Cuù phaùp söû duïng:
++ bieán
bieán ++
– – bieán
bieán – –
vôùi bieán coù theå thuoäc loaïi baát kyø hoaëc pointer.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.6 CAÙC PHEÙP TOAÙN CUÛA C


7.6.5 Toaùn töû taêng giaûm
Kyù hieäu ++ vaø coù theå ñöôïc ñaët tröôùc (goïi laø tieàn
toá) hoaëc sau (goïi laø haäu toá) moät teân bieán.
Ví duï:
++ a;
hoaëc
a ++;
chính laø
a = a + 1;
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.6 CAÙC PHEÙP TOAÙN CUÛA C


7.6.5 Toaùn töû taêng giaûm
Ví duï:
int i = 12;
double a, b;
a = ++i;
b = i ++;
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.6 CAÙC PHEÙP TOAÙN CUÛA C


7.6.5 Toaùn töû taêng giaûm
Caàn löu yù raèng caëp daáu ++ hoaëc phaûi ñöôïc vieát
lieàn nhau vaø caàn phaûi roõ raøng, trong nhöõng
tröôøng hôïp coù theå laàm laãn, ví duï nhö 2 bieåu thöùc:
a++ + b
vaø
a + ++b
laø khaùc nhau.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.6 CAÙC PHEÙP TOAÙN CUÛA C


7.6.5 Toaùn töû taêng giaûm
Caùc pheùp toaùn taêng giaûm naøy nhanh hôn nhieàu so
vôùi thao taùc bình thöôøng laø coäng hoaëc tröø bieán ñoù
vôùi 1 roài gaùn trôû laïi cho bieán ñoù vì chuùng raát gaàn
vôùi caùc pheùp toaùn taêng giaûm cuûa ngoân ngöõ maùy
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.6 CAÙC PHEÙP TOAÙN CUÛA C


7.6.5 Toaùn töû taêng giaûm
Ví duï: Trong thaân voøng while cuûa chöông trình
tính toång töø 1 tôùi n, ta coù theå vieát nhö sau
s = 0;
so = 1;
while (so <= n)
{
s = s + so;
so++;
}
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.6 CAÙC PHEÙP TOAÙN CUÛA C


7.6.6 Toaùn töû gaùn
Pheùp toaùn gaùn laø pheùp toaùn cô baûn trong moãi
ngoân ngöõ laäp trình. Trong C pheùp gaùn coù hai daïng
theo cuù phaùp sau ñaây.
Gaùn ñôn giaûn
bieán = trò
Gaùn phöùc taïp
bieán op = tri
Vôùi trò coù theå laø haèng, bieán hoaëc laø bieåu thöùc
op coù theå laø * / % + – hoaëc << >> & ^ |
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.6 CAÙC PHEÙP TOAÙN CUÛA C


7.6.6 Toaùn töû gaùn
Pheùp gaùn trò phöùc taïp
bieán op = tri
chính laø
bieán = bieán op tri
Ví duï:
int a, b = 2;
a = 4; a = 4
b *= a * 3; b = 24
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.6 CAÙC PHEÙP TOAÙN CUÛA C


7.6.6 Toaùn töû gaùn
Trong pheùp gaùn ñôn, neáu hai toaùn haïng coù cuøng
kieåu thì toaùn haïng beân phaûi seõ ñöôïc gaùn vaøo toaùn
haïng beân traùi. Neáu khoâng, tröôùc khi gaùn toaùn
haïng beân phaûi seõ ñöôïc chuyeån theo kieåu cuûa toaùn
haïng beân traùi, ñieàu naøy coù theå seõ gaây ra keát quaû
sai hoaëc khoâng chính xaùc, neáu nhö kieåu cuûa toaùn
haïng beân traùi thaáp hôn kieåu cuûa toaùn haïng beân
phaûi.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.6 CAÙC PHEÙP TOAÙN CUÛA C


7.6.6 Toaùn töû gaùn
Kieåu toaùn haïng traùi Kieåu toaùn haïng phaûi Trò coù theå maát sau khi gaùn
signed char unsigned char Giaù trò > 127, thaønh soá aâm
char short int Maát trò töø bit 8 trôû ñi
char int Maát trò töø bit 8 trôû ñi
char long Maát trò töø bit 8 trôû ñi
short int long int Maát 16 bit cao (moät int)
int float Maát phaàn thaäp phaân vaø phaàn trò lôùn hôn moät int

float double Ñoä chính xaùc do laøm troøn


HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.6 CAÙC PHEÙP TOAÙN CUÛA C


7.6.6 Toaùn töû gaùn
Ñoái vôùi pheùp gaùn phöùc, vieäc chuyeån kieåu ñöôïc thöïc
hieän theo vieäc chuyeån kieåu töï ñoäng trong khi thöïc
hieän vieäc tính toaùn bieåu thöùc vaø vieäc chuyeån kieåu
cuûa pheùp gaùn ñôn giaûn.

Pheùp gaùn phöùc hôïp naøy toû ra raát hieäu quaû nhaát laø
khi caùc toaùn haïng beân traùi laø nhöõng bieán khaù daøi.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.6 CAÙC PHEÙP TOAÙN CUÛA C


7.6.6 Toaùn töû gaùn
Ví duï:
Thay vì vieát:
n = n * (x + 5) + n * (a + 8);
ta chæ caàn vieát:
n *= x + 5 + a + 8;
Hoaëc phöùc taïp hôn
a[i][j] –= b[i][j];
thay vì phaûi vieát daøi doøng
a[i][j] = a[i][j] – b[i][j];
.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.6 CAÙC PHEÙP TOAÙN CUÛA C


7.6.6 Toaùn töû gaùn
Ñoái vôùi C, neáu moät bieåu thöùc gaùn ñöôïc keát thuùc
baèng moät daáu ";" thì ta coù moät leänh gaùn; coøn neáu
bieåu thöùc gaùn naøy ñöôïc söû duïng trong moät bieåu
thöùc phöùc hôïp khaùc thì bieåu thöùc gaùn seõ coù trò laø
trò cuûa bieán sau khi gaùn.
Ví duï:
int a = 4, b = 1;
b + = (a = 2 * b) + (a *= b);
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.6 CAÙC PHEÙP TOAÙN CUÛA C


7.6.7 Toaùn töû phaåy - Bieåu thöùc phaåy
Cuù phaùp:
bieåu_thöùc_1, bieåu_thöùc_keát_quaû
Vôùi bieåu_thöùc_1 vaø bieåu_thöùc_keát_quaû laø hai bieåu
thöùc baát kyø.
Ví duï:
m = (a = 2, t = a + 3);
seõ cho a = 2, t = 5 vaø m = t = 5
hoaëc x = (t = 1, t + 4);
seõ cho t = 1 vaø x = 5
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.6 CAÙC PHEÙP TOAÙN CUÛA C


7.6.8 Toaùn töû ñieàu kieän - bieåu thöùc ñieàu kieän
Trong ngoân ngöõ C coù moät toaùn töû khaù ñaëc bieät goïi
laø toaùn töû ñieàu kieän, kyù hieäu cuûa toaùn töû ñieàu kieän
laø hai daáu "?" vaø ":" theo cuù phaùp sau:
dieu-kien ? bieu-thuc1 : bieu-thuc2
vôùi dieu-kien laø moät bieåu thöùc baát kyø coù keát quaû
thuoäc kieåu chuaån (scalar type)
bieu-thuc1, bieu-thuc2 laø hai bieåu thöùc baát kyø
vaø dó nhieân coù theå laø moät bieåu thöùc ñieàu kieän
khaùc.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.6 CAÙC PHEÙP TOAÙN CUÛA C


7.6.8 Toaùn töû ñieàu kieän - bieåu thöùc ñieàu kieän
Ví duï:
Thay vì phaûi vieát daøi doøng
if ( i >0 )
n = 1;
else n = 0;
ta chæ caàn duøng bieåu thöùc ñieàu kieän
n =(i > 0) ? 1 : 0;
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.6 CAÙC PHEÙP TOAÙN CUÛA C


7.6.8 Toaùn töû ñieàu kieän - bieåu thöùc ñieàu kieän
Ví duï: Vieát chöông trình nhaäp moät kyù töï, ñoåi kyù
töï ñoù sang kyù töï hoa neáu ñoù laø kyù töï thöôøng.
#include <stdio.h>
#include <conio.h>
main()
{
char c;
clrscr();
printf ("Nhap mot ky tu: ");
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.6 CAÙC PHEÙP TOAÙN CUÛA C


7.6.8 Toaùn töû ñieàu kieän - bieåu thöùc ñieàu kieän
c = getchar(); (1)
c =( c >= 'a' && c <= 'z' ) ? c - 32 : c; (2)
printf ("Ky tu da duoc doi la: ");
putchar (c);
getch();
}
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.6 CAÙC PHEÙP TOAÙN CUÛA C


7.6.9 Toaùn töû sizeof
Ñaây laø moät toaùn töû cho ta kích thöôùc cuûa moät bieán
hoaëc moät kieåu döõ lieäu naøo ñoù. Do phaïm vi söû duïng
cuûa sizeof raát roäng vaø thöôøng ñöôïc duøng ñeå laáy
kích thöôùc caùc kieåu döõ lieäu phöùc hôïp nhö struct,
union... Vieäc söû duïng toaùn töû naøy cho pheùp ta
khoâng phaûi quan taâm ñeán chieàu daøi cuï theå cuûa caùc
bieán.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.6 CAÙC PHEÙP TOAÙN CUÛA C


7.6.9 Toaùn töû sizeof
Toaùn haïng cuûa sizeof laø moät bieán hoaëc moät kieåu
döõ lieäu baát kyø naøo ñoù ñaõ ñònh nghóa.
sizeof (bieán)
sizeof bieán
sizeof (kieåu)
Keát quaû cuûa toaùn töû naøy laø moät giaù trò nguyeân chæ
kích thöôùc (tính baèng byte hoaëc char) cuûa kieåu döõ
lieäu hoaëc cuûa bieán ñoù. Bieán hoaëc kieåu naøy coù theå
laø moät bieán hoaëc moät kieåu ñôn giaûn hay phöùc hôïp.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.6 CAÙC PHEÙP TOAÙN CUÛA C


7.6.9 Toaùn töû sizeof
Ví duï:
Neáu coù moät bieán ñaõ khai baùo:
double f;
thì:
sizeof (f);
sizeof f;
hoaëc:
sizeof (double);
seõ cho ta keát quaûlaø 8 (byte).
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.6 CAÙC PHEÙP TOAÙN CUÛA C


7.6.10 Ñoä öu tieân cuûa caùc toaùn tö
Trong moät bieåu thöùc, caùc pheùp toaùn luoân ñöôïc
thöïc hieän theo moät möùc ñoä öu tieân khaùc nhau, vaø
neáu cuøng moät ñoä öu tieân thì caùc pheùp toaùn seõ ñöôïc
keát hôïp vôùi nhau theo moät traät töï nhaát ñònh.
−−

HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN


NGÖÕ C

7.6 CAÙC PHEÙP TOAÙN CUÛA C


7.6.10 Ñoä öu tieân cuûa caùc toaùn tö
Ñoä öu tieân Pheùp toaùn Thöù töï keát hôïp
1 () [ ] ->. Traùi qua phaûi
2 ! ~ ++ – + (type) * & sizeof Phaûi qua traùi *
3 */% Traùi qua phaûi
4 +– Traùi qua phaûi
5 << >> Traùi qua phaûi
6 < <= > >= Traùi qua phaûi
7 == != Traùi qua phaûi
8 & Traùi qua phaûi
9 ^^ Traùi qua phaûi
10 | Traùi qua phaûi
11 && Traùi qua phaûi
12 || Traùi qua phaûi
13 ?: Phaûi qua traùi *
14 = += –= *= /= %= <<= >>= &= |= ^= Phaûi qua traùi *
15 , Traùi qua phaûi
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.7 CAÁU TRUÙC TOÅNG QUAÙT CUÛA


MOÄT CHÖÔNG TRÌNH C
Moät chöông trình C toång quaùt bao haøm hai phaàn:
phaàn khai baùo ñaàu (header) vaø phaàn haøm
(function).
Phaàn khai baùo ñaàu cuûa moät chöông trình C bao
goàm:
- Caùc leänh tieàn xöû lyù: include, define ...
- Caùc khai baùo haèng, bieán ngoaøi ...
- Caùc prototype cuûa caùc haøm ñöôïc söû duïng trong
chöông trình
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.7 CAÁU TRUÙC TOÅNG QUAÙT CUÛA


MOÄT CHÖÔNG TRÌNH C
Phaàn haøm cuûa moät chöông trình C laø phaàn ñònh
nghóa caùc haøm söû duïng trong chöông trình, trong
caùc haøm naøy phaûi coù haøm main().
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.7 CAÁU TRUÙC TOÅNG QUAÙT CUÛA


MOÄT CHÖÔNG TRÌNH C
Ví duï: Nhaäp moät soá kieåm tra soá ñoù chaün hay leû.
#include <stdio.h> 
#include <conio.h> 


int kiem_tra (int so); 

/* ham kiem_tra nhan vao doi so  → phaàn khai baùo
la mot so nguyen, tra ve tri 

- 0 la so chan 

- 1 la so le 


*/ 
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.7 CAÁU TRUÙC TOÅNG QUAÙT CUÛA


MOÄT CHÖÔNG TRÌNH C
main()
{
int n;
clrscr();
printf ("Nhap mot so: ");
scanf ("%d", &n);
if (kiem_tra(n))
printf ("So da nhap la so le \n");
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

7.7 CAÁU TRUÙC TOÅNG QUAÙT CUÛA


MOÄT CHÖÔNG TRÌNH C
else
printf ("So da nhap la so chan
\n");
getch();
}
int kiem_tra (int so)
{
return (so % 2 == 0)? 0:1;
}
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

BAØI TAÄP CUOÁI CHÖÔNG

1. Vieát chöông trình in ra maøn hình trò thaäp phaân


cuûa caùc haèng sau ñaây
067 01234 0x1al 0x89ad
0xfb 'h' 022 02365
2. Nhaäp ba soá, tìm soá lôùn nhaát vaø nhoû nhaát trong
ba soá ñoù.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

BAØI TAÄP CUOÁI CHÖÔNG

3. Nhaäp boán soá, saép xeáp theo thöù töï töø lôùn tôùi nhoû
vaø töø nhoû tôùi lôùn theo menu sau:
1. Töø lôùn tôùi nhoû
2. Töø nhoû tôùi lôùn
3. Keát thuùc
Môøi baïn choïn thao taùc (1...3):
4. Nhaäp ba caïnh tam giaùc, kieåm tra ba caïnh ñoù coù
thoûa ñieàu kieän hình thaønh tam giaùc khoâng, in keát
quaû kieåm tra.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

BAØI TAÄP CUOÁI CHÖÔNG

5. Nhaäp ba caïnh tam giaùc, kieåm tra ba caïnh ñoù coù


thoûa ñieàu kieän hình thaønh tam giaùc khoâng, neáu
thoûa in ra keát quaû xem tam giaùc ñoù laø tam giaùc gì
(vuoâng thì vuoâng taïi ñaâu, caân thì caân taïi ñaâu ...)?
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

BAØI TAÄP CUOÁI CHÖÔNG

6. Vieát chöông trình nhaäp moät kyù töï vaø xöû lyù theo
yeâu caàu sau:
- Neáu kyù töï laø hoa thì ñoåi sang thöôøng, in keát quaû
ñoåi
- Neáu kyù töï laø thöôøng thì khoâng laøm gì caû, in keát
quaû
- Neáu kyù töï laø kyù soá thì in ra maøn hình caâu: "Day
la mot ky so".
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

BAØI TAÄP CUOÁI CHÖÔNG

7. Duøng haøm pow () ñeå tính bình phöông vaø luõy


thöøa ba cuûa moät soá nhaäp töø baøn phím.

8. Vieát chöông trình ñoåi töø ñoä Fahrenheit (F) sang


ñoä Celcius (C) theo coâng thöùc sau:

F − 32 9
=
C 5
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

KEÁT THUÙC CHÖÔNG 7


HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

CHÖÔNG 8
CAÙC LEÄNH ÑIEÀU KHIEÅN VAØ VOØNG
LAËP
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

CHÖÔNG 8
CAÙC LEÄNH ÑIEÀU KHIEÅN VAØ VOØNG
LAËP
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

8.1 LEÄNH ÑÔN VAØ LEÄNH PHÖÙC


(SIMPLE STATEMENT VAØ COMPOUND STATEMENT)

- Leänh ñôn laø moät bieåu thöùc thuoäc loaïi baát kyø theo
sau noù laø moät daáu chaám phaåy (;), do ñoù leänh ñôn
coøn ñöôïc goïi laø leänh bieåu thöùc.
Ví duï: Caùc leänh sau ñaây laø caùc leänh ñôn
a = a + 1;
b >>= 3;
printf (...);
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

8.1 LEÄNH ÑÔN VAØ LEÄNH PHÖÙC


(SIMPLE STATEMENT VAØ COMPOUND STATEMENT)

-Leänh phöùc bao haøm moät hay nhieàu leänh ñôn ñöôïc
bao beân trong caëp daáu ngoaëc nhoïn ({ }) vaø ñöôïc boä
dòch C xem nhö laø moät leänh ñôn.
Ví duï: Xeùt leänh if sau
if (a > 0)
{
i += 2; 

a++;  → leänh phöùc, ñöôïc xem laø moät leänh
n = a * i;

}
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

8.1 LEÄNH ÑÔN VAØ LEÄNH PHÖÙC


(SIMPLE STATEMENT VAØ COMPOUND STATEMENT)

Ñeå phoái hôïp caùc leänh ñôn vaø phöùc theo moät trình
töï hôïp logic ñeå giaûi quyeát baøi toaùn, C ñaõ thieát keá
saün caùc caáu truùc ñieàu khieån chöông trình (maø ta
thöôøng goïi laø caùc leänh ñieàu khieån chöông trình),
moãi leänh ñeàu coù cuù phaùp rieâng cuûa noù. Caùc leänh
ñieàu khieån naøy coù theå ñöôïc chia ra laøm hai nhoùm:
- Nhoùm leänh lieân quan ñeán vieäc reõ nhaùnh chöông
trình: if-else, switch-case, goto,...
- Nhoùm leänh laëp: while, for, do_while
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

8.2 LEÄNH IF

Leänh if cho pheùp laäp trình vieân thöïc hieän moät


leänh ñôn hay moät leänh phöùc tuøy theo bieåu thöùc
ñieàu kieän, neáu bieåu thöùc coù trò khaùc 0 thì leänh
ñöôïc thöïc thi.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

8.2 LEÄNH IF

Daïng 1:
if (bieu_thuc)
leänh;
- bieåu_thöùc laø moät bieåu thöùc baát
kyø, coù theå coù haèng, bieán hoaëc goïi
haøm trong ñoù vaø sau cuøng laø bieåu
thöùc naøy seõ coù trò 0 hoaëc 1
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

8.2 LEÄNH IF

Daïng 1:
if (bieu_thuc)
leänh;
- leänh laø leänh thöïc thi cuûa if, coù
theå laø leänh ñôn, phöùc hoaëc leänh
roãng.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

8.2 LEÄNH IF

Daïng 2:
if (bieu_thuc)
leänh_1;
else
leänh_2;
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

8.2 LEÄNH IF

Ví duï: Xeùt chöông trình sau ñaây


#include <stdio.h>
#include <conio.h>
main()
{ int n;
clrscr();
printf (Moi nhap mot so: );
scanf (%d, &n);
if (n % 2 == 0)
printf ("So la so chan \n");
printf ("Moi ban nhan mot phim de ket thuc \n");
getch(); }
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

8.2 LEÄNH IF

Ví duï: Xeùt chöông trình sau ñaây


#include <stdio.h>
#include <conio.h>
main()
{ int n; clrscr();
printf ("Moi nhap mot so: "); scanf ("%d", &n);
if (n % 2 == 0)
printf ("So la so chan \n"); vaãn coù daáu chaám phaåy
else
printf ("So la so le \n");
printf ("Moi ban nhan mot phim de ket thuc \n");
getch(); }
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

8.2 LEÄNH IF

Ví duï: Xeùt chöông trình sau ñaây

if (a > 0) if (a > 0)
if (b > 0) {
c = b + a; if (b > 0)
else c = b – a;
c = b – a; }
else
c = b – a;
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

8.2 LEÄNH IF

if (bieåu_thöùc_1) Khi thöïc hieän leänh if_else


lenh_1; loàng nhau nhö theá naøy caùc
else if (bieåu_thöùc_2) bieåu thöùc seõ ñöôïc tính laàn
lenh_2; löôït töø treân xuoáng döôùi
else if (bieåu_thöùc_3) neáu coù bieåu thöùc naøo khaùc
lenh_3; 0, leänh töông öùng vôùi if ñoù
...... seõ ñöôïc thi haønh vaø toaøn
else boä phaàn coøn laïi cuûa leänh
lenh_n; if-else ñöôïc boû qua.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

8.2 LEÄNH IF

Ví duï: Chöông trình ví duï sau nhaäp vaøo moät kyù


töï, kieåm tra kyù töï ñoù laø thöôøng, hoa, kyù soá hoaëc
kyù töï keát thuùc file hay kyù töï khaùc.
#include <stdio.h>
#include <conio.h>
main()
{ char c;
clrscr();
printf ("Nhap mot ky tu: ");
c = getchar();
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

8.2 LEÄNH IF

if (c == EOF)
printf ("Da den cuoi file \n");
else if (c >= 'a' && c <= 'z')
printf ("ky tu thuong\n");
else if (c >= 'A' && c <= 'Z')
printf ("ky tu hoa\n");
else if (c >= '0' && c <= '9')
printf ("ky tu so\n");
else
printf ("ky tu khac\n");
getch();
}
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

8.3 LEÄNH SWITCH-CASE


HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

8.3 LEÄNH SWITCH-CASE


HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

8.3 LEÄNH SWITCH-CASE

Ví duï: Vieát chöông trình nhaäp moät trò, neáu trò ñoù
chia heát cho 5 thì coäng theâm 5 vaøo cho soá ñoù, neáu
trò ñoù chia cho 5 dö 1 thì coäng theâm 1, töông töï
cho 3, neáu laø soá khaùc thì baùo khoâng thoûa.
#include <stdio.h>
#include <conio.h>
main()
{ int so;
clrscr();
printf ("Nhap mot so: ");
scanf ("%d", &so);
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

8.3 LEÄNH SWITCH-CASE

switch (so % 5)
{
case 0:
so += 5;
printf ("Tri la: %d\n", so);
break;
case 1:
so += 1;
printf ("Tri la: %d\n", so);
break;
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

8.3 LEÄNH SWITCH-CASE

case 3:
so += 3;
printf ("Tri la: %d\n", so);
break;
default:
printf ("Khong thoa\n");
break;
}
getch();
}
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

8.3 LEÄNH SWITCH-CASE

Leänh break cuoái moãi case seõ chuyeån ñieàu khieån


chöông trình ra khoûi leänh switch. Neáu khoâng coù
break, caùc leänh tieáp ngay sau seõ ñöôïc thöïc thi duø
caùc leänh naøy coù theå laø cuûa moät case khaùc.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

8.3 LEÄNH SWITCH-CASE

Ví duï: Xeùt ví duï nhaäp thaùng vaø naêm, kieåm tra soá
ngaøy trong thaùng.
switch (thang)
{
case 4:
case 6:
case 9:
case 11:
so_ngay = 30;
break;
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

8.3 LEÄNH SWITCH-CASE

case 2:
if (nam % 4 == 0)
so_ngay = 29;
else
so_ngay = 28;
break;
default:
so_ngay = 31;
break;
}
printf("Thang %d nam %d co %d ngay\n", thang, nam, so_ngay);
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

8.4 LEÄNH WHILE

Coù theå noùi while laø leänh laëp cô baûn cuûa ngoân ngöõ
laäp trình coù caáu truùc, noù cho pheùp chuùng ta laëp laïi
moät leänh hay moät nhoùm leänh trong khi ñieàu kieän
coøn ñuùng (true-töùc khaùc 0). Cuù phaùp cuûa leänh
while:
while (bieu-thuc) lenh
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

8.4 LEÄNH WHILE


HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

8.4 LEÄNH WHILE

Ví duï: Chöông trình sau ñaây seõ in ra maøn hình


10 soá ngaãu nhieân töø 0 ñeán 99.
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>>
#include <time.h>
main()
{ int i = 1;
clrscr();
randomize();
printf ("So ngau nhien trong khoang 0-99 la: ");
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

8.4 LEÄNH WHILE

while (i <= 10)


{
printf ("%d", random(100));
i++;
}
getch();
}
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

8.4 LEÄNH WHILE

Caùch khaùc:
int i = 10;
clrscr();
randomize();
printf ("So ngau nhien trong khoang 0-99 la: ");
while (i)
{
printf ("%d", random(100));
i;
}
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

8.4 LEÄNH WHILE

Ví duï: Nhaäp caùc kyù töï cho ñeán khi naøo nhaän ñöôïc
kyù töï ESC coù maõ ASCII laø 27 thì keát thuùc chöông
trình.
#include <stdio.h>
#include <conio.h>
#define ESC 27
main()
{
char c;
clrscr();
printf ("Cac ky tu duoc nhap la: ");
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

8.4 LEÄNH WHILE

while (1)
{
c = getche();
if (c == ESC)
break;
}
}
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

8.4 LEÄNH WHILE

#include <stdio.h>
#include <conio.h>
#define ESC 27 main()
{
char c;
clrscr();
printf ("Cac ky tu duoc nhap la: ");
while (getche() - ESC)
; leänh thöïc thi roãng

}
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

8.5 LEÄNH DO-WHILE

Neáu leänh while cho pheùp kieåm tra ñieàu kieän tröôùc
roài thöïc thi leänh sau, nhö vaäy ngay töø ñaàu maø
ñieàu kieän ñaõ sai thì leänh cuûa while khoâng ñöôïc
thöïc thi, thì leänh laëp do-while laïi thöïc thi leänh
tröôùc roài môùi kieåm tra ñieàu kieän sau.
Cuù phaùp cuûa leänh do-while nhö sau:
do
lenh
while (bieåu_thöùc);
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

8.5 LEÄNH DO-WHILE


HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

8.5 LEÄNH DO-WHILE

Ví duï: Vieát chöông trình cho pheùp kieåm tra vaø in


ra phím muõi teân ñaõ ñöôïc nhaán.
#include <stdio.h>
#include <conio.h>
#define ESC 27
main()
{
char c;
clrscr();
printf ("\n Moi an cac phim mui ten \n");
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

8.5 LEÄNH DO-WHILE

do
{
c = getch();
if (c == 0)
{
c = getch();
switch(c)
{
case 'H':
printf ("Ban da an mui ten len\n");
break;
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

8.5 LEÄNH DO-WHILE


case 'P':
printf ("Ban da an mui ten xuong\n");
break;
case 'K':
printf ("Ban da an mui ten qua trai\n");
break;
case 'M':
printf ("Ban da an mui ten qua phai\n");
break;
} /* end switch */
}
}while (c != 27);
}
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

8.5 LEÄNH DO-WHILE

Chuù yù raèng moãi phím muõi teân khi ñöôïc aán ñeàu
sinh ra hai kyù töï: kyù töï ñaàu luoân laø kyù töï coù maõ
ASCII laø 0 (töùc kyù töï NUL), kyù töï thöù hai laø caùc
maõ ASII töông öùng vôùi phím, trong ví duï treân thì
+ Phím muõi teân leân coù maõ laø 0 vaø 'H'
+ Phím muõi teân xuoáng coù maõ laø 0 vaø 'P'
+ Phím muõi teân qua traùi coù maõ laø 0 vaø 'K'
+ Phím muõi teân coù maõ laø 0 vaø 'M'.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

8.6 LEÄNH FOR

Töông töï nhö ngoân ngöõ PASCAL, trong ngoân ngöõ


C cuõng coù voøng laëp for, ñaây cuõng laø moät leänh laëp
cho pheùp kieåm tra ñieàu kieän tröôùc, gioáng nhö
while. Cuù phaùp cuûa leänh for nhö sau:

for (bieåu_thöùc1; bieåu_thöùc2; bieåu_thöùc3)


leänh
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

8.6 LEÄNH FOR


- bieåu_thöùc1 coù yù nghóa laø bieåu thöùc ñeå khôûi ñoäng trò
ñaàu cho bieán ñieàu khieån voøng for, noù coù theå laø bieåu thöùc
gaùn hay bieåu thöùc phaåy, coù theå khoâng coù.
- bieåu_thöùc2 coù yù nghóa laø bieåu thöùc cho pheùp kieåm tra
xem voøng laëp coù ñöôïc tieáp tuïc laëp nöõa hay khoâng.
- bieåu_thöùc3 laø bieåu thöùc coù yù nghóa cho pheùp thay ñoåi
bieán ñieàu khieån voøng laëp ñeå voøng laëp tieán daàn ñeán keát
thuùc. Bieåu thöùc naøy ñöôïc tính sau khi caùc leänh thöïc thi
trong thaân voøng for ñöôïc thöïc hieän xong.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

8.6 LEÄNH FOR


HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

8.6 LEÄNH FOR

Ví duï: voøng laëp for ñeå tính toång töø 1 tôùi n nhö
sau
s = 0;
for (i = 1; i <= n; i++)
s += i;
Coù theå vieát ngaén goïn hôn nhö sau
for (i = 1, s = 0; i <= n; i++)
s += i;
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

8.6 LEÄNH FOR

Ví duï: Nhaäp caùc kyù töï cho ñeán khi naøo nhaän ñöôïc
kyù töï ESC coù maõ ASCII laø 27 thì keát thuùc chöông
trình.
#include <stdio.h>
#include <conio.h>
#define ESC 27
main()
{ char c;
clrscr();
printf ("Cac ky tu duoc nhap la: ");
for ( ; (c = getch()) != ESC;) ; }
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

8.7 LEÄNH BREAK VAØ LEÄNH CONTINUE

Ñaây laø hai leänh nhaûy khoâng ñieàu kieän cuûa C,


chuùng cho pheùp laäp trình vieân coù theå thay ñoåi tieán
trình laëp cuûa caùc caáu truùc laëp maø ta ñaõ bieát: for,
while, do-while.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

8.7 LEÄNH BREAK VAØ LEÄNH CONTINUE

1. Leänh break
Trong caáu truùc switch-case, leänh break seõ keát thuùc
leänh switch-case; coøn trong caùc caáu truùc laëp thì
leänh break cho pheùp thoaùt sôùm ra khoûi voøng laëp
(while, for hoaëc do-while) chöùa noù maø khoâng caàn
xeùt ñieàu kieän cuûa leänh keá tieáp sau voøng laëp.
Cuù phaùp cuûa leänh break:
break;
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

8.7 LEÄNH BREAK VAØ LEÄNH CONTINUE

1. Leänh break
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

8.7 LEÄNH BREAK VAØ LEÄNH CONTINUE

1. Leänh break
Ví duï:
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

8.7 LEÄNH BREAK VAØ LEÄNH CONTINUE

1. Leänh break
Ví duï:
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

8.7 LEÄNH BREAK VAØ LEÄNH CONTINUE

2. Leänh continue
leänh continue coù taùc duïng chuyeån ñieàu khieån
chöông trình veà ñaàu voøng laëp chuaån bò cho chu kyø
laëp môùi, boû qua caùc leänh coøn laïi naèm ngay sau
leänh noù trong chu kyø laëp hieän haønh. Leänh naøy chæ
ñöôïc duøng trong caùc voøng laëp, ñeå boû qua caùc leänh
khoâng caàn thöïc thi trong voøng laëp khi caàn thieát.
Cuù phaùp leänh continue:
continue;
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

8.7 LEÄNH BREAK VAØ LEÄNH CONTINUE

2. Leänh continue
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

8.7 LEÄNH BREAK VAØ LEÄNH CONTINUE

2. Leänh continue
Ví duï:
i = 0;
while (i <= 10)
{
i ++;
if (i >= 6 && i <= 8)
continue;
printf ("Trò hieän thôøi cuûa i laø %d\n", i);
}
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

8.7 LEÄNH BREAK VAØ LEÄNH CONTINUE

2. Leänh continue
Ví duï: Vieát chöông trình nhaäp moät daõy soá, tính
toång cuûa caùc soá döông trong daõy soá ñoù vaø thöông
soá cuûa toång ñoù vôùi töøng soá döông naøy.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

8.7 LEÄNH BREAK VAØ LEÄNH CONTINUE

2. Leänh continue
#include <stdio.h>
#include <conio.h>
main()
{
double a[100];
double tong;
int i, n;
clrscr();
printf ("Co bao nhieu so can tinh: ");
scanf ("%d", &n);
printf ("Nhap cac so can tinh tong: ");
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

8.7 LEÄNH BREAK VAØ LEÄNH CONTINUE

2. Leänh continue
for (i = 0; i < n; i++)
scanf ("%lf", &a[i]);
for (i = 0, tong = 0; i < n; i++)
{
if (a[i] <= 0)
continue;
tong += a[i];
}
printf ("Tong cua cac so duong la %/. 2f\n", tong);
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

8.7 LEÄNH BREAK VAØ LEÄNH CONTINUE

2. Leänh continue
for (i = 0; i < n; i++)
{
if (a[i] <= 0)
continue;
printf("Thuong cua tong voi so thu %d la
%5,2f\n",i,tong/a[i]);
}
getch();
}
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

2.8 LEÄNH RETURN

Leänh naøy duøng ñeå thoaùt ra khoûi haøm hieän thôøi


trôû veà haøm ñaõ goïi noù, coù theå traû veà cho haøm goïi
moät trò. Leänh naøy seõ keát thuùc haøm duø noù naèm ôû
ñaâu trong thaân haøm. Khi gaëp leänh naøy C seõ
khoâng thöïc hieän baát cöù leänh naøo sau leänh return
nöõa. Caùc cuù phaùp cuûa leänh return nhö sau:
return;
return (bieåu-thöùc);
return bieåu-thöùc;
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

8.8 LEÄNH RETURN

Ví duï:
Thieát keá haøm traû veà keát quaû so saùnh hai soá theo
quy taéc sau ñaây:
soá ñaàu > soá sau: haøm traû veà trò 1
soá ñaàu = soá sau: haøm traû veà trò 0
soá ñaàu < soá sau: haøm traû veà trò -1
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

8.8 LEÄNH RETURN

Ví duï:
int so_sanh (int a, int b)
{
if (a > b)/* Leänh return keát thuùc haøm, traû veà trò i cho */
return 1; /* nôi ñaõ goïi haøm */
else if (a == b)
return 0; /* Traû veà trò 0 cho nôi goïi haøm khi a = b */
else /* a < b */
return -1; /* Traû veà trò -1 cho nôi goïi haøm khi a < b */
}
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

8.8 LEÄNH RETURN

Ví duï:
int so_sanh (int a, int b)
{
if (a > b) /* Leänh return keát thuùc haøm, traû veà trò 1 cho */
return 1; /* nôi ñaõ goïi haøm */
else if (a == b)
return 0; /* Traû veà trò 0 cho nôi goïi haøm khi a = b */
return -1; /* Traû veà trò -1 cho nôi goïi haøm khi a < b */
}
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

8.8 LEÄNH RETURN

Ví duï:

int so_sanh (int a, int b)


{
return (a > b) ? 1 : (a == b) ? 0 : -1;
}
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

8.8 LEÄNH RETURN

Ví duï:
Chöông trình sau duøng leänh return ñeå keát thuùc
voøng laëp laëp voâ taän khi ñieàu kieän thoûa (laø phím
ESC ñöôïc nhaán).
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

8.8 LEÄNH RETURN

Ví duï:
#include <stdio.h>
#include <conio.h>
#define ESC '\x1b'
void nhan_ky_tu (void);  prototype cuûa haøm
main()
{
char c;
clrscr();
printf ("Moi ban nhap cac ky tu: ");
nhan_ky_tu ();  goïi haøm
}
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

8.8 LEÄNH RETURN

Ví duï:
void nhan_ky_tu (void) ñònh nghóa haøm
{
while (1)
if (getche() == ESC)
return;
}
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

8.9 LEÄNH GOTO

Maëc duø khoâng uûng hoä cho vieäc laäp trình coù goto
nhöng C vaãn coù leänh reõ nhaùnh khoâng ñieàu kieän
goto, leänh naøy cho pheùp chuyeån ñieàu khieån chöông
trình cho moät leänh naøo ñoù.
Cuù phaùp cuûa leänh goto:
goto nhaõn;
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

8.9 LEÄNH GOTO

Vôùi nhaõn laø moät danh hieäu khoâng chuaån, danh


hieäu naøy seõ ñöôïc ñaët ôû tröôùc leänh maø ta muoán
nhaûy ñeán theo cuù phaùp sau:
nhan: leänh
nhaõn maø leänh goto muoán nhaûy ñeán phaûi naèm
trong cuøng moät haøm vôùi leänh goto ñoù, do ñoù trong
nhöõng haøm khaùc nhau coù theå coù caùc teân nhaõn
gioáng nhau, nhöng trong cuøng moät haøm caùc teân
nhaõn naøy phaûi khaùc nhau.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

8.9 LEÄNH GOTO

Ví duï:
Caùch söû duïng leänh goto trong moät chöông trình C
main()
{
lap_lai: clrscr(); ...
if ((c = getch()) != ESC)
goto lap_lai;
}
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

8.10 LEÄNH ROÃNG

Trong C coù khaùi nieäm leänh roãng, leänh naøy chæ coù
moät daáu chaám phaåy (;), noù raát caàn thieát trong
nhieàu tröôøng hôïp, nhö ñoái vôùi caùc voøng laëp, khi ta
ñaët caùc leänh bieåu thöùc thöïc thi vaøo trong caùc bieåu
thöùc cuûa leänh thì ta khoâng caàn coù theâm leänh thöïc
thi laøm thaân cho chuùng nöõa, khi ñoù neáu ñeå troáng,
C seõ hieåu nhaàm raèng leänh keá tieáp seõ laø thaân cuûa
voøng laëp, do ñoù chæ coøn caùch cho moät leänh roãng
laøm thaân cuûa chuùng.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

8.10 LEÄNH ROÃNG

Ví duï:
Voøng laëp for ñeå tính giai thöøa töø 1 tôùi n nhö sau

for (i = gt = 1; i <= n; gt *= i++)


;
printf ("Giai thua %d! = %d\n", n, gt);
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

8.10 LEÄNH ROÃNG

Ví duï:

for (i =1,s = 0; i < 10; i++) ; s += i;


printf("Tong la %d \n",s);
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

BAØI TAÄP CUOÁI CHÖÔNG

1. Vieát moät chöông trình nhaäp 4 soá vaø in ra


a) soá lôùn nhaát trong 4 soá ñoù
b) soá nhoû nhaát trong 4 soá ñoù
2. Vieát chöông trình tìm soá nguyeân toá töø 1 tôùi 100
3. Nhaäp moät soá nguyeân töø baøn phím, in ra maøn
hình theo thöù töï ngöôïc laïi.
Ví duï nhaäp: 54321
xuaát: 12345
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

BAØI TAÄP CUOÁI CHÖÔNG

4. In ra maøn hình baûn cöûu chöông caàn bieát.


5. In ra maøn hình caùc baûn cöûu chöông töø 2 ñeán 9.
6. Veõ ra maøn hình hình sau:
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

BAØI TAÄP CUOÁI CHÖÔNG

7. Tính bieåu thöùc sau ñaây


a) T =1! + 2! +...+n! thoâng soá nhaäp laø n
1!+ (1+ 2)!+... + (1+... + n)!
b) T = n!
thoâng soá nhaäp laø n
e1 e2 en
c) T = + + ... + thoâng soá nhaäp laø n
1! 2! n!

Bieát trong C coù haøm exp(x) ñeå tính , prototype


haøm naøy naèm trong file math.h.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

BAØI TAÄP CUOÁI CHÖÔNG

8. Tính bieåu thöùc sau:


1 1 1 1
s = 1 + + + + ... + < 2 (1)
2 4 8 n
Haõy vieát chöông trình nhaäp moät soá a thoûa:
1 < a < 2, sau ñoù tìm soá n thoûa ñieàu kieän (1):
s<a
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

BAØI TAÄP CUOÁI CHÖÔNG

9. Moät ngöôøi muoán gôûi moät soá tieàn vaøo ngaân haøng,
haõy vieát chöông trình tính toång soá tieàn maø ngöôøi ñoù
coù ñöôïc sau khi ñaõ gôûi ngaân haøng theo moät trong
hai caùch gôûi:
- Gôûi töøng thaùng ruùt tieàn laõi
- Gôûi khoâng ruùt laõi töøng thaùng, maø nhaäp laõi vaøo voán
Thoâng soá nhaäp caàn thieát:- Soá tieàn gôûi luùc ñaàu
- Thôøi gian gôûi (theo thaùng)
- Laõi suaát/thaùng
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

KEÁT THUÙC CHÖÔNG 8


HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

CHÖÔNG 9
HAØM
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

CHÖÔNG 9
HAØM
9.1 Khaùi nieäm haøm
9.2 Khai baùo haøm
9.3 Ñoái soá cuûa haøm - ñoái soá laø tham trò
9.4 Keát quaû traû veà cuûa haøm - leänh RETURN
9.5 PROTOTYPE cuûa moät haøm
9.6 Haøm ñeä quy
Baøi taäp cuoái chöông
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

9.1 KHAÙI NIEÄM HAØM

Baát kyø ngoân ngöõ laäp trình naøo cuõng ñeàu coù khaùi
nieäm chöông trình con (subroutine), moãi chöông
trình con nhö vaäy seõ ñaûm nhaän thöïc hieän moät
thao taùc nhaát ñònh. Ñoái vôùi C, chöông trình con
chæ ôû moät daïng laø haøm (function), khoâng coù khaùi
nieäm thuû tuïc (procedure).
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

9.1 KHAÙI NIEÄM HAØM

Taát caû caùc thao taùc chuaån cuûa C ñeàu laø caùc haøm,
tuy nhieân haøm trong C coù khaû naêng söû duïng raát
maïnh vaø ñaëc bieät, moãi haøm coù theå traû veà moät trò
nhaát ñònh, tuy nhieân nôi chöông trình goïi haøm coù
söû duïng trò traû veà töø haøm hay khoâng laø tuøy theo
nhu caàu laäp trình.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

9.1 KHAÙI NIEÄM HAØM

Neáu caùc ngoân ngöõ khaùc, nhö Pascal, seõ goïi haøm
trong chöông trình chính vaø söû duïng haøm thì ñoái
vôùi C, chöông trình chính cuõng laø moät haøm, ñoù laø
haøm main (). Haøm main () laø haøm ñaëc bieät cuûa C,
noù laø moät haøm maø trong ñoù caùc thao taùc leänh (bao
goàm caùc bieåu thöùc tính toaùn, goïi haøm, ...) ñöôïc C
thöïc hieän theo moät trình töï hôïp logic ñeå giaûi
quyeát baøi toaùn ñöôïc ñaët ra.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

9.1 KHAÙI NIEÄM HAØM

Neáu caùc ngoân ngöõ khaùc, nhö Pascal, seõ goïi haøm
trong chöông trình chính vaø söû duïng haøm thì ñoái
vôùi C, chöông trình chính cuõng laø moät haøm, ñoù laø
haøm main (). Haøm main () laø haøm ñaëc bieät cuûa C,
noù laø moät haøm maø trong ñoù caùc thao taùc leänh (bao
goàm caùc bieåu thöùc tính toaùn, goïi haøm, ...) ñöôïc C
thöïc hieän theo moät trình töï hôïp logic ñeå giaûi
quyeát baøi toaùn ñöôïc ñaët ra.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

9.1 KHAÙI NIEÄM HAØM

Vieäc söû duïng haøm trong C seõ laøm cho chöông


trình trôû neân raát deã quaûn lyù, deã söûa sai, khi ñoù
chöông trình trong haøm main () thöïc teá chæ ñeå
quaûn lyù caùc haøm khaùc theo giaûi thuaät cuûa baøi toaùn
maø khoâng caàn bieát caùc thao taùc thöïc söï beân trong
töøng haøm, khaùi nieäm haøm nhö vaäy ta goïi laø hoäp
ñen (black box)
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

9.1 KHAÙI NIEÄM HAØM

Taát caû caùc haøm trong C ñeàu ngang caáp nhau. Caùc
haøm ñeàu coù theå goïi laãn nhau, dó nhieân haøm ñöôïc
goïi phaûi ñöôïc khai baùo tröôùc haøm goïi (hoaëc sau
naøy ta seõ bieát theâm laø haøm ñöôïc goïi coù theå ñöôïc
ñaët sau haøm goïi cuõng ñöôïc, tuy nhieân khi ñoù
prototype cuûa haøm ñöôïc goïi phaûi ñöôïc ñaët tröôùc
haøm goïi).
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

9.1 KHAÙI NIEÄM HAØM

Caùc haøm trong moät chöông trình coù theå naèm treân
caùc taäp tin khaùc nhau vaø khaùc vôùi taäp tin chính
(chöùa haøm main ()), moãi taäp tin nhö vaäy ñöôïc goïi
laø moät module chöông trình, caùc module chöông
trình seõ ñöôïc dòch rieâng reõ vaø sau ñoù ñöôïc lieân keát
(link) laïi vôùi nhau ñeå taïo ra ñöôïc moät taäp tin thöïc
thi duy nhaát. Caùch taïo chöông trình theo kieåu
nhieàu module nhö vaäy trong C laø project
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

9.1 KHAÙI NIEÄM HAØM

Ví duï: Chöông trình 1


#include <stdio.h>
#include <conio.h>
#include <math.h>
main ()
{
double a, b, c, delta, n1, n2;
clrscr();
printf ("Nhap 3 he so phuong trinh bac hai; ");
scanf ("%lf %lf %lf", &a, &b, &c);
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

9.1 KHAÙI NIEÄM HAØM


if (a ==0)/* phuong trinh suy bien ve bac nhat */
{
printf ("Phuong trinh suy bien ve bac nhat va ");
if (b == 0)
if (c == 0)
printf ("vo so nghiem\n");
else /* c != 0 */
printf ("vo nghiem\n");
else / * b != 0 */
{
n1 = -c/b;
printf ("co 1 nghiem: = %5.2f \n", n1);
}
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

9.1 KHAÙI NIEÄM HAØM


}
else /* a != 0 */
{
printf ("Phuong trinh bac hai va ");
delta = b*b - 4*a*c;
if (delta < 0)
printf ("vo nghiem thuc\n");
else if (delta == 0)
{
n1 = n2 = -b/2/a;
printf ("co nghiem kep x1 = x2 = %5.2f \n" ,n1);
}
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

9.1 KHAÙI NIEÄM HAØM


else /* delta > 0 */
{
n1 = (-b + sqrt(delta))/2/a;
n2 = (-b - sqrt(delta))/2/a;
printf ("co hai nghiem phan biet; \n");
printf ("x1 = %5.2f \n", n1);
printf ( x2 = %5.2f \n", n2);
}
}
getch();
}
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

9.1 KHAÙI NIEÄM HAØM

Ví duï: Chöông trình 2


#include <stdio.h>
#include <conio.h>
#include <math.h>
void gptb1 (double a, double b);
void gptb2 (double a, double b, double c);
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

9.1 KHAÙI NIEÄM HAØM

void gptb1 (double a, double b)


{
printf ("Phuong trinh suy bien ve bac nhat va ");
if (a == 0)
if (b == 0)
printf ("vo so nghiem\n");
else /* b != 0 */
printf ("vo nghiem\n");
else
printf ("co 1 nghiem: x = %5.2f \n", b/a);
}
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

9.1 KHAÙI NIEÄM HAØM


void gptb2 (double a,double b,double c)
{ double delta, x1, x2;
printf ("Phuong trinh bac hai va ");
delta = b*b - 4*a*c;
if (delta < 0)
printf ("vo nghiem thuc\n");
else if (delta == 0)
printf ("co nghiem kep x1 = x2 = %5.2f \n", -b/2/a);
else /* delta > 0 */
{ x1 = (-b + sqrt(delta))/2/a;
x2 = (-b - sqrt(delta))/2/a;
printf ("co hai nghiem phan biet: \n");
printf ("x1 = %5.2f \n ", x1);
printf ("x2 = %5.2f \n" , x2);
}
}
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

9.1 KHAÙI NIEÄM HAØM

main()
{
double a, b, c;
clrscr();
printf ("Nhap 3 he so phuong trinh bac hai: ");
scant ("%lf %lf %lf", &a, &b, &c);
if (a == 0) /* phuong trinh suy bien ve bac nhat */
gptb1 (b, c);
else /* a != 0 */
gptb2 (a, b, c);
getch();
}
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

9.2 KHAI BAÙO HAØM

Khai baùo moät haøm coù nghóa laø chæ ra roõ raèng traû
veà vò trí kieåu gì, ñoái soá ñöa vaøo cho haøm coù bao
nhieâu ñoái soá, moãi ñoái soá coù kieåu nhö theá naøo vaø
caùc leänh beân trong thaân haøm xaùc ñònh thao taùc
cuûa haøm. Nhö vaäy seõ coù hai loaïi haøm: haøm trong
thö vieän cuûa C vaø haøm do laäp trình vieân töï ñònh
nghóa.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

9.2 KHAI BAÙO HAØM

- Neáu haøm söû duïng laø haøm chuaån trong thö vieän
thì vieäc khai baùo haøm chæ ñôn giaûn laø khai baùo
prototype cuûa haøm, caùc prototype naøy ñaõ ñöôïc
phaân loaïi vaø ôû trong caùc file .h, laäp trình vieân caàn
ra leänh #include bao haøm caùc file naøy vaøo chöông
trình hoaëc module chöông trình söû duïng noù.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

9.2 KHAI BAÙO HAØM

- Neáu caùc haøm söû duïng laø do laäp trình vieân töï
ñònh nghóa thì vieäc khai baùo haøm bao goàm hai
vieäc: khai baùo prototype cuûa haøm ñaàu chöông
trình vaø ñònh nghóa caùc leänh beân trong thaân haøm
(hay thöôøng ñöôïc goïi taét laø ñònh nghóa haøm).
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

9.2 KHAI BAÙO HAØM


HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

9.2 KHAI BAÙO HAØM


HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

9.2 KHAI BAÙO HAØM

Ví duï:
#include <stdio.h>
#include <conio.h>
int so_sanh (int a, intb);  prototype cuûa haøm so_sanh
main()
{
int a, b, ket_qua;
clrscr();
printf ("Moi nhap hai so ");
scanf ("%d %d" , &a, &b);
ket_qua = so_sanh (a, b); goïi haøm
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

9.2 KHAI BAÙO HAØM

switch (ket_qua)
{ case -1:
printf ("So %d nho hon so %d \n" , a, b);
break;
case 0:
printf ("So %d bang so %d \n", a, b);
break;
case 1:
rintf ("So %d lon hon so %d \n" , a, b);
break; }
getch();
}
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

9.2 KHAI BAÙO HAØM

int so_sanh (int a, int b)


{
int ket_qua:
if (a >b)
ket_qua = 1;
else if (a == b)
ket_qua = 0;
else if (a < b)
ket_qua = -1;
return ket_qua;
}
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

9.3 ÑOÁI SOÁ CUÛA HAØM - ÑOÁI SOÁ


LAØ THAM TRÒ
Moät caùch bình thöôøng, khi goïi haøm thì ñoái soá thaät
caàn gôûi cho haøm chæ ñöôïc gôûi döôùi daïng tham soá
trò, coù nghóa laø caùc bieán, trò hoaëc bieåu thöùc ñöôïc
gôûi ñeán cho moät haøm, qua ñoái soá cuûa noù, seõ ñöôïc
laáy trò ñeå tính toaùn trong thaân haøm. Coù theå noùi
trò cuûa bieán thaät beân ngoaøi khi goïi haøm ñaõ ñöôïc
cheùp sang ñoái soá giaû, maø ta coù theå xem nhö laø
bieán cuïc boä cuûa haøm, vaø moïi vieäc tính toaùn chæ
ñöôïc thöïc hieän treân bieán cuïc boä naøy maø thoâi.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

9.3 ÑOÁI SOÁ CUÛA HAØM - ÑOÁI SOÁ


LAØ THAM TRÒ
Ví duï:Vieát chöông trình tính luõy thöøa n cuûa x(xn),
vôùi n nguyeân vaø thöïc.
#include <stdio.h>
#include <conio.h>
double luy_thua(double x, int n);
main()
{ int n;
double x, xn;
clrscr();
printf ("Moi nhap so tinh luy thua: ");
scant ("%lf", &x);
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

9.3 ÑOÁI SOÁ CUÛA HAØM - ÑOÁI SOÁ


LAØ THAM TRÒ
printf ("Moi nhap so luy thua: ");
scanf ("%d", &n);
xn =luy_thua (x, n);
printf("Ket qua: %5.2f luy thua %d bang: %7.2f\n", x,n,xn);
printf ("Tri cua so mu la %d", n);
getch();
}
double luy_thua(double x, int n)
{ double t = 1;
for ( ; n > 0; n)
t *= x;
return t; }
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

9.3 ÑOÁI SOÁ CUÛA HAØM - ÑOÁI SOÁ


LAØ THAM TRÒ
Khi goïi haøm luõy thöøa, trò cuûa bieán x vaø n seõ ñöôïc
cheùp vaøo cho hai ñoái soá giaû x vaø n, do ñoù ta coù
ñoàng thôøi caùc hoäp bieán nhö sau khi vaøo trong haøm
luy_thua():
Bieán cuûa haøm main() Bieán cuûa haøm luy_thua()
x 3.45 3.45 x

n 3 3 n
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

9.3 ÑOÁI SOÁ CUÛA HAØM - ÑOÁI SOÁ


LAØ THAM TRÒ
Ví duï:
Ta coù theå goïi haøm luy_thua() vaø truyeàn cho haøm
naøy moät bieåu thöùc:
xn = luy_thua( 3*a + x , 5);

Tuy nhieân, caùch truyeàn tham soá nhö treân khoâng


theå thay ñoåi trò cuûa bieán, maø ñieàu naøy ñoâi khi laïi
caàn thieát.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

9.3 ÑOÁI SOÁ CUÛA HAØM - ÑOÁI SOÁ


LAØ THAM TRÒ
Ví duï: Vieát chöông trình duøng haøm nhaäp soá lieäu
#include <stdio.h>
#include <conio.h>
void nhap_tri (int a, int b);
main()
{ int a = 0, b = 0;
clrscr();
printf ("Truoc khi goi ham nhap_tri: a = %d, b = %d\n", a, b);
nhap_tri (a, b);
printf("Sau khi goi ham nhap_tri a = %d, b = %d\n", a, b);
getch();
}
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

9.3 ÑOÁI SOÁ CUÛA HAØM - ÑOÁI SOÁ


LAØ THAM TRÒ
void nhap_tri (int a, int b)
{
printf ("Moi nhap hai so: ");
scanf ("%d %d", &a, &b);
}
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

9.3 ÑOÁI SOÁ CUÛA HAØM - ÑOÁI SOÁ


LAØ THAM TRÒ
Ví duï:
Thieát keá chöông trình duøng haøm nhaäp maûng, tính
toång caùc phaàn töû vaø in ra maøn hình keát quaû.
#include <stdio.h>
#include <conio.h>
void nhap_tri (int a[], int n);
int tong (int a[], int n);
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

9.3 ÑOÁI SOÁ CUÛA HAØM - ÑOÁI SOÁ


LAØ THAM TRÒ
main() Giaù trò cuûa
{
int a[100], n;
maûng coù theå bò
int sum; thay ñoåi trong
clrscr(); haøm
printf ("Moi nhap so phan tu cua mang: ");
scanf (%d , &n);
nhap_tri (a, n);
sum = tong (a, n);
printf ("Tong cac phan tu cua mang la: %d \n", sum);
getch();
}
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

9.3 ÑOÁI SOÁ CUÛA HAØM - ÑOÁI SOÁ


LAØ THAM TRÒ
void nhap_tri (int a[], int n)
{ int i;
printf ("Moi nhap cac phan tu cua mang: ");
for (i = 0; i <n; i++)
scanf ("%d", &a[i]);
}
int tong (int a[], int n) Giaù trò cuûa
{ int i, s = 0;
for (i = 0; i < n; s += a[i++]) maûng coù theå bò
; thay ñoåi trong
return s; haøm
}
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

9.4 KEÁT QUAÛ TRAÛ VEÀ CUÛA HAØM -


LEÄNH RETURN
Ñoái vôùi C khoâng coù söï phaân bieät giöõa thuû tuïc
(procedure) vaø haøm (function), maø thuû tuïc cuõng
ñöôïc xem laø moät haøm maø khoâng traû veà giaù trò naøo
caû. Ñeå khai baùo kieåu traû veà töø haøm nhö vaäy C ñöa
ra kieåu void, taïm goïi laø kieåu khoâng hieåu.
Ví duï: so saùnh 2 tröôøng hôïp söû duïng haøm
c = getch(); vaø getch();
hoaëc
c = getche(); vaø getche();
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

9.4 KEÁT QUAÛ TRAÛ VEÀ CUÛA HAØM -


LEÄNH RETURN
Trong chöông trình, ta cuõng bieát leänh return
duøng ñeå thöïc hieän vieäc traû trò cuûa haøm veà cho nôi
goïi noù, duø trò naøy coù ñöôïc söû duïng hay khoâng tuøy
nôi goïi.
Ví duï:
Thieát keá haøm so saùnh hai soá.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

9.4 KEÁT QUAÛ TRAÛ VEÀ CUÛA HAØM -


LEÄNH RETURN
int so_sanh (int a, int b)
{ if (a >b)
{ printf ("So %d lon hon so %d", a, b);
return 1; }
else if (a == b)
{ printf ("So %d bang so %d", a, b);
return 0; }
else /* a <b */
{ printf ("So %d nho hon so %d", a, b);
return -1; }
}
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

9.4 KEÁT QUAÛ TRAÛ VEÀ CUÛA HAØM -


LEÄNH RETURN
main()
{
int so1, so2;
clrscr();
printf("Moi nhap hai so: ");
scanf ("%d %d", &so1, &so2);
so_sanh (so1, so2);
getch();
}
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

9.4 KEÁT QUAÛ TRAÛ VEÀ CUÛA HAØM -


LEÄNH RETURN
main()
{
int so1, so2;
int kq;
clrscr();
printf ("Moi nhap hai so: ");
scanf ("%d %d", &so1, &so2);
kq = so_sanh (so1, so2);
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

9.4 KEÁT QUAÛ TRAÛ VEÀ CUÛA HAØM -


LEÄNH RETURN
switch (kq)
{
case -1:
printf (", nen tri tuyet doi hieu hai so la: %d\n,so2-so1");
break;
case 0:
case 1:
printf (", tri tuyet doi hieu hai so la %d\n , so1-so2");
break;
}
getch();
}
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

9.4 KEÁT QUAÛ TRAÛ VEÀ CUÛA HAØM -


LEÄNH RETURN
Ví duï: Xeùt haøm sau (khoâng traû veà giaù trò)
void so_sanh (int a, int b)
{ if (a > b)
printf ("So %d lon hon so %d", a, b);
else if (a == b)
printf ("So %d bang so %d", a, b);
else /* a < b */
printf ("So %d nho hon s %d", a, b);
}
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

9.4 KEÁT QUAÛ TRAÛ VEÀ CUÛA HAØM -


LEÄNH RETURN
Khi khai baùo haøm maø ta khoâng neâu cuï theå kieåu
traû veà cuûa haøm, C maëc nhieân xem nhö haøm traû veà
keát quaû laø int. Ví duï:
so_sanh (int a, int b)
{ if (a > b)
return 1;
else if (a == b)
return 0;
else /* a < b */
return -1;
}
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

9.4 KEÁT QUAÛ TRAÛ VEÀ CUÛA HAØM -


LEÄNH RETURN
Ñoái vôùi caùc haøm coù kieåu traû veà trò khaùc int thì khi
khai baùo caàn phaûi trình baøy ñaày ñuû caùc thaønh
phaàn cuûa haøm vaø khi goïi söû duïng haøm thì trong
haøm goïi caàn phaûi coù neâu keát quaû traû veà cuûa caùc
haøm ñöôïc goïi trong ñoù. Kieåu khai baùo keát quaû naøy
coù theå ñöôïc ñaët beân ngoaøi taát caû caùc haøm ñeå
thoâng baùo cho taát caû caùc haøm veà trò traû veà cuûa noù,
hoaëc coù theå ñöôïc ñaët trong haøm maø haøm söû duïng
ñöôïc goïi: kieåu teân_haøm();
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

9.4 KEÁT QUAÛ TRAÛ VEÀ CUÛA HAØM -


LEÄNH RETURN
Ví duï:
main()
{ int so_sanh ();
int so1, so2;
clrscr();
printf ("Moi nhap hai so: ");
scanf ("%d %d", &so1, &so2);
so_sanh (so1, so2);
getch(); }
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

9.5 PROTOTYPE CUÛA MOÄT HAØM

Nhö vaäy ñeå moät haøm coù theå söû duïng trong moät
haøm khaùc thì trong haøm söû duïng phaûi coù khai baùo
haøm caàn söû duïng, khai baùo naøy bình thöôøng töông
töï nhö khai baùo bieán maø ta ñaõ xeùt ôû muïc treân, tuy
nhieân khai baùo naøy raát haïn cheá ôû choã khoâng cho
pheùp kieåm tra soá ñoái soá thaät ñöa vaøo haøm cuõng
nhö kieåu cuûa ñoái soá coù phuø hôïp khoâng
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

9.5 PROTOTYPE CUÛA MOÄT HAØM

Ñeå khaéc phuïc nhöõng loãi treân, trong nhöõng phaùt


trieån sau naøy cuûa C theo ANSI, ngöôøi ta ñöa ra
khaùi nieäm prototype cuûa moät haøm, ñaây thaät söï laø
moät daïng khai baùo haøm môû roäng hôn, coù daïng
toång quaùt nhö sau
kieåu teân_haøm (danh_saùch_khai_baùo_ñoái_soá);
Ví duï : int so_sanh (int a, int b);
void gptb1 (double a, double b, doubbe c);
char kiem_tra (double n);
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

9.5 PROTOTYPE CUÛA MOÄT HAØM

C cho pheùp khai baùo prototype cuûa haøm trong


phaàn khai baùo ñoái soá chæ caàn coù kieåu maø khoâng
caàn coù teân cuûa ñoái soá giaû.
Ví duï :
int so_sanh (int, int);
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

9.5 PROTOTYPE CUÛA MOÄT HAØM

Coâng duïng cuûa prototype cuûa haøm: prototype cuûa


moät haøm ngoaøi vieäc duøng ñeå khai baùo kieåu cuûa keát
quaû traû veà töø moät haøm, noù coøn ñöôïc duøng ñeå kieåm
tra soá ñoái soá.
Ví duï :Neáu ñaõ khai baùo prototype
int so_sanh (int a, int b);
maø khi goïi haøm ta chæ göûi moät ñoái soá nhö sau:
so_sanh (so2);
thì seõ bò C phaùt hieän vaø baùo loãi
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

9.5 PROTOTYPE CUÛA MOÄT HAØM

Ví duï: Chöông trình sau luoân cho keát quaû so saùnh


2 soá nhaäp vaøo laø baèng
main()
{ int so1, so2;
int n;
clrscr();
printf(Moi nhap hai so: );
scanf (%d %d, &so1, &so2);
so_sanh (so2);
getch(); }
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

9.5 PROTOTYPE CUÛA MOÄT HAØM

Chuyeån kieåu cuûa ñoái soá: khi moät haøm ñöôïc goïi,
maø haøm ñoù coù prototype, caùc ñoái soá ñöôïc gôûi cho
haøm seõ ñöôïc chuyeån kieåu baét buoäc theo kieåu cuûa
caùc ñoái soá ñöôïc khai baùo trong prototype, söï
chuyeån kieåu naøy laøm cho caùc ñoái soá ñöôïc söû duïng
phuø hôïp vôùi caùc pheùp toaùn trong thaân haøm.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

9.5 PROTOTYPE CUÛA MOÄT HAØM

Chuyeån kieåu cuûa ñoái soá: khi moät haøm ñöôïc goïi,
maø haøm ñoù coù prototype, caùc ñoái soá ñöôïc gôûi cho
haøm seõ ñöôïc chuyeån kieåu baét buoäc theo kieåu cuûa
caùc ñoái soá ñöôïc khai baùo trong prototype, söï
chuyeån kieåu naøy laøm cho caùc ñoái soá ñöôïc söû duïng
phuø hôïp vôùi caùc pheùp toaùn trong thaân haøm.
Tröôøng hôïp maø söï chuyeån kieåu khoâng cho
pheùp thöïc hieän thì C seõ ñöa ra caùc thoâng baùo loãi,
hoaëc moät lôøi caûnh baùo (warning.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

9.5 PROTOTYPE CUÛA MOÄT HAØM

Ñoái vôùi caùc haøm chuaån trong thö vieän C,


prototype cuûa chuùng ñaõ ñöôïc C vieát saün vaø ñeå
trong caùc file coù phaàn môû roäng laø .h, muoán laáy caùc
prototype naøy vaøo chöông trình ta caàn ra chæ thò
bao haøm file .h chöùa prototype cuûa caùc haøm caàn söû
duïng vaøo ñaàu chöông trình baèng leänh tieàn xöû lyù
#include theo cuù phaùp sau:
# include <file. h>
Ví duï 3: #include <stdio.h>
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

9.6 HAØM ÑEÄ QUY

Trong thöïc teá ta raát hay gaëp khaùi nieäm ñeä quy
(recursion), ví duï nhö khi xem truyeàn hình ta seõ
thaáy maøn aûnh truyeàn hình ñang phaùt hình chính
noù, vaø trong aûnh cuûa maùy thu hình trong hình ta
laïi thaáy moät aûnh nöõa cuûa maùy thu hình nöõa, cöù
theá treân maøn hình coù raát nhieàu maùy thu hình, caùi
naøy loàng vaøo caùi kia.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

9.6 HAØM ÑEÄ QUY

C ñöôïc goïi laø moät ngoân ngöõ ñeä quy vì C cho pheùp
moät haøm coù theå goïi ñeán chính noù moät caùch tröïc
tieáp, hoaëc giaùn tieáp (töùc laø goïi qua trung gian moät
haøm khaùc), khi ñoù ta noùi haøm ñoù coù tính ñeä quy
(recursive).
Nhö vaäy, moät giaûi thuaät ñeä quy seõ daãn ñeán moät söï
laëp ñi laëp laïi khoâng keát thuùc caùc thao taùc, nhöng
trong thöïc teá, chuùng caàn phaûi ñöôïc keát thuùc, söû
duïng caùc ñieàu kieän keát thuùc ñeä quy.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

9.6 HAØM ÑEÄ QUY

Ví duï 3: Haøm ñeä quy tính giai thöøa n!


#include <stdio.h>
#include <conio.h>
long factorial (long so);
int main()
{ long so, kq = 0;
clrscr();
printf ("Moi nhap mot so 0: ");
scanf ("%ld", &so);
kq = factorial (so);
printf ("Ket qua %ld! la %ld \n", so, kq);
getch();
return 0;}
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

9.6 HAØM ÑEÄ QUY


long factorial (long so)
{
if (so > 1)
return (factorial(so - 1) * so);
else
return 1;
}
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

9.6 HAØM ÑEÄ QUY


HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

BAØI TAÄP CUOÁI CHÖÔNG

1. Thieát keá haøm giaûi phöông trình


ax2 + bx + c = 0.
Vieát chöông trình chính söû duïng haøm naøy.
2. Thieát keá haøm in ra maøn hình chuoãi soá
Fibonaci, vôùi thoâng soá nhaäp laø moät soá ngaãu
nhieân trong soá töø 1 ñeán 100.
Höôùng daãn: Söû duïng haøm random() vaø
randomize() ñeå taïo soá ngaãu nhieân. Daõy
Fibonacci : 0, 1, 1, 2, 3...
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

BAØI TAÄP CUOÁI CHÖÔNG

3. Thieát keá haøm tính caùc bieåu thöùc sau ñaây:


1 1+ 2 1 + 2 + ... + n
T= + + ... +
1! 2! n!
S =(1)! + (1+2)! +...+ (1+...+n)!
4. Thieát keá haøm veõ ra maøn hình hình sau:
*
***
***** n nhaäp
*******
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

BAØI TAÄP CUOÁI CHÖÔNG

5. Thieát keá haøm vaø veõ ra maøn hình hình sau:


********
**** *
**** *
**** * n nhaäp laø soá chaün
* ****
* ****
* ****
********
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

BAØI TAÄP CUOÁI CHÖÔNG

6. Vieát chöông trình thieát keá hai haøm max() vaø


min() cho pheùp tìm soá lôùn nhaát vaø nhoû nhaát trong
loaït soá ñaõ nhaäp. Loaït soá nhaäp naøy seõ keát thuùc
vieäc nhaäp baèng vieäc nhaán phím <F6>
7. Vieát moät chöông trình cho pheùp nhaäp moät
chuoãi. Haõy thieát keá moät haøm cho pheùp caét chuoãi
ñoù ra laøm nhieàu töø vaø in ra maøn hình moãi töø treân
moät haøng.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

BAØI TAÄP CUOÁI CHÖÔNG

8. Vieát moät haøm nhaän moät chuoãi vaø cho pheùp ñaûo
chuoãi ñoù, in ra keát quaû.
9. Vieát moät haøm cho pheùp nhaän moät soá nguyeân
döông. In ra maøn hình kyù soá thöù n tính töø beân
phaûi qua cuûa soá ñoù.
Ví duï:
Nhaäp: 12345 4
Xuaát: 2
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

BAØI TAÄP CUOÁI CHÖÔNG

10. Thieát keá moät haøm ñeä quy cho pheùp nhaän moät
soá nguyeân döông, in ra maøn hình soá ñoù ôû daïng
nhò phaân.
11. Vieát haøm ñeä quy tính xn.
12. Vieát moät haøm nhaän moät soá döông coù phaàn leû
vaø in ra maøn hình phaàn nguyeân vaø phaàn leû rieâng
bieät.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

KEÁT THUÙC CHÖÔNG 9


HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

CHÖÔNG 10
LÔÙP LÖU TRÖÕ CUÛA BIEÁN
SÖÏ CHUYEÅN KIEÅU
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

CHÖÔNG 10
LÔÙP LÖU TRÖÕ CUÛA BIEÁN
SÖÏ CHUYEÅN KIEÅU
10.1 Khaùi nieäm
10.2 Bieán toaøn cuïc vaø bieán cuïc boä
10.3 Bieán tónh (static)
10.4 Bieán REGISTER
10.5 Khôûi ñoäng trò cho bieán ôû caùc lôùp
10.6 Söï chuyeån kieåu
Baøi taäp cuoái chöông
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

10.1 KHAÙI NIEÄM

Moãi bieán khi ñöôïc söû duïng trong chöông trình ñeàu
phaûi ñöôïc khai baùo, tuy nhieân bieán coù theå ñöôïc
khai baùo ôû nhieàu choã trong chöông trình, bieán coù
theå ñöôïc khai baùo trong haøm, ngoaøi haøm..., moãi
choã nhö vaäy seõ laøm cho bieán coù khaû naêng söû duïng
khaùc nhau, töø ñoù hình thaønh neân caùc lôùp löu tröõ
bieán.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

10.1 KHAÙI NIEÄM

Ñoái vôùi C, döïa vaøo caùch maø bieán ñöôïc löu tröõ vaø
söû duïng, bieán seõ ôû moät trong caùc lôùp löu tröõ khaùc
nhau sau ñaây:
- Lôùp bieán töï ñoäng
- Lôùp bieán toaøn cuïc vaø bieán cuïc boä
- Lôùp bieán tónh
-Lôùp bieán thanh ghi
Coù hai ñaëc tính quan troïng cuûa moät bieán: taàm söû
duïng cuûa bieán vaø thôøi gian toàn taïi cuûa bieán.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

10.1 KHAÙI NIEÄM

Taàm söû duïng cuûa bieán (scope) laø nôi maø bieán coù theå
ñöôïc söû duïng trong caùc leänh cuûa chöông trình. Do
ñaëc tính naøy maø ta coù hai lôùp löu tröõ khaùc nhau laø
- lôùp löu tröõ bieán toaøn cuïc (global storage class)
- lôùp löu tröõ bieán cuïc boä (local storage class).
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

10.1 KHAÙI NIEÄM

Thôøi gian toàn taïi cuûa bieán (time life) xaùc ñònh raèng
bieán vôùi giaù trò ñang toàn taïi trong noù seõ coù yù nghóa
ñeán luùc naøo. Sinh ra 2 lôùp:
-lôùp bieán töï ñoäng (auto)
-lôùp bieán tónh (static)
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

10.1 KHAÙI NIEÄM


Lôùp bieán
Töï ñoäng Tónh
Lôùp bieán
Toaøn cuïc (khoâng keát Bieán toaøn
hôïp ñöôïc) cuïc tónh
Bieán cuïc boä Bieán cuïc boä
töï ñoäng tónh
Cuïc boä
(hay bieán töï
ñoäng)
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

10.2 BIEÁN TOAØN CUÏC VAØ BIEÁN CUÏC BOÄ

10.2.1 Bieán cuïc boä


Bieán cuïc boä, coøn goïi laø bieán töï ñoäng (auto), laø caùc
bieán ñöôïc khai baùo ngay sau caëp daáu moùc { vaø }
(caëp daáu naøy nhö ñaõ bieát ñeå baét ñaàu cho moät leänh
phöùc hoaëc moät thaân haøm), hoaëc laø caùc bieán ñöôïc
khai baùo trong danh saùch ñoái soá cuûa haøm.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

10.2 BIEÁN TOAØN CUÏC VAØ BIEÁN CUÏC BOÄ

10.2.1 Bieán cuïc boä


Khi khai baùo bieán cuïc boä ta coù theå ñaët hoaëc khoâng
ñaët töø khoùa auto phía tröôùc khai baùo bieán cuïc boä
theo cuù phaùp nhö sau:
[auto] kieåu danh_saùch_teân_bieán;
Ví duï:
int tong (int n)
{
auto int i; ...
}
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

10.2 BIEÁN TOAØN CUÏC VAØ BIEÁN CUÏC BOÄ

10.2.1 Bieán cuïc boä


Khi khai baùo bieán cuïc boä ta coù theå ñaët hoaëc khoâng
ñaët töø khoùa auto phía tröôùc khai baùo bieán cuïc boä
theo cuù phaùp nhö sau:
[auto] kieåu danh_saùch_teân_bieán;
Ví duï:
int tong (int n)
{
auto int i; ...
}
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

10.2 BIEÁN TOAØN CUÏC VAØ BIEÁN CUÏC BOÄ

10.2.1 Bieán cuïc boä


Ví duï :
Xeùt chöông trình saép xeáp hai soá, in ra keát quaû theo
thöù töï töø lôùn tôùi nhoû
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

10.2 BIEÁN TOAØN CUÏC VAØ BIEÁN CUÏC BOÄ

10.2.1 Bieán cuïc boä


#include <stdio.h>
#include <conio.h>
main()
{
auto int a, b:
clrscr();
printf ("Moi nhap hai so: ");
scanf ("%d %d", &a, &b);
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

10.2 BIEÁN TOAØN CUÏC VAØ BIEÁN CUÏC BOÄ

10.2.1 Bieán cuïc boä


if (b> a)
{
auto int temp;
temp = a;
a = b;
b = temp;
}
printf("Ket qua sap xep hai so: %d %d \n", a, b);
getch();
}
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

10.2 BIEÁN TOAØN CUÏC VAØ BIEÁN CUÏC BOÄ

10.2.2 Bieán toaøn cuïc


Bieán toaøn cuïc (global) hay coøn goïi laø bieán ngoaøi laø
bieán ñöôïc khai baùo ôû beân ngoaøi taát caû caùc haøm.
Bieán naøy coù theå ñöôïc söû duïng ñeå lieân keát trò giöõa
caùc haøm khaùc nhau maø vieäc truyeàn theo tham soá
trôû neân raéc roái vaø phöùc taïp. Caùc haøm söû duïng
chung bieán toaøn cuïc coù theå naèm trong cuøng moät taäp
tin hoaëc coù theå naèm trong caùc taäp tin khaùc nhau.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

10.2 BIEÁN TOAØN CUÏC VAØ BIEÁN CUÏC BOÄ

10.2.2 Bieán toaøn cuïc


Ví duï : Xeùt chöông trình ví duï sau:
#include <stdio.h>
#include <conio.h>
int a, b;
void swap(void);
main()
{ clrscr();
printf ("Moi nhap hai so: "); scanf ("%d %d", &a, &b);
swap();
printf ("Ket qua sap xep hai so: %d %d \n", a, b); getch();
}
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

10.2 BIEÁN TOAØN CUÏC VAØ BIEÁN CUÏC BOÄ

10.2.2 Bieán toaøn cuïc


void swap(void)
{
if (b> a)
{
auto int temp;
temp = a;
a = b;
b = temp;
}
}
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

10.2 BIEÁN TOAØN CUÏC VAØ BIEÁN CUÏC BOÄ

10.2.2 Bieán toaøn cuïc


Nhö vaäy, neáu coù moät bieán toaøn cuïc naøo ñoù ñaõ ñöôïc
khai baùo trong moät module cuûa chöông trình, vaø
moät haøm trong moät module khaùc laïi muoán söû duïng
bieán naøy ñeå truyeàn trò, C ñöa ra cuù phaùp sau ñaây:
extern kieåu teân_bieán_toaøn_cuïc;
Khai baùo naøy ñöôïc ñaët ñaàu module chöông trình
chöùa haøm söû duïng bieán toaøn cuïc.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

10.2 BIEÁN TOAØN CUÏC VAØ BIEÁN CUÏC BOÄ

10.2.2 Bieán toaøn cuïc


Töông töï cho haøm:
extern kieåu teân_bieán (danh_saùch_khai_baùo_ñoái_soá);
Khai baùo naøy thaät söï chæ laø prototype cuûa haøm
theâm töø khoùa extern phía tröôùc.
Ví duï 4.6 (trang 134-135-136)
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

10.3 BIEÁN TÓNH (STATIC)

Ñeå khai baùo bieán tónh ta caàn theâm töø khoùa static
tröôùc khai baùo bieán bình thöôøng, cuù phaùp nhö sau:
static kieåu danh_saùch_teân_bieán;
Bieán toaøn cuïc tónh laø bieán khai baùo ngoaøi taát caû caùc
haøm, trong moät module chöông trình naøo ñoù vaø chæ
coù yù nghóa söû duïng bôûi caùc haøm trong cuøng module
ñoù maø thoâi. Caùc haøm trong caùc module khaùc cuûa
chöông trình khoâng theå söû duïng ñöôïc caùc bieán toaøn
cuïc daïng static nhö theá naøy.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

10.3 BIEÁN TÓNH (STATIC)

Bieán cuïc boä tónh laø caùc bieán ñöôïc khai baùo trong
haøm vaø chæ coù yù nghóa söû duïng trong haøm coù khai
baùo ñoù maø thoâi.
Nhöng caùc bieán cuïc boä tónh khaùc vôùi bieán cuïc boä
(hay töï ñoäng) ôû thôøi gian toàn taïi, bieán tónh toàn taïi
suoát trong boä nhôù töø luùc noù ñöôïc söû duïng laàn ñaàu
tieân cho ñeán khi keát thuùc chöông trình, vaø giaù trò
cuûa chuùng khoâng heà maát ñi khi ra khoûi hoaëc trôû
vaøo haøm chöùa noù.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

10.3 BIEÁN TÓNH (STATIC)

Ví duï :
static int a;
main()
{
clrscr();
...
}
int func(void)
{
static int b;
...
}
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

10.3 BIEÁN TÓNH (STATIC)

Ví duï: Xeùt chöông trình tính toång


s = 1 +...+ n
duøng haøm trong ñoù coù khai baùo bieán static.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

10.3 BIEÁN TÓNH (STATIC)

#include <stdio.h>
#include <conio.h>
int tong (int a);
main()
{ int n, i, kq;
clrscr();
printf ("Nhap tri n: ");
scanf ("%d", &n);
for (i = 1; i <= n; i++)
kq = tong (i);
printf ("Ket qua: %d", kq);
getch(); }
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

10.3 BIEÁN TÓNH (STATIC)

int tong (int a)


{
static int tam = 0;
tam += a;
return t;
}

Trong chöông trình treân, trong haøm tong(), ta coù khai baùo moät bieán cuïc
boä tónh, bieán tam, bieán naøy chæ ñöôïc khôûi ñoäng trò moät laàn ñaàu chöông
trình, trò 0, sau ñoù trò cuûa bieán naøy luoân ñöôïc giöõ laïi cho laàn söû duïng sau
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

10.3 BIEÁN TÓNH (STATIC)

Ví duï 4.9: Khôûi ñoäng trò cuûa bieán static tam trong
haøm toång
void xoa (void)
{
int temp;
if ( (temp = tong(0)) != 0 )
tong(-temp);
}
Ví duï 4.10: (SGT)
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

10.3 BIEÁN TÓNH (STATIC)

Haøm ñöôïc khai baùo laø static thì noù chæ coù theå ñöôïc
söû duïng trong module maø noù ñöôïc khai baùo vaø ñònh
nghóa maø thoâi. Cuù phaùp khai baùo vaø ñònh nghóa
haøm static nhö sau:

static kieåu teân_haøm (danh_saùch_khai_baùo_ñoái_soá)


{
...
}
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

10.4 BIEÁN REGISTER

Boä dòch C cho pheùp taän duïng caùc taøi nguyeân coù saün
cuûa maùy ñeå toái öu hoùa chöông trình, moät trong caùc
toái öu naøy laø C cho pheùp laäp trình vieân söû duïng
moät soá thanh ghi cuûa boä vi xöû lyù ñeå khai baùo bieán,
bieán naøy goïi laø bieán thanh ghi (register). Khai baùo
bieán thanh ghi:
register kieåu danh_saùch_teân_bieán;
vôùi kieåu laø kieåu khai baùo cho bieán, kieåu naøy chæ coù
theå laø int, char, unsigned, long hoaëc pointer
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

10.4 BIEÁN REGISTER

Ví duï:
register int i;
register char c;
register unsigned u;
resister long l;
register int *r;
register t;
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

10.4 BIEÁN REGISTER

Taàm söû duïng vaø thôøi gian toàn taïi cuûa caùc bieán
thanh ghi töông töï nhö caùc bieán cuïc boä, nhöng
chuùng ñöôïc truy xuaát nhanh hôn caùc bieán cuïc boä
bình thöôøng vì chuùng chính laø caùc thanh ghi cuûa boä
vi xöû ly.
Caùc bieán thanh ghi thöôøng ñöôïc söû duïng laøm caùc
bieán ñieàu khieån trong caùc voøng laëp hoaëc caùc bieán
phaûi truy xuaát nhieàu laàn trong chöông trình.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

10.5 KHÔÛI ÑOÄNG TRÒ CHO BIEÁN


ÔÛ CAÙC LÔÙP
Ñoái vôùi bieán toaøn cuïc hoaëc bieán tónh, ngay sau khi
ñöôïc khai baùo, moãi bieán seõ ñöôïc C töï ñoäng gaùn trò
laø 0.
Trong khi ñoù bieán töï ñoäng vaø bieán thanh ghi seõ coù
giaù trò khoâng xaùc ñònh (goïi laø trò raùc).
trò baèng moät bieåu thöùc haèng.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

10.5 KHÔÛI ÑOÄNG TRÒ CHO BIEÁN


ÔÛ CAÙC LÔÙP
Trong suoát quaù trình chaïy chöông trình, bieán toaøn
cuïc vaø bieán tónh chæ coù theå ñöôïc khôûi ñoäng trò moät
laàn, ñoù laø laàn ñaàu tieân maø khai baùo bieán ñoù ñöôïc
thöïc thi.
Bieán toaøn cuïc vaø bieán tónh coù theå ñöôïc khôûi ñoäng
trò baèng moät bieåu thöùc haèng.
Bieán töï ñoäng vaø bieán thanh ghi coù theå ñöôïc khôûi
ñoäng trò baèng moät bieåu thöùc maø giaù trò cuûa bieåu
thöùc tôùi luùc ñoù ñaõ xaùc ñònh(coù theå goïi haøm).
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

10.5 KHÔÛI ÑOÄNG TRÒ CHO BIEÁN


ÔÛ CAÙC LÔÙP
Vieäc khôûi ñoäng cho caùc bieán thuoäc kieåu döõ kieän coù
caáu truùc nhö maûng (array), struct vaø union chæ coù
theå thöïc hieän ñöôïc ñoái vôùi caùc bieán toaøn cuïc hoaëc
bieán tónh maø thoâi
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

10.6 SÖÏ CHUYEÅN KIEÅU

Khi thöïc hieän caùc pheùp toaùn soá hoïc hoaëc luaân lyù, C
luoân thöïc hieän söï chuyeån kieåu töï ñoäng.
C coøn cho pheùp laäp trình vieân thöïc hieän vieäc
chuyeån kieåu baét buoäc, eùp kieåu (type casting). Cuù
phaùp ñeå eùp kieåu moät bieán, haèng hay bieåu thöùc:
(type) giaù_trò
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

10.6 SÖÏ CHUYEÅN KIEÅU

Ví duï:
Cho khai baùo bieán sau:
int a = 10, b = 3;
double d;
bieåu thöùc naøo cho keát quaû ñuùng, giaûi thích?(xem laïi
thöù töï öu tieân caùc pheùp toaùn cuûa C)
a) d = (double)(a/b);
b) d = (double)a/b;
c) d = a/(double)b;
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

BAØI TAÄP CUOÁI CHÖÔNG

1. Vieát moät haøm sao cho moãi laàn goïi haøm thì haøm
seõ traû veà moät trò soá ngay sau trò tröôùc ñoù trong
daõy soá Fibonaci.
2. Vieát chöông trình vôùi caùc haøm tính caùc bieåu thöùc
sau ñaây: duøng vaø khoâng duøng bieán thanh ghi
1 + ... + n 1 + ... + (n − 1) 1 + ... + (n − 2) 1
t= − + − ... +
n! (n − 1)! (n − 2)! 1!
(1 + ... + n) + (1 + ... + (n − 1)) + (1 + ... + (n − 2)) + ... + 1!
T=
n !+ (n − 1)! + (n − 2)! + ... + 1!
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

BAØI TAÄP CUOÁI CHÖÔNG

3. Vieát moät chöông trình goàm hai module: main.c


vaø func.c, trong ñoù module main.c löu haøm main()
coù caùc leänh goïi nhaäp ba heä soá cuûa tam thöùc baäc hai,
kieåm tra in aán; coøn trong module func.c löu caùc
haøm caàn thieát ñeå giaûi phöông trình baäc hai vaø bieän
luaän tam thöùc baäc hai.
4. In ra maøn hình caùc soá nguyeân toá töø 1 ñeán 1.000.
Duøng bieán thanh ghi vaø khoâng duøng bieán thanh
ghi. Kieåm tra thôøi gian.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

KEÁT THUÙC CHÖÔNG 10


HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

CHÖÔNG 11
MAÛNG
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

CHÖÔNG 11
MAÛNG
11.1 Khaùi nieäm
11.2 Khai baùo maûng
11.3 Khôûi ñoäng trò cuûa maûng
11.4 Maûng laø ñoái soá cuûa haøm maûng laø bieán toaøn cuïc
11.5 Caùc öùng duïng
Baøi taäp cuoái chöông
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

11.1 KHAÙI NIEÄM

Maûng laø moät bieán caáu truùc trong ñoù coù nhieàu phaàn
töû cuøng kieåu, moãi phaàn töû laø moät bieán thaønh phaàn
cuûa maûng. Moãi bieán thaønh phaàn naøy laø moät bieán
bình thöôøng vaø coù cöôùc soá (subscript) ñeå phaân bieät
giöõa phaàn töû naøy vaø phaàn töû kia. Nhö vaäy, ñeå truy
xuaát moät phaàn töû cuûa maûng, ta caàn bieát ñöôïc cöôùc
soá cuûa noù.
Trong boä nhôù, caùc phaàn töû cuûa maûng ñöôïc caáp phaùt
oâ nhôù coù ñòa chæ lieân tieáp nhau.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

11.1 KHAÙI NIEÄM

C cuõng cho pheùp laäp trình vieân khai baùo vaø laøm
vieäc treân maûng moät chieàu (singledimensional
array) vaø maûng nhieàu chieàu (multidimensional
array). Soá phaàn töû treân moät chieàu ñöôïc goïi laø kích
thöôùc cuûa chieàu ñoù.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

11.2 KHAI BAÙO MAÛNG

1- Maûng moät chieàu


Cuù phaùp khai baùo maûng moät chieàu nhö sau:
kieåu teân_maûng [kích_thöôùc];
Vôùi kích_thöôùc laø moät haèng soá nguyeân cuï theå, cho
bieát soá phaàn töû trong chieàu ñang xeùt.
Trong C, cöôùc soá caùc phaàn töû cuûa maûng luoân ñi töø
0 trôû ñi, neân maûng moät chieàu coù n phaàn töû thì
cöôùc soá caùc phaàn töû cuûa maûng laø 0,..., n-1.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

11.2 KHAI BAÙO MAÛNG

1- Maûng moät chieàu


Ví duï : int a[100];
Nhö vaäy maûng a coù 100 phaàn töû int, caùc phaàn töû
ñoù laø a[0], a[1],...,a[99].
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

11.2 KHAI BAÙO MAÛNG

1- Maûng moät chieàu


Ví duï :
Vieát chöông trình nhaäp moät daõy caùc soá nguyeân,
tìm soá lôùn nhaát trong daõy soá ñoù.
#include <stdio.h>
#include <conio.h>
main()
{
int i, n, max, vtmax;
int a[100];
clrscr();
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

11.2 KHAI BAÙO MAÛNG


printf ("Chuong trinh thu mang \n");
printf ("Moi ban nhap so phan tu cua mang: ");
scanf ("%d", &n);
printf ("Moi nhap cac phan tu cua mang:");
for (i = 0; i < n; i++)
scanf ("%d", &a[i]);
max = a[0]; vtmax = 0;
for (i = 1; i < n; i++)
if (max < a[i])
{ max = a[i];
vtmax = i; }
printf ("Phan tu %d co tri lon nhat la %d\n", vtmax, max);
getch()
}
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

11.2 KHAI BAÙO MAÛNG

2- Maûng nhieàu chieàu


Cuù phaùp khai baùo maûng nhieàu chieàu nhö sau:
kieåu teân_maûng [kích_thöôùc_chieàu1] [kích_thöôùc_chieàu2] [...];

Khi dòch C baùo loãi


Array size too large ?
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

11.2 KHAI BAÙO MAÛNG

2- Maûng nhieàu chieàu


Ví duï: Khai baùo maûng hai chieàu a
int a[4][3];
Nhö vaäy maûng a coù 4x3 phaàn töû int, caùc phaàn töû
ñoù laø
a[0][0] a[0][1] a[0][2]
a[1][0] a[1][1] a[1][2]
a[2][0] a[2][1] a[2][2]
a[3][0] a[3][1] a[3][2]
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

11.2 KHAI BAÙO MAÛNG

2- Maûng nhieàu chieàu


Caùc phaàn töû naøy ñöôïc saép trong boä nhôù theo thöù
töï a[0][0], a[0][1], a[0][2], a[1][0], a[1][1], a[1][2],
a[2][0], a[2][1], a[2][2],....
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

11.2 KHAI BAÙO MAÛNG

2- Maûng nhieàu chieàu


Ví duï:
Vieát chöông trình taïo vaø in ra maøn hình ma traän
coù daïng sau:
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

11.2 KHAI BAÙO MAÛNG

2- Maûng nhieàu chieàu


#include <stdio.h>
#include <conio.h>
#define MAX 20
main()
{
int i, j;
int a[MAX][MAX];
int n;
clrscr();
printf ("Chuong trinh thu mang \n");
printf ("Moi ban nhap cap cua ma tran: ");
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

11.2 KHAI BAÙO MAÛNG

2- Maûng nhieàu chieàu


scanf ("%d", &n);
for (i = 0; i < n; i++)
for (j = 0; j < n; j++)
if (i == j) a[i][i] = 1;
else a[i][j] = 0;
printf ("Ma tran duoc tao la: \n");
for (i = 0; i < n; i++)
{ for (j = 0; j < n; j++)
printf ("%d", a[i][j]);
getch () }
}
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

11.2 KHAI BAÙO MAÛNG

2- Maûng nhieàu chieàu


Ví duï : Coù khai baùo
int a[10];
maø ta laïi thöïc hieän leänh
for (i = 0; i<= 10; i++) a[i] = i;

thì trong thöïc teá khoâng coù phaàn töû a[10], nhöng
vieäc gaùn cuõng ñöôïc thöïc hieän, vaø oâ nhôù keá tieáp
phaàn töû a[9] ñöôïc gaùn trò.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

11.2 KHAI BAÙO MAÛNG

2- Maûng nhieàu chieàu


C khoâng coù söï phaân bieät giöõa moät bieán chuoãi vaø
moät maûng caùc kyù töï. Caû hai tröôøng hôïp ñeàu ñöôïc
khai baùo
char teân [chieàu_daøi];

Ñieåm khaùc bieät?


HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

11.2 KHAI BAÙO MAÛNG

2- Maûng nhieàu chieàu


Haøm gets() cho pheùp nhaäp moät chuoãi coù teân ñeå
trong ñoái soá haøm naøy.
Ví duï :
char s[20];
gets (s);
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

11.2 KHAI BAÙO MAÛNG

2- Maûng nhieàu chieàu


Haøm puts() cho pheùp xuaát moät chuoãi coù teân ñeå
trong ñoái soá haøm naøy ra maøn hình.
Ví duï :
char s[20];
puts (s);
Caû hai gets() vaø puts() ñeàu coù prototype naèm trong
file stdio.h.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

11.2 KHAI BAÙO MAÛNG

2- Maûng nhieàu chieàu


Ví duï :
Chöông trình truy xuaát chuoãi duøng haøm chuaån cuûa
C.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

11.2 KHAI BAÙO MAÛNG

2- Maûng nhieàu chieàu


#include <stdio.h>
#include <conio.h>
main()
{ char s[100];
clrscr();
printf ("Moi nhap mot chuoi: ");
gets (s);
printf ("Chuoi da nhap la: ");
puts (s);
getch();
}
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

11.3 KHÔÛI ÑOÄNG TRÒ CUÛA MAÛNG

Khi khai baùo maûng laø bieán toaøn cuïc hoaëc tónh thì
maûng coù theå ñöôïc khôûi ñoäng trò baèng caùc giaù trò
haèng.
Ví duï :
int a[5] = {1, 3, 5, 7, 9};
int b[10] = {1, 2, 3, 4, 5};
Neáu soá trò ít hôn soá phaàn töû maûng thì caùc phaàn töû
coøn laïi khoâng ñöôïc khôûi ñoäng trò, coù nghóa caùc
phaàn töû naøy coù trò laø 0.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

11.3 KHÔÛI ÑOÄNG TRÒ CUÛA MAÛNG

Ví duï:
double a[] = {1.23, –5.67, 9.87, 1.34};

char s[30] = “I go to shool \n”;


char ch[] = “Hello, World!”;
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

11.3 KHÔÛI ÑOÄNG TRÒ CUÛA MAÛNG

Ví duï :
Chuoãi char s[] = “Hello”;

H e l l o \0

char ch[] = {'H', 'e', 'l', 'l', 'o'};

H e l l o
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

11.4 MAÛNG LAØ ÑOÁI SOÁ CUÛA HAØM MAÛNG


LAØ BIEÁN TOAØN CUÏC
Khi khai baùo ñoái soá cuûa haøm laø maûng, thì kích
thöôùc cuûa chieàu ñaàu tieân cuûa maûng khoâng caàn xaùc
ñònh cuï theå. Tuy nhieân töø chieàu thöù hai trôû ñi,
kích thöôùc maûng phaûi xaùc ñònh.
Teân maûng chính laø ñòa chæ cuûa maûng, neân vieäc
truyeàn teân maûng cho haøm chính laø truyeàn ñòa chæ
thöïc cuûa maûng neân moïi thay ñoåi treân maûng trong
haøm cuõng chính laø thay ñoåi treân maûng thaät
(truyeàn theo kieåu tham soá bieán).
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

11.4 MAÛNG LAØ ÑOÁI SOÁ CUÛA HAØM MAÛNG


LAØ BIEÁN TOAØN CUÏC
Ví duï 5.14 (SGT)

void select_sort (int a[ ], int n)


{
....
}
Ví duï 5.15 (SGT)
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

11.5 CAÙC ÖÙNG DUÏNG

11.5.1 Saép xeáp maûng


Trong phaàn treân, ñeå saép xeáp moät maûng, giaûi thuaät
ñöôïc neâu ra laø giaûi thuaät select sort, trong muïc
naøy ta seõ xeùt theâm hai giaûi thuaät nöõa laø giaûi
thuaät bubble sort vaø quick sort.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

11.5 CAÙC ÖÙNG DUÏNG

11.5.1 Saép xeáp maûng


1- Bubble sort (ví duï 5.17)
Giaûi thuaät sort naøy döïa vaøo nguyeân taéc: phaàn töû
nhoû hôn seõ "nheï hôn" vaø vì vaäy seõ "noåi" leân treân.
Nhö vaäy, ñaây laø phöông phaùp so saùnh tröïc tieáp
hai phaàn töû trong maûng vôùi nhau, neáu phaàn töû
naøo nhoû seõ ñöôïc ñoåi choã sang choã coù chæ soá (cöôùc
soá) thaáp hôn (neáu vieäc saép xeáp theo thöù töï töø nhoû
tôùi lôùn).
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

11.5 CAÙC ÖÙNG DUÏNG

11.5.1 Saép xeáp maûng


1- Bubble sort (ví duï 5.17)
Chuong trinh thu ma tran
Moi ban nhap kich thuoc day: 5
Moi nhap cac phan tu cua ma tran:
9 -5 7 0 1
Lan lap thu 0
9 -5 0 7 1
-5 9 0 7 1
Lan lap thu 1
-5 9 0 1 7
-5 0 9 1 7
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

11.5 CAÙC ÖÙNG DUÏNG

11.5.1 Saép xeáp maûng


1- Bubble sort (ví duï 5.17)
Lan lap thu 2
-5 0 1 9 7
Lan lap thu 3
-5 0 1 7 9
Ma tran duoc sap xep la:
-5 0 1 7 9
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

11.5 CAÙC ÖÙNG DUÏNG

11.5.1 Saép xeáp maûng


2- Quick sort
Ñaây laø giaûi thuaät sort ñöôïc ñaùnh giaù laø nhanh
nhaát trong caùc giaûi thuaät saép xeáp. Nguyeân taéc cuûa
giaûi thuaät naøy nhö sau:
Giaûi thuaät quick sort baét ñaàu baèng vieäc tìm moät
giaù trò giöõa taàm cho maûng.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

11.5 CAÙC ÖÙNG DUÏNG


11.5.1 Saép xeáp maûng
2- Quick sort
Giaù trò giöõa taàm coù theå ñöôïc tính baèng trung bình
coäng cuûa hai phaàn töû ñaàu tieân vaø sau cuøng trong
phaàn maûng ñang ñöôïc saép xeáp. Giaûi thuaät seõ
chuyeån taát caû caùc phaàn töû coù giaù trò nhoû hôn giaù
trò giöõa taàm sang phaàn coù chæ soá thaáp cuûa maûng,
vaø chuyeån taát caû caùc phaàn töû coù giaù trò lôùn hôn
giaù trò giöõa taàm sang phaàn coù chæ soá cao cuûa
maûng.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

86 3 10 23 12 67 59 47 31 24

Trò giöõa taàm Vò trí trong maûng


0 1 2 3 4 5 6 7 8 9

Böôùc 1: 55 86 3 10 23 12 67 59 47 31 24

Böôùc 2: 35 24 3 10 23 12 31 47 59 67 86

Böôùc 3: 27 24 3 10 23 12 31 47 59 67 86

Böôùc 4: 18 24 3 10 23 12 31 47 59 67 86

Böôùc 5: 11 12 3 10 23 24 31 47 59 67 86

Böôùc 6: 6 10 3 12 23 24 31 47 59 67 86

Böôùc 7: 23 3 10 12 23 24 31 47 59 67 86

Böôùc 8: 72 3 10 12 23 24 31 47 59 67 86

Böôùc 9: 63 3 10 12 23 24 31 47 59 67 86

Böôùc 10: 63 3 10 12 23 24 31 47 59 67 86
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

11.5 CAÙC ÖÙNG DUÏNG


11.5.1 Saép xeáp maûng
3- Select sort
Giaûi thuaät seõ tìm giaù trò lôùn nhaát ñöa veà vò trí coù
cöôùc soá thaát nhaát, sau ñoù tìm giaù trò lôùn thöù nhì
ñöa veà vò trí coù cöôùc soá thaát nhì, quaù trình dieãn ra
töông töï cho ñeán heát
Ví duï 8.14(SGT)
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

11.5 CAÙC ÖÙNG DUÏNG


11.5.2 Stack
Stack (taïm dòch laø ngaên xeáp) laø moät kieåu caáu truùc
döõ lieäu do laäp trình vieân töï laäp ra, khi caàn, laäp
trình vieân coù theå theâm moät phaàn töû vaøo stack,
hoaëc xoùa moät phaàn töû ra khoûi stack.
Ñaëc ñieåm cuûa caáu truùc döõ lieäu naøy laø döõ lieäu ñöôïc
ghi vaøo hoaëc laáy ra khoûi stack theo traät töï vaøo
tröôùc ra sau (last-in first-out).
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

11.5 CAÙC ÖÙNG DUÏNG


11.5.2 Stack
Caùc thao taùc caàn coù ñeå laøm vieäc treân stack:
- Khôûi ñoäng stack, töông öùng vôùi haøm init_stack()
caàn thieát keá.
- Caùc haøm ñeå xem stack roãng, ñaày, hay xem trò
treân ñænh stack.
- Ñaåy moät phaàn töû vaøo stack, töông öùng haøm
push() caàn thieát keá.
- Laáy moät phaàn töû töø ñænh stack ra, töông öùng vôùi
haøm pop() caàn thieát keá.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

11.5 CAÙC ÖÙNG DUÏNG


11.5.2 Stack
Ví duï:
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

11.5 CAÙC ÖÙNG DUÏNG


11.5.2 Stack
Chöông trình öùng duïng stack (SGT)
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

11.5 CAÙC ÖÙNG DUÏNG


11.5.3 Queue
Queue laø moät caáu truùc döõ lieäu, trong ñoù vieäc theâm
döõ lieäu vaøo ñöôïc thöïc hieän ôû moät ñaàu, coøn vieäc laáy
moät phaàn töû ra khoûi queue ñöôïc thöïc hieän ôû ñaàu
kia. Döõ lieäu vaøo ra queue theo traät töï vaøo ñaàu tieân
ra ñaàu tieân (first-in first-out).
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

11.5 CAÙC ÖÙNG DUÏNG


11.5.3 Queue
Cuõng töông töï nhö ñoái vôùi stack, caùc thao taùc caàn
coù ñeå laøm vieäc treân queue:
- Khôûi ñoäng queue, töông öùng vôùi haøm init_queue()
caàn thieát keá.
- Caùc haøm ñeå xem queue roãng, ñaày.
- Theâm moät phaàn töû vaøo queue, töông öùng haøm
addqueue() caàn thieát keá.
- Laáy moät phaàn töû ra khoûi queue, töông öùng vôùi
haøm deletequeue() caàn thieát keá.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

11.5 CAÙC ÖÙNG DUÏNG


11.5.3 Queue
Ví duï:
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

11.5 CAÙC ÖÙNG DUÏNG


11.5.3 Queue
Ví du (SGT)
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

BAØI TAÄP CUOÁI CHÖÔNG


1. Nhaäp moät ma traän n x n baát kyø, saép xeáp laïi ma
traän sao cho caùc trò lôùn nhaát treân töøng haøng, naèm
treân ñöôøng cheùo cuûa ma traän.
2. Vieát chöông trình taïo vaø in ra maøn hình ma
traän coù daïng sau:
a b c d
b c d a
c d a b n : tham soá nhaäp
d a b c
n
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

BAØI TAÄP CUOÁI CHÖÔNG


3. Nhaäp moät chuoãi baát kyø töø baøn phím, xoùa taát caû
caùc kyù töï khoaûng traéng thöøa cuûa chuoãi vaø in ra
maøn hình chuoãi môùi.
4. Nhaäp moät daõy soá töø baøn phím. Vieát hai haøm ñeå
in ra maøn hình bieåu ñoà ngang vaø bieåu ñoà doïc cuûa
caùc daáu * töông öùng vôùi caùc soá nhaäp trong daõy soá.
Ví duï: Nhaäp 2 4 3; ***
** ***
**** **
*** *
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

BAØI TAÄP CUOÁI CHÖÔNG


5. Vieát chöông trình taïo vaø in ra maøn hình tam
giaùc PASCAL caáp n, vôùi n nhaäp töø baøn phím.
6. Vieát chöông trình taïo ma traän nghòch ñaûo n x
n.
7. Vieát chöông trình giaûi heä phöông trình tuyeán
tính baèng phöông phaùp Gauss.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

BAØI TAÄP CUOÁI CHÖÔNG


8. Nhaäp moät ma traän vuoâng baát kyø, tính toång caùc
haøng, caùc coät, caùc ñöôøng cheùo.
9. Nhaäp moät ma traän baát kyø. In ra maøn hình caùc
trò vaø vò trí cuûa caùc soá nguyeân toá coù trong maûng
ñoù.
10. Vieát caùc haøm ñoåi töø soá sang chuoãi, vaø töø chuoãi
sang soá.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

KEÁT THUÙC CHÖÔNG 11


HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

CHÖÔNG 12
POINTER
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

CHÖÔNG 12
POINTER
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

12.1 KHAÙI NIEÄM

Trong ngoân ngöõ C, moãi bieán vaø chuoãi kyù töï ñeàu
ñöôïc löu tröõ trong boä nhôù vaø coù ñòa chæ rieâng, ñòa
chæ naøy xaùc ñònh vò trí cuûa chuùng trong boä nhôù.
Khi laäp trình trong C, nhieàu luùc chuùng ta caàn laøm
vieäc vôùi caùc ñòa chæ naøy, vaø C uûng hoä ñieàu ñoù khi
ñöa ra kieåu döõ lieäu pointer (taïm dòch laø con troû)
ñeå khai baùo cho caùc bieán löu ñòa chæ.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

12.1 KHAÙI NIEÄM

Moät bieán coù kieåu pointer coù theå löu ñöôïc döõ lieäu
trong noù, laø ñòa chæ cuûa moät ñoái töôïng ñang khaûo
saùt. Ñoái töôïng ñoù coù theå laø moät bieán, moät chuoãi
hoaëc moät haøm.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

12.2 THAO TAÙC TREÂN POINTER

12.2.1 Khai baùo bieán pointer - pointer haèng


Trong ngoân ngöõ C coù moät toaùn töû laáy ñòa chæ cuûa
moät bieán ñang laøm vieäc, toaùn töû naøy laø moät daáu &
(ampersand), taïm goïi laø toaùn töû laáy ñòa chæ. Cuù
phaùp nhö sau:
& bieán
vôùi bieán laø moät bieán thuoäc kieåu baát kyø, nhöng
khoâng ñöôïc laø bieán thanh ghi.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

12.2 THAO TAÙC TREÂN POINTER

12.2.1 Khai baùo bieán pointer - pointer haèng


Ví duï: Neáu coù moät bieán ñaõ ñöôïc khai baùo laø

int heä_soá_a;
thì
& heä_soá_a
seõ laø ñòa chæ cuûa bieán heä_soá_a.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

12.2 THAO TAÙC TREÂN POINTER

12.2.1 Khai baùo bieán pointer - pointer haèng


Cuù phaùp ñeå khai baùo bieán pointer:
kieåu * teân_bieán_pointer
vôùi - kieåu coù theå laø kieåu baát kyø, xaùc ñònh kieåu döõ
lieäu coù theå ñöôïc ghi vaøo ñoái töôïng maø con troû
ñang troû ñeán.
- teân_bieán_pointer laø teân cuûa bieán con troû, moät
danh hieäu hôïp leä.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

12.2 THAO TAÙC TREÂN POINTER

12.2.1 Khai baùo bieán pointer - pointer haèng


Bieán hoaëc ñoái töôïng maø con troû ñang troû ñeán coù
theå ñöôïc truy xuaát qua teân cuûa bieán con troû vaø daáu
"*" ñi ngay tröôùc bieán con troû, cuù phaùp cuï theå nhö
sau:
* teân_bieán_con_troû
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

12.2 THAO TAÙC TREÂN POINTER

12.2.1 Khai baùo bieán pointer - pointer haèng


Ví duï: Xeùt caùc khai baùo sau:
int a, b;
int *pa;
Sau khi khai baùo, ta coù ba oâ nhôù cho ba bieán a, b
vaø pa nhö sau:
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

12.2 THAO TAÙC TREÂN POINTER

12.2.1 Khai baùo bieán pointer - pointer haèng


Ví duï:
void * pvoid;
int a, * pint;
double b, * pdouble;
pvoid = (void *) &a;
pint = (int *) pvoid;
(*pint) ++;
pvoid = (void *) &b;
pdouble = (double *) pvoid;
(*pdouble) -- ;
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

12.2 THAO TAÙC TREÂN POINTER

12.2.2 Caùc pheùp toaùn treân pointer


Coù theå coäng, tröø moät pointer vôùi moät soá nguyeân
(int, long,...). Keát quaû laø moät pointer.
Ví duï :
int *pi1, *pi2, n;
pi1 = &n;
pi2 = pi1 + 3;
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

12.2 THAO TAÙC TREÂN POINTER

12.2.2 Caùc pheùp toaùn treân pointer


Ví duï: Cho khai baùo
int a[20];
int *p;
p = &a[0];
p += 3;
/* p löu ñòa chæ phaàn töû a[0 + 3], töùc &a[3] */
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

12.2 THAO TAÙC TREÂN POINTER

12.2.2 Caùc pheùp toaùn treân pointer


Khoâng theå thöïc hieän caùc pheùp toaùn nhaân, chia,
hoaëc laáy dö moät pointer vôùi moät soá, vì pointer löu
ñòa chæ, neân neáu thöïc hieän ñöôïc ñieàu naøy cuõng
khoâng coù moät yù nghóa naøo caû.
Pheùp tröø giöõa hai pointer vaãn laø moät pheùp toaùn
hôïp leä, keát quaû laø moät trò thuoäc kieåu int bieåu thò
khoaûng caùch (soá phaàn töû) giöõa hai pointer ñoù.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

12.2 THAO TAÙC TREÂN POINTER

12.2.2 Caùc pheùp toaùn treân pointer


Ví duï:
Xeùt chöông trình ví duï sau:
#include <stdio.h>
#include <conio.h>
main()
{
int *p1, *p2;
int a[10];
clrscr();
p1 = &a[0];
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

12.2 THAO TAÙC TREÂN POINTER

12.2.2 Caùc pheùp toaùn treân pointer


Ví duï:
p2 = &a[5];
printf ("Dia chi cua bien a[0] la: %p\n", p1);
printf ("Dia chi cua bien a[5] la: %p\n", p2);
printf ("Khoang cach giua hai phan tu la %d int\n", p2 - p1);
getch();
}
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

12.2 THAO TAÙC TREÂN POINTER

12.2.2 Caùc pheùp toaùn treân pointer


Chöông trình seõ cho xuaát lieäu ví duï:
Dia chi cua bien a[0] la: FFE2
Dia chi cua bien a[5] la: FFEC
Khoang cach giua hai phan tu la 5 int
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

12.2 THAO TAÙC TREÂN POINTER

12.2.2 Caùc pheùp toaùn treân pointer


Ví duï: Cho caùc khai baùo sau:
int * a1;
char * a2;
a1 = 0; /* Chöông trình dòch seõ nhaéc nhôû leänh naøy */
a2 = (char *)0;
if( a1 != a2) /* Chöông trình dòch seõ nhaéc nhôû kieåu cuûa ñoái töôïng */
{
a1 = (int *) a2; /* Hôïp leä vì ñaõ eùp kieåu */
}
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

12.2 THAO TAÙC TREÂN POINTER

12.2.2 Caùc pheùp toaùn treân pointer


Ví duï:
#include <stdio.h>
#include <conio.h>
main()
{
int *pint, a = 0 6141;
char *pchar;
clrscr();
pint = &a;
pchar = (char *) &a;
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

12.2 THAO TAÙC TREÂN POINTER

12.2.2 Caùc pheùp toaùn treân pointer


Ví duï:
printf ("Tri cua bien pint la: %p\n", pint);
printf ("Tri cua bien pchar la: %p\n", pchar);
printf ("Doi tuong pint dang quan ly la %X \n", *pint);
printf ("Doi tuong pchar dang quan ly la %c \n", *pchar);
pchar++;
printf ("Doi tuong pchar dang quan ly la %c \n", *pchar);
getch();
}
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

12.2 THAO TAÙC TREÂN POINTER

12.2.2 Caùc pheùp toaùn treân pointer

Chöông trình cho xuaát lieäu ví duï:


Tri cua bien pint la: FFF4
Tri cua bien pchar la: FFF4
Doi tuong pint dang quan ly la 6141
Doi tuong pchar dang quan ly la A
Doi tuong pchar dang quan ly la a
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

12.2 THAO TAÙC TREÂN POINTER

12.2.2 Caùc pheùp toaùn treân pointer


C cho pheùp khai baùo moät bieán pointer laø haèng
hoaëc ñoái töôïng cuûa moät pointer laø haèng.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

12.2 THAO TAÙC TREÂN POINTER

12.2.2 Caùc pheùp toaùn treân pointer


Caùc khai baùo sau ñaây laø bieán pointer haèng:
1. int a, b;
int * const pint = &a;
pint = &b;  C baùo
loãi
2. char * const ps = "ABCD";
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

12.2 THAO TAÙC TREÂN POINTER

12.2.2 Caùc pheùp toaùn treân pointer


Caùc khai baùo sau ñaây cho thaáy ñoái töôïng cuûa moät
pointer laø haèng:
1. int i;
const int * pint;
pint = &i;
i = 1;
(*pint) ++; C baùo loãi
i++;
2. const char * s = "ABCD" hoaëc
char const * s = "ABCD";
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

12.2 THAO TAÙC TREÂN POINTER

12.2.2 Caùc pheùp toaùn treân pointer


Phaân bieät:
const tröôùc * : pointer chæ ñeán ñoái töôïng haèng
* tröôùc const : pointer haèng
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

12.3 POINTER VAØ MAÛNG

Coù moät söï töông quan chaët cheû giöõa maûng vaø
pointer, vì trong C, teân maûng laø moät haèng
pointer, noù chính laø ñòa chæ cuûa phaàn töû ñaàu tieân
cuûa maûng.
Ví duï: Cho khai baùo sau:
int a[10];
int *pa;
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

12.3 POINTER VAØ MAÛNG

*(a + 0) chính laø a[0],


*(a + 1) chính laø a[1],
....
*(a + i) chính laø a[i].

Coù theå gaùn:


pa = a;
hoaëc
pa =&a[0];
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

12.3 POINTER VAØ MAÛNG

Khi ñoù, (pa + 0) seõ chæ ñeán phaàn töû a[0],


(pa + 1) seõ chæ ñeán phaàn töû a[1],
...
(pa + i) seõ chæ ñeán phaàn töû a[i].
Nhö vaäy, caùc ñoái töôïng
*(pa + 0) chính laø *(a + 0), cuõng laø a[0]
*(pa + 1) chính laø *(a + 1), cuõng laø a[1]
...
*(pa + i) chính laø *(a + i), cuõng laø a[i]
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

12.3 POINTER VAØ MAÛNG

Coù theå truy suaát ñeán caùc ñoái töôïng cuûa maûng maø
pointer ñang troû ñeán nhö sau:
pa[0] chính laø phaàn töû a[0]
pa[1] chính laø phaàn töû a[1]
...
pa[i] chính laø phaàn töû a[i].
Ví duï 6.15 (SGT)
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

12.3 POINTER VAØ MAÛNG

Phaân bieät roõ raøng giöõa maûng vaø pointer.


-Moät maûng, sau khi ñöôïc khai baùo vaø ñònh nghóa,
ñaõ ñöôïc caáp moät vuøng nhôù trong boä nhôù trong cuûa
maùy tính vaø ñòa chæ chính laø teân maûng.
-Moät bieán pointer, sau khi ñöôïc khai baùo, thì vuøng
nhôù ñöôïc caáp chæ laø baûn thaân bieán pointer, coøn trò
beân trong noù laø moät ñòa chæ raùc.
-Ngoaøi ra, bieán pointer coù moät ñòa chæ trong boä
nhôù, coøn khoâng theå laáy ñòa chæ cuûa teân maûng.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

12.3 POINTER VAØ MAÛNG

Ví duï:
Sau khi khai baùo
int a[10];
thì trong boä nhôù, a laø moät haèng pointer, hay moät
ñòa chæ coá ñònh
Caùc phaàn töû trong maûng ñang coù trò raùc.
Vì teân maûng laø moät haèng pointer
a++;
laø khoâng hôïp leä.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

12.3 POINTER VAØ MAÛNG

Ví duï:
int *pa;
thì trong boä nhôù

do ñoù leänh gaùn


*pa = 2; laø khoâng coù yù nghóa, duø C khoâng baùo loãi
trong tröôøng hôïp naøy.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

12.3 POINTER VAØ MAÛNG

Ví duï 6.18 vaø 6.19 (SGT)


HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

12.4 ÑOÁI SOÁ CUÛA HAØM LAØ POINTER -


TRUYEÀN ÑOÁI SOÁ THEO SOÁ DAÏNG
THAM SOÁ BIEÁN
Ví duï:
#include <stdio.h>
#include <conio.h>
void hoan_doi (int a, int b);
main()
{
int so1 = 1, so2 = 2;
clrscr();
printf ("Tri cua hai bien so1 vaø so2 la: %d %d\n", so1, so2);
hoan_doi(so1, so2),
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

12.4 ÑOÁI SOÁ CUÛA HAØM LAØ POINTER -


TRUYEÀN ÑOÁI SOÁ THEO SOÁ DAÏNG
THAM SOÁ BIEÁN
printf("Sau khi goi ham, tri cua so1 va so2 la: %d %d\n",so1,so2);
getch();
}
void hoan_doi (int a, int b)
{
int temp;
temp = a;
a = b;
b = temp;
}
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

12.4 ÑOÁI SOÁ CUÛA HAØM LAØ POINTER -


TRUYEÀN ÑOÁI SOÁ THEO SOÁ DAÏNG
THAM SOÁ BIEÁN
Ví duï:
#include <stdio.h>
#include <conio.h>
void hoan_doi (int *a, int *b);
main ()
{
int so1 = 1, so2 = 2;
clrscr();
printf ("Tri cua hai bien so1 va so2 la: %d %d\n", so1, so2);
hoan_doi (&so1, &so2);
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

12.4 ÑOÁI SOÁ CUÛA HAØM LAØ POINTER -


TRUYEÀN ÑOÁI SOÁ THEO SOÁ DAÏNG
THAM SOÁ BIEÁN
printf ("Sau khi goi ham, tri cua so1 va so2 la: %d %d\n", so1,
so2);
getch();
}
void hoan_doi (int *a, int *b)
{
int temp;
temp = *a;
*a = *b;
*b = temp;
}
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

12.4 ÑOÁI SOÁ CUÛA HAØM LAØ POINTER -


TRUYEÀN ÑOÁI SOÁ THEO SOÁ DAÏNG
THAM SOÁ BIEÁN
Trong thö vieän chuaån cuûa C cuõng coù nhieàu haøm
nhaän ñoái soá vaøo theo ñòa chæ, ví duï haøm scanf(),
nhaäp trò vaøo cho bieán töø baøn phím.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

12.4 ÑOÁI SOÁ CUÛA HAØM LAØ POINTER -


TRUYEÀN ÑOÁI SOÁ THEO SOÁ DAÏNG
THAM SOÁ BIEÁN
Ví duï:
#include <stdio.h>
#include <conio.h>
main()
{ int n; clrscr();
printf("Moi nhap mot so nguyen ");
scanf("%d", &n);
printf("\n Binh phuong cua %d la %d\n", n, n*n);
getch();
}
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

12.5 HAØM TRAÛ VEÀ POINTER VAØ MAÛNG

Moät pointer coù theå ñöôïc traû veà töø haøm, neáu
pointer troû ñeán ñoái töôïng laø maûng, thì haøm traû veà
maûng; neáu pointer chæ troû ñeán bieán bình thöôøng,
thì haøm chæ traû veà con troû troû ñeán bieán thöôøng, cuù
phaùp khai baùo haøm nhö sau:
kieåu * teân_haøm (danh_saùch_khai_baùo_ñoái_soá);
vôùi kieåu laø kieåu cuûa ñoái töôïng maø pointer ñöôïc
haøm traû veà troû ñeán.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

12.5 HAØM TRAÛ VEÀ POINTER VAØ MAÛNG

Ví duï: Coù khai baùo


int * lon_nhat (int a, int b, int c);
thì haøm lon_nhat() traû veà moät ñòa chæ, ñòa chæ ñoù
coù theå laø ñòa chæ cuûa moät int hoaëc ñòa chæ cuûa moät
maûng caùc int, vieäc söû duïng ñòa chæ theo ñoái töôïng
naøo laø do nôi goïi.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

12.5 HAØM TRAÛ VEÀ POINTER VAØ MAÛNG


Ví duï: Thieát keá haøm nhaäp trò cho maûng caùc int
int *nhap_tri (int *num)
{
static int a[10];
int i, n;
printf ("Nhap kich thuoc mang:");
scanf ("%d", &n);
*num = n;
printf ("Nhap tri cho %d phan tu cua mang:", n);
for (i = 0; i < n; i++)
scanf ("%d", &a[i]);
return a; /* a laø ñòa chæ ñaàu maûng caàn traû veà */
}
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

12.5 HAØM TRAÛ VEÀ POINTER VAØ MAÛNG


Ví duï: Chöông trình söû duïng haøm nhaäp trò maûng
#include <stdio.h>
#include <conio.h>
int *nhap_tri(int *num);
main()
{ int *pint, so_phan_tu, i;
clrscr();
pint = nhap_tri (&so_phan_tu);
printf ("Cac phan tu cua mang la:");
for (i =0; i <so_phan_tu; i++)
printf ("%d", pint[i]);
getch();
}
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

12.6 CHUOÃI KYÙ TÖÏ


Ví duï: Khi khai baùo
“Hello, world!”
thì chuoãi naøy seõ ñöôïc C ghi vaøo moät nôi naøo ñoù
trong boä nhôù vaø coù ñòa chæ xaùc ñònh. Ñòa chæ naøy
coù theå ñöôïc gaùn vaøo cho moät bieán con troû troû ñeán
kyù töï ñeå quaûn lyù chuoãi.
Ví duï : Cho khai baùo
char s[20];
s = “Hello, world!”; Khoâng hôïp leä
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

12.6 CHUOÃI KYÙ TÖÏ


1- Nhaäp trò chuoãi
Vieäc nhaäp trò cho chuoãi bao goàm hai böôùc: ñaàu
tieân caàn khai baùo moät nôi troáng ñeå chöùa chuoãi,
sau ñoù duøng moät haøm nhaäp trò ñeå laáy chuoãi.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

12.6 CHUOÃI KYÙ TÖÏ


1- Nhaäp trò chuoãi
- Haøm gets() ñoïc caùc kyù töï ñeán khi naøo gaëp kyù töï
quy ñònh haøng môùi (töùc kyù töï '\n', töùc khi ta aán
phím ENTER) thì keát thuùc vieäc nhaäp. Sau ñoù haøm
naøy laáy taát caû caùc kyù töï ñaõ nhaäp tröôùc kyù töï '\n',
gaén theâm vaøo cuoái chuoãi moät kyù töï NUL ('\0') vaø
traû chuoãi cho chöông trình goïi. Prototype cuûa haøm
naøy trong file stdio.h:
char * gets (char * s);
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

12.6 CHUOÃI KYÙ TÖÏ


1- Nhaäp trò chuoãi
Ví duï:
#include <stdio.h>
#include <conio.h>
main()
{ char ten[41];
char *pten;
clrscr();
printf ("Ban ten gi?\n");
pten = gets (ten);
printf("%s? A! Chao ban %s\n", ten, pten);
getch(); }
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

12.6 CHUOÃI KYÙ TÖÏ


1- Nhaäp trò chuoãi
- Haøm scanf() cuõng cho pheùp nhaäp chuoãi qua ñònh
daïng nhaäp %s. Vieäc nhaäp chuoãi seõ keát thuùc khi
haøm scanf() gaëp moät trong caùc kyù töï khoaûng
traéng, kyù töï tab hay kyù töï xuoáng haøng ñaàu tieân
maø noù gaëp. Ñaây chính laø ñieåm khaùc nhau giöõa hai
haøm nhaäp chuoãi gets() vaø scanf().
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

12.6 CHUOÃI KYÙ TÖÏ


1- Nhaäp trò chuoãi
Ví duï:
#include <stdio.h>
#include <conio.h>
main()
{ char ten1[41], ten2[41];
clrscr();
printf(Moi ban nhap hai ten: );
scanf ("%s %s", ten1, ten2);
printf("A! Chao hai ban %s va %s \n", ten1, ten2);
getch();
}
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

12.6 CHUOÃI KYÙ TÖÏ


2- Xuaát chuoãi
Ñeå xuaát chuoãi, hai haøm thöôøng hay ñöôïc duøng laø
puts() vaø printf().
- Haøm puts: ta chæ caàn cung caáp cho haøm ñoái soá laø
ñòa chæ cuûa chuoãi caàn in. Haøm naøy seõ ñoïc töøng kyù
töï cuûa chuoãi vaø in ra maøn hình cho ñeán khi gaëp
kyù töï NUL thì in ra maøn hình theâm moät kyù töï
xuoáng haøng nöõa. Prototype cuûa haøm naøy nhö sau:
int puts (char * s);
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

12.6 CHUOÃI KYÙ TÖÏ


2- Xuaát chuoãi
- Haøm printf () cuõng cho pheùp xuaát chuoãi ra maøn
hình neáu ta duøng ñònh daïng xuaát "%s" cho noù.
Haøm naøy seõ khoâng töï ñoäng in theâm kyù töï xuoáng
haøng môùi nhö haøm puts().
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

12.6 CHUOÃI KYÙ TÖÏ


2- Xuaát chuoãi
Ví duï:
#include <stdio.h>
#include <conio.h>
main()
{ char ten[41];
clrscr();
printf ("Moi ban nhap ten: ");
gets(ten);
printf ("A! Chao ban: %s", ten);
getch();
}
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

12.6 CHUOÃI KYÙ TÖÏ


3- Gaùn trò cho chuoãi
Vieäc gaùn trò cho bieán chuoãi thöïc teá laø vieäc cheùp
töøng kyù töï töø haèng chuoãi hoaëc bieán chuoãi ñaõ bieát
sang moät bieán chuoãi khaùc. Trong C, thao taùc naøy
ñöôïc thöïc hieän nhôø haøm strcpy(), haøm naøy coù
prototype trong file string.h nhö sau:
char *strcpy(char *dest, const char *src);
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

12.6 CHUOÃI KYÙ TÖÏ


3- Gaùn trò cho chuoãi
Haøm strcpy coù theå ñöôïc moâ taû nhö sau:

char *strcpy(char *dest, const char *src)


{
int i;
for (i = 0; (dest[i] = scr[i]) != '\0'; i++)
;
return dest;
}
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

12.6 CHUOÃI KYÙ TÖÏ


3- Gaùn trò cho chuoãi
Ví duï:
#include <stdio.h>
#include <conio.h>
#include <string.h>
main()
{ char ten1[41], ten2[41];
clrscr();
printf("Moi ban nhap ten: ");
gets(ten1);
strcpy (ten2, ten1);
printf("A! Chao ban: %s", ten2);
getch(); }
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

12.6 CHUOÃI KYÙ TÖÏ


4- Laáy chieàu daøi chuoãi
Trong C, ñeå laáy chieàu daøi chuoãi ta duøng haøm
strlen(). Prototype cuûa haøm naøy trong file
string.h:
size_t strlen(const char *s);
vôùi size_t laø moät kieåu nguyeân, C quy ñònh ñaây laø
unsigned.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

12.6 CHUOÃI KYÙ TÖÏ


4- Laáy chieàu daøi chuoãi
Ví duï:Xeùt chöông trình nhaäp moät chuoãi, ñoåi caùc kyù
töï thöôøng cuûa chuoãi ñoù thaønh kyù töï hoa, in chuoãi
ñoù ra laïi maøn hình.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

12.6 CHUOÃI KYÙ TÖÏ


4- Laáy chieàu daøi chuoãi
#include <stdio.h>
#include <conio.h>
#include <string.h>
main()
{ char ten[41];
int i; clrscr();
printf("Moi ban nhap ten: "); gets(ten);
for ( i = 0; i < strlen (ten); i++)
if (ten[i] >= 'a' && ten[i] <= 'z') ten[i] -= 32;
printf ("A! Chao ban: %s", ten);
getch();}
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

12.6 CHUOÃI KYÙ TÖÏ


5- Noái chuoãi
Ñeå noái hai chuoãi laïi, C coù haøm chuaån strcat().
Haøm naøy nhaän hai chuoãi laøm ñoái soá, vaø moät baûn
sao cuûa chuoãi thöù hai seõ ñöôïc cheùp noái vaøo cuoái
cuûa chuoãi thöù nhaát, ñeå taïo ra chuoãi môùi. Chuoãi thöù
hai vaãn khoâng coù gì thay ñoåi. Prototype cuûa haøm
naøy trong file string.h:
char *strcat(char *dest, const char *src);
Ví duï 6.37(SGT)
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

12.6 CHUOÃI KYÙ TÖÏ


6- So saùnh chuoãi
Haøm naøy laø strcmp(), coù prototype trong file
string.h:
int strcmp(const char *s1, const char*s2);
Haøm naøy so saùnh hai chuoãi s1 vaø s2 vaø traû veà moät
trò laø:
- soá döông neáu s1 > s2
- soá aâm neáu s1 < s2
- soá 0 neáu s1 == s2
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

12.6 CHUOÃI KYÙ TÖÏ


6- So saùnh chuoãi
Ví duï:Xeùt chöông trình ví duï sau ñaây
#include <stdio.h>
#include <conio.h>
#include <string.h>
main()
{ clrscr();
printf("%d \n", strcmp("QUAN", quan));
printf("%d \n', strcmp("QUAN", "QUAN"));
printf("%d \n", strcmp("quan", "QUAN"));
printf("%d \n", strcmp("quang, quanG"));
printf("%d \n", strcmp("quang, quan"));
getch(); }
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

12.6 CHUOÃI KYÙ TÖÏ


6- So saùnh chuoãi
Chöông trình cho xuaát lieäu:
-32
032
32
103
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

12.7 POINTER VAØ VIEÄC ÑÒNH VÒ BOÄ


NHÔÙ ÑOÄNG
C cho pheùp khai baùo caùc bieán ñoäng, caùc bieán
naøy khi caàn thì xin choã, khoâng caàn thì giaûi
phoùng vuøng nhôù cho chöông trình söû duïng
vaøo muïc ñích khaùc. Caùc bieán ñoäng naøy ñöôïc
caáp phaùt trong vuøng nhôù heap, laø vuøng ñaùy
boä nhôù (vuøng coøn laïi sau khi ñaõ naïp caùc
chöông trình khaùc xong), vaø ñöôïc quaûn lyù
bôûi caùc bieán pointer
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

12.7 POINTER VAØ VIEÄC ÑÒNH VÒ BOÄ


NHÔÙ ÑOÄNG
Trong C coù hai haøm chuaån ñeå xin caáp phaùt
boä nhôù ñoäng malloc() vaø calloc(), caû hai haøm
ñeàu coù prototype naèm trong file alloc.h hoaëc
stdlib.h nhö sau:
void *malloc(size_t size);
void *calloc(size_t nitems, size_t size);
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

12.7 POINTER VAØ VIEÄC ÑÒNH VÒ BOÄ


NHÔÙ ÑOÄNG
Neáu bieán ñoäng ñöôïc xin, sau khi duøng xong, vuøng
nhôù cuûa noù khoâng ñöôïc giaûi phoùng thì noù vaãn
chieám choå trong boä nhôù, maëc duø chöông trình ñaõ
keát thuùc. C ñöa ra haøm free() ñeå giaûi phoùng khoái
boä nhôù ñöôïc xin baèng haøm malloc() hoaëc calloc().
Prototype cuûa haøm free() trong file stdlib.h hoaëc
alloc.h nhö sau:
void free (void * block);
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

12.7 POINTER VAØ VIEÄC ÑÒNH VÒ BOÄ


NHÔÙ ÑOÄNG
Ví duï:
Caàn xin moät khoái boä nhôù coù 10 phaàn töû int, ta
vieát nhö sau:

int *pint;
pint = (int *) malloc (10 * siezof (int));
hoaëc
pint = (int *) calloc (10, siezof (int));
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

12.7 POINTER VAØ VIEÄC ÑÒNH VÒ BOÄ


NHÔÙ ÑOÄNG
Ví duï:
#include <stdio.h>
#include <conio.h>
#include <process.h>  EXIT
#include <alloc.h>
main()
{ int *pint, s = 0, i;
pint = (int *) calloc (10, sizeof (int));
if (pint == NULL)
{
printf ("Khong du bo nho \n");
exit (1); }
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

12.7 POINTER VAØ VIEÄC ÑÒNH VÒ BOÄ


NHÔÙ ÑOÄNG
Ví duï:
clrscr();
printf ("Moi nhap 10 tri vao mang: ");
for (i = 0; i <10; i++)
scanf ("%d", &pint[i]);
for (i = 0; i <10; i++)
s += pint[i];
printf ("Tong cac phan tu cua mang la: %d \n", s);
getch();
free (pint);
}
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

12.8 MAÛNG CAÙC POINTER

Cuù phaùp khai baùo maûng caùc pointer:


kieåu * teân_maûng [Kích_thöôùc];
Ví duï: Khi khai baùo
int * pint[4];
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

12.8 MAÛNG CAÙC POINTER

Ví duï: Khi khai baùo


int * pint[4];
int a = 2, b = 3, c = 4, d = 5;
pint[0] = &a;
pint[1] = &b;
pint[2] = &c;
pint[3] = &d;
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

12.8 MAÛNG CAÙC POINTER


HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

12.8 MAÛNG CAÙC POINTER

Ví duï: Khi khai baùo

int * pint[4];
int a[3], b[3], c[3], d[3];
pint[0] = a;
pint[1] = b;
pint[2] = c;
pint[3] = d;
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

12.8 MAÛNG CAÙC POINTER


HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

12.8 MAÛNG CAÙC POINTER

Ví duï 6.43, 6.44 (SGT)

Moät maûng caùc pointer cuõng coù theå ñöôïc khôûi ñoäng
trò neáu maûng laø maûng toaøn cuïc hay maûng tónh.
Ví duï:
static char *thu[7] = {"Thu 2", "Thu 3", "Thu 4",
"Thu 5", "Thu 6", "Thu 7", "Chua nhat"};
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

12.9 POINTER CUÛA POINTER

Cuù phaùp khai baùo pointer naøy nhö sau:


kieåu ** teân_pointer
Ví duï:
int **pint;
int a[4][4];
thì pint = a; laø moät leänh hôïp leä
Thay vì truy xuaát a[i][j], ta coù theå truy xuaát *(pint
+ m*i + j), vôùi m laø soá phaàn töû treân moät haøng cuûa
maûng hai chieàu.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

12.9 POINTER CUÛA POINTER


HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

12.9 POINTER CUÛA POINTER

Ví duï :
int *m[4];
int a = 1, b = 2, c = 3, d = 4; int **pint;
pint = m;
m[0] = &a; m[1] = &b; m[2] = &c; m[3] = &d;
Thay vì truy xuaát tröïc tieáp a, b, ..., ta coù theå duøng
pointer
*(pint[i])
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

12.9 POINTER CUÛA POINTER

Ví duï: Xeùt khai baùo sau:


int ** pi;
int * pint[4];
int a[3], b[3], c[3], d[3];
pi = pint;
pint[0] = a; pint[1] = b; pint[2] = c; pint[3] = d;
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

12.9 POINTER CUÛA POINTER


HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

12.9 POINTER CUÛA POINTER

Ví duï 6.51(SGT)
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

12.10 ÑOÁI SOÁ CUÛA HAØM MAIN

C hoaøn toaøn cho pheùp vieäc nhaän ñoái soá vaøo haøm
main(), coù hai ñoái soá C ñaõ quy ñònh theo thöù töï:
int agrc: ñoái soá cho bieát soá tham soá ñaõ nhaäp, keå
caû teân chöông trình.
char *argv[]: maûng caùc pointer troû ñeán caùc chuoãi
laø tham soá ñi theo sau teân chöông trình khi chaïy
chöông trình töø DOS.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

12.10 ÑOÁI SOÁ CUÛA HAØM MAIN

Ví duï: Xeùt chöông trình ví duï sau:


#include <stdio.h>
#include <conio.h>
main (int argc, char *argv[])
{ int i;
clrscr();
printf ("Cac doi so cua chuong trinh la: \n");
printf ("Ten chuong trinh la: %s \n", argv[0]);
if ( argc >1 )
for (i = 1; i < argc; i++)
printf ("Doi so thu %d: %s \n", i, argv[i]);
getch(); }
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

12.10 ÑOÁI SOÁ CUÛA HAØM MAIN

Neáu nhaäp töø baøn phím nhö sau


C:\>thu_main tin thu 123
thì chöông trình cho xuaát lieäu laø:
Cac doi so cua chuong trinh la:
Ten chuong trinh la: C:\thu_main.exe
Doi so thu 1: tinDoi so thu 2: thu
Doi so thu 3: 123
Ví duï 6.54(SGT)
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

12.11 POINTER TROÛ ÑEÁN HAØM

Cuù phaùp khai baùo moät pointer chæ tôùi haøm:


kieåu (* teân_pointer) (kieåu_caùc_ñoái_soá);
Chuù yù:
kieåu * teân_haøm (kieåu_caùc_ñoái_soá);Haøm traû
veà pointer
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

12.11 POINTER TROÛ ÑEÁN HAØM

Ví duï:
Neáu khai baùo int (* p_function) (int, int);
vaø ñaõ coù haøm
int cong (int a, int b)
{
...
}
p_function = cong;
tong = (*p_function) (m, n);
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

12.11 POINTER TROÛ ÑEÁN HAØM

Ví duï 6.57 (SGT)


HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

12.12 ÖÙNG DUÏNG

12.12.1 Danh saùch lieân keát laø stack


12.12.2 Danh saùch lieân keát laø queue
(SGT)
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

KEÁT THUÙC CHÖÔNG 12


HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

CHÖÔNG 13
CAÙC KIEÅU DÖÕ LIEÄU COÙ CAÁU TRUÙC
VAØ KIEÅU DÖÕ LIEÄU TÖÏ ÑÒNH NGHÓA
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

CHÖÔNG 13
CAÙC KIEÅU DÖÕ LIEÄU COÙ CAÁU TRUÙC
VAØ KIEÅU DÖÕ LIEÄU TÖÏ ÑÒNH NGHÓA
13.1 Kieåu STRUCT
13.2 Kieåu UNION
13.3 Kieåu ENUM (Enumerated)
13.4 Ñònh nghóa kieåu baèng TYPEDEF
Baøi taäp cuoái chöông
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

13.1 KIEÅU STRUCT

13.1.1 Khaùi nieäm - Khai baùo struct


Struct (taïm diïch laø caáu truùc) laø moät kieåu döõ lieäu
phöùc hôïp ñöôïc taïo töø caùc kieåu döõ lieäu khaùc, caùc
kieåu döõ lieäu naøy ñöôïc söû duïng khai baùo cho caùc
bieán thaønh phaàn cuûa bieán kieåu struct.
struct teân_caáu_truùc
{
Khai baùo caùc bieán thaønh phaàn
};
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

13.1 KIEÅU STRUCT

13.1.1 Khaùi nieäm - Khai baùo struct

struct sinh_vieân
{
char ma_so[10];
char ho_ten[40];
int tuoi;
char dia_chi[80];
};
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

13.1 KIEÅU STRUCT

13.1.1 Khaùi nieäm - Khai baùo struct

Cuù phaùp cuûa moät khai baùo bieán caáu truùc gioáng nhö
khai baùo bieán bình thöôøng:
struct teân_struct teân_bieán;
Ví duï:
struct sinh_vien sv1, sv2;
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

13.1 KIEÅU STRUCT

13.1.1 Khaùi nieäm - Khai baùo struct


Ví duï:
struct sinh_vieân
{
char ma_so[10];
char ho_ten[40];
int tuoi;
char dia_chi[80];
} sv1, sv2;
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

13.1 KIEÅU STRUCT

13.1.1 Khaùi nieäm - Khai baùo struct

10 byte 40 byte 2 byte 80 byte

ma_so ho_ten tuoi dia_chi


HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

13.1 KIEÅU STRUCT

13.1.1 Khaùi nieäm - Khai baùo struct

Ví duï:
struct sinh_vien sv1 = { "4950897", "Tran van
Vinh", 21, "42 Truong Cong Dinh p.13 q.TB"};
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

13.1 KIEÅU STRUCT

13.1.1 Khaùi nieäm - Khai baùo struct

Ñeå truy xuaát moät thaønh phaàn cuûa bieán caáu truùc, C
coù toaùn töû chaám “.” ñeå laáy töøng thaønh phaàn.
Ví duï:
strcpy (sv1.ma_so, 4950897");
strcpy (sv1.ho_ten, Tran van Dinh");
sv1.tuoi = 21;
strcpy (sv1.dia_chi, "42 Truong Cong Dinh p.13 q.TB");
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

13.1 KIEÅU STRUCT

13.1.1 Khaùi nieäm - Khai baùo struct

C cho pheùp gaùn caùc caáu truùc cuøng kieåu cho nhau
qua teân bieán caáu truùc thay vì phaûi gaùn töøng thaønh
phaàn cho nhau.
Ví duï:
sv2 = sv1;
Ví duï 7.8 (SGT)
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

13.1 KIEÅU STRUCT

13.1.1 Khaùi nieäm - Khai baùo struct

Caùc thaønh phaàn cuûa bieán struct cuõng laø bieán bình
thöôøng, neân ta coù theå laáy ñòa chæ cuûa chuùng, ñòa
chæ naøy laø moät haèng pointer troû ñeán thaønh phaàn
töông öùng.
Ví duï 7.9 (SGT)
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

13.1 KIEÅU STRUCT

13.1.1 Khaùi nieäm - Khai baùo struct

Kieåu struct coù theå ñöôïc laáy kích thöôùc tính theo
byte nhôø toaùn töû sizeof, ví duï:
sizeof (struct sinh_vien);
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

13.1 KIEÅU STRUCT

13.1.2 Maûng caùc struct


Cuù phaùp khai baùo maûng caùc struct:
struct ten_cau_truc ten_mang [kich_thuoc];
Ví duï:
struct sinh_vien sv[50];
strcpy (sv[0].ho_ten, “Dang thanh Tin”);
sv[0].tuoi = 28;
Ví duï 7.12(SGT)
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

13.1 KIEÅU STRUCT

13.1.3 Pointer tôùi moät struct


Cuù phaùp khai baùo bieán pointer naøy nhö sau:
struct teân_caáu_truùc *teân_pointer;
Ví duï :
struct sinh_vien a, *psv;
psv =&a;
hoaëc
struct sinh_vien sv[20], *psv;
psv =sv;
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

13.1 KIEÅU STRUCT

13.1.3 Pointer tôùi moät struct


Vieäc truy xuaát ñeán moät thaønh phaàn cuûa moät caáu
truùc thoâng qua moät pointer ñöôïc thöïc hieän baèng
toaùn töû laáy thaønh phaàn cuûa ñoái töôïng cuûa pointer,
kyù hieäu laø -> (coù theå goïi laø toaùn töû muõi teân).
Ví duï:
printf ("Ho ten sinh vien: %s \n", psv -> ho_ten);
hay
printf ("Ho ten sinh vien: %s \n", (*psv).ho_ten);
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

13.1 KIEÅU STRUCT

13.1.3 Pointer tôùi moät struct


Ví duï 7.16 (SGT)
C laïi cho pheùp khai baùo struct maø trong caùc thaønh
phaàn cuûa noù laïi coù caùc pointer chæ ñeán moät caáu
truùc cuøng kieåu. Ví duï:
struct node
{
char message[81];
struct node * };
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

13.1 KIEÅU STRUCT


13.1.4 Struct daïng field
C cho pheùp ta khai baùo caùc thaønh phaàn cuûa struct
theo bit hoaëc moät nhoùm bit. Moät thaønh phaàn nhö
vaäy ñöôïc goïi laø moät field (taïm dòch laø vuøng).
struct teân_caáu_truùc
{
kieåu teân_vuøng 1: soá_bit1;
kieåu teân_vuøng 2:soá_bit2;
...
} teân_bieán;
Vôùi kieåu chæ coù theå laø unsigned, signed hoaëc int
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

13.1 KIEÅU STRUCT


13.1.4 Struct daïng field
Ví duï:
struct date
{
unsigned day: 5;
unsigned month: 4;
unsigned year: 6;
int: 0;
} ngay;
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

13.1 KIEÅU STRUCT


13.1.4 Struct daïng field
Chuù yù:
-Moãi vuøng chæ coù theå daøi toái ña 16 bit (moät
int) vaø ñöôïc caáp choã trong moät int, chöù khoâng theå
naèm treân hai int khaùc nhau ñöôïc.
-Söï phaân boá bit cho caùc field trong moät int
cuûa struct (töø traùi sang phaûi hay ngöôïc laïi), khoâng
phaân bieät ñöôïc.
-Moïi thao taùc thöïc hieän treân bieán kieåu field
coù lieân quan ñeán ñòa chæ ñeàu khoâng ñöôïc thöïc hieän
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

13.1 KIEÅU STRUCT


13.1.4 Struct daïng field
Ví duï:
Khi khai baùo
struct vi_du
{ unsigned field1: 7;
unsigned field2: 5;
unsigned field3: 2;
unsigned field4: 6;
unsigned field5: 7; } vd;
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

13.1 KIEÅU STRUCT


13.1.4 Struct daïng field
Ví duï:
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

13.2 KIEÅU UNION


Trong ngoân ngöõ C coù kieåu döõ lieäu union (taïm dòch
laø kieåu hôïp nhaát), ñaây laø moät kieåu döõ lieäu ñaëc bieät
maø neáu ñöôïc khai baùo thì öùng vôùi moät vuøng nhôù,
giaù trò ôû moãi thôøi ñieåm khaùc nhau thì coù theå coù
kieåu khaùc nhau tuøy vaøo vieäc söû duïng bieán thaønh
phaàn trong noù.
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

13.2 KIEÅU UNION


Ví duï:
Coù khai baùo union nhö sau:
union thu
{
char c;
int i;
float f;
double d;
};
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

13.2 KIEÅU UNION


Khai baùo bieán kieåu union:
union teân_union
{
khai_baùo_bieán_thaønh_phaàn
} bieán, bieán [,...];
hoaëc
union teân_union bieán, bieán [...];
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

13.2 KIEÅU UNION


Ví duï:
union thu
{ char c;
int i;
float f;
double d;
} a, b;
hoaëc
union thu a, b;
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

13.2 KIEÅU UNION


Ñeå truy xuaát ñeán moät bieán thaønh phaàn cuûa bieán
thuoäc kieåu uinion, ta cuõng duøng toaùn töû chaám “.”.
Ví duï:
unoin thu a;
a.c = 'a';
Ta coù theå khai baùo moät bieán pointer chæ ñeán moät
bieán kieåu union. Ví duï:
union thu *pthu, a;
pthu = &a;
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

13.2 KIEÅU UNION


Vieäc truy xuaát ñeán moät thaønh phaàn cuûa union qua
pointer cuõng ñöôïc thöïc hieän baèng toaùn töû muõi teân,
ñeå laáy thaønh phaàn cuûa union ñang ñöôïc pointer
chæ ñeán.
Ví duï:
pthu->c = 'A';
Ví duï 7.30 (SGT)
Kieåu union coù theå ñöôïc laáy kích thöôùc tính theo
byte qua toaùn töû sizeof, ví duï: sizeof (union thu);
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

13.3 KIEÅU ENUM (ENUMERATED)

13.4 ÑÒNH NGHÓA KIEÅU BAÈNG


TYPEDEF
HEÄ THOÁNG MAÙY TÍNH VAØ NGOÂN
NGÖÕ C

KEÁT THUÙC CHÖÔNG 13

You might also like