Professional Documents
Culture Documents
c++ How to Programming Part 3 (đã dịch)
c++ How to Programming Part 3 (đã dịch)
Chapter 3 - Hàm
Outline
3.1 Giới thiệu
3.2 Các thành phần chương trình trong C++
3.3 Các hàm thư viện toán Math Library
3.4 Hàm
3.5 Hàm định nghĩa
3.6 Hàm nguyên mẫu
3.7 File Header
3.8 Tạo số ngẫu nhiên
3.9 Ví dụ : Chơi trò may rủi và giới thiệu enum
3.10 Các lớp lưu trữ
3.11 Quy phạm
3.12 Đệ quy
3.13 Ví dụ sử dụng đệ quy: Dãy số Fibonacci
3.14 Đệ quy và Lặp
3.15 Hàm với danh sách tham số trống
Chapter 3 - Functions
Outline
3.16 Hàm Inline
3.17 Tham chiếu và tham số tham
chiếu
3.18 Đối số mặc định
3.19 Unary Scope Resolution Operator
3.20 Function Overloading
3.21 Function Templates
Phương thức Mô tả Ví dụ
ceil( x ) Làm tròn x tới số nguyên nhỏ ceil( 9.2 ) is 10.0
nhất không bé hơn x ceil( -9.8 ) is -9.0
cos( x ) Cos của x cos( 0.0 ) is 1.0
(x tính theo radian)
exp( x ) Hàm e mũ x : ex exp( 1.0 ) is 2.71828
exp( 2.0 ) is 7.38906
fabs( x ) Trị tuyệt đối của x fabs( 5.1 ) is 5.1
fabs( 0.0 ) is 0.0
fabs( -8.76 ) is 8.76
floor( x ) Làm tròn x tới số nguyên lớn floor( 9.2 ) is 9.0
nhất không lớn hơn x floor( -9.8 ) is -10.0
fmod( x, y ) Phần dư của x/y là một số thực fmod( 13.657, 2.333 ) is 1.992
3.4 Hàm
• Hàm
– Module hoá một chương trình
– Phần mềm có khả năng tái sử dụng
• Gọi hàm nhiều lần
• Các biến địa phương
– Chỉ được dùng trong hàm mà chúng được xác
– Mọi biến được khai báo trong các định nghĩa hàm là các
biến điạ phương
• Các tham số
– Các biến điạ phương truyền tới hàm khi được gọi
– Cung cấp thông tin bên ngoài
• Ví dụ hàm
int square( int y )
{
return y * y;
}
• Từ khoá return
– Trả về dữ liệu, và điều khiển đi tới đối tượng gọi của hàm
• Nếu không có dữ liệu trả về, dùng return;
– Hàm kết thúc khi tiến tới dấu khép ngoặc
• Điều khiển tiến tới đối tượng gọi
• Hàm không thể được xác định bên trong các hàm
khác
• Tiếp theo: chương trình ví dụ
2003 Prentice Hall, Inc. All rights reserved.
13
1 // Fig. 3.3: fig03_03.cpp
2 // Creating and using a programmer-defined function.
Outline
3 #include <iostream>
4 Hàm nguyên mẫu: chỉ định fig03_03.cpp
5 using std::cout; kiểu dữ liệu của đối số và trả (1 of 2)
6 using std::endl; về giá trị. square mong đợi
7
một int, và trả lại một int.
8 int square( int ); // function prototype
9
10 int main()
11 { Ngoặc () khiến hàm được
12 // loop 10 times and calculate and output
gọi. Khi được thực hiện, nó
13 // square of x each time
14 for ( int x = 1; x <= 10; x++ )
trả về kết quả.
15 cout << square( x ) << " "; // function call
16
17 cout << endl;
18
19 return 0; // indicates successful termination
20
21 } // end main
22
• Ký hiệu hàm
– Một phần của nguyên mẫu với tên và tham số
• double maximum( double, double, double );
Ký hiệu hàm
• Đối số áp đặt
– Buộc các đối số theo kiểu phù hợp
• Chuyển int (4) thành double (4.0)
cout << sqrt(4)
– Quy tắc chuyển đổi
• Các đối số thường xuyên chuyển đổi tự động
• Đổi từ double sang int có thể làm mất dữ liệu
– 3.4 thành 3
– Kiểu hỗn hợp tiến tới kiểu cao cấp nhất (tăng cấp)
• Int * double
Kiểu dữ liệu
long double
double
float
unsigned long int (đồng nghĩa với unsigned long)
long int (đồng nghĩa với long)
unsigned int (đồng nghĩa với unsigned)
int
unsigned short int (đồng nghĩa với unsigned short)
short int (đồng nghĩa với short)
unsigned char
char
bool (false trả về 0, true trả về 1)
Fig. 3.5 Promotion hierarchy for built-in data types.
• Tiếp theo
– Chương trình biểu diễn sự phân bổ của rand()
– Giả sử tung 6000 lần 1 viên xúc sắc
– In ra số lần kết quả là 1, 2, …
– Xấp xỉ 1000 mỗi loại
Enter seed: 67
6 1 4 6 2
1 6 1 6 4
• Có thể dùng thời gian hiện hành để thiết lập giá trị
ban đầu
– Không cần thiết lập giá trị ban đầu mọi lúc một cách rõ ràng
– srand( time( 0 ) );
– time( 0 );
• <ctime>
• Trả về thời điểm hiện hành trong vài giây
• shifting và scaling chung
– Số = giá-trị-shifting + rand() % yếu-tố-scaling
– Giá-trị-shifting = số đầu tiên trong phạm vi cho phép
– Yếu-tố-scaling = độ rộng của phạm vi
Player rolled 6 + 6 = 12
Player loses
Player rolled 3 + 3 = 6
Point is 6
Player rolled 5 + 3 = 8
Player rolled 4 + 5 = 9
Player rolled 2 + 1 = 3
Player rolled 1 + 5 = 6
Player wins
• Phạm vi
– Một phần của chương trình nơi từ định danh có thể được
dùngPortion
• Phạm vi file
– Được xác định bên ngoài một hàm, được biết tới trong mọi
hàm
– Toàn bộ các biến, định nghĩa hàm và nguyên mẫu hàm
• Phạm vi hàm
– Chỉ có thể được tham chiếu bên trong hàm đang được định
nghĩa
– Chỉ được dán nhãn, chẳng hạn, từ định danh với một dấu hai
chấm (case:)
• Phạm vi khối
– Bắc đầu ở khai báo, kết thúc ở dấu khép ngoặc }
• Chỉ có thể được tham chiếu trong khu vực này
– Các biến địa phương, tham số hàm
– Các biến static vẫn có phạm vi khối
• Lớp lưu trữ chia theo pham vi
• Phạm vi nguyên mẫu hàm
– Danh sách tham số của nguyên mẫu
– Tên trong nguyên mẫu tuỳ chọn
• Trình biên dịch bỏ qua
– Trong một nguyên mẫu đơn, tên có thể được dùng một lần
fig03_12.cpp
local static x is 51 on entering useStaticLocal
output (2 of 2)
local static x is 52 on exiting useStaticLocal
local x in main is 5
3.12 Đệ quy
• Hàm đệ quy
– Hàm gọi hàm
– Chỉ có thể giải quyết một trường hợp cơ bản
• Nếu không là trường hợp cơ bản
– Chia vấn đề thành những vấn đề nhỏ hơn
– Thiết lập bản sao mới của hàm để làm việc trong những vấn
đề nhỏ hơn (gọi đệ quy/bước đệ quy)
• Dần tụ lại thành trường hợp cơ bản
• Hàm tạo lệnh gọi tới hàm bên trong câu lệnh trả về
– Dần dần trường hợp cơ bản được giải quyết
• Câu trả lời làm việc theo cách của bản sao, giải quyết toàn bộ
vấn đề
3.12 Đệ quy
0! = 1
1! = 1
2! = 2
3! = 6
4! = 24
5! = 120
6! = 720
7! = 5040
8! = 40320
9! = 362880
10! = 3628800
f( 3 )
return f( 2 ) + f( 1 )
return f( 1 ) + f( 0 ) return 1
return 1 return 0
Enter an integer: 0
Fibonacci(0) = 0
Enter an integer: 1
Fibonacci(1) = 1
Enter an integer: 2
Fibonacci(2) = 1
Enter an integer: 3
Fibonacci(3) = 2
• Nhắc lại
– Lặp: vòng lặp rõ ràng
– Đệ quy: lặp lại lệnh gọi hàm
• Kết thúc
– Lặp: điều kiện lặp không thoả mãn
– Đệ quy: trường hợp cơ bản được nhận dạng
• Cả hai đều có những vòng lặp vô hạn
• Ngang bằng giữa biểu diễn (lặp) và ứng dụng phần
mềm tốt (đệ quy)
• Hàm Inline
– Từ khoá inline trước hàm
– Đòi hỏi trình biên dịch sao chép mã vào chương trình thay vì
tạo lệnh gọi hàm
• Trên hết, giảm lệnh gọi hàm
• Trình biên dịch có thể bỏ qua inline
– Có lợi cho những hàm nhỏ, thường dùng tới
• Ví dụ
inline double cube( const double s )
{ return s * s * s; }
– const thông báo cho trình biên dịch rằng hàm không sửa
đổi s
• Thảo luận trong Chapter 6-7
2003 Prentice Hall, Inc. All rights reserved.
67
1 // Fig. 3.19: fig03_19.cpp
2 // Using an inline function to calculate.
Outline
3 // the volume of a cube.
4 #include <iostream>
fig03_19.cpp
5
(1 of 2)
6 using std::cout;
7 using std::cin;
8 using std::endl;
9
10 // Definition of inline function cube. Definition of function
11 // appears before function is called, so a function prototype
12 // is not required. First line of function definition acts as
13 // the prototype.
14 inline double cube( const double side )
15 {
16 return side * side * side; // calculate cube
17
18 } // end function cube
19
fig03_20.cpp
z = 4 before squareByReference
output (1 of 1)
z = 16 after squareByReference
• Các tham chiếu phải được khởi tạo khi khai báo
– Mặt khác, lỗi trình biên dịch
– Dangling reference
• Tham chiếu cho biến không được xác định
x = 3
y = 3
x = 7
y = 7
• Function overloading
– Các hàm cùng tên nhưng tham số khác nhau with
– Nên biểu diễn những nhiệm vụ giống nhau
• Chẳng hạn,các hàm square int và các hàm float
int square( int x) {return x * x;}
float square(float x) { return x * x; }
• Ví dụ
template < class T > // or template< typename T >
T square( T value1 )
{
return value1 * value1;
}
– T là một kiểu chính thức, được dùng như một kiểu tham số
• Hàm trên trả về biến cùng kiểu với tham số
– Trong hàm gọi, T thay thế bởi kiểu thực
• Nếu int, mọi trả về của T sẽ trở thành int
int x;
int y = square(x);