functions g g data flow g scope local global part ii g global resolution operator part ii

59
Functions Functions Data Flow Scope local global Global Resolution Operator part II part II

Upload: gilbert-blankenship

Post on 13-Dec-2015

218 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Functions g g Data Flow g Scope local global part II g Global Resolution Operator part II

FunctionsFunctions Data Flow Scope

local global

Global Resolution Operator part IIpart II

Page 2: Functions g g Data Flow g Scope local global part II g Global Resolution Operator part II

Data FlowData Flow

Data flow is the direction of the information flow between the function and its caller.

Adding data flow documentation to the function interface is helpful.

The flow could be into a function, out of a function or both.

Page 3: Functions g g Data Flow g Scope local global part II g Global Resolution Operator part II

Parameter and Data FlowParameter and Data Flow

pass data into a function /* in *//* in */

pass data out of a function /* out *//* out */

pass data into and out of a function /* inout *//* inout */

Page 4: Functions g g Data Flow g Scope local global part II g Global Resolution Operator part II

Examples

void myFunction( /* in */ double nana, /* in */ int count)

void yourFunction( /* out */ int& num1, /* out */ int& num2)

void ourFunction( /* in */ int alpha, /* inout */ int& beta)

Parameter and Data FlowParameter and Data Flow

Page 5: Functions g g Data Flow g Scope local global part II g Global Resolution Operator part II

Parameter and Data FlowParameter and Data Flow

To be certain a function does what you want it to do, write value of variables as you enter and exit a function.

Put the output statement into a function and call it whenever you need it.

void ShowIt(void){ cout<< var1<< ‘\t’ <<var2<< ‘\t’ <<var3<< ‘\n’;}

*

Page 6: Functions g g Data Flow g Scope local global part II g Global Resolution Operator part II

Parameter and Data FlowParameter and Data FlowFlow InFlow In

int media( /* in */ int cow){

cout << “Ten * cow = “ << cow*10;return (2*cow +5);

}

int media( /* in */ int cow){

cow = 2 * cow;return (2*cow +5);

}

&

out &

*

Page 7: Functions g g Data Flow g Scope local global part II g Global Resolution Operator part II

Parameter and Data FlowParameter and Data Flow Flow OutFlow Out

void media( /* out */ float& delta,

/* out */ float& epsilon )

{

delta = 1.0;

epsilon = 0.0002;

}

epsilon = epsilon - 0.0001;

*

inoutinout

epsilon = epsilon - 0.0001;epsilon = epsilon - 0.0001;

Page 8: Functions g g Data Flow g Scope local global part II g Global Resolution Operator part II

Parameter and Data Flow Parameter and Data Flow Flow In and OutFlow In and Out

void update( /* inout */ int& javel,

/* inout */ int & grenelle )

{

javel = 3 * javel;

grenelle++;

}

Page 9: Functions g g Data Flow g Scope local global part II g Global Resolution Operator part II

Data Flow - ExampleData Flow - Example#include<iostream.h>

void getTemp(double&);void activity(double);void convertCtoF(double&);

void main(void){

double temperature;

getTemp(temperature);activity(temperature);

}

Page 10: Functions g g Data Flow g Scope local global part II g Global Resolution Operator part II

Data Flow - ExampleData Flow - Examplevoid getTemp(/* */ double& temp){{

cout<<"Enter the temperature in degrees C: ";cin>> temp;cout<<"The current temperature is "

<<temp<<" degrees celsius."<<endl;convertCtoF(temp);

}}

void convertCtoF( /* */ double& temp){{

temp=(1.8)*temp +32;cout<<"This equals "<<temp

<<" degrees Fahrenheit."<<endl;}}

out

inout

* *

Page 11: Functions g g Data Flow g Scope local global part II g Global Resolution Operator part II

Data Flow - ExampleData Flow - Examplevoid activity(/* */ double temp){{

cout<<"The recommended activity is ";if(temp>85)

cout<<"swimming."<<endl;else if(temp>70)

cout<<"tennis."<<endl;else if(temp>35)

cout<<"golf."<<endl;else if(temp>10)

cout<<"skiing."<<endl;else

cout<<"dancing."<<endl;}}

in

*

Page 12: Functions g g Data Flow g Scope local global part II g Global Resolution Operator part II

Data FlowData Flow

data flowdata flow parameter-passingparameter-passingfor a parameterfor a parameter mechanismmechanism

incoming pass-by-value

outgoing pass-by-reference

incoming/outgoing pass-by-reference

Page 13: Functions g g Data Flow g Scope local global part II g Global Resolution Operator part II

I/O ExampleI/O Examplevoid main(void){1 int red, blue;

2 void Mix( int&, int ); // prototype3 int Blend( int, int ); // prototype

4 red = 5;5 blue = Blend(3, red + 1);6 Mix(red, blue);7 cout << red << ' ' << blue << '\n';8 Mix(red, blue + red);9 cout << red << ' ' << blue << '\n';10 Mix(red, Blend(blue, red));11 cout << red << ' ' << blue << '\n';}

Page 14: Functions g g Data Flow g Scope local global part II g Global Resolution Operator part II

I/O ExampleI/O ExampleM void Mix( int& green, int yellow)

{M1 int purple;M2 cout << “enter Mix “ << green << ‘ ‘

<< yellow << ‘\n’;M3 purple = green + yellow;M4 yellow = purple + yellow;M5 green = purple;M6 cout << “leav Mix “ << green << ‘ ‘

<< yellow << ‘\n’;}

Page 15: Functions g g Data Flow g Scope local global part II g Global Resolution Operator part II

I/O ExampleI/O ExampleB int Blend( int red, int green )

{B1 int yellow;

B2 cout << “enter Blend “ << red <<‘ ‘ << green << ‘\n’;

B3 yellow = red + green;B4 cout << “leave Blend “ << red <<‘ ‘

<< green << ‘\n’;B5 return (yellow + 1);

}

Page 16: Functions g g Data Flow g Scope local global part II g Global Resolution Operator part II

void Mix( /* ______ */ int& green,

/* ______ */ int yellow )

int Blend( /* ______ */ int red,

/* ______ */ int green )

I/O ExampleI/O Example

inout

in

in

in

* * * *

Page 17: Functions g g Data Flow g Scope local global part II g Global Resolution Operator part II

1 2 3 4 5B B1 - B5

6M M1 - M6

I/O ExampleI/O Example

* * * *

7 8 M M1 - M6

9 10M B B1 - B5 M1 - M6

11

The lines are executed in this order.

Page 18: Functions g g Data Flow g Scope local global part II g Global Resolution Operator part II

I/O ExampleI/O Example

Mix memory Main

green red

blue

yellow

purplepurple

Page 19: Functions g g Data Flow g Scope local global part II g Global Resolution Operator part II

Mix Blend

Main

enter Blend 3 6leave Blend 3 6enter Mix 5 10leave Mix 15 2515 10enter Mix 15 25leave Mix 40 6540 10enter Blend 10 40leave Blend 10 40enter Mix 40 51leave Mix 91 14291 10

*

Page 20: Functions g g Data Flow g Scope local global part II g Global Resolution Operator part II

ScopeScope

A function is like a black box:You know what goes in and what comes out, but you do not know what happens inside the box.

Page 21: Functions g g Data Flow g Scope local global part II g Global Resolution Operator part II

ScopeScopeThe section of the program where the variable

is valid (known or visible).

local = available to only one function

global = available several functions

Page 22: Functions g g Data Flow g Scope local global part II g Global Resolution Operator part II

ScopeScope

Local:The scope of an identifier declared inside a blockblock extends from the point of declaration to the end of that block.

Global:The scope of an identifier declared outside all functions and classes extends from the point of declaration to the end of the source file.

* *

Page 23: Functions g g Data Flow g Scope local global part II g Global Resolution Operator part II

Local VariablesLocal Variables declared within a function definition

private to a function definition

variables in different functions are totally independent

different functions can have variables with the same names; however, each variable will have its own memory address

* * * *

Page 24: Functions g g Data Flow g Scope local global part II g Global Resolution Operator part II

int x = 3;int x = 3; // global because before main

void main(void){ // no variables local to main( )

void myfunction( ); // prototype

cout <<"x = "<<x<<" before the function call.\n"; myfunction( ); cout <<"x = "<<x<<" after the function call.\n";

}

void myfunction( ){

int r; // local to myfunction( ) r = ++x; cout <<"r = "<<r<<" within the function.\n";

}

Page 25: Functions g g Data Flow g Scope local global part II g Global Resolution Operator part II

ScopeScope

OUTPUTx = 3 before the function call.r = 4 within the function. x = 4 after the function call.

Page 26: Functions g g Data Flow g Scope local global part II g Global Resolution Operator part II

Example Example - ReadValuesvoid main(void){ int a, b, c; float avg;

void ReadValues( int&, int&, int& ); void Adjust( int&, int&, int& ); float Average( int, int, int ); void WriteResults( int, int, int, int, float );

ReadValues(a, b, c); Adjust(a, b, c); avg = Average(a, b, c); WriteResults(a, b, c, a + b + c, avg);

}

1.

2.

3.

4.

5.

6.

7.

8.

9.

Page 27: Functions g g Data Flow g Scope local global part II g Global Resolution Operator part II

Example Example - ReadValues

1. main declares and calls ReadValues

2. ReadValues declares and calls ReadOne [3x]

3. main declares and calls Adjust

4. main declares and calls Average

5. main declares and calls WriteResults

* * * *

Page 28: Functions g g Data Flow g Scope local global part II g Global Resolution Operator part II

Example Example - ReadValuesvoid ReadValues( /* */ int& x, /* */ int& y,

/* */ int& z ){ void ReadOne( char, int& );

ReadOne('1', x ); ReadOne('2', y ); ReadOne('3', z );

return;}

* *

outout

out

Page 29: Functions g g Data Flow g Scope local global part II g Global Resolution Operator part II

Example Example - ReadOne

void ReadOne( /* */ char number,

/* */ int& item )

{

cout << "Enter value " << number << ": ";

cin >> item;

return;

}

* *

in

out

Page 30: Functions g g Data Flow g Scope local global part II g Global Resolution Operator part II

Example Example - Adjust

void Adjust( /* */ int& i, /* */ int& j, /* */ int& k ){ int smallest; smallest = i;

if (j < smallest) i = i - smallest; smallest = j; j = j - smallest; if (k < smallest) k = k - smallest; smallest = k; return;

}

* *

inoutinout

inout

Page 31: Functions g g Data Flow g Scope local global part II g Global Resolution Operator part II

Example Example - Average

float Average( /* */ int item1, /* */ int item2,

/* */ int item3 )

{

int total;

total = item1 + item2 + item3;

return float(total) / 3;

}

* *

in in

in

Page 32: Functions g g Data Flow g Scope local global part II g Global Resolution Operator part II

Example Example - WriteResults

void WriteResults( /* */ int item1, /* */ int item2, /* */ int item3, /* */ int total, /* */ float average ){ cout << "Adjusted values: " << item1 << ", " << item2 << ", " << item3 << '\n'

<< "Sum: " << total << " Average: " << average << '\n';

return;}

* *

in

ininin

in

Page 33: Functions g g Data Flow g Scope local global part II g Global Resolution Operator part II

ReadValues Adjust Average WriteResults

ReadOne

Main

Enter value 1: 23Enter value 2: 56Enter value 3: 78Adjusted values: 0, 33, 55Sum: 88 Average: 29.3333

Page 34: Functions g g Data Flow g Scope local global part II g Global Resolution Operator part II

void swap(int, int); // a globalglobal function

void main(void){ int x = 5, y = 10;

1. cout <<“Main-before swap, x: “<<x<<" y: "<<y<< '\n';

swap(x, y);2. cout <<"Main-after swap, x: "<<x<<" y: "<<y<<'\n';}

void swap(int x, int y){ int temp;3. cout <<"Swap-before swap, x: "<<x<<" y: "<<y<<'\n'; temp = x;temp = x; x = y;x = y; y = temp;y = temp;4. cout <<"Swap-after swap, x: "<<x<<" y: "<<y<<'\n';}

Page 35: Functions g g Data Flow g Scope local global part II g Global Resolution Operator part II

ScopeScope

OUTPUT

1. Main-before swap: x: 5 y: 10

3. Swap-before swap: x: 5 y: 10

4. Swap-after swap: x: 1010 y: 55

2. Main-after swap: x: 5 y: 10

Page 36: Functions g g Data Flow g Scope local global part II g Global Resolution Operator part II

void Block1(int, char &);void Block2( );

int a1; // globalchar a2; // global

int main(){

. . .}

Scope within a BlockScope within a Block

slide slide 1 1 of of 22

Page 37: Functions g g Data Flow g Scope local global part II g Global Resolution Operator part II

void Block1(int a1, char &b2) // prevents access{ // to global a1

int c1; // local to Block1int d1; // local to Block1

}

}}

slide slide 2 2 of of 22 *

. . .

void Block2(){

int a1; // prevents access to global a1int b1; // local to Block2while (…){ // Block3// Block3

int c1; // local to Block3int b2; // prevents non-local access

}} // to b2 in Block1. . .

Page 38: Functions g g Data Flow g Scope local global part II g Global Resolution Operator part II

Scope within a block - Ex. 1Scope within a block - Ex. 1predict the outputpredict the output

void scope2(void); // function prototype

void main(void){ int v=100;int v=100;

cout <<"v BEFORE function = "<<v<<'\n';scope2();cout <<"v AFTER function = "<<v<<'\n';

}

slide slide 1 1 of of 22

Page 39: Functions g g Data Flow g Scope local global part II g Global Resolution Operator part II

Scope within a block - Ex. 1Scope within a block - Ex. 1predict the outputpredict the output

1. void scope2(void) //function header 2. { double v = 5.5; 3. int k, j; 4. cout << "v outside block = " << v<<'\n'; 5. for (k=1; k<=3; k++) 6. { int v = 17; // initialized in

function 7. for (j=1; j<=2; j++) 8. { v++; 9. cout << "v inside block = " << v<<'\n';10. }11. }12. cout << "v outside block = " << v<<'\n'; 13. }

slide slide 2 2 of of 22

Page 40: Functions g g Data Flow g Scope local global part II g Global Resolution Operator part II

Scope within a block - Ex. 2Scope within a block - Ex. 2

void scope2(void); // function prototype

void main(void){ int v=100;int v=100;

cout <<"v BEFORE function = "<<v<<'\n';scope2();cout <<"v AFTER function = "<<v<<'\n';

}

slide slide 1 1 of of 22

Page 41: Functions g g Data Flow g Scope local global part II g Global Resolution Operator part II

Scope within a block - Ex. 2Scope within a block - Ex. 2

slide slide 2 2 of of 22

1. void scope2(void) //function header 2. { double v = 5.5; 3. int k, j; 4. cout << "v outside block = " << v <<'\n'; 5. for (k=1; k<=3; k++) 6. { int v = 17int v = 17; // initialized in

function 7. for (j=1; j<=2; j++) 8. { vv ++; 9. cout << "v inside block = " << vv <<'\

n';10. }11. }12. cout << "v outside block = " << v <<'\n';

}

Page 42: Functions g g Data Flow g Scope local global part II g Global Resolution Operator part II

Scope within a blockScope within a blockOUTPUT

100BEFORE

5.5 outside1818 insideinside1919 insideinside1818 insideinside1919 insideinside1818 insideinside1919 insideinside5.5 outside100 AFTER

j loops

j loops

}}}

*

}k loop

Page 43: Functions g g Data Flow g Scope local global part II g Global Resolution Operator part II

Global Resolution Operator Global Resolution Operator ::::

double rougon = 999.99; // global

void main(void){

double rougon = 12.3; // localcout<< rougon << “ = rougon, local\n”cout<< ::::rougon << “ = rougon, global\n”;

}

OUTPUTOUTPUT 12.3 = rougon, local 999.99 = rougon, global

* *

Page 44: Functions g g Data Flow g Scope local global part II g Global Resolution Operator part II

Variable Storage ClassesVariable Storage Classes

Localautostaticregister

while (){ int k = 1;

k++;

}

* * *

while (){ static int k = 1;

k++;

}

Page 45: Functions g g Data Flow g Scope local global part II g Global Resolution Operator part II

Global

static

extern

Variable Storage ClassesVariable Storage Classes

Page 46: Functions g g Data Flow g Scope local global part II g Global Resolution Operator part II

Scope Scope && Storage Classes - an example Storage Classes - an exampleint x = 1; // global variable

main(){ int x = 5; // local variable to main

cout << "local x in outer scope of main is " << x << endl;

{ // start new scope int x = 7;

cout << "local x in inner scope of main is " <<x<< endl; } // end new scope

cout << "local x in outer scope of main is " << x << endl;

Page 47: Functions g g Data Flow g Scope local global part II g Global Resolution Operator part II

Scope Scope && Storage Classes - an example Storage Classes - an example(continued)

a(); // a has automatic local x b(); // b has static local x c(); // c uses global x a(); // a reinitializes automatic local x b(); // static local x retains its previous value c(); // global x also retains its value

cout << "local x in main is " << x << endl;

return 0;} // end of main()

Page 48: Functions g g Data Flow g Scope local global part II g Global Resolution Operator part II

Scope Scope && Storage Classes - an example Storage Classes - an example

void a(void){ int x = 25; // initialized each time a is called

cout << endl << "local x in a is " << x << " after entering a" << endl; ++x; cout << "local x in a is " << x << " before exiting a" << endl;}

Page 49: Functions g g Data Flow g Scope local global part II g Global Resolution Operator part II

Scope Scope && Storage Classes - an example Storage Classes - an example

void b(void){ static int x = 50; // Static initialization only // first time b is called cout << endl << "local static x is " << x << " on entering b" << endl; ++x; cout << "local static x is " << x << " on exiting b" << endl;}

Page 50: Functions g g Data Flow g Scope local global part II g Global Resolution Operator part II

Scope Scope && Storage Classes - an example Storage Classes - an example

void c(void){ cout << endl << "global x is " << x << " on entering c" << endl; x *= 10; cout << "global x is " << x << " on exiting c" << endl;}

Page 51: Functions g g Data Flow g Scope local global part II g Global Resolution Operator part II

Scope Scope && Storage Classes - an example Storage Classes - an example

a(); // a has automatic local x b(); // b has static local x c(); // c uses global x a(); // a reinitializes automatic local x b(); // static local x retains its previous value c(); // global x also retains its value

a(); b(); c();

*

Page 52: Functions g g Data Flow g Scope local global part II g Global Resolution Operator part II

Scope Scope && Storage Classes - an example Storage Classes - an example

OUTPUTlocal 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

Page 53: Functions g g Data Flow g Scope local global part II g Global Resolution Operator part II

Scope Scope && Storage Classes - an example Storage Classes - an example

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

Page 54: Functions g g Data Flow g Scope local global part II g Global Resolution Operator part II

Scope Scope && Storage Classes - an example Storage Classes - an example

void a(void){ int x = 25; // initialized each time a is called

cout << endl << "local x in a is " << x << " after entering a" << endl; ++x; cout << "local x in a is " << x << " before exiting a" << endl;}

<< ‘\t’ << << ‘\t’ << ::::xx << endl;

*

Page 55: Functions g g Data Flow g Scope local global part II g Global Resolution Operator part II

Common ErrorsCommon Errors

Passing incorrect data typesPassing incorrect data types Using the same variable name for Using the same variable name for

different variablesdifferent variablesex. local - in both the calling andex. local - in both the calling and

called functions called functions

global - must use global - must use ::::

Page 56: Functions g g Data Flow g Scope local global part II g Global Resolution Operator part II

Common ErrorsCommon Errors

Wrong positioning of the called Wrong positioning of the called function prototypefunction prototype

Terminating a function header Terminating a function header with a with a ;;

Forgetting the data type of a Forgetting the data type of a function’s parameterfunction’s parameter

Page 57: Functions g g Data Flow g Scope local global part II g Global Resolution Operator part II

DebuggingDebugging

char = junk; char = junk; andand cin << junk; cin << junk;

Prevention - plan first!Prevention - plan first!Valuation tablesValuation tablesDisplay valuesDisplay values

Use Use FindFind or or ReplaceReplace for for ==== vs. vs. ==

C++ DebuggerC++ Debugger

Page 58: Functions g g Data Flow g Scope local global part II g Global Resolution Operator part II

“Heavier-than-air flying machines are impossible.”

Lord Kelvin,

President of the

Royal Society, 1895

End Note 1End Note 1

Page 59: Functions g g Data Flow g Scope local global part II g Global Resolution Operator part II

“If A = success, then the formula is

A = X + Y + Z.

X is work. Y is play. Z is keep your mouth shut.”

Albert Einstein

End Note 2End Note 2