Professional Documents
Culture Documents
Ham Va Lenh Gôp Macro
Ham Va Lenh Gôp Macro
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
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;
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
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
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); }
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.
12 13 14 15 16
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.