Post on 13-Dec-2015
transcript
Functions OverviewFunctions are
sequence of statements with its own local variablessupports modularity, reduces code duplication
Data transfer between function to be called and caller functionby means of parameterscurrently one-way
from caller function into function to be calledWe will see how to return data back to the caller function
Function Prototype (from 2.6)Functions definition has two parts
function heading name, parameters, return type
function body (local variables and statements within curly brackets)
void display (string name){ cout << “Hello ” << name << endl;}
Like variables, a function must be declared before its first callProblem of function declaration order
You cannot call a function before you declare itSOLUTION: You may define function prototypes (a copy of
the heading) at the beginning without function declarations
Function Prototype – Example Problem
What is the problem below (program order.cpp) ?
void Hi (string name){ cout << "Hi " << name << endl; Greetings();}
void Greetings(){ cout << "Things are happening inside this computer" << endl;}
int main(){ Hi("Fred"); return 0;}
Greetings() is called in Hi() but it is declared afterwards
Function Prototype – SolutionAdd function prototypes to the beginning (order2.cpp)
#include <iostream>#include <string>using namespace std;
void Hi(string);void Greetings();
void Hi (string name){ cout << "Hi " << name << endl; Greetings();}
void Greetings(){ cout << "Things are happening inside this computer"
<< endl;}
int main(){ Hi("Fred"); return 0;}
Prototypes
Function
Declarations
Function Prototypes*** Do not forget semicolon after the prototype
definition ***no semicolon after the parameters in normal definition
Sometimes prototypes are not necessaryif the order of function calls allowsbut it is good programming practice to have them
Parameter names are not needed in prototypesbut it is OK if you have the parameter names
In #included files we have the functions’ prototypes onlyimplementations of function bodies are in libraries or in other
cpp files they are linked together
Functions that return valuesFunctions we’ve written so far are void functions
They do a job and return back to caller, but without a valueParameters are used for one-way data transfer
into the function to be calledHow about transfer a computed value out of a function?
to the main program or to other function (the caller)
Non-void functions can return values of any typefunction call becomes an expression
when the function finishes, the function call is replaced by the returned value
this way, values computed in functions can be transferred into the caller functions
void function call is not used in an expression, i.e. no value is associated with a void function
Head(); DoThat(); Verse("cow", "moo");
Functions that return values Example (see area_func_return.cpp):
suppose circlearea function takes the radius as parameter and returns the area.
In the program we call circlearea as an expression (you have to use the returned value somewhere)
area = circlearea(r);
cout << circlearea(12) << endl;
if (circlearea(r/2) >= 100) {
cout << “large circle” << endl;}
circlearea(r); //syntax ok, but meaningless because//function call returned value is not
used.
Math library functionsMathematical functions like square root, logarithm, sin, cos, etc.Prototypes are in header file cmath
#include <cmath>Full list is in page 758 (Table F.1) – partial list is in table 4.5.
correction in Table F.1: int abs (int x)Keep these math library functions on your cheat-sheet for the
examExample use of function sqrt
see usemath.cpphow did we use sqrt function?
in cout as an expressioncould we use sqrt in assignment? How?
yes, let’s do it.what happens if value is negative?
try and see! we can add some if statements to display an error message in case of negative
value
return-type func-name(parameters){ local variablesstatements
}
Function Syntax
Example: Function to calculate volume of a sphere
double SphereVol(double radius){ return 4.0*radius*radius*radius*acos(-1)/3;}
function body
Function Syntaxdouble SphereVol(double radius){ return 4.0*radius*radius*radius*acos(-1)/3;}
Function heading/prototype shows return type. return type can be any type (including string) theoretically return type may be Robot too, but in practice Robot class is not
designed to be used as the return type you do not see any syntax error, but execution may be problematic. So do not
return a Robot from a function Function body may have several statements in it return statement is used to determine the value returned from
function, so the expression after it must be of the return type Function body must include at least one return statement The return statement causes the function to exit immediately and to return
the value after return A function can have more than one return statements, but only one is
executed when the function is called (see next example) Only one return is a good programming style to have control of bigger functions
Functions can return strings
string WeekDay(int day)
// precondition: 0 <= day <= 6
// postcondition: return "Sunday" for 0,
// "Monday" for 1,
// … "Saturday" for 6
{ if (0 == day) return "Sunday"; else if (1 == day) return "Monday"; else if (2 == day) return "Tuesday"; else if (3 == day) return "Wednesday"; else if (4 == day) return "Thursday"; else if (5 == day) return "Friday"; else if (6 == day) return "Saturday";}
A program piece that uses that function
string dayName;int dayNum;cout << " enter day (0-6): ";cin >> dayNum;dayName = WeekDay(dayNum);
Which is/are correct use of WeekDay function? Why?
cout << WeekDay(5) << endl;
int j = WeekDay(0);
cout << WeekDay(2.1) << endl;
string s = WeekDay(22);
WeekDay(3);
Function documentationFunctions usually have a precondition
What conditions (e.g. value of parameters) must be true for the function to work as intended?
If there are no parameters, then no preconditionSome functions work for every parameter value
no precondition
Functions always have a postconditionIf precondition is satisfied what does the function do? What does
the function return?
Example – Compare cost of pizza sizes
Problem: Calculate and compare price per square inch of large and small size pizzas
Solution:A function, say Cost, that takes the pizza radius and price as parameters
and returns price per square inchIn main()
input radiuses and prices of large and small pizzas calculate the per square inch costs by calling the cost function display the results on screen compare the unit costs to find out which one is best value
See pizza2.cpp
Example - When is a year a leap year?Every year divisible by four is a leap year
Except years divisible by 100 are not Except years divisible by 400 are
Alternatively:Every year divisible by 400 is a leap yearOtherwise, years divisible by 100 are not leap years Otherwise, years divisible by 4 are leap yearsOtherwise, not a leap year
Boolean functionbool IsLeapYear(int year);// pre: year > 0// post: return true if year is a leap year
Implementation and use of leap year function
bool IsLeapYear(int year)// precondition: year > 0// postcondition: returns true if year is a leap year, else returns false { if (year % 400 == 0) // divisible by 400 { return true; } else if (year % 100 == 0) // divisible by 100 { return false; } else if (year % 4 == 0) // divisible by 4 { return true; } return false;}int main(){ int year; cout << "enter a year ";
cin >> year; if (IsLeapYear(year)) { cout << year << " has 366 days, it is a leap year" << endl; } else { cout << year << " has 365 days, it is NOT a leap year" << endl; } return 0;}
See isleap.cpp
There’s more than one way No if/else necessary in the function body
bool IsLeapYear(int year)// precondition: year > 0// post: return true if year is a leap year{ return ( year % 400 == 0 ) || ( year % 4 == 0 && year % 100 != 0);}
How does this work? Is this version more efficient? Are these two versions different from user perspective?