Advanced Programming
SUT • Spring 2019
Variables
Primitive data types
Operators
Methods
Parameter passing
Call by value
Conditions
If, else, else if
Loops
while
do-while
for
Review
User input
Scanner
Strong type checking
Other flow-control structures
switch
break & continue
Strings
Arrays
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);
}
}
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)
}
}
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
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 | - |
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
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
}
}
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);
}
}
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 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
}
}
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
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");
}
}
}
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");
}
}
}
}
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;
}
}
}
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);
}
}
}
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);
}
}
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;
}
}
}
}
}
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);
}
}
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);
}
}
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
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;
}
}
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 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!”
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);
}
}
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);
}
}
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 | 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 |
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]);
}
}
}
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
}
}
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
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);
}
}
Bit
Byte
Character
Word
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
Some characters are special characters
Special characters are shown using backslash
Examples:
New line: \n
Tab : \t
Double-quote : \”
Single-quote : \’
Backslash : \\
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
\ ' "
*/
}
}
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
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];
}
}
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);
}
}
}
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};
}
}
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)
}
}
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;
}
}
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){…}
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
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