68
1 2000 Prentice Hall, Inc. All rights reserved. 2001 NHTI CP 107 M. Saleem Yusuf 3.1 3.1 Introduction Introduction Divide and Conquer Construct a program from smaller pieces or components Each piece more manageable than the original program Functions Name of a small program or piece of code that does a specific thing Benefits of using functions Allows reuse of code Easy to maintenance Makes code easy to read and understand

2000 Prentice Hall, Inc. All rights reserved. 2001 NHTI CP 107 M. Saleem Yusuf 1 3.1Introduction Divide and Conquer –Construct a program from smaller

Embed Size (px)

Citation preview

1 2000 Prentice Hall, Inc. All rights reserved. 2001 NHTI CP 107 M. Saleem Yusuf

3.13.1 IntroductionIntroduction3.13.1 IntroductionIntroduction

• Divide and Conquer – Construct a program from smaller pieces or components– Each piece more manageable than the original program

• Functions– Name of a small program or piece of code that does a

specific thing

• Benefits of using functions– Allows reuse of code– Easy to maintenance– Makes code easy to read and understand

2 2000 Prentice Hall, Inc. All rights reserved. 2001 NHTI CP 107 M. Saleem Yusuf

FunctionsFunctionsFunctionsFunctions

• Functions contain – Data – declarations

int i, j, k;

– Code - executable statements• (“if”, “case”, “assignment”, “for”, “while”, “do-

while”, ……)

• Data may be declared anywhere in the function, as long as it is declared before it is used

3 2000 Prentice Hall, Inc. All rights reserved. 2001 NHTI CP 107 M. Saleem Yusuf

3.33.3 Math Library FunctionsMath Library Functions3.33.3 Math Library FunctionsMath Library Functions

• Math library functions– Allows programmer to perform common

mathematical calculations– Must include the header file <cmath>

• Functions called by writingvar = functionName (argument);

• Examplecout << sqrt( 900.0 );

– Calls the sqrt (square root) function. The preceding statement would print 30

– The sqrt function takes an argument of type double and returns a result of type double, as do all functions in the math library

4 2000 Prentice Hall, Inc. All rights reserved. 2001 NHTI CP 107 M. Saleem Yusuf

3.33.3 Math Library FunctionsMath Library Functions3.33.3 Math Library FunctionsMath Library Functions

• Function arguments can be– Constants

sqrt( 4 );– Variables

sqrt( x );– Expressions

sqrt( sqrt( x ) ) ;sqrt( 3 - 6x );

– Identifiers (variable name or name of a built-in function)sqrt( fSomeNum );

– Identifiers must begin with a character or underscore which can then be followed by characters, underscores, and numbers

• Examples of Math lib functions– acos, asin, atan, atan2, cos, cosh, sin, sinh, tan, tanh

5 2000 Prentice Hall, Inc. All rights reserved. 2001 NHTI CP 107 M. Saleem Yusuf

FunctionsFunctionsFunctionsFunctions

• Functions have a general form<return data type> < function name> (parameter list){…}

• Functions MUST be declared before they are used. This is commonly referred to as prototyping. Only exception is function main. It does not have to be declaredint main (void)

{

return 0

}

6 2000 Prentice Hall, Inc. All rights reserved. 2001 NHTI CP 107 M. Saleem Yusuf

Formal ParametersFormal ParametersFormal ParametersFormal Parameters

• Formal parameters are used to declare variables which are arguments to functions

• They can be used like any other variables within a function

• Do not declare a local variable with the same name as a formal parameter!

sqr = Square(5); //called from main like this

int Square (int num) {

int result = num * num;return result;

}

num is a formal parameter.

7 2000 Prentice Hall, Inc. All rights reserved. 2001 NHTI CP 107 M. Saleem Yusuf

3.5 Function Definitions3.5 Function Definitions3.5 Function Definitions3.5 Function Definitions

• Purpose of a function is to– Take in data (via formal parameters)– Perform operations– Return the result

Format for function definition:return-value-type function-name(parameter-list)

{ declarations and statements

return } Example:

int square( int y){ int x = y * y;return x;

}

8 2000 Prentice Hall, Inc. All rights reserved. 2001 NHTI CP 107 M. Saleem Yusuf

Function ProtypesFunction ProtypesFunction ProtypesFunction Protypes

• All functions other than main should be declared before they can be used

• This declaration is called a prototype• A prototype contains

– Function return type– Function name– Function parameter (list of var type and var name)

• Variable Types– Like int , double, etc.

• Variable Names– In function prototype, parameter names are

optional, but good programming practice to use them

9 2000 Prentice Hall, Inc. All rights reserved. 2001 NHTI CP 107 M. Saleem Yusuf

3.63.6 Function PrototypesFunction Prototypes3.63.6 Function PrototypesFunction Prototypes

– Function parameter• Information the function takes in

– Return type• Type of information the function passes back to caller

(default int)• void signifies the function returns nothing

– Function prototype is only needed if function definition comes after the function call in the program

10 2000 Prentice Hall, Inc. All rights reserved. 2001 NHTI CP 107 M. Saleem Yusuf

Functions – ScopeFunctions – ScopeFunctions – ScopeFunctions – Scope#include <iostream>using namespace std;

int Product (int x, int y); Function Prototypeint i = 10; // Global variable, defined before mainint n = 20; // Global variable, defined before main

int main (void) // main Program starts here{

int j = 5, i = 6, k = 0; // declare and initialize variablesk = Product (i, j);cout << “k = “ << k << “, n = " << n << endl;return 0;

} // main Program ends here

int Product (int x, int y) // function definition{

int i;i = x * y;cout << “Local i = “ << i << ", Global i = “<< ::i << endl;cout << "n = " << n << endl;return i;

}

11 2000 Prentice Hall, Inc. All rights reserved. 2001 NHTI CP 107 M. Saleem Yusuf

Returning from a FunctionReturning from a FunctionReturning from a FunctionReturning from a Function

• A return statement is used to exit a function, from within any code block in the function

• Good programming style says there should be only 1 return statement (may not be practical)

• Void functions do not require a “return” but should be coded with a “return” without any arguments. Other functions should have a “return” with a value. Without a value, compiler will issue warning

12 2000 Prentice Hall, Inc. All rights reserved. 2001 NHTI CP 107 M. Saleem Yusuf

Return statementReturn statementReturn statementReturn statement

• The “return” statements does not require parenthesis and may contain executable statements within it:

return 1; return (max(a,b)); return ;

13 2000 Prentice Hall, Inc. All rights reserved. 2001 NHTI CP 107 M. Saleem Yusuf

Scope Rules for FunctionsScope Rules for FunctionsScope Rules for FunctionsScope Rules for Functions

• Scope determines the “lifetime” of a variable• There are 3 types of variables• Local Variables

– Declared inside a function (main is also a function)– Scope is only during the execution of that function– Accessible only inside the function in which they are

declared– All variables declared in function definitions are local

variables for that function

• Formal Parameters– defines a list of variables that are passed to a

function– Local variables are passed when function is called.

This provides a function with outside information.

14 2000 Prentice Hall, Inc. All rights reserved. 2001 NHTI CP 107 M. Saleem Yusuf

Scope Rules for FunctionsScope Rules for FunctionsScope Rules for FunctionsScope Rules for Functions

• Global variables– Are declared before the main program– Variable’s lifetime can last throughout the program– Accessible by all the functions

• Scope determines “accessibility” of a variable– Local - Accessible only in the function it is declared in– Declared in main - Not accessible by functions– Declared in function - Not accessible by main– Declared before main – accessible by all

15 2000 Prentice Hall, Inc. All rights reserved. 2001 NHTI CP 107 M. Saleem Yusuf

Local VariablesLocal VariablesLocal VariablesLocal Variables

• Local variables can be declared anywhere inside of a function

• They are created and destroyed each time the code block in which they are declared, is entered or exited

void graph ()

{

int i; // creates i

i = 5; // uses i

{

int i = 7; // creates another i

cout << i << endl; // will print 7

} // destroys inner i

cout << i << endl; // will print 5, not 7

}

16 2000 Prentice Hall, Inc. All rights reserved. 2001 NHTI CP 107 M. Saleem Yusuf

Global Variables and FunctionsGlobal Variables and FunctionsGlobal Variables and FunctionsGlobal Variables and Functions

• Global variables are declared outside of functions• They can be accessed anywhere from within a function• Be careful not to hide global variables !!

double size = 5, height = 10;void box (float width){ cout << size << endl; // prints global 5 { double size = 7; // creates new “size” cout << size << endl; // prints local 7 height = 31; //dangerous, global var changed } cout << size << endl; // prints global 5}

17 2000 Prentice Hall, Inc. All rights reserved. 2001 NHTI CP 107 M. Saleem Yusuf

Scope rule in For LoopScope rule in For LoopScope rule in For LoopScope rule in For Loop

• The “for” statement allows for variables to be declared in the initialization of the loop– Be very careful, they are compiler dependent!!!!

Compiler A:for (int i=0; i < 20; i++){

…….}cout << i << endl; //Valid int i is not destroyed (MS VC++)

Compiler B:

for (int i=0; i < 20; i++){}cout << i << endl; // invalid - i is destroyed when “for” ends

18 2000 Prentice Hall, Inc. All rights reserved. 2001 NHTI CP 107 M. Saleem Yusuf

Scope rule for variablesScope rule for variablesScope rule for variablesScope rule for variables

• The C++ standard allows variables to be declared within conditional expressions such as “if” and “while”

while (float y = x) > sqrt(j)); // Declares y...

if ((float x = y) < 5.0)// declares x, initializing it to y{

.

.}x = 7.5; // Error ! X no longer exists

2000 Prentice Hall, Inc. All rights reserved.

Outline19

NHTI CP 107 M. Saleem Yusuf modified 2/17/2003

1. Function prototype

2. Loop

3. Function definition

Program Output

1 // Fig. 3.3: fig03_03.cpp

2 // Creating and using a programmer-defined function3 #include <iostream>45 using std::cout;6 using std::endl;78 int square( int y); // function prototype910 int main()11 {12 for ( int x = 1; x <= 10; x++ )13 cout << square( x ) << " ";1415 cout << endl;16 return 0;17 }1819 // Function definition 20 int square( int y )21 {22 return y * y;23 }

1 4 9 16 25 36 49 64 81 100

Notice how parameters and return value are declared.

2000 Prentice Hall, Inc. All rights reserved.

Outline20

NHTI CP 107 M. Saleem Yusuf modified 2/17/2003

1. Function prototype (3 parameters)

2. Input values

2.1 Call function

1 // Fig. 3.4: fig03_04.cpp

2 // Finding the maximum of three integers

3 #include <iostream>

4

5 using std::cout;

6 using std::cin;

7 using std::endl;

8

9 int maximum( int, int, int ); // function prototype

10

11 int main()

12 {

13 int a, b, c;

14

15 cout << "Enter three integers: ";

16 cin >> a >> b >> c;

17

18 // a, b and c below are arguments to

19 // the maximum function call

20 cout<< "Maximum is: " << maximum(a,b,c) << endl;

2000 Prentice Hall, Inc. All rights reserved.

Outline21

NHTI CP 107 M. Saleem Yusuf modified 2/17/2003

3. Function definition

Program Output

2122 return 0;23 }2425 // Function maximum definition26 // x, y and z below are parameters to 27 // the maximum function definition28 int maximum( int x, int y, int z )29 {30 int max = x;3132 if ( y > max )33 max = y;3435 if ( z > max )36 max = z;3738 return max;39 }

Enter three integers: 22 85 17Maximum is: 85Enter three integers: 92 35 14Maximum is: 92Enter three integers: 45 19 98Maximum is: 98

22 2000 Prentice Hall, Inc. All rights reserved. 2001 NHTI CP 107 M. Saleem Yusuf

Function ArgumentsFunction ArgumentsFunction ArgumentsFunction Arguments

• By Value– When arguments are passed to a function, a

temporary copy (duplicate) of the arguments is given to the functions. Original values remain unchanged

• By Reference– Actual address of the variable is given to the

function. When a function modifies this value, it is changed in the function and in the main (like a global variable was changed).

• Except for arrays, by default, C++ passes arguments by value. This can be very inefficient when large items are passed

• When an item is large, or must be modified by the function, the argument can be passed by reference (address)

23 2000 Prentice Hall, Inc. All rights reserved. 2001 NHTI CP 107 M. Saleem Yusuf

3.73.7 Header FilesHeader Files3.73.7 Header FilesHeader Files

• Header files– Contain function prototypes for library functions– <cstdlib> , <cmath>, etc.– Load with #include <filename>Example:

#include <cmath>

• Custom header files– Defined by the programmer– Save as filename.h– Loaded into program using

#include "filename.h"

24 2000 Prentice Hall, Inc. All rights reserved. 2001 NHTI CP 107 M. Saleem Yusuf

3.83.8 Random Number GenerationRandom Number Generation3.83.8 Random Number GenerationRandom Number Generation

• rand functioni = rand();

– Load <cstdlib>– Generates a pseudo random number between 0 and RAND_MAX

(usually 32767)• A pseudorandom number is a preset sequence of "random" numbers• The same sequence is generated upon every program execution

• srand function– Jumps to a seeded location in a "random" sequence

srand( seed );

srand( time( 0 ) ); //must include <ctime>– time( 0 )

• The time at which the program was compiled

– Changes the seed every time the program is compiled, thereby allowing rand to generate random numbers

25 2000 Prentice Hall, Inc. All rights reserved. 2001 NHTI CP 107 M. Saleem Yusuf

3.83.8 Random Number GenerationRandom Number Generation3.83.8 Random Number GenerationRandom Number Generation

• Scaling– Reduces random number to a certain range– Modulus ( % ) operator

• Reduces number between 0 and RAND_MAX to a number between 0 and the scaling factor

– Example

i = rand() % 6;• Generates a number between 0 and 5

i = 1 + (rand() % 6);• Generates a number between 1 and 6

2000 Prentice Hall, Inc. All rights reserved.

Outline26

NHTI CP 107 M. Saleem Yusuf modified 2/17/2003

1. Define loop

2. Output random number

Program Output

5 5 3 5 5 2 4 2 5 5 5 3 2 2 1 5 1 4 6 4

1 // Fig. 3.7: fig03_07.cpp2 // Shifted, scaled integers produced by 1 + rand() % 63 #include <iostream>45 using std::cout;6 using std::endl;78 #include <iomanip>910 using std::setw;1112 #include <cstdlib>1314 int main()15 {16 for ( int i = 1; i <= 20; i++ ) {17 cout << setw( 10 ) << ( 1 + rand() % 6 );1819 if ( i % 5 == 0 )20 cout << endl;21 }2223 return 0;24 }

Notice rand() % 6 . This returns a number between 0 and 5 (scaling). Add 1 to get a number between 1 and 6.

Executing the program again gives the same "random" dice rolls.

2000 Prentice Hall, Inc. All rights reserved.

Outline27

NHTI CP 107 M. Saleem Yusuf modified 2/17/2003

1. Initialize seed

2. Input value for seed

2.1 Use srand to change random sequence

2.2 Define Loop

3. Generate and output random numbers

  1)   // Fig. 3.9: fig03_09.cpp   2)   // Randomizing die-rolling program   3)   #include  <iostream>  4)     5)   using  std::cout;  6)   using  std::cin;  7)   using  std::endl;  8)     9)   #include  <iomanip> 10)    11)   using  std::setw; 12)    13)   #include  <cstdlib> 14)    15)   int  main() 16)   { 17)       unsigned  seed; 18)    19)      cout << "Enter seed: "; 20)      cin >> seed; 21)      srand( seed ); 22)    23)       for  (  int  i = 1; i <= 10; i++ ) { 24)         cout << setw( 10 ) << 1 + rand() % 6; 25)    26)          if  ( i % 5 == 0 )  27)            cout << endl; 28)      } 29)    30)       return  0; 31)   }

2000 Prentice Hall, Inc. All rights reserved.

Outline28

NHTI CP 107 M. Saleem Yusuf modified 2/17/2003

Program Output

Enter seed: 67 1 6 5 1 4 5 6 3 1 2

Enter seed: 432 4 2 6 4 3 2 5 1 4 4

Enter seed: 67 1 6 5 1 4 5 6 3 1 2

Notice how the die rolls change with the seed.

29 2000 Prentice Hall, Inc. All rights reserved. 2001 NHTI CP 107 M. Saleem Yusuf

3.9 Example: A Game of Chance and 3.9 Example: A Game of Chance and Introducing enumIntroducing enum

3.9 Example: A Game of Chance and 3.9 Example: A Game of Chance and Introducing enumIntroducing enum

• Enumeration - set of integers with identifiersenum typeName {constant1, constant2…};

– Constants start at 0 (default), incremented by 1– Unique constant names– Example:

enum Status {CONTINUE, WON, LOST};

• Create an enumeration variable of type typeName– Variable is constant, its value may not be

reassignedStatus enumVar; // create variable

enumVar = WON; // set equal to WON

enumVar = 1; // ERROR

30 2000 Prentice Hall, Inc. All rights reserved. 2001 NHTI CP 107 M. Saleem Yusuf

Example: A Game of Chance and Example: A Game of Chance and Introducing enum(II)Introducing enum(II)

Example: A Game of Chance and Example: A Game of Chance and Introducing enum(II)Introducing enum(II)

• Enumeration constants can have values pre-setenum Months { JAN = 1, FEB, MAR, APR, MAY, JUN, JUL,

AUG, SEP, OCT, NOV, DEC};– Starts at 1, increments by 1

• Craps simulator rules– Roll two dice

• 7 or 11 on first throw, player wins• 2, 3, or 12 on first throw, player loses• 4, 5, 6, 8, 9, 10

– value becomes player's "point"– player must roll his point before rolling 7 to

win

2000 Prentice Hall, Inc. All rights reserved.

Outline31

NHTI CP 107 M. Saleem Yusuf modified 2/17/2003

1. rollDice prototype

1.1 Initialize variables and enum

1.2 Seed srand

2. Define switch statement for win/loss/continue

1 // Fig. 3.10: fig03_10.cpp2 // Craps3 #include <iostream>45 using std::cout;6 using std::endl;78 #include <cstdlib>910 #include <ctime>1112 using std::time;1314 int rollDice( void ); // function prototype1516 int main()17 {18 enum Status { CONTINUE, WON, LOST };19 int sum, myPoint;20 Status gameStatus;2122 srand( time( 0 ) );23 sum = rollDice(); // first roll of the dice2425 switch ( sum ) {26 case 7: 27 case 11: // win on first roll28 gameStatus = WON;29 break;30 case 2: 31 case 3: 32 case 12: // lose on first roll33 gameStatus = LOST;34 break;

Notice how the enum is defined

2000 Prentice Hall, Inc. All rights reserved.

Outline32

NHTI CP 107 M. Saleem Yusuf modified 2/17/2003

2.1 Define loop to continue playing

2.2 Print win/loss

35 default: // remember point

36 gameStatus = CONTINUE;

37 myPoint = sum;

38 cout << "Point is " << myPoint << endl;

39 break; // optional

40 }

41

42 while ( gameStatus == CONTINUE ) { // keep rolling

43 sum = rollDice();

44

45 if ( sum == myPoint ) // win by making point

46 gameStatus = WON;

47 else if ( sum == 7 ) // lose by rolling 749 gameStatus = LOST;

50 }

51

52 if ( gameStatus == WON )

53 cout << "Player wins" << endl;

54 else

55 cout << "Player loses" << endl;

56

57 return 0;

58 }

59

2000 Prentice Hall, Inc. All rights reserved.

Outline33

NHTI CP 107 M. Saleem Yusuf modified 2/17/2003

3. Define rollDice function

Program Output

Player rolled 6 + 5 = 11Player wins

Player rolled 6 + 5 = 11Player wins

Player rolled 4 + 6 = 10Point is 10Player rolled 2 + 4 = 6Player rolled 6 + 5 = 11Player rolled 3 + 3 = 6Player rolled 6 + 4 = 10Player wins

Player rolled 1 + 3 = 4Point is 4Player rolled 1 + 4 = 5Player rolled 5 + 4 = 9Player rolled 4 + 6 = 10Player rolled 6 + 3 = 9Player rolled 1 + 2 = 3Player rolled 5 + 2 = 7Player loses

60 int rollDice( void )61 {62 int die1, die2, workSum;6364 die1 = 1 + rand() % 6;65 die2 = 1 + rand() % 6;66 workSum = die1 + die2;67 cout << "Player rolled " << die1 << " + " << die268 << " = " << workSum << endl;6970 return workSum;71 }

34 2000 Prentice Hall, Inc. All rights reserved. 2001 NHTI CP 107 M. Saleem Yusuf

3.103.10Storage ClassesStorage Classes3.103.10Storage ClassesStorage Classes

• Variables have attributes– Name, Type, Size, Value

• Identifier are name given to variables and user defined functions

• Identifiers also have other attributes– Storage class specifier– Scope– Linkage

35 2000 Prentice Hall, Inc. All rights reserved. 2001 NHTI CP 107 M. Saleem Yusuf

3.103.10Storage ClassesStorage Classes3.103.10Storage ClassesStorage Classes

• Storage class specifiers - Instructions to the compiler, on how a variable should be stored– Storage class

• Duration during which the identifier exists in memory• Some are created and destroyed• Some remain in memory throughout the execution of

main• Two storage classes (category), automatic or static

– Scope• Where object is referenced in program

– Linkage• Where an identifier is known (current source file or

external file)

• C++ supports 5 specifiers– auto, extern, register, static, mutable

36 2000 Prentice Hall, Inc. All rights reserved. 2001 NHTI CP 107 M. Saleem Yusuf

3.103.10Storage ClassesStorage Classes3.103.10Storage ClassesStorage Classes

• extern– used to signify a reference to a global variable whose

storage is allocated elsewhere (other file).– Default for global variables and functions. – Known in any function

37 2000 Prentice Hall, Inc. All rights reserved. 2001 NHTI CP 107 M. Saleem Yusuf

3.103.10Storage ClassesStorage Classes3.103.10Storage ClassesStorage Classes

• static– Local variables defined in functions– Keep value after function ends– Only known in their own function– Variables exist for entire program execution– Only initialized once, when created

38 2000 Prentice Hall, Inc. All rights reserved. 2001 NHTI CP 107 M. Saleem Yusuf

3.103.10Storage ClassesStorage Classes3.103.10Storage ClassesStorage Classes

• static – Different meanings for local and global vars.– static local variable

• Makes a variable permanent similar to global variable, but static variables are only visible to functions they belong to.

• For local var in a function, value of the variable is saved when the function ends and is restored when the function is restarted.

• Initialized once, at program startup.

– static global variable• When applied to a global var, it is visible only to the functions

that belong in the same file. It is invisible to functions in other files, which may be part of the same program.

• mutable– used within classes. Allows const variables to be modified

by const functions. We will not cover this.

39 2000 Prentice Hall, Inc. All rights reserved. 2001 NHTI CP 107 M. Saleem Yusuf

3.113.11 Identifier Scope RulesIdentifier Scope Rules3.113.11 Identifier Scope RulesIdentifier Scope Rules

• File scope – Defined outside a function, known in all functions– Examples include, global variables, function definitions

and functions prototypes• Function scope

– Can only be referenced inside a function body– Only labels (start:, case:, etc.) and local variables

• Block scope – Declared inside a block. Begins at declaration, ends at }– Variables, function parameters (local variables of

function)– Outer blocks “hidden” from inner blocks if same variable

name• Function prototype scope

– Identifiers in parameter list– Names in function prototype optional, only type is

required

2000 Prentice Hall, Inc. All rights reserved.

Outline40

NHTI CP 107 M. Saleem Yusuf modified 2/17/2003

1. Function prototypes

1.1 Initialize global variable

1.2 Initialize local variable

1.3 Initialize local variable in block

2. Call functions

3. Output results

1 // Fig. 3.12: fig03_12.cpp2 // A scoping example3 #include <iostream>45 using std::cout;6 using std::endl;78 void a( void ); // function prototype9 void b( void ); // function prototype10 void c( void ); // function prototype1112 int x = 1; // global variable1314 int main()15 {16 int x = 5; // local variable to main1718 cout << "local x in outer scope of main is " << x << endl;1920 { // start new scope21 int x = 7;2223 cout << "local x in inner scope of main is " << x << endl;24 } // end new scope2526 cout << "local x in outer scope of main is " << x << endl;2728 a(); // a has automatic local x29 b(); // b has static local x30 c(); // c uses global x31 a(); // a reinitializes automatic local x32 b(); // static local x retains its previous value33 c(); // global x also retains its value34

x is different inside and outside the block.

local x in outer scope of main is 5local x in inner scope of main is 7local x in outer scope of main is 5

2000 Prentice Hall, Inc. All rights reserved.

Outline41

NHTI CP 107 M. Saleem Yusuf modified 2/17/2003

3.1 Define Functions

35 cout << "local x in main is " << x << endl;3637 return 0;38 }40 void a( void )41 {42 int x = 25; // initialized each time a is called4344 cout << endl << "local x in a is " << x 45 << " after entering a" << endl;46 ++x;47 cout << "local x in a is " << x 48 << " before exiting a" << endl;49 }51 void b( void )52 {53 static int x = 50; // Static initialization only54 // first time b is called.55 cout << endl << "local static x is " << x 56 << " on entering b" << endl;57 ++x;58 cout << "local static x is " << x 59 << " on exiting b" << endl;60 }

62 void c( void )63 {64 cout << endl << "global x is " << x 65 << " on entering c" << endl;66 x *= 10;67 cout << "global x is " << x << " on exiting c" << endl;68 }

Local automatic variables are created and destroyed each time a is called.

Local static variables are not destroyed when the function ends.

Global variables are always accessible. Function c references the global x.

local x in a is 25 after entering a

local x in a is 26 before exiting a

local static x is 50 on entering b

local static x is 51 on exiting b

global x is 1 on entering c

global x is 10 on exiting c

2000 Prentice Hall, Inc. All rights reserved.

Outline42

NHTI CP 107 M. Saleem Yusuf modified 2/17/2003

Program Output

local x in outer scope of main is 5local x in inner scope of main is 7local x in outer scope of main is 5 local x in a is 25 after entering alocal x in a is 26 before exiting a local static x is 50 on entering blocal static x is 51 on exiting b global x is 1 on entering cglobal x is 10 on exiting c local x in a is 25 after entering alocal x in a is 26 before exiting a local static x is 51 on entering blocal static x is 52 on exiting b global x is 10 on entering cglobal x is 100 on exiting clocal x in main is 5

43 2000 Prentice Hall, Inc. All rights reserved. 2001 NHTI CP 107 M. Saleem Yusuf

RecursionRecursionRecursionRecursion

• Recursive functions – Are functions that calls themselves– Can only solve a base case– If not base case, the function breaks the problem into a

slightly smaller, slightly simpler, problem that resembles the original problem and

• Launches a new copy of itself to work on the smaller problem, slowly converging towards the base case

• Makes a call to itself inside the return statement

– Eventually the base case gets solved and then that value works its way back up to solve the whole problem

44 2000 Prentice Hall, Inc. All rights reserved. 2001 NHTI CP 107 M. Saleem Yusuf

RecursionRecursionRecursionRecursion

• Example: factorialn! = n * ( n – 1 ) * ( n – 2 ) * … * 1

– Recursive relationship ( n! = n * ( n – 1 )! )5! = 5 * 4!4! = 4 * 3!…

– Base case (1! = 0! = 1)

// Recursive definition of function factorialunsigned long factorial( unsigned long number ){ if ( number <= 1 ) // base case return 1; else // recursive case return number * factorial( number - 1 );}

45 2000 Prentice Hall, Inc. All rights reserved. 2001 NHTI CP 107 M. Saleem Yusuf

RecursionRecursionRecursionRecursion

unsigned long factorial( unsigned long number ){ if ( number <= 1 ) return 1; else return number * factorial( number - 1 );}

Anytime a function is called, all current information is saved on the stack, the function is executed and then program starts execution immediately after the function call

int j = factorial(4)

return (4 * factorial(3) )

return (3 * factorial(2) )

return (2 * (factorial(1) )

Return value = 2

2*factorial(1) = 2 * 1 = 2

Return value = 244*factorial(3) = 4 * 6 = 24

Return value = 6

3*factorial(2) = 3 * 2 = 6

Return value = 1

factorial(1) = 1

46 2000 Prentice Hall, Inc. All rights reserved. 2001 NHTI CP 107 M. Saleem Yusuf

3.13 Example Using Recursion: The Fibonacci Series3.13 Example Using Recursion: The Fibonacci Series3.13 Example Using Recursion: The Fibonacci Series3.13 Example Using Recursion: The Fibonacci Series

• Fibonacci series: 0, 1, 1, 2, 3, 5, 8...– Each number sum of two previous ones– Example of a recursive formula:

fib(n) = fib(n-1) + fib(n-2)• C++ code for fibonacci function

long fibonacci( long n )

{

if ( n == 0 || n == 1 ) // base casereturn n;

else return fibonacci( n - 1 ) + fibonacci( n – 2 );

}

 

47 2000 Prentice Hall, Inc. All rights reserved. 2001 NHTI CP 107 M. Saleem Yusuf

3.133.13 Example Using Recursion: The Fibonacci SeriesExample Using Recursion: The Fibonacci Series3.133.13 Example Using Recursion: The Fibonacci SeriesExample Using Recursion: The Fibonacci Series

• Diagram of Fibonnaci function

f( 3 )

f( 1 )f( 2 )

f( 1 ) f( 0 ) return 1

return 1 return 0

return +

+return

2000 Prentice Hall, Inc. All rights reserved.

Outline48

NHTI CP 107 M. Saleem Yusuf modified 2/17/2003

1. Function prototype

1.1 Initialize variables

2. Input an integer

2.1 Call function fibonacci

2.2 Output results.

3. Define fibonacci recursively

1 // Fig. 3.15: fig03_15.cpp2 // Recursive fibonacci function3 #include <iostream>5 using std::cout;6 using std::cin;7 using std::endl;89 unsigned long fibonacci( unsigned long );1011 int main()12 {13 unsigned long result, number;1415 cout << "Enter an integer: ";16 cin >> number;17 result = fibonacci( number );18 cout << "Fibonacci(" << number << ") = " << result << endl;19 return 0;20 }2122 // Recursive definition of function fibonacci23 unsigned long fibonacci( unsigned long n )24 {25 if ( n == 0 || n == 1 ) // base case26 return n;27 else // recursive case28 return fibonacci( n - 1 ) + fibonacci( n - 2 );29 }

Only the base cases return values. All other cases call the fibonacci function again.

2000 Prentice Hall, Inc. All rights reserved.

Outline49

NHTI CP 107 M. Saleem Yusuf modified 2/17/2003

Program Output

Enter an integer: 0Fibonacci(0) = 0

Enter an integer: 1Fibonacci(1) = 1

Enter an integer: 2Fibonacci(2) = 1

Enter an integer: 3Fibonacci(3) = 2

Enter an integer: 4Fibonacci(4) = 3

Enter an integer: 5Fibonacci(5) = 5

 Enter an integer: 6Fibonacci(6) = 8

Enter an integer: 10Fibonacci(10) = 55

Enter an integer: 20Fibonacci(20) = 6765

Enter an integer: 30Fibonacci(30) = 832040 Enter an integer: 35Fibonacci(35) = 9227465

50 2000 Prentice Hall, Inc. All rights reserved. 2001 NHTI CP 107 M. Saleem Yusuf

3.14 Recursion vs. Iteration3.14 Recursion vs. Iteration3.14 Recursion vs. Iteration3.14 Recursion vs. Iteration

• Repetition– Iteration: explicit loop– Recursion: repeated function calls

• Termination– Iteration: loop condition fails– Recursion: base case recognized

• Both can have infinite loops• Balance between performance (iteration) and good software

engineering (recursion)• Recursion can be expensive in term of resources. Every time a

function calls itself, all the data of the calling function is saved and a new copy of all the variables is created.

51 2000 Prentice Hall, Inc. All rights reserved. 2001 NHTI CP 107 M. Saleem Yusuf

3.15 Functions with Empty Parameter Lists3.15 Functions with Empty Parameter Lists3.15 Functions with Empty Parameter Lists3.15 Functions with Empty Parameter Lists

• Empty parameter lists– Either writing void or leaving a parameter list empty

indicates that the function takes no argumentsvoid print();

or void print( void );

– Function print takes no arguments and returns no value

print(); Takes no arguments and returns int (default return type is int)

2000 Prentice Hall, Inc. All rights reserved.

Outline52

NHTI CP 107 M. Saleem Yusuf modified 2/17/2003

1. Function prototypes (take no arguments)

2. Call the functions

3. Function definitions

Program Output

1 // Fig. 3.18: fig03_18.cpp2 // Functions that take no arguments3 #include <iostream>45 using std::cout;6 using std::endl;78 void function1();9 void function2( void );1011 int main()12 {13 function1();14 function2();1516 return 0;17 }1819 void function1()20 {21 cout << "function1 takes no arguments" << endl;22 }2324 void function2( void )25 {26 cout << "function2 also takes no arguments" << endl;27 }

function1 takes no argumentsfunction2 also takes no arguments

Notice the two ways of declaring no arguments.

53 2000 Prentice Hall, Inc. All rights reserved. 2001 NHTI CP 107 M. Saleem Yusuf

3.16 Inline Functions3.16 Inline Functions3.16 Inline Functions3.16 Inline Functions

• inline functions – Reduce function-call overhead – Asks the compiler to copy code into program instead of using a

function call– Compiler can ignore inline– Should be used with small, often-used functions

• Example:

inline double cube( const double s )

{ return s * s * s; }

54 2000 Prentice Hall, Inc. All rights reserved. 2001 NHTI CP 107 M. Saleem Yusuf

3.17 References and Reference Parameters3.17 References and Reference Parameters3.17 References and Reference Parameters3.17 References and Reference Parameters

• Call by value– Copy of data passed to function– Changes to copy do not change original– Used to prevent unwanted side effects

• Call by reference – Function can directly access data– Changes affect original

• Reference parameter alias for argument– & is used to signify a reference

void change( int &variable ) { variable += 3; }

– Adds 3 to the variable inputtedint y = &x.

– A change to y will now affect x as well

2000 Prentice Hall, Inc. All rights reserved.

Outline55

NHTI CP 107 M. Saleem Yusuf modified 2/17/2003

1. Function prototypes

1.1 Initialize variables

2. Print x

2.1 Call function and print x

2.2 Print z

2.3 Call function and print z 

3. Function Definition ofsquareByValue

Notice the use of the & operator

1 // Fig. 3.20: fig03_20.cpp2 // Comparing call-by-value and call-by-reference3 // with references.4 #include <iostream>6 using std::cout;7 using std::endl;89 int squareByValue( int );10 void squareByReference( int & );11 12 int main()13 {14 int x = 2, z = 4;1516 cout << "x = " << x << " before squareByValue\n"17 << "Value returned by squareByValue: "18 << squareByValue( x ) << endl19 << "x = " << x << " after squareByValue\n" << endl;221 cout<<"z = " << z << " before squareByReference" << endl;22 squareByReference( z );23 cout<<"z = " << z << " after squareByReference" << endl;2425 return 0;26 }

29 {30 return a *= a; // caller's argument not modified31 }

28 int squareByValue( int a )

2000 Prentice Hall, Inc. All rights reserved.

Outline56

NHTI CP 107 M. Saleem Yusuf modified 2/17/2003

3.1 Function Definition of squareByReference

Program Output

x = 2 before squareByValueValue returned by squareByValue: 4x = 2 after squareByValue z = 4 before squareByReferencez = 16 after squareByReference

32

33 void squareByReference( int &cRef )

34 {

35 cRef *= cRef; //caller's argument modified

36 }

2000 Prentice Hall, Inc. All rights reserved.

Outline57

NHTI CP 107 M. Saleem Yusuf modified 2/17/2003

Function swapUses to arguments that are passed by reference

#include <iostream>void swap (int &x, int &y);

main (){ int a = 1, b = 2; swap (a, b); return ;}

void swap (int &x, int &y){ int temp = x; x = y; y = temp;}

58 2000 Prentice Hall, Inc. All rights reserved. 2001 NHTI CP 107 M. Saleem Yusuf

3.18 Default Arguments3.18 Default Arguments3.18 Default Arguments3.18 Default Arguments

• If function parameter is omitted, gets default value– Can be constants, global variables, or function calls– Must be the rightmost argument(s )– Default values only specified in the prototype of the

function• Set defaults in function prototype

int defaultFunction( int x = 1,

int y = 2, int z = 3 );• Set defaults in function prototype

int defaultFunction( int x = 1,

int y = 2, int z = 3 );

2000 Prentice Hall, Inc. All rights reserved.

Outline59

NHTI CP 107 M. Saleem Yusuf modified 2/17/2003

1. Function prototype

2. Print default volume

2.1 Print volume with one parameter

2.2 Print with 2 parameters

2.3 Print with all parameters.

3. Function definition 

1 // Fig. 3.23: fig03_23.cpp2 // Using default arguments3 #include <iostream>45 using std::cout;6 using std::endl;78 int boxVolume( int length = 1, int width = 1,9 int height = 1 );10 int main()11 {12 cout << "The default box volume is: " << boxVolume() 13 << "\n\nThe volume of a box with length 10,\n"14 << "width 1 and height 1 is: " << boxVolume( 10 ) 15 << "\n\nThe volume of a box with length 10,\n" 16 << "width 5 and height 1 is: " << boxVolume( 10, 5)17 << "\n\nThe volume of a box with length 10,\n"18 << "width 5 and height 2 is: " << boxVolume( 10, 5, 2 )19 << endl;2021 return 0;22 }2324 // Calculate the volume of a box 25 int boxVolume( int length, int width, int height )26 { 27 return length * width * height;28 }

2000 Prentice Hall, Inc. All rights reserved.

Outline60

NHTI CP 107 M. Saleem Yusuf modified 2/17/2003

Program OutputThe default box volume is: 1 The volume of a box with length 10,width 1 and height 1 is: 10 The volume of a box with length 10,width 5 and height 1 is: 50 The volume of a box with length 10,width 5 and height 2 is: 100

Notice how the rightmost values are defaulted.

61 2000 Prentice Hall, Inc. All rights reserved. 2001 NHTI CP 107 M. Saleem Yusuf

3.193.19 Unary Scope Resolution OperatorUnary Scope Resolution Operator3.193.19 Unary Scope Resolution OperatorUnary Scope Resolution Operator

• Unary scope resolution operator (::) – Access global variables if a local variable has same name– not needed if names are different– instead of variable use ::variable

2000 Prentice Hall, Inc. All rights reserved.

Outline62

NHTI CP 107 M. Saleem Yusuf modified 2/17/2003

1. Define variables

2. Print variables

Program Output

1 // Fig. 3.24: fig03_24.cpp2 // Using the unary scope resolution operator3 #include <iostream>45 using std::cout;6 using std::endl;78 #include <iomanip>910 using std::setprecision;1112 const double PI = 3.14159265358979;1314 int main()15 {16 const float PI = static_cast< float >( ::PI );1718 cout << setprecision( 20 )19 << " Local float value of PI = " << PI20 << "\nGlobal double value of PI = " << ::PI << endl;2122 return 0;23 }

 

Local float value of PI = 3.141592741012573242Global double value of PI = 3.141592653589790007

Notice the use of ::

63 2000 Prentice Hall, Inc. All rights reserved. 2001 NHTI CP 107 M. Saleem Yusuf

3.20 Function Overloading3.20 Function Overloading3.20 Function Overloading3.20 Function Overloading

• Function overloading– Having functions with same name and different

parameters– Should perform similar tasks i.e., a function to square

ints, and function to square floats, (but doesn’t have to).int square( int x) {return x * x;}

float square(float x) { return x * x; }

– Program chooses function by signature • signature determined by function name and parameter types

– Can have the same return types

2000 Prentice Hall, Inc. All rights reserved.

Outline64

NHTI CP 107 M. Saleem Yusuf modified 2/17/2003

1. Define overloaded function

2. Call function

Program Output

1 // Fig. 3.25: fig03_25.cpp2 // Using overloaded functions3 #include <iostream>45 using std::cout;6 using std::endl;78 int square( int x ) { return x * x; }910 double square( double y ) { return y * y; }1112 int main()13 {14 cout << "The square of integer 7 is " << square(7)15 << "\nThe square of double 7.5 is "<< square(7.5)16 << endl; 1718 return 0;19 }

The square of integer 7 is 49The square of double 7.5 is 56.25

Functions have same name but different parameters

65 2000 Prentice Hall, Inc. All rights reserved. 2001 NHTI CP 107 M. Saleem Yusuf

3.21 Function Templates3.21 Function Templates3.21 Function Templates3.21 Function Templates• Function templates

– Compact way to make overloaded functions– Keyword template– Keyword class or typename before every formal

type parameter (built in or user defined)template < class T >T square( T value1 ){ return value1 * value1;}

– T replaced by type parameter in function call.int x;int y = square(x);

• If int, all T's become ints • Can use float, double, long...

2000 Prentice Hall, Inc. All rights reserved.

Outline66

NHTI CP 107 M. Saleem Yusuf modified 2/17/2003

1. Define overloaded function

2. Call function

Program Output

Square of 2 = 4Square of 33.33 = 1110.89Square of 22 = 484

#include <iostream>

using namespace std;

template < class T > T Square( T value1 );

void main(void){

int i = 2;

double j = 33.33;

float k = 22.0F;

cout << "Square of " << i << " = " << Square(i) << endl;

cout << "Square of " << j << " = " << Square(j) << endl;

cout << "Square of " << k << " = " << Square(k) << endl << endl;

}

template < class T >

T Square( T value1 )

{

return value1 * value1;

}

2000 Prentice Hall, Inc. All rights reserved.

Outline67

NHTI CP 107 M. Saleem Yusuf modified 2/17/2003

#include <iostream>

using namespace std;

template < class T > bool IsEqual( T value1, T value2 );

void main(void){ char ch_a = 'a'; char ch_b = 'b'; int iNum1 = 100; int iNum2 = 1000;

cout << "ch_a is equal to ch_b " << ( IsEqual(ch_a, ch_b) ? "True" : "False") << endl; cout << "ch_a is equal to ch_b " << ( IsEqual(ch_b, ch_b) ? "True" : "False") << endl;

if (IsEqual(iNum1, iNum2))cout << "numbers are equal " << endl;

elsecout << "numbers are NOT equal " << endl;

cout << "24 is equal to 24 " << ( IsEqual(24, 24) ? "True" : "False") << endl;}template < class T >bool IsEqual( T value1, T value2 ){

if (value1 == value2)return 1;

elsereturn 0;

}

ch_a is equal to ch_b Falsech_a is equal to ch_b Truenumbers are NOT equal24 is equal to 24 True

2000 Prentice Hall, Inc. All rights reserved.

Outline68

NHTI CP 107 M. Saleem Yusuf modified 2/17/2003

Power (2, 0) = 1Power (2, 1) = 2Power (2.45, 2) = 6.0025

#include <iostream>

using namespace std;

template < class T, class U > T Power( T base, U exponent );

void main(void){

cout << "Power (2, 0) = " << Power(2.0, 0) << endl;

cout << "Power (2, 1) = " << Power(2.0, 1) << endl;

cout << "Power (2.45, 2) = " << Power(2.45, 2) << endl;

}template < class T, class U > T Power( T base, U exponent ){

int i;T j = base;if (exponent == 0) return 1;else if (exponent == 1) return base;else{ for (i = 1; i < exponent ; i++)

base = base * j;}

return base;}