Basic Concepts
Advanced Programming
SUT • Spring 2019
Review
-
Variables
-
Primitive data types
-
-
Operators
-
Methods
-
Parameter passing
-
Call by value
-
-
Conditions
-
If, else, else if
-
-
Loops
-
while
-
do-while
-
for
-
Outline
-
Review
-
User input
-
Scanner
-
-
Strong type checking
-
Other flow-control structures
-
switch
-
break & continue
-
-
Strings
-
Arrays
User input
User input
-
Print on console
-
System.out.println
-
-
How to read from console?
-
Scanner
-
import java.util.Scanner;
public class UserInput {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
double d = scanner.nextDouble();
}
public static void power() {
Scanner scanner = new Scanner(System.in);
int a = scanner.nextInt();
int b = scanner.nextInt();
long pow = (long)Math.pow(a, b);
System.out.println(pow);
}
}
Type Checking
Type Checking
-
Java has a strong type-checking mechanism
-
Some assignment is not permitted
public class TypeChecking{
public static void main(String[] args){
int intVal = 2;
long longVal =12;
// intVal = longVal; // Syntax Error
longVal = intVal; // OK
intVal = (int)longVal; // OK (Type Casting)
}
}
Direct Type Conversion
-
The arrows are transitive
-
All other conversions need an explicit cast
-
boolean is not convertible
-
char is a special type
short
byte
char
int
long
float
double
boolean
Type Conversion Grid
From | 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 | N | C | C | - | Y | Y | Y | Y |
int | N | C | C | C | - | Y | Y* | Y |
long | N | C | C | C | C | - | Y* | Y* |
float | N | C | C | C | C | C | - | Y |
double | N | C | C | C | C | C | C | - |
Type Conversion
-
N : the conversion cannot be performed
-
Y : the conversion is performed automatically and implicitly by Java
-
C : the conversion is a narrowing conversion and requires an explicit cast
-
Y* : the conversion is an automatic widening conversion, but that some of the least significant digits of the value may be lost by the conversion
Example
-
floating-point types are approximations of numbers
-
They cannot always hold as many significant digits as the integer types
public class TypeConversion {
public static void main(String[] args) {
int i = 123456789; //a big integer
double f = i; //f stores and approximation of i
System.out.println(f);//output : 1.23456792E8
i = (int) f;
System.out.println(i); //output : 123456792
}
}
Floating Point, Some Notes
-
Double.NaN
-
Infinity
-
Negative infinity
-
-
Formatting a double
public class FloatingPoint{
public static void main(String[] args){
double nan = 0.0 / 0.0;
double pinf = Double.MAX_VALUE * 2;
double ninf = Double.MAX_VALUE * (-2);
System.out.println(Double.NEGATIVE_INFINITY);
System.out.println(Double.POSITIVE_INFINITY);
System.out.format("min double = %.2f", 12.216213);
}
}
Comparison
-
Compare doubles
-
Using == with float or double is an anti-pattern
-
An infinite loop:
public class InfiniteLoop{
public static void main(String[] args){
for (float f = 0f; f != 10f; f += 0.1){
System.out.println(f);
}
}
}
Numeric Assignments
-
Numeric Suffix
-
Assignment Overflow
-
Large long to int
-
Lower bits are used
-
No runtime error
-
-
Large double to integer
-
Brings a max int
-
-
public class NumericSuffix{
public static void main(String[] args){
Double d = 123.54d;
Float f = 123f;
Long l = 123123l;
byte b = 127; // Nothing
}
}
Switch Statement
-
An alternative to if-else
-
Better structure
-
Before Java 1.7
-
When the condition is a numeric or an ordinal variable
-
-
With Java 1.7
-
Strings are also allowed
-
Switch Example
import java.util.Scanner;
public class Switch {
public static void main(String[] args) {
int j = 1;
switch (j) {
case 1:
System.out.println("1");
break;
case 2:
System.out.println("2");
break;
default:
System.out.println("default");
}
}
}
Switch Example
import java.util.Scanner;
public class Switch {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
boolean again = true;
while (again) {
System.out.println("1: Play");
System.out.println("2: Setting:");
System.out.println("3: Exit");
System.out.print("Enter Your Choice:");
int i = scanner.nextInt();
switch (i) {
case 1:
// play();
break;
case 2:
// setting();
break;
case 3:
again = false;
break;
default:
System.out.println("Enter a valid number");
}
}
}
}
Break
-
Breaks the execution of a loop
import java.util.Scanner;
public class ControlLoop {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (true) {
int nextInt = scanner.nextInt();
if (nextInt == 0)
break;
}
}
}
Continue
-
Stops the execution of the body of the loop and continues from the beginning of the loop
-
Difference between continue in for and while
import java.util.Scanner;
public class ControlLoop {
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
if (i == 4)
continue;
System.out.println(i);
}
}
}
Nested Loops
- How to break or continue from outer loop?
import java.util.Scanner;
public class ControlLoop {
public static void main(String[] args) {
int nextInt;
do {
nextInt = scanner.nextInt();
for (int i = 0; i < nextInt; i++) {
System.out.println(i);
}
} while (nextInt > 0);
}
}
Label
import java.util.Scanner;
public class ControlLoop {
public static void main(String[] args) {
outer:
for (int i = 0; i < 10; i++) {
inner:
for (int j = 0; j < 10; j++) {
if (j == 2)
break outer;
else {
System.out.println(i);
System.out.println(j);
continue inner;
}
}
}
}
}
Tip of the Day: Indentation
import java.util.Scanner;
public class Indentation {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
int nextInt;
do{
nextInt=scanner.nextInt();
for(int i=0; i<nextInt; i++){
System.out.println(i);
}
}while(nextInt>0);
}
}
Tip of the Day: Indentation
import java.util.Scanner;
public class Indentation {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int nextInt;
do {
nextInt = scanner.nextInt();
for (int i = 0; i < nextInt; i++) {
System.out.println(i);
}
} while (nextInt > 0);
}
}
Comments
import java.util.Scanner;
public class Indentation {
public static void main(String[] args) {
// nextInt = scanner.nextInt();
/*
nextInt = scanner.nextInt();
for(int i=0;i<nextInt;i++){
System.out.println(i);
}
*/
/**
* ... text ...
*/
}
}
-
Comments are ignored by compiler
-
One-line comment
-
Multiple-line comment
-
Javadoc comments
Example
import java.util.Scanner;
public class Comment {
/**
* @author Ali Alavi
* If the input is a prime number, it returns true
*/
public boolean isPrime(int number) {
if (number < 1)
return false;
/*if(isEven(number))
return false;
*/
for (int i = 2; i < number / 2; i++) //searching for a divisible
if (number % i == 0)
return false;
return true;
}
}
String
Contents
-
A sequence of characters
-
Character
-
Strings
-
String is not a primitive type
import java.util.Scanner;
public class StringExample {
public static void main(String[] args) {
char ch;
ch = 'a';
ch = '1';
ch = '#';
String st;
st = "Ali";
st = "123";
st = "1";
st = "";
}
}
String
-
String in C and C++
-
char* and char[]
-
\0 at the end of String
-
-
Some functions
-
strlen, strcpy, …
-
-
String in java is String in java is a class
-
not equal to char[]
-
Constant strings
-
“salam!”
-
“Hellow World!”
-
Example
import java.util.Scanner;
public class StringExample {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String input;
input = scanner.next();
switch (input) {
case "Salam":
System.out.println("Hi!");
break;
case "Khdahafez":
System.out.println("Bye!");
break;
default:
System.out.println("Ha?!");
break;
}
System.out.println(input);
}
}
Example
import java.util.Scanner;
public class StringExample {
public static void main(String[] args) {
String input = "Nader and Simin, A Separation";
char ch = input.charAt(0);
int i = input.indexOf("Nader");
int j = input.lastIndexOf("Simin");
String newS = input.replace("Separation", "Reconciliation");
String sth = newS + ch + i + j;
System.out.println(sth);
}
}
String Methods
-
charAt
-
concat: plus (+) operator
-
contains
-
startsWith
-
endsWith
-
indesxOf: first index of sth
-
lastIndexOf
-
replace
-
substring
-
length
-
split
-
Regular Expression or Regex
-
Regex is a way to describe a set of strings
-
Based on their common characteristics
-
Regex can be used to search, edit, or manipulate text
-
You must learn a specific syntax to create regex
Regex Examples
Regex | Meaning | Ex .1 | Ex .2 | Ex .3 |
---|---|---|---|---|
Salam | Salam | Salam | ||
\d | A digit | 4 | 5 | 9 |
. | Any character | 2 | A | # |
[afg] | a or f or g | a | f | g |
[a-zA-Z] | Range: a through z or A through Z, inclusive | A | a | m |
Salam|bye | Salam or bye | Salam | bye | |
a+ | One or more a | aaaaa | aa | a |
[a-z]+[\d]* | a lowercase string and an optional integer number | ali | ali24 | a43 |
String and Regex
public class Regex {
public static void main(String[] args) {
String input = "Nader and Simin";
boolean noDigitString = input.matches("[\\D]+");
System.out.println(noDigitString);
String[] array = input.split("[ ,]");
for (int i = 0; i < array.length; i++) {
System.out.println(array[i]);
}
}
}
Regex Usage
public class Regex {
public static void main(String[] args) {
String input = "Nader and Simin, A Separation.";
input = input.replace(".", "*");
//input = Nader and Simin, A Separation*
input = input.replaceAll(".", "*");
//i
}
}
Immutable String
-
String in java is an immutable class
-
After creating a string, you can not change it
-
If you want to change it, you should create a new string
-
There is no such methods for strings:
-
setCharAt(int)
-
setValue(String)
-
-
Methods like replace and replaceAll, do not change the value
-
They return a new String
-
Example
- What is the output of this code?
public class Regex {
public static void main(String[] args) {
String str = "Gholi";
str.replaceAll("li", "lam");
System.out.println(str);
String replaced = str.replaceAll("li", "lam");
System.out.println(replaced);
}
}
Data Hierarchy
-
Bit
-
Byte
-
Character
-
Word
Java Characters
-
A Java character has two bytes
-
Java supports Unicode character set standard
-
ASCII
-
-
Java uses UTF-16 encoding
-
Other unicode encodings:
-
UTF-8
-
UTF-16
-
-
Other non-unicode encodings
-
Windows-1256
-
Java Special Characters
-
Some characters are special characters
-
Special characters are shown using backslash
-
Examples:
-
New line: \n
-
Tab : \t
-
Double-quote : \”
-
Single-quote : \’
-
Backslash : \\
-
Java Special Characters
public class Regex {
public static void main(String[] args) {
String s = "Salam!\nI am S\tA";
System.out.println(s);
s = "\\ \' \"";
System.out.println(s);
/* output:
Salam!
I am S A
\ ' "
*/
}
}
Array
Array
-
Collections of related data items
-
related data items of the same type
-
Arrays are fixed-length entities
-
they remain the same length once they are created
-
An array is a group of variables
-
called elements
-
-
containing values that all have the same type
-
The position number of the element is it’s index
-
Array elements are sequentially located in memory
Array
Example
public class ArrayExample {
public static void main(String[] args) {
// Create an array of 10 integer elements
int[] array = new int[10];
int array[] = new int[10]; // equal
// Create an array of n characters
char[] characters = new char[n];
// Change value of 5’th element
array[5] = 12;
// Retrieving value of n’th element
char ch = array[n];
}
}
Example
import java.util.Scanner;
public class ArrayExample {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
double numbers[] = new double[n];
for (int i = 0; i < numbers.length; i++) {
numbers[i] = scanner.nextDouble();
}
for (int i = 0; i < numbers.length; i++) {
double d = numbers[i];
System.out.println(d);
}
}
}
Array Creation Shortcut
import java.util.Scanner;
public class ArrayExample {
public static void main(String[] args) {
char[] array = new char[3];
array[0] = 'a';
array[1] = 's';
array[2] = 't';
// The above code can be rewritten as:
char[] array2 = {'a', 's', 't'};
// Other examples:
int[] numbers = {1, 2, 3, 5, 9, 123};
boolean[] b = {true, true, false, true};
}
}
Multidimensional Arrays
import java.util.Scanner;
public class ArrayExample {
public static void main(String[] args) {
int[][] matrix = new int[3][4];
matrix[2][3] = 2;
System.out.println(matrix[2][1]);
int[][] matrix = new int[3][];
matrix[0] = new int[2];
matrix[1] = new int[5];
matrix[2] = new int[4];
matrix[2][3] = 2;
System.out.println(matrix[2][1]);
matrix[0][3] = 2; // Runtime Error (ArrayIndexOutOfBoundsException)
}
}
Passing Arrays to Methods
public class ArrayParameter {
public static void main(String[] args) {
int[] array = {1, 2, -4, 0};
System.out.println(max(array));
}
public static int max(int[] numbers) {
if (numbers == null || numbers.length == 0)
return -1;
int max = numbers[0];
for (int i = 1; i < numbers.length; i++)
if (max < numbers[i])
max = numbers[i];
return max;
}
}
Multi-Dimensional Array Parameters
int determinant(int[][] matrix){…}
int [][] matrix = { {1,2}, {3,4}} ;
int de = determinant(matrix);
void check(int[][] array){…}
int [][] unbalanced = { {1,2}, {3,4,5,6,7,8}};
check(unbalanced);
boolean f(double[][][] cube){…}
Call by Element Values?
-
No
-
If the method has an array parameter
-
Array elements are not copied on method invocations
-
A reference to the array is passed to the method
-
More about this topic later
Exercises
Write a method for sorting an array of integers
-
Write a method that compares two arrays
returns true if elements of the arrays are equal
returns false, otherwise
-
Write a method that returns determinant of a matrix
Matrix is a two-dimensional array as the method parameter
Title Text
Basic Concepts
By Behnam Hatami
Basic Concepts
Basic Concepts / Advanced Programming Course @ SUT, Spring 2019
- 1,457