42
Introduction to Java Data, Operators and Variables in Java ISM ISM 614 Summer 2001 Dr. Hamid Nemati

Introduction to Java Data, Operators and Variables in Java ISM ISM 614 Summer 2001 Dr. Hamid Nemati

Embed Size (px)

Citation preview

Introduction to Java Data, Operators and Variables in Java

ISM ISM 614

Summer 2001

Dr. Hamid Nemati

Summary Of Important Points

• Choosing an appropriate representation for a problem is often the key to solving it.

• Scalability principle: a well-designed model or representation should be easily extensible.

• Modularity principle: a well-designed representation contains methods that do not have to be modified each time the model is extended.

• To evaluate complex expressions, it is necessary to understand the precedence order and associativity of the operators involved.

• Parentheses can always be used to override an operator's built-in precedence.

Summary of Important Points (cont)

• Java integer data: the 8-bit byte, 16-bit short, 32-bit int, and 64-bit long types. Integer literals are represented as int data in a Java program.

• Java floating point data: the 32-bit float type and the 64-bit double type. Floating point literals are represented as float data.

• If a data type uses n bits in its representation then it can represent 2n different values.

• Platform independence: Java’s primitive types are defined in terms of a specific number of bits.

• Strong typing: Java distinguishes integer operations from floating point operations: (7/2) is 3, while (7.0/2) is 3.5.

Summary of Important Points

• When revising a class that is used by other classes, it is a good idea to make it backward compatible. In revising a class that is used by other classes it is important to preserve as much of the class's interface as possible.

• In Java, character data are based on the Unicode character set, which provides 216 = 65,536 different character codes. To provide backwards compatibility with the ASCII code, the first 128 characters are the ASCII coded characters.

Variables

• A variable is a place to store information• The storage location is in computer’s memory.• When a variable is declare, Variable Declaration

the compiler is told how much space to set aside for it and what kind of value will be stored in that space.

• Each variable will store a particular kind of data (Data Type), type modifier.

• value of a variable will usually change many times as the program calculation progresses

Naming of a Variables

• The name of a variable is called an identifier.

• Variable names should be descriptive of their purpose.

• Java IS case sensitive.

• Variable names can include the letters A-z (upper or lower case), the digits 0-9 and the underscore character. All other characters are illegal.

• Variable names must also begin with either a letter or an underscore.

• Names are usually chosen to indicate the kind of information to be stored.

Boolean Data and Operators

Oper 1 Oper 2 AND OR XOR NOTo1 o2 o1 && o2 o1 || o2 o1 ^ o2 !o1

true true true true false falsetrue false false true true falsefalse true false true true truefalse false false false false true

Truth table definitions of the boolean operators: AND (&&), OR (||), EXCLUSIVE-OR (^) and NOT (!).

Boolean data have only two possible

values, true and false.

o1 && o2 is true only if both o1 and o2 are true.

o1 || o2 is true if either o1 or o2 is true.

o1 ^ o2 is true if either o1 or o2 is true, but not

when both are true.

!o1 is true when o1 is false.

Boolean Operator Precedence

PrecedenceOrder

Operator Operation

1 ( ) Parentheses2 ! NOT3 && AND4 ^ XOR5 || OR

Precedence Order of Boolean Operators.

EXPRESSION EVALUATIONtrue || true && false true || false ==> true

(true || true) && false true && false ==> false(true || (true && false) true || false ==> true

AND is evaluated before OR because it has higher precedence.

Parentheses can override the built-in precedence order.

In a mixed expression, NOT would be evaluated before AND, which would be evaluated before XOR, which would be evaluated

before OR.

Boolean-based CyberPet Model

public class CyberPet { private boolean isEating; // CyberPet's state private boolean isSleeping;

public CyberPet () // Constructor method { isEating = true; isSleeping = false; }} // CyberPet

CyberPet’s state is represented by two boolean variables.

Boolean-based Model is Impractical

• Difficult to modify or extend to new states.• To add a thinking state, you need a new variable,

isThinking, a think() method, and you need to modify all the other methods in the class.

boolean isThinking;

public void think() { isSleeping = false; isEating = false; isThinking = true;} // think()

public CyberPet() { isSleeping = false; isEating = true; isThinking = false;} // CyberPet constructor

public void eat() { isSleeping = false; isEating = true; isThinking = false;} //eat()

Numeric Data Types

Type Number of Bits Range of Valuesbyte 8 -128 to + 127short 16 -32768 to 32767int 32 -2147483648 to 2147483647

long 64 -263 to -263 -1

float 32 -3.40292347 E+38 to 3.40292347 E+38double 64 -1.79769313486231570 E+308 to

1.79769313486231570 E+308

• Each bit can represent two values. • An n-bit quantity can represent 2n values. 28 = 256

possible values.• Effective Design: Platform Independence. In Java

a data type’s size is part of its definition and therefore remains consistent across all platforms.

Numeric Data: Limitations

• Numeric types are representations of number systems, so there are tradeoffs:– A finite number of integers can be represented.– A finite number of values between 1.11 and 1.12..

• Debugging Tip: A round-off error is the inability to represent certain numeric values exactly.

• A float can have at most 8 significant digits. So 12345.6789 would be rounded off to 12345.679.

• Debugging Tip: Significant Digits. In using numeric data the data type you choose must have enough precision to represent the values your program needs.

Standard Arithmetic Operators

Operation Operator JavaAddition + m + 2

Subtraction - m – 2Multiplication * m * 2

Division / x / yModulus % x % y

• Typed Operators: Integer division gives an integer result. Mixed integer and floating point expressions give a floating point result. 3 / 2 ==> value 1 An integer result

3.0 / 2.0 ==> value 1.5 A floating point result3 / 2.0 ==> value 1.5 A floating point result3.0 / 2 ==> value 1.5 A floating point result

• Modulus operator (%) gives remainder of integer division. 6 % 4 ==> 6 mod 4 equals 24 % 6 ==> 4 mod 6 equals 46 % 3 ==> 6 mod 3 equals 03 % 6 ==> 3 mod 6 equals 3

Promotion

3 / 2.0 ==> 3.0 / 2.0 ==> value 1.5 // Floating point result3.0 / 2 ==> 3.0 / 2.0 ==> value 1.5 // Floating point result

• Promotion Rule: When two different types are involved in an expression, the smaller type (fewer bits) is promoted to the larger type before the expression is evaluated.

If either operand is: The other is promoted todouble doublefloat floatlong long

byte or short int

Numeric Precedence

• Precedence Rule: In a mixed expression arithmetic operators are evaluated in precedence order. Operators of the same precedence are evaluated from left to right.

Evaluate: 9 + 6 - 3 * 6 / 2Step 1. ( (9 + 6) - ((3 * 6) / 2 ) )Step 2. ( (9 + 6) - (18 / 2 ) )Step 3. ( (9 + 6) - 9 )Step 4. ( 15 - 9 )Step 5. 6

Parentheses can be used to clarify precedence order.

PrecedenceOrder

Operator Operation

1 ( ) Parentheses2 * / % Multiplication, Division, Modulus3 + - Addition, Subtraction

18.0 / 6 % 5 // Syntax error18.0 + 6 % 5 // valid expression = 19.0

Or to avoid subtle syntax errors.

Increment/Decrement Operators

• Unary increment and decrement operators.

Expression Operation Interpretationj = ++k; Preincrement k = k + 1; j = k;j = k++; Postincrement j = k; k = k + 1;j = --k; Predecrement k = k – 1; j = k;j = k--; Postdecrement j = k; k = k – 1;

• Language Rule: If ++k or --k occurs in an expression, k is incremented or decremented before its value is used in the rest of the expression. If k++ or k-- occurs in an expression, k is incremented or decremented after its value is used in the rest of the expression.

Increment k, then use it.

Use k , then increment it.

Assignment Operators

• Shortcut assignment operators: combine an arithmetic and assignment operation into a single expression.

Operator Operation Example Interpretation= Simple assignment m = n; m = n;

+= Addition then assignment m += 3; m = m + 3;-= Subtraction then assignment m -= 3; m = m - 3;*= Multiplication then assignment m *= 3; m = m * 3;/= Division then assignment m /= 3; m = m / 3;

%= Remainder then assignment m %= 3; m = m % 3;

Exampler += 3.5 + 2.0 * 9.3; r = r + ( 3.5 + 2.0 * 9.3 ); // r = r + 19.1;

Relational Operators

• Some relational operators require two symbols (which should not be separated by a space between them).

Operator Operation Example< less than 5 < 10> greater than 10 > 5

<= less than or equal to 5 <= 10>= greater than or equal to 10 >= 5== equal to 5 == 5!= not equal to 5 != 4

Numeric Operator Precedence

• Precedence Rule: Relational and equality operations are performed after arithmetic operations.

Evaluate: 9 + 6 <= 25 * 4 + 2Step 1. (9 + 6) <= ( (25 * 4) + 2) Step 2. (9 + 6) <= ( 100 + 2) Step 3. 15 <= 102Step 4. true

PrecedenceOrder

Operator Operation

1 ( ) Parentheses2 ++ -- Increment, Decrement3 * / % Multiplication, Division, Modulus4 + - Addition, Subtraction5 < > <= >= Relational Operators6 == != Equality Operators

Evaluate: 9 + 6 <= 25 * 4 == 2Step 1. ( (9 + 6) <= (25 * 4) ) == 2 Step 2. ( (9 + 6) <= 100 ) == 2 Step 3. ( 15 <= 100 ) == 2Step 4. true == 2 // Syntax Error

• Use parentheses to disambiguate and avoid syntax errors.

Case Study: Fahrenheit to Celsius

• Design an applet that converts Fahrenheit to Celsius temperatures.

• GUI Design: The applet will server as an interface between the user and the Temperature object.

• The Temperature object will perform the conversions.

// Design Specification for the Temperature classpublic Temperature(); // Constructorpublic double fahrToCels(double temp); // Public instance methodspublic double celsToFahr(double temp);

Implementation: Temperature Class

public class Temperature { public Temperature() {}

public double fahrToCels( double temp ) { return (5.0 * (temp - 32.0) / 9.0); } public double celsToFahr( double temp ) { return (9.0 * temp / 5.0 + 32.0); }} // Temperature

Note the use of parentheses and the use of real number

literals here.

Potential Error Here: The expression(9 / 5 * temp + 32)

evaluates to (temp + 32).

Implementation: TemperatureTest Class

import java.io.*; // Import the Java I/O classespublic class TemperatureTest {

public static void main(String argv[]) throws IOException { BufferedReader input = new BufferedReader // Handles console input (new InputStreamReader(System.in)); String inputString; // inputString stores the input Temperature temperature = new Temperature(); // Create a Temperature object double tempIn, tempResult; System.out.println("This program will convert Fahrenheit to Celsius and vice versa."); // Convert Fahrenheit to Celsius System.out.print("Input a temperature in Fahrenheit > "); // Prompt for Celsius inputString = input.readLine(); // Get user input tempIn = convertStringTodouble(inputString); // Convert to double tempResult = temperature.fahrToCels(tempIn); // Convert to Celsius System.out.println(tempIn + " F = " + tempResult + " C "); // Report the result // Convert Celsius to Fahrenheit System.out.print("Input a temperature in Celsius > "); // Prompt for Celsius inputString = input.readLine(); // Get user input tempIn = convertStringTodouble(inputString); // Convert to double tempResult = temperature.celsToFahr(tempIn); // Convert to Fahrenheit System.out.println(tempIn + " C = " + tempResult + " F "); // Report the result } // main()} // TemperatureTest

public static double convertStringTodouble(String s) { Double doubleObject = Double.valueOf(s); return doubleObject.doubleValue();}

Algorithm:

1. Input

2. Process

3. Output

Interface Design: Prompts help orient the user.

Implementation: Data Conversion

public static double convertStringTodouble(String s) { Double doubleObject = Double.valueOf(s); return doubleObject.doubleValue();}

The convertStringTodouble() method converts the user’s input string into a double

Typical Usage:convertStringTodouble(“125.5”) ==> 125.5

• Modularity Principle: Method Abstraction. Encapsulating complex operations in a method reduces the chances for error, and makes the program more readable and maintainable. Using methods raises the level of abstraction in the program.

Implementation: Testing and Debugging

• It is important to develop good test data. For this application the following tests would be appropriate:– Test converting 0 degrees C to 32 degrees F.– Test converting 100 degrees C to 212 degrees F.– Test converting 212 degrees F to 100 degrees C.– Test converting 32 degrees F to 0 degrees C.

• These data test all the boundary conditions.• Testing Principle: The fact that your program runs correctly on some data is no guarantee of its

correctness. Testing reveals the presence of errors, not their absence.

Integer-based CyberPet Model (Data)

public class CyberPet { public static final int EATING = 0; // Class constants public static final int SLEEPING = 1; public static final int THINKING = 2;

private int petState; // Instance variables private String name;

} // CyberPet

Instead of literals, class constants are used give names

to the various state values.

A final variable cannot be modified and must

be initialized.

A static variable or method is

associated with the class, not the

instance. A pet’s state is represented by a single integer variable.

• Maintainability Principle: Constants should be used instead of literal values in a program to make the program easier to modify and maintain.

Integer-based CyberPet Model (Constructors)

public class CyberPet { public CyberPet() { // Constructor #1 name = "no name"; petState = EATING; } public CyberPet(String str) { // Constructor #2 name = str; petState = EATING; } public CyberPet(String str, int inState) { // Constructor #3 name = str; petState = inState; } public CyberPet(String str, boolean sleeping) { // Constructor #4 name = str; if (sleeping == true) petState = SLEEPING; else petState = EATING; }} // CyberPet

New: This constructor sets the pet’s initial state from an int parameter.

Old: This constructor is revised to make it backward compatible with

boolean model.

Integer-based CyberPet Model (Methods)

public class CyberPet { public void setName(String str) { name = str; } // setName() public String getName() { return name; } // getName() public void eat() { petState = EATING; } // eat() public void sleep() { petState = SLEEPING; } // sleep() public void think() { petState = THINKING; } // think() public String toString() { return "I am a CyberPet named " + name; }} // CyberPet

public String getState() { if (petState == EATING) return "Eating"; if (petState == SLEEPING) return "Sleeping"; if (petState == THINKING) return "Thinking"; return "Error in State"; } // getState()

The eat(), sleep() and think() methods are simplified to one line.

Class constants

Character Data and Operators

• The char type is a primitive data type.• A character is represented by a 16-bit unsigned

integer.• A total of 216 = 65536 characters can be

represented.• Java uses the international Unicode character set.• The first 128 Unicode characters are identical to

the characters in the 7-bit ASCII (American Standard Code for Information Interchange).

The ASCII Characters

Code 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 Char SP ! " # $ % & ' ( ) * + , - . /

Code 48 49 50 51 52 53 54 55 56 57 Char 0 1 2 3 4 5 6 7 8 9

Code 58 59 60 61 62 63 64 Char : ; < = > ? @

Code 65 66 67 68 69 70 71 72 73 74 75 76 77 Char A B C D E F G H I J K L M

Code 78 79 80 81 82 83 84 85 86 87 88 89 90 Char N O P Q R S T U V W X Y Z

Code 91 92 93 94 95 96 Char [ \ ] ^ _ `

Code 97 98 99 100 101 102 103 104 105 106 107 108 109 Char a b c d e f g h i j k l m

Code 110 111 112 113 114 115 116 117 118 119 120 121 122 Char n o p q r s t u v w x y z

Code 123 124 125 126 Char { | } ~

Character to Integer Conversions

• Character data may be manipulated as characters or as integers.

char ch = 'a';System.out.println(ch); // Displays 'a'System.out.println((int)'a') ; // Displays 97

Cast operator.

• A cast operator converts one type of data (‘a’) into another (97).

• Java allows certain implicit conversions but other conversions require an explicit cast.

char ch;int k;k = ch; // convert a char into an intch = k; // Syntax error: can’t assign int to char

Type Conversions

• Rule: Java permits implicit conversions from a narrower to a wider type.

• A cast operator must be used when converting a wider into a narrower type.

• The cast operator can be used with any primitive type. It applies to the variable or expression that immediately follows it:

char ch = (char)(m + n); // Casts the sum of m and n to a charchar ch = (char)m + n; // Syntax error: right hand side is an int Promotion Rule: Java promotes ‘5’ to 5 before

carrying out the addition, giving 5 + 4 = 9.

Relational Operators

Operation Operator Java True Expressionprecedes < ch1 < ch2 ‘a’ < ‘b’

follows > ch1 > ch2 ‘c’ > ‘a’

precedes or equals <= ch1 <= ch2 ‘a’ <= ‘a’

follows or equals >= ch1 >= ch2 ‘a’ >= ‘a’

equal to == ch1 == ch2 ‘a’ == ‘a’

not equal to != ch1 != ch2 ‘a’ != ‘b’

• Since char data are represented as integers, Java can use integer order to represent lexical order.

Example Character Conversions

(char)('a' - 32) ==> 'A' // Here’s how it works:Step 1. (char)((int)'a' - 32) // Java promotes 'a' to intStep 2. (char)(97 - 32) // SubtractStep 3. (char) (65) // Cast result to a charStep 4. 'A' // Giving 'A'

• Convert a character from lowercase to uppercase.

• Convert a digit to an integer by subtracting ‘0’.

('9' - '0') ==> (57 - 48) ==> 9

Promotion Rule: Java promotes ‘9’ to 9 and ‘0’ to 0 before carrying out the subtraction.

Conversion Methods

public char toUpperCase (char ch) { if ((ch >= 'a') && (ch <= 'z')) return (char)(ch - 32); return ch;}

public int digitToInteger (char ch) { if ((ch >= '0') && (ch <= '9')) return ch - '0'; return -1 ;}

Parameter is char

Return type is char

Return type is int

From the Java Library: java.lang.Math

public final class Math { // A final class cannot be subclassed private Math() {} // A private constructor cannot be invoked ... public static native double sqrt (double a) throws ArithmeticException;}

• The java.lang.Math class provides common mathematical functions such as sqrt().

All Math class methods are static class methods. They are invoked as follows:

Math.sqrt(55.3)

The Math class can not be subclassed or instantiated.

Math Class Methods

Method Description Examples

abs(int x) abs(long x) abs(float x)

absolute value of x if x >= 0 abs(x) is x if x < 0 then abs(x) is -x

ceil(double x) rounds x to the smallest integer not less than x

ceil(8.3) is 9 ceil(-8.3) is -8

floor(double x) rounds x to the largest integer not greater than x

floor(8.9) is 8 floor(-8.9) is -9

log(double x) natural logarithm of x log(2.718282) is 1

pow(double x, double y) x raised to the y power (xy) pow(3,4) is 81 pow(16.0, 0.5) is 4.0

double random() generates a pseudorandom number in the interval [0,1)

random() is 0.5551 random() 0.8712

round(double x) rounds x to an integer round(26.51) is 27 round (26.499) is 26

sqrt(double x) square root of x sqrt(4.0) is 2

Math Class Example: Rounding

Algorithm to round 75.1999991. Multiply the number by 100, giving 7519.9999.2. Add 0.5 to the number giving 7520.4999.3. Drop the fraction part giving 75204. Divide the result by 100, giving 75.20

• When representing currency, it is often necessary round numbers to two decimal places:

R = Math.floor(R * 100.0 + 0.5) / 100.0;

• In Java, using the Math.floor() method:1 23 4

From the Java Library: NumberFormat

• Java provides the java.text.NumberFormat class for representing currency and percentage values.

public abstract class NumberFormat extends Format { // Class methods public static final NumberFormat getInstance(); public static final NumberFormat getCurrencyInstance(); public static final NumberFormat getPercentInstance(); // Public instance methods public final String format(double number); public final String format(long number); public int getMaximumFractionDigits(); public int getMaximumIntegerDigits(); public void setMaximumFractionDigits(int newValue); public void setMaximumIntegerDigits(int newValue);}

An abstract class cannot be instantiated...

…so use the getInstance() methods to

create an instance.

Example: Calculating Compound Interest

• Problem: Write an application that compares the difference between daily and annual compounding of interest for a Certificate of Deposit.

• Use the formula a = p(1 + r)n, where:– a is the CD’s value at the end of the nth yr– p is the principal or original investment amount– r is the annual interest rate– n is the number of years or compounding period

• Effective Design: Method Length. Methods should be focused on a single task. If you find your method getting longer than 20-30 lines, divide it into separate methods.

The CDInterest Application

import java.io.*; // Import the Java I/O Classesimport java.text.NumberFormat; // For formatting as $nn.dd or n%

public class CDInterest { private BufferedReader input = new BufferedReader // For input (new InputStreamReader(System.in)); private String inputString; // Stores the input private double principal; // The CD's initial principal private double rate; // CD's interest rate private double years; // Number of years to maturity private double cdAnnual; // Accumulated principal, annual private double cdDaily; // Accumulated principal, daily

public static void main( String args[] ) throws IOException { CDInterest cd = new CDInterest(); cd.getInput(); cd.calcAndReportResult(); } // main()} // CDInterest

Algorithm: Input, process, output.

CDInterest.getInput() Method

private void getInput() throws IOException { // Prompt the user and get the input System.out.println(”Compares daily and annual CD compounding.");

System.out.print("Input the initial principal, e.g. 1000.55 > "); inputString = input.readLine(); principal = convertStringTodouble(inputString);

System.out.print("Input the interest rate, e.g. 6.5 > "); inputString = input.readLine(); rate = (convertStringTodouble(inputString)) / 100.0;

System.out.print("Input the number of years, e.g., 10.5 > "); inputString = input.readLine(); years = convertStringTodouble(inputString);} //getInput()

Input must be converted to double.

The readLine() method might cause an IOException.

Input values are stored in instance variables.

CDInterest.calcAndReportResult() Method

private void calcAndReportResult() { // Calculate and output the result NumberFormat dollars = NumberFormat.getCurrencyInstance(); // Set up formats NumberFormat percent = NumberFormat.getPercentInstance(); percent.setMaximumFractionDigits(2); cdAnnual = principal * Math.pow(1 + rate, years); // Calculate interest cdDaily = principal * Math.pow(1 + rate/365, years * 365); // Print the results System.out.println("The original principal is " + dollars.format(principal)); System.out.println("The resulting principal compounded daily at " + percent.format(rate) + " is " + dollars.format(cdDaily)); System.out.println("The resulting principal compounded yearly at " + percent.format(rate) + " is " + dollars.format(cdAnnual));} // calcAndReportResult()

NumberFormat class used to format the output.

This program compares daily and annual compounding for a CD.

Input the CD's initial principal, e.g. 1000.55 > 10000 Input the CD's interest rate, e.g. 6.5 > 7.768

Input the number of years to maturity, e.g., 10.5 > 10The original principal is $10,000.00

The resulting principal compounded daily at 7.77% is $21,743.23

The resulting principal compounded yearly at 7.77% is $21,129.94

Output is properly formatted.