Chương 4
Sử dng hm trong C
Mục tiêu của bài học
Khi nim hm.
Cấu trúc của mt hàm trong C.
S dng hm.
Nguyên mu hm.
Đnh ngha hm.
Gi hm.
Truyền tham s cho hm
Truyền theo tham tr.
Truyền theo tham chiu.
Cc qui tắc về phạm vi của hm.
Hm trong cc chương trình có nhiều tập tin.
Cc lớp lưu trữ.
1. Khi nim hm
Hàm là mt đoạn
chương trình thực hin
mt tác v được đnh
ngha c thể.
Dng để rút gn cho mt chuỗi cc chỉ th được thực hin nhiều lần
Hm dễ vit v dễ hiểu
Vic g lỗi chương trình trở nên dễ dng hơn .
Dễ dng bảo trì (sự sa đổi khi có yêu cầu được giới hạn trong từng
hm của chương trình).
2. Cấu trúc hàm
Cú pháp của hm:
Hm không trả về gi tr: Kiu tr v được xc đnh l void.
Hm có thể trả về cc gi tr thuc cc kiểu dữ liu sau:
Kiểu dữ liu cơ sở: char, int, float, double.
Kiểu con tr.
Kiểu dữ liu nâng cao: class, struct.
<Kiểu giá trị trả về> Tên_hàm (Danh sách các tham số)
{
Khai báo: biến, hằng;
. . .
Các câu lệnh xử lý;
. . .
Lệnh return;
}
2. Cấu trúc hàm
S tr v t mt hm:
Lnh return: Kt thúc hm, trả về 1 giá tr cho hm gi nó.
Sử dng lnh return:
return;
return (hằng);
return (bin);
return (biểu thức);
return (câu lnh đnh gi);
V d: return ( (a>b) ? a:b );
3. Sử dụng hm
Mt chương trình C luôn bắt đầu từ hm main().
Mi hm trong C bắt buc phải được gi trực tip hoc gin
tip từ hm main().
V d: Mt chương trình có 4 hm: main, func1, func2, func3.
main()
{
func1(…);
func2 (…);
}
func1(…)
{
. . .
func3 (…);
}
Hm func1, func2 được gi trực tip từ hm main().
Hm func3 được gi gin tip từ hm main().
Hm phải được đnh ngha hoc khai bo trước khi được gi.
3.1 Nguyên mu hm, đnh ngha hm
Mi hm phải được khai bo nguyên mu hoc đnh ngha
trước khi được gi (trước hm gi nó).
func1 ( );
int main(){
func1();
}
func1( )
{
return ( );
}
func1( )
{
return ( );
}
int main(){
func1();
}
Hoc:
Khai bo nguyên mu hm
Đnh ngha hm
Gi hm
3.2 Gọi hàm
C php:
Tên_hm (gi tr ca cc đi s truyn vo hm);
Hm gi có thể khai bo 1 bin cng kiểu để lưu lại
gi tr trả về của hm được gi, v d:
int func1(…)
{
. . .
return (…);
}
int main(){
int s;
. . .
s = func1(…);
}
Hm gi
Hm được gi
Mt li gi hm có thể đt trong mt biểu thức tnh ton
hoc mt câu lnh hiển th:
printf (“Ket qua = %d”, func(…))
3.3 Truyn đi số vo hm
Truyền tham tr
Truyền tham chiu
A. Truyn tham tr
Mc đnh trong C, tất cả các đi s được truyền bằng
tham tr.
Giá tr của bin được truyền tới hm gi thông qua bin tạm.
Mi sự thao tác chỉ được thực hin trên các bin tạm.
Bất k sự thay đổi bo trên gi tr ny đều không ảnh hưởng
đn gi tr của bin gc được truyền.
V d:
A. Truyn tham chiu
Truyền thông qua con tr (đề cập trong chương 6).
Truyền bin tham chiu.
Bin tham chiu (reference)
L b danh của mt đi tượng.
Dng để tham chiu tới mt bin cùng kiểu trong b nhớ.
Các thao tc trên bin tham chiu thực chất l thao tc đn
bin mà nó tham chiu đn.
Khai báo:
A. Truyn tham chiu (tt)
<Kiểu dữ liệu> &<biến tham chiếu> = <tên biến>;
V d:
int n = 10;
int &x = n;
x được gi l bin tham chiu tới bin n
Truyn bin tham chiu vo hm
Khai bo hm: Bin tham chiu được khai bo
trong phần đi số của hm:
V d:
A. Truyn tham chiu (tt)
void Input (int &a, int &b);
a, b được truyền vo hm dạng tham chiu
Gi hm:
int x=10,y=15;
input(x,y);
Trình biên dch s truyền đa chỉ của x, y vo hm
V d:
A. Truyn tham chiu (tt)
Bin cc b
Được khai báo bên trong mt hàm.
Được tạo tại điểm vào của mt khi và b hủy tại điểm
ra khi khi đó.
Tham s hình thức
Được khai báo trong đnh ngha hàm.
Hoạt đng như mt bin cc b bên trong mt hàm.
Bin ton cc
Được khai báo bên ngoài tất cả các hàm.
Lưu các giá tr tồn tại sut thi gian thực thi của
chương trình.
Cc bin
Lớp lưu trữ
Mỗi bin trong C có mt tnh chất được gi l lớp
lưu trữ.
Lớp lưu trữ đnh ngha hai đc tnh của bin:
Thi gian sng: L khoảng thi gian bin duy trì mt
gi tr xc đnh.
Phm vi: Xc đnh cc phần của mt chương trình có
thể nhận ra bin đó
auto
extern
static
register
Lớp lưu trữ - tt
Cc qui luật phạm vi: Quyt đnh mt đoạn mã lnh
có thể truy xuất đn mt đoạn mã lnh hoc dữ liu
khác hay không?
Mã lnh bên trong mt hàm là cc b với hàm đó.
Hai hàm có phạm vi khác nhau.
Hai hàm có cùng mức phạm vi.
Mt hàm không thể được đnh ngha bên trong mt
hàm khác.
Cc qui luật phm vi của hm
S lồng nhau của li gọi hm
main()
{
…
Sum();
…
}
Sum()
{
…
CheckPrime();
Display();
…
}
Cc hm trong chương trình
có nhiu tập tin
Các hàm cũng có thể được đnh ngha là static (hm
tnh) hoc external (hm ngoại).
Hàm tĩnh:
static <Kiu trả về> Tên hm (danh sch đi số);
Chỉ được nhận bit bên trong tập tin chương trình.
Phạm vi của hm không vượt ra khi tập tin chương trình
Hàm ngoại:
extern <Kiu trả về> Tên hm (danh sch đi số);
Được nhận bit bởi tất cả các tập tin của chương trình
Hàm đệ quy
Đệ quy (Recursion)
L mt phương php lập trình cho phép mt hm có thể gi
lại chnh nó trực tip hoc gin tip.
V d: void Test(){
Test();
}
Mt chương trình đ quy hoc mt đnh ngha đ quy thì
không thể gi đn chnh nó mãi mãi m phải có mt điểm
dừng đn mt trưng hợp đc bit no đó, m ta gi l
trưng hợp suy bin (degenerate case).
V d: Ta đnh ngha n! như sau:
1 0!
1)! -(n *n
!n
Phương php thit k mt giải thuật đ quy:
Tham s hoá bài toán.
Phân tích trưng hợp chung: Đưa bài toán dưới dạng bài
toán cùng loại nhưng có phạm vi giải quyt nh hơn theo
ngha dần dần s tin đn trưng hợp suy bin.
Tìm trưng hợp suy bin.
2
3
Đệ quy (Recursion)
Đ quy (Recursion)
Chương trình đ quy gồm hai phần chnh:
1. Phần cơ sở: Điều kin thot khi đ quy (điểm dừng)
2. Phần đ quy: Trong phần thân chương trình có li gi
đn chnh bản thân chương trình với gi tr mới của
tham s nh hơn gi tr ban đầu
Ví d 1: Lập hàm tính n! bằng đ quy
Đ quy (Recursion)
1 0!
1)! -(n *n
!n
Phần đệ quy
Điều kiện dừng