16
Functions Overview Functions are sequence of statements with its own local variables supports modularity, reduces code duplication Data transfer between function to be called and caller function by means of parameters currently one-way from caller function into function to be called We will see how to return data back to the caller function

Functions Overview Functions are sequence of statements with its own local variables supports modularity, reduces code duplication Data transfer between

Embed Size (px)

Citation preview

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?