View
221
Download
0
Category
Tags:
Preview:
Citation preview
FunctionsFunctions Data Flow Scope
local global
Global Resolution Operator part IIpart 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.
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 */
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
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’;}
*
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 &
*
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;
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++;
}
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);
}
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
* *
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
*
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
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';}
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’;}
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);
}
void Mix( /* ______ */ int& green,
/* ______ */ int yellow )
int Blend( /* ______ */ int red,
/* ______ */ int green )
I/O ExampleI/O Example
inout
in
in
in
* * * *
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.
I/O ExampleI/O Example
Mix memory Main
green red
blue
yellow
purplepurple
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
*
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.
ScopeScopeThe section of the program where the variable
is valid (known or visible).
local = available to only one function
global = available several functions
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.
* *
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
* * * *
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";
}
ScopeScope
OUTPUTx = 3 before the function call.r = 4 within the function. x = 4 after the function call.
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.
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
* * * *
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
Example Example - ReadOne
void ReadOne( /* */ char number,
/* */ int& item )
{
cout << "Enter value " << number << ": ";
cin >> item;
return;
}
* *
in
out
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
Example Example - Average
float Average( /* */ int item1, /* */ int item2,
/* */ int item3 )
{
int total;
total = item1 + item2 + item3;
return float(total) / 3;
}
* *
in in
in
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
ReadValues Adjust Average WriteResults
ReadOne
Main
Enter value 1: 23Enter value 2: 56Enter value 3: 78Adjusted values: 0, 33, 55Sum: 88 Average: 29.3333
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';}
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
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
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. . .
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
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
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
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';
}
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
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
* *
Variable Storage ClassesVariable Storage Classes
Localautostaticregister
while (){ int k = 1;
k++;
}
* * *
while (){ static int k = 1;
k++;
}
Global
static
extern
Variable Storage ClassesVariable Storage Classes
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;
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()
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;}
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;}
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;}
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();
*
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
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
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;
*
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 ::::
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
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
“Heavier-than-air flying machines are impossible.”
Lord Kelvin,
President of the
Royal Society, 1895
End Note 1End Note 1
“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
Recommended