Presentation is loading. Please wait.

Presentation is loading. Please wait.

Determinate Loop Pattern, Java's for Statement, and Scanner objects

Similar presentations


Presentation on theme: "Determinate Loop Pattern, Java's for Statement, and Scanner objects"— Presentation transcript:

1 Determinate Loop Pattern, Java's for Statement, and Scanner objects
2nd part of Chapter 6: Repetition

2 Algorithmic 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

4 Determinate 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 <= 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

5 General Form The 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.

6 Flow chart view of a for loop
Initial statement True False Loop test Iterative part update-step

7 Example 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 <= n; j = j + 1) { System.out.print("Enter number: "); // <- Repeat 3 int number = keyboard.nextInt(); // <- statements sum = sum + number; // <- n times } double average = sum / n; System.out.print("Average = " + average);

8 Code Demo: Use the debugger to trace this code
int n = 5; for (int j = 1; j <= n; j = j + 1) { System.out.println(j); } for (int k = 10; k >= 0; k = k - 2) { System.out.println(k);

9 Other Incrementing Operators
It is common to see determinate loops of this form where n is the number of repetitions for( int j = 1; j <= 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 n=n+1; or n+=1; n++; // n is now 2 n--; // n is now 1 again The expression count++ is equivalent to the more verbose count = count + 1;

10 Other 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; x = keyboard.nextInt(); // user enters 8

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 @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
public void testNum100s() { ControlFun cf = new ControlFun(); Scanner scanner0 = new Scanner("1 2 3"); Scanner scanner1 = new Scanner(" "); Scanner scanner3 = new Scanner(" "); 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 @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(" "); 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() < 0) { result += scanner.nextInt(); } return result;


Download ppt "Determinate Loop Pattern, Java's for Statement, and Scanner objects"

Similar presentations


Ads by Google