- Deze week komen de technieken uit Geavanceerde methode-technieken erbij: named arguments, optionele parameters en method overloading.
- Let op De huisregel van week 1 blijft gelden:
ReadLineenWriteLineenkel in methoden dieToon...ofVraag...heten. Alle andere methoden krijgen parameters binnen en geven hun resultaat terug. - Alle methoden zijn
staticen staan naastMain, nooit erin. - In de voorbeelduitvoer begint gebruikersinvoer met
>.
Film Default (Essential)
Maak een enum Genre met de waarden Onbekend, Actie, Drama, Komedie en Animatie. Schrijf daarna een methode ToonFilm met drie parameters:
- de naam van de film (
string); - de duur in minuten (
int). Geeft de aanroeper geen duur mee, dan is die 90 minuten; - het genre (
Genre). Geeft de aanroeper geen genre mee, dan is hetGenre.Onbekend.
De methode toont de film in dit formaat:
The Matrix (120 minuten, Actie)
Toon in Main dat je de methode kan oproepen met 1, 2 en 3 argumenten. Toon ook een aanroep met een named argument: een animatiefilm waarvan je de duur niet kent.
Deze oplossing is afgeschermd.
Studenten krijgen de sleutel van hun lesgever. Heb je de sleutel al eens op dit toestel
gebruikt, dan verschijnt de oplossing hier vanzelf.
- Optionele parameters staan altijd achteraan de parameterlijst.
- Zonder namen kan je enkel van achter naar voor weglaten. Wil je de duur overslaan maar het genre wel meegeven, dan heb je een named argument nodig:
ToonFilm("Up", filmgenre: Genre.Animatie). MetToonFilm("Up", Genre.Animatie)probeer je eenGenrein deint duurte stoppen, en dat compileert niet.
Opwarmers met geavanceerde methoden (Essential)
Drie opwarmers uit week 1 krijgen een upgrade. Test ze in Main.
KwadraatwordtMacht(int grondtal, int exponent = 2), met returntypeint. Zonder exponent berekent ze dus nog altijd het kwadraat. Bereken de macht zelf met een lus, zonderMath.Pow.ToonOnevenNummerskrijgt een optionele parametervanaf(standaard 1):static void ToonOnevenNummers(int tot, int vanaf = 1). Roep ze ook eens op met een named argument, zoalsToonOnevenNummers(20, vanaf: 10).Grootstebestaat voortaan in twee versies: één voor twee getallen en één voor drie. Dat is overloading. De versie voor drie getallen gebruikt die voor twee.
7 in het kwadraat is 49
2 tot de derde is 8
1 3 5 7 9
11 13 15 17 19
Grootste van 4 en 9: 9
Grootste van 3, 8 en 5: 8
Deze oplossing is afgeschermd.
Studenten krijgen de sleutel van hun lesgever. Heb je de sleutel al eens op dit toestel
gebruikt, dan verschijnt de oplossing hier vanzelf.
Voorspel de uitvoer: optioneel en overload (Essential)
Fouten met optionele parameters en overloading zijn zelden compilerfouten: de code draait, maar doet iets anders dan je denkt. Zoek ze hier op papier.
static void ToonBestelling(string klant, int aantal = 1, int korting = 0)
{
Console.WriteLine($"{klant}: {aantal} stuk(s), {korting}% korting");
}
static void ToonAfspraak(string dokter, int uur, string patient)
{
Console.WriteLine($"{patient} heeft om {uur} uur een afspraak bij {dokter}");
}
static int Halveer(int getal)
{
return getal / 2;
}
static double Halveer(double getal)
{
return getal / 2;
}
static void ToonScore(int punten, double bonus)
{
Console.WriteLine($"A: {punten} punten, {bonus} bonus");
}
static void ToonScore(double punten, int bonus)
{
Console.WriteLine($"B: {punten} punten, {bonus} bonus");
}
static void Main(string[] args)
{
ToonBestelling("Sara", 10);
ToonBestelling("Sara", korting: 10);
ToonAfspraak("Emma", 14, "dokter Peeters");
Console.WriteLine(Halveer(7));
Console.WriteLine(Halveer(7.0));
Console.WriteLine(Halveer(7f));
ToonScore(8, 2);
ToonScore(8, 2.5);
}De programmeur wilde telkens één stuk met 10% korting tonen, en een afspraak van patiënt Emma bij dokter Peeters.
Schrijf per lijn in Main op welke versie van de methode uitgevoerd wordt en wat er verschijnt. Eén lijn compileert niet: welke, en waarom? Zet die lijn daarna in commentaar en voer de rest uit om je antwoorden te controleren.
Deze oplossing is afgeschermd.
Studenten krijgen de sleutel van hun lesgever. Heb je de sleutel al eens op dit toestel
gebruikt, dan verschijnt de oplossing hier vanzelf.
Roulette (Essential)
Deze oefening is een variant op een opgave uit de vaardigheidsproef van januari 2024. Het doel: aantonen dat je beter niet gokt, want het huis wint altijd. Je mag ervan uitgaan dat de gebruiker geen foute invoer typt.

De methode SimuleerRoulette. Ze krijgt het startkapitaal van de speler mee (double) en het aantal rondes (int). Het aantal rondes is optioneel en staat standaard op 10. In elke ronde gebeurt het volgende:
- De computer kiest een willekeurig getal van 0 tot en met 59: de keuze van de speler.
- De computer kiest nog een willekeurig getal van 0 tot en met 59: waar het balletje belandt.
- Zijn beide getallen gelijk, dan krijgt de speler 1 euro bij. Anders verliest hij 0,1 euro.
Na alle rondes geeft de methode het kapitaal terug dat overblijft.
De methode ToonResultaat. Ze krijgt het startkapitaal, het aantal rondes en het eindkapitaal mee, en toont hoeveel er overblijft en wat het verschil is met het startkapitaal: groen bij winst, rood bij verlies.
De applicatie. Vraag een startkapitaal. Toon eerst het resultaat van een korte avond: roep SimuleerRoulette op zonder aantal rondes. Toon daarna het resultaat van 100, 1000 en 10000 rondes.
Wat is je startkapitaal?
>1000
Na 10 rondes heb je 999,0 euro. Dat is een verschil van -1,0 euro.
Na 100 rondes heb je 992,2 euro. Dat is een verschil van -7,8 euro.
Na 1000 rondes heb je 912,1 euro. Dat is een verschil van -87,9 euro.
Na 10000 rondes heb je 194,7 euro. Dat is een verschil van -805,3 euro.
Het verschil staat in het rood. Door het toeval krijg jij andere getallen, maar na 10000 rondes zit je altijd rond de 800 euro verlies.
Het kapitaal is een double, en 0,1 kan een double niet exact bewaren. Na veel rondes kan je dus rare staartjes krijgen. Toon het kapitaal daarom met {kapitaal:F1}.
Deze oplossing is afgeschermd.
Studenten krijgen de sleutel van hun lesgever. Heb je de sleutel al eens op dit toestel
gebruikt, dan verschijnt de oplossing hier vanzelf.
SimuleerRoulette(startKapitaal)gebruikt de standaardwaarde: 10 rondes. Dat is het nut van een optionele parameter: de gewone aanroep blijft kort.- Vier keer bijna dezelfde lijn onder elkaar, met enkel een ander aantal rondes, is onnodige code. Het boeteblad gebruikt precies dit voorbeeld. Met een lus die
aantalRondes *= 10doet, staat de aanroep er maar één keer. ToonResultaattoont iets, dus heet zeToon....SimuleerRouletterekent enkel, en toont niets.
Helm’s Deep opgekuist (Essential)
De Final Essentials van hoofdstuk 6, De slag om Helm’s Deep, werkt, maar Main is lang. Hetzelfde blokje (kleur instellen, tekst tonen, kleur terugzetten) staat er meerdere keren in. Vertrek van je eigen oplossing (of van de modeloplossing) en knip ze op in methoden:
static string VraagTekst(string vraag)stelt een vraag en geeft het antwoord terug.static int PuntenVoorVijand(string vijand)geeft de punten van een vijand terug: 1 voor een Orc, 3 voor een Uruk-hai, 5 voor een Troll, en 0 voor een vijand die niet bestaat.static void ToonGekleurd(string tekst, ConsoleColor kleur = ConsoleColor.Gray)toont een tekst in een kleur, en zet de kleur daarna terug. Zonder kleur is dat gewoon grijs.
De uitvoer van je programma verandert niet.
De toets achteraf: kan je van elke methode in één zin zeggen wat ze doet? Zie Hoe groot mag een methode zijn?
Deze oplossing is afgeschermd.
Studenten krijgen de sleutel van hun lesgever. Heb je de sleutel al eens op dit toestel
gebruikt, dan verschijnt de oplossing hier vanzelf.
Havenbeheer (Final Essentials)
Tijd om al je kennis over methoden samen te brengen in de haven van Antwerpen. Je schrijft een systeem dat de toegang en de kosten van vrachtschepen berekent.
De methoden. Denk goed na over de returntypes!
ControleerDiepgangkrijgt de diepgang van een schip mee (double) en een optionele parameterkadeDiepte(double), die standaard 12,5 meter is. Ze geefttrueterug als de diepgang kleiner of gelijk is aan de kadediepte, andersfalse.BerekenHavengeldbestaat in twee versies (overloading):- met een
int: het aantal containers. Een container kost 45 euro. - met een
double: het tonnage van een bulkschip. Een ton kost 15 euro.
- met een
BerekenTotaleKostkrijgt het havengeld mee (double) en een optionelebool isGevaarlijk(standaardfalse). Bij gevaarlijke lading komt er 30% bij. Ze geeft de afgeronde prijs terug alsint.
Het scenario.
- Vraag de naam en de diepgang van het schip.
- Kade 1 is 12,5 meter diep: controleer dat met
ControleerDiepgangzonder kadediepte. Is het schip te diep, controleer dan of het in het Deurganckdok past, dat 14 meter diep is. RoepControleerDiepgangdaarvoor op met een named argument voor de kadediepte. - Past het schip nergens, toon dan een alarm en stop het programma.
- Vraag het type lading. Voor containers vraag je het aantal containers (een
int), voor bulk het tonnage (eendouble). De juiste versie vanBerekenHavengeldwordt dan vanzelf gekozen. - Vraag of de lading gevaarlijk is, en toon een rapport.
Welkom bij Havenbeheer Antwerpen.
Naam van het schip?
>The Unsinkable II
Diepgang in meters?
>13,2
Te diep voor kade 1. Het schip meert aan in het Deurganckdok.
Type lading (1=Containers, 2=Bulk)?
>1
Aantal containers?
>250
Bevat het schip gevaarlijke goederen (j/n)?
>j
--- RAPPORT: The Unsinkable II ---
Havengeld: 11250 euro
Type: gevaarlijke lading (+30%)
Totale kostprijs: 14625 euro
Nog een voorbeeld (te diep):
Welkom bij Havenbeheer Antwerpen.
Naam van het schip?
>Titanic
Diepgang in meters?
>50
ALARM: het schip ligt te diep (max 14 m) en mag niet binnen!
Deze oplossing is afgeschermd.
Studenten krijgen de sleutel van hun lesgever. Heb je de sleutel al eens op dit toestel
gebruikt, dan verschijnt de oplossing hier vanzelf.
- Welke versie van
BerekenHavengelder draait, beslist het type van wat je meegeeft. Lees je het aantal containers per ongeluk in alsdouble, dan kiest de compiler de versie voor bulk: 250 containers kosten dan 3750 euro in plaats van 11250. Geen foutmelding, wel een verkeerde prijs. return;inMainstopt het programma als het schip nergens past. Na dieelsehoeft de rest dus niet in een extraif. Zie return.- De standaardwaarde van
kadeDieptewordt echt gebruikt: bij kade 1 laat je ze weg. Enkel voor het Deurganckdok geef je een andere diepte mee.
Hoe ver geraak je?
Een bonus voor wie nog wil. Op edabit.com staan honderden kleine uitdagingen waarin je een methode schrijft. Zet de taal op C# en begin bij de makkelijkste niveaus. Een deel van de uitdagingen vraagt dingen die je nog niet kent: sla alles over waar [] (arrays) in voorkomt.