You are on page 1of 169

Mc lc

MC LC
CHNG 1. GII THIU ............................................................... 7
1.1. Ngun gc ca ngn ng C ..................................................................... 7
1.2. C l ngn ng bc trung........................................................................... 7
1.3. C l ngn ng c cu trc ........................................................................ 8
1.4. Cu trc ca mt chng trnh C ............................................................. 9
1.5. Chng trnh u tin ............................................................................ 10
1.6. Bi tp ................................................................................................... 13

CHNG 2. BIU THC (EXPRESSION) .................................15


2.1. Kiu d liu c s (Basic Data Type) .................................................... 15
2.2. B ng kiu d liu c s (Modifying the Basic Type) ......................... 15
2.3. nh danh (Identifier) ............................................................................ 16
2.4. Bin (Variable) ...................................................................................... 16
2.5. Hng (Constant) .................................................................................... 17
2.6. Ton t (Operator)................................................................................. 18
2.6.1. Ton t gn ............................................................................................. 18
2.6.2. Ton t s hc ......................................................................................... 19
2.6.3. Ton t quan h v logic ......................................................................... 20
2.6.4. Ton t ? ................................................................................................. 20
2.6.5. Ton t bit ............................................................................................... 20
2.6.6. Ton t sizeof .......................................................................................... 21
2.6.7. Ton t () v [] ........................................................................................ 22
2.6.8. p kiu .................................................................................................... 22
2.6.9. u tin ca tt c cc php ton ......................................................... 22

2.7. Biu thc (Expression) .......................................................................... 23


2.7.1. Chuyn i kiu trong biu thc .............................................................. 23
2.7.2. Khong trng v du ngoc n .............................................................. 23
2.7.3. Vit nhanh ca php ton gn.................................................................. 23
2.7.4. Cc hm ton hc c bn ........................................................................ 24

2.8. Vo ra d liu c bn............................................................................. 24


2.8.1. In gi tr ra mn hnh (hm printf()) ........................................................ 24
2.8.2. Nhp d liu t bn phm (hm scanf()) .................................................. 27

2.9. Mt s v d c bn ............................................................................... 30
2.9.1. V d 1 ..................................................................................................... 30
Dng Hong Huyn

Ngn ng lp trnh C

2.9.2. V d 2 .................................................................................................... 30
2.9.3. V d 3 .................................................................................................... 31

2.10. Cu hi trc nghim v bi tp ............................................................ 31


2.10.1. Cu hi trc nghim.............................................................................. 31
2.10.2. Bi tp .................................................................................................. 32

CHNG 3. CU LNH (STATEMENT) ................................... 35


3.1. True v False trong C ............................................................................ 35
3.2. Lnh la chn (Selection)...................................................................... 35
3.2.1. Lnh if..................................................................................................... 35
3.2.2. Cc lnh if lng nhau .............................................................................. 37
3.2.3. Cc lnh if-else-if lin tc ....................................................................... 37
3.2.4. Lnh switch ............................................................................................. 38

3.3. Lnh lp (Repetitive) ............................................................................. 42


3.3.1. Lnh lp for ............................................................................................ 42
3.3.2. Lnh lp while......................................................................................... 44
3.3.3. Lnh lp do-wihle ................................................................................... 44

3.4. Lnh nhy (Jump) ................................................................................. 46


3.4.1. Lnh return ............................................................................................. 46
3.4.2. Lnh goto ................................................................................................ 46
3.4.4. Lnh continue ......................................................................................... 48

3.5. Cu hi trc nghim v bi tp .............................................................. 48


3.5.1. Cu hi trc nghim................................................................................ 48
3.5.2. Bi tp .................................................................................................... 50

CHNG 4. MNG V CHUI (ARRAY & STRING) ............ 57


4.1. Khi nim.............................................................................................. 57
4.2. Mng mt chiu..................................................................................... 57
4.3. Chui kt thc rng (null-terminated string) .......................................... 58
4.4. Mng hai chiu ...................................................................................... 60
4.5. Khi gn mt mng ............................................................................... 62
4.5.1. Khi gn mng mt chiu ....................................................................... 62
4.5.2. Khi gn mng hai chiu ........................................................................ 63
4.5.3. Khi gn mng khng kch thc ............................................................ 64

4.6. Cu hi trc nghim v bi tp .............................................................. 64


4.6.1. Cu hi trc nghim................................................................................ 64
4.6.2. Bi tp .................................................................................................... 65
Khoa Cng ngh thng tin Trng i hc Quy Nhn

Mc lc

CHNG 5. CON TR (POINTER) ............................................69


5.1. Khi nim con tr .................................................................................. 69
5.2. Bin con tr ........................................................................................... 69
5.3. Ton t trn con tr ............................................................................... 70
5.4. Biu thc con tr ................................................................................... 70
5.4.1. Php ton gn .......................................................................................... 71
5.4.2. Ton t s hc trn con tr ...................................................................... 71
5.4.3. So snh con tr ........................................................................................ 72

5.5. Con tr v mng .................................................................................... 72


5.6. Mng cc con tr ................................................................................... 73
5.7. Tr gin tip .......................................................................................... 74
5.8. Cp pht b nh ng ............................................................................ 75
5.8.1. Cc hm lin quan ................................................................................... 75
5.8.2. Cp pht b nh ng cho mng mt chiu ............................................. 76
5.8.3. Cp pht b nh ng cho mng hai chiu .............................................. 77

5.9. Mt s vn vi con tr ...................................................................... 80


5.9.1. Xc nh con tr trc khi s dng .......................................................... 80
5.9.2. Khng nn gn gi tr c th cho con tr ................................................. 80
5.9.3. Gi tr con tr thay i ............................................................................ 81

5.10. Cu hi trc nghim v bi tp............................................................. 81


5.10.1. Cu hi trc nghim .............................................................................. 81
5.10.2. Bi tp ................................................................................................... 83

CHNG 6. HM (FUNCTION) ..................................................85


6.1. Dng tng qut ca mt hm ................................................................. 85
6.2. Cc lut phm vi ca hm ...................................................................... 87
6.3. Lnh return ............................................................................................ 87
6.4. Tham s ca hm ................................................................................... 88
6.4.1. Gi hm theo tham tr v theo tham chiu............................................... 88
6.4.2. Gi mng n hm .................................................................................. 89

6.5. Con tr hm ........................................................................................... 92


6.6. Tham s trong hm main ....................................................................... 95
6.7. quy (Recursion)................................................................................ 95
6.8. Cu hi trc nghim v bi tp .............................................................. 96
Dng Hong Huyn

Ngn ng lp trnh C

6.8.1. Cu hi trc nghim................................................................................ 96


6.8.2. Bi tp .................................................................................................... 98

CHNG 7. KIU CU TRC, HP, LIT K V KIU


NGI DNG NH NGHA ..................................................... 101
7.1. Cu trc (Structure) ............................................................................. 101
7.1.1. Khi nim ..............................................................................................101
7.1.2. Mng cu trc........................................................................................103
7.1.3. Con tr cu trc .....................................................................................105
7.1.4. Mng bn trong cu trc ........................................................................106
7.1.5. Cu trc bn trong cu trc ...................................................................109
7.1.6. Trng bit ..............................................................................................113

7.2. Kiu hp (unions)................................................................................ 113


7.3. Kiu lit k (Enumeration) .................................................................. 115
7.4. Dng ton t sizeof m bo tnh kh chuyn................................. 117
7.5. Kiu ngi dng nh ngha (User-Defined) ....................................... 118
7.6. Cu hi trc nghim v bi tp ............................................................ 118
7.6.1. Cu hi trc nghim...............................................................................118
7.6.2. Bi tp ...................................................................................................119

CHNG 8. VO/RA D LIU TRN CONSOLE ................. 123


8.1. c v vit mt k t ........................................................................... 123
8.1.1. Mt vn vi hm getchar ...................................................................124
8.1.2. Bin th ca hm getchar() ....................................................................124

8.2. c v vit chui ................................................................................ 125


8.3. Hm printf ........................................................................................... 127
8.4. Hm scanf ........................................................................................... 127
8.5. Cu hi trc nghim v bi tp ............................................................ 127
8.5.1. Cu hi trc nghim...............................................................................127
8.5.2. Bi tp ...................................................................................................127

CHNG 9. C/GHI D LIU TRN FILE ......................... 129


9.1. Lung v file ....................................................................................... 129
9.1.1. Lung (stream).......................................................................................129
9.1.2. File ........................................................................................................129

9.2. Cc hm c s trn file ........................................................................ 130


9.2.2. Con tr file.............................................................................................130
Khoa Cng ngh thng tin Trng i hc Quy Nhn

Mc lc

9.2.3. M mt file (hm fopen()) ...................................................................... 130


9.2.4. ng mt file (hm fclose()) .................................................................. 132
9.2.5. c/ghi mt k t trn file (hm getc()/putc()) ...................................... 132
9.2.6. Kim tra cui file (hm feof()) ............................................................... 135
9.2.7. c/ghi chui k t trn file (hm fgets()/fputs()) ................................... 136
9.2.8. Hm rewind() ........................................................................................ 138
9.2.9. Hm ferror() .......................................................................................... 139
9.2.10. Xa mt file (hm remove()) ................................................................ 141
9.2.11. Lm sch mt lung (hm fflush()) ...................................................... 141

9.3. Hm fread() v fwrite() ........................................................................ 142


9.4. Hm fseek() v truy cp ngu nhin .................................................... 145
9.5. Hm fprintf() v fscanf() ..................................................................... 146
9.6. Lung chun ........................................................................................ 148
9.7. Cu hi trc nghim v bi tp ............................................................ 148
9.7.1. Cu hi trc nghim .............................................................................. 148
9.7.2. Bi tp ................................................................................................... 151

CHNG 10. TIN X L V CH THCH........................... 153


10.1. #define............................................................................................... 153
10.1.1. nh ngha Macro ging hm .............................................................. 155

10.2. #error ................................................................................................. 155


10.3. #include ............................................................................................. 156
10.4. Ch th bin dch c iu kin ............................................................ 161
10.4.1. #if, #else, #elif, #endif .......................................................................... 161
10.4.2. #ifdef v #ifndef ................................................................................... 163

10.5. #undef ............................................................................................... 164


10.6. defined............................................................................................... 164
10.7. #line .................................................................................................. 164
10.8. Ton t tin x l # v ## .................................................................. 165
10.9. Cc macro nh ngha trc ............................................................... 166
10.10. Ch thch trong C chun .................................................................. 166
10.11. Cu hi trc nghim v bi tp ......................................................... 167
10.11.1. Cu hi trc nghim .......................................................................... 167
10.11.2. Bi tp ............................................................................................... 168

TI LIU THAM KHO ............................................................. 169


Dng Hong Huyn

Chng 1. Gii thiu

CHNG 1. GII THIU


1.1. Ngun gc ca ngn ng C
Ngn ng lp trnh C c pht minh v ci t ln u tin bi Dennis Ritchie
v c s dng trong h iu hnh Linux. C l kt qu ca mt qu trnh pht trin
bt u bng ngn ng B (c pht minh bi Ken Thompson). T ngn ng B pht
trin ngn ng C vo nm 1970.
H nm 1983, thnh lp mt y ban to ra chun ANSI (American National
Standards Intitute) nh ngha ngn ng C. Qu trnh tiu chun ha mt 6 nm.
Chun ANSI C c chp nhn vo thng 12 nm 1989. Tiu chun ny cng c
t chc tiu chun quc t (ISO) chp nhn v c gi l C chun. Ngy nay, tt c
cc trnh bin dch ngn ng C/C++ u tun theo C chun.

1.2. C l ngn ng bc trung


C thng c gi l ngn ng my bc trung. iu ny khng c ngha l C t
mnh v kh s dng hoc t pht trin hn cc ngn ng bc cao nh l Basic hoc
Pascal. C c tng nh l mt ngn ng bc trung bi v n tch hp tt nht cc
thnh phn ca ngn ng bc cao kt hp vi tnh mm do ca ngn ng cp thp.
C cho php lp trnh vi bit, byte v a ch. M ngun ca ngn ng C cng
tng thch vi nhiu chng trnh dch, nhiu h iu hnh khc nhau. V d ta c th
d dng chuyn i mt chng trnh C vit trn h iu hnh DOS sang mt chng
trnh C thc thi trn Windows.
Bc cao

Bc trung

Dng Hong Huyn

Ada
Modula-2
Pascal
COBOL
FORTRAN
BASIC
Java

Ngn ng lp trnh C

Bc thp

C++
C
FORTH
Macro-assembler
Assembler

Hnh 1-1. Ngn ng C so vi cc ngn ng lp trnh khc.


Tt c cc ngn ng lp trnh bc cao u h tr khi nim kiu d liu. Kiu
d liu nh ngha cc tp gi tr m mt bin c th lu tr v tp cc php ton c
th thao tc trn gi tr . Kiu d liu c bn nht l s nguyn, k t v s thc.
Mc d C c nm kiu d liu c bn, nhng n khng phi l mt ngn ng nh kiu
mnh nh l Pascal. C cho php chuyn i qua li gia cc kiu d liu vi nhau.
V d ta c th trn ln kiu k t v kiu s trong mt biu thc.
Khng ging nh ngn ng bc cao, C khng kim tra cc li thi gian thc thi.
V d C khng kim tra xem cc bin ca mng c trn hay khng. Cc kiu kim tra
ny l trch nhim ca ngi lp trnh.
C khng yu cu tng thch d liu cht ch gia i s v tham s. i vi
ngn ng bc cao yu cu kiu d liu ca tham s phi cng kiu d liu vi i s.
C cho php mt tham s c th c kiu d liu bt k, n c th chuyn i mt cch
hp l sang kiu ca i s.
C cho php thao tc trc tip trn bit, byte, word v con tr, iu ny lm cho C
tng ng tt vi lp trnh h thng.
C c 32 t kha (27 t chun ca Ritchie v 5 c b sung t chun ANSI)
trong khi cc ngn ng lp trnh bc cao c nhiu t kha hn v d vi ngn ng
BASIC c khong 100 t kha.

1.3. C l ngn ng c cu trc


c trng chnh phn bit ngn ng c cu trc l m ngun v d liu chia
thnh ngn. l kh nng chia, n du thng tin v cu lnh ca chng trnh
thc thi mt tc v c bit no . Mt cch thc hin chia ngn l dng
chng trnh con c s dng bin cc b. Bng cch s dng bin cc b, ta c th
Khoa Cng ngh thng tin Trng i hc Quy Nhn

Chng 1. Gii thiu

vit chng trnh con v vy nhng s kin pht sinh bn trong chng trnh con ny
khng c tc ng n cc phn khc ca chng trnh. Kh nng ny cho php
chng trnh d dng chia s cc on m trong chng trnh. Nu pht trin mt hm
c chia ngn, ta ch cn bit hm lm g, khng cn bit hm lm nh th no.
Nh rng, nu lm dng qu nhiu bin ton cc s pht sinh nhng li khng mong
mun.
Ngn ng lp trnh c cu trc cung cp kh nng lp trnh a dng. N h tr
trc tip trong mt vi cu trc lp: do-while, while, for. Trong ngn ng cu
trc, cm hoc hn ch s dng ton t goto.
Thnh phn c cu trc chnh ca C l hm, l chng trnh con c lp ca
C. Trong C, hm c xy dng thnh mt khi. Hm c nh ngha v vit m
ring phc v mt nhim v ring, v vy chng trnh c chia nh thnh cc
chng trnh khc c lp. Sau khi to mt hm ta c th da vo lm vic vi
nhiu tnh hung m khng tc ng n nhng phn khc ca chng trnh.
Mt cch khc cu trc v chia ngn m trong C l dng khi lnh. Khi
lnh trong C c t gia cp du ngoc nhn {}.

1.4. Cu trc ca mt chng trnh C


Ngn ng C c tt c 32 t kha. 27 t kha c nh ngha bi phin bn
gc, 5 t kha c nh ngha bi chun ANSI: enum, const, signed, void v
volatile.
auto
break
case
char
const
continue
default
do

double
else
enum
extern
float
for
goto
if

int
long
register
return
short
signed
sizeof
static

struct
switch
typedef
union
unsigned
void
volatile
while

Hnh 1-2. Cc t kha trong ngn ng C.

Dng Hong Huyn

Ngn ng lp trnh C

10

Tt c cc t kha ca C u l ch thng, khng nn s dng t kha cho


mc ch khc trong chng trnh.
Mt chng trnh C bao gm mt hoc nhiu hm. Hm main() lun c
khai bo trong tt c cc chng trnh, l hm u tin c gi khi chng trnh
bt u thc thi. Dng tng qut ca mt chng trnh C nh hnh 1-3 sau:
Khai bo ton cc (th vin, tn hm, bin, )
<kiu tr v> main(danh sch tham s)
{
Cc cu lnh
}
nh ngha cc hm (nu c)
Hnh 1-3. Cu trc chung ca chng trnh C.

1.5. Chng trnh u tin


thc hin mt chng trnh c vit bng ngn ng C, ta phi thc hin
cc bc sau y:
1. Son tho m ngun.
2. Bin dch chng trnh (to file OBJ).
3. Lin kt file OBJ vi cc th vin v to ra mt file thc thi (EXE).
Cc bc ny c th thc hin c lp bng cc chng trnh ring, tuy nhin
vic ny gy kh khn cho ngi vit chng trnh. Do vy cc hng phn mm
thng cung cp mt sn phm tch hp cc chc nng ny v ta gi l mi trng
pht trin tch hp (Integrated Development Environment-IDE). Trong ti liu ny
chng ti s dng sn phm Visual C++ 6.0 ca hng phn mm Microsoft.
Chng trnh u tin yu cu in dng ch Hello World ra mn hnh.
Cc bc thc hin nh sau:
Khi ng chng trnh Visual C++ 6.0: Start\All program\Visual
Studio\Visual C++. (Hoc nhp p chut vo biu tng ca chng trnh trn mn
hnh nn). Mn hnh lm vic xut hin nh hnh 1-4 sau:

Khoa Cng ngh thng tin Trng i hc Quy Nhn

Chng 1. Gii thiu

11

Thanh menu
Thanh cng c

Hnh 1-4. Mn hnh lm vic ca Visual C++ 6.0.


vit mt chng trnh mi: bm vo biu tng New Text File trn thanh
cng c. Sau son ni dung chng trnh vo ca s son tho vn bn. V d
chng trnh hin mt dng ch ln mn hnh nh hnh 1-5.
Trc khi thc thi chng trnh, ta phi lu chng trnh bng thao tc sau y:
File\Save xut hin ca s nh hnh 1-6.
Trong mc Save in chn v tr lu chng trnh. Trong mc File name:
nhp vo tn chng trnh, trong v d ny ta s lu trn a Z: v t tn chng
trnh l bt1c1.c. (Lu : phi lu tn chng trnh vi phn m rng l .C).

Dng Hong Huyn

Ngn ng lp trnh C

12

Vng son tho


chng trnh

V tr thng bo li

Hnh 1-5. Ni dung chng trnh u tin.

V tr lu chng trnh

V tr t tn file

Hnh 1-6. Ca s lu chng trnh.


bin dch chng trnh chn: Build\Compile. Nu trnh bin dch thng bo
ht li c php th ta mi c th thc thi c chng trnh.
thc thi chng trnh sau khi bin dch thnh cng chn: Build\Excute.
C th trong chng trnh bt1c1.c, kt qu sau khi thc thi chng trnh s xut
hin ca s nh hnh 1-7 sau:

Khoa Cng ngh thng tin Trng i hc Quy Nhn

Chng 1. Gii thiu

13

Hnh 1-7. Ca s hin th kt qu thc thi chng trnh.


Sau khi xem kt qu ca chng trnh xong, bm mt phm bt k quay v
mn hnh son tho.
Gii thch cc cu lnh ca chng trnh u tin nh sau:
Dng u tin l dng ch thch ca chng trnh. Mc ch l cho chng
trnh d c hn. Tt c cc ch thch t trong cp du /**/
Dng #include <stdio.h> l khai bo th vin chun ca C, mc ch
hm main() s dng cc lnh printf.
Dng void main(void) khai bo hm main(), y l im bt u ca
chng trnh C. Tt c cc chng trnh trong C u bt u t im ny. Lnh
printf() in chui vn bn ra mn hnh.

1.6. Bi tp
Bi 1. Vit chng trnh in ra mn hnh 2 dng:
Day la ngon ngu lap trinh C
Duoc viet bang phan mem Visual C++ 6.0
Cua hang phan mem Microsoft

Dng Hong Huyn

Chng 2. Biu thc (Expression)

15

CHNG 2. BIU THC (EXPRESSION)


2.1. Kiu d liu c s (Basic Data Type)
C 5 kiu d liu c s trong C, l k t (char), kiu s nguyn (int),
kiu s thc du phy ng (float, double) v kiu d liu khng gi tr
(void). Tt c cc kiu d liu khc trong C u da vo 5 kiu d liu ny. Kch
thc v phm vi ca cc kiu ny ph thuc vo kiu vi x l v trnh bin dch. Tuy
nhin trong tt c cc trng hp mt k t l 1 byte. Kch thc ca mt s nguyn
ph thuc vo di t my. i vi mi trng 16 bit th s nguyn l 16 bit, i vi
mi trng 32 bit th s nguyn l 32 bit. Dng chnh xc ca mt s thc du phy
ng ph thuc vo s thit lp ca lp trnh vin.
Kiu void hoc l khai bo r rng mt hm khng tr v gi tr hoc to
mt con tr tng qut.

2.2. B ng kiu d liu c s (Modifying the Basic Type)


Ngoi tr kiu void, tt c cc kiu d liu cn li u c th c b ng. S
dng b ng thay th ngha ca ca kiu d liu c s p ng cc tnh hung
chnh xc hn. C 4 b ng sau: signed, unsigned, long, short.
Bng sau lit k cc kiu d liu cng vi b ng
s
bit
char
8
unsigned char
8
signed char
8
int
32
unsigned int
32
signed int
32
short int
16
unsigned short int 16
signed short int
16
Tn kiu

Dng Hong Huyn

Phm vi biu din


128 -> 127
0 -> 255
128 -> 127
2.147.483.648-> 2.147.483.647
0 -> 4.294.967.295
Ging kiu int
32.768 -> 32.767
0 -> 65.535
Ging kiu short int

Ngn ng lp trnh C

16

long int
signed long int
unsigned long int

32
32
32

float

32

double

64

long double

80

2.147.483.648 ->2.147.483.647
Ging kiu long int
0 -> 4.294.967.295
3,4x10-38 -> 3,4x1038
chnh xc 7 ch s
1,7x10-308 -> 1,7x10308
chnh xc 17 ch s
3,65x10-4951 -> 1,18x104932
chnh xc 18 ch s

Hnh 2-1. Cc kiu d liu c s trong C chun.

2.3. nh danh (Identifier)


Trong C, tn ca bin, hm, nhn hoc i tng do ngi dng t gi l nh
danh. nh danh bao gm nhiu k t ghp li, k t u tin phi l mt ch ci hoc
l mt du gch ni, cc k t tip theo phi l mt k t s, ch ci hoc du gch ni.
Mt s nh danh hp l v khng hp l.
Hp l

Khng hp l

Count
Test23
Hight_balance

1count
hi!there
hightbalance

Trong C nh danh c th c di bt k, c phn bit ch hoa v ch thng.


COUNT, Count v count l ba nh danh phn bit. nh danh khng c trng
vi t kha v khng trng tn vi cc hm trong th vin chun.

2.4. Bin (Variable)


Bin l mt v tr c tn trong b nh c s dng lu gi mt gi tr v c
th thay i bi chng trnh. Tt c cc bin phi c khai bo trc khi s dng.
Dng tng qut ca mt khai bo bin nh sau:
type variable_list;
Khai bo trn type phi l mt kiu d liu hp l, variable_list bao
gm mt hoc nhiu tn nh danh phn bit bi du phy. V d cch khai bo:
int i,j,l;
Khoa Cng ngh thng tin Trng i hc Quy Nhn

Chng 2. Biu thc (Expression)

17

short int si;


unsigned int ui;
double balance, profit, loss;
Ta c th va khai bo v gn gi tr cho bin bng c php sau:
type variable_name = value;
V d:
char ch = a;
int x = 0;
float f = 3.14;
Bin c khai bo ti ba v tr: bn trong hm hoc u khi lnh (bin cc
b), trong nh ngha tham s hm (tham s hnh thc) v bn ngoi ca tt c cc hm
(bin ton cc).

2.5. Hng (Constant)


Hng l mt gi tr c nh m chng trnh khng th thay i c. Hng c
th l kiu d liu c s bt k. Cch vit hng gi tr trong C nh sau:
Hng k t c t gia cp du nhy n v d a.
Hng s nguyn l cc s nguyn thng thng nh 100, -10, hng s
nguyn c th vit di dng s h 16 hoc h 8. V d 0x10 l s 10 h 16 (16) ,
010 l s 10 h s 8 (8).
Khi vit gi tr ca mt hng, kiu d liu nh nht s cha gi tr . Tuy
nhin i vi s thc th hng s thc bao gi cng c kiu double. ch nh kiu
d liu cho hng ta thm sau gi tr mt k t m t kiu d liu. C th nh sau:
Kiu d liu

V d

int
long int
unsigned int
float
double
long double

1
123
-234
35000L -34L
1000U 234U
123.23f
1.0f
123.23
1.2L

Dng Hong Huyn

Ngn ng lp trnh C

18

Hng chui l tp cc k t t gia cp du nhy kp. V d: this is a


text. Mt s hng k t dng iu khin m khng xut hin trn mn hnh.
Cch vit
\b
\f
\n
\r
\t
\"
\'
\0
\\
\v
\a
\?

ngha
Khong trng (Backspace)
xung dng (Form feed)
Dng mi (New line)
V u dng (Carriage return)
t Tab theo chiu ngang (Horizontal tab)
Du nhy kp (Double quote)
Du nhy n (Single quote)
K t rng (Null)
Du gch cho (Backslash)
t tab theo chiu dc (Vertical tab)
Pht mt m thanh (Alert)
Du chm hi (Question mark)
Hnh 2-2. Cc hng k t c bit.

2.6. Ton t (Operator)


2.6.1. Ton t gn
C php: <tn bin> = <biu thc>;
Trong biu thc c th l mt hng, mt bin, mt hm hoc l s kt hp
ca cc thnh phn trn. u tin, biu thc s c tnh ton, sau chuyn i kiu
biu thc cho ph hp vi kiu ca bin. Gn gi tr ny cho bin.
Khi cc kiu d liu ca bin v biu thc khc nhau, xut hin vn chuyn
i kiu. Trong cu lnh gn, lut chuyn i thc hin nh sau: gi tr bn phi php
gn s chuyn sang kiu d liu ca bin. Trong trng hp kiu ca biu thc ln
hn kiu ca bin, s gy ra tnh hung b mt d liu.
Bng lit k cch chuyn i kiu ca biu thc sang kiu ca bin.
Kiu bin
signed char

Kiu
biu thc
char

Thng tin c th mt
gi tr > 127chuyn sang s m
Khoa Cng ngh thng tin Trng i hc Quy Nhn

Chng 2. Biu thc (Expression)

char
char
char
short int
int
int
float
double

19

short int
int
long int
int
long int
float
double
long double

8 bit cao b mt
24 bit b mt
24 bit b mt
16 bit b mt
Khng
Phn thp phn v phn khc
chnh xc, kt qu lm trn
chnh xc, kt qu lm trn

Hnh 2-3. Chuyn i kiu d liu trong php gn.


C cho php gn nhiu bin cng gi tr v d mun gn gi tr 0 cho bin x, y, z
ta c th vit nh sau: x = y = z = 0.

2.6.2. Ton t s hc
Bng sau lit k cc php ton s hc:
Ton t

+
*
/
%

++

ngha
Tr, tr mt ngi
Cng
Nhn
Chia
Chia ly d
Gim 1
Tng 1

Hnh 2-4. Php ton s hc.


i vi php chia, khi chia hai s nguyn th kt qu s l s nguyn. i vi
s thc khng c php chia ly phn d.
Ton t ++ s t ng tng gi tr ca bin ln mt ln, ngc li -- gim gi
tr ca bin xung mt ln. Ta c th t ton t tng/gim vo trc hoc sau ca
bin. Tuy nhin, trong mt biu thc s c s khc nhau gia hai dng ny. V d:
x=10; y=++x s cho gi tr ca y l 11 v d trn tng x xong ri mi gn cho y.
Khi ta vit x=10; y=x++; y s nhn gi tr 10 bi v x gn gi tr 10 cho y xong
mi tng ln 1.

Dng Hong Huyn

Ngn ng lp trnh C

20

2.6.3. Ton t quan h v logic


Trong ngn ng C, gi tr true l gi tr khc 0 v false l gi tr bng 0.
Cc php ton quan h v logic thng c s dng chung vi nhau. C php ton
quan h v logic c th t u tin thp hn ton t s hc.
Cc php ton quan h
Ton t ngha
>
Ln hn
>=
Ln hn hoc bng
<
Nh hn
<=
Nh hn hoc bng
==
Bng
!=
Khc
Ton t logic
Ton t
&&
||
!

ngha
AND
OR
NOT

Hnh 2-5. Php ton quan h v logic.

2.6.4. Ton t ?
C php:
Exp1 ? Exp2 : Exp3;
Nu Exp1 cho gi tr l ng, Exp2 s c tnh ton v tr v. Nu Exp1 sai,
Exp3 s c tnh v tr v. V d: a>b?:a:b, chng trnh s kim tra biu thc
a>b nu ng tr v gi tr a, nu sai tr v gi tr b.

2.6.5. Ton t bit


Ton t bit thc hin vic kim tra, thit lp hoc y mt bit trong mt byte
hoc mt t tng ng vi kiu d liu char hoc int. Khng th dng ton t bit
cho kiu d liu thc (float, double, long double). Ton t ny p dng cho
tng bit ca ton hng.

Khoa Cng ngh thng tin Trng i hc Quy Nhn

Chng 2. Biu thc (Expression)

21

Ton t

ngha

&

AND

OR

Exclusive OR(XOR)

Phn b ca 1(NOT)

>>

y phi

<<

y tri
Hnh 2-6. Ton t bit.

Ton t bit thng dng lp trnh cho cc thit b, trong mi bit s nh


du mt trng thi no ca thit b. i vi cc php ton y bit, cc bit cui cng
s c chn vo cc s khng. Trong trng hp s nguyn c du, bit du s c
b qua. Ch , mi ln y tri s nhn s cho 2 v y phi s chia cho 2. Bng
sau th hin mt vi v d v ton t y bit.
unsigned char x; Biu din nh phn ca x Gi tr ca x
x=7;

00000111

x = x<<1;

00001110

14

x = x<<3;

01110000

112

x = x<<2;

11000000

192

x = x>>1;

01100000

96

x = x>>2;

00011000

24

Hnh 2-7. Nhn v chia trong ton t y bit.

2.6.6. Ton t sizeof


Tr v di bng byte ca mt bin, bin mng, hoc mt kiu t trong du
ngoc n. V d sau cho bit kch thc ca s thc f.
float f;
printf(%d,sizeof(f));
tnh kch thc ca mt kiu, ta t tn kiu trong du ngoc n.
printf(%d, sizeof(int));

Dng Hong Huyn

Ngn ng lp trnh C

22

2.6.7. Ton t () v []
Ton t () dng tng th t u tin ca biu thc con trong mt biu thc
khc. Ton t [] xc nh phn t ca mng. Khi a mt mng, biu thc bn trong
du ngoc vung s cung cp ch s ca mng.

2.6.8. p kiu
Ta c th bt buc mt biu thc no sang mt kiu mong mun. Tnh
hung ny gi l p kiu. Dng tng qut ca p kiu l: (type)E; trong type l
kiu d liu cn chuyn sang, E l biu thc cn chuyn.
V d: thng thng biu thc x/2 l kiu s nguyn nu x l s nguyn, nu
mun x/2 l mt kiu s thc ta dng biu thc sau: (float) x/2;

2.6.9. u tin ca tt c cc php ton


Cao nht

() [] > .
! ~ ++ (type) * & sizeof
* / %
+
<< >>
< <= > >=
== !=
&
^
|
&&
||
?:
= += = *= /= etc.
Thp nht ,
Hnh 2-8. Th t u tin ca cc php ton.
Ch , trong bng trn, cn nhiu php ton cha c trnh by chi tit v d
nh cc php ton * & . -> Nhng php ton ny s c trnh by cc mc
sau khi cp nhng vn lin quan nh con tr, cu trc.
Khoa Cng ngh thng tin Trng i hc Quy Nhn

Chng 2. Biu thc (Expression)

23

2.7. Biu thc (Expression)


Ton t, hng, bin v hm l nhng thnh phn c bn to nn biu thc. Mt
biu thc trong C l s kt hp hp l ca bn thnh phn trn.

2.7.1. Chuyn i kiu trong biu thc


Khi hng hoc bin c kiu khc nhau c trn ln trong mt biu thc, tt c
s chuyn sang kiu d liu ph hp. Trnh bin dch s chuyn kiu d liu ca tt c
cc ton hng sang kiu ln nht. u tin tt c cc gi tr kiu char v short
int s t ng chuyn sang kiu int. Sau nu ton hng no c kiu ln hn th
biu thc s ly kiu ca ton hng . V d:

Hnh 2-9. Chuyn i kiu trong biu thc.

2.7.2. Khong trng v du ngoc n


Ta c th thm nhiu khong trng v du ngoc n biu thc d c v r
rng hn. V d x=10/y-(127/x); khi ta c th vit x = 10 / y

(127 / x);
Gim hoc tng du ngoc n khng pht sinh ra li v lm chm vic tnh
ton. Do ta s dng du ngoc n lm r rng th t u tin ca cc php ton
trong biu thc. V d: x=y/334*temp+127; ta c th vit x=(y/3)
(34*temp)+127;

2.7.3. Vit nhanh ca php ton gn

Dng Hong Huyn

Ngn ng lp trnh C

24

Khi vit x=x+10; ta c th vit x+=10; ton t += thng bo cho trnh bin
dch bit gn x bng gi tr x cng 10. Php ton gn nhanh ny lm vic trn cc
php ton hai ngi. Tng qut, biu thc dng v=vOe ta c th vit li vO=e.

2.7.4. Cc hm ton hc c bn
Tn hm

ngha

exp(x)
ex
log(x)
logaric c s e ca x
log10(x)
logaric c s 10 ca x
abs(x)
tr tuyt i ca x (s nguyn)
fabs(x)
tr tuyt i ca x (s thc)
pow(a,x)
ax
sqrt(x)
cn bc 2 ca x
sin(x)
sin(x)
cos(x)
cos(x)
acos(x)
arccos(x)
asin(x)
arcsin(x)
ceil(x)
s nguyn nh nh nht x
floor(x)
tm s nguyn ln nht x
modf(x, y)
chia s thc x thnh 2 phn, phn
nguyn t vo bin y, tr v phn
thp phn.
s dng c cc hm ny, phi khai bo th vin math.h u chng
trnh. Cc hm lng gic nhn tham s o Radian, mun chuyn sang ta dng
cng thc radian = ./180. V d mun tnh cos(600), ta s dng hm nh
sau: cos(60* /180).

2.8. Vo ra d liu c bn
2.8.1. In gi tr ra mn hnh (hm printf())
C php:
printf(Chui nh dng,danh sch cc biu thc);
Hm in ra mn hnh danh sch cc biu thc cng vi khun dng d liu ra
mn hnh. Chui nh dng c ba loi k t: 1. K t hin th ra mn hnh; 2. K t nh

Khoa Cng ngh thng tin Trng i hc Quy Nhn

Chng 2. Biu thc (Expression)

25

dng in d liu ra mn hnh. 3. K t iu khin s xut hin. K t nh dng bt


u bng du % theo sau l mt k t m t kiu d liu. V d in ra mn hnh gi tr
ca bin nguyn x ta vit nh sau:
printf(gia tri cua x la:%d\n, x);
in ra mn hnh gi tr ca biu thc thc 3.5 * 9 + 2
printf(gia tri bieu thuc:%f,3.5 * 9 + 2);
a. Bng cc k t nh dng cho hm printf
M
%c
%d
%E
%f
%o
%s
%u
%X
%ld
%lu
%lf
%Lf

Kiu d liu
char
int
foat
float
unsigned int (s hin th h m c s 8)
Chui k t
unsigned int (s hin th h m c s 10)
unsigned int (S hin th h m c s 16)
long int
unsigned long int
double
long double
Hnh 2-10. Cc k t m t kiu d liu trong hm printf().

b. In mt gi tr vi rng cho trc


in ra mn hnh mt gi tr vi rng cho trc ta thm gia k t % v k
hiu nh dng mt s nguyn. S nguyn ny chnh s v tr ti thiu in gi tr ra
mn hnh. Xt v d sau:
#include <stdio.h>
void main(void){
double item;
item = 10.12304;
printf("%f\n", item);
printf("%10f\n", item);

Dng Hong Huyn

Ngn ng lp trnh C

26

printf("%012f\n", item);
}
Kt qu xut hin nh sau:
10.123040
10.123040
00010.123040
in mt gi tr vi chnh xc cho trc ta s dng nh dng x.y vi x, y
l cc gi tr nguyn, ngha ca n dnh x v tr in mt s thc, trong y v tr
hin th phn sau du thp phn.
c. In mt gi tr vi chnh xc cho trc
in mt gi tr vi chnh xc cho trc ta s dng nh dng x.y vi x, y
l cc gi tr nguyn, ngha ca n ph thuc vo kiu d liu.
i vi s thc, khi ta s dng nh dng %f, %E, %e, x s xc nh s v tr
hin th s thc v y xc nh s ch s sau du thp phn. Nu khng c nh dng y,
chng trnh s in 6 ch s sau du thp phn. V d %10.4f s in ra mn hnh mt
s thc c rng bng 10, v s ch s sau du thp phn l 4.
i vi kiu chui k t, y cho bit rng ln nht m chui c th hin th.
V d %5.7s s in ra mn hnh mt chui k t c rng l 5 v khng c vc
qu 7. Nu chui k t di hn rng cc i th cc k t cui cng s b ct bt.
i vi s nguyn, chnh xc s ch ra s ch s ti thiu s c hin th.
Nu s ch s nh hn y, chng trnh s thm vo trc cc s khng sao cho s ch
s bng y. Xt v d sau:
#include <stdio.h>
void main(void){
printf("%.4f\n", 123.1234567);
printf("%.8d\n", 1000);
printf("%10.15s\n", "This is a simple test.");
}
Kt qu nh sau:

Khoa Cng ngh thng tin Trng i hc Quy Nhn

Chng 2. Biu thc (Expression)

27

123.1235
00001000
This is a simpl
d. Canh l cho cc gi tr
Ngm nh cc gi tr c vit t phi qua tri. Tc l nu rng ca nh
dng ln hn rng ca d liu th d liu s c vit t phi qua. Trong trng
hp ny, vit d liu t bn tri qua ta thm du tr sau du %. Xt v d sau:
#include <stdio.h>
void main(void){
printf("canh le ben phai:%8d\n", 100);
printf("canh le ben trai:%-8d\n", 100);
}
Kt qu hin th trn mn hnh nh sau:
canh le ben phai:
canh le ben trai:100

100

2.8.2. Nhp d liu t bn phm (hm scanf())


C php:
scanf(chui nh dng, danh sch cc bin);
Chui nh dng l cc k t m t kiu d liu, danh sch cc bin cch nhau
du phy v phi c ton t & trc mi bin. V d nhp mt gi tr t bn phm v
gn gi tr vo mt bin nguyn x:
scanf(%d, &x);
V d nhp 2 gi tr mt s nguyn v mt s thc vo 2 bin x v y nh sau:
scanf(%d%f,&x,&y);
Bng cc k t nh dng cho hm scanf():
M
%c
%d
%i
%x
Dng Hong Huyn

Kiu d liu
char
int
int
unsigned int (h 16)

Ngn ng lp trnh C

28

%u
%o
%f,%e,%g
%ld
%lu
%lf
%Lf
%%
%[]
%s

unsigned int (h 10)


unsigned int (h 8)
float
long int
unsigned long int
double
long double
c du %
qut tp k t trong du []
Nhp chui k t

Hnh 2-11. Cc k t m t kiu d liu cho hm scanf().


a. c tng k t ring bit
Ta c th dng t t %c c tng k t ring bit. Tuy nhin iu ny d gy
ra nhng sai st. Thng thng, cc khong trng, k hiu xung dng dng phn
bit cc trng khi c d liu. i vi kiu k t th khng. V d:
scanf("%c%c%c", &a, &b, &c);
Khi nhp x y lc a l x, b l khong trng v c l y.
b. c mt chui k t
Dng t t %s c mt chui. Hm scanf() c mt chui cho n khi
gp mt khong trng u tin. Cc k t c s c gn cho mng cc k t c
tr bi con tr trong tham s v chui nhn c s kt thc bng k t rng.
#include <stdio.h>
#include <conio.h>
void main(void){
char str[80];
printf("Nhap vao mot chuoi: ");
scanf("%s", str);
printf("Chuoi vua nhap: %s", str);
getch();
}
Gi s ta nhp hello world, chng trnh ch in ra dng hello

Khoa Cng ngh thng tin Trng i hc Quy Nhn

Chng 2. Biu thc (Expression)

29

c. S dng tp scanset
Scanset l tp cc k t c nh ngha trc. Khi hm scanf() x l tp
scanset, n ch nhp nhng k t thuc tp ny. K t c c s c gn n
mt mng cc k t c tr bi tham s ca tp scanset tng ng. nh ngha cc
k t trong tp scanset vo cp du []. C th nh sau:
%[XYZ]
Trong XYZ l cc k t. Khi nhp d liu, hm scanf() bt u c cc k
t cho n khi bt gp mt k t khng phi trong tp scanset. Mng ny cha
chui c kt thc bng rng. Xt v d:
#include <stdio.h>
#include <conio.h>
void main(void){
int i;
char str[80], str2[80];
scanf("%d%[abcdefg]%s", &i, str, str2);
printf("%d %s %s", i, str, str2);
getch();
}
Khi nhp 123abcdtye, chng trnh s in ra 123 abcd tye. Bi v t
khng thuc tp scanset, do hm scanf() s ngng c vo bin str khi gp
ch t, cc k t cn li s c c vo str2.
ch ra mt tp o ngc, ta dng k hiu ^. K hiu ny cho bit nhp
nhng k t m khng thuc tp scanset. Ta c th to ra mt tp cc k t lin tc
bng mt du ni v d nh %[a-z]. Tp scanset c phn bit ch hoa v ch
thng.
d. Loi b nhng khong trng khng cn thit
Mt k t trng trong chui iu khin lm cho hm scanf() b qua nhng
khong trng u input stream.
e. Nhng k t khng phi l khong trng trong chui iu khin

Dng Hong Huyn

Ngn ng lp trnh C

30

Mt k t khng phi trng trong chui iu khin lm cho hm scanf() c


v b qua nhng k t ny trong input stream. V d %d,%d hm c vo mt s
nguyn, c v loi b mt du phy v c mt s nguyn khc.
f. Ta phi gi n hm scanf() a ch
Tt c cc bin trong hm scanf() c s dng nhn gi tr phi gi
bng a ch. iu ny c ngha rng tt c cc tham s phi l nhng con tr.

2.9. Mt s v d c bn
2.9.1. V d 1
Vit chng trnh nhp vo mt s thc biu din nhit n v Fahrenheit
(oF), sau chuyn sang n v Celsius (oC). Kt qu hin th c 1 ch s sau du thp
phn.
/* Chuong trinh chuyen doi don vi do nhiet do */
#include <stdio.h>
// khai bao thu vien chuan
void main(void){
// khai bao ham main
float t;
// Khai bao bien t
printf("Nhap vao nhiet do (Fahrenheit): ");
scanf("%f",&t);
// nhap gia tri tu ban phim
printf("%0.1f do Fahrenheit = %0.1f do Celsius\n", t,
5.0/9*(t-32));
}

2.9.2. V d 2
Vit chng trnh nhp vo hai s nguyn dng, in ra mn hnh tng bnh
phng ca hai s .
/* Chuong trinh tinh tong binh phuong cua hai so */
#include <stdio.h>
void main(void){
int x, y;
printf("Nhap vao hai so nguyen x, y: ");
scanf("%d%d",&x,&y);
printf("%d^2 + %d^2=%d\n", x, y, x*x + y*y);
}

Khoa Cng ngh thng tin Trng i hc Quy Nhn

Chng 2. Biu thc (Expression)

31

2.9.3. V d 3
Vit chng trnh nhp vo mt s nguyn dng c ba ch s, in ra mn hnh
cc s thuc hng trm, hng chc, hng n v.
/* hang tram, hang chuc,
#include <stdio.h>
void main(void){
unsigned int x;
printf("Nhap vao so
scanf("%u",&x);
printf("chu so hang
printf("chu so hang
printf("chu so hang
}

hang don vi */

nguyen ba chu so (100-999): ");


tram : %d\n", x / 100);
chuc : %d\n", (x / 10) % 10);
don vi: %d\n", x % 10);

2.10. Cu hi trc nghim v bi tp


2.10.1. Cu hi trc nghim
Cu 1. Tn no t Sai quy nh ca C:
a) Giai_Ptrinh_Bac_2
c) Noi sinh

b) Ngaysinh
d) Sv2000

Cu 2. Mc no c cc Tn u t ng quy nh ca C:
a) x1, X-2;

b) Xx1, X2;

c) CONST, X_234;

d)X[1], x2;

Cu 3. Trong C, nu mun dng lnh xa mn hnh clrscr() th phi khai bo th


no ngay sau phn tiu chng trnh:
a)#include <stdio.h>
c)#include <stdlib.h>;

b) #include <conio.h>
d) khng khai bo g;

Cu 4. Biu thc sau c kiu d liu l g? Gi tr l bao nhiu?


int i=10;
float f=3;
char ch=A;
f = f+i-ch;
i = f*i+ch;
ch = f*i+2*ch;

Dng Hong Huyn

Ngn ng lp trnh C

32

Cu 5. Cho bit cc biu thc sau: biu thc no sai? Biu thc ng c gi tr l bao
nhiu?
Gi s ta khai bo nh sau:
int i=10;
char ch=a;
Khi cc biu thc sau: biu thc no sai, biu thc ng cho gi tr l bao
nhiu?
a. i = (i+ch)++;
c. ch = ch++;
e. ch = ch++ - i++

b. i = i++ + ch++
d. ch = ++ch;

2.10.2. Bi tp
Bi 1. Vit chng trnh nhp vo mt s thc x, in ra mn hnh gi tr biu thc
1+9x-2sinx+x2-ex. nh dng biu thc sao cho ch c 2 gi tr sau du thp phn.
Bi 2. Nhp vo di bn knh hnh trn, in ra mn hnh chu vi v din tch ca hnh
trn tng ng. Yu cu cc gi tr hin th trn mn hnh c hai ch s sau du thp
phn.
Bi 3. Nhp vo di ba cnh a, b,c ca mt tam gic. Tnh din tch tam gic bng
cng thc Heron nh sau:

( )( )( ) vi p l na chu vi. Tnh

cc gc ca tam gic hp bi ba cnh trn theo cng thc ca nh l cos nh sau:


= arccos

, da vo hnh di ta tnh tng t cho hai gc , cn

li.

Khoa Cng ngh thng tin Trng i hc Quy Nhn

Chng 2. Biu thc (Expression)

33

Bi 4. Vit chng trnh nhp vo mt tng s tin, bit rng c ba loi mnh gi tin
l 500.000 VN, 200.000VN, 100.000VN, 50.000VN. Cho bit tng s tin trn
c t nht l bao nhiu t t cc mnh gi bit. V d s tin l: 2.850.000 c 5 t
500 ngn, 1 t 200.000, 1 t 100.000, 1 t 50.000. phng n trn c tng s t l 8 v
y l phng n c s t tin t nht.
Bi 5. Vit chng trnh nhp vo s giy, in ra mn hnh s gi, pht v giy theo
nh dng hh:mm:ss. V d s giy l 3746 tng ng 01 gi, 2 pht, 26 giy.
Bi 6. Nhp vo ba s thc, tm s ln nht ca ba s .
Bi 7. Nhp vo:
Lng ngy cng (LNC)
S ngy cng quy nh (NCQD)
S ngy lm (SNC)
Vit chng trnh tnh s tin lng (TL) bit rng TL = SNCLNC. Nu SNC
vt qu NCQD th s ngy vt nhn 2.

Dng Hong Huyn

Chng 3. Cu lnh (Statement)

35

CHNG 3. CU LNH (STATEMENT)


Ni mt cch tng qut th cu lnh l mt phn ca chng trnh m n c th
thc thi. Mt cu lnh ch cho my bit mt hnh ng. Ngn ng C phn cu lnh
thnh cc nhm sau:
Biu
Khi
Lnh
Lnh
Lnh

thc
lnh
la chn
lp
nhy

Cu lnh la chn l if, switch; cu lnh lp l while, for, dowhile; cu lnh nhy l break, continue, goto, return. Biu thc bao gm
cc biu thc hp l. Khi lnh l cc lnh t trong cp du mc {}.

3.1. True v False trong C


Mt biu thc iu kin ch cho hai gi tr hoc ng hoc sai. Trong C, gi tr
ng l mt gi tr khc 0 bao gm c cc gi tr m v gi tr sai l mt gi tr bng 0.

3.2. Lnh la chn (Selection)


3.2.1. Lnh if
Dng tng qut ca mt biu thc iu kin nh sau:
if(E) S1;
[else S2;]
Trong E l biu thc, S1 v S2 l cu lnh bt k c th l mt cu lnh n,
mt khi lnh, lnh la chn, lnh lp hoc khng c g. Mnh else l ty chn,
c th c hoc c th khng.
Nu biu thc E cho gi tr ng, S1 s c thc hin, ngoi ra nu biu thc
sai cu lnh S2 s c thc hin nu c mnh else. Trong C, biu thc iu kin
phi c kiu nguyn, k t, con tr hoc kiu thc. Hai hnh sau m t lnh if c v
khng c mnh else bng s khi:

Dng Hong Huyn

Ngn ng lp trnh C

36

Sai

ng

S1

S2

Hnh 3-1. S khi m t lnh if c mnh else.

Sai

ng

S1

Hnh 3-2. S khi m t lnh if khng c mnh else.


V d sau, cho php nhp hai s t bn phm v in ra mn hnh s ln nht ca
hai s .
#include <stdio.h>
void main(void){
int x, y;
printf(nhap x,y: );
scanf(%d%d,&x,&y);
if(x>y)
printf(So lon nhat %d\n,x);
else
printf(So lon nhat %d\n,y);
}

Khoa Cng ngh thng tin Trng i hc Quy Nhn

Chng 3. Cu lnh (Statement)

37

3.2.2. Cc lnh if lng nhau


Mt lnh if c th c lng vo lnh if khc ti mnh if hoc else.
Trong cc lnh if lng nhau, mnh else lun i vi lnh if gn nht trong cng
mt khi. V d:
if(E1){
if(E2) S1;
if(E3) S2;
else S3;
}
else S4;
Mnh else cui cng khng kt hp vi if(E2) m n kt hp vi
if(E1). Mnh else bn trong khi lnh kt hp vi if(E3).
Trong ngn ng C h tr 15 mc if lng nhau, thc t cc chng trnh dch
h tr nhiu hn. Tuy nhin nu dng qu nhiu lnh if lng nhau s lm xo trn
ngha ca thut ton. V d sau th hin cc lnh ifelse lng nhau:
#include <stdio.h>
void main(void){
int a, b, c, max;
printf("Nhap vao ba gia tri a, b, c: ");
scanf("%d%d%d", &a, &b, &c);
if(a>b)
if(a>c)
max = a;
else
max = c;
else
if(b>c)
max = b;
else
max = c;
printf("so lon nhat: %d\n",max);
}

3.2.3. Cc lnh if-else-if lin tc


Dng Hong Huyn

Ngn ng lp trnh C

38

Dng tng qut nh sau:


if(E1) S1;
else
if(E2) S2;
else
if(E3) S3;
.
.
.
else Sn;
iu kin c kim tra t u n cui. Nu gp iu kin no ng trc tin
th cu lnh kt hp vi n s c thc hin v b qua cc phn cn li. Nu khng
c iu kin no ng cu lnh cui cng sau mnh else s thc hin. V d sau
nhp vo mt k t, phn loi k t ny thuc nhm no?ch thng, ch hoa, ch s
hay loi k t khc.
#include <stdio.h>
void main(void){
char ch;
printf(Nhap vao mot ki tu:);
scanf(%c, &ch);
if(ch>=a && ch<=z)
printf(Chu thuong);
else if(ch>=A && ch<=Z)
printf(Chu hoa);
else if(ch>=0 && ch<=1)
printf(Chu so);
else
printf(Ki tu khac);
}

3.2.4. Lnh switch


C php:
switch(E){
case v1:
S1;
Khoa Cng ngh thng tin Trng i hc Quy Nhn

Chng 3. Cu lnh (Statement)

39

case v2:
S2;
.
.
.
case vn: Sn;
[default: Sn+1;]
}
Trong , E l biu thc s nguyn hoc k t; v1, v2, , vn l cc hng gi
tr; S1, S2, , Sn, Sn+1 l cc cu lnh bt k.
Lnh switch thc hin nh sau: so snh gi tr ca biu thc E ln lt vi
cc gi tr vi. Khi tm thy mt gi tr vi no bng gi tr ca biu thc, cu lnh
Si kt hp s c thc hin cho n khi gp lnh break hoc n cui cu lnh
switch. Cu lnh sau default (nu c) s c thc hin nu biu thc E khng
trng vi gi tr vi no. Hnh sau m t nguyn tc hot ng ca lnh switch:

ng
S1

E=v1
Sai
ng

S2

E=v2
Sai
ng
E=vn

Sn

Sai
Sn+1

Hnh 3-3. S khi m t lnh switch.

Dng Hong Huyn

Ngn ng lp trnh C

40

Ch : trong s hnh 3-3, nu khng c mnh default s khng c


lnh Sn+1. V d sau cho nhp 2 s nguyn v mt k t thuc nhm {+, -, *, /},
sau thc hin php tnh tng ng.
#include <stdio.h>
void main(void){
char pt;
int a, b;
printf(Nhap phep toan:); scanf(%c,&pt);
printf(Nhap 2 so:); scanf(%d%d,&a,&b);
switch(pt){
case '+':
printf(%d+%d=%d,a,b,a+b);
break;
case '-':
printf(%d-%d=%d,a,b,a-b);
break;
case '*':
printf(%d*%d=%d,a,b,a*b);
break;
case /:
if(b!=0)
printf(%d/%d=%d,a,b,a/b);
else
printf(Khong chia duoc);
break;
default:
printf("Phep toan khong hop le");
}
}
Trong C, lnh switch c nhiu nht 257 lnh case. C 5 cn quan tm khi
s dng lnh switch:
1. Lnh switch khc lnh if, switch ch kim tra tnh bng, trong khi lnh
if c th tnh ton mi kiu biu thc quan h v logic.
2. Khng c hai gi tr ging nhau nm trong lnh switch

Khoa Cng ngh thng tin Trng i hc Quy Nhn

Chng 3. Cu lnh (Statement)

41

3. Nu hng k t c s dng trong switch, n s t ng chuyn sang s


nguyn.
4. Nu mun vit nhiu hng kt hp vi mt cu lnh, ta phi vit ring cc
hng ny trong tng mnh case
5. Cc cu lnh trong tng mnh case l cc cu lnh bt k, nu nhiu hn
mt lnh ta khng cn phi thm du {}
Lnh switch thng c s dng x l lnh t bn phm, chng hn nh
l la chn mt menu.
Cu lnh break trong switch l ty chn, n dng kt thc cu lnh trong
mnh case. Nu b qua cu lnh break, chng trnh s thc thi nhng mnh
case tip theo cho n khi gp lnh break khc hoc cho n ht cu lnh switch.
V d tip theo nhp vo mt thng cho bit thng c bao nhiu ngy:
#include <stdio.h>
void main(void){
int thang, nam;
printf(Nhap thang:); scanf(%d,&thang);
switch(thang){
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
printf(Thang %d co 31 ngay, thang);
break;
case 4:
case 6:
case 9:
case 11:
printf(Thang %d co 30 ngay, thang);
break;

Dng Hong Huyn

Ngn ng lp trnh C

42

case 2:
printf(Nhap nam:); scanf(%d, &nam);
if ((nam%4==0 && nam%100!=0)||(nam%400==0))
printf(Thang 2 nam %d co 29 ngay, nam);
else
printf(Thang 2 nam %d co 28 ngay, nam);
break;
default:
printf(Thang khong hop le);
}
}
V d trn minh ha hai vn : Th nht, ta c th c cc mnh case m
khng kt hp vi lnh no. Khi gp trng hp ny, chng trnh s chuyn xung
mnh case tip theo. Th hai, nu khng c lnh break chng trnh s thc thi
cc lnh tip theo.

3.3. Lnh lp (Repetitive)


3.3.1. Lnh lp for
Dng tng qut ca lnh lp for nh sau:
for(E1; E2; E3) S;
Trong , E1, E2, E3 l cc biu thc, S l cu lnh bt k. Lnh for c
thc hin nh sau:
Bc 1. Tnh gi tr E1
Bc 2. Kim tra biu thc E2, nu E2 ng thc hin cu lnh S, sau thc
hin E3 v quay li u bc 2. Nu biu thc E2 sai, thot khi vng lp. Hnh sau
m t nguyn tc hot ng ca lnh for:

Khoa Cng ngh thng tin Trng i hc Quy Nhn

Chng 3. Cu lnh (Statement)

43

E1

E2

Sai

ng
S;
E3;

Hnh 3-4. S khi m t lnh lp for.


V d: vit chng trnh in cc gi tr t 1 n 100 ra mn hnh.
#include <stdio.h>
void main(void){
int x;
for(x=1; x <= 100; x++)
printf("%d ", x);
}
Trong v d trn, u tin x c gn gi tr 1 v sau c so snh vi gi tr
100. Nu x<=100 chng trnh s gi hm printf; sau x c tng ln 1 v tip
tc kim tra iu kin. Nu iu kin vn cn ng, tip tc gi hm printf. Qu
trnh trn lp li cho n khi x>100 v chnh l im kt thc vng lp. Trong v
d ny, x l bin iu khin lp, n c kim tra v thay i sau mi ln lp.
Thng thng ta s dng lnh for nh sau: E1 l mt lnh gn dng khi
to gi tr cho bin iu khin lp; E2 l mt biu thc quan h cho bit khi no thot
khi vng lp; E3 cho bit bin iu khin thay i nh th no ti mi ln lp.
Trong vng lp for, iu kin lun c kim tra u chng trnh, iu ny
c ngha l cc m bn trong c th khng c thc thi nu iu kin sai. V d:
x = 10;
for(y=10; y!=x; ++y) printf("%d", y);
Dng Hong Huyn

Ngn ng lp trnh C

44

printf("%d", y);
V d trn ch in gi tr 10 ca bin y ra mn hnh. Cc lnh trong vng lp
for trn khng bao gi thc hin bi v x v y bng nhau khi vo vng lp.

3.3.2. Lnh lp while


Dng tng qut nh sau:
while(E) S;
Trong S l cu lnh bt k, E l mt biu thc logic. ngha, Trong khi
iu kin E cn ng th thc hin cc cu lnh. Nu iu kin sai, thot khi vng
lp. Ging nh vng lp for, vng lp while cng kim tra iu kin u vng
lp. iu ny c ngha l cc cu lnh trong vng lp s khng c thc hin nu
iu kin sai. Hnh sau m t nguyn tc hot ng ca lnh while:

Sai

E
ng
S

Hnh 3-5. S khi m t lnh while.


V d, tm c s khng tm thng ln nht ca mt s nguyn n.
#include <stdio.h>
void main(void){
int i, n;
printf(Nhap n:); scanf(%d,&n);
i=n-1;
while(n % i != 0) i--;
printf(Uoc so lon nhat nho hon n la:%d,i);
}

3.3.3. Lnh lp do-wihle


Khng ging nh vng lp for, while, kim tra iu kin u vng lp.

Khoa Cng ngh thng tin Trng i hc Quy Nhn

Chng 3. Cu lnh (Statement)

45

Vng lp do-while kim tra iu kin cui vng lp. iu ny cho php vng lp
do-while s thc hin t nht l mt ln. Dng tng qut ca vng lp do-while
nh sau:
do S; while (E);
Trong , S l cu lnh bt k, E l biu thc logic. ngha: thc hin cu lnh
S trong khi cn ng. Hnh sau m t nguyn tc hot ng ca lnh dowhile:

ng

E
Sai

Hnh 3-6. S khi m t lnh dowhile.


V d: do scanf(%d,&n); while (n>100);
on chng trnh trn cho php nhp vo mt s nguyn cho n khi nhn gi
tr nh hn hoc bng 100.
Thng thng, ta s dng vng lp do-while v kt hp vi cu lnh
switch duy tr s hot ng ca menu. Xt v d sau:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
void main(void){
char ch;
do{
system("cls"); /* Xoa man hinh. */
printf("\n1. Tinh dien tich hinh tron");
printf("\n2. Tinh dien tich tam giac");
printf("\n3. Tinh dien tich hinh chu nhat");
printf("\n4. Thoat khoi chuong trinh");
printf("\nBam tu 1->4 de chon: ");
Dng Hong Huyn

Ngn ng lp trnh C

46

ch = getche();
switch(ch){
case '1':
/* cau lenh tinh dien tich hinh tron. */
break;
case '2':
/* cau lenh tich dien tich tam giac. */
break;
case '3':
/* cau lenh tich dien tich chu nhat. */
break;
}
if (ch=='4') break;
}while(1);
}
Trong v d trn, s dng vng lp do-while l mt la chn tt nht bi v
ta mong mun cc cu lnh trn c thc hin t nht l mt ln.

3.4. Lnh nhy (Jump)


3.4.1. Lnh return
Lnh return dng thot khi mt hm, n c phn loi lnh nhy bi v
n s tr v ng v tr gi hm. Lnh return c th c tr v mt gi tr hoc khng,
nu lnh return c mt gi tr, gi tr s l gi tr ca hm. Trong C, nhng hm
c tr v gi tr, nu khng tr v gi tr no th chng trnh s t ng tr v mt gi
tr v ngha. Dng tng qut ca lnh return.
return expression;
Biu thc ch xut hin nu hm khai bo c gi tr tr v, trong trng hp ny
gi tr biu thc l gi tr tr v ca hm. Ta c th dng nhiu lnh return trong
mt hm, tuy nhin hm s ngng khi gp mt lnh return sm nht. Du mc cui
hm gn ging nh lnh return.

3.4.2. Lnh goto


Lnh nhy goto t khi s dng trong cc tnh hung lp trnh, bi v nu s

Khoa Cng ngh thng tin Trng i hc Quy Nhn

Chng 3. Cu lnh (Statement)

47

dng nhiu lnh nhy s lm cho chng trnh tr nn phc tp kh g ri. Thng
thng ta s dng lnh nhy trong trng hp thot khi nhiu vng lp lng nhau.
Dng tng qut ca cu lnh nh sau:
goto label;
.
.
.
label:
statements;
Trong , label l tn nhn. Tn nhn l mt nh danh trong C, n c th
c nh ngha trc hoc sau lnh goto. V d sau c to ra mt vng lp in cc s
t 1 n 10.
x = 1;
loop1:
printf(%d ,x);
x++;
if (x<10) goto loop1;
V d tip theo s in ra mn hnh s u tin c ba ch s tha tnh cht abc
3

=a +b +c3.
#include <stdio.h>
void main(void){
int i, j, k;
for(i=1; i<=9; i++)
for(j=0; j<=9; j++)
for(k=0; k<=9; k++)
if(100*i+10*j+k == i*i*i +j*j*j +k*k*k)
goto ketthuc;
ketthuc:
printf(%d%d%d,i, j, k);
}

3.4.3. Lnh break

Dng Hong Huyn

Ngn ng lp trnh C

48

Lnh break dng kt thc cu lnh case trong switch v dng kt


thc cc vng lp m khng cn phi kim tra iu kin. Khi gp lnh break trong
vng lp, vng lp s kt thc ngay lp tc v chng trnh s nhy n cu lnh sau
vng lp. V d: chng trnh sau s kt thc ti gi tr t=10.
#include <stdio.h>
void main(void){
int t;
for(t=0; t<100; t++){
printf("%d ", t);
if(t==10) break;
}
}
Chng trnh trn ch in ra mn hnh cc s t 0 n 10.

3.4.4. Lnh continue


Cu lnh ny dng iu khin chng trnh quay v u vng lp v thc
hin cc vng lp tip theo.
V d: chng trnh sau in ra mn hnh s c s khng tm thng ca mt s
nguyn dng n.
#include <stdio.h>
void main(void){
int i, n, count=0;
for(i=2; i<n; i++){
if(n % i) continue;
count++;
}
printf(So uoc cua %d la:%d, count);
}

3.5. Cu hi trc nghim v bi tp


3.5.1. Cu hi trc nghim
Cu 1. Cho bit gi tr ca biu thc logic sau:
a. 22 + 32 <= 13

Khoa Cng ngh thng tin Trng i hc Quy Nhn

Chng 3. Cu lnh (Statement)

49

b. !(2 <= 3) && (14 % 3 == 2) || (8 / 2 == 4)


c. (x<1) && (x > -1) || (2*x >= 2 + x) x={0, 1, -1, 3}.
d. 3 < 2 && 6 - 5 == 1;
Cu 2. Lnh no sau y in ra mn hnh s ln nht gia hai s thc A v B:
a.
b.
c.
d.

if
if
if
if

(A
(A
(A
(A

>
>
>
<

B)
B)
B)
B)

printf(%f,B);
printf(%f,A);
scanf(%f,&A);
printf(%f,B);

else
else
else
else

printf(%f,A);
printf(%f,B);
scanf(%f,&B);
printf(%f,A);

Cu 3. Kim tra nu ba s a, b, c u ln hn 1 th in s 1, chn lnh no:


a.
b.
c.
d.

if
if
if
if

((a > 1) &&(b > 1)


((a > 1) ||(b > 1)
(a > 1 && b > 1 &&
a > 1 ||> 1 || c >

&&(c > 1)) printf(1);


||(c > 1)) printf(1);
c > 1) printf(1);
1 printf(1);

Cu 4. Cho i l bin nguyn. Sau khi thc hin cc lnh:


i = 2;
switch (i){
case 1: i = i + 1;
case 2: i = i + 2;
case 3: i = i + 3;
}
Gi tr sau cng ca i l:
a. 7

b. 9

c. 4

d. 5

Cu 5. Cho N l bin nguyn, sau khi thc hin cc lnh:


N = 9;
if (N < 0) printf(So am);
else
switch(N % 2){
case 0: printf(Chan); break;
case 1: printf(Le); break;
}
Kt qu in ln mn hnh l:
a.

Chan

Dng Hong Huyn

b. Le

c. So am

d. khng c hin g

Ngn ng lp trnh C

50

Cu 6. Cho S v i l bin nguyn. Khi chy on chng trnh:


s = 0;
for(i=1; i<=10; i++)
s = s + i;
printf(%d, s);
Kt qu in ln mn hnh l:
a. s = 11

b. s = 55

c. s = 100

d. s = 101

Cu 7. Cho S, i v N>0 l cc bin nguyn. tnh S = N!, chn cu no:


a.
b.
c.
d.

S
S
S
S

=
=
=
=

1;
0;
1;
1;

for(i
for(i
for(i
for(i

=
=
=
=

1;
1;
1;
1;

i
i
i
i

<=
<=
<=
<=

N;
N;
N;
N;

i++)
i++)
i++)
i++)

S
S
S
S

*= i;
= S * i;
= S * N;
= S + i;

Cu 8. Cho S v i bin kiu nguyn. Khi chy on chng trnh:


S = 0; i
while (i
S =
i =
}

= 1;
<= 6) {
S + i;
i + 2;

Gi tr sau cng ca S l:
a. 6

b. 9

c. 11

d. 0

Cu 9. Gi s S, i l cc bin nguyn. Khi chy chng trnh:


S = 0;
do{
S
i
}while

i = 1;
= S + i * i;
= i + 1;
(i<4);

Gi tr sau cng ca S l:
a. 0

b. 14

c. 16

d. 30

3.5.2. Bi tp
Bi 1. Nhp bn s x1, x2, x3, x4, tm s ln nht v s nh nht ca bn s .

Khoa Cng ngh thng tin Trng i hc Quy Nhn

Chng 3. Cu lnh (Statement)

51

Bi 2. Nhp mt ch ci, nu l ch thng th i thnh ch hoa, ngc li, nu l


ch hoa th i thnh ch thng. V d: nhp A in ra a, nhp b th in ra B.
Bi 3. Nhp cc h s, gii v bin lun cc h phng trnh sau theo quy tc Cramer:
+
+

=
=

Bi 4. Nhp cc h s gii phng trnh ax2+bx+c=0


Bi 5. Nhp s thc x v tnh: (Hng dn: dng hm exp(x) v log(x), xt
ba trng hp x=0, x>0, x<0).
Bi 6. Nhp s thc x v tnh:

Bi 7. Nhp x l gi tr thc v tnh y theo cng thc:


2+
=

> 1

1 1
+2
( |2 |) < 1

Bi 8. Nhp ch s in k thng trc v thng ny. Hy tnh tin in cho mi hng


gi sau:
Mc

S kWh s dng

n gi
(VN)

kWh t 0 100

1.418

kWh t 101 150

1.622

kWh t 151 200

2.044

kWh t 201 300

2.210

kWh t 301 400

2.361

kWh t 401 tr ln 2.420

Bi 9. Nhp vo thng/nm cho bit thng c bao nhiu ngy. Nm nhun l nm chia
ht cho 4 nhng khng chia ht cho 100 hoc chia ht cho 400.
Bi 10. Nhp ngy/thng/nm, cho bit ngy l ngy th my trong tun. Thut
ton Doomsday (ngy tn th) tnh ngy ca tun nh sau: (ly ngy 09/06/2013
Dng Hong Huyn

Ngn ng lp trnh C

52

lm v d).
Bc 1: Ly hai s u ca nm chia d cho 4:
nu d 0: AD = 3
nu d 1: AD = 0
nu d 2: AD = 6
nu d 3: AD = 4
AD: l gi tr Doomsday ca nm. (20 % 4 = 0 -> AD = 3.)
Bc 2: Ly hai s cui ca nm chia cho 12 ly phn nguyn cho gn a, phn
d cho gn b. (a = 13 / 12 = 1, b = 13 % 12 = 1.)
Bc 3: t c = b chia nguyn cho 4. (c = 1 / 4 = 0).
Bc 4: t s = a + b + c. (s = 1 + 1 + 0 = 2)
Bc 5: t t = s chia d cho 7. (t = 2 % 7 = 2)
Bc 6: t thu = t + AD. (thu = 2 + 3 = 5)
Bc 7: Tm gi tr Doomsday ca thng (MD) da vo bng sau:
Thng 1
2
3 4 5 6 7 8 9 10 11 12
MD
3/4(Nhun) 28/29(Nhun) 0 4 9 6 11 8 5 10 7 12
(MD = 6)
Bc 8: t thu = thu + ngy MD. (thu = 5 +9 - 6 =8)
Bc 9: Trong khi thu < 0 tip tc cng cho 7. (thu = 8).
Bc 10: thu = thu chia ly phn d cho 7. (thu = 8 % 7 = 1).
Bc 11: Ngy ca tun c xc nh nh sau: 0: th by; 1:ch nht; 2: th
hai; 3: th ba; ; 6: th su. (Ngy 09/6/2013 l ch nht).
Bi 11. Nhp ngy/thng/nm dng lch, i sang ngy thng nm m lch.
Bi 12. Nhp mt k t bt k, cho bit k t thuc loi no: l ch hoa, l ch
thng, l ch s hay cc k t khc.
Khoa Cng ngh thng tin Trng i hc Quy Nhn

Chng 3. Cu lnh (Statement)

53

Bi 13. Nhp di ba cnh a, b, c. Cho bit a, b, c c phi l ba cnh ca mt tam


gic khng; nu l ba cnh ca mt tam gic th cho bit lm tam gic g: u, cn
hay tam gic thng?
Bi 14. In bng m ASCII thnh hai ct: M K t, yu cu hin th tng trang mt,
(mi trang 22 dng) ri dng li ch ta nhn Enter mi hin trang k tip, c th cho
n ht.
Bi 15. Nhp n nguyn m bo ln hn 1. Tnh tng cc s l n. V d: nu n=5
th tng S=1+3+5=9, nu n=8 th S=1+3+5+7=16.
Bi 16. Nhp s n nguyn m bo sao cho n dng (nu nhp n 0 th chng trnh
phi bt nhp li), sau tnh cc tng sau:

=
=

1+ 2 + 3+ +
1 + 2 + +

= 1 + 3 + 5 + + (2 + 1)
=

(1)
1
1
1
1
+ +
(2 )
2
4
6
8

1 3 5 7
2 1

2 4 6 8
2

= 1.2.3 2.3.4 + 3.4.5 + + (1)


=

. ( + 1). ( + 2)

1.3.5.7n, khi n l
2.4.6.8n, khi n chn

Bi 17. Nhp n, k nguyn m bo phi dng v k n. Tnh t hp chp k ca n


theo cng thc:
=

!
! ( )!

Bi 18. Cho dy Fibonaci xc nh nh sau: F0=0, F1=1, Fn = Fn-1 + Fn-2, vi n


2. Hy nhp s nguyn n 0 v tnh S = F0 + F1 + F2 +...+ Fn.

Dng Hong Huyn

Ngn ng lp trnh C

54

Bi 19. Tm v in ln mn hnh tt c cc s nguyn trong phm vi t 10 n 99 sao


cho tch ca hai ch s ca n th bng hai ln tng ca hai ch s ca n. V d: s
N=36 c hai ch s l 3 v 6, v 3*6 = 2*(3+6). Tng t i vi s 44.
Bi 20. S hon ho l mt s m tng cc c s ca n bng chnh n, v d
6=1+2+3. Vit chng trnh lit k cc s hon ho nh hn 1000.
Bi 21. Nhp mt s nguyn n, cho bit l s nguyn t hay khng. Nu khng phi
l s nguyn t th phn tch s thnh tch cc tha s nguyn t. V d nhp
n=1470=2.3.5.7.7.
Bi 22. Nhp mt s nguyn n, in ra mn hnh tt c cc s nguyn t nh hn hoc
bng n.
Bi 23. Nhp vo 1 s nguyn, in ra mn hnh s o ngc ca s . V d nhp s
34679, khi hin th ln mn hnh cc s: 97643.
Bi 24. Vit mt chng trnh kim tra mt s c phi l s i xng hay khng? S
i xng l s khi vit ngc cng bng chnh n. V d: 121, 2332,
Bi 25. Nhp s tin gi, s thng. Tnh s tin nhn c da vo bng li sut nh
nh sau:
K hn
Li cui k
(s thng) (%/nm)
6

6.0

12

6.6

15

7.5

18

7.6

24

7.7

36

8.0

Bi 26. Nhp s tin gi, li sut (%/thng), s tin nhn c. Tnh s thng cn gi.
Bi 27. Vit chng trnh tm c s chung ln nht v bi s chung nh nht ca hai
s nguyn.
Bi 28. Tnh gn ng hm s ex da vo khai trin Maclaurin vi chnh xc bng

Khoa Cng ngh thng tin Trng i hc Quy Nhn

Chng 3. Cu lnh (Statement)

mt s >0 cho trc: e x 1

55

x
x2 x3
xn

...
...
1
2! 3!
n!

xn
, n 0
n!

Bi 29. Tnh gn ng hm s ln(1+x) (-1<x<1) da vo khai trin Maclaurin vi


chnh xc bng mt s >0 cho trc.
ln 1 x x

n
x2 x3 x4
n 1 x

... 1
...
2
3
4
n

xn
,
n

n0

Bi 30. Da vo khai trin ca hm ln(1+x), vit chng trnh tnh hm s ln(x)


vi mi x>0.
Bi 31. Tnh gn ng hm s (1+x) (-1<x<1) da vo khai trin Maclaurin vi
chnh xc bng mt s >0 cho trc.

( 1) 2 ( 1)( 2) 3
( 1)...( n 1) n
x
x ...
x ...
2!
3!
n!
( 1)...( n 1)

n!
vi

1 x

1 x

Bi 32. Tnh gn ng hm s

x da vo khai trin Maclaurin ca hm (1+x) vi

chnh xc bng mt s >0 cho trc.


Bi 33. Tnh gn ng hm s sin(x) da vo khai trin Maclaurin vi chnh xc
bng mt s >0 cho trc.

sin( x) x

x3 x5 x7
x 2 n1
n
... 1
...
3! 5! 7!
2n 1!

x 2 n1
, n 0
2n 1!

Bi 34. Tnh gn ng hm s cos(x) da vo khai trin Maclaurin vi chnh xc


bng mt s >0 cho trc.

cos( x) 1

2n
x2 x4 x6
n x
... 1
...
2! 4! 6!
2n !

Dng Hong Huyn

x 2n
, n 0
2n !

Chng 4. Mng v chui (Array & string)

57

CHNG 4. MNG V CHUI (ARRAY &


STRING)
4.1. Khi nim
Mng l tp hp cc bin c cng kiu d liu v c tham chiu thng qua
tn chung. Mi phn t trong mng c truy xut thng qua ch s. Trong C, mng
bao gm cc v tr lin tc trong b nh. a ch thp nht tng ng vi phn t u
tin ca mng v a ch cao nht ng vi phn t cui cng. Mng c th c t mt
n nhiu chiu. Mng thng dng nht l mng chui k t kt thc bng k t rng.
Mng v con tr trong C c quan h chc ch vi nhau.

4.2. Mng mt chiu


C php khai bo mng mt chiu nh sau:
type var_name[size];
Trong , type l kiu d liu ca mng v chnh l kiu d liu ca mi phn
t, size nh ngha kch thc ca mng. V d khai bo 100 phn t c tn l
balance c kiu d liu l kiu double.
double balance[100];
truy xut n mt phn t ca mng ta dng c php sau:
var_name[index];
Khi s dng mt phn t ca mng, ta coi n nh l mt bin thng thng c
cng kiu d liu. C ngha l ta c th nhp mt gi tr t bn phm vo phn t ca
mng, c th in gi tr tng phn t ra mn hnh, cc phn t c th tham gia vo bn
tri hoc bn phi php gn.
V d gn s 12.34 vo phn t th 3 ca mng balance, ta vit:
balance[2]=12.34;
Trong C, mng c ch s bt u t 0, khi ta khai bo char p[10]; mng p

Dng Hong Huyn

Ngn ng lp trnh C

58

c 10 phn t bt u t 0 cho n 9. V d sau to mt mng cc s nguyn, gn gi


tr mi phn t bng chnh ch s ca n, sau in cc gi tr ny ra mn hnh.
#include <stdio.h>
void main(void){
int i, x[20];
for(i=0; i<20; i++)
x[i] = i;
for(i=0; i<20; i++)
printf(%d , x[i]);
}
Chng trnh trn, gn cho 20 phn t ca mng x vi cc gi tr tng ng vi
ch s ca mng. Lu , ch s ca mng c tnh t 0 19.
Tng s b nh (tnh theo Byte) ca mt mng c tnh theo cng thc sau:
tong=sizeof(base type) size of array. Trong ngn ng C, khng
kim tra cc bin ca mng, ta c th vit d liu ln trn cc phn t nm ngoi phm
vi mng. V d on chng trnh sau truy xut n cc phn t nm ngoi mng,
nhng chng trnh vn khng bo li.
int count[10], i;
for(i=0; i<100; i++) count[i] = i;
Mng mt chiu c lu tr lin tc trn b nh my tnh. V d:
char a[7];
Hnh sau m t trng thi ca mng a 7 phn t trong b nh.
Phn t: a[0] a[1] a[2] a[3] a[4] a[5] a[6]
a ch: 1000 1001 1002 1003 1004 1005 1006
Hnh 4-1. Mng 7 k t bt u ti v tr byte th 1000.

4.3. Chui kt thc rng (null-terminated string)


Mt cch s dng ca mng mt chiu l mng cc k t kt thc bng k t
rng. Khi khai bo mt mng cc k t, ta phi dnh mt phn t cui cng gn gi
tr rng cho chui. y l du hiu trnh bin dch bit ht chui.

Khoa Cng ngh thng tin Trng i hc Quy Nhn

Chng 4. Mng v chui (Array & string)

59

Trong C c h tr mt s hm thao tc vi chui.


Tn hm
strcpy(s1, s2)
strcat(s1, s2)
strlen(s1)
strcmp(s1, s2)
strchr(s1, ch)
strstr(s1, s2)
gets(s)
puts(s)

Chc nng
Sao chp chui s2 vo s1.
Ghp chui s2 vo cui chui s1.
Tr v di ca chui s1.
Tr v 0 nu s1 v s2 bng nhau; nh
hn 0 nu s1<s2; ln hn 0 nu s1>s2.
Tr v v tr xut hin u tin ca ch
trong s1.
Tr v mt con tr n v tr xut hin
u tin ca s2 trong s1.
Nhp chui s t bn phm
In chui s ra mn hnh

Hnh 4-2. Mt s hm thng dung trong chui.


Tt c cc hm ny u c ci t trong th vin <string.h>. Chng
trnh sau s minh ha cc hm trn chui k t:
#include <stdio.h>
#include <string.h>
#include <conio.h>
void main(void){
char s1[20], s2[20];
printf(Nhap chuoi 1:);
gets(s1);
printf(Nhap chuoi 2);
gets(s2);
printf("do dai: %d %d\n", strlen(s1), strlen(s2));
if(!strcmp(s1, s2))
printf("Hai chuoi bang nhau\n");
strcat(s1, s2);
printf("%s\n", s1);
strcpy(s1, "Day la chuoi bo sung.\n");
printf(s1);
if(strchr("hello", 'e'))
printf("e nam trong hello\n");
if(strstr("hi there", "hi")) printf("tim thay hi");

Dng Hong Huyn

Ngn ng lp trnh C

60

getch();
}

4.4. Mng hai chiu


Ta c th coi mng hai chiu l mng ca mng mt chiu. Dng tng qut
khai bo mng hai chiu l:
type array_name[size1][size2];
truy cp n phn t ca mng hai chiu, ta vit nh sau:
array_name[index1][index2];
V d:
#include <stdio.h>
#include <conio.h>
void main(void){
int t, i, num[3][4];
for(t=0; t<3; ++t)
for(i=0; i<4; ++i)
num[t][i] = (t*4)+i+1;
/* in mang ra man hinh */
for(t=0; t<3; ++t){
for(i=0; i<4; ++i)
printf("%3d ", num[t][i]);
printf("\n");
}
getch();
}
Trong v d sau: num[0][0] = 1, num[0][1] = 2, , num[2][3] =
12. hnh sau minh ha bn cht ca mng hai chiu:

Khoa Cng ngh thng tin Trng i hc Quy Nhn

Chng 4. Mng v chui (Array & string)

61

Mng hai chiu lu tr ch s theo th t dng-ct, ch s th nht l dng, ch


s th hai l ct. iu ny c ngha l: ch s bn phi nht s tng nhanh nht. lu
tr mng hai chiu ta cn s byte theo cng thc sau:
byte = size of index1 size of index2 sizeof(type)
Hnh sau th hin mng hai chiu trong b nh

Hnh 4-3. Mng hai chiu trong b nh.


s dng mng chui, ta s dng mng hai chiu kiu char. Kch thc bn
tri xc nh s chui, kch thc bn phi xc nh di ti a ca mt chui. V d:
char

str[30][80];

Khi khai bo 30 chui k t, mi chui c di ti ta l 80. truy cp n


tng chui trong mng ta dng c php name[index]. V d:
gets(str[20]);
Nhp gi tr vo chui ti a ch th 21. Cu lnh trn cng tng ng vi

Dng Hong Huyn

Ngn ng lp trnh C

62

lnh sau:
gets(&str[20][0]);
V d:
/* chuong trinh soan van ban don gian. */
#include <stdio.h>
#define MAX 100
#define LEN 80
char text[MAX][LEN];
void main(void){
int t, i, j;
printf("Nhap chuoi rong de thoat.\n");
for(t=0; t<MAX; t++) {
printf("dong %d: ", t);
gets(text[t]);
if(text[t][0]==0) break;
}
for(i=0; i<t; i++) {
for(j=0; text[i][j]!=0; j++)
printf("%c",text[i][j]);
printf("\n");
}
}

4.5. Khi gn mt mng


4.5.1. Khi gn mng mt chiu
Dng tng qut khi to gi tr cho mng mt chiu nh sau:
type array_name[size] = {value_list};
value_list l danh sch cc gi tr c ngn cch nhau bi du phy v c
cng kiu d liu vi d liu ca mng. Gi tr u tin c t vo v tr u tin ca
mng, gi tr th hai t vo v tr th hai, vn vn. V d sau khi gn cc gi tr cho
mi phn t u tin ca mng.
int i[10] = {1,2,3,4,5,6,7,8,9,10};
Khi , i[0] nhn gi tr 1 v i[9] s nhn gi tr 10.

Khoa Cng ngh thng tin Trng i hc Quy Nhn

Chng 4. Mng v chui (Array & string)

63

i vi mng cc k t (chui) ta c th khi gn bng cch sau:


char str[9]=I like C;
Cu lnh ny tng ng vi cu lnh sau:
char str[11]={I, ,l,i,k,i, ,e,
,C,\0};
Mc du chui ch c 8 k t nhng ta vn cn c 9 v tr lu tr chui ny
bi v c mt k t rng cui cng thng bo cho trnh bin dch bit chui kt
thc.

4.5.2. Khi gn mng hai chiu


Mng nhiu chiu cng c khi gn nh mng 1 chiu bng c php sau:
type array_name[size1][size2] = {value_list};
V d:
int sqrs[10][2] = {
1, 1, /*sqrs[0][0] and *sqrs[0][1]*/
2, 4, /*sqrs[1][0] and *sqrs[1][1]*/
3, 9,
4, 16,
5, 25,
6, 36,
7, 49,
8, 64,
9, 81,
10, 100/*sqrs[9][0] and *sqrs[9][1]*/
};
Tuy nhin, ta c th gn theo mt cch khc r rng hn.
int sqrs[10][2] = {{1, 1} /*sqrs[0][0] and sqrs[0][1]*/
{2, 4} /*sqrs[1][0] and sqrs[1][1]*/
{3, 9}
{4, 16}
{5, 25}
{6, 36}
{7, 49}
{8, 64}
Dng Hong Huyn

Ngn ng lp trnh C

64

{9, 81}
{10, 100}/*sqrs[9][0] and sqrs[9][1]*/
};

4.5.3. Khi gn mng khng kch thc


Trong trng hp ta khng bit chnh xc thng tin cn gn cho mng, khi ta
khng th khai bo mt mng c kch thc c nh. Trnh bin dch C cho php ta
gn gi tr cho mng m khng cn xc nh kch thc. V d:
char e1[] = "Read error\n";
char e2[] = "Write error\n";
char e3[] = "Cannot open file\n";

4.6. Cu hi trc nghim v bi tp


4.6.1. Cu hi trc nghim
Cu 1. Chn khai bo ng :
a.
b.
c.
d.

int A[10];
int[10] A;
int A[1..10];
int A[1,10];

Cu 2. Cho khai bo:


int A[4];
int i;
nhp d liu cho A, chn cu no :
a. for (i=1; i <= 4; i++){
printf(Nhap A[%d]:);
scanf(%d,&A[i]);
}
b. for (i=1; i <= 4; i++) scanf(Nhap A[%d]:,A[i]);
c. for (i=0; i <= 3; i++){
printf(Nhap A[%d]:);
scanf(%d,&A[i]);
}
d. printf(Nhap A:); scanf(%d,A);
Cu 3. Cho khai bo bin:

Khoa Cng ngh thng tin Trng i hc Quy Nhn

Chng 4. Mng v chui (Array & string)

65

int A[5];
Chn lnh ng:
a.
b.
c.
d.

A[1]
A[2]
A(3)
A[5]

=
=
=
=

4/2;
-6;
6;
10;

Cu 4. Khai bo no ng:
a.
b.
c.
d.

int
int
int
int

A[n][m];
A[2][3];
A[1..2,1..3];
A[3, 2];

Cu 5. Khi chy on chng trnh:


int A[2][3], i, j, S;
A[0][0] = 3; A[0][1] = -1; A[0][2]:= -4;
A[1][0] = -9; A[1,1] = 0; A[1,2] = 5;
S:=0;
for(i = 0; i < 2; i++)
for(j = 1; j < 3; j++)
if (A[i,j] < 0) S = S + 1;
printf(%d,S);
Kt qu in ra gi tr ca S l:
a.0

b. -9

c. 3

d. 5

4.6.2. Bi tp
Bi 1. Nhp s t nhin n v mt dy s thc x1, x2, ..., xn. Tm s ln nht
v s nh nht ca dy. m xem trong dy c bao nhiu s dng, bao nhiu s m,
bao nhiu s 0 ? Loi no nhiu nht?
Bi 2. Nhp mt dy s nguyn x1, x2, ..., xn. In ring cc s chn v cc s
l, mi loi trn mt dng.
Bi 3. Nhp dy s nguyn, in ra mn hnh nhng s nguyn t trong dy.
Bi 4. Nhp dy s nguyn, in ra mn hnh nhng s chnh phng trong dy.

Dng Hong Huyn

Ngn ng lp trnh C

66

Bi 5. Nhp dy s nguyn, in ra mn hnh nhng s i xng trong dy.


Bi 6. Nhp dy s nguyn, nhp mt s nguyn x. Kim tra xem x c xut hin trong
dy hay khng.
Bi 7. Nhp dy s nguyn, nhp s nguyn x. Xa s nguyn x trong dy nu nh x
xut hin.
Bi 8. Nhp dy s nguyn, nhp s nguyn x. Chn phn t x vo u, cui dy.
Bi 9. Nhp mt s nguyn dng n, xy dng dy s nguyn x0, x1, ..., xn
trong xi l s Fibonaci th i: x0=1, x1=1, xi=xi-1 + xi-2 vi mi i >= 2.
In dy x ln mn hnh.
Bi 10. Nhp mt dy s x1, x2,..., xn. Tnh:

Bi 11. Nhp mt dy s bt k x1, x2,..., xn. In o ngc dy , v d cho


dy 1 5 3 8, in ra: 8 3 5 1. Sp xp dy tng dn, in dy. Sp xp dy gim dn,
in dy.
Bi 12. Nhp hai dy s bt k x1, x2,..., xn v y1, y2,..., yn. Xy dng
dy th ba z1, z2, .., zn l tng ca hai dy trn (zi= xi + yi), in ba dy ln
mn hnh, mi dy trn mt dng.
Bi 13. Cho hai a thc:
Pn(x) = anxn + an-1xn-1 + ...+ a1x + a0
Qm(x) = bmxm + bm-1xm-1 + ...+ b1x + b0

(an > 0)
(bm > 0)

Gi R(x) = Pn(x) + Qm(x)


Nhp cc s t nhin n v m, cc h s ai v bj ca hai a thc Pn(x) v
Qm(x), in bc v cc h s ca a thc R(x).
Bi 14. Nhp x thc, n nguyn dng v mt mng cc h s a0, a1, ..., an ,
ri tnh ga tr ca a thc:

Khoa Cng ngh thng tin Trng i hc Quy Nhn

Chng 4. Mng v chui (Array & string)

67

P = anxn + an-1 xn-1 + ...+ a1 x + a0.


Theo s Hoocner :
P=(...( (anx + an-1) x+ an-2)x + ...+ a1 )x + a0

V d :
P = 2x4 + 3x3 - 4x2 +7x + 9
= (((2x + 3)x - 4 )x + 7)x + 9 .
Bi 15. Nhp mt dy s bt k x 1, x2,..., xn, cho bit dy c i xng khng?
dy c lp thnh mt cp s cng khng? V d dy 1 3 5 4 5 3 1 l i xng,
dy 1 3 5 7 l mt cp s cng.
Bi 16. Nhp mt dy s bt k x1, x2,..., xn, cho bit dy thuc loi no: tng,
gim hay khng tng, khng gim?
Bi 17. Nhp mt dy s nguyn dng x1, x2,..., xn. Tch dy x thnh hai
dy: dy A gm cc s chn, dy B gm cc s l, sp xp dy A tng dn, dy B gim
dn, in hai dy A v B trn hai dng khc nhau. Ni hai dy A v B theo th t
thnh mt dy duy nht v gn tr li vo dy x, in dy x.
V d nhp dy x={5, 7, 0, 2, 1, 6, 4, 9} th dy A={0, 2, 4,
6}, dy B={9, 7, 5, 1}, v x={0, 2, 4, 6, 9, 7, 5, 1}.
Bi 18. Nhp hai s m, n v hai ma trn Am,n v Bm,n. In cc ma trn A, B, C=A+2B
v D=A-B ln mn hnh.
Bi 19.
Nhp v in ma trn Am,n.
Tm s nh nht v s ln nht trong ma trn .
Tnh tng ca tt c cc phn t trong ma trn.
m trong ma trn c bao nhiu s dng, bao nhiu s 0, bao nhiu s m.
Bi 20.
Nhp v in ma trn Am,n

Dng Hong Huyn

Ngn ng lp trnh C

68

Tm v in s ln nht trong tng hng ca ma trn.


Tm v in s ln nht trong tng ct ca ma trn.
Tm v in s nh nht trn ng cho chnh, ph ca ma trn.
Bi 21.
Nhp v in ma trn vung An,n.
A c phi l ma trn i xng khng
A c phi l ma trn n v khng?
(A l i xng nu aij=aji vi mi i,j =1,..., n. A l ma trn n v
nu tt c cc phn t trn ng cho chnh u bng 1 v cc phn t cn li u
bng 0).

Khoa Cng ngh thng tin Trng i hc Quy Nhn

Chng 5. Con tr (Pointer)

69

CHNG 5. CON TR (POINTER)


C ba l do s dng con tr: 1. S dng con tr truyn tham s cho hm
lu tr kt qu ca bin sau khi thot khi hm; 2. Con tr cp pht b nh ng; 3.
Con tr c th ci thin hiu qu ca chng trnh con.
Con tr l c tnh mnh nht v cng nguy him nht trong ngn ng C.

5.1. Khi nim con tr


Con tr l mt bin lu tr a ch b nh. a ch ny l v tr ca i tng
khc (chng hn bin) trong b nh. V d, mt bin cha a ch ca mt bin khc,
bin u tin gi l con tr tr n bin th hai.

Hnh 5-1. Bin con tr n v tr khc.

5.2. Bin con tr


Dng tng qut khai bo mt bin con tr:
type *var_name;
type l kiu d liu ca con tr, n c kiu d liu bt k. type nh ngha
kiu d liu m n tr n, mi con tr u c th tr n v tr bt k trong b nh.

Dng Hong Huyn

Ngn ng lp trnh C

70

5.3. Ton t trn con tr


C hai php ton c bn l php ton ly a ch (&) ly gi tr (*), v d:
m = &count;
t vo trong bin m a ch ca bin count hay m nhn a ch ca bin
count. hiu r hn ta ly v d c th nh sau: gi s bin count dng v tr
trong b nh l 2000 lu tr gi tr, v gi s bin count c gi tr l 100, sau
cu lnh gn trn, m s c gi tr l 2000. Ton t * dng ly gi tr ca bin c a
ch lu ti con tr. V d:
q = *m;
Ly gi tr ca bin c a ch nm trong m. Trong trng hp ny m gi a ch
ca bin count do cu lnh trn s cho gi tr ca bin count, v c gi tr l
100. C hai php ton ny c u tin cao hn cc php ton s hc (tr php ton
tr mt ngi, i vi php ton ny c cng u tin).
Ta lun chc chn rng, con tr phi tr n mt kiu d liu hp l. V d nu
khai bo con tr kiu int, trnh bin dch s hiu hng mi a ch m n lu tr phi
l a ch ca bin kiu int hoc n khng tr n u. Bi v C cho php ta gn mi
a ch n bin con tr nhng n s khng cho kt qu mong mun. Xt v d:
#include <stdio.h>
#include <conio.h>
void main(void){
double x = 100.1, y;
int *p;
p = &x;
y = *p;
printf("%f", y); /* Se khong in ra 100.1 */
getch();
}
Chng trnh trn khng gn gi tr ca bin x cho y. Bi v p l mt con tr
nguyn, ch c khong hai hoc bn byte c chuyn sang y.

5.4. Biu thc con tr


Khoa Cng ngh thng tin Trng i hc Quy Nhn

Chng 5. Con tr (Pointer)

71

Tng qut, biu thc con tr ph hp vi quy lut biu thc khc. Tuy nhin c
vi im cn quan tm.

5.4.1. Php ton gn


Nh nhng bin khc, ta c th dng con tr bn phi ca php ton gn. V
d:
#include <stdio.h>
#include <conio.h>
void main(void){
int x;
int *p1, *p2;
p1 = &x;
p2 = p1;
/*in a ch ca x, khng phi gi tr */
printf("%p", p2);
getch();
}
C p1 v p2 u tr n bin x, a ch ca bin x c hin th ln mn hnh
thng qua lnh printf(%p)

5.4.2. Ton t s hc trn con tr


C hai ton t s hc s dng cho con tr, l php cng v php ton tr.
Gi s p1 l con tr int cha a ch (c gi tr) l 2000 v s nguyn c di hai
byte. Biu thc p++ cho gi tr ca p l 2002, khng phi 2001, l do l mi ln p1
tng, n s tr n mt s nguyn k tip trong b nh, tng ng vi vic tng hai
byte. iu ny cng tng t nh php ton tr. Ta cng c th cng hay tr con tr
vi mt s nguyn.

Dng Hong Huyn

Ngn ng lp trnh C

72

Hnh 5-2. Php ton s hc ca con tr.

5.4.3. So snh con tr


Ta c th so snh hai bin con tr vi nhau, v d sau kim tra con tr q c ln
hn con tr p hay khng.
if(p<q) printf(p co dia chi nho hon q);
Thng thng dng php ton so snh kim tra xem cc con tr c tr n
mt i tng hay khng.

5.5. Con tr v mng


Con tr v mng c mi lin h chc ch vi nhau. Tn mng khng cha ch
s chnh l con tr tr n v tr (phn t) u tin ca mng, v d:
char str[80], *p1;
p1 = str;
Khi chng trnh s t a ch ca str vo bin con tr p1, truy cp
phn t th 5 ca str, c th vit theo hai cch sau:
str[4] hoc *(p+4)
v d:
/* S dng s nh l mng. */
#include <stdio.h>
void main(void){
int t;
Khoa Cng ngh thng tin Trng i hc Quy Nhn

Chng 5. Con tr (Pointer)

73

char *s=abc;
for(t=0; s[t]; ++t) putchar(s[t]);
}
/* Truy cp s nh l con tr. */
#include <stdio.h>
void main(void){
int t;
char *s=abc;
while(*s) putchar(*s++);
}
Tng t i vi mng hai chiu:
int a[10][10];
//a = &a[0][0];
a[1][2] = 100; //<=> *(a+1*10+2) = 100;
Tng qut, truy cp n phn t j, k ca mng hai chiu ta dng cng
thc sau:
a[j][k] <=> *(a + j*ct + k)
Tuy mng v con tr ging nhau nhng cng c mt im khc bit c bn gia
mng v con tr. l i vi mng ta khng th thay i a ch ca mng trong sut
chng trnh. V d: int a[10], b[10]; cu lnh a=b; s khng thc hin
c bi v ngha ca cu lnh trn l ly a ch phn t u tin ca mng b gn
cho a, m a l a ch ca mng a[10] nn ta khng th thay i a c. Tuy nhin
vi con tr ta c th thay i a ch ca n khi cn. Xt v d: int a[10],
b[10], *p; ta c th thc hin p=a; v sau tip tc thc hin p=b; iu ny
c ngha l p nhn a ch ca a sau nhn a ch ca b.

5.6. Mng cc con tr


Con tr c th c khai bo thnh mng ging nh nhng kiu d liu khc.
V d sau khai bo mt mng con tr nguyn c kch thc 10.
int *x[10];
gn a ch ca bin nguyn c tn l var n phn t th 3 ca mng x ta
dng lnh sau:

Dng Hong Huyn

Ngn ng lp trnh C

74

x[2] = &var;
Khi ly gi tr ca bin var, ta dng lnh sau:
v = *x[2];
gi mt mng con tr n hm, ta khai bo hm nh sau:
void func1(int *p[]);
Khi hm func1() nhn tham s l mt con tr, tr n mng cc con tr
nguyn. Thng thng mng con tr thng dng lu tr cc con tr n chui. V
d:
char *p[10];/* Khai bao 10 con tro kieu char. */
p[0] = Chuoi thu nhat;
.
.
.
p[9] = Chuoi thu muoi;
V d:
To mt hm thng bo li vi mt m li cho trc
void syntax_error(int num){
static char *err[] = { "Cannot Open File\n",
"Read Error\n",
"Write Error\n",
"Media Failure\n"
};
printf("%s", err[num]);
}

5.7. Tr gin tip


Ta c th dng con tr tr n mt con tr khc, tnh hung ny gi l tr gin
tip. khai bo con tr ny ta dng c php nh sau:
type **var_name;
V d:
int **x;
Khi x l mt con tr n mt con tr s nguyn, truy cp n gi tr gin
Khoa Cng ngh thng tin Trng i hc Quy Nhn

Chng 5. Con tr (Pointer)

75

tip ny ta dng: **var_name; xt v d sau:


#include <stdio.h>
void main(void){
int x, *p, **q;
x = 10;
p = &x;
q = &p;
printf("%d", **q); /* in gia tri cua x */
}
Trong v d trn, con tr q s cha a ch ca con tr p, con tr p cha a ch
ca bin x, ta c th ni q tr gin tip n x thng qua con tr p. ly gi tr ca
bin x (truy cp n b nh ca bin x) ta s dng hai du *. Ch , nu ta thay i
gi tr ca *q, khi p khng cn gi a ch ca bin x na.
Con tr

Bin

a ch

Gi tr
Con tr n bin

Con tr

Con tr

Bin

a ch

a ch

Gi tr

Con tr n con tr
Hnh 5-3. Con tr n mt con tr khc.

5.8. Cp pht b nh ng
5.8.1. Cc hm lin quan
Cp pht ng l chng trnh s nhn b nh khi thc thi, hm h tr cho cp
pht ng trong C l malloc() (cp pht).
C php: void *malloc(int size); Hm malloc() s tr v con tr
kiu void iu ny c ngha l ta c th gn cho mi kiu con tr, v con tr ny tr

Dng Hong Huyn

Ngn ng lp trnh C

76

n byte u tin ca vng c cp pht, vng nh ny l mt dy cc byte lin tip


nhau. Nu b nh khng cp pht, hm cho con tr gi tr NULL. v d:
char *p;
p = malloc(1000);
Cp pht 1000 byte lin tc trong b nh, v p s tr n byte u tin trong
1000 byte va cp pht. Trong v d trn khng bt buc con tr c kiu g nhn gi
tr tr v ca hm malloc(). Con tr void s t ng chuyn i kiu cho ph hp.
Nu vng nh sau khi cp pht ng khng cn s dng na, ta nn gii phng
vng nh tit kim khng gian b nh cho my tnh. Hm free(void *name)
gii phng con tr mi c cp pht bi hm malloc(). Hai hm ny nm trong
th vin stdlib.h.

5.8.2. Cp pht b nh ng cho mng mt chiu


cp pht b nh ng cho mng mt chiu, ta s dng hm malloc cp
pht mt vng nh va lu s phn t ca mng. Sau dng mt con tr lu li
a ch byte u tin trong vng nh ny v s dng con tr ny truy cp n cc
phn t ca mng.
V d nhp vo mt dy n s nguyn, tm s ln nht ca dy s (s dng
cc lnh cp pht b nh ng).
#include <stdlib.h>
#include <conio.h>
#include <stdio.h>
void main(void){
int *p, max, n, i;
printf("n=");
scanf("%d",&n);
/* cap phat bo nho */
p=malloc(n * sizeof(int));
if(p==NULL){
printf("Khong cap phat duoc bo nho!\n");
getch();
Khoa Cng ngh thng tin Trng i hc Quy Nhn

Chng 5. Con tr (Pointer)

77

return;
}
/* Nhap cac phan tu cua day */
for(i=0; i<n; i++){
printf("phan tu thu %d: ", i);
scanf("%d", p+i);
}
max = *p;
for(i=1; i<n; i++)
if(*(p+i)>max)
max = *(p+i);
printf("so lon nhat: %d\n", max);
free(p);
}
Ch , ly a ch ca phn t th i ta c th s dng c php: &p[i] hoc
p+i. ly gi tr ca phn t th i ta c th vit p[i] hoc *(p+i).

5.8.3. Cp pht b nh ng cho mng hai chiu


cp pht ng cho mng hai chiu, s dng con tr gin tip. Ta c th coi
mng hai chiu l mng 1 chiu m mi phn t ca mng ny li l mt con tr n
mng mt chiu khc. V d:
int a[3][4];
Khi a l mng mt chiu v cc phn t a[0], a[1], a[2] l cc con tr
ln lt tr n phn t u tin ca dng 0, 1, 2 tng ng. C th:
a[0] l a ch ca a[0][0] v *a[0] l gi tr a[0][0].
a[0]+1 l a ch ca a[0][1] v *(a[0]+1) l gi tr ca a[0][1].
a[1] l a ch ca ca a[1][0] v *a[1] l gi tr ca a[1][0].
a[1]+2 l a ch ca a[1][2] v *(a[1]+2) l gi tr ca a[1][2].
V a[0], a[1], a[2] l phn t ca mng a, nn ta c th vit:
a l a ch ca a[0], *a l gi tr ca a[0], m a[0] l a ch ca
a[0][0] nn **a l gi tr a[0][0].
Dng Hong Huyn

Ngn ng lp trnh C

78

a+1 l a ch ca a[1], *(a+1) l gi tr ca a[1], m a[1] l a ch ca


a[1][0] nn *(*(a+1)) l gi tr ca a[1][0].
*(a+1)+2 l gi tr ca a[1]+2, m a[1]+2 l a ch ca a[1][2] nn
*(*(a+1)+2) l gi tr ca a[1][2].
Khi cp pht b nh ng cho mng hai chiu, u tin ta phi cp pht b nh
cho mng mt chiu m mi phn t mng ny l mt con tr cha a ch ca phn t
u tin ca dng tng ng, sau ta ln lt cp pht cho tng dng. Xt v d
nhp vo 1 mng hai chiu, in mng ra mn hnh v tm gi tr ln nht ca mng .
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
void main(void){
int **p, m, n, i, j, max;
printf("Nhap so dong: ");
scanf("%d", &m);
printf("Nhap so cot : ");
scanf("%d", &n);
/* Cap phat bo nho m con tro kieu int. */
p = malloc(m*sizeof(int*));
if(p==NULL){
printf("Khong cap phat duoc bo nho.\n");
getch();
return;
}
/* Cap phat bo nho cho tung dong, moi dong n phan tu. */
for(i=0; i<m; i++){
p[i]=malloc(n * sizeof(int));
if(p[i]==NULL){
printf("Khong cap phat duoc bo nho cho dong
%d.\n",i);
getch();
return;

Khoa Cng ngh thng tin Trng i hc Quy Nhn

Chng 5. Con tr (Pointer)

79

}
}
/* Nhap cac phan tu ma tran. */
for(i=0; i<m; i++)
for(j=0; j<n; j++){
printf("p(%d,%d): ",i,j);
scanf("%d", p[i]+j);
}
/* In cac phan tu ra man hinh. */
for(i=0; i<m; i++){
for(j=0; j<n; j++)
printf("%4d",*(p[i]+j));
printf("\n");
}
/* Tim so lon nhat cua ma tran. */
max = **p;
for(i=0; i<m; i++)
for(j=0; j<n; j++)
if(p[i][j]>max)
max = *(*(p+i)+j);
printf("So lon nhat: %d\n", max);
/* Giai phong bo nho. */
for(i=0; i<m; i++)
free(p[i]);
free(p);
}
Ch , ly gi tr ca p[i][j] ta c th vit: p[i][j] hoc
*(p[i]+j) hoc *(*(p+i)+j). ly a ch ca p[i][j] ta c th vit
&p[i][j] hoc p[i]+j hoc *(p+i)+j. Tuy nhin d hiu v trnh nhp
nhng, ta nn vit &p[i][j] l ly a ch ca phn t p[i][j], p[i][j] ly gi
tr ca phn t p[i][j].
Trong v d trn, ta c th cp pht b nh ng cho mng hai chiu nh trng

Dng Hong Huyn

Ngn ng lp trnh C

80

hp mng mt chiu v truy cp cc phn t ca mng hai chiu ging nh mng mt


chiu theo c php nh: p[i][j] p[i*ct + j]. Tuy nhin, trong trng hp
mng hai chiu m s phn t ca mi dng khc nhau (chng hn nh dng 1 c 5
phn t, dng 2 c 7 phn t, dng 3 c 10 phn t, ) cch ti u nht trong trng
hp ny l s dng phng php ging nh v d trn.
Ch , gii phng b nh cho mng hai chiu ta phi gii phng tng dng
ca mng trc sau mi gii phng mng hai chiu.

5.9. Mt s vn vi con tr
5.9.1. Xc nh con tr trc khi s dng
Ch trong qu trnh c v ghi d liu vo con tr. Nu con tr cha xc nh
th vic c s cho mt gi tr khng mong mun, nu ghi c th ta s ghi ln m
hoc l d liu ca chng trnh. V d:
/*Chuong trinh se bi loi. */
int main(void){
int x, *p;
x = 10;
*p = x;
return 0;
}
Chng trnh trn s gn gi tr 10 vo mt v tr no trong b nh m ta
cha xc nh bi v con tr p cha bao gi c gn mt gi tr c th. Trong trng
hp chng trnh nh c th khng gy nh hng nhiu, nu chng trnh qu ln,
gi tr ca p c th l mt v tr no ca d liu, h iu hnh, m chng trnh.

5.9.2. Khng nn gn gi tr c th cho con tr


/* Chuong trinh bi loi. */
#include <stdio.h>
#include <conio.h>
void main(void){
int x, *p;
x = 10;

Khoa Cng ngh thng tin Trng i hc Quy Nhn

Chng 5. Con tr (Pointer)

81

p = x;
printf("%d", *p);
getch();
}
Khi gi hm printf() khng in gi tr ca x n ch in mt gi tr khng xc
nh bi v lnh gn p=x l sai. sa li chng trnh ny, ta dng lnh p=&x.

5.9.3. Gi tr con tr thay i


/* Chuong trinh nay bi loi. */
#include <string.h>
#include <stdio.h>
#include <conio.h>
void main(void){
char *p1;
char s[80];
p1 = s;
do {
gets(s);
while(*p1) printf(" %d", *p1++);
} while(strcmp(s, "done"));
getch();
}
Chng trnh trn dng con tr p1 in cc k t cha trong s ra mn hnh.
y s ch gn cho p1 c mt ln. Vng lp u tin p1 tr n phn t u tin ca s.
Tuy nhin vng lp th hai p1 tng ln 1, do n khng tr n phn t nm
bn tri nht ca s v vy strcmp(s,done) khng cho kt qu chnh xc.
khc phc li trn ta a lnh p1=s vo trong vng lp.

5.10. Cu hi trc nghim v bi tp


5.10.1. Cu hi trc nghim
Cu 1. Cho bit kt qu hin ra mn hnh
int *p, *q, x=10;
.
.

Dng Hong Huyn

Ngn ng lp trnh C

82

p = &x;
printf(%d\n,
q = p;
printf(%d\n,
*q = *q + 2;
printf(%d\n,
printf(%d\n,
printf(%d\n,

*p);
*q);
x);
*q);
*p);

Cu 2. Cho bit kt qu hin ra mn hnh


int *p, x = 10; y = 20;
.
.
p = &x;
printf(%d\n,x);
*p = y;
printf(%d\n,x);
Cu 3. Cho bit kt qu hin ra mn hnh
int *p, x = 10;
.
.
p = malloc(sizeof(int));
*p = x;
printf(%d\n,x);
printf(%d\n,*p);
x = x + 2;
printf(%d\n,x);
printf(%d\n,*p);
Cu 4. Cho bit kt qu hin ra mn hnh
int *p, a[10];
.
.
.
for(i = 0; i < 10; i++) a[i] = i + 1;
p = &a[3];
printf(%d\n,*p);

Khoa Cng ngh thng tin Trng i hc Quy Nhn

Chng 5. Con tr (Pointer)

83

p = p 2;
printf(%d\n,*p);
p = p + 4;
printf(%d\n,*p);

5.10.2. Bi tp
Bi 1. Nhp s t nhin n, cp pht cho con tr p n s nguyn trong b nh. Nhp dy
cc s nguyn vo p. Tm s ln nht v s nh nht ca dy. m trong dy c bao
nhiu s dng, bao nhiu s m, bao nhiu s 0 ? Loi no nhiu nht ?
Bi 2. Cp pht b nh v nhp mt dy s bt k x1, x2,..., xn. In o ngc dy , v
d cho dy 1 5 3 8, in ra: 8 3 5 1. Sp xp dy tng dn, in dy. Sp xp dy
gim dn, in dy.
Bi 3. Nhp hai s nguyn m, n. Cp pht b nh ng cho ma trn cp mxn, tm s
ln nht, nh nht trn tng dng, ct ca ma trn.
Bi 4. Nhp s n, cp pht mt ma trn vung cp nxn, kim tra ma trn vung ny c
phi l ma trn n v hay khng? ma trn vung ny c i xng vi nhau qua ng
cho chnh hay khng?
Bi 5. Cp pht b nh cho ba ma trn Amxp, Bpxn, Cmxn. Vit chng trnh tnh
tch ca hai ma trn A.B kt qu lu vo ma trn C.

Dng Hong Huyn

Chng 6. Hm (Function)

85

CHNG 6. HM (FUNCTION)
6.1. Dng tng qut ca mt hm
Dng tng qut ca mt hm:
return_type function_name(parameter list)
{
body of the function
}
Kiu tr v c kiu d liu bt k, ngoi tr kiu mng. Danh sch tham s cch
nhau bi du phy. Hm c th c tham s hoc khng. Tt c cc tham s ca hm
phi c khai bo mt cch ring bit.
f(type var1, type var2, , type varN).
vit mt chng trnh c s dng hm, ta phi khai bo hm trc hm
main, v nh ngha hm sau hm main. Khun dng c th nh sau:
/* Khai bao ham tai vi tri nay */
return_type function_name(parameter list);
return type main(){
statements ;
}
/* Dinh nghia ham tai vi tri nay */
return_type function_name(parameter list){
body of the function
}
gi hm, ta dng c php:
function_name(parameter1, parameter2, , parameterN);
Nu hm khng c tham s hnh thc ta gi hm theo cch sau:
function_name();
Nu hm c tr v mt gi tr, hm c th xut hin bn phi php gn, xut
hin trong cu lnh printf.

Dng Hong Huyn

Ngn ng lp trnh C

86

V d, vit hm tnh n!, s dng hm ny tnh gi tr t hp n chp k phn t


theo cng thc:

!
!(

)!

#include <stdio.h>
/*Khai bao ham tinh giai thua */
unsigned long int giaithua(int n);
/* Khai bao ham main */
void main(void){
int n, k, Cnk;
printf("n,k=");
scanf("%d%d",&n,&k);
Cnk = giaithua(n)/giaithua(k)/giaithua(n-k);
printf("So to hop %d phan tu cua tap hop %d phan tu
la: %d\n",k,n,Cnk);
}
/* Dinh nghia ham tinh giai thua */
unsigned long int giaithua(int n){
unsigned long int tg=1;
int i;
for(i=2; i<=n; i++)
tg = tg * i;
return tg;
}
Trong v d trn, ta nh ngha mt hm c tn l giaithua, hm ny c tham
s l mt s nguyn chnh l gi tr cn tnh giai tha. Trong phn nh ngha hm
giaithua, bin n l tham s v n l bin cc b ging nh nhng bin tg, i trong
hm. iu c ngha l bin n, tg, i c cp c cp pht vng nh khi gi hm
v nhng vng nh ny s c gii phng khi thot khi hm.
Trong hm main, ta c ba li gi hm giaithua l: giaithua(n),
giaithua(k), giaithua(n-k). Khi ba gi tr n, k, n-k c gi l i s
(argument) ca hm giaithua. Trong trng hp ny, ba gi tr n, k, n-k s c
sao chp vo tham s n ca hm giaithua khi gi hm. C ch truyn tham s ca

Khoa Cng ngh thng tin Trng i hc Quy Nhn

Chng 6. Hm (Function)

87

hm s c trnh by chi tit phn sau. Ch : ta phi phn bit bin n ca hm


main v bin n ca hm giaithua l hai bin khc nhau (c a ch trong b nh
khc nhau).

6.2. Cc lut phm vi ca hm


Mi hm l mt khi lnh ring bit, ta khng th truy cp bi mt cu lnh
khi khc. V d nh nhy t hm ny n hm khc. M to nn thn hm c n
du i vi nhng chng trnh khc ngoi tr bin cc b hoc nhng d liu khc.
N c th tc ng hoc khng i vi phn khc ca chng trnh. Ni cch khc, m
v d liu trong hm ny khng th tng tc vi bin v m trong hm khc.
Bin nh ngha bn trong hm gi l bin cc b, n s khi to khi vo hm
v hy b khi thot khi hm. Bin cc b khng gi gi tr khi thot khi hm. Trong
C, khng cho php nh hm trong hm.

6.3. Lnh return


C hai cch thot khi hm, thc hin n cu lnh cui cng, hoc gp lnh
return u tin. Mt hm c th cha nhiu lnh return.
Tt c cc hm u tr v mt gi tr, ngoi tr hm c kiu void. Nu hm
khng phi kiu void m ta khng tr v mt gi tr no, chng trnh s tr v mt
gi tr bt k no . Nu hm c tr v mt gi tr no , n c th tham gia vo biu
thc. Nu hm tr v mt s nguyn, ta c th b qua khai bo kiu d liu tr v ca
hm. Hm c th tr v kiu con tr, khi khai bo kiu d liu tr v phi r rng,
v d ta khng th tr v kiu con tr int tr v kiu con tr char.
tr v gi tr cho hm ta dng cu lnh return, c php nh sau:
return expression;
Thng thng c ba loi hm c bn.
1. Tnh ton v tr v mt gi tr.
2. Hm thao tc trn thng tin v tr v mt gi tr cho bit thao tc c thnh
cng hay khng.

Dng Hong Huyn

Ngn ng lp trnh C

88

3. Hm khng tr v mt gi tr no. Tt c cc hm khng tr v gi tr u


phi khai bo kiu void.

6.4. Tham s ca hm
Trong mt hm nu s dng tham s, n phi c khai bo bin v nhn gi tr
ca cc i s. Cc bin ny c gi l tham s hnh thc. Bin ny ging nh l bin
cc b bn trong hm v c to ra khi vo hm v b hy khi thot khi hm.

6.4.1. Gi hm theo tham tr v theo tham chiu


Trong hu ht cc ngn ng lp trnh, lun c hai cch gi i s n chng
trnh con:
1. Gi theo gi tr (by value): sao chp gi tr ca i s vo tham s ca
chng trnh con. Trong trng hp ny, mi thay i tham s hnh thc khng nh
hng n tham s.
2. Gi theo tham chiu (by reference): a ch ca i s s c sao chp n
tham s. Khi , mi thay i trn tham s hnh thc s thay i tham s.
V d:
#include <stdio.h>
#include <conio.h>
int sqr(int x);
void main(void){
int t=10;
printf(%d^2=%d,t,sqr(t));
getch();
}
int sqr(int x){
x = x * x;
return x;
}
Trong v d trn, gi tr ca i s t=10 c sao chp n tham s x. Cu
lnh gn x=x*x ch c bin x thay i trong khi gi tr ca t vn gi nguyn.
Trng hp ny gi l truyn tham s cho hm bng gi tr.

Khoa Cng ngh thng tin Trng i hc Quy Nhn

Chng 6. Hm (Function)

89

gi mt tham chiu n hm ta s dng con tr. Khi a ch ca i s s


c truyn cho tham s hnh thc. Nu trong hm c thay i gi tr ca tham s hnh
thc, s thay i gi tr ca tham s. V d:
#include <stdio.>
#include <conio.h>
void swap(int *x, int *y){
int temp;
temp = *x; *x = *y; *y = temp;
}
void main(void){
int i, j;
i = 10;
j = 20;
printf(truoc khi doi i=%d, j=%d,i, j);
swap(&i,&j);
printf(sau khi doi i=%d, j=%d,i, j);
getch();
}
Trong v d trn, ta khai bo v nh ngha hm swap dng i gi tr cho
hai bin s nguyn. V sau khi thot khi hm swap, hai bin i v j phi c i gi
tr cho nhau, hay ni cch khc l sau khi thot khi hm swap hai bin i v j phi
thay i gi tr v khng cn gi gi tr nh ban u na. thc hin c iu ny,
ta phi s dng c ch truyn tham s theo tham chiu.

6.4.2. Gi mng n hm
a. Gi mng mt chiu n hm
Ta khng th gi ton b mng n mt hm, tuy nhin ta c th gi n hm
mt con tr n mng bng cch ch ra tn mng m khng c ch s. V d sau s gi
a ch ca mng i n hm func1()
void main(void){
int i[10];
func1(i);
.

Dng Hong Huyn

Ngn ng lp trnh C

90

.
.
}
hm func1() nhn c tham s i nh trn, ta c ba cch khai bo hm
nh sau: dng con tr, dng mng c kch thc v mng khng xc nh kch thc.
void func1(int *x) /*Pointer*/{
. . .
}
void func1(int x[10])/* sized array*/{
. . .
}
void func1(int x[]) /* unsized array */{
. . .
}
C ba cch trn u to ra mt kt qu tng t.
Khi gi mng n hm, ta gi a ch ca mng n hm, trong trng hp ny
mi thay i trn mng bn trong hm s lm thay i gi tr mng trong tham s. V
d:
#include <conio.h>
#include <stdio.h>
#include <string.h>
void upper(char *str);
void main(void){
char s[100];
gets(s);
upper(s);
puts(s);
getch();
}
void upper(char *str){
int i, n = strlen(str);
for(i=0; i<n; i++)
if((str[i]>='a')&&(str[i]<='z'))
str[i] = str[i] - 32;
}
Khoa Cng ngh thng tin Trng i hc Quy Nhn

Chng 6. Hm (Function)

91

Trong v d trn ta nh ngha hm upper i chui ch thng sang ch


hoa. V chui k t thc ra l mng cc k t, do tryn chui k t cho hm ta
phi khai bo tham s ca hm upper l mt con tr k t nhn phn t u tin
ca mng k t ny. V con tr str trong hm upper nhn a ch ca mng s nn
mi thay i trn con tr str s lm thay i mng s.
b. Gi mng hai chiu n hm
Khi mng hai chiu c s dng nh l tham s ca hm, ch gi con tr n
phn t u tin. Tuy nhin, tham s hnh thc ca hm nhn c mng chiu phi
khai bo t nht l mt chiu bn phi nht (ta c th khai bo thm kch thc bn
tri nhng khng cn thit). V d, mt hm nhn c mng cc s nguyn
[10][10] ta phi khai bo nh sau:
void func1(int x[][10]){
. . .
}
Nu khng khai bo ch s bn phi nht trnh bin dch s khng bit khi no
chuyn sang dng khc. V d vit chng trnh tm s ln nht ca mt ma trn cc
s nguyn.
#include <stdio.h>
void Nhap(int p[][20], int m, int n);
int Max(int p[][20], int m, int n);
void In(int p[][20], int m, int n);
void main(void){
int a[20][20], max, m, n;
printf("so dong: ");
scanf("%d", &m);
printf("so cot: ");
scanf("%d", &n);
Nhap(a,m,n);
In(a,m,n);
max = Max(a,m,n);
printf("so lon cua ma tran la: %d\n",max);
}

Dng Hong Huyn

Ngn ng lp trnh C

92

void Nhap(int p[][20], int m, int n){


int i, j;
for(i=0; i<m; i++)
for(j=0; j<n; j++){
printf("Phan tu thu (%d,%d)=", i, j);
scanf("%d", &p[i][j]);
}
}
int Max(int p[][20], int m, int n){
int i, j, max;
max = p[0][0];
for(i=0; i<m; i++)
for(j=0; j<n; j++)
if(p[i][j]>max)
max = p[i][j];
return max;
}
void In(int p[][20], int m, int n){
int i, j;
for(i=0; i<m; i++){
for(j=0; j<n; j++)
printf("%4d", p[i][j]);
printf("\n");
}
}
Trong v d trn, ta nh ngha ba hm Nhap, Max, In nhp, tm s ln nht
v in ma trn ra mn hnh. Ba hm ny u khai bo tham s int p[][20] nhn
mng hai chiu c 20 ct. Ch , ba hm ny ch lm vic ng trn nhng mng hai
chiu c s ct ti a l 20, nhng mng c s ct khc 20 c th khng cho kt qu
ng.

6.5. Con tr hm
Mt trong nhng vn phc tp nht ca con tr l con tr hm. Tuy hm
khng phi l mt bin nhng n vn c sn mt a ch trong b nh v c th gn a
ch ny cho con tr. a ch ny l im vo ca hm v n l a ch c s dng khi
Khoa Cng ngh thng tin Trng i hc Quy Nhn

Chng 6. Hm (Function)

93

gi hm. Nu c mt con tr n hm, khi ta c th gi hm thng qua con tr ny.


Con tr hm cng c th tham gia nh l mt tham s ca hm khc.
Khai bo con tr hm: type (*name)(parameter list);
V d: float (*f)(float x); khai bo mt con tr hm c tn l f, con
tr hm ny ch c th nhn a ch ca nhng hm c kiu tr v l kiu float v
hm ny ch c mt tham s kiu float.
Ta c th nhn a ch ca hm bng cch s dng tn hm m khng c cc
tham s. Xt v d sau:
#include <stdio.h>
#include <math.h>
void main(void){
double (*f)(double d);
double x=3.14159;
f=sin;
printf("Sin(%0.4lf)=%lf\n",x,f(x));
f=cos;
printf("Cos(%0.4lf)=%lf\n",x,f(x));
}
Trong v d trn, ta khai bo mt con tr hm f. Con tr hm ny ch nhn a
ch nhng hm c kiu tr v l double v nhn mt tham s kiu double. Cu
lnh f=sin; gn a ch hm sin(x) trong th vin math.h vo con tr f v sau
gi hm sin(x) thng qua con tr ny. Ch , khi vit tn hm m khng c du
() c ngha a ch ca hm trong b nh. Cu lnh f=cos; cng tng t. Ta
thy rng ch cn dng con tr f ta c th gi c cc hm khc nhau.
Mt ng dng quan trng ca con tr hm l truyn mt hm cho hm khc,
hay ni cch khc l tham s ca mt hm l mt hm khc. Xt v d sau:
#include <stdio.h>
#include <math.h>
double f(double x);
double g(double x);
double h(double x);
Dng Hong Huyn

94

Ngn ng lp trnh C

double GiaiPT(double a, double b, double (*f)(double x));


void main(void){
printf("Nghiem f(x)=0 tren [-1,2]: %0.1lf\n",
GiaiPT(-1,2,f));
printf("Nghiem g(x)=0 tren [0,3] : %0.1lf\n",
GiaiPT(0,3,g));
printf("Nghiem h(x)=0 tren [0,3] : %0.1lf\n",
GiaiPT(0,3,h));
}
double GiaiPT(double a, double b, double (*f)(double x)){
double m, e=0.00000001;
while (fabs(b-a)>e){
m = (a+b)/2;
if(f(m)==0) return m;
else
if(f(a)*f(m)<0)
b = m;
else
if(f(b)*f(m)<0)
a = m;
}
return (a+b)/2;
}
double f(double x){
return x;
}
double g(double x){
return x*2-4;
}
double h(double x){
return x*x*x-8;
}
Chng trnh trn vit hm GiaiPT gii gn ng phng trnh f(x)=0 trn
on [a,b] da theo nh l Role nh sau: nu hm f(x) lin tc trn on [a,b] v
f(a).f(b)<0 khi tn ti t nht mt s c[a,b] sao cho f(c)=0. Ta thy
rng, hm GiaiPT nhn ba tham s, l on a, b cha nghim v con tr hm

Khoa Cng ngh thng tin Trng i hc Quy Nhn

Chng 6. Hm (Function)

95

nhn a ch ca hm cn tm nghim. Trong v d trn nu khng dng con tr hm,


ta khng th dng mt hm GiaiPT tm nghim cho ba hm f, g, h c.

6.6. Tham s trong hm main


Ta c th gi tham s n hm main() thng qua dng lnh DOS. Tham s
ny c vit sau tn chng trnh. C hai tham s c xy dng sn trong hm
main(), argv v argc dng nhn tham s t dng lnh. argc cho bit s
tham s c gi n hm main() thng qua cu lnh DOS v l mt s nguyn,
c gi tr t nht l 1 bi v tn ca chng trnh l tham s u tin. Tham s argv l
mt mng con tr k t (mng cc chui). Tt c cc tham s trong dng lnh DOS l
chui k t. Cc s nu c s c chuyn i bi ngi dng. Dng tng qut ca
hm main() c tham s nh sau:
type main(int argc, char *argv[])
V d vit chng trnh cng hai s nguyn t dng lnh DOS nh sau:
/* ten file phai dat la sum.c */
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]){
if(argc<2){
printf("Phai nhap 2 tham so\n");
printf("Cu phap: sum so1 so2\n");
return 0;
}
printf("%d\n",atoi(argv[1])+atoi(argv[2]));
return 0;
}
Khi thc hin chng trnh ny t dng lnh ca DOS ta g: sum 1 2. Kt
qu hin th trn mn hnh l 3. Ch , ta phi bin dch chng trnh sum.c thnh
sum.exe v thc thi file ny trn dng lnh DOS. Hm atoi l hm chuyn mt
chui sang s nguyn v hm ny c khai bo trong th vin stdlib.h.

6.7. quy (Recursion)


Dng Hong Huyn

Ngn ng lp trnh C

96

Mt hm c gi l quy nu mt cu lnh no trong thn hm gi n


chnh n. Khi gi quy, tp tt c cc bin cc b v cc tham s s c lu tr
trong stack, m hm s thc thi t nh stack.
Gi quy khng phi l to mt phin bn mi ca hm, ch c nhng bin
v ang hot ng l mi, mi ln tr v trong li gi quy, cc bin ny s b hy
khi stack v chng trnh quay li im gi hm. Cc hm quy thng thc thi
chm hn cc thut ton tng ng khng quy. Gi quy cng c kh nng gy
trn stack. im thun tin ca quy l to nhng chng trnh n gin hn v r
rng hn, v d nh thut ton quicksort kh ci t bng cch lp. Khi s dng
quy phi c iu kin dng, nu khng c iu kin dng th hm quy s gy li
trn stack. V d:
#include <stdio.h>
unsigned long int giaithua(int n);
void main(void){
int n;
printf("n=");
scanf("%d",&n);
printf("%d!=%lu\n", n, giaithua(n));
}
unsigned long int giaithua(int n){
if (n==0) return 1;
else
return n*giaithua(n-1);
}
Trong v d trn, ta nh ngha mt hm tnh n! bng phng php quy da
vo tnh cht ca giai tha nh sau: n! = n(n-1)!

6.8. Cu hi trc nghim v bi tp


6.8.1. Cu hi trc nghim
Cu 1. Cho bit kt qu trn mn hnh
int f(int x){
x = x * x;

Khoa Cng ngh thng tin Trng i hc Quy Nhn

Chng 6. Hm (Function)

97

printf(%d, x);
return x;
}
void main(void){
int a=2;
printf(%d\n,f(a));
printf(%d,a);
getch();
}
Cu 2. Cho bit kt qu trn mn hnh
int f(int x){
x = x * x;
printf(%d, x);
return x;
}
void main(void){
int x=2;
printf(%d\n,f(x));
printf(%d,x);
getch();
}
Cu 3. Cho bit kt qu trn mn hnh
void f(int i);
void main(void){
int j=5, x=7;
printf(j=%d\n,j);
printf(x=%d\n,x);
f(x);
printf(j=%d\n,j);
printf(x=%d\n,x);
getch();
}
void f(int i){
int j=10; //Nu b dng lnh ny, kt qu s nh th no?
i = i * 2;

Dng Hong Huyn

Ngn ng lp trnh C

98

printf(i=%d\n,i);
printf(j=%d\n,j);
}
Cu 4. Cho bit kt qu trn mn hnh
void f(int *p){
*p *= 2;
}
void main(void){
int x=5;
printf(x=%d,x);
f(&x);
printf(x=%d,x);
getch();
}

6.8.2. Bi tp
Bi 1. Vit mt hm i mt s thp phn sang s nh phn v ngc li.
Bi 2. Vit hm i mt s thp phn sang h thp lc phn, nh phn v ngc li.
Bi 3. Vit hm kim tra mt s c phi l s nguyn t hay khng? Sau nhp vo
mt dy s, s dng hm ny kim tra cc phn t trong dy, nu phn t no l s
nguyn t th hin th ln mn hnh.
Bi 4. Vit hm kim tra mt s c phi l s chnh phng hay khng? Sau nhp
vo mt dy s, s dng hm ny kim tra cc phn t trong dy, nu phn t no l s
chnh phng th hin th ln mn hnh.
Bi 5. Vit hm kim tra mt s c phi l s i xng hay khng? Sau nhp vo
mt dy s, s dng hm ny kim tra cc phn t trong dy, nu phn t no l s i
xng th hin th ln mn hnh.
Bi 6. Vit hm tm c s chung ln nht ca hai s. Sau nhp vo mt dy s, s
dng hm ny tm c s chung ln nht ca mt dy s.
Bi 7. Vit hm tm bi s chung nh nht ca hai s. Sau nhp vo mt dy s, s
dng hm ny tm bi s chung nh nht ca mt dy s.

Khoa Cng ngh thng tin Trng i hc Quy Nhn

Chng 6. Hm (Function)

99

Bi 8. Vit cc hm thc hin cc yu cu sau:


1. Nhp vo mt dy n s nguyn.
2. In dy s nguyn ra mn hnh.
3. Tm gi tr ln nht, nh nht, trung bnh ca mt dy.
4. Tm phn t x c trong dy hay khng?
5. Chn mt phn t x vo cui dy.
6. Xa phn t x khi dy.
7. Sp xp dy tng dn/gim dn.
8. Kim tra mt dy c to thnh cp s cng/cp s nhn hay khng?
9. Kim tra mt dy c tng/gim hay khng?
10. Kim tra mt dy c i xng hay khng?
Bi 9. Vit cc hm thc hin cc yu cu sau:
1. Nhp vo mt ma trn cp mxn.
2. In dy ma trn cp mxn ra mn hnh.
3. Tm gi tr ln nht, nh nht, trung bnh ca ma trn.
4. Tm phn t x c trong ma trn hay khng?
5. Tm gi tr ln nht, nh nht trn tng dng, tng ct.
6. Cng hai ma trn A, B kt qu lu vo ma trn C.
7. Tch hai ma trn A, B kt qu lu vo ma trn C.
8. Kim tra mt ma trn vung c phi l ma trn n v hay khng?
9. Kim tra mt ma trn vung c phi l ma trn i xng hay khng?
10. Kim tra mt dy c i xng hay khng?
Bi 10. Vit hm tnh gn ng tch phn ca hm mt bin trn on [a,b].

Dng Hong Huyn

Chng 7. Kiu cu trc, hp, lit k

101

CHNG 7. KIU CU TRC, HP, LIT K


V KIU NGI DNG NH NGHA
7.1. Cu trc (Structure)
7.1.1. Khi nim
Cu trc l tp cc bin c tham chiu thng qua mt tn, cu trc cho php
ta gi mi quan h thng tin gia cc bin vi nhau. Bin bn trong cu trc gi l
thnh vin. Tt c cc thnh vin ca cu trc c mi quan h logic vi nhau. C php
khai bo nh sau:
struct struct_name{
type member_name;
type member_name;
.
.
.
type member_name;
}varname;
V d:
struct add{
char name[30];
char street[40];
char city[20];
char state[3];
unsigned long int zip;
} add_infor;
Trong v d trn, ta khai bo kiu cu trc c tn l add, v bin cu trc kiu
add c tn l add_infor. khai bo mt bin cu trc, ta c th khai bo trc tip
trong lc khai bo kiu hoc c th khai bo ring bit theo c php sau:
struct <structname> <varname>;
v d: struct add add_infor;
Khi khai bo mt cu trc, trnh bin dch s cung cp y b nh cho cc
Dng Hong Huyn

Ngn ng lp trnh C

102

thnh vin. Ta c th khai bo nhiu bin cu trc khi khai bo cu trc.


struct addr{
char name[30];
char street[40];
char city[20];
char state[3];
unsigned long int zip;
} addr_info, binfo, cinfo;

Hnh 7-1. Cu trc bin addr_infor trong b nh.


Truy xut n cc thnh vin ca cu trc, s dng c php:
<varname>.<member>
Ta c th gn cc cu trc cng kiu cho nhau. V d: binfo=cinfo;
V d sau: nh ngha mt kiu cu trc So_Phuc lu tr s phc, trong cu
trc ny c 2 thnh vin l thuc lu phn thc, ao lu phn o ca s phc.
Sau khai bo ba bin s phc c1, c2, c3, nhp gi tr cho hai bin s phc c1, c2
v cng hai s phc ny lu kt qu vo bin s phc c3.
#include <stdio.h>
/* Khai bao cau truc So_Phuc. */
struct So_Phuc{
double thuc, ao;

Khoa Cng ngh thng tin Trng i hc Quy Nhn

Chng 7. Kiu cu trc, hp, lit k

103

};
void main(void){
/* Khai bao bien cau truc. */
struct So_Phuc c1, c2, c3;
printf("Nhap so phuc thu nhat:\n");
printf("Phan thuc: ");
scanf("%lf",&c1.thuc);
printf("Phan ao: ");
scanf("%lf",&c1.ao);
printf("Nhap so phuc thu hai :\n");
printf("Phan thuc: ");
scanf("%lf",&c2.thuc);
printf("Phan ao: ");
scanf("%lf",&c2.ao);
/* Cong hai so phuc. */
c3.thuc=c1.thuc+c2.thuc;
c3.ao=c1.ao+c2.ao;
printf("(%.0lf+%.0lfi)+(%.0lf+%.0lfi)=%.0lf+%.0lfi\n"
,c1.thuc,c1.ao,c2.thuc,c2.ao,c3.ao,c3.thuc);
}

7.1.2. Mng cu trc


Cch thng dng vi cu trc l: mng cu trc. Cch khai bo nh sau:
struct name struct_var[size];
V d:
struct add addr_infor[100];
Mng cu trc ging nh mng thng thng. Tc l mi phn t ca mng l
mt bin cu trc. Ta c th truy xut n tng thnh vin cu trc bng c php
struct_var[index].<member>.
V d: nhp vo mt dy n phc, in n s phc ny ra mn hnh, tm s phc c
module ln nht (module ca s phc z=a+bi l: | | =

Dng Hong Huyn

).

Ngn ng lp trnh C

104

#include <stdio.h>
#include <math.h>
/* Khai bao cau truc So_Phuc. */
struct So_Phuc{
double thuc, ao;
};
void main(void){
/* Khai bao mang va bien cau truc. */
struct So_Phuc C[100], max;
int i, n;
double m, temp;
printf("Nhap so phuc thu: ");
scanf("%d",&n);
for(i=0; i<n; i++){
printf("C[%d].thuc: ");
scanf("%lf",&C[i].thuc);
printf("C[%d].ao : ", i);
scanf("%lf",&C[i].ao);
}
printf("\n");
printf("Cac so phuc vua nhap:\n");
for(i=0; i<n; i++)
printf("%.0lf+%.0lfi\n",C[i].thuc,C[i].ao);
max = C[0];
m = sqrt(C[0].thuc*C[0].thuc + C[0].ao*C[0].ao);
for(i=1; i<n; i++){
temp=sqrt(C[i].thuc*C[i].thuc+C[i].ao*C[i].ao);
if(temp>m){
m = temp;
max = C[i];
}
}
printf("\n");
printf("So phuc co module lon nhat la:\n");
printf("%.0lf+%.0lfi\n",max.thuc,max.ao);
printf("Module: %lf\n", m);
}
Khoa Cng ngh thng tin Trng i hc Quy Nhn

Chng 7. Kiu cu trc, hp, lit k

105

7.1.3. Con tr cu trc


Ta c th gi ton b cu trc n hm. Khi cch gi tham ny s l theo
tham tr. Mi thay i bn trong cu trc s khng nh hng n bn ngoi hm.
Mun gi mt cu trc n hm m vn gi c nhng thay i sau khi thot khi
hm ta phi dng con tr cu trc.
C php khai bo con tr cu trc nh sau:
struct name *var;
Nu gi cu trc n hm trong trng hp cu trc n gin t thnh vin,
chng trnh s gi cu trc ln stack. Nu cu trc qu nhiu thnh vin hoc thnh
vin c th l mng hoc cc thnh phn c cp pht ng, khi c th gy trn
stack. gii quyt vn ny ta s dng con tr cu trc. Khi gi con tr n cu
trc, ch c a ch ca cu trc gi n stack, iu ny lm cho hm thc thi nhanh
hn. ly a ch cu trc, ta dng ton & trc bin.
truy cp n cc thnh vin trong con tr cu trc ta dng c php:
<varname>-><member>. V d sau nh ngha hai hai hm Nhap v In dng
nhp cu trc t bn phm v in cu trc ra mn hnh. Sau s dng hai hm ny
nhp v in hai cu trc S v T.
#include <stdio.h>
/* Khai bao cau truc So_Phuc. */
struct So_Phuc{
double thuc, ao;
};
void Nhap(struct So_Phuc *So);
void In(struct So_Phuc So);
void main(void){
struct So_Phuc S, T;
printf("Nhap so phuc S:\n");
Nhap(&S);
printf("So phuc S vua nhap:\n");
In(S);
printf("Nhap so phuc T:\n");

Dng Hong Huyn

Ngn ng lp trnh C

106

Nhap(&T);
printf("So phuc T vua nhap:\n");
In(T);
}
void Nhap(struct So_Phuc *So){
printf("thuc: ");
scanf("%lf",&So->thuc);
printf("ao : ");
scanf("%lf",&So->ao);
}
void In(struct So_Phuc So){
printf("%.0lf+%.0lfi\n",So.thuc,So.ao);
}
i vi hm Nhap, khi nhp cc gi tr thc v o trong hm ta vn mun gi
nhng gi tr ny khi thot khi hm do phi s dng c ch truyn tham s theo
tham chiu, v con tr cu trc s gii quyt c yu cu ny.
i vi hm In, ta ch cn hin th phn thc v phn o ra mn hnh m khng
cn thay i bt k thnh phn no ca s phc, do ch cn truyn tham s cho hm
In theo c ch truyn theo tham tr nn ta khng cn s dng con tr cu trc trong
trng hp ny.

7.1.4. Mng bn trong cu trc


Thnh vin ca cu trc c th l mt mng. V d ta c cu trc sau:
struct x {
int a[10][10]; /* ma tran 10x10 so nguyen*/
float b;
} y;
Khi truy cp n phn t th 2, 3 ca thnh vin a ta dng c php:
y.a[1][2]
V d sau khai bo mt cu trc c tn l MaTran dng lu ma trn cc s
nguyn. Cc thng tin cn lu tr cho ma trn ny bao gm gi tr cc phn t v s
dng, ct ca ma trn. trong v d ny cng nh ngha hai hm Nhap v In dng
nhp v in ma trn da vo cu trc khai bo.
Khoa Cng ngh thng tin Trng i hc Quy Nhn

Chng 7. Kiu cu trc, hp, lit k

107

#include <stdio.h>
/* Khai bao cau truc luu Ma tran. */
struct Matran{
int pt[50][50];
int dong, cot;
};
void Nhap(struct Matran *A);
void In(struct Matran A);
void main(void){
struct Matran M;
printf("Nhap ma tran M:\n");
Nhap(&M);
printf("Ma tran vua nhap:\n");
In(M);
}
void Nhap(struct Matran *A){
int i, j;
printf("So dong: ");
scanf("%d",&A->dong);
printf("So cot : ");
scanf("%d",&A->cot);
for(i=0; i<A->dong; i++)
for(j=0; j<A->cot; j++){
printf("Phan tu (%d,%d): ",i,j);
scanf("%d",&A->pt[i][j]);
}
}
void In(struct Matran A){
int i, j;
for(i=0; i<A.dong; i++){
for(j=0; j<A.cot; j++)
printf("%3d",A.pt[i][j]);
printf("\n");
}
}
Trong v d trn ta thy hm in ma trn ra mn hnh s dng c ch truyn tham
s theo tham tr. Chng trnh s cp mt vng nh cho bin cu trc A, sau sao

Dng Hong Huyn

Ngn ng lp trnh C

108

chp cc gi tr ca cu trc M cho A v cui cng thc hin thao tc in cc gi tr t


cu trc A ra mn hnh. iu ny ph hp vi cch lp trnh thng thng.
Tuy nhin cch truyn tham s nh trn trong trng hp ny c mt s nhc
im nh sau: cu trc Matran c kch thc ln, c th: (50x50)x4byte +
2x4byte = 10008byte. Vic cp pht b nh cho cu trc A s tn thm 10008
byte, vic sao chp gi tr t bin cu trc M vo A thc ra l sao chp ni dung ca
10008 byte ca bin M vo 10008 byte bin A gy tn thi gian x l.
khc phc hai nhc im trn, thay v tuyn gi tr M vo A, ta s truyn
a ch ca M vo A, khi trong hm in ch cp pht mt vng nh 4 byte cho bin
con tr cu trc A lu a ch ca bin cu trc M, cc thao tc truy xut d liu
trn bin A thc ra l thao tc trc tip trn bin M. V d trn c th sa i cho hiu
qu hn nh sau:
#include <stdio.h>
/* Khai bao cau truc luu Ma tran. */
struct Matran{
int pt[50][50];
int dong, cot;
};
void Nhap(struct Matran *A);
void In(struct Matran *A);
void main(void){
struct Matran M;
printf("Nhap ma tran M:\n");
Nhap(&M);
printf("Ma tran vua nhap:\n");
In(&M);
}
void Nhap(struct Matran *A){
int i, j;
printf("So dong: ");
scanf("%d",&A->dong);
printf("So cot : ");
scanf("%d",&A->cot);

Khoa Cng ngh thng tin Trng i hc Quy Nhn

Chng 7. Kiu cu trc, hp, lit k

109

for(i=0; i<A->dong; i++)


for(j=0; j<A->cot; j++){
printf("Phan tu (%d,%d): ",i,j);
scanf("%d",&A->pt[i][j]);
}
}
void In(struct Matran *A){
int i, j;
for(i=0; i<A->dong; i++){
for(j=0; j<A->cot; j++)
printf("%3d",A->pt[i][j]);
printf("\n");
}
}

7.1.5. Cu trc bn trong cu trc


Thnh vin ca cu trc c th l mt cu trc khc. Xt v d sau:
struct Ho_khau{
char ten_xa[20];
char ten_huyen[20];
char ten_tinh[20];
};
struct Sinh_vien{
char MaSV[10];
char ho_ten[30];
struct Ho_khau HK; /* thanh vien la mot cau truc. */
};
Truy xut n tng thnh vin ca cu trc theo th t t ngoi vo trong. C
cho php c 15 mc cu trc lng nhau. V d:
struct Sinh_vien SV;
ly thng tin tn tnh ca sinh vin SV ta vit nh sau: SV.HK.ten_tinh
Mt trong nhng ng dng quan trng ca cu trc bn trong cu trc l to
mt danh sch lin kt hay cn gi l cu trc t tr.
Cu trc c t nht mt thnh phn l con tr kiu cu trc ang nh ngha gi

Dng Hong Huyn

Ngn ng lp trnh C

110

l cu trc t tr. C ba cch nh ngha cu trc kiu ny c th hin qua v d sau:


to danh sch lin kt c tn l Link_List.
Cch 1:
typedef struct List{
int data;
struct List *next;
}Link_List;
Cch 2:
typedef struct List Link_List;
struct List{
int data;
Link_List *next;
}
Cch 3:
struct List{
int data;
struct List *next;
}
typedef List Link_List;
Thng thng khi s dng danh sch lin kt ta cn thc hin mt s thao tc
nh: nhp, in danh sch, tm kim, chn vo u, xa mt phn t trong danh sch.
Sau y l chng trnh minh ha cc thao tc va nu trn.
#include <stdio.h>
#include <stdlib.h>
/* Dinh nghia danh sach lien ket. */
struct List{
int data;
struct List *next;
};
void insert(struct List **p,struct List *q);
void show(struct List *p);
struct List *find(struct List *p,int data);
void del(struct List **p,int data);

Khoa Cng ngh thng tin Trng i hc Quy Nhn

Chng 7. Kiu cu trc, hp, lit k

void main(void){
struct List *list=NULL, *item;
int temp;
do{
printf("Nhap du lieu (0<= de ket thuc): ");
scanf("%d",&temp);
if(temp<=0)
break;
item = malloc(sizeof(struct List *));
item->data = temp;
insert(&list,item);
}while(1);
show(list);
printf("Nhap phan tu can tim: ");
scanf("%d",&temp);
item = find(list,temp);
if(item!=NULL)
printf("Tim thay!\n");
else
printf("Khong tim thay!\n");
item=list;
free(item);
show(list);
}
/* Chen phan tu q vao dau danh sach. */
void insert(struct List **p,struct List *q){
struct List *r;
if (p==NULL)
*p=q;
else{
r=*p;
*p=q;
(*p)->next=r;
}
}
/* Hien thi cac phan tu cua danh sach. */
Dng Hong Huyn

111

Ngn ng lp trnh C

112

void show(struct List *p){


while(p!=NULL){
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
/*
Tim mot phan tu co trong danh sach hay khong.
Neu tim thay tra ve con tro den phan tu tim thay.
Neu khong tim thay tra ve NULL
*/
struct List *find(struct List *p,int data){
while(p!=NULL)
if(p->data==data) return p;
else p=p->next;
return NULL;
}
/* Xoa mot phan tu trong danh sach. */
void del(struct List **p,int data){
struct List *q,*r,*t;
t=*p;
if(t->data==data)
t=t->next;
else{
q=t;
r=q;
while((q!=NULL) && (q->data!=data)){
r=q;
q=q->next;
}
if(q!=NULL) r->next=q->next;
}
*p=t;
}

Khoa Cng ngh thng tin Trng i hc Quy Nhn

Chng 7. Kiu cu trc, hp, lit k

113

7.1.6. Trng bit


Trng bit cho php ta truy xut n tng phn t theo bit, mt vi l do s
dng trng bit l:
Nu b nh b gii hn, ta c th lu tr mt vi bin logic trong mt byte.
Thng tin trng thi ca mt thit b truyn c th m ha thnh mt hoc nhiu
bit trong mt byte. Mc du cc tc v ny c th thc hin c nh vo ton t bit,
tuy nhin s dng trng bit s thun tin hn.
Khai bo trng bit nh sau:
struct struct-type-name {
type name1 : length1;
type name2 : length2;
...
...
type nameN : lengthN;
} variable_list;
type l kiu ca trng bit, length l di tnh theo bit ca trng.
Trng bit c di bng 1 phi khai bo l unsigned. Trng bit thng s dng
khi phn tch u vo ca mt thit b phn cng.

7.2. Kiu hp (unions)


unions l mt v tr trong b nh c chia s cho hai hay nhiu bin vi
nhiu kiu d liu khc nhau ti nhiu thi im khc nhau. Khai bo kiu unions
ging nh khai bo kiu cu trc. Dng tng qut nh sau:
union union-type-name {
type member-name;
type member-name;
type member-name;
.
..
} union-variables;
V d:

Dng Hong Huyn

Ngn ng lp trnh C

114

union u_type{
int i;
char ch;
};
Khai bo ny khng to b nh cho tt c cc bin. Ta c th khai bo bin
hoc bng cch t tn ca n cui khai bo hoc s dng khai bo phn bit.
khai bo bin kiu unions ta dng c php nh sau:
unions uni_type uni_var;
V d:
unions u_type cnvt;
Trong bin cnvt c bin nguyn i v bin k t ch cng chia s mt vng
nh, i hai byte v ch mt byte.

Hnh 7-2. Bin i v bin ch trong b nh.


Khi khai bo mt bin unions, chng trnh s cung cp b nh lu tr
bin c kch thc ln nht. truy cp vo thnh vin ca mt bin kiu unions ta
dng ton t chm (.) v ton t ->.
S dng kiu unions gip sinh ra m ph thuc vo my. Bi v trnh bin
dch s kim tra kch thc tht ca cc thnh vin, do lp trnh vin khng phi
quan tm n kch thc ca kiu int, long, v.v

Khoa Cng ngh thng tin Trng i hc Quy Nhn

Chng 7. Kiu cu trc, hp, lit k

115

Thng thng kiu unions dng chuyn i kiu d liu, bi v ta c th


tham chiu n d liu bn trong unions theo nhiu cch khc nhau. V d ta c th
thao tc tng byte ca kiu double thay i chnh xc hoc thc hin thao tc
lm trn.
hiu r vn chuyn i kiu ta xt v d vit mt s nguyn ngn ln a.
Th vin chun khng nh ngha hm vit mt s nguyn ngn vo a. Ta c th vit
mi kiu d liu vo a bng hm fwrite(). Tuy nhin s dng kiu unions ta
c th vit tng byte vo a.
#include <stdio.h>
#include <conio.h>
union pw{
short int i;
char ch[2];
};
int putw(short int num, FILE *fp);
void main(void){
FILE *fp;
fp = fopen("test.tmp", "wb+");
putw(1000, fp);/*write the value 1000 as an integer*/
fclose(fp);
getch();
}
int putw(short int num, FILE *fp){
union pw word;
word.i = num;
putc(word.ch[0], fp); /* write first half */
return putc(word.ch[1], fp); /* write second half */
}

7.3. Kiu lit k (Enumeration)


Kiu lit k l tp cc hng s nguyn c t tn. Kiu lit k thng xut
hin trong cuc sng. V d kiu tin t M : penny, nickel, dime, quarter,
half-dollar, dollar. Kiu lit k c nh ngha ging nh kiu cu trc. C
php khai bo nh sau:

Dng Hong Huyn

Ngn ng lp trnh C

116

enum

enumname {enumlist}
khai bo bin kiu enum:

enum enumname enumvar;


V d:
enum coin { penny, nickel, dime, quarter, half_dollar,
dollar};
enum coin money;
Sau khi khai bo nh trn, ta c th vit:
money=nickel; if (money==dollar)
im chnh ca kiu lit k l dng k hiu i din cho mt s nguyn. Mi
k hiu s cho gi tr ln hn nhng k hiu ng trc n. Gi tr u tin bt u
bng 0. V d: printf(%d %d, penny, dime) s in ra mn hnh gi tr 0 v
2. Ta cng c th ch nh mt gi tr c th cho mt hoc nhiu k hiu, bng cch gn
mt gi tr nguyn sau k hiu ti lc khai bo. V d:
enum coin {penny,nickel,dime,
quarter=100,half_dollar,dollar};
Khi gi tr ca cc k hiu nh sau:
Penny
nickel
dime
quarter
half_dollar
dollar

0
1
2
100
101
102

Khi s dng kiu enum ta ch mt s li sau:


money=dollar;
printf(%s, money);
Hoc nu dng lnh sau:
strcpy(money, "dime");
Bi v dollar, money ch l nhng gi tr nguyn c tn, n khng phi l
chui. hin cc gi tr ca mt kiu enum ra mn hnh ta ch c mt trong hai cch

Khoa Cng ngh thng tin Trng i hc Quy Nhn

Chng 7. Kiu cu trc, hp, lit k

117

nh sau:
Cch 1:
switch(money) {
case penny:
printf("penny");
break;
case nickel:
printf("nickel");
break;
case dime:
printf("dime");
break;
case quarter:
printf("quarter");
break;
case half_dollar:
printf("half_dollar");
break;
case dollar:
printf("dollar");
}
Cch 2:
char name[][12]={
"penny",
"nickel",
"dime",
"quarter",
"half_dollar",
"dollar"}
printf(%s,name[money]);

7.4. Dng ton t sizeof m bo tnh kh chuyn


Kiu cu trc v kiu unions thng to ra cc bin c kch thc khc nhau
v kch thc tht ca bin ph thuc vo my. Ton t sizeof dng tnh kch
thc tht ca mt bin hoc mt kiu gip loi tr m chng trnh ph thuc vo

Dng Hong Huyn

Ngn ng lp trnh C

118

my. Trong kiu cu trc, kch thc bao gi cng ln hn hoc bng tng kch thc
ca cc thnh vin. Ton t sizeof l mt ton t thc hin ti thi im thc thi
chng trnh, tt c cc thng tin v kch thc ca mi bin ch c bit ti thi
im bin dch. iu ny cng rt c ngha i vi kiu unions bi v kch thc
ca kiu unions lun bng hoc ln hn kch thc ca thnh vin ln nht.

7.5. Kiu ngi dng nh ngha (User-Defined)


Ta c th nh ngha tn kiu d liu mi bng t kha typedef. Ta khng
to ra mt kiu d liu thc s m ch to ra mt tn mi cho kiu d liu tn ti.
Cng vic ny gip to ra mt chng trnh ph thuc vo my tr nn kh chuyn
(portable) hn v chng trnh d c hn.
typedef type newname;
type l kiu d liu bt k, newname l tn mi cho kiu ny. V d:
typedef int songuyen;
Khi songuyen l tn khc ca kiu int, to mt bin kiu int ta c
th vit:
songuyen n;
Lc ny kiu songuyen c th dng nh ngha kiu khc, v d nh:
typedef songuyen nguyen;

7.6. Cu hi trc nghim v bi tp


7.6.1. Cu hi trc nghim
Cu 1. Cho khai bo cu trc nh sau:
struct A{
int m1;
float m2;
}x, *y;
Cu 2. Khi x l:
a. Kiu cu trc

b. Bin cu trc

Khoa Cng ngh thng tin Trng i hc Quy Nhn

Chng 7. Kiu cu trc, hp, lit k

c. Thnh vin ca cu trc A

119

d. Con tr cu trc A

Cu 3. Khi y l:
a. Kiu cu trc
c. Thnh vin ca cu trc A

b. Bin cu trc
d. Con tr cu trc A

Cu 4. Cu lnh sizeof(a) cho kt qu l:


a. 8

b. 10

c.12

d. 4

Cu 5. truy cp n thnh vin m1 ca bin x ta c th vit nh th no?


a. x->m1

b. A->m1

c. x.m1

d. A.m1

Cu 6. ly a ch thnh vin m1 ca bin cu trc x, ta thc hin:


a. &x->m1

b. &A->m1

c. &x.m1

d. &x->m1

Cu 7. ly gi tr ca thnh vin m2 ca bin cu trc x, ta thc hin:


a. x->m1

b. &x->m1

c. *x.m1

d. x.m1

Cu 8. Cu lnh sizeof(y) cho kt qu l bao nhiu?


a. 8

b. 10

c.12

d. 4

Cu 9. truy cp n thnh vin m1 ca bin y ta vit nh th no?


a. y->m1

b. A->m1

c. y.m1

d. A.m1

Cu 10. ly a ch ca thnh vin m1 ca bin y, ta thc hin:


a. &y->m1

b. &A->m1

c. &y.m1

d. &x->m1

Cu 11. ly gi tr thnh vin m2 ca bin y ta thc hin cu lnh:


a. y->m1

b. &y->m1

c. *y.m1

d. y.m1

Cu 12. sao chp cc thnh vin ca bin cu trc x qua z ta thc hin lnh:
a. z = x;
c. z = &x;

b. z.m1=x.m1; z.m2 = x.m2;


d. z->m1=x->m1; z->m2 = x->m2;

7.6.2. Bi tp
Bi 1. bit mt th sinh u hay rt trong k thi tuyn sinh, cn bit cc thng tin
sau:
H tn: h v tn ca th sinh
Dng Hong Huyn

Ngn ng lp trnh C

120

KV: th sinh thuc khu vc no? ( 1, 2 hay 3 ).


NH: th sinh thuc nhm no ? ( 1, 2, hay 3).
TD: tng dim ba mn thi .
1. Hy nhp vo mt danh sch 10 th sinh gm H tn, KV, NH, T. Xt xem
Kt qu th sinh ny u hay rt da vo bng im chun sau:

V d : Th sinh Khu vc 1 , Nhm 2, c Tng im 17.5 th u, ngc li


th rt.
2. In danh sch sp xp theo trt t gim ca T ln mn hnh, gm cc mc
H tn, KV, NH, T v Kt qa u, rt.
3. Ch in danh sch nhng ngi u ln mn hnh theo mu:

Bi 2. Mi im M(x,y) trong mt phng to Oxy c m t nh sau :


struct Diem2D{
float x, y;
}
Vit cc hm thc hin cc yu cu sau :
1. Nhp vo ta ca 1 im.
2. Kim tra hai im c trng nhau khng.
3. Tnh di on thng ni 2 im theo cng thc: Nu A(xa,ya), B(xb,yb) th
=

) +(

4. Kim tra ba im c to thnh mt tam gic hay khng?


Khoa Cng ngh thng tin Trng i hc Quy Nhn

Chng 7. Kiu cu trc, hp, lit k

121

5. Tnh din tch ca mt tam gic c to bi ba im theo cng thc Heron:


=

( )( )( )

Vit chng trnh chnh thc hin cc yu cu sau: nhp vo mt dy n im,


kim tra xem n im va nhp to c bao nhiu tam gic, hin ra ta ba im to
thnh tam gic c din tch ln nht.
Bi 3. lu tr mt phn s trong my tnh, ta s dng cu trc sau:
struct Phan_So{
int tu, mau;
};
Vit hm thc hin yu cu sau:
1. Nhp vo mt phn s.
2. In phn s ra mn hnh.
3. Cng hai phn s.
4. Tr hai phn s.
5. Nhn hai phn s.
6. Chia hai phn s.
7. So snh hai phn s.
Vit chng trnh chnh thc hin yu cu sau: nhp vo n phn s, sp xp cc
phn s theo th t tng dn. tnh tng, hiu, tch, thng n cc phn s.
Bi 4. lu tr ma trn, ta khai bo cu trc nh sau:
struct Matran{
float pt[50][50];
int dong, cot;
};
1. Nhp ma trn t bn phm.
2. In ma trn ra mn hnh.

Dng Hong Huyn

Ngn ng lp trnh C

122

3. Tnh tng hai ma trn cng cp.


4. Tnh tch hai ma trn.
5. Tm s ln nht, nh nht trn tng dng, ct ca ma trn.
6. Kim tra mt ma trn vung c phi l ma trn n v?
7. Kim tra ma trn vung c phi l ma trn i xng?
Vit chng trnh chnh thc hin yu cu sau: nhp vo 2 ma trn vung, in 2
ma trn ra mn hnh, tm s ln nht nh nht ca tng dng, ct ca tng ma trn,
tnh tng tnh tng tch ca hai ma trn va nhp.
Bi 5. Yu cu ging bi 4, nhng s dng c ch cp pht b nh ng cho ma trn.

Khoa Cng ngh thng tin Trng i hc Quy Nhn

Chng 8. Vo/ra d liu trn console

123

CHNG 8. VO/RA D LIU TRN CONSOLE


8.1. c v vit mt k t
Mt trong nhng hm vo/ra n gin nht l: getchar(), c mt k t t
bn phm, v hm putchar()vit mt k t ra mn hnh. Hm getchar() i
ngi dng g vo mt phm v tr v gi tr ca phm , phm va nhn t ng
hin ln mn hnh. Hm putchar() vit mt k t ln mn hnh ti v tr con tr. Hai
hm ny c nh ngha trong th vin stdio.h Dng tng qut ca hai hm ny
nh sau:
int getchar(void)
int putchar(int c)
Hm getchar() tr v mt s nguyn. Tuy nhin ta cng c th gn cho bin
kiu char bi v k t cha trong byte thp (byte cao c gi tr bng 0). Hm
getchar() tr v gi tr EOF nu xut hin li.
Hm putchar() nhn tham s l kiu nguyn, tuy nhin ta c th truyn
tham s l k t, ch c byte thp mi cha gi tr gi n mn hnh. Hm
putchar() tr v k t c vit, nu xut hin li tr v gi tr EOF. EOF l mt
macro c gi tr =-1. V d sau y nhp vo mt k t nu ch thng chuyn sang
hoa, nu ch hoa chuyn sang ch thng v in ra mn hnh. Chng trnh kt thc
nu nhp vo du chm (.).
#include <stdio.h>
#include <ctype.h>
#include <conio.h>
void main(void){
char ch;
printf("Nhap van ban (go dau . de thoat).\n");
do {
ch = getchar();
if(islower(ch)) ch = toupper(ch);
else ch = tolower(ch);

Dng Hong Huyn

Ngn ng lp trnh C

124

putchar(ch);
} while (ch != '.');
getch();
}

8.1.1. Mt vn vi hm getchar
Hm getchar() c ci t theo cch m cc k t c g s nm trong
vng m cho n khi bm phm enter. Do ta phi nhn phm enter trc khi mun
gi mi th n chng trnh. Hm getchar() cng ch nhn mt k t ti thi
im n c gi, trong khi trong vng m c th c nhiu hn mt k t, do khi
s dng hm ny s gp nhng li m ta khng bit ti sao.

8.1.2. Bin th ca hm getchar()


Hai bin th ca hm getchar() l hm:
int getche()
int getch()
Thng thng hai hm ny ci t trong th vin conio.h. Hm getch()
i ngi dng nhn mt phm v tr v phm c nhn. Phm c nhn khng xut
hin trn mn hnh. Hm getche() tng t nh hm getch() nhng phm
xut hin trn mn hnh. Thng thng ta s dng hm getch() nhn mt phm,
c th phm khng xut hin trn mn hnh nh phm enter, mi tn, V d sau
s dng hm getch() nhp mt k t v hin ngay lp tc phm c g bng ch
hoa nu nhp vo ch thng v ngc li. Chng trnh kt thc khi ngi dng bm
enter.
#include <stdio.h>
#include <conio.h>
void main(void){
char ch;
printf("Nhap vao ki tu (bam enter de thoat).\n");
do {
ch = getch();
if(islower(ch)) ch = toupper(ch);
else ch = tolower(ch);
Khoa Cng ngh thng tin Trng i hc Quy Nhn

Chng 8. Vo/ra d liu trn console

125

putchar(ch);
} while (ch != 13);
}

8.2. c v vit chui


Hm gets() c mt chui k t nhp t bn phm v t n vo a ch c
tr bi tham s. Ta c th g cc k t t bn phm cho n khi gp phm enter. Lu
chui va nhp khng cha k t xung dng, ti cui chui chng trnh s t ng
chn k t kt thc chui. Dng tng qut ca hm nh sau:
char *gets(char *str)
Trong str l mng hoc con tr n chui k t, hm ny tr v chui k t
m n c c. V d chng trnh sau c mt mng cc k t v in di ra mn
hnh.
#include <stdio.h>
#include <string.h>
void main(void){
char str[80];
gets(str);
printf("Do dai: %d", strlen(str));
}
Cn thn khi s dng hm gets() bi v n khng kim tra bin ca mng khi
nhp d liu. C th ngi dng nhp vo chui c di hn kh nng khi khai bo.
Hm puts() vit mt chui k t ra mn hnh, sau khi vit chui xong con tr
t ng xung dng. C php:
int puts(char *str);
Hm puts() cng nhn dng c cc k t c bit nh hm printf() v
d nh \t. Hm puts() ch hin th chui k t, d liu dng khc khng hin th
c bng hm ny. Hm puts() thc thi nhanh hn hm printf(). Hm tr v
EOF nu gp li. V d sau m t mt chng trnh tra t in n gin, khi ngi
dng nhp mt t c trong danh sch dic, chng trnh s hin th ngha trng ng.
Nu t khng c trong danh sch, s thng bo ra mn hnh.

Dng Hong Huyn

126

Ngn ng lp trnh C

#include <stdio.h>
#include <string.h>
#include <conio.h>
/* Danh sach cac tu. */
char *dic[] = {
"computer"
,
"May tinh.",
"informatic", "Tin hoc.",
"keyboard"
,
"Ban phim.",
"mouse"
,
"Con chuot.",
"printer" ,
"May in.",
"moniter" ,
"Man hinh",
""
,
"" /* Diem ket thuc danh sach. */
};
void main(void)
{
char word[40], ch;
char **p;
do {
printf("Nhap tu can tra: ");
gets(word);
p = dic;
/* Tim tu va in ra man hinh. */
do {
if(strcmp(*p, word)==0){
printf("Nghia Tieng Viet: ");
puts(*(p+1));
break;
}
p = p + 2; /* Chuyen den tu tiep theo. */
}while(*p);
if(*p==0)
printf("Tu nay khong co trong tu dien.\n");
printf("Tra tu khac? (y/n): ");
ch=getche();
printf("\n");
}while(ch != 'N' && ch!='n');
}

Khoa Cng ngh thng tin Trng i hc Quy Nhn

Chng 8. Vo/ra d liu trn console

127

Ch : ngi dng c th b sung t in vo danh sch bng cch thm cp


gi tr Anh-Vit vo mng con tr dic.

8.3. Hm printf
Xem mc 2.8.1

8.4. Hm scanf
Xem mc 2.8.2

8.5. Cu hi trc nghim v bi tp


8.5.1. Cu hi trc nghim
Cu 1.

8.5.2. Bi tp
Bi 1. Vit chng trnh thc hin cng vic sau: khi ngi dng bm 1 t hp phm
bt k, nu phm khng phi l phm iu khin th in ra mn hnh m ASCII ca phm
, nu l phm iu khin th in m qut ca t hp phm .
Bi 2. Vit chng trnh to mt menu c n mc chn. Khi ngi dng bm phm mi
tn ln v xung, vt sng ca menu s di chuyn. Khi ngi dng bm phm enter,
thng bo ra mn hnh mc chn ca menu.
Bi 3. Vit mt tr chi n gin tm gi l rn sn mi. Xut hin ngu nhin mt
k t x. Ngi dng iu khin con rn (bao gm cc k hin x ghp li vi nhau)
sao cho chm vo k t x va xut hin . Nu rn chm mi thm k t x vo
rn rn di thm. Tip tc hin th k t x ti v tr ngu nhin.

Dng Hong Huyn

Chng 9. c/ghi d liu trn file

129

CHNG 9. C/GHI D LIU TRN FILE


9.1. Lung v file
9.1.1. Lung (stream)
H thng file trong C c thit k lm vic vi nhiu thit b bao gm thit
b u cui, a, bng t. H thng file chuyn i mi thit b khc nhau vo cc
thit b logic gi l lung. Tt c cc lung c cch hot ng nh nhau. Bi v lung
c lp vi thit b, cng mt hm ta c th vit ti a, cng c th vit n mt thit
b khc v d nh console. C hai kiu lung: vn bn v nh phn.
Lung vn bn l chui cc k t. C chun cho php (nhng khng yu cu)
mt lung vn bn thnh tng dng, mi dng kt thc bng k t xung dng.
Lung nh phn l chui cc byte, s k t c vit c c c cng s byte
vi thit b.

9.1.2. File
File l mi th c trn a, ta c th kt hp lung vi file bng thao tc m.
Khi mt file c m, thng tin chuyn i qua li gia file v chng trnh.
Trong file h tr khi nim v tr, khi mt file c m v tr con tr n u
file. Mi k t khi c vit/c trn file lm cho con tr file tng ln mt v tr.
ngt kt hp gia mt lung v file ta s dng lnh ng tp tin. Khi ng
mt tp tin, ni dung nu c s c ghi ln thit b, qu trnh ny lm sch vng m
v n m bo rng khng c thng tin no tnh c b vit ln a. Tt c cc file s
c ng t ng khi chng trnh kt thc bnh thng, hoc gp lnh tr v t hm
main() hoc lnh exit. Cc file s khng c ng khi chng trnh kt thc bt
thng, hoc b b d.
Mi lung kt hp vi file c mt cu trc iu khin c gi FILE. Khng
bao gi thay i cu trc ny.

Dng Hong Huyn

Ngn ng lp trnh C

130

Mc ch chnh ca lung v file l cung cp mt giao din nht qun. S dng


lung thc hin c tt c cc thao tc vo/ra d liu. H thng s t ng chuyn
i d liu vo/ra thnh lung d qun l.

9.2. Cc hm c s trn file


Tn hm

Chc nng

fopen()

M mt file

fclose()

ng mt file

putc()

Ghi 1 k t vo file

fputc()

Ging hm putc().

getc()

c mt k t t file

fgetc()

Ging hm getc().

fgets()

c mt chui k t t file

fputs()

Ghi mt chui k t vo file

fseek()

Chuyn n mt v tr trong file

ftell()

Cho bit v tr hin hnh ca con tr file

fprintf() Ghi vo file ging hm printf() trn console


fscanf()

c t file ging hm scanf() trn bn phm

feof()

Tr v gi tr ng nu gp cui file

ferror()

Tr v gi tr ng nu gp li

rewind()

a con tr v u file

remove()

Xa mt file

fflush()

Lm sch lung
Hnh 9-1. Cc hm thao tc file.

Tt c cc hm ny c nh ngha trong th vin <stdio.h>.

9.2.2. Con tr file


Con tr file l mt con tr tr n cu trc FILE, l mt cu trc m t
thng tin v file, bao gm tn, trng thi v v tr hin ti ca file. c/ghi mt file
chng trnh cn phi s dng con tr ny. Khai bo FILE *fp;

9.2.3. M mt file (hm fopen())


Khoa Cng ngh thng tin Trng i hc Quy Nhn

Chng 9. c/ghi d liu trn file

131

Hm fopen() m mt lung s dng v lin kt n file. Khi n tr v


con tr kt hp vi file c m. Khun dng nh sau:
FILE* fopen(char *filenam, char *mode);
M mt file c tn l filename, vi ch mode. filename l tn file hp
l v c th c ng dn, mode l ch c/ghi kiu vn bn hay nh phn. Nu
fopen() c li, hm tr v con tr NULL.
Bng sau lit tt cc cc gi tr ca tham s mode.
Mode ngha
r

M mt file vn bn c.

To mt file vn bn ghi.

M file vn bn b sung.

rb

M file nh phn c.

wb

To mt file nh phn ghi.

ab

M file nh phn b sung.

r+

M file vn bn c/ghi.

w+

To file vn bn c/ghi.

a+

B sung hoc to file vn bn c/ghi.

r+b

M file nh phn c/ghi.

w+b

To file nh phn c/ghi.

a+b

B sung hoc to file nh phn c/ghi


Hnh 9-2. Cc gi tr tham s mode.

Lu , chui r+b, w+b, a+b c th vit li rb+, wb+, ab+.


V d: fp = fopen(test.txt, w);
Thng thng khi m file thao tc ta phi kim tra file m thnh cng hay
khng, mc ch l cc thao tc sau khng b li. on chng trnh sau thng
c s dng m file.
FILE *fp;
if ((fp = fopen("test","w"))==NULL){

Dng Hong Huyn

Ngn ng lp trnh C

132

printf("Cannot open file.\n");


exit(1);
}
Phng php ny s pht hin mi li khi m file, v d nh l li chng ghi
hay a y.
Khi m mt file c, nu file khng tn ti hm fopen() s tr v li. Khi
m mt file b sung, nu file cha tn ti n s c to mi, nu file tn ti d
liu mi ghi vo cui file, ni dung c vn duy tr khng thay i. Khi m mt file
ghi, nu file cha tn ti n s c to, nu tn ti ni dung c s b xa sch. S
khc nhau gia hai ch w+ v r+ l: r+ s khng c to file nu file khng
tn ti cn w+ th c php; nu file tn ti, m ch w+ s hy ni dung c,
cn r+ th khng.
S file c m cng mt thi im ph thuc vo chng trnh dch, tuy nhin
gi tr thng thng l 8 file.

9.2.4. ng mt file (hm fclose())


ng mt file: int fclose(FILE *fp);
fp l con tr cu trc FILE c tr v bi hm fopen(). Nu ng file
thnh cng, hm s tr v mt gi tr 0. ngoi ra gi tr khc 0.

9.2.5. c/ghi mt k t trn file (hm getc()/putc())


c mt k t t file: int getc(FILE *fp); fp l con tr tr v bi hm
fopen(). Hm tr v mt gi tr kiu nguyn, tuy nhin k t c lu byte thp.
Byte cao s c gi tr 0. Nu c li byte cao c gi tr khc 0. Khi gp cui file, hm tr
v gi tr EOF. Tuy nhin, hm gp li cng tr v gi tr EOF.
Chng trnh sau c mt file vn bn v hin th ni dung ca n ln mn
hnh. Chng trnh s dng tham s t dng lnh DOS. Tham s th nht l tn
chng trnh, tham s th hai l tn file vn bn cn hin th trn mn hnh.
/* filename: viewfile.c */

Khoa Cng ngh thng tin Trng i hc Quy Nhn

Chng 9. c/ghi d liu trn file

133

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]){
FILE *fp;
char ch;
if(argc!=2) {
printf("cu phap: viewfile <filename>\n");
exit(1);
}
if((fp=fopen(argv[1], "r"))==NULL) {
printf("Khong the mo file.\n");
exit(1);
}
ch = getc(fp); /* doc mot ki tu */
while (ch!=EOF){
putchar(ch); /* in ki tu len man hinh */
ch = getc(fp);
}
fclose(fp);
return 0;
}
Ch : file m ngun phi t tn l viewtext.c. thc thi chng trnh
trn, u tin ta to mt file vn bn c th c tn l textfile.txt c ni dung
nh hnh sau:

Hnh 9-3. Ni dung file vn bn textfile.txt m bng Notepad.


Sau bin dch chng trnh ny thnh file viewtext.exe v thc thi
chng trnh t dng lnh DOS. Cch thc hin v kt qu th hin hnh sau:

Dng Hong Huyn

Ngn ng lp trnh C

134

Hnh 9-4. Kt qu thc hin chng trnh viewfile.exe


ghi mt k t vo file ta dng hm: int putc(int ch, FILE *fp).
Trong fp l con tr c tr v bi hm fopen(), ch l k t c ghi vo file.
Nu thao tc ghi thnh cng, hm tr v k t va ghi, ngoi ra hm tr v gi tr EOF.
Chng trnh sau s c tng k t t bn phm v ghi k t ny vo file vn bn cho
n khi bm phm F6 th lu ni dung v thot khi chng trnh.
/* filename: makefile.c */
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
int main(int argc, char *argv[]){
FILE *fp;
char ch;
if(argc!=2){
printf("cu phap: makefile <filename>\n");
exit(1);
}
if((fp=fopen(argv[1], "w"))==NULL){
printf("Khong the mo file.\n");
exit(1);
}
do{
ch = getche();
if(ch==13){ /* xu li phim Enter. */
printf("\n");
putc(10,fp);
Khoa Cng ngh thng tin Trng i hc Quy Nhn

Chng 9. c/ghi d liu trn file

135

putc(13,fp);
}
else if(ch!=0)
putc(ch, fp);
else{
ch = getch();
if(ch==64) /* ma quet phim F6. */
break;
}
} while (1);
fclose(fp);
printf("\nFile da duoc luu.");
return 0;
}
Chng trnh trn ging mt chng trnh son tho vn bn n gin ch
Console. Trong chng trnh ny ta ch mi x l nhng phm n gin v d bm
phm Enter s chn vo file vn bn k t xung dng. Bm phm F6 s thot khi
chng trnh v lu file vo a.

9.2.6. Kim tra cui file (hm feof())


Nh trnh by, khi hm getc() gp cui file s tr v gi tr EOF. Tuy
nhin y khng phi l cch tt nht kim tra ht file. Bi v h thng file lm vic
trn c hai dng nh phn v vn bn. Trong trng hp nh phn, mt s nguyn c
c c th c gi tr trng vi gi tr EOF, khi chng trnh s nhm tng l
ht file nhng thc t th cha. Hn na hm getc() tr v EOF trong trng hp c
li hoc ht file, khi ta khng bit trng hp no xy ra.
gii quyt nhng vn trn, ta c th s dng hm feof() kim tra v
tr cui file. Khun mu ca hm nh sau:
int feof(FILE *fp);
Trong fp l con tr tr v bi hm fopen(). Hm feof() tr v gi tr
khc 0 nu gp cui file, ngoi ra tr v gi tr 0.
V d c n cui file ta c th s dng on lnh sau:

Dng Hong Huyn

Ngn ng lp trnh C

136

while(!feof(fp)) ch = getc(fp);
Chng trnh sau s to mt chng trnh mt file ging nh lnh copy ca h
iu hnh DOS.
/* filename copyfile.c */
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]){
FILE *in, *out;
char ch;
if(argc!=3) {
printf("Cu phap: copyfile <file1> <file2>\n");
exit(1);
}
/* Mo file nguon. */
if((in=fopen(argv[1], "rb"))==NULL) {
printf("Khong mo duoc file nguon.\n");
exit(1);
}
/* mo file dich. */
if((out=fopen(argv[2], "wb")) == NULL) {
printf("Khong mo duoc file dich.\n");
exit(1);
}
/* Xu li sao chep file. */
while(!feof(in)){
ch = getc(in);
if(!feof(in)) putc(ch, out);
}
fclose(in);
fclose(out);
return 0;
}

9.2.7. c/ghi chui k t trn file (hm fgets()/fputs())


Trong C h tr hai hm thao tc trn chui k t, hai hm ny lm vic ging
nh l hm putc() v hm getc() nhng thay v c/ghi tng k t ring l n

Khoa Cng ngh thng tin Trng i hc Quy Nhn

Chng 9. c/ghi d liu trn file

137

c/ghi mt chui k t. Khun mu hai hm ny nh sau:


int fputs(const char *str, FILE *fp);
char *fgets(char *str, int length, FILE *fp);
Hm fputs()ghi mt chui k t c tr bi str vo file fp, nu gp li
hm tr v gi tr EOF. V d sau cp n hm fputs(). Chng trnh ny ci tin
chng trnh makefile.c v d hm putc().
/* file name makefile.c */
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]){
char str[80];
FILE *fp;
if(argc!=2){
printf("cu phap: makefile <filename>\n");
exit(0);
}
if((fp = fopen(argv[1], "w"))==NULL){
printf("Khong the mo file.\n");
exit(1);
}
do{
gets(str);
if(*str==0) /* ket thuc khi nhap chuoi rong. */
break;
fputs(str, fp);
fputs("\n", fp); /* them ki tu xuong dong */
} while(1);
fclose(fp);
printf("\nFile da duoc luu.");
return 0;
}
Trong chng trnh trn, kt thc chng trnh, ta nhp mt dng trng. Do
hm gets() khng b sung k t xung dng, nn phi ghi thm k t xung dng
vo file thao tc c d dng hn.

Dng Hong Huyn

Ngn ng lp trnh C

138

Hm fgets() c mt chui k t cho n khi gp mt k t xung dng hoc


c c length-1 k t. Nu gp mt dng mi n s b sung vo chui mt k t
xung dng. Chui c c s kt thc bi 1 k t rng. Hm tr v chui str nu
c thnh cng v tr v NULL nu gp li. V d sau cp n hm fgets().
Chng trnh ny ci tin chng trnh viewfile.c trong phn v d hm getc().
/* filename: viewfile.c */
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]){
FILE *fp;
char str[80];
if(argc!=2){
printf("cu phap: viewfile <filename>.\n");
exit(1);
}
if((fp=fopen(argv[1], "r"))==NULL){
printf("Khong the mo file.\n");
exit(1);
}
while(feof(fp)==0)
if(fgets(str,79,fp)!=NULL)
printf("%s",str);
fclose(fp);
return 0;
}

9.2.8. Hm rewind()
Hm rewind() thit lp con tr v tr file v u file c ch ra bi tham s.
Khun mu nh sau:
void rewind(FILE *fp);
hiu r hm rewind(), xt v d sau. Hin th ni dung file va mi c
ghi vo a. thc hin thao tc ny, ta phi quay v u file sau khi hon thnh
vic ghi vo a v s dng fgets() c li file ny. Ch file ny phi c m
ch c/ghi bng cch s dng ch w+. ch w+, nu file cha tn ti,
Khoa Cng ngh thng tin Trng i hc Quy Nhn

Chng 9. c/ghi d liu trn file

139

chng trnh s to file mi. Nu tn ti, chng s xa ni dung c v ghi ni


dung mi ln file.
#include <stdio.h>
#include <stdlib.h>
int main(void){
char str[80];
FILE *fp;
if((fp = fopen("test.txt", "w+"))==NULL){
printf("khong mo duoc file.\n");
exit(1);
}
printf("Nhap mot chuoi(ket thuc bam enter):\n");
do{
gets(str);
if(*str==0)
break;
fputs(str, fp);
fputs("\n",fp);
}while(*str!='\n');
/* doc, hien thi noi dung file vua ghi. */
rewind(fp); /* quay lai dau file. */
printf("Noi dung file vua ghi:\n");
while(!feof(fp)){
if(fgets(str, 79, fp)!=NULL)
printf(str);
}
return 0;
}

9.2.9. Hm ferror()
Hm ferror() xc nh c hay khng mt thao tc trn file gp li. Khun
mu ca hm nh sau:
int ferror(FILE *fp);
Hm tr v gi tr ng nu thao tc sau cng trn file fp c li, ngoi ra hm
tr v gi tr sai. Bi v mi thao tc trn file u c th gy li, do hm ferror()

Dng Hong Huyn

Ngn ng lp trnh C

140

phi c gi ngay lp tc sau mi thao tc trn file.


Chng trnh sau minh ha hm ferror() bng cch ci tin chng trnh
makefile.c v d trc. Sau khi ghi chui k t vo file, ta phi kim tra ngay lp
tc thao tc ny c b li hay khng? nu c li s dng chng trnh bng lnh
exit(1).
/* file name makefile.c */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[]){
char str[80];
FILE *fp;
if(argc!=2){
printf("cu phap: makefile <filename>\n");
exit(0);
}
if((fp = fopen(argv[1], "w"))==NULL){
printf("Khong the mo file.\n");
exit(1);
}
do{
gets(str);
if(*str==0) /* ket thuc khi nhap chuoi rong. */
break;
strcat(str,"\n");
fputs(str, fp); /* them ki tu xuong dong */
/* kiem tra loi sau khi ghi vao file. */
if(ferror(fp)!=0){
printf("loi ghi vao file: %s",argv[1]);
exit(1);
}
} while(1);
fclose(fp);
printf("\nFile da duoc luu.");
return 0;

Khoa Cng ngh thng tin Trng i hc Quy Nhn

Chng 9. c/ghi d liu trn file

141

9.2.10. Xa mt file (hm remove())


xa mt file, int remove(char *filename);
Nu thnh cng hm tr v gi tr 0, ngoi ra hm tr gi tr khc 0. Chng
trnh sau xa mt file c ch ra t dng lnh DOS.
/* file name: delfile.c */
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
int main(int argc, char *argv[]){
char ch;
if(argc!=2){
printf("cu phap: delfile <filename>\n");
exit(1);
}
printf("Co xoa file \"%s\"? (Y/N): ", argv[1]);
ch = getche();
if(ch=='Y'||ch=='y')
if(remove(argv[1])){
printf("\nKhong the xoa file \"%s\".",
argv[1]);
exit(1);
}else
printf("\nfile \"%s\" da bi xoa.",argv[1]);
else
printf("\nfile \"%s\" chua bi xoa.",argv[1]);
return 0;
}
Ta phi kim tra gi tr ca hm remove() ngay sau khi gi bit chc rng
file xa thnh cng hay khng?

9.2.11. Lm sch mt lung (hm fflush())


Hm int fflush(FILE *fp); lm sch lung kt hp vi file, hm ny
vit d liu trn vng m vo file kt hp vi con tr fp. Nu gi hm fflush()

Dng Hong Huyn

Ngn ng lp trnh C

142

vi con tr fp l NULL, cc file ang m ghi s c lm sch. Nu thnh cng


hm tr v gi tr 0, ngoi ra tr v gi tr EOF.

9.3. Hm fread() v fwrite()


c/ghi d liu trn nhiu byte, C cung cp hai hm fread() v
fwrite(). Hai hm ny cho php c/ghi khi d liu bt k. Khun mu ca hai
hm nh sau:
size_t fread(void *buffer, size_t num_bytes, size_t count,
FILE *fp);
size_t fwrite(const void *buffer, size_t num_bytes, size_t
count, FILE *fp);
Vi hm fread(), buffer l con tr n vng nh s nhn d liu t file.
Vi hm fwrite(), buffer l con tr n vng nh cn ghi vo file. Gi tr
count xc nh c bao nhiu phn t c c/ghi, vi mi phn t s c
num_bytes di. size_t c nh ngha nh l mt s nguyn khng du. fp
l con tr file kt hp vi lung c m trc .
Hm fread() tr v s i tng c c, gi tr ny c th nh hn count
nu gp cui file hoc gp li. Hm fwrite() tr v s i tng ghi c, gi tr
ny lun bng count nu nh khng c li.
Nh cp, file c th m di dng nh phn hay vn bn, hm fread(),
fwrite() c th c/ghi mi kiu thng tin. V d chng trnh sau ghi v sau
c ngc li mt gi tr double, int, long trn a.
#include <stdio.h>
#include <stdlib.h>
int main(void){
FILE *fp;
double d = 12.23;
int i = 101;
long l = 123023L;
if((fp=fopen("test", "wb+"))==NULL){
printf("Khong the mo file.\n");
exit(1);
Khoa Cng ngh thng tin Trng i hc Quy Nhn

Chng 9. c/ghi d liu trn file

143

}
fwrite(&d, sizeof(double), 1, fp);
fwrite(&i, sizeof(int), 1, fp);
fwrite(&l, sizeof(long), 1, fp);
rewind(fp);
fread(&d, sizeof(double), 1, fp);
fread(&i, sizeof(int), 1, fp);
fread(&l, sizeof(long), 1, fp);
printf("%f %d %ld", d, i, l);
fclose(fp);
return 0;
}
Mt trong nhng ng dng quan trong nht ca hm fread() v fwrite()
l c/ghi d liu do ngi dng nh ngha. V d cho cu trc:
struct struct_type{
float balance;
char name[80];
} cust;
Cu lnh sau s vit ni dung ca cust vo file c tr bi fp:
fwrite(&cust, sizeof(struct struct_type), 1, fp);
V d to cu trc c tn l Phan_So lu tr phn s, nhp vo hai phn s
ghi hai phn s ny vo file phanso.dat. Sau c hai phn s ny v hin th ln
mn hnh.
#include <stdio.h>
#include <stdlib.h>
struct Phan_So{
int tu, mau;
};
void main(void){
struct Phan_So P1, P2;
FILE *fp;
if((fp = fopen("phanso.dat","wb"))==NULL){
printf("Khong mo duoc file phans0.dat\n");
exit(1);

Dng Hong Huyn

Ngn ng lp trnh C

144

}
printf("Nhap phan so thu nhat:\n");
printf("Tu: ");
scanf("%d",&P1.tu);
printf("Mau: ");
scanf("%d",&P1.mau);
/* ghi phan so thu nhat vao file. */
fwrite(&P1,sizeof(struct Phan_So),1,fp);
printf("Nhap phan so thu hai:\n");
printf("Tu: ");
scanf("%d",&P2.tu);
printf("Mau: ");
scanf("%d",&P2.mau);
/* ghi phan so thu hai vao file. */
fwrite(&P2,sizeof(struct Phan_So),1,fp);
fclose(fp);
/*
doc hai phan so tu file phanso.dat
in gia tri hai phan so len man hinh.
*/
if((fp = fopen("phanso.dat","rb"))==NULL){
printf("Khong mo duoc file phanso.dat\n");
exit(1);
}
/* doc hai phan so ra hai bien P1, P2. */
fread(&P1,sizeof(struct Phan_So),1,fp);
fread(&P2,sizeof(struct Phan_So),1,fp);
/* hien thi hai phan so ra man hinh. */
printf("Phan so thu nhat: %d/%d\n",P1.tu,P1.mau);
printf("Phan so thu hai : %d/%d\n",P2.tu,P2.mau);
fclose(fp);
}
Ch : c/ghi d liu bng hai hm fread(), fwrite() ta c th m
file ch vn bn. Tuy nhin thao tc thng c/ghi d liu khng theo nh
mun. file nh phn khng th hin th ni dung bng cc chng trnh son tho vn
bn thng thng.

Khoa Cng ngh thng tin Trng i hc Quy Nhn

Chng 9. c/ghi d liu trn file

145

9.4. Hm fseek() v truy cp ngu nhin


Ta c th truy cp ngu nhin trn file bng cch s dng hm fseek(). Hm
ny thit lp v tr ca con tr file. Khun dng nh sau:
int fseek(FILE *fp, long numbytes, int origin);
Trong , fp l con tr c m bi hm fopen(), numbytes l s byte
tnh t mc origin n v tr mi, origin s l mt trong cc Macro sau:
Origin
Beginning of file
Current position
End of file

Macro Name
SEEK_SET
SEEK_CUR
SEEK_END

Hm fseek() tr v 0 nu thc hin thnh cng v tr v gi tr khc 0 nu


gp li. Chng trnh sau hin th gi tr ca mt byte bt k ca file tng ng nhp t
dng lnh DOS.
/* filename: fseek.c */
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]){
FILE *fp;
if(argc!=3){
printf("cu phap: SEEK <filename> <byte>\n");
exit(1);
}
if((fp = fopen(argv[1], "rb"))==NULL){
printf("Khong the mo file.\n");
exit(1);
}
if(fseek(fp, atol(argv[2]), SEEK_SET)){
printf("Ham fseek bi loi.\n");
exit(1);
}
printf("byte %ld: %c", atol(argv[2]), getc(fp));
fclose(fp);
return 0;
}
Dng Hong Huyn

Ngn ng lp trnh C

146

tm mt i tng trn file ta ch ra kch thc v s th t ca i tng


cn tm. V d, c danh sch a ch mail c lu trong cu trc list_type. tm
phn t th 10 ta dng lnh:
fseek(fp, 9*sizeof(struct list_type), SEEK_SET);.
C th xc nh v tr hin hnh ca con tr file bng hm ftell(), khun
mu ca hm nh sau:
long ftell(FILE *fp);
Hm tr v v tr hin ti ca con tr file, nu gp li hm tr v gi tr -1.

9.5. Hm fprintf() v fscanf()


Khun mu ca hai hm ny nh sau:
int fprintf(FILE *fp, const char *control_string,. . .);
int fscanf(FILE *fp, const char *control_string,. . .);
c/ghi d liu ging nh cc hm scanf() v printf()trn Console.
Hm fscanf() thay v c d liu t bn phm ging nh hm scanf(), n c
d liu t file. Hm fprintf() thay v in d liu ra mn hnh ging nh hm
printf(), n in d liu ra file.
V d sau nhp d liu t file input.dat vo mng a, d liu trong file
input.dat c b tr nh sau: dng u tin l mt s nguyn n cho bit s phn
t. Dng th 2 l n s nguyn cho bit gi tr tr c th ca tng phn t trong mng a.
Hnh sau th hin mt v d ca file input.dat.

.
Hnh 9-5. File input.dat c m bng chng trnh Notepad.
Sau khi c d liu ra mng, chng trnh sp xp mng theo th t tng dn
Khoa Cng ngh thng tin Trng i hc Quy Nhn

Chng 9. c/ghi d liu trn file

147

v ghi d liu ra file output.dat. Cu trc ca file output.dat nh sau: dng


th nht l mt s nguyn m t s phn t ca mng, dng th 2 l n s nguyn m t
gi tr cc phn t ca mng a.
#include <stdio.h>
#include <stdlib.h>
void main(void){
FILE *in, *out;
int a[100], n, i, j, tg;
if((in = fopen("input.dat","r"))==NULL){
printf("khong mo duoc file input.dat\n");
exit(1);
}
if((out = fopen("output.dat","w"))==NULL){
printf("khong mo duoc file ourput.dat.\n");
exit(1);
}
/* doc du lieu tu file input.dat ra mang. */
fscanf(in,"%d",&n);
for(i=0; i<n; i++)
fscanf(in,"%d",&a[i]);
/* sap xep mang tang dan. */
for(i=0; i<n-1; i++)
for(j=i+1; j<n; j++)
if(a[i]>a[j]){
tg = a[i];
a[i] = a[j];
a[j] = tg;
}
/* ghi du lieu tu mang vao file output.dat */
fprintf(out,"%d\n",n);
for(i=0; i<n; i++)
fprintf(out,"%d ",a[i]);
fclose(in);
fclose(out);
}

Dng Hong Huyn

Ngn ng lp trnh C

148

Sau khi thc hin chng trnh ta c th xem ni dung ca file output.dat
bng cc chng trnh son vn bn thng thng. Hnh sau hin ni dung ca file
output.dat bng chng trnh Notepad.

Hnh 9-6. file output.dat m bng chng trnh Notepad.

9.6. Lung chun


Khi mt chng trnh thc thi, c ba lung chun t ng m l stdin,
stdout v stderr. Trong stdin l lung kt hp vi vng m ca bn phm.
stdout, stderr l lung kt hp vi b nh mn hnh. Bi v cc lung chun ny
l con tr file nn cc hm trn file u c th thc hin trn lung chun. Khi s dng
cc lung ny khng cn phi dng cc thao tc m, ng file thng thng.
V d sau nhp vo mt s nguyn, hin th gi tr va nhp ra mn hnh. Ch
: chng trnh trn s dng cc hm vo/ra trn file v cc lung chun stdin,
stdout.
#include <stdio.h>
void main(void){
int a;
fprintf(stdout,"Nhap vao mot so nguyen: ");
fscanf(stdin,"%d",&a);
fprintf(stdout,"Gia tri vua nhap: %d\n",a);
}

9.7. Cu hi trc nghim v bi tp


9.7.1. Cu hi trc nghim
Cu 1. Cu lnh fp=fopen(test,wb); c ngha l:

Khoa Cng ngh thng tin Trng i hc Quy Nhn

Chng 9. c/ghi d liu trn file

a.
b.
c.
d.

M
M
M
M

mt
mt
mt
mt

file
file
file
file

vn
nh
nh
vn

149

bn b sung.
phn c.
phn ghi.
bn ghi.

Cu 2. Gi s trn a c file test, sau khi m file test bng lnh:


fp=fopen(test,wb); chng trnh s:
a.
b.
c.
d.

Bo li
M file
M file
M file

v khng m c file ny.


ny nhng ni dung trc ca file b mt.
ny v ni dung trc vn gi nguyn.
ny cho php ghi ni dung mi vo cui file.

Cu 3. Gi s trn a cha c file test, sau khi m file test bng lnh:
fp=fopen(test,rb); chng trnh s:
a.
b.
c.
d.

Bo li
M file
M file
M file

v khng m c file ny.


ny nhng ni dung trc ca file b mt.
ny v ni dung trc vn gi nguyn.
ny cho php ghi ni dung mi vo cui file.

Cu 4. Gi s trn a c file test, sau khi m file test bng lnh:


fp=fopen(test,ab); chng trnh s:
a.
b.
c.
d.

Bo li
M file
M file
M file

v khng m c file ny.


ny nhng ni dung trc ca file b mt.
ny v ni dung trc vn gi nguyn.
ny cho php ghi ni dung mi vo cui file.

Cu 5. Ch m file bng w+ c ngha:


a.
b.
c.
d.

M
M
M
M

file
file
file
file

vn
nh
vn
nh

bn cho php c/ghi.


phn cho php c/ghi.
bn cho php ghi.
phn cho php ghi.

Cu 6. Ch m file bng r+b c ngha:


a.
b.
c.
d.

M
M
M
M

file
file
file
file

vn
nh
vn
nh

Dng Hong Huyn

bn cho php c/ghi.


phn cho php c/ghi.
bn cho php ghi.
phn cho php ghi.

Ngn ng lp trnh C

150

Cu 7. Cc cu tr li sau, cu no sai, cu no ng: Ch m file bng w+ thc


hin thao tc?
a.
b.
c.
d.

Nu
Nu
Nu
Nu

file
file
file
file

cha tn ti th to file mi.


cha tn ti th bo li.
tn ti th xa ni dung c.
tn ti vn gi ni dung c.

Cu 8. Cc cu tr li sau, cu no sai, cu no ng: Ch m file bng r+ thc


hin thao tc?
a.
b.
c.
d.

Nu
Nu
Nu
Nu

file
file
file
file

cha tn ti th to file mi.


cha tn ti th bo li.
tn ti th xa ni dung c.
tn ti vn gi ni dung c.

Cu 9. Cc cu tr li sau, cu no sai, cu no ng: Ch m file bng a+ thc


hin thao tc?
a.
b.
c.
d.

Nu
Nu
Nu
Nu

file
file
file
file

cha tn ti th to file mi.


cha tn ti th bo li.
tn ti th xa ni dung c.
tn ti vn gi ni dung c.

Cu 10. c mt k t t file ta s dng hm no sau y:


a. getch()

b. getc()

c. getchar()

d. gets()

Cu 11. ghi mt k t ra file ta s dng hm no sau y:


a. putchar()

b. putc()

c. fputs()

d. puts()

Cu 12. c mt chui k t t file, ta s dng hm no?


a. gets()

b. getchar()

c. fgets()

d. getc()

Cu 13. ghi chui k t t file ta s dng hm no?


a. putchar()

b. putc()

c. fputs()

d. puts()

Cu 14. ghi mt bin cu trc vo file ta s dng hm no?


a. fprintf()

b. putc()

c. fputs()

d. fwrite()

Cu 15. c mt bin cu trc t file ta s dng hm no?


a. fscanf()

b. fgets()

c. getc()

d. fread()

Khoa Cng ngh thng tin Trng i hc Quy Nhn

Chng 9. c/ghi d liu trn file

151

Cu 16. Hm fseek() dng :


a.
b.
c.
d.

Kim tra mt file c m c li hay khng?


Kim tra mt thao tc trn file c li hay khng?
Cho bit v tr hin ti ca file.
Chuyn con tr file n v tr mong mun.

Cu 17. Hm ftell() dng :


a.
b.
c.
d.

Kim tra mt file c m c li hay khng?


Kim tra mt thao tc trn file c li hay khng?
Cho bit v tr hin ti ca file.
Chuyn con tr file n v tr mong mun.

Cu 18. Hm ferror() dng :


a.
b.
c.
d.

Kim tra mt file c m c li hay khng?


Kim tra mt thao tc trn file c li hay khng?
Cho bit v tr hin ti ca file.
Chuyn con tr file n v tr mong mun.

9.7.2. Bi tp
Bi 1. Vit chng trnh nhp mt ma trn t bn phm sau ghi ma trn vo file
theo cu trc sau: dng u tin c hai s nguyn m t s (dng, ct) ca ma trn
tng ng vi hai gi tr (m, n); m dng tip theo mi dng c n s thc tng ng vi
gi tr ca tng phn t.
Bi 2. Vit chng trnh c ni dung ca file cha ma trn trn, sau in ni dung
ma trn ra mn hnh.
Bi 3. S dng hai hm fread(), fwrite() to lnh copy trong DOS.
Bi 4. Vit chng trnh to mt dy s ngu nhin gm n s nguyn. Ghi dy s ny
vo file c tn l dayso.dat. c v hin th ni dung ca dy t file ra mn hnh.
Dng cc hm truy cp ngu nhin sp xp dy s ny theo th t tng dn. Lu
khng c s dng mng.
Bi 5. qun l d liu v hc sinh, ta cn cc thng tin sau: m hc sinh, h tn,
nm sinh, qu qun. Yu cu:

Dng Hong Huyn

Ngn ng lp trnh C

152

- Khai bo d liu lu tr ng v y nhng thng tin trn.


- Vit hm nhp danh sch hc sinh vo mng.
- Vit hm ghi danh sch hc sinh t mng vo tp tin c tn l DATA.INP
- Vit hm hin tt c thng tin ca cc hc sinh t mng ln mn hnh.
- Vit hm c danh sch hc sinh t tp tin DATA.INP ra mng.
- Vit hm tm mt hc sinh c m hc sinh cho trc
- Vit hm chn mt hc sinh vo danh sch.
- Vit hm xa mt hc c m hc cho trc ra khi danh sch.
- Vit hm sp xp cc danh sch hc sinh gim dn da theo m hc sinh.
- T chc chng trnh chnh thnh mt menu nh sau:
1. To danh sch hc sinh vo mng.
2. Lu danh sch hc sinh t mng vo tp tin c tn l DATA.INP
3. Hin th tt c thng tin ca cc hc sinh t mng ln mn hnh.
4. c danh sch hc sinh t tp tin DATA.INP ra mng.
5. Tm mt hc sinh c m hc sinh cho trc
6. Chn mt hc sinh vo danh sch.
7. Xa mt hc c m hc cho trc ra khi danh sch.
8. Sp xp cc danh sch hc sinh gim dn da theo m hc sinh.
9. Thot khi chng trnh.
Khi ngi dng bm phm s t 1 n 9 th chc nng tng ng s c thc
hin. ng vi mi chc nng s thc hin mt hm vit.

Khoa Cng ngh thng tin Trng i hc Quy Nhn

Chng 10. Tin x l v ch thch

153

CHNG 10. TIN X L V CH THCH


10.1. #define
Dn hng #define nh ngha mt nh danh v chui k t, chui k t ny
s thay th nh danh mi ln xut hin trong m ngun. C php khai bo ca dn
hng:
#define macro_name char_sequence
Ch , y khng c du chm phy. C th c nhiu du trng gia nh
danh v chui k t.
V d, mun s dng t LEFT thay cho gi tr 1, v RIGHT thay cho gi tr 0,
ta c th khai bo hai dn hng #define nh sau:
#define LEFT 1
#define RIGHT 0
Khi cu lnh sau s in gi tr 0 1 2 ln mn hnh.
printf(%d %d %d,RIGHT, LEFT, LEFT + 1);
Mt macro c nh ngha, n c th c s dng l mt phn ca nh
ngha macro khc. V d sau nh ngha cc gi tr ONE, TWO v THREE:
#define ONE 1
#define ONE+ONE
#define ONE+TWO
S thay th macro n gin l thay th nh danh bng mt chui k t kt hp
vi n, v vy nu mun nh ngha mt li chun ta c th nh ngha nh sau:
#define E_MS standard error on input\n
/**/
printf(E_MS);
Trnh bin dch s thc s thay th chui standard

error

on

input\n khi xut hin nh danh E_MS. Khi bin dch, hm printf(E_MS)
thc s xut hin l printf(standard error on input\n);

Dng Hong Huyn

Ngn ng lp trnh C

154

Chui vn bn khng c thay th nu nh danh t trong du nhy kp. V


d:
#define XYZ this is a test
...
printf(XYZ);
Khng in this is a test v in ra XYZ.
Nu chui thay th nhiu hn mt dng, ta c th vit tip trn dng khc bng
cch thm du \ (backslash) vo cui dng.
#define LONG_STRING this is a very long \
string that is used as an example
Cc lp trnh vin thng s dng ch hoa nh ngha nh danh, trng hp
ny s gip cho ngi dng c chng trnh bit c rng l mt macro c
thay th.
Thng thng cc macro c nh ngha u chng trnh, hoc trong mt file
ring bit (v d file *.h).
Macro thng c s dng nh ngha s ma thut (magic number) xut
hin trong mt chng trnh. V d ta c mt chng trnh nh ngha mt mng v c
mt vi on chng trnh truy cp n mng ny. Thay v ta vit chnh xc kch
thc ca mng bi mt hng, ta c th nh ngha kch thc bi mt dn hng
#define v s dng macro ny bt k khi no cn s dng kch thc ca mng.
Theo cch ny, nu mun thay i kch thc ca mng, ta ch cn thay i cu lnh
#define v bin dch li chng trnh. V d:
#define MAX_SIZE 100
/* ... */
float balance[MAX_SIZE];
/* ... */
for(i=0; i<MAX_SIZE; i++) printf("%f", balance[i]);
/* ... */
for(i=0; i<MAX_SIZE; i++) x =+ balance[i];
MAX_SIZE nh ngha kch thc mng balance, nu kch thc ca mng

Khoa Cng ngh thng tin Trng i hc Quy Nhn

Chng 10. Tin x l v ch thch

155

balance cn thay i, ta ch cn thay i nh ngha ca MAX_SIZE, tt c cc tham


chiu n kch thc ca balance s t ng cp nht.

10.1.1. nh ngha Macro ging hm


Dn hng #define cn c mt ng dng quan trng khc l tn macro c
th c tham s. Mi ln tn macro xut hin, tham s s dng trong nh ngha s
c thay th bi tham s thc s tm thy trong chng trnh. Dng ny ta cn gi l
macro tng t nh hm. V d:
#include <stdio.h>
#include <conio.h>
#define ABS(a) (a)<0 ? -(a) : (a)
void main(void){
printf("abs of -1 and 1: %d %d", ABS(-1), ABS(1));
getch();
}
Khi chng trnh ny c bin dch, a trong nh ngha macro s c thay
th vi gi tr l -1 v 1. Du ngoc n bao quanh a chc rng chng trnh lm
vic trong mi trng hp. V d nu xa du ngoc n bao quanh a, biu thc
ABS(10-20) s c chuyn i thnh -10-20<0 ? -10-20 : 10-20. Trong
trng hp ny s cho kt qu sai yu cu.
S dng macro ging hm thay th hm thc c mt im thun li chnh l
lm tng tc thc thi ca chng trnh bi v khng c li gi hm. Tuy nhin, nu
kch thc ca macro ln, n s tng kch thc ca chng trnh ln rt nhiu bi v
c qu nhiu m trng nhau.

10.2. #error
Dn hng #error bt buc chng ngng bin dch. Mc ch chnh l dng
cho g ri. Dng tng qut ca mt dn hng #error l:
#error error_message
error_message khng c t gia cp du nhy kp. Khi dn hng
#error xut hin, thng ip li s hin th cng vi nhng thng tin khc c th

Dng Hong Huyn

Ngn ng lp trnh C

156

c nh ngha bi trnh bin dch. Thng thng dn hng ny i theo vi cc dn


hng bin dch c iu kin.

10.3. #include
Dn hng #include ch dn cho trnh bin dch c file ngun khc vi tn
cha trong dn hng #include. Tn ca file ngun c th t trong du nhy kp
() hoc du m (<>). V d:
#include stdio.h
#include <stdio.h>
C hai u ch dn trnh bin dch c v bin dch file tiu vi cc hm th
vin vo ra h thng.
Cc file c chn c th c dn hng #include bn trong, khi ta gi l
chn lng nhau. S cc mc lng nhau bin i ty theo trnh bin dch. Tuy nhin
trong C chun quy nh c th c ti a l 8 mc.
Tn file c th t trong du nhy kp hoc trong cp du m xc nh cch
thc tm kim. Nu t trong cp du m, chng trnh tm kim trong th mc c
nh ngha bi trnh bin dch. Nu t trong du nhy kp, chng trnh tm kim
trong th mc c ch ra ti lc khai bo hoc trong th mc hin hnh.
Thng thng, ta s dng du m chn cc th vin chun v du nhy kp
chn cc file tiu do ta vit ra.
Ta s dng dn hng #include trong trng mun chia nh chng trnh thnh
nhiu file khc nhau d qun l, hoc s dng to mt th vin ring s dng.
Xt v d sau: vit chng trnh nhp v mt dy s, sp xp v in dy s ra
mn hnh. Trong v d ny ta c th chia chng trnh thnh nhiu file khc nhau v
bin dch ring bit tng file mt. C th ta gp cc m lnh vit hm Nhap(), hm
In(), hm Sapxep() vo mt file ring v bin dch c lp file ny. Tip theo, vit
chng trnh cha hm main() bao gm cc lnh gi hm Nhap(), In() v
Sapxep() trong mt file ring. Cc thao tc thc hin nh sau:

Khoa Cng ngh thng tin Trng i hc Quy Nhn

Chng 10. Tin x l v ch thch

157

1. To mt d n mi bng chng trnh Visual C++ bng thao tc: File\New


xut hin bng chn nh hnh sau:

Hnh 10-1. Chn loi d n vi chng trnh Visual C++.


Trong bng chn nh hnh trn, ta chn loi d n l Win32 Console
Application, nhp tn d n vo mc Project name (trong v d ny ta nhp mang).
Bm OK xut hin bng chn khc nh hnh sau:

Dng Hong Huyn

Ngn ng lp trnh C

158

Hnh 10-2. Bng chn loi ng dng mun to.


Trong hnh ny, ta chn An empty project, bm Finish, tip tc bm OK.
Tip tc thc hin thao tc Project\Add To Project\New xut hin bng chn
nh hnh 10-3 nh sau:
Ch : mi ln b sung mt file vo d n ta thc hin thao tc ny mt ln.
Chn kiu file l: C/C++ Header File nu mun chn vo d n file *.h. Chn
kiu file l: C/C++ Source File nu mun chn vo d n file *.c hoc *.cpp. G
tn file vo mc File name, sau bm OK.

Khoa Cng ngh thng tin Trng i hc Quy Nhn

Chng 10. Tin x l v ch thch

159

Hnh 10-3. B sung file mi vo d n.


Trong v d ny, ta s ln lt b sung vo d n ba file: file th nht c tn l
mang.h c ni dung nh sau:
void Nhap(int *p, int n);
void In(int *p, int n);
void Sapxep(int *p, int n, int d);
File th hai c tn l mang.c c ni dung nh sau:
#include <stdio.h>
/* dinh nghia ham nhap day so. */
void Nhap(int *p, int n){
int i;
for(i=0; i<n; i++){
printf("phan tu %d: ",i);
scanf("%d",&p[i]);
}
}
/* dinh nghia ham in day so. */
void In(int *p, int n){

Dng Hong Huyn

Ngn ng lp trnh C

160

int i;
for(i=0; i<n; i++)
printf("%4d", p[i]);
printf("\n");
}
/*
dinh nghia ham sap xep
tham so d=1 sap tang, d=-1 sap giam
*/
void Sapxep(int *p, int n, int d){
int i, j, tg;
for(i=0; i<n-1; i++)
for(j=i+1; j<n; j++)
if(d*p[i]>d*p[j]){
tg = p[i];
p[i] = p[j];
p[j] = tg;
}
}
File th ba c tn l main.c c ni dung nh sau:
#include <stdio.h>
#include "mang.h" /* chen file tieu de mang.h */
void main(void){
int a[100], n;
printf("Nhap so phan tu: ");
scanf("%d",&n);
Nhap(a,n);
/* Nhap mang.
In(a,n);
/* In mang sau khi nhap.
Sapxep(a,n,1);
/* Sap xep mang tang dan.
In(a,n);
/* In mang sau khi sap tang.
Sapxep(a,n,-1);
/* Sap xep mang giam dan.
In(a,n);
/* In mang sau khi sap giam.
}

*/
*/
*/
*/
*/
*/

Ta c th bin dch tt c cc file bng thao tc: Build\Rebuild All, khi


chng trnh s sinh ra hai file: mang.obj, main.obj v mt file mang.exe.

Khoa Cng ngh thng tin Trng i hc Quy Nhn

Chng 10. Tin x l v ch thch

161

10.4. Ch th bin dch c iu kin


C mt vi dn hng cho php ta chn v tr bin dch trong file m ngun. X
l ny gi l bin dch c iu kin v c s dng rng ri trong cc phn mm
thng mi.

10.4.1. #if, #else, #elif, #endif


Dn hng ny cho php ta dch c iu kin mt on m da vo kt qu ca
biu thc hng. C php:
#if constant-expression
statement
#endif
Nu hng theo sau #if c gi tr ng th on m sau s c bin dch,
ngoi ra b qua on m . Dn hng #endif nh du kt thc ca #if. V d:
#include <stdio.h>
#define MAX 100
int main(void){
#if MAX>99
printf("Compiled for array greater than 99.\n");
#endif
return 0;
}
Chng trnh ny s hin th thng ip ln mn hnh bi v MAX > 99. Biu
thc sau #if phi c tnh ton ti thi im bin dch, do n ch cha nhng
nh danh v hng c nh ngha trc, khng c s dng bin trong trng
hp ny.
Dn hng #else ging nh mnh else trong C. V d:
#include <stdio.h>
#define MAX 10
int main(void){
#if MAX>99
printf("Compiled for array greater than 99.\n");
#else

Dng Hong Huyn

Ngn ng lp trnh C

162

printf("Compiled for small array.\n");


#endif
return 0;
}
Trong trng hp ny MAX nh ngha <99, khi m sau #if khng thc
hin v m sau #else s c thc hin.
Dn hng #elif ging nh else if tc l cc lnh if else lin tc
nhau. Dng tng qut nh sau:
#if expression
statement sequence
#elif expression 1
statement sequence
#elif expression 2
statement sequence
#elif expression 3
statement sequence
#elif expression 4

#elif expression N
statement sequence
#endif
V d sau dng ACTIVE_COUNTRY nh ngha k hiu tin t:
#define US 0
#define ENGLAND 1
#define FRANCE 2
#define ACTIVE_COUNTRY US
#if ACTIVE_COUNTRY == US
char currency[] = "dollar";
#elif ACTIVE_COUNTRY == ENGLAND
char currency[] = "pound";
#else
char currency[] = "franc";
#endif
Trong C chun cho php c 8 mc lng nhau, khi lng nhau mi #endif,

Khoa Cng ngh thng tin Trng i hc Quy Nhn

Chng 10. Tin x l v ch thch

163

#elif, #else s kt hp vi #if, #elif gn nht. V d sau hon ton hp l:


#if MAX>100
#if SERIAL_VERSION
int port=198;
#elif
int port=200;
#endif
#else
char out_buffer[100];
#endif

10.4.2. #ifdef v #ifndef


Mt cch khc bin dch c iu kin l dn hng #ifdef v
#ifndef c ngha l if defined v if not defined tng ng. Dng tng qut:
#ifdef macro-name
statement sequence
#endif
Nu macro-name c nh ngha trc bng cu lnh #define, khi
lnh s c bin dch. C #ifdef v #ifndef u c th s dng #else v
#elif. V d:
#include <stdio.h>
#define TED 10
int main(void){
#ifdef TED
printf("Hi Ted\n");
#else
printf("Hi anyone\n");
#endif
#ifndef RALPH
printf("RALPH not defined\n");
#endif
return 0;
}
Chng trnh trn s in ra Hi Ted v RALPH not defined. Ta c th lng

Dng Hong Huyn

Ngn ng lp trnh C

164

cc dn hng #ifdef v #ifndef 8 mc trong C chun.

10.5. #undef
Dn hng #undef ngha l undefines xa nh ngha macro trc ,
dng tng qut ca #undef nh sau:
#undef macro-name
V d:
#define LEN 100
#define WIDTH 100
char array[LEN][WIDTH];
#undef LEN
#undef WIDTH
/* at this point both LEN and WIDTH are undefined */
C LEN v WIDTH c nh ngha cho n khi xut hin cu lnh #undef.

10.6. defined
Ta c th dng defined kt hp vi #if xc nh mt macro c
nh ngha hay cha. Dng tng qut ca defined nh sau:
defined macro-name
Nu macro c nh ngha, biu thc cho gi tr ng, ngoi ra cho gi tr
sai. V d xc nh macro MYFILE c nh ngha hay cha ta c th dng mt
trong hai cch sau:
#ifdef MYFILE
hoc:
#if defined MYFILE
Ta c th thm du ! ph nh mnh defined. V d cu lnh sau s
c bin dch nu DEBUG cha c nh ngha:
#if !defined DEBUG
printf("Final version!\n");
#endif

10.7. #line
Khoa Cng ngh thng tin Trng i hc Quy Nhn

Chng 10. Tin x l v ch thch

165

Dn hng #line thay i ni dung ca __LINE__ v __FILE__, l hai


nh danh c nh ngha trc trong trnh bin dch. nh danh __LINE__ cha s
dng hin thi bin dch. nh danh __FILE__ l chui cha tn file ngun v
ang bin dch. Dng tng qut ca #line:
#line number filename
Vi number l mt s nguyn dng bt k v n l gi tr mi ca
__LINE__, ty chn filename l mt tn file hp l bt k v n tr thnh tn mi
ca __FILE__. #line s dng trong cc tnh hung g ri chng trnh.
V d sau ch ra rng m dng s bt u bng 100. Cu lnh printf s in
ra gi tr 102 bi v n l dng th 3 ca chng trnh sau cu lnh #line 100.
#include <stdio.h>
#line 100
/* reset the line counter */
int main(void)
/* line 100 */
{
/* line 101 */
printf("%d\n",__LINE__); /* line 102 */
return 0;
}

10.8. Ton t tin x l # v ##


Hai ton t ny s dng vi #define. Ton t # (cn gi l chui ha), a
tham s vo du nhy kp. Xt v d sau:
#include <stdio.h>
#define mkstr(s) # s
int main(void){
printf(mkstr(I like C++));
return 0;
}
Ton t ny s bin dng:
printf(mkstr(I like C++));
thnh dng:
printf("I like C++");

Dng Hong Huyn

Ngn ng lp trnh C

166

Ton t ## (cn gi l ton t ghp) ghp hai th vi nhau. V d:


#include <stdio.h>
#define concat(a, b) a ## b
int main(void){
int xy = 10;
printf("%d", concat(x, y));
return 0;
}
Ton t ny s bin i:
printf("%d", concat(x, y));
thnh:
printf("%d", xy);

10.9. Cc macro nh ngha trc


C chun nh ngha 5 macro nh sau:
__LINE__
__FILE__
__DATE__
__TIME__
__STDC__
Macro __LINE__ v __FILE__ c gii thiu trong phn trn. Macro
__DATE__ cha mt chui c dng month/day/year l ngy chuyn i file ngun
thnh m.
Macro __TIME__ cha thi gian m chng trnh c bin dch. Thi
gian c biu din trong chui hour:minute:second.
Nu __STDC__ c nh ngha, trnh bin dch ch chp nhn nhng m C
chun m khng cha bt k mt m rng khng chun no.

10.10. Ch thch trong C chun


Ch thch bt u bi cp du /* v kt thc bi cp du */. Khng c
khong trng gia hai du * v du /. Trnh bin dch s b qua tt c cc vn bn
nm trong k hiu bt u v kt thc ch thch. V d chng trnh ny ch in ra dng
Khoa Cng ngh thng tin Trng i hc Quy Nhn

Chng 10. Tin x l v ch thch

167

ch hello trn mn hnh:


#include <stdio.h>
int main(void){
printf("hello");
/* printf("there"); */
return 0;
}
Ch thch c th xut hin trn nhiu dng. V d:
/* this is a
multi-line
comment */
Ch thch c th xut hin mi ni trong chng trnh, tuy nhin khng t ch
thch vo gia nh danh v t kha. V d ch thch sau l hp l:
x = 10+ /* add the numbers */5;
Ch thch sau khng hp l bi v n t vo gia t kha:
swi/*this will not work*/tch(c){ ...
Ch thch trong C chun khng lng nhau, ngha l ch thch khng cha ch
thch khc.
/* this is an outer comment
x = y/a;
/* this is an inner comment - and causes an error */
*/

10.11. Cu hi trc nghim v bi tp


10.11.1. Cu hi trc nghim
Cu 1. Gi s ta nh ngha mt macro nh sau: #define MAX 50, khi cu lnh
printf(Gia tri lon nhat: %d,MAX); s c thay th bng lnh no?
a.
b.
c.
d.

printf(Gia
printf(Gia
printf(Gia
printf(Gia

tri
tri
tri
tri

lon
lon
lon
lon

nhat:
nhat:
nhat:
nhat:

MAX);
%d,50);
50);
%d,MAX);

Cu 2. nh ngha mt macro tm s ln nht ca hai s a v b, ta chn lnh no:


Dng Hong Huyn

Ngn ng lp trnh C

168

a.
b.
c.
d.

#define
#define
#define
#define

MAX a>b?a:b
MAX(a,b) a>b?a:b
MAX(a,b) (a)>(b)?(a):(b)
MAX(ab) (a)>(b)?(a):(b)

Cu 3. Gi s c file mang.h ng dn: D:\Visual C++, chn file tiu n ny


vo chng trnh chnh ta s dng lnh no sau y?
a.
b.
c.
d.

#include
#include
#include
#include

<mang.h>
<D:\Visual C++\mang.h>
"D:\Visual C++\mang.h"
"mang.h"

10.11.2. Bi tp
Bi 1. To th vin dng chung bao gm cc hm lin quan n mng 1 chiu.
Bi 2. To th vin dng chung bao gm cc hm lin quan n mng 2 chiu.
Bi 3. To th vin dng chung bao gm cc hm lin quan n chui k t.
Bi 4. To th vin dng chung bao gm cc hm lin quan n s hc.
Bi 5. To th vin dng chung bao gm cc hm lin quan n s phc.
Bi 6. To th vin dng chung bao gm cc hm lin quan n phn s.

Khoa Cng ngh thng tin Trng i hc Quy Nhn

Ti liu tham kho

169

TI LIU THAM KHO


[1]. Herbert Schildt, C++: the complete reference, Fourth Edition, McGraw-Hill/
Osborne (2003).
[2]. Herbert Schildt, C++ from the Ground Up, Third Edition, McGraw-Hill/Osborne
(2003).
[3]. Herbert Schildt , C the complete reference, Fourth Edition, McGrawHill/Osborne (2000).
[4]. Herbert Schildt, The Art of C++, McGraw-Hill/Osborne (2004).
[5]. Brian W. Kernighan and Dennis M. Ritchie, The C programming Language,
Prentice-Hall (1988).
[6]. H. M. Deitel - Deitel & Associates, Inc., P. J. Deitel - Deitel & Associates Inc,
C++ How to Program, Eighth Edition, Prentice Hall (2012).
[7]. Charles Petzold, Programming Windows, Microsoft Press (1998).
[8]. Ivor Horton, Beginning Visual C++ 2008, Wiley Publishing (2008).

Dng Hong Huyn

You might also like