1
Functions
2
Chapter 7 Topics
Writing a Program Using Functional
Decomposition
Writing a Void Function for a Task
Using Function Arguments and Parameters
correctly
Differences between Value Parameters and
Reference Parameters
Using Local Variables in a Function
Function Preconditions and Postconditions
3
Functions
every C++ program must have a
function called main
program execution always begins
with function main
any other functions are subprograms
and must be called
4
Function Call (Invocation)
One function calls another by using the
name of the called function next to ( )
enclosing an argument list.
A function call temporarily transfers
control from the calling function to the
called function.
5
FunctionName ( Argument List );
The argument list is a way for functions to
communicate with each other by passing
information.
The argument list can contain 0,1,or more
arguments,separated by commas,depending
on the function.
Function Call Syntax
6
Function Call Syntax( Cont.)
Expression,Expression…
Argument List
When a function call is executed,the arguments are
passed to the parameters according to their positions,
left to right,and control is then transferred to the first
executable statement in the function body,
When the last statement in the function has executed,
control returns to the point from which the function was
called.
7
Two Parts of Function Definition
int Cube ( int n ) heading
{
body
return n * n * n ;
}
8
What is in a heading?
int Cube ( int n )
type of value returned
name of
function
parameter list
9
What is in a prototype?
A prototype looks like a heading but must
end with a semicolon;
and its parameter list just needs to contain
the type of each parameter.
int Cube( int ); // prototype
10
The difference
between Function Definition and Function Prototype
Function Definition,A function declaration that
includes the body of the function.
Function Prototype,A function declaration that
without the body of the function.
Note that all definitions are declarations,
but not all declarations are definitions.
The rule throughout C++ is that you can declare an
item as many times as you wish,but you can define it
only once.
11
When a function is called,
temporary memory is set up ( for its value parameters
and any local variables,and also for the function?s
name if the return type is not void),
Then the flow of control passes to the first statement
in the function?s body,The called function?s body
statements are executed until one of these occurs:
return statement (with or without a return value),
or,
closing brace of function body.
Then control goes back to where the function was
called.
12
#include <iostream>
int Cube ( int ) ; // prototype
using namespace std;
void main ( )
{
int yourNumber ; arguments
int myNumber ;
yourNumber = 14 ;
myNumber = 9 ;
cout <<,My Number =,<< myNumber ;
cout <<,its cube is,<< Cube (myNumber) << endl ;
cout <<,Your Number =,<< yourNumber ;
cout <<,its cube is,<< Cube (yourNumber) << endl ;
}
13
To Compile Successfully,
before a function is called in your
program,the compiler must
previously process either the
function?s prototype,or the
function?s definition (heading and
body)
14
A C++ function can return
in its identifier at most 1 value of the
type which was specified (called the
return type) in its heading and prototype
but,a void-function cannot return any
value in its identifier
15
Write a void function
called DisplayMessage ( ) which you can call
from main ( ) to describe the pollution
index value it receives as a parameter.
Your city describes a pollution Index
less than 35 as,Pleasant”,
35 through 60 as,Unpleasant”,
and above 60 as,Health Hazard.”
16
parameter
void DisplayMessage( int index )
{
if ( index < 35 )
cout <<,Pleasant”;
else if ( index <= 60 )
cout <<,Unpleasant”;
else
cout <<,Health Hazard”;
}
17
#include <iostream>
void DisplayMessage (int); // prototype
using namespace std;
int main ( ) argument
{
int pollutionIndex;
cout <<,Enter air pollution index”;
cin >> pollutionIndex;
DisplayMessage(pollutionIndex); // call
return 0;
}
The Rest of the Program
18
The Return Statement
The main function uses the statement
return 0;
to return the value 0 (or 1 or some other value)
to its caller,the operating system.
Every value-returning function must return its
function value this way.
19
The Return Statement (Cont.)
A second form of the Return Statement,
return;
is valid only in the body block of void functions
causes control to leave the function and
immediately return to the calling block
leaving any subsequent statements
in the function body unexecuted
20
Header files contain declarations of
named constants like
const int INT_MAX = 32767;
function prototypes like
float sqrt( float );
classes like
string,ostream,istream
objects like
cin,cout
21
Program with Several Functions
Square function
Cube function
function prototypes
main function
22
Value-returning Functions
#include <iostream>
int Square ( int ) ; // prototypes
int Cube ( int ) ;
using namespace std;
int main ( )
{
cout <<,The square of 27 is,
<< Square (27) << endl; // function call
cout <<,The cube of 27 is,
<< Cube (27) << endl; // function call
return 0;
}
23
Rest of Program
int Square ( int n ) // header and body
{
return n * n;
}
int Cube ( int n ) // header and body
{
return n * n * n;
}
24
A void function call stands alone
#include <iostream>
void DisplayMessage ( int ) ; // prototype
using namespace std;
int main ( ) argument
{
DisplayMessage(15); // function call
cout <<,Good Bye,<< endl;
return 0;
}
25
A void function does NOT
return a value
parameter
void DisplayMessage ( int n )
{
cout <<,I have liked math for,
<< n <<,years” << endl ;
return ;
}
26
Parameter List
is the means used for a function
to share information with the
block containing the call
27
Classified by Location
Always appear in
a function call
within the calling
block.
Always appear in
The function heading,
or function prototype.
Arguments Parameters
28
Some C++ Texts
use the term,actual parameters” for
arguments
those books then refer to parameters
as,formal parameters”
29
Value Parameter Reference Parameter
The value (25) of the
argument is passed
to the function
when it is called.
The memory address (4000)
of the argument is passed
to the function
when it is called.
25
4000
age
In this case,
the argument can be a
variable identifier,
constant,
or expression.
In this case,the argument
must be a variable identifier,
Argument
in Calling Block
30
There is another important difference between
value and reference parameters when it comes to
matching arguments with parameters.
With value parameters,implicit type coercion
occurs if the matched items have different data
types.
In contrast,with reference parameters,the
matched items must have exactly the same data
type,
31
By default,parameters
(of simple types like int,char,float,
double) are always value parameters,
unless you do something to change
that.
To get a reference parameter you need
to place & after the type in the function
heading and prototype.
32
When to Use
Reference Parameters
reference parameters should be used
when you want your function to give
a value to,or change the value of,a
variable from the calling block
without an assignment statement
in the calling block
33
Using a Reference Parameter
is like giving someone the key
to your home
the key can be used by the
other person to change the
contents of your home!
34
MAIN PROGRAM MEMORY
25
4000
age
If you pass only a copy of 25 to a
function,it is called,pass-by-value”
and the function will not be able to
change the contents of age,It is still
25 when you return.
35
MAIN PROGRAM MEMORY
BUT,if you pass 4000,the address of
age to a function,it is called,pass-
by-reference”and the function will be
able to change the contents of age,It
could be 23 or 90 when you return.
25
4000
age
36
Pass-by-reference
is also called,,,
pass-by-address,
or
pass-by-location
37
Example of Pass-by-Reference
We want to find 2 real roots for a
quadratic equation with coefficients
a,b,c,
Write a prototype for a void function
named GetRoots( ) with 5 parameters,
The first 3 parameters are type float,
The last 2 are reference parameters of
type float.
38
void GetRoots ( float,float,float,
float&,float& );
Now write the function definition using this
information,
This function uses 3 incoming values a,b,c
from the calling block,It calculates 2 outgoing
values root1 and root2 for the calling block,
They are the 2 real roots of the quadratic
equation with coefficients a,b,c,
// prototype
39
void GetRoots( float a,float b,float c,
float& root1,float& root2)
{
float temp; // local variable
temp = b * b - 4.0 * a * c;
root1 = (-b + sqrt(temp) ) / ( 2.0 * a );
root2 = (-b - sqrt(temp) ) / ( 2.0 * a );
return;
}
Function Definition
40
#include <iostream>
#include <fstream>
#include <cmath>
void GetRoots(float,float,float,float&,float&);
using namespace std;
void main ( )
{ ifstream myInfile;
ofstream myOutfile;
float a,b,c,first,second;
int count = 0;
.....,// open files
while ( count < 5 )
{ myInfile >> a >> b >> c;
GetRoots(a,b,c,first,second); //call
myOutfile << a << b << c << first << second <<
endl;
count++ ;
} // close files
......
}
41
Pass-by-value
CALLING
BLOCK FUNCTIONCALLED
,incoming”
value of
argument
42
Pass-by-reference
CALLING
BLOCK FUNCTIONCALLED
,incoming”
original value of
argument
,outgoing”
changed value of
argument
OR,
43
Pass-by-reference(Cont.)
CALLING
BLOCK FUNCTIONCALLED
argument has no value
yet when call occurs
,outgoing”
new value of argument
“incoming”
44
Data Flow Determines
Passing-Mechanism
Incoming /* in */ Pass-by-value
Outgoing /* out */ Pass-by-reference
Incoming/outgoing Pass-by-reference
/* inout */
Parameter Data Flow Passing-Mechanism
45
Questions
Why is a function used for a task?
To cut down on the amount of detail in your main
program (encapsulation).
Can one function call another function?
Yes
Can a function even call itself?
Yes,that is called recursion,
It is very useful and requires special care in
writing.
46
More Questions
Does it make any difference what names you
use for parameters?
NO,Just use them in function body.
Do parameter names and argument names
have to be the same?
NO.
What is the advantage of that?
It seems confusing.
47
Functions are written to
specifications
the specifications state the return type,
the parameter types,
whether any parameters are,outgoing,”
and what task the function is to perform
with its parameters
the advantage is that teamwork can
occur without knowing what the
argument identifiers (names) will be
48
Write prototype and function
definition for example
a void function called GetRating( ) with one
reference parameter of type char
the function repeatedly prompts the user to
enter a character at the keyboard until one
of these has been entered,E,G,A,P to
represent Excellent,Good,Average,Poor
49
void GetRating( char& ); // prototype
void GetRating (char& letter) // definition
{ cout <<,Enter employee rating.” << endl;
cout <<,Use E,G,A,or P,,;
cin >> letter;
while ( (letter !=?E?) && (letter !=?G?) &&
(letter !=?A?) && (letter !=?P?))
{
cout <<,Rating invalid,Enter again:,;
cin >> letter;
}
}
50
What is a driver?
It is a short main program whose only
purpose is to call a function you wrote,
so you can determine whether it meets
specifications and works as expected.
write a driver for function GetRating( )
51
#include <iostream>
void GetRating( char& ); //prototype
using namespace std;
int main( )
{
char rating;
rating = ‘X’;
GetRating(rating); // call
cout <<,That was rating =,
<< rating << endl;
return 0;
}
52
An Assertion
is a truth-valued statement--one that is either
true or false (not necessarily in C++ code)
EXAMPLES
studentCount > 0
sum is assigned && count > 0
response ==?y? or?n?
0.0 <= deptSales <= 25000.0
beta == beta @ entry * 2
53
Preconditions and Postconditions
the precondition is an assertion describing
everything that the function requires to be
true at the moment the function is invoked
the postcondition describes the state at the
moment the function finishes executing
the caller is responsible for ensuring the
precondition,and the function code must
ensure the postcondition
FOR EXAMPLE,,,
54
Function with Postconditions
void GetRating ( /* out */ char& letter)
// Precondition,None
// Postcondition,User has been prompted to enter a character
// && letter == one of these input values,E,G,A,or P
{ cout <<,Enter employee rating.” << endl;
cout <<,Use E,G,A,or P,,;
cin >> letter;
while ( (letter !=?E?) && (letter !=?G?) &&
(letter !=?A?) && (letter !=?P?) )
{
cout <<,Rating invalid,Enter again:,;
cin >> letter;
}
}
55
Function with
Preconditions and Postconditions
void GetRoots( /* in */ float a,/* in */ float b,/* in */ float c,
/* out */ float& root1,/* out */ float& root2 )
// Precondition,a,b,and c are assigned
// && a != 0 && b*b - 4*a*c != 0
// Postcondition,root1 and root2 are assigned
// && root1 and root2 are roots of quadratic with coefficients a,b,c
{
float temp;
temp = b * b - 4.0 * a * c;
root1 = (-b + sqrt(temp) ) / ( 2.0 * a );
root2 = (-b - sqrt(temp) ) / ( 2.0 * a );
return;
}
56
Function with
Preconditions and Postconditions
void Swap( /* inout */ int& firstInt,
/* inout */ int& secondInt )
// Precondition,firstInt and secondInt are assigned
// Postcondition,firstInt == secondInt@entry
// && secondInt == firstInt@entry
{
int temporaryInt ;
temporaryInt = firstInt ;
firstInt = secondInt ;
secondInt = temporaryInt ;
}