Khái niệm Hàm là một khối các câu lệnh thực hiện một nhiệm vụ nhất định, và có thể được gọi khi cần Mỗi hàm có một tên các hàm trong C không được trùng tên nhau, một số tham số, và m
Trang 1Hàm (function)
Trang 2Khái niệm
Hàm là một khối các câu lệnh thực hiện một nhiệm vụ
nhất định, và có thể được gọi khi cần
Mỗi hàm có một tên (các hàm trong C không được trùng tên nhau), một số tham số, và một giá trị trả về
Sử dụng hàm giúp:
Chia nhỏ chương trình thành nhiều bài toán con
Sử dụng lại trong một hoặc nhiều chương trình
Cách khai báo:
<kiểu trả về> <tên hàm>(<danh sách các tham số>) {
Khai báo các biến dùng cho hàm Các câu lệnh của hàm
Trang 4Phạm vi của biến, hằng
Biến toàn cục: được khai báo ở ngoài các hàm, có phạm vi trong
toàn chương trình và tồn tại trong suốt quá trình chạy
Biến địa phương: được khai báo ở trong một hàm hoặc một khối
lệnh, chỉ có phạm vi trong hàm/khối đó, và bị huỷ sau khi kết thúc chạy hàm/khối đó
Khai báo biến địa phương sẽ “che” mất biến cùng tên khác có phạm vi rộng hơn
Trong C, biến địa phương phải được khai báo ở đầu hàm hoặc khối lệnh
Ví dụ biến địa phương của hàm:
int x = 10, y = 20; /* phải khai báo trước hàm sum() */ int sum() {
Trang 5Biến trong khối lệnh
Trong một khối lệnh { … } ta có thể khai thêm biến, biến đó chỉ tồn tại
từ khi chương trình chạy vào tới khi thoát khỏi khối lệnh đó
sum(a,b);
return 0;
}
Trang 6Biến trong khối lệnh: vòng lặp
Chỉ có phạm vi trong một lần chạy của vòng lặp, mỗi lần lặp sẽ tạo ra biến mới và khởi tạo lại
Trang 7Biến static
Là biến chỉ có phạm vi địa phương nhưng vẫn tồn tại ngay cả khi
chưa vào hoặc đã thoát khỏi hàm/khối
Khai báo bằng cách thêm từ khoá static
Cũng có biến static toàn cục: thuộc nội bộ của một file nguồn
static int tic_time = 0;
Trang 8Câu lệnh return
Kết thúc hàm và trả về một giá trị cho nơi gọi nó
int find(int number, int a[], int n) {
Hàm void: không trả về giá trị gì
void copy(int *a, int *b, int n) {
if (a==NULL || b==NULL || a==b || n==0)
return;
for (; n>0; n )
*a++ = *b++;
}
Câu lệnh return không có tham số
Không cần lệnh return ở cuối hàm
Đào Trung Kiên – ĐH Bách khoa Hà Nội
Trang 9Tham số kiểu giá trị và kiểu tham chiếu
Tham số của hàm là biến tạm thời, tạo ra khi gọi và huỷ khi hàm kếtthúc gán giá trị cho tham số không ảnh hưởng tới biến nơi gọi
assign10(&a);
Tham số con trỏ thường được dùng như một cách khác để trả về
thêm giá trị, vì mỗi hàm chỉ có một giá trị trả về theo đúng nghĩa
Trang 10Hàm trả về con trỏ
Vấn đề với hàm trả về biến địa phương
Trang 11Nguyên mẫu (prototype) của hàm
Là việc khai báo hàm trước, nội dung của nó được triển khai sau thường khai báo ở đầu file hoặc trong file h
Ví dụ:
double tong(double x, double y);
double tich(double x, double y);
Trang 12Hàm đệ quy (recursive function)
Trang 13Con trỏ hàm
Là con trỏ trỏ tới một hàm là một kiểu dữ liệu trong C, thường
được dùng để gọi một hàm chưa biết trước
double (*SomeOpt)(double, double);
typedef double (*OptFunc)(double, double);
OptFunc SomeOpt;
Ví dụ:
double sum(double x, double y) { return x+y; }
double mul(double x, double y) { return x*y; }
Trang 14return 0;
}
Macro có thể được thay thế khi định nghĩa macro khác cùng tên
Huỷ bỏ macro đã định nghĩa: #undef ERROR
Kiểm tra xem macro đã định nghĩa chưa
Trang 15Macro (tiếp)
Macro có thể có tham số đôi khi được dùng như hàm
#define MIN(x,y) x<y ? x:y
Trang 16Thư viện hàm
Đào Trung Kiên – ĐH Bách khoa Hà Nội
Trang 17 Dùng thư viện hàm trong một file mã nguồn:
#include <ten_file.h> /* trong đường dẫn mặc định */
#include "ten_file.h" /* cùng thư mục với file dịch */
Dẫn hướng #include có tác dụng như chèn nội dung file được khai báo vào file đang dịch ở vị trí xuất hiện
Trang 18Lưu ý với tạo và sử dụng file h
Trong file abcd.h
Để tránh lỗi khi bị #include nhiều lần, thêm vào đầu và cuối
#ifndef ABCD_H
#define ABCD_H
/* Nội dung file abcd.h */
#endif
Các biến toàn cục phải được khai báo trong file c, nếu muốn
được export thì trong file h khai báo thêm bằng extern:
extern int bien_toan_cuc;
Sử dụng file abcd.h
#include "abcd.h" /* h cùng thư mục */
#include <abcd.h> /* h trong thư mục thư viện */
Đào Trung Kiên – ĐH Bách khoa Hà Nội
Trang 19Ví dụ: Thư viện tính diện tích các hình
{ return r1*r2*PI; } double dt_vuong(double l)
{ return l*l; } double dt_chu_nhat(double l1, double l2)
Trang 20Một số thư viện chuẩn
stdio.h Xuất, nhập với màn hình, file, bàn phím,…
ctype.h Kiểm tra các lớp ký tự (chữ số, chữ cái,…)
Trang 21Bài tập
1. Viết hàm cấp phát bộ nhớ và nhập giá trị cho một mảng, trả về con
trỏ mảng và số phần tử
2. Viết hàm prime(…) trả về mảng các số nguyên tố bé hơn n
3. Định nghĩa mảng các struct MenuItem { Tiêu đề, Hàm xử lý }, in ra
màn hình menu, nhận lựa chọn của người dùng và thực hiện chức năng tương ứng
4. Viết hàm tính số Fibonacci thứ n được định nghĩa:
Fib0 = 0, Fib1 = 1 Fibn = Fibn-1 + Fibn-2 (n ≥ 2)
5. Định nghĩa kiểu chuỗi String và viết thư viện một số hàm xử lý
chuỗi: khởi tạo, copy, nối, tìm kiếm,…
6. Định nghĩa kiểu struct Shape rồi viết thư viện có hàm tính diện
tích, chu vi của hình tuỳ theo dạng của nó Dùng 2 cách: switch và con trỏ hàm