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