Chú ý khai báo và định nghĩa hàm - Danh sách đối trong khai báo hàm có thể chứa hoặc không chứa tên đối - Cuối khai báo hàm phải có dấy chấm phẩy ;m trong khi cuối dòng đầu tiên của đ
Trang 5 Chú ý khai báo và định nghĩa hàm
- Danh sách đối trong khai báo hàm có thể chứa hoặc
không chứa tên đối
- Cuối khai báo hàm phải có dấy chấm phẩy (;)m trong khi cuối dòng đầu tiên của định nghĩa hàm không có dấu chấm phẩy
- Hàm có thể không có đối , tuy nhiên cặp dấu ngoặc sau yên hàm vẫn phải được viết
- Một hàm có thể không cần khai báo nó , được định
nghĩa trước khi có hàm nào đó gọi đến nó
Trang 62 Tham số trong lời gọi hàm
Cú pháp tên hàm (danh sách tham chiếu
Trang 7• 3.Hàm với đối số mặc định
Cú pháp <kiểu hàm><tên hàm>(d1,
…,dn,đmd1=giá trị1,đmđm=gía trị m);
- Các đối dd1,…,đn với đối số mặc định đmđ1…
đmđm đều được khai báo như cũ, gồm có kiểu đối và tên đối
- VD
Xét hàm xmh(int n=100);// trong đó n mặc định
là 100
Trang 84 Khai báo hàm trùng tên
- Hàm trùng tên hay còn giụ là hàm chồng đè
- Đây là 1 kĩ thuật cho phép sử dụng cùng 1 ten gọi cho các hàm giống nhau nhưng xử lí trên các kiểu dữ liệu khác nhau
Trang 10Bảng tóm tắt 3 cách viết hàm thông qua ví
dụ đổi biến số
Tham trị Tham chiếu Dẫn trỏ
Khai báo đối void swap(int x,inty) void swap(int
&x,int&y) void swap(int *x,int*y)
Câu lệnh t=x;x=y;y=t; t=x;x=y;y=t t=*x;x=*y;*y=t
Lời gọi swap(a,b); swap(a,b) swap(&a,&b)
Tác dụng a,b không đổi a,b thay đổi a,b thay đổi
Trang 116 Hàm và mảng dữ liệu
a.Truyền mảng 1 chiều cho con trỏ
-Thông thường chúng ta xây dựng các hàm làm việc trên mảng
nhưvesctohay ma trận các phần tử.Khi đó tham đối thực sự của hàm sẽ
là các mảng dữ liệu này
-VD Hàm nhập giá trị cho các véc tơ
void nhâp(int x[],int n)// n số phần tử
int a[10];// mảng a chứa tối đa 10 phần tử
nhap(a,7);//vào 7 phần tử đầu tiên cho a
Int(a,3);// ra 3 phần tử đầu tiên của a
}
Trang 12b Truyền mảng 2 chiều cho con trỏ
for(j=0;j<n;j++)
{ cout <<“a[“<<i<<“,”<<j<<“]=“;cin>>a[i][j];
}
cout<<“ Nhạp số dòng ,số cột ma trận b:”;cin>>mb>>nb; for(i=0;i<mb;i++)//nhập ma trận b
Trang 13c.Giá trị trả lại của hàm 1 mảng
-nếu muốn trả lại giá trị con trỏ thì vùng dữ liệu mà nó trỏ đến phải được cấp phát 1 cách bình tường minh, chứ không để chương trình tự động cấp phát và thu hồi.
VD
int* tragiatri1()//giá trị trả lại là con trỏ đến dãy số nguyên
{
int kp[3]={1,2,3}; tạo mảng kết quả với 3 giá trị 1,2,3
return kb;// trả lại địa chỉ cho con trỏ kết quả hàm
Trang 14d Đối và giá trị trả lại là xâu kí tự
- Giống các trường hợp đã xét với mảng 1 chiều , đối của các xâu kí tự có thể khai báo dưới 2
dạng: mảng kí tự hoặc con trỏ kí tự Giá trị trả lại luôn luôn là con trỏ kí tự.ngoài ra hàm cũng
có thể trả lại giá trị vào trong các đối con trỏ trong danh sách biến
Trang 15e Đối là hằng con trỏ
VD Đối con trỏ in ra 1 xâu kí tự
void inhoa(const char*s)
Trang 167 Cấp lưu trữ và phạm vi hoạt động của các đối tượng
a.Biến cục bộ
- Là biến được khai báo trong thân của
hàm và chỉ có tác dụng trong hàm này, kể cả các biến khai báo trong hàm main() cũng chỉ
có tác dụng riêng tronghamf main()
- Các biến trong hàm này được phép trùng
nhau.Các biến của hàm nào sẻ chỉ tồn tại
trong thời gian hàm đó hoạt động
- => một hàm được xem như 1 đơn vị độc lập
khép kín.
Trang 17- Thời gian hoạt động của nó từ lúc chương
trình bắt đầu chạy đến khi kết thúc chương
trình giống như các biến tronghamf main()
- => Biến ngoài sẽ có tác dụng lên toàn bộ
chương trình
Trang 18c Biến hằng với từ khóa const
- Để sử dụng hằng có thể khai bái thêm từ khóa const trước khai báo biến Phạm vi và miền tác dụng cũng như biến, có nghĩa biến hằng cũng có thể ở dạng cục
bộ hoặc toàn thể Biến hằng luôn được khởi tạo trước.
- VD
- Const int max=30;// toàn thể
- Void vidu(const int*p)//cục bộ
{
Const mã=10;//cục bộ
….
}
Trang 19d Biến tĩnh và từ khóa static
- Được khai báo bằng từ khóa static Là biến cục
bộ nhưng vẫn giử giá trị sau khi ra khỏi hàm Phạm vi tác dụng như biến cục bộ ,nghĩa là nó được sử dụng trong hàm khai báonó Tuy
nhiên thời tác dụng được xem như biến toàn thể, tức sau khi hàm thực hiện xong trong
biến vẫn còn tồn tại và vẫn lưu lại giá trị sau khi ra khỏi hàm
Trang 208 Con trỏ hàm
a, Khai báo
• <kiểu giá trị>(*tên biến hàm)(danh sách tham số);
• <kiểu giá trị>(*tên biến hàm)(danh sách tham
Trang 21c Sử dụng con trỏ hàm
- Để sử dụng con trỏ hàm ta phải gán nó với tên hàm cụ thể và sâu bất kuf nơi nào được phép xuất hiện tên hàm thì ta dều
có thể thay thế nó bằng tên con trỏ
- VD Dùng tên con trỏ để gọi hàm
float bphuong(floatx)// hàm trả lại x2
Trang 22void nhan(int a,int b){cout<<a<<“*”<<b<<“=“<<a*b;}
void chia(int a,int b){cout<<a<<“/”<<b<<“=“<<a/b;}
Trang 23int n; double kq=1;cCout<<“n=“;cin>>n;
for (int i=1;i<=n;i++)
kq*=i;
cout<<n<<“!=“<<kq;
}
Trang 24b.Lớp các bài toán giải đc bằng đệ qui
Phương pháp đệ qui thường đc dùng để giải các bài toán có đặc điểm:
- Giải quyết đc dễ dàng trong các trường hợp riêng gọi là trường hợp suy biến hay cơ sở , trong
trường hợp này hàm được tính bình thường mà không cần gọi lại chính nó
- Đối với trường hợp tổng quát, bài toán có thể giải được bằng bài toán cùng dangjnhuwng với tham đối khác có kích thước nhỏ hơn tham số ban đầu
Và sau một số bước hữu hạn biến đổi cùng dạng , bài toán chưa được về trường hợp suy biến.
Trang 25c Cấu trúc chung của 1 hàm đệ qui
if ( trường hợp suy biến)
{
trình bày cách giải}
else
{
gọi hàm với tham số bé hơn}
Trang 26Ví Dụ Tìm số hạng bé nhất trong dãy Fibonacilong fib(int n)
Trang 28The End