Oefeningen H9

Week 1

{% hint style="info" %} In dit en volgend hoofdstuk staan bij sommige oefeningen bovenaan een link naar een alternatieve manier van de oefening te maken waarbij je ook feedback krijgt. Bekijk zeker eerst dit filmpje. Indien je geen knop "open in visual studio" hebt in github dan kan je dit oplossen als volgt: open Visual studio en kies voor clone a repository:

Clonen maar

Vervolgens copy paste je de githuburl als daar om gevraagd wordt (voor de eerste oefening is dat https://github.com/timdams/ZIESCHERPER_TESTS_H1_RapportModule).

Clonen maar

RapportModule (Essential)

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

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

Specificaties:

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

FrequentieOutput 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:

Rapport mijnPunten = new Rapport();
mijnPunten.Percentage = 65;
mijnPunten.PrintGraad(); // Verwachte output: "Voldoende"

Rapport mijnVriendPunten = new Rapport();
mijnVriendPunten.Percentage = 89;
mijnVriendPunten.PrintGraad(); // Verwachte output: "Grootste onderscheiding"

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

Nummers (Essential)

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

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

Specificaties:

Werking:

Voorbeeldgebruik:

NummerBerekenaar paar1 = new NummerBerekenaar();
paar1.Getal1 = 12;
paar1.Getal2 = 34;

Console.WriteLine($"Som = {paar1.Som()}");      // Output: 46
Console.WriteLine($"Verschil = {paar1.Verschil()}"); // Output: -22

Studentklasse (Essential)

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

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

Specificaties:

Voorbeeldgebruik:

Student student1 = new Student();
student1.Klas = Klassen.TI1;
student1.Naam = "Joske Vermeulen";
student1.Leeftijd = 21;
student1.PuntenCommunicatie = 12;      
student1.PuntenProgrammingPrinciples = 15;
student1.PuntenWebTech = 13;

student1.GeefOverzicht();

Verwachte Output:

Joske Vermeulen, 21 jaar
Klas: TI1

Cijferrapport:
**********
Communicatie:             12
Programming Principles:   15
Web Technology:           13
Gemiddelde:               13.3333333333

PizzaTime

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

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

Specificaties:

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

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

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

Specificaties:

KlassePropertyTypeValidatie in set
RechthoekLengteintIndien value < 1, stel in op 1. Anders value.
BreedteintIndien value < 1, stel in op 1. Anders value.
Methode: ToonOppervlakte()voidBerekent Lengte * Breedte en toont resultaat.
DriehoekBasisintIndien value < 1, stel in op 1. Anders value.
HoogteintIndien value < 1, stel in op 1. Anders value.
Methode: ToonOppervlakte()voidBerekent (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.

Week 2

Bibliotheek (Essential)

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

Doel: Beheer het uitlenen van boeken met datums.

Specificaties:

Voorbeeldgebruik: Test je werken met datums door enkele boek-objecten aan te maken.

BankManager (Essential)

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

Deel 1: Basisrekening

Specificaties:

Deel 2: Rekeningstaat

Voeg functionaliteit toe om een rekening te blokkeren.

Extra Specificaties:

Gewijzigd Gedrag: Pas de methoden van Deel 1 aan met deze regels:

ActieAls Staat == GeldigAls Staat == Geblokkeerd
StortGeldVoer storting uit.Toon error: "Gaat niet. Rekening geblokkeerd."
HaalGeldAf

Voer afhaling uit (zie regels Deel 1).
Extra: Als balans op 0 komt door afhaling -> Zet Staat automatisch op Geblokkeerd.

Toon error: "Gaat niet. Rekening geblokkeerd."

Testscenario:

  1. Maak rekeningen aan met geld.
  2. Schrijf over van rek1 naar rek2: rek2.StortGeld(rek1.HaalGeldAf(300));
  3. Test blokkering door over de limiet te gaan.

Persoon (Essential)

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

Specificaties:

Verjaardag

Doel: Bereken hoelang het duurt tot de volgende verjaardag.

Vereisten:

Tip voor dagnaam:

string dagNaam = System.Globalization.DateTimeFormatInfo.CurrentInfo.GetDayName(datum.DayOfWeek);

Voorbeeld:

Wanneer is je verjaardag (d/m, bv 18/3)
Invoer: 20/5
Output: Je bent over 124 dagen jarig op een Dinsdag

Sports

Sportspeler

Maak een klasse die een speler voorstelt.

Optie A: Kies zelf Kies je favoriete sport en bedenk zelf 4 eigenschappen (zoals positie, rugnummer, ...) en 2 acties.

Optie B: Voorbeeld (Voetballer) Gebruik deze specificaties als je geen eigen sport wil kiezen.

Opdracht: Maak een console-applicatie, maak enkele spelers aan, en roep de methoden aan.

Dobbelstenen

Doel: Simuleer het werpen van twee dobbelstenen.

Specificaties:

Werking (WerpEnTel6):

  1. Maak een lus die 1000 keer herhaalt.
  2. In elke iteratie:
  3. Na de lus: Toon het totaal aantal keer dat dubbel-6 is gegooid op het scherm.

De Campingmanager: "Het Nullpointerke" (Combined Essential)

Scenario: Je bent zojuist aangenomen als lead developer voor Camping "Het Nullpointerke". De eigenares, Gerda, doet haar boekingen momenteel nog op bierviltjes, maar sinds de doorbraak van "Glamping" verliest ze het overzicht. Ze heeft vooral problemen met gasten die bij het uitchecken niet genoeg geld blijken te hebben, en ze vergeet vaak de seniorenekorting toe te passen (wat tot boze bejaarden aan de receptie leidt).

Aan jou de taak om een digitaal boekingssysteem te bouwen dat deze problemen oplost.

Doel: Ontwerp een klasse Boeking die fungeert als de digitale receptioniste. De klasse moet invoer streng valideren (Gerda houdt van orde), prijzen berekenen op basis van luxe-niveau, en controleren of de gast wel kan betalen voordat de boeking definitief wordt.

Specificaties:

  1. De Accommodatie (Enum)
  2. De Boeking (Klasse)

Voorbeeldgebruik (in je Main):

// Scenario: Opa Pol wil 5 nachten in een Chalet, maar is zijn portefeuille vergeten.
Boeking boeking1 = new Boeking();
boeking1.Hoofdboeker = "Pol";
boeking1.GeboorteDatum = new DateTime(1955, 3, 12); // Pol is ouder dan 60
boeking1.Type = VerblijfType.LuxeChalet;
boeking1.HuidigBudget = 200; // Oei, dat is krap voor een chalet

// Test de logica
Console.WriteLine("--- Poging 1 ---");
boeking1.BevestigBoeking(5); 
// Verwacht: Foutmelding over budget (Prijs is ong. €400 met korting, budget is 200)

// Pol vindt 300 euro in zijn andere broekzak
Console.WriteLine("\n--- Poging 2 (met meer geld) ---");
boeking1.HuidigBudget += 300; 
boeking1.BevestigBoeking(5);
// Verwacht: Succesbericht + correcte uitcheckdatum + restsaldo.