Oefeningen H11

Meetlat constructor (Essential)

Doel: Pas de bestaande Meetlat klasse uit het vorige hoofdstuk aan om met een constructor te werken.

Stappenplan:

  1. Verwijder de write-only property BeginLengte.
  2. Voeg toe een private instantievariabele: private double lengteInMeter;.
  3. Maak een Constructor die één parameter aanvaardt (type double) en wijs deze waarde toe aan lengteInMeter.
  4. Pas de werking van de overige properties aan zodat ze nu deze nieuwe variabele gebruiken in plaats van de property.

Voorbeeldgebruik:

// Oude manier (werkt NIET meer na aanpassing):
// Meetlat m = new Meetlat();
// m.BeginLengte = 5;

// Nieuwe manier:
Meetlat m = new Meetlat(5);
Console.WriteLine(m.LengteInCm);

Persoonsregistratie (Essential) (GPT)

{% hint style="info" %} Deze oefening werd gemaakt (en aangepast nadien) met behulp van volgende GPT en heeft daarom de tag (GPT) achter de titel staan.

Doel: Gebruik constructors en object initializers om personen aan te maken.

Specificaties:

  • Klassenaam: Persoon
  • Properties (Auto):
    • Voornaam (string)
    • Achternaam (string)
    • Geboortejaar (int)
    • Email (string)
  • Constructor:
    • Parameters: voornaam, achternaam.
    • Validatie:
      • Indien voornaam gelijk is aan achternaam -> Werp een ArgumentException op met de boodschap "Voornaam en achternaam mogen niet hetzelfde zijn".
  • Methode:
    • ToonInformatie() (void): Toont de tekst: "{Voornaam} {Achternaam} geboren in {Geboortejaar} heeft emailadres: {Email}".

Opdracht in Main:

  1. Maak een Persoon object aan met de constructor.
  2. Gebruik Object Initializer Syntax om ook meteen Geboortejaar en Email in te stellen.
    • Voorbeeld: new Persoon("Jan", "Janssens") { Geboortejaar = 1990, ... }
  3. Roep ToonInformatie() aan.
  4. Schrijf code die test of je applicatie niet krasht als je een foutieve naam ingeeft (gebruik try-catch).

Bibliotheek constructor en static (Essential)

Doel: Breid de BibBoek klasse uit met default waarden en statische logica.

Aanpassingen aan BibBoek:

  1. Default Constructor:
    • Stel Uitgeleend in op DateTime.Now.
  2. Overloaded Constructor:
    • Parameter: DateTime startDatum.
    • Stel Uitgeleend in op deze parameter.
    • Validatie: Indien startDatum in de toekomst ligt -> Werp exception.
  3. Statische Methode:
    • static void VeranderAlgemeneUitleenTermijn(int dagen)
    • Werking:
      • Maak een private static int uitleenTermijnInDagen aan in de klasse (standaardwaarde bv. 14).
      • Pas de methode aan zodat deze statische variabele wordt gewijzigd.
      • Pas de property InleverDatum aan zodat hij deze statische variabele gebruikt voor de berekening (i.p.v. de hardcoded 14 dagen).

Digitale kluis (Essential)

Basiskluis

{% hint style="info" %} Maak je oplossing in een kopie van volgende solution met bijhorende unittests.

Specificaties:

Constructors:

Methode TryCode(int ingevoerdeCode): Deze methode controleert de code en geeft true (juist) of false (fout) terug. De methode print ook feedback naar de console.

Beslissingstabel voor TryCode:

SituatieConditieActie (Console Output)Return Waarde
ValsspeleringevoerdeCode == -666"CHEATER"false
Reeds GeblokkeerdaantalPogingen >= 10"Je hebt je 10 pogingen opgebruikt."false
Juiste CodeingevoerdeCode == code"Geldige code. Aantal pogingen = {aantalPogingen}"true
Foute CodeingevoerdeCode != code

"Geen geldige code."
(Verhoog aantalPogingen met +1)

false

Kluizen kraken (Static Methode)

Voeg een statische methode toe om een kluis te kraken via brute-force.

Specificaties:

Test dit in je Main door een kluis aan te maken en DigitaleKluis.BruteForce(mijnKluis) aan te roepen.

Pokémon deel 2 (Essential)

Constructors

Pas je Pokemon klasse aan zodat deze op 3 manieren aangemaakt kan worden. Dit betekent dat je 2 constructors moet toevoegen (de default constructor bestaat al, tenzij je die overschreven hebt).

De 3 manieren:

  1. Default Constructor:
    • Gebruik: new Pokemon()
    • Actie: Stel alle 6 base-stats standaard in op 10.
  2. Overloaded Constructor:
    • Gebruik: new Pokemon(hp, att, def, spAtt, spDef, speed)
    • Actie: Stel de 6 base-stats in met de meegegeven waarden.
  3. Object Initializer:
    • Gebruik: new Pokemon() { HP_Base = 40, Naam = "Pikachu" }
    • Actie: Hiervoor hoef je niets speciaals te doen, dit werkt automatisch als je een parameterloze constructor hebt en de properties toegankelijk zijn.

{% hint style="info" %} Zet de setters van je Base Stat properties op private. Hierdoor kunnen ze alleen aangepast worden tijdens de constructie (via constructor of initializer), maar niet meer daarna.

Static methoden en properties

Breid de klasse Pokemon uit met functionaliteit om statistieken over alle Pokémon bij te houden.

Static Properties (Private Set):

Static Methoden:

Aanpassing VerhoogLevel:

{% hint style="info" %} Student Kevin Van Rooy maakte volgende applicatie waarbij bovenstaande opgave als initiële inspiratie diende:

Knap gedaan! (click to enlarge)

Natures (PRO)

Pokémon hebben een "Nature" (aard) die hun stats beïnvloedt (+10% op één stat, -10 op een andere).

Specificaties:

  1. Enum: Definieer Nature (zie tabel).
  2. Property: Voeg een property Nature toe aan je Pokémon klasse.
  3. Constructor: Zorg dat elke nieuwe Pokémon een willekeurige Nature krijgt in de constructor.

Implementatie van de Bonus: Pas de berekening van je Full Stats aan. Gebruik een helper-methode om je code netjes te houden.

Tip: Maak een helper methode: private double BerekenNatureModifier(StatType stat)

Vermenigvuldig je Full Stat berekening met dit getal (en cast terug naar int).

NatureVerhoogt met 10%Verlaagt met 10
AdamantAttackSp. Atk
BashfulSp. AtkSp. Atk
BoldDefenseAttack
BraveAttackSpeed
CalmSp. DefAttack
CarefulSp. DefSp. Atk
DocileDefenseDefense
GentleSp. DefDefense
HardyAttackAttack
HastySpeedDefense
ImpishDefenseSp. Atk
JollySpeedSp. Atk
LaxDefenseSp. Def
LonelyAttackDefense
MildSp. AtkDefense
ModestSp. AtkAttack
NaiveSpeedSp. Def
NaughtyAttackSp. Def
QuietSp. AtkSpeed
QuirkySp. DefSp. Def
RashSp. AtkSp. Def
RelaxedDefenseSpeed
SassySp. DefSpeed
SeriousSpeedSpeed
TimidSpeedAttack

Meer info over Natures

Sport simulator

Gebruik je Sportspeler (of Voetballer) klasse van het vorige hoofdstuk. Voeg de volgende statische methoden toe aan Program.cs.

1. SimuleerSpeler

2. SimuleerWedstrijd

3. BesteSpeler

Test: Maak in je Main twee spelers aan en test deze 3 methoden.

Project: GreenRide (Combined Essential)

Scenario: Proficiat! Je bent zonet aangesteld als CTO (Chief Technical Officer) van GreenRide, de nieuwste hipste start-up van 't Stad. De missie? De wereld veroveren met elektrische deelsteps.

De investeerders zijn enthousiast, maar er is één probleem: er is nog geen software. Aan jou om de Core-Backend te schrijven die alle steps beheert, de winst berekent, en ervoor zorgt dat gebruikers niet kunnen wegrijden met een lege batterij.

Als CTO beslis je om slim gebruik te maken van static variabelen voor zaken die voor alle steps gelden (zoals de prijs), en instance variabelen voor unieke data (zoals de locatie en batterij van één specifieke step).

Specificaties:

1. De DeelStep Klasse

2. Het Dashboard (Main Programma)

Schrijf een simulatie in je Program.cs om aan de investeerders te tonen:

  1. De Vloot: Maak 3 steps aan (waarvan eentje met een platte batterij via de 2e constructor).
  2. De Ochtendspits:
  3. Prijsstijging:
  4. De Aankomst:
  5. De Balans:

Extra (Pro): Voeg een statische methode GeefGratisStroom() toe aan de klasse, die alle steps (die niet bezig zijn) terug oplaadt naar 100%. (Hiervoor zal je wel een lijst van alle aangemaakte objecten moeten bijhouden in de klasse zelf... uitdagend!).