• 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: ReadLine en WriteLine enkel in methoden die Toon... of Vraag... heten. Alle andere methoden krijgen parameters binnen en geven hun resultaat terug.
  • Alle methoden zijn static en staan naast Main, 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:

  1. de naam van de film (string);
  2. de duur in minuten (int). Geeft de aanroeper geen duur mee, dan is die 90 minuten;
  3. het genre (Genre). Geeft de aanroeper geen genre mee, dan is het Genre.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). Met ToonFilm("Up", Genre.Animatie) probeer je een Genre in de int duur te stoppen, en dat compileert niet.

Opwarmers met geavanceerde methoden (Essential)

Drie opwarmers uit week 1 krijgen een upgrade. Test ze in Main.

  • Kwadraat wordt Macht(int grondtal, int exponent = 2), met returntype int. Zonder exponent berekent ze dus nog altijd het kwadraat. Bereken de macht zelf met een lus, zonder Math.Pow.
  • ToonOnevenNummers krijgt een optionele parameter vanaf (standaard 1): static void ToonOnevenNummers(int tot, int vanaf = 1). Roep ze ook eens op met een named argument, zoals ToonOnevenNummers(20, vanaf: 10).
  • Grootste bestaat 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.

Potloodtekening: de robot als croupier harkt een grote berg fiches naar zich toe, het stokmannetje houdt één klein stapeltje over.

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:

  1. De computer kiest een willekeurig getal van 0 tot en met 59: de keuze van de speler.
  2. De computer kiest nog een willekeurig getal van 0 tot en met 59: waar het balletje belandt.
  3. 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.

Tip

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 *= 10 doet, staat de aanroep er maar één keer.
  • ToonResultaat toont iets, dus heet ze Toon.... SimuleerRoulette rekent 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!

  1. ControleerDiepgang krijgt de diepgang van een schip mee (double) en een optionele parameter kadeDiepte (double), die standaard 12,5 meter is. Ze geeft true terug als de diepgang kleiner of gelijk is aan de kadediepte, anders false.
  2. BerekenHavengeld bestaat 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.
  3. BerekenTotaleKost krijgt het havengeld mee (double) en een optionele bool isGevaarlijk (standaard false). Bij gevaarlijke lading komt er 30% bij. Ze geeft de afgeronde prijs terug als int.

Het scenario.

  1. Vraag de naam en de diepgang van het schip.
  2. Kade 1 is 12,5 meter diep: controleer dat met ControleerDiepgang zonder kadediepte. Is het schip te diep, controleer dan of het in het Deurganckdok past, dat 14 meter diep is. Roep ControleerDiepgang daarvoor op met een named argument voor de kadediepte.
  3. Past het schip nergens, toon dan een alarm en stop het programma.
  4. Vraag het type lading. Voor containers vraag je het aantal containers (een int), voor bulk het tonnage (een double). De juiste versie van BerekenHavengeld wordt dan vanzelf gekozen.
  5. 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 BerekenHavengeld er draait, beslist het type van wat je meegeeft. Lees je het aantal containers per ongeluk in als double, 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; in Main stopt het programma als het schip nergens past. Na die else hoeft de rest dus niet in een extra if. Zie return.
  • De standaardwaarde van kadeDiepte wordt 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.