Survey
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
COS 312 DAY 4 Tony Gauvin Agenda • Questions? • Assignment 1 Corrected – 7 A’s – Few minor issues with style and conventions • Assignment 2 Posted – Due Feb 5 prior to class • Capstones proposals due Feb 5 – Can be a group project • Finish Using Classes and Objects (Chap 3 of text) • Begin Using Conditionals and Loops Ch 1 -2 Grading Criteria • Criteria 1 30 % Does the program compile with no errors or warnings? • Criteria 2 50% Does the program run and produce the intended outputs for the intended inputs? • Criteria 3 5% Is the Code properly Commented? • Criteria 4 5% Does the Code adhere to proper style and conventions for Java? • Criteria 5 10% Is the code an original creative work of the student? Using leveraged code without citation 0 Students submitting duplicate code as another student 0 Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 1-3 Style Convention Issues • No space between a method and it’s parameter list – System.out.println(“<- No Spaces”) • Identifiers must not start with a capital letter – myFirstInt not MyFirstInt • Spaces before after math operators – num1 + num2 not num1+num2 Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 1-4 The Halting Problem • Will a program run to conclusion for a given set of inputs? • Halting Theorem first proved to be unsolvable by Alan Turing (new movie The Imitation Game ) – https://www.youtube.com/watch?v=macM_MtS_w4 – https://www.youtube.com/watch?v=92WHN-pAFCs – http://www.cgl.uwaterloo.ca/~csk/halt/ – http://plus.maths.org/content/what-computers-cantdo Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 1-5 Chapter 3 Using Classes and Objects Formatting Ouput • It is often necessary to format values in certain ways so that they can be presented properly • The Java API contains classes that provide formatting capabilities • The NumberFormat class allows you to format values as currency or percentages • The DecimalFormat class allows you to format values based on a pattern • Both are part of the java.text package Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 3-7 Formatting Output • The NumberFormat class has static methods that return a formatter object getCurrencyInstance() getPercentInstance() • Each formatter object has a method called format that returns a string with the specified information in the appropriate format for the given computer Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 3-8 Formatting Output • Some methods of the NumberFormat class: http://docs.oracle.com/javase/7/docs/api/java/text/NumberFormat.html Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 3-9 //******************************************************************** // Purchase.java Java Foundations // // Demonstrates the use of the NumberFormat class to format output. //******************************************************************** import java.util.Scanner; import java.text.NumberFormat; public class Purchase { //----------------------------------------------------------------// Calculates the final price of a purchased item using values // entered by the user. //----------------------------------------------------------------public static void main(String[] args) { final double TAX_RATE = 0.06; // 6% sales tax int quantity; double subtotal, tax, totalCost, unitPrice; Scanner scan = new Scanner(System.in); NumberFormat fmt1 = NumberFormat.getCurrencyInstance(); NumberFormat fmt2 = NumberFormat.getPercentInstance(); Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 3 - 10 System.out.print("Enter the quantity: "); quantity = scan.nextInt(); System.out.print("Enter the unit price: "); unitPrice = scan.nextDouble(); subtotal = quantity * unitPrice; tax = subtotal * TAX_RATE; totalCost = subtotal + tax; // Print output with appropriate formatting System.out.println("Subtotal: " + fmt1.format(subtotal)); System.out.println("Tax: " + fmt1.format(tax) + " at " + fmt2.format(TAX_RATE)); System.out.println("Total: " + fmt1.format(totalCost)); } } Code\Chap3\Purchase.java Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 3 - 11 Formatting Output • The DecimalFormat class can be used to format a floating point value in various ways • For example, you can specify that the number should be truncated to three decimal places • The constructor of the DecimalFormat class takes a string that represents a pattern for the formatted number Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 3 - 12 Formatting Output • Some methods of the DecimalFormat class: http://docs.oracle.com/javase/7/docs/api/java/text/DecimalFormat.html Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 3 - 13 //******************************************************************** // CircleStats.java Java Foundations // // Demonstrates the formatting of decimal values using the // DecimalFormat class. //******************************************************************** import java.util.Scanner; import java.text.DecimalFormat; public class CircleStats { //----------------------------------------------------------------// Calculates the area and circumference of a circle given its // radius. //----------------------------------------------------------------public static void main(String[] args) { int radius; double area, circumference; Scanner scan = new Scanner(System.in); System.out.print("Enter the circle's radius: "); radius = scan.nextInt(); Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 3 - 14 area = Math.PI * Math.pow(radius, 2); circumference = 2 * Math.PI * radius; // Round the output to three decimal places DecimalFormat fmt = new DecimalFormat("0.###"); System.out.println("The circle's area: " + fmt.format(area)); System.out.println("The circle's circumference: " + fmt.format(circumference)); } } Code\Chap3\CircleStats.java Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 3 - 15 Enumerated Types • Java allows you to define an enumerated type, which can then be used to declare variables • An enumerated type establishes all possible values for a variable of that type • The values are identifiers of your own choosing • The following declaration creates an enumerated type called Season enum Season { winter, spring, summer, fall}; • Any number of values can be listed Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 3 - 16 Enumerated Types • Once a type is defined, a variable of that type can be declared Season time; and it can be assigned a value time = Season.fall; • The values are specified through the name of the type • Enumerated types are type-safe – you cannot assign any value other than those listed Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 3 - 17 Enumerated Types • Internally, each value of an enumerated type is stored as an integer, called its ordinal value • The first value in an enumerated type has an ordinal value of zero, the second one, and so on • However, you cannot assign a numeric value to an enumerated type, even if it corresponds to a valid ordinal value Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 3 - 18 Enumerated Types • The declaration of an enumerated type is a special type of class, and each variable of that type is an object • The ordinal method returns the ordinal value of the object • The name method returns the name of the identifier corresponding to the object's value Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 3 - 19 Example Enumerated Types Useful for creating a card game enum Suits {spade, clubs, hearts, diamonds} enum Face {ace, one, two, three, four, five, six, seven, eight, nine, ten, jack, queen, king} Useful for a chess game enum pieces {king, queen, rook, bishop, knight, pawn} Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 1 - 20 //******************************************************************** // IceCream.java Java Foundations // // Demonstrates the use of enumerated types. //******************************************************************** public class IceCream { enum Flavor {vanilla, chocolate, strawberry, fudgeRipple, coffee, rockyRoad, mintChocolateChip, cookieDough} //----------------------------------------------------------------// Creates and uses variables of the Flavor type. //----------------------------------------------------------------public static void main(String[] args) { Flavor cone1, cone2, cone3; cone1 = Flavor.rockyRoad; cone2 = Flavor.chocolate; System.out.println("cone1 value: " + cone1); System.out.println("cone1 ordinal: " + cone1.ordinal()); System.out.println("cone1 name: " + cone1.name()); Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 3 - 21 System.out.println(); System.out.println("cone2 value: " + cone2); System.out.println("cone2 ordinal: " + cone2.ordinal()); System.out.println("cone2 name: " + cone2.name()); cone3 = cone1; System.out.println(); System.out.println("cone3 value: " + cone3); System.out.println("cone3 ordinal: " + cone3.ordinal()); System.out.println("cone3 name: " + cone3.name()); } } Code\Chap3\IceCream.java Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 3 - 22 Wrapper Classes • The java.lang package contains wrapper classes that correspond to each primitive type: Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 3 - 23 Wrapper Classes • The following declaration creates an Integer object: Integer age = new Integer(40); • An object of a wrapper class can be used in any situation where a primitive value will not suffice • For example, some objects serve as collections of other objects • Primitive values could not be stored in such collections, but wrapper objects could be Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 3 - 24 Wrapper Classes • Wrapper classes also contain static methods that help manage the associated type • For example, the Integer class contains a method to convert an integer stored in a String to an int value: num = Integer.parseInt(str); • The wrapper classes often contain useful constants as well • For example, the Integer class contains MIN_VALUE and MAX_VALUE which hold the smallest and largest int values Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 3 - 25 Wrapper Classes • Some methods of the Integer class: http://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 3 - 26 Autoboxing • Autoboxing is the automatic conversion of a primitive value to a corresponding wrapper object Integer obj; int num = 42; obj = num; • The assignment creates the appropriate Integer object • The reverse conversion (called unboxing) also occurs automatically as needed • A analogy would be autoboxing is wrapping a primitive type to make it an object and unboxing is unwrapping a wrapper object to get the primitive type Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 3 - 27 Chapter 4 Conditionals and Loops Chapter Scope • • • • • • Flow of control Boolean expressions if and switch statements Comparing data while, do, and for loops Iterators Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 4 - 29 Flow of Control • Statement execution is linear unless specified otherwise • Some programming statements allow us to: – decide whether or not to execute a particular statement – execute a statement over and over, repetitively • These decisions are based on boolean expressions (or conditions) that evaluate to true or false • The order of statement execution is called the flow of control Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 4 - 30 Conditional Statements • A conditional statement lets us choose which statement will be executed next • Therefore they are sometimes called selection statements • Conditional statements give us the power to make basic decisions • The Java conditional statements are the – if statement – if-else statement – switch statement Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 4 - 31 The if Statement • The syntax of a basic if statement is: The condition must be a boolean expression. It must evaluate to either true or false. if is a Java reserved word if ( condition ) { statement; } If the condition is true, the statement is executed. If it is false, the statement is skipped. Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 4 - 32 Equality and Relational Operators • Often, conditions are based equality operators or relational operators: Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 4 - 33 Conditions • Examples of if statements: if (total == sum) System.out.println("total equals sum"); if (count > 50) System.out.println("count is more than 50"); if (letter != 'x') System.out.println("letter is not x"); Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 4 - 34 Logical Operators • Conditions can also use logical operators: • They all take boolean operands and produce boolean results • Logical NOT (!) is a unary operator (it operates on one operand) • Logical AND (&&) and logical OR (||) are binary operators (each operates on two operands) Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 4 - 35 Logical NOT • The logical NOT operation is also called logical negation or logical complement • If some boolean condition a is true, then !a is false; if a is false, then !a is true • Logical expressions can be shown using a truth table: Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 4 - 36 Logical AND and Logical OR • The logical AND expression a && b is true if both a and b are true, and false otherwise • The logical OR expression a || b is true if a or b or both are true, and false otherwise Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 4 - 37 Logical AND and Logical OR • A truth table shows all possible true-false combinations of the terms • Since && and || each have two operands, there are four possible combinations Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 4 - 38 Logical Operators • Expressions that use logical operators can form complex conditions if (total < MAX+5 && !found) System.out.println("processing…"); • All logical operators have lower precedence than the relational operators • Logical NOT has higher precedence than logical AND (&&) and logical OR (||) Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 4 - 39 Logical Operators • Specific expressions can be evaluated using truth tables: Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 4 - 40 Short-Circuited Operators • The processing of logical AND and logical OR is short-circuited • If the left operand is sufficient to determine the result, the right operand is not evaluated if (count != 0 && total/count > MAX) System.out.println("Testing"); • This type of processing must be used carefully Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 4 - 41 The if Statement • Consider the following if statement: if (sum > MAX) { delta = sum – MAX; } System.out.println("The sum is " + sum); • First the condition is evaluated -- the value of sum is either greater than the value of MAX, or it is not • If the condition is true, the assignment statement is executed -- if it isn’t, it is skipped. • Either way, the call to println is executed next Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 4 - 42 The if Statement • The logic of an if statement: Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 4 - 43 //******************************************************************** // Age.java Java Foundations // // Demonstrates the use of an if statement. //******************************************************************** import java.util.Scanner; public class Age { //----------------------------------------------------------------// Reads the user's age and prints comments accordingly. //----------------------------------------------------------------public static void main(String[] args) { final int MINOR = 21; Scanner scan = new Scanner(System.in); System.out.print("Enter your age: "); int age = scan.nextInt(); System.out.println("You entered: " + age); if (age < MINOR) { System.out.println("Youth is a wonderful thing. Enjoy."); } System.out.println("Age is a state of mind."); } } Java Foundations, 3rd Edition, Lewis/DePasquale/Chase Code\Chap4\Age.java 4 - 44 Indentation • The statement controlled by the if statement is indented to indicate that relationship – Should also be in { } for proper style conventions • The use of a consistent indentation style makes a program easier to read and understand • Although it makes no difference to the compiler, proper indentation is crucial "Always code as if the person who ends up maintaining your code will be a violent psychopath who knows where you live." -- Martin Golding Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 4 - 45 The if-else Statement • An else clause can be added to an if statement to make an if-else statement if ( condition ) { statement1; } else { statement2; } • If the condition is true, statement1 is executed; if the condition is false, statement2 is executed • One or the other will be executed, but not both Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 4 - 46 //******************************************************************** // Wages.java Java Foundations // // Demonstrates the use of an if-else statement. //******************************************************************** import java.text.NumberFormat; import java.util.Scanner; public class Wages { //----------------------------------------------------------------// Reads the number of hours worked and calculates wages. //----------------------------------------------------------------public static void main(String[] args) { final double RATE = 8.25; // regular pay rate final int STANDARD = 40; // standard hours in a work week Scanner scan = new Scanner(System.in); double pay = 0.0; System.out.print("Enter the number of hours worked: "); int hours = scan.nextInt(); Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 4 - 47 System.out.println(); // Pay overtime at "time and a half" if (hours > STANDARD) { pay = STANDARD * RATE + (hours - STANDARD) * (RATE * 1.5); } else { pay = hours * RATE; } NumberFormat fmt = NumberFormat.getCurrencyInstance(); System.out.println("Gross earnings: " + fmt.format(pay)); } } Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 4 - 48 Block Statements • Several statements can be grouped together into a block statement delimited by braces • A block statement can be used wherever a statement is called for in the Java syntax rules if (total > MAX) { System.out.println("Error!!"); errorCount++; } Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 4 - 49 The if-else Statement Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 4 - 50 //******************************************************************** // Guessing.java Java Foundations // // Demonstrates the use of a block statement in an if-else. //******************************************************************** import java.util.*; public class Guessing { //----------------------------------------------------------------// Plays a simple guessing game with the user. //----------------------------------------------------------------public static void main(String[] args) { final int MAX = 10; int answer, guess; Scanner scan = new Scanner(System.in); Random generator = new Random(); answer = generator.nextInt(MAX) + 1; System.out.print("I'm thinking of a number between 1 and " + MAX + ". Guess what it is: "); Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 4 - 51 guess = scan.nextInt(); if (guess == answer) System.out.println("You got it! Good guessing!"); else { System.out.println("That is not correct, sorry."); System.out.println("The number was " + answer); } } } Code\Chap4\Guessing.java Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 4 - 52 Indentation Revisited • Remember that indentation is for the human reader, and is ignored by the computer if (total > MAX) System.out.println("Error!!"); errorCount++; • Despite what is implied by the indentation, the increment will occur whether the condition is true or not Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 4 - 53 The if-else Statement • In an if-else statement, the if portion, or the else portion, or both, could be block statements if (total > MAX) { System.out.println("Error!!"); errorCount++; } else { System.out.println("Total: " + total); current = total*2; } Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 4 - 54 The Conditional Operator • Java has a conditional operator that uses a boolean condition to determine which of two expressions is evaluated • Its syntax is true false condition ? expression1 : expression2 • If the condition is true, expression1 is evaluated; if it is false, expression2 is evaluated • The value of the entire conditional operator is the value of the selected expression Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 4 - 55 The Conditional Operator • The conditional operator is similar to an if-else statement, except that it is an expression that returns a value • For example larger = ((num1 > num2) ? num1 : num2); • If num1 is greater than num2, then num1 is assigned to larger; otherwise, num2 is assigned to larger • The conditional operator is ternary because it requires three operands Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 4 - 56 The Conditional Operator • Another example: System.out.println ("Your change is " + count + ((count == 1) ? "Dime" : "Dimes")); • If count equals 1, then "Dime" is printed • If count is anything other than 1, then "Dimes" is printed Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 4 - 57 Nested if Statements • The statement executed as a result of an if statement or else clause could be another if statement • These are called nested if statements • An else clause is matched to the last unmatched if (no matter what the indentation implies) • Braces can be used to specify the if statement to which an else clause belongs Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 4 - 58 //******************************************************************** // MinOfThree.java Java Foundations // // Demonstrates the use of nested if statements. //******************************************************************** import java.util.Scanner; public class MinOfThree { //----------------------------------------------------------------// Reads three integers from the user and determines the smallest // value. //----------------------------------------------------------------public static void main(String[] args) { int num1, num2, num3, min = 0; Scanner scan = new Scanner(System.in); System.out.println("Enter three integers: "); num1 = scan.nextInt(); num2 = scan.nextInt(); num3 = scan.nextInt(); Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 4 - 59 if (num1 < num2) if (num1 < num3) min = num1; else min = num3; else if (num2 < num3) min = num2; else min = num3; System.out.println("Minimum value: " + min); } } Code\Chap4\MinOfThree.java Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 4 - 60 Comparing Data • When comparing data using boolean expressions, it's important to understand the nuances of certain data types • Let's examine some key situations: – – – – comparing floating point values for equality comparing characters comparing strings (alphabetical order) comparing object vs. comparing object references Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 4 - 61 Comparing Float Values • You should rarely use the equality operator (==) when comparing two floating point values (float or double) • Two floating point values are equal only if their underlying binary representations match exactly (hardly ever happens) 1.49999999999999999 is not equal to 1.499999999999999999 • Computations often result in slight differences that may be irrelevant • In many situations, you might consider two floating point numbers to be “close enough” even if they aren't exactly equal Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 4 - 62 Comparing Float Values • To determine the equality of two floats, you may want to use the following technique: if (Math.abs(f1 - f2) < TOLERANCE) System.out.println("Essentially equal"); • If the difference between the two floating point values is less than the tolerance, they are considered to be equal • The tolerance could be set to any appropriate level, such as 0.000001 Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 4 - 63 Comparing Characters • As we've discussed, Java character data is based on the Unicode character set • Unicode establishes a particular numeric value for each character, and therefore an ordering • We can use relational operators on character data based on this ordering • For example, the character '+' is less than the character 'J' because it comes before it in the Unicode character set • Appendix C provides an overview of Unicode Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 4 - 64 Comparing Characters • In Unicode, the digit characters (0-9) are contiguous and in order • Likewise, the uppercase letters (A-Z) and lowercase letters (a-z) are contiguous and in order Characters 0–9 A–Z Unicode Values 48 through 57 65 through 90 a–z 97 through 122 Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 4 - 65 Comparing Strings • Remember that in Java a character string is an object • The equals method can be called with strings to determine if two strings contain exactly the same characters in the same order • The equals method returns a boolean result if (name1.equals(name2)) System.out.println("Same name"); Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 4 - 66 Comparing Strings • We cannot use the relational operators to compare strings • The String class contains a method called compareTo to determine if one string comes before another • A call to name1.compareTo(name2) – returns zero if name1 and name2 are equal (contain the same characters) – returns a negative value if name1 is less than name2 – returns a positive value if name1 is greater than name2 Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 4 - 67 Comparing Strings if (name1.compareTo(name2) < 0) System.out.println(name1 + "comes first"); else if (name1.compareTo(name2) == 0) System.out.println("Same name"); else System.out.println(name2 + "comes first"); • Because comparing characters and strings is based on a character set, it is called a lexicographic ordering Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 4 - 68 Lexicographic Ordering • Lexicographic ordering is not strictly alphabetical when uppercase and lowercase characters are mixed • For example, the string "Great" comes before the string "fantastic" because all of the uppercase letters come before all of the lowercase letters in Unicode • Also, short strings come before longer strings with the same prefix (lexicographically) • Therefore "book" comes before "bookcase" Code\Chap4\Paradox.java Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 4 - 69 == vs. equals • The == operator can be applied to objects – it returns true if the two references are aliases of each other • The equals method is defined for all objects, and unless we redefine it when we write a class, it has the same semantics as the == operator • It has been redefined in the String class to compare the characters in the two strings • When creating new classes, you can/should redefine the equals method to return true under whatever conditions are appropriate Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 4 - 70 The switch Statement • The switch statement provides another way to decide which statement to execute next • The switch statement evaluates an expression, then attempts to match the result to one of several possible cases • Each case contains a value and a list of statements • The flow of control transfers to statement associated with the first case value that matches Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 4 - 71 The switch Statement • The general syntax of a switch statement: switch and case are reserved words switch ( expression ) { case value1 : statement-list1 case value2 : statement-list2 case value3 : statement-list3 case ... } Java Foundations, 3rd Edition, Lewis/DePasquale/Chase If expression matches value2, control jumps to here 4 - 72 The switch Statement • Often a break statement is used as the last statement in each case's statement list • A break statement causes control to transfer to the end of the switch statement • If a break statement is not used, the flow of control will continue into the next case • Sometimes this may be appropriate, but often we want to execute only the statements associated with one case Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 4 - 73 The switch Statement • An example of a switch statement: switch (option) { case 'A': aCount++; break; case 'B': bCount++; break; case 'C': cCount++; break; } Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 4 - 74 The switch Statement • A switch statement can have an optional default case • The default case has no associated value and simply uses the reserved word default • If the default case is present, control will transfer to it if no other case value matches • If there is no default case, and no other value matches, control falls through to the statement after the switch Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 4 - 75 The switch Statement • The expression of a switch statement must result in an integral type, meaning an integer (byte, short, int, long) or a char • It cannot be a boolean value or a floating point value (float or double) • The implicit boolean condition in a switch statement is equality • You cannot perform relational checks with a switch statement Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 4 - 76 //******************************************************************** // GradeReport.java Java Foundations // // Demonstrates the use of a switch statement. //******************************************************************** import java.util.Scanner; public class GradeReport { //----------------------------------------------------------------// Reads a grade from the user and prints comments accordingly. //----------------------------------------------------------------public static void main(String[] args) { int grade, category; Scanner scan = new Scanner(System.in); System.out.print("Enter a numeric grade (0 to 100): "); grade = scan.nextInt(); category = grade / 10; System.out.print("That grade is "); Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 4 - 77 switch (category) { case 10: System.out.println("a perfect score. Well done."); break; case 9: System.out.println("well above average. Excellent."); break; case 8: System.out.println("above average. Nice job."); break; case 7: System.out.println("average."); break; case 6: System.out.print("below average. Please see the "); System.out.println("instructor for assistance."); break; default: System.out.println("not passing."); } } } Code\Chap4\GradeReport.java Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 4 - 78 Loops • Repetition statements allow us to execute a statement multiple times • Often they are referred to as loops • Like conditional statements, they are controlled by boolean expressions • Java has three kinds of repetition statements: – the while loop – the do loop – the for loop • The programmer should choose the right kind of loop for the situation Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 4 - 79 The while Loop • A while loop has the following syntax while ( condition ) statement; • If the condition is true, the statement is executed • Then the condition is evaluated again, and if it is still true, the statement is executed again • The statement is executed repeatedly until the condition becomes false Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 4 - 80 The while Loop • The logic of a while loop: Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 4 - 81 The while Loop • Example: int count = 1; while (count <= 5) { System.out.println (count); count++; } • If the condition of a while loop is false initially, the statement is never executed • Therefore, the body of a while loop will execute zero or more times Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 4 - 82 The while Loop • Let's look at some examples of loop processing • A loop can be used to maintain a running sum • A sentinel value is a special input value that represents the end of input Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 4 - 83 //******************************************************************** // Average.java Java Foundations // // Demonstrates the use of a while loop, a sentinel value, and a // running sum. //******************************************************************** import java.text.DecimalFormat; import java.util.Scanner; public class Average { //----------------------------------------------------------------// Computes the average of a set of values entered by the user. // The running sum is printed as the numbers are entered. //----------------------------------------------------------------public static void main(String[] args) { int sum = 0, value, count = 0; double average; Scanner scan = new Scanner(System.in); System.out.print("Enter an integer (0 to quit): "); value = scan.nextInt(); Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 4 - 84 while (value != 0) { count++; // sentinel value of 0 to terminate loop sum += value; System.out.println("The sum so far is " + sum); System.out.print("Enter an integer (0 to quit): "); value = scan.nextInt(); } System.out.println(); if (count == 0) System.out.println("No values were entered."); else { average = (double)sum / count; DecimalFormat fmt = new DecimalFormat("0.###"); System.out.println("The average is " + fmt.format(average)); } } } Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 4 - 85 The while Loop • A loop can also be used for input validation, making a program more robust Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 4 - 86 //******************************************************************** // WinPercentage.java Java Foundations // // Demonstrates the use of a while loop for input validation. //******************************************************************** import java.text.NumberFormat; import java.util.Scanner; public class WinPercentage { //----------------------------------------------------------------// Computes the percentage of games won by a team. //----------------------------------------------------------------public static void main(String[] args) { final int NUM_GAMES = 12; int won; double ratio; Scanner scan = new Scanner(System.in); System.out.print("Enter the number of games won (0 to " + NUM_GAMES + "): "); won = scan.nextInt(); Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 4 - 87 while (won < 0 || won > NUM_GAMES) { System.out.print("Invalid input. Please reenter: "); won = scan.nextInt(); } ratio = (double)won / NUM_GAMES; NumberFormat fmt = NumberFormat.getPercentInstance(); System.out.println(); System.out.println("Winning percentage: " + fmt.format(ratio)); } } Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 4 - 88 Infinite Loops • The body of a loop eventually must make the condition false • If not, it is called an infinite loop, which will execute until the user interrupts the program • This is a common logical error • You should double check the logic of a program to ensure that your loops will terminate normally Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 4 - 89 Infinite Loops • An example of an infinite loop: int count = 1; while (count <= 25) { System.out.println (count); count = count - 1; } • This loop will continue executing until interrupted (Control-C) or until an underflow error occurs Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 4 - 90 Nested Loops • Similar to nested if statements, loops can be nested as well • That is, the body of a loop can contain another loop • For each iteration of the outer loop, the inner loop iterates completely Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 4 - 91 Nested Loops • How many times will the output be printed? count1 = 1; while (count1 <= 10) { count2 = 1; while (count2 <= 50) { System.out.println ("Here again"); count2++; } count1++; } Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 4 - 92 //******************************************************************** // PalindromeTester.java Java Foundations // // Demonstrates the use of nested while loops. //******************************************************************** import java.util.Scanner; public class PalindromeTester { //----------------------------------------------------------------// Tests strings to see if they are palindromes. //----------------------------------------------------------------public static void main(String[] args) { String str, another = "y"; int left, right; Scanner scan = new Scanner(System.in); while (another.equalsIgnoreCase("y")) // allows y or Y { System.out.println("Enter a potential palindrome:"); str = scan.nextLine(); left = 0; right = str.length() - 1; Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 4 - 93 while (str.charAt(left) == str.charAt(right) && left < right) { left++; right--; } System.out.println(); if (left < right) System.out.println("That string is NOT a palindrome."); else System.out.println("That string IS a palindrome."); System.out.println(); System.out.print("Test another palindrome (y/n)? "); another = scan.nextLine(); } } } Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 4 - 94 Iterators • An iterator is an object that allows you to process a collection of items one at a time • It lets you step through each item in turn and process it as needed • An iterator object has a hasNext method that returns true if there is at least one more item to process • The next method returns the next item • Iterator objects are defined using the Iterator interface, which is discussed further in Chapter 9 Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 4 - 95 Iterators • Some classes in the Java API are iterators • The Scanner class is an iterator – the hasNext method returns true if there is more data to be scanned – the next method returns the next scanned token as a string • The Scanner class also has variations on the hasNext method for specific data types (such as hasNextInt) Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 4 - 96 Iterators • The fact that a Scanner is an iterator is particularly helpful when reading input from a file • Suppose we wanted to read and process a list of URLs stored in a file • One scanner can be set up to read each line of the input until the end of the file is encountered • Another scanner can be set up for each URL to process each part of the path Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 4 - 97 //******************************************************************** // URLDissector.java Java Foundations // // Demonstrates the use of Scanner to read file input and parse it // using alternative delimiters. //******************************************************************** import java.util.Scanner; import java.io.*; public class URLDissector { //----------------------------------------------------------------// Reads urls from a file and prints their path components. //----------------------------------------------------------------public static void main(String[] args) throws IOException { String url; Scanner fileScan, urlScan; fileScan = new Scanner(new File("websites.inp")); // Read and process each line of the file while (fileScan.hasNext()) { url = fileScan.nextLine(); System.out.println("URL: " + url); Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 4 - 98 urlScan = new Scanner(url); urlScan.useDelimiter("/"); // Print each part of the url while (urlScan.hasNext()) System.out.println(" " + urlScan.next()); System.out.println(); } } } Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 4 - 99 The do Loop • The do loop has the following syntax: do { statement; } while ( condition ) • The statement is executed once initially, and then the condition is evaluated • The statement is executed repeatedly until the condition becomes false Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 4 - 100 The do Loop • The logic of a do loop: Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 4 - 101 The do Loop • An example of a do loop: int count = 0; do { count++; System.out.println (count); } while (count < 5); • The body of a do loop is executed at least once Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 4 - 102 //******************************************************************** // ReverseNumber.java Java Foundations // // Demonstrates the use of a do loop. //******************************************************************** import java.util.Scanner; public class ReverseNumber { //----------------------------------------------------------------// Reverses the digits of an integer mathematically. //----------------------------------------------------------------public static void main(String[] args) { int number, lastDigit, reverse = 0; Scanner scan = new Scanner(System.in); System.out.print("Enter a positive integer: "); number = scan.nextInt(); Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 4 - 103 do { lastDigit = number % 10; reverse = (reverse * 10) + lastDigit; number = number / 10; } while (number > 0); System.out.println("That number reversed is " + reverse); } } Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 4 - 104 Comparing while and do Loops Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 4 - 105 The for Loop • The for loop has the following syntax: The initialization is executed once before the loop begins The statement is executed until the condition becomes false for ( initialization ; condition ; increment ) statement; The increment portion is executed at the end of each iteration Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 4 - 106 The for Loop • The logic of a for loop: Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 4 - 107 The for Loop • A for loop is functionally equivalent to the following while loop structure: initialization; while ( condition ) { statement; increment; } Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 4 - 108 The for Loop • An example of a for loop: for (int count=1; count <= 5; count++) System.out.println (count); • The initialization section can be used to declare a variable • Like a while loop, the condition of a for loop is tested prior to executing the loop body • Therefore, the body of a for loop will execute zero or more times Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 4 - 109 The for Loop • The increment section can perform any calculation for (int num=100; num > 0; num -= 5) System.out.println (num); • A for loop is well suited for executing statements a specific number of times that can be calculated or determined in advance Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 4 - 110 //******************************************************************** // Multiples.java Java Foundations // // Demonstrates the use of a for loop. //******************************************************************** import java.util.Scanner; public class Multiples { //----------------------------------------------------------------// Prints multiples of a user-specified number up to a user// specified limit. //----------------------------------------------------------------public static void main(String[] args) { final int PER_LINE = 5; int value, limit, mult, count = 0; Scanner scan = new Scanner(System.in); System.out.print("Enter a positive value: "); value = scan.nextInt(); System.out.print("Enter an upper limit: "); limit = scan.nextInt(); Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 4 - 111 System.out.println(); System.out.println("The multiples of " + value + " between " + value + " and " + limit + " (inclusive) are:"); for (mult = value; mult <= limit; mult += value) { System.out.print(mult + "\t"); // Print a specific number of values per line of output count++; if (count % PER_LINE == 0) System.out.println(); } } } Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 4 - 112 //******************************************************************** // Stars.java Java Foundations // // Demonstrates the use of nested for loops. //******************************************************************** public class Stars { //----------------------------------------------------------------// Prints a triangle shape using asterisk (star) characters. //----------------------------------------------------------------public static void main(String[] args) { final int MAX_ROWS = 10; for (int row = 1; row <= MAX_ROWS; row++) { for (int star = 1; star <= row; star++) System.out.print("*"); System.out.println(); } } } Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 4 - 113 The for Loop • Each expression in the header of a for loop is optional • If the initialization is left out, no initialization is performed • If the condition is left out, it is always considered to be true, and therefore creates an infinite loop • If the increment is left out, no increment operation is performed Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 4 - 114 Iterators and for Loops • A variant of the for loop simplifies the repetitive processing for any object that implements the Iterable interface • An Iterable interface provides an iterator • For example, if BookList is an Iterable object that manages Book objects, the following loop will print each book: for (Book myBook : BookList) System.out.println (myBook); Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 4 - 115 The for-each Loop • This style of for loop can be read "for each Book in BookList, …" • This version is sometimes referred to as the foreach loop • It eliminates the need to call the hasNext and next methods explicitly • It also will be helpful when processing arrays, which are discussed in Chapter 7 Java Foundations, 3rd Edition, Lewis/DePasquale/Chase 4 - 116