Absolute C++ (4th Edition) part 13 ppsx

10 478 1
Absolute C++ (4th Edition) part 13 ppsx

Đang tải... (xem toàn văn)

Thông tin tài liệu

122 Function Basics D i sp l ay 3.9 A Global Named Constant ( part 1 of 2 ) 1 //Computes the area of a circle and the volume of a sphere. 2 //Uses the same radius for both calculations. 3 #include <iostream> 4 #include <cmath> 5 using namespace std; 6 const double PI = 3.14159; 7 double area(double radius); 8 //Returns the area of a circle with the specified radius. 9 double volume(double radius); 10 //Returns the volume of a sphere with the specified radius. 11 int main( ) 12 { 13 double radiusOfBoth, areaOfCircle, volumeOfSphere; 14 cout << "Enter a radius to use for both a circle\n" 15 << "and a sphere (in inches): "; 16 cin >> radiusOfBoth; 17 areaOfCircle = area(radiusOfBoth); 18 volumeOfSphere = volume(radiusOfBoth); 19 cout << "Radius = " << radiusOfBoth << " inches\n" 20 << "Area of circle = " << areaOfCircle 21 << " square inches\n" 22 << "Volume of sphere = " << volumeOfSphere 23 << " cubic inches\n"; 24 return 0; 25 } 26 27 double area(double radius) 28 { 29 return (PI * pow(radius, 2)); 30 } 31 double volume(double radius) 32 { 33 return ((4.0/3.0) * PI * pow(radius, 3)); 34 } Scope Rules 123 Self-Test Exercises Placing all named constant declarations at the start of your program can aid read- ability even if the named constant is used by only one function. If the named constant might need to be changed in a future version of your program, it will be easier to find if it is at the beginning of your program. For example, placing the constant declaration for the sales tax rate at the beginning of an accounting program will make it easy to revise the program should the tax rate change. It is possible to declare ordinary variables, without the const modifier, as global variables, which are accessible to all function definitions in the file. This is done simi- lar to the way it is done for global named constants, except that the modifier const is not used in the variable declaration. However, there is seldom any need to use such glo- bal variables. Moreover, global variables can make a program harder to understand and maintain, so we urge you to avoid using them. 20. If you use a variable in a function definition, where should you declare the variable? In the function definition? In the main function? Any place that is convenient? 21. Suppose a function named function1 has a variable named sam declared within the defi- nition of function1, and a function named function2 also has a variable named sam declared within the definition of function2. Will the program compile (assuming every- thing else is correct)? If the program will compile, will it run (assuming that everything else is correct)? If it runs, will it generate an error message when run (assuming everything else is correct)? If it runs and does not produce an error message when run, will it give the correct output (assuming everything else is correct)? 22. What is the purpose of the comment that accompanies a function declaration? 23. What is the principle of procedural abstraction as applied to function definitions? 24. What does it mean when we say the programmer who uses a function should be able to treat the function like a black box? (This question is very closely related to the previous question.) Display 3.9 A Global Named Constant (part 2 of 2) S AMPLE D IALOGUE Enter a radius to use for both a circle and a sphere (in inches): 2 Radius = 2 inches Area of circle = 12.5664 square inches Volume of sphere = 33.5103 cubic inches global variable 124 Function Basics ■ BLOCKS A variable declared inside a compound statement (that is, inside a pair of braces) is local to the compound statement. The name of the variable can be used for something else, such as the name of a different variable, outside the compound statement. A compound statement with declarations is usually called a block. Actually, block and compound statement are two terms for the same thing. However, when we focus on variables declared within a compound statement, we normally use the term block rather than compound statement and we say that the variables declared within the block are local to the block. If a variable is declared in a block, then the definition applies from the location of the declaration to the end of the block. This is usually expressed by saying that the scope of the declaration is from the location of the declaration to the end of the block. So if a variable is declared at the start of a block, its scope is the entire block. If the variable is declared part way through the block, the declaration does not take effect until the pro- gram reaches the location of the declaration (see Self-Test Exercise 25). Notice that the body of a function definition is a block. Thus, a variable that is local to a function is the same thing as a variable that is local to the body of the function def- inition (which is a block). ■ NESTED SCOPES Suppose you have one block nested inside another block, and suppose that one identi- fier is declared as a variable in each of these two blocks. These are two different vari- ables with the same name. One variable exists only within the inner block and cannot be accessed outside that inner block. The other variable exists only in the outer block and cannot be accessed in the inner block. The two variables are distinct, so changes made to one of these variables will have no effect on the other of these two variables. B LOCKS A block is some C++ code enclosed in braces. The variables declared in a block are local to the block, and so the variable names can be used outside the block for something else (such as being reused as the names for different variables). block Scope Rules 125 Tip U SE F UNCTION C ALLS IN B RANCHING AND L OOP S TATEMENTS The switch statement and the if-else statement allow you to place several different state- ments in each branch. However, doing so can make the switch statement or if-else statement difficult to read. Rather than placing a compound statement in a branching statement, it is usu- ally preferable to convert the compound statement to a function definition and place a function call in the branch. Similarly, if a loop body is large, it is preferable to convert the compound statement to a function definition and make the loop body a function call. ■ VARIABLES DECLARED IN A for LOOP A variable may be declared in the heading of a for statement so that the variable is both declared and initialized at the start of the for statement. For example, for (int n = 1; n <= 10; n++) sum = sum + n; The ANSI/ISO C++ standard requires that a C++ compiler that claims compliance with the standard treat any declaration in a for loop initializer as if it were local to the body of the loop. Earlier C++ compilers did not do this. You should determine how your compiler treats variables declared in a for loop initializer. If portability is critical to your application, you should not write code that depends on this behavior. Eventu- ally, all widely used C++ compilers will likely comply with this rule, but compilers pres- ently available may or may not comply. S COPE R ULE FOR N ESTED B LOCKS If an identifier is declared as a variable in each of two blocks, one within the other, then these are two different variables with the same name. One variable exists only within the inner block and cannot be accessed outside of the inner block. The other variable exists only in the outer block and cannot be accessed in the inner block. The two variables are distinct, so changes made to one of these variables will have no effect on the other of these two variables. 126 Function Basics Self-Test Exercises 25. Though we urge you not to program using this style, we are providing an exercise that uses nested blocks to help you understand the scope rules. State the output that this code frag- ment would produce if embedded in an otherwise complete, correct program. { int x = 1; cout << x << endl; { cout << x << endl; int x = 2; cout << x << endl; { cout << x << endl; int x = 3; cout << x << endl; } cout << x << endl; } cout << x << endl; } ■ There are two kinds of functions in C++: functions that return a value and void functions. ■ A function should be defined so that it can be used as a black box. The programmer who uses the function should not need to know any details about how the function is coded. All the programmer should need to know is the function declaration and the accompanying comment that describes the value returned. This rule is some- times called the principle of procedural abstraction. ■ A good way to write a function declaration comment is to use a precondition and a postcondition. The precondition states what is assumed to be true when the func- tion is called. The postcondition describes the effect of the function call; that is, the postcondition tells what will be true after the function is executed in a situation in which the precondition holds. ■ A variable that is declared in a function definition is said to be local to the function. ■ A formal parameter is a kind of placeholder that is filled in with a function argu- ment when the function is called. The details on this “filling in” process are covered in Chapter 4. Chapter Summary Answers to Self-Test Exercises 127 ANSWERS TO SELF-TEST EXERCISES 1. 4.0 4.0 8.0 8.0 8.0 1.21 3 3 0 3.0 3.5 3.5 6.0 6.0 5.0 5.0 4.5 4.5 3 3.0 3.0 2. a. sqrt(x + y) b. pow(x, y + 7) c. sqrt(area + fudge) d. sqrt(time+tide)/nobody e. (-b + sqrt(b*b - 4*a*c))/(2*a) f. abs(x - y) or labs(x - y) or fabs(x - y) 3. #include <iostream> #include <cmath> using namespace std; int main( ) { int i; for (i = 1; i <= 10; i++) cout << "The square root of " << i << " is " << sqrt(i) << endl; return 0; } 4. The argument is given to the operating system. As far as your C++ program is concerned, you can use any int value as the argument. By convention, however, 1 is used for a call to exit that is caused by an error, and 0 is used in other cases. 5. (5 + (rand( ) % 6)) 6. #include <iostream> #include <cstdlib> using namespace std; int main( ) { cout << "Enter a nonnegative integer to use as the\n" << "seed for the random number generator: "; unsigned int seed; cin >> seed; srand(seed); cout << "Here are ten random probabilities:\n"; 128 Function Basics int i; for (i = 0; i < 10; i++) cout << ((RAND_MAX - rand( ))/static_cast<double>(RAND_MAX)) << endl; return 0; } 7. Wow 8. The function declaration is int sum(int n1, int n2, int n3); //Returns the sum of n1, n2, and n3. The function definition is int sum(int n1, int n2, int n3) { return (n1 + n2 + n3); } 9. The function declaration is char positiveTest(double number); //Returns ’P’ if number is positive. //Returns ’N’ if number is negative or zero. The function definition is char positiveTest(double number) { if (number > 0) return ’P’; else return ’N’; } 10. No, a function definition cannot appear inside the body of another function definition. 11. Predefined functions and user-defined functions are invoked (called) in the same way. 12. bool inOrder(int n1, int n2, int n3) { return ((n1 <= n2) && (n2 <= n3)); } 13. bool even(int n) { return ((n % 2) == 0); } Answers to Self-Test Exercises 129 14. bool isDigit(char ch) { return (’0’ <= ch) && (ch <= ’9’); } 15. Hello Goodbye One more time: Hello End of program. 16. If you omitted the return statement in the function definition for iceCreamDivision in Display 3.7, the program would compile and run. However, if you input zero for the num- ber of customers, then the program would produce a run-time error because of a division by zero. 17. #include <iostream> using namespace std; void productOut(int n1, int n2, int n3); int main( ) { int num1, num2, num3; cout << "Enter three integers: "; cin >> num1 >> num2 >> num3; productOut(num1, num2, num3); return 0; } void productOut(int n1, int n2, int n3) { cout << "The product of the three numbers " << n1 << ", " << n2 << ", and " << n3 << " is " << (n1*n2*n3) << endl; } 18. These answers are system-dependent. 19. double sqrt(double n); //Precondition: n >= 0. //Returns the square root of n. You can rewrite the second comment line as the following if you prefer, but the version above is the usual form used for a function that returns a value: //Postcondition: Returns the square root of n. 130 Function Basics 20. If you use a variable in a function definition, you should declare the variable in the body of the function definition. 21. Everything will be fine. The program will compile (assuming everything else is correct). The program will run (assuming that everything else is correct). The program will not gen- erate an error message when run (assuming everything else is correct). The program will give the correct output (assuming everything else is correct). 22. The comment explains what action the function takes, including any value returned, and gives any other information that you need to know in order to use the function. 23. The principle of procedural abstraction says that a function should be written so that it can be used like a black box. This means that the programmer who uses the function need not look at the body of the function definition to see how the function works. The function declaration and accompanying comment should be all the programmer needs in order to use the function. 24. When we say that the programmer who uses a function should be able to treat the function like a black box, we mean the programmer should not need to look at the body of the func- tion definition to see how the function works. The function declaration and accompanying comment should be all the programmer needs in order to use the function. 25. It helps to slightly change the code fragment to understand to which declaration each usage resolves. The code has three different variables named x. In the following we have renamed these three variables x1, x2, and x3. The output is given in the comments. { int x1 = 1;// output in this column cout << x1 << endl;// 1<new line> { cout << x1 << endl;// 1<new line> int x2 = 2; cout << x2 << endl;// 2<new line> { cout << x2 << endl;// 2<new line> int x3 = 3; cout << x3 << endl;// 3<new line> } cout << x2 << endl;// 2<new line> } cout << x1 << endl;// 1<new line> } PROGRAMMING PROJECTS 1. A liter is 0.264179 gallons. Write a program that will read in the number of liters of gaso- line consumed by the user’s car and the number of miles traveled by the car and will then output the number of miles per gallon the car delivered. Your program should allow the user to repeat this calculation as often as the user wishes. Define a function to compute the Programming Projects 131 number of miles per gallon. Your program should use a globally defined constant for the number of gallons per liter. 2. Write a program to gauge the rate of inflation for the past year. The program asks for the price of an item (such as a hot dog or a one-carat diamond) both one year ago and today. It estimates the inflation rate as the difference in price divided by the year-ago price. Your program should allow the user to repeat this calculation as often as the user wishes. Define a function to compute the rate of inflation. The inflation rate should be a value of type double giving the rate as a percentage, for example 5.3 for 5.3%. 3. Enhance your program from the previous exercise by having it also print out the estimated price of the item in one and in two years from the time of the calculation. The increase in cost over one year is estimated as the inflation rate times the price at the start of the year. Define a second function to determine the estimated cost of an item in a specified number of years, given the current price of the item and the inflation rate as arguments. 4. The gravitational attractive force between two bodies with masses m 1 and m 2 separated by a distance d is given by the following formula: where G is the universal gravitational constant: G = 6.673 × 10 -8 cm 3 /(g • sec 2 ) Write a function definition that takes arguments for the masses of two bodies and the dis- tance between them and returns the gravitational force between them. Since you will use the above formula, the gravitational force will be in dynes. One dyne equals a g • cm/sec 2 You should use a globally defined constant for the universal gravitational constant. Embed your function definition in a complete program that computes the gravitational force between two objects given suitable inputs. Your program should allow the user to repeat this calculation as often as the user wishes. 5. Write a program that asks for the user’s height, weight, and age, and then computes cloth- ing sizes according to the following formulas. ■ Hat size = weight in pounds divided by height in inches and all that multiplied by 2.9. ■ Jacket size (chest in inches) = height times weight divided by 288 and then adjusted by add- ing one-eighth of an inch for each 10 years over age 30. (Note that the adjustment only takes place after a full 10 years. So, there is no adjustment for ages 30 through 39, but one- eighth of an inch is added for age 40.) ■ Waist in inches = weight divided by 5.7 and then adjusted by adding one-tenth of an inch for each 2 years over age 28. (Note that the adjustment only takes place after a full 2 years. So, there is no adjustment for age 29, but one-tenth of an inch is added for age 30.) Use functions for each calculation. Your program should allow the user to repeat this calcu- lation as often as the user wishes. F Gm 1 m 2 d 2 = . ANSI/ISO C++ standard requires that a C++ compiler that claims compliance with the standard treat any declaration in a for loop initializer as if it were local to the body of the loop. Earlier C++. volume(double radius); 10 //Returns the volume of a sphere with the specified radius. 11 int main( ) 12 { 13 double radiusOfBoth, areaOfCircle, volumeOfSphere; 14 cout << "Enter a radius to use. question is very closely related to the previous question.) Display 3.9 A Global Named Constant (part 2 of 2) S AMPLE D IALOGUE Enter a radius to use for both a circle and a sphere (in inches):

Ngày đăng: 04/07/2014, 05:21

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan