Xem mẫu
- BÀI GIẢNG HỌC PHẦN
KỸ THUẬT LẬP TRÌNH
CHƯƠNG 5: XÂY DỰNG VÀ SỬ DỤNG HÀM
- Nội dung
5.1. Vai trò của hàm
5.2. Cấu trúc hàm
5.3. Lời gọi hàm và vấn đề truyền tham số
5.4. Hàm đệ quy
2
- 5.1. Vai trò của hàm (1)
• Hàm:
- Chương trình con cho phép thực hiện một nhiệm vụ
cụ thể, chuyên biệt cho chương trình chính
- Được định nghĩa với một tên gọi xác định, có thể có
nhiều tham số đầu vào/đầu ra
- Thường trả về một kết quả thông qua tên hàm (có
thể không)
• Vai trò của hàm:
- Cho phép chia chương trình thành những phần nhỏ
để có thể dễ dàng xây dựng, quản lý, hiệu chỉnh
phương pháp lập trình có cấu trúc
- Có thể được gọi thực hiện lặp đi lặp lại nhiều lần
với các tham số khác nhau khả năng tái sử dụng
3
- 5.1. Vai trò của hàm (2)
• Phân loại hàm:
- Hàm chuẩn (các hàm do trình biên dịch đã xây dựng
sẵn, muốn sử dụng chúng cần khai báo tệp tiêu đề
tương ứng, ví dụ: muốn sử dụng hàm sqrt(x) cần
khai báo tệp tiêu đề math.h)
- Hàm do người dùng tự định nghĩa
• Lưu ý:
- Trong một chương trình viết bằng ngôn ngữ C, hàm
main() là bắt buộc phải có và được thực thi đầu tiên
- Các hàm xây dựng trong chương trình (trừ hàm
main()) nên được khai báo nguyên mẫu ở phần đầu
chương trình
4
- 5.2. Cấu trúc hàm (1)
kiểu_dữ_liệu_trả_về tên_hàm(danh_sách_tham_số)
{
các_khai_báo;
các_lệnh;
[return biểu_thức;]
}
trong đó:
- kiểu_dữ_liệu_trả_về: có thể là kiểu bất kỳ (char, int,
float, …) ngoại trừ kiểu mảng. Nếu hàm không trả
về giá trị thì dùng từ khóa void
- tên_hàm: đặt theo quy định đặt tên, phản ánh nội
dung hàm
- danh_sách_tham_số: là các tham số hình thức, được
khai báo giống như khai báo biến
5
- 5.2. Cấu trúc hàm (2)
- các_khai_báo: khai báo các đối tượng cục bộ chỉ có
phạm vi sử dụng trong nội bộ hàm
Các lưu ý về phạm vi sử dụng của các biến cục bộ
được khai báo trong hàm tương tự như các lưu ý đối
với các biến được khai báo trong khối lệnh (bài
giảng chương 1 - slide 43)
- biểu_thức: cho giá trị là giá trị trả về qua tên hàm
6
- 5.2. Cấu trúc hàm (3)
• Ví dụ:
- Hàm tính tổng 2 số: Cách viết khác:
int tong(int x,int y) int tong(int x,int y)
{ {
int s; return (x+y);
s=x+y; }
return s;
}
7
- 5.2. Cấu trúc hàm (4)
• Ví dụ: (tiếp)
- Hàm tính diện tích tam giác:
float dttg(float x, float y, float z)
{
float p,s;
p=(x+y+z)/2;
s=sqrt(p*(p-x)*(p-y)*(p-z));
return s;
}
8
- 5.3. Lời gọi hàm và vấn đề truyền tham số
• Lời gọi hàm
• Vấn đề truyền tham số
9
- Lời gọi hàm
• Cú pháp:
tên_hàm(danh_sách_tham_số)
trong đó: danh_sách_tham_số gồm các tham số thực
sự
- Ví dụ:
tong(4,5)
dttg(3,4,5)
…
10
- Vấn đề truyền tham số
• Tham số hình thức: khai báo trong cấu trúc hàm
• Tham số thực sự: đặt trong lời gọi hàm
• Các tham số hình thức và các tham số thực sự cần
“tương thích” với nhau
• Khi xây dựng hàm, ta không cần quan tâm đến giá
trị của các tham số thực sự là bao nhiêu mà chỉ cần
quan tâm đến việc cần thực hiện các thao tác tính
toán và xử lý dữ liệu dựa trên các tham số hình thức
như thế nào để thu được kết quả trả về qua tên hàm
• Khi có lời gọi hàm, các tham số thực sự được
“truyền” cho các tham số hình thức (truyền giá
trị/địa chỉ)
11
- Ví dụ (1)
• Chương trình tính tổng 2 số a, b:
#include int tong(int x,int y)
int tong(int x,int y); {
int main(void) return (x+y);
{ int a,b; }
printf("Nhap a = ");
scanf("%d",&a);
printf("Nhap b = ");
scanf("%d",&b);
printf("a+b = %d",tong(a,b));
return 0;
}
12
- Ví dụ (2)
• Chương trình tính diện tích tam giác:
#include
#include
float dttg(float x,float y,float z);
int main(void)
{
float a,b,c;
lap: printf("Nhap do dai 3 canh: ");
printf("\na = ");scanf("%f",&a);
printf("b = ");scanf("%f",&b);
printf("c = ");scanf("%f",&c);
13
- Ví dụ (3)
• Chương trình tính diện tích tam giác: (tiếp)
if (a
- Ví dụ (4)
• Chương trình tính diện tích tam giác: (tiếp)
printf("Dien tich tam giac la: %6.2f",dttg(a,b,c));
return 0;
}
float dttg(float x, float y, float z)
{
float p,s;
p=(x+y+z)/2;
s=sqrt(p*(p-x)*(p-y)*(p-z));
return s;
}
15
- Lưu ý
• Khi xây dựng hàm cần chú ý các nguyên tắc sau:
- Mỗi hàm chỉ nên thực hiện 1 công việc duy nhất
- Độc lập với các hàm khác
- Khả năng tái sử dụng càng cao càng tốt
- Các tham số của hàm cần được chỉ rõ
- Trong thân hàm nên sử dụng các biến cục bộ, hạn
chế tối đa việc sử dụng các biến toàn cục
- Hàm nên che giấu thông tin
• Bài toán: tính tổng S = a! + b!
Chương trình?
16
- 5.4. Hàm đệ quy (1)
• Trong thân hàm có lời gọi tới chính nó
• Áp dụng với các bài toán có giải thuật mang tính đệ
quy
• Giá trị trả về của hàm đệ quy cần được xác định rõ
trong 2 trường hợp:
- Trường hợp suy biến: hàm trả về một giá trị cụ thể
- Trường hợp đệ quy: giá trị trả về của hàm được xác
định qua lời gọi tới chính nó
Ví dụ: Tính n! (n không âm)
Sử dụng hàm đệ quy:
- Trường hợp suy biến: n=0, khi đó 0! = 1
- Trường hợp đệ quy: n>0, khi đó n! = n*(n-1)!
17
- 5.4. Hàm đệ quy (2)
• Chương trình tính n!
#include long gt(int k)
long gt(int k); {
int main(void) if (k>0)
{ return gt(k-1)*k;
int n; else return 1;
printf("Nhap so n = "); }
scanf("%d",&n);
printf("%d! = %ld",n,gt(n));
return 0;
}
18
- 5.4. Hàm đệ quy (3)
• Chương trình tìm (a,b)
#include
int ucln(int x, int y);
int main(void)
{
int a,b;
printf("Nhap 2 so nguyen duong: ");
printf("\na = ");scanf("%d",&a);
printf("b = ");scanf("%d",&b);
printf("(%d,%d) = %d",a,b,ucln(a,b));
return 0;
}
19
- 5.4. Hàm đệ quy (4)
• Chương trình tìm (a,b) (tiếp)
int ucln(int x, int y)
{
int temp;
if (x
nguon tai.lieu . vn