modular programming chapter 6. 2 6.1 value and reference parameters t function declaration: void...

55
Modular Programming Chapter 6

Upload: eric-henry

Post on 27-Dec-2015

241 views

Category:

Documents


2 download

TRANSCRIPT

Modular Programming

Chapter 6

2

6.1 Value and Reference Parameters

Function declaration:

void computesumave(float num1, float num2, float& sum, float& average) {

…}

Function call:computeSumAve (x, y, sum, mean)

ACTUAL FORMAL x num1(input) y num2(input)

sum sum(output) mean average(output)

3

computeSumAve.cpp

// File: computeSumAve.cpp

#include <iostream>

using namespace std;

void computeSumAve (float, float, float&,

float&);

int main ()

{

float x,

y,

sum,

mean;

4

computeSumAve.cpp

cout << "Enter 2 numbers: ";

cin >> x >> y;

computeSumAve (x, y, sum, mean);

cout << " Sum is " << sum << endl;

cout << " Average is " << mean << endl;

return 0;

}

5

computeSumAve.cpp

// COMPUTES THE SUM AND AVERAGE OF NUM1 AND NUM2

// Pre: num1 and num2 are assigned values.

// Post: The sum and average of num1 and num2

// are computed and returned as function outputs.

void computesumave(float num1, float num2,

float& sum,

float& average)

{

sum = num1 + num2;

average = sum / 2.0;

}

6

Before Execution

7

After Execution

8

Call-by-Value and Call-by-Reference Parameters

Call by Value– Local function copy of actual argument values

Call by Reference (&)– memory address of actual argument

8

10

23445

-10100045

Call computeSumAve8

10

100

104

108112 112

108

computeSumAve

9

Call-by-Value and Call-by- Reference

& Call by Reference– Formal Argument in function heading– Argument list in function proto-type

Used to modify values in a function– Input– Output– Input/Output

Void functions that return results!

10

Call by Value

Local copy of argument made at time of the function call

Local copy used in function Modified local copy not actual value When finished local copy destroyed Actual value not changed

11

Call by Reference

Memory address of the actual argument is what is passed to the function

Because it is the address in memory of the actual argument you can modify its value

Data can flow into a function and out of the function

12

Protection and Usage of Value and Reference Parameters

Value arguments not changeable (or changeable without affecting caller)

Reference use could create a side effect If one return value is enough use value

arguments with a return If more than one return is needed use

reference arguments for the ones needing return values

13

Protection and Usage of Value and Reference Parameters

Typically use reference arguments in getData() type functions

Value arguments used with printing type functions

When a function must return more than one value a reference argument must be used

Avoid using reference arguments because of side effects (Large Projects)

14

Value and Reference Parameters

Expressions can be passed to functions– Always passed by value

– Only variables can be passed by reference Unallowed calls for: void f(int x, int y, float& b, int& a)

– f(10, m, b, m+n)

m+n can not be an output parameter!

– f(n+m, m, 12.6, m)

12.6 can not be an output parameter!

15

Function Syntax & Arguments

Correspondence between actual and formal arguments is determined by position in their respective argument lists. These lists must be the same size. The names of corresponding actual and formal arguments may be different

Formal arguments and corresponding actual arguments should agree with respect to type

For reference arguments, an actual argument must be a variable. For value arguments, an actual argument may be a variable, a constant or an expression

16

6.2 Functions with Output and Input Parameters

Now examine functions that have only output or inout (input/output) parameters.

testGetFrac.cpp– Data items are entered at the keyboard

sort3Numbers.cpp– Demonstrate multiple calls to a function with

inout parameters

17

testGetFrac.cpp

// File: testGetFrac.cpp

// Tests the fractions.

#include <iostream>

using namespace std;

getFrac(int&, int& );

int main()

{

18

testGetFrac.cpp

int num,denom;

cout << "Enter a common fraction "

<< "as 2 integers separated by a slash: ";

getFrac(num, denom);

cout << "Fraction read is " << num << " / " << denom << endl;

return 0;

}

19

testGetFrac.cpp

// Reads a fraction.

// Pre: none

// Post: numerator returns fraction numerator,

// denominator returns fraction denominator

void getFrac(int& numerator, int& denominator)

{

char slash;

// Read the fraction

cin >> numerator >> slash >> denominator;

}

20

testGetFrac.cpp

Program Output

Enter a fraction as 2 integers separated by a slash :

3 / 4

The Fraction is : 3 / 4

21

sort3Numbers.cpp

// FILE: sort3Numbers.cpp

// READS THREE FLOATING POINT NUMBERS AND SORTS

// THEM IN ASCENDING ORDER

#include <iostream>

using namespace std;

// SORTS A PAIR OF NUMBERS

void order(float&, float&);

int main ()

{

22

sort3Numbers.cpp

// Local data ...

float num1, num2, num3;

// Read and sort numbers.

cout << "Enter 3 numbers to sort:";

cin >> num1 >> num2 >> num3;

order (num1, num2);

order (num1, num3);

order (num2, num3);

23

sort3Numbers.cpp

// Display results.

cout << "The three numbers in order are:" <<

endl;

cout << num1 << " " << num2 << " " << num3 <<

endl;

return 0;

}

24

sort3Numbers.cpp

// SORTS A PAIR OF NUMBERS REPRESENTED BY x AND y

void order(float& x, float& y)

// Pre: x and y are assigned values.

// Post: x is the smaller of the pair and y is

// the larger.

{

// Local data ...

float temp;

25

sort3Numbers.cpp

// Compare x and y and exchange values if not

// properly ordered.

if (x > y)

{

temp = x;

x = y;

y = temp;

}

}

26

sort3Numbers.cpp

Program Output

Enter 3 numbers to be sorted separated by spaces:

7.5 9.6 5.5

The three numbers in order are:

5.5 7.5 9.6

27

Sort3Numbers.cpp

28

6.3 Stepwise Design with Functions

Use functions as building blocks in design Start small and add functions compiling as

you go Case study the sum and average problem Classic Stepwise design steps

29

Stepwise Design with Functions

Problem statement Problem analysis Program design Program implementation Test and verification

30

Case Study Structure Chart

C a se S tu d y S truc tu re C h a rt

R ea d then u m b er o fd a ta item s

C o m p u teth e sum

C o m p u teth e a ve ra ge

P rin t th e suma nd thea vera ge

C o m p ute an d p rin t th e suma n d a ve rag e o f a co lle ctiono f flo a tin g p o in t d a ta ite m s

ComputeSum ComputeAve PrintSumAve

31

computeSumAve.cpp

// File: computeSumAve.cpp

// Computes and prints the sum and average of

// a collection of data.

// File: computeSumAveFunctions

// Computes the sum and average of a collection

// of data

#include <iostream>

using namespace std;

32

computeSumAve.cpp

// Functions used ...

// Computes sum of data

float computeSum (int);

// Computes average of data

float computeAve (int, float);

// Prints number of items, sum, and average

void printSumAve (int, float, float);

33

computeSumAve.cpp

int main()

{

// Local data . . .

int numItems;

float sum;

float average;

// Read the number of items to process.

cout << "Enter the number of items to

process:";

cin >> numItems;

34

computeSumAve.cpp

// Compute the sum of the data.

sum = computeSum(numItems);

// Compute the average of the data.

average = computeAve(numItems, sum);

// Print the sum and the average.

printSumAve(numItems, sum, average);

return 0;

}

35

computeSumAve.cpp

// Insert definitions for functions computeSum,

// computeAve, and printSumAve here.

// Computes sum of data.

// Pre: numItems is assigned a value.

// Post: numItems data items read; their sum

// is stored in sum.

// Returns: Sum of all data items read if

// numItems >= 1; otherwise, 0.

float computeSum (int numItems)

{

36

computeSumAve.cpp

// Local data ...

float item;

float sum;

// Read each data item and accumulate it in

// sum.

sum = 0.0;

for (int count = 0; count < numItems; count++)

{

cout << "Enter a number to be added: ";

cin >> item;

sum += item;

} // end for

37

computeSumAve.cpp

return sum;

} // end computeSum

// Computes average of data

// Pre: numItems and sum are defined; numItems

// must be greater than 0.

// Post: If numItems is positive, the average is

// computed as sum / numItems;

// Returns: The average if numItems is positive;

// otherwise, 0.

38

computeSumAve.cpp

float computeAve (int numItems, float sum)

{

// Compute the average of the data.

if (numItems < 1)

{

cout << "Invalid value for numItems = " <<

numItems << endl;

cout << "Average not computed." << endl;

return 0.0;

} // end if

return sum / numItems;

} // end computeAve

39

computeSumAve.cpp

// Prints number of items, sum, and average of

// data

// Pre: numItems, sum, and average are defined.

// Post: Displays numItems, sum and average if

// numItems > 0.

void printSumAve (int numItems, float sum,

float average)

{

// Display results if numItems is valid.

if (numItems > 0)

{

40

computeSumAve.cpp

cout << "The number of items is " <<

numItems << endl;

cout << "The sum of the data is " <<

sum << endl;

cout << "The average of the data is " <<

average << endl;

}

else

{

cout << "Invalid number of items = " <<

numItems << endl;

41

computeSumAve.cpp

cout <<

"Sum and average are not defined." << endl;

cout <<

"No printing done. Execution terminated." <<

endl;

} // end if

} // end printSumAve

42

computeSumAve.cpp

Program OutputEnter the number of items to be processed: 3

Enter a number to be added: 5

Enter a number to be added: 6

Enter a number to be added: 17

The number of items is 3

The sum of the data is 28.00

The average of the data is 9.3333

43

6.4 Using Objects with Functions

Two ways to use functions to process objects Member function modifies the objects

attributes– testString.remove (0, 5);

Pass object as a function argument– Passing string object in function doReplace.cpp

44

moneyToNumberTest.cpp

// File: MoneyToNumberTest.cpp

// Tests function moneyToNumberString

#include <string>

#include <iostream>

using namespace std;

// Function prototype

void moneyToNumberString(string&);

45

moneyToNumberTest.cpp

int main()

{

string mString;

cout << "Enter a dollar amount with $

and commas: ";

cin >> mString;

moneyToNumberString(mString);

cout << "The dollar amount as a number is " <<

mString << endl;

46

moneyToNumberTest.cpp

return 0;

}

// Removes the $ and commas from a money string.

// Pre: moneyString is defined and may contain

// commas and begin with $ or -$.

// Post: $ and all commas are removed from

// moneyString.

void moneyToNumberString (string& moneyString)

{

47

moneyToNumberTest.cpp

{ // Local data . . . int posComma; // position of next comma

// Remove $ from moneyString if (moneyString.at(0) == '$') moneyString.erase(0, 1); else if (moneyString.find("-$") == 0) moneyString.erase(1, 1);

// Remove all commas posComma = moneyString.find(",");

48

moneyToNumberTest.cpp

while (posComma >= 0 && posComma <

moneyString.length())

{

moneyString.erase(posComma, 1);

posComma = moneyString.find(",");

}

} // end moneyToNumberString

49

6.5 Debugging and Testing a Program System

Top-Down testing– Stub, for example, a dummy function instead of the

function itself– Large projects– Stubs for all functions not finished (substitute for a

specific function) just a heading without any details other than some type of message

Bottom-Up testing – Driver used by developer to test full functionality of

their function

50

Debugging and Testing a Program System

Debugging Tips for Program Systems– Carefully document each function parameter and

local variable using comments as you write the code. Also describe the function’s purpose using comments.

– Create a trace of execution by displaying the function name as you enter it.

– Trace or display the values of all input and input/output parameters upon entry to a function. Check that these values make sense.

51

Debugging a Program System

Debugging Tips for Program Systems– Make sure that the function stub assigns a value to

each output parameter.

Identifier Scope and Watch Window Variables

52

Testing

Static methods:– Code inspection

• Goals: e.g. is specification “=“ implementation?, were standards used?

• Expert team examines program system thoroughly and using a formal plan (e.g. moderator, authors, experts)

– Review• Same as inspection, less formal

– Walkthrough• Less structured; e.g. author reads and experts ask questions

spontaneously

– Pair programming• Two programmers from the beginning

53

Testing

Dynamic methods:– White box testing

• Tester (e.g. developer) has the source code

• Examples of policies based on flow chart (FC)– Statement coverage: Number of executions (NE) a any node in FC >= 1

– Branch coverage: NE of any branch in FC >= 1

– Condition coverage: Any condition >= 1 time “true” AND 1 time “false”

– Path coverage: Each path in FC should have been executed at least 1 time

– Black box testing• Tester (e.g. from test department) does not have the source code, only object

code (as a black box)

• Specification of program system is needed

54

Testing

Examples (White Box Testing)– Program segment for maximum:

cin >> x; cin >> y; max = 0;

if(x <= y) max = y;

cout << “Maximum is “ << max;

– Statement coverage:• Test set = {(2, 5)} satisfies

policy

• However, program is faulty !!!

– Condition coverage: Maximum of 3 numberscin >> x; cin >> y; cin >> z; max = 0;if(x >= y) max = x;else max = y; // right portion for two numbersif(z >= max) then max = z;else max = y; // here error, “else” not needed!cout << “Maximum is “ << max;

– Test set = {(2,1,3), (4,10,6)}

satisfies condition policy– But program is faulty for x > max(y,z)

55

6.7 Common Programming Errors

Argument inconsistencies with Call by Reference Arguments– Side effects

Forgetting & Argument type mismatch Argument positional errors or missing

arguments