880 likes | 918 Views
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
E N D
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 • 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
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 • 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 NumberAverage.java
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 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
Suppose input contains: 4.5 0.5 -1 Execution Trace 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"); } Service.java
Suppose input contains: 4.5 0.5 -1 Execution Trace valuesProcessed 0 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"); }
Suppose input contains: 4.5 0.5 -1 Execution Trace valuesProcessed 0 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"); } valueSum 0
Suppose input contains: 4.5 0.5 -1 Execution Trace valuesProcessed 0 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"); } valueSum 0 value 4.5
Suppose input contains: 4.5 0.5 -1 Execution Trace valuesProcessed 0 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"); } valueSum 0 value 4.5
Suppose input contains: 4.5 0.5 -1 Execution Trace valuesProcessed 0 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"); } valueSum 0 4.5 value 4.5
Suppose input contains: 4.5 0.5 -1 Execution Trace valuesProcessed 0 1 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"); } valueSum 4.5 value 4.5
Suppose input contains: 4.50.5 -1 Execution Trace valuesProcessed 1 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"); } valueSum 4.5 value 4.5 0.5
Suppose input contains: 4.50.5 -1 Execution Trace valuesProcessed 1 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"); } valueSum 4.5 value 0.5
Suppose input contains: 4.50.5 -1 Execution Trace valuesProcessed 1 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"); } valueSum 4.5 5.0 value 0.5
Suppose input contains: 4.50.5 -1 Execution Trace valuesProcessed 1 2 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"); } valueSum 5.0 value 0.5
Suppose input contains: 4.50.5-1 Execution Trace valuesProcessed 2 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"); } valueSum 5.0 value 1.3 -1
Suppose input contains: 4.50.5-1 Execution Trace valuesProcessed 2 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"); } valueSum 5.0 value -1
Suppose input contains: 4.50.5-1 Execution Trace valuesProcessed 2 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"); } valueSum 5.0 value -1
Suppose input contains: 4.50.5-1 Execution Trace valuesProcessed 2 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"); } valueSum 5.0 value -1 average 2.5
Suppose input contains: 4.50.51.3-1 Execution Trace valuesProcessed 2 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"); } valueSum 5.0 value -1 average 2.5
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?
Sentinel • For some input data sets there is no reasonable sentinel value • Examples • Process a series of arbitrary numbers • Processing lines of arbitrary text • What can we do? • Use Scanner methods and an operating system sentinel • hasNext() • hasNextInt() • ... • We will only use hasNext() • MSDOS sentinel Unix sentinel MAC sentinel • CTRL-Z CTRL-D ?
Reading a file • Background
Reading a file • Class File • Provides a system-independent way of representing a file name • Constructor File(String s) • Creates a File with name s • Name can be either an absolute pathname or a pathname relative to the current working folder
Echoing a file Scanner stdin = Scanner.create(System.in); System.out.print("Filename: "); String filename = stdin.next(); File file = new File(filename); Scanner fileIn = Scanner.create(file); while (fileIn.hasNext()) { String currentLine = fileIn.nextLine(); System.out.println(currentLine); } fileIn.close();
Reading a file Scanner stdin = Scanner.create(System.in); System.out.print("Filename: "); String filename = stdin.next(); File file = new File(filename); Scanner fileIn = Scanner.create(file); while (fileIn.hasNext()) { String currentLine = fileIn.nextLine(); System.out.println(currentLine); } fileIn.close(); Set up standard input stream
Reading a file Scanner stdin = Scanner.create(System.in); System.out.print("Filename: "); String filename = stdin.next(); File file = new File(filename); Scanner fileIn = Scanner.create(file); while (fileIn.hasNext()) { String currentLine = fileIn.nextLine(); System.out.println(currentLine); } fileIn.close(); Determine file name
Reading a file Scanner stdin = Scanner.create(System.in); System.out.print("Filename: "); String filename = stdin.next(); File file = new File(filename); Scanner fileIn = Scanner.create(file); while (fileIn.hasNext()) { String currentLine = fileIn.nextLine(); System.out.println(currentLine); } fileIn.close(); Determine the associated file
Reading a file Scanner stdin = Scanner.create(System.in); System.out.print("Filename: "); String filename = stdin.next(); File file = new File(filename); Scanner fileIn = Scanner.create(file); while (fileIn.hasNext()) { String currentLine = fileIn.nextLine(); System.out.println(currentLine); } fileIn.close(); Set up file stream
Reading a file Scanner stdin = Scanner.create(System.in); System.out.print("Filename: "); String filename = stdin.next(); File file = new File(filename); Scanner fileIn = Scanner.create(file); while (fileIn.hasNext()) { String currentLine = fileIn.nextLine(); System.out.println(currentLine); } fileIn.close(); Process lines one by one
Reading a file Scanner stdin = Scanner.create(System.in); System.out.print("Filename: "); String filename = stdin.next(); File file = new File(filename); Scanner fileIn = Scanner.create(file); while (fileIn.hasNext()) { String currentLine = fileIn.nextLine(); System.out.println(currentLine); } fileIn.close(); Is there any text
Reading a file Scanner stdin = Scanner.create(System.in); System.out.print("Filename: "); String filename = stdin.next(); File file = new File(filename); Scanner fileIn = Scanner.create(file); while (fileIn.hasNext()) { String currentLine = fileIn.nextLine(); System.out.println(currentLine); } fileIn.close(); Get the next line of text
Reading a file Scanner stdin = Scanner.create(System.in); System.out.print("Filename: "); String filename = stdin.next(); File file = new File(filename); Scanner fileIn = Scanner.create(file); while (fileIn.hasNext()) { String currentLine = fileIn.nextLine(); System.out.println(currentLine); } fileIn.close(); Display current line
Reading a file Scanner stdin = Scanner.create(System.in); System.out.print("Filename: "); String filename = stdin.next(); File file = new File(filename); Scanner fileIn = Scanner.create(file); while (fileIn.hasNext()) { String currentLine = fileIn.nextLine(); System.out.println(currentLine); } fileIn.close(); Make sure there is another to process If not, loop is done
Reading a file Scanner stdin = Scanner.create(System.in); System.out.print("Filename: "); String filename = stdin.next(); File file = new File(filename); Scanner fileIn = Scanner.create(file); while (fileIn.hasNext()) { String currentLine = fileIn.nextLine(); System.out.println(currentLine); } fileIn.close(); Close the stream
Execution Trace for (int i = 0; i < 3; ++i) { System.out.println("i is " + i); } System.out.println("all done"); i 0
Execution Trace for (int i = 0; i < 3; ++i) { System.out.println("i is " + i); } System.out.println("all done"); i 0
Execution Trace for (int i = 0; i < 3; ++i) { System.out.println("i is " + i); } System.out.println("all done"); i is 0 i 0
Execution Trace for (int i = 0; i < 3; ++i) { System.out.println(“i is " + i); } System.out.println(“all done"); i is 0 i 0