Ngôn ngữ lập trình C++ - Chương 3: Hàm
3.1 Giới thiệu
3.2 Các thành phần của chương trình C++
3.3 Các hàm trong thưviện toán học
3.4 Hàm
3.5 Định nghĩa hàm (Function Definition)
3.6 Nguyên mẫu hàm (Function Prototype)
3.7 Header File
3.8 Sinh sốngẫu nhiên
3.9 Ví dụ: Trò chơi may rủi và Giới thiệu vềkiểu enum
3.10 Các kiểulưu trữ(Storage Class)
3.11 Các quy tắc phạm vi (Scope Rule)
3.12 Đệquy (Recursion)
3.13 Ví dụsửdụng đệquy: chuỗi Fibonacci
3.14 So sánh Đệquy và Vòng lặp
3.15 Hàm với danh sách đối sốrỗng
} // end main
30
31 // squareByValue multiplies number by itself, stores the
32 // result in number and returns the new value of number
33 int squareByValue( int number )
34 {
35 return number *= number; // caller's argument not modified
36
37 } // end function squareByValue
38
39 // squareByReference multiplies numberRef by itself and
40 // stores the result in the variable to which numberRef
41 // refers in function main
42 void squareByReference( int &numberRef )
43 {
44 numberRef *= numberRef; // caller's argument modified
45
46 } // end function squareByReference
thay đổi number, nhưng đối số gốc
(x) không bị thay đổi.
thay đổi numberRef, một biệt danh
của đối số gốc. Do đó, z bị thay đổi.
©2004 Trần Minh Châu.
FOTECH. VNU.
71
fig03_20.cpp
output (1 of 1)
x = 2 before squareByValue
Value returned by squareByValue: 4
x = 2 after squareByValue
z = 4 before squareByReference
z = 16 after squareByReference
© 2004 Trần Minh Châu. FOTECH. VNU
72
Chương 3.
3.18 Các đối số mặc định
• Lời gọi hàm với các tham số được bỏ qua
– Nếu không đủ số tham số, các vị trí ở bên phải nhất sẽ được
nhận giá trị mặc định của chúng
– Các giá trị mặc định
• Có thể là hằng, biến toàn cục, hoặc các lời gọi hàm
• Đặt các giá trị mặc định tại function prototype
int myFunction( int x = 1, int y = 2, int z = 3 );
– myFunction(3)
• x = 3, y và z nhận giá trị mặc định (bên phải nhất)
– myFunction(3, 5)
• x = 3, y = 5 còn z nhận giá trị mặc định
©2004 Trần Minh Châu.
FOTECH. VNU.
73
fig03_23.cpp
(1 of 2)
1 // Fig. 3.23: fig03_23.cpp
2 // Using default arguments.
3 #include
4
5 using std::cout;
6 using std::endl;
7
8 // function prototype that specifies default arguments
9 int boxVolume( int length = 1, int width = 1, int height = 1 );
10
11 int main()
12 {
13 // no arguments--use default values for all dimensions
14 cout << "The default box volume is: " << boxVolume();
15
16 // specify length; default width and height
17 cout << "\n\nThe volume of a box with length 10,\n"
18 << "width 1 and height 1 is: " << boxVolume( 10 );
19
20 // specify length and width; default height
21 cout << "\n\nThe volume of a box with length 10,\n"
22 << "width 5 and height 1 is: " << boxVolume( 10, 5 );
23
Các giá trị mặc định được đặt
trong function prototype.
Các lời gọi hàm thiếu một
số đối số – Các đối số bên
phải nhất nhận giá trị mặc
định.
©2004 Trần Minh Châu.
FOTECH. VNU.
74
fig03_23.cpp
(2 of 2)
fig03_23.cpp
output (1 of 1)
24 // specify all arguments
25 cout << "\n\nThe volume of a box with length 10,\n"
26 << "width 5 and height 2 is: " << boxVolume( 10, 5, 2 )
27 << endl;
28
29 return 0; // indicates successful termination
30
31 } // end main
32
33 // function boxVolume calculates the volume of a box
34 int boxVolume( int length, int width, int height )
35 {
36 return length * width * height;
37
38 } // end function boxVolume
The default box volume is: 1
The volume of a box with length 10,
width 1 and height 1 is: 10
The volume of a box with length 10,
width 5 and height 1 is: 50
The volume of a box with length 10,
width 5 and height 2 is: 100
© 2004 Trần Minh Châu. FOTECH. VNU
75
Chương 3.
3.19 Toán tử phạm vi đơn
• Toán tử phạm vi đơn (::)
Unitary Scope Resolution Operator
– Dùng để truy nhập biến toàn cục nếu biến địa phương có
cùng tên
– Không cần thiết nếu các tên biến khác nhau
– Cách dùng ::tên_biến
y = ::x + 3;
– Nên tránh dùng các tên giống nhau cho các biến địa phương
và toàn cục
©2004 Trần Minh Châu.
FOTECH. VNU.
76
fig03_24.cpp
(1 of 2)
1 // Fig. 3.24: fig03_24.cpp
2 // Using the unary scope resolution operator.
3 #include
4
5 using std::cout;
6 using std::endl;
7
8 #include
9
10 using std::setprecision;
11
12 // define global constant PI
13 const double PI = 3.14159265358979;
14
15 int main()
16 {
17 // define local constant PI
18 const float PI = static_cast( ::PI );
19
20 // display values of local and global PI constants
21 cout << setprecision( 20 )
22 << " Local float value of PI = " << PI
23 << "\nGlobal double value of PI = " << ::PI << endl;
24
25 return 0; // indicates successful termination
Truy nhập PI toàn cục với
::PI.
Chuyển đổi PI toàn cục
thành một giá trị float
cho PI địa phương. Ví dụ
này cho thấy sự khác nhau
giữa float và double.
©2004 Trần Minh Châu.
FOTECH. VNU.
77
fig03_24.cpp
(2 of 2)
fig03_24.cpp
output (1 of 1)
26
27 } // end main
Borland C++ command-line compiler output:
Local float value of PI = 3.141592741012573242
Global double value of PI = 3.141592653589790007
Microsoft Visual C++ compiler output:
Local float value of PI = 3.1415927410125732
Global double value of PI = 3.14159265358979
© 2004 Trần Minh Châu. FOTECH. VNU
78
Chương 3.
3.20 Chồng hàm
• Chồng hàm - Function overloading
– Các hàm có cùng tên nhưng khác nhau về tham số
– Nên thực hiện các nhiệm vụ tương tự
• ví dụ, hàm tính bình phương cho int và hàm tính bình
phương cho float
int square( int x) {return x * x;}
float square(float x) { return x * x; }
• Các hàm chồng phân biệt nhau bởi chữ ký
– Dựa vào tên và kiểu tham số (xét cả thứ tự)
– Trình biên dịch đảm bảo gọi đúng hàm chồng được yêu cầu
©2004 Trần Minh Châu.
FOTECH. VNU.
79
fig03_25.cpp
(1 of 2)
1 // Fig. 3.25: fig03_25.cpp
2 // Using overloaded functions.
3 #include
4
5 using std::cout;
6 using std::endl;
7
8 // function square for int values
9 int square( int x )
10 {
11 cout << "Called square with int argument: " << x << endl;
12 return x * x;
13
14 } // end int version of function square
15
16 // function square for double values
17 double square( double y )
18 {
19 cout << "Called square with double argument: " << y << endl;
20 return y * y;
21
22 } // end double version of function square
23
Các hàm chồng có cùng tên
nhưng có tham số khác nhau
©2004 Trần Minh Châu.
FOTECH. VNU.
80
fig03_25.cpp
(2 of 2)
fig03_25.cpp
output (1 of 1)
24 int main()
25 {
26 int intResult = square( 7 ); // calls int version
27 double doubleResult = square( 7.5 ); // calls double version
28
29 cout << "\nThe square of integer 7 is " << intResult
30 << "\nThe square of double 7.5 is " << doubleResult
31 << endl;
32
33 return 0; // indicates successful termination
34
35 } // end main
Called square with int argument: 7
Called square with double argument: 7.5
The square of integer 7 is 49
The square of double 7.5 is 56.25
Tùy theo đối số được truyền vào (int
hoặc double) để gọi hàm thích hợp.
© 2004 Trần Minh Châu. FOTECH. VNU
81
Chương 3.
3.21 Khuôn mẫu hàm - Function Template
• Cách ngắn gọn để tạo các hàm chồng
– Sinh các hàm riêng biệt cho các kiểu dữ liệu khác nhau
• Cú pháp
– Bắt đầu bằng từ khóa template
– các tham số kiểu hình thức trong cặp ngoặc
• typename hoặc class (đồng nghĩa) đặt trước mỗi tham số
kiểu
• là đại diện cho các kiểu cài sẵn (ví dụ int) hoặc các kiểu dữ
liệu người dùng
• chỉ ra các kiểu dữ liệu cho đối số hàm, giá trị trả về, biến địa
phương
– Hàm được định nghĩa như bình thường, ngoại trừ việc sử
dụng các kiểu hình thức
© 2004 Trần Minh Châu. FOTECH. VNU
82
Chương 3.
3.21 Khuôn mẫu hàm
• Ví dụ
template // or template
T square( T value1 )
{
return value1 * value1;
}
– T là một kiểu hình thức, được dùng làm tham số kiểu
• hàm trên trả về giá trị thuộc cùng kiểu với tham số
– Tại lời gọi hàm, T được thay bằng kiểu dữ liệu thực
• Nếu là int, mọi T trở thành int
int x;
int y = square(x);
©2004 Trần Minh Châu.
FOTECH. VNU.
83
fig03_27.cpp
(1 of 3)
1 // Fig. 3.27: fig03_27.cpp
2 // Using a function template.
3 #include
4
5 using std::cout;
6 using std::cin;
7 using std::endl;
8
9 // definition of function template maximum
10 template // or template
11 T maximum( T value1, T value2, T value3 )
12 {
13 T max = value1;
14
15 if ( value2 > max )
16 max = value2;
17
18 if ( value3 > max )
19 max = value3;
20
21 return max;
22
23 } // end function template maximum
24
Tham số kiểu hình thức T là đại
diện của kiểu dữ liệu được kiểm
tra trong hàm maximum.
maximum mong đợi mọi
tham số đều thuộc cùng một
kiểu dữ liệu.
©2004 Trần Minh Châu.
FOTECH. VNU.
84
fig03_27.cpp
(2 of 3)
25 int main()
26 {
27 // demonstrate maximum with int values
28 int int1, int2, int3;
29
30 cout << "Input three integer values: ";
31 cin >> int1 >> int2 >> int3;
32
33 // invoke int version of maximum
34 cout << "The maximum integer value is: "
35 << maximum( int1, int2, int3 );
36
37 // demonstrate maximum with double values
38 double double1, double2, double3;
39
40 cout << "\n\nInput three double values: ";
41 cin >> double1 >> double2 >> double3;
42
43 // invoke double version of maximum
44 cout << "The maximum double value is: "
45 << maximum( double1, double2, double3 );
46
maximum được gọi với nhiều
kiểu dữ liệu.
©2004 Trần Minh Châu.
FOTECH. VNU.
85
fig03_27.cpp
(3 of 3)
fig03_27.cpp
output (1 of 1)
47 // demonstrate maximum with char values
48 char char1, char2, char3;
49
50 cout << "\n\nInput three characters: ";
51 cin >> char1 >> char2 >> char3;
52
53 // invoke char version of maximum
54 cout << "The maximum character value is: "
55 << maximum( char1, char2, char3 )
56 << endl;
57
58 return 0; // indicates successful termination
59
60 } // end main
Input three integer values: 1 2 3
The maximum integer value is: 3
Input three double values: 3.3 2.2 1.1
The maximum double value is: 3.3
Input three characters: A C B
The maximum character value is: C
File đính kèm:
Ngôn ngữ lập trình C++ - Chương 3 Hàm.pdf

