Programmeren 1
Home

Programmeren 1

Klassendiagramma
Structs en klassen weerspiegelen vaak concepten uit de echte wereld

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.

  1. 4.4.3 t.e.m. 4.5.1

Tijdens de les maken we volgende oefeningen:

  1. 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?

    1. Hernoem de struct voor rekeningen in Bank.cs naar AccountStruct.
    2. Definieer een klasse Account (in een bestand Account.cs) met dezelfde velden als de bestaande struct.
    3. Voeg aan Account.cs een statische methode DemonstrateType toe.
    4. Associeer in DemonstrateType twee variabelen cAccount1 en cAccount2 met een Account
    5. Associeer verder in DemonstrateType twee variabelen sAccount1 en sAccount2 met een AccountStruct
    6. Initialiseer alle velden van de twee AccountStruct variabelen. Welke waarden je ze geeft, maakt niet uit.
    7. Voeg dan volgende twee instructies toe: sAccount1 = sAccount2; en cAccount1 = cAccount2;
    8. Zet dan voor elk van de vier variabelen het veld Amount op een verschillende waarde.
    9. Laat ten slotte het bedrag op elke rekening uitprinten.
    10. Zorg ervoor dat je DemonstrateType kan oproepen vanaf Program.cs

    Roep deze methode op via Program.cs. Wat zie je? Hoe verklaar je dit?

  2. Voeg een methode PayInFunds(int amount) toe aan de klasse Account die een bedrag bij stort op de rekening. Dit bedrag moet positief zijn, anders wordt een exception gegooid.
  3. Schrijf een methode WithdrawFunds met return type bool die een bedrag van de rekening haalt. Als dit lukt, wordt true teruggegeven, anders wordt false teruggegeven. Het bedrag dat wordt afgehaald mag positief zijn en de rekening mag negatief gaan tot ze de "overdraft limit" bereikt.
  4. (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 en Brake. 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 methode DemonstrateCar, die een Car 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.

  5. (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 en Hive. Een Bee heeft twee velden: Pollen (voor aantal bolletjes stuifmeel, als int) en een veld voor de korf (onderzoek zelf hoe je dit uitdrukt). Een Hive heeft één veld: Pollen (ook voor een aantal bolletjes stuifmeel).

    Een Bee heeft twee instantiemethodes: CollectPollen() en DeliverPollen(), beide met return type void. De eerste zorgt ervoor dat het veld Pollen van een bij een willekeurige waarde tussen 1 en 10 krijgt. Deze waarde kan je berekenen met RNG.Next(1,11), maar als de bij al pollen aan het dragen is, doet de methode niets. De tweede verhoogt het veld Pollen van de korf waaraan de bij gelinkt is en zet het veld Pollen 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 klasse Hive 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.

VN
2018-12-19