Programmeren 1
Structs en value types vs. reference types
Doelstelling
We werken verder met structs. We onderzoeken ook het gedrag van structs als value types en vergelijken dit met het gedrag van reference types.
Leerpad
Lees aandachtig volgende delen van het Yellow Book.
- 4.4.3 t.e.m. 4.5.1
Tijdens de les maken we volgende oefeningen:
-
Schrijf in het bestand "OefeningenStructs.cs" een methode
DemonstrateInitialization()met return type void. De body bevat enkel de volgende lijnen:Course course; int[] grades; Console.WriteLine(grades);
Voeg de mogelijkheid toe deze methode op te roepen in Program.cs en voer uit.
Ergens loopt het mis. Waar precies? Leid dit af uit de foutboodschap. Noteer waar de fout volgens jou zit en pas je code aan naar het volgende:
Course course; int[] grades; Console.WriteLine(course);
Noteer opnieuw wat je ziet. Pas nog een keer aan naar:
Course course; int[] grades = new int[10]; Console.WriteLine(grades);
Noteer opnieuw wat je ziet. Pas nog een keer aan naar:
Course course; course.Title = "Programmeren 1"; Console.WriteLine(course.Title);
Noteer opnieuw wat je ziet. Pas nog een keer aan naar:
Course course; course.Title = "Programmeren 1"; Console.WriteLine(course);
Hoe los je de laatste fout op?
-
- Hernoem de struct voor rekeningen in
Bank.csnaarAccountStruct. - Definieer een klasse Account (in een bestand Account.cs) met dezelfde velden als de bestaande struct.
- Voeg aan Account.cs een statische methode
DemonstrateTypetoe. - Associeer in
DemonstrateTypetwee variabelencAccount1encAccount2met eenAccount - Associeer verder in
DemonstrateTypetwee variabelensAccount1ensAccount2met eenAccountStruct - Initialiseer alle velden van de twee
AccountStructvariabelen. Welke waarden je ze geeft, maakt niet uit. - Voeg dan volgende twee instructies toe:
sAccount1 = sAccount2;encAccount1 = cAccount2; - Zet dan voor elk van de vier variabelen het veld
Amountop een verschillende waarde. - Laat ten slotte het bedrag op elke rekening uitprinten.
- Zorg ervoor dat je
DemonstrateTypekan oproepen vanafProgram.cs
Roep deze methode op via Program.cs. Wat zie je? Hoe verklaar je dit?
- Hernoem de struct voor rekeningen in
- Voeg een methode
PayInFunds(int amount)toe aan de klasseAccountdie een bedrag bij stort op de rekening. Dit bedrag moet positief zijn, anders wordt een exception gegooid. - Schrijf een methode
WithdrawFundsmet return typebooldie een bedrag van de rekening haalt. Als dit lukt, wordttrueteruggegeven, anders wordtfalseteruggegeven. Het bedrag dat wordt afgehaald mag positief zijn en de rekening mag negatief gaan tot ze de "overdraft limit" bereikt. (Voor snelle werkers:) Schrijf een klasse
Carin een bestand Car.cs. Een auto heeft één veld dat de snelheid aangeeft in km/u (als float). Een auto heeft ook drie methodes: één om de snelheid op te vragen (GetSpeed()) en twee om de snelheid aan te passen:AccelerateenBrake. Een auto die minder dan 10km/u rijdt, trekt op tot 10km/u wanneer er gas wordt gegeven. Een auto die al sneller rijdt, verhoogt zijn snelheid met ((120 - huidige snelheid) / 15). Remmen verandert de snelheid naar ((15 / 16 * huidige snelheid) - 7.5) in het gewone geval. De auto stopt volledig wanneer je remt bij minder dan 10km/u. Om na te gaan dat de methodes werken, schrijf je een statische methodeDemonstrateCar, die eenCaraanmaakt, zijn snelheid 50 keer verhoogt en dan weer 50 keer verlaagt. Na elke wijziging van de snelheid wordt de huidige snelheid bovendien afgeprint. Test met behulp van Program.cs.(Voor snelle werkers:) Voor deze oefening heb je willekeurige getallen nodig. Breid je klasse
Utilities.csmet een extra veld als volgt:public static Random RNG = new Random();.Schrijf twee klassen:
BeeenHive. EenBeeheeft twee velden:Pollen(voor aantal bolletjes stuifmeel, als int) en een veld voor de korf (onderzoek zelf hoe je dit uitdrukt). EenHiveheeft één veld:Pollen(ook voor een aantal bolletjes stuifmeel).Een
Beeheeft twee instantiemethodes:CollectPollen()enDeliverPollen(), beide met return typevoid. De eerste zorgt ervoor dat het veldPollenvan een bij een willekeurige waarde tussen 1 en 10 krijgt. Deze waarde kan je berekenen metRNG.Next(1,11), maar als de bij al pollen aan het dragen is, doet de methode niets. De tweede verhoogt het veldPollenvan de korf waaraan de bij gelinkt is en zet het veldPollenvan de bij zelf terug op 0.Een
Hiveheeft één instantiemethode:DisplayCollectedPollen(). Deze print de hoeveelheid pollen die in de korf verzameld is. De klasseHiveheeft ook een statische methode:DemonstrateBeesAndHives. Deze maakt drie bijenkorven aan en maakt per korf 100 bijen aan. Denk eraan alle velden te initialiseren! Daarna laat deze alle bijen één keer pollen verzamelen en terugbrengen naar de korf. Ten slotte laat deze voor elke korf printen hoe veel pollen er verzameld is. Normaal zou elke korf bij benadering 550 bolletjes pollen moeten hebben, maar moet het aantal voor de verschillende korven verschillend zijn.