KHOA CÔNG NGHỆ THÔNG TIN
BỘ MÔN CÁC HỆ THỐNG THÔNG TIN
C Programming
Chương 4. Hàm
Hoang Huu Viet, PhD.,
E-mail:
Web: www.vinhuni.edu.vn/~viethh
Feb., 2014
Chương 4. Hàm
Mục đích và nội dung
Mục đích
Biết cách xây dựng các chương trình từ các khối nhỏ
hơn, gọi là các hàm.
Cách xây dựng hàm mới, hàm đệ quy.
Nội dung
Giới thiệu
Khai báo và định nghĩa hàm
Tham số trong lời gọi hàm
Cấp lưu trữ và phạm vi của các đối tượng
Con trỏ hàm và hàm đệ quy
Designed by Hoang Huu Viet, Computer Engineering Department.
Slide 2
Chương 4. Hàm
Giới thiệu
Tại sao phải xây dựng hàm?
Chia bài toán lớn thành các bài toán nhỏ hơn dễ
giải quyết các bài toán phức tạp.
Tránh viết lặp lại các dịng lệnh. Ví dụ tính Ckn nếu
khơng dùng hàm 3 đoạn lệnh tính giai thừa.
Làm cho chương trình lớn dễ hiểu và dễ bảo trì.
Các chương trình giải quyết các bài toán nhỏ
gọi là các hàm.
Các hàm truyền các tham số cho nhau bằng các
tham số vào/ra.
Designed by Hoang Huu Viet, Computer Engineering Department.
Slide 3
Chương 4. Hàm
Giới thiệu
Các hàm toán học thường dùng trong C
Yêu cầu: Mở tệp tiêu đề math.h
Một số hàm toán học:
sqrt(x): Căn bậc 2 của x
exp(x): Hàm ex
log(x): Hàm logarit cơ số e.
fabs(x): Giá trị tuyệt đối của x.
ceil(x): Làm trịn số ngun nhỏ nhất khơng lớn hơn x.
pow(x,y): Hàm xy
sin(x): Hàm sin(x)
...
Designed by Hoang Huu Viet, Computer Engineering Department.
Slide 4
Chương 4. Hàm
Định nghĩa hàm
Định nghĩa hàm
[Kiểu dữ liệu hàm] <Tên hàm>([danh sách tham số])
{
[Các khai báo của hàm]
...
<Nội dung hàm>
}
Nếu [Kiểu dữ liệu hàm] là void thì hàm khơng trả lại
giá trị nào cả (khơng có từ khóa return).
Nếu hàm khơng có tham số thì dùng kiểu void làm
tham số hoặc bỏ trống.
Designed by Hoang Huu Viet, Computer Engineering Department.
Slide 5
Chương 4. Hàm
Định nghĩa hàm
Ví dụ 1. Hàm tìm ckn.
#include <stdio.h>
Tham số của hàm
#include <conio.h>
int gt(int m)
Tên hàm
{
int t = 1;
Định nghĩa biến của
for (int i = 1; i <=m; i ++)
t
hàm
= t*i;
return t;
Giá trị trả về của hàm
}
void main()
Hàm void hàm khơng
{
có giá trị trả về.
int k, n;
printf(“\n nhap k va n :”); scanf(“%d%d”,&k,&n);
int ck = gt(n)/gt(k)*gt(n-k);
printf(“\n ket qua = %d”,ck);
getch();
}
Designed by Hoang Huu Viet, Computer Engineering Department.
Slide 6
Chương 4. Hàm
Tham số trong lời gọi hàm
Các khái niệm
Tham số hình thức: Là các tham số trong danh sách
tham số của hàm.
Tham số thực sự: Là các tham số trong lời gọi hàm.
Mỗi tham số thực sự tương ứng với 1 tham số hình
thức.
Ví dụ trong ví dụ trên:
Tham số m trong hàm gt() là tham số hình thức của ham
gt().
Tham số n, k trong hàm main() là tham số thực sự của hàm
gt().
Designed by Hoang Huu Viet, Computer Engineering Department.
Slide 7
Chương 4. Hàm
Tham số trong lời gọi hàm
Các khái niệm
Truyền theo tham trị (truyền giá trị): Một bản sao
giá trị của tham số thực được tạo ra và gán cho tham
số hình thức do đó mọi thay đổi trong hàm trên bản
sao giá trị sẽ không ảnh hưởng đến giá trị ban đầu
của biến nằm trong hàm gọi.
Truyền theo biến: Hàm sẽ truyền trực tiếp tham số
đó (bắt buộc phải là biến) cho hàm được gọi. Mọi
thay đổi giá trị trong hàm sẽ thay đổi giá trị của hàm
được gọi.
Designed by Hoang Huu Viet, Computer Engineering Department.
Slide 8
Chương 4. Hàm
Tham số trong lời gọi hàm
Truyền tham số trong C
Trong C, tất cả các tham số được truyền theo tham
trị.
Ví dụ: Viết chương trình hốn đổi giá trị của 2 biến
thực.
Tham số hình thức của hàm là con trỏ
Khi tham số hình thức là con trỏ thì tham số thực sự
tương ứng phải là một địa chỉ và tham số được
truyền theo kiểu tham biến.
Designed by Hoang Huu Viet, Computer Engineering Department.
Slide 9
Chương 4. Hàm
Tham số trong lời gọi hàm
Bài tập
1. Viết hàm hoán đổi giá trị của 2 biến.
2. Viết hàm tính diện tích, hàm tính chu vi của 1 tam
giác có tọa độ (x1,y1), (x2,y2) và (x3,y3). Viết
chương trình nhập vào các tọa độ của 1 tam giác, gọi
các hàm đã viết in ra diện tích và chu vi.
Designed by Hoang Huu Viet, Computer Engineering Department.
Slide 10
Chương 4. Hàm
Tham số trong lời gọi hàm
3. Viết các hàm:
Nhập mảng 1 chiều n số thực.
In mảng 1 chiều n số thực.
Viết hàm tìm giá trị lớn nhất
Viết hàm tìm giá trị bé nhất
Viết hàm tính tổng các phần tử của mảng.
Viết chương trình nhập vào 1 mảng 1 chiều n số thực. Gọi
các hàm đã viết.
Designed by Hoang Huu Viet, Computer Engineering Department.
Slide 11
Chương 4. Hàm
Cấp lưu trữ và phạm vi đối tượng
Khái niệm
Mỗi đối tượng (biến hoặc hàm) sử dụng trong 1
chương trình cần phải có các khai báo (và định
nghĩa). Các khai báo (và định nghĩa) này có thể được
đặt ở ngoài tất cả các hàm hoặc ở bên trong một
hàm nào đó (chỉ với các biến).
Các khai báo đặt ở các vị trí khác nhau làm cho đối
tượng được khai báo có các tính chất khác nhau thể
hiện ở: Phạm vi sử dụng, thời gian tồn tại, và cấp lưu
trữ.
Designed by Hoang Huu Viet, Computer Engineering Department.
Slide 12
Chương 4. Hàm
Cấp lưu trữ và phạm vi đối tượng
Khái niệm
Phạm vi của 1 đối tượng là phần chương trình mà
đối tượng đó cịn được “nhìn thấy” và có thể sử dụng
bởi phần chương trình đó. Phạm vi có thể là trong 1
khối lệnh, một hàm, 1 tệp nguồn hoặc tồn thể
chương trình.
Một số đối tượng có thời gian tồn tại ngắn, một số thì
liên tục được tạo ra và xố đi, một số khác tồn tại
trong st thời gian thực hiện chương trình.
Designed by Hoang Huu Viet, Computer Engineering Department.
Slide 13
Chương 4. Hàm
Cấp lưu trữ và phạm vi đối tượng
Khái niệm
Cấp lưu trữ của đối tượng được xác định dựa theo
vùng nhớ được cấp. Các đối tượng được cấp phát
bộ nhớ thường xun thì có cấp lưu trữ cố định
(static). Loại này gồm các hàm, các biến khai báo
ngoài hàm và một số biến cục bộ.
Các biến có cấp lữu trữ động được tạo ra ở khối
lệnh mà chúng khai báo, chúng tồn tại khi điều khiển
con đang trong khối và sẽ bị xoá khi quyền điều khiển
thoát ra khỏi khối.
Designed by Hoang Huu Viet, Computer Engineering Department.
Slide 14
Chương 4. Hàm
Cấp lưu trữ và phạm vi đối tượng
Khái niệm
Phạm vi, thời gian tồn tại và cấp lưu trữ của 1 đối
tượng được xác định bằng cách tổ hợp các từ khoá
chỉ định cấp lưu trữ với các khai báo cùng vị trí đặt
bên trong hay bên ngồi một hàm hay một khối lệnh.
Ngôn ngữ C cung cấp 4 từ khoá auto, extern, static,
register để chỉ phạm vi và thời gian tồn tại của các
biến.
Designed by Hoang Huu Viet, Computer Engineering Department.
Slide 15
Chương 4. Hàm
Cấp lưu trữ và phạm vi đối tượng
Khái niệm
auto: Từ khoá này được dùng để khai báo các biến
cục bộ. Tuy nhiên nó được ít dùng vì các biến cục bộ
ngầm định là auto rồi.
register: Từ khoá này được đặt trước khai báo của
các biến tự động nhằm u cầu chương trình dịch
duy trì giá trị biến đó trong thanh ghi của máy tính do
đó nâng cao tốc độ thực hiện chương trình (vì khi
truy nhập, thao tác dữ liệu trực tiếp trên thanh ghi là
nhanh nhất).
Designed by Hoang Huu Viet, Computer Engineering Department.
Slide 16
Chương 4. Hàm
Cấp lưu trữ và phạm vi đối tượng
Khái niệm
static: Từ khoá này đặt trước khai báo biến chỉ ra
rằng biến là biến tĩnh và có thời gian tồn tại cùng với
chương trình. Biến tĩnh được tạo ra khi khởi động
chương trình và giải phóng khi kết thúc chương trình.
extern: Từ khố này cho phép sử dụng các biến trên
phạm vi nhiều tệp.
Ví dụ tệp A có khai báo toàn cục: int x,y;
Tệp B muốn sử dụng biến x, y của A: extern int x,y.
Designed by Hoang Huu Viet, Computer Engineering Department.
Slide 17
Chương 4. Hàm
Khai báo hàm
Hàm nguyên mẫu
Một trong những đặc trưng của ANSI C là hàm
nguyên mẫu (dạng hàm). Hàm ngun mẫu thơng
báo cho chương trình dịch biết kiểu dữ liệu hàm trả
lại, số lượng, kiểu và thứ tự các tham số được truyền
cho hàm. Chương trình dịch dùng hàm nguyên mẫu
để kiểm tra lời gọi hàm.
Khai báo: [Kiểu dữ liệu] <Tên hàm>([danh sách tham số]);
Khai báo hàm nguyên mẫu cho phép viết hàm ở vị trí
bất kỳ.
Designed by Hoang Huu Viet, Computer Engineering Department.
Slide 18
Chương 4. Hàm
Khai báo hàm
Các tệp tiêu đề
Mỗi thư viện chuẩn tương ứng có một tệp tiêu đề
chứa các khai báo của tất cả các hàm trong thư viện
này cùng với các định nghĩa các kiểu dữ liệu khác
nhau, các hằng dùng trong các hàm đó.
Ví dụ <math.h> là thư viện các hàm tốn học.
Người lập trình có thể tạo các tệp tiêu đề của riêng
mình. Các tệp tiêu đề này thường có đi .h và gồm
các hàm. Sau đó mở tệp tiêu đề này để gọi các hàm.
Designed by Hoang Huu Viet, Computer Engineering Department.
Slide 19
Chương 4. Hàm
Con trỏ hàm
Xem tài liệu
Designed by Hoang Huu Viet, Computer Engineering Department.
Slide 20
Chương 4. Hàm
Đệ quy
Các hàm đã xét đều có chung cấu trúc phân cấp
giữa hai hàm gọi và hàm bị gọi.
Hàm đệ quy là hàm sẽ gọi đến chính nó trực
tiếp hay gián tiếp thông qua 1 hàm khác.
Cách tiến hành giải 1 bài tốn đệ quy:
Tìm trường hợp cơ sở
Tìm trường hợp đệ quy
Designed by Hoang Huu Viet, Computer Engineering Department.
Slide 21
Chương 4. Hàm
Đệ quy
Ví dụ tính n!
Trường hợp cơ sở: 0!=1
Trường hợp đệ quy: n! = (n-1)!*n với n>0.
Bài tập
Viết hàm tính n! theo dạng đề quy.
Viết hàm tính s = 1+2+..+n theo dạng đệ quy.
Designed by Hoang Huu Viet, Computer Engineering Department.
Slide 22
Chương 4. Hàm
Bài tập
1. Viết hàm kiểm tra 1 số ngun dương n có phải là số
ngun tố hay khơng ?. Viết chương trình in ra các số
nguyên tố từ 1..1000.
2. Viết hàm kiểm tra 1 số nguyên dương n có phải là số
hồn thiện hay khơng ?. Viết chương trình in ra các số
hồn thiện từ 1..1000.
3. Viết hàm để tách tên của một xâu họ và tên. Viết
chương trình nhập vào 1 mảng xâu họ và tên. Sắp xếp
mảng tăng dần theo tên.
Designed by Hoang Huu Viet, Computer Engineering Department.
Slide 23
Chương 4. Hàm
Bài tập
4. Viết hàm để đổi 1 số nguyên dương n thành số nhị phân
8 bit. In ra màn hình các số nhị nhân của các số từ 0
đến 255.
5. Viết hàm để đổi 1 số nguyên dương dạng nhị phân
thành số thập phân. Viết chương trình nhập vào 1 số
nguyên dương dạng nhị phân và in ra dạng thập phân.
6. Viết hàm fibonacci(n) để trả về số fibonacci thứ n. Nhập
số nguyên n từ bàn phím (n ≤ 10), áp dụng hàm trên để
in ra số fibonacci thứ n.
Designed by Hoang Huu Viet, Computer Engineering Department.
Slide 24
Chương 4. Hàm
Bài tập
7. Viết hàm để đếm số từ của 1 xâu. Nhập vào 1 xâu và in
ra màn hình số từ của xâu đó biết rằng từ được phân
cách bởi dâu cách, dấu chấm, dấu phẩy.
8. Viết hàm để đổi chữ cái đầu tiên của mỗi từ trong xâu
thành chữ hoa. Nhập vào 1 xâu, in ra màn hình xâu sau
khi đổi thành chữ hoa.
9. Viết hàm để hốn đổi giá trị 2 biến số thực. Viết chương
trình nhập 2 số thực, in ra giá trị sau khi hoán đổi5.
10. Viết lại hàm fibonacci thành dạng đệ quy.
Designed by Hoang Huu Viet, Computer Engineering Department.
Slide 25