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