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
Unit 4 Control structures Content 1. 2. 3. 4. 5. 6. statements execution order & flow of control (FOC) relational expressions Branching control structures Looping control structures Single-entry-single-exit principle debugging techniques 1 1) Order of executing program statements Program Execution Order Generally, we have only one CPU Therefore, program statements are executed one-by-one sequentially sequence of statement execution called Flow of Control (FoC) Fixed sequence is not desirable Jump to another function Jump to other statements under some conditions Loop a set of statements 2 Program Execution Order For example, Check username match password. If success, provides services. Otherwise, rejects it. Flow of Control In all programming language, foc includes Expression to determine the flow Branching mechanism e.g. if-else, goto Looping mechanism e.g. for, while Java also provides its own mechanisms 3 2) Relational Expressions An expression is the condition to determine the flow in runtime An expression returns true or false ( > 0 or <= 0 ) An expression consists of operators: Arithmetic operators [+ , - ,* , / , % , ^ , += , -= ,*=, /= ] relational operators [< , > , <= , >= ] Assignment operators [ = ] Unary operators [ -aNumber ] Result of operators depends on LHS and/or RHS values Primitive type, reference variable, constant and even method return value 4 Java Expression In Java, an expression can have no operator A variable Return value of a method call Boolean or integer if (stop) if (obj) if (isValid(obj)) If integer, how does the branching/looping evaluate as true or false ? How about float or object ? 5 Relational Operators Evaluate and return true or false 6 Relational Operators, for example : testing for A < B, when A=1 and B=2, the result is true when A=2 and B=1, the result is false Can be used for all numeric primitive : [ byte , short , char, int , long , float & double ] 6 Operators Relational Equality 7 Equality Operators == & != == & != can be used for reference variables If you are new in programming, must pay attention to the 2 operators == & != != means not equal The exclamation mark (!) in Java always means 'negation' or 'not' == is equal 8 "==" (equality) VS "=" (assignment) int a = 1, b = 2 ; if (a == b) { } if (a = b) { // This block will NOT be executed? // This block will be executed } the latter expression results in a = 2 & the second block will be executed because "=" is assignment, totally different from "==" 9 Example Java compiler will detect this error before execution public class compilationError { public static void main (String args[]) { final int MY_CONSTANT = 10 ; int a = 5 ; if (MY_CONSTANT == a) { System.out.println("It is OK"); } if (MY_CONSTANT = a) { System.out.println("it is Not OK"); } } } C:\>javac compilationError.java a.java:8: cannot assign a value to final variable MY_CONSTANT if (MY_CONSTANT = a) { ^ 1 error 10 Integer & Floating Point Operators are reliable for integer but not for floating point Floating point calculation results are also just approximations because of rounding-off Therefore, a / b * b == a ? a == 0.85 ? Using Math.abs(a – 0.85) < 0.0000001 where 0.0000001 is an arbitrary value of the tolerable round-off error 11 Operator == and Reference Variables Operators == can be applied for reference variables But the result… In unit 3, reference variables actually carry the locations of objects So, == compares the locations rather than the states of the objects Means they refer to the same object 12 Fig 4.2 pp-9 Case studies about the results of : (counter1 == counter2) 13 14 Customize Method equals() Want to compare the states of objects Using method equals() instead of == operator Class must implement its own equals() Default implemented in java.lang.Object The default implemented is just like == For example, class String override to compare the content of char buffer So, don’t relay on default equals() (p-11) : s1.equals(s2) returns false King-130 : (s1==s2) and s1.equals(s2) returns true only when different 15 Precedence and Associativity Determine the order in an expressions Higher precedence are performed first When same precedence, using associativity Arithmetic operators has higher precedence relational, in turn higher precedence than equality operators remember the table ( next page ) or always using parentheses "()" in expression suggest to use "()" 16 Precedence Associativity Remarks + - Right Unary operators * / % Left + - Left >= > < <= Left == != Left = += -= *= Right /= %= "+=" means InCrement "-=" means DeCrement Assignment operators Why assignment is lowest? Don’t forget that the "!" operator means negation 17 Self-test 4.1 Evaluate the following : a) 5 + 4 / 3 * 2 b) (3 + 2) * 4 c) 33 * 3 < 99 d) (4 + 3) * 2 != 12 Answer : a) 7 b) 20 c) false d) true 18 3) Branching Now you know expression and operators After evaluating a condition (an expression in Java), the flow depends on the Branching or Looping statement The java programming language only supports two branching structures, if/else statement switch/case statement 19 if Statement 20 if Statement If sth is true, then the extra block of statement will be executed The condition in the parentheses must be an expression return true or false The statements enclosed in the curly brackets "{" and "}" are executed Besides the coding, you must also know the flow chart 21 Curly brackets Curly brackets, "{" and "}", must be in pair Although curly brackets is not a must, highly recommended to use for maintenance if (condition) statement-1; statement-2; is interpreted as if (condition) statement-1; statement-2; 22 Indention in Statement Block Usually indent the statements in a block so that Easier to identify the block properly & enhance the readability Not only in if, but also all block like function body 23 P.25 MinMaxFinder.java public class MinMaxFinder { private int currentMin = Integer.MAX_VALUE; // the current minimum private int currentMax = Integer.MIN_VALUE; // the current maximum // Present a number to the object for testing with current minimum and maximum public void testNumber(int number) { // Compare the given number with current maximum if (number > currentMax) { currentMax = number; If the given number is greater than current maximum } then assign the given number to the current maximum // Compare the given number with the current minimum if (number < currentMin) { currentMin = number; If the given number is less than the current mininum } then assign the given number to the current minimum } // retrieve the current minimum public int getMinimum() { return currentMin; } // retrieve the current maximum public int getMaximum() { return currentMax; } 24 } P.28 TestMinMaxFinder.java (driver program) public class TestMinMaxFinder { public static void main(String args[]) { MinMaxFinder finder = new MinMaxFinder(); // Sending messages with numbers to the object so that // the numbers are tested one by one finder.testNumber(15); finder.testNumber(20); finder.testNumber(10); // Send messages to the object to get its current min & max value int minNumber = finder.getMinimum(); int maxNumber = finder.getMaximum(); System.out.println("Minimum number = " + minNumber); System.out.println("Maximum number = " + maxNumber); } } 25 P.32 GreetingChooser.java public class GreetingChooser { // Determine the greeting based on the given hour public String assignGreeting (int hour) { // A local variable for storing the result temporarily String greeting = ""; if (hour >= 0) { greeting = "morning"; } if (hour >= 12){ greeting = "afternoon"; } if (hour >= 18){ greeting = "evening";} // Return the result to the caller return greeting; } } 26 P.34 TestGreeting.java ( driver program ) import javax.swing.JOptionPane; public class TestGreeting { public static void main(String args[]) { GreetingChooser chooser = new GreetingChooser(); // Show a dialog to get the hour from user // The obtained hour is returned as a String object String inputHour = JOptionPane.showInputDialog("Please enter the hour"); // Obtain the integer value from the input String object int hour = Integer.parseInt(inputHour); String greeting = chooser.assignGreeting(hour); String output = "Good " + greeting; // set the message to be shown JOptionPane.showMessageDialog(null, output);// Show greeting with a dialog System.exit(0); // Terminate the program } 27 } Mutually Exclusive In the situation, Perform a task if a condition is true Otherwise, perform another task It works but suffers from performance penalty because of 2 test if (number > 0) { System.out.println("Number is positive"); } else { System.out.println("Number is non-positive"); } Print a line & then start a new line 28 if/else Statement Java extends if by optional else statement(s) Support any number of else statements if (condition) { statement(s)-1 // statement(s) to be executed if the condition is true } else { statement(s)-2 // statement(s) to be executed if the condition is false } statement(s)-1 (if part) true condition false statement(s)-2 (else part) 29 switch/case Statement Sometimes, it is necessary to test the content of a variable against a list of possible values Can use a number of if..else if..else But coding is tedious Java provides a faster and more readable flow of control statement: switch / case 30 switch/case Statement “default” is optional (p64~65) “break” means end of a case If missing, run next statement Recommend to use Recommend to use catch unexpected conditions switch (expr) { case expr-1: statements-1; expr == break; expr-1 case expr-2: false statements-2; expr == break; expr-2 case expr-3: false statements-3; expr == break; expr-3 default: statements-default; false break; } true true true statements-1 break statements-2 break statements-3 break statementsdefault break 31 switch/case vs if/else switch/case can support primitive type of : byte, short, char and int only can check the equality for byte, short, char or int only supports equality checking if/else can support boolean type only with proper relational operators, can support all primitive type and non-primitive type can check the equality for long, float, double, boolean and non-primitive types can use any relational operator. 32 switch/case vs if/else Although switch/case is more restricted, Its structure is more elegant and easier to read Faster Use it whenever possible 33 Example // page 58 // page 71 public class GradeConverter { public String assignGrade(int mark) { // The grade is first assumed to be F String grade = "F"; public class GradeConverter2 { public String assignGrade(int mark) { // The grade to be returned String grade; // Set criteria for grades one by one if (mark >= 50) {grade = "E"; } if (mark >= 60) {grade = "D"; } if (mark >= 70) {grade = "C"; } if (mark >= 80) {grade = "B"; } if (mark >= 90) {grade = "A"; } // Set criteria for grades one by one switch (mark / 10) { case 9: case 10: grade = "A"; case 8: grade = "B"; case 7: grade = "C"; case 6: grade = "D"; case 5: grade = "E"; default: grade = "F"; } // Return the determined grade return grade; break; break; break; break; break; break; } } // Return the determined grade return grade; } } 34 4) Looping control structures In many cases, a program needs to execute the same statement several times eg. calculate total number of staff salaries Therefore, programming language must support looping Java defines 3 types: while do/while for 35 Looping usually a loop has of 2 parts Condition Statement/loop body Furthermore, Initialization Update Finally, Execute-check or check-execute Anyway, don’t make an infinite looping A loop never ends Condition always true P.99 even server side check exit/stop event Famous loop: Windows GUI event loop Palm event loop Web server event loop 36 while Loop while (codition) statement(s) General format condition true statement(s) false while (condition) { statement(s) } 37 while Loop Clear definition for Condition & Statement/loop body No definition for Initialization & Update Check-execute The loop body can be completely ignored Simple, suitable for loops require no initialization and update E.g. GUI event loops, JDBC result set 38 Example (page 75~76) // example-1 i = 1; n = 10; while (i < n) i *= 2; // example-2 (recommended) i = 1; n = 10; while (i < n) { i *= 2; } i = 1; n = 10; i < n true i *= 2 false 39 Table 4.4 Execution details of a loop (p-77) Value of Value of Value of Iteration i n i < n Actions to be taken 1 1 10 true The loop body is executed, and the value of variable i becomes 2. 2 2 10 true The loop body is executed, and the value of variable i becomes 4. 3 4 10 true The loop body is executed, and the value of variable i becomes 8. 4 8 10 true The loop body is executed, and the value of variable i becomes 16. 5 16 10 false The loop is terminated As a result, the value of the variable i is 16 when the loop is terminated. 40 do/while Loop (p-81) do statement statement(s) while (condition); condition do statement true false while (condition); do { statement(s) } while (condition); 41 do/while Loop Just like while loop Execute-check instead check-execute The loop body will be executed at least once Sometimes, initialization is embedded in the loop body 42 Self-Test 4.5 (p-126) result = result * number ; eg. 4! = 4x3x2 // a buggy version of factorial public int factorial(int number) { int result = 1; do { result *= number; number-- ; } while (number > 1) ; return result ; } // a correct version of factorial public int factorial(int number) { int result = 1; while (number > 1) { result *= number; number-- ; } return result ; } Do / While when input <= 1 loop body runs to return 0 thus, 0! = 0 ( which is wrong) While when input <= 1 loop body skipped & return the default, 1 43 thus, 0! = 1 and (-1)! = 1 for Loop 44 for Loop Clear definition for Condition & Statement/loop body Clear definition for Initialization & Update Check-execute like while Difficult to read Initialization, Condition & Update are in the same stement Suitable for numerical loops 45 for = while Which is more preferable? If explicit initialization/update are required, for is more suitable (eg. loop all elements in a collection) otherwise, while (eg. loop all result set of a JDBC call) 46 Example for for & while java.util.Vector vec = new java.util.Vector(10) ; // update the vec java.sql.ResultSet rs = null ; for (int i = 0; i < vec.size(); i++) { java.lang.Object obj = vec.get(i) ; // process the obj } while (rs.next()) { rs.getString(1) ; // process the result set item // update the result set } 47 Start from Zero A for loop uses an integer as index to a collection the start value is 0 instead of 1 Thus, condition uses "<" instead of "<=" Beginner must be careful This introduce a lot of misunderstanding in programming eg. ResultSet 48 Practice and Scope Although meaningful variable names are recommended, there is an exception case In for loop, the index always use simple char like j, k… This is an acceptable exception in programming Due to scope (life time of a variable), such declared variables cannot be reused outside the loop Each loop has its own 49 Unintentional Infinite Loop (p-102) Loop condition is always true Pls heed the data type limitation Max/min values Default value Logical error Debug message Integer.MAX_VALUE = 32767 50 5) Single-entry-single-exit principle (p102~3) break / return / continue / goto Flow of control should be kept simple & straight-forward Therefore, don't use goto (no longer supported) and continue to jump to another segment Also, keep break and return as less as possible in a method or a loop 51 Which is more preferable ? public int factorial(int number) { if (number < 0) { return -1; } (p104) public int factorial(int number) { int result; if (number < 0) { result = -1; } else { result = 1; for (int i = number; i > 1; i--) { result *= i; } } int result = 1; for (int i = number; i > 1; i--) { result *= i; } return result; } // earlier & multiple exit points // by using TWO return statements return result; } // unique exit // by using ONE return statement 52 Which is more preferable ? public String assignGrade(int mark) { String grade = ""; switch (mark / 10) { ...... case 9: if (mark % 10 < 5) { grade = "A-"; break; } grade = "A"; break; case 10: grade = "A+"; break; } return grade; } // not clear (p105) public String assignGrade(int mark) { String grade = ""; switch (mark / 10) { ...... case 9: if (mark % 10 < 5) { grade = "A-"; } else { grade = "A"; } break; case 10: grade = "A+"; break; } return grade; } // more clear, but should avoid 53 Exception To serve the purpose of single exit, a lot of if-else statements are used programmers find it undesirable for : Difficult to follow More coding That’s why we need exception, to throw an abnormal situation to the handler directly The foc focuses only the normal case 54 Exception Example try { String number = new String("ABC"); java.lang.Integer anInteger=new java.lang.Integer(number); int value = anInteger.intValue(); } catch (NumberFormatException ex) { // handle numberic exception } catch (NullPointerException ex) { // handle null ptr exception } 55 Non-exception Example String number = new String("ABC"); if (null != number) { if (IcheckNumber(number)) { int value = convertNumber(number) ; } else { // handle numberic } } else { // handle null ptr } 56 6) Debugging Programs Java or IDE Debugger More popular - Print message System.out.println() System.err.println() Not a good approach Not persistent Add/Remove must re-compile the src Log4J – configure logging dynamically 57 Debugging with System.out.println() while (remainDigits > 0) { // Get the least significant digit int digit = remainDigits % 10; // Print the digit System.out.println(digit); // Dropping the last digit remainDigits /= 10; } while (remainDigits > 0) { // Get the least significant digit int digit = remainDigits % 10; // Print the digit System.out.println(digit); // Dropping the last digit remainDigits = 10; } the "/" char is missing 58 println( ) and print( ) public class List7 { public boolean is7 (int number) { boolean result = false; for ( int i=2; I < number; i++ ) { if (number % 7 == 0) { result = true; } } return result; } } public class List7Driver { public static void main(String args[]){ List7 tester = new List7(); for (int i=2; i <= 50; i++) { if ( tester.is7(i) ) { System.out.print(i+"\t"); } "\t" is a <TAB> character start at a } new line System.out.println(); System.out.println("Done"); } } 59 Log4J Free java package 4 level logging debug (lowest), info, warn, error Configure file defines runtime log level for a package or a class Lower level message not logged in runtime Therefore, can determine runtime log message without recompile of program 60