0% found this document useful (0 votes)
16 views

Ch05_Functions for All Subtasks

OOP_Ch05_Functions for All Subtasks

Uploaded by

daniel20030411
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
16 views

Ch05_Functions for All Subtasks

OOP_Ch05_Functions for All Subtasks

Uploaded by

daniel20030411
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 74

物件導向程式設計

Object-Oriented Programming
Chapter 5
Functions for All Subtasks

康立威
國立台灣師範大學電機工程系
[email protected]
分機: 3563

Copyright © 2018 Pearson Education, Ltd. All rights reserved.


Chapter 5
Functions for All Subtasks

Copyright © 2018 Pearson Education, Ltd. All rights reserved.


Overview

5.1 void Functions

5.2 Call-By-Reference Parameters

5.3 Using Procedural Abstraction

5.4 Testing and Debugging

5.5 General Debugging Techniques

Copyright © 2018 Pearson Education, Ltd. All rights reserved. Slide 5- 4


5.1
void Functions

Copyright © 2018 Pearson Education, Ltd. All rights reserved.


void-Functions
◼ In top-down design, a subtask might produce
◼ No value (just input or output for example)

◼ One value

◼ More than one value

◼ We have seen how to implement functions that


return one value
◼ A void-function implements a subtask that
returns no value or more than one value

Copyright © 2018 Pearson Education, Ltd. All rights reserved. Slide 5- 6


void-Function Definition
◼ Two main differences between void-function
definitions and the definitions of functions
that return one value
◼ Keyword void replaces the type of the value returned

◼ void means that no value is returned by the function


◼The return statement does not include and expression
◼ Example:
void showResults(double f_degrees, double c_degrees)
{
using namespace std;
cout << f_degrees
<< “ degrees Fahrenheit is euivalent to “ << endl
<< c_degrees << “ degrees Celsius.” << endl;
return;
}
Display 5.1
Copyright © 2018 Pearson Education, Ltd. All rights reserved. Slide 5- 7
Using a void-Function

◼ void-function calls are executable statements


◼ They do not need to be part of another statement

◼ They end with a semi-colon

◼ Example:
showResults(32.5, 0.3);

NOT: cout << showResults(32.5, 0.3);

Copyright © 2018 Pearson Education, Ltd. All rights reserved. Slide 5- 8


void-Function Calls
◼ Mechanism is nearly the same as the function
calls we have seen
◼ Argument values are substituted for the formal

parameters
◼ It is fairly common to have no parameters in
void-functions
◼ In this case there will be no arguments in the function call
◼ Statements in function body are executed
◼ Optional return statement ends the function
◼ Return statement does not include a value to return
◼ Return statement is implicit if it is not included

Copyright © 2018 Pearson Education, Ltd. All rights reserved. Slide 5- 9


Example:
Converting Temperatures
◼ The functions just developed can be used in a
program to convert Fahrenheit temperatures to
Celcius using the formula

C = (5/9) (F – 32)

◼ Do you see the integer division problem?

Display 5.2 (1)


Display 5.2 (2)
Copyright © 2018 Pearson Education, Ltd. All rights reserved. Slide 5- 10
void-Functions
Why Use a Return?

◼ Is a return-statement ever needed in a


void-function since no value is returned?
◼ Yes!

◼ What if a branch of an if-else statement requires


that the function ends to avoid producing more
output, or creating a mathematical error?
◼ void-function in Display 5.3, avoids division by zero
with a return statement

Display 5.3

Copyright © 2018 Pearson Education, Ltd. All rights reserved. Slide 5- 11


The Main Function
◼ The main function in a program is used like a
void function…do you have to end the program
with a return-statement?
◼ Because the main function is defined to return a

value of type int, the return is needed


◼ C++ standard says the return 0 can be omitted, but

many compilers still require it

Copyright © 2018 Pearson Education, Ltd. All rights reserved. Slide 5- 12


Section 5.1 Conclusion
◼ Can you
◼ Describe the differences between void-
functions and functions that return one value?
◼ Tell what happens if you forget the return-
statementin a void-function?
◼ Distinguish between functions that are used as
expressions and those used as statements?

Copyright © 2018 Pearson Education, Ltd. All rights reserved. Slide 5- 13


5.2
Call-By-Reference Parameters

Copyright © 2018 Pearson Education, Ltd. All rights reserved.


Call-by-Reference Parameters
◼ Call-by-value is not adequate when we need
a sub-task to obtain input values
◼ Call-by-value means that the formal parameters
receive the values of the arguments
◼ To obtain input values, we need to change the
variables that are arguments to the function
◼ Recall that we have changed the values of
formal parameters in a function body, but we have not
changed the arguments found in the function call
◼ Call-by-reference parameters allow us to change
the variable used in the function call
◼ Arguments for call-by-reference parameters must be
variables, not numbers

Copyright © 2018 Pearson Education, Ltd. All rights reserved. Slide 5- 15


Call-by-Reference Example
◼ void getInput(double& fVariable)
{
using namespace std;
cout << “ Convert a Fahrenheit temperature”
<< “ to Celsius.\n”
<< “ Enter a temperature in Fahrenheit: “;
cin >> fVariable;
}
◼ ‘&’ symbol (ampersand) identifies fVariable as a
call-by-reference parameter
◼ Used in both declaration and definition!

Display 5.4

Copyright © 2018 Pearson Education, Ltd. All rights reserved. Slide 5- 16


Call-By-Reference Details
◼ Call-by-reference works almost as if the
argument variable is substituted for the formal
parameter, not the argument’s value
◼ In reality, the memory location of the argument
variable is given to the formal parameter
◼ Whatever is done to a formal parameter in the

function body, is actually done to the value at the


memory location of the argument variable

Display 5.5 (1)


Display 5.5 (2)
Copyright © 2018 Pearson Education, Ltd. All rights reserved. Slide 5- 17
Call Comparisons
Call By Reference vs Value
◼ Call-by-reference Call-by-value

◼ The function call: ◼ The function call:


f(age); Memory f(age);
Name Location Contents

age 1001 34
initial 1002 A
hours 1003 23.5
1004

void f(int& ref_par); void f(int var_par);


Copyright © 2018 Pearson Education, Ltd. All rights reserved. Slide 5- 18
Example: swapValues
◼ void swap(int& variable1, int& variable2)
{
int temp = variable1;
variable1 = variable2;
variable2 = temp;
}
◼ If called with swap(firstNum, secondNum);
◼ firstNum is substituted for variable1 in the parameter list

◼ secondNum is substituted for variable2 in the parameter list

◼ temp is assigned the value of variable1 (firstNum) since the


next line will loose the value in firstNum
◼ variable1 (firstNum) is assigned the value in variable2
(secondNum)
◼ variable2 (secondNum) is assigned the original value of
variable1 (firstNum) which was stored in temp

Copyright © 2018 Pearson Education, Ltd. All rights reserved. Slide 5- 19


Mixed Parameter Lists
◼ Call-by-value and call-by-reference parameters
can be mixed in the same function

◼ Example:
void goodStuff(int& par1, int par2, double& par3);
◼ par1 and par3 are call-by-reference formal parameters

◼ Changes in par1 and par3 change the argument variable


◼ par2 is a call-by-value formal parameter
◼ Changes in par2 do not change the argument variable

Copyright © 2018 Pearson Education, Ltd. All rights reserved. Slide 5- 20


Choosing Parameter Types
◼ How do you decide whether a call-by-reference
or call-by-value formal parameter is needed?
◼ Does the function need to change the value of the

variable used as an argument?


◼ Yes? Use a call-by-reference formal parameter
◼ No? Use a call-by-value formal parameter

Display 5.6

Copyright © 2018 Pearson Education, Ltd. All rights reserved. Slide 5- 21


Inadvertent Local Variables
◼ If a function is to change the value of a variable
the corresponding formal parameter must be a
call-by-reference parameter with an ampersand
(&) attached
◼ Forgetting the ampersand (&) creates a
call-by-value parameter
◼ The value of the variable will not be changed

◼ The formal parameter is a local variable that has no

effect outside the function


◼ Hard error to find…it looks right!

Display 5.7

Copyright © 2018 Pearson Education, Ltd. All rights reserved. Slide 5- 22


Section 5.2 Conclusion
◼ Can you
◼ Write a void-function definition for a function called

zeroBoth that has two reference parameters, both


of which are variables of type int, and sets the values
of both variables to 0.
◼ Write a function that returns a value and has a

call-by-reference parameter?
◼ Write a function with both call-by-value and

call-by-reference parameters

Copyright © 2018 Pearson Education, Ltd. All rights reserved. Slide 5- 23


5.3
Using Procedural Abstraction

Copyright © 2018 Pearson Education, Ltd. All rights reserved.


Using Procedural Abstraction

◼ Functions should be designed so they can be


used as black boxes
◼ To use a function, the declaration and comment
should be sufficient
◼ Programmer should not need to know the
details of the function to use it

Copyright © 2018 Pearson Education, Ltd. All rights reserved. Slide 5- 25


Functions Calling Functions
◼ A function body may contain a call to another
function
◼ The called function declaration must still appear
before it is called
◼ Functions cannot be defined in the body of another function
◼ Example: void order(int& n1, int& n2)
{
if (n1 > n2)
swapValues(n1, n2);
}
◼ swapValues called if n1 and n2 Display 5.8 (1)
are not in ascending order
◼ After the call to order, n1 and Display 5.8 (2)
n2 are in ascending order
Copyright © 2018 Pearson Education, Ltd. All rights reserved. Slide 5- 26
Pre and Postconditions
◼ Precondition
◼ States what is assumed to be true when the function
is called
◼ Function should not be used unless the precondition holds
◼ Postcondition
◼ Describes the effect of the function call

◼ Tells what will be true after the function is executed


(when the precondition holds)
◼ If the function returns a value, that value is described

◼ Changes to call-by-reference parameters are


described

Copyright © 2018 Pearson Education, Ltd. All rights reserved. Slide 5- 27


swapValues revisited
◼ Using preconditions and postconditions the
declaration of swapValues becomes:

void swapValues(int& n1, int& n2);


//Precondition: variable1 and variable 2 have
// been given values
// Postcondition: The values of variable1 and
// variable2 have been
// interchanged

Copyright © 2018 Pearson Education, Ltd. All rights reserved. Slide 5- 28


Function celsius
◼ Preconditions and postconditions make the
declaration for celsius:

double celsius(double farenheit);


//Precondition: fahrenheit is a temperature
// expressed in degrees Fahrenheit
//Postcondition: Returns the equivalent temperature
// expressed in degrees Celsius

Copyright © 2018 Pearson Education, Ltd. All rights reserved. Slide 5- 29


Why use preconditions
and postconditions?

◼ Preconditions and postconditions


◼ should be the first step in designing a function

◼ specify what a function should do

◼ Always specify what a function should do before


designing how the function will do it
◼ Minimize design errors
◼ Minimize time wasted writing code that doesn’t
match the task at hand

Copyright © 2018 Pearson Education, Ltd. All rights reserved. Slide 5- 30


Case Study
Supermarket Pricing
◼ Problem definition
◼ Determine retail price of an item given suitable input

◼ 5% markup if item should sell in a week

◼ 10% markup if item expected to take more than a


week
◼ 5% for up to 7 days, changes to 10% at 8 days
◼ Input
◼ The wholesale price and the estimate of days until item sells
◼ Output
◼ The retail price of the item

Copyright © 2018 Pearson Education, Ltd. All rights reserved. Slide 5- 31


Supermarket Pricing:
Problem Analysis
◼ Three main subtasks
◼ Input the data

◼ Compute the retail price of the item

◼ Output the results

◼ Each task can be implemented with a function


◼ Notice the use of call-by-value and
call-by-reference parameters in the following
function declarations

Copyright © 2018 Pearson Education, Ltd. All rights reserved. Slide 5- 32


Supermarket Pricing:
Function getInput
◼ void getInput(double& cost, int& turnover);
//Precondition: User is ready to enter values
// correctly.
//Postcondition: The value of cost has been set to
// the wholesale cost of one item.
// The value of turnover has been
// set to the expected number of
// days until the item is sold.

Copyright © 2018 Pearson Education, Ltd. All rights reserved. Slide 5- 33


Supermarket Pricing:
Function price
◼ double price(double cost, int turnover);
//Precondition: cost is the wholesale cost of one
// item. turnover is the expected
// number of days until the item is
// sold.
//Postcondition: returns the retail price of the item

Copyright © 2018 Pearson Education, Ltd. All rights reserved. Slide 5- 34


Supermarket Pricing:
Function giveOutput
◼ void giveOutput(double cost, int turnover, double price);
//Precondition: cost is the wholesale cost of one item;
// turnover is the expected time until sale
// of the item; price is the retail price of
// the item.
//Postcondition: The values of cost, turnover, and price
// been written to the screen.

Copyright © 2018 Pearson Education, Ltd. All rights reserved. Slide 5- 35


Supermarket Pricing:
The main function
◼ With the functions declared, we can write the
main function:

int main()
{
double wholesaleCost, retailPrice;
int shelftime;

getInput(wholesaleCost, shelftime);
retailPrice = price(wholesaleCost, shelftime);
giveOutput(wholesaleCost, shelftime, retailPrice);
return 0;
}

Copyright © 2018 Pearson Education, Ltd. All rights reserved. Slide 5- 36


Supermarket Pricing:
Algorithm Design -- price

◼ Implementations of getInput and giveOutput


are straightforward, so we concentrate on
the price function
◼ pseudocode for the price function
◼ If turnover <= 7 days then

return (cost + 5% of cost);


else
return (cost + 10% of cost);

Copyright © 2018 Pearson Education, Ltd. All rights reserved. Slide 5- 37


Supermarket Pricing:
Constants for The price Function

◼ The numeric values in the pseudocode will be


represented by constants
◼ Const double LOW_MARKUP = 0.05; // 5%

◼ Const double HIGH_MARKUP = 0.10; // 10%

◼ Const int THRESHOLD = 7; // At 8 days use

//HIGH_MARKUP

Copyright © 2018 Pearson Education, Ltd. All rights reserved. Slide 5- 38


Supermarket Pricing:
Coding The price Function
◼ The body of the price function
◼ {
if (turnover <= THRESHOLD)
return ( cost + (LOW_MARKUP * cost) ) ;
else
return ( cost + ( HIGH_MARKUP * cost) ) ;
}
◼ See the complete program in Display 5.9 (1)
Display 5.9 (2)
Display 5.9 (3)
Copyright © 2018 Pearson Education, Ltd. All rights reserved. Slide 5- 39
Supermarket Pricing :
Program Testing

◼ Testing strategies
◼ Use data that tests both the high and low markup

cases
◼ Test boundary conditions, where the program is

expected
to change behavior or make a choice
◼ In function price, 7 days is a boundary condition
◼ Test for exactly 7 days as well as one day more and one day
less

Copyright © 2018 Pearson Education, Ltd. All rights reserved. Slide 5- 40


Section 5.3 Conclusion

◼ Can you
◼ Define a function in the body of another

function?

◼ Call one function from the body of another


function?

◼ Give preconditions and postconditions for the


predefined function sqrt?

Copyright © 2018 Pearson Education, Ltd. All rights reserved. Slide 5- 41


5.4
Testing and Debugging

Copyright © 2018 Pearson Education, Ltd. All rights reserved.


Testing and Debugging Functions
◼ Each function should be tested as a separate unit
◼ Testing individual functions facilitates finding
mistakes
◼ Driver programs allow testing of individual
functions
◼ Once a function is tested, it can be used in the
driver program to test other functions
◼ Function getInput is tested in the driver program
of and
Display 5.10 (1) Display 5.10 (2)

Copyright © 2018 Pearson Education, Ltd. All rights reserved. Slide 5- 43


Stubs
◼ When a function being tested calls other functions
that are not yet tested, use a stub
◼ A stub is a simplified version of a function
◼ Stubs are usually provide values for testing rather
than perform the intended calculation
◼ Stubs should be so simple that you have confidence
they will perform correctly
◼ Function price is used as a stub to test the rest of
the supermarket pricing program in
and
Display 5.11 (1) Display 5.11 (2)

Copyright © 2018 Pearson Education, Ltd. All rights reserved. Slide 5- 44


Rule for Testing Functions

◼ Fundamental Rule for Testing Functions


◼ Test every function in a program in which

every other function in that program has


already been fully tested and debugged.

Copyright © 2018 Pearson Education, Ltd. All rights reserved. Slide 5- 45


Section 5.4 Conclusion
◼ Can you
◼ Describe the fundamental rule for testing functions?

◼ Describe a driver program?

◼ Write a driver program to test a function?

◼ Describe and use a stub?

◼ Write a stub?

Copyright © 2018 Pearson Education, Ltd. All rights reserved. Slide 5- 46


5.5
General Debugging
Techniques

Copyright © 2018 Pearson Education, Ltd. All rights reserved.


General Debugging Techniques
◼ Stubs, drivers, test cases as described in the previous
section
◼ Keep an open mind
◼ Don’t assume the bug is in a particular location

◼ Don’t randomly change code without understanding what


you are doing until the program works
◼ This strategy may work for the first few small programs

you write but is doomed to failure for any programs of


moderate complexity
◼ Show the program to someone else

Copyright © 2018 Pearson Education, Ltd. All rights reserved. Slide 5- 48


General Debugging Techniques

◼ Check for common errors, e.g.


◼ Local vs. Reference Parameter

◼ = instead of ==

◼ Localize the error


◼ This temperature conversion program has a

bug Display 5.12

◼ Narrow down bug using cout statements


Display 5.13
Copyright © 2018 Pearson Education, Ltd. All rights reserved. Slide 1- 49
General Debugging Techniques
◼ Use a debugger
◼ Tool typically integrated with a development

environment that allows you to stop and step through a


program line-by-line while inspecting variables
◼ The assert macro
◼ Can be used to test pre or post conditions

#include <cassert>
assert(boolean expression)
◼ If the boolean is false then the program will abort

Copyright © 2018 Pearson Education, Ltd. All rights reserved. Slide 5- 50


Assert Example
◼ Denominator should not be zero in Newton’s Method

Copyright © 2018 Pearson Education, Ltd. All rights reserved. Slide 5- 51


Section 5.5 Conclusion
◼ Can you
◼ Recognize common errors?

◼ Use the assert macro?

◼ Debug a program using cout statements to localize the


error?

◼ Debug a program using a debugger?

Copyright © 2018 Pearson Education, Ltd. All rights reserved. Slide 5- 52


Chapter 5 -- End

Copyright © 2018 Pearson Education, Ltd. All rights reserved. Slide 5- 53


Display 5.1 Back Next

Copyright © 2018 Pearson Education, Ltd. All rights reserved. Slide 5- 54


Display 5.2 (1/2)
Back Next

Copyright © 2018 Pearson Education, Ltd. All rights reserved. Slide 5- 55


Display 5.2
(2/2) Back Next

Copyright © 2018 Pearson Education, Ltd. All rights reserved. Slide 5- 56


Display 5.3 Back Next

Copyright © 2018 Pearson Education, Ltd. All rights reserved. Slide 5- 57


Display 5.4
Back Next

Copyright © 2018 Pearson Education, Ltd. All rights reserved. Slide 5- 58


Display 5.5
(1/2) Back Next

Copyright © 2018 Pearson Education, Ltd. All rights reserved. Slide 5- 59


Display 5.5
(2/2) Back Next

Copyright © 2018 Pearson Education, Ltd. All rights reserved. Slide 5- 60


Display 5.6
Back Next

Copyright © 2018 Pearson Education, Ltd. All rights reserved. Slide 5- 61


Display 5.7
Back Next

Copyright © 2018 Pearson Education, Ltd. All rights reserved. Slide 5- 62


Display 5.8 (1/2)
Back Next

Copyright © 2018 Pearson Education, Ltd. All rights reserved. Slide 5- 63


Display 5.8
(2/2) Back Next

Copyright © 2018 Pearson Education, Ltd. All rights reserved. Slide 5- 64


Display 5.9 (1/3)
Back Next

Copyright © 2018 Pearson Education, Ltd. All rights reserved. Slide 5- 65


Display 5.9 (2/3)
Back Next

Copyright © 2018 Pearson Education, Ltd. All rights reserved. Slide 5- 66


Display 5.9
(3/3) Back Next

Copyright © 2018 Pearson Education, Ltd. All rights reserved. Slide 5- 67


Display 5.10 (1/2)
Back Next

Copyright © 2018 Pearson Education, Ltd. All rights reserved. Slide 5- 68


Display 5.10
(2/2) Back Next

Copyright © 2018 Pearson Education, Ltd. All rights reserved. Slide 5- 69


Display 5.11 (1/2)
Back Next

Copyright © 2018 Pearson Education, Ltd. All rights reserved. Slide 5- 70


Display 5.11 (2/2)
Back Next

Copyright © 2018 Pearson Education, Ltd. All rights reserved. Slide 5- 71


Display 5.12 Back Next

Copyright © 2018 Pearson Education, Ltd. All rights reserved. Slide 5- 72


Display 5.13 (1 of 2) Back Next

Copyright © 2018 Pearson Education, Ltd. All rights reserved. Slide 5- 73


Display 5.13 (2 of 2) Back Next

Copyright © 2018 Pearson Education, Ltd. All rights reserved. Slide 5- 74

You might also like