You are on page 1of 95

i hc quc gia h ni khoa cng ngh

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


v b duy

h ni thng 1 nm 2003

Gio trnh tin hc c s II - Ngn ng C

Bn c trn mng ca i hc Quc gia H Ni c php c, in v download ti liu ny t th vin in t ca Khoa Cng ngh v s dng nhng khng c php s dng vi mc ch v li. Bn quyn thuc nhm tc gi thc hin chng trnh Tin hc c s y l phin bn u tin, c th cn nhiu sai st. Chung ti mong nhn c kin ng gp ca bn c. Cc kin gi v theo a ch dkquoc@vnu.edu.vn hoc dkquoc@ahoo.com . Cm n bn c ng gp hon thin gio trnh. Thay mt cc tc gi o Kin Quc

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

Gio trnh tin hc c s II - Ngn ng C

I. M u
C l ngn ng lp trnh c thit k bi Dennis Ritchie ti phng th nghim Bell Telephone nm 1972. N c vit vi mc tiu chnh l xy dng h iu hnh UNIX. V th ban u n khng hng ti s tin dng cho ngi lp trnh. C c pht trin t mt ngn ng lp trnh c tn l B (B l ngn ng lp trnh c vit bi Ken Thompson ti Bell Labs, v tn ngn ng ly theo tn ca Bell Labs). C l ngn ng mnh v mm do, linh hot, n nhanh chng tr thnh ngn ng ph bin khng ch trong phm vi ca Bell, C c cc lp trnh vin s dng vit nhiu loi ng dng cc mc khc nhau. Cng v n c dng nhiu ni nn xut hin nhng c im khc nhau, cc phin bn pht trin khng thng nht. gii quyt vn ny, nm 1983 Vin tiu chun M (ANSI) thnh lp mt chun cho C v c tn ANSI C (ANSI standard C). Ni chung cc chng trnh dch C ngy nay u tun theo chun ny ngoi tr mt s khc bit nh. Hin nay c rt nhiu ngn ng lp trnh bc cao nh C, Pascal, BASIC,.. mi ngn ng u c im mnh ring ca n v ph hp cho mt s lnh vc no , C cng khng ngoi l, C c ph bin bi n c cc c im sau:
C l ngn ng mnh v mm do. C th ni rng s hn ch ca C ch ph thuc vo ngi lp trnh, tc l vi C bn c th lm tt c nhng iu theo tng ca bn. C c dng cho nhng d n t nh ti ln nh: H iu hnh, ho, Chng trnh dch,... C d chuyn i sang h h thng khc (tnh kh chuyn), tc l mt chng trnh C c vit trn h thng ny c th d dng dch li chy c trn h thng khc

C l ngn ng c ng, s lng t kho khng nhiu.

C l ngn ng lp trnh cu trc. M lnh ca chng trnh C c vit thnh cc hm, cc hm ny c th s dng li trong cc ng dng khc.

Vi cc c im trn C l ngn ng tt cho vic hc lp trnh, hn na sau ny chng ta cn c th tip cn vi lp trnh hng i tng, v mt trong nhng ngn ng lp trnh chng ta la chn u tin cho lp trnh hng i tng l C++, nhng kin thc v C vn c ch cho bn v C++ l ngn ng c pht trin t C v b sung c tnh hng i tng.

I.1. Bng ch ci, tn v t kho


Bng ch ci: Mi ngn ng lp trnh u c xy dng t mt b k t no v cc quy tc trn xy dng cc t, cc cu lnh v cu trc chng trnh. Ngn ng lp trnh C s dng b k t ASCII (American Standard Code for Informations Interchange). Theo chun ny, b k t gm c 256 k t l:

Gio trnh tin hc c s II - Ngn ng C

Cc ch ci: A,..,Z, a,..,z Cc ch s: 0,..,9 Cc du php ton s hc: +,-,*,/,... Cc du ngoc: (, ), [, ],... Cc k t khc

Mi k t c tng ng 1 s duy nht gi l m, trong c 128 k t u (c m t 0 ti 127) l k t c nh v 128 k t cn li (c m t 128 ti 255) l cc k t m rng, tc l n c th thay i tu theo ngn ng mi quc gia s dng. T kho v tn: Tn l mt xu (dy) cc k t, trong ngn ng lp trnh ni chung u yu cu tn phi tun theo nhng rng buc nht nh.

Vi C tn l xu k t ch c th gm - cc ch ci - ch s - du gch ni Tn phi bt u bng ch ci hoc du gch di, di khng qu 32 k t, khng c trng vi t kho ca ngn ng. V v C phn bit ch hoa v ch thng nn cc tn ch hoa nh XY v xy l khc nhau. Mi ngn ng u c ring mt tp cc t vi ngha c bit l cc t kho, chng c dng vi mc ch nh trc nh tn kiu d liu, tn ton t,.. Sau y l mt s t kho ca C asm 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

I.2.Cc bc lp trnh gii bi ton


gii mt bi d mc no th bc u tin chng ta cng phi pht biu bi ton, tc l chng ta phi hiu bi ton yu cu g th mi c th tm c thut gii, v ci t thut ton v sau khi c chng trnh bn phi chy kim nghim tnh ng n ca n. Nh vy gii bi ton bng chng trnh chng ta theo cc bc sau: 1. Xc nh i tng ca chng trnh
5

Gio trnh tin hc c s II - Ngn ng C

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

Gio trnh tin hc c s II - Ngn ng C

Hnh 1 Cc bc pht trin chng trnh

Hin nay c rt nhiu chng trnh dch cho C v hu ht (trn nn DOS hoc Windows) trong c tch hp c trnh son tho, bin dch, lin kt - gi l mi trng tch hp. Trong gio trnh ny chng ta s dng BC (Borland C) hoc turbo C lm mi trng lp trnh.

Gio trnh tin hc c s II - Ngn ng C

II. Bin, hng v cc kiu d liu trong C


II.1.Bin

Khi nim

Bin l i lng c gi tr thuc mt kiu d liu no m c chp nhn bi ngn ng (xem phn cc kiu d liu), gi tr ca bin c th thay i trong thi gian tn ti ca bin (hay ta ni trong vng i ca bin). Cc thnh phn ca chng trnh s c lu trong b nh trong v bin cng khng ngoi l. Tc l bin cng c cp pht mt vng nh lu gi gi tr thuc mt kiu d liu xc nh. V th theo mt kha cnh no c th ni bin l mt ci tn i din cho nh trong my tnh, chng trnh c th truy xut nh (ly hoc ghi gi tr) thng qua tn bin. Mt bin ni chung phi c cc c trng sau: - Tn bin - Kiu d liu: kiu ca bin - Gi tr hin ti n ang lu gi (gi tr ca bin) ( tuy nhin sau ny chng ta thy trong C c bin kiu void, ban u coi y l bin khng kiu nhng dn quan nim cng l 1 tn kiu v l kiu khng xc nh)

Tn bin

Trong C cng nh cc ngn ng lp trnh khc cc bin u phi c tn, cc tn bin hay ni chung l tn (gm tn bin, tn hng, tn hm, hoc t kho) l mt xu k t v phi tun theo cc quy nh ca ngn ng l: Tn ch c th cha k t l ch ci (a ,..,z; A,..,Z); ch s( 0,..,9) v k t gch di (_), s k t khng qu 32.

K t u tin ca tn phi l ch ci hoc k t gch di

Trong tn phn bit ch hoa v ch thng. Tc l hai xu cng cc k t nhng khc nhau bi loi ch hoa hoc ch thng l hai tn khc nhau, v d nh vi 2 xu k t AB v Ab l hai tn hon ton phn bit nhau. Cc t kho ca ngn ng khng c dng lm tn bin, tn hng, hay tn hm. Hay ni khc i, trong chng trnh c th bn phi dng n tn, tn ny do bn t theo tng ca bn nhng khng c trng vi cc t kho.

V d cc tn hp l v khng hp l
Tn bin Percent hp l / khng hp l hp l 8

Gio trnh tin hc c s II - Ngn ng C y2x5__fg7h ho_ten _1990_tax A ngay-sinh double 9winter hp l hp l hp l hp l khng hp l v c k t -(du tr) khng hp l v trng vi t kho khng hp l v k t u tin l s

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

Gio trnh tin hc c s II - Ngn ng C

II.2. Hng

Khi nim
Hng l i lng c gi tr thuc mt kiu d liu nht nh, nhng gi tr ca hng khng th thay i trong thi gian tn ti ca n. C hai loi hng mt l cc hng khng c tn (chng ta s gi l hng thng) l cc gi tr c th tc thi nh : 8, hay 9.5 hoc d. Loi th hai l cc hng c tn ( gi l hng k hiu). Cc hng k hiu cng phi nh ngha trc khi s dng, tn ca hng c t theo quy tc ca tn. Sau y nu khng c iu g c bit th chng ta gi chung l hng

nh ngha hng
Cc hng c nh ngha bng t kho const vi c php nh sau: const <kiu_d_liu> <tn_hng> = <gi_tr>; hoc const <tn_hng> = <gi_tr>; Trong dng th hai, chng trnh dch t ng n nh kiu ca hng l kiu ngm nh, vi BC hay TC l int v nh vy chng trnh dch s t ng chuyn kiu ca <gi_tr> v kiu int. V d: const int a = 5; // nh ngha hng a kiu nguyn, c gi tr l 5 const float x = 4; // hng x kiu thc, c gi tr l 4.0 const d = 7; // hng d kiu int, gi tr l 7 const c = 1; // hng c kiu int gi tr = 49 const char * s = Ngon ngu C;// s l hng con tr, tr ti xu Ngo ngu C Cc hng s trong C c ngm hiu l h 10, nhng bn c th vit cc hng trong h 16 hoc 8 bng c php, gi tr s h 16 c bt u bng 0x, v d nh 0x24, 0xA1 cc s h 8 bt u bi s 0, v d 025, 057. Cc hng k t c vit trong cp du v d a, 2 cc gi tr ny c C hiu l s nguyn c gi tr bng m ca k t; a c gi tr l 97, B c gi tr bng 66. Cc xu k t l dy cc k t c vit trong cp , v d Ngon ngu C, a (xu k t s c gii thiu trong phn sau) Ch : Cc bin, hng c th c nh ngha ngoi mi hm, trong hm hoc trong mt khi lnh. Vi C chun th khi nh ngha bin, hng trong mt khi th dng nh ngha phi cc dng u tin ca khi, tc l trc tt c cc lnh khc ca khi, nhng trong C++ bn c th t dng nh ngha bt k v tr no.

10

Gio trnh tin hc c s II - Ngn ng C

II.3. Cc kiu d liu chun n gin trong C


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

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

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

11

Gio trnh tin hc c s II - Ngn ng C

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

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

Nhm cc kiu s thc gm: float, double, long double

Khun dng biu din ca s thc khng ging nh s nguyn. Mt s thc ni chung c biu din theo k php khoa hc gm phn nh tr v phn m.

Trong gio trnh ny chng ti khng c nh trnh by chi tit nh dng ca s thc. Bn c cn quan tm ti vn ny hy tham kho [3 - Chng 14]. Chnh v

12

Gio trnh tin hc c s II - Ngn ng C

khun dng khc m min gi tr ca s thc so vi s nguyn c cng kch thc cng khc. Kiu d liu s thc vi chnh xc n s thc vi chnh xc kp s thc di vi chnh xc kp tn kiu float double long double kch thc 4 byte 8 byte 10 byte (tr tuyt i)min gi tr 3.4e-38 -> 3.4e38 1.7e-308 -> 1.7e308 3.4e-4832 -> 1.1e 4932

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

II.4. Biu thc v cc php ton


Biu thc

13

Gio trnh tin hc c s II - Ngn ng C

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

Cc ton t (php ton) ca ngn ng C a. Php gn C php <bin> = <gi tr> Trong v tri l tn mt bin v v phi l mt biu thc c kiu ph hp vi kiu ca bin. Vi php gn h thng s c lng gi tr ca v phi sau gn gi tr vo bin bn tri. V d: int a, b; a = 5; b = a +15;
14

Gio trnh tin hc c s II - Ngn ng C

S ph hp kiu gia v bn phi v bn tri c hiu l hoc hai v cng kiu hoc kiu ca biu thc bn phi c th c chuyn t ng (p kiu) v kiu ca bin bn tri theo quy tc chuyn kiu t ng ca ngn ng C l t thp ti cao: char int long double. Tuy nhin trong thc t s p kiu ph thuc vo chng trnh dch, mt s chng trnh dch cho php t chuyn cc kiu s bn phi v kiu ca v tri bng m khng cn phi tun theo quy tc trn, bng cch ct b phn khng ph hp. V d bn c th gn bn phi l s thc (float) vo v tri l mt bin nguyn (int), trng hp ny chng trnh dch s ct b phn thp phn v cc byte cao, nhng kt qu c th khng nh bn mong mun. Vi C chng ta c th thc hin gn mt gi tr cho nhiu bin theo c php: <bin_1>=<bin_2> = ,..=<gi_tr> vi lnh trn s ln lt gn <gi_tr> cho cc bin t phi qua tri. b. Cc php ton s hc php ton + * / c php <th_1> + <th_2> <th_1> - <th_2> <th_1> * <th_2> <th_1> / <th_2> ngha php cng gia <th_1> v <th_2>l s thc hoc nguyn php tr gia <th_1> v <th_2>l s thc hoc nguyn php nhn gia <th_1> v <th_2>l s thc hoc nguyn php chia ly phn nguyn gia <th_1> v <th_2>l s nguyn. v d 9/2 kt qu l 4 / <th_1> / <th_2> php chia gia <th_1> v <th_2>l s thc v d 9.0/2.0 kt qu l 4.5 php chia ly phn d gia <th_1> v <th_2>l s nguyn v d 15 % 4 = 3; 12%3 =0 Trong cc php ton s hc ni trn, khi hai ton hng cng kiu th kt qu l s c kiu chung . Nu hai ton hng khng cng kiu (tr %) th ton hng c kiu nh hn s c t ng chuyn v kiu ca ton hng cn li, y cng l kiu ca kt qu.

<th_1> % <th_2>

15

Gio trnh tin hc c s II - Ngn ng C

c. Cc php ton so snh (quan h) php ton == != > c php th_1 == th_2 th_1> != th_2 th_1 > th_2 ngha so snh bng, kt qu ng nu 2 ton hng bng nhau, ngc li tr li sai. so snh khc nhau, kt qu ng nu 2 ton hng khc nhau, ngc li tr li sai. so snh ln hn, kt qu ng nu ton hng th nht ln hn, ngc li tr li sai. so snh ln hn hoc bng, kt qu ng nu ton hng th nht ln hn hay bng ton hng th 2, ngc li tr li sai. so snh nh hn, ngc ca >= so snh nh hn hoc bng, ngc vi >

>= < <=

th_1 >= th_2 th_1 < th_2 th_1 <= th_2

Trong phn cc kiu d liu chng ta khng c kiu d liu tng t nh boolean trong Pascal biu din cc gi tr logic (true, false). Vy kt qu cc php ton so snh m chng ta thu c ng, sai l g? Ngn ng C dng cc s biu th gi tr ng hay sai. Mt s c gi tr bng 0 nu dng vi ngha l gi tr logic th c xem l sai ngc li nu n khc 0 c xem l ng. Thc s th cc php so snh trn cng u tr v gi tr l s nguyn, nu biu thc so snh l sai s c kt qu = 0, ngc li nu biu thc so snh l ng ta thu c kt qu = 1. V d: 5 > 2 tr li gi tr = 1 5 <= 4 tr li gi tr = 0 a!=b tr li gi tr = 1 d. Cc php ton logic Php ton ! (ph nh): C php: ! <ton_hng>

16

Gio trnh tin hc c s II - Ngn ng C

vi <ton_hng> l biu thc s nguyn hoc thc, nu <ton_hng> c gi tr khc 0 th kt qu s =0 v ngc li, nu <ton_hng> ==0 th kt qu s = 1. Php ton && (php hi - and): C php: <ton_hng_1> && <ton_hng_2> trong 2 ton hng l cc biu thc s, kt qu ca php ton ny ch ng (!=0) khi v ch khi c 2 ton hng u c gi tr ng (!=0). <ton_hng_1> <ton_hng_2> 0 0 khc 0 khc 0 C php: <ton_hng_1> || <ton_hng_2> trong 2 ton hng l cc biu thc s, kt qu ca php ton ny ch sai (0) khi v ch khi c 2 ton hng u c gi tr sai (=0). <ton_hng_1> <ton_hng_2> 0 0 khc 0 khc 0 0 khc 0 0 khc 0 <ton_hng_1> || <ton_hng_2> 0 1 1 1 0 khc 0 0 khc 0 <ton_hng_1> && <ton_hng_2> 0 0 0 1

Php ton || (php tuyn - or):

e. Cc php ton thao tc trn bit Trong ngn ng C c nhm cc ton t m thao tc ca n thc hin trn tng bit ca cc ton hng v chng c gi l cc ton t trn bit, cc ton hng ca chng phi c kiu s nguyn.

Php & (php and theo bit - php hi)


C php: <ton_hng_1> & <ton_hng_2>
17

Gio trnh tin hc c s II - Ngn ng C

Chc nng ca ton t & l thc hin php and trn tng cp bit tng ng ca 2 ton hng v tr v kt qu. Tc l php ton tr v 1 s nguyn (cng kch thc vi 2 ton hng), bit th nht ca kt qu c gi tr bng bit th nht ca <ton_hng_1> hi vi bit th nht ca <ton_hng_2>,...

Bng gi tr chn l ca & V d int a,b, c; 1. nu a=7; b = 14; c = a & b; th c = 6; 2. nu a= 2; b = 15; c = a & b; th c = 0; 3. nu a=-2; b = 45; c = a & b; th c = 44; 4. nu a=-2; b = -3; c = a & b; th c = -4; (nu kt qu cc v d trn gy thc mc ti sao li nh vy th bn c c th tham kho: cch biu din s m, php AND trong phn hp ng)

Php | (php or theo bit)


C php <ton_hng_1> | <ton_hng_2> Kt qu ca tr v 1 s nguyn (cng kch thc vi 2 ton hng), cc bit ca gi tr tr v c tnh bng kt qu ca php tuyn (or) gia hai bit tng ng ca <ton_hng_1> vi <ton_hng_2>.

18

Gio trnh tin hc c s II - Ngn ng C

Bng gi tr chn l php tuyn | V d int a,b, c; 1. nu a=7; b = 14; c = a | b; th kt qu c = 15; 2. nu a= 2; b = 15; c = a | b =15;

Php ~ (php o bit)


y l ton t mt ngi thc hin o cc bit ca ton hng, cc bt gi tr 1 tr thnh 0 v bt gi tr 0 thnh 1. C php ~<ton_hng> V d: 1. unsigned char c =3, d; d = ~c; kt qu d = 252; 2. unsigned int c =3, d; d = ~c; kt qu d = 65532;

Php ^ (php XOR - tuyn loi tr)


Php tuyn loi tr trn hai bit l php ton xc nh nu hai bit (ton hng) khc nhau th kt qu theo php tuyn, nu hai bit c cng gi tr th kt qu l 0(loi tr). C php <ton_hng_1> ^ <ton_hng_2>

Bng gi tr chn l php tuyn loi tr ^ V d: 1. unsigned char c = 3, d=10; kt qu c ^ d = 2;


19

Gio trnh tin hc c s II - Ngn ng C

2. unsigned int c =10, d=10; kt qu c^d =0;

Php << (dch tri)


C php: ton_hng_1 << ton hng_2 Chc nng: dch tun t cc bit ca <ton_hng_1> sang tri s v tr dch bng gi tr ca <ton_hng_2>. Khi dch cc bit ca 1 ton hng sang tri 1 th: bit tri nht s b loi b, cc bit bn phi s tun t c dch sang tri 1 v tr, bit bn phi nht s c lp bng 0. Khi dch tri k bit mt s no c th coi l k ln lin tip dch tri 1.

Dch tri V d : char a =12,b; b = a<<1 th b = 24


Khi dch tri s a vi s bc l k, nu cha xy ra cc bit c gi tr 1 ca a b mt th kt qu s l a* 2k, nhng c kh nng khi dch tri k bit mt s a th mt s bit cao ca a s b loi, tng qut c th tnh gi tr nh sau: gi l l s bit caa th kt qu l( a * 2 k % 2l).

Php >> (dch phi)


C php
ton_hng_1 >> ton_hng_2 Lnh ny thc hin tng t nh SHL nhng dch cc bit ca <toan_hng_1> sang phi, cc bit bn tri s c in bng 0, cc bit bn phi s b ghi bi bit bn tri.

Minh ho ton t >> Khi dch s n sang phi k bit, kt qu thu c(n/2k)

e. Cc php ton tch lu (gn s hc) Trong cc biu thc ton s hc chng ta rt hay gp cc biu thc dng nh a = a +k, tc l chng ta tng a ln mt lng bng k, hoc nh a = a << k, tc l dch cc bt ca a
20

Gio trnh tin hc c s II - Ngn ng C

sang tri k v tr ri li gn vo a. Trong C c cc php ton thc hin chc nng ny v ta gi l cc php ton tch lu. C php chung: <ch> <tt>= <ngun>; Trong <ch> l mt bin thuc kiu s nguyn hoc thc, <ngun> l mt gi tr ph hp. <tt> l du php ton s hc hay trn bit (hai ngi): +,-,*,/,%, <<,>>,&,|,^ Vi ngha <ch> <tt>= <ngun> <ch> = <ch> <tt> <ngun> ton t += -= *= /= %= <<= >>= &= |= ^= v d v cch dng a += b a -= b a *= b a /= b a %= b a <<= b a >>= b a &= b a |= b a ^= b ngha a=a+b a=a-b a=a*b a=a/b a=a%b a = a << b a = a >> b a=a&b a=a|b a=a^b

Lu : hai k t <tt> v du = phi vit lin v tr thnh 1 du ton t ca ngn ng C. Bng cch dng ton t tch lu, trong mt s trng hp chng ta c th gim s phc tp (v cch vit) ca mt biu thc rt nhiu v nh vy s gim kh nng vit sai mt cch ng k. V d: a[f(i)+b[j*2]-srtlen(s)] = a[f(i)+b[j*2]-strlen(s)] +6; c vit thnh a[f(i)+b[j*2]-strlen(s)] += 6; f. Ton t iu kin C php: <bt>?<gt1>:<gt2> Trong <bt>, <gt1> v <gt2> l cc biu thc, nu <bt> c gi tr ng th kt qu ca biu thc l <gt1> ngc li nu <bt> c gi tr sai th biu thc tr li <gt2>. V d: (a>b?a:b) ngha ca biu thc trn l nu a >b th kt qu l a ngc li l b, tc l tr li gi tr ln nht ca a v b.

21

Gio trnh tin hc c s II - Ngn ng C

g. Php tng v gim 1 Vi biu thc dng a = a + 1 hoc a = a - 1 th trong C c dng khc vit ngn gn hn bng cch dng ton t ++ hoc --. Mi ton t ny li c hai dng khc nhau l ton t vit trc ton hng (gi l ton t trc) v dng ton t vit sau ton hng (gi l ton t sau - nh vy c 4 ton t). C php: <tn_bin> ++ ++<tn_bin> <tn_bin> ---<tn_bin> V d: int a=5,b,c=2; b= a++; c = ++ a +b; ngha ca ++ l tng ton hng (l bin) ln 1 n v v -- l gim ton hng 1. S khc nhau gia ton t trc v ton t sau c minh ho bng v d sau: a = 4; b = 2; c= b + a++ ; th sau khi thc hin ta c c = 6 v a = 5 hay x = b++; th b = 3 v x=2; nhng nu a = 4; b = 2; c= ++a +b ; th sau khi thc hin ta c c = 7 v a = 5 v x = ++b th x=3, b=3. Nh vy bn thy s khc nhau gia x= b++ ;(1) v x=++b (2); l trong (1) gi tr ca b c gn cho x trc khi n c tng 1, cn trong (2) th tng gi tr ca b ln 1 sau mi gn b cho x. Tc l c th hiu: x = b++ ; { x = b; b = b+1;} cn x = ++b ; { b = b+1; x = b; } Tng t cho ton t --; x = b-- ; { x = b; b = b - 1;} cn x = --b ; { b = b -1; x = b; } Vy : Trong biu thc n dng a++, ++a, b--, --b th ngha ca ton t trc v sau l nh nhau (cng l tng hay gim 1) Trong biu thc ni chung m c a++ (a--) hay ++b (--b) th gi tr ca a c s dng trong biu thc trc khi a c tng (gim) 1, v gi tr ca b c s dng sau khi b c tng (gim) 1.
22

Gio trnh tin hc c s II - Ngn ng C

Lu : Bn c th dng kt hp nhiu ln ton t ++, -- vi mt bin. V ++,-- c cng u tin v c kt hp t phi sang tri do vy cc php ton dng ++++a, ----a l c php trong khi a++++, a---- l khng c php. h. Ton t & - ly a ch Cc bin v hng l cc c lu trong b nh v c cp ti a ch no , ton t & tr li a ch ca mt bin hay hng. C php: hoc &<tn_bin> &<tn_hng>

i. Ton t * ( truy xut gi tr qua con tr) Phn trn chng ta bit * l php nhn, nhng n cn c ngha l ton t 1 ngi vi chc nng ly gi tr ca mt thnh phn thng qua con tr. C php: * <tn_con_tr> Nh vy vi mt bin c cp pht ti mt vng nh no trong b nh th chng ta c th truy xut gii tr ca n thng qua tn bin hoc qua a ch (con tr) ca n. Gi s pa l con tr v pa tr ti bin a (c kiu ph hp) th *pa chnh l gi tr ca a. v cch truy xut theo tn bin a hoc qua con tr *pa l nh nhau. V d: int a, b, c; int *p; p=&a; *p = 5; b = a + 3; c =*p -1; Sau cc lnh trn th a c gi tr l 5, b l 8 v c l 4 (truy xut a theo cch *p gi l truy xut gin tip thng qua con tr). j. Ton t , Du phy (,) thng c dng trong nh du phn cch gia cc bin, cc hng c khai bo trn cng mt dng, hoc gia cc tham s ca hm. Trong mt s trng hp no n c dng nh mt ton t to ra mt biu thc dng A,B (vi A, B l hai biu thc con hp l). Cc biu thc con c tnh t tri qua phi v gi tr ca biu thc con cui (bn phi) chnh l gi tr tr v ca ton biu thc. V d: a=5; b=6; c=2; x= (a+b, a *2 +c); kt qu x = 12 nhng nu x =a+b,a*2+c; th x =11. k. Php chuyn kiu Trong C cng nh mt s ngn ng lp trnh khc, trong mt biu thc th cc ton hng phi cng kiu. Tuy nhin trong thc t th khng th cng nhc nh vy, chng hn
23

Gio trnh tin hc c s II - Ngn ng C

cng mt s nguyn vi mt s thc r rng l khc kiu nhng bn vn c th thc hin c. Thc ra th trc khi thc hin ton t cng chng trnh dch thc hin thao tc chuyn i kiu ca s nguyn thnh s thc chng ta gi l php chuyn kiu (p kiu). Trong mt s tnh hung vic chuyn kiu trong C c th c chng trnh dch thc hin t ng (gi l p kiu t ng) hoc c p kiu kiu tng minh (ngi lp trnh vit cu lnh - ton t chuyn kiu). Ni chung s chuyn kiu t ng xy ra trong bn trng hp sau: Cc ton hng trong mt biu thc khc kiu. Gn mt biu thc vo mt bin khc kiu. Truyn tham s thc s khc kiu vi tham s hnh thc. Gi tr tr v ca hm sau cu lnh return khc vi kiu hm c khai bo. Trong trng hp th nht quy tc chuyn kiu t thp ln cao c p dng, tc l ton hng c kiu thp hn s c t ng chuyn thnh kiu ca ton hng cao hn theo trt t: char int long float double Trong ba trng hp cui kiu ca gi tr v phi c chuyn theo kiu ca bin bn tri, kiu cc tham s thc s c chuyn theo kiu ca tham s hnh thc, kiu gi tr tr v (sau return) phi chuyn thnh kiu ca hm. Lu l ch chuyn kiu gi tr tc thi ca ton hng ri thc hin php ton ch kiu ca bn thn ton hng th khng thay i. Trong mt s yu cu chng ta cn s chuyn kiu r rng (p kiu tng minh) ch khng s dng quy tc chuyn kiu ngm nh, trong trng hp ny bn c th s dng ton t chuyn kiu theo c php sau: (kiu_mi) (biu_thc) trong cu trc ny (kiu_mi) l tn mt kiu hp l no , v gi tr ca (biu_thc) tr v bt buc phi chuyn thnh (kiu_mi) V d 1: int a=5, b =2; float c; c = (float) a /b; th c c gi tr =2.5. nhng c= a/b ; th c li c gi tr =2.0 V d 2: float a =7.0; int b; b = (int)a % 3;

24

Gio trnh tin hc c s II - Ngn ng C

Trong C yu cu phi dng cp ngoc () bao tn kiu_mi, cn C++ th vi nhng kiu_mi l tn kiu n gin th khng bt buc phi dng cp (), v d trong C++ bn c th dng php chuyn kiu nh int (a). l. u tin cc ton t Trong biu thc c th c nhiu ton t, vy iu g gip cho chng trnh dch thc hin cc ton t mt cch ng n?. Trong cc biu thc nu c cc cp (), th n s quyt nh th t thc hin cc php ton: trong ngoc trc, ngoi ngoc sau. Nhng c nhng kh nng du ngoc khng c hoc khng quyt nh tt c cc trng hp th khi C thc hin cc ton t cn c vo u tin ca chng v s dng mt s quy tc v cc ton t (v d nh khi chng cng u tin th thc hin t tri qua phi hay t phi qua tri). V d vi cc php ton s hc +, - c cng u tin, nn nu trong biu thc c nhiu php ton +, - v khng c cc du ngoc quy nh th t thc hin th chng s c thc hin t tri qua phi. Nhng vi php ton ++, hay cc php gn,.. chng hn nh ++++ a; hoc a=b=c=d trnh t kt hp li t phi qua tri. Sau y l bng cc ton t v u tin ca chng, cc php ton trn cng dng (th t) c cng u tin, cc ton t trn dng c th t nh hn s c u tin cao hn, trong bng ny c mt s ton t khng c m t trong phn cc php ton nh [], (), ., -> chng s c m t trong cc phn thch hp.
STT

Cc php ton (), [], ->,. !, ~, & (a ch), * (truy xut gin tip), - (i du), ++, --, (p kiu), sizeof *(php nhn), /, % +, - (php tr) <<, >> (dch bit) <, <=, >, >= ==, != & (and trn bit) ^ | && ||
25

trnh t kt hp tri qua phi phi sang tri tri sang phi tri sang phi tri sang phi tri sang phi tri sang phi tri sang phi tri sang phi tri sang phi tri sang phi tri sang phi

1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.

Gio trnh tin hc c s II - Ngn ng C

13. 14. 15.

?: =, +=, -=, *=, /=, %=, <<=, >>=, &=, \+, ^=, |= , (du phy) ( bng u tin cc ton t)

tri sang phi phi sang tri tri sang phi

III. Chng trnh C


Trc khi ni n cu trc tng qut ca mt chng trnh ngun C, chng ta hy xem mt v d n gin sau y chng trnh in xu Chao cac ban! ra mn hnh 1: 2: 3: 4: 5: 6: 7: 8: } #include <stdio.h> #include <conio.h> void main() { clrscr(); printf("\n\n Chao cac ban !"); getch();

(trong on m ngun trn chng ta thm cc s dng v du : tin cho vic gii thch, cn trong chng trnh th khng c c chng) Trong chng trnh trn gm hai phn chnh l :

- Cc dng bao hm tp dng 1, 2; ng k s dng cc tp tiu . Trong chng


trnh ny chng ta cn dng hai file tiu stdio.h v conio.h.

- Hm main t dng 3 ti dng 8. y l hm chnh ca chng trnh , dng 3 l tiu

hm cho bit tn: main, kiu hm: void, v i ca hm (trong v d ny khng c i). Thn ca hm main bt u ngay sau du { (dng 4), v kt thc ti du } (dng 8).

26

Gio trnh tin hc c s II - Ngn ng C

III.1. Cu trc chng trnh Mt chng trnh C ni chung c dng nh sau 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: } [ cc nh ngha hm ca ngi dng] [ cc bao hm tp ] [ cc khai bo nguyn mu hm ca ngi dng ] [ cc nh ngha kiu ] [ cc nh ngha macro ] [ cc nh ngha bin, hng ] <kiu_hm> main ( [khai bo tham s ] ) { < thn hm main>

( trong c php trn chng ta thm s hiu dng v du: cho vic gii thch c thun li, cc thnh phn trong ngoc [] l cc thnh phn tu chn) a. Cc bao hm tp (dng 1) Trong chng trnh C (trong hm main cng nh cc hm khc do ngi lp trnh vit) c th s dng cc hm, hng, kiu d liu,..(gi chung l cc thnh phn) c nh ngha trong th vin ca C. s dng cc thnh phn ny chng ta phi ch dn cho chng trnh dch bit cc thng tin v cc thnh cn s dng, cc thng tin c khai bo trong tp gi l tp tiu (c phn m rng l H vit tt ca header). V phn cc bao hm tp l cc ch dn chng trnh gp cc tp ny vo chng trnh ca chng ta. trong mt chng trnh chng ta c th khng dng hoc dng nhiu tp tiu . C php ca mt dng bao hm tp: #include <tn_tp> hoc #include tn_tp trong tn_tp l tn c th c c ng dn ca tp tiu (.H) m chng ta cn s dng, mi lnh bao hm tp trn mt dng. V d: #include <stdio.h> #include <conio.h>

27

Gio trnh tin hc c s II - Ngn ng C

#include phanso.h S khc nhau gia cp <> v bao quanh tn tp l vi cp <> chng trnh dch tm tn tp tiu trong th mc ngm nh xc nh bi ng dn trong mc Option/Directories, cn vi cp chng trnh dch tm tp trong th mc hin ti, nu khng c mi tm trong th mc cc tp tiu ngm nh nh trng hp <>. b. Cc khai bo nguyn mu v nh ngha hm ca ngi dng Trong phn ny chng ti nu mt s thng tin v khai bo nguyn mu v nh ngha hm gii thch cu trc chng trnh ch khng c nh trnh by v hm, chi tit v hm s c trnh by trong phn v hm. Cc nguyn mu (dng 2) Nguyn mu mt hm l dng khai bo cung cp cc thng tin: tn hm, kiu hm, s i s v kiu tng i s ca hm. C php khai bo nguyn mu <kiu_hm> <tn_hm> ([ khai bo i ]); V d: int min (int, int); float binhphuong (float y); float giatri(int , float); Lu : Phn khai bo i ca nguyn mu, mc ch l xc nh s i s v kiu ca tng i s, do vy bn c th khng vit tn ca i s nhng kiu ca chng th phi c v bn phi lit k y kiu ca tng i. Cc nh ngha hm ca ngi dng (dng 10) Trong phn ny chng ta nh ngha cc hm ca ngi dng, mt nh ngha hm bao gm dng tiu ca hm v thn ca hm, vi c php nh sau: <kiu_hm> <tn_hm> ([ khai bo i ]) { < thn hm > } V d: int min(int a, int b) { if(a>=b) return b; else return a; }
28

Gio trnh tin hc c s II - Ngn ng C

Lu : - Tiu hm trong nh ngha hm phi tng ng vi nguyn mu hm - Nu trong chng trnh nh ngha hm xut hin trc khi gp li gi hm th c th khng nht thit phi c dng khai bo nguyn mu hm. c. nh ngha kiu mi (dng 4) Ngoi nhng kiu chun c cung cp sn ca ngn ng, ngi lp trnh c th nh ngha ra cc kiu mi t nhng kiu c bng cch s dng t kho typedef (type define) Vi c php nh sau typedef <m_t_kiu> <tn_kiu_mi>; Trong <tn_kiu_mi> l tn kiu cn to do ngi lp trnh t theo quy tc v tn ca ngn ng, v <m_t_kiu> l phn chng ta nh ngha cc thnh phn cu thnh ln kiu mi. V d: typedef unsigned char byte; typedef long nguyendai; Sau nh ngha ny cc tn mi byte c dng vi ngha l tn kiu d liu n tng t nh unsigned char, v nguyendai tng t nh long. V d: chng ta c th nh ngha bin a, b kiu byte nh sau byte a,b; d. nh ngha macro (dng 5) Khi nim macro l g? Gi s nh bn c mt ni dung (gi tr) no v bn mun s dng n nhiu ln trong chng trnh, nhng bn khng mun vit trc tip n vo chng trnh lc bn son tho v mt vi l do no (chng hn nh n s lm chng trnh kh c, kh hiu, hoc khi thay i s kh,..). Lc ny bn hy gn cho ni dung mt tn v bn s dng tn vit trong chng trnh ngun. Khi bin dch chng trnh, chng trnh dch s t ng thay th ni dung ca tn vo ng v tr ca tn . Thao tc ny gi l php th macro v chng ta gi tn l tn ca macro v ni dung ca n c gi l ni dung ca macro. Mt macro c nh ngha nh sau: #define tn_macro ni_dung Trong tn macro l mt tn hp l, ni dung (gi tr) ca macro c coi thun tu l 1 xu cn thay th vo v tr xut hin tn ca macro tng ng, gia tn v ni dung cch nhau 1 hay nhiu khong trng (du cch). Ni dung ca macro bt u t k t khc du trng u tin sau tn macro cho ti ht dng.

29

Gio trnh tin hc c s II - Ngn ng C

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

30

Gio trnh tin hc c s II - Ngn ng C

Lu : Cc thnh phn ca chng trnh m chng ta va nu tr hm main l thnh phn phi c v duy nht trong mt chng trnh C, cn cc thnh phn khc l tu chn, c th khng c hoc c nhiu. Th t cc thnh phn khng bt buc theo trt t nh trn m chng c th xut hin theo trt t tu nhng phi m bo yu cu mi thnh phn phi c khai bo hay nh ngha trc khi s dng. Cc bin, hng khai bo ngoi mi hm c phm vi s dng l ton cc (tc l c th s dng t sau lnh khai bo cho ti ht file chng trnh). Cc hng, bin khai bo trong 1 hm (hoc trong 1 khi) l thnh phn c b (c phm vi s dng trong hm hoc trong khi m thi). Cc hm trong C l mt mc (tc l trong hm khng cha nh ngha hm khc). V d: chng trnh nhp bn knh t bn phm, tnh v in din tch hnh trn
#include <stdio.h> #include <conio.h> #define PI 3.1415 float r; void main() { printf("\nNhap ban kinh duong tron r ="); scanf("%f",&r); getch(); }
//nhp s thc t bn phm vo r // Khai bo bin r c kiu float

printf("Dien tich = %5.2f", r*r*PI); //tnh v in din tch

III.2. Cu lnh v dng ch thch III.2.1. Cu lnh Trong chng trnh c th c nhiu cu lnh, mi cu lnh m nhim mt chc nng no . Trong C mt lnh ni chung c th vit trn mt hay nhiu dng (tr xu k t v macro) v kt thc bi du chm phy (;) v cng c th vit nhiu lnh trn mt dng, gia cc thnh phn ca lnh c th c cc du cch. V d: a = b +5; a =b+
31

Gio trnh tin hc c s II - Ngn ng C

5;
printf("Dien tich = %5.2f", r*r*PI);

Mt lnh c th vit trn nhiu dng nhng trong 1 xu k t hay nh ngha macro th chng ta phi vit trn 1 dng, trng hp nht thit phi vit trn nhiu dng th bn phi thm k t \ vo cui dng trn bo cho chng trnh dch ni ni dung dng di vo cui ca dng trn. V d
printf("Dien tich \ = %5.2f", r*r*PI);

III.2.2.

Lnh v khi lnh

Cc lnh ca chng trnh C bao gm 2 loi l cu lnh n v khi lnh (cu lnh ghp - nhm lnh). Cu lnh n l nhng lnh n gin (ch mt pht biu, kt thc bi ;) nh php gn, mt li gi hm,.. Khi lnh l nhm cc lnh c bao bi cp { v }, bn trong khi lnh l dy cc lnh c th l lnh n hoc khi lnh con khc, tc l khi lnh c th lng nhau, cc du mc { v } phi xut hin tng ng theo cp. V d: if (a>0) { d = b*b - 4*a*c; if(d>=0) { x1 = (-b - sqrt(d))/(2*a); x2 = (-b + sqrt(d))/(2*a); printf( nghiem x1 = %4.2f, x2 = %4.2f,x1,x2); } else printf(phuong trinh khong co nghiem thuc); } III.2.3. Li ch thch Trong chng trnh chng ta c th thm cc li ch thch gii thch cu lnh hoc chc nng ca chng trnh ,.. nhm cho chng trnh d c.

32

Gio trnh tin hc c s II - Ngn ng C

Cc ch thch c t gia cp /* v */, c th trn mt hoc nhiu dng. Vi cc chng trnh dch ca C++ bn c th s dng // ghi mt ch thch trong chng trnh, vi cch ny ni dung li ch thch bt u sau du // ti ht dng. Cc li ch thch ch c tc dng vi ngi c ch khng nh hng ti chng trnh, tc l chng trnh dch s b qua cc li ch thch. V d:
scanf("%f",&r); /*nhp s thc t bn phm vo r */ printf("Dien tich = %5.2f", r*r*PI); //tnh v in din tch

III.3. Nhp v xut d liu Trong phn ny chng ta gii thiu c php v ngha mt s hm c bn nhp d liu t thit b vo chun l bn phm v xut d liu ra mn hnh my tnh. s dng cc hm ni chung ca th vin bn phi bao hm cc tp tiu (tp .h) cha khai bo nguyn mu ca chng vo chng trnh. a. Mt s hm nhp d liu t bn phm

Hm getch, getche nhp 1 k t C php: int getch(); int getche(); Chc nng: Hai hm ny thc hin i ngi dng nhp mt k t t bn phm v tr v mt s nguyn l m ca k t c bm, v d bn g phm a th hm s tr v 97. S khc nhau gia hai hm l hm getche hin k t c nhp ln mn hnh, cn getch th khng. Khi phm c bm l phm m rng th h thng s y vo b m nhp liu 2 byte, byte th nht c gi tr 0, byte th 2 l m m rng ca phm . V d khi bn bm phm mi tn ln th hai byte c gi tr l 0 72 v hm getch hay getche tr v 0, byte c gi tr 72 vn cn lu trong b m nhp liu, nu ta gi getch hoc getche s nhn c gi tr ny. b. Hm scanf y l mt trong nhng hm nhp d liu ph bin nht ca C, n cho php nhp nhiu loi d liu (c cc kiu khc nhau). Khi nhp d liu bng hm ny bn phi xc nh a ch (vng nh, hay bin) lu d liu v kiu ca d liu cn nhp. c php int scanf(const char * format, ds_cc_con_tr); chc nng

33

Gio trnh tin hc c s II - Ngn ng C

Hm scanf cho php chng ta nhp d liu t bn phm theo khun dng c xc nh bi xu k t format, d liu nhp vo s lu vo cc bin hoc vng nh c a ch tng ng l cc con tr trong ds_cc_con_tr ( c th c nhiu con tr, mi con tr cch nhau bi du phy). V d: nhp gi tr cho 3 bin a c kiu int, x c kiu float, v b c kiu int

Trong c php trn format l mt xu quy nh quy cch d liu cn nhp, gm nhiu c t d liu tng ng vi cc kiu ca con tr trong phn ds_cc_con_tr, c bao nhiu con tr th cn ng by nhiu c t, c t th nht quy nh khun dng d liu cho con tr th nht, c t th 2 quy nh khun dng d liu cho con tr th 2,... Mi c t bt u bng du % c dng sau (cc thnh phn trong [] l tu chn): %[*][n]<k_t_nh_kiu> Trong - n l mt s nguyn dng quy nh di ti a (tnh theo s k t) c nhp cho thnh phn tng ng - <k_t_nh_kiu> l k t quy nh kiu d liu cn nhp v d bn mun nhp s nguyn kiu int th k t nh kiu l d, kiu k t l c. Cc k t nh kiu khc bn xem bng sau. K t nh kiu d D, ld e, E f g, G o O i I d liu nhp integer integer Float Float Float Octal Octal Decimal,octal, hex Decimal,octal, hex
34

kiu con tr ca i nhp liu int *arg long *arg float *arg float *arg float *arg int *arg long *arg int *arg long *arg

Gio trnh tin hc c s II - Ngn ng C

u U x X s c

Unsigned int Unsigned int Hexadecimal Hexadecimal Character string Character

unsigned int *arg unsigned long *arg int *arg int *arg char arg[] char *arg

- * y cng l thnh phn tu chn, nu c th tc dng ca n l s b qua mt thnh phn d liu c xc nh bi c t ny, nh vy s khng c i tng ng vi c t ny. V d: scanf(%d%*c%d,&a,&b); trong dng ny chng ta s nhp 1 thnh phn (gi l 1 trng) s nguyn vo a, sau b qua mt thnh phn l k t, v tip theo l mt s nguyn vo b. Quy cch nhp d liu Khi chng ta nhp d liu t bn phm, kt thc nhp bng Enter (), th tt c nhng k t chng ta g trn bn phm u c lu trong vng m nhp d liu (gi l dng vo- stdin) - dng vo kt thc bi (), d liu trn dng vo ny s c ct thnh tng trng tun t t tri qua phi v gn vo cc bin (hoc vng nh) xc nh tng ng bi cc con tr, cc phn tch c s b loi khi dng vo. Trc khi tch gi tr mt trng th cc khong trng pha trc ca trng nu c s b loi b. Nu trong c t khng c thnh phn (n) quy nh di ti a mt trng th cc trng c xc nh bi cc k t du cch, tab, enter (gi chung l khong trng k hiu l ) hoc khi gp k t khng ph hp vi c t hin ti. Nu trn dng vo c nhiu hn cc thnh phn yu cu ca hm nhp th cc thnh phn cha c nhn vn cn lu trn dng vo. V d: int a,b; float x; scanf(%d%%d%f,&a,&b, &x); vi dng vo l: 143 th : khong trng u tin b loi b, 143 l trng th nht c gn vo a, hai khong trng b loi b, 535 l trng th hai c gn vo b, mt khong trng b loi b, 34 c gn vo x ( cn li trong dng vo) 535 34

35

Gio trnh tin hc c s II - Ngn ng C

Nu trong c t c thnh phn xc nh rng ti a (n) th mt trng s kt thc hoc khi gp khong trng, hay k t khng ph hp hoc di n V d int a,b; float x; scanf(%d%2d%3f,&a,&b, &x); vi dng vo l: 143 th : Lu : S cc c t phi tng ng vi s con tr trong danh sch con tr K t nh kiu trong c t phi ph hp vi kiu ca con tr cn nhp liu. D liu nhp t bn phm phi ph hp vi cc c t. Hm scanf tr v s nguyn l s trng c nhp d liu khong trng u tin b loi b, 143 l trng th nht c gn vo a, hai khong trng b loi b, 53 l trng th hai c gn vo b, mt khong trng b loi b, 7 c gn vo x (cn li vo) 34 trong dng 537 34

c. Hm gets C php: char * gets(char * s); Chc nng ca hm gets l nhp mt xu k t t bn phm, khc vi hm scanf vi c t %s kt thc ni xu khi gp du cch hoc enter, tc l xu khng th c du cch, hm gets ch kt thc khi gp enter (k t \n). Xu k t c ghi vo s (vi s l mng cc k t hoc con tr k t), du kt thc xu (\0 - k t c m 0 ) c t ng thm vo cui xu. Hm tr v a ch ca xu c nhp. Ch : hm gets loi b k t Enter(\n) trn dng vo nhng k t ny khng c a vo s m t ng thm k t kt thc xu (\0) vo cui ca s. Mt s hm xut d liu ra mn hnh a. Hm printf Hm prinntf l hm in d liu ra mn hnh rt a dng ca ngn ng C. Cng nh hm scanf, hm printf cng yu cu chng ta phi cung cp cc gi tr v nh dng ca d liu cn in thng qua cc i ca hm.

36

Gio trnh tin hc c s II - Ngn ng C

C php int printf (const char * format [, <danh_sch_cc_gi tr>]); Trong : <danh_sch_cc_gi tr> l phn tu chn, nu c th l cc gi tr cn in, cc gi tr (c th l bin, hng, li gi hm, hay biu thc ni chung) cch nhau bi du phy. Lu : s gi tr trong <danh_sch_cc_gi tr> c th nhiu hn s cc c t, khi cc gi tr cui (khng c c t tng ng) s b b qua. format l xu k t iu khin, nhim v chnh ca n l iu khin khun dng thng tin c in ra mn hnh. V d:

Trong format gm ba loi: cc k t iu khin, cc c t, cc k t thng Cc k t iu khin y l cc k t c bit, bt u bng k t \ tip theo l 1 k t dng iu khin: chuyn con tr mn hnh, v tr in d liu,.. - \n : chuyn con tr mn hnh xung dng mi - \t : du tab - \b : (backspace) li mt k t (xo k t trc v tr con tr hin ti)

Cc k t thng L nhng k t khng thuc loi iu khin v c t, cc k t ny c in ra mn hnh ng nh n xut hin trong format. Ngoi ra cn c mt vi k t c bit m khi mun in ra mn hnh chng ta phi t n ngay sau k t \, l: - \\ : in chnh du \ - \ : in du nhy n() - \\ : in du nhy kp ()

Cc c t Trong format c th c nhiu c t, cc c t quy nh khun dng d liu cn in ra, mi c t c dng nh sau : %[-][n[.m]]<k_t_nh_kiu>

37

Gio trnh tin hc c s II - Ngn ng C

ngha cc thnh phn

Thnh phn <k_t_nh_kiu> y l k t quy nh kiu ca d liu cn in


v d bn mun in mt gi tr int th <k_t_nh_kiu> l d, bn mun in mt k t th k t nh kiu l c. Cc kiu khc c cho trong bng sau:

K t nh Kiu ca gi tr kiu cn in
d i o u x,X f e, E c s p int int int unsigned int int,unsigned float float char char * con tr

Khun dng in ra
s nguyn h 10 s nguyn h 10 s nguyn khng du h 8 s nguyn khng du h 10 s nguyn khng du h 16 s thc (dng du phy tnh) s thc (du phy tnh hoc k php khoa hc) k t xu k t in gi tr con tr dng Segment:Offset hoc Offset tu m hnh b nh c s dng

Lu : C th dng kt hp ld, lu, lx,.. nh kiu d liu in ra l s nguyn di (long), s nguyn di khng du (unsigned long),..

Thnh phn [n[.m]] : n, m l cc s nguyn dng, n quy nh rng ca thng


tin (tnh theo s k t) c in ra mn hnh, m s ch s cho phn thp phn (ch dng cho s thc), nu c m th s thc c lm trn vi m ch s thp phn. Nu rng thc s ca gi tr cn in < rng c dnh cho n (n) th cc du trng c thm vo (bn tri hay bn phi tu vo s c mt ca thnh phn [-] hay khng ). Lu : c th thay s n bng k t *, khi thng tin s c in ra theo ng rng thc s ca n. v d printf(%5.1f,1.37); s in ra 1.4 v chim 5 v tr trn mn hnh, bn tri ca s c in 2 du cch.

Thnh phn [-]: Xc nh kiu cn bn tri hay bn phi. Khi mt gi tr c in


ra trn mn hnh, nu rng thc s ca n nh hn rng xc nh bi thnh phn n, ngm nh chng c cn bn phi (trong vng n k t trn mn hnh), nu c du - th d liu c cn tri.

38

Gio trnh tin hc c s II - Ngn ng C

V d:

Gi tr tr v ca hm printf l tng di thng tin c in (tnh theo k t). V d 1: chng trnh nhp 1 k t t bn phm, in k t v m ca n ra mn hnh
#include <stdio.h> #include <conio.h> void main(){ int c; printf("\nHay nhap mot ky tu : "); c = getch(); printf("\nban vua nhap ky tu %c, co ma la %d ",c,c); printf("\nbam phim bat ky de ket thuc"); getch(); }

khi thc hin chng trnh trn chng ta s c:


Hay nhap mot ky tu : A
my in ra

bn nhp

ban vua nhap ky tu A , co ma la 65 bam phim bat ky de ket thuc

nh vy cng l gi tr c (m ca k t chng ta g t bn phm), nhng vi c t khc nhau s cho chng ta khun dng khc nhau (trong v d vi c t %d in ra 65, nhng vi %c li in ra k t A). V d 2: chng trnh nhp 2 s nguyn a, b t bn phm (b !=0), in tng, hiu, tch, thng phn nguyn a/b
#include <stdio.h> #include <conio.h> void main() { int a,b,c; printf("\nnhap a, b :"); scanf("%d%d",&a,&b); printf("\na+b= %5d \na-b= %5d", a+b, a-b); printf("\na*b= %5d \na/b= %5d", a*b, a/b); getch(); }

kt qu chy chng trnh l


39

Gio trnh tin hc c s II - Ngn ng C nhap a+b= a-b= a*b= a/b= a, b : 5 2 7 3 10 2

b. Hm putch C php: int putch(int ch); Chc nng: Hm ny in k t c m l ch ra mn hnh ti v tr hin ti ca con tr, chuyn con tr sang phi 1 k t, hm tr v s nguyn chnh l m k t in ra. V d: minh ho putch
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: #include <stdio.h> #include <conio.h> void main(){ int c; c = 97; printf("\nprint printf("\nputch c = 354; printf("\nprint printf("\nputch getch(); }

c = %d", c); c = "); putch(c); c = %d" , c); c = "); putch(c);

khi thc hin chng trnh trn cc bn s thu c kt qu nh sau:


s print c = 97 putch c = a c = 354 print c = 354 putch c = b

Cc bn bit l mt k t ch c kch thc 1 byte, nhng trong hm putch li c i l int (2 byte), trong trng hp gi tr ca ch >255 th k t c in ra l k t c m ( ch % 256), v y cng l gi tr m putch tr v. Cng ging nh vi printf mt s k t c bit c coi l k t iu khin ch khng phi k t in ra mn hnh. c. Hm puts C php: int puts(char * s);

40

Gio trnh tin hc c s II - Ngn ng C

Chc nng: Hm ny in xu k t s ra mn hnh ti v tr hin ti ca con tr, sau t ng chuyn con tr sang dng mi. Trong trng hp in thnh cng hm tr v s nguyn dng, ngc li tr v -1(EOF).

IV - Cc cu trc iu khin chng trnh


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

V d 1.2: Vit chng trnh nhp ba s thc a,b,c t bn phm l s o 3 cnh tam gic, sau tnh v in chu vi v din tch ca tam gic. Gii D liu vo : a,b,c kiu float l 3 cnh mt tam gic
41

Gio trnh tin hc c s II - Ngn ng C

Tnh ton

chu vi

p = (a+b+c),

din tch s = sqrt(q*(q-a)*(q-b)*(q-c)) vi q = p/2, sqrt l hm tnh cn bc 2 Chng ta c chng trnh nh sau:
#include <stdio.h> #include <conio.h> #include <math.h> void main() { float a,b,c, p,q,s; printf("Nhap so do 3 canh cua tam giac "); printf("\na = "); scanf("%f", &a); printf("\nb = "); scanf("%f", &b); printf("\nc = "); scanf("%f", &c); p = a+b+c; q = p/2; s = sqrt(q*(q-a)*(q-b)*(q-c)); printf("\n\nChu vi la %5.1f, dien tich la %5.2f ",p,s); getch();}

v d v kt qu thc hin chng trnh


Nhap so do 3 canh cua tam giac a = 3 b = 4 c = 5 Chu vi la 12.0, dien tich la 6.00

Lu : Trong chng trnh v d trn chng ta s dng hm tnh cn bc 2 sqrt, hm ny c khai bo trong tp tiu math.h Chng trnh trn cha x l trng hp a,b,c khng hp l (ba s a,b,c c th khng tho mn l 3 cnh mt tam gic) IV.2. Cu trc r nhnh Chng ta hy xem li chng trnh trong v d 2 trn, iu g xy ra nu d liu khng tho mn, tc l khi bn nhp 3 s a,b,c t bn phm nhng chng khng tho mn l s o 3 cnh mt tam gic trong khi chng trnh ca chng ta vn c tnh v in din tch.
42

Gio trnh tin hc c s II - Ngn ng C

R rng l c hai kh nng: Nu a,b,c tho mn l 3 cnh tam gic th tnh chu vi, din tch v in kt qu Ngc li phi thng bo d liu khng ph hp Nh vy cn phi c mt s la mt trong hai nhnh tu vo iu kin a,b,c c l ba cnh mt tam gic hay khng. iu ny gi l r nhnh, v C cung cp cho chng ta mt cu trc iu khin r nhnh if. C php dng

if (bt_E) S1; else S2;

hoc dng khuyt

if (bt_E) S1;

Trong c php trn S1, S2 ch l 1 lnh, <bt_E> l biu thc iu kin ca if S hot ng ca cu trc if: Trc ht biu thc iu kin <bt_E> c tnh, c hai kh nng: Nu gi tr ca <bt_E> l ng (!=0) th S1 c thc hin v ra khi cu trc if. Ngc li nu <bt_E> l sai th vi dng y : thc hin S2 ri kt thc if vi dng khuyt : kt thc cu trc if

43

Gio trnh tin hc c s II - Ngn ng C

V d 2.1: chng trnh nhp hai s nguyn a, b t bn phm, in s ln nht ra mn hnh. #include <stdio.h> #include <stdio.h> void main() { int a,b; printf(\nNhap so thu nhat : ); scanf(%d, &a); printf(\nNhap so thu hai : ); scanf(%d, &b); if (a>b) printf(\nSo lon nhat la %d, a); else printf(\nSo lon nhat la %d, b); getch(); } V d 2.2: Vit chng trnh theo v d 1.2 vi yu cu nu a,b,c tha mn l 3 cnh mt tam gic th tnh v in chu vi, din tch, nu khng tho mn th in thng bo ra mn hnh. Gii: Chng ta bit 3 s a, b, c l 3 cnh mt tam gic nu n tho mn tnh cht tng hai cnh ln hn cnh th ba. Theo cch tnh t v d 1.2 chng ta c chng trnh:
#include <stdio.h> #include <conio.h> #include <math.h> void main() { float a,b,c, p,q,s; printf("Nhap so do 3 canh cua tam giac "); printf("\na = "); scanf("%f", &a); printf("\nb = "); scanf("%f", &b); printf("\nc = "); scanf("%f", &c); if(a+b>c)&&(a+c>b)&&(b+c>a) { p = a+b+c; q = p/2; s = sqrt(q*(q-a)*(q-b)*(q-c)); printf(" \n\nChu vi la %5.1f,\ dien tich la %5.2f ",p,s); } else printf(\nBa so da cho la ba canh tam giac); getch();} 44

Gio trnh tin hc c s II - Ngn ng C

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

tnh nghim x = -b/(2*a). Nu delta > 0 (phng trnh c 2 nghim x1,x2 ) x1 = (-b - sqrt(delta))/(2*a) x1 = (-b + sqrt(delta))/(2*a) Ngc li (delta < 0) phng trnh khng c thc

Ngc li

Chng trnh gii phng trnh bc 2


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

Gio trnh tin hc c s II - Ngn ng C } else printf("\nPhuong trinh khong co nghiem thuc"); }

IV.3. Cu trc switch Cu trc switch cho php la chn mt nhnh trong nhiu kh nng tu vo iu kin xy ra. C php nh sau
switch (<bt_E>) { case <bt_1>: S1 ; case <bt_2>: S2 ; ... case <bt_n>: Sn ; [ default : S ; }

Trong <bt_E> l biu thc nguyn. <bt_1>, <bt_2>,..,<bt_n> l cc biu thc hng, nguyn v chng phi khc nhau. S1,S2, .., Sn , S l mt hoc nhiu lnh c gi l thn ca cu trc switch. case, default l cc t kho S hot ng ca switch u tin <bt_E> c tnh, sau ln lt so snh gi tr ca <bt_E> vi cc biu thc hng <bt_1>, <bt_2>,..<bt_n>. Nu gi tr ca mt biu thc hng th k trong cc biu thc ny trng vi gi tr ca <bt_E> th chng trnh s thc hin cc lnh bt u t Sk v tip tc cc lnh pha di cho ti khi: gp cu lnh : break (tt nhin nu gp cc cu lnh return, exit th cng kt thc) gp du ng mc } ht cu trc switch

Nu <bt_E> khng trng vi gi tr no trong cc biu thc hng th cu lnh S (cc lnh sau mnh default nu c) s c thc hin, ri ra khi cu trc switch.
46

Gio trnh tin hc c s II - Ngn ng C

V d 3.1: Chng trnh nhp mt biu thc n gin dng ab (a, b l cc s nguyn, l mt trong cc du php ton s hc +, -, *, x, /, :,) tnh v in kt qu. Gii : y chng ta gi s c th dng php nhn l du * hoc ch x, php chia c th l du : hay /. Gi thit ngi dng nhp biu thc ng dng ab. Chng ta c chng trnh nh sau:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27:

#include <stdio.h> #include <conio.h> void main() { int a,b; char tt; // du ton t printf("\nnhap bieu thuc don gian :"); scanf("%d%c%d",&a,&tt,&b); switch(tt) { case '+': printf("\n %d %c %d = %d ",a,tt,b, a+b); break; case '-': printf("\n %d %c %d = %d ",a,tt,b, a-b); break; case 'x': case '*': printf("\n %d %c %d = %d ",a,tt,b, a*b); break; case ':': case '/': if(b!=0) printf("\n %d %c %d = %d ",a,tt,b, a/b); else printf("loi chia cho 0"); break; default: printf("\n\nkhong hieu phep toan %c",tt); } getch(); }

Trong chng trnh v d ny nu bn nhp biu thc v d nh 9+2 tc l ta c a=9, b=2, tt (du ton t) = +. Nh vy mnh case + (dng 11) ng, chng trnh thc hin cu lnh printf("\n %d %c %d = %d ",a,tt,b, a+b); break; v chng trnh in ra kt qu 9 + 2 = 11 v thot khi cu trc switch (nhy ti dng 26)
47

Gio trnh tin hc c s II - Ngn ng C

Nu bn nhp 9*2 hoc 9x2, th s hot ng cng tng t v kt qu in ra l 9 * 2 = 18 hoc 9 x 2 = 18 Nu bn nhp khng ng php ton hoc khng ng khun dng th mnh default c thc hin v bn s nhn c thng bo khong hieu phep toan... Lu : Khi ht cc lnh (Si) tng ng ca mnh case <bt_i> nu khng c cu lnh break (hoc mt lnh kt thc khc) th iu khin c chuyn ti lnh Si+1 m khng cn kim tra biu thc hng <bt_i+1> c bng <bt_E> hay khng. Mnh default c th xut hin ti v tr tu trong thn ca switch ch khng nht thit phi l cui ca cu trc ( tt nhin khi cn cu lnh break). Cu trc switch c th lng nhau hoc c th cha cc cu trc iu khin khc. IV.4. Cu trc while while l cu trc iu khin lp thc hin mt lnh hay khi lnh no vi s ln lp c xc nh tu theo mt iu kin (gi l iu kin lp). Cu trc ca while nh sau: while (<bt>) S; Trong bt l mt biu thc no l biu thc iu kin lp, S l thn ca while v ch l mt cu lnh. S hot ng ca while nh sau: bc 1: tnh gi tr ca <bt> bc 2: nu gi tr tnh c ca <bt> l sai (==0) th kt thc while bc 3: nu gi tr ca <bt> l ng (!=0) th thc hin S bc 4: quay li bc 1 ta c s iu khin ca while nh sau

V d 4.1: Tm c s chung ln nht ca 2 s nguyn x, y theo thut ton sau: a = x; b = y; b1: nu (a = b) th c s chung ln nht l a, kt thc

48

Gio trnh tin hc c s II - Ngn ng C

ngc li (a !=b) th ti bc 2 b2:

nu a > b th ta tnh a = a- b ngc li ta tnh b =b a quay li bc 1

Nh vy chng ta c th pht biu nh sau Chng no (a !=b) th lp li nu a >b th a = a-b ngc li b = b -a kt thc vng lp ny th a=b v l c chung ln nht ca x v y. ch xt trng hp x, y l s nguyn >0. Trong trng hp nu mt trong hai s bng 0 th c s chung ln nht l tr tuyt i ca s cn li, nu c 2 s bng 0 th khng xc nh c c s chung ln nht. chng ta c chng trnh sau
#include <stdio.h> #include <conio.h> #include <math.h> void main() { int a,b,x,y; printf("nhap 2 so x, y : "); scanf("%d%d", &x,&y); a = abs(x); // a bng tr tuyt i ca x b = abs(y); // b bng tr tuyt i ca y if(a+b==0) printf("ca hai so bang 0"); else if(a*b==0) printf("uoc so chung lon nhat la %d ", a+b); else { while(a!=b) if(a>b) a-=b; else b-=a; printf("uoc so chung lon nhat la %d", a); } getch(); }

49

Gio trnh tin hc c s II - Ngn ng C

V d 4.2: Vit chng trnh cho php ngi s dng nhp mt k t trn bn phm, in k t v m ca n ra mn hnh, kt thc chng trnh khi ngi dng bm phm ESC (m 27) Gii: chng ta c th m t cc bc ca chng trnh nh sau 1: nhn 1 k t t bn phm, m lu trong bin ch ch= getch(); 2 : nu ch ==ESC th kt thc, ngc li chuyn sang bc 3 3 : in k t v m ca n printf(\nKy tu %c co ma %d, ch,ch) 4: quay li 1 Vy c chng trnh
// In ki tu #include <stdio.h> #include <conio.h> #include <math.h> const int ESC =27; // ma phim ESC void main(){ int ch; while((ch=getch())!=ESC) printf("\nKi tu %c co ma %d",ch,ch); }

Nhn xt: while l cu trc iu khin lp vi iu kin trc, tc l iu kin lp c kim tra trc khi vo thn ca vng lp, do vy nu biu thc iu kin c gi tr sai ngay t u th thn ca while c th khng c thc hin ln no. trong thn ca while phi c lnh lm thay i gi tr ca biu thc iu kin. Hoc nu biu thc iu kin lun c gi tr ng - chng ta gi vng lp khng kt thc, th trong thn ca while phi c lnh chm dt vng lp (xem lnh break). v d while (1) // biu thc iu kin lun ng { printf(\n Hay bam mot phim: ); ch = getch();
50

Gio trnh tin hc c s II - Ngn ng C

if(ch==27) break; printf(ky tu %c co ma la %d,ch,ch); } V d 4.3: Vit chng trnh nhp s nguyn n t bn phm, n <=10 v n >0, tnh v in gi tr n! (giai tha ca n), vi n! = 1*2*,..,*(n-1)*n Gii: Theo yu cu n nhp t bn phm phi tho mn n > 0 v n <=10, v vy nu n ngi dng nhp n khng hp l th chng trnh s yu cu nhp li, v s lp li vic nhp cho ti khi tho mn. Vic tnh gt = n! theo cc bc sau: gt = 1 ; i = 1; while ( i <=n) { gt = gt *i; i++; }
// giai thua #include <stdio.h> #include <conio.h> const int Max =10; // gii hn gi tr cn tnh void main(){ int n, i; long gt; printf("\nNhap n = "); scanf("%d",&n); while((n<=0)||(n>Max)) { printf("\nNhap lai n (0<n<=%d) : ", Max); scanf("%d",&n); } gt=i=1; while(i<=n) { gt*=i; i++; } printf("\nGia tri %d! = %ld",n,gt); getch(); }

V d 4.4: Vit chng trnh tnh v in S = 1 +1/(2!) +1/(3!)+..+1/(n!) vi n nhp t bn phm, 0<n<10.

51

Gio trnh tin hc c s II - Ngn ng C

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

52

Gio trnh tin hc c s II - Ngn ng C

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

V d 4.5: Vit chng trnh nhp s nguyn dng n t bn phm, hy kim tra v thng bo ra mn hnh s c l s nguyn t hay khng ? IV.5. Cu trc do .. while Cu trc while m chng ta kho st trn lun while kim tra iu kin lp trc khi thc hin thn ca n. Tc l i hi trc khi vo cu trc while chng ta phi xc lp c iu kin lp cho n. C l bn cng ng rng c nhng cu trc lp m thn ca n phi thc hin t nht mt ln, tc bc lp u tin c thc hin m khng cn iu kin g, sau cc bc lp tip theo s c xem xt tu vo trng thi ca bc lp trc . Vi tnh hung nh th th while khng thun li bng mt cu trc iu khin khc m C cung cp, l cu trc do while. Cu trc ca do while:

do S; while (<bt>);

Trong c php trn S l 1 cu lnh l thn ca vng lp, <bt> l biu thc iu kin c vai tr kim sot vng lp. S hot ng ca cu trc do while bc 1: thc hin cu lnh S bc 2: kim tra gi tr biu thc <bt>, nu c gi tr ng ( khc 0) th lp li bc 1, nu sai (=0) th kt thc vng lp.

53

Gio trnh tin hc c s II - Ngn ng C

V d 5.1: Vit chng trnh cho php ngi s dng nhp mt k t trn bn phm, in k t v m ca n ra mn hnh, kt thc chng trnh khi ngi dng bm phm ESC (m 27) Gii: tng t nh v d 4.2 nhng y chng ta s dng cu trc do, vy c chng trnh
// In ki tu #include <stdio.h> #include <conio.h> #include <math.h> const int ESC =27; // ma phim ESC void main(){ int ch; do{ printf(\n Hay nhap mot ki tu : ) ch = getch() printf("\nKi tu %c co ma %d",ch,ch); }while(ch!=ESC) }

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

54

Gio trnh tin hc c s II - Ngn ng C

pk = (-1)2kx 2k +1 /(2k+1)!
v

pk+1 = (-1)2k+1x 2(k+1) +1 /(2(k+1)+1)! = -pk * x2 /(2k*(2k+1))

Chng ta c s khi thut gii nh sau:

s khi tnh S sin(x)

55

Gio trnh tin hc c s II - Ngn ng C

cc bn c chng trnh tnh sin( x)


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

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

56

Gio trnh tin hc c s II - Ngn ng C

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

IV.6.

Cu trc for

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

57

Gio trnh tin hc c s II - Ngn ng C

C php

for([bt_1]; [bt_2]; [bt_3]) S;


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

s cu trc for

58

Gio trnh tin hc c s II - Ngn ng C

Nh trong c php cc bn thy cc biu thc (bt_1, bt_2, bt_3) ca for c th vng, hn na mi thnh phn (biu thc) li c th l mt hoc nhiu biu thc(n) phn cch nhau bi du phy (,) v d nh:

Nu <bt_1>, <bt_3> vng mt th n thun l cc lnh rng (khng thc hin g), nu chng c nhiu biu thc n cch nhau bi du phy th cc biu thc n c thc hin tun t t tri qua phi - thc ra vn c th coi y ch l mt biu thc, trong c cc ton t du phy (, ) v trt t tnh ton theo u tin ca cc ton t trong biu thc. Tng t nh bt_1, bt_3; biu thc iu kin trong trng hp n ch gm mt biu thc n th gi tr ca n quyt nh vng lp c cn c tip tc hay khng, nhng nu n c nhiu biu thc n v d nh: for(i=0, j= i +2; i<2,j <6; i++,j++) printf(\ni = %d, j = %d); th kt qu s l: i=0, j=2 i=1, j=3 i=2, j=4 i=3, j=5 Nh vy vng lp dng khng theo iu kin i <2 m theo iu kin j <6. Tc l gi tr ca biu thc bn phi nht trong danh sch cc biu thc quyt nh iu kin ca ca vng lp iu ny do ton t (, ) tr v ton hng bn phi. V d 6.1: Chng trnh in cc k t c m t 32 ti 255 trong bng m ASCII

59

Gio trnh tin hc c s II - Ngn ng C

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

Gii thch: trong chng trnh trn chng ta s dng vng lp for - biu thc khi u : i =32 - biu thc iu kin : i <256 - bc nhy i ++ nh vy vng lp s c thc hin 224 ln, mi bc lp nu (i 31)%10 ==0 th chng ta chuyn con tr xung dng mi (lnh trn dng 7) c ngha l c sau 10 bc th chng ta chuyn sang dng mi, vi mi i chng ta in k t c m l i cng gi tr ca n (lnh printf trn dng 8). V d 6.2: chng trnh nhp n s nguyn t bn phm, tm v in s ln nht, nh nht. Gii: Gi s chng ta c mt dy s a1, a2, .., an xc nh gi tr ln nht (gi l max) v s nh nht (min)chng ta thc hin theo cch sau: 1. max = min = a1 ( xem mt s u tin l ln nht v cng l nh nht) 2. i=2 3. nu i > n th th kt thc, ngc li th nu ai > max th max = ai ngc li, nu ai < min th min =ai i =i+1 4. lp li bc 3 Khi kt thc chng ta c gi tr ln nht l max, gi tr nh nht l min. Nhng cho ti by gi chng ta cha th lu c n s (trong yu cu ny chng ta cng khng cn phi lu chng) , v th chng ta thc hin theo phng php sau:
1: 2: 3: 4:

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

Gio trnh tin hc c s II - Ngn ng C

5:

ngc li, nu a < min th min =a i =i+1 lp li bc 4

Cc bn c chng trnh nh sau


#include <stdio.h> #include <conio.h> void main(){ int n,a,max,min,i; do{ printf("Nhap so phan tu cua day : "); scanf("%d", &n); }while(n<1); printf("Nhap so thu nhat : "); scanf("%d",&a); max=min=a; for(i=2; i<=n; i++) { printf("Nhap so thu nhat : "); scanf("%d",&a); if(a>max) max=a; else if(a<min) min =a; } printf("\n gia tri lon nhat = %d\n \ gia tri nho nhat = %d",max,min); }

V d 6.3 : Vit chng trnh gii bi ton sau: Trm tru trm c Tru ng n nm Trm nm n ba L kh tru gi, ba con mt c hi mi loi c my con Gii: R rng l c ba loi tru (phng trnh ba n) nhng ch c hai phng trnh l tng s s tru l 100 v tng s c cng l 100. Chng ta c d + n + g =100 (tng s tru) 5*d + 3 * n + g/3 =100 (tng s c) (d: s tru ng, n : s tru nm, g : s tru gi) Nh vy bi ton ny khng c nghim duy nht, v nu c th ch ly nghim l cc s nguyn m thi.

61

Gio trnh tin hc c s II - Ngn ng C

y chng ta s dng cch kim tra cc b s gm 3 s nguyn dng (d,n,g) tng ng vi s tru ca tng loi vi d,n,g [1,..100], nu tho mn hai phng trnh trn th l mt nghim. Vy ta thc hin nh sau: // ti a ch c 20 tru ng Vi d = 1 ti 20 th thc hin // ti a ch c 23 tru nm Vi n = 1 ti 33 thc hin g = 100 d n ; // s tru gi nu (g%3==0) v (5*d + 3 * n + g/3 ==100) th in (d,n,g) l mt nghim #include <stdio.h> #include <conio.h> void main(){ int d,n,g; clrscr(); printf("\nCac nghiem la\n"); printf("\ntrau_dung trau_nam trau_gia\n"); for(d=1; d<=20;d++) for(n=1; n<=33; n++) { g=100-d-n; if((g%3==0)&&(5*d+3*n+g/3==100)) printf("%d \t %d \t %d\n",d,n,g); } }

Ch : Ngoi cc cu trc iu khin chng ta va nu trn, trong ngn ng C cn


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

62

Gio trnh tin hc c s II - Ngn ng C

IV.7.

Cu lnh continue v break

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

Ta c th minh ho break v continue nh sau: ..... while (bt_dk) { L1; break; L3; } L5; ....
minh ho s hot ng ca break

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


minh ho s hot ng ca break 63

Gio trnh tin hc c s II - Ngn ng C

Ch : Trong for khi gp continue th cc lnh pha sau continue ti ht khi b b qua v chuyn ti thao tc thc hin bt_3 ( bc nhy) sau bt u vng lp mi (kim tra iu kin). V d 6.4 : chng trnh nhp s nguyn dng n t bn phm, tm v in cc c ca n v tng cc c ra mn hnh.
#include <stdio.h> #include <conio.h> void main(){ int n,i, tonguoc=0; do{ printf("Nhap so n : "); scanf("%d", &n); }while(n<2); printf("\nCac uoc cua %d la\n",n); for(i=1;i<n/2; i++) { if(n%i) continue; printf("%d, ",i); tonguoc+=i; } printf("tong cac uoc la %d",tonguoc); }

--------------------Bi tp:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:

Nhp 2 s x, y, in bi s chung nh nht Nhp t s, mu s ca mt phn s, in phn s dng ti gin Gii phng trnh bc 2 c tnh nghim phc Tnh sin(x), cos(x) in ra cc s nguyn t 2..n Kim tra 1 s c l s chnh phng? Kim tra 1 s c l s hon chnh? Tm gi tr ln nht, nh nht trong 1 dy Nhp mt dy s, hy cho bit trt t dy Nhp mt s kim tra s c l s thuc dy fibonaxi hay khng? Nhp mt s nin cc s thuc dy fibonaxi <=n
64

Gio trnh tin hc c s II - Ngn ng C

V - Mng v con tr
V.1. Khi nim Mng
Mt bin (bin n) ti mt thi im ch c th biu din c mt gi tr. Vy c th lu tr c mt dy cc gi tr cng kiu chng hn nh cc thnh phn ca vector trong khng gian n chiu chng ta cn n bin a1, a2,..,an. rt cng knh v rt bt tin nht l khi n ln v li khng phi l c nh. Cc ngn ng lp trnh a ra mt khi nim mng gii quyt vn ny. Mng l mt tp cc phn t cng kiu d liu, cc phn t cng tn phn bit nhau bi ch s. Tng phn t ca mng c th s dng nh mt bin n, kiu ca mng chnh l kiu ca cc phn t. Cc thng tin v mng: Vi mt mng phi xc nh cc thng tin: tn mng, kiu cc phn t (kiu mng), s phn t trong mng (kch thc mng). V d nh chng ta ni a l mng c 20 phn t, kiu nguyn. Mng cng nh cc bin n khc trong ngn ng C, trc khi s dng n phi m bo l n c cp pht trong b nh v sn sng s dng

S chiu ca mng: trong v d chng ta nu trn v vector, chng ta c mt dy n cc s, nu nh chng ta dng mt mng lu tr cc s th chng ta cn mng c n phn t v ch cn 1 ch s xc nh cc phn t - y l mng mt chiu. Nu nh chng ta cn mt mng biu din mt bng c n dng, m ct, v xc nh mt phn t trong mng chng ta cn 2 ch s: ch s dng v ch s ct, nh vy chng ta c mng 2 chiu. Mt cch tng t chng ta cng c th c mng 3 chiu, 4 chiu,.. hay ni cch ngn gn hn: mng mt chiu l mng c mt ch s, mng 2 chiu c 2 ch s,...Trong gio trnh ny chng ta cng ch s dng n mng 2 chiu.

V.2. Mng 1 chiu


V.2.1 - nh ngha mng
C php Kiu_mng tn_mng [ s_phn_t]; Trong : Kiu_mng: y l kiu ca mng, l tn mt kiu d liu tn ti, c th l kiu chun hoc kiu d liu do ngi lp trnh nh ngha . tn_mng : l tn ca mng, do ngi lp trnh t, theo quy tc v tn ca C.

65

Gio trnh tin hc c s II - Ngn ng C

V d:

s_phn_t : l hng (hoc biu thc hng) nguyn, dng l s phn t ca mng.

int vector [15]; // tn mng: vector, c 15 phn t, kiu int float MT[10], D[20]; // c hai mng kiu float: MT c 10 phn t, D c 20 phn t char * s[30]; // s l mng c 30 phn t kiu char * (mng cc con tr)
Khi gp (dng lnh) nh ngha mt mng, chng trnh dch s cp pht mt vng nh (ln tip) cho cc phn t lin tip ca mng, v d vector[15] s c cp pht mt vng nh c kch thc 15*sizeof(int) =30 byte.

V.2.2 - Truy xut cc phn t


C php : tn_mng [ch_s] v d vector[1], MT[3], D[0]; ch_s l s th t ca phn t trong mng, cc phn t ca mng c nh ch s bt u t 0. Vi mng c n phn t th cc phn t ca n c ch s l 0, 1,..,n-1. v d mng vector c cc phn t vector[0], vector[1],...,vector[14] Lu : Cc chng trnh dch ca C khng bt li khi ngi dng truy xut phn t mng vt ra ngoi phm vi ca mng, tc l c ch s nh hn 0 hoc ln hn s_phn_t-1.

V.2.3 - Khi to gi tr cc phn t mng mt chiu


Cc phn t ca mng cng nh cc bin n, chng ta c th khi to gi tr ban u cho chng trn dng nh ngha mng (gi l khi u) vi c php sau: Kiu_mng tn_mng [ s_phn_t ] = {gt_0, gt_1,..,gt_k};
hoc

Kiu_mng tn_mng [ ] = {gt_0, gt_1,..,gt_k}; Trong cc thnh phn Kiu_mng , tn_mng, s_phn_t nh trong phn nh ngha (V.1). gt_0, gt_1,.., gt_k l cc gi tr khi u (gi l b khi u) cho cc phn t tng ng ca mng, tc l gn tun t cc gi tr trong b khi u cho cc phn t ca mng t tri qua phi. Trong dng th nht, s gi tr trong bn khi u ch c th <= s phn t ca mng (k s_phn_t). Khi nhng phn t mng tha ra (khng c gi tr khi u) s t ng c gn bng 0 (trong trng hp mng s, nu l con tr s l NULL (rng) ). V d: int a[3] ={ 1,3,4}; th gi tr ca a[0] l 1, a[1] l 3, a[2] l 4.
66

Gio trnh tin hc c s II - Ngn ng C

int b[5] ={1,2};

th gi tr ca b[0] l 1, b[1] l 2, b[3]=b[4] l 0.

vi mng cc k t hoc xu k t th c hai cch khi u nh sau char c[4] ={a,b,c }; // c[0] l a, c[1] l b, c[2] l c, c[3] l \0 char s[10] =ABC; // tng ng vi char s[10] ={A,B,C,\0} (nu s gi tr trong b khi u > s phn t mng chng trnh dch s bo li) Trong dng th hai, chng ta khng xc nh s phn t ca mng, trong trng hp ny chng trnh bin dch s t ng xc nh kch thc (s phn t) ca mng theo s gi tr trong b khi u.
V d:

int a[] ={1,3,4}; th a l mng c 3 phn t, gi tr ca a[0] l 1, a[1] l 3, a[2] l 4.

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

ngc li cc bn cho chy theo th t t n-1 ti 0 chng s c cc phn t theo s th t ngc


for(i= n-1; i>=0; i--) printf("%d, ",A[i]);

Chng trnh minh ho nh sau:

67

Gio trnh tin hc c s II - Ngn ng C

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

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

\n");

\n");

(V d V.1: chng trnh nhp v in mng) V d V.2: Vit chng trnh nhp 2 mng A, B c n phn t (n<=10) cc s nguyn, tnh v in mng C = A+B. Gii: Vic nhp 2 mng A, B cng tng t nh trong v d trc. Mng C l tng ca A v B tc l cc phn t C[i] = A[i]+B[i] ( i =0,1,.., n-1).

68

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

printf("\nNhap mang B co %d phan tu \n",n); for(i=0; i<n; i++) { printf("B[%d]= ",i); scanf("%d",&A[i]); } // Tnh C=A+B for(i=0; i<n; i++) C[i]= A[i]+B[i]; printf("\nCac phan tu mang ket qua C la \n"); for(i = 0; i < n; i++) printf("%d, ",C[i]); getch();

(V d V.2 - Tnh tng 2 mng)

V.2.3 - Sp xp v tm kim trn mng mt chiu


Trong thc t chng ta rt hay gp yu cu phi sp xp mt dy cc phn t theo mt trt t no , hoc l tm kim mt phn t c trong mt dy cc phn t hay khng. Mt cch thun li nht (nu c th) l biu din cc phn t l mt mng cc phn t. Sp xp mng: Bi ton sp xp mng ni chung c pht biu nh sau: Cho mt mng c n phn t, v k l kho ca mi phn t, cc phn t c th so snh vi nhau theo kho k, hy sp xp mng theo th t tng (hoc gim) ca kho k.
69

Gio trnh tin hc c s II - Ngn ng C

Kho k chng ta c th hiu l mt thnh phn no ca cc phn t nh l tui ca mt ngi, hay im trung bnh hc tp ca mt sinh vin, hoc l mt tiu ch no p dng cho cc phn t ca mng. Trong trng hp n gin nh cc mng s m chng ta s ni trong v d sau y th kho k chnh l gi tr ca cc phn t. Hin nay c nhiu thut ton sp xp mt mng: thut ton ni bt, thut ton i ch, thut ton chn, thut ton chia i,.. trong gio trnh ny chng ti gii thiu ba thut ton sp xp n gin sp mt mng A c n phn t kiu s nguyn. a. Sp xp bng phng php ni bt tng ca phng php ny l c n phn t (bt nc) u c xu hng ni ln trn mt nc, th phn t no nh hn (nh hn) s c u tin ni ln trn. Tc l vi mi cp phn t k nhau nu phn t sau (di) nh hn phn t pha trc th phn t nh hn s ni ln trn, phn t nng hn s chm xung di. S thut ton sp xp mng A(n) nh sau:

(sp xp bng phng php ni bt)

b. Sp xp bng phng php i ch trc tip tng ca phng php ny cng rt n gin l: gi s cc phn t u mng A[0], A[1],.., A[i-1] c sp ng v tr tc l c: A[0] <=A[1] <=,..<A[i-1] <= min{A[i],A[i+1],..,A[n-1]} (i=0,1,..)
70

Gio trnh tin hc c s II - Ngn ng C

Cng vic tip theo l sp cc phn t cn li vo ng v tr ca n. Cc bn thy v tr th i l v tr u tin cha c sp, nu c sp th A[i] phi c gi tr nh nht trong cc phn t cn li {A[i],A[i+1],..,A[n-1]}, vy chng ta s duyt cc phn t mng trong phn cn li A[j] vi j =i+1 ti n-1, nu A[j] < A[i] th chng ta i ch A[i] vi A[j]. Nh vy phn t i c xp ng v tr. Vy chng ta thc hin lp cng vic trn vi i t 0 ti n-2 chng ta s c mng c sp.

(sp xp bng phng php i ch trc tip)

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

71

Gio trnh tin hc c s II - Ngn ng C

(sp xp bng phng php chn) V d V.3: chng trnh minh ho sp xp mng bng phng php ni bt
#include <stdio.h> #include <conio.h> void main(){ const max=10; int n,a[max], i,j,tg; do{ printf("Nhap so n : "); scanf("%d", &n); }while(n<2); printf("\nNhap mang co %d phan tu \n",n); for(i=0;i<n; i++) { printf("a[%d]= ",i); scanf("%d",&a[i]); } for(i = 0; i<n-1; i++) for(j =n-1; j>i;j--) if(a[j]<a[j-1]) { tg=a[j]; a[j]=a[j-1]; a[j-1]=tg;} printf("Mang sau khi sap la \n"); for(i=0;i<n; i++) printf("%d, ",a[i]);

72

Gio trnh tin hc c s II - Ngn ng C

Tm kim trn mng

Gi s cho trc mt mng cc s nguyn A(n), v mt s x. hy kim tra x c thuc mng A hay khng? Vi bi ton tm kim trn mng ni chung, chng ta phn hai trng hp: Trng hp 1: Mng A khng c trt t (cha c sp) th tm kim mt gi tr no th chng ta phi duyt tun t mng t phn t u tin cho ti khi gp gi tr hoc ti phn t cui cng th mi khng nh c gii tr c thuc mng hay khng. Nh vy trong trng hp km nht th s ln so snh l n. c th minh ho nh sau: // Nhp n, A(n), x i=0; while((i <n)&&(A[i] !=x)) i++; if(i >n-1) printf(%d khong co trong mang,x ); else printf(%d co trong mang tai vi tri %d, x, i); Trng hp 2: Mng A c sp (khng mt tng qut gi s tng dn), trong trng hp ny chng ta c th p dng phng php tm kim nh phn gim s bc phi so snh. tng l ta chia i mng A thnh hai phn, so snh x vi phn t gia ca mng A[g] xy ra ba trng hp :

A[g] = = x th kt lun x thuc vo A v kt thc A[g] > x th chng ta lp li vic tm x trong na cui ca mng A[g] < x th chng ta lp li vic tm x trong na u ca mng
Nh vy sau mt bc so snh chng ta c th gim s phn t cn duyt cn mt na. Nh vy s ln kim tra so snh trung bnh s gim so vi phng php duyt tun t. c th minh ho nh sau: // Nhp n, A(n), x // Mng A theo th t tng dn l = 0, r =n-1 ; while(l <= r) { g = (l+r)/2; if (A[g] > x) l = g+1 ; // lp timg trong na cui
73

// l, r ch s u, cui ca cc phn t cn duyt // ly phn t gia

if (A[g] ==x) printf( %d thuc vo mng ); return;

Gio trnh tin hc c s II - Ngn ng C

else r = g-1; // tim trong na u. } printf(%d khong co trong mang,x ); //....... V d V.4: Chng trnh sinh ngu nhin mt mng c n phn t, sp xp mng theo th t tng bng phng php chn, Nhp x t bn phm kim tra x c trong mng hay khng

V.3 - Mng 2 chiu


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

74

Gio trnh tin hc c s II - Ngn ng C

V.3.2 Truy xut cc phn t mng hai chiu


Mt phn t ca mng 2 chiu c xc nh qua tn (tn ca mng) v ch s dng, ch s ct ca n trong mng theo c php sau: tn_mng [csd][csc] Vi csd l s nguyn xc nh ch s dng v csc l s hiu ct cng nh trong mng 1 chiu cc ch s c tnh t 0. Tc l 0 csd sd-1 v 0 csc sc-1. Lu : Cc phn t ca mng 2 chiu cng c dng nh cc bin n, tr trng hp khi nhp gi tr cho cc phn t mng kiu float bng hm scanf th bn nn s dng bin (n) trung gian, sau gn gi tr ca bin vo phn t mng ch khng nn s dng ton t & nhp trc tip phn t ca mng.

V.3.3 Khi u gi tr cc phn t mng hai chiu


Cc phn t mng hai chiu cng c th c khi u gi tr theo c php (4 dng sau): 1. Kiu_mng tn_mng [sd][sc] = {{k_dng_1},{ k_dng_2},..,{ k_dng_k}}; 2. Kiu_mng tn_mng [ ][sc] = {{k_dng_1},{ k_dng_2},..,{ k_dng_k}}; 3. Kiu_mng tn_mng [sd][sc] = { gt_1, gt_2,...,gt_n }; 4. Kiu_mng tn_mng [ ][sc] = { gt_1, gt_2,...,gt_n }; C php trn c th gii thch nh sau: dng 1: c k b gi tr s c gn cho k dng u tin ca mng (k sd ), vi mi dng (c coi nh mng mt chiu) c khi to gi tr nh mng mt chiu: dng th nht c khi u bi {k_dng_1}, dng th hai c khi u bi {k_dng_1},.., dng th k c khi u bi {k_dng_k}. Yu cu k sd, ngc li chng trnh s bo li. Cc dng cui ca mng nu khng c b khi u tng ng th s c t ng gn gi tr 0 (hoc NULL nu l con tr). dng 2: (khng xc nh s dng) chng trnh dch s t ng n nh s dng ca mng bng s b khi u ( = k), sau thc hin khi u nh dng 1. dng 3: n gi tr trong b khi u c gn cho cc phn t mng theo cch: sc gi tr u tin trong cc gi tr khi u (gt_1,..,gt_sc) c gn tun t cho cc phn t ca dng th nht trong mng, sc phn t k tip s gn cho cc phn t dng th 2,... nu phn t no ca mng khng c gi tr khi u s c gn 0 (con tr l NULL) - vi iu kin n sd*sc, ngc li l li. dng 4: s dng ca mng s c chng trnh t tnh theo s gi tr trong b khi u theo cng thc sd = (n/sc) +1, v khi u nh dng 3. V d:

75

Gio trnh tin hc c s II - Ngn ng C

int a[3][2] = {{1,2},{3},{4,5}}; th cc phn t ca a nh sau: a[0][0]=1, a[0][1]=2, a[1][0]=3, a[1][1]= 0, a[2][0]=4,a[2][1]=5; int b[ ][2] = {{1,2},{3},{4,5}}; th l mng 3 dng, 2 ct cc phn t ca a nh sau: b[0][0]=1, b[0][1]=2, b[1][0]=3,b[1][1]= 0, b[2][0]=4,b[2][1]=5;

int c[ ][2] = {1,2,3,4,5}; th s dng ca c l mng 5/2 +1 =3 dng, cc phn t ca a nh sau: c[0][0]=1, c[0][1]=2, c[1][0]=3,c[1][1]= 4, b[2][0]=5,b[2][1]=0;

V.3.3 - Mt s v d v mng hai chiu


V d V.5: Chng trnh nhp mng A(n,m), 1 n,m 5, cc s nguyn t bn phm, in mng ra mn hnh theo yu cu cc phn t cng mt hng c in trn mt dng ca mn hnh, cc phn t cch nhau mt du trng.
#include <stdio.h> #include <conio.h> void main(){ clrscr(); //xa mn hnh const int max =5; // kch thc ti a int A[max][max]; int n,m,i,j; do{printf("\nNhap so dong cua mang = "); scanf("%d",&n); printf("\nNhap so cot cua mang = "); scanf("%d",&m); } while(n<1 || n>max|| m<1 || m>max); printf("\nNhap mang co %d dong, %d cot \n",n,m); for(i=0; i<n; i++) for(j=0; j<m; j++) { printf("A[%d][%d]= ",i,j); scanf("%d",&A[i][j]); } printf("\nCac phan tu mang la \n"); for(i=0; i<n; i++) { printf("\n"); for(j=0; j<m; j++) printf("%d ",A[i][j]); } getch();}

76

Gio trnh tin hc c s II - Ngn ng C

V d V.6: Chng trnh nhp 2 ma trn A(n,m), B(n,m), 1 n,m 5, cc s thc t bn phm, tnh in ra mn hnh ma trn C = A+B. Gii: Trc khi vit chng trnh chng ta lu n my vn :

C = A+B c ngha l cc phn ca C c tnh C[i][j] = A[i][j] + B[i][j] ch c th cng hai ma trn A,B cng kch thc v C cng cng kch thc vi A,B do cc phn t mng c kiu l float v vy khi nhp ta nn dng bin ph.
#include <stdio.h> #include <conio.h> void main(){ clrscr(); const int max =5; //s dng, ct ti a float A[max][max],B[max][max],C[max][max]; int n,m,i,j; float x; do{ printf("\nNhap so dong cua ma tran = "); scanf("%d",&n); printf("\nNhap so cot cua ma tran = "); scanf("%d",&m); } while(n<1 || n>max|| m<1 || m>max); printf("\nNhap A co %d dong, %d cot \n",n,m); for(i=0; i<n; i++) for(j=0; j<m; j++) { printf("A[%d][%d]= ",i,j); scanf("%f",&x);A[i][j]=x; } printf("\nNhap B co %d dong, %d cot \n",n,m); for(i=0; i<n; i++) for(j=0; j<m; j++) { printf("B[%d][%d]= ",i,j); scanf("%f",&x);B[i][j]=x; } for(i=0; i<n; i++) for(j=0; j<m; j++) C[i][j]=A[i][j]+B[i][j];

77

Gio trnh tin hc c s II - Ngn ng C

printf("\nCac phan tu ma tran C la for(i=0; i<n; i++) { printf("\n"); for(j=0; j<m; j++) printf("%4.1f ",C[i][j]); } getch(); }

\n");

( v d V.6 - chng trnh tnh tng 2 ma trn ) V d V.7: Chng trnh nhp ma trn A(n,n), 1 n,n 5, cc s nguyn t bn phm, sau kim tra v thng bo ma trn c i xng hay khng . Gii: Mt ma trn A l i xng trc ht n phi l ma trn vung v cc phn t ca n i xng nhau qua ng cho chnh, tc l A[i][j] =A[j][i]. Vy chng ta kim tra mt ma trn i xng theo cch sau: Vi mi i,j (0 i,j n-1) nu tn ti i,j m A[i][j] != A[j][i] th ta kt lun A khng i xng, ngc li A l i xng. Tt nhin chng ta khng cn phi xt mi cp (i,j) c th, v nu nh vy th: cp (A[i][j] A[j][i]), v (A[j][i], A[i][j]) thc cht l mt nhng li hai ln so snh phn t trn ng cho chnh A[i][i] c so snh vi chnh n.

V th chng ta ch xt cc ch s (i,j) m phn t A[i][j] nm thc s pha trn ca ng cho chnh. tc l ch cn xt cc cp phn t (A[i][j], A[j][i]) vi i chy t 0 ti n-1 v vi j chy t i+1 ti n-1 l . Hn na chng ta ch duyt cc cp (A[i][j], A[j][i]) nu cha pht hin c cp no khc nhau. Vy ta c th m t nh sau: d=0; // d l bin nh du ghi nhn c gp mt cp (A[i][j]!= A[j][i]) th d=1 for(i=0; (i<n) && (d= =0); i++) for(j= i+1; (j<n) && (d= =0); j++) if(A[i][j]!=A[j][i]) d=1; Kt thc on lnh lp trn ch c hai kh nng nu d=1 tc l c cp (A[i][j]!=A[j][i]) tc l ma trn khng i xng. ngc li,(d=0) th ma trn l i xng.

78

Gio trnh tin hc c s II - Ngn ng C #include <stdio.h> #include <conio.h> void main(){ clrscr(); const int max =5; // int A[max][max]; int n,d,i,j; do{ printf("\nNhap so dong, so cot cua ma tran = "); scanf("%d",&n); } while(n<1 || n>max); printf("\nNhap ma tran vuong cap %d \n",n,n); for(i=0; i<n; i++) for(j=0; j<n; j++) { printf("A[%d][%d]= ",i,j); scanf("%d",&A[i][j]); } for(i=0,d=0; (i<n)&&(d==0); i++) for(j=0; (j<n)&&(d==0); j++) if(A[i][j]!=A[j][i]) d=1; if(d) printf("\nMa tran khong doi xung"); else printf("\nMa tran doi xung"); getch(); }

(V d V.6 - kim tra ma trn i xng)

V.4 - Con tr v mng


Trong phn ny chng xem xt k hn v cc t chc ca mng trong b nh; lin h gia mng, cc phn t ca mng vi con tr, cc php ton trn con tr. Tuy nhin con tr l mt kiu quan trong ca C. Trong phn ny chng ti cha cp ti ht tt c cc kha cnh ca con tr nh cp pht ng, tryn tham s hm l con tr, danh sch lin kt. Cc ni dung ny s c gii thiu trong chuyn k hn v C.

V.4.1 - Con tr v cc php ton trn con tr


Trong phn u trnh by v kiu d liu v cc php ton chng ta cng cp ti kiu con tr, trong phn ny chng ta d cp chi tit hn v con tr v cc php ton c th s dng trn chng. Con tr l kiu d liu m mt thnh phn kiu ny c th lu tr a ch ca mt thnh phn no (c th l bin, hng, hm), hoc ta ni n tr ti thnh phn .

79

Gio trnh tin hc c s II - Ngn ng C

Mt con tr lu tr a ch ca mt thnh kiu T th ta ni p l con tr kiu T, c bit nu T l mt kiu con tr, hay ni cch khc, p lu tr a ch ca mt con tr khc th ta ni p l con tr tr ti con tr. C php khai bo con tr <kiu> * <tn_con_tr>; V d: int *p; // p l con tr kiu int float * q ; // q l con tr kiu float char *s ; // s l con tr kiu char hay xu k t int ** r; // r l con tr ti con tr kiu int Cng ging nh bin bnh thng khi khai bo mt bin con tr, chng trnh dch cng cp pht vng nh cho bin , lu rng gi tr trong vng nh ang l bao nhiu th quan nim l a ch m con tr ny tr ti. V vy cc bn phi ch khi dng con tr phi bo m n tr ti ng vng nh cn thit. Mt con tr cha lu tr a ch ca thnh phn no ta gi l con tr rng v c gi tr l NULL (l mt hng nh ngha sn thc ra = 0). Khi gp cc lnh khai bo bin trong chng trnh th chng trnh dch s cp pht vng nh ph hp v 'gn' tn bin vi vng nh . V d: int tuoi; float luong;

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


gi s a ch 1000

float luong;

float * p;

80

Gio trnh tin hc c s II - Ngn ng C

p = &luong;

*p = 650000

Khi con tr tr ti mt vng nh v d nh p tr ti luong th khi truy xut *p chnh l gi tr ca vng nh do p tr ti tc l *p luong. Vi con tr tr ti mt con tr khc chng hn nh v d sau: int a = 10; int *pa; int **ppa; pa = &a; // p tr ti a ppa = &pa; // ppa tr ti pa th chng ta c: *ppa pa &a; **ppa *pa a; Cc php ton trn con tr (a ch ) a. Php so snh hai con tr Trn con tr tn ti cc php so snh (= =, !=, <, <=, >,>=) hai con tr bng nhau l hai con tr cng tr ti mt i tng (c gi tr bng nhau), ngc li l khc nhau. Con tr tr ti vng nh c a ch nh hn l con tr nh hn.
81

Gio trnh tin hc c s II - Ngn ng C

b. Php cng con tr vi s nguyn Gi s p l con tr kiu T, k l s nguyn th (p + k) cng l con tr kiu T, khng mt tng qut gi s p tr ti phn t t th

p+1 l con tr tr ti mt phn t kiu T k tip sau t p+2 tr ti mt phn t kiu T k tip sau t 2 phn t,... p -1 l con tr tr ti mt phn t kiu T k tip trc t p -2 tr ti mt phn t kiu T k tip trc t hai phn t,... tng qut p+k tr ti phn t cch t mt khong k phn t kiu T (nu k >0 dch v pha a ch ln, k<0 th dch v pha a ch nh). int a; // gi s a c a ch 150 int *p; p = &a; th p+1 l con tr kiu nguyn v p+1 tr ti a ch 152; p + k tr ti 150 +2*k.

V d:

c. Php tr hai con tr Nu p, q l hai con tr cng kiu T th p-q l s nguyn l s cc phn t kiu T nm gia hai phn t do p v q tr ti. V d: int *p, *q; gi s p tr ti phn t c a ch 180, q tr ti phn t c a ch 160 th (p-q) = = 10; float *r1, *r2; gi s r1 tr ti phn t c a ch 120, r2 tr ti phn t c a ch 100 th (r1-r2) = = 5;

V.4.2 - T chc vng nh ca mng


Nh trong phn trn chng ta ni, khi c mt nh ngha mng th chng trnh bin dch cp pht mt vng nh (lin tip - cc nh lin k nhau) c kch thc bng tng kch thc ca cc phn t trong mng, cc phn t ca mng xp tun t trong b nh, phn t u tin c a ch thp nht trong vng , v y cng chnh l a ch ca mng, phn t th hai ca mng s l nh k st sau ( nh c a ch cao hn) phn t th nht,... y chng ta ni nh c th l 1 byte, 2 byte, 4 byte,.. ty theo kiu d

82

Gio trnh tin hc c s II - Ngn ng C

liu ca cc phn t mng l g (tng ng l 1,2,4,.. byte). V a ch ca nh l a ch ca byte u tin trong cc byte . V d 1: chng ta nh ngha mng A kiu nguyn: int A[5]; Chng trnh dch s cp pht mt vng nh 5 2 = 10 byte cho mng A, gi s rng vng nh c a ch l 100 (byte u tin c a ch l 100 ). th cc phn t ca A nh hnh sau:

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

Gio trnh tin hc c s II - Ngn ng C

D[0][m-1] c a ch l xxxx+2(m-1) (&D[0][m-1] = = xxxx +2(m-1)) D[1] c a ch l xxxx +2m D[1][0] c a ch l xxxx +2m (&D[0][0] = =xxxx+2m) D[1][1] c a ch l xxxx + 2m +2 (&D[0][1] = =xxxx + 2m+2) .... D[1][m-1] c a ch l xxxx+2m +2(m -1) (&D[0][m-1] = = xxxx +2m+2(m-1)) ... V d: int D[3][4]; Gi s D c cp pht ti vng nh c a ch 100 th cc phn t ca D nh sau:

Hn ch s phn t ca mng

Tuy rng ngn ng khng a ra con s c th gii hn cc phn t ca mng, nhng kch thc ca mng b hn ch bi cc yu t sau:

Cc phn t mng c cp pht lin tip, trong 1 on b nh (64kb), do vy tng kch thc ca mng 64kb (s_pt sizeof(kiu_mng) 65535) Kch thc mng c th cp pht ph thuc lng b nh t do m chng trnh dch c th cp pht c.

V d nu b nh t do (trong 1 on) c th cp pht cn li l 100 byte th nu l mng nguyn 1 chiu kiu int th kch thc ti a c th l 50, vi mng mt chiu kiu float th ch c th l 25 phn t,..

V.4.3 - Lin h gia con tr v mng


Trong C con tr v mng c lin h rt cht ch vi nhau, nh trn chng ta bit tn mng l mt hng con tr. Hn na cc phn t ca mng c th c truy xut thng qua ch s hoc thng qua con tr.
84

Gio trnh tin hc c s II - Ngn ng C

Nh trn chng ta bit, mng c cp pht ti vng nh no v a ch ca vng nh chnh l a ch ca mng. Tn mng l con tr tr ti chnh a ch ca n hay ni khc tn mng l con tr lu a ch ca mng, nhng l hng con tr. Chng ta gii thch c th hn qua v d sau: V d vi khai bo int A[3], D[2][5]; th A, D l cc con tr v: A chnh l a ch ca mng A, hay bng &A[0]; tng t cho mng D ta cng c D &D[0]. V theo nh cch gi ca con tr th ta ni A l con tr tr ti phn t u tin ca mng. Vi mng hai chiu D th cng tng t, D cng l mt con tr tr ti D[0], v D[0] li l mt con tr tr ti D[0][0], c th ni D l con tr tr ti con tr. Nh vy A l mng kiu int tc l cc phn t ca n c kiu int, v nh vy A l con tr kiu int, hay A c kiu l int *. Tng t, D[i] (n chung l cc hng ca mng D) l con tr kiu int, tc l D[i] c kiu l int *, v D l con tr tr ti D[0] - Cc D[i] l mng int[5], vy D l con tr kiu int [5]. Tn mng c th gn cho cc (bin) con tr c kiu ph hp. V d: vi cc con tr v mng sau int A[10]; int D[2][4]; int *p; int (*q)[4]; // khai bo q l con tr kiu int [4], chng ta c th thc hin cc php gn sau: p = A; q = D; p = D[i]; Truy xut cc phn t mng qua con tr Gi s A l mng mt chiu nh trn chng ta c: A l con tr tr ti A[0] hay A tng ng vi &A[0] (A +1) l con tr tr ti phn t kiu T k tip sau A[0] tc l A+1 tr ti A[1] hay (A+1) &A[1] Tng qut (A+i) &A[i]

Nh chng ta bit t trc l nu p l con tr lu a ch ca bin x th * p l gi tr ca x. Nh vy *A chnh l gi tr ca A[0], *(A+1) l A[1],... tng qut chng ta c *(A+i) A[i]

85

Gio trnh tin hc c s II - Ngn ng C

V d chng ta c th minh ha bng on lnh nhp v in cc phn t mng A nh sau: int A[10]; int i; .... // nhp mng A c 10 phn t for(i = 0; i<10; i++) { } // in mng A c 10 phn t, for(i = 0; i<10; i++) { } printf(A[%d] = , i); scanf(%d, *(A+i)); printf(A[%d] = , i); scanf(%d, A+i);

Vi mng 2 chiu D[n][m] cng tng t nh trn ta c: D l con tr tr ti hng du tin trong mng tc l: D &D[0] D[0] l con tr tr ti phn t u tin l D[0][0] hay D[0] &D[0][0] nn *D[0] D[0][0]; hay ** D D[0][0] (D[0]+j ) con tr ti phn t D[0][j], hay (D[0]+j) &D[0][j] nn ta c *(D[0]+j) D[0][j] hay *(*D+j) D[0][j] Tng t tng qut ta c (D+i) &D[i]. D[i] l con tr tr ti phn t u tin l D[i][0] hay D[i] &D[i][0] nn *D[i] D[i][0]; hay *(*D+i) D[i][0] (D[i]+j ) con tr ti phn t D[i][j], hay (D[i]+j) &D[i][j] nn ta c *(D[i]+j) D[i][j] hay tng qut ta c *(*(D+i)+j) D[i][j]
86

Gio trnh tin hc c s II - Ngn ng C

Bi tp
1. tch v hng 2 vector 2. Nhp mng, tm phn t ln nht, nh nht, trung bnh cc phn t dng, m 3. Nhp mng A(n), cc phn t l s nguyn, hy cho bit trt t ca mng 4. bi ton sp xp bng phng php chn v i ch 5. tm kim trn mng khng th t 6. tm kim trn mng c th t 7. in cc phn t khc nhau ca mng khng c th t 8. in cc phn t khc nhau ca mng c th t 9. ghp hai mng tng
10. Vit chng trnh nhp A(n,m), B(n,m), tnh v in C= A+B 11. Vit chng trnh nhp A(n,m), B(m,p), tnh v in C= A*B 12. Vit chng trnh nhp A(n,n) kim tra A c l ma trn i xng hay khng? 13. Vit chng trnh nhp A(n,n) kim tra A c l ma trn n v hay khng? 14. Vit chng trnh nhp A(n,n) kim tra A im yn nga hay khng? nu c hy in gi tr, ch s ca n. 15. Vit chng trnh xy dng ma trn xon c 16. Vit chng trnh xy dng ma phng bc l 17. Vit chng trnh tnh nh thc ma trn vung bng phng php kh 18. Vit chng trnh gii h phng trnh bc nht n n

87

Gio trnh tin hc c s II - Ngn ng C

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

tn_hm: l mt tn hp l theo quy tc v tn ca ngn ng C. mi hm c tn duy nht v khng c trng vi cc t kha. Tn hm s c dng gi hm. kiu_hm : Hm c th tr v mt gi tr cho ni gi, gi tr thuc mt kiu d liu no , kiu c gi l kiu hm. Kiu hm c th l kiu chun cng c th l kiu do ngi dng nh ngha. Nu hm khng tr v gi tr th kiu hm l void. Cc_khai_bo_kiu_tham_s: Hm c th nhn d liu vo thng qua cc tham s ca n (tham s hnh thc), cc tham s ny cng thuc kiu d liu xc nh. C th
88

Gio trnh tin hc c s II - Ngn ng C

c nhiu tham s, cc tham s cch nhau bi du phy (,). Trong nguyn mu khng bt buc phi c tn tham s nhng kiu ca n th bt buc. Nu hm khng c tham s chng ta c th trng phn ny hoc c th khai bo l void. V d:

int max(int a, int b); // khai bo nguyn mu hm max, c hai tham s kiu int, kt qu
tr v kiu int

float f(float, int); // nguyn mu hm f, c hai tham, tham s th nht kiu float, tham s
th 2 kiu int, kt qu tr v kiu float

void nhapmang(int a[], int ); // hm nhapmang, kiu void (khng c gi tr tr v), tham
s th nht l mt mng nguyn, tham s th 2 l mt s nguyn

void g(); // hm g khng i, khng kiu. VI.2 - nh ngha hm

C php: <kiu_hm> <tn_hm>([khai_bo_tham_s]) { < thn hm> } Dng th nht l tiu hm (dng tiu ) cha cc thng tin v hm: tn hm, kiu ca hm (hai thnh phn ny ging nh trong nguyn mu hm) v khai bo cc tham s (tn v kiu) ca hm, nu c nhiu hn mt th cc tham s cch nhau bi du phy(,). Thn hm l cc lnh nm trong cp { }, y l cc lnh thc hin chc nng ca hm. Trong hm c th c cc nh ngha bin, hng hoc kiu d liu; cc thnh phn ny tr thnh cc thnh phn cc b ca hm. Nu hm c gi tr tr v (kiu hm khc void) th trong thn hm trc khi kt thc phi c cu lnh tr v gi tr: return <gi tr>; <gi_tr> sau lnh return chnh l gi tr tr v ca hm, n phi c kiu ph hp vi kiu ca hm c khai bo trong dng tiu . Trng hp hm void chng ta c th dng cu lnh return (khng c gi tr) kt thc hm hoc khi thc hin xong lnh cui cng (gp } cui cng) hm cng kt thc. V d 1: Hm max tr li gi tr ln nht trong 2 s nguyn a, b void max (int a, int b) { if(a>b) return a; else return b; }
89

Gio trnh tin hc c s II - Ngn ng C

V d 2: Hm nhp mt mng c n phn t nguyn: tn hm: nhapmang gi tr tr v: khng tr v tham s: c hai tham s l mng cn nhp A v s phn t cn nhp N nguyn mu hm nh sau: void nhapmang (int [], int); nh ngha hm nh sau: void nhapmang (int A[], int N) { int i; printf("\nNhap mang co %d phan tu \n",N); for(i=0;i<N; i++) { printf("a[%d]= ",i); scanf("%d",&a[i]); } return ; }

VI.3 - Li gi hm v truyn tham s


Mt hm c th gi thc hin thng qua tn hm, vi nhng hm c tham s th trong li gi phi truyn cho hm cc tham s thc s (i s) tng ng vi cc tham s hnh thc. Khi hm c gi v truyn tham s ph hp th cc lnh trong thn hm c thc hin bt u t lnh u tin sau du m mc { v kt thc khi gp lnh return, exit hay gp du ng mc } kt thc hm. C php: <tn_hm> ([danh sch cc tham s thc s]); Cc tham s thc s phi ph hp vi cc tham s hnh thc:

s tham s thc s phi bng s tham s hnh thc. Tham s thc s c truyn cho cc tham s hnh thc tun t t tri sang phi, tham s thc s th nht truyn cho tham s hnh thc th nht, tham s thc s th 2 truyn cho tham s hnh thc th 2,.. kiu ca cc tham s hnh thc phi ph hp vi kiu ca cc tham s hnh thc. S ph hp y c hiu l kiu trng nhau hoc kiu ca tham s thc s c th p v kiu ca tham s hnh thc. int a=4, b=6,c; int D[10];
90

V d: gi s c cc hm max, nhapmang nh nh ngha trn

Gio trnh tin hc c s II - Ngn ng C

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

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

91

Gio trnh tin hc c s II - Ngn ng C

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

92

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

93

Gio trnh tin hc c s II - Ngn ng C

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

Gio trnh tin hc c s II - Ngn ng C

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

Ti liu tham kho

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

95

You might also like