330 likes | 454 Views
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
E N D
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”
Een simpel Array voorbeeld 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]); } } } array van string objecten 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 Command-line Screen display
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 5 6 7 8 9 scores
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