Bài giảng Lập trình - Bài:Hàm & kỹ thuật tổ chức chương trình - Phạm Minh Tuấn

Giới thiệu

Truyền tham số cho hàm

Biến toàn cục và biến cục bộ

Các ví dụ về ứng dụng hàm trong lập trình

Hàm trong chương trình nhiều tập tin mã nguồn

Các vấn đề tìm hiểu mở rộng kiến thức nghề nghiệp

Thuật ngữ và bài đọc thêm tiếng Anh

Bài giảng Lập trình - Bài:Hàm & kỹ thuật tổ chức chương trình - Phạm Minh Tuấn trang 1

Trang 1

Bài giảng Lập trình - Bài:Hàm & kỹ thuật tổ chức chương trình - Phạm Minh Tuấn trang 2

Trang 2

Bài giảng Lập trình - Bài:Hàm & kỹ thuật tổ chức chương trình - Phạm Minh Tuấn trang 3

Trang 3

Bài giảng Lập trình - Bài:Hàm & kỹ thuật tổ chức chương trình - Phạm Minh Tuấn trang 4

Trang 4

Bài giảng Lập trình - Bài:Hàm & kỹ thuật tổ chức chương trình - Phạm Minh Tuấn trang 5

Trang 5

Bài giảng Lập trình - Bài:Hàm & kỹ thuật tổ chức chương trình - Phạm Minh Tuấn trang 6

Trang 6

Bài giảng Lập trình - Bài:Hàm & kỹ thuật tổ chức chương trình - Phạm Minh Tuấn trang 7

Trang 7

Bài giảng Lập trình - Bài:Hàm & kỹ thuật tổ chức chương trình - Phạm Minh Tuấn trang 8

Trang 8

Bài giảng Lập trình - Bài:Hàm & kỹ thuật tổ chức chương trình - Phạm Minh Tuấn trang 9

Trang 9

Bài giảng Lập trình - Bài:Hàm & kỹ thuật tổ chức chương trình - Phạm Minh Tuấn trang 10

Trang 10

Tải về để xem bản đầy đủ

pdf 86 trang Danh Thịnh 08/01/2024 4520
Bạn đang xem 10 trang mẫu của tài liệu "Bài giảng Lập trình - Bài:Hàm & kỹ thuật tổ chức chương trình - Phạm Minh Tuấn", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

Tóm tắt nội dung tài liệu: Bài giảng Lập trình - Bài:Hàm & kỹ thuật tổ chức chương trình - Phạm Minh Tuấn

Bài giảng Lập trình - Bài:Hàm & kỹ thuật tổ chức chương trình - Phạm Minh Tuấn
Nhập môn lập trình 
Trình bày: ; Email: @fit.hcmus.edu.vn 
Giới thiệu 
Truyền tham số cho hàm 
Biến toàn cục và biến cục bộ 
Các ví dụ về ứng dụng hàm trong lập trình 
Hàm trong chương trình nhiều tập tin 
mã nguồn 
Các vấn đề tìm hiểu mở rộng kiến thức 
nghề nghiệp 
Thuật ngữ và bài đọc thêm tiếng Anh 
11/10/2012 Khoa CNTT - ĐH Khoa học tự nhiên 2 
Chương trình lớn 
được chia thành các 
chương trình con 
nhỏ hơn nhằm dễ 
dàng phân chia và 
kiểm tra công việc 
hay sử dụng lại 
những bộ phận đã 
hoàn tất. 
11/10/2012 Khoa CNTT - ĐH Khoa học tự nhiên 4 
Nhập 
dữ liệu 
Xuất 
kết quả 
Xử lý 1 Xử lý 2 
Tiếp cận top-down 
trong lập trình cấu trúc 
Xử lý 
Chương 
trình 
• Hàm có các đặc điểm sau: 
– Có một tên duy nhất. 
– Là một thành phần độc lập. 
– Thực hiện một công việc cụ thể. 
– Có thể nhận các đối số. 
– Có thể trả về giá trị cho chương trình gọi nó. 
11/10/2012 Khoa CNTT - ĐH Khoa học tự nhiên 5 
Các đối tượng 
có sẵn (đối số) 
Các kết quả 
Hàm 
Thực hiện 
một công việc 
cụ thể nào đó 
return-type function_name(param-type param_name, 
, param-type param_name); 
• Trong đó: 
– return-type: kiểu của giá trị hàm sẽ trả về, nếu không 
trả về gì cả thì kiểu trả về sẽ là void. 
– function_name: tên của hàm, thể hiện công việc hàm 
sẽ làm, nên bắt đầu bằng một động từ. 
– param-name, param-type: tên và kiểu tương ứng của 
tham số hình thức (formal parameter). 
– Được kết thúc bằng dấu chấm phẩy ; 
11/10/2012 Khoa CNTT - ĐH Khoa học tự nhiên 6 
return-type function_name(param-type param_name, 
, param-type param_name) 
{ 
 // statements here 
} 
• Trong đó: 
– Dòng đầu là tiêu đề hàm (giống nguyên mẫu hàm 
nhưng không có ; và bắt buộc phải có tên tham số). 
– Tiếp theo là thân hàm (đặt trong {}) chứa các câu 
lệnh hàm sẽ thực hiện (phải có ít nhất một lệnh 
return nếu kiểu trả về không phải là void) 
11/10/2012 Khoa CNTT - ĐH Khoa học tự nhiên 7 
• Hàm có sẵn (trong ngôn ngữ hoặc do một 
hãng phần mềm viết để bán hoặc cho) như: 
– Hàm xuất, nhập thông tin: printf(), scanf(),  
– Hàm toán học: sqrt(), pow(), abs(), sin(),  
• Hàm do người lập trình viết thêm như: 
– Hàm xuất, nhập thông tin: Nhập số dương, ... 
– Hàm toán học: Tính căn bậc 3, tính căn bậc n, 
tính giai thừa, giải phương trình bậc 1, bậc 2, 
bậc 4 đối xứng,  
11/10/2012 Khoa CNTT - ĐH Khoa học tự nhiên 8 
void main() 
{ 
 int a = 7, b = 5; 
 float z = 9; 
 printf(“a = %d\n”, a); 
 printf(“b = ”); 
 scanf(“%d”, &b); 
 z = (float)pow((double)b, (double)a); 
} 
11/10/2012 Khoa CNTT - ĐH Khoa học tự nhiên 9 
Đối số 
Biến nhận giá trị 
trả về của hàm 
11/10/2012 Khoa CNTT - ĐH Khoa học tự nhiên 10 
double sqrt3(double x) { 
 double y = 0; // temporary variable 
 if (x > 0) 
 y = pow(x, 1/(double)3); 
 else 
 if (x < 0) 
 y = -pow(-x, 1/(double)3); 
 return y; // returns result 
} // end of function 
11/10/2012 Khoa CNTT - ĐH Khoa học tự nhiên 11 
11/10/2012 Khoa CNTT - ĐH Khoa học tự nhiên 12 
// Function name : sqrtN 
// Description : calculates n-th root of x 
// Parameter : double x 
// Return type : double 
// 0 if n < 0 
// 1 if n = 0 
// x^(1/n) if n odd 
// x^(1/n) if n even and x >= 0 
// 0 if n even and x < 0 
double sqrtN(double x); 
11/10/2012 Khoa CNTT - ĐH Khoa học tự nhiên 13 
double sqrtN(double x) 
{ 
 double y = 0; 
 if (n <= 0 || (n % 2 ==0 && x < 0)) 
 return 0; 
 if (n % 2 != 0) 
 { 
 if (x > 0) 
 y = pow(x, 1.0/n); 
11/10/2012 Khoa CNTT - ĐH Khoa học tự nhiên 14 
 else // n odd and x <= 0 
 if (x < 0) 
 y = -pow(-x, 1.0/n); 
 } 
 else // n even and x > 0 
 y = pow(x, 1.0/n); 
 return y; 
} 
11/10/2012 Khoa CNTT - ĐH Khoa học tự nhiên 15 
• Các câu lệnh bên trong hàm chỉ được thực 
thi khi hàm được gọi từ một phần khác 
của chương trình. 
• Khi gọi hàm, chương trình có thể truyền đến 
hàm thông tin dưới dạng một hay nhiều đối số. 
11/10/2012 Khoa CNTT - ĐH Khoa học tự nhiên 17 
main() { 
 call f1 
} 
f1() { 
 call f2 
} 
f2() { 
} 
• Đối số (argument) hay tham số thực 
(actual parameter) là dữ liệu của chương 
trình truyền đến hàm có kiểu dữ liệu ứng 
với tham số hình thức được khai báo trong 
nguyên mẫu hàm. Dữ liệu này thường 
được hàm sử dụng để thực hiện công việc 
của nó. 
 int SolveEq1(double a, double b, double &x); 
11/10/2012 Khoa CNTT - ĐH Khoa học tự nhiên 18 
Đối số 
2, 3, x 
• Có hai cách truyền đối số 
– Truyền bằng giá trị (pass by value) 
• Đối số không đổi do hàm tạo bản sao của đối số khi nhận. 
• Thông thường là dữ liệu có sẵn. 
• Tham số hình thức tương ứng được gọi là tham trị. 
– Truyền bằng tham chiếu (pass by reference): C++ 
• Đối số có thể thay đổi khi gọi hàm. 
• Thông thường là dữ liệu cần tính toán, xác định. 
• Tham số hình thức tương ứng được gọi là tham 
chiếu hay tham biến. 
11/10/2012 Khoa CNTT - ĐH Khoa học tự nhiên 19 
int Inc(int x); 
void main() { 
 int a = 9, b; 
 b = Inc(a); // a is passed by value 
 printf(“a = %d, b = %d\n”, a, b); 
} 
int Inc(int x) { 
 x++; 
 return x; 
} 
11/10/2012 Khoa CNTT - ĐH Khoa học tự nhiên 20 
int x = 9; 
int Inc(int &x); // C++ 
void main() { 
 int a = 9, b; 
 b = Inc(a); 
 printf(“a = %d, 
 b = %d\n”, a, b); 
} 
int Inc(int &x) { 
 x++; 
 return x; 
} 
int Inc(int *x); /* C */ 
void main() { 
 int a = 9, b; 
 b = Inc(&a); 
 printf(“a = %d, 
 b = %d\n”, a, b); 
} 
int Inc(int *x) { 
 (*x)++; 
 return (*x); 
} 
11/10/201
2 
Khoa CNTT - ĐH Khoa học tự nhiên 21 
Địa chỉ 
của a 
int *x = &a; 
void f1(double x); 
void f2(double &x); 
void f3(const double &x); 
void main() { 
 double a = 15.06; 
 f1(a); // passed by value 
 f2(a); // passed by reference 
 f3(a); // passed by const reference 
} 
// defines f1(), f2(), f3() here 
11/10/2012 Khoa CNTT - ĐH Khoa học tự nhiên 22 
double x = 15.06; 
Tốn bộ nhớ 
khi x lớn 
• Có hai cách để gọi hàm 
– Mọi hàm đều có thể được gọi bằng cách sử 
dụ ...  30 
Biến toàn cục 
int x = 999; 
void f(); 
void main() { 
 printf(“%d\n”, x); 
 f(); 
} 
void f() { 
 printf(“%d\n”, x); 
} 
Biến cục bộ 
void f(); 
void main() { 
 int x = 999; 
 printf(“%d\n”, x); 
 f(); 
} 
void f() { 
 printf(“%d\n”, x); 
} 
11/10/201
2 
Khoa CNTT - ĐH Khoa học tự nhiên 31 
int x = 1, y = 2; 
void f() { 
 int x = 3; 
 printf(“x = %d, y = %d\n”, x, y); 
 if (y > 0) { 
 int z = 4; 
 printf(“%d\n”, z); 
 } 
 printf(“x = %d\n”, x); 
 printf(“z = %d\n”, z); // error 
} 
11/10/2012 Khoa CNTT - ĐH Khoa học tự nhiên 32 
• Biến toàn cục (global variable) là cách gọi 
khác của biến ngoài (external variable). 
• Nói đúng ra, tầm vực của biến ngoài (hay 
biến toàn cục) là trong toàn bộ mã nguồn 
của tập tin chứa khai báo biến đó. 
• Các chương trình C có kích thước không lớn 
chỉ được chứa trong một tập tin mã nguồn 
nên tầm vực là toàn bộ chương trình. 
• Biến ngoài được khai báo tường minh bằng 
từ khóa extern. 
11/10/2012 Khoa CNTT - ĐH Khoa học tự nhiên 33 
int x = 999; // external/global variable 
void f(); 
void main() { 
 extern int x; 
 printf(“%d\n”, x); 
 f(); 
} 
void f() { 
 extern int x; 
 printf(“%d\n”, x); 
} 
11/10/2012 Khoa CNTT - ĐH Khoa học tự nhiên 34 
Có thể bỏ từ khóa extern 
nếu trong cùng 
một tập tin mã nguồn 
• Hạn chế sử dụng biến ngoài/toàn cục vì điều này 
phá vỡ tính độc lập đơn thể (modular 
independence), nguyên lý trung tâm của lập tình 
cấu trúc. 
• Độc lập đơn thể là ý tưởng mỗi hàm hay đơn thể 
trong một chương trình chứa tất cả mã nguồn và 
dữ liệu cần thiết để thực hiện công việc của nó. 
• Đối với các chương trình nhỏ thì việc sử dụng 
chung biến ngoài/toàn cục không quan trọng 
nhưng khi làm việc với các chương trình lớn hơn 
và phức tạp hơn thì sự quá ràng buộc vào biến 
ngoài sẽ nảy sinh nhiều vấn đề rắc rối. 
11/10/2012 Khoa CNTT - ĐH Khoa học tự nhiên 35 
• Mỗi khi chương trình thực thi lời khai báo 
biến cục bộ, một bản sao riêng biệt của 
biến cục bộ đó được tạo ra. 
• Nếu biến cục bộ được khai báo là tĩnh 
(static) thì biến này sẽ được tạo ra một lần 
duy nhất ở lần đầu tiên khi chương trình 
thực thi lời khai báo của nó. 
• Không như biến toàn cục, biến cục bộ tĩnh 
không bị truy cập và thay đổi bởi các hàm khác. 
11/10/2012 Khoa CNTT - ĐH Khoa học tự nhiên 36 
void f() { 
 static int n = 0; // initialized once 
 int x = 0; // initialized n times 
 printf(“n = %d, x = %d\n”, n++, x++); 
} 
void main() { 
 int i; 
 for (i = 0; i < 3; i++) 
 f(); 
} 
11/10/2012 Khoa CNTT - ĐH Khoa học tự nhiên 37 
n = 0, x = 0 
n = 0, x = 1 
n = 0, x = 2 
• Có 3 loại dữ liệu sau khi thực hiện yêu cầu 
gọi hàm: 
– Dữ liệu nhập: dữ liệu có sẵn, cần thiết để thực 
hiện hàm, thường được truyền ở dạng tham trị 
hoặc tham biến. 
– Dữ liệu xuất: dữ liệu hàm tính toán được, thường 
được trả về bằng lệnh return hoặc ở dạng tham 
biến. 
– Dữ liệu trung gian: dữ liệu do hàm tạo ra trong 
quá trình thực hiện công việc, thường phục vụ 
cho việc tính toán dữ liệu xuất. 
11/10/2012 Khoa CNTT - ĐH Khoa học tự nhiên 38 
// returns f(x, y) = ax + by and reverses the signs of a, b if f < 0 
int Calculate(float &a, float &b, float x, float y) { 
 int temp1, temp2, f; 
 temp1 = a * x; 
 temp2 = b * y; 
 f = temp1 + temp2; 
 if (f < 0) { 
 a = -a; 
 b = -b; 
 } 
 return f; 
} 
11/10/2012 Khoa CNTT - ĐH Khoa học tự nhiên 39 
Dữ liệu nhập? 
Dữ liệu trung gian? 
Dữ liệu xuất? 
11/10/2012 Khoa CNTT - ĐH Khoa học tự nhiên 41 
11/10/2012 Khoa CNTT - ĐH Khoa học tự nhiên 42 
int SolveEq1(float a, float b, float &x) { 
 int nSol = 0; 
 if (a != 0) { 
 x = -b/a; 
 nSol = 1; 
 } 
 else 
 if (b == 0) 
 nSol = VODINH; 
 return nSol; 
} 
11/10/2012 Khoa CNTT - ĐH Khoa học tự nhiên 43 
void main() { 
 float a, b, x; 
 // inputs a, b here 
 int nSol = SolveEq1(a, b, x); 
 switch (nSol) { 
 // checks nSol here 
 } 
} 
11/10/2012 Khoa CNTT - ĐH Khoa học tự nhiên 44 
11/10/2012 Khoa CNTT - ĐH Khoa học tự nhiên 45 
int SolveEq2(float a, float b, float c, float &x1, float &x2) { 
 int nSol = 0; 
 float delta; 
 if (a == 0) 
 return SolveEq1(a, b, x1); // reuses SolveEq1() 
 delta = b*b – 4*a*c; 
 if (delta < 0) 
 return 0; 
11/10/2012 Khoa CNTT - ĐH Khoa học tự nhiên 46 
 if (delta == 0) { 
 x1 = x2 = -b/(2*a); 
 nSol = 1; 
 } 
 else { // delta > 0 
 x1 = (-b – sqrt(delta))/(2*a); 
 x2 = (-b + sqrt(delta))/(2*a); 
 nSol = 2; 
 } 
 return nSol; 
} 
11/10/2012 Khoa CNTT - ĐH Khoa học tự nhiên 47 
void main() { 
 float a, b, c, x1, x2; 
 // inputs a, b, c here 
 int nSol = SolveEq2(a, b, c, x1, x2); 
 switch (nSol) { 
 // checks nSol here 
 } 
} 
11/10/2012 Khoa CNTT - ĐH Khoa học tự nhiên 48 
11/10/2012 Khoa CNTT - ĐH Khoa học tự nhiên 49 
11/10/2012 Khoa CNTT - ĐH Khoa học tự nhiên 50 
11/10/2012 Khoa CNTT - ĐH Khoa học tự nhiên 51 
11/10/2012 Khoa CNTT - ĐH Khoa học tự nhiên 52 
int SolveEq4Sym(float a, float b, float c, 
float &x1, float &x2, float &x3, float &x4) 
{ 
 int nSol; 
 if (a == 0) { 
 x1 = 0; 
 nSol = SolveEq2(b, c, b, x2, x3); 
 if (nSol != VODINH) 
 nSol++; 
 } 
11/10/2012 Khoa CNTT - ĐH Khoa học tự nhiên 53 
 else { 
 float Y1, Y2; 
 int nSol1 = SolveEq2(a, b, c-2*a, Y1, Y2); 
 switch (nSol1) { 
 case 0: 
 nSol = 0; 
 break; 
 case 1: 
 nSol = SolveEq2(1, -Y1, 1, x1, x2); 
 break; 
11/10/2012 Khoa CNTT - ĐH Khoa học tự nhiên 54 
 case 2: 
 int nSol2 = SolveEq2(1, -Y1, 1, x1, x2); 
 switch (nSol2) { 
 case 0: 
 nSol = SolveEq2(1, -Y2, 1, 
x1, x2); 
 break; 
 case 1: 
 nSol = SolveEq2(1, -Y2, 1, 
x2, x3); 
 break; 
11/10/2012 Khoa CNTT - ĐH Khoa học tự nhiên 55 
 case 2: 
 nSol = SolveEq2(1, -Y2, 1, 
x3, x4); 
 break; 
 } 
 break; 
 } 
 } 
 return nSol; 
} 
11/10/2012 Khoa CNTT - ĐH Khoa học tự nhiên 56 
• Chương trình với một tập tin mã nguồn chỉ 
phù hợp với các chương trình nhỏ. 
• Khi đặt một tập các hàm có mục đích tổng 
quát vào một tập tin riêng, ta có thể sử dụng 
lại các hàm này ở các chương trình khác. 
• Khi viết chương trình gồm nhiều tập tin mã 
nguồn, mỗi tập tin mã nguồn được gọi là một 
đơn thể (module). Cách lập trình như vậy gọi 
là lập trình đơn thể (modular programming), 
có liên quan rất gần với lập trình cấu trúc. 
11/10/2012 Khoa CNTT - ĐH Khoa học tự nhiên 58 
• Mỗi chương trình C chỉ có duy nhất một 
hàm main(). 
• Đơn thể chứa hàm main() được gọi là đơn 
thể chính, các đơn thể khác được gọi là 
đơn thể phụ. 
• Một tập tin tiêu đề riêng rẽ thường được 
đi kèm với mỗi đơn thể phụ. 
11/10/2012 Khoa CNTT - ĐH Khoa học tự nhiên 59 
/* mymath.h: header file for mymath.c */ 
double sqrt3(double x); 
double sqrtN(double x); 
/* end of mymath.h */ 
11/10/2012 Khoa CNTT - ĐH Khoa học tự nhiên 60 
/* mymath.c: module containing math functions */ 
#include “mymath.h” 
double sqrt3(double x) { /* statements */ } 
double sqrtN(double x) { /* statements */ } 
/* end of mymath.c */ 
#include 
#include “mymath.h” 
void main() { 
 int x; 
 printf(“Enter an integer value: ”); 
 scanf(“%d”, &x); 
 printf(“The 3rd root of %d is %.lf\n”, 
x, sqrt3((double)x); 
 /* other statements here */ 
} 
11/10/2012 Khoa CNTT - ĐH Khoa học tự nhiên 61 
• Hàm và biến toàn cục (hay biến ngoài) 
không tự động được thấy trong các đơn 
thể khác. 
• Khai báo để các đơn thể khác có thể thấy 
được hàm hay biến toàn cục trong các 
đơn thể khác: 
– Hàm: sử dụng chỉ thị #include (ví dụ trước) 
– Biến toàn cục: sử dụng từ khóa extern 
11/10/2012 Khoa CNTT - ĐH Khoa học tự nhiên 62 
/* main module: sample.c */ 
int x = 99, y; /* the compiler automatically initializes y to 0 */ 
void main() {/* statements */ } 
11/10/2012 Khoa CNTT - ĐH Khoa học tự nhiên 63 
/* secondary module: mod1.c */ 
extern int x, y; 
void func1() { /* statements */ } 
/* secondary module: mod2.c */ 
extern int x; 
void func2() { /* statements */ } 
• Nhu cầu 
– Thực hiện một công việc với nhiều cách khác 
nhau. Nếu các hàm khác tên sẽ khó nhớ. 
• Ví dụ: 
– Các hàm tính trị tuyệt đối trong C (math.h) 
• int abs(int n); 
• long labs(long n); 
• double fabs(double n); 
– Các hàm tính căn bậc 2: sqrt(), sqrtf() 
11/10/2012 Khoa CNTT - ĐH Khoa học tự nhiên 65 
• Khái niệm 
– Là các hàm cùng tên nhưng có tham số đầu 
vào hoặc kiểu trả về khác nhau nhằm cho 
phép người dùng chọn cách thuận lợi nhất để 
thực hiện công việc. 
– Nguyên mẫu hàm khi bỏ tên tham số phải 
khác nhau. 
– Việc sử dụng các hàm trùng tên được gọi là 
nạp chồng hay quá tải (overload) hàm. 
11/10/2012 Khoa CNTT - ĐH Khoa học tự nhiên 66 
// prints integers from 1 to n 
void PrintIntegers(int n); 
// prints integers from x to y 
void PrintIntegers(int x, int y); 
// prints integers from x to y 
// with an arithmetic progression a 
void PrintIntegers(int x, int y, int a); 
11/10/2012 Khoa CNTT - ĐH Khoa học tự nhiên 67 
• Các hàm sau đây là như nhau do cùng 
nguyên mẫu hàm: int Sum(int, int); 
// calculates a + b 
int Sum(int a, int b); 
// calculates b + a 
int Sum(int b, int a); 
// calculates x + y 
int Sum(int x, int y); 
11/10/2012 Khoa CNTT - ĐH Khoa học tự nhiên 68 
float f(float x) { return x/2; } 
double f(double x) { return x/2; } 
void main() { 
 float x = 29.12; 
 double y = 17.06; 
 printf(“%.2f\n”, f(x)); // float 
 printf(“%.2lf\n”, f(y)); // double 
 printf(“%.2f\n”, f(10)); // ??? 
 printf(“%.2f\n”, f((float)10)); // float 
} 
11/10/2012 Khoa CNTT - ĐH Khoa học tự nhiên 69 
void f(unsigned char c) { printf(“%d”, c); } 
void f(char c) { printf(“%c”, c); } 
void main() 
{ 
 f(‘A’); // char 
 f(65); // ??? 
 f((char)65); // char 
 f((unsigned char)65); // unsigned char 
} 
11/10/2012 Khoa CNTT - ĐH Khoa học tự nhiên 70 
int f(int a, int b) { return a + b; } 
int f(int a, int &b) { return a + b; } 
void main() 
{ 
 int x = 1, y = 2; 
 printf(“%d”, f(x, 2)); // b = 2 
 printf(“%d”, f(x, y)); // ??? 
} 
11/10/2012 Khoa CNTT - ĐH Khoa học tự nhiên 71 
int f(int a) { return a*a; } 
int f(int a, int b = 1) { return a*b; } 
void main() 
{ 
 printf(“%d\n”, f(2912, 1706)); 
 printf(“%d\n”, f(2912)); // ??? 
} 
11/10/2012 Khoa CNTT - ĐH Khoa học tự nhiên 72 
• Khái niệm 
– Là hàm có một hay nhiều tham số hình thức 
được gán sẵn giá trị mặc định. Các tham số 
này nhận giá trị mặc định đó nếu không có 
đối số tương ứng được truyền vào. 
– Các tham số mặc định phải được dồn về tận 
cùng bên phải. 
• Ví dụ 
void PrintFraction(int num, int denom = 1); 
11/10/2012 Khoa CNTT - ĐH Khoa học tự nhiên 73 
11/10/2012 Khoa CNTT - ĐH Khoa học tự nhiên 74 
11/10/2012 Khoa CNTT - ĐH Khoa học tự nhiên 75 
• Khái niệm 
– Hàm có thể truyền vào hàm khác dưới dạng 
đối số đầu vào. 
– Việc khai báo tham số là hàm tương tự như 
khai báo nguyên mẫu hàm (không cần tên 
các tham số hình thức) 
– Chỉ được phép truyền các hàm có nguyên 
mẫu hàm (sau khi bỏ đi tên các tham số hình 
thức) giống với nguyên mẫu hàm của tham số 
hình thức hàm được khai báo. 
11/10/2012 Khoa CNTT - ĐH Khoa học tự nhiên 76 
int FindBestNumber(int a, int b, int Better(int, int)) { 
 int numBest = a; 
 if (Better(b, a)) { 
 numBest = b; 
 } 
 return numBest; 
} 
int MaxNumber(int x, int y) { return x > y; } 
int MinNumber(int x, int y) { return x < y; } 
11/10/2012 Khoa CNTT - ĐH Khoa học tự nhiên 77 
int FindBestNumber(int a[], int n, int Better(int, int)) { 
 int i, idBest = 0; 
 for (i = 1; i < n; i++) { 
 if (Better(a[i], a[idBest])) 
 idBest = id; 
 } 
 return a[idBest]; 
} 
int MaxNumber(int x, int y) { return x > y; } 
int MinNumber(int x, int y) { return x < y; } 
11/10/2012 Khoa CNTT - ĐH Khoa học tự nhiên 78 
11/10/2012 Khoa CNTT - ĐH Khoa học tự nhiên 79 
• Khai báo hàm: 
unsigned int factorial(unsigned int n); 
• Định nghĩa hàm: 
unsigned int factorial(unsigned int n) 
{ 
 if (n == 1) 
 return 1; 
 else 
 return n * factorial(n – 1); 
} 
11/10/2012 Khoa CNTT - ĐH Khoa học tự nhiên 80 
Tiêu chí so sánh/Ngôn ngữ C C++ C# Java 
Khai báo hàm độc lập với 
các thành phần khác 
  
Khai báo hàm (phương thức) 
trong lớp đối tượng (class) 
   
Truyền bằng giá trị 
(tham trị) 
   
 
(kiểu cơ sở) 
Truyền bằng địa chỉ   
Truyền bằng biến 
(tham biến/tham chiếu) 
 
(sử dụng &) 
 
(sử dụng từ 
khóa ref, out) 
 
(đối tượng 
và mảng) 
Tham số có giá trị mặc định    
Hàm trùng tên 
(nạp chồng hàm) 
   
11/10/2012 Khoa CNTT - ĐH Khoa học tự nhiên 81 
• function: hàm (chương trình con) 
• structured programming: lập trình cấu trúc 
• modular programming: lập trình đơn thể 
• parameter: tham số 
• argument : đối số 
• formal parameter: tham số hình thức, tương đương với 
parameter 
• actual parameter: tham số thực, tương đương với argument 
• function prototype: nguyên mẫu hàm 
• function header: tiêu đề hàm 
• function declaration: khai báo hàm 
• function definition: định nghĩa hàm 
11/10/2012 Khoa CNTT - ĐH Khoa học tự nhiên 83 
• local variable: biến cục bộ 
• extern varialbe: biến ngoài 
• global variable: biến toàn cục, tương tự extern variable 
• call by value: truyền đối số bằng giá trị (tham trị) 
• call by reference: truyền đối số bằng tham biến 
(tham chiếu) 
• scope: tầm vực, phạm vi hiệu quả 
• recursion: sự đệ qui 
• overload: nạp chồng, quá tải 
• ambiguity: nhập nhằng, mơ hồ 
11/10/2012 Khoa CNTT - ĐH Khoa học tự nhiên 84 
• Bradley L. Jones and Peter Aitken, Teach 
Yourself C in 21 days, 6th Edition, SAMS, 2003. 
– Day 5. Packaging Code in Functions, pp. 97-122. 
– Day 12. Understanding Variable Scope, pp. 285-303. 
– Day 21. Advanced Compiler Use – Programming with 
Multiple Source-Code Files, pp. 593-600. 
• Bjarne Stroustrup, The C++ Programming 
Language, 3rd Edition, AT&T, 1997. 
– Chapter 7. Functions, pp. 143-164. 
– Chapter 9. Source Files and Programs, pp. 197-220. 
11/10/2012 Khoa CNTT - ĐH Khoa học tự nhiên 85 

File đính kèm:

  • pdfbai_giang_lap_trinh_baiham_ky_thuat_to_chuc_chuong_trinh_pha.pdf