Week 2

circle-info

Je hebt nu geleerd hoe je met structs orde schept in de chaos van losse variabelen. Je bent van "losse rommel" naar "nette dozen" gegaan. Maar... heb je gemerkt dat die dozen nogal passief zijn? Ze doen niks, tenzij jij er een aparte methode op loslaat.

We gaan nu effectief de leerstof van hoofdstuk 9 toepassen: de volgende stap is Object Oriented Programming (OOP).

In het intermezzo van vorige week had je een StudentData struct. Die bevatte wel de cijfers, maar kon zelf zijn gemiddelde niet berekenen. Je moest die struct telkens doorgeven aan een externe "manager" (jouw methodes).

// De struct is passief (data)
StudentData alex = ...;

// De actie moet buitenaf gebeuren
double avg = CalculateAverage(alex); 

Dit voelt alsof je een auto hebt, maar je moet hem zelf duwen.

De Oplossing: Slimme Objecten (Classes)

In OOP gaan we onze dozen (structs) upgraden naar Classes. Een Class is niet zomaar een container voor data. Het is een volwaardig object dat weet wat het moet doen.

We verplaatsen de logica (de methodes) IN de doos.

  • Vroeger (Struct): Een lijstje met ingrediënten (Data).

  • Nu (Class): Een Chef-kok die de ingrediënten heeft én weet hoe hij ze moet koken (Data + Gedrag).

// Het object is slim (data + gedrag)
Student alex = new Student("Alex", 12, 14);

// Het object doet het werk zelf!
double avg = alex.CalculateAverage();

Zie je het verschil? We hoeven alex niet meer door te geven. Alex weet zelf zijn cijfers en berekent zelf zijn gemiddelde.

circle-exclamation

RapportModule (Essential)

circle-exclamation

Doel: Ontwerp een klasse die een graad berekent op basis van een behaald percentage.

Specificaties:

  • Klassenaam: Rapport

  • Properties:

    • Percentage (type: int): Het behaalde punt.

  • Methoden:

    • PrintGraad() (type: void): Toont de graad in de console.

Werking (Business Rules): De methode PrintGraad controleert de waarde van Percentage en toont de bijbehorende tekst:

Frequentie
Output Tekst

Minder dan 50

"Niet geslaagd"

50 t.e.m. 68

"Voldoende"

69 t.e.m. 75

"Onderscheiding"

76 t.e.m. 85

"Grote onderscheiding"

Meer dan 85

"Grootste onderscheiding"

Voorbeeldgebruik: Test je klasse met volgende code in Main:

Controleer je oplossing ook via Test => Run All Tests.

Nummers (Essential)

Doel: Maak een rekenmachine-klasse die bewerkingen uitvoert op twee getallen.

Specificaties:

  • Klassenaam: NummerBerekenaar

  • Properties:

    • Getal1 (type: int): Het eerste getal.

    • Getal2 (type: int): Het tweede getal.

  • Methoden:

    • Som(): returntype int

    • Verschil(): returntype int

    • Product(): returntype int

    • Quotient(): returntype double

Werking:

  • Som, Verschil, Product: Voeren de standaard wiskundige bewerking uit (+, -, *) en geven het resultaat terug.

  • Quotient: Deelt Getal1 door Getal2.

    • Let op: Delen door nul mag niet.

    • Als Getal2 gelijk is aan 0: Toon foutboodschap "Kan niet delen door 0" in de console EN geef 0.0 terug.

    • Anders: Geef het resultaat van de deling terug.

Voorbeeldgebruik:

Studentklasse (Essential)

Doel: Sla gegevens van een student op en bereken het gemiddelde.

Specificaties:

  • Klassenaam: Student

  • Enum: Klassen (definieer deze buiten de klasse, mogelijke waarden: TI1, TI2, TI3)

  • Properties:

    • Naam (string)

    • Leeftijd (int)

    • Klas (Klassen - gebruik de enum hierboven)

    • PuntenCommunicatie (int)

    • PuntenProgrammingPrinciples (int)

    • PuntenWebTech (int)

  • Methoden:

    • BerekenGemiddelde(): Geeft het gemiddelde van de 3 puntenvakken terug als double.

    • GeefOverzicht(): Toont een rapport in de console (zie voorbeeld).

Voorbeeldgebruik:

Verwachte Output:

PizzaTime

Doel: Maak een klasse Pizza die waarden controleert voordat ze worden opgeslagen.

Specificaties:

  • Klassenaam: Pizza

  • Properties (Full Properties met validatie):

    • Toppings (string): Beschrijving van de toppings.

    • Diameter (int): Doorsnede in cm.

    • Price (double): Prijs in euro.

Validatie Regels (in de set van de properties): Bij het toewijzen van een nieuwe waarde (value), controleer het volgende. Indien de waarde niet geldig is, doe je niets (de oude waarde blijft behouden).

  1. Price en Diameter: Moeten groter zijn dan 0. (Indien value <= 0 -> negeer).

  2. Toppings: Mag niet leeg zijn. (Gebruik string.IsNullOrWhiteSpace(value) om te controleren. Indien true -> negeer).

Voorbeeldgebruik: Maak in je Main enkele pizza's aan en probeer foute waarden in te stellen om te testen of ze inderdaad geweigerd worden.

Figuren

Doel: Werken met overerving of losse klassen (hier losse klassen) en validatie.

Specificaties:

Klasse

Property

Type

Validatie in set

Rechthoek

Lengte

int

Indien value < 1, verander niets. Anders value.

Breedte

int

Indien value < 1, verander niets. Anders value.

Methode: ToonOppervlakte()

void

Berekent Lengte * Breedte en toont resultaat.

Driehoek

Basis

int

Indien value < 1, verander niets. Anders value.

Hoogte

int

Indien value < 1, verander niets. Anders value.

Methode: ToonOppervlakte()

void

Berekent (Basis * Hoogte) / 2 en toont resultaat.

Let op: Rechthoek en Driehoek zijn hier twee aparte klassen en hebben niets met elkaar te maken, behalve dat ze toevallig gelijkaardige methoden hebben.

Opdracht: Maak van elke figuur een instantie in je Main en roep ToonOppervlakte aan.

MiniRPG (Final Essential)

circle-info

Een Final oefening is een opgave waarin alle leerstof van de voorbije oefeningen aan bod komt.

Doel: Bouw een mini-RPG systeem waarin je een held aanmaakt, traint en laat vechten.

Deel 1: De Setup

Maak eerst de nodige basisstructuur aan.

  1. Enum HeldType: Definieer deze buiten je klasse.

    • Opties: Krijger, Magiër, Boogschutter.

  2. Klasse Held:

    • Properties:

      • Naam (string): Mag niet leeg zijn. Indien leeg, stel in op "Naamloze Held".

      • Type (HeldType): Het type van de held.

      • Level (int): Private set. Begint altijd op 1.

      • XP (int): Experience Points. Private set. Begint op 0.

      • Levenspunten (int): Huidige HP. Mag niet onder 0 gaan.

      • MaxLevenspunten (int): Read-only property die volgende formule gebruikt: 100 + (Level * 10). (Bij level 1 is dit dus 110).

Deel 2: De Actie

Voeg nu gedrag toe aan je held.

  1. Methoden:

    • VerkrijgErvaring(int punten) (void):

      • Tel punten op bij XP.

      • Level Up Logica: Elke 100 XP stijgt de held een level.

      • Zolang XP >= 100:

        • Verminder XP met 100.

        • Verhoog Level met 1.

        • Verhoog Levenspunten met 10 (omdat MaxHP ook stijgt).

        • Toon: "Level Up! [Naam] is nu level [Level]!"

    • ValAan() (int):

      • Genereert schade gebaseerd op het Level en een basiswaarde.

      • Formule: 10 + Level. (Simpel gehouden voor nu).

      • Return dit getal.

    • IncasseerSchade(int schade) (void):

      • Trek schade af van Levenspunten.

      • Zorg dat Levenspunten niet onder 0 zakt (controleer dit in de property setter of hier).

      • Als Levenspunten 0 bereikt: Toon "[Naam] is verslagen...".

    • ToonStats() (string):

      • Geeft een samenvatting terug, bv:

      • "[Naam] (Level [Level] [Type]) - HP: [Levenspunten]/[MaxLevenspunten] - XP: [XP]"

Voorbeeldgebruik in Main:

Extra Uitdaging (Optioneel): Maak de ValAan methode slimmer gebaseerd op HeldType.

  • Krijger: Doet 10 + (Level * 2) schade (fysiek sterk).

  • Magiër: Doet 5 + (Level * 3) schade (begint zwak, wordt heel sterk).

  • Boogschutter: Doet 8 + (Level * 2) schade.

Last updated

Was this helpful?