Bài giảng Kỹ thuật lập trình - Chương 8: Hàm - Trần Quang
Chương 08
HÀM
Trần Quang
© 2016
Kỹ thuật lập trình
Chương 08:Hàm
1
Hàm là gì?
Hàm là một đơn vị xử lý, một chuỗi các lệnh có
liên quan, được thực hiện cùng nhau để hoàn
thành một công việc nào đó
Ví dụ trong thư viện <math.h> ta có
Hàm sin(x)
Là chuỗi lệnh để tính giá trị sin của một góc x được
truyền vào, góc x có đơn vị tính là radian; hàm sin(x)
trả về một số thực
Hàm sqrt(x)
Là chuỗi lệnh để tính căn bậc 2 của đại lượng x được
truyền vào, đại lượng x có đơn vị tính là một số thực
(float hay double); hàm sqrt trả về một số thực
Trần Quang
© 2016
Kỹ thuật lập trình
Chương 08:Hàm
2
Hàm là gì?
Hàm là một đơn vị tính toán
Nhận giá trị đầu vào
Tí nh toá n
Trả về giá trị
Chuỗi lệnh của hàm
Các giá trị đầu vào
Các giá trị đầu ra
Trần Quang
© 2016
Kỹ thuật lập trình
Chương 08:Hàm
3
Lợi ích của hàm
Tránh lặp lại mã nguồn
Tiết kiệm thời gian phát triển
Thay đổi đoạn mã nguồn trong hàm nhanh và dễ
dàng, chỉ tại một nơi
Sử dụng lại một đơn vị tính toán mà không phải
viết lại
Tiết kiệm thời gian phát triển
Có thể chia sẻ đơn vị tính toán không chỉ cho một
dự án mà cho nhiều dự á n
Trần Quang
© 2016
Kỹ thuật lập trình
Chương 08:Hàm
4
Hàm main
Giá trị trả về: kiểu số nguyên int
Tên hàm: “main”. Một chương trình phải và chỉ có 01 hàm main duy nhất
int main(){
// Các lệnh xử lý của hàm main
return 0;
}
Trả về giá trị cho bên gọi hàm main
Giá trị trả về của main:
• Phải là kiểu int
• Có thể là một trong 2 hằng số
• EXIT_SUCCESS (hoặc 0): nếu chương trình kết thúc thành công
• EXIT_FAILURE (hoặc 1): nếu chương trình kết thúc với lỗi nào đó
Trần Quang
© 2016
Kỹ thuật lập trình
Chương 08:Hàm
5
Hàm thư viện
Dùng chỉ thị #include < … > để thông báo với bộ
biên dịch là có sử dụng thư viện
Ví dụ: #include <math.h>
Khi gọi một hàm chỉ cần biết
Tên hàm + công dụng của hàm
Các giá trị cần cung cấp cho hàm
Giá trị trả về của hàm
Trần Quang
© 2016
Kỹ thuật lập trình
Chương 08:Hàm
6
Tꢀ chꢁc chương trình C
Tiền xử lꢀ:
Module
#include
#define
#<Tiꢀn xꢁ lꢂ>
Khai báo / định nghꢁa:
Khai bꢃo / đꢄnh nghꢅa
Hꢆm 1
Hꢂng
Biến
Hàm/biến extern
Mô tả hàm
Hꢆm 2
Hꢆm 3
Các hàm:
main được chạy đầu tiên
Định nghꢁa ngang cấp,
khô ng lồng nhau.
Được gọi mới chạy.
Trần Quang
© 2016
Kỹ thuật lập trình
Chương 08:Hàm
7
Tꢀ chꢁc chương trình C
Project bao gồm nhiều module
Module
#<Tiꢀn xꢁ lꢂ>
Khai bꢃo / đꢄnh nghꢅa
Hꢆm 1
Hꢆm 2
Hꢆm 3
Module
#<Tiꢀn xꢁ lꢂ>
Khai bꢃo / đꢄnh nghꢅa
Hꢆm 1
Hꢆm 2
Hꢆm 3
Module
#<Tiꢀn xꢁ lꢂ>
Khai bꢃo / đꢄnh nghꢅa
Hꢆm 1
Hꢆm 2
Hꢆm 3
Trần Quang
© 2016
Kỹ thuật lập trình
Chương 08:Hàm
8
Khai báo hàm
Phần mô tả hàm (header)
Cú phá p :
[extern|static] [ret_type] name ([arglist])
{ [statements]*
[return expr;]
Phần thân hàm (body)
[statements]*
[return expr;]
}
extern (khai báo): hàm đã được định nghꢁa trong
module khác.
static (định nghꢁa): hàm chỉ được gọi cục bộ trong
module chứa hàm này
Trần Quang
© 2016
Kỹ thuật lập trình
Chương 08:Hàm
9
Khai báo hàm
return expr; kết thꢃc hàm và trả về giá trị expr. Giá
trị expr sẽ được gởi về nơi gọi hàm để sử dụng.
arglist: là danh sá ch cá c tham số hì nh thức (hàm
có thể khô ng có tham số), mỗi tham số được cá ch
nhau bởi dấu phꢄy (,) và được mô tả theo cꢃ pháp
như sau :
type parameter_name [=defaultvalue]
defaultvalue là giá trị gá n mặc định cho tham số
nếu khô ng cung cấp lúc gọi hàm
Trần Quang
© 2016
Kỹ thuật lập trình
Chương 08:Hàm
10
Lời gọi hàm
Cú phá p:
Tên_hàm (<danh sách tham số thực>);
Ví dụ:
#include <math.h>
int main() {
printf("%-10s = %5.2f\n", "sqrt(25.0)", sqrt(25.0));
printf("%-10s = %5.2f\n", "sin(90.0)",
sin(90.0f*(3.14159/180.0)));
// ....
}
Trần Quang
© 2016
Kỹ thuật lập trình
11
Chương 08:Hàm
Sử dụng hàm tự tạo
#include <stdio.h>
#include <stdlib.h>
int add(int a, int b) {
int c;
c = a + b;
return c;
}
int main(){
printf("10 + 15 = %d", add(10, 15));
system("pause");
return 0;
}
Trần Quang
© 2016
Kỹ thuật lập trình
Chương 08:Hàm
12
Nguyên tắc thực thi khi gọi hàm
Khi gọi hàm thì bộ thực thi sẽ làm các công việc:
Lưu vết: lệnh kế tiếp của lệnh gọi hàm
Copy các thông số cho hàm được gọi
Làm các công việc hệ thống khác
Chuyển điều khiển thực thi cho hàm được gọi để nó
thực thi từ lệnh đầu tiên trong hàm được gọi
Khi hàm được gọi thực hiện lệnh return.
Giải phóng tất cả các biến cục bộ của nó
Trả điều khiển về lệnh theo sau lệnh gọi hàm
Hàm gọi giải phóng các thông số đã truyền và thực thi
lệnh kế tiếp theo lệnh gọi hàm
Trần Quang
© 2016
Kỹ thuật lập trình
13
Chương 08:Hàm
Tꢀ chꢁc mã nguồn
#include <stdio.h>
#include <stdlib.h>
Tách rời phần mô tả
của hàm và đặt trước
hàm “main” (trước khi
sử dụng)
int add(int a, int b);
int main(){
printf("10 + 15 = %d", add(10, 15));
system("pause");
return EXIT_SUCCESS;
}
int add(int a, int b){
int c;
c = a + b;
return c;
}
Cài đặt các lệnh cho
hàm
Trần Quang
© 2016
Kỹ thuật lập trình
14
Chương 08:Hàm
Tꢀ chꢁc mã nguồn
Đưa phần mô tả vào một tập tin riêng
Gọi là tập tin mô tả (header): *.h
Có thể sử dụng lại ở nhiều tập tin khác trong dự án
Sử dụng chỉ thị #if !defined(.) … endif để
tránh lỗi “định nghꢁa lặp lại” (redefinition)
Đưa phần hiện thực vào một tập tin riêng
Gọi là tập tin hiện thực (implementation): *.c; *.cpp
Có thể sử dụng lại ở nhiều tập tin khác trong dự á n
Đưa phần hiện thực vào một tập tin riêng
Khai báo có sử dụng đến các hàm ở *.h nói trên
Gọi hàm
Trần Quang
© 2016
Kỹ thuật lập trình
15
Chương 08:Hàm
Tꢀ chꢁc mã nguồn
Tập tin chứa phần mô tả cho hàm, kiểu
dữ liệu, v.v. các phần mô tả nói chung
Tập tin chứa phần cài đặt hàm
Tập tin chứa hàm main. Để sử dụng
các hàm trong thư viện tự tạo đặt
#include ”my_math.h” trong mã nguồn
Trần Quang
© 2016
Kỹ thuật lập trình
Chương 08:Hàm
16
Tꢀ chꢁc mã nguồn
Tập tin: ”my_math.h”
#if !defined(MY_MATH_HEADER)
#define MY_MATH_HEADER
int add(int a, int b);
#endif
Phần mô tả cho
hàm add
NẾU như trong quá trình biên dịch, đến thời điểm hiện tại,
chưa thấy tên (MY_MATH_HEADER) xuất hiện thì định nghꢁa
tên mới (MY_MATH_HEADER) và thực hiện biên dịch cho cả
đoạn mã nguồn nꢂm trong phần tương ứng khối #if
NGƯỢC LẠI thì khô ng cần định nghꢁa tên mới và khô ng cần
biên dịch đoạn mã nguồn tương ứng khối if
Trần Quang
© 2016
Kỹ thuật lập trình
17
Chương 08:Hàm
Tꢀ chꢁc mã nguồn
Tập tin: ”my_math.cpp”
#include "my_math.h"
int add(int a, int b) {
int c;
c = a + b;
return c;
}
Trần Quang
© 2016
Kỹ thuật lập trình
Chương 08:Hàm
18
Tꢀ chꢁc mã nguồn
Tập tin program.cpp
#include <stdio.h>
#include <stdlib.h>
#include "my_math.h"
int main() {
printf("10 + 15 = %d", add(10, 15));
system("pause");
return EXIT_SUCCESS;
}
Trần Quang
© 2016
Kỹ thuật lập trình
19
Chương 08:Hàm
Tham số và đối số
int main(){
printf("10 + 15 = %d", add(10, 15));
system("pause");
return EXIT_SUCCESS;
}
int add(int a, int b) {
10: là đối số của tham số a
15: là đối số của tham số b
int c;
c = a + b;
return c;
}
Trần Quang
© 2016
Kỹ thuật lập trình
Chương 08:Hàm
20
Tải về để xem bản đầy đủ
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Kỹ thuật lập trình - Chương 8: Hàm - Trần Quang", để tải tài liệu gốc về máy hãy click vào nút Download ở trên
File đính kèm:
bai_giang_ky_thuat_lap_trinh_chuong_8_ham_tran_quang.pdf

