Xem mẫu

  1. K THU T L P TRÌNH C Chương 5: Xây d ng hàm bangtqh@hotmail.com 04/2010 Khái ni m hàm (function) • Hàm (function) là m t dãy các l nh nh m th c hi n m t công vi c nào đó, thư ng đư c s d ng nhi u l n • Ví d – Hàm tính sin, cos, tan, … trong toán h c – Hàm tính max, min, TBC, TBN c a dãy s , … • M t chương trình C là m t dãy các hàm, trong đó có m t hàm chính, ñư c đ t tên là main • Trong C không ch p nh n khái ni m hàm l ng trong hàm bangtqh@hotmail.com K thu t l p trình C - Xây d ng Hàm 2
  2. 04/2010 Ví d hàm trong C #include #include float max2so(float a, float b); /* Nguyên m u c a hàm */ void main() /* b t đ u hàm chính */ { float x, y; printf(“Nh p vào 2 s : ”); scanf(“%f%f”, &x, &y); printf(“Giá tr l n nh t c a %f và %f là %f\n”, x, y, max2so(x, y)); getch(); } /* k t thúc hàm main */ /* đ nh nghĩa hàm max2so */ float max2so(float a, float b) { float max; /* khai báo bi n c c b */ max = a > b ? a : b; return max; } bangtqh@hotmail.com K thu t l p trình C - Xây d ng Hàm 3 04/2010 Hàm trong C • Đ nh nghĩa hàm – Cú pháp ki u_d _li u_tr _v _c a_hàm TÊNHÀM ([khai_báo_các_tham_s ]) { /* các khai báo dùng riêng bên trong hàm n u có; */ /* các l nh bên trong hàm; */ [return giá_tr _tr _v ;] } – Đ nh nghĩa hàm có th ñ t trư c ho c sau hàm main • N u đ nh nghĩa hàm đ t sau hàm main thi ph i khai báo nguyên m u hàm (prototype) ñ u chương trình • Nên đ nh nghĩa hàm sau hàm main và khai báo nguyên m u hàm bangtqh@hotmail.com K thu t l p trình C - Xây d ng Hàm 4
  3. 04/2010 Hàm trong C • Đ nh nghĩa hàm – Ki u d li u tr v c a hàm và ki u d li u tham s là ki u d li u chu n ho c do ngư i l p trình đ nh nghĩa – Tên hàm và tên tham s ñ t theo quy t c tên bi n – Câu l nh return là tùy ch n • N u hàm không tr v giá tr , thì không c n có l nh return • N u hàm tr v giá tr thì b t bu c ph i có l nh return, trong trư ng h p này giá tr tr v ph i có cùng ki u v i ki u d li u tr v c a hàm – N u hàm không tr v giá tr thì khai báo ki u tr v c a hàm là void – N u hàm không có tham s hình th c có th s d ng t khóa void, ho c không khai báo gì c bangtqh@hotmail.com K thu t l p trình C - Xây d ng Hàm 5 04/2010 Hàm trong C • Lưu ý – Không cho phép đ nh nghĩa m t hàm bên trong hàm khác – Các tham s hình th c và các bi n đ nh nghĩa bên trong hàm (bi n c c b ) ch đư c s d ng bên trong hàm đó • Bài t p ví d – Vi t hàm ki m tra 3 s th c có là 3 c nh c a tam giác – M r ng: n u là 3 c nh tam giác thì xác đ nh đó là tam giác gì (cân, vuông, đ u) bangtqh@hotmail.com K thu t l p trình C - Xây d ng Hàm 6
  4. 04/2010 Hàm trong C • L i g i hàm – Hàm đư c s d ng thông qua l i g i hàm – Cú pháp: tên_hàm ( [danh sách các tham s th c] ); – C n phân bi t • Tham s hình th c hay ñ i: xu t hi n trong đ nh nghĩa hàm • Tham s th c: xu t hi n trong l i g i hàm – Ví d max2so(12, 341); – Lưu ý • S tham s th c ph i b ng s tham s hình th c • Ki u các tham s th c ph i phù h p v i ki u c a các tham s hình th c bangtqh@hotmail.com K thu t l p trình C - Xây d ng Hàm 7 04/2010 Hàm trong C • Ví d : vi t hàm tính giá tr n! #include #include long giai_thua(int n); /* nguyên m u hàm */ void main(){ int n; long gt; printf("\nn = "); scanf("%d", &n); /* Đ c s n */ gt = giai_thua(n); /* g i hàm tính giai th a */ printf("\n n! = %ld\n", gt); /* In ra k t qu */ getch(); } long giai_thua(int n) { int i; long gt = 1; if (n < 0) gt = 0; else for (i=2; i
  5. 04/2010 Hàm - các khái ni m • Tên hàm • Ki u giá tr tr v c a hàm • Đ i hay tham s hình th c • Thân hàm • Nguyên m u hàm / khai báo hàm • L i g i hàm • Tham s th c bangtqh@hotmail.com K thu t l p trình C - Xây d ng Hàm 9 04/2010 Bi n toàn c c, bi n c c b • Bi n toàn c c: đư c khai báo bên ngoài thân hàm, thư ng ñ u chương trình • Bi n c c b : đư c khai báo bên trong thân hàm • Ph m vi ho t đ ng – Bi n toàn c c đư c s d ng k t v trí khai báo đ n cu i chương trình – Bi n c c b ch ñư c s d ng bên trong hàm đó. • Th i gian s ng – Bi n toàn c c b h y khi chương trình k t thúc – Sau khi hàm k t thúc ho t đ ng thì các tham s hình th c và các bi n c c b s b h y bangtqh@hotmail.com K thu t l p trình C - Xây d ng Hàm 10
  6. 04/2010 Bi n toàn c c, bi n c c b • Ví d #include #include int i; /* Bi n toàn c c */ void vi_du(void); void main(){ for(i=1; i
  7. 04/2010 Bi n toàn c c, bi n c c b • Ví d v ph m vi ho t đ ng bi n #include #include int a = 5; /* Bi n toàn c c */ void ham_vi_du() { int cuc_bo = 1; /* Bi n c c b */ int a = 10; /* Bi n c c b */ printf(“Bi n c c b trong hàm ví d :\n cuc_bo = %d\n a = %d\n”, cuc_bo, a); } void main() { int cuc_bo = 100; /* Bi n c c b */ ham_vi_du(); /* G i hàm ví d */ printf(“Bi n c c b trong hàm main:\n cuc_bo = %d\n”, cuc_bo); printf(“Bi n toàn c c:\n a = %d\n”, a); getch(); } bangtqh@hotmail.com K thu t l p trình C - Xây d ng Hàm 13 04/2010 Bi n c c b ñ ng & tĩnh • Bi n c c b ñư c chia làm hai lo i – Bi n c c b ñ ng • Bi n đư c c p phát b nh t ñ ng m i khi có l i g i hàm • Bi n c c b ñ ng không lưu gi giá tr m i khi hàm k t thúc (t c b gi i phóng kh i b nh ) – Bi n c c b tĩnh • Bi n c c tĩnh đư c khai báo bên trong thân hàm nhưng v n t n t i ngay c khi hàm đã k t thúc ho t đ ng • Bi n c c b tĩnh đư c khai báo v i t khóa static bangtqh@hotmail.com K thu t l p trình C - Xây d ng Hàm 14
  8. 04/2010 Bi n c c b ñ ng & tĩnh • Ví d #include #include void vi_du(void); void main(){ int n; for (n=1; n
  9. 04/2010 Ki u con tr (pointer) • Đ a ch (address) – V i m i bi n có các khái ni m: • Tên bi n, ki u bi n, giá tr bi n – Ví d : • int i = 1; • Bi n i ki u s nguyên có giá tr là 1 • Máy tính c p phát m t vùng nh 2 byte liên t c đ lưu tr giá tr c a bi n i – Đ a ch bi n là s th t c a byte đ u tiên trong dãy các byte liên t c nhau máy dành đ lưu tr giá tr bi n – Đ l y đ a ch bi n, s d ng toán t “&” • Ví d : &i – Lưu ý, máy tính phân bi t các ki u đ a ch : đ a ch ki u int, đ a ch ki u float, đ a ch ki u long, … bangtqh@hotmail.com K thu t l p trình C - Xây d ng Hàm 17 04/2010 Ki u con tr (pointer) • Con tr (pointer) – Là m t bi n dùng đ ch a đ a ch – Có nhi u lo i con tr tương ng v i các ki u đ a ch khác nhau • Ch ng h n, con tr ki u int tương ng đ a ch ki u int, … – Cú pháp khai báo con tr ki u_d _li u *tên_con_tr ; – Ví d int i, j, *pi, *pj; pi = &i; /* pi là con tr ch a ñ a ch bi n i */ pj = &j; /* pj là con tr ch a ñ a ch bi n j */ bangtqh@hotmail.com K thu t l p trình C - Xây d ng Hàm 18
  10. 04/2010 Ki u con tr (pointer) • Gi s có – px là con tr ñ n bi n x, thì các cánh vi t x và *px là tương đương nhau • Ví d int x, y, *px, *py; px = &x; py = &y; x = 3; /* tương đương v i *px = 3 */ y = 5; /* tương đương v i *py = 5 */ /* Các câu l nh dư i đây là tương ñương: */ x = 10*y; *px = 10*y; x = 10*(*py); *px = 10*(*py); bangtqh@hotmail.com K thu t l p trình C - Xây d ng Hàm 19 04/2010 Truy n tham s cho hàm • Xét ví d #include #include void hoan_vi(int a, int b); /* nguyên m u hàm, prototype */ void main(){ int n=10, p=20; printf(" Trư c khi g i hàm : %d %d\n", n, p); hoan_vi(n, p); printf(" Sau khi g i hàm : %d %d\n", n, p); getch(); } void hoan_vi(int a, int b){ int t; printf(" Trư c khi hoán v : %d %d\n", a, b); t=a; a=b; b=t; printf(" Sau khi hoán v : %d %d\n", a, b); } bangtqh@hotmail.com K thu t l p trình C - Xây d ng Hàm 20
  11. 04/2010 Do cơ ch bi n c c b Chương trình trên hay tham s hình th c cho k t qu b gi i phóng b nh không đúng ! khi hàm k t thúc • Hãy truy n tham s th c cho hàm là đ a ch bi n thay vì truy n giá tr bi n • S d ng tham s là con tr bangtqh@hotmail.com K thu t l p trình C - Xây d ng Hàm 21 04/2010 #include #include void hoan_vi(int *a, int *b); /* nguyên m u hàm, prototype */ void main(){ int n=10, p=20; printf(" Trư c khi g i hàm : %d %d\n", n, p); hoan_vi(&n, &p); printf(" Sau khi g i hàm : %d %d\n", n, p); getch(); } void hoan_vi(int *a, int *b){ int t; printf(" Trư c khi hoán v : %d %d\n", *a, *b); t=*a; *a=*b; *b=t; printf(" Sau khi hoán v : %d %d\n", *a, *b); } bangtqh@hotmail.com K thu t l p trình C - Xây d ng Hàm 22
  12. 04/2010 Truy n tham s cho hàm • Khi nào thì dùng tham s là con tr ? – C n phân bi t hai lo i tham s hình th c • Tham s hình th c ch nh n giá tr truy n vào đ hàm thao tác, trư ng h p có th g i là tham s vào • Tham s hình th c dùng đ ch a k t qu c a hàm, trư ng h p này có th g i là tham s ra – Đ i v i tham s ra ta ph i s d ng ki u con tr • Bài t p – Gi i thích tham s c a l nh scanf – Vi t hàm gi i phương trình b c hai bangtqh@hotmail.com K thu t l p trình C - Xây d ng Hàm 23 04/2010 Hàm đ quy trong C • Là hàm mà t trong thân hàm có l i g i t i chính hàm đó • Hàm đ quy ñư c xây d ng d a trên đ nh nghĩa đ quy trong toán h c • Ví d : ñ nh nghĩa giai th a c a n (n!) n! = 1.2.3…n Ho c n! = 1 khi n = 0 n.(n-1)! khi n >= 1 bangtqh@hotmail.com K thu t l p trình C - Xây d ng Hàm 24
  13. 04/2010 Hàm đ quy trong C – Vi t hàm đ quy tính n! long giai_thua (int n){ if (n==0) return(1); else return (n * giai_thua(n-1)); } – S d ng hàm đ quy c n m t b nh x p ch ng LIFO (Last In, First Out stack) đ lưu tr các giá tr trung gian – Gi i thích cơ ch ho t đ ng hàm giai_thua v i l i g i hàm giai_thua(3) bangtqh@hotmail.com K thu t l p trình C - Xây d ng Hàm 25 04/2010 Hàm đ quy trong C • Đi u gì x y ra n u có l i g i hàm sau k = giai_thua(-1); • Kh c ph c ? • H n ch c a hàm đ quy – Dùng nhi u b nh • Hãy vi t l i hàm giai_thua s d ng vòng l p • So sánh hai cách vi t đ quy và l p bangtqh@hotmail.com K thu t l p trình C - Xây d ng Hàm 26
  14. 04/2010 Hàm đ quy trong C • Hàm đ quy thư ng phù h p đ gi i quy t các bài toán có ñ c trưng – Bài toán d dàng gi i quy t trong m t s trư ng h p riêng, ñó chính là đi u ki n d ng đ quy – Trong trư ng h p t ng quát, bài toán suy v cùng d ng nhưng giá tr tham s b thay ñ i • Ví d : Tìm ư c s chung l n nh t c a hai s nguyên dương – Ư c s chung l n nh t c a hai s nguyên dương đư c đ nh nghĩa như sau • n u x = y thì usc(x, y) = x • n u x > y thì usc(x, y) = usc(x-y, y) • n u x < y thì usc(x, y) = usc(x, y-x) bangtqh@hotmail.com K thu t l p trình C - Xây d ng Hàm 27 04/2010 int usc(int x, int y){ 1. Vi t l i hàm usc dùng vòng if (x == y) l p return (x); 2. Hãy vi t chương trình s else if (x > y) d ng hàm đ quy ñ t o return usc(x-y, y); dãy s Fibonacci else return usc(x, y-x); – Dãy s Fibonacci là dãy } s F1, F2, F3, .... Fn có quy lu t: Fn = Fn-1 + Fn-2 V i F1=1, F2=1 – Vd: 1, 1, 2, 3, 5, 8, 13, 21, ... 3. Vi t hàm đ quy ñ o Hàm đ quy tìm Ư c s chung ngư c 1 xâu ký t s b t kỳ l n nh t c a 2 s x, y nh p t bàn phím bangtqh@hotmail.com K thu t l p trình C - Xây d ng Hàm 28
  15. 04/2010 Hàm chu n trong C • Là các đã đư c đ nh nghĩa s n • printf, scanf, puts, gets, … (thư vi n stdio.h) • clrscr, getch, getche, … (thư vi n conio.h) • rand, randomize, … (thư vi n stdlib.h) • abs, fabs, sqrt, sin, cos, tan, … ( thư vi n math.h) • … bangtqh@hotmail.com K thu t l p trình C - Xây d ng Hàm 29 04/2010 bangtqh@hotmail.com K thu t l p trình C - Xây d ng Hàm 30
nguon tai.lieu . vn