Title: Iteration
1Iteration
2Java looping
- Options
- while
- do-while
- for
- Allow programs to control how many times a
statement list is executed
3Averaging
- 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 - Dont how big of a list to process
- Need ability to repeat code as needed
4Averaging
- 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
5Averaging
- 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 run
- Enter positive numbers one per line.
- Indicate end of list with a negative number.
- 4.5
- 0.5
- 1.3
- -1
- Average 2.1
6- public class NumberAverage
- // main() application entry point
- public static void main(String args)
- // set up the input
- // prompt user for values
- // get first value
- // process values one-by-one
- while (value gt 0)
- // add value to running total
- // processed another value
- // prepare next iteration - get next value
-
- // display result
- if (valuesProcessed gt 0)
7- 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 gt 0)
- valueSum value
- valuesProcessed
- value stdin.nextDouble()
-
notice the format!
8While syntax and semantics
Expression
Action
while
(
)
9While semantics for averaging problem
// process values one-by-one while ( value gt 0 )
// add value to running total valueSum
value // we processed another
value valueProcessed // prepare to iterate
get the next input value stdin.nextDouble()
10While Semantics
Expression
false
true
Action
11Execution Trace
Suppose input contains 4.5 0.5 1.3 -1
Suppose input contains 4.5 0.5 1.3 -1
Suppose input contains 4.5 0.5 1.3 -1
Suppose input contains 4.5 0.5 1.3 -1
Suppose input contains 4.5 0.5 1.3 -1
0
valuesProcessed
1
2
3
4.5
valueSum
0
5.0
6.3
int valuesProcessed 0 double valueSum
0 double value stdin.nextDouble() while
(value gt 0) valueSum value valuesProces
sed value stdin.nextDouble() if
(valuesProcessed gt 0) double average
valueSum / valuesProcessed System.out.println("A
verage " average) else System.out.println
("No list to average")
int valuesProcessed 0 double valueSum
0 double value stdin.nextDouble() while
(value gt 0) valueSum value valuesProces
sed value stdin.nextDouble() if
(valuesProcessed gt 0) double average
valueSum / valuesProcessed System.out.println("A
verage " average)
value
4.5
0.5
1.3
-1
average
2.1
12Converting text to strictly lowercase
- 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) -
13Sample run
14Program trace
public static void main(String args)
Scanner stdin new Scanner (System.in) Syst
em.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() Syst
em.out.println("\nConversion is\n"
converted)
public static void main(String args)
Scanner stdin new Scanner (System.in) Syst
em.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() Syst
em.out.println("\nConversion is\n"
converted)
15Program trace
converted (currentConversion "\n")
16Converting text to strictly lowercase
- 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) -
17All your base are belong to us
- Flash animation
- Reference http//en.wikipedia.org/wiki/All_your_b
ase_are_belong_to_us
18Loop design
- Questions to consider in loop design and analysis
- What initialization is necessary for the loops
test expression? - What initialization is necessary for the loops
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?
19Reading a file
Scanner fileIn new Scanner (new File (filename)
)
20Reading 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
21Reading 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.o
ut.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 stream
Determine file name
Set up file stream
Process lines one by one
Get first line
Make sure got a line to process
Display current line
Get next line
Make sure got a line to process If not, loop is
done
Close the file stream
22The For Statement
currentTerm 1
int
for ( int i 0 i lt 5 i )
System.out.println(currentTerm)
currentTerm 2
23ForInit
ForExpr
true
false
Action
PostExpr
24for statement syntax
for
ForInit
ForExpression
ForUpdate
Action
(
)
25for 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!
- Well see when they are different below
26Variable 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
27Variable 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
28End of lecture on 1 November 2004
29Execution Trace
i
0
1
2
3
- System.out.println("i is " i)
-
- System.out.println("all done")
- System.out.println("i is " i)
-
- System.out.println("all done")
- i is 0
- i is 1
- i is 2
- all done
int i 0
i lt 3
i
for (
)
int i 0
i lt 3
i
Variable i has gone out of scope it is local
to the loop
30for vs. while
- An example when a for loop can be directly
translated into a while loop - int count
- for ( count 0 count lt 10 count )
- System.out.println (count)
-
- Translates to
- int count
- count 0
- while (count lt 10)
- System.out.println (count)
- count
31for vs. while
- An example when a for loop CANNOT be directly
translated into a while loop - for ( int count 0 count lt 10 count )
- System.out.println (count)
-
- Would translate as
- int count 0
- while (count lt 10)
- System.out.println (count)
- count
only difference
count is NOT defined here
count IS defined here
32for loop indexing
- Java (and C and C) indexes everything from zero
- Thus, a for loop like this
- for ( int i 0 i lt 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 lt 10 i ) ...
33Nested loops
- int m 2
- int n 3
- for (int i 0 i lt n i)
- System.out.println("i is " i)
- for (int j 0 j lt m j)
- System.out.println(" j is " j)
-
-
- i is 0
- j is 0
- j is 1
- i is 1
- j is 0
- j is 1
- i is 2
- j is 0
- j is 1
34Nested loops
- int m 2
- int n 4
- for (int i 0 i lt n i)
- System.out.println("i is " i)
- for (int j 0 j lt i j)
- System.out.println(" j is " j)
-
-
- i is 0
- i is 1
- j is 0
- i is 2
- j is 0
- j is 1
- i is 3
- j is 0
- j is 1
- j is 2
35The 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
36Picking 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 behavior
- Enter a positive number 1129
- 9
- 2
- 1
- 1
37while 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
38while 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
39End of lecture on 3 November 2004
- We watched the Kerry concession speech and the
Bush acceptance speech in class today, so after
the announcements, we only got to about 20-25
minutes of actual lecture time
40A 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
41A 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
42Problem solving
43Data set manipulation
- Often five values of particular interest
- Minimum
- Maximum
- Mean
- Standard deviation
- Size of data set
- Lets 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.)
44Implication 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
45Implication 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
46Constructors
- 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
47Other 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
48Instance 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
49Example 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()
50Example 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()
51Example usage
52Fractals
53Methods getMinimum() and getMaximum()
- Straightforward implementations given correct
setting of instance variables - public double getMinimum()
- return minimumValue
-
- public double getMaximum()
- return maximumValue
-
54Method getSize()
- Straightforward implementations given correct
setting of instance variables - public int getSize()
- return n
-
-
-
55Method 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
-
-
56DataSet constructors
- Straightforward using clear() and load()
- public DataSet()
- clear()
-
- public DataSet(String s)
- load(s)
-
57Facilitator clear()
- public void clear()
- n 0
- xSum 0
- minimumValue Double.NaN
- maximumValue Double.NaN
-
58Facilitator add()
- public void addValue(double x)
- xSum x
- n
- if (n 1)
- minimumValue maximumValue x
-
- else if (x lt minimumValue)
- minimumValue x
-
- else if (x gt maximumValue)
- maximumValue x
-
-
59Facilitator 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
-
-