Hàm - CT conĐịnh nghĩa hàm thân hàm Vị trí: • Sau phần khai báo toàn cục • Trước hoặc sau hàm main • Thứ tự của các hàm là không quan trong nếu nguyên mẫu của chúng đã được khai báo đầ
Trang 1Hàm – Chương trình con
NGÔN NGỮ LẬP TRÌNH C
Trang 3
Hàm - CT con
Giới thiệu
• Chương trình sẽ thế nào nếu có 1000
lệnh, tất cả đều nằm trong hàm main?
• Nếu có nhiều người cùng viết 1
chương trình thì phân chia ra sao?
• Nếu muốn thực hiện cùng 1 đoạn lệnh,
1 chức năng nhiều lần, tại nhiều thời
điểm khác nhau trong chương trình thì phải làm thế nào?
Trang 4Hàm - CT con
Giới thiệu(2)
• Vấn đề có thể được giải quyết nếu ta
chia chương trình ra thành nhiều phần nhỏ.
Trang 5• Ưu điểm của cách tiếp cận này:
– Giảm độ phức tạp của chương trình
– Tối ưu hóa mã chương trình
– Tăng tính tái sử dụng của CT
– Hỗ trợ khả năng làm việc tập thể
Trang 6• Thường được đặt ở đầu CT, sau các
khai báo tiền xử lý
• Mỗi hàm chỉ có 1 nguyên mẫu, được viết
trên 1 dòng duy nhât
• Còn được gọi là khai báo hàm
• Có thể có hay không có
Trang 8– ret_type có thể là void , 1 kiểu bình
thường hay 1 kiểu tự định nghĩa.
– Kiểu trả về mặc định (không chỉ định rõ)
là int.
– FuncName : Tên hàm, do LTV tự đặt.
Trang 9Hàm - CT con
Nguyên mẫu hàm(4)
– Parameter list là tùy chọn, có thể không
có nếu hàm không cần thêm thông tin gì.
– Các tham số được ngăn cách nhau
bằng dấu phẩy (,) và có dạng như sau:
typename parametername – Tên tham số là tùy chọn trong nguyên
mẫu hàm, nhưng là bắt buộc trong phần định nghĩa hàm
Trang 104 int USCLN(unsigned a, unsigned b);
5 void GB2(float a, float b, float c);
Trang 11Hàm - CT con
Định nghĩa hàm (thân hàm)
Vị trí:
• Sau phần khai báo toàn cục
• Trước hoặc sau hàm main()
• Thứ tự của các hàm là không quan
trong nếu nguyên mẫu của chúng đã
được khai báo đầy đủ
• Không có khái niệm hàm lồng nhau
trong C
Trang 12Hàm - CT con
Định nghĩa hàm (2)
Cấu trúc chung của 1 hàm:
[ret_type] FuncName([parameter list])
Trang 13Hàm - CT con
Định nghĩa hàm (3)
Giải thích:
• ret_type : kiểu trả về của hàm, là 1
trong các kiểu cơ bản.
• ret_type cannot be an array
• ret_type là void nếu hàm không trả về
1 giá trị cụ thể nào.
• FuncName : tên tự đặt, theo nguyên tắc
đặt tên.
Trang 14Hàm - CT con
Định nghĩa hàm (4)
Giải thích :
• parameter list : tập các giá trị mà hàm cần có
để thực hiện công việc của nó.
• Khai báo cục bộ : Khai báo tất cả các hằng,
biến, … được sử dụng trong hàm, không được biết đến bởi các hàm khác.
• Câu lệnh return : trả về kết quả cuối cùng, sau khi hàm đã tính toán xong.
Trang 16}
Trang 17outputs
Trang 18Hàm - CT con
Danh sách tham số (2)
Chú ý quan trọng:
• Tất cả các thông tin cần cho hàm để
nó làm việc cần được truyền cho nó
thông qua tham số.
• Hạn chế tối đa việc dùng các lệnh
nhập trong hàm
• Hạn chế việc sử dụng các biến toàn
cục bên trong hàm
Trang 19Hàm - CT con
Danh sách tham số (3)
Chú ý quan trọng:
• Tất cả các kết quả của hàm cần được
trả ra bên ngoài , thông qua tham số
và thông qua câu lệnh return
• Hạn chế tối đa việc dùng các lệnh
xuất trong hàm
Trang 22int i, flag;
flag = (N<2)?0:1;
for(i=2; flag&&i<N; i++)
if (N%i==0) flag = 0;
if (flag) printf(“%d is prime”,N);
else printf(“%d is not prime”,N);
}
Trang 23if (flag) printf(“%d is prime”,N);
else printf(“%d is not prime”,N);
}
Trang 24– Nêu tên của hàm cần thực thi.
– Truyền cho nó tất cả các tham số
mà nó cần.
– Nhận lấy kết quả trả về của hàm
(nếu có)
Trang 25• Hàm gọi: hàm gọi thực hiện hàm khác
và nhận kết quả.
• Hàm bị gọi: hàm bị hàm khác gọi thực
thi để phục vụ hàm đó
Trang 26void main(){
int i,kq, N=100;
for(i=1; i<N; i++){
kq = isPrime(i); //function call
if (kq) printf(“%5d”, i);
} }
Hàm bị gọi
Hàm gọi
Trang 27B(…); //calls
}
void B(…) { //declarations
}
Trang 28trong lời gọi hàm.
• Tham số giữa hàm gọi và hàm bị
gọi phải khớp nhau về số lượng,
về kiểu và thứ tự.
Trang 29Hàm - CT con
Truyền tham số cho hàm (2)
Các kiểu truyền tham số:
• Tham trị : tham số truyền cho hàm
sẽ không bị thay đổi bởi hàm bị
gọi.
• Tham biến : tham số truyền cho
hàm có khả năng bị hàm làm thay đổi.
Trang 30void main(){
int x=15, y=6, uc;
// before call x=15 and y=6
uc = USCLN(x,y); //function call
// after call, which value of // x and y do we expect?
printf(“MCD of %d and %d is %d”,x,y,uc);
}
Trang 31int x=15, y=6;
// before call x=15 and y=6
Swap(x,y); //function call
// after call, which value of // x and y do we expect?
}
Trang 32Hàm - CT con
Truyền tham số cho hàm (5)
Truyền theo tham trị:
• Cú pháp:
[ret_type] FuncName( type name )
• Một bản sao sẽ được tạo ra để lưu trữ
giá trị của tham số truyền vào.
• Tất cả các thay đổi đều được ghi nhận
lên bản sao.
• Bản sao bị hủy đi khi hàm kết thúc.
• Tất cả các thay đổi không được ghi
nhận lên bản chính
Trang 33Hàm - CT con
Truyền tham số cho hàm (6)
Truyền theo tham biến:
• Cú pháp:
[ret_type] FuncName( type &name )
• Một tên khác được gán cho tham số
truyền cho hàm bị gọi
• Tất cả thay đổi được thực hiện trực
tiếp trên tham số truyền cho hàm.
• Tất cả thay đổi sẽ được ghi nhận lại.
Trang 34int x=15, y=6;
// before call x=15 and y=6
Swap(x,y); //function call
// after call, which value of // x and y do we expect?
}
Trang 35[ret_type] FuncName( type arr[ ] )
[ret_type] FuncName( type arr[MAX] )
• Cú pháp gọi hàm :
[var=]FuncName( arrName );
Trang 36• Việc truyền mảng cho hàm luôn
luôn là truyền theo tham biến
• Không có dấu ngoặc vuông trong lời
gọi hàm.
Trang 38// Output M
}
Trang 41[ret_type] FuncName( type arr[ ][MAXC] )
[ret_type] FuncName( type arr[MAXD][MAXC] )
• Cú pháp gọi hàm :
[var=]FuncName( arrName );
Trang 43[ret_type] FuncName( char s[ ] )
[ret_type] FuncName( char s[MAX] )
• Cú pháp gọi hàm :
[var=]FuncName( strName );
Trang 44Hàm - CT con
Tham số là mảng (10)
Chuỗi ký tự:
• Tương tự như mảng 1 chiều, với
kiểu dữ liệu là char
• Không cần truyền chiều dài chuỗi,
có thể được tính bên trong hàm
(dùng strlen ).
Trang 45return num;
}
Trang 46– Nếu có, kiểu của giá trị đó là gì?
– Hàm cần bao nhiêu tham số?
– Kiểu của từng tham số là gì?
– Kiểu truyền của từng tham số là gì
(tham trị hay tham biến)?
Trang 47Hàm - CT con
Các bước xây dựng hàm (2)
– Xây dựng nguyên mẫu hàm sau khi
trả lời tất cả các câu hỏi trên.
– Xây dựng thân hàm bằng cách cài đặt
giải thuật cho nó.
– Chạy thử và kiểm tra hàm – Sửa lỗi (nếu có) và chạy lại cho đến
khi nào hàm không còn lỗi nữa.
Trang 48• Tìm giá trị lớn nhất, đồng thời cho biết
vị trí xuất hiện đầu tiên của nó
• Chuẩn hóa 1 chuỗi
• Đếm số lần xuất hiện của chuỗi con
trong chuỗi lớn
Trang 50Hàm - CT con
Các loại biến trong CT (2)
Toàn cục Cục bộ Tĩnh Trong main
Vị trí khai
báo - At the top of the program
- Outside all functions
- At the beginning of the function
- Inside each function
- At the beginning of the function
- Inside each function
- At the beginning of main()
- Inside main function
Vị trí lưu trữ Static Stack Static Stack
Thời điểm
được tạo ra When the program
begins executing
When the function begins executing
When the function executes for the first time
When the program begins executing
Trang 51Hàm - CT con
Các loại biến trong CT (3)
Toàn cục Cục bộ Tĩnh Trong main
Thời gian
sống During the program
execution time
During the
function
execution time
From creation till program termination
During the
program
execution time
Khả năng
sử dụng - - Globally Can be
accessed in all functions
- Locally
- Only be accessed in one function
- Locally
- Only be accessed in one function
- Locally
- Only be accessed in main()
Trang 52•Kích thước: 64KB
Code
Static Heap Free Stack
0000 FFFF
Trang 57– Thân hàm chứa tất cả các câu lệnh để
hàm có thể làm được công việc của nó.
– Các tham số cần được truyền cho hàm
để nó có thể làm việc được.