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.cs
naarAccountStruct
. - Definieer een klasse Account (in een bestand Account.cs) met dezelfde velden als de bestaande struct.
- Voeg aan Account.cs een statische methode
DemonstrateType
toe. - Associeer in
DemonstrateType
twee variabelencAccount1
encAccount2
met eenAccount
- Associeer verder in
DemonstrateType
twee variabelensAccount1
ensAccount2
met eenAccountStruct
- Initialiseer alle velden van de twee
AccountStruct
variabelen. 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
Amount
op een verschillende waarde. - Laat ten slotte het bedrag op elke rekening uitprinten.
- Zorg ervoor dat je
DemonstrateType
kan 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 klasseAccount
die een bedrag bij stort op de rekening. Dit bedrag moet positief zijn, anders wordt een exception gegooid. - Schrijf een methode
WithdrawFunds
met return typebool
die een bedrag van de rekening haalt. Als dit lukt, wordttrue
teruggegeven, anders wordtfalse
teruggegeven. 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
Car
in 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:Accelerate
enBrake
. 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 eenCar
aanmaakt, 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.cs
met een extra veld als volgt:public static Random RNG = new Random();
.Schrijf twee klassen:
Bee
enHive
. EenBee
heeft twee velden:Pollen
(voor aantal bolletjes stuifmeel, als int) en een veld voor de korf (onderzoek zelf hoe je dit uitdrukt). EenHive
heeft één veld:Pollen
(ook voor een aantal bolletjes stuifmeel).Een
Bee
heeft twee instantiemethodes:CollectPollen()
enDeliverPollen()
, beide met return typevoid
. De eerste zorgt ervoor dat het veldPollen
van 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 veldPollen
van de korf waaraan de bij gelinkt is en zet het veldPollen
van de bij zelf terug op 0.Een
Hive
heeft één instantiemethode:DisplayCollectedPollen()
. Deze print de hoeveelheid pollen die in de korf verzameld is. De klasseHive
heeft 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.