Bài giảng Phương pháp lập trình - Chương 6: Hàm (Function) - Võ Quang Hoàng Khang

pdf 39 trang phuongnguyen 2601
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Phương pháp lập trình - Chương 6: Hàm (Function) - Võ Quang Hoàng Khang", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • pdfbai_giang_phuong_phap_lap_trinh_chuong_6_ham_function_vo_qua.pdf

Nội dung text: Bài giảng Phương pháp lập trình - Chương 6: Hàm (Function) - Võ Quang Hoàng Khang

  1. CHƯƠNG 6 HÀM (FUNCTION)
  2. 1. KHÁI NiỆM • Hàm là mộtkhốilệnh thựchiệnmộtcông việchoànchỉnh (module), được đặttên và được gọithực thi nhiềulầntại nhiềuvị trí trong chương trình. •Hàm còn gọi là chương trình con (subroutine)
  3. 1. KHÁI NiỆM •Cóhailọai hàm: – Hàm thư viện: là những hàm đã được xây dựng sẵn. Muốnsử dụng các hàm thư viện phảikhaibáothư việnchứanó trong phần khai báo #include. – Hàm do người dùng định nghĩa.
  4. 1. KHÁI NiỆM •Hàmcóthể được gọitừ chương trình chính (hàm main) hoặctừ 1 hàm khác. •Hàmcógiátrị trả về hoặckhông.Nếu hàm không có giá trị trả về gọilàthủ tục (procedure)
  5. 2. DẠNG TỔNG QUÁT CỦA HÀM •Dạng tổng quát của hàm do người dùng định nghĩa: returnType functionName(parameterList) { body of the function }
  6. 2. DẠNG TỔNG QUÁT CỦA HÀM • returnType:Kiểudữ liệucủa giá trị trả về bởihàm.Nếuhàmkhôngtrả về giá trị thì returnType là void • functionName: Tên hàm. • parameterList:Danhsáchcácthamsố hình thức phân cách nhau bởi dấu phẩy
  7. VÍ DỤ int max(int a, int b) { if(a<b) return b; else return a; }
  8. 3. GỌI HÀM •Mộthàmkhiđã định nghĩanhưng chúng vẫnchưa đượcthựcthi,hàmchỉđược thựcthikhitrong chương trình có mộtlời gọi đếnhàmđó. • Cú pháp gọihàm: ([Danh sách các tham số])
  9. VÍ DỤ •Gọi hàm trong chương trìíình chính: void main() { int a, b; cout >a; cout >b; cout<<”so lon nhat la:”<<max(a, b); }
  10. 4. NGUYÊN TẮC HOẠT ĐỘNG CỦA HÀM •Hàmcóthể được gọitừ nhiềuchỗ khác nhau trong chương trình. •Khihàm đượcgọi, khốilệnh tương ứng củahàmđượcthựcthi. •Saukhithựchiện xong, quyền điềukhiển được trả về cho chương trình gọi.
  11. 4. NGUYÊN TẮC HOẠT ĐỘNG CỦA HÀM void main() int uscln(int a, int b) { { itint a, bUSCb, USC; a=abs(a); cout >a>>b; while(()a!=b) USC = uscln(a,b); { cout b) a-=b; lon nhat la: ”, USC); else b-=a; } } return a;}
  12. 5. THAM SỐ HÌNH THỨC &THAM SỐ THỰC • Khi hàm cầnnhận đốisố (arguments) để thực thi thì khi khai báo hàm cần khai báo danh sách các tham số để nhận giá trị từ chương trình gọi. Các tham số này được gọilàtham số hình thức.
  13. 5. THAM SỐ HÌNH THỨC &THAM SỐ THỰC • Ví dụ: int min(int a, int b) { if(a<b) Tham số hình thức return a; else return b; }
  14. 5. THAM SỐ HÌNH THỨC &THAM SỐ THỰC •Khigọi hàm, ta cung cấpcácgiátrị thật, các giá trị này sẽđượcsaochép vào các tham số hình thứcvàcácgiátrị thật được gọilàtham số thực. Ví dụ: Để tìm giá trị nhỏ nhấtcủa2số 5và6ta gọi hàm min(5, 6) Tham số thực min(int a, int b)
  15. 5. THAM SỐ HÌNH THỨC &THAM SỐ THỰC •Cóhaicáchtruyền đốisố vào tham số hình thức: –Truyền tham trị – Truyền tham biến.
  16. 5. THAM SỐ HÌNH THỨC &THAM SỐ THỰC • Truyền tham trị (call by value) – Sao chép giá trị của đối số vào tham số hình thức củahàm. – Những thay đổi của tham số không ảnh hưởng đếngiátrị của đốisố.
  17. 5. THAM SỐ HÌNH THỨC &THAM SỐ THỰC Víí dụ: void double(()int a) { a = a*2; cout << “gia tri cua a trong ham double:“<< a; }
  18. 5. THAM SỐ HÌNH THỨC &THAM SỐ THỰC void main() { int a=40; double(a); cout << “\n Gia tri cua a trong ham main: ”; cout << “a = “ << a << endl; }
  19. 5. THAM SỐ HÌNH THỨC &THAM SỐ THỰC void main() void double( int a ) { { int a=40;40 aa=40 = a* *2; 2; double(a); cout << “Gia tri cua a cout<<“\n Gia tri cua a troogng h am doub le:“<< a; trong ham main: ”; } cout << “a = “ << a << endl; Gia tri cua a trong ham double: 80 } Gia tri cua a trong ham main:double: 40 80
  20. 5. THAM SỐ HÌNH THỨC &THAM SỐ THỰC • Truyền tham chiếu (call by reference) – Sao chép địachỉ của đốisố vào tham số hình thức. Do đó, những thay đổi đối vớithamsố sẽ có tác dụng trên đốisố. Ví dụ:Khigọihàmdouble(&a); Địa chỉ của a truyền vào cho tham số hình thứccủahàm:double(int *b)
  21. 5. THAM SỐ HÌNH THỨC &THAM SỐ THỰC void double(int *b) { *b *= 2; cout << “Trong hàm double a = “ << *b; }
  22. 5. THAM SỐ HÌNH THỨC &THAM SỐ THỰC void main() b void double( int *b) { { itint a=40; a 4080 *b *= 2; double(&a); 100100 cout << “Trong hàm cout << “\Trong ham double a = “ << *b; main : a = “ << a ; } Trong hàm double a = 8 } Trong hàm double a = 80 Trong hàm main a = 80
  23. 5. THAM SỐ HÌNH THỨC &THAM SỐ THỰC void main() {{,; int a = 20, b = 40; int *pa =&a, *pb=&b; swap(pa,pb); cout << “sau khi goi swap: “; cout << “a = “ << a << endl; cout << “b = “ << b << endl;;} }
  24. 5. THAM SỐ HÌNH THỨC &THAM SỐ THỰC void swap(int *a, int *b) { int temp; temp = *a; *a = *b; *b = temp; }
  25. 6. PROTOTYPE (NGUYÊN MẪU)CỦA HÀM •Dùng để loạitrừ việcbắtbuộcphải định nghĩahàmtrướckhigọi. • Prototype khai báo giống như header của hàm Ví dụ: Header : void dispayMessage() Prototype : void dispayMessage()
  26. 6. PROTOTYPE (NGUYÊN MẪU)CỦA HÀM •Chương trình bắtbuộcphảicó prototype củahàmhoặcphải bắtbuộc viết định nghĩacủahàmtrướckhigọi. •Saukhiđãsử dụng ppyprototypecủahàm, ta có thể viết định nghĩachitiếthàmở bấtkỳ vị trí nào trong chương trình.
  27. VÍ DỤ #include // Khai báo thư viện iostream. h int max(int x, int y);// khai báo nguyên mẫu hàm max void main()//hàm main (sẽ gọi các hàm thực hiện) { int a, b;// khai báo biến cout >a>>b; cout y) ? x:y; }
  28. 6. Truyền mảng vào hàm •Khimộtmảng đượcdùng như một đốisố để truyềnchohàm,địachỉ củamảng được truyền vào tham số hình thức. •Như vậy, truyềnmảng vào hàm mặc định là truyền tham chiếu. • Những thay đổi đến giá trị của các phần tử mảng trong thân hàm sẽảnh hưởng đến mảng gốc.
  29. VÍ DỤ: void change(int a[], int n) { for(int i=0 ; i<n ; i++) if(a[i] < 0) a[i]=0; else a[i] = 1; }
  30. 7.Đối số của hàm main • Đốisố truyềnvàochothamsố củahàm main còn gọilàđốisố dòng lệnh (command line arguments). • Hàm main có 2 tham số là argvg và argc dùng để nhậncácđốisố dòng lệnh. int main(int argc, char *argv[]) {return0;}
  31. 7.Đối số của hàm main – Tham số argclàmộtbiếnnguyên giữ số đốisố có trong dòng lệnh. –Thamsố argv là mộtmảng con trỏ char. Mỗi phầntử củamảng này trỏđếnmột đốisố dòng lệnh. Tấtcảđốisố dòng lệnh là chuổi (string).
  32. Ví dụ: int main (int argc, char *argv []) { if(argc!=2) { cout << “Hello , “ << argv[1]; exit(1); } return 0; }
  33. 8. Lệnh return • 8.1. Cách dùng thứ nhất (kết thúc hàm) Có hai cách để kếtthúcsự thựcthicủa hàm và trảđiềukhiểnvề chương trình gọinó. –Khi lệnh cuối cùng có trong hàm được thực thi. – Khi hàm thựchiệncâulệnh return
  34. Ví dụ: In các phần tử của mảng đến khi gặp phần tử có giá trị âm int main() { int a[] = { {,,,,3,2,1,0,-1,-2,-3}; for(int i=0 ; i<7 ; i++) { if(a[i] < 0) return 0; cout << a[i] << “\t”; } }
  35. 8. Lệnh return • 7.2. Cách dùng thứ hai (trả về một giá trị) – Lệnh return cho ppphép mộthàmtrả về mộtgiátrị cho thành phầngọinó. – Cú pppháp: return biểu thức;
  36. – Trong đó biểu thức chỉ rõ giá trịđược trả về bởihàm.Kiểucủagiátrị này phải hợpvớikiểutrả về củahàm. – Trường hợp kiểutrả về của hàm là void, biểuthức sau lệnh return rỗng: return;
  37. 9. ĐỆ QUI •Mộthàmđược gọilàđệ qui nếumộtlệnh trong thân hàm gọi đến chính hàm đó. •Ví dụ: Định nghĩa giai thừa của một số nggyuyên dương n như sau: n!=1* 2 * 3 * * (n-1) *n = (n-1)! *n (với 0!=1)
  38. 9. ĐỆ QUI int giaiThua(int n) { int gt; if(n==1) return(1); gt = giaiThua(n-1)*n; // goi de qui return gt; }
  39. 9. ĐỆ QUI unsigned int giaithua_khongdequy(int n) { unsigned int kq, i; kq=1; for (i=2;i<=n;i++) kq=kq*i; return kq; }