Oefeningen H9
Last updated
Last updated
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:
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).
Ontwerp een klasse Rapport
die je zal tonen wat je graad is gegeven een bepaald behaald percentage. Het enige dat je aan een Rapport
-object moet kunnen geven is het behaalde percentage (int) dat wordt bijgehouden via een auto-property genaamd Percentage
. Via een methode PrintGraad
kan de behaalde graad weergegeven worden (returntype van de methode is dus void
), gebaseerd op dit percentage. Dit zijn de mogelijkheden:
Minder dan 50%: "Niet geslaagd"
.
Tussen 50% en 68% (68 incl.): "Voldoende"
.
Tussen 68% en 75% (75 incl.): "Onderscheiding"
.
Tussen 75% en 85% (85 incl.): "Grote onderscheiding"
.
Meer dan 85%: "Grootste onderscheiding"
.
Test je klasse door enkele objecten in je main
en te onderzoeken of deze de juiste graden op het scherm printen. Bijvoorbeeld:
Werkt het naar behoren?! Voer nu de bijhorende unit tests uit om alles extra te controleren: Test=> Run All Tests.
Maak een klasse NummerBerekenaar
. Deze klasse bevat 2 getallen (type int
) genaamd Getal1
en Getal2
die via een autoproperty kunnen aangepast worden. Er zijn 4 methoden die telkens een int
teruggeven, behalve Quotient
dat een double
teruggeeft:
Som
: geeft de som van beide getallen terug.
Verschil
: geeft het verschil van beide getallen terug.
Product
: geeft het product van beide getallen terug.
Quotient
: geeft de deling van het eerste door het tweede getal terug; toon een foutboodschap ("Kan niet delen door 0"
) op het scherm indien er een deling door nul zal gebeuren. Gebruik Console.WriteLine
om deze boodschap in de methode te laten verschijnen en geeft 0.0
terug als resultaat.
Toon in je main
aan dat je code werkt.
Volgende code zou bijvoorbeeld onderstaande output moeten geven:
Output:
Maak een nieuwe klasse Student
.
Deze klasse heeft 6 autoproperties:
Naam
(string
)
Leeftijd
(int
)
Klas
(maak dit van een enum
)
PuntenCommunicatie
(int
)
PuntenProgrammingPrinciples
(int
)
PuntenWebTech
(int
)
Voeg aan de klasse een methode BerekenGemiddelde
toe. Wanneer deze methode wordt aangeroepen dan wordt het gemiddelde van de 3 punten teruggegeven als double zodat dit op het scherm kan getoond worden.
Voeg aan de klasse ook de methode GeefOverzicht
toe. Deze methode zal een volledig "Rapport" van de student tonen (inclusief het gemiddelde m.b.v. de BerekenGemiddelde-methode).
Test je programma door enkele studenten aan te maken en in te stellen. Volgende main zou dan de bijhorende output moeten krijgen:
Output:
Maak een klasse Pizza. Deze klasse heeft een aantal instantievariabelen:
toppings
(string
): bevat beschrijving van wat er op ligt, bv. ananas, peperoni, etc.
diameter
(integer
): doorsnede van de pizza in cm.
price
(double
): prijs van de pizza in euro.
Zorg ervoor dat je met behulp van full properties (met dezelfde namen, maar met hoofdletter) deze 3 velden kan uitlezen en aanpassen.
Bouw controle in zodat de instantievariabelen geen foute waarden kunnen gegeven worden:
geen negatieve price en diameter
pizza zonder toppings is niet toegestaan (toppings mag geen lege string zijn).
Indien een niet toegestane waarde aan een property wordt gegeven dan wordt deze gewoon genegeerd en gebeurt er verder niet (de property, en dus instantievariabele, behoudt met andere woorden de waarde die het ervoor al had).
Maak in je main een aantal pizza-instanties aan en toon de werking van de properties aan.
Maak een eenvoudige klasse Rechthoek
aan die een lengte en breedte als private instantievariabelen heeft (type int
). Deze kunnen enkel via full properties ingesteld worden en nooit onder 1 gaan.
Maak ook een klasse Driehoek
die een basis en hoogte als instantievariabelen (type int
) heeft en bijhorende full props.
Beide klassen hebben een methode ToonOppervlakte
die de oppervlakte van de figuur in kwestie op het scherm toont.
Toon de werking van het project aan door een aantal instanties van Driehoek
en Rechthoek
te maken, met verschillende groottes. Roep van iedere figuur de ToonOppervlakte
-methode aan.
Boeken in een bibliotheek mogen maximum 14 dagen uitgeleend worden. De klasse BibBoek
heeft volgende informatie:
Ontlener
: De naam van de ontlener (autoproperty type string
, beginwaarde = "onbekend")
Uitgeleend
: De datum dat het boek werd uitgeleend ( private get, public set).
InleverDatum
: De datum dat het boek ten laatste terug moet ingeleverd worden (readonly property van het type DateTime
): deze geeft steeds een datum terug 14 dagen na de datum die via Uitgeleend
werd ingesteld.
De achterliggende instantievariabele bij Uitgeleend
wordt standaard ingesteld bij de object-creatie op de huidige tijd (DateTime.Now
toewijzen aan de achterliggende instantievariabele). Als je dus vergeet de Uitgeleend
property in te stellen later dan heeft deze zeker een waarde.
In hoofdstuk 11 zullen we constructors leren gebruiken: deze laten je toe om dit soort initialisatie-code te bundelen in een overzichtelijke methode.
De klasse heeft ook een methode VerlengTermijn
waar je een parameter type int
aan kunt meegeven. Deze methode werkt als volgt: De meegegeven waarde stelt het aantal dagen dat het boek extra mag uitgeleend worden. We gaan dit in orde brengen door de de Uitgeleend
waarde met die dagen te verhogen. Als het boek dus was uitgeleend op 18 maart en het wordt verleng met 3 dagen dan maken van van Uitgeleend
21 maart.
Test je klasse door enkele objecten ervan aan te maken.
We maken een Rekening
klasse die kan gebruikt worden om de bankrekening van een klant voor te stellen. Deze heeft volgende zaken:
Een instantievariabele van het type int
genaamd balans
. Deze variabele houdt het totale bedrag bij dat op de rekening staat.
2 autoproperties van type string
namelijk NaamKlant
en RekeningNummer
.
1 readonly property Balans
die de balans
teruggeeft.
Voorzie 3 methoden:
HaalGeldAf
: bepaald bedrag (als parameter type int
) wordt van de balans
verwijderd.
StortGeld
: bepaald bedrag (als parameter type int
) wordt aan balans
toegevoegd.
ToonInfo
: het totale bedrag op de rekening wordt getoond op het scherm, alsook de naam van de klant en het rekeningnummer (ook de staat wanneer je deel 2 hebt gemaakt wordt getoond).
Pas de HaalGeldAf
methode aan zodat als returntype het bedrag (int
) wordt teruggegeven. Indien het gevraagde bedrag meer dan de balans
is dan geef je al het geld terug dat nog op de rekening staat en toon je in de console dat niet al het geld kon worden gegeven (error die verschijnt: Rekening leeg nu
.)
Opgelet: omdat balans niet van buiten ingesteld kan worden, kan je enkel geld op de rekening zetten met behulp van de StortGeld methode. Wil je dus je klasse testen maak dan rekening-objecten aan waar je ogenblikkelijk geld op stort.
Enkele getalvoorbeelden:
Stel dat je een rekening hebt met 1000 balans
. Indien je op deze rekening HaalGeldAf
aanroept met 300 als parameter, dan zal deze methode 300 teruggeven. De balans
van de rekening wordt op 700 gezet.
Stel dat je een rekening hebt met 1000 balans. Indien je op deze rekening HaalGelfdAf
aanroept met 1500 als parameter, dan zal deze methode 1000 teruggeven (namelijk al het geld dat beschikbaar is) en de balans
op 0.
Maak 2 instanties van het type Rekening
aan en toon aan dat je geld van de ene Rekening aan de andere kunt geven, als volgt:
Test je klasse.
Nieuwe klant aanmaken
Geld op een bepaalde Rekening zetten
Geld van een bepaalde Rekening afhalen
Geld tussen 2 Rekeningen overschrijven
Voorzie extra functionaliteit naar keuze.
Deel 2
Voeg aan de Rekening
-klasse een autoproperty,genaamd Staat
, met private set toe van het type RekeningStaat
toe, dat een enumeratie bevat. De Rekening kan in volgende staten zijn Geldig
, Geblokkeerd
. Een rekening is Geldig wanneer een nieuwe rekening wordt geopend.
Maak een bijhorende publieke Methode waarmee je de Rekening van staat kunt veranderen. Deze methode (noem ze VeranderStaat
) vereist geen parameters. Telkens je ze aanroept wordt de staat omgewisseld. Als dus het object momenteel op Geldig
stond, dan wordt ze nu Geblokkeerd
en omgekeerd.
Indien een persoon geld van of naar een Geblokkeerde rekening wil sturen dan zal er een error op het scherm verschijnen, namelijk Gaat niet. Rekening geblokkeerd.
. Idem bij de StortGeld
methode.
Indien de HaalGeldAf
methode wordt aangeroepen en er werd meer geld afgehaald dan de balans dan zal de rekening ook op Geblokkeerd gezet worden na het verschijnen van de foutboodschap ("Rekening leeg nu").
Ontwerp en implementeer een klasse Persoon met 2 autoproperties (string
) Achternaam
en Voornaam
.
Voeg bovendien een full property GeboorteDatum
toe (type DateTime
). De geboortedatum kan enkel waarden tussen 1/1/1990 en vandaag (moment dat code wordt uitgevoerd) liggen. Indien dit niet de situatie is, wordt de huidige datum van uitvoeren gebruikt.
Definieer vervolgens een methode BerekenLeeftijd
, die op basis van de ingestelde geboortedatum en de huidige datum (dat programma wordt uitgevoerd) de leeftijd (als int
) van de persoon teruggeeft.
Maak een applicatie die aan de gebruiker z'n geboortedatum vraagt (dag/maand, bv 18/3). Vervolgens toont het programma op welke dag hij volgend jaar jarig zal zijn (Monday, Tuesday, etc.) én hoeveel dagen hij nog moet wachten. Uiteraard gebruik je DateTime
voor deze applicatie.
Je hebt geen eigen klasse nodig. Doel van deze oefening is dat je leert werken met de bestaande DateTime
en TimeSpan
klassen. Je mag dus alles in de main schrijven.
Gegeven een object van het type DateTime genaamd myDate
. Volgende wat uitgebreide code geeft de naam van de dag terug in de taal van het systeem waarop je applicatie draait:
Voorbeeld invoer en uitvoer:
Kies je favoriete sport of game. Maak een klasse aan die een speler uit deze sport kan voorstellen. Verzin een 4-tal private instantievariabelen die deze spelers hebben, alsook 2 methoden die de speler moet kunnen uitvoeren.
Voorzie een methode StelIn
die je toelaat om de private instantievariabeles in te stellen:
Voorzie ook minstens 1 naam
(string
) instantievariabele.
Voorzie per instantievariabele ook telkens een full property. Waar nodig zorg je er voor dat er geen illegale waarden kunnen ingesteld worden (bv mutsnummer bij waterpolo gaat maar van 1 tot 13).
Bijvoorbeeld:
klasse Waterpolospeler
instantievariabelen:
spelerNaam
(string
)
mutsNummer
(int
)
isDoelman
(bool
)
isReserve
(bool
)
reeks
(string
, bv "Cadet")
Methoden: GooiBal
, Watertrappen
, StelIn
De methode StelIn
zou dan zou kunnen aangeroepen worden:
Wanneer de methoden worden aangeroepen zal er een tekst (mbv Console.WriteLine in de methode) op het scherm verschijnen die bv zegt Ik (Jos) gooi de bal
. Waarbij de naam van de speler in kwestie uit het Naam instantievariabele wordt gebruikt om mee getoond te worden.
Maak vervolgens een console-applicatie aan waarin je de werking van de klasse aantoont. Maar in de applicatie een aantal speler-objecten aan, vervolgens stel je hun properties in. Vervolgens roep je enkele methoden van de spelers aan en toon je via (Console.WriteLine) ook de properties van de individuele spelerobjecten.
Toon m.a.w. aan dat je:
Een klasse kunt maken (in een aparte file!)
Instanties (objecten) van deze klasse kunt maken
Kunt werken met deze instanties (properties instellen én uitlezen, aanroepen van methoden)
enums
Kan je in voorgaand voorbeeld het instantievariabele reeks
vervangen door een instantievariabele reeks dat een enum als datatype heeft?
Ontwerp en implementeer een klasse genaamd Dobbelstenen, die twee klassieke D6 dobbelstenen voorstelt. De klasse heeft een WerpEnTel6
methode, waarin 1000 keer met dit paar dobbelstenen wordt gegooid. Bereken hoeveel keer een dubbel zes voorkomt, dit wordt vervolgens getoond op het scherm.
Deze klasse bevat dus niets meer dan deze ene methode. Het lijkt erop alsof je ook dobbelsteencode etc moet implementeren maar dat hoeft dus niet. De methode "gooit" gewoon 1000x na elkaar 2 getallen m.b.v de Random-klasse, telkens die 2 gegooide getallen 6 zijn onthoud je dit.