Tải bản đầy đủ (.pdf) (34 trang)

Ch08 function

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (665.23 KB, 34 trang )

Chương 08
HÀM

Trần Quang
© 2016

Chương 08: Hàm

Kỹ thuật lập trình
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 để hồn
thành một cơng việc nào đó
Ví dụ trong thư viện <math.h> ta có




Trần Quang
© 2016

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
Chương 08: Hàm

Kỹ thuật lập trình
2


Hàm là gì?


Hàm là một đơn vị tính tốn




Nhận giá trị đầu vào
Tính tốn
Trả về giá trị

Các giá trị đầu vào

Trần Quang
© 2016

Chuỗi lệnh của hàm


Chương 08: Hàm

Các giá trị đầu ra

Kỹ thuật lập trình
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 tốn mà khơng phải
viết lại



Trần Quang
© 2016

Tiết kiệm thời gian phát triển

Có thể chia sẻ đơn vị tính tốn khơng chỉ cho một
dự án mà cho nhiều dự án

Chương 08: Hàm

Kỹ thuật lập trình
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

Chương 08: Hàm

Kỹ thuật lập trình
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




Trần Quang
© 2016

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

Chương 08: Hàm

Kỹ thuật lập trình
6



Tở chức chương trình C
Module



#<Tiền xử lý>
Khai báo / định nghĩa



Hàm 1

Hàm 2

Hàm 3

Trần Quang
© 2016



Tiền xử lý:
 #include
 #define
Khai báo / định nghĩa:
 Hằng
 Biến
 Hàm/biến extern
 Mô tả hàm

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.

Chương 08: Hàm

Kỹ thuật lập trình
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
Module

Hàm 3

#<Tiền xử lý>
Khai báo / định nghĩa

Hàm 1

Hàm 2

Hàm 3
Trần Quang
© 2016

Chương 08: Hàm

Kỹ thuật lập trình
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

Chương 08: Hàm

Kỹ thuật lập trình
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

Chương 08: Hàm

Kỹ thuật lập trình
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

Chương 08: Hàm

Kỹ thuật lập trình
11


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

Chương 08: Hàm

Kỹ thuật lập trình
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

Chương 08: Hàm

Kỹ thuật lập trình
13


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;
}
Trần Quang
© 2016

Cài đặt các lệnh cho
hàm

Chương 08: Hàm

Kỹ thuật lập trình
14


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




Đưa phần hiện thực vào một tập tin riêng





Sử dụng chỉ thị #if !defined(.) … endif để
tránh lỗi “định nghĩa lặp lại” (redefinition)

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



Trần Quang
© 2016

Khai báo có sử dụng đến các hàm ở *.h nói trên
Gọi hàm
Chương 08: Hàm


Kỹ thuật lập trình
15


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

Chương 08: Hàm

Kỹ thuật lập trình
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 q 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

Chương 08: Hàm

Kỹ thuật lập trình
17


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


Chương 08: Hàm

Kỹ thuật lập trình
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

Chương 08: Hàm

Kỹ thuật lập trình
19


Tham số và đối số
int main(){
printf("10 + 15 = %d", add(10, 15));

system("pause");
return EXIT_SUCCESS;
}

10: là đối số của tham số a
15: là đối số của tham số b

Trần Quang
© 2016

int add(int a, int b) {
int c;
c = a + b;
return c;
}

Chương 08: Hàm

Kỹ thuật lập trình
20



Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×