Title: Asserting Java, Ch 7: Repetition
1Determinate Loop Pattern, Java's for Statement,
and Scanner objects 2nd part of Chapter 6
Repetition
2Algorithmic Pattern The Determinate loop
- We often need to perform some action a specific
number of times - Produce 89 paychecks
- Count down to 0 (take 1 second of the clock).
- Simulate playing a game of "Let's Make a Deal"
10,000 times - The determinate loop pattern repeats some action
a specific number of times
3(No Transcript)
4Determinate Loops
- This template repeats a process n times
- replace comments with appropriate statements
- int n / how often we must repeat the
process / - for( int j 1 j lt n j j 1 )
- // the process to be repeated
-
- determinate loops must know the number of
repetitions before they begin - know exactly how many employees, or students, or
whatever that must be processed, for example
5General FormThe Java for loop
- for ( initial statement loop-test
update-step) - repeated-part
-
- When a for loop is encountered, the
initial-statement is executed (used here quite
often as int j 1). The loop-test evaluates. If
loop-test is false, the for loop terminates. If
loop-test is true, the repeated-part executes
followed by the update-step.
6Flow chart view of a for loop
Initial statement
True
False
Loop test
Iterative part
update-step
7Example for loop that produces an average
- Scanner keyboard new Scanner(System.in)
- double sum 0.0
- System.out.print("How many do you want to
average? ") - int n keyboard.nextInt()
- // Do something n times
- for (int j 1 j lt n j j 1)
- System.out.print("Enter number ") // lt-
Repeat 3 - int number keyboard.nextInt() // lt-
statements - sum sum number // lt- n times
-
- double average sum / n
- System.out.print("Average " average)
8Code Demo Use the debugger to trace this code
- int n 5
- for (int j 1 j lt n j j 1)
- System.out.println(j)
-
-
- for (int k 10 k gt 0 k k - 2)
- System.out.println(k)
-
-
9Other Incrementing Operators
- It is common to see determinate loops of this
form where n is the number of repetitions - for( int j 1 j lt n j )
- // ...
- The unary and -- operators add 1 and subtract
1 from their operands, respectively. - int n 0
- n // n is now 1 equivalent to nn1 or
n1 - n // n is now 2
- n-- // n is now 1 again
- The expression count is equivalent to the more
verbose count count 1
10Other Assignment Operators
- Java has several assignment operators in addition
to (- and ) - j - 2 is the equivalent of j j - 2
- sum x is the equivalent of sum sum x
- What is sum when a user enters 7 and 8?
- int sum 0
- int x 0
- System.out.print("Enter a number ")
- x keyboard.nextInt() // user enters 7
- sum x
- System.out.print("Enter a number ")
- x keyboard.nextInt() // user enters 8
- sum x
11 Indeterminate loop with a Scanner
- Sometimes a stream of input from the keyboard or
a file needs to be read until there is no more
data in the input stream - Consider a Scanner object constructed with a
String argument - The string represents an input stream
- You will need Scanner in project 2, methods 9 and
10 sumInScanner and maximumInScanner
12 These assertions pass
_at_Test public void showScanner() Scanner
scannerWithInts new Scanner("1 2 3")
assertEquals(1, scannerWithInts.nextInt())
assertEquals(2, scannerWithInts.nextInt())
assertEquals(3, scannerWithInts.nextInt())
Scanner scanner new
Scanner("There are five words here.")
assertEquals("There", scanner.next())
assertEquals("are", scanner.next())
assertEquals("five", scanner.next())
assertEquals("words", scanner.next())
assertEquals("here.", scanner.next())
13 A test method to test num100s
_at_Test public void testNum100s()
ControlFun cf new ControlFun() Scanner
scanner0 new Scanner("1 2 3") Scanner
scanner1 new Scanner("4 100 2 5") Scanner
scanner3 new Scanner("100 100 2 -3
5 3 2 -100 100") assertEquals(0,
cf.num100s(scanner0)) assertEquals(1,
cf.num100s(scanner1)) assertEquals(3,
cf.num100s(scanner3))
14 Answer
public int num100s (Scanner scanner) int
result 0 while (scanner.hasNextInt())
int next scanner.nextInt() if (next
100) result return
result
15 Careful using next too often!
- These assertions should pass with the code that
follows on the next slide
_at_Test public void testSumOfNegs()
ControlFun cf new ControlFun() Scanner
scanner0 new Scanner("1 2 3") Scanner
scannerA new Scanner("1 -2 3") Scanner
scannerB new Scanner("-4 1 -2 3")
assertEquals(0, cf.sumOfNegatives(scanner0))
assertEquals(-2, cf.sumOfNegatives(scannerA))
assertEquals(-6, cf.sumOfNegatives(scannerB))
16 What's wrong with this method?
public int sumOfNegatives(Scanner scanner)
int result 0 while
(scanner.hasNextInt()) if
(scanner.nextInt() lt 0) result
scanner.nextInt() return
result