Chapter 3 - Computer Sciences User Pages
Download
Report
Transcript Chapter 3 - Computer Sciences User Pages
Chapter 4 – Fundamental
Data Types
Goals
Gain a firm understanding of the fundamental
data types and their properties and limitations
Understanding strings
Dealing with user input, and program output
Number Types
All values are either references to objects or one of
8 primitives
A numeric computation overflows if the result
falls outside the range for the number type
int n = 1000000;
System.out.println(n * n);
// prints -727379968
Primitives
So far we’ve seen 6 number types
byte, short, int, long for whole numbers
float, double for reals
Numbers can have overflow (value too large)
Reals can also have underflow (rounding errors)
double f = 4.35;
System.out.println(100 * f);
// prints 434.99999999999994
Conversion
2 types of conversion – increase in precision, decrease
in precision
Increase in precision(int to long, byte to float)
More memory being used
Allowed in Java – Java does this automatically
Ex.
int dollars = 100;
double balance = dollars; //OK
Conversoin
Decrease in precision
Representing a number with less memory
Error in Java – the compiler will yell at you
Example:
double balance = 13.75;
int dollars = balance; //ERROR!
Type Casting
Error is because compiler wants us to know that
we are going to possibly lose information
4.0 to 4, not a big deal
.99 to 0, is a big deal
To override this (i.e. tell the compiler to convert
anyways) we must use the type cast operator
Type Casting: Syntax
(<type>) expression
Example
double balance = 12.45;
int dollar = (int) balance; //stores 12
Truncates (removes fractional part) when going
from real (ie double) to whole number (ie int)
Can cast to any type you want (including objects)
Rounding
What if you want to round instead of truncate?
2 solutions:
Hack: add 0.5 to number then truncate
Real solution: Use Math.round()
long rounded = Math.round(balance);
Constants
In math, equations have variables and constants
In programming, the same
Already learned about variables
Numbers that do change but have specific meanings
are important
Randomly placed numbers in a program can be
confusing, so we give them symbolic names
Constants
Use a constant to hold the value
Use reserved word final to modify declaration
Can’t change after assigned when declared
final double PI = 3.14159;
Naming Convention for constants
USE_ALL_CAPS_WITH_UNDERSCORES
Constants
Constants often used for important numbers
Make meaning of code easier to understand
Make changes to code a lot easier
Constants: Example
public double getPay ()
{
double pay = numHours * 6.70;
return pay;
}
What is 6.70 doing?
Why is it there?
Constants: Example
public double getPay ()
{
final int PAY_RATE = 6.70;
double pay = numHours * PAY_RATE;
return pay;
}
Much easier to understand now when reading the code
Much easier to change now as well
Class Constants
Often, we want to use the same constant across
several methods in a class
To do this, make a constant instance field
Class Constants
Differences in the declaration
Make it public since we don’t have to worry about the value
being changed
Add static modifier to make it part of the class, so all objects
of that class share it (more on this later)
public class Math {
…
public static final double E = 2.71828
public static final double PI = 3.14159
…
}
Class Constants
One copy of the variable (static)
Available to all classes (public)
Example: You have a class where you want to
calculate circumference
double circumference = Math.PI * diameter
Constant Definition
In a method (local constant)
final <type> <name> = <value>;
final int PAY_RATE = 6.70;
In a class (class constant)
<accessSpecifier> static final <type>
<name> = <value>;
public static final int HOURS_IN_DAY =
24;
Constants
So when should I use a constant?
In general if the number has significance, give it
a symbolic name (make it a constant identifier)
Example
time = duration * 60;
Is this converting minutes to seconds or hours
to minutes?
Assignment, Increment, and
Decrement
= is the assignment operator
On the left, place the variable
On the right, place the expression/value
Not an equality sign!!!
Action is to copy the right side to the variable
on the left side
Interesting twists on =
items = items + 1;
Expression to right is always computed first
Add items
+ 1;
The value of the expression is assigned to the
variable afterwards
Example
Example
int items = 1;
items = items + 1;
Do right side first 2
Assign to items items
= 2
Increment Operator
Net result is to increment items by 1
Increment is so common, Java uses a shorthand
for it
++ operator increases the value of a variable by
one
Increment Operator
items = items + 1;
Postincrement:
items++;
Preincrement:
++items;
Decrement Operator
items = items - 1;
Postdecrement:
items--;
Predecrement:
--items;
Other Shortcuts
Arithmetic modifications to a variable can use
shorthand operations
items = items +5; items += 5;
items = items*2; items *= 2;
items = items – 2*5; items -= 2*5;
Arithmetic
Already seen some symbols, here are all
Operators – mathematical operations
+
addition
Subtraction
*
Multiplication
/
Division
%Modulo (Remainder)
Operands – the values to which the operator is
applied
Examples
int x = 3 + 5;
// 8
x = 10/2;
// 5
x = 10 * 3 – 4;
// 26
x = 12 % 5;
// 2
Division
Returns quotient
When both operands are integers, an integer is
returned
x = 10/2 … x = ?
y = 6/3 … y = ?
When either or both operands are real, a real is
returned
z = 2.5/0.5 … z = ?
Integer Division
When dividing two integers, only the whole
number is returned
Examples:
6/4 = ?
1/5 = ?
-3/4 = ?
6/3 = ?
Integer Division
Why does Java do this?
Easier for the computer
Has it’s advantages:
int
int
int
int
totalTime = 503;
MINUTES_PER_HOUR = 60;
hours = totalTime / MINUTES_PER_HOUR;
minutes = totalTime % MINUTES_PER_HOUR;
Modulo Operator
Returns remainder
23 % 5 = 3
4%2=?
Mainly used for integers (possible for reals also,
but not as useful)
Precedence
High
subexpressions
unary operators
multiplicative operators
additive operators
Low
()
-, +
*, /, %
+, -
Precedence
Parenthesis take precedence
(a + b) / 2 different than a + b /2
Math Class
Provided automatically (it’s in the java.lang package)
Exponentiation
Math.pow(x,n) xn
Square Roots
Math.sqrt(x)
x0.5
Math Class
Translating expressions from mathematics to
Java is a little different
Java has no exponents, symbols, or fraction bars
so we can’t write
6^3
√5
Quadratic Equation
(-b + Math.sqrt(b * b -4 * a * c)) / (2 * a)
Math Class
In mathematical notation:
In Java:
(-b + Math.sqrt(b*b - 4*a*c))/(2*a)
In Java
(-b + Math.sqrt(b *b -4
*a * c)) / (2 * a)
Precedence
Math Class
Questions
What is the value of
1729 / 100?
1729 % 100?
Computing Average: Is this correct?
double average = s1 + s2 + s3 / 3;
What if
s1, s2, s3
are integers?
Style
White space inside equations can go a far way –
placing spaces before and after arithmetic
symbols is very helpful
White space can also be helpful to group code
i.e. have 5 lines for calculating some information,
then a blank line followed by a series of output
Style
Important property for good programming –
never have two lines of code doing the exact
same thing
Won’t be heavily enforced, but good to get practice
Inefficient – making computer do work twice
Error prone – when there is a bug, you may only fix
it one place
Example – Quadratic Eqn
x1 =
(2
x2 =
(2
(-b + Math.sqrt(b * b – 4 * a * c)) /
* a);
(-b - Math.sqrt(b * b – 4 * a * c)) /
* a);
double root = Math.sqrt(b * b – 4 * a * c);
x1 = (-b + root) / (2 * a);
x2 = (-b - root) / (2 * a);
Static Methods
So far we have been discussing classes as
templates and objects as the entities
All the methods and instance fields for the Path
class belonged to an individual object
Each had its own xDistance, yDistance
A method call was on the object itself
p.getX() different then q.getX()
Static Methods
Has everything we’ve used been an object?
System
Math
Both of these are classes, yet we made calls on
them to either fields (System.out) or methods
(Math.sqrt())
We never created an instance Math of the class or
System class
Static Methods
The calls on the Math class were unique
They were static – belonging to the class, not an
individual object
In other words, these methods did not depend
on an object
Math.sqrt() will ALWAYS do the same thing, so
why create an object whenever we use it?
Static Methods
Static methods are defined in the classes like
normal methods
They do not operate on object, though
Don’t have any internal data to deal with
Static Methods: Syntax
ClassName.methodName(parameters)
Example:
Math.sqrt(4)
Purpose:
To invoke a static method (a method that does
not operate on an object) and supply its
parameters
Static Methods
How can we tell if methods are static?
Java follows conventions: for example, Math is
capitalized, so we know it’s a class
Look at javadocs - static methods will be listed with
the static modifier
Strings
Along with numbers, the most commonly used
data type in programming
Unlike numbers, Strings are objects
Already learned about length() method
String str = “four”;
System.out.println(str.length()) 4
“” is the empty string
Strings
Strings are sequences of characters
Each character is stored at an index of the
string
Indexing begins at 0!
The charAt method returns the character at the
specified index
0
1
2
D
o
n
3
n
4
a
Concatenation
Putting strings together
If either left or right side is a String, the result is String (no
matter what the other side is)
Works left to right
How does Java interpret:
A + B + C
"A" + "B" + "C"
1 + 2 + 3
"1" + 2 + 3
"(1+2+3)"
1 + 2 + "3"
Concatenation
Concatenation is useful for outputting results
System.out.print(“My age is ”);
System.out.println(age);
vs.
System.out.println(“My age is ” + age);
Number to String Conversion
Converting from a number to String is easy
int number = 15;
String string = "" + number;
How about the reverse?
int result = Integer.parseInt(someString);
double result = Double.parseDouble(someString);
Similar for all other number types
Parsing
Only works if entire string is a number
"19" // Works for parseInt() & parseDouble()
"15.23"
// Works for parseDouble() only
"123a"
// Error for both
Strings
String substring()
method
String greeting = "Hello, World!";
String sub = greeting.subString(0,5);
// sub is "Hello“
Note that the first parameter is the first letter you
want (zero based indexing) and the second
parameter is the first letter you DON’T want
Reading Input
All examples so far have been pretty basic
Do not vary, we code in all values when testing
Most useful programs interact with a user to get
data input and perform operations on that data
Reading Input
Output uses the System.out object
You would think input should then use
System.in
Exists, but not very powerful
Takes in only one byte of information at a time,
when all characters on the keyboard are 2 bytes!
Reading Input
Input used to be a pain in Java (relatively
speaking)
BufferedReader buf = new BufferedReader(
new InputStreamReader(System.in));
int a = Integer.parseInt(buf.readLine());
Java 5.0 now includes a Scanner class
Easily connect to keyboard to get input
Scanner stdin = new Scanner(System.in);
int a = stdin.nextInt();
Reading Input
Scanner can be associated with files, but for now
we will learn about keyboard input
A Scanner object must be created, associated
with System.in as follows:
Scanner stdin = new Scanner(System.in);
Reading Input
To read numbers from user, use the methods
nextInt(), nextDouble()
When called, these methods wait for the user to
type input and then hit the enter key. The
number inputted is returned
Usually, the program will prompt the user for
information – give instructions via System.out
Reading Input
To get a String, use nextLine()
Allows user to type as much as they want.
When they hit enter, all characters typed are
returned as a String object
To read just one word (not entire line), use
next()
Example
Scanner stdin = new Scanner(System.in);
System.out.print("Enter name: ");
String name = stdin.nextLine();
System.out.print("Enter age:
int age = stdin.nextInt();
");
Characters
char stores one character (one letter or one
digit or one symbol)
Computer thinks of everything as numbers
including characters
‘0’ (48) + ‘A’ (65) is equal to ‘q’ (113)
How do we know what numbers different
characters correspond to?
Characters
Encodings: specify what number a character is
ASCII – basic 128 characters
Stores only English letters, digits, and a few symbols
Unicode – every symbol used on computers
Stores accented characters, Chinese characters, Greek
letters, etc
ASCII is a subset of Unicode
Java uses Unicode, but we’re really only concerned
with ASCII in this course
Escape Sequences
Backslashs signal escape sequences
Suppose you wanted to print
He said, “We need more cows”
What’s the problem with
System.out.println(
“He said, “We need more cows””);
Escape Sequences
Solution:
System.out.println(
“He said, \“We need more cows\””);
Other useful escape sequences:
\n
\t
\’
new line
tab
single quote
Formatting Numbers
will print out all available digits for a
real number
To change, new method printf() is available in
the PrintStream class (System.out)
println()
System.out.printf(“Total:%5.2f”, total);
Used in other programming languages
Productivity Hint
Those error messages you get for runtime errors
can actually be your friend!
Provide two pieces of information
The error (interpreting will be easier later in the
semester)
More importantly: The line of the error!