chapter 6, part 1 - university of arizonamercer/presentations/06-repetition.pdf · the determinate...

18
Chapter 6, Part 1 While Loops Asserting Java © Rick Mercer

Upload: lamkhue

Post on 15-May-2018

219 views

Category:

Documents


2 download

TRANSCRIPT

Chapter 6, Part 1

While Loops

Asserting Java© Rick Mercer

Algorithmic Pattern: The Determinate loop

wWe often need to perform some action a specific number of times: — Produce 89 paychecks.— Count down to 0 (take 1 second of the clock).— Compute grades for 81 students

wThe determinate loop pattern repeats some action a specific number of times.

Pattern: Determinate Loop Problem: Do something exactly n times, where n is known in

advance. Algorithm determine n

repeat the following n times { perform these actions }

Code Example:

System.out.print("Enter n: "); int n = keyboard.nextInt(); int count = 1; while(count <= n) { System.out.print("Enter number: "); number = keyboard.nextInt(); sum = sum + number; count = count + 1; }

Determinate Loops

w The determinate loop pattern can be implemented with the Java while loop

w This template executes some statements n times:

— determinate loops must know the number of repetitions beforethey begin: know exactly how many employees, or students, or whatever that must be processed, for example

int n = 0; /* how often we must repeat */int counter = 1;while (counter <= n) {// TODO: Add the steps to be repeatedcounter = counter + 1;

}

While loop output

w What is the output?

int j = 1;int n = 5;while (j <= n) {System.out.print(j + " ");j = j + 1;

}

j = 10;while (j >= 0) {System.out.print(j + " ");j = j - 3;

}

Problem SolvingThe Fibonacci numbers are a sequence of integers in which the first two elements are 1, and each following element is the sum of the two preceding elements. Write int fib(int n) to return the nth Fibonacci number.

@Testpublic void testFib() {LoopFun loops = new LoopFun();assertEquals(1, loops.fib(1));assertEquals(1, loops.fib(2));assertEquals(2, loops.fib(3));assertEquals(3, loops.fib(4));assertEquals(5, loops.fib(5));assertEquals(8, loops.fib(6));assertEquals(13, loops.fib(7));assertEquals(21, loops.fib(8));

}

Indeterminate Loops

wDeterminate loops have a limitation— We must know n (the number of repetitions) in

advance

wMany situations need us to repeat a set of statements an unspecified number of times: — Processing report cards for every student in a school

(or paychecks for all employees, or...)— Allowing 1 to many ATM transactions— Asking the user for specific input and allowing re-entry

of input after invalid inputs

Some things that terminate indeterminate loops

w An indeterminate loop repeats a process until some stopping event terminates the repetition

w There are many such events, but we'll focus on these:— User enters a special value indicating end of data— A logical expression becomes false— The Grid's mover hits the wall or an edge— The end of a file is encountered

w Indeterminate loops do not need to know n in advancew Indeterminate loops can actually determine n

An indeterminate loop

w 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

w Consider using a special value of the same type that is not meant to be processed— Perhaps a negative integer for tests that range from 0

through 100 only— Code Demo: Find the average of an unknown number

of inputs: use a sentinel such as -1

Pattern Indeterminate loop

Problem Some process must repeat an unknown numberof times so some event is needed to terminate the loop.

Algorithm while( the termination event has not occurred ) {Execute these actionsbring the loop closer to termination

}

Code while(myGrid.frontIsClear()) {Example myGrid.move( );

}

// Using random robot placement, instruct the // robot to get to the wall in front.//// This program needs Grid.java in the same project//public class MoveAroundTheGrid {

public static void main(String[] args) {// When using this 2 argument constructor, the// grid is surrounded by blocks with one "exit"// and the mover is facing a random direction// after being placed in a random location.Grid g = new Grid(10, 15);

// Always get to a wall or the lone exit if luckywhile (g.frontIsClear()) {g.move();

}}

}

While loop with a Scanner

wSometimes a stream of input from the keyboard or a file needs to be read until there is no more data in the input stream

wConsider a Scanner object constructed with a String argument — The string represents an input stream

These assertions pass

@Testpublic 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());

}

A test method to test num100s

@Testpublic void testNum100s() {

LoopFun lf = new LoopFun();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, lf.num100s(scanner0));assertEquals(1, lf.num100s(scanner1));assertEquals(3, lf.num100s(scanner3));

}

Answer

public int num100s (Scanner scanner) {int result = 0;while (scanner.hasNextInt()) {int next = scanner.nextInt();if (next == 100)

result++;}return result;

}

Careful using next too often!

wThese assertions should pass with the code that follows on the next slide

@Testpublic void testSumOfNegs() {ControlFun lf = 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, lf.sumOfNegatives(scanner0));assertEquals(-2, lf.sumOfNegatives(scannerA));assertEquals(-6, lf.sumOfNegatives(scannerB));

}

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;}