57
1 Iteration

Iteration

  • Upload
    koko

  • View
    23

  • Download
    0

Embed Size (px)

DESCRIPTION

Iteration. Java looping. Options while do-while for Allow programs to control how many times a statement list is executed. Averaging. Problem Extract a list of positive numbers from standard input and produce their average Numbers are one per line - PowerPoint PPT Presentation

Citation preview

Page 1: Iteration

1

Iteration

Page 2: Iteration

2

Java looping Options

while do-while for

Allow programs to control how many times a statement list is executed

Page 3: Iteration

3

Averaging Problem

Extract a list of positive numbers from standard input and produce their average Numbers are one per line A negative number acts as a sentinel to indicate that

there are no more numbers to process

Observations Cannot supply sufficient code using just assignments and

conditional constructs to solve the problem Don’t how big of a list to process

Need ability to repeat code as needed

Page 4: Iteration

4

Averaging Algorithm

Prepare for processing Get first input While there is an input to process do {

Process current input Get the next input

} Perform final processing

Page 5: Iteration

5

Averaging Problem

Extract a list of positive numbers from standard input and produce their average Numbers are one per line A negative number acts as a sentinel to indicate that

there are no more numbers to process

Sample runEnter positive numbers one per line.Indicate end of list with a negative number.4.50.51.3-1Average 2.1

Page 6: Iteration

public class NumberAverage {// main(): application entry pointpublic static void main(String[] args) {

// set up the input

// prompt user for values

// get first value

// process values one-by-onewhile (value >= 0) {

// add value to running total// processed another value// prepare next iteration - get next value

}

// display resultif (valuesProcessed > 0)

// compute and display averageelse

// indicate no average to display}

}

Page 7: Iteration

int valuesProcessed = 0;double valueSum = 0;

// set up the input

Scanner stdin = new Scanner (System.in);

// prompt user for values

System.out.println("Enter positive numbers 1 per line.\n" + "Indicate end of the list with a negative number.");

// get first value

double value = stdin.nextDouble();

// process values one-by-one

while (value >= 0) {valueSum += value;++valuesProcessed;value = stdin.nextDouble();

}

// display result

if (valuesProcessed > 0) {double average = valueSum / valuesProcessed;System.out.println("Average: " + average);

} else {System.out.println("No list to average");

}

notice the format!

Page 8: Iteration

8

While syntax and semantics

Logical expression thatdetermines whether Action

is to be executed

while ( Expression ) Action

Action is either a singlestatement or a statement

list within braces

Page 9: Iteration

9

While semantics for averaging problem

// process values one-by-onewhile ( value >= 0 ) {

// add value to running totalvalueSum += value;

// we processed another value++valueProcessed;

// prepare to iterate – get the next inputvalue = stdin.nextDouble();

}

Test expression is evaluated at thestart of each iteration of the loop.

If test expression is true, these statementsare executed. Afterward, the test expression

is reevaluated and the process repeats

Page 10: Iteration

10

While Semantics

Expression

Action

true false

Expression isevaluated at the

start of eachiteration of the

loop

If Expression istrue, Action is

executed If Expression isfalse, program

executioncontinues with

next statement

Page 11: Iteration

11

int valuesProcessed = 0;double valueSum = 0;

double value = stdin.nextDouble();

while (value >= 0) {valueSum += value;++valuesProcessed;value = stdin.nextDouble();

}

if (valuesProcessed > 0) {double average = valueSum / valuesProcessed;System.out.println("Average: " + average);

}else {

System.out.println("No list to average");}

int valuesProcessed = 0;double valueSum = 0;

double value = stdin.nextDouble();

while (value >= 0) {valueSum += value;++valuesProcessed;value = stdin.nextDouble();

if (valuesProcessed > 0) {double average = valueSum / valuesProcessed;System.out.println("Average: " + average);

Execution Trace

Suppose input contains: 4.5 0.5 1.3 -1

0valuesProcessed

valueSum 0

value 4.5

Suppose input contains: 4.5 0.5 1.3 -1

4.5

1

Suppose input contains: 4.5 0.5 1.3 -1

0.5

5.0

2

1.3

6.3

Suppose input contains: 4.5 0.5 1.3 -1

3

-1

Suppose input contains: 4.5 0.5 1.3 -1

average 2.1

Page 12: Iteration

12

Converting text to strictly lowercasepublic static void main(String[] args) {

Scanner stdin = new Scanner (System.in);

System.out.println("Enter input to be converted:");

String converted = "";

String currentLine = stdin.nextLine();

while (currentLine != null) {String currentConversion =

currentLine.toLowerCase();converted += (currentConversion + "\n");currentLine = stdin.nextLine();

}

System.out.println("\nConversion is:\n" +

converted);}

Page 13: Iteration

13

Sample run

A Ctrl+z wasentered. It is theWindows escape

sequence forindicatingend-of-file

An empty linewas entered

Page 14: Iteration

14

Program tracepublic static void main(String[] args) {

Scanner stdin = new Scanner (System.in);

System.out.println("Enter input to be converted:");

String converted = "";

String currentLine = stdin.nextLine();

while (currentLine != null) {String currentConversion =

currentLine.toLowerCase();converted += (currentConversion + "\n");currentLine = stdin.nextLine();

}

System.out.println("\nConversion is:\n" +

converted);}

public static void main(String[] args) {Scanner stdin = new Scanner (System.in);

System.out.println("Enter input to be converted:");

String converted = "";

String currentLine = stdin.nextLine();

while (currentLine != null) {String currentConversion =

currentLine.toLowerCase();converted += (currentConversion + "\n");currentLine = stdin.nextLine();

}

System.out.println("\nConversion is:\n" +

converted);}

Page 15: Iteration

15

Program trace

Representation of lower caseconversion of current input line

converted += (currentConversion + "\n");

The append assignment operator updates the representationof converted to include the current input line

Newline character is neededbecause method nextLine()

"strips" them from the input

Page 16: Iteration

16

Converting text to strictly lowercasepublic static void main(String[] args) {

Scanner stdin = new Scanner (System.in);

System.out.println("Enter input to be converted:");

String converted = "";

String currentLine = stdin.nextLine();

while (currentLine != null) {String currentConversion =

currentLine.toLowerCase();converted += (currentConversion + "\n");currentLine = stdin.nextLine();

}

System.out.println("\nConversion is:\n" +

converted);}

Page 17: Iteration

17

All your base are belong to us

Flash animation Reference: http://en.wikipedia.org/wiki/All_your_base_are_belong_to_us

Page 18: Iteration

18

Loop design Questions to consider in loop design and analysis

What initialization is necessary for the loop’s test expression?

What initialization is necessary for the loop’s processing?

What causes the loop to terminate?

What actions should the loop perform?

What actions are necessary to prepare for the next iteration of the loop?

What conditions are true and what conditions are false when the loop is terminated?

When the loop completes what actions are need to prepare for subsequent program processing?

Page 19: Iteration

19

Reading a file Background

Same Scanner class!

Scanner fileIn = new Scanner (new File (filename) );

The File class allows access to filesIt’s in the java.io package

filename is a String

Page 20: Iteration

20

Reading a file Class File

Allows access to files (etc.) on a hard drive

Constructor File (String s) Opens the file with name s so that values can be

extracted Name can be either an absolute pathname or a pathname

relative to the current working folder

Page 21: Iteration

21

Reading a file

Scanner stdin = new Scanner (System.in);

System.out.print("Filename: ");String filename = stdin.nextLine();

Scanner fileIn = new Scanner (new File (filename));

String currentLine = fileIn.nextLine();

while (currentLine != null) {System.out.println(currentLine);

currentLine = fileIn.nextLine();}

Scanner stdin = new Scanner (System.in);

System.out.print("Filename: ");String filename = stdin.nextLine();

Scanner fileIn = new Scanner (new File (filename));

String currentLine = fileIn.nextLine();

while (currentLine != null) {System.out.println(currentLine);

currentLine = fileIn.nextLine();}

Set up standard input streamDetermine file nameSet up file streamProcess lines one by oneGet first lineMake sure got a line to processDisplay current lineGet next lineMake sure got a line to processIf not, loop is doneClose the file stream

Page 22: Iteration

22

The For Statement

currentTerm = 1;

for ( int i = 0; i < 5; ++i ) {System.out.println(currentTerm);currentTerm *= 2;}

After each iteration of thebody of the loop, the updateexpression is reevaluated

The body of the loop iterateswhile the test expression is

trueint

Initialization stepis performed onlyonce -- just prior

to the firstevaluation of thetest expression

The body of the loop displays thecurrent term in the number series.It then determines what is to be thenew current number in the series

Page 23: Iteration

ForExpr

Action

true false

ForInit

PostExpr

Evaluated onceat the beginning

of the forstatements's

executionThe ForExpr is

evaluated at thestart of each

iteration of theloop

If ForExpr is true,Action isexecuted

After the Actionhas completed,

thePostExpression

is evaluated

If ForExpr isfalse, program

executioncontinues with

next statement

After evaluating thePostExpression, the next

iteration of the loop starts

Page 24: Iteration

24

for statement syntax

Logical test expression that determines whether the action and update step areexecuted

for ( ForInit ; ForExpression ; ForUpdate ) Action

Update step is performed afterthe execution of the loop body

Initialization step prepares for thefirst evaluation of the test

expression

The body of the loop iterates wheneverthe test expression evaluates to true

Page 25: Iteration

25

for vs. while A for statement is almost like a while statement

for ( ForInit; ForExpression; ForUpdate ) Action

is ALMOST the same as:

ForInit;while ( ForExpression ) {

Action;ForUpdate;

}

This is not an absolute equivalence! We’ll see when they are different below

Page 26: Iteration

26

Variable declaration You can declare a variable in any block:

while ( true ) {int n = 0;n++;System.out.println (n);

}System.out.println (n);

Variable n gets created (and initialized) each time

Thus, println() always prints out 1

Variable n is not defined once while

loop ends

As n is not defined here, this causes

an error

Page 27: Iteration

27

Variable declaration You can declare a variable in any block:

if ( true ) {int n = 0;n++;System.out.println (n);

}System.out.println (n);

Only difference from last slide

Page 28: Iteration

29

System.out.println("i is " + i);}

System.out.println("all done");

System.out.println("i is " + i);}

System.out.println("all done");

i is 0i is 1i is 2all done

Execution Tracei 0int i = 0; i < 3; ++ifor ( ) {int i = 0; i < 3; ++i 123

Variable i has gone out of scope – it

is local to the loop

Page 29: Iteration

30

for vs. while An example when a for loop can be directly translated into a while

loop:

int count;for ( count = 0; count < 10; count++ ) {

System.out.println (count);}

Translates to:

int count;count = 0;while (count < 10) {

System.out.println (count);count++;

}

Page 30: Iteration

31

for vs. while An example when a for loop CANNOT be directly translated

into a while loop:

for ( int count = 0; count < 10; count++ ) {System.out.println (count);

}

Would translate as:

int count = 0;while (count < 10) {

System.out.println (count);count++;

}count IS defined here

count is NOT defined here

only difference

Page 31: Iteration

32

for loop indexing Java (and C and C++) indexes everything from zero

Thus, a for loop like this:

for ( int i = 0; i < 10; i++ ) { ... }

Will perform the action with i being value 0 through 9, but not 10

To do a for loop from 1 to 10, it would look like this:

for ( int i = 1; i <= 10; i++ ) { ... }

Page 32: Iteration

33

Nested loops

int m = 2;int n = 3;for (int i = 0; i < n; ++i) {

System.out.println("i is " + i);for (int j = 0; j < m; ++j) {

System.out.println(" j is " + j);}

}i is 0 j is 0 j is 1i is 1 j is 0 j is 1i is 2 j is 0 j is 1

Page 33: Iteration

34

Nested loops

int m = 2;int n = 4;for (int i = 0; i < n; ++i) {

System.out.println("i is " + i);for (int j = 0; j < i; ++j) {

System.out.println(" j is " + j);}

}

i is 0i is 1 j is 0i is 2 j is 0 j is 1i is 3

j is 0j is 1j is 2

Page 34: Iteration

35

The do-while statement Syntax

do Action while (Expression)

Semantics Execute Action If Expression is true then

execute Action again Repeat this process until

Expression evaluates to false

Action is either a single statement or a group of statements within braces

Action

true

false

Expression

Page 35: Iteration

36

Picking off digits Consider

System.out.print("Enter a positive number: ");int number = stdin.nextInt();do { int digit = number % 10; System.out.println(digit); number = number / 10;} while (number != 0);

Sample behaviorEnter a positive number: 11299211

Page 36: Iteration

37

while vs. do-while If the condition is false:

while will not execute the action do-while will execute it once

while ( false ) {System.out.println (“foo”);

}

do {System.out.println (“foo”);

} while ( false );

never executed

executed once

Page 37: Iteration

38

while vs. do-while A do-while statement can be translated into a while

statement as follows:

do {Action;

} while ( WhileExpression );

can be translated into:

boolean flag = true;while ( flag || WhileExpression ) {

flag = false;Action;

}

Page 38: Iteration

40

A digression: Perl again Consider the statement:

if ( !flag ) {...

} else {...

}

Perl has a command unless:

unless ( flag ) {...

} else {...

}

An unless command is a if statement with a negated condition

It can get a bit confusing, though The else of an unless…

Page 39: Iteration

41

A digression: Perl again Consider the statement:

while ( !flag ) {...

}

Perl has a command until:

until ( flag ) {...

}

An until command is a while loop with a negated condition

As most people are quite used to if-else and while, unless and until are rarely used

Page 40: Iteration

42

Problem solving

Page 41: Iteration

43

Data set manipulation Often five values of particular interest

Minimum Maximum Mean Standard deviation Size of data set

Let’s design a data set representation The data set represents a series of numbers Note that the numbers themselves are not remembered

by the DataSet Only properties of the set (average, minimum, etc.)

Page 42: Iteration

44

Implication on facilitators public double getMinimum()

Returns the minimum value in the data set. If the data set is empty, then Double.NaN is returned, where Double.NaN is the Java double value representing the status not-a-number

public double getMaximum() Returns the maximum value in the data set. If the data set

is empty, then Double.NaN is returned

Page 43: Iteration

45

Implication on facilitators public double getAverage()

Returns the average value in the data set. If the data set is empty, then Double.NaN is returned

public double getStandardDeviation() Returns the standard deviation value of the data set. If the

data set is empty, then Double.NaN is returned

Left to the interested student

public int getSize() Returns the number of values in the data set being

represented

Page 44: Iteration

46

Constructors public DataSet()

Initializes a representation of an empty data set

public DataSet(String s) Initializes the data set using the values from the file with

name s

public DataSet(File filep) Initializes the data set using the values from the file

represented by filep Left to interested student

Page 45: Iteration

47

Other methods public void addValue(double x)

Adds the value x to the data set being represented

public void clear() Sets the representation to that of an empty data set

public void load(String s) Adds the vales from the file with name s to the data set

being represented

public void load(File filep) Adds the vales from the file represented by filep to the

data set being represented Left to interested student

Page 46: Iteration

48

Instance variables private int n

Number of values in the data set being represented

private double minimumValue Minimum value in the data set being represented

private double maximumValue Maximum value in the data set being represented

private double xSum The sum of values in the data set being represented

Page 47: Iteration

49

Example usage

DataSet dataset = new DataSet("age.txt");System.out.println();System.out.println("Minimum: " + dataset.getMinimum());System.out.println("Maximum: " + dataset.getMaximum());System.out.println("Mean: " + dataset.getAverage());System.out.println("Size: " + dataset.getSize());System.out.println();dataset.clear();

dataset.load("stature.txt");System.out.println("Minimum: " + dataset.getMinimum());System.out.println("Maximum: " + dataset.getMaximum());System.out.println("Mean: " + dataset.getAverage());System.out.println("Size: " + dataset.getSize());System.out.println();dataset.clear();

Page 48: Iteration

50

Example usage

dataset.load("foot-length.txt");System.out.println("Minimum: " + dataset.getMinimum());System.out.println("Maximum: " + dataset.getMaximum());System.out.println("Mean: " + dataset.getAverage());System.out.println("Size: " + dataset.getSize());System.out.println();dataset.clear();

System.out.println("Minimum: " + dataset.getMinimum());System.out.println("Maximum: " + dataset.getMaximum());System.out.println("Mean: " + dataset.getAverage());System.out.println("Size: " + dataset.getSize());System.out.println();

Page 49: Iteration

51

Example usage

Page 50: Iteration

52

Fractals

Page 51: Iteration

53

Methods getMinimum() and getMaximum()

Straightforward implementations given correct setting of instance variables

public double getMinimum() {return minimumValue;

}

public double getMaximum() {return maximumValue;

}

Page 52: Iteration

54

Method getSize()

Straightforward implementations given correct setting of instance variables

public int getSize() {return n;

}

Page 53: Iteration

55

Method getAverage()

Need to take into account that data set might be empty

public double getAverage() {if (n == 0) {

return Double.NaN;}else {

return xSum / n;}

}

Page 54: Iteration

56

DataSet constructors

Straightforward using clear() and load()

public DataSet() {clear();

}

public DataSet(String s) { load(s);

}

Page 55: Iteration

57

Facilitator clear()

public void clear() {n = 0;xSum = 0;minimumValue = Double.NaN;maximumValue = Double.NaN;

}

Page 56: Iteration

58

Facilitator add()

public void addValue(double x) {xSum += x;++n;if (n == 1) {

minimumValue = maximumValue = x;}else if (x < minimumValue) {

minimumValue = x;}else if (x > maximumValue) {

maximumValue = x;}

}

Page 57: Iteration

59

Facilitator load()public void load(String s) {

// get a reader for the file Scanner fileIn = new Scanner (new File(s));

// add values one by one String currentLine = fileIn.nextLine();while (currentLine != null) {

double x = Double.parseDouble(currentLine);

addValue(x);currentLine = fileIn.nextLine();

}

// close up file

}