You are on page 1of 17

1.

Khi nim chng trnh con Trong khi lp chng trnh chng ta thng gp nhng on chng trnh c lp i lp li nhiu ln nhng ch khc nhau trnh rm r, nhng on chng trnh ny c thay th bng cc chng trnh con tng ng v khi cn dng n ta ch cn lm th tc gi chng trnh con ra( vi cc tham s tng ng cn thit) m khng cn phi vit li c khc chng trnh ra. L do th hai xy dng chng trnh con l: mt vn ln v phc tp s tng ng mt chng trnh con c th rt ln, rt di vic nhn tng quan c chng trnh, hiu chnh, g ri s kh khn => ta c th phn tch vn phc tp ra thnh cc vn nh hn( tng ng nhng khi, nhng modul, chng trnh con) d kim tra, g ri tng khi mt v sau ghp li thnh chng trnh ln. vic chia nh chng trnh thnh cc modul c th v nh nguyn tc chia tr, chia d iu khin hay nh trong mt dy chuyn sn xut cng nghip ngi ta c th lp rp sn phm t cc bn thnh phm, t cc modul c ch to sn t ni khc chuyn n ( sn xut my bay l in hnh) Trong pascal chng trnh con: hm(function) v th tc (procedure) Hm: Function <tn hm>[(<ds tham s>)]:<kiu d liu>; [<khai bo>]; Begin [<thn hm>]; <tn hm> := <biu thc>; End;

V d: Chng trnh tnh tch ca hai s nguyn a v b. 1 2 3 4 5 Function Tich(a, b: integer): integer; Var Kq: Integer; Begin Kq := a*b; Tich := Kq;

End;

Th tc: Procedure <tn th tc>[(<ds tham s>)]; [<khai bo>]; Begin [<thn th tc>]; End; V d: Chng trnh tnh tch ca hai s nguyn a v b. 1 2 3 4 5 6 Procedure tt_Tich(a, b: integer); Var Kq: Integer; Begin Kq := a*b; Write(Tch ca , a, v , b, l , Kq); End;

Nhn xt: V hm hm tr v gi tr sau khi thc hin nn c lnh gn kt qu cho tn hm Tch := Kq; v cng chnh v vy nn sau khai bo tn hm c khai bo tm kiu d liu tr v Tich(a, b: integer): integer; Th tc khng tr v kt qu nn c cu lnh xut kt qu ngay trong th tcWrite(Tch ca , a, v , b, l , Kq); Trong chng trnh chnh, khi s dng hm v th tc cng cn ch : - V hm tr v mt gi tr thng qua tn gi ca n nn ta c th vit hm trong biu thc, hay xut ra trong cu lnh write. V d: + tich(2, 5) * 5 > cho kt qu 50 + write(tich(2, 5)) > in ra mn hnh gi tr 10

- Th tc khng tr v gi tr thng qua tn ca n do ta khng th s dng nh hm trong biu thc nh v d trn m ch c th gi th tc nh mt cu lnh c lp. V d: + Khi vit tt_Tich(2, 5); > s in ra mn hnh s 10 + Khi vit tt_Tich(2, 5) * 5 > Chng trnh dch bo li ! C khng ging pascal n ch c duy nht mt loi chng trnh con l hm, tuy nhin hm trong C cn c nhng c tnh t do thoi mi hn nhiu + gi tr ca hm c th khng dng n V d: hm printf() v hm scanf() Hai hm ny c gi tr l s nguyn tuy nhin khng my khi chng ta s dng n + hm c th chng c gi tr no gn vo tn hm V d: void + hm c th cung cp cc gi tr khng phi l v hng. + hm c th thay i gi tr i s ca n. Ngoi ra C cn cho php bin dch mt cch ring r cc modul thun li cho vic ct cc bi ton ln thnh cc modul ring r. 2. V d 1: cho hm y=f(x) = x2 + bx + c (x l s thc, b v c l s nguyn) 1 2 3 4 5 6 7 8 9 y=f_vidu(x, n, p); #include <stdio.h> main() { float f_vidu (float. int, int); /* mau ham prototype*/ float x=1.5; float y,z ; int n=3, P=5, q= 10;

10 11 12 13 14 15 16 17 18 19 20 21

printf(gia tri cua y = %f\n, y);

z=f_vidu(x+0.5, q, n-1); printf(gia tri cua z = %f\n, z); } /* khai bao ham*/ float f_vidu (float x, int b, int c) { float gia_tri;/* khai bao bien cuc bo*/ gia_tri = x*x + b*x +c; return gia_tri; }

Phn tch f_vidu tn hm, hm c 3 tham s cn a vo. u tin ta phi m t mu hm(prototype) ngay u chng trnh (sau hm main): tn hm, kiu cc tham s. Cn hm lm g ta hon ton cha bit v phi i n cui chng trnh mi c khai bo hm thc s Trong chng trnh chnh ta gi hm 2 ln vi cc tham s khc nhau. Ln gi 1: y=f_vidu(x, n, p); tham s thc s l x,n,p v c s tng ng 1-1 vi khai bo hm x tng ng vi x n tng ng vi b p tng ng vi c Ln gi 2:

z=f_vidu(x+0.5, q, n-1); tham s thc s l x+0.5,q,n-1 v c s tng ng 1-1 vi khai bo hm x+0.5 tng ng vi x q tng ng vi b n-1 tng ng vi c khai bo hm float f_vidu (float x, int b, int c)
Cc tham s hnh thc v kiu ca chng Kiu gi tr ca hm

ch : + Cui dng khng c du chm phy (;) ging nh lc khai bo hm main() + Cc tham s cch nhau bi du phy (,) Trong hm f_vidu ta thy bin gia_tri c khai bo, y c gi l bin a phng v n ch hot ng trong pham vi bn trong hm f_vidu. Bin ny nhn gi tr ca biu thc cn tnh l x*x + b*x +c Cui cng sau khi tnh xong gi tr ca hm, mt gi tr no ta phi tr li n cho tn hm bng lnh return gia_tri lnh ny tng ng vi cu lnh <Tn_hm> = <gi_tr>; Tc l f_vidu = gia_tri; 3. Mt s quy tc: 3.1 Tham s hnh thc v tham s thc s: Tham s hnh thc: l cc tham s dng khi khai bo hm Tham s thc s: l cc tham s c s dng khi gi hm

Tham s thc s c th l mt biu thc trong khi tham s hnh thc khng th l mt biu thc. Dy cc tham s thc s phi tng ng v kiu vi tham s hnh thc, tng ng v vai tr ca chng. 3.2 Lnh return lnh return c th tr li gi tr ca c mt biu thc. 1 float f_vidu (float x, int b, int c) 2 { 3 return (x*x + b*x +c); 4 } 5 Lnh return c th xut hin nhiu ln trong hm Lnh return c th xut hin nhiu ln trong hm 1 double tuyet_doi (double u. double v) 2 { 3 double s; 4 s=u+v; 5 if (s>0) return (s) 6 else return(-s) 7 } Nh vy lnh return khng ch cung cp gi tr cho tn hm m n cn c tc dng dng hm li kt thc hm, chuyn v ch gi n. Nu kiu ca biu thc trong lnh return khc vi kiu kt qu c khai bo trong phn u, C s t ng chuyn i kiu theo nguyn tc chung. 3.3 Hm khng tr li gi tr: Dng t kha void m t hm ln khai bo hm. V d: void ham_khong_co_gia_tri(int n);

3.4 Hm khng c tham s: khi khai bo ta cng dng t kha void m t s vic V d: float thi_du(void); 3.5 Cng c hm khng c c gi tr ln tham s: V d: void hien_thi(void); V d minh ha: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 #include <stdio.h> main() { /* mau ham prototype*/ void hien_thi_binh_phuong(int, int); void co_loi(void); int bat_dau=5, ket_thuc=10; hien_thi_binh_phuong(bat_dau, ket_thuc); if(.) co_loi(); } /* khai bao ham*/ void hien_thi_binh_phuong(int d, int f); { int i; for (i=d; i<=f; i++) printf(%d co gia tri binh Phuong %d\n, i, i*i); } void co_loi(void);

21 22 23

{ printf( *** co loi ***\n); } 3.6 Trng hp hm khng khai bo gi tr hm ngm nh nhn kiu gi tr int

V d: ham(float x); /*ham se nhan gia tri kieu int*/ 3.7 Cch vit c khai bo hm: float f_thidu(x, b, c) float x; int b,c; 4. Khai bo hm: Th t khai bo: main() { /* Khai bao nguyen mau (prototype)*/ .. /* goi ham */ } /* khai bao ham */ Tuy nhin ta c th khai bo trc ri mi n hm main() V d 1: 1 2 3 #include <stdio.h> /* khai bao ham */ float f_vidu (float x, int b, int c)

4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22

{ float gia_tri;/* khai bao bien cuc bo*/ gia_tri = x*x + b*x +c; return gia_tri; }

main() { /* float f_vidu (float. int, int); mau ham prototype khng cn c */ float x=1.5; float y,z ; int n=3, P=5, q= 10;

y=f_vidu(x, n, p); printf(gia tri cua y = %f\n, y);

z=f_vidu(x+0.5, q, n-1); printf(gia tri cua z = %f \n, z); }

V d 2: tnh giai tha n!=1*2*3(n-1)*n 1 2 3 4 5 6 7 #include <stdio.h> /* khai bao ham */ long giai_thua(int n) { int i; long int gt = 1; if (i>1)

8 9 10 11 12 13 14 15 16 17 18 19 20

for (i=2; i<=n; i++) gt = gt * i; return (gt); }

main() { int n; printf( c mt s t bn phm n = \n); scanf(%d, &n); /* in ra giai thua */ printf( \n n! = %ld \n, giai_thua(n)); }

V d 3: chuyn i ch thng thnh ch hoa s dng ton t iu kin 1 2 3 4 5 6 7 8 9 10 11 12 13 14 main() { char thuong, hoa; printf( c mt ki tu t bn phm :); scanf(%c, &thuong); #include <stdio.h> /* khai bao ham */ char chuyen_doi_chu_hoa(char ch) { char c2 ; c2= (ch >= a && ch <=z) ? (A-a+ch) : ch; return (c2); }

15 16 17

hoa = chuyen_doi_chu_hoa(thuong); printf( \n chu hoa tuong ung la %c \n, hoa); }

Ton t iu kin: c2= (ch >= a && ch <=z) ? (A-a+ch) : ch; c ngha: tnh ton biu thc (ch >= a && ch <=z) nu ng ( gi tr biu thc khc 0) th c2 = (A-a+ch) /* chuyn ch thanh chu hoa*/ ngc li c2 = ch V d 3: chuyn i ch thng thnh ch hoa, s dng hm if 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 main() { char thuong, hoa; printf( c mt ki tu t bn phm :); scanf(%c, &thuong); hoa = chuyen_doi_chu_hoa(thuong); printf( \n chu hoa tuong ung la %c \n, hoa); #include <stdio.h> /* khai bao ham */ char chuyen_doi_chu_hoa(char ch) { if (ch >= a && ch <=z) return (A-a+ch); else return (ch); }

18

V d 4: Hm xc nh mt s chn hay l 1 2 3 4 5 6 7 8 9 10 11 #include <stdio.h> /* khai bao ham */ int even(int n) { int result; if ((n%2)==0) result = 1; else result=0; return (result); } 5. Truyn tham s gi tr cho hm Vic truyn tham s cho hm trong C c thc hin theo mt kiu duy nht l truyn gi tr ngha l gi tr ca tham s thc s trc v sau khi gi hm l khng thay i. V d 1: 1 2 3 4 5 6 7 8 9 10 #include <stdio.h> main() { void hoan_vi(int a, int b); /* prototype*/ int n=10, p=20; printf( trc khi goi ham: %d %d\n, n, p); hoan_vi(n,p); printf( sau khi goi ham: %d %d\n, n, p); } /* khai bao ham */

11 12 13 14 15 16 17 18 19

void hoan_vi(int a, int b) { int t; printf( trc khi goi ham: %d %d\n, a, b); t=a; a=b; b=t; printf( sau khi goi ham: %d %d\n, a, b); }

Mn hnh hin th:


trc khi goi ham: 10 20 trc khi goi ham: 10 20 trc khi goi ham: 20 10 trc khi goi ham: 10 20 _ Phn tch: hm hoan_vi nhn 2 gi tr tham s tng ng vi 2 tham s hnh thc l a v b. N s thc hin vic hon i gi tr ca 2 tham s ny, song chng ta thy khi quay v chng trnh chnh chng ta khng thy du vt g ca cuc hoan_vi ny i vi 2 tham s thc s l n v p Gii thch: Thc vy, khi gi hm 2 gi tr n v p s c sao chp gi tr cho mn cho dng hm hoan_vi. Nh vy hm s sao ra mt bn khc dng nn bn gc khng bao gi b thay i. Hin tng sao mn gi tr ny c gi l sao mn dng cc b trong hm v tr 2 tham s hnh thc a v b. Mun thay i bn ngoi hm ta s dng cch sau: Cch 1: thay v truyn gi tr tham s cho hm ta truyn gi tr a ch ca tham s cho hm. chnh l trng hp hm scanf() khng thay i so vi trc khi gi hm

V d: scanf(%d, &x); Mun c gi tr bin x, ta phi dng a ch ca bin x truyn vo hm scanf Trc v sau li gi hm: gi tr a ch ca bin khng thay i (hon ton hp l) song chng ta dng gi tr a ch ny thay i ni dung bn trong ca n. V d 1: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 #include <stdio.h> main() { void hoan_vi(int a, int b); /* prototype*/ int n=10, p=20; printf( trc khi goi ham: %d %d\n, n, p); hoan_vi(&n,&p); printf( sau khi goi ham: %d %d\n, n, p); } /* khai bao ham */ void hoan_vi(int a, int b); int *a, *b; /* a va b bay gio la 2 dia chi*/ { int t; printf( trc khi goi ham: %d %d\n, *a, *b); t=*a; /* t nhn gi tr cha trong a ch a*/ *a=*b; *b=t; printf( sau khi goi ham: %d %d\n, *a, *p); } *a l k hiu gi tr c lu tr trong b nh c a ch l a &a l k hiu a ch b nh cha gi tr a.

Mn hnh hin th:


trc khi goi ham: 10 20 trc khi goi ham: 10 20 trc khi goi ham: 20 10 trc khi goi ham: 20 10 _ Ch : Khi truyn tham s theo gi tr ta c th thay vo tham s thc s l mt biu thc Khi truyn tham s theo a ch th ch c th lp vo tham s thc s l mt bin ch khng th l mt biu thc C mt phng n khc l dung cc bin ton cc, tuy nhin ta cn lu khi dng bin tan cc v tnh t do thoi mi thay i gi tr ca n 6. Bin ton cc Bin ton cc l bin c s dng mi ni trong chng trnh V d v bin ton cc 1 2 3 4 5 6 7 8 9 10 11 /* khai bao ham */ void thi_du(void); #include <stdio.h> int i; /* i chnh l bin ton cc */ main() { void thi_du(void); /* prototype*/ for (i=1; i<=5; i++) thi_du(); } thay i so vi trc khi gi hm

12 13 14 15 16

{ int m=3; /* bin a phng */ m++; printf( %d %d\n, i, m); }

Trong th d trn: i l bin ton cc v n c khai bo bn ngoi cc hm (bn ngoi c hm chng trnh chnh main() ) Trong hm thi_du s dng gi tr ca bin i m khng thay i g n. Tuy nhin ta hon ton c php thay i gi tr ca I trong hm thi_du V d: printf( %d %d\n, i++, m); iu ny lm ny sinh 2 vn c v khng c: - c l ta c th thay i c gi tr - Khng c ch do kh nng thay i qu t do nn hm no, ch no cng c th thay i nn tnh kim sot mt i, nht l trong chng trnh ln. Hu qu l c th v tnh ch no ta dng bin I mt cch ngu hng s lm sai lch gi tr i. Tm tc dng ca bin ton cc : l phm vi c gi tr hot ng ca n Tm tc dng ca bin cc b l chng trnh ngun theo sau khai bo bin V d: 1 2 3 4 5 6 7 main() { } int n; float x; ham1(..)

8 9 10 11 12 13 14

{ .. } ham2(..) { .. }

Cc bin n v x c tc dng vi hai hm ham1 v ham2 song khng c tc dng i vi hm chnh main() Ngi ta c th khai bo bin ton cc nhiu ch song ta nn khai bo tt c cc bin ton cc ngay u chng trnh cho d tm, d nhn v lm cho chng trnh sng sa hn.

You might also like