Algoritmiek

advertisement
Algoritmiek
Primitieve Types, Casting,
Polymorphism, Interfaces.
Hoorcollege 13 - Ma. 27 nov. 2006
L.M. Bosveld-de Smet
Java’s data typen

Primitive types

boolean

Numerieke typen




integer types: byte, short, int, long
floating-point types: float, double
character type: char
Reference types

String, Integer, Account, NewEmployee, ….
Integer Types

Java ’s integer types:
Type
byte
short
int
long
Size
8
16
32
64
bits
bits
bits
bits
Smallest Value
–128
–32,768
–2,147,483,648
–263
Largest Value
127
32,767
2,147,483,647
263–1
Integer Classes

Byte, Short, Integer, Long


java.lang package.
Elke class bevat constanten:

MIN_VALUE en MAX_VALUE

Bijvoorbeeld:


Byte.MIN_VALUE is –128
Byte.MAX_VALUE is 127.
Methode parse…

Methoden om String om te zetten naar getal:




Byte.parseByte
Integer.parseInt
Long.parseLong
Short.parseShort
Floating-Point Types


float
double
Type
float
double
Smallest
Size Positive Value Largest Value Precision
32 bits
64 bits
1.40  10–45
4.94  10–324
3.40  1038
1.79  10308
6 digits
15 digits
Speciale Waarden

java.lang package:


Constanten:




Float en Double.
POSITIVE_INFINITY
NEGATIVE_INFINITY
NaN
Methode:

isNaN
char Type

Voor willekeurige karakters


char ch;
Toekenningen




ch
ch
ch
ch
=
=
=
=
'a';
'A';
'0';
' ';
//
//
//
//
Lowercase a
Uppercase A
Zero
Space
ASCII Character Set

ASCII (American Standard Code for
Information Interchange)



128 characters
Spatie (character 32) gaat vooraf aan de cijfers
(48–57).
Hoofdletters (65–90) komen voor de kleine letters
(97–122).
ASCII Character Set

Control characters



eerste 32 karakters en laatste karakter, del
Niet op scherm toonbaar, niet te printen
Printing characters

Karakters die geen control characters of spatie zijn
Java: Unicode Character Set
Relatie tussen ASCII, Latin1 en Unicode:
Escape Sequences

Te gebruiken in character en String literals:
Naam
Escape Sequence
Backspace
Form feed
Line feed
Carriage return
Horizontal tab
Backslash
Single quote
Double quote
Octal escape
\b
\f
\n
\r
\t
\\
\'
\"
\0–\377
Operaties met karakters

Berekeningen: getalswaarden
int i = 'a';
char ch = 65;
ch++;

// i is nu 97
// ch is nu 'A'
// ch i now 'B'
Vergelijkingen: getalswaarden
if ('a' <= ch && ch <= 'z')
…
Operaties met karakters

‘controlling expression’ in een switch
statement:
switch (letter) {
case 'a': case 'e': case 'i': case 'o': case 'u':
System.out.println("Vowel");
break;
case 'y':
System.out.println("Possible vowel");
break;
default:
System.out.println("Consonant");
break;
}
Operaties met karakters

als ‘loop counter’:
for (char ch = 'A'; ch <= 'Z'; ch++)
…

Nadelen:


'a' * 'b' / 'c‘ wordt geaccepteerd
bugs die ontstaan door per ongeluk gebruik van
karakter voor getal worden niet ontdekt door Java
compiler.
characters versus Strings

ISBN-nummer zonder streepjes
for (int i = 0; i < isbn.length(); i++) {
char ch = isbn.charAt(i);
if (ch != '-')
System.out.print(ch);
}
Character Class

Character class (java.lang package)

Methoden om karakters te testen of om te zetten:










Character.isDigit('a')  false
Character.isISOControl('a')  false
Character.isISOControl('\n')  true
Character.isLetter('a')  true
Character.isLetterOrDigit(' ')  false
Character.isLowerCase('A')  false
Character.isUpperCase('A')  true
Character.isWhitespace('\n')  true
Character.toLowerCase('A')  'a‘
Character.toUpperCase('A')  'A'
Type Conversie

Mengen van verschillende typen in een
operatie


Impliciete conversie: automatische conversie
Expliciete conversie: conversies toegestaan aan
programmeur
Impliciete conversie

Operanden van verschillende typen


‘numeric promotion’
Assignments met data van verschillende typen

Rechts krijgt type van links, mits links ‘wijder’ is
Short s; int i;
i = s; // toegestaan
int i; float f;
i = f; // niet toegestaan

Argument en parameter van verschillende typen


Type van argument wordt type van parameter, mits
parameter ‘wijder’ is
Conversie naar String
‘Breedte’ van primitieve typen

Numerieke typen:
Casting

Type conversie op bevel van programmeur
int i;
float f;
…
i = (int) f;

// Cast f naar int type
Casting van floating-point number naar
integer type: truncatie
f = 45.6;
i = (int) f; // i is 45

Algemene vorm van een ‘cast’:
( type-name ) expression
Kerneigenschappen van O-O design





Abstraction: abstractie
Encapsulation: inkapseling
Inheritance: overerving
Polymorphism: veelvormigheid
Interface
Klassen hierarchie
zoogdieren
carnivoren
katten
honden
herbivoren
…
…
Type conversie


Objecten van een bepaald class type worden
behandeld als objecten van een ander class
type
Beperkingen:



hond ≠ herbivoor
kat ≠ hond
carnivoor ≠ hond
Assignment restricties
c
type Carnivoor
k
carnivoren
X
katten
honden
…
type Kat
h
type Hond
X
…
eetVlees
…
…
type Carnivoor
Assignment restricties
c
type Carnivoor
k
carnivoren
…
miauwt
eetVlees
katten
honden
…
type Kat
h
type Hond
X
…
type Kat
Assignment restricties
c
type Carnivoor
k
carnivoren
X
katten
honden
…
type Kat
h
type Hond
…
blaft
eetVlees
…
type Hond
Assignment “up”, beperkte
toepassing van methodes
c
Carnivoor c = new Kat ();
type Carnivoor
…
miauwt
c.miauwt(); // niet OK
eetVlees
…
type Kat
Casting en Anonieme verwijzing
c
type Carnivoor
…
miauwt
((Kat)c).miauwt(); // is OK
eetVlees
type Kat
…
type Kat
Polymorphism



Specifieke methode-aanroep op verschillende
momenten leidt tot verschillend gedrag
Selectie van code tijdens run-time
Dynamische binding
Interfaces



Plaatsen van beperkingen op verzameling
klassen
Klassen die een interface ‘implementeren’
vertonen een bepaald gedrag, en erven alle
in de interface gedefinieerde constanten
Voorbeeld:
abstracte
public interface Example {
public void doSomething();
}
methode
Stappenplan voor interface

Schrijf interface

Vorm:
public interface <interface name> {
<abstract method headings>;
<constant declarations>;
}


Voeg implements <interface name> toe aan alle klassen
die haar implementeren, en controleer of deze klassen volledige
definities bevatten van de in de interface genoemde methoden
gebruik “casting” om zeker te zijn dat alle aanroepen van
interface-methoden worden toegepast op type <interface
name> referenties.
Voorbeeld 1: interface Payable
/* Payable.java
Authors: Koffman & Wolz
* the Payable interface.
*/
public interface Payable {
public double calcWeeklyPay();
}
NewCompany class
public void computePayroll () {
System.out.println ("ID" + "\t" + "pay");
for (int i = 0; i < employees.length; i++) {
// calculate weekly pay
double weekPay;
NewEmployee emp = employees[i];
if (emp instanceof HourlyEmployee)
weekPay = ((HourlyEmployee) emp).calcWeeklyPay();
else if (emp instanceof SalaryEmployee)
weekPay = ((SalaryEmployee) emp).calcWeeklyPay();
else
weekPay = 0.0;
// add the weekly pay amount to employee's total pay
emp.updateTotalPay (weekPay);
// add the weekly pay amount to the payroll
payroll += weekPay;
// display ID and pay
System.out.println (emp.getSocial() +
"\t" + weekPay);
}
}
NewCompany class
public void computePayroll () {
System.out.println ("ID" + "\t" + "pay");
for (int i = 0; i < employees.length; i++) {
// calculate weekly pay
double weekPay;
NewEmployee emp = employees[i];
if (emp instanceof Payable)
weekPay = ((Payable) emp).calcWeeklyPay();
else
weekPay = 0.0;
// add the weekly pay amount to employee's total pay
emp.updateTotalPay (weekPay);
// add the weekly pay amount to the payroll
payroll += weekPay;
// display ID and pay
System.out.println (emp.getSocial() +
"\t" + weekPay);
}
}
HourlyEmployee
public class HourlyEmployee extends NewEmployee
implements Payable {
…
public double calcWeeklyPay() {
return hours * rate;
}
…
}
SalaryEmployee
public class SalaryEmployee extends NewEmployee
implements Payable {
…
public double calcWeeklyPay() {
if (annualSalary > 0)
return annualSalary / 52;
else
return 0;
}
…
}
TestNewCompany
Voorbeeld 2: Comparable interface
public interface Comparable {
public int compareTo (Object obj);
}


String class implements Comparable interface
String class heeft een compareTo () method.
Method call
resultaat
verklaring
“this”.compareTo(“that”)
positief
negatief
zero
“this”
“that”.compareTo(“this”)
“same”.compareTo(“same”)
“that”
“same”
is groter dan “that”
is kleiner dan “this”
is gelijk aan “same”
Probleem: sorteren van Comparable
objecten


Sorteren van objecten van willekeurig type
Sorteren van integers, String objecten,
NewEmployee objecten, etc.
IntArray class

IntArray class

Zoeken naar een bepaalde waarde in de array





voor elk array element, doe het volgende:
als het huidige element overéénkomt met de gezochte waarde
geef de index van het huidige element terug.
geef -1 terug.
Sorteren van de waarden in de array


voor elke index, vanaf 0 tot aan de laatste index, doe het
volgende:
vind de positie (posMin) van het kleinste element in de subarray
startend bij het element behorende bij de huidige index (<array
name>[fill])

verwissel het kleinste element met het element behorende bij
index fill.
TestIntArray output
Generieke selectionSort

Class method van class Sorts
public class Sorts {
// postcondition: elements in array x are in increasing order
public static void selectionSort (Comparable[] x) {
int posMin;
// index of next smallest element
Comparable temp;
// temporary variable for exchange
for (int fill = 0; fill < x.length - 1; fill++) {
/* invariant:
* the elements in x[0] through x[fill-1] are in their
* proper place and fill < x.length is true
*/
// find index of smallest element in subarray
// starting at element x[fill].
posMin = findPosMin (x, fill);
// exchange elements with indices fill and posMin
if (posMin != fill) {
temp = x[fill];
x[fill] = x[posMin];
x[posMin] = temp;
}
}
}
findPosMin(): helper method
// postcondition: returns the position of the smallest
//
element in array x from x[fill] to the end.
private static int findPosMin (Comparable[] x, int fill) {
// assume smallest element is at position fill
int posMinSoFar = fill;
// remember any smaller value found in the array
for (int i = fill + 1; i < x.length; i++) {
if (x[i].compareTo (x[posMinSoFar]) < 0)
posMinSoFar = i;
}
// posMinSoFar is index of smallest element
return posMinSoFar;
}
}
Toepassen selectionSort op array met
String objecten
public interface Comparable {
public int compareTo(Object obj);
}
public class TestStringSort {
public static void main (String[] args) {
public class String extends …
String names = new String[5];
implements Comparable {
…
…
//sort the array names
public int compareTo(Object obj) {
Sorts.selectionSort(names);
String s = (String) obj;
…
…
}
}
…
public class Sorts {
public static void selectionSort(Comparable[]x) {
}
…
}
Toepassen selectionSort op array met
NewEmployee objecten
public class NewCompany {
public interface Comparable {
private NewEmployee[] employees;
public int compareTo(Object obj);
…
}
//sorts employees by social security number
public void sortEmployees {
Sorts.selectionSort(employees);
public class TestNewCompany {
}
public static void main (String[] args) {
implements Comparable {
…
NewCompany myCompany = NewCompany(3);
…
}
…
public int compareTo (Object obj) {
//sort employees by social security number
NewEmployee emp = (NewEmployee) obj;
myCompany.sortEmployees();
return this.socSecNum.compareTo
…
(emp.socSecNum);
}
public class Sorts {
}
public class NewEmployee
public static void selectionSort(Comparable[]x) {
…
…
}
}
TestNewCompany met sorteren
Download