Download as pdf or txt
Download as pdf or txt
You are on page 1of 95

i hc quc gia h ni

khoa cng ngh












gio trnh tin hc c s
phn lp trnh trn ngn ng C
v b duy







h ni thng 1 nm 2003
Gio trnh tin hc c s II - Ngn ng C
2

Bn c trn mng ca i hc Quc gia H Ni c php
c, in v download ti liu ny t th vin in t ca Khoa
Cng ngh v s dng nhng khng c php s dng vi mc
ch v li.

Bn quyn thuc nhm tc gi thc hin chng trnh Tin
hc c s

y l phin bn u tin, c th cn nhiu sai st. Chung ti
mong nhn c kin ng gp ca bn c. Cc kin gi v
theo a ch dkquoc@vnu.edu.vn hoc dkquoc@ahoo.com .

Cm n bn c ng gp hon thin gio trnh.

Thay mt cc tc gi

o Kin Quc
Gio trnh tin hc c s II - Ngn ng C
3
MC LC

I. M U.......................................................................................................................................4
I.1. Bng ch ci, tn v t kho..............................................................................................4
I.2.Cc bc lp trnh gii bi ton .........................................................................................5
II. BIN, HNG V CC KIU D LIU TRONG C................................................................8
II.1.Bin ......................................................................................................................................8
II.2. Hng.................................................................................................................................. 10
II.3. Cc kiu d liu chun n gin trong C...................................................................... 11
II.4. Biu thc v cc php ton............................................................................................. 13
III. CHNG TRNH C............................................................................................................. 26
III.1.Cu trc chng trnh.................................................................................................... 27
III.2.Cu lnh v dng ch thch............................................................................................ 31
III.3.Nhp v xut d liu....................................................................................................... 33
IV - CC CU TRC IU KHIN CHNG TRNH ......................................................... 41
IV. Cu trc tun t...................................................................................................................................... 41
IV.2.Cu trc r nhnh................................................................................................................................ 42
IV.3.Cu trc switch ..................................................................................................................................... 46
IV.4.Cu trc while........................................................................................................................................ 48
IV.5.Cu trc do .. while ........................................................................................................................... 53
IV.6.Cu trc for ............................................................................................................................................ 57
IV.7.Cu lnh continue v break.............................................................................................................. 63
V - MNG V CON TR............................................................................................................. 65
V.1. Khi nim Mng ............................................................................................................... 65
V.2. Mng 1 chiu..................................................................................................................... 65
V.3 - Mng 2 chiu................................................................................................................... 74
V.4 - Con tr v mng ............................................................................................................ 79
VI CC VN C BN V HM........................................................................................ 88
VI.1 - Nguyn mu (prototype) hm...................................................................................... 88
VI.2 - nh ngha hm............................................................................................................ 89
VI.3 - Li gi hm v truyn tham s................................................................................... 90
TI LIU THAM KHO............................................................................................................. 95
Gio trnh tin hc c s II - Ngn ng C
4

I. M u
C l ngn ng lp trnh c thit k bi Dennis Ritchie ti phng th nghim Bell
Telephone nm 1972. N c vit vi mc tiu chnh l xy dng h iu hnh UNIX.
V th ban u n khng hng ti s tin dng cho ngi lp trnh. C c pht trin t
mt ngn ng lp trnh c tn l B (B l ngn ng lp trnh c vit bi Ken Thompson
ti Bell Labs, v tn ngn ng ly theo tn ca Bell Labs).
C l ngn ng mnh v mm do, linh hot, n nhanh chng tr thnh ngn ng ph
bin khng ch trong phm vi ca Bell, C c cc lp trnh vin s dng vit nhiu loi
ng dng cc mc khc nhau.
Cng v n c dng nhiu ni nn xut hin nhng c im khc nhau, cc phin
bn pht trin khng thng nht. gii quyt vn ny, nm 1983 Vin tiu chun M
(ANSI) thnh lp mt chun cho C v c tn ANSI C (ANSI standard C). Ni chung
cc chng trnh dch C ngy nay u tun theo chun ny ngoi tr mt s khc bit nh.
Hin nay c rt nhiu ngn ng lp trnh bc cao nh C, Pascal, BASIC,.. mi ngn
ng u c im mnh ring ca n v ph hp cho mt s lnh vc no , C cng
khng ngoi l, C c ph bin bi n c cc c im sau:
C l ngn ng mnh v mm do. C th ni rng s hn ch ca C ch ph thuc
vo ngi lp trnh, tc l vi C bn c th lm tt c nhng iu theo tng ca bn. C
c dng cho nhng d n t nh ti ln nh: H iu hnh, ho, Chng trnh
dch,...
C d chuyn i sang h h thng khc (tnh kh chuyn), tc l mt chng trnh
C c vit trn h thng ny c th d dng dch li chy c trn h thng khc
C l ngn ng c ng, s lng t kho khng nhiu.
C l ngn ng lp trnh cu trc. M lnh ca chng trnh C c vit thnh cc
hm, cc hm ny c th s dng li trong cc ng dng khc.
Vi cc c im trn C l ngn ng tt cho vic hc lp trnh, hn na sau ny
chng ta cn c th tip cn vi lp trnh hng i tng, v mt trong nhng ngn ng
lp trnh chng ta la chn u tin cho lp trnh hng i tng l C++, nhng kin
thc v C vn c ch cho bn v C++ l ngn ng c pht trin t C v b sung c tnh
hng i tng.
I.1. Bng ch ci, tn v t kho
Bng ch ci: Mi ngn ng lp trnh u c xy dng t mt b k t no
v cc quy tc trn xy dng cc t, cc cu lnh v cu trc chng trnh. Ngn
ng lp trnh C s dng b k t ASCII (American Standard Code for Informations
Interchange). Theo chun ny, b k t gm c 256 k t l:
Gio trnh tin hc c s II - Ngn ng C
5
- Cc ch ci: A,..,Z, a,..,z
- Cc ch s: 0,..,9
- Cc du php ton s hc: +,-,*,/,...
- Cc du ngoc: (, ), [, ],...
- Cc k t khc
Mi k t c tng ng 1 s duy nht gi l m, trong c 128 k t u (c m t 0 ti
127) l k t c nh v 128 k t cn li (c m t 128 ti 255) l cc k t m rng, tc
l n c th thay i tu theo ngn ng mi quc gia s dng.
T kho v tn: Tn l mt xu (dy) cc k t, trong ngn ng lp trnh ni chung
u yu cu tn phi tun theo nhng rng buc nht nh.
Vi C tn l xu k t ch c th gm
- cc ch ci
- ch s
- du gch ni
Tn phi bt u bng ch ci hoc du gch di, di khng qu 32 k t, khng c
trng vi t kho ca ngn ng. V v C phn bit ch hoa v ch thng nn cc tn ch
hoa nh XY v xy l khc nhau.
Mi ngn ng u c ring mt tp cc t vi ngha c bit l cc t kho,
chng c dng vi mc ch nh trc nh tn kiu d liu, tn ton t,..
Sau y l mt s t kho ca C

asm enum signed
auto extern sizeof
break float static
case for struct
char goto switch
const if typedef
continue int union
default long unsigned
do register void
double return volatile
else short while

I.2.Cc bc lp trnh gii bi ton
gii mt bi d mc no th bc u tin chng ta cng phi pht biu bi ton,
tc l chng ta phi hiu bi ton yu cu g th mi c th tm c thut gii, v ci t
thut ton v sau khi c chng trnh bn phi chy kim nghim tnh ng n
ca n.
Nh vy gii bi ton bng chng trnh chng ta theo cc bc sau:
1. Xc nh i tng ca chng trnh
Gio trnh tin hc c s II - Ngn ng C
6
2. Xc nh phng php v thut gii
3. Vit chng trnh (lp trnh)
4. Chy chng trnh v kim tra kt qu.
c mt chng trnh chng ta cn phi vit cc lnh (lp trnh) trong mt ngn
ng lp trnh no , nh C chng hn, nhng my tnh khng chy trc tip c chng
trnh vit bng cc ngn ng lp trnh bc cao (gi l chng trnh ngun), n ch c th
thc hin c cc chng trnh dng m my (chng trnh ch). V vy sau khi c
chng trnh ngun, chng ta cn thc hin chuyn chng trnh ngun thnh chng
trnh ch, cng vic ny chng ta cn n trnh bin dch (compiler) v lin kt (linker).
Nh vy ta thy chu trnh pht trin mt chng trnh nh sau:
1. Son tho chng trnh ngun
Chng ta c th s dng mt trnh son tho vn bn chun (ASCII) no son
tho chng trnh, sau ghi vo file chng trnh ngun (ngm nh vi phn m rng
l .C).
Do C cng nh hu ht cc ngn ng lp trnh ph bin u s dng bng ch ci
ASCII nn bn c th s dng bt k mt h son tho vn bn chun vit chng
trnh, tuy nhin hu ht cc trnh bin dch ca C trn mi trng MS-DOS hoc
WINDOWS u c tch hp trnh son tho v bn nn s dng trnh son tho tch hp
ny s thun li hn.
2. Bin dch chng trnh ngun
Hin nay c rt nhiu chng trnh dch cho C nh: Turbo C, BC, Microsoft C,.. mc
ch ca bc ny l chuyn chng trnh ngun thnh chng trnh m i tng
(object). Sau bc ny (nu thnh cng) chng ta thu c file chng trnh i tng
(c phn m rng l .OBJ)
3. Lin kt chng trnh
Sau bc bin dch hon thnh ta c chng trnh i tng, y cha phi l chng
trnh c th chy c trn my tnh, bc ny chng ta phi s dng mt trnh lin kt
lin kt cc hm th vin vi chng trnh i tng to ra chng trnh ch . Bn c
th s dng trnh lin kt c lp no , nhng vi cc trnh bin dch ca C trn mi
trng DOS hay WINDOWS u c sn trnh lin kt.
4. Chy v kim tra kt qu chng trnh
Khi c chng trnh ch, chng ta cn phi kim tra tnh ng n ca n. bn
chy chng trnh vi cc b d liu mu v kim tra kt qu c nh d kin hay khng,
nu c sai st th phi xc nh nguyn nhn gy li v quay li bc 1 hiu chnh. v
chng ta lp li qu trnh ny cho ti khi c chng trnh gii ng bi ton mong i.

Gio trnh tin hc c s II - Ngn ng C
7

Hnh 1 Cc bc pht trin chng trnh
Hin nay c rt nhiu chng trnh dch cho C v hu ht (trn nn DOS hoc Windows)
trong c tch hp c trnh son tho, bin dch, lin kt - gi l mi trng tch hp.
Trong gio trnh ny chng ta s dng BC (Borland C) hoc turbo C lm mi trng lp
trnh.
Gio trnh tin hc c s II - Ngn ng C
8
II. Bin, hng v cc kiu d liu trong C
II.1.Bin
Khi nim
Bin l i lng c gi tr thuc mt kiu d liu no m c chp nhn bi
ngn ng (xem phn cc kiu d liu), gi tr ca bin c th thay i trong thi gian tn
ti ca bin (hay ta ni trong vng i ca bin).
Cc thnh phn ca chng trnh s c lu trong b nh trong v bin cng khng
ngoi l. Tc l bin cng c cp pht mt vng nh lu gi gi tr thuc mt kiu
d liu xc nh. V th theo mt kha cnh no c th ni bin l mt ci tn i din
cho nh trong my tnh, chng trnh c th truy xut nh (ly hoc ghi gi tr) thng
qua tn bin.
Mt bin ni chung phi c cc c trng sau:
- Tn bin
- Kiu d liu: kiu ca bin
- Gi tr hin ti n ang lu gi (gi tr ca bin)
( tuy nhin sau ny chng ta thy trong C c bin kiu void, ban u coi y l bin
khng kiu nhng dn quan nim cng l 1 tn kiu v l kiu khng xc nh)
Tn bin
Trong C cng nh cc ngn ng lp trnh khc cc bin u phi c tn, cc tn bin
hay ni chung l tn (gm tn bin, tn hng, tn hm, hoc t kho) l mt xu k t v
phi tun theo cc quy nh ca ngn ng l:
Tn ch c th cha k t l ch ci (a ,..,z; A,..,Z); ch s( 0,..,9) v k
t gch di (_), s k t khng qu 32.
K t u tin ca tn phi l ch ci hoc k t gch di
Trong tn phn bit ch hoa v ch thng. Tc l hai xu cng cc k t nhng
khc nhau bi loi ch hoa hoc ch thng l hai tn khc nhau, v d nh vi 2 xu k
t AB v Ab l hai tn hon ton phn bit nhau.
Cc t kho ca ngn ng khng c dng lm tn bin, tn hng, hay tn hm.
Hay ni khc i, trong chng trnh c th bn phi dng n tn, tn ny do bn t theo
tng ca bn nhng khng c trng vi cc t kho.
V d cc tn hp l v khng hp l

Tn bin hp l / khng hp l
Percent hp l
Gio trnh tin hc c s II - Ngn ng C
9
y2x5__fg7h hp l
ho_ten hp l
_1990_tax hp l
A hp l
ngay-sinh khng hp l v c k t -(du tr)
double khng hp l v trng vi t kho
9winter khng hp l v k t u tin l s
Cu lnh nh ngha bin
Trong ngn ng lp trnh c cu trc ni chung v trong C ni ring, mi bin u
phi c nh ngha trc khi s dng. Cu lnh nh ngha bin bo cho chng trnh
dch bit cc thng tin tn, kiu d liu v c th c gi tr khi u ca bin.
C php khai bo bin :
<kiu_d_liu> <bin_1> [ = <gi_tr_1>] [, <bin_2>[ = <gi_tr_2>,..];
trong :
<kiu_d_liu> l tn mt kiu d liu tn ti, c th l tn kiu d liu
chun hoc kiu d liu nh ngha bi ngi lp trnh.
<bin_1>, <bin_2> l cc tn bin cn khai bo, cc tn ny phi tun theo quy
tc v tn ca ngn ng.
<gi_tri_1>, <gi_tr_2> l cc gi tr khi u cho cc bin tng ng <bin_1>,
<bin_2>. Cc thnh phn ny l tu chn, nu c th gi tr ny phi ph hp vi kiu
ca bin.
Trn mt dng lnh nh ngha c th khai bo nhiu bin cng kiu, vi tn l
<bin_1>, <bin_2>,.. cc bin cch nhau bi du phy (,) dng khai bo kt thc bng
du chm phy (;).
V d:
int a = 4, b = 6;
float x =4.5,y,z;
unsigned u ;
char c =A;
Khi gp cc lnh nh ngha bin, chng trnh dch s cp pht vng nh c kch
thc ph hp vi kiu d liu ca bin, nu c thnh phn khi u th s gn gi tr
khi u vo vng nh .

Gio trnh tin hc c s II - Ngn ng C
10
II.2. Hng
Khi nim
Hng l i lng c gi tr thuc mt kiu d liu nht nh, nhng gi tr ca hng
khng th thay i trong thi gian tn ti ca n.
C hai loi hng mt l cc hng khng c tn (chng ta s gi l hng thng) l
cc gi tr c th tc thi nh : 8, hay 9.5 hoc d.
Loi th hai l cc hng c tn ( gi l hng k hiu). Cc hng k hiu cng phi
nh ngha trc khi s dng, tn ca hng c t theo quy tc ca tn. Sau y nu
khng c iu g c bit th chng ta gi chung l hng
nh ngha hng
Cc hng c nh ngha bng t kho const vi c php nh sau:
const <kiu_d_liu> <tn_hng> = <gi_tr>;
hoc const <tn_hng> = <gi_tr>;
Trong dng th hai, chng trnh dch t ng n nh kiu ca hng l kiu ngm
nh, vi BC hay TC l int v nh vy chng trnh dch s t ng chuyn kiu ca
<gi_tr> v kiu int.
V d:
const int a = 5; // nh ngha hng a kiu nguyn, c gi tr l 5
const float x = 4; // hng x kiu thc, c gi tr l 4.0
const d = 7; // hng d kiu int, gi tr l 7
const c = 1; // hng c kiu int gi tr = 49
const char * s = Ngon ngu C;// s l hng con tr, tr ti xu Ngo ngu C
Cc hng s trong C c ngm hiu l h 10, nhng bn c th vit cc hng trong
h 16 hoc 8 bng c php, gi tr s h 16 c bt u bng 0x, v d nh 0x24, 0xA1
cc s h 8 bt u bi s 0, v d 025, 057.
Cc hng k t c vit trong cp du v d a, 2 cc gi tr ny c C hiu l
s nguyn c gi tr bng m ca k t; a c gi tr l 97, B c gi tr bng 66.
Cc xu k t l dy cc k t c vit trong cp , v d Ngon ngu C, a (xu k
t s c gii thiu trong phn sau)
Ch : Cc bin, hng c th c nh ngha ngoi mi hm, trong hm hoc trong
mt khi lnh. Vi C chun th khi nh ngha bin, hng trong mt khi th dng nh
ngha phi cc dng u tin ca khi, tc l trc tt c cc lnh khc ca khi,
nhng trong C++ bn c th t dng nh ngha bt k v tr no.

Gio trnh tin hc c s II - Ngn ng C
11
II.3. Cc kiu d liu chun n gin trong C
Mt trong mc ch ca cc chng trnh l x l, bin i thng tin, cc thng tin
cn x l phi c biu din theo mt cu trc xc nh no ta gi l cc kiu d liu.
Cc kiu d liu ny c quy nh bi ngn ng lp trnh, hay ni khc i mi ngn ng
c tp cc kiu d liu khc nhau. Khng hon ton ging nh khi nim kiu d liu
trong ton hc, trong cc ngn ng lp trnh ni chung mi kiu d liu ch biu din
c mt min gi xc nh no . Chng hn nh s nguyn chng ta hiu l cc s
nguyn t - ti +, nhng trong ngn ng lp trnh min cc gi tr ny b gii hn, s
gii hn ny ph thuc vo kch thc ca vng nh biu din s . V vy khi ni ti
mt kiu d liu chng ta phi cp ti 3 thng tin c trng ca n l:
- tn kiu d liu
- kch thc vng nh biu din n,min gi tr
- cc php ton c th s dng.
Cc kiu d liu n gin trong C ch l cc kiu s, thuc hai nhm chnh l s
nguyn v s thc (s du phy ng).
Nhm cc kiu nguyn gm c: char, unsigned char, int, unsigned int, short, unsigned
short, long, unsigned long c m t trong bng sau:

Kiu d liu
tn kiu (t
kho tn kiu)
kch
thc
min gi tr
k t c du char 1 byte t -128 ti 127
k t khng du unsigned char 1 byte t 0 ti 255
s nguyn c du int 2 byte t -32768 ti 32767
s nguyn khng du unsigned int 2 byte t 0 ti 65535
s nguyn ngn c du short 2 byte t -32768 ti 32767
s nguyn ngn c du unsigned short 2 byte t 0 ti 65535
s nguyn di c du long 4 byte t -2,147,483,648 ti 2,147,438,647
s nguyn di khng du unsigned long 4 byte t 0 ti 4,294,967,295

Khun dng s nguyn: mc d nh trn chng ta c kiu s nguyn v k t (char)
nhng bn cht trong C chng u l cc s nguyn m thi. H thng biu din cc s
nguyn di dng dy cc bit (s nh phn). Nh chng ta bit, mt bit ch c th biu
din c 2 gi tr l 0 v 1.
Ta thy vi mt nhm c 2 bit (2 s nh phn) th c th lu c gi tr nh nht khi
c 2 bit u bng 0 v ln nht khi c 2 bit bng 1 c ngha l n c th biu din c
cc s 0,1,2,3 tc 2
2
gi tr khc nhau. Vi s nguyn 1 byte (unsigned char) th gi tr n
c th lu tr l 0,1,..,255.
Tng qut nu kiu d liu c kch thc n bit th c th biu din 2
n
gi tr khc
nhau l: 0,1,..(2
n
1).
Gio trnh tin hc c s II - Ngn ng C
12

Nhng l trong trng hp tt c cc bit dng biu din gi tr s(cc con s),
tc l ta c s nguyn khng du (s dng unsigned ). Nhng s nguyn chng ta cn
c th l s m (s c du signed), trong trng hp ny bit cao nht c dng biu
din du, nh vy ch cn n-1 bit biu din gi tr. Nu s m (c du) th bit du c
gi tr =1, ngc li, nu s c gi tr dng th bit du c gi tr =0.

V d vi kiu char (signed char) mt byte th c 7 bit biu din cc con s, vy n
c th biu din cc s dng 0,1,..,127 v (theo cch biu din s m xem phn h m
v biu din s m) n biu din c cc s m 1,..-128. Min gi tr ca cc kiu s
nguyn khc c din gii tng t.
Cc bn c th t cu hi ti sao c kiu int li vn c kiu short hay c s khc
nhau gia int v short hay khng?. Thc ra s khc nhau gia chng ph thuc vo h
thng m bn dng. Trn mi trng 32 bit th int c kch thc l 4 byte, short c kch
thc 2 byte, cn trn mi trng 16 bit th chng ging nhau.
Thc ra s quy nh kch thc ca cc kiu nguyn ch l:
kiu char kch thc l 1 byte
kiu short kch thc l 2 byte
kiu long kch thc l 4 byte
kch thc kiu short <= kch thc kiu int <= kch thc kiu long
Nhm cc kiu s thc gm: float, double, long double
Khun dng biu din ca s thc khng ging nh s nguyn. Mt s thc ni chung
c biu din theo k php khoa hc gm phn nh tr v phn m.

Trong gio trnh ny chng ti khng c nh trnh by chi tit nh dng ca s
thc. Bn c cn quan tm ti vn ny hy tham kho [3 - Chng 14]. Chnh v
Gio trnh tin hc c s II - Ngn ng C
13
khun dng khc m min gi tr ca s thc so vi s nguyn c cng kch thc cng
khc.

Kiu d liu tn kiu
kch
thc
(tr tuyt i)min gi tr
s thc vi chnh xc n float 4 byte 3.4e-38 -> 3.4e38
s thc vi chnh xc kp double 8 byte 1.7e-308 -> 1.7e308
s thc di vi chnh xc kp long double 10 byte 3.4e-4832 -> 1.1e 4932
Trong bng trn min gii tr chng ta ni ti gi tr dng ln nht m s thc c th
biu din (gi tr m nh nht ly i) v gi tr dng nh nht cn phn bit c vi 0.
V d vi kiu float, gi tr dng ln nht l 3.4e38 =3.4*10
38
v s dng nh nht
c th biu din l 3.4e-38 = 3.4*10
-38
.
Tuy nhin, do s ch s trong phn nh tr l gii hn nn s ch s ng tin cy
(hay ta ni l s ch s c ngha) cng gii hn vi kiu float l 7-8 ch s, double l 15
ch s, v long double l 18-19 ch s.
Kiu con tr v a ch
Ngoi hai kiu d liu s m chng ta va cp trong C cn kiu d liu rt hay s
dng l kiu con tr. Chng ta bit l cc thnh phn: bin, hng, hm,.. c lu
trong b nh, tc l chng c nh v ti mt vng nh c c xc nh. Mt thnh
phn (bin, hng) c th lu gi tr l a ch ca mt thnh phn khc c gi l con tr.
Gi s p l mt con tr lu a ch ca a th ta ni p tr ti a v kiu ca con tr p l
kiu ca thnh phn m p tr ti.
Khai bo con tr
<kiu> * <tn_con_tr>; // khai bo bin con tr
V d:
int * p,*q; // p, q l 2 con tr kiu int
Kiu void : Ngoi cc kiu d liu trong C cn c nhng thnh phn (con tr) khng xc
nh kiu, hoc hm khng cn tr v gi tr trong trng hp ny chng ta c con tr,
hm kiu void. Hay ni cc khc void l mt kiu nhng l kiu khng xc nh.

II.4. Biu thc v cc php ton
Biu thc
Gio trnh tin hc c s II - Ngn ng C
14
Biu thc l s kt hp gia cc ton hng v ton t theo mt cch ph hp din
t mt cng thc ton hc no . Cc ton hng c th l hng, bin, hay li gi hm
hay mt biu thc con. Cc ton t thuc vo tp cc ton t m ngn ng h tr.
Biu thc c pht biu nh sau:
Cc hng, bin, li gi hm l biu thc
Nu A, B l biu thc v l mt php ton hai ngi ph hp gia A v B
th AB l biu thc.
Ch nhng thnh phn xy dng t hai kh nng trn l biu thc.
Mt biu thc phi c th c lng c v tr v gi tr thuc mt kiu d liu c
th. Gi tr c gi l gi tr ca biu thc v kiu ca gi tr tr v c gi l kiu
ca biu thc, v d mt biu thc sau khi c lng tr li mt s nguyn th chng ta
ni biu thc c kiu nguyn (ni ngn gn l biu thc nguyn).
V d : p = (a+b+c)/2;
s = sqrt((p-a)*(p-b)*p-c));
trong a, b, c l 3 bin s thc.
Biu thc logic trong C: theo nh trn chng ta ni th biu thc logic l biu thc m
tr v kt qu kiu logic. Nhng trong ngn ng lp trnh C khng c kiu d liu ny
(nh boolean trong Pascal). Trong C s dng cc s din t cc gi tr logic (ng
hay sai). Mt gi tr khc 0 nu c dng trong ng cnh l gi tr logic s c coi l
ng v nu gi tr bng 0 c xem l sai. Ngc li mt gi tr sai(chng hn nh
gi tr ca biu thc so snh sai (5==3)) s tr li s nguyn c gi tr 0, v gi tr ca biu
thc (v d nh 5 < 8) ng s tr li mt s nguyn c gi tr 1. Sau ny chng ta cn
thy khng phi ch c cc s c dng din t gi tr ng hay sai m mt con
tr c gi tr khc NULL (rng) cng c coi l ng, v gi tr NULL c xem l
sai.

Cc ton t (php ton) ca ngn ng C
a. Php gn
C php
<bin> = <gi tr>
Trong v tri l tn mt bin v v phi l mt biu thc c kiu ph hp vi kiu
ca bin. Vi php gn h thng s c lng gi tr ca v phi sau gn gi tr vo
bin bn tri.
V d:
int a, b;
a = 5;
b = a +15;
Gio trnh tin hc c s II - Ngn ng C
15
S ph hp kiu gia v bn phi v bn tri c hiu l hoc hai v cng kiu hoc
kiu ca biu thc bn phi c th c chuyn t ng (p kiu) v kiu ca bin bn
tri theo quy tc chuyn kiu t ng ca ngn ng C l t thp ti cao:
char int long double.
Tuy nhin trong thc t s p kiu ph thuc vo chng trnh dch, mt s chng
trnh dch cho php t chuyn cc kiu s bn phi v kiu ca v tri bng m khng cn
phi tun theo quy tc trn, bng cch ct b phn khng ph hp. V d bn c th gn
bn phi l s thc (float) vo v tri l mt bin nguyn (int), trng hp ny chng
trnh dch s ct b phn thp phn v cc byte cao, nhng kt qu c th khng nh bn
mong mun.
Vi C chng ta c th thc hin gn mt gi tr cho nhiu bin theo c php:
<bin_1>=<bin_2> = ,..=<gi_tr>
vi lnh trn s ln lt gn <gi_tr> cho cc bin t phi qua tri.
b. Cc php ton s hc

php ton c php ngha
+ <th_1> + <th_2>
php cng gia <th_1> v <th_2>l s thc
hoc nguyn
- <th_1> - <th_2>
php tr gia <th_1> v <th_2>l s thc
hoc nguyn
* <th_1> * <th_2>
php nhn gia <th_1> v <th_2>l s thc
hoc nguyn
/ <th_1> / <th_2>
php chia ly phn nguyn gia <th_1> v
<th_2>l s nguyn.
v d 9/2 kt qu l 4
/ <th_1> / <th_2>
php chia gia <th_1> v <th_2>l s thc
v d 9.0/2.0 kt qu l 4.5
% <th_1> % <th_2>
php chia ly phn d gia <th_1> v
<th_2>l s nguyn
v d 15 % 4 = 3; 12%3 =0
Trong cc php ton s hc ni trn, khi hai ton hng cng kiu th kt qu l s c kiu
chung . Nu hai ton hng khng cng kiu (tr %) th ton hng c kiu nh hn s
c t ng chuyn v kiu ca ton hng cn li, y cng l kiu ca kt qu.

Gio trnh tin hc c s II - Ngn ng C
16



c. Cc php ton so snh (quan h)
php
ton
c php ngha
= = th_1 == th_2
so snh bng, kt qu ng nu 2 ton
hng bng nhau, ngc li tr li sai.
!= th_1> != th_2
so snh khc nhau, kt qu ng nu 2
ton hng khc nhau, ngc li tr li sai.
> th_1 > th_2
so snh ln hn, kt qu ng nu ton
hng th nht ln hn, ngc li tr li
sai.
>= th_1 >= th_2
so snh ln hn hoc bng, kt qu ng
nu ton hng th nht ln hn hay bng
ton hng th 2, ngc li tr li sai.
< th_1 < th_2 so snh nh hn, ngc ca >=
<= th_1 <= th_2 so snh nh hn hoc bng, ngc vi >
Trong phn cc kiu d liu chng ta khng c kiu d liu tng t nh boolean
trong Pascal biu din cc gi tr logic (true, false). Vy kt qu cc php ton so snh
m chng ta thu c ng, sai l g? Ngn ng C dng cc s biu th gi tr
ng hay sai. Mt s c gi tr bng 0 nu dng vi ngha l gi tr logic th c
xem l sai ngc li nu n khc 0 c xem l ng. Thc s th cc php so snh
trn cng u tr v gi tr l s nguyn, nu biu thc so snh l sai s c kt qu = 0,
ngc li nu biu thc so snh l ng ta thu c kt qu = 1.
V d:
5 > 2 tr li gi tr = 1
5 <= 4 tr li gi tr = 0
a!=b tr li gi tr = 1
d. Cc php ton logic
Php ton ! (ph nh):
C php:
! <ton_hng>
Gio trnh tin hc c s II - Ngn ng C
17
vi <ton_hng> l biu thc s nguyn hoc thc, nu <ton_hng> c gi tr khc 0
th kt qu s =0 v ngc li, nu <ton_hng> ==0 th kt qu s = 1.
Php ton && (php hi - and):
C php:
<ton_hng_1> && <ton_hng_2>
trong 2 ton hng l cc biu thc s, kt qu ca php ton ny ch ng (!=0)
khi v ch khi c 2 ton hng u c gi tr ng (!=0).

<ton_hng_1> <ton_hng_2> <ton_hng_1> && <ton_hng_2>
0 0 0
0 khc 0 0
khc 0 0 0
khc 0 khc 0 1
Php ton || (php tuyn - or):
C php:
<ton_hng_1> || <ton_hng_2>
trong 2 ton hng l cc biu thc s, kt qu ca php ton ny ch sai (0) khi v
ch khi c 2 ton hng u c gi tr sai (=0).

<ton_hng_1> <ton_hng_2> <ton_hng_1> || <ton_hng_2>
0 0 0
0 khc 0 1
khc 0 0 1
khc 0 khc 0 1

e. Cc php ton thao tc trn bit
Trong ngn ng C c nhm cc ton t m thao tc ca n thc hin trn tng bit ca
cc ton hng v chng c gi l cc ton t trn bit, cc ton hng ca chng phi c
kiu s nguyn.
Php & (php and theo bit - php hi)
C php: <ton_hng_1> & <ton_hng_2>
Gio trnh tin hc c s II - Ngn ng C
18
Chc nng ca ton t & l thc hin php and trn tng cp bit tng ng ca 2 ton
hng v tr v kt qu. Tc l php ton tr v 1 s nguyn (cng kch thc vi 2 ton
hng), bit th nht ca kt qu c gi tr bng bit th nht ca <ton_hng_1> hi vi bit
th nht ca <ton_hng_2>,...


Bng gi tr chn l ca &

V d int a,b, c;
1. nu a=7; b = 14; c = a & b;
th c = 6;
2. nu a= 2; b = 15; c = a & b;
th c = 0;
3. nu a=-2; b = 45; c = a & b;
th c = 44;
4. nu a=-2; b = -3; c = a & b;
th c = -4;
(nu kt qu cc v d trn gy thc mc ti sao li nh vy th bn c c th tham
kho: cch biu din s m, php AND trong phn hp ng)
Php | (php or theo bit)
C php
<ton_hng_1> | <ton_hng_2>
Kt qu ca tr v 1 s nguyn (cng kch thc vi 2 ton hng), cc bit ca gi tr
tr v c tnh bng kt qu ca php tuyn (or) gia hai bit tng ng ca
<ton_hng_1> vi <ton_hng_2>.

Gio trnh tin hc c s II - Ngn ng C
19

Bng gi tr chn l php tuyn |

V d int a,b, c;
1. nu a=7; b = 14; c = a | b;
th kt qu c = 15;
2. nu a= 2; b = 15; c = a | b =15;
Php ~ (php o bit)
y l ton t mt ngi thc hin o cc bit ca ton hng, cc bt gi tr 1 tr thnh 0
v bt gi tr 0 thnh 1.
C php ~<ton_hng>
V d: 1. unsigned char c =3, d;
d = ~c; kt qu d = 252;
2. unsigned int c =3, d;
d = ~c; kt qu d = 65532;
Php ^ (php XOR - tuyn loi tr)
Php tuyn loi tr trn hai bit l php ton xc nh nu hai bit (ton hng) khc nhau
th kt qu theo php tuyn, nu hai bit c cng gi tr th kt qu l 0(loi tr).
C php
<ton_hng_1> ^ <ton_hng_2>

Bng gi tr chn l php tuyn loi tr ^
V d: 1. unsigned char c = 3, d=10;
kt qu c ^ d = 2;
Gio trnh tin hc c s II - Ngn ng C
20
2. unsigned int c =10, d=10;
kt qu c^d =0;
Php << (dch tri)
C php:
ton_hng_1 << ton hng_2
Chc nng: dch tun t cc bit ca <ton_hng_1> sang tri s v tr dch bng gi tr
ca <ton_hng_2>. Khi dch cc bit ca 1 ton hng sang tri 1 th: bit tri nht s b
loi b, cc bit bn phi s tun t c dch sang tri 1 v tr, bit bn phi nht s c
lp bng 0. Khi dch tri k bit mt s no c th coi l k ln lin tip dch tri 1.


Dch tri

V d : char a =12,b;
b = a<<1 th b = 24
Khi dch tri s a vi s bc l k, nu cha xy ra cc bit c gi tr 1 ca a b mt th kt
qu s l a* 2
k
, nhng c kh nng khi dch tri k bit mt s a th mt s bit cao ca a s b
loi, tng qut c th tnh gi tr nh sau: gi l l s bit caa th kt qu l( a * 2
k
% 2
l
).
Php >> (dch phi)
C php
ton_hng_1 >> ton_hng_2
Lnh ny thc hin tng t nh SHL nhng dch cc bit ca <toan_hng_1> sang phi, cc
bit bn tri s c in bng 0, cc bit bn phi s b ghi bi bit bn tri.

Minh ho ton t >>
Khi dch s n sang phi k bit, kt qu thu c(n/2
k
)
e. Cc php ton tch lu (gn s hc)
Trong cc biu thc ton s hc chng ta rt hay gp cc biu thc dng nh a = a +k,
tc l chng ta tng a ln mt lng bng k, hoc nh a = a << k, tc l dch cc bt ca a
Gio trnh tin hc c s II - Ngn ng C
21
sang tri k v tr ri li gn vo a. Trong C c cc php ton thc hin chc nng ny v ta
gi l cc php ton tch lu.
C php chung:
<ch> <tt>= <ngun>;
Trong <ch> l mt bin thuc kiu s nguyn hoc thc, <ngun> l mt gi tr ph
hp. <tt> l du php ton s hc hay trn bit (hai ngi): +,-,*,/,%, <<,>>,&,|,^
Vi ngha
<ch> <tt>= <ngun> <ch> = <ch> <tt> <ngun>

ton t v d v cch dng ngha
+= a += b a = a + b
-= a -= b a = a - b
*= a *= b a = a * b
/= a /= b a = a / b
%= a %= b a = a % b
<<= a <<= b a = a << b
>>= a >>= b a = a >> b
&= a &= b a = a & b
|= a |= b a = a | b
^= a ^= b a = a ^ b

Lu : hai k t <tt> v du = phi vit lin v tr thnh 1 du ton t ca ngn ng C.
Bng cch dng ton t tch lu, trong mt s trng hp chng ta c th gim s phc
tp (v cch vit) ca mt biu thc rt nhiu v nh vy s gim kh nng vit sai mt
cch ng k.
V d: a[f(i)+b[j*2]-srtlen(s)] = a[f(i)+b[j*2]-strlen(s)] +6;
c vit thnh a[f(i)+b[j*2]-strlen(s)] += 6;
f. Ton t iu kin
C php:
<bt>?<gt1>:<gt2>
Trong <bt>, <gt1> v <gt2> l cc biu thc, nu <bt> c gi tr ng th kt qu ca
biu thc l <gt1> ngc li nu <bt> c gi tr sai th biu thc tr li <gt2>.
V d: (a>b?a:b)
ngha ca biu thc trn l nu a >b th kt qu l a ngc li l b, tc l tr li gi tr
ln nht ca a v b.
Gio trnh tin hc c s II - Ngn ng C
22
g. Php tng v gim 1
Vi biu thc dng a = a + 1 hoc a = a - 1 th trong C c dng khc vit ngn gn
hn bng cch dng ton t ++ hoc --. Mi ton t ny li c hai dng khc nhau l
ton t vit trc ton hng (gi l ton t trc) v dng ton t vit sau ton hng (gi
l ton t sau - nh vy c 4 ton t).
C php:
<tn_bin> ++
++<tn_bin>
<tn_bin> --
--<tn_bin>
V d: int a=5,b,c=2;
b= a++;
c = ++ a +b;
ngha ca ++ l tng ton hng (l bin) ln 1 n v v -- l gim ton hng 1. S
khc nhau gia ton t trc v ton t sau c minh ho bng v d sau:
a = 4; b = 2;
c= b + a++ ; th sau khi thc hin ta c c = 6 v a = 5
hay x = b++; th b = 3 v x=2;
nhng nu
a = 4; b = 2;
c= ++a +b ; th sau khi thc hin ta c c = 7 v a = 5
v x = ++b th x=3, b=3.
Nh vy bn thy s khc nhau gia x= b++ ;(1) v x=++b (2); l trong (1) gi tr ca
b c gn cho x trc khi n c tng 1, cn trong (2) th tng gi tr ca b ln 1 sau
mi gn b cho x.
Tc l c th hiu: x = b++ ; { x = b; b = b+1;}
cn x = ++b ; { b = b+1; x = b; }
Tng t cho ton t --;
x = b-- ; { x = b; b = b - 1;}
cn x = --b ; { b = b -1; x = b; }
Vy :
Trong biu thc n dng a++, ++a, b--, --b th ngha ca ton t trc v
sau l nh nhau (cng l tng hay gim 1)
Trong biu thc ni chung m c a++ (a--) hay ++b (--b) th gi tr ca a
c s dng trong biu thc trc khi a c tng (gim) 1, v gi tr ca b
c s dng sau khi b c tng (gim) 1.
Gio trnh tin hc c s II - Ngn ng C
23
Lu : Bn c th dng kt hp nhiu ln ton t ++, -- vi mt bin. V ++,-- c
cng u tin v c kt hp t phi sang tri do vy cc php ton dng ++++a, ----a
l c php trong khi a++++, a---- l khng c php.
h. Ton t & - ly a ch
Cc bin v hng l cc c lu trong b nh v c cp ti a ch no , ton t
& tr li a ch ca mt bin hay hng.
C php: &<tn_bin>
hoc &<tn_hng>
i. Ton t * ( truy xut gi tr qua con tr)
Phn trn chng ta bit * l php nhn, nhng n cn c ngha l ton t 1 ngi vi
chc nng ly gi tr ca mt thnh phn thng qua con tr.
C php: * <tn_con_tr>
Nh vy vi mt bin c cp pht ti mt vng nh no trong b nh th chng
ta c th truy xut gii tr ca n thng qua tn bin hoc qua a ch (con tr) ca n.
Gi s pa l con tr v pa tr ti bin a (c kiu ph hp) th *pa chnh l gi tr ca a.
v cch truy xut theo tn bin a hoc qua con tr *pa l nh nhau.
V d: int a, b, c;
int *p;
p=&a;
*p = 5; b = a + 3; c =*p -1;
Sau cc lnh trn th a c gi tr l 5, b l 8 v c l 4 (truy xut a theo cch *p gi l
truy xut gin tip thng qua con tr).
j. Ton t ,
Du phy (,) thng c dng trong nh du phn cch gia cc bin, cc hng
c khai bo trn cng mt dng, hoc gia cc tham s ca hm. Trong mt s trng
hp no n c dng nh mt ton t to ra mt biu thc dng A,B (vi A, B l
hai biu thc con hp l). Cc biu thc con c tnh t tri qua phi v gi tr ca biu
thc con cui (bn phi) chnh l gi tr tr v ca ton biu thc.
V d: a=5; b=6; c=2;
x= (a+b, a *2 +c);
kt qu x = 12
nhng nu x =a+b,a*2+c; th x =11.
k. Php chuyn kiu
Trong C cng nh mt s ngn ng lp trnh khc, trong mt biu thc th cc ton
hng phi cng kiu. Tuy nhin trong thc t th khng th cng nhc nh vy, chng hn
Gio trnh tin hc c s II - Ngn ng C
24
cng mt s nguyn vi mt s thc r rng l khc kiu nhng bn vn c th thc hin
c. Thc ra th trc khi thc hin ton t cng chng trnh dch thc hin thao
tc chuyn i kiu ca s nguyn thnh s thc chng ta gi l php chuyn kiu (p
kiu). Trong mt s tnh hung vic chuyn kiu trong C c th c chng trnh dch
thc hin t ng (gi l p kiu t ng) hoc c p kiu kiu tng minh (ngi lp
trnh vit cu lnh - ton t chuyn kiu).
Ni chung s chuyn kiu t ng xy ra trong bn trng hp sau:
Cc ton hng trong mt biu thc khc kiu.
Gn mt biu thc vo mt bin khc kiu.
Truyn tham s thc s khc kiu vi tham s hnh thc.
Gi tr tr v ca hm sau cu lnh return khc vi kiu hm c khai bo.
Trong trng hp th nht quy tc chuyn kiu t thp ln cao c p dng, tc l
ton hng c kiu thp hn s c t ng chuyn thnh kiu ca ton hng cao hn
theo trt t:
char int long float double
Trong ba trng hp cui kiu ca gi tr v phi c chuyn theo kiu ca bin bn
tri, kiu cc tham s thc s c chuyn theo kiu ca tham s hnh thc, kiu gi tr
tr v (sau return) phi chuyn thnh kiu ca hm.
Lu l ch chuyn kiu gi tr tc thi ca ton hng ri thc hin php ton ch
kiu ca bn thn ton hng th khng thay i.
Trong mt s yu cu chng ta cn s chuyn kiu r rng (p kiu tng minh) ch
khng s dng quy tc chuyn kiu ngm nh, trong trng hp ny bn c th s dng
ton t chuyn kiu theo c php sau:
(kiu_mi) (biu_thc)
trong cu trc ny (kiu_mi) l tn mt kiu hp l no , v gi tr ca (biu_thc) tr
v bt buc phi chuyn thnh (kiu_mi)
V d 1:
int a=5, b =2;
float c;
c = (float) a /b; th c c gi tr =2.5.
nhng c= a/b ; th c li c gi tr =2.0
V d 2:
float a =7.0;
int b;
b = (int)a % 3;
Gio trnh tin hc c s II - Ngn ng C
25
Trong C yu cu phi dng cp ngoc () bao tn kiu_mi, cn C++ th vi nhng
kiu_mi l tn kiu n gin th khng bt buc phi dng cp (), v d trong C++ bn
c th dng php chuyn kiu nh int (a).
l. u tin cc ton t
Trong biu thc c th c nhiu ton t, vy iu g gip cho chng trnh dch thc
hin cc ton t mt cch ng n?. Trong cc biu thc nu c cc cp (), th n s
quyt nh th t thc hin cc php ton: trong ngoc trc, ngoi ngoc sau. Nhng c
nhng kh nng du ngoc khng c hoc khng quyt nh tt c cc trng hp
th khi C thc hin cc ton t cn c vo u tin ca chng v s dng mt s quy
tc v cc ton t (v d nh khi chng cng u tin th thc hin t tri qua phi hay
t phi qua tri). V d vi cc php ton s hc +, - c cng u tin, nn nu trong
biu thc c nhiu php ton +, - v khng c cc du ngoc quy nh th t thc hin th
chng s c thc hin t tri qua phi. Nhng vi php ton ++, hay cc php gn,..
chng hn nh
++++ a; hoc a=b=c=d trnh t kt hp li t phi qua tri.
Sau y l bng cc ton t v u tin ca chng, cc php ton trn cng dng
(th t) c cng u tin, cc ton t trn dng c th t nh hn s c u tin cao
hn, trong bng ny c mt s ton t khng c m t trong phn cc php ton nh [],
(), ., -> chng s c m t trong cc phn thch hp.

STT Cc php ton trnh t kt hp
1.
(), [], ->,. tri qua phi
2.
!, ~, & (a ch), * (truy xut gin tip), - (i du),
++, --, (p kiu), sizeof
phi sang tri
3.
*(php nhn), /, % tri sang phi
4.
+, - (php tr) tri sang phi
5.
<<, >> (dch bit) tri sang phi
6.
<, <=, >, >= tri sang phi
7.
==, != tri sang phi
8.
& (and trn bit) tri sang phi
9.
^ tri sang phi
10.
| tri sang phi
11.
&& tri sang phi
12.
|| tri sang phi
Gio trnh tin hc c s II - Ngn ng C
26
13.
? : tri sang phi
14.
=, +=, -=, *=, /=, %=, <<=, >>=, &=, \+, ^=, |= phi sang tri
15.
, (du phy) tri sang phi
( bng u tin cc ton t)

III. Chng trnh C
Trc khi ni n cu trc tng qut ca mt chng trnh ngun C, chng ta hy xem
mt v d n gin sau y chng trnh in xu Chao cac ban! ra mn hnh

1: #include <stdio.h>
2: #include <conio.h>
3: void main()
4: {
5: clrscr();
6: printf("\n\n Chao cac ban !");
7: getch();
8: }
(trong on m ngun trn chng ta thm cc s dng v du : tin cho vic
gii thch, cn trong chng trnh th khng c c chng)
Trong chng trnh trn gm hai phn chnh l :
- Cc dng bao hm tp dng 1, 2; ng k s dng cc tp tiu . Trong chng
trnh ny chng ta cn dng hai file tiu stdio.h v conio.h.
- Hm main t dng 3 ti dng 8. y l hm chnh ca chng trnh , dng 3 l tiu
hm cho bit tn: main, kiu hm: void, v i ca hm (trong v d ny khng
c i). Thn ca hm main bt u ngay sau du { (dng 4), v kt thc ti du }
(dng 8).
Gio trnh tin hc c s II - Ngn ng C
27
III.1. Cu trc chng trnh
Mt chng trnh C ni chung c dng nh sau
1: [ cc bao hm tp ]
2: [ cc khai bo nguyn mu hm ca ngi dng ]
3: [ cc nh ngha kiu ]
4: [ cc nh ngha macro ]
5: [ cc nh ngha bin, hng ]
6: <kiu_hm> main ( [khai bo tham s ] )
7: {
8: < thn hm main>
9: }
10: [ cc nh ngha hm ca ngi dng]
( trong c php trn chng ta thm s hiu dng v du: cho vic gii thch c
thun li, cc thnh phn trong ngoc [] l cc thnh phn tu chn)
a. Cc bao hm tp (dng 1)
Trong chng trnh C (trong hm main cng nh cc hm khc do ngi lp trnh
vit) c th s dng cc hm, hng, kiu d liu,..(gi chung l cc thnh phn) c
nh ngha trong th vin ca C. s dng cc thnh phn ny chng ta phi ch dn
cho chng trnh dch bit cc thng tin v cc thnh cn s dng, cc thng tin c
khai bo trong tp gi l tp tiu (c phn m rng l H vit tt ca header). V phn
cc bao hm tp l cc ch dn chng trnh gp cc tp ny vo chng trnh ca
chng ta. trong mt chng trnh chng ta c th khng dng hoc dng nhiu tp tiu
.
C php ca mt dng bao hm tp:
#include <tn_tp>
hoc
#include tn_tp
trong tn_tp l tn c th c c ng dn ca tp tiu (.H) m chng ta cn s
dng, mi lnh bao hm tp trn mt dng.
V d:
#include <stdio.h>
#include <conio.h>
Gio trnh tin hc c s II - Ngn ng C
28
#include phanso.h
S khc nhau gia cp <> v bao quanh tn tp l vi cp <> chng trnh dch tm
tn tp tiu trong th mc ngm nh xc nh bi ng dn trong mc
Option/Directories, cn vi cp chng trnh dch tm tp trong th mc hin ti, nu
khng c mi tm trong th mc cc tp tiu ngm nh nh trng hp <>.
b. Cc khai bo nguyn mu v nh ngha hm ca ngi dng
Trong phn ny chng ti nu mt s thng tin v khai bo nguyn mu v nh ngha
hm gii thch cu trc chng trnh ch khng c nh trnh by v hm, chi tit v
hm s c trnh by trong phn v hm.
Cc nguyn mu (dng 2)
Nguyn mu mt hm l dng khai bo cung cp cc thng tin: tn hm, kiu hm, s
i s v kiu tng i s ca hm.
C php khai bo nguyn mu
<kiu_hm> <tn_hm> ([ khai bo i ]);
V d:
int min (int, int);
float binhphuong (float y);
float giatri(int , float);
Lu : Phn khai bo i ca nguyn mu, mc ch l xc nh s i s v kiu ca
tng i s, do vy bn c th khng vit tn ca i s nhng kiu ca chng th phi c
v bn phi lit k y kiu ca tng i.
Cc nh ngha hm ca ngi dng (dng 10)
Trong phn ny chng ta nh ngha cc hm ca ngi dng, mt nh ngha hm bao
gm dng tiu ca hm v thn ca hm, vi c php nh sau:
<kiu_hm> <tn_hm> ([ khai bo i ])
{
< thn hm >
}
V d:
int min(int a, int b) {
if(a>=b)
return b;
else return a;
}
Gio trnh tin hc c s II - Ngn ng C
29
Lu :
- Tiu hm trong nh ngha hm phi tng ng vi nguyn mu hm
- Nu trong chng trnh nh ngha hm xut hin trc khi gp li gi hm th c
th khng nht thit phi c dng khai bo nguyn mu hm.
c. nh ngha kiu mi (dng 4)
Ngoi nhng kiu chun c cung cp sn ca ngn ng, ngi lp trnh c th
nh ngha ra cc kiu mi t nhng kiu c bng cch s dng t kho typedef (type
define) Vi c php nh sau
typedef <m_t_kiu> <tn_kiu_mi>;
Trong <tn_kiu_mi> l tn kiu cn to do ngi lp trnh t theo quy tc v tn
ca ngn ng, v <m_t_kiu> l phn chng ta nh ngha cc thnh phn cu thnh
ln kiu mi.
V d:
typedef unsigned char byte;
typedef long nguyendai;
Sau nh ngha ny cc tn mi byte c dng vi ngha l tn kiu d liu n
tng t nh unsigned char, v nguyendai tng t nh long.
V d: chng ta c th nh ngha bin a, b kiu byte nh sau
byte a,b;
d. nh ngha macro (dng 5)
Khi nim macro l g? Gi s nh bn c mt ni dung (gi tr) no v bn mun
s dng n nhiu ln trong chng trnh, nhng bn khng mun vit trc tip n vo
chng trnh lc bn son tho v mt vi l do no (chng hn nh n s lm chng
trnh kh c, kh hiu, hoc khi thay i s kh,..). Lc ny bn hy gn cho ni dung
mt tn v bn s dng tn vit trong chng trnh ngun. Khi bin dch
chng trnh, chng trnh dch s t ng thay th ni dung ca tn vo ng v tr
ca tn . Thao tc ny gi l php th macro v chng ta gi tn l tn ca macro v
ni dung ca n c gi l ni dung ca macro.
Mt macro c nh ngha nh sau:
#define tn_macro ni_dung
Trong tn macro l mt tn hp l, ni dung (gi tr) ca macro c coi thun tu l 1
xu cn thay th vo v tr xut hin tn ca macro tng ng, gia tn v ni dung cch
nhau 1 hay nhiu khong trng (du cch). Ni dung ca macro bt u t k t khc du
trng u tin sau tn macro cho ti ht dng.


Gio trnh tin hc c s II - Ngn ng C
30
V d :
# define SOCOT 20
# define max(a,b) (a>?b a:b)
Vi hai v d trn, khi gp tn SOCOT chng trnh dch s t ng thay th bi 20 v
max(a,b) s c thay th bi (a>b?a:b)
Ch :
Php thay th macro n gin ch l thay ni dung macro vo v tr tn ca n do vy
s khng c c ch kim tra kiu.
Khi nh ngha cc macro c tham s c th sau khi thay th biu thc mi thu c
c trt t tnh ton khng nh bn mong mun. V d ta c macro tnh bnh phng 1
s nh sau:
# define bp(a) a*a
v bn c cu lnh bp(x+y) s c thay l x+y*x+y v kt qu khng nh ta mong
i. Trong trng hp ny bn nn s dng du ngoc cho cc tham s ca macro
# define bp(a) ( a)*(a)
e. nh ngha bin, hng (dng 5)
Cc bin v hng c nh ngha ti y s tr thnh bin v hng ton cc. ngha
v bin, hng, c php nh ngha c trnh by trong mc bin v hng.
f. Hm main (dng 6-9)
y l thnh phn bt buc duy nht trong mt chng trnh C, thn ca hm main
bt u t sau du m mc { (dng 7) cho ti du ng mc } (dng 8). Khng ging nh
chng trnh ca Pascal lun c phn chng trnh chnh, chng trnh trong C c
phn thnh cc hm c lp cc hm c c php nh nhau v cng mc, v mt hm m
nhim phn thn chnh ca chng trnh, tc l chng trnh s bt u c thc hin
t dng lnh u tin v kt thc sau lnh cui cng trong thn hm main .
Trong nh ngha mt hm ni chung u c hai phn l tiu ca hm, dng ny
bao gm cc thng tin : Tn hm, kiu hm (kiu gi tr hm tr v), cc tham s hnh
thc (tn tham s v kiu ca chng). Phn th hai l thn ca hm, y l tp cc lnh
(hoc khai bo) thc hin cc thao tc theo yu cu v chc nng ca hm . Hm main
cng ch l mt trng hp ring ca hm nhng c tn c nh l main, c th c hoc
khng c cc i s, v c th tr v gi tr cho h iu hnh, kiu ca gi tr ny c
xc nh bi <kiu_hm> (dng 6) chi tit v i, kiu ca hm main s c cp k
hn trong cc phn sau.
Thn hm main c bao bi cp {(dng 7), v } (dng 9) c th gm cc lnh, cc
khai bo hoc nh ngha bin, hng, kiu, cc thnh phn ny tr thnh cc b trong
hm main - vn cc b, ton cc s cp ti trong phn phm vi.
Gio trnh tin hc c s II - Ngn ng C
31
Lu :
Cc thnh phn ca chng trnh m chng ta va nu tr hm main l thnh phn
phi c v duy nht trong mt chng trnh C, cn cc thnh phn khc l tu chn,
c th khng c hoc c nhiu.
Th t cc thnh phn khng bt buc theo trt t nh trn m chng c th xut
hin theo trt t tu nhng phi m bo yu cu mi thnh phn phi c khai
bo hay nh ngha trc khi s dng.
Cc bin, hng khai bo ngoi mi hm c phm vi s dng l ton cc (tc l c
th s dng t sau lnh khai bo cho ti ht file chng trnh). Cc hng, bin khai
bo trong 1 hm (hoc trong 1 khi) l thnh phn c b (c phm vi s dng trong
hm hoc trong khi m thi).
Cc hm trong C l mt mc (tc l trong hm khng cha nh ngha hm khc).
V d: chng trnh nhp bn knh t bn phm, tnh v in din tch hnh trn

#include <stdio.h>
#include <conio.h>
#define PI 3.1415
float r; // Khai bo bin r c kiu float
void main()
{ printf("\nNhap ban kinh duong tron r =");
scanf("%f",&r); //nhp s thc t bn phm vo r
printf("Dien tich = %5.2f", r*r*PI); //tnh v in din tch
getch();
}

III.2. Cu lnh v dng ch thch
III.2.1. Cu lnh
Trong chng trnh c th c nhiu cu lnh, mi cu lnh m nhim mt chc nng
no . Trong C mt lnh ni chung c th vit trn mt hay nhiu dng (tr xu k t v
macro) v kt thc bi du chm phy (;) v cng c th vit nhiu lnh trn mt dng,
gia cc thnh phn ca lnh c th c cc du cch.
V d:
a = b +5;
a = b +
Gio trnh tin hc c s II - Ngn ng C
32
5;
printf("Dien tich = %5.2f", r*r*PI);
Mt lnh c th vit trn nhiu dng nhng trong 1 xu k t hay nh ngha macro th
chng ta phi vit trn 1 dng, trng hp nht thit phi vit trn nhiu dng th bn phi
thm k t \ vo cui dng trn bo cho chng trnh dch ni ni dung dng di vo
cui ca dng trn.
V d
printf("Dien tich \
= %5.2f", r*r*PI);
III.2.2. Lnh v khi lnh
Cc lnh ca chng trnh C bao gm 2 loi l cu lnh n v khi lnh (cu lnh
ghp - nhm lnh).
Cu lnh n l nhng lnh n gin (ch mt pht biu, kt thc bi ;) nh php gn,
mt li gi hm,..
Khi lnh l nhm cc lnh c bao bi cp { v }, bn trong khi lnh l dy cc
lnh c th l lnh n hoc khi lnh con khc, tc l khi lnh c th lng nhau, cc
du mc { v } phi xut hin tng ng theo cp.
V d:
if (a>0)
{ d = b*b - 4*a*c;
if(d>=0)
{ x1 = (-b - sqrt(d))/(2*a);
x2 = (-b + sqrt(d))/(2*a);
printf( nghiem x1 = %4.2f, x2 = %4.2f,x1,x2);
}
else
printf(phuong trinh khong co nghiem thuc);
}
III.2.3. Li ch thch
Trong chng trnh chng ta c th thm cc li ch thch gii thch cu lnh hoc
chc nng ca chng trnh ,.. nhm cho chng trnh d c.
Gio trnh tin hc c s II - Ngn ng C
33
Cc ch thch c t gia cp /* v */, c th trn mt hoc nhiu dng. Vi cc
chng trnh dch ca C++ bn c th s dng // ghi mt ch thch trong chng trnh,
vi cch ny ni dung li ch thch bt u sau du // ti ht dng.
Cc li ch thch ch c tc dng vi ngi c ch khng nh hng ti chng
trnh, tc l chng trnh dch s b qua cc li ch thch.
V d:
scanf("%f",&r); /*nhp s thc t bn phm vo r */
printf("Dien tich = %5.2f", r*r*PI); //tnh v in din tch

III.3. Nhp v xut d liu
Trong phn ny chng ta gii thiu c php v ngha mt s hm c bn nhp d
liu t thit b vo chun l bn phm v xut d liu ra mn hnh my tnh. s dng
cc hm ni chung ca th vin bn phi bao hm cc tp tiu (tp .h) cha khai bo
nguyn mu ca chng vo chng trnh.
Mt s hm nhp d liu t bn phm
a. Hm getch, getche nhp 1 k t
C php:
int getch();
int getche();
Chc nng: Hai hm ny thc hin i ngi dng nhp mt k t t bn phm v tr
v mt s nguyn l m ca k t c bm, v d bn g phm a th hm s tr v 97.
S khc nhau gia hai hm l hm getche hin k t c nhp ln mn hnh, cn
getch th khng.
Khi phm c bm l phm m rng th h thng s y vo b m nhp liu 2 byte,
byte th nht c gi tr 0, byte th 2 l m m rng ca phm . V d khi bn bm phm
mi tn ln th hai byte c gi tr l 0 72 v hm getch hay getche tr v 0, byte c gi
tr 72 vn cn lu trong b m nhp liu, nu ta gi getch hoc getche s nhn c gi
tr ny.

b. Hm scanf
y l mt trong nhng hm nhp d liu ph bin nht ca C, n cho php nhp
nhiu loi d liu (c cc kiu khc nhau). Khi nhp d liu bng hm ny bn phi xc
nh a ch (vng nh, hay bin) lu d liu v kiu ca d liu cn nhp.
c php
int scanf(const char * format, ds_cc_con_tr);
chc nng
Gio trnh tin hc c s II - Ngn ng C
34
Hm scanf cho php chng ta nhp d liu t bn phm theo khun dng c xc
nh bi xu k t format, d liu nhp vo s lu vo cc bin hoc vng nh c a ch
tng ng l cc con tr trong ds_cc_con_tr ( c th c nhiu con tr, mi con tr cch
nhau bi du phy).
V d: nhp gi tr cho 3 bin a c kiu int, x c kiu float, v b c kiu int


Trong c php trn format l mt xu quy nh quy cch d liu cn nhp, gm nhiu
c t d liu tng ng vi cc kiu ca con tr trong phn ds_cc_con_tr, c bao
nhiu con tr th cn ng by nhiu c t, c t th nht quy nh khun dng d liu
cho con tr th nht, c t th 2 quy nh khun dng d liu cho con tr th 2,...
Mi c t bt u bng du % c dng sau (cc thnh phn trong [] l tu chn):
%[*][n]<k_t_nh_kiu>
Trong
- n l mt s nguyn dng quy nh di ti a (tnh theo s k t) c nhp
cho thnh phn tng ng
- <k_t_nh_kiu> l k t quy nh kiu d liu cn nhp v d bn mun nhp
s nguyn kiu int th k t nh kiu l d, kiu k t l c. Cc k t nh kiu khc
bn xem bng sau.


K t
nh kiu
d liu nhp kiu con tr
ca i nhp liu
d integer int *arg
D, ld integer long *arg
e, E Float float *arg
f Float float *arg
g, G Float float *arg
o Octal int *arg
O Octal long *arg
i Decimal,octal, hex int *arg
I Decimal,octal, hex long *arg
Gio trnh tin hc c s II - Ngn ng C
35
u Unsigned int unsigned int *arg
U Unsigned int unsigned long *arg
x Hexadecimal int *arg
X Hexadecimal int *arg
s Character string char arg[]
c Character char *arg
- * y cng l thnh phn tu chn, nu c th tc dng ca n l s b qua mt
thnh phn d liu c xc nh bi c t ny, nh vy s khng c i tng
ng vi c t ny.
V d:
scanf(%d%*c%d,&a,&b);
trong dng ny chng ta s nhp 1 thnh phn (gi l 1 trng) s nguyn vo a,
sau b qua mt thnh phn l k t, v tip theo l mt s nguyn vo b.
Quy cch nhp d liu
Khi chng ta nhp d liu t bn phm, kt thc nhp bng Enter (), th tt c
nhng k t chng ta g trn bn phm u c lu trong vng m nhp d liu (gi
l dng vo- stdin) - dng vo kt thc bi (), d liu trn dng vo ny s c ct
thnh tng trng tun t t tri qua phi v gn vo cc bin (hoc vng nh) xc
nh tng ng bi cc con tr, cc phn tch c s b loi khi dng vo.
Trc khi tch gi tr mt trng th cc khong trng pha trc ca trng nu c
s b loi b. Nu trong c t khng c thnh phn (n) quy nh di ti a mt
trng th cc trng c xc nh bi cc k t du cch, tab, enter (gi chung l
khong trng k hiu l ) hoc khi gp k t khng ph hp vi c t hin ti.
Nu trn dng vo c nhiu hn cc thnh phn yu cu ca hm nhp th cc thnh
phn cha c nhn vn cn lu trn dng vo.
V d:
int a,b; float x;
scanf(%d%%d%f,&a,&b, &x);
vi dng vo l:
143 535 34
th :
- khong trng u tin b loi b, 143 l trng th nht c gn vo a,
- hai khong trng b loi b, 535 l trng th hai c gn vo b,
- mt khong trng b loi b, 34 c gn vo x ( cn li trong dng vo)
Gio trnh tin hc c s II - Ngn ng C
36
Nu trong c t c thnh phn xc nh rng ti a (n) th mt trng s kt
thc hoc khi gp khong trng, hay k t khng ph hp hoc di n
V d
int a,b; float x;
scanf(%d%2d%3f,&a,&b, &x);
vi dng vo l:
143 537 34
th :
- khong trng u tin b loi b, 143 l trng th nht c gn vo a,
- hai khong trng b loi b, 53 l trng th hai c gn vo b,
- mt khong trng b loi b, 7 c gn vo x (cn li 34 trong dng
vo)
Lu :
- S cc c t phi tng ng vi s con tr trong danh sch con tr
- K t nh kiu trong c t phi ph hp vi kiu ca con tr cn nhp liu.
- D liu nhp t bn phm phi ph hp vi cc c t.
- Hm scanf tr v s nguyn l s trng c nhp d liu
c. Hm gets
C php:
char * gets(char * s);
Chc nng ca hm gets l nhp mt xu k t t bn phm, khc vi hm scanf vi
c t %s kt thc ni xu khi gp du cch hoc enter, tc l xu khng th c du
cch, hm gets ch kt thc khi gp enter (k t \n). Xu k t c ghi vo s (vi s l
mng cc k t hoc con tr k t), du kt thc xu (\0 - k t c m 0 ) c t ng
thm vo cui xu. Hm tr v a ch ca xu c nhp.
Ch : hm gets loi b k t Enter(\n) trn dng vo nhng k t ny khng c
a vo s m t ng thm k t kt thc xu (\0) vo cui ca s.
Mt s hm xut d liu ra mn hnh
a. Hm printf
Hm prinntf l hm in d liu ra mn hnh rt a dng ca ngn ng C. Cng nh
hm scanf, hm printf cng yu cu chng ta phi cung cp cc gi tr v nh dng ca
d liu cn in thng qua cc i ca hm.
Gio trnh tin hc c s II - Ngn ng C
37
C php
int printf (const char * format [, <danh_sch_cc_gi tr>]);
Trong : <danh_sch_cc_gi tr> l phn tu chn, nu c th l cc gi tr cn
in, cc gi tr (c th l bin, hng, li gi hm, hay biu thc ni chung) cch nhau bi
du phy.
Lu : s gi tr trong <danh_sch_cc_gi tr> c th nhiu hn s cc c t, khi
cc gi tr cui (khng c c t tng ng) s b b qua.

format l xu k t iu khin, nhim v chnh ca n l iu khin khun dng thng
tin c in ra mn hnh.
V d:


Trong format gm ba loi: cc k t iu khin, cc c t, cc k t thng
Cc k t iu khin
y l cc k t c bit, bt u bng k t \ tip theo l 1 k t dng iu
khin: chuyn con tr mn hnh, v tr in d liu,..
- \n : chuyn con tr mn hnh xung dng mi
- \t : du tab
- \b : (backspace) li mt k t (xo k t trc v tr con tr hin ti)
Cc k t thng
L nhng k t khng thuc loi iu khin v c t, cc k t ny c in ra mn
hnh ng nh n xut hin trong format. Ngoi ra cn c mt vi k t c bit m
khi mun in ra mn hnh chng ta phi t n ngay sau k t \, l:
- \\ : in chnh du \
- \ : in du nhy n()
- \\ : in du nhy kp ()
Cc c t
Trong format c th c nhiu c t, cc c t quy nh khun dng d liu cn in
ra, mi c t c dng nh sau :
%[-][n[.m]]<k_t_nh_kiu>
Gio trnh tin hc c s II - Ngn ng C
38
ngha cc thnh phn
Thnh phn <k_t_nh_kiu> y l k t quy nh kiu ca d liu cn in
v d bn mun in mt gi tr int th <k_t_nh_kiu> l d, bn mun in mt
k t th k t nh kiu l c. Cc kiu khc c cho trong bng sau:


K t nh
kiu
Kiu ca gi tr
cn in
Khun dng in ra
d int s nguyn h 10
i int s nguyn h 10
o int s nguyn khng du h 8
u unsigned int s nguyn khng du h 10
x,X int,unsigned s nguyn khng du h 16
f float s thc (dng du phy tnh)
e, E float s thc (du phy tnh hoc k php khoa hc)
c char k t
s char * xu k t
p con tr in gi tr con tr dng Segment:Offset hoc Offset tu
m hnh b nh c s dng

Lu : C th dng kt hp ld, lu, lx,.. nh kiu d liu in ra l s nguyn di
(long), s nguyn di khng du (unsigned long),..
Thnh phn [n[.m]] : n, m l cc s nguyn dng, n quy nh rng ca thng
tin (tnh theo s k t) c in ra mn hnh, m s ch s cho phn thp phn (ch
dng cho s thc), nu c m th s thc c lm trn vi m ch s thp phn.
Nu rng thc s ca gi tr cn in < rng c dnh cho n (n) th cc
du trng c thm vo (bn tri hay bn phi tu vo s c mt ca thnh
phn [-] hay khng ).
Lu : c th thay s n bng k t *, khi thng tin s c in ra theo ng
rng thc s ca n.
v d printf(%5.1f,1.37); s in ra 1.4 v chim 5 v tr trn mn hnh, bn tri
ca s c in 2 du cch.
Thnh phn [-]: Xc nh kiu cn bn tri hay bn phi. Khi mt gi tr c in
ra trn mn hnh, nu rng thc s ca n nh hn rng xc nh bi thnh
phn n, ngm nh chng c cn bn phi (trong vng n k t trn mn hnh),
nu c du - th d liu c cn tri.



Gio trnh tin hc c s II - Ngn ng C
39
V d:

Gi tr tr v ca hm printf l tng di thng tin c in (tnh theo k t).

V d 1: chng trnh nhp 1 k t t bn phm, in k t v m ca n ra mn hnh

#include <stdio.h>
#include <conio.h>
void main(){
int c;
printf("\nHay nhap mot ky tu : ");
c = getch();
printf("\nban vua nhap ky tu %c, co ma la %d ",c,c);
printf("\nbam phim bat ky de ket thuc");
getch();
}
khi thc hin chng trnh trn chng ta s c:

Hay nhap mot ky tu : A bn nhp
my in ra
ban vua nhap ky tu A , co ma la 65
bam phim bat ky de ket thuc
nh vy cng l gi tr c (m ca k t chng ta g t bn phm), nhng vi c t khc
nhau s cho chng ta khun dng khc nhau (trong v d vi c t %d in ra 65, nhng
vi %c li in ra k t A).
V d 2: chng trnh nhp 2 s nguyn a, b t bn phm (b !=0), in tng, hiu, tch,
thng phn nguyn a/b

#include <stdio.h>
#include <conio.h>
void main() { int a,b,c;
printf("\nnhap a, b :");
scanf("%d%d",&a,&b);
printf("\na+b= %5d \na-b= %5d", a+b, a-b);
printf("\na*b= %5d \na/b= %5d", a*b, a/b);
getch();
}
kt qu chy chng trnh l
Gio trnh tin hc c s II - Ngn ng C
40
nhap a, b : 5 2
a+b= 7
a-b= 3
a*b= 10
a/b= 2
b. Hm putch
C php:
int putch(int ch);
Chc nng: Hm ny in k t c m l ch ra mn hnh ti v tr hin ti ca con tr,
chuyn con tr sang phi 1 k t, hm tr v s nguyn chnh l m k t in ra.
V d: minh ho putch
1: #include <stdio.h>
2: #include <conio.h>
3: void main(){
4: int c;
5: c = 97;
6: printf("\nprint c = %d", c);
7: printf("\nputch c = "); putch(c);
8: c = 354;
9: printf("\nprint c = %d" , c);
10: printf("\nputch c = "); putch(c);
11: getch();
12: }

khi thc hin chng trnh trn cc bn s thu c kt qu nh sau:
print c = 97
s putch c = a
c = 354
print c = 354
putch c = b
Cc bn bit l mt k t ch c kch thc 1 byte, nhng trong hm putch li c i l int
(2 byte), trong trng hp gi tr ca ch >255 th k t c in ra l k t c m ( ch %
256), v y cng l gi tr m putch tr v. Cng ging nh vi printf mt s k t c
bit c coi l k t iu khin ch khng phi k t in ra mn hnh.
c. Hm puts
C php:
int puts(char * s);
Gio trnh tin hc c s II - Ngn ng C
41
Chc nng: Hm ny in xu k t s ra mn hnh ti v tr hin ti ca con tr, sau t
ng chuyn con tr sang dng mi. Trong trng hp in thnh cng hm tr v s
nguyn dng, ngc li tr v -1(EOF).

IV - Cc cu trc iu khin chng trnh
Mt chng trnh l tp nhiu cu lnh, thng thng mt cch trc quan chng ta hiu
chng trnh thc hin tun t cc lnh t trn xung di, bt u t lnh th nht trong
hm main v kt thc sau lnh cui cng ca n. Nhng thc t chng trnh c th phc
tp hn s tun t nhiu, chng hn nh mt cu lnh (hay khi lnh) ch c thc hin
khi c mt iu kin no ng, cn ngc li n s b b qua, tc l xut hin kh
nng la chn mt nhnh no . Hay mt chc nng no c th phi lp li nhiu ln.
Nh vy vi mt ngn ng lp trnh c cu trc ni chung phi c cc cu trc iu
khin trnh t thc hin cc lnh trong chng trnh (gi ngn gn l cc cu trc hoc
cc ton t iu khin)
Sau y chng ta s tm hiu tng cu trc iu khin chng trnh ca C.
IV.1. Cu trc tun t
y l cu trc n gin nht ca cc ngn ng lp trnh ni chung, iu khin thc
hin tun t cc lnh trong chng trnh (bt u t cc lnh trong thn hm main) theo
th t t trn xung di (nu khng c iu khin no khc).
V d 1.1: Chng trnh nhp nm sinh ca mt ngi t bn phm, sau in ra li
cho v tui ca ngi .
#include <stdio.h>
#include <conio.h>
void main()
{ int namsinh;
printf("Nhap nam sinh cua ban : ");
scanf("%d", &namsinh);
printf("\n\nChao ban! nam nay ban %4d tuoi",2002-
namsinh);
getch();
}

V d 1.2: Vit chng trnh nhp ba s thc a,b,c t bn phm l s o 3 cnh tam
gic, sau tnh v in chu vi v din tch ca tam gic.
Gii
D liu vo : a,b,c kiu float l 3 cnh mt tam gic
Gio trnh tin hc c s II - Ngn ng C
42
Tnh ton : chu vi p = (a+b+c),
din tch s = sqrt(q*(q-a)*(q-b)*(q-c))
vi q = p/2, sqrt l hm tnh cn bc 2
Chng ta c chng trnh nh sau:
#include <stdio.h>
#include <conio.h>
#include <math.h>
void main()
{ float a,b,c, p,q,s;
printf("Nhap so do 3 canh cua tam giac ");
printf("\na = "); scanf("%f", &a);
printf("\nb = "); scanf("%f", &b);
printf("\nc = "); scanf("%f", &c);
p = a+b+c; q = p/2;
s = sqrt(q*(q-a)*(q-b)*(q-c));
printf("\n\nChu vi la %5.1f, dien tich la %5.2f ",p,s);
getch();}

v d v kt qu thc hin chng trnh
Nhap so do 3 canh cua tam giac
a = 3
b = 4
c = 5
Chu vi la 12.0, dien tich la 6.00

Lu :
Trong chng trnh v d trn chng ta s dng hm tnh cn bc 2 sqrt, hm
ny c khai bo trong tp tiu math.h
Chng trnh trn cha x l trng hp a,b,c khng hp l (ba s a,b,c c th
khng tho mn l 3 cnh mt tam gic)
IV.2. Cu trc r nhnh
Chng ta hy xem li chng trnh trong v d 2 trn, iu g xy ra nu d liu
khng tho mn, tc l khi bn nhp 3 s a,b,c t bn phm nhng chng khng tho mn
l s o 3 cnh mt tam gic trong khi chng trnh ca chng ta vn c tnh v in din
tch.
Gio trnh tin hc c s II - Ngn ng C
43
R rng l c hai kh nng:
Nu a,b,c tho mn l 3 cnh tam gic th tnh chu vi, din tch v in kt qu
Ngc li phi thng bo d liu khng ph hp
Nh vy cn phi c mt s la mt trong hai nhnh tu vo iu kin a,b,c c l ba
cnh mt tam gic hay khng. iu ny gi l r nhnh, v C cung cp cho chng ta mt
cu trc iu khin r nhnh if.
C php
dng

if (bt_E)
S1;
else
S2;

hoc dng khuyt


if (bt_E)
S1;

Trong c php trn S1, S2 ch l 1 lnh, <bt_E> l biu thc iu kin ca if
S hot ng ca cu trc if:
Trc ht biu thc iu kin <bt_E> c tnh, c hai kh nng:
Nu gi tr ca <bt_E> l ng (!=0) th S1 c thc hin v ra khi cu trc if.
Ngc li nu <bt_E> l sai th
- vi dng y : thc hin S2 ri kt thc if
- vi dng khuyt : kt thc cu trc if
Gio trnh tin hc c s II - Ngn ng C
44
V d 2.1: chng trnh nhp hai s nguyn a, b t bn phm, in s ln nht ra mn hnh.
#include <stdio.h>
#include <stdio.h>
void main() {
int a,b;
printf(\nNhap so thu nhat : );
scanf(%d, &a);
printf(\nNhap so thu hai : );
scanf(%d, &b);
if (a>b)
printf(\nSo lon nhat la %d, a);
else
printf(\nSo lon nhat la %d, b);
getch();
}

V d 2.2: Vit chng trnh theo v d 1.2 vi yu cu nu a,b,c tha mn l 3 cnh mt
tam gic th tnh v in chu vi, din tch, nu khng tho mn th in thng bo ra mn hnh.

Gii: Chng ta bit 3 s a, b, c l 3 cnh mt tam gic nu n tho mn tnh cht tng hai
cnh ln hn cnh th ba. Theo cch tnh t v d 1.2 chng ta c chng trnh:

#include <stdio.h>
#include <conio.h>
#include <math.h>
void main()
{ float a,b,c, p,q,s;
printf("Nhap so do 3 canh cua tam giac ");
printf("\na = "); scanf("%f", &a);
printf("\nb = "); scanf("%f", &b);
printf("\nc = "); scanf("%f", &c);
if(a+b>c)&&(a+c>b)&&(b+c>a)
{
p = a+b+c; q = p/2;
s = sqrt(q*(q-a)*(q-b)*(q-c));
printf(" \n\nChu vi la %5.1f,\
dien tich la %5.2f ",p,s);
}
else
printf(\nBa so da cho la ba canh tam giac);
getch();}
Gio trnh tin hc c s II - Ngn ng C
45

Lu : Cu trc if cng nh cc cu trc khc ca ngn ng C, chng c th lng nhau,
tc l chng c th cha cc cu trc iu khin khc.
V d 2.3: Chng trnh gii phng trnh bc 2: ax
2
+ bx + c = 0, vi cc h s a, b, c l
cc s thc nhp t bn phm.
Gii: tm nghim ca phng trnh bc 2 mt n ta thc hin theo cc bc sau:
Nhp a,b,c t bn phm
Tnh delta = b
2
+ 4*a*c
Nu delta = 0 (phng trnh c nghim kp x)
tnh nghim x = -b/(2*a).
Ngc li
Nu delta > 0 (phng trnh c 2 nghim x1,x2 )
x1 = (-b - sqrt(delta))/(2*a)
x1 = (-b + sqrt(delta))/(2*a)
Ngc li (delta < 0)
phng trnh khng c thc

Chng trnh gii phng trnh bc 2

#include <stdio.h>
#include <conio.h>
#include <math.h>
void main(){
float a,b,c, delta, x1,x2;
printf("\nNhap cac he so a,b,c : ");
scanf("%f%f%f",&a,&b,&c);
delta = b*b-4*a*c;
if(delta==0)
printf("\nPhuong trinh co nghiem kep \
x = %5.2f", -b/(2*a));
else
if(delta > 0)
{ x1 =(-b-sqrt(delta))/(2*a);
x2 =(-b+sqrt(delta))/(2*a);
printf("\nPhuong trinh cos 2 nghiem phan biet\
\n x1= %5.2f \n x2= %5.2f",x1,x2);
Gio trnh tin hc c s II - Ngn ng C
46
}
else
printf("\nPhuong trinh khong co nghiem thuc");
}



IV.3. Cu trc switch
Cu trc switch cho php la chn mt nhnh trong nhiu kh nng tu vo
iu kin xy ra. C php nh sau
switch (<bt_E>)
{
case <bt_1>:
S
1
;
case <bt_2>:
S
2
;
. . .
case <bt_n>:
S
n
;
[ default : S ; ]
}
Trong
<bt_E> l biu thc nguyn.
<bt_1>, <bt_2>,..,<bt_n> l cc biu thc hng, nguyn v chng phi khc nhau.
S
1,
S
2, ..,
S
n ,
S l mt hoc nhiu lnh c gi l thn ca cu trc switch.
case, default l cc t kho
S hot ng ca switch
u tin <bt_E> c tnh, sau ln lt so snh gi tr ca <bt_E> vi cc
biu thc hng <bt_1>, <bt_2>,..<bt_n>.
Nu gi tr ca mt biu thc hng th k trong cc biu thc ny trng vi gi tr
ca <bt_E> th chng trnh s thc hin cc lnh bt u t S
k
v tip tc cc
lnh pha di cho ti khi:
- gp cu lnh : break (tt nhin nu gp cc cu lnh return, exit th
cng kt thc)
- gp du ng mc } ht cu trc switch
Nu <bt_E> khng trng vi gi tr no trong cc biu thc hng th cu lnh S
(cc lnh sau mnh default nu c) s c thc hin, ri ra khi cu trc
switch.
Gio trnh tin hc c s II - Ngn ng C
47
V d 3.1: Chng trnh nhp mt biu thc n gin dng ab (a, b l cc s nguyn,
l mt trong cc du php ton s hc +, -, *, x, /, :,) tnh v in kt qu.
Gii : y chng ta gi s c th dng php nhn l du * hoc ch x, php chia c th
l du : hay /. Gi thit ngi dng nhp biu thc ng dng ab.
Chng ta c chng trnh nh sau:

1: #include <stdio.h>
2: #include <conio.h>
3: void main()
4: {
5: int a,b;
6: char tt; // du ton t
7: printf("\nnhap bieu thuc don gian :");
8: scanf("%d%c%d",&a,&tt,&b);
9: switch(tt)
10: {
11: case '+': printf("\n %d %c %d = %d ",a,tt,b, a+b);
12: break;
13: case '-': printf("\n %d %c %d = %d ",a,tt,b, a-b);
14: break;
15: case 'x':
16: case '*': printf("\n %d %c %d = %d ",a,tt,b, a*b);
17: break;
18: case ':':
19: case '/': if(b!=0)
20: printf("\n %d %c %d = %d ",a,tt,b, a/b);
21: else
22: printf("loi chia cho 0");
23: break;
24: default: printf("\n\nkhong hieu phep toan %c",tt);
25: }
26: getch();
27: }

Trong chng trnh v d ny nu bn nhp biu thc v d nh 9+2 tc l ta c a=9, b=2,
tt (du ton t) = +.
Nh vy mnh case + (dng 11) ng, chng trnh thc hin cu lnh
printf("\n %d %c %d = %d ",a,tt,b, a+b);
break;
v chng trnh in ra kt qu
9 + 2 = 11
v thot khi cu trc switch (nhy ti dng 26)
Gio trnh tin hc c s II - Ngn ng C
48
Nu bn nhp 9*2 hoc 9x2, th s hot ng cng tng t v kt qu in ra l
9 * 2 = 18
hoc 9 x 2 = 18
Nu bn nhp khng ng php ton hoc khng ng khun dng th mnh default
c thc hin v bn s nhn c thng bo khong hieu phep toan...
Lu :
Khi ht cc lnh (S
i
) tng ng ca mnh case <bt_i> nu khng c cu lnh
break (hoc mt lnh kt thc khc) th iu khin c chuyn ti lnh S
i+1
m
khng cn kim tra biu thc hng <bt_i+1> c bng <bt_E> hay khng.
Mnh default c th xut hin ti v tr tu trong thn ca switch ch khng
nht thit phi l cui ca cu trc ( tt nhin khi cn cu lnh break).
Cu trc switch c th lng nhau hoc c th cha cc cu trc iu khin khc.
IV.4. Cu trc while
while l cu trc iu khin lp thc hin mt lnh hay khi lnh no vi s ln
lp c xc nh tu theo mt iu kin (gi l iu kin lp).
Cu trc ca while nh sau:

while (<bt>)
S;
Trong bt l mt biu thc no l biu thc iu kin lp, S l thn ca while v ch
l mt cu lnh.
S hot ng ca while nh sau:
bc 1: tnh gi tr ca <bt>
bc 2: nu gi tr tnh c ca <bt> l sai (==0) th kt thc while
bc 3: nu gi tr ca <bt> l ng (!=0) th thc hin S
bc 4: quay li bc 1
ta c s iu khin ca while nh sau



V d 4.1: Tm c s chung ln nht ca 2 s nguyn x, y theo thut ton sau:
a = x; b = y;
b1: nu (a = b) th c s chung ln nht l a, kt thc
Gio trnh tin hc c s II - Ngn ng C
49
ngc li (a !=b) th ti bc 2
b2:
- nu a > b th ta tnh a = a- b
- ngc li ta tnh b =b a
- quay li bc 1

Nh vy chng ta c th pht biu nh sau
Chng no (a !=b) th lp li
nu a >b th a = a-b
ngc li b = b -a
kt thc vng lp ny th a=b v l c chung ln nht ca x v y.
ch xt trng hp x, y l s nguyn >0. Trong trng hp nu mt trong hai s bng
0 th c s chung ln nht l tr tuyt i ca s cn li, nu c 2 s bng 0 th khng
xc nh c c s chung ln nht.
chng ta c chng trnh sau
#include <stdio.h>
#include <conio.h>
#include <math.h>

void main() {
int a,b,x,y;
printf("nhap 2 so x, y : ");
scanf("%d%d", &x,&y);
a = abs(x); // a bng tr tuyt i ca x
b = abs(y); // b bng tr tuyt i ca y
if(a+b==0)
printf("ca hai so bang 0");
else
if(a*b==0)
printf("uoc so chung lon nhat la %d ", a+b);
else
{
while(a!=b)
if(a>b) a-=b;
else b-=a;
printf("uoc so chung lon nhat la %d", a);
}
getch();
}


Gio trnh tin hc c s II - Ngn ng C
50
V d 4.2: Vit chng trnh cho php ngi s dng nhp mt k t trn bn phm, in k
t v m ca n ra mn hnh, kt thc chng trnh khi ngi dng bm phm ESC (m
27)
Gii: chng ta c th m t cc bc ca chng trnh nh sau
1: nhn 1 k t t bn phm, m lu trong bin ch
ch= getch();
2 : nu ch ==ESC th kt thc, ngc li chuyn sang bc 3
3 : in k t v m ca n
printf(\nKy tu %c co ma %d, ch,ch)
4: quay li 1
Vy c chng trnh
// In ki tu
#include <stdio.h>
#include <conio.h>
#include <math.h>
const int ESC =27; // ma phim ESC
void main(){
int ch;
while((ch=getch())!=ESC)
printf("\nKi tu %c co ma %d",ch,ch);
}
Nhn xt:
while l cu trc iu khin lp vi iu kin trc, tc l iu kin lp c
kim tra trc khi vo thn ca vng lp, do vy nu biu thc iu kin c gi
tr sai ngay t u th thn ca while c th khng c thc hin ln no.
trong thn ca while phi c lnh lm thay i gi tr ca biu thc iu kin.
Hoc nu biu thc iu kin lun c gi tr ng - chng ta gi vng lp khng
kt thc, th trong thn ca while phi c lnh chm dt vng lp (xem lnh
break).
v d
while (1) // biu thc iu kin lun ng
{ printf(\n Hay bam mot phim: );
ch = getch();
Gio trnh tin hc c s II - Ngn ng C
51
if(ch==27) break;
printf(ky tu %c co ma la %d,ch,ch);
}
V d 4.3: Vit chng trnh nhp s nguyn n t bn phm, n <=10 v n >0, tnh v in gi
tr n! (giai tha ca n), vi n! = 1*2*,..,*(n-1)*n
Gii:
Theo yu cu n nhp t bn phm phi tho mn n > 0 v n <=10, v vy nu n ngi
dng nhp n khng hp l th chng trnh s yu cu nhp li, v s lp li vic nhp cho
ti khi tho mn.
Vic tnh gt = n! theo cc bc sau:
gt = 1 ; i = 1;
while ( i <=n)
{ gt = gt *i;
i++;
}

// giai thua
#include <stdio.h>
#include <conio.h>
const int Max =10; // gii hn gi tr cn tnh
void main(){
int n, i;
long gt;
printf("\nNhap n = ");
scanf("%d",&n);
while((n<=0)||(n>Max))
{
printf("\nNhap lai n (0<n<=%d) : ", Max);
scanf("%d",&n);
}
gt=i=1;
while(i<=n)
{
gt*=i;
i++;
}
printf("\nGia tri %d! = %ld",n,gt);
getch();
}

V d 4.4: Vit chng trnh tnh v in S = 1 +1/(2!) +1/(3!)+..+1/(n!) vi n nhp t bn
phm, 0<n<10.
Gio trnh tin hc c s II - Ngn ng C
52
Gii: Bn thy l tnh S th phi tnh c cc s hng l 1/(k!) vi k 1,2,..,n sau
cng vo tng. Nh vy chng ta c th thc hin nh sau:


1: S=1; k=2;
2: nu k > n th thc hin 4:
ngc li th thc hin 3:
3: thc hin cc thao tc
3.1: tnh d = k!
3.2: tnh pt = 1/d
3.3: S = S + pt
3.4: k = k+1
3.5: lp li 2:
4: in kt qu l S v kt thc
Nhng nh vy vi mi s hng (pt) ca tng chng ta phi tnh giai tha mt ln,
trong khi chng ta thy rng s hng (pt) th k l 1/(k1!) = 1/(((k-1)!)*k) tc l bng
gi tr ca pt th k-1 nhn vi 1/k. V vy ta c th sa i li cch tnh nh sau:
1: S=1; pt=1; k = 2
2: nu k > n th thc hin 4:
ngc li th thc hin 3:
3: thc hin cc thao tc
3.1: tnh pt = pt * 1/k
3.2: S = S + pt
3.3: k = k+1
3.4: lp li 2:
4: in kt qu l S v kt thc
Chng trnh l
#include <stdio.h>
#include <conio.h>
const int Max =10; // gioi han
void main(){
int n, k ; float S, pt;
printf("\nNhap n = ");
scanf("%d",&n);
while((n<=0)||(n>Max)) {
printf("\nNhap lai n (0<n<=%d) : ", Max);
scanf("%d",&n);
}
Gio trnh tin hc c s II - Ngn ng C
53

S=pt=1; k=2;
while(k<=n){
pt /=k;
S+=pt;
k++;
}
printf("\nGia tri tong S = %8.4f",S);
}

V d 4.5: Vit chng trnh nhp s nguyn dng n t bn phm, hy kim tra v
thng bo ra mn hnh s c l s nguyn t hay khng ?

IV.5. Cu trc do .. while
Cu trc while m chng ta kho st trn lun while kim tra iu kin lp trc khi
thc hin thn ca n. Tc l i hi trc khi vo cu trc while chng ta phi xc lp
c iu kin lp cho n.
C l bn cng ng rng c nhng cu trc lp m thn ca n phi thc hin t
nht mt ln, tc bc lp u tin c thc hin m khng cn iu kin g, sau cc
bc lp tip theo s c xem xt tu vo trng thi ca bc lp trc . Vi tnh
hung nh th th while khng thun li bng mt cu trc iu khin khc m C cung
cp, l cu trc do while.

Cu trc ca do while:



do
S;

while (<bt>);


Trong c php trn S l 1 cu lnh l thn ca vng lp, <bt> l biu thc iu kin c
vai tr kim sot vng lp.
S hot ng ca cu trc do while
bc 1: thc hin cu lnh S
bc 2: kim tra gi tr biu thc <bt>, nu c gi tr ng ( khc 0) th lp li
bc 1, nu sai (=0) th kt thc vng lp.
Gio trnh tin hc c s II - Ngn ng C
54
V d 5.1: Vit chng trnh cho php ngi s dng nhp mt k t trn bn phm, in k
t v m ca n ra mn hnh, kt thc chng trnh khi ngi dng bm phm ESC (m
27)
Gii: tng t nh v d 4.2 nhng y chng ta s dng cu trc do, vy c chng
trnh
// In ki tu
#include <stdio.h>
#include <conio.h>
#include <math.h>
const int ESC =27; // ma phim ESC
void main(){
int ch;
do{
printf(\n Hay nhap mot ki tu : )
ch = getch()
printf("\nKi tu %c co ma %d",ch,ch);
}while(ch!=ESC)
}

V d 5.2: Chng trnh tnh tng sin(x ) theo cng thc khai trin Taylor:

Cc bn bit rng sin(x) c tnh theo tng chui v hn an du nh sau:
S = x - x
3
/3! + x
5
/5! - x
7
/7! +...

Nhng r rng chng trnh khng th tnh v hn c, chng ta ch c th tnh vi
mt gii hn no . C hai cch gii hn mt l theo s cc s hng trong tng tc l
ch tnh tng vi n s hng u tin ca chui, cch ny c u im l s bc lp xc
nh, nhng khng c lng c sai s. Cch th hai chng ta hn ch s bc theo
chnh xc ca kt qu. Chng ta c th pht biu li bi ton l: Tnh sin(x) theo cng
thc khai trin trn vi chnh xc (epsilon) cho trc. C ngha l kt qu tnh c
(S) c sai s so vi gi tr thc ca n khng qu , hay fabs(S-sin(x)) <= . Yu cu ny
c th tho mn khi chng ta tnh tng n s hng thc k no m gi tr tuyt i ca
phn t ny <= .
Ccbn thy rng cc phn t trong chui c tnh cht an du v gi s ta k hiu
phn t th k trong chui l p
k
th


Gio trnh tin hc c s II - Ngn ng C
55
p
k
= (-1)
2k
x
2k +1
/(2k+1)!
v p
k+1
= (-1)
2k+1
x
2(k+1) +1
/(2(k+1)+1)!
= -p
k
* x
2
/(2k*(2k+1))
Chng ta c s khi thut gii nh sau:


s khi tnh S sin(x)

Gio trnh tin hc c s II - Ngn ng C
56
cc bn c chng trnh tnh sin( x)

#include <math.h>
#include <stdio.h>
void main(){
float x, eps;
float s, sh;
int k;
printf("\nNhap gia tri (radian) x = ");
scanf("%f",&x);
printf("\nNhap sai so duoc phep eps = ");
scanf("%f",&eps);
s=x;sh=x; k=1;
do {
sh =-sh*x*x/(2*k*(2*k+1));
s+=sh;
k++;
} while(fabs(sh)>eps);
printf("s= %f ",s);
}


V d 5.3: Vit chng trnh nhp mt s nguyn dng n t bn phm, kim tra v thng
bo s c l s nguyn t hay khng.
Yu cu
- Chng trnh ch kim tra s n >2
- Sau khi kim tra xong mt s, chng trnh hi ngi dng c mun kim tra
tip hay khng, nu tr li c(C) th chng trnh vn tip tc cho nhp v kim
tra s tip, ngc li s kt thc chng trnh.

Gii : kim tra s n c l s nguyn t hay khng chng ta cn kim tra cc s t 2 ti
xem c s no l c ca n hay khng, nu khng th thng bo n l s nguyn t,
ngc li thng bo n l hp s.

Gio trnh tin hc c s II - Ngn ng C
57
#include <math.h>
#include <stdio.h>
#include <conio.h>
#include <ctype.h>
void main(){
int k, n, tl;
do{
printf("\nNhap gia tri can kiem tra = ");
scanf("%d",&n);
if(n<2) printf("Khong kiem tra so <2");
else { k=2;
while((k<=sqrt(n))&&(n%k)) k++;
if(k>sqrt(n))
printf("\n%d La so nguyen to",n);
else
printf("\n%d Khong la so nguyen to",n);
}
printf("\nban co kiem tra so khac khong :");
tl = getch();
} while(toupper(tl)=='C');
}


IV.6. Cu trc for
y cng l ton t iu khin thc hin lp mt s lnh no nhng c c php
khc vi hai chng trnh lp m chng ta xem xt phn trn, for trong C c dng
ht sc mm do nhng ni chung n s trc quan v d hiu hn trong nhng tnh hung
lp m s bc lp xc nh.
Trc khi trnh by c php tng qut ca for chng ta hy xem xt mt on lnh (in
cc k t t a ti z v m ca chng) nh sau:
for(i=a; i<z; i++)
printf( gia tri %d l m ca ki tu %c, i,i);
on lnh trn c th vit li bng chng trnh while l
i =a;
while(i<=z)
{ printf( gia tri %d l m ca ki tu %c, i,i);
i++;
}
Gio trnh tin hc c s II - Ngn ng C
58

C php
for([bt_1]; [bt_2]; [bt_3])
S;
Trong S l mt lnh (n hoc khi) c gi l thn ca vng lp, bt_1, bt_2,
bt_3 l cc biu thc hp l, vi ngha l:
bt_1: biu thc khi u
bt_2: biu thc iu kin - iu kin lp
bt_3: bc nhy - thng dng vi ngha l thay i bc nhy
C 3 biu thc ny u l tu chn, chng c th vng mt trong cu lnh c th nhng
cc du chm phy vn phi c.
Hot ng ca for
Hot ng ca for theo cc bc sau:
b1: Thc hin biu thc khi u - bt_1
b2: Tnh gi tr bt_2 xc nh iu kin lp.
Nu bt_2 c gi tr sai (==0) th ra khi vng lp
Ngc li, nu bt_2 c gi tr ng ( khc 0) th chuyn ti bc 3
b3: Thc hin lnh S ( thn ca for ), chuyn ti b4
b4: Thc hin bt_3, ri quay v b2.


s cu trc for

Gio trnh tin hc c s II - Ngn ng C
59
Nh trong c php cc bn thy cc biu thc (bt_1, bt_2, bt_3) ca for c th vng,
hn na mi thnh phn (biu thc) li c th l mt hoc nhiu biu thc(n) phn
cch nhau bi du phy (,) v d nh:



Nu <bt_1>, <bt_3> vng mt th n thun l cc lnh rng (khng thc hin
g), nu chng c nhiu biu thc n cch nhau bi du phy th cc biu thc n
c thc hin tun t t tri qua phi - thc ra vn c th coi y ch l mt biu thc,
trong c cc ton t du phy (, ) v trt t tnh ton theo u tin ca cc ton t
trong biu thc.
Tng t nh bt_1, bt_3; biu thc iu kin trong trng hp n ch gm mt biu
thc n th gi tr ca n quyt nh vng lp c cn c tip tc hay khng, nhng nu
n c nhiu biu thc n v d nh:
for(i=0, j= i +2; i<2,j <6; i++,j++)
printf(\ni = %d, j = %d);
th kt qu s l:
i=0, j=2
i=1, j=3
i=2, j=4
i=3, j=5

Nh vy vng lp dng khng theo iu kin i <2 m theo iu kin j <6. Tc l
gi tr ca biu thc bn phi nht trong danh sch cc biu thc quyt nh iu kin ca
ca vng lp iu ny do ton t (, ) tr v ton hng bn phi.

V d 6.1: Chng trnh in cc k t c m t 32 ti 255 trong bng m ASCII

Gio trnh tin hc c s II - Ngn ng C
60
1: #include <stdio.h>
2: void main(void)
3: {
4: int i;
5: for(i=32; i<256; i++)
6: {
7: if ((i - 31) %10==0) printf("\n");
8: printf("%c -%d;",i,i);
9: }
10: getch();
11: }

Gii thch: trong chng trnh trn chng ta s dng vng lp for
- biu thc khi u : i =32
- biu thc iu kin : i <256
- bc nhy i ++
nh vy vng lp s c thc hin 224 ln, mi bc lp nu (i 31)%10 ==0 th chng
ta chuyn con tr xung dng mi (lnh trn dng 7) c ngha l c sau 10 bc th
chng ta chuyn sang dng mi, vi mi i chng ta in k t c m l i cng gi tr ca n
(lnh printf trn dng 8).

V d 6.2: chng trnh nhp n s nguyn t bn phm, tm v in s ln nht, nh nht.
Gii:
Gi s chng ta c mt dy s a
1
, a
2
, .., a
n
xc nh gi tr ln nht (gi l max) v s
nh nht (min)chng ta thc hin theo cch sau:
1.
max = min = a
1
( xem mt s u tin l ln nht v cng l nh nht)

2. i=2
3. nu i > n th th kt thc, ngc li th
nu a
i
> max th max = a
i

ngc li, nu a
i
< min th min =a
i

i =i+1
4. lp li bc 3

Khi kt thc chng ta c gi tr ln nht l max, gi tr nh nht l min.
Nhng cho ti by gi chng ta cha th lu c n s (trong yu cu ny chng ta cng
khng cn phi lu chng) , v th chng ta thc hin theo phng php sau:

1: Nhp s th nht t bn phm vo a
2: max = min = a ( xem mt s u tin l ln nht v cng l nh nht)
3: i=2
4: nu i > n th th kt thc, ngc li th
Nhp s th i t bn phm vo a
nu a

> max th max = a
Gio trnh tin hc c s II - Ngn ng C
61
ngc li, nu a

< min th min =a
i =i+1
5: lp li bc 4
Cc bn c chng trnh nh sau
#include <stdio.h>
#include <conio.h>
void main(){
int n,a,max,min,i;
do{
printf("Nhap so phan tu cua day : ");
scanf("%d", &n);
}while(n<1);
printf("Nhap so thu nhat : ");
scanf("%d",&a);
max=min=a;
for(i=2; i<=n; i++)
{
printf("Nhap so thu nhat : ");
scanf("%d",&a);
if(a>max) max=a;
else
if(a<min)
min =a;
}
printf("\n gia tri lon nhat = %d\n \
gia tri nho nhat = %d",max,min);
}

V d 6.3 : Vit chng trnh gii bi ton sau:
Trm tru trm c
Tru ng n nm
Trm nm n ba
L kh tru gi, ba con mt c
hi mi loi c my con
Gii:
R rng l c ba loi tru (phng trnh ba n) nhng ch c hai phng trnh l tng
s s tru l 100 v tng s c cng l 100. Chng ta c
d + n + g =100 (tng s tru)
5*d + 3 * n + g/3 =100 (tng s c)
(d: s tru ng, n : s tru nm, g : s tru gi)
Nh vy bi ton ny khng c nghim duy nht, v nu c th ch ly nghim l cc s
nguyn m thi.
Gio trnh tin hc c s II - Ngn ng C
62
y chng ta s dng cch kim tra cc b s gm 3 s nguyn dng (d,n,g) tng
ng vi s tru ca tng loi vi d,n,g [1,..100], nu tho mn hai phng trnh trn th
l mt nghim. Vy ta thc hin nh sau:
Vi d = 1 ti 20 // ti a ch c 20 tru ng
th thc hin
Vi n = 1 ti 33 // ti a ch c 23 tru nm
thc hin
g = 100 d n ; // s tru gi
nu (g%3==0) v (5*d + 3 * n + g/3 ==100)
th in (d,n,g) l mt nghim

#include <stdio.h>
#include <conio.h>
void main(){
int d,n,g;
clrscr();
printf("\nCac nghiem la\n");
printf("\ntrau_dung trau_nam trau_gia\n");
for(d=1; d<=20;d++)
for(n=1; n<=33; n++)
{
g=100-d-n;
if((g%3==0)&&(5*d+3*n+g/3==100))
printf("%d \t %d \t %d\n",d,n,g);
}
}

Ch : Ngoi cc cu trc iu khin chng ta va nu trn, trong ngn ng C cn
mt cu trc iu khin khc na l goto. y l lnh nhy khng iu kin ti mt
v tr no trong chng trnh, v tr c xc nh bng mt nhn (label).
C php
goto <label>;
trong <label> l tn mt nhn hp l. Khi gp lnh ny iu khin s c
chuyn ti lnh ti v tr ti nhn <label>
V d:
goto ketthuc; // vi kt thc l mt nhn
Ngi ta chng minh c l c th dng cc cu trc iu khin r nhnh, lp thay
th c goto, hn na lm dng goto lm mt i tnh trong sng v cht ch ca
lp trnh cu trc, do vy trong gio trnh ny chng ti khng s dng goto.

Gio trnh tin hc c s II - Ngn ng C
63
IV.7. Cu lnh continue v break
Trong thn ca for cng nh cc cu trc lp khc, c th c cu lnh continue v break,
vi chc nng l:
break : kt thc vng lp (trong cng) cha n. break cho ta kh nng kt thc
mt vng lp t mt v tr bn trong ca vng lp m khng cn n gi tr ca
biu thc iu kin. Nu trong nhiu cu trc lp lng nhau th break ch c tc
dng kt thc mt cu trc lp trong cng cha n m thi.
continue: Tri vi break, continue l cu lnh c chc nng chuyn chu trnh v
u bc lp tip theo. C ngha l s b qua cc lnh trong thn ca vng lp k
t lnh sau continue cho ti ht thn ca vng lp. Nu c nhiu cu trc lp bao
nhau th lnh continue cng ch c tc dng vi cu trc lp trong cng cha n.
Ta c th minh ho break v continue nh sau:

.....
while (bt_dk)
{
L1;
break;
L3;

}
L5;
....

minh ho s hot ng ca break

.....
while (bt_dk)
{
L1;
continue;
L3;

}
L5;
....

minh ho s hot ng ca break
Gio trnh tin hc c s II - Ngn ng C
64
Ch : Trong for khi gp continue th cc lnh pha sau continue ti ht khi b b qua v
chuyn ti thao tc thc hin bt_3 ( bc nhy) sau bt u vng lp mi (kim tra
iu kin).

V d 6.4 : chng trnh nhp s nguyn dng n t bn phm, tm v in cc c ca n v
tng cc c ra mn hnh.

#include <stdio.h>
#include <conio.h>
void main(){
int n,i, tonguoc=0;
do{
printf("Nhap so n : ");
scanf("%d", &n);
}while(n<2);
printf("\nCac uoc cua %d la\n",n);
for(i=1;i<n/2; i++)
{ if(n%i)
continue;
printf("%d, ",i);
tonguoc+=i;
}
printf("tong cac uoc la %d",tonguoc);
}

---------------------
Bi tp:
1: Nhp 2 s x, y, in bi s chung nh nht
2: Nhp t s, mu s ca mt phn s, in phn s dng ti gin
3: Gii phng trnh bc 2 c tnh nghim phc
4: Tnh sin(x), cos(x)
5: in ra cc s nguyn t 2..n
6: Kim tra 1 s c l s chnh phng?
7: Kim tra 1 s c l s hon chnh?
8: Tm gi tr ln nht, nh nht trong 1 dy
9: Nhp mt dy s, hy cho bit trt t dy
10: Nhp mt s kim tra s c l s thuc dy fibonaxi hay khng?
11: Nhp mt s nin cc s thuc dy fibonaxi <=n
Gio trnh tin hc c s II - Ngn ng C
65


V - Mng v con tr
V.1. Khi nim Mng
Mt bin (bin n) ti mt thi im ch c th biu din c mt gi tr. Vy c
th lu tr c mt dy cc gi tr cng kiu chng hn nh cc thnh phn ca vector
trong khng gian n chiu chng ta cn n bin a
1
, a
2
,..,a
n
. rt cng knh v rt bt tin nht
l khi n ln v li khng phi l c nh. Cc ngn ng lp trnh a ra mt khi nim
mng gii quyt vn ny.
Mng l mt tp cc phn t cng kiu d liu, cc phn t cng tn phn bit nhau bi
ch s. Tng phn t ca mng c th s dng nh mt bin n, kiu ca mng chnh l
kiu ca cc phn t.
Cc thng tin v mng: Vi mt mng phi xc nh cc thng tin: tn mng, kiu cc
phn t (kiu mng), s phn t trong mng (kch thc mng). V d nh chng ta ni a
l mng c 20 phn t, kiu nguyn.
Mng cng nh cc bin n khc trong ngn ng C, trc khi s dng n phi m
bo l n c cp pht trong b nh v sn sng s dng
S chiu ca mng: trong v d chng ta nu trn v vector, chng ta c mt dy n cc
s, nu nh chng ta dng mt mng lu tr cc s th chng ta cn mng c n phn
t v ch cn 1 ch s xc nh cc phn t - y l mng mt chiu. Nu nh chng ta
cn mt mng biu din mt bng c n dng, m ct, v xc nh mt phn t trong
mng chng ta cn 2 ch s: ch s dng v ch s ct, nh vy chng ta c mng 2 chiu.
Mt cch tng t chng ta cng c th c mng 3 chiu, 4 chiu,.. hay ni cch ngn gn
hn: mng mt chiu l mng c mt ch s, mng 2 chiu c 2 ch s,...Trong gio trnh
ny chng ta cng ch s dng n mng 2 chiu.
V.2. Mng 1 chiu
V.2.1 - nh ngha mng
C php
Kiu_mng tn_mng [ s_phn_t];
Trong :
- Kiu_mng: y l kiu ca mng, l tn mt kiu d liu tn ti, c th l
kiu chun hoc kiu d liu do ngi lp trnh nh ngha .
- tn_mng : l tn ca mng, do ngi lp trnh t, theo quy tc v tn ca C.
Gio trnh tin hc c s II - Ngn ng C
66
- s_phn_t : l hng (hoc biu thc hng) nguyn, dng l s phn t ca
mng.
V d:
int vector [15]; // tn mng: vector, c 15 phn t, kiu int
float MT[10], D[20]; // c hai mng kiu float: MT c 10 phn t, D c 20 phn t
char * s[30]; // s l mng c 30 phn t kiu char * (mng cc con tr)
Khi gp (dng lnh) nh ngha mt mng, chng trnh dch s cp pht mt vng nh
(ln tip) cho cc phn t lin tip ca mng, v d vector[15] s c cp pht mt
vng nh c kch thc 15*sizeof(int) =30 byte.
V.2.2 - Truy xut cc phn t
C php :
tn_mng [ch_s]
v d vector[1], MT[3], D[0];
ch_s l s th t ca phn t trong mng, cc phn t ca mng c nh ch s bt
u t 0. Vi mng c n phn t th cc phn t ca n c ch s l 0, 1,..,n-1.
v d mng vector c cc phn t vector[0], vector[1],...,vector[14]
Lu : Cc chng trnh dch ca C khng bt li khi ngi dng truy xut phn t mng
vt ra ngoi phm vi ca mng, tc l c ch s nh hn 0 hoc ln hn s_phn_t-1.
V.2.3 - Khi to gi tr cc phn t mng mt chiu
Cc phn t ca mng cng nh cc bin n, chng ta c th khi to gi tr ban u
cho chng trn dng nh ngha mng (gi l khi u) vi c php sau:
Kiu_mng tn_mng [ s_phn_t ] = {gt_0, gt_1,..,gt_k};
hoc
Kiu_mng tn_mng [ ] = {gt_0, gt_1,..,gt_k};
Trong cc thnh phn Kiu_mng , tn_mng, s_phn_t nh trong phn
nh ngha (V.1). gt_0, gt_1,.., gt_k l cc gi tr khi u (gi l b khi u) cho cc
phn t tng ng ca mng, tc l gn tun t cc gi tr trong b khi u cho cc
phn t ca mng t tri qua phi.
Trong dng th nht, s gi tr trong bn khi u ch c th <= s phn t ca mng
(k s_phn_t). Khi nhng phn t mng tha ra (khng c gi tr khi u) s t
ng c gn bng 0 (trong trng hp mng s, nu l con tr s l NULL (rng) ).
V d:
int a[3] ={ 1,3,4}; th gi tr ca a[0] l 1, a[1] l 3, a[2] l 4.
Gio trnh tin hc c s II - Ngn ng C
67
int b[5] ={1,2}; th gi tr ca b[0] l 1, b[1] l 2, b[3]=b[4] l 0.
vi mng cc k t hoc xu k t th c hai cch khi u nh sau
char c[4] ={a,b,c }; // c[0] l a, c[1] l b, c[2] l c, c[3] l \0
char s[10] =ABC; // tng ng vi char s[10] ={A,B,C,\0}
(nu s gi tr trong b khi u > s phn t mng chng trnh dch s bo li)
Trong dng th hai, chng ta khng xc nh s phn t ca mng, trong trng hp
ny chng trnh bin dch s t ng xc nh kch thc (s phn t) ca mng theo s
gi tr trong b khi u.
V d:
int a[] ={1,3,4};
th a l mng c 3 phn t, gi tr ca a[0] l 1, a[1] l 3, a[2] l 4.

V.2.4 - Mt s v d
V d V.1: Chng trnh nhp mt mng A c n phn t kiu nguyn , n<=20 nhp t
bn phm, in cc phn t ca mng theo trt t xui, ngc (theo th t ch s).
Gii: Trong chng trnh chng ta cn nh ngha mt mng A c 20 phn t kiu int.
Mt bin nguyn n l s phn t thc s ca A s c nhp. S nguyn n c nhp t
bn phm phi tho mn 1<=n<=20.
Cc phn t A[i] (i=0,1,.,n-1) ca A c nhp t bn phm tng t nh cc bin n
bng cu lnh (hm) scanf: scanf(%d,&A[i]).
V c in ra bng hm printf, nh sau printf (%d , A[i]), nu ta s dng vng lp
vi i t 0 ti n-1 ta c cc phn t theo trt t xui ca ch s:
for(i=0; i<n; i++)
printf("%d, ",A[i]);
ngc li cc bn cho chy theo th t t n-1 ti 0 chng s c cc phn t theo s th t
ngc
for(i= n-1; i>=0; i--)
printf("%d, ",A[i]);
Chng trnh minh ho nh sau:

Gio trnh tin hc c s II - Ngn ng C
68

#include <stdio.h>
#include <conio.h>
void main(){
clrscr();
const int max =20;
int A[max];
int n,i;
do{
printf("\nNhap so phan tu mang = ");
scanf("%d",&n);
}while(n<1 || n>max); //nhp s pt mng 1<=n<=max




printf("\nNhap mang co %d phan tu \n",n);
for(i=0; i<n; i++)
{
printf("A[%d]= ",i);
scanf("%d",&A[i]);
}
printf("\nCac phan tu mang theo thu tu xuoi la \n");
for(i=0; i<n; i++)
printf("%d, ",A[i]);

printf("\nCac phan tu mang theo thu tu nguoc la \n");
for(i=n-1; i>=0; i--)
printf("%d, ",A[i]);
getch();
}
(V d V.1: chng trnh nhp v in mng)
V d V.2: Vit chng trnh nhp 2 mng A, B c n phn t (n<=10) cc s nguyn, tnh
v in mng C = A+B.
Gii: Vic nhp 2 mng A, B cng tng t nh trong v d trc. Mng C l tng ca A
v B tc l cc phn t C[i] = A[i]+B[i] ( i =0,1,.., n-1).

Gio trnh tin hc c s II - Ngn ng C
69
#include <stdio.h>
#include <conio.h>
void main(){
clrscr();
const int max = 10;
int A[max], B[max], C[max];
int n,i;
do{
printf("\nNhap so phan tu mang = ");
scanf("%d",&n);
}while(n<1 || n>max); //nhp s pt mng 1<=n<=max
printf("\nNhap mang A co %d phan tu \n",n);
for(i=0; i<n; i++)
{
printf("A[%d]= ",i);
scanf("%d",&A[i]);
}


printf("\nNhap mang B co %d phan tu \n",n);
for(i=0; i<n; i++)
{
printf("B[%d]= ",i);
scanf("%d",&A[i]);
}
// Tnh C=A+B
for(i=0; i<n; i++)
C[i]= A[i]+B[i];
printf("\nCac phan tu mang ket qua C la \n");
for(i = 0; i < n; i++)
printf("%d, ",C[i]);
getch();
}
(V d V.2 - Tnh tng 2 mng)
V.2.3 - Sp xp v tm kim trn mng mt chiu
Trong thc t chng ta rt hay gp yu cu phi sp xp mt dy cc phn t theo mt
trt t no , hoc l tm kim mt phn t c trong mt dy cc phn t hay khng. Mt
cch thun li nht (nu c th) l biu din cc phn t l mt mng cc phn t.
Sp xp mng: Bi ton sp xp mng ni chung c pht biu nh sau: Cho mt
mng c n phn t, v k l kho ca mi phn t, cc phn t c th so snh vi nhau
theo kho k, hy sp xp mng theo th t tng (hoc gim) ca kho k.
Gio trnh tin hc c s II - Ngn ng C
70
Kho k chng ta c th hiu l mt thnh phn no ca cc phn t nh l tui ca
mt ngi, hay im trung bnh hc tp ca mt sinh vin, hoc l mt tiu ch no p
dng cho cc phn t ca mng.
Trong trng hp n gin nh cc mng s m chng ta s ni trong v d sau y th
kho k chnh l gi tr ca cc phn t.
Hin nay c nhiu thut ton sp xp mt mng: thut ton ni bt, thut ton i
ch, thut ton chn, thut ton chia i,.. trong gio trnh ny chng ti gii thiu ba
thut ton sp xp n gin sp mt mng A c n phn t kiu s nguyn.
a. Sp xp bng phng php ni bt
tng ca phng php ny l c n phn t (bt nc) u c xu hng ni ln
trn mt nc, th phn t no nh hn (nh hn) s c u tin ni ln trn. Tc l
vi mi cp phn t k nhau nu phn t sau (di) nh hn phn t pha trc th phn
t nh hn s ni ln trn, phn t nng hn s chm xung di.
S thut ton sp xp mng A(n) nh sau:


(sp xp bng phng php ni bt)
b. Sp xp bng phng php i ch trc tip
tng ca phng php ny cng rt n gin l: gi s cc phn t u mng A[0],
A[1],.., A[i-1] c sp ng v tr tc l c:
A[0] <=A[1] <=,..<A[i-1] <= min{A[i],A[i+1],..,A[n-1]} (i=0,1,..)
Gio trnh tin hc c s II - Ngn ng C
71
Cng vic tip theo l sp cc phn t cn li vo ng v tr ca n. Cc bn thy v tr
th i l v tr u tin cha c sp, nu c sp th A[i] phi c gi tr nh nht trong
cc phn t cn li {A[i],A[i+1],..,A[n-1]}, vy chng ta s duyt cc phn t mng
trong phn cn li A[j] vi j =i+1 ti n-1, nu A[j] < A[i] th chng ta i ch A[i] vi
A[j]. Nh vy phn t i c xp ng v tr.
Vy chng ta thc hin lp cng vic trn vi i t 0 ti n-2 chng ta s c mng c
sp.

(sp xp bng phng php i ch trc tip)
c. Sp xp bng phng php chn
Cc bn c nhn xt l trong phng php i ch trc tip t c phn t vo v
tr i c th phi s dng (n-1) php i ch. Trong khi ch c mt phn t s t ti .
Phng php chn cng xut pht t tng nh phng php i ch trc tip nhng
thay v i ch A[i] vi [j] trong mi bc duyt (theo j) th chng ta xc nh phn t
nh nht trong cc phn t A[i+1],..A[n-1] gi s l A[k], sau di chA[k] v A[i].
Nh vy vi mi v tr i chng trnh ch thc hin i ch mt ln, v ngi ta tnh thi
gian thc hin trung bnh ca phng php ny t hn thi gian trung bnh ca hai phng
php trn.
Cc bn c s khi nh sau


Gio trnh tin hc c s II - Ngn ng C
72

(sp xp bng phng php chn)
V d V.3: chng trnh minh ho sp xp mng bng phng php ni bt
#include <stdio.h>
#include <conio.h>
void main(){
const max=10;
int n,a[max], i,j,tg;
do{
printf("Nhap so n : ");
scanf("%d", &n);
}while(n<2);
printf("\nNhap mang co %d phan tu \n",n);
for(i=0;i<n; i++)
{ printf("a[%d]= ",i);
scanf("%d",&a[i]);
}
for(i = 0; i<n-1; i++)
for(j =n-1; j>i;j--)
if(a[j]<a[j-1])
{ tg=a[j]; a[j]=a[j-1]; a[j-1]=tg;}
printf("Mang sau khi sap la \n");
for(i=0;i<n; i++)
printf("%d, ",a[i]);
}
Gio trnh tin hc c s II - Ngn ng C
73
Tm kim trn mng
Gi s cho trc mt mng cc s nguyn A(n), v mt s x. hy kim tra x c thuc
mng A hay khng?
Vi bi ton tm kim trn mng ni chung, chng ta phn hai trng hp:
Trng hp 1: Mng A khng c trt t (cha c sp) th tm kim mt gi
tr no th chng ta phi duyt tun t mng t phn t u tin cho ti khi gp
gi tr hoc ti phn t cui cng th mi khng nh c gii tr c thuc
mng hay khng. Nh vy trong trng hp km nht th s ln so snh l n.
c th minh ho nh sau:
// Nhp n, A(n), x
i = 0 ;
while((i <n)&&(A[i] !=x)) i++;
if(i >n-1) printf(%d khong co trong mang,x );
else printf(%d co trong mang tai vi tri %d, x, i);
Trng hp 2: Mng A c sp (khng mt tng qut gi s tng dn), trong
trng hp ny chng ta c th p dng phng php tm kim nh phn gim
s bc phi so snh. tng l ta chia i mng A thnh hai phn, so snh x vi
phn t gia ca mng A[g] xy ra ba trng hp :
A[g] = = x th kt lun x thuc vo A v kt thc
A[g] > x th chng ta lp li vic tm x trong na cui ca mng
A[g] < x th chng ta lp li vic tm x trong na u ca mng
Nh vy sau mt bc so snh chng ta c th gim s phn t cn duyt cn mt
na. Nh vy s ln kim tra so snh trung bnh s gim so vi phng php duyt
tun t.
c th minh ho nh sau:
// Nhp n, A(n), x
// Mng A theo th t tng dn
l = 0, r =n-1 ; // l, r ch s u, cui ca cc phn t cn duyt
while(l <= r)
{ g = (l+r)/2; // ly phn t gia
if (A[g] ==x) printf( %d thuc vo mng ); return;
if (A[g] > x)
l = g+1 ; // lp timg trong na cui
Gio trnh tin hc c s II - Ngn ng C
74
else
r = g-1; // tim trong na u.
}
printf(%d khong co trong mang,x );
//.......
V d V.4: Chng trnh sinh ngu nhin mt mng c n phn t, sp xp mng theo
th t tng bng phng php chn, Nhp x t bn phm kim tra x c trong mng hay
khng

V.3 - Mng 2 chiu
V.3.1 - nh ngha mng hai chiu
Mng hai chiu c th hiu nh bng gm cc dng cc ct, cc phn t thuc cng mt
kiu d liu no . Mng hai chiu c nh ngha nh sau.
C php
Kiu_mng tn_mng [sd][sc];
Trong :
- Kiu_mng: y l kiu ca mng, l tn mt kiu d liu tn ti, c th l
kiu chun hoc kiu d liu do ngi lp trnh nh ngha.
- tn_mng : l tn ca mng, do ngi lp trnh t, theo quy tc v tn ca C.
- sd, sc : l hng (hoc biu thc hng) nguyn, dng tng ng l s dng v
s ct mng, s phn t ca mng s l sd*sc.
V d:
int a[2][5]; // a l mng s nguyn c 2 dng, 5 ct (c 10 phn t)
float D[3][10]; // D l mng s thc c 3 dng, 10 ct (c 30 phn t)
char DS[5][30]; // DS l mng k t c 5 dng, 30 ct
Khi gp mt nh ngha mng, chng trnh dch s cp pht mt vng nh lin tip
c kch thc l sd*sc*sizeof (Kiu_mng) cho mng.
C th coi mng 2 chiu n dng, m ct l mng 1 chiu c n phn t, mi phn t li l
1 mng mt chiu c m phn t (mng ca mng). V d vi float D[3][10] c th xem D
l mng c 3 phn t D[0], D[1], D[2], mi phn t ny l mng c 10 phn t.


Gio trnh tin hc c s II - Ngn ng C
75
V.3.2 Truy xut cc phn t mng hai chiu
Mt phn t ca mng 2 chiu c xc nh qua tn (tn ca mng) v ch s dng,
ch s ct ca n trong mng theo c php sau:
tn_mng [csd][csc]
Vi csd l s nguyn xc nh ch s dng v csc l s hiu ct cng nh trong mng 1
chiu cc ch s c tnh t 0. Tc l 0 csd sd-1 v 0 csc sc-1.
Lu : Cc phn t ca mng 2 chiu cng c dng nh cc bin n, tr trng hp
khi nhp gi tr cho cc phn t mng kiu float bng hm scanf th bn nn s dng bin
(n) trung gian, sau gn gi tr ca bin vo phn t mng ch khng nn s dng
ton t & nhp trc tip phn t ca mng.
V.3.3 Khi u gi tr cc phn t mng hai chiu
Cc phn t mng hai chiu cng c th c khi u gi tr theo c php (4 dng sau):
1. Kiu_mng tn_mng [sd][sc] = {{k_dng_1},{ k_dng_2},..,{ k_dng_k}};
2. Kiu_mng tn_mng [ ][sc] = {{k_dng_1},{ k_dng_2},..,{ k_dng_k}};
3. Kiu_mng tn_mng [sd][sc] = { gt_1, gt_2,...,gt_n };
4. Kiu_mng tn_mng [ ][sc] = { gt_1, gt_2,...,gt_n };
C php trn c th gii thch nh sau:
dng 1: c k b gi tr s c gn cho k dng u tin ca mng (k sd ), vi mi
dng (c coi nh mng mt chiu) c khi to gi tr nh mng mt chiu:
dng th nht c khi u bi {k_dng_1}, dng th hai c khi u bi
{k_dng_1},.., dng th k c khi u bi {k_dng_k}. Yu cu k sd, ngc
li chng trnh s bo li.
Cc dng cui ca mng nu khng c b khi u tng ng th s c t ng gn
gi tr 0 (hoc NULL nu l con tr).
dng 2: (khng xc nh s dng) chng trnh dch s t ng n nh s dng ca
mng bng s b khi u ( = k), sau thc hin khi u nh dng 1.
dng 3: n gi tr trong b khi u c gn cho cc phn t mng theo cch: sc gi
tr u tin trong cc gi tr khi u (gt_1,..,gt_sc) c gn tun t cho cc phn t
ca dng th nht trong mng, sc phn t k tip s gn cho cc phn t dng th
2,... nu phn t no ca mng khng c gi tr khi u s c gn 0 (con tr l
NULL) - vi iu kin n sd*sc, ngc li l li.
dng 4: s dng ca mng s c chng trnh t tnh theo s gi tr trong b khi
u theo cng thc sd = (n/sc) +1, v khi u nh dng 3.
V d:
Gio trnh tin hc c s II - Ngn ng C
76
int a[3][2] = {{1,2},{3},{4,5}}; th cc phn t ca a nh sau:
a[0][0]=1, a[0][1]=2, a[1][0]=3, a[1][1]= 0, a[2][0]=4,a[2][1]=5;
int b[ ][2] = {{1,2},{3},{4,5}};
th l mng 3 dng, 2 ct cc phn t ca a nh sau:
b[0][0]=1, b[0][1]=2, b[1][0]=3,b[1][1]= 0, b[2][0]=4,b[2][1]=5;
int c[ ][2] = {1,2,3,4,5};
th s dng ca c l mng 5/2 +1 =3 dng, cc phn t ca a nh sau:
c[0][0]=1, c[0][1]=2, c[1][0]=3,c[1][1]= 4, b[2][0]=5,b[2][1]=0;
V.3.3 - Mt s v d v mng hai chiu
V d V.5: Chng trnh nhp mng A(n,m), 1 n,m 5, cc s nguyn t bn phm, in
mng ra mn hnh theo yu cu cc phn t cng mt hng c in trn mt dng ca
mn hnh, cc phn t cch nhau mt du trng.

#include <stdio.h>
#include <conio.h>
void main(){
clrscr(); //xa mn hnh
const int max =5; // kch thc ti a
int A[max][max];
int n,m,i,j;
do{printf("\nNhap so dong cua mang = ");
scanf("%d",&n);
printf("\nNhap so cot cua mang = ");
scanf("%d",&m);
} while(n<1 || n>max|| m<1 || m>max);
printf("\nNhap mang co %d dong, %d cot \n",n,m);
for(i=0; i<n; i++)
for(j=0; j<m; j++)
{
printf("A[%d][%d]= ",i,j);
scanf("%d",&A[i][j]);
}
printf("\nCac phan tu mang la \n");
for(i=0; i<n; i++)
{ printf("\n");
for(j=0; j<m; j++)
printf("%d ",A[i][j]);
}
getch();}
Gio trnh tin hc c s II - Ngn ng C
77
V d V.6: Chng trnh nhp 2 ma trn A(n,m), B(n,m), 1 n,m 5, cc s thc t bn
phm, tnh in ra mn hnh ma trn C = A+B.
Gii: Trc khi vit chng trnh chng ta lu n my vn :
C = A+B c ngha l cc phn ca C c tnh C[i][j] = A[i][j] + B[i][j]
ch c th cng hai ma trn A,B cng kch thc v C cng cng kch thc vi A,B
do cc phn t mng c kiu l float v vy khi nhp ta nn dng bin ph.

#include <stdio.h>
#include <conio.h>
void main(){
clrscr();
const int max =5; //s dng, ct ti a
float A[max][max],B[max][max],C[max][max];
int n,m,i,j;
float x;
do{
printf("\nNhap so dong cua ma tran = ");
scanf("%d",&n);
printf("\nNhap so cot cua ma tran = ");
scanf("%d",&m);
} while(n<1 || n>max|| m<1 || m>max);
printf("\nNhap A co %d dong, %d cot \n",n,m);
for(i=0; i<n; i++)
for(j=0; j<m; j++)
{
printf("A[%d][%d]= ",i,j);
scanf("%f",&x);A[i][j]=x;
}
printf("\nNhap B co %d dong, %d cot \n",n,m);
for(i=0; i<n; i++)
for(j=0; j<m; j++)
{
printf("B[%d][%d]= ",i,j);
scanf("%f",&x);B[i][j]=x;
}
for(i=0; i<n; i++)
for(j=0; j<m; j++)
C[i][j]=A[i][j]+B[i][j];

Gio trnh tin hc c s II - Ngn ng C
78

printf("\nCac phan tu ma tran C la \n");
for(i=0; i<n; i++)
{ printf("\n");
for(j=0; j<m; j++)
printf("%4.1f ",C[i][j]);
}
getch();
}
( v d V.6 - chng trnh tnh tng 2 ma trn )

V d V.7: Chng trnh nhp ma trn A(n,n), 1 n,n 5, cc s nguyn t bn phm, sau
kim tra v thng bo ma trn c i xng hay khng .
Gii: Mt ma trn A l i xng trc ht n phi l ma trn vung v cc phn t ca
n i xng nhau qua ng cho chnh, tc l A[i][j] =A[j][i]. Vy chng ta kim tra
mt ma trn i xng theo cch sau:
Vi mi i,j (0 i,j n-1) nu tn ti i,j m A[i][j] != A[j][i] th ta kt lun A khng i
xng, ngc li A l i xng.
Tt nhin chng ta khng cn phi xt mi cp (i,j) c th, v nu nh vy th:
- cp (A[i][j] A[j][i]), v (A[j][i], A[i][j]) thc cht l mt nhng li hai ln so
snh
- phn t trn ng cho chnh A[i][i] c so snh vi chnh n.
V th chng ta ch xt cc ch s (i,j) m phn t A[i][j] nm thc s pha trn ca
ng cho chnh. tc l ch cn xt cc cp phn t (A[i][j], A[j][i]) vi i chy t 0 ti
n-1 v vi j chy t i+1 ti n-1 l . Hn na chng ta ch duyt cc cp (A[i][j], A[j][i])
nu cha pht hin c cp no khc nhau.
Vy ta c th m t nh sau:
d=0; // d l bin nh du ghi nhn c gp mt cp (A[i][j]!= A[j][i]) th d=1
for(i=0; (i<n) && (d= =0); i++)
for(j= i+1; (j<n) && (d= =0); j++)
if(A[i][j]!=A[j][i]) d=1;
Kt thc on lnh lp trn ch c hai kh nng
- nu d=1 tc l c cp (A[i][j]!=A[j][i]) tc l ma trn khng i xng.
- ngc li,(d=0) th ma trn l i xng.
Gio trnh tin hc c s II - Ngn ng C
79
#include <stdio.h>
#include <conio.h>
void main(){
clrscr();
const int max =5; //
int A[max][max];
int n,d,i,j;
do{
printf("\nNhap so dong, so cot cua ma tran = ");
scanf("%d",&n);
} while(n<1 || n>max);
printf("\nNhap ma tran vuong cap %d \n",n,n);
for(i=0; i<n; i++)
for(j=0; j<n; j++)
{
printf("A[%d][%d]= ",i,j);
scanf("%d",&A[i][j]);
}
for(i=0,d=0; (i<n)&&(d==0); i++)
for(j=0; (j<n)&&(d==0); j++)
if(A[i][j]!=A[j][i]) d=1;
if(d) printf("\nMa tran khong doi xung");
else
printf("\nMa tran doi xung");
getch();
}
(V d V.6 - kim tra ma trn i xng)

V.4 - Con tr v mng
Trong phn ny chng xem xt k hn v cc t chc ca mng trong b nh; lin h
gia mng, cc phn t ca mng vi con tr, cc php ton trn con tr. Tuy nhin con
tr l mt kiu quan trong ca C. Trong phn ny chng ti cha cp ti ht tt c cc
kha cnh ca con tr nh cp pht ng, tryn tham s hm l con tr, danh sch lin kt.
Cc ni dung ny s c gii thiu trong chuyn k hn v C.
V.4.1 - Con tr v cc php ton trn con tr
Trong phn u trnh by v kiu d liu v cc php ton chng ta cng cp ti
kiu con tr, trong phn ny chng ta d cp chi tit hn v con tr v cc php ton c
th s dng trn chng.
Con tr l kiu d liu m mt thnh phn kiu ny c th lu tr a ch ca mt
thnh phn no (c th l bin, hng, hm), hoc ta ni n tr ti thnh phn .
Gio trnh tin hc c s II - Ngn ng C
80
Mt con tr lu tr a ch ca mt thnh kiu T th ta ni p l con tr kiu T, c bit
nu T l mt kiu con tr, hay ni cch khc, p lu tr a ch ca mt con tr khc th ta
ni p l con tr tr ti con tr.
C php khai bo con tr
<kiu> * <tn_con_tr>;
V d:
int *p; // p l con tr kiu int
float * q ; // q l con tr kiu float
char *s ; // s l con tr kiu char hay xu k t
int ** r; // r l con tr ti con tr kiu int
Cng ging nh bin bnh thng khi khai bo mt bin con tr, chng trnh dch
cng cp pht vng nh cho bin , lu rng gi tr trong vng nh ang l bao
nhiu th quan nim l a ch m con tr ny tr ti. V vy cc bn phi ch khi
dng con tr phi bo m n tr ti ng vng nh cn thit.
Mt con tr cha lu tr a ch ca thnh phn no ta gi l con tr rng v c gi tr
l NULL (l mt hng nh ngha sn thc ra = 0).
Khi gp cc lnh khai bo bin trong chng trnh th chng trnh dch s cp pht
vng nh ph hp v 'gn' tn bin vi vng nh .
V d:
int tuoi; float luong;

Nu chng ta c con tr p kiu float, p lu a ch ca luong v luong 65000 nh sau:
float luong;

float * p;

gi s a ch 1000
Gio trnh tin hc c s II - Ngn ng C
81
p = &luong;
*p = 650000


Khi con tr tr ti mt vng nh v d nh p tr ti luong th khi truy xut *p chnh l
gi tr ca vng nh do p tr ti tc l *p luong.
Vi con tr tr ti mt con tr khc chng hn nh v d sau:
int a = 10;
int *pa;
int **ppa;
pa = &a; // p tr ti a
ppa = &pa; // ppa tr ti pa
th chng ta c:
*ppa pa &a;
**ppa *pa a;
Cc php ton trn con tr (a ch )
a. Php so snh hai con tr
Trn con tr tn ti cc php so snh (= =, !=, <, <=, >,>=) hai con tr bng nhau l
hai con tr cng tr ti mt i tng (c gi tr bng nhau), ngc li l khc nhau. Con
tr tr ti vng nh c a ch nh hn l con tr nh hn.
Gio trnh tin hc c s II - Ngn ng C
82
b. Php cng con tr vi s nguyn
Gi s p l con tr kiu T, k l s nguyn th (p + k) cng l con tr kiu T, khng
mt tng qut gi s p tr ti phn t t th
p+1 l con tr tr ti mt phn t kiu T k tip sau t
p+2 tr ti mt phn t kiu T k tip sau t 2 phn t,...
p -1 l con tr tr ti mt phn t kiu T k tip trc t
p -2 tr ti mt phn t kiu T k tip trc t hai phn t,...
tng qut p+k tr ti phn t cch t mt khong k phn t kiu T (nu k >0 dch
v pha a ch ln, k<0 th dch v pha a ch nh).
V d:
int a; // gi s a c a ch 150
int *p;
p = &a;
th p+1 l con tr kiu nguyn v p+1 tr ti a ch 152; p + k tr ti 150 +2*k.
c. Php tr hai con tr
Nu p, q l hai con tr cng kiu T th p-q l s nguyn l s cc phn t kiu T nm
gia hai phn t do p v q tr ti.
V d:
int *p, *q;
gi s p tr ti phn t c a ch 180, q tr ti phn t c a ch 160 th
(p-q) = = 10;
float *r1, *r2;
gi s r1 tr ti phn t c a ch 120, r2 tr ti phn t c a ch 100 th
(r1-r2) = = 5;

V.4.2 - T chc vng nh ca mng
Nh trong phn trn chng ta ni, khi c mt nh ngha mng th chng trnh
bin dch cp pht mt vng nh (lin tip - cc nh lin k nhau) c kch thc bng
tng kch thc ca cc phn t trong mng, cc phn t ca mng xp tun t trong b
nh, phn t u tin c a ch thp nht trong vng , v y cng chnh l a ch ca
mng, phn t th hai ca mng s l nh k st sau ( nh c a ch cao hn) phn t
th nht,... y chng ta ni nh c th l 1 byte, 2 byte, 4 byte,.. ty theo kiu d
Gio trnh tin hc c s II - Ngn ng C
83
liu ca cc phn t mng l g (tng ng l 1,2,4,.. byte). V a ch ca nh l a
ch ca byte u tin trong cc byte .
V d 1: chng ta nh ngha mng A kiu nguyn:
int A[5];
Chng trnh dch s cp pht mt vng nh 5 2 = 10 byte cho mng A, gi s rng
vng nh c a ch l 100 (byte u tin c a ch l 100 ). th cc phn t ca A
nh hnh sau:

(mng A c 5 phn t kiu int)

V d 2: chng ta nh ngha mng X kiu float:
float X[6];
Chng trnh dch s cp pht mt vng nh 6 4 = 24 byte cho mng X, gi s rng
vng nh c a ch l 200 ( byte u tin c a ch l 200) th cc phn t ca X
c cp pht l a ch ca X[0] l 200 (&X[0] = 200), &X[1] = 204,..,&X[5] =216.
Vi mng 2 chiu, gi s mng D c n dng, m ct, kiu int:
int D[n][m]; // n, m l hng nguyn
Tc l c nm phn t kiu nguyn, nh trn chng ta ni D c xem l mng c n
phn t, mi phn t li l mt mng, mng thnh phn ny c m phn t. Nh vy D
c cp pht mt vng nh lin tip, trong vng c n vn con cho n phn t (dng),
trong mi vng con c m nh (mi l mt phn t, 2byte). Hay ni cch khc cc
phn t ca mng c cp pht lin tip, u tin l m phn t ca hng 0, sau l m
phn t ca hng 1,...
Gi s a ch ca mng D l xxxx th cc phn t ca n nh sau:
D[0] c a ch l xxxx
D[0][0] c a ch l xxxx (&D[0][0] = =xxxx)
D[0][1] c a ch l xxxx + 2 (&D[0][1] = =xxxx + 2)
....
Gio trnh tin hc c s II - Ngn ng C
84
D[0][m-1] c a ch l xxxx+2(m-1) (&D[0][m-1] = = xxxx +2(m-1))
D[1] c a ch l xxxx +2m
D[1][0] c a ch l xxxx +2m (&D[0][0] = =xxxx+2m)
D[1][1] c a ch l xxxx + 2m +2 (&D[0][1] = =xxxx + 2m+2)
....
D[1][m-1] c a ch l xxxx+2m +2(m -1) (&D[0][m-1] = = xxxx +2m+2(m-1))
...
V d:
int D[3][4];
Gi s D c cp pht ti vng nh c a ch 100 th cc phn t ca D nh sau:


Hn ch s phn t ca mng
Tuy rng ngn ng khng a ra con s c th gii hn cc phn t ca mng, nhng
kch thc ca mng b hn ch bi cc yu t sau:
Cc phn t mng c cp pht lin tip, trong 1 on b nh (64kb), do vy
tng kch thc ca mng 64kb (s_pt sizeof(kiu_mng) 65535)
Kch thc mng c th cp pht ph thuc lng b nh t do m chng trnh
dch c th cp pht c.
V d nu b nh t do (trong 1 on) c th cp pht cn li l 100 byte th nu l
mng nguyn 1 chiu kiu int th kch thc ti a c th l 50, vi mng mt chiu
kiu float th ch c th l 25 phn t,..
V.4.3 - Lin h gia con tr v mng
Trong C con tr v mng c lin h rt cht ch vi nhau, nh trn chng ta bit tn
mng l mt hng con tr. Hn na cc phn t ca mng c th c truy xut thng qua
ch s hoc thng qua con tr.
Gio trnh tin hc c s II - Ngn ng C
85
Nh trn chng ta bit, mng c cp pht ti vng nh no v a ch ca vng
nh chnh l a ch ca mng. Tn mng l con tr tr ti chnh a ch ca n hay
ni khc tn mng l con tr lu a ch ca mng, nhng l hng con tr. Chng ta gii
thch c th hn qua v d sau:
V d vi khai bo
int A[3], D[2][5];
th A, D l cc con tr v: A chnh l a ch ca mng A, hay bng &A[0]; tng t cho
mng D ta cng c D &D[0].
V theo nh cch gi ca con tr th ta ni A l con tr tr ti phn t u tin ca mng.
Vi mng hai chiu D th cng tng t, D cng l mt con tr tr ti D[0], v D[0] li l
mt con tr tr ti D[0][0], c th ni D l con tr tr ti con tr.
Nh vy A l mng kiu int tc l cc phn t ca n c kiu int, v nh vy A l con
tr kiu int, hay A c kiu l int *.
Tng t, D[i] (n chung l cc hng ca mng D) l con tr kiu int, tc l D[i] c
kiu l int *, v D l con tr tr ti D[0] - Cc D[i] l mng int[5], vy D l con tr kiu
int [5].
Tn mng c th gn cho cc (bin) con tr c kiu ph hp.
V d: vi cc con tr v mng sau
int A[10];
int D[2][4];
int *p;
int (*q)[4]; // khai bo q l con tr kiu int [4],
chng ta c th thc hin cc php gn sau:
p = A;
q = D;
p = D[i];
Truy xut cc phn t mng qua con tr
Gi s A l mng mt chiu nh trn chng ta c:
- A l con tr tr ti A[0] hay A tng ng vi &A[0]
- (A +1) l con tr tr ti phn t kiu T k tip sau A[0] tc l A+1 tr ti A[1]
hay (A+1) &A[1]
- Tng qut (A+i) &A[i]
Nh chng ta bit t trc l nu p l con tr lu a ch ca bin x th * p l gi tr
ca x.
Nh vy *A chnh l gi tr ca A[0], *(A+1) l A[1],...
tng qut chng ta c *(A+i) A[i]
Gio trnh tin hc c s II - Ngn ng C
86
V d chng ta c th minh ha bng on lnh nhp v in cc phn t mng A nh
sau:
int A[10];
int i;
....
// nhp mng A c 10 phn t
for(i = 0; i<10; i++)
{ printf(A[%d] = , i);
scanf(%d, A+i);
}
// in mng A c 10 phn t,
for(i = 0; i<10; i++)
{ printf(A[%d] = , i);
scanf(%d, *(A+i));
}

Vi mng 2 chiu D[n][m] cng tng t nh trn ta c:
D l con tr tr ti hng du tin trong mng tc l: D &D[0]
- D[0] l con tr tr ti phn t u tin l D[0][0] hay D[0] &D[0][0]
nn *D[0] D[0][0];
hay ** D D[0][0]
- (D[0]+j ) con tr ti phn t D[0][j], hay (D[0]+j) &D[0][j]
nn ta c *(D[0]+j) D[0][j]
hay *(*D+j) D[0][j]
Tng t tng qut ta c (D+i) &D[i].
- D[i] l con tr tr ti phn t u tin l D[i][0] hay D[i] &D[i][0]
nn *D[i] D[i][0];
hay *(*D+i) D[i][0]
- (D[i]+j ) con tr ti phn t D[i][j], hay (D[i]+j) &D[i][j]
nn ta c *(D[i]+j) D[i][j]
hay tng qut ta c *(*(D+i)+j) D[i][j]
Gio trnh tin hc c s II - Ngn ng C
87
Bi tp
1. tch v hng 2 vector
2. Nhp mng, tm phn t ln nht, nh nht, trung bnh cc phn t dng, m
3. Nhp mng A(n), cc phn t l s nguyn, hy cho bit trt t ca mng
4. bi ton sp xp bng phng php chn v i ch
5. tm kim trn mng khng th t
6. tm kim trn mng c th t
7. in cc phn t khc nhau ca mng khng c th t
8. in cc phn t khc nhau ca mng c th t
9. ghp hai mng tng
10. Vit chng trnh nhp A(n,m), B(n,m), tnh v in C= A+B
11. Vit chng trnh nhp A(n,m), B(m,p), tnh v in C= A*B
12. Vit chng trnh nhp A(n,n) kim tra A c l ma trn i xng hay khng?
13. Vit chng trnh nhp A(n,n) kim tra A c l ma trn n v hay khng?
14. Vit chng trnh nhp A(n,n) kim tra A im yn nga hay khng? nu c hy in gi tr,
ch s ca n.
15. Vit chng trnh xy dng ma trn xon c
16. Vit chng trnh xy dng ma phng bc l
17. Vit chng trnh tnh nh thc ma trn vung bng phng php kh
18. Vit chng trnh gii h phng trnh bc nht n n

Gio trnh tin hc c s II - Ngn ng C
88
VI Cc vn c bn v hm
Trong cc ngn ng lp trnh c cu trc th vic xy dng v s dng cc chng
trnh con c ngha quan trng n gip chng ta phn chia chng trnh thnh cc modul
c lp nh hn, d kim sot, d pht trin hn v c th s dng li cc modul
nhiu ni m khng phi vit li. Khc vi mt s ngn ng lp trnh khc, chng trnh
con c th l hm hoc th tc, trong C ch c mt loi l hm.
Trong phn ny chng ta xem xt hm mc n gin nht, gip bn c c khi
nim c bn ban u v hm v c th vit c cc hm n gin
Hm l mt l mt n v c lp ca chng trnh, mi hm c mt chc nng xc
nh, c th c gi thc hin bi hm hoc chng trnh khc. Trong C cc hm u
ngang mc, tc l trong nh ngha hm khng th cha nh ngha hm khc (gi l hm
1 mc). C hai loi hm l hm ca th vin v hm do ngi lp trnh nh ngha
(hay cn gi l hm ca ngi dng)
Vi mt hm ni chung th cc thng tin xc nh l: Tn hm, kiu gi tr tr v ca
hm (gi l kiu hm), v cc tham s ca n. Tc l vi mt hm cn phi xc nh 3
thng tin nhn din
- tn hm
- d liu vo
- kiu qu tr v (kiu hm)

Ni chung xy dng mt hm thng c hai phn l khai bo nguyn mu hm v
nh ngha hm. V tr ca hai phn ny bn c xem li phn cu trc chng trnh.
VI.1 - Nguyn mu (prototype) hm
Nguyn mu hm l dng khai bo cho chng trnh dch bit cc thng tin v hm bao
gm: tn hm, kiu hm v kiu cc tham s (u vo) ca hm.
C php khai bo nguyn mu hm
<kiu_hm> <tn_hm>([Cc_khai_bo_kiu_tham_s]);
Trong
tn_hm: l mt tn hp l theo quy tc v tn ca ngn ng C. mi hm c tn duy
nht v khng c trng vi cc t kha. Tn hm s c dng gi hm.
kiu_hm : Hm c th tr v mt gi tr cho ni gi, gi tr thuc mt kiu d
liu no , kiu c gi l kiu hm. Kiu hm c th l kiu chun cng c
th l kiu do ngi dng nh ngha. Nu hm khng tr v gi tr th kiu hm l
void.
Cc_khai_bo_kiu_tham_s: Hm c th nhn d liu vo thng qua cc tham s
ca n (tham s hnh thc), cc tham s ny cng thuc kiu d liu xc nh. C th
Gio trnh tin hc c s II - Ngn ng C
89
c nhiu tham s, cc tham s cch nhau bi du phy (,). Trong nguyn mu khng
bt buc phi c tn tham s nhng kiu ca n th bt buc. Nu hm khng c
tham s chng ta c th trng phn ny hoc c th khai bo l void.
V d:
int max(int a, int b); // khai bo nguyn mu hm max, c hai tham s kiu int, kt qu
tr v kiu int
float f(float, int); // nguyn mu hm f, c hai tham, tham s th nht kiu float, tham s
th 2 kiu int, kt qu tr v kiu float
void nhapmang(int a[], int ); // hm nhapmang, kiu void (khng c gi tr tr v), tham
s th nht l mt mng nguyn, tham s th 2 l mt s nguyn
void g(); // hm g khng i, khng kiu.
VI.2 - nh ngha hm
C php:
<kiu_hm> <tn_hm>([khai_bo_tham_s])
{
< thn hm>
}
Dng th nht l tiu hm (dng tiu ) cha cc thng tin v hm: tn hm, kiu
ca hm (hai thnh phn ny ging nh trong nguyn mu hm) v khai bo cc tham s
(tn v kiu) ca hm, nu c nhiu hn mt th cc tham s cch nhau bi du phy(,).
Thn hm l cc lnh nm trong cp { }, y l cc lnh thc hin chc nng ca hm.
Trong hm c th c cc nh ngha bin, hng hoc kiu d liu; cc thnh phn ny tr
thnh cc thnh phn cc b ca hm.
Nu hm c gi tr tr v (kiu hm khc void) th trong thn hm trc khi kt thc
phi c cu lnh tr v gi tr:
return <gi tr>;
<gi_tr> sau lnh return chnh l gi tr tr v ca hm, n phi c kiu ph hp vi
kiu ca hm c khai bo trong dng tiu . Trng hp hm void chng ta c th
dng cu lnh return (khng c gi tr) kt thc hm hoc khi thc hin xong lnh
cui cng (gp } cui cng) hm cng kt thc.
V d 1: Hm max tr li gi tr ln nht trong 2 s nguyn a, b
void max (int a, int b)
{ if(a>b)
return a;
else
return b;
}
Gio trnh tin hc c s II - Ngn ng C
90

V d 2: Hm nhp mt mng c n phn t nguyn:
tn hm: nhapmang
gi tr tr v: khng tr v
tham s: c hai tham s l mng cn nhp A v s phn t cn nhp N

nguyn mu hm nh sau:
void nhapmang (int [], int);
nh ngha hm nh sau:

void nhapmang (int A[], int N) {
int i;
printf("\nNhap mang co %d phan tu \n",N);
for(i=0;i<N; i++)
{ printf("a[%d]= ",i);
scanf("%d",&a[i]);
}
return ;
}
VI.3 - Li gi hm v truyn tham s
Mt hm c th gi thc hin thng qua tn hm, vi nhng hm c tham s th trong
li gi phi truyn cho hm cc tham s thc s (i s) tng ng vi cc tham s hnh
thc.
Khi hm c gi v truyn tham s ph hp th cc lnh trong thn hm c thc
hin bt u t lnh u tin sau du m mc { v kt thc khi gp lnh return, exit hay
gp du ng mc } kt thc hm.
C php:
<tn_hm> ([danh sch cc tham s thc s]);
Cc tham s thc s phi ph hp vi cc tham s hnh thc:
s tham s thc s phi bng s tham s hnh thc.
Tham s thc s c truyn cho cc tham s hnh thc tun t t tri sang phi,
tham s thc s th nht truyn cho tham s hnh thc th nht, tham s thc s
th 2 truyn cho tham s hnh thc th 2,.. kiu ca cc tham s hnh thc phi ph
hp vi kiu ca cc tham s hnh thc. S ph hp y c hiu l kiu trng
nhau hoc kiu ca tham s thc s c th p v kiu ca tham s hnh thc.
V d: gi s c cc hm max, nhapmang nh nh ngha trn
int a=4, b=6,c;
int D[10];
Gio trnh tin hc c s II - Ngn ng C
91
c = max(a,b);
nhapmang(D,5);

Lu sau ny chng ta thy hm c th c i s thay i v chng c th c
truyn tham s vi gi tr ngm nh v vy tham s hnh thc c th t hn tham s
thc s.
Mt s v d
V d VI.1: Vit chng trnh nhp mt s n t bn phm ( n >2), in cc s nguyn t t 2
ti n.
Gii: in cc s nguyn t trong khong t 2 ti n chng ta thc hin nh sau: vi mi
s k [2,n] kim tra xem k c l nguyn t hay khng, nu ng th in k ra mn hnh.
Vy chng ta s xy dng hm kim tra mt s c l nguyn t hay khng,
tn hm: nguyento
u vo: k l mt s nguyn cn kim tra
gi tr tr v: 1 nu ng k l s nguyn t, ngc li tr v 0.


#include <math.h>
#include <stdio.h>
#include <conio.h>
int nguyento(int k);//nguyn mu hm kim tra k l s nguyn t
void main(){
int k, n;
do{
printf("\nNhap gia tri n (n>=2) = ");
scanf("%d",&n);
} while(n<2);
printf("\nCac so nguyen to tu 2 toi %d la \n",n);
for(k=2; k<=n; k++)
if (nguyento(k)) printf("%d, ",k);
}
//-----nh ngha hm nguyento ------------

int nguyento(int k){
int i=2;
while((i<=sqrt(k))&&(k%i)) i++;
if(i>sqrt(k))
return 1;
Gio trnh tin hc c s II - Ngn ng C
92
else
return 0;
}

( v d VI.1 - in cc s nguyn t t 2 ti n)
V d VI.2 - Vit chng trnh nhp 2 mng A, B c n phn t nguyn t bn phm, tnh
mng tng C = A+B, in 3 mng A, B, C ra mn hnh.
Yu cu:
- n <20;
- chng trnh gm 3 hm: hm nhp mng, hm in mng, hm tng hai mng.
Gii: Chng ta cn xy dng 3 hm nh sau
1. Hm nhp mng
Tn hm: nhapmang
Gi tr tr v: khng tr v (void)
Tham s: mng cn nhp ( int A[]) v s phn t kiu int
nguyn mu: void nhapmang( int A[], int n);
2. Hm in mng
Tn hm: inmang
Gi tr tr v: khng tr v (void)
Tham s: mng cn in ( int A[]) v s phn t ca mng kiu int
nguyn mu: void inmang( int A[], int n);
3. Hm tnh tng hai mng
Tn hm: tong
Gi tr tr v: khng tr v (void)
Tham s: hai mang A, B, mng kt qu C v s phn t kiu int
nguyn mu: void tong ( int A[], int B[], int C[], int n);
Cc bn c chng trnh minh ha nh sau

Gio trnh tin hc c s II - Ngn ng C
93
#include <stdio.h>
#include <conio.h>
void nhapmang(int a[], int n);
void inmang(int a[], int n);
void tong(int A[],int B[],int C[],int n);
void main(){
clrscr();
const int max = 20; //
int A[max], B[max],C[max];
int n;
do{
printf("\nNhap so phan tu mang = ");
scanf("%d",&n);
} while(n<1 || n>max);
printf("\nNhap A \n");
nhapmang(A,n);
printf("\nNhap B \n");
nhapmang(B,n);
tong(A,B,C,n);
printf("\nmang A: ");
inmang(A,n);
printf("\nmang B: ");
inmang(B,n);
printf("\nmang C: ");
inmang(C,n);
getch();
}
void nhapmang(int a[], int n){
int i;
printf("\nNhap mang co %d phan tu \n",n);
for(i=0; i<n; i++)
{
printf("pt thu [%d]= ",i);
scanf("%d",&a[i]);
}
}
void inmang(int a[], int n){
int i;
for(i=0; i<n; i++)
printf("%d ",a[i]);
}
void tong(int A[],int B[],int C[],int n){
int i;
for (i = 0; i<n; i++) C[i]=A[i]+B[i];
}

Gio trnh tin hc c s II - Ngn ng C
94
Hm v truyn tham s
Vi C vic tryn tham s cho hm c thc hin qua c ch truyn tham tr. Tc l
trong hm chng ta s dng tham s hnh thc nh l mt bn sao d liu ca tham s
c truyn cho hm, do vy chng khng lm thay i gi tr ca tham s truyn vo.
Hay ni khc i, cc tham s hnh thc l cc bin c b trong hm, s thay i ca n
trong hm khng nh hng ti cc bin bn ngoi.
Vy trong trng hp thc s cn thay i gi tr ca tham s th th no? chng hn
bn cn hm hon i gi tr ca a v b.
Nu bn vit hm
void doicho(int x, int y) {
int tg;
tg = x;
x=y;
y=tg;
}
hm ny ng c php nhng vi cc lnh sau:
int a = 4;
int b = 6;
printf ("\ntruoc khi goi ham doi cho a=%d, b=%d",a,b);
doicho(a,b);
printf ("\nsau khi goi ham doi cho a=%d, b=%d",a,b);
kt qu in ra l
truoc khi goi ham doi cho a=4,b=6
sau khi goi ham doi cho a=4,b=6
R rng hm i ch (doicho) thc hin khng ng, nguyn nhn l vi hm doicho
x, y l hai bin cc b, khi gi hm doicho(a,b) chng trnh dch cp pht vng nh cho
hai bin (tham s hnh thc) x, y v sao chp gi tr ca a vo x, b vo y, mi thao tc
trong hm doicho u thc hin trn x, y m khng nh hng ti a v b, kt qu l a, b
khng i.
khc phc iu ny chng ta nh ngha hm vi tham s l con tr v khi gi cc
bn hy truyn cho n a ch ca tham s thc s, v d:
Gio trnh tin hc c s II - Ngn ng C
95

void doicho2(int * x, int *y) {
int tg;
tg = *x;
*x = *y;
*y = tg;
}
Lc ny vi cc lnh sau:
int a = 4;
int b = 6;
printf ("\ntruoc khi goi ham doi cho a=%d, b=%d",a,b);
doicho(&a,&b);
printf ("\nsau khi goi ham doi cho a=%d, b=%d",a,b);
kt qu in ra l
truoc khi goi ham doi cho a = 4,b = 6
sau khi goi ham doi cho a = 6 , b = 4
--------------------------------

Ti liu tham kho
1. Phc, T Minh Chu - K thut lp trnh Turbo C
2. Phm Vn t - K thut lp trnh Turbo C - C s v nng cao
3. Scott Robert Ladd - C++ K thut v ng dng, Nguyn Hng dch

You might also like