Nội dung Khai báo và định nghĩa hàm Tham số trong lời gọi hàm Địa chỉ và con trỏ Con trỏ hàm Khái niệm Khai báo biến con trỏ hàm Tham số hình thức của hàm là con trỏ hàm Đệ q
Trang 1NGÔN NGỮ LẬP TRÌNH C
HÀM
Ninh Thị Thanh Tâm Khoa CNTT – HV Quản lý Giáo dục
Trang 3Nội dung
Khai báo và định nghĩa hàm
Tham số trong lời gọi hàm
Địa chỉ và con trỏ
Con trỏ hàm
Khái niệm
Khai báo biến con trỏ hàm
Tham số hình thức của hàm là con trỏ hàm
Đệ quy
Trang 4Lời gọi hàm
Định nghĩa hàm
Trang 5Khái niệm liên quan đến hàm
Trang 6 Tên_hàm là tên hợp lệ
Kiểu giá trị trả về là kiểu dữ liệu của kết quả trả
lại cho hàm gọi nó
Nếu là void thì hàm không trả lại giá trị
Nếu không xác định kiểu giá trị trả về trình biên dịch
sẽ ngầm định là int
Danh sách tham số: mô tả kiểu dữ liệu cùng
thứ tự của các tham số hàm nhận khi được gọi
Nếu hàm không nhận tham số, danh sách tham số là
void
Cần ghi rõ kiểu của tham số, nếu không ghi được
ngầm định là int
Trang 7Khai báo và định nghĩa hàm
Khai báo hàm (nguyên mẫu của hàm):
[kiểu giá trị trả về] Tên_hàm([danh sách tham số]);
Trang 8 Có thể có nhiều câu lệnh return
Giá trị của biểu thức trong câu lệnh return được gán cho hàm
Có thể không sử dụng return
return; ~ hàm không trả về giá trị (có thể không có)
Trang 9Ví dụ
Hàm trả về giá trị là một số nguyên Tham số là hai số nguyên
int max(int a, int b) {… }
Hàm trả về giá trị là một con trỏ thực Tham số là một số nguyên
float *nhap(int n) {… }
Hàm trả về một số thực Tham số
là một biến mảng thực hoặc một con trỏ thực
float sum(float *a) {… }
Hàm trả về giá trị là một số nguyên Tham số là một mảng số thực 20 phần tử
int count(float a[20]) {… }
Ý nghĩa Định nghĩa hàm
Trang 10Hàm nguyên mẫu
Thông báo cho trình biên dịch biết kiểu dữ liệu hàm trả lại, số lượng, kiểu và thứ tự của các tham số được truyền cho hàm
Dùng để kiểm tra lời gọi hàm
Không cần chỉ rõ tên của tham số hình thức
Trang 11Tham số trong lời gọi hàm
Khái niệm
Tham số hình thức: là các tham số được khai báo trong phần danh sách tham số trong định nghĩa hàm
Tham số thực: các thông tin được truyền cho hàm trong các lời gọi hàm
Mỗi tham số thực tương ứng với một tham số hình thức
Kiểu dữ liệu của tham số hình thức quyết định kiểu giá trị của tham số thực
Trang 13Chú ý
Hàm không cho giá trị thì dùng kiểu void
Hàm không đối dùng void để khai báo đối
Giá trị của biểu thức được chuyển kiểu
phù hợp với kiểu của hàm trước khi được gán cho hàm
Trang 15Truyền thông tin cho hàm
Truyền theo trị
Tạo ra một bản sao giá trị của tham số thực
Giá trị của tham số thực không bị thay đổi
Tham số thực có thể là biến, hằng, biểu thức
Truyền theo tham biến
Truyền trực tiếp giá trị tham số cho hàm được gọi (tham số hình thức và thực là một)
Tham số thực bắt buộc phải là biến
Giá trị của tham số thực có thể bị thay đổi
Trang 16Truyền tham số trong C
Trong C, tất cả các tham số được truyền theo trị
Trang 17void swap(int x, int y){
Trang 18Địa chỉ
Các khái niệm liên quan đến biến
Tên biến
Kiểu biến
Giá trị của biến
Địa chỉ của biến là số thứ tự của byte đầu
tiên trong một dãy các byte liên tiếp máy dành cho biến
Phép toán lấy địa chỉ: &
Trang 19Con trỏ
Khái niệm: con trỏ là một biến/hằng có giá trị là địa chỉ của một đối tượng khác
Đối tượng: biến hoặc hàm
Cho phép ta tham chiếu đến một biến thông qua địa chỉ
Trang 20Khai báo biến con trỏ
Cú pháp: type *ptr_name
type là kiểu dữ liệu của biến mà con trỏ chứa địa chỉ
ptr_name là tên của biến trỏ
type* là một kiểu dữ liệu con trỏ
Biến trỏ chưa chỉ đến địa chỉ nào có giá trị
NULL
Trang 21Tham số hình thức của hàm là con trỏ
Tham số hình thức của hàm là con trỏ
Tham số thực tương ứng phải là một địa chỉ
Có thể thay đổi giá trị của biến với địa chỉ
được truyền
Trang 23Kết quả
Trang 24Khi nào sử dụng đối con trỏ
Con trỏ kiểu int (float, double)
Địa chỉ kiểu int (float, double)
Biến kiểu int (float, double)
Giá trị kiểu int (float, double)
Đối tương ứng Tham số thực
Trang 26void swap2(int *i, int *j){ int temp;
printf("%d\t%d",n,m); printf("\nswap2\n"); swap2(&n,&m);
printf("%d\t%d",n,m); getch();
}
Trang 27Kết quả
Trang 28Ví dụ
#include <stdio.h>
#include <conio.h>void nhap(char *c) {printf("Nhap ");
fflush(stdin);
scanf("%c",c);
}
void show(char c) {printf("%c\n",c);
Trang 30Kết quả
Trang 32Khái niệm hàm đệ quy
Bên trong thân của hàm có lời gọi tới
chính hàm đó
Khi gọi đệ quy
Máy tạo ra một tập các biến cục bộ độc lập với tập biến cục bộ đã được tạo ra trong các lần gọi trước
Có bao nhiêu lần gọi tới hàm thì cũng có bấy nhiêu lần thoát ra khỏi hàm
Trang 33Cách dùng đệ quy
Áp dụng cho lớp bài toán
Dễ dàng giải quyết trong trường hợp riêng
(trường hợp suy biến)
Trường hợp tổng quát:
Đưa về bài toán cùng dạng, tham số thay đổi
Sau một số hữu hạn bước biến đổi, dẫn tới trường hợp suy biến
Trang 34else /*trường hợp tổng quát*/ {
Gọi đệ quy tới hàm (đang lập)với giá trị khác của tham số
}
Trang 35}
Trang 37Ví dụ - ước chung lớn nhất
int ucln(int x, int y){
if (x==y) return x;
else if (x>y) return ucln(x-y,y);
else return ucln(x,y-x);
}
Trang 38Con trỏ hàm
Con trỏ hàm là con trỏ trỏ đến điểm xâm nhập vào hàm
Có thể sử dụng thay cho tên hàm
Cho phép các hàm cũng được truyền như là các tham số cho các hàm khác
Trang 39Khai báo biến con trỏ hàm
Cú pháp:
[kiểu giá trị] (*tên biến con trỏ hàm)([danh sách tham số]);
Con trỏ hàm nhận giá trị là tên của các
hàm có cùng kiểu giá trị trả về và kiểu giá trị của các tham số
Trang 40Ví dụ
float (*f)(float)
Khai báo f là con trỏ hàm kiểu float và có đối
là float
double (*g)(int, double)
Khai báo g là con trỏ hàm kiểu double có các
đối int và double
Trang 41Tác dụng của con trỏ hàm
Chứa địa chỉ của hàm
Thực hiện phép gán tên hàm cho con trỏ hàm
Kiểu hàm và kiểu con trỏ phải tương thích
Trang 42return 0;
}
Trang 43Kết quả
Trang 44Nếu đối được khai báo: float (*f)(float, int)
Sử dụng trong thân hàm: f(x,n) hoặc (f)(x,n) hoặc (*f)(x,n)
Trang 46printf("TP4 = %f\n",tichphan(g,0,2.0));
getch();
}
Trang 47Kết quả
Trang 48Thư viện các hàm toán học
cos(0.0)=1 cos của x
cos(x)
tan(0.0)=0 tan của x
tan(x)
sin(0.0)=0 sin của x (x theo radian)
floor(-9.8)=-10 Làm tròn xuống
floor(x)
ceil(9.2)=10.0 Làm tròn lên
log10(x)
log(2.718282)=1.0 logarithm cơ số e của x
log(x)
exp(1.0)=2.718282 Hàm mũ ex
exp(x)
sqrt(9.00)=3.0 Căn bậc 2 của x
sqrt(x)
Ví dụ
Mô tả Hàm