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 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!