Oefening 6: de witte boord schreeuwer
Doel
Arrays bestuderen en gebruiken.
Opdracht
Maak een scorebord waarop een vast aantal gehele getallen wordt weergegeven van groot naar klein. Nieuwe getallen worden enkel toegevoegd indien deze minstens groter zijn dan de kleinste waarde op het scorebord.
Arrays
Maak een main methode waarin de gebruiker 5 waarden opgeeft. Verzamel deze waarden in een array.
Maak gebruik van een for-lus i.p.v. 5 keer dezelfde code te kopiëren.
Een array kan voorgesteld worden als een verzameling elementen van eenzelfde type, die via hun positie in de array benaderd kunnen worden. bvb.
int[] rij = {42,7,5,9,0}; int eerste = rij[0]; //eerste = 42; int laatste = rij[4]; //laatste = 0; rij[2] = 8; //kent 8 toe aan positie 2 in de array //de array wordt [42,7,8,9,0] int lengte = rij.length; //lengte = 5;
Figuur 1: Een array van 5 gehele getallen met hun overeenstemmende index.
- int[] is het type. Dit kan je lezen als een array van integers. Bvb.
double[]
is een array van doubles. - rij is de naam van de variabele.
- {42,7,5,9,0}; initialiseert een array variabele met de opgegeven gehele getallen.
- rij[gehele waarde] wijst naar de positie die de gehele waarde aanduidt.
- Vraag de grootte van een array op aan de hand van .length. Deze waarde duidt het aantal posities in de array aan. Dit komt niet altijd overeen met het aantal elementen in de array.
Maak een nieuwe lege array aan.
- new int[5] maakt een array van 5 integers aan. bvb.
int[] scorebord = new int[5];
Vraag 1
Welke code levert een array van 7 elementen op?
- new int[5] maakt een array van 5 integers aan. bvb.
Vul deze array op door alle waardes ingevoerd door de gebruiker toe te kennen aan een daaropvolgende positie in de array.
- Geef alle elementen van de array weer in het terminal venster.
- Tip: gebruik hiervoor System.out.print en een for-lus.
- Geef het de dubbele van alle elementen van de array weer in het terminal venster.
Maak de som van het dubbele van alle elementen van de array en geef dit weer in het terminal venster.
Vraag 2
Wat is de correcte code om de som van het dubbele van alle elementen van een array weer te geven in een terminal venster?
Maak een methode toString waarbij alle waardes van een array van integers worden voorgesteld in een String tussen vierkante haken waarbij de elementen onderling gescheiden worden door een komma. Dit is de methode hoofding:
/** * Bouwt een String op uit een array van integers * @param rij * @return [0,1,...,n] */ public static String toString(int[] rij) { return ""; }
Doe dit door één voor één de elementen van de array aan een String variabele te concateneren, met waarbij de vierkante haken en de komma's op het correcte moment ook worden geconcateneerd.
- Geef de volledige array weer in het terminal venster door gebruik te maken van de toString methode.
Sorteren
Sorteer de waardes in de array van hoog naar laag. Het hoogste element bevindt zich op index 0 en het laagste op de laatste index. Een eenvoudig sorteer algoritme is insertion sort. Het werkt in principe als volgt:
Deel de array op in een gesorteerd deel en een niet-gesorteerd deel. Als het algoritme start dan bestaat het gesorteerde deel uit 1 waarde en het niet-gesorteerde deel uit alle andere waardes.
Kies een getal uit het niet-gesorteerde deel. Vergelijk dit met het kleinste getal uit het gesorteerde deel.
Indien het gekozen getal groter is dan het getal waarmee het vergeleken wordt, wissel dan deze getallen. Herhaal deze stap tot een getal in het gesorteerde deel groter is dan het gekozen getal of het einde van de array bereikt is. In het voorbeeld moeten de getallen gewisseld worden, waardoor het einde van de array bereikt wordt. Deze stap eindigt. Het gesorteerde deel bestaat nu uit twee getallen.
Herhaal stappen 2 en 3 voor elk getal in het niet-gesorteerde deel totdat alle getallen gesorteerd zijn.
Tips:
- Maak gebruik van 2 genneste lussen. De buitenste lus is typisch een for-lus en de binnenste lus een while-lus.
- Maak gebruik van de bestaande array. Maak gebruik van een variabele die de index aanduidt van het gesorteerde deel. Daarnaast maak gebruik van een variabele die het huidig gekozen getal aanduidt.
- Vergelijk getallen naast elkaar a.d.h.v. een index en een offset t.o.v. die index. bvb.
if(rij[index-1] < rij[index])
Topscore en nieuwe scores
Maak een methode die de topscore teruggeeft. Tip: sorteer eerst de array
/** * Geeft de topscore terug * @param rij * @return hoogste waarde in de rij */ public static int topScore(int[]rij)
Maak een methode die een nieuwe score toevoegt, maar enkel als de nieuwe score hoger is dan minstens de laagste score in het scorebord. Plaats de nieuwe score op de juiste positie in het scorebord. Tip: sorteer de array
/** * Voegt een nieuwe score toe aan het scorebord indien het op zijn minst hoger is dan de laagste score in het scorebord * @param nieuw * @param rij */ public static void nieuweScore(int nieuw, int[]rij)
Vraag 3
Voor een array met een oneven aantal elementen, wat is de index van het middelste element?
Vraag 4
Plaats alle getallen van 1 tot 1000 in een array. Sorteer deze getallen van groot naar klein. Wat is de som van de waardes op indices 337, 512 en 814?
Extra
- Maak een array met 500 meetwaarden van het type double. Genereer een willekeurige getallen voor deze meetwaarden.
- Bereken het gemiddelde van deze meetwaarden.
- Zoek de grootste waarde van deze meetwaarden zonder de array te sorteren.
- Zoek de kleinste waarde van deze meetwaarden zonder de array te sorteren.