Bài giảng Lập trình C - Chương 8: Hàm trong C - Ngô Công Thắng

Đề có con trỏ có thể chứa địa chỉ của hàm ta khai báo con trỏ tới kiểu giống kiểu trả về của hàm, theo sau là các tham số của hàm đặt ngoặc đơn. Ví dụ: giả sử hàm Tong có hai tham số kiểu int, kiểu trả về cũng là int. KHí đó ta khai báo con trỏ tới hàm này như sau: int Tong(int a, int b); //Khai bao hàm int (*p) (int a, int b); //Khai báo con trỏ hàm p = Tong; //Gán đia chỉ của hàm Tong (*p)(10,15); /

pdf29 trang | Chia sẻ: huongthu9 | Lượt xem: 340 | Lượt tải: 0download
Bạn đang xem trước 20 trang tài liệu Bài giảng Lập trình C - Chương 8: Hàm trong C - Ngô Công Thắng, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Bài gi ng Ngôn ng C - Ch ng 8 GV. Ngô Công Th ngả ữ ươ ắ 1 Ch ng 8. Hàm trong Cươ I. Khai báo hàm II. Đ nh nghĩa hàmị III. S d ng hàmử ụ IV. Con tr tr t i hàmỏ ỏ ớ Bài gi ng Ngôn ng C - Ch ng 8 GV. Ngô Công Th ngả ữ ươ ắ 2 I. Khai báo hàm 1. Gi i thi u v hàmớ ệ ề 2. Cú pháp khai báo hàm 3. Các tham s trong khai báo hàmố Bài gi ng Ngôn ng C - Ch ng 8 GV. Ngô Công Th ngả ữ ươ ắ 3 1. Gi i thi u v hàmớ ệ ề  Trong C t t c các ch ng trình con đ u g i là hàm.ấ ả ươ ề ọ Ngoài các hàm th vi n có s n, ng i l p trình có ư ệ ẵ ườ ậ th t t o ra các hàm. Đ t o ra m t hàm ng i l p ể ự ạ ể ạ ộ ườ ậ trình ph i khai báo và đ nh nghĩa nó.ả ị Khai báo hàm (function declaration or prototype) là xác đ nh tên c a hàm, ki u d li u tr v , s l ng ị ủ ể ữ ệ ả ề ố ượ tham s và ki u c a t ng tham s .ố ể ủ ừ ố Đ nh nghĩa hàm (function definition) là xác đ nh ị ị công vi c mà hàm s th c hi n thông qua các l nh ệ ẽ ự ệ ệ c a hàm.ủ  Các hàm trong C không l ng nhau, t c là trong m t ồ ứ ộ hàm ta không th đ nh nghĩa m t hàm khác.ể ị ộ Bài gi ng Ngôn ng C - Ch ng 8 GV. Ngô Công Th ngả ữ ươ ắ 4 2. Cú pháp khai báo hàm Cú pháp khai báo hàm n m trên m t dòng, k t ằ ộ ế thúc b ng d u ch m ph y.ằ ấ ấ ẩ Ki u_tr _vể ả ề Tên_hàm(Ki u_1ể Tên_tham_s _1, ố Ki u_2ể Tên_tham_s _2,);ố Ví d :ụ float inchtomet(float x); float tong(float a, float b); M t khai báo hàm không cho bi t nh ng gì có ộ ế ữ trong thân hàm. Nó ch báo cho trình biên d ch ỉ ị bi t v tên hàm, ki u c a hàm, s l ng các ế ề ể ủ ố ượ tham s và ki u c a các tham s .ố ể ủ ố Bài gi ng Ngôn ng C - Ch ng 8 GV. Ngô Công Th ngả ữ ươ ắ 5 2. Cú pháp khai báo hàm (ti p)ế Khai báo hàm có th đ t b t kỳ đâu tr c khi g i ể ặ ở ấ ướ ọ hàm. T t nh t là đ đ u t p ch a ch ng trình chính ố ấ ể ở ầ ệ ứ ươ (ch a hàm main) ho c đ tr c m t hàm s g i nó. ứ ặ ể ướ ộ ẽ ọ Trong các ch ng trình nhi u file thì các khai báo hàm ươ ề th ng đ trong các file header có đuôi .h, còn các đ nh ườ ể ị nghĩa hàm đ trong các file th vi n có đuôi obj ho c ể ư ệ ặ lib. N u hàm đ c đ nh nghĩa đâu đó tr c khi g i hàm ế ượ ị ở ướ ọ thì có th không c n khai báo hàm. Tuy nhiên v n nên ể ầ ẫ có khai báo hàm nh t là trong các ch ng trình có ấ ươ nhi u hàm l n hay các ch ng trình n m trên nhi u file.ề ớ ươ ằ ề Bài gi ng Ngôn ng C - Ch ng 8 GV. Ngô Công Th ngả ữ ươ ắ 6 3. Các tham s trong khai báo hàmố N u hàm không có tham s thì trong d u ế ố ấ ngo c đ n c a khai báo hàm đ tr ng. Ví d :ặ ơ ủ ể ố ụ int xoa(); Tên c a các tham s trong khai báo hàm có ủ ố th không c n xác đ nh. Ví d :ể ầ ị ụ float inchtomet(float, float); Bài gi ng Ngôn ng C - Ch ng 8 GV. Ngô Công Th ngả ữ ươ ắ 7 II. Đ nh nghĩa hàmị 1. Cú pháp đ nh nghĩa hàmị 2. L nh returnệ 3. Hàm không tr v giá trả ề ị Bài gi ng Ngôn ng C - Ch ng 8 GV. Ngô Công Th ngả ữ ươ ắ 8 1. Cú pháp đ nh nghĩa hàmị Ki u_tr _vể ả ề Tên_hàm(Ki u_1ể Tên_tham_s _1, ố Ki u_2ể Tên_tham_s _2,)ố { //Các l nh c a hàm đ đâyệ ủ ể } Ví d :ụ int cong(int a, int b) { int z; z = a + b; return z; } Không có d u ch m ấ ấ ph yẩ Thân hàm Bài gi ng Ngôn ng C - Ch ng 8 GV. Ngô Công Th ngả ữ ươ ắ 9 1. Cú pháp đ nh nghĩa hàm (ti p)ị ế Dòng đ u tiên trong đ nh nghĩa hàm gi ng ầ ị ố trong khai báo hàm, ch khác là không có d u ỉ ấ ch m ph y và các tham s b t bu c ph i có ấ ẩ ố ắ ộ ả tên. Khi đã có khai báo hàm thì đ nh nghĩa hàm ị th ng đ sau hàm main ho c đ trong m t ườ ể ặ ể ộ t p obj (lib). Đ quen d n v i vi c vi t các ệ ể ầ ớ ệ ế ch ng trình l n, khi th c hành chúng ta vi t ươ ớ ự ế các khai báo hàm trong t p .h, còn các đ nh ệ ị nghĩa hàm đ trong t p .obj (lib).ể ệ Bài gi ng Ngôn ng C - Ch ng 8 GV. Ngô Công Th ngả ữ ươ ắ 10 2. L nh returnệ  L nh return đ c s d ng trong m t hàm. L nh ệ ượ ử ụ ộ ệ return th c hi n hai ch c năng:ự ệ ứ  Làm cho m t hàm tr v ch ng trình g i nó.ộ ở ề ươ ọ  Đ c dùng đ tr v m t giá tr .ượ ể ả ề ộ ị  Cú pháp dùng l nh return nh sau:ệ ư return Giá_tr _tr _v ;ị ả ề ho c ặ return;  L nh return có th dùng b t kỳ v trí nào trong ệ ể ở ấ ị hàm nh ng th ng cu i hàm.ư ườ ở ố V i các hàm có tr v giá tr thì l nh return b t bu c ớ ả ề ị ệ ắ ộ ph i có.ả Bài gi ng Ngôn ng C - Ch ng 8 GV. Ngô Công Th ngả ữ ươ ắ 11 3. Hàm không tr v giá trả ề ị V i các hàm không tr v giá tr thì khi khai ớ ả ề ị báo và đ nh nghĩa hàm ta ph i khai báo ki u ị ả ể tr v là void. Ví d :ả ề ụ void chao(); N u s d ng l nh return trong hàm không tr ế ử ụ ệ ả v giá tr thì ch dùng đ c d ng:ề ị ỉ ượ ạ return; Bài gi ng Ngôn ng C - Ch ng 8 GV. Ngô Công Th ngả ữ ươ ắ 12 III. S d ng hàmử ụ 1. L i g i hàmờ ọ 2. Truy n đ i s theo giá trề ố ố ị 3. Truy n đ i s theo tham chi uề ố ố ế 4. Truy n con tr t i hàmề ỏ ớ 5. Truy n m ng t i hàmề ả ớ Bài gi ng Ngôn ng C - Ch ng 8 GV. Ngô Công Th ngả ữ ươ ắ 13 1. L i g i hàmờ ọ M t hàm, sau khi đ c đ nh nghĩa và khai báo, có ộ ượ ị th đ c th c hi n b ng m t l nh g i hàm (l i g i ể ượ ự ệ ằ ộ ệ ọ ờ ọ hàm) đâu đó trong ch ng trình. Có th g i t ở ươ ể ọ ừ hàm main, có th g i t m t hàm khác ho c có th ể ọ ừ ộ ặ ể g i t m t hàm thành viên c a l p.ọ ừ ộ ủ ớ  Cú pháp g i hàm nh sau:ọ ư Tên_hàm(Danh sách các đ i s , n u có);ố ố ế N u hàm đ c khai báo và đ nh nghĩa là có các ế ượ ị tham s thì khi g i hàm ta ph i truy n giá tr cho ố ọ ả ề ị hàm qua các tham s . Các giá tr truy n cho hàm g i ố ị ề ọ là các đ i s . Các đ i s có th là h ng, bi n, m ng, ố ố ố ố ể ằ ế ả con tr ,ỏ Bài gi ng Ngôn ng C - Ch ng 8 GV. Ngô Công Th ngả ữ ươ ắ 14 1. L i g i hàm (ti p)ờ ọ ế Ví d : gi s ta khai báo m t hàm c ng hai giá tr ụ ả ử ộ ộ ị float float cong(float a, float b); Ta g i hàm này nh sau:ọ ư cong(7,8);  L i g i m t hàm có tr v giá tr có th s d ng ờ ọ ộ ả ề ị ể ử ụ trong các bi u th c, còn l i g i m t hàm không tr ể ứ ờ ọ ộ ả v giá tr không dùng đ c trong bi u th c. Khi ề ị ượ ể ứ dùng trong bi u th c thì không có d u ch m ph y ể ứ ấ ấ ẩ sau l i g i hàm. Ví d :ờ ọ ụ a = cong(7,8) +2; cout<<a; Bài gi ng Ngôn ng C - Ch ng 8 GV. Ngô Công Th ngả ữ ươ ắ 15 1. L i g i hàm (ti p)ờ ọ ế Ho t đ ng c a l i g i hàmạ ộ ủ ờ ọ sdfghjkl sdfghjkl func1(); sdfghjkl sdfghjkl func1(); sdfghjkl sdfghjkl func1(); sdfghjkl Ch ng trình ươ g i hàmọ L i g i hàmờ ọ void func1() { sdfghjkl sdfghjkl sdfghjkl } Cùng m t mã đ c dùng ộ ượ cho t t c các l i g i hàmấ ả ờ ọ Bài gi ng Ngôn ng C - Ch ng 8 GV. Ngô Công Th ngả ữ ươ ắ 16 Ví d v hàmụ ề Vi t ch ng trình tính s các ch nh h p ch p k t n ế ươ ố ỉ ợ ậ ừ ph n t . Ch ng trình ph i s d ng hàm đ tính giai ầ ử ươ ả ử ụ ể th a.ừ )!( ! kn nAkn   Bài gi ng Ngôn ng C - Ch ng 8 GV. Ngô Công Th ngả ữ ươ ắ 17 2. Truy n đ i s theo giá trề ố ố ị Khi khai báo và đ nh nghĩa hàm ta có hai ị cách khai báo các tham s c a hàm:ố ủ  Khai báo đ khi g i hàm truy n đ i s cho hàm ể ọ ề ố ố theo giá tr .ị  Khai báo đ khi g i hàm truy n đ i s cho hàm ể ọ ề ố ố theo tham chi u.ế Khai báo đ truy n đ i s theo giá tr gi ng ể ề ố ố ị ố nh khai báo bi n thông th ng:ư ế ườ Ki u Tên_tham_sể ố Ví d : ụ void hoandoi(int a, int b); Bài gi ng Ngôn ng C - Ch ng 8 GV. Ngô Công Th ngả ữ ươ ắ 18 2. Truy n đ i s theo giá tr (ti p)ề ố ố ị ế Khi truy n đ i s cho hàm theo giá tr thì ề ố ố ị hàm s t o ra các bi n m i (tên các bi n này ẽ ạ ế ớ ế là tên c a các tham s ), copy giá tr c a các ủ ố ị ủ đ i s vào các bi n m i và thao tác trên các ố ố ế ớ bi n m i này. B i v y sau khi g i hàm các ế ớ ở ậ ọ đ i s không b thay đ i giá tr m c dù bên ố ố ị ổ ị ặ trong hàm giá tr c a đ i s b thay đ i.ị ủ ố ố ị ổ Ví d : Đ đ i ch giá tr trong hai bi n ta vi t ụ ể ổ ỗ ị ế ế hàm nh sau: ư (Xem trang sau) Bài gi ng Ngôn ng C - Ch ng 8 GV. Ngô Công Th ngả ữ ươ ắ 19 2. Truy n đ i s theo giá tr (ti p)ề ố ố ị ế #include #include void DoiCho(int,int); void main() { int x=12,y=15; clrscr(); cout<<"Truoc khi doi cho: x= "<<x<<", y= "<<y; DoiCho(x,y); cout<<"\nSau khi doi cho: x= "<<x<<", y= "<<y; getch(); } void DoiCho(int a,int b) //Khai bao de truyen doi so theo gia tri { int tmp=a; a=b; b=tmp; } Bài gi ng Ngôn ng C - Ch ng 8 GV. Ngô Công Th ngả ữ ươ ắ 20 3. Truy n đ i s theo tham chi uề ố ố ế  Tham chi u (reference) là m t tên khác c a cùng ế ộ ủ m t bi n.ộ ế Khi truy n đ i s theo tham chi u hàm s không t o ề ố ố ế ẽ ạ ra bi n m i mà thao tác tr c ti p trên bi n đ i s . ế ớ ự ế ế ố ố K t qu là nh ng tác đ ng c a hàm s làm thay đ i ế ả ữ ộ ủ ẽ ổ giá tr c a đ i s .ị ủ ố ố Đ truy n đ i s cho hàm theo tham chi u thì khi ể ề ố ố ế khai báo hàm ta ph i thêm d u & vào bên ph i tên ả ấ ả ki u c a tham s .ể ủ ố Ví d : ụ void DoiCho(int& a, int& b);  Các đ i s truy n t i hàm theo tham chi u ch có ố ố ề ớ ế ỉ th là bi n không đ c là giá tr .ể ế ượ ị Bài gi ng Ngôn ng C - Ch ng 8 GV. Ngô Công Th ngả ữ ươ ắ 21 3. Truy n đ i s theo tham chi u (ti p)ề ố ố ế ế Ví d : Đ i ch giá tr c a 2 bi nụ ổ ỗ ị ủ ế . . . . . void DoiCho(int&,int&); . . . . . void DoiCho(int& a,int& b) { int tmp=a; a=b; b=tmp; } Bài gi ng Ngôn ng C - Ch ng 8 GV. Ngô Công Th ngả ữ ươ ắ 22 3. Truy n đ i s theo tham chi u (ti p)ề ố ố ế ế Khi đ i s là đ i t ng thì truy n theo tham ố ố ố ượ ề chi u là t t nh t. B i vì truy n theo tham ế ố ấ ở ề chi u hàm s không ph i copy đ i t ng mà ế ẽ ả ố ượ thao tác tr c ti p trên đ i t ng đ i s . V i ự ế ố ượ ố ố ớ các đ i t ng l n thì đây là cách ti t ki m b ố ượ ớ ế ệ ộ nh và th i gian th c hi n ch ng trình.ớ ờ ự ệ ươ Bài gi ng Ngôn ng C - Ch ng 8 GV. Ngô Công Th ngả ữ ươ ắ 23 4. Truy n con tr t i hàmề ỏ ớ Đ truy n con tr t i hàm ta ph i th c hi n ể ề ỏ ớ ả ự ệ hai b c:ướ  Khai báo các tham s (khi khai báo và đ nh ố ị nghĩa) là con tr .ỏ  Khi g i hàm thì đ i s truy n cho hàm là đ a ch .ọ ố ố ề ị ỉ Ví d :ụ void DoiCho(int* a, int* b); int x = 12,y = 15; DoiCho(&x,&y); Bài gi ng Ngôn ng C - Ch ng 8 GV. Ngô Công Th ngả ữ ươ ắ 24 4. Truy n con tr t i hàm (ti p)ề ỏ ớ ế Khi truy n con tr t i hàm thì bi n do con tr tr t i ề ỏ ớ ế ỏ ỏ ớ có th b thay đ i b i hàm.ể ị ổ ở Ví d : Đ i ch giá tr c a hai bi nụ ổ ỗ ị ủ ế void DoiCho(int* a,int* b); . . . . DoiCho(&x,&y); . . . . void DoiCho(int* a,int* b) { int tmp = *a; *a = *b; *b = tmp; } Bài gi ng Ngôn ng C - Ch ng 8 GV. Ngô Công Th ngả ữ ươ ắ 25 5. Truy n m ng t i hàmề ả ớ Khi tên m ng đ c s d ng mà không có ch s ả ượ ử ụ ỉ ố kèm theo thì nó là đ a ch b t đ u c a m ng. Do đó, ị ỉ ắ ầ ủ ả n u dùng m ng làm đ i s truy n t i m t hàm thì ế ả ố ố ề ớ ộ ch có đ a ch c a m ng đ c truy n t i hàm ch ỉ ị ỉ ủ ả ượ ề ớ ứ không ph i toàn b m ng. Đi u này có nghĩa r ng ả ộ ả ề ằ khi khai báo tham s c a hàm thì tham s ph i có ố ủ ố ả ki u con tr .ể ỏ  B i vì đ a ch c a m ng đ c truy n t i hàm nên ở ị ỉ ủ ả ượ ề ớ m i thay đ i c a hàm lên m ng s gi nguyên khi ọ ổ ủ ả ẽ ữ hàm k t thúc.ế Bài gi ng Ngôn ng C - Ch ng 8 GV. Ngô Công Th ngả ữ ươ ắ 26 5. Truy n m ng t i hàm (ti p)ề ả ớ ế  Ví d :ụ Vi t m t hàm đ a ra các ph n t c a m ngế ộ ư ầ ử ủ ả void print(int* m); . . . . . int x[7]={2,5,8,1,6,7,10}; . . . . . print(x); . . . . . void print(int* m) { for(int i=0;i<7;i++) cout<<m[i]<<" "; } Bài gi ng Ngôn ng C - Ch ng 8 GV. Ngô Công Th ngả ữ ươ ắ 27 IV. Con tr tr t i hàmỏ ỏ ớ M t đ c đi m r t m nh c a C là con tr hàm. ộ ặ ể ấ ạ ủ ỏ M c dù hàm không ph i là bi n nh ng nó v n ặ ả ế ư ẫ có đ a ch trong b nh . Đ a ch này có th ị ỉ ộ ớ ị ỉ ể ch a trong m t con tr . Vì đ a ch c a hàm ứ ộ ỏ ị ỉ ủ ch a trong con tr nên ta có th s d ng con ứ ỏ ể ử ụ tr thay cho tên hàm.ỏ Đ có đ a ch c a hàm ta dùng tên hàm không ể ị ỉ ủ có đ i s (gi ng nh tên bi n m ng là đ a ch ố ố ố ư ế ả ị ỉ c a m ng).ủ ả Bài gi ng Ngôn ng C - Ch ng 8 GV. Ngô Công Th ngả ữ ươ ắ 28 IV. Con tr tr t i hàm (ti p)ỏ ỏ ớ ế Đ có con tr có th ch a đ a ch c a hàm ta khai ể ỏ ể ứ ị ỉ ủ báo con tr tr t i ki u gi ng ki u tr v c a hàm, ỏ ỏ ớ ể ố ể ả ề ủ theo sau là các tham s c a hàm đ t trong ngo c ố ủ ặ ặ đ n. Ví d : gi s hàm Tong có hai tham s ki u ơ ụ ả ử ố ể int, ki u tr v cũng là int. Khi đó ta khai báo con ể ả ề tr tr t i hàm này nh sau:ỏ ỏ ớ ư int Tong(int a, int b); //Khai bao hàm int (*p) (int a, int b); //Khai báo con tr hàmỏ p = Tong; //Gán đ a ch c a hàm Tong cho pị ỉ ủ (*p)(10,15); //G i hàm Tong qua con trọ ỏ Bài gi ng Ngôn ng C - Ch ng 8 GV. Ngô Công Th ngả ữ ươ ắ 29 IV. Con tr tr t i hàm (ti p)ỏ ỏ ớ ế Ví d : Vi t ch ng trình tính t ng, hi u, tích ụ ế ươ ổ ệ và th ng c a hai s nguyên nh p vào t bàn ươ ủ ố ậ ừ phím. Ch ng trình yêu c u ng i s d ng ươ ầ ườ ử ụ l a ch n m t trong các cách tính.ự ọ ộ

Các file đính kèm theo tài liệu này:

  • pdfbai_giang_lap_trinh_c_chuong_8_ham_trong_c_ngo_cong_thang.pdf