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
Chapter 2 Elementary Programming (Primitive Data Types and Operations*) 1 Objectives • Basic java program structure . • Getting input from user : using Scanner class • Java identifiers (names) (§2.3). – used to name variables, constants, methods, and classes . • Java Variables – use variables to store data . • Assignment statements / assignment expressions . • Java constants . • Java primitive data types: boolean, byte, short, int, long, float, double, and char . – Java operators for primitive types . • Java string (§2.18) • Getting input from user – using the JOptionPane input dialog (§2.19). – using Scanner class (§2.3). • Java documentation, programming style, and naming conventions . • Types of errors – To distinguish syntax errors, runtime errors, and logic errors . • To debug logic errors . 2 Java Program Structure • A program is made up of one or more files (compilation units) • A file consists of one or more classes (or interfaces), among which there is at most one public one. • Classes are grouped into packages. • A class belongs to one package and contains one or more methods and fields • A method contains program statements • A Java application always executes the main method of a class via a command like this: >java -cp . example.Person package example; public class Person { public static void main (String[] args) { System.out.println (“Hi Man!"); } // method main int age; String name; } // class Person Java Program Structure class modifier class name // comments about the class public class MyProgram { class Header class body Comments can be added almost anywher } 4 Java Program Structure // comments about the class public class MyProgram Method modifiers { // comments about the method public static void main (String[] args) { method body } Return type } 5 method header Method name Introducing Programming with an Example Listing 2.1 Computing the Area of a Circle This program computes the area of the circle. ComputeArea 6 animation Trace a Program Execution public class ComputeArea { /** Main method */ public static void main(String[] args) { double radius; double area; allocate memory for radius radius no value // Assign a radius radius = 20; // Compute area area = radius * radius * 3.14159; // Display results System.out.println("The area for the circle of radius " + radius + " is " + area); } } 7 animation Trace a Program Execution public class ComputeArea { /** Main method */ public static void main(String[] args) { double radius; double area; // Assign a radius radius = 20; // Compute area area = radius * radius * 3.14159; memory radius no value area no value allocate memory for area // Display results System.out.println("The area for the circle of radius " + radius + " is " + area); } } 8 animation Trace a Program Execution public class ComputeArea { /** Main method */ public static void main(String[] args) { double radius; double area; assign 20 to radius radius area 20 no value // Assign a radius radius = 20; // Compute area area = radius * radius * 3.14159; // Display results System.out.println("The area for the circle of radius " + radius + " is " + area); } } 9 animation Trace a Program Execution public class ComputeArea { /** Main method */ public static void main(String[] args) { double radius; double area; memory radius area 20 1256.636 // Assign a radius radius = 20; // Compute area area = radius * radius * 3.14159; compute area and assign it to variable area // Display results System.out.println("The area for the circle of radius " + radius + " is " + area); } } 10 animation Trace a Program Execution public class ComputeArea { /** Main method */ public static void main(String[] args) { double radius; double area; memory radius area 20 1256.636 // Assign a radius radius = 20; // Compute area area = radius * radius * 3.14159; print a message to the console // Display results System.out.println("The area for the circle of radius " + radius + " is " + area); } } 11 Getting Input Using Scanner 1. Create a Scanner object Scanner scanner = new Scanner(System.in); 2. Use the methods next(), nextByte(), nextShort(), nextInt(), nextLong(), nextFloat(), nextDouble(), nextBoolean(), or nextLine() to obtain to a string, byte, short, int, long, float, double, boolean value or a whole line. For example, Scanner scanner = new Scanner(System.in); System.out.print("Enter a double value: "); double d = scanner.nextDouble(); ComputeCircleArea ComputeAverage TestScanner 12 Kinds of tokens in Java • Token: – Identifier • used for the name of package, type, method, (local)variable, parameter,etc. – Keyword (reserved words) • if, then, else, while, do, switch, case, • class, method, public, static, final, abstract,… • int, boolean, double, long, … – Literal • user for representing constant values. • ‘c’, 123, 123L, true, 0.2e23, ”s String”, … – Separator • { } ( ) [ ] , ; . – Operator: • +, -, *, /, %, <=, >, … Identifiers(識別字;名稱) • An identifier is a sequence of characters that consist of letters, digits, underscores (_), and dollar signs ($). – may contain non-English letters like ‘變’ ‘數’ ‘一’ etc. • An identifier must start with a letter, an underscore (_), or a dollar sign ($). It cannot start with a digit. – An identifier cannot be a reserved word. (See Appendix A, “Java Keywords,” for a list of reserved words). – $ is used by java tools, programmers should not use it. • An identifier cannot be true, false, or null. • An identifier can be of any length. 14 Variables // Compute the first area radius = 1.0; area = radius * radius * 3.14159; System.out.println("The area is “ + area + " for radius "+radius); // Compute the second area radius = 2.0; area = radius * radius * 3.14159; System.out.println("The area is “ + area + " for radius "+radius); 15 Declaring Variables int x; // Declare x to be an // integer variable; double radius; // Declare radius to // be a double variable; char a; // Declare a to be a // character variable; /* int, double and char are types instead of variables */ 16 Assignment Statements x = 1; // Assign 1 to x; radius = 1.0; // Assign 1.0 to radius; a = 'A'; // Assign 'A' to a; 17 Declaring and Initializing in One Step • int x = 1; • double d = 1.4; 18 Constants Format: final datatype CONSTANTNAME = VALUE; Examples: final double PI = 3.14159; final int SIZE = 3; final String LAST_NAME = “Wang”; final String FULL_NAME ="John "+NAME; //ok! LAST_NAME = "Chen"; //error! final boolean IT_IS_COLD = false; cf: Constants v.s. literals Constants are variables bound to a constant value determined by programmers while literals are tokens mapped to a constant value designated by the language. 19 Java Data Types • primitive types – numeric types • integer types: byte, char, short, int, long • floating-point types: float, double – boolean • reference types – class – interface – array Notes: instances of primitive types are not objects; only instances of reference types are objects. Integer types • name • byte • short • int • long • char • representation range 8-bit 2's complement -128~127 16-bit 2's complement -32768~32767 (-215 ~ 215 -1) 32-bit 2's complement -2147483648 to 2147483647 64-bit 2's complement -263~263-1(19 digits) 16-bit Unicode '\u0000' to '\uffff‘ (as well as unsigned short) 0 to 65536 floating-point types • name • float representation range 32-bit, IEEE 754 1.40239846e-45 to 3.40282347e+38 • double 64-bit, IEEE 754 4.94065645841246544e-324 to 1.79769313486231570e+308 Representation: • non-zero value: v = S x M x 2^E – For float: S is +/- 1, M is a positive integer less than 2^24, and E is an integer in the inclusive range -149 to 104. – For double: S is +/- 1, M is a positive integer less than 2^53, and E is an integer in the inclusive range -1045 to 1000. • special values defined in IEEE 754: – +0, -0, +infinity, -Infinity, NaN. – note: 0/0.0 => NaN, – 1/0.0 => Infinity instead of overflow or divide by zero. IEEE 754 float-point single precision layout • • • • • 0x7f800000 => positive infinity. 0xff800000 => negative infinity. 0x7f800001 ~ 0x7fffffff or 0xff800001~0xffffffff => NaN. Java use 0x7fc00000 as the canonical value of NaN. Distinct values of NaN are only accessible by use of the Float.floatToRawIntBits(float) • In all other cases, let s, e, and m be three values that can be computed from the argument: – – – – int s = ((bits >> 31) == 0) ? 1 : -1; int e = ((bits >> 23) & 0xff); // s bit is ignored by mask of 0xff int m = (e == 0) ? (bits & 0x7fffff) << 1 : (bits & 0x7fffff) | 0x800000; the floating-point result is s ·m ·2 e-150. IEEE 754 float-point single precision layout (exponent) s e b31 b30 b29 b28 b27 b26 b25 b24 b23 b22 b21 b20 b19 b18 b17 b16 (mantissa) m b15 b14 b13 b12 b11 b10 b9 b8 b7 b6 b5 b4 b3 b2 b1 b0 value is determined as follows: 0. s = (b31 == 0 ? 1: -1); 1. 255> e > 0 => value = s x (1.m)2 x 2 e –127 = s x (1m) x 2 e - 150 2. E = 255 && m == 0 => value = ( s == 0 ? Infinity : -Infinity) 3. e = 255 && m != 0 => value = NaN; canonical NaN = 0181022 4. e = 0 => value = s x (b22.b21---b00)2 x 2 e-127 = s x (m 0)2 x 2 e - 127-23 5. double -> e has 11 bits and m has 52 bits Numerical Data Types Name Range Storage Size byte –27 (-128) to 27–1 (127) 8-bit signed short –215 (-32768) to 215–1 (32767) 16-bit signed int –231 (-2147483648) to 231–1 (2147483647) 32-bit signed long –263 to 263–1 (i.e., -9223372036854775808 to 9223372036854775807) 64-bit signed float Negative range: -3.4028235E+38 to -1.4E-45 Positive range: 1.4E-45 to 3.4028235E+38 32-bit IEEE 754 double Negative range: -1.7976931348623157E+308 to -4.9E-324 Positive range: 4.9E-324 to 1.7976931348623157E+308 64-bit IEEE 754 25 TIP An excellent tool to demonstrate how numbers are stored in a computer was developed by Richard Rasala. You can access it at http://www.ccs.neu.edu/jpt/jpt_2_3/bitdisplay/applet.htm Quiz: 1. What is the minimum distance between which two adjacent float numbers? 2. What is the maximum distance between which two adjacent float numbers ? 26 Numeric Operators Name Meaning Example Result + Addition 34 + 1 35 - Subtraction 34.0 – 0.1 33.9 * Multiplication 300 * 30 9000 / Division 1.0 / 2.0 0.5 % Remainder 20 % 3 2 • All operators are overloaded for all numeric types 27 Division(/) and remainder(%) • can be used for both integer and float-point numbers 5 / 2 yields an integer 2. 5.0 / 2 yields a double value 2.5 5 % 2 yields 1 (the remainder of the division) 5.0 % 2 = 1.0 2.2f/2 = 1.1f //2.2 = (10.0011 0011 0011 …)2 2.2f % 2 = 0.20000005 //!= 0.2 28 Remainder Operator •Remainder is very useful in programming. • can be used to determine if a number x is even or odd: – x % 2 == 0 // => even – x % 2 == 1 // => odd • Suppose today is Saturday, then what day is it after 10 days? Saturday is the 6th day in a week A week has 7 days (6 + 10) % 7 is 2 The 2nd day in a week is Tuesday After 10 days 29 The rules • integer % in java is not the same as in normal arithmetic • What are x % y and x/y if x or y is negative? • The rule: – x / y = sign(x/y) | x/ y| = x/y with fraction part removed; – x%y = x – (x/y) *y = sign(x) (|x|%|y|) always holds • invariant: x = (x/y) * y + (x%y) • Examples: • -10 / -3 = 3; -10 /3 = ________; 10 / -3 = _________ • -10 % -3 = -1; -10 % 3 = _______; 10 % -3 = _________; Example: Displaying Time Write a program that obtains hours and minutes from seconds. DisplayTime 31 NOTES • Calculations involving floating-point numbers are approximated because these numbers are not stored with complete accuracy. For example, System.out.println(1.0 - 0.1 - 0.1 - 0.1 - 0.1 - 0.1); displays 0.5000000000000001, not 0.5, and System.out.println(1.0 - 0.9); displays 0.09999999999999998, not 0.1. Integers are stored precisely. Therefore, calculations with integers yield a precise integer result. • There is no errors/exceptions reported for overflow of integer operations. Ex: – Integer.MAX_VALUE * 2 return -2 // MAX_VALUE = 231 -1. 32 Number Literals A literal is a constant value that appears directly in the program. For example, 34, 1,000,000, and 5.0 are literals in the following statements: int i = 34; long x = 1000000; double d = 5.0; 33 Integer Literals •An integer literal can be assigned to an integer variable as long as it can fit into the variable. –Ex int i1 = 1000; short s = 1000 ; // ok! – byte b = 1000 ; // compilation error!! • An integer literal is assumed to be of the int type, whose value is between -231 to 231–1. –123, 456, // all are int type •To denote an integer literal of the long type, append it with the letter L or l. – 123L, 456l // use L instead of l to avoid confusion!! 34 Floating-Point Literals •Floating-point literals are written with a decimal point. –234 // int 234.0 // double •By default, a floating-point literal is treated as a double type value. – 5.0 // a double • You can make a number a float by appending the letter f or F, and make a number a double by appending the letter d or D. – Ex: 100.2f , 100.2F // float – 100.2d , 100.2D, 100.2 // double. 35 Scientific Notation •Floating-point literals can also be specified in scientific notation. •Ex: – 1.23456e+2, same as 1.23456e2, is equivalent to 123.456, –1.23456e-2 is equivalent to 0.0123456. •E(or e) represents an exponent and it can be either in lowercase or uppercase. •Notes: – e or E means 10 instead of the natural exponent(2.71828) –1.23 e 10 // error! Spaces before/after e not allowed!! 36 Arithmetic Expressions 3 4 x 10( y 5)(a b c) 4 9 x 9( ) 5 x x y is translated to (3+4*x)/5 – 10*(y-5)*(a+b+c)/x + 9*(4/x + (9+x)/y) 37 Example: Converting Temperatures Write a program that converts a Fahrenheit degree to Celsius using the formula: celsius ( 95 )( fahrenheit 32) FahrenheitToCelsius 38 Shortcut Assignment Operators Operator Example Equivalent += i += 8 i = i + 8 -= f -= 8.0 f = f - 8.0 *= i *= 8 i = i * 8 /= i /= 8 i = i / 8 %= i %= 8 i = i % 8 39 Increment and Decrement Operators Operator ++var Name preincrement var++ postincrement --var predecrement var-- postdecrement Description The expression (++var) increments var by 1 and evaluates to the new value in var after the increment. The expression (var++) evaluates to the original value in var and increments var by 1. The expression (--var) decrements var by 1 and evaluates to the new value in var after the decrement. The expression (var--) evaluates to the original value in var and decrements var by 1. 40 Increment and Decrement Operators, cont. int i = 10; int newNum = 10 * i++; Same effect as int i = 10; int newNum = 10 * (++i); int newNum = 10 * i; i = i + 1; Same effect as i = i + 1; int newNum = 10 * i; 41 Increment and Decrement Operators, cont. •Using increment and decrement operators makes expressions short, but it also makes them complex and difficult to read. •Avoid using these operators in expressions that modify multiple variables, or the same variable for multiple times such as this: int k = ++i + i. 42 Assignment Expressions and Assignment Statements •Prior to Java 2, if expr is an expression, then expr; is a statement. •Since Java 2, only the following types of expressions (which may have side effects) can be statements: variable op= expression; // Where op is +, -, *, /, or % ++variable; variable++; --variable; variable--; // or method invocation ex: x – 2; => error 43 Numeric Type Conversion Consider the following statements: byte i = 100; long k = i * 3 + 4; double d = i * 3.1 + k / 2; 44 Conversion Rules When performing a binary operation e1 op e2 , Java automatically converts the operands based on the following rules: (numeric type promotion) 1. If one of the operands is double, the other is converted into double. 2. Otherwise, if one of the operands is float, the other is converted into float. 3. Otherwise, if one of the operands is long, the other is converted into long. 4. Otherwise(int, char, short, byte), both operands are converted into int. Rules: x op y => ((w) x) op ((w) y) where w is the wider of (type(x), type(y), int) and the reuslt type is w.. ex: byte i = j = 12; byte x = i + j // error ! since i + j has type int, cast is needed! 45 Type Casting (改型) Implicit casting(widening done by javac automatically) double d = 3; (type widening) Explicit casting (narrowing must be specified by programmers) int i = (int) 3.0; (type narrowing) int i = (int) 3.9; (Fraction part is truncated) What is wrong? int x = 5 / 2.0; range increases byte, short, int, long, float, double char 46 Type conversions • Java allows conversions between values of various numeric types. – Except for boolean, values of all primitive types can be converted. • Basic types of conversions: – Widening conversion: – int long; float double; char int; … • always safe (without loss of data) except for int float; longfloat, double. • automated performed by Java – Narrowing conversion: long int; double float;… • must use the cast () operator; (except for int literal, which can be downcasted to the required integral type automatically if it is inside the range of the left variable ). • not always safe. • Ex: -- int i =13; – byte b = i; // compile error!! – short s = 134 ; // ok!! though 134 is int type , it is a literal. – short s2 = b + b; // error, must use (short) (b+b); since b+b has type int. Use cast for narrowing conversion • Ex: int i = 13; – – – – – – – byte b = (byte) i; // force i to be converted to a byte i = (int) 13.456 // force double literal 13.456 to int 13 i = (int) –12.6 // i == -12 i = Integer.MAX_VALUE // i = 2147483647 float j = i // need not cast, but data loss; j = 2.14748365E9 j == i ? true : false // will return true! why ? (long) j == i ? true :false // return false since (long)j = 2147483648 • Math.round(), Math.floor(), Math.ceil() perform other types of conversion. • short v.s. char: – – – – short s = (short) 0xffff; // s = -1; 2’s complement char c = ‘\uffff’; // char behaves like unsigned short int i1 = s; // i1 = -1 int i2 = c; // i2 = 65535 Java Primitive Type Conversion rules LR boolean byte short char int long float double boolean - N N N N N N N byte N - Y C Y Y Y Y short N C - C Y Y Y Y char int N N C C C C C Y - Y Y Y Y* Y Y long N C C C C - Y* Y* float N N C C C C C C C C C C C Y - double N: Not allowed; C: Cast needed; Y: automatically casted w/o loss of data; Y*: automatically casted with loss of data Example: Keeping Two Digits After Decimal Points Write a program that displays the sales tax with two digits after the decimal point. tax = purchaseAmount * 0.06 Note: in (int) (tax * 100) / 100.0, it is (tax*100) that is casted to int SalesTax 50 Character Data Type char letter = 'A'; // (ASCII) char numChar = '4'; // (ASCII) Four hexadecimal digits. char letter = '\u0041'; // (Unicode; 4 hexidecimal ) char numChar = '\u0034'; // (Unicode) NOTE: The increment and decrement operators can also be used on char variables. char ch = 'a'; System.out.println(++ch); 51 Unicode Format Java characters use Unicode 16-bit encoding scheme support the interchange, processing, and display of written texts in the world’s diverse languages. Unicode takes two bytes, preceded by \u, expressed in four hexadecimal numbers that run from '\u0000' to '\uFFFF'. Unicode can represent 65535 + 1 characters. Unicode \u03b1 \u03b2 \u03b3 for three Greek letters 52 Example: Displaying Unicodes Write a program that displays two Chinese characters and three Greek letters. 歡迎(\u6b6e\u8fce) DisplayUnicode 53 Escape Sequences for Special Characters Description Escape Sequence Unicode Backspace \b \u0008 Tab \t \u0009 Linefeed \n \u000A Carriage return \r \u000D Backslash \\ \u005C Single Quote \' \u0027 Double Quote \" \u0022 54 Appendix B: ASCII Character Set ASCII Character Set is a subset of the Unicode from \u0000 to \u007f 55 ASCII Character Set, cont. ASCII Character Set is a subset of the Unicode from \u0000 to \u007f 56 Casting between char and Numeric Types int i = 'a'; // Same as int i = (int)'a'; char c = 97; // Same as char c = (char)97; int j = 97; char c2 = j; // error! why ? 57 The String Type •The char type only represents one character. • To represent a string of characters, use the data type called String. Ex: String message = "Welcome to Java"; •String is actually a predefined class in the Java library just like the System class and JOptionPane class. • The String type is not a primitive type. –It is known as a reference type. Any Java class can be used as a reference type for a variable. –Reference data types discussed in later Chapter: “Classes and Objects.” –For the time being, you just need to know how to declare a String variable, how to assign a string to the variable, and how to concatenate strings. 58 String Concatenation // Three strings are concatenated String message = "Welcome " + "to " + "Java"; // String Chapter is concatenated with number 2 String s = "Chapter" + 2; // s becomes Chapter2 // String Supplement is concatenated with character B String s = "Supplement" + 'B'; // s becomes SupplementB 59 Obtaining Input This book provides two ways of obtaining input. 1. Using JOptionPane input dialogs (§2.19) 2. Using the Scanner class (discussed in §2.3) 60 Getting Input from Input Dialog Boxes String string = JOptionPane.showInputDialog( null, “Prompting Message”, “Dialog Title”, JOptionPane.QUESTION_MESSAGE)); 61 Two Ways to Invoke the Method •There are many ways to use the showInputDialog method. •usage 1 : String string = JOptionPane.showInputDialog(null, x, y, JOptionPane.QUESTION_MESSAGE)); where x is a string for the prompting message, and y is a string for the title of the input dialog box. •Usage 2 : JOptionPane.showInputDialog(x); where x is a string for the prompting message. 62 Converting Strings to Integers •The input returned from the input dialog box is a string. –If you enter a numeric value such as 123, it returns “123”. •To obtain the input as a number, you have to convert a string into a number. •To convert a string into an int value, you can use the static parseInt method in the Integer class as follows: int intValue = Integer.parseInt(intString); where intString is a numeric string such as “123”. 63 Converting Strings to Doubles •To convert a string into a double value, you can use the static parseDouble method in the Double class as follows: double doubleValue =Double.parseDouble(doubleString); where doubleString is a numeric string such as “123.45”. 64 Example: Computing Loan Payments This program lets the user enter the interest rate, number of years, and loan amount and computes monthly payment and total payment. loanAmount monthlyInt erestRate 1 1 numberOfYears12 (1 monthlyInt erestRate ) ComputeLoan ComputeLoanUsingInputDialog 65 • The derivation of loan payment (skipped) • Let an = loan not paid yet at time n. r = monthly interest rate p = payment per month t = total months of payment • Then a0 = load(L), a1 = a0 (1+r) – p, … ,at = at-1(1+r) – p = 0. • Hence a k+1 = (1+r) ak – p =>ak+1-p/r = (1+r) (ak – p/r). => ak = b(1+r)k + p/r for some b. By initial condiction, a0 = b + p/r = L => b = (L-p/r) at = (L-p/r)(1+r)k + p/r = 0 => (L- p/r) (1+r)t + p/r = 0 =>L(1+r)t = p ((1+r)t -1)/r 66 => p = Lr / (1–1/(1+r)t) Example: Monetary Units input x.yy and compute x.yy dollars = ? dollar(100) + ? quarters(25) + ? dimes(10) + ? nickles(5) + ? pennies(1cent). ComputeChange 67 Trace ComputeChange Suppose amount is 11.56 int remainingAmount = (int)(amount * 100); // Find the number of one dollars int numberOfOneDollars = remainingAmount / 100; remainingAmount = remainingAmount % 100; remainingAmount 1156 remainingAmount initialized // Find the number of quarters in the remaining amount int numberOfQuarters = remainingAmount / 25; remainingAmount = remainingAmount % 25; // Find the number of dimes in the remaining amount int numberOfDimes = remainingAmount / 10; remainingAmount = remainingAmount % 10; // Find the number of nickels in the remaining amount int numberOfNickels = remainingAmount / 5; remainingAmount = remainingAmount % 5; // Find the number of pennies in the remaining amount int numberOfPennies = remainingAmount; 68 animation Trace ComputeChange Suppose amount is 11.56 int remainingAmount = (int)(amount * 100); remainingAmount // Find the number of one dollars int numberOfOneDollars = remainingAmount / 100; remainingAmount = remainingAmount % 100; numberOfOneDollars // Find the number of quarters in the remaining amount int numberOfQuarters = remainingAmount / 25; remainingAmount = remainingAmount % 25; 1156 11 numberOfOneDollars assigned // Find the number of dimes in the remaining amount int numberOfDimes = remainingAmount / 10; remainingAmount = remainingAmount % 10; // Find the number of nickels in the remaining amount int numberOfNickels = remainingAmount / 5; remainingAmount = remainingAmount % 5; // Find the number of pennies in the remaining amount int numberOfPennies = remainingAmount; 69 animation Trace ComputeChange Suppose amount is 11.56 int remainingAmount = (int)(amount * 100); remainingAmount 56 // Find the number of one dollars int numberOfOneDollars = remainingAmount / 100; remainingAmount = remainingAmount % 100; numberOfOneDollars 11 // Find the number of quarters in the remaining amount int numberOfQuarters = remainingAmount / 25; remainingAmount = remainingAmount % 25; remainingAmount updated // Find the number of dimes in the remaining amount int numberOfDimes = remainingAmount / 10; remainingAmount = remainingAmount % 10; // Find the number of nickels in the remaining amount int numberOfNickels = remainingAmount / 5; remainingAmount = remainingAmount % 5; // Find the number of pennies in the remaining amount int numberOfPennies = remainingAmount; 70 animation Trace ComputeChange Suppose amount is 11.56 int remainingAmount = (int)(amount * 100); remainingAmount 56 // Find the number of one dollars int numberOfOneDollars = remainingAmount / 100; remainingAmount = remainingAmount % 100; numberOfOneDollars 11 // Find the number of quarters in the remaining amount int numberOfQuarters = remainingAmount / 25; remainingAmount = remainingAmount % 25; numberOfOneQuarters 2 // Find the number of dimes in the remaining amount int numberOfDimes = remainingAmount / 10; remainingAmount = remainingAmount % 10; numberOfOneQuarter s assigned // Find the number of nickels in the remaining amount int numberOfNickels = remainingAmount / 5; remainingAmount = remainingAmount % 5; // Find the number of pennies in the remaining amount int numberOfPennies = remainingAmount; 71 animation Trace ComputeChange Suppose amount is 11.56 int remainingAmount = (int)(amount * 100); remainingAmount 6 // Find the number of one dollars int numberOfOneDollars = remainingAmount / 100; remainingAmount = remainingAmount % 100; numberOfOneDollars 11 // Find the number of quarters in the remaining amount int numberOfQuarters = remainingAmount / 25; remainingAmount = remainingAmount % 25; numberOfQuarters 2 // Find the number of dimes in the remaining amount int numberOfDimes = remainingAmount / 10; remainingAmount = remainingAmount % 10; remainingAmount updated // Find the number of nickels in the remaining amount int numberOfNickels = remainingAmount / 5; remainingAmount = remainingAmount % 5; // Find the number of pennies in the remaining amount int numberOfPennies = remainingAmount; 72 Example: Displaying Current Time Write a program that displays current time in GMT in the format hour:minute:second such as 1:45:19. The currentTimeMillis method in the System class returns the current time in milliseconds since the midnight, January 1, 1970 GMT. (1970 was the year when the Unix operating system was formally introduced.) You can use this method to obtain the current time, and then compute the current second, minute, and hour as follows. ShowCurrentTime Elapsed time Time Unix Epoch 01-01-1970 00:00:00 GMT Current Time System.CurrentTimeMills() 73 Programming Style and Documentation • Appropriate Comments • Naming Conventions • Proper Indentation and Spacing Lines • Block Styles 74 Appropriate Comments •Include a summary at the beginning of the program to explain –what the program does, –its key features, –its supporting data structures, and –any unique techniques it uses. •Include your name, class section, instructor, date, and a brief description at the beginning of the program. 75 Naming Conventions • Choose meaningful and descriptive names. • Variables and method names: – Use lowercase. – If the name consists of several words, concatenate all in one, use lowercase for the first word, and capitalize the first letter of each subsequent word in the name. (camelCase) – For example, the variables radius and area, and the method solveTwoProblems. 76 Naming Conventions, cont. • Class names: – Capitalize the first letter of each word in the name. For example, the class name ComputeArea. • Constants: – Capitalize all letters in constants, and use underscores to connect words. – For example, the constant PI and MAX_VALUE 77 Proper Indentation and Spacing • Indentation – Indent two spaces. • Spacing – Use blank line to separate segments of the code. 78 Block Styles Use end-of-line style for braces. Next-line style public class Test { public static void main(String[] args) { System.out.println("Block Styles"); } } public class Test { public static void main(String[] args) { System.out.println("Block Styles"); } } End-of-line style 79 Programming Errors • Syntax Errors – Detected by the compiler • Runtime Errors – Causes the program to abort • Logic Errors – Produces incorrect result 80 Syntax Errors public class ShowSyntaxErrors { public static void main(String[] args) { i = 30; System.out.println(i + 4); } } 81 Runtime Errors public class ShowRuntimeErrors { public static void main(String[] args) { int i = 1 / 0; } } 82 Logic Errors public class ShowLogicErrors { // Determine if a number is between 1 and 100 inclusively public static void main(String[] args) { // Prompt the user to enter a number String input = JOptionPane.showInputDialog(null, "Please enter an integer:", "ShowLogicErrors", JOptionPane.QUESTION_MESSAGE); int number = Integer.parseInt(input); // Display the result System.out.println("The number is between 1 and 100, " + "inclusively? " + ((1 < number) && (number < 100))); System.exit(0); } } 83 Debugging •Logic errors are called bugs. •The process of finding and correcting errors is called debugging. •A common approach to debugging is to use a combination of methods to narrow down to the part of the program where the bug is located. –You can hand-trace the program (i.e., catch errors by reading the program), or –you can insert print statements in order to show the values of the variables or the execution flow of the program. This approach might work for a short, simple program. –But for a large, complex program, the most effective approach for debugging is to use a debugger utility. 84 Debugger •Debugger is a program that facilitates debugging. • You can use a debugger to –Execute a single statement at a time. –Trace into or stepping over a method. –Set breakpoints. –Display variables. –Display call stack. –Modify variables. 85 Eclipse Optional Debugging in Eclipse The debugger utility is integrated in Eclipse. You can pinpoint bugs in your program with the help of the Eclipse debugger without leaving the IDE. The Eclipse debugger enables you to set breakpoints and execute programs step by step. As your program executes, you can watch the values stored in variables, observe which methods are being called, and know what events have occurred in the program. 86 Eclipse Optional Setting Breakpoints A breakpoint is a stop sign placed on a line of source code that tells the debugger to pause when this line is encountered. The debugger executes every line until it encounters a breakpoint, so you can trace the part of the program at the breakpoint. Using the breakpoint, you can quickly move over the sections you know work correctly and concentrate on the sections causing problems. How to set/remove a breakpoint on a line. –double click the ruler area of the line on which you want to put a breakpoint. – position the curser to the ruler area of the line, open context menu(right click mouth) and choose toggling breakpoint. 87 Eclipse Optional Setting Breakpoints, cont. ruler area As you debug your program, you can set as many breakpoints as you want, and can remove breakpoints at any time during debugging. The project retains the breakpoints you have set when you exit the project. The breakpoints are restored when you reopen it. Breakpoint 88 Eclipse Optional Starting the debugger Choose the program (e.g., ShowCurrentTime.java) in the package explorer view, or in the editor area and right-click the mouse button to display the context menu. Click Debug As JavaApplication in the context menu to start debugging. 89 Eclipse Optional Debugger perspective 90 JBuilder Optional Console View Console view displays output and errors. You can also enter input from the console view. Console view 91 Eclipse Optional Debug View Debug view displays the methods in the call stack. Viriable view show variables of methods in the call stack. Call stacks 92 Eclipse Optional Expression View You can add variables to the Expression view. Expression view displays the contents of the expression in the view. Data watches 93 Eclipse Optional Adding Expressions to Expression View There are several ways to add expressions to the watch view. A simple way is to select the expression and then right-click the mouse to display the context menu. Choose Watch in the context menu to add the expression to the expression view. 94 Eclipse Optional Controlling Program Execution The program pauses at the first breakpoint line encountered. This line, called the current execution point, is highlighted and has a green arrow to the left. The execution point marks the next line of source code to be executed by the debugger. When the program pauses at the execution point, you can issue debugging commands to control the execution of the program. You also can inspect or modify the values of variables in the program. When Eclipse is in the debugging mode, the Run menu contains the debugging commands. Most of the commands also appear in the toolbar. Here are the commands for controlling program execution: 95 Eclipse Optional Debugger Commands in the view Toolbar Resume program suspend terminate Step into Step overStep return 96 Eclipse Optional Debugger Commands in the Run Menu 97 Eclipse Optional Debugger Commands Step Over executes a single statement. If the statement contains a call to a method, the entire method is executed without stepping through it. Step Into executes a single statement or steps into a method. Step return executes all the statements in the current method and returns to its caller. Run to Line runs the program, starting from the current execution point, and pauses and places the execution point on the line of code containing the cursor, or at a breakpoint. Run to End of Method runs the program until it reaches the end of the current method or a breakpoint. Resume Program continues the current debugging session or restarts one that has finished or been reset. Terminate Program ends the current program and releases it from memory. Use Reset to restart an application from the beginning, as when you make a change to the code and want to run again from the beginning, or if variables or data structures become corrupted with unwanted values. This command terminates debugging and returns to the normal editing session. 98