Giới thiệu về Hàm• Khối lệnh của chương trình chia để trị – Xây dựng chương trình từ các thành phần – Dễ dàng quản lý từng thành phần • Thuật ngữ trong các ngôn ngữ khác – Thủ tục, chươn
Trang 1Tin Học Cơ Sở 4
Hàm
Trang 2Trong Bài Giảng 04
– Tập hợp các dữ liệu có cùng kiểu
– Độ dài không đổi, phải xác định khi khai báo (hằng số) – Thường là mảng không đầy, phải quản lý số phần tử – 02 cách khởi tạo dữ liệu của mảng
• Ngay khi khai báo: int diem_so[] = {5, 8, 4};
• Dùng vòng lặp (for): for(…) { diem_so[i] = …; }
– Truy cập sử dụng chỉ số phần tử:
• Lưu ý: chỉ số trong khoảng từ 0 đến ĐộDài-1
– Các thao tác với mảng: nói chung đều dùng vòng lặp
Trang 3Trong Bài Giảng 04
Trang 4Trong Bài Giảng 04
Trang 6Giới thiệu về Hàm
• Khối lệnh của chương trình (chia để trị)
– Xây dựng chương trình từ các thành phần
– Dễ dàng quản lý từng thành phần
• Thuật ngữ trong các ngôn ngữ khác
– Thủ tục, chương trình con, phương thức
– Trong C: Hàm
• I-P-O
– Input – Process – Output (Nhập – Xử lý – Xuất)
– Phần cơ bản của chương trình
Trang 7Một số nguyên tắc
• Các hàm trong NNLT C đều ngang cấp với nhau:
– Hàm không được khai báo lồng nhau.
– Thứ tự khai báo không quan trọng
• Hàm có thể nhận và xử lý nhiều tham số hoặc không có tham số nào
• Hàm có thể trả về một giá trị hoặc không
• Biến khai báo trong hàm F chỉ có giá trị trong F, không sử dụng được biến này trong các hàm
khác được
Trang 8kiểu của giá trị trả
về
nhận vào 2 tham số khi được gọi
giá trị được trả về qua lệnh return
Trang 9Ví dụ gọi thực hiện hàm Power
}
Chỉ thị cho chương trình biết prototype (nguyên mẫu) của hàm Power
Trang 10Một số lỗi thường gặp
Compiler không hiểu được hàm Power
hàm Power thiếu tham số
giá trị trả về không khớp
kiểu
Trang 11Hàm định sẵn
• Các hàm trong thư viện
• Hai loại hàm:
– Trả về giá trị
– Không trả về giá trị (void)
• Phải gọi các thư viện phù hợp, sử dụng
#include
– <stdio.h> (cho printf , scanf)
– <math.h>
Trang 13Cách gọi hàm
• Phép gán theRoot = sqrt(9.0);:
– Biểu thức sqrt(9.0) là lời gọi hàm
– Đối số trong lời gọi hàm (9.0) có thể là một giá trị, biến, biểu thức hoặc một lời gọi hàm khác
– Lời gọi hàm cũng có thể là một phần của biểu thức
• Lời gọi hàm có thể ở bất cứ đâu nếu kiểu trả về của hàm là hợp lệ
Trang 15Hàm toán học (tiếp)
Trang 16Hàm toán học (tiếp)
Trang 17Hàm void định sẵn
• Không trả về giá trị
• Bản thân là một câu lệnh khi được gọi
– exit(1); // không trả về giá trị, không gán
• Lệnh kết thúc chương trình
• Hàm void có thể nhận tham số
– printf hoặc scanf
• Hoàn toàn giống hàm trả về giá trị:
– Ngoại trừ không trả về giá trị
Trang 18– Trong file riêng biệt (người khác có thể sử dụng)
Trang 19Sử dụng hàm
• 3 điểm chú ý khi sử dụng hàm:
– Khai báo hàm (Hàm nguyên mẫu)
• Chứa thông tin cho trình dịch
• Thông dịch chính xác cho lời gọi hàm
Trang 20Khai báo hàm
• Còn gọi là hàm nguyên mẫu
• Thông báo cách dịch hàm cho trình dịch
– Cú pháp:
<KiểuTrảVề> TênHàm(<Danh-Sách-Tham-Số>);
– Ví dụ:
double Power(double x, int n);
• Phải đặt trước khi gọi hàm:
– Trong vùng khai báo của main()
– Hoặc ở trước main() trong vùng toàn cục
Trang 21Định nghĩa hàm
• Cài đặt hàm
<KiểuTrảVề> TênHàm(<Danh-Sách-Tham-Số>); {
//khai báo các biến của hàm
// các lệnh thực thi
return <giá-trị-trả-về>;
Trang 23Vị trí định nghĩa hàm
• Dưới hàm main()
– Không phải bên trong main()
– Nhớ cần khai báo nguyên mẫu hàm trước main()
• Tham số hình thức (biến) để truyền dữ liệu vào hàm
• Lệnh return trả lại dữ liệu
– Không có return đối với các hàm void
– Nói chung là lệnh cuối cùng
Trang 25– Danh sách kiểu của tham số
• Có thể bỏ qua tên của tham số hình thức:
double Power(double, int);
Trang 26Tham số - Đối số
• Hai khái niệm thường được dùng thay thế
– Tham số (parameter) – Đối số (argument)
• Tham số/Đối số hình thức:
– Trong khai báo hàm
• Tham số/Đối số thực sự:
– Trong lời gọi hàm
• Đôi khi quy ước tham số là hình thức, đối số là thực sự
Trang 27Hàm gọi hàm
• Chúng ta đã và đang sử dụng cách này
– Sử dụng các hàm định sẵn trong main()
• Yêu cầu duy nhất
– Phải khai báo hàm trước khi gọi hàm
• Định nghĩa hàm có thể ở bất kỳ đâu
– Sau định nghĩa main()
– Trong một file riêng biệt
• Một hàm có thể gọi nhiều hàm khác
• Một hàm có thể gọi chính nó (đệ quy)
Trang 28Khai báo hàm void
• Giống khai báo hàm trả về giá trị
• Kiểu trả về là “ void ”
• Ví dụ:
– Khai báo/Nguyên mẫu hàm
void show(double doF, double doC);
•Kiểu trả về “void”
•Không trả về thông tin gì
Trang 29Khai báo hàm void
void show(double doF, double doC)
Trang 30• Không phép gán, do không có giá trị trả về
• Đối số thực (doF , doC)
–Được truyền vào hàm
–Hàm được gọi với đối số truyền vào
Trang 31Hàm đệ quy
• Các hàm tự gọi chính mình
• Chỉ giải quyết các trường hợp cơ bản
• Nếu không phải trường hợp cơ bản
– Chia bài toán thành các bài toán nhỏ hơn
– Gọi bản sao của hàm để giải quyết các bài nhỏ– Cuối cùng trường hợp cơ bản được giải quyết
• Ví dụ: hàm tính dãy Fibonacci, giai thừa,
ước số chung lớn nhất, …
Trang 32Truyền tham số cho hàm
Trang 33Truyền giá trị
• Hàm sẽ xử lý trên bản sao của tham số
– Hàm không thể thay đổi giá trị của tham số được.
• Được dùng trong các trường hợp cần chuyển dữ liệu vào bên trong hàm để xử lý, tính toán
• Các ví dụ trên đều dùng kiểu truyền tham số bởi giá trị
• Ví dụ hàm có sẵn của C truyền giá trị:
– float sqrt(float);
– double pow(double, double);
Trang 34ham: v = 500 main: var = 5
hàm ThayDoiTruyenGiaTri không thay đổi giá trị của
“var”
Trang 35Truyền địa chỉ
• Hàm sẽ xử lý trên chính tham số nhờ vào địa chỉ của chúng
– Hàm có thể thay đổi giá trị của tham số.
• Được dùng trong các trường hợp cần chuyển dữ liệu là kết quả xử lý được bên trong hàm ra
“ngoài” cho các hàm khác sử dụng
Trang 36truyền địa chỉ của “var” vào hàm
ThayDoiTruyenDiaChi
ham: *v = 500 main: var = 500
ham: *v = 500 main: var = 500
Trang 38– Duy trì điều khiển trên dữ liệu
– Hàm nên khai báo tất cả dữ liệu cục bộ nó cần
Trang 39Hằng toàn cục – Biến toàn cục
• Khai báo bên ngoài thân hàm
– Toàn cục với tất cả các hàm trong file
• Khai báo bên trong thân hàm
Trang 40• Khai báo dữ liệu bên trong khối lệnh
– Dữ liệu hoạt động trong phạm vi khối
• Chú ý: định nghĩa hàm là khối
– Phạm vi hoạt động hàm cục bộ