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
We take content rights seriously. If you suspect this is your content, claim it here.
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
We take content rights seriously. If you suspect this is your content, claim it here.
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