Algoritmiek

advertisement
Algoritmiek
Arrays: wat zijn dat en wat kun je ermee?
Loops: hoe hou je ze in bedwang?
Hoorcollege 6 - Ma. 9 okt. 2006
L.M. Bosveld-de Smet
Datastructuren


Programs = Data Structures + Algorithms
Data structure: definitions



= ‘a group of related data items organised in the
computer’ (in: A Glossary of Computer Terms)
= “collection of data items stored under a single
name” (in: King)
Voorbeelden van datastructuren



objects
arrays
lists, tables, trees, files, …
Arrays en Objects



Enige datastructuren in Java
Array is een subklasse van de klasse Object
Arrays zijn objecten, maar van een bepaalde soort





in een object kunnen elementen van verschillend type zijn
in een array zijn alle elementen van hetzelfde type
Array heeft length als instantievariabele
Array kent een aantal voorgedefinieerde methoden
Arrays “store a set of data in an order accessible by
index”
Arrays en postvakjes
Arrays
Arrays met invullingen
Een simpel Array voorbeeld
array van string objecten
public class ArrayArgs {
public static void main (String[] args) {
for (int i=0, n=args.length; i<n; i++) {
System.out.println (“Arg “ + i + “ “
+ args[i]);
aantal strings in array
}
args
}
de string op positie i
in array args
}
ArrayArgs
java ArrayArgs Drink Hot Java
Arg 0 Drink
Arg 1 Hot
Arg 2 Java
Screen display
Command-line
Array declaratie

Specificeer type elementen
int[] scores;
int scores[];
String[] names;
String names[];
Account[] accounts;
Account accounts[];
Arrayvariabelen worden
gedeclareerd.
Net als bij object declaratie, zijn
deze bedoeld voor referenties
Array aanmaken


Specificeer arraygrootte
Geheugenruimte wordt toegekend
scores = new int[10];
names = new String[50];
accounts = new Account[1000];
0
1
2
3
4
scores
5
6
7
8
9
Array opslag in computergeheugen
Array initializers
int[] scores = {8, 5, 6, 6, 7, 9, 10, 6, 5, 8};
String[] names =
{“Java”,“Pascal”,“Python”,“Logo”};
Exceptions
NullPointerException
ArrayOutOfBoundsException
Arrays: elementen bereiken en
waarden toekennen
scores[0] = 8;
scores[i + 2] = 10;
sum = sum + scores[i];
names[i] = “Java”;
System.out.print (names[i]);
char firstLetter = names[i].charAt(0);
Example: average temperature
double[] temperatures = {32.0, 30.8, 25.7, 26.1,
34.0, 31.5, 29.0};
double sum = 0.0;
for (int i=0; i < temperatures.length; i++) {
sum = sum + temperatures[i];
}
System.out.println(“average temperature of this
week is “ + sum / temperatures.length);
Test
Wat is de output?
char[] vowel = {‘a’, ‘e’, ‘i’, ‘o’, ‘u’};
for (int i=0; i < vowel.length; i++) {
System.out.println( vowel [i] );
}
OK?
int[] b = new int[10];
for (int i=1; i <= b.length; i++) {
b[i] = 5 * i;
}
Arrays als argumenten
en als return waarde

Arrays kunnen gebruikt worden als
argumenten van methoden



Referentie wordt doorgegeven
Verandert de methode de array inhoud, dan
‘verlaat de array de methode in veranderde vorm’
Een methode kan een array maken of
veranderen en deze als resultaat afgeven

Dit is mogelijk omdat ‘niet de hele array, maar de
referentie wordt afgegeven’
Copiëren van arrays
public class DoubleArray {
public static void main (String[] args) {
int array1[] = {1,2,3,4,5};
int array2[] = {1,2,3,4,5,6,7,8,9};
System.out.println(“Original size: “ + array1.length);
System.out.println(“New size: “ + doubleArray(array1).length;
System.out.println(“Original size: “ + array2.length);
System.out.println(“New size: “ + doubleArray(array2).length;
}
static int[] doubleArray(int[] original) {
int length = original.length;
int[] newArray = new int[length*2];
System.arrayCopy(original, 0, newArray, 0, length);
return newArray;
}
Output
Original size: 5
New size: 10
Original size: 9
New size: 18
Arrays clonen
static int[] cloneArray (int[] original) {
return (int[]) original.clone();
}
Arrays vergelijken (1)
Button[] buttons = {
new Button(“0ne”),
new Button(“Two”),
new Button(“Three”)};
Component[] components = buttons;
boolean bln = (components == buttons);
Waarde bln?
true
Arrays vergelijken (2)
String[] clone = (String[]) strArray.clone();
boolean isEqual = (strArray == clone);
isEqual = (Arrays.equals(strArray, clone);
false
true
Loops

Essentiële onderdelen:




Initialisatie
Test
Verandering
Belangrijke vragen:



Welke loop kies je?
Hoe controleer je de loop?
Hoe ontwerp je een loop?
Soorten loops




Counted loops
Continuously evaluated loops
Endless loops
Iterator loops
Varianten in diverse
programmeertalen

Visual Basic:





For-Next
While-Wend
Do-Loop-While
For-Each
C, C++, C#, Java




for
while
do-while
foreach (C#)
While-loop



Meest flexibel
Te gebruiken als aantal herhalingen van te
voren onbekend is
Keuze voor plaats van test



aan begin
aan eind
Geschikt voor meer complexe loops
Loop-with-exit loop (1)
score = 0;
getNextRating(ratingIncrement);
rating= rating + ratingIncrement;
while ((score < targetScore) && (ratingIncrement != 0)) {
getnextScore(scoreIncrement);
score = score + scoreIncrement;
getNextRating(ratingIncrement);
rating= rating + ratingIncrement;
}
Loop-with-exit loop (2)
score = 0;
while (true) {
getNextRating(ratingIncrement);
rating= rating + ratingIncrement;
if (!((score < targetScore) && (ratingIncrement != 0))) {
break;
}
getnextScore(scoreIncrement);
score = score + scoreIncrement;
}
Vereenvoudig met De
Morgan’s Laws
Waarschuwing


Zet alle exit-voorwaarde op één plaats
Voeg commentaar toe
Endless loop
Geaccepteerde idiomen:
while (true)
for (;;)
For-loop



Aantal herhalingen is gespecificeerd
Geschikt voor simpele loops met regelmatige
verhogingen/verlagingen
Waarschuwing: zet geen voorwaarde in de
loop body
Wat kan er misgaan?






Initialisaties van bij loop betrokken variabelen
zijn vergeten of incorrect
Niet correcte nesting
Loop eindigt niet
Controlevariabele wordt niet of verkeerd
veranderd
Loop indiceert array elementen verkeerd
…
Adviezen


Verklein zoveel mogelijk de factoren die invloed hebben op de
loop, oftewel zorg voor eenvoud
Behandel de loop body als een black box
while(!inputFile.EndOfFile()&& moreDataAvailable()) {
}


Controleer de voorwaarden die de loop beëindigen
Test de loop met beginwaarde, tussenwaarde(n), eindwaarde
Download