chƯƠng 6 hÀm (function)

39
CHƯƠNG 6 HÀM (FUNCTION)

Upload: durin

Post on 07-Feb-2016

56 views

Category:

Documents


0 download

DESCRIPTION

CHƯƠNG 6 HÀM (FUNCTION). 1. KHÁI NiỆM. Hàm là một khối lệnh thực hiện một công việc hoàn chỉnh (module), được đặt tên và được gọi thực thi nhiều lần tại nhiều vị trí trong chương trình . Hàm còn gọi là chương trình con ( subroutine ). 1. KHÁI NiỆM. Có hai lọai hàm : - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: CHƯƠNG 6 HÀM (FUNCTION)

CHƯƠNG 6HÀM (FUNCTION)

Page 2: CHƯƠNG 6 HÀM (FUNCTION)

1. KHÁI NiỆMHàm là một khối lệnh thực hiện một

công việc hoàn chỉnh (module), được đặt tên và được gọi thực thi nhiều lần tại nhiều vị trí trong chương trình.

Hàm còn gọi là chương trình con (subroutine)

Page 3: CHƯƠNG 6 HÀM (FUNCTION)

1. KHÁI NiỆMCó hai lọai hàm:

Hàm thư viện: là những hàm đã được xây dựng sẵn. Muốn sử dụng các hàm thư viện phải khai báo thư viện chứa nó trong phần khai báo #include.

Hàm do người dùng định nghĩa.

Page 4: CHƯƠNG 6 HÀM (FUNCTION)

1. KHÁI NiỆMHàm có thể được gọi từ chương trình

chính (hàm main) hoặc từ 1 hàm khác.Hàm có giá trị trả về hoặc không. Nếu

hàm không có giá trị trả về gọi là thủ tục (procedure)

Page 5: CHƯƠNG 6 HÀM (FUNCTION)

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

}

Page 6: CHƯƠNG 6 HÀM (FUNCTION)

2. DẠNG TỔNG QUÁT CỦA HÀM

returnType: Kiểu dữ liệu của giá trị trả về bởi hàm. Nếu hàm không trả về giá trị thì returnType là void

functionName: Tên hàm.parameterList: Danh sách các tham

số hình thức phân cách nhau bởi dấu phẩy..

Page 7: CHƯƠNG 6 HÀM (FUNCTION)

VÍ DỤint max(int a, int b){if(a<b)

return b;else

return a;}

Page 8: CHƯƠNG 6 HÀM (FUNCTION)

3. GỌI HÀMMột hàm khi đã định nghĩa nhưng

chúng vẫn chưa được thực thi, hàm chỉ được thực thi khi trong chương trình có một lời gọi đến hàm đó.

Cú pháp gọi hàm:

<Tên hàm>([Danh sách các tham số])<Tên hàm>([Danh sách các tham số])

Page 9: CHƯƠNG 6 HÀM (FUNCTION)

VÍ DỤGọi hàm trong chương trình chính:

void main(){ int a, b;

cout<<” a=“; cin>>a; cout<<”b=“; cin>>b;

cout<<”so lon nhat la:”<<max(a, b);

}

Page 10: CHƯƠNG 6 HÀM (FUNCTION)

4. NGUYÊN TẮC HOẠT ĐỘNG CỦA HÀMHàm có thể được gọi từ nhiều chỗ

khác nhau trong chương trình.

Khi hàm được gọi, khối lệnh tương ứng của hàm được thực thi.

Sau khi thực hiện xong, quyền điều khiển được trả về cho chương trình gọi.

Page 11: CHƯƠNG 6 HÀM (FUNCTION)

4. NGUYÊN TẮC HOẠT ĐỘNG CỦA HÀM

void main(){

int a, b, USC;cout<<“Nhap a,b: ”;cin>>a>>b;USC = uscln(a,b);cout<<“Uoc chung lon nhat la: ”, USC);

}

int uscln(int a, int b)

{a=abs(a);b=abs(b);while(a!=b){

if(a>b) a-=b;else b-=a;

}return a;}

Page 12: CHƯƠNG 6 HÀM (FUNCTION)

5. THAM SỐ HÌNH THỨC &THAM SỐ THỰC

Khi hàm cần nhận đối số (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ọi là tham số hình thức.

Page 13: CHƯƠNG 6 HÀM (FUNCTION)

5. THAM SỐ HÌNH THỨC &THAM SỐ THỰC

Ví dụ: int min(int a, int b)

{if(a<b)

return a;else

return b;}

Tham số hình thức

Page 14: CHƯƠNG 6 HÀM (FUNCTION)

5. THAM SỐ HÌNH THỨC &THAM SỐ THỰC

Khi gọi hàm, ta cung cấp các giá trị thật, các giá trị này sẽ được sao chép vào các tham số hình thức và các giá trị thật được gọi là tham số thực.

Ví dụ: Để tìm giá trị nhỏ nhất của 2 số 5 và 6 ta gọi hàm min(5, 6)

min(int a, int b)

Tham số thực

Page 15: CHƯƠNG 6 HÀM (FUNCTION)

5. THAM SỐ HÌNH THỨC &THAM SỐ THỰC

Có hai cách truyền đối số vào tham số hình thức: Truyền tham trịTruyền tham biến.

Page 16: CHƯƠNG 6 HÀM (FUNCTION)

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ủa hàm.

Những thay đổi của tham số không ảnh hưởng đến giá trị của đối số.

Page 17: CHƯƠNG 6 HÀM (FUNCTION)

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;

}

Page 18: CHƯƠNG 6 HÀM (FUNCTION)

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;

}

Page 19: CHƯƠNG 6 HÀM (FUNCTION)

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;

}

void double( int a ){

a = a *2;//cout << “Gia tri cua a trong ham double:“<< a;

}

40 a=40*2;

Gia tri cua a trong ham double: 80Gia tri cua a trong ham main: 40

Page 20: CHƯƠNG 6 HÀM (FUNCTION)

5. THAM SỐ HÌNH THỨC &THAM SỐ THỰCTruyền tham chiếu (call by reference)Sao chép địa chỉ của đối số vào tham số hình thức. Do đó, những thay đổi đối với tham số sẽ có tác dụng trên đối số.

Ví dụ: Khi gọi hàm double(&a);Địa chỉ của a truyền vào cho tham số hình thức của hàm: double(int *b)

Page 21: CHƯƠNG 6 HÀM (FUNCTION)

5. THAM SỐ HÌNH THỨC &THAM SỐ THỰC

void double(int *b){ *b *= 2; cout << “Trong hàm double a = “ <<

*b;}

Page 22: CHƯƠNG 6 HÀM (FUNCTION)

5. THAM SỐ HÌNH THỨC &THAM SỐ THỰC

void main(){ int a=40; double(&a); cout << “\Trong ham

main : a = “ << a ;}

void double( int *b){ *b *= 2; cout << “Trong hàm

double a = “ << *b;}

40a100100

b

80

Trong hàm double a = 80Trong hàm main a = 80

Page 23: CHƯƠNG 6 HÀM (FUNCTION)

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; }

Page 24: CHƯƠNG 6 HÀM (FUNCTION)

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;

}

Page 25: CHƯƠNG 6 HÀM (FUNCTION)

6. PROTOTYPE (NGUYÊN MẪU)CỦA HÀMDùng để loại trừ việc bắt buộc phải

định nghĩa hàm trước khi gọi.Prototype khai báo giống như header

của hàmVí dụ:

Header : void dispayMessage()Prototype : void dispayMessage()

Page 26: CHƯƠNG 6 HÀM (FUNCTION)

6. PROTOTYPE (NGUYÊN MẪU)CỦA HÀMChương trình bắt buộc phải có prototype của hàm hoặc phải bắt buộc viết định nghĩa của hàm trước khi gọi.

Sau khi đã sử dụng prototype của hàm, ta có thể viết định nghĩa chi tiết hàm ở bất kỳ vị trí nào trong chương trình.

Page 27: CHƯƠNG 6 HÀM (FUNCTION)

VÍ DỤ#include <iostream.h>// Khai báo thư viện iostream.hint 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<<” Nhap vao 2 so a, b ";cin>>a>>b;cout<<”so lon nhat la:”<< max(a,b);

}int max(int x, int y)// Định nghĩa hàm max(a,b){

return (x>y) ? x:y;}

Page 28: CHƯƠNG 6 HÀM (FUNCTION)

6. Truyền mảng vào hàmKhi một mảng được dùng như một

đối số để truyền cho hàm, địa chỉ của mảng được truyền vào tham số hình thức.

Như vậy, truyền mả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.

Page 29: CHƯƠNG 6 HÀM (FUNCTION)

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;

}

Page 30: CHƯƠNG 6 HÀM (FUNCTION)

7.Đối số của hàm mainĐối số truyền vào cho tham số của

hàm main còn gọi là đối số dòng lệnh (command line arguments).

Hàm main có 2 tham số là argv và argc dùng để nhận các đối số dòng lệnh.

int main(int argc, char *argv[]){ return 0;}

Page 31: CHƯƠNG 6 HÀM (FUNCTION)

7.Đối số của hàm mainTham số argc là một biến nguyên giữ số đối số có trong dòng lệnh.

Tham số argv là một mảng con trỏ char. Mỗi phần tử của mảng này trỏ đến một đối số dòng lệnh. Tất cả đối số dòng lệnh là chuổi (string).

Page 32: CHƯƠNG 6 HÀM (FUNCTION)

Ví dụ:int main(int argc, char *argv[]){

if(argc!=2) { cout << “Hello, “ << argv[1];

exit(1); }return 0;

}

Page 33: CHƯƠNG 6 HÀM (FUNCTION)

8. Lệnh return8.1. Cách dùng thứ nhất (kết thúc hàm)

Có hai cách để kết thúc sự thực thi của hàm và trả điều khiển về chương trình gọi nó.

Khi lệnh cuối cùng có trong hàm được thực thi.

Khi hàm thực hiện câu lệnh return

Page 34: CHƯƠNG 6 HÀM (FUNCTION)

8. Lệnh returnVí 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”;

}}

Page 35: CHƯƠNG 6 HÀM (FUNCTION)

8. Lệnh return8.2. Cách dùng thứ hai (trả về một giá trị)Lệnh return cho phép một hàm trả về một giá trị cho thành phần gọi nó.

Cú pháp:return biểu thức;

Page 36: CHƯƠNG 6 HÀM (FUNCTION)

8. Lệnh returnTrong đó biểu thức chỉ rõ giá trị được trả về bởi hàm. Kiểu của giá trị này phải hợp với kiểu trả về của hàm.

Trường hợp kiểu trả về của hàm là void, biểu thức sau lệnh return rỗng:

return;

Page 37: CHƯƠNG 6 HÀM (FUNCTION)

9. ĐỆ QUIMột hàm được gọi là đệ qui nếu một

lệ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ố nguyên dương n như sau:

n!=1* 2 * 3 *…* (n-1) *n = (n-1)! *n (v i 0!=1)ớ

Page 38: CHƯƠNG 6 HÀM (FUNCTION)

9. ĐỆ QUIint giaiThua(int n) {

int gt;if(n==1) return(1);gt = giaiThua(n-1)*n; // goi de quireturn gt;

}

Page 39: CHƯƠNG 6 HÀM (FUNCTION)

9. ĐỆ QUIunsigned int giaithua_khongdequy(int

n){

unsigned int kq, i;kq=1;for (i=2;i<=n;i++)

kq=kq*i;return kq;

}