• Ook dit hoofdstuk heeft meer oefeningen dan je kan afwerken. Kies zelf, en focus op het leren werken met methoden. Tip van een lector: als een boek veel oefeningen over één onderwerp heeft, is dat onderwerp waarschijnlijk belangrijk.
  • Let op De naam van een methode zegt wat ze doet. ReadLine en WriteLine horen enkel in een methode die Toon... of Vraag... heet. Alle andere methoden krijgen hun gegevens binnen via parameters (in plaats van ReadLine) en geven hun resultaat terug met return (in plaats van WriteLine).
  • Schrijf elke methode static, in class Program, naast Main en nooit erin: een methode in een methode kost 3 punten.
  • Test elke methode in Main door ze op te roepen. Een methode die nooit opgeroepen wordt, doet niets.
  • In de voorbeelduitvoer begint gebruikersinvoer met >.

Stel jezelf voor

Je eerste eigen methode: een voorstelling op het scherm, in twee delen.

Deel 1. Schrijf een methode ToonIntro die jezelf voorstelt op het scherm: “Ik ben Tim Dams, ik ben 18 jaar oud en woon in de Lambrisseringsstraat 666.” Die gegevens mogen gewoon in de methode staan. In Main roep je ze zo op:

ToonIntro();
Tip

Deze methode toont enkel iets op het scherm en geeft niets terug. Haar returntype is dus void.

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.

Deel 2. Pas ToonIntro aan zodat je de naam, de leeftijd en het adres als parameters meegeeft:

ToonIntro("Jos", 34, "Trammezantlei 21");
Ik ben Jos, ik ben 34 jaar oud en woon in de Trammezantlei 21.

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.

  • De methode van deel 1 doet altijd hetzelfde. Die van deel 2 kan je voor iedereen gebruiken: wat verschilt, geef je mee als parameter.
  • Binnen de methode gedragen naam, leeftijd en adres zich als gewone variabelen. Ze krijgen hun waarde bij de aanroep, in de volgorde van de signatuur.

Opwarmers (Essential)

Schrijf onderstaande methoden en test ze in Main: roep elke methode op met een paar waarden en toon het resultaat. Enkel ToonOnevenNummers toont zelf iets, want enkel zij heet Toon....

  • static int Kwadraat(int getal) geeft het kwadraat van getal terug.
  • static double BerekenStraal(double diameter) geeft de straal terug van een cirkel met die diameter.
  • static double BerekenOmtrek(double diameter) geeft de omtrek terug van een cirkel met die diameter.
  • static double BerekenOppervlakte(double diameter) geeft de oppervlakte terug van een cirkel met die diameter.
  • static int Grootste(int getal1, int getal2) geeft het grootste van de twee getallen terug.
  • static bool IsEven(int getal) geeft true terug als getal even is, en anders false.
  • static void ToonOnevenNummers(int tot) toont alle oneven getallen van 1 tot en met tot.
Tip

Voor de omtrek (2πr) en de oppervlakte (πr²) heb je de straal nodig. Die berekenen doe je al in BerekenStraal: laat de twee andere methoden die gewoon oproepen. Zie Methoden combineren.

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.

Grootste methode

Een methode die het grootste van drie getallen teruggeeft, in twee delen.

Deel 1. Schrijf een methode static int GrootsteVanDrie(int getal1, int getal2, int getal3) die het grootste van de drie getallen teruggeeft. Test ook met gelijke getallen, zoals 5, 9 en 9.

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.

Deel 2. Schrijf GrootsteVanDrie opnieuw, maar nu in één lijn, met de methode Grootste voor twee getallen uit de Opwarmers.

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.

Rekenmachine (Essential)

Een rekenmachine in drie delen: eerst de rekenmethoden, dan een menu, dan een geheugen.

Deel 1. Schrijf de methoden TelOp, TrekAf, Vermenigvuldig en Deel. Ze krijgen elk twee doubles mee en geven het resultaat van de bewerking terug. Test ze in Main.

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.

Deel 2. Maak er een rekenmachine van. Een menu vraagt welke bewerking de gebruiker wil (+, -, * of /), daarna twee getallen, en toont het resultaat met je methoden. Dat herhaalt zich tot de gebruiker q kiest. Delen door nul kan niet: toon dan een melding.

Kies een bewerking (+, -, *, / of q om te stoppen):
>/
Eerste getal:
>7
Tweede getal:
>2
7 / 2 = 3,5
Kies een bewerking (+, -, *, / of q om te stoppen):
>q

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.

Deel 3. Een echte zakrekenmachine heeft een geheugen. Het geheugen start op 0. De gebruiker kiest telkens een bewerking en typt één getal, en de bewerking gebeurt op het geheugen. Met c zet je het geheugen terug op 0.

Geheugen: 0
Kies een bewerking (+, -, *, /, c om te wissen of q om te stoppen):
>+
Getal:
>5
Geheugen: 5
Kies een bewerking (+, -, *, /, c om te wissen of q om te stoppen):
>*
Getal:
>3
Geheugen: 15
Kies een bewerking (+, -, *, /, c om te wissen of q om te stoppen):
>q

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.

Methodenpuzzel

Deze lijnen horen bij een programma met een methode die een gemiddelde berekent, en een Main die ze gebruikt. Ze zijn door elkaar geraakt, en de accolades zijn weg. Er zijn ook twee lijnen bij geslopen die er niet in thuishoren.

double resultaat = BerekenGemiddelde(som, aantal);
static void Main(string[] args)
return gemiddelde;
int aantal = 4;
som = int.Parse(Console.ReadLine());
static double BerekenGemiddelde(int som, int aantal)
Console.WriteLine($"Het gemiddelde is {resultaat}");
double gemiddelde = (double)som / aantal;
static void BerekenGemiddelde(int som, int aantal)
int som = 17;

Zet de lijnen in de juiste volgorde, met accolades erbij, zodat het programma Het gemiddelde is 4,25 toont. Welke twee lijnen zijn de indringers, en waarom? Doe het eerst op papier en test daarna.

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 (Essential)

Voer onderstaand programma nog niet uit. Schrijf eerst op papier exact op wat er op het scherm zal verschijnen, lijn per lijn.

static void SchrijfA()
{
    Console.Write("A");
}

static void SchrijfB()
{
    Console.Write("B");
    SchrijfA();
}

static void ZetDubbel(int getal)
{
    getal = getal * 2;
    Console.WriteLine($"In de methode: {getal}");
}

static int Test(int x)
{
    if (x > 5)
    {
        return 1;
    }
    Console.WriteLine("Voorbij de if");
    return 2;
}

static int Kwadraat(int x)
{
    return x * x;
}

static void Main(string[] args)
{
    SchrijfB();
    SchrijfA();
    SchrijfB();
    Console.WriteLine();

    int getal = 3;
    ZetDubbel(getal);
    Console.WriteLine($"In Main: {getal}");

    Console.WriteLine(Test(8));
    Console.WriteLine(Test(2));

    Kwadraat(4);
    Console.WriteLine(Kwadraat(getal));
}

Voer het programma daarna uit en vergelijk. Klopt een lijn niet? Zet een breakpoint op de eerste lijn van Main en stap door het programma met Step Into (F11) in plaats van Step Over. Zo spring je mee in elke methode, en zie je in Locals welke waarde de parameters krijgen.

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.

Stevens methoden (Essential)

Stagiair Steven plakte een paar methoden in zijn project zonder ze na te kijken. Een A.I. had ze geschreven.

Deel 1. Drie van deze vier stukjes compileren niet. Het vierde compileert wel, maar kost punten op een vaardigheidsproef. Welk is welk? Zoek eerst op papier wat er mis is, en plak ze daarna één voor één in een nieuw project om de foutmeldingen te lezen.

a.

static string Beoordeel(int punten)
{
    if (punten >= 10)
    {
        return "geslaagd";
    }
}

b.

static void ToonBtw(double bedrag)
{
    Console.WriteLine($"De btw is {bedrag * 0.21} euro.");
}

static void Main(string[] args)
{
    double btw = ToonBtw(100);
}

c.

int Verdubbel(int getal)
{
    return getal * 2;
}

static void Main(string[] args)
{
    Console.WriteLine(Verdubbel(21));
}

d.

static void Main(string[] args)
{
    ToonWelkom();

    static void ToonWelkom()
    {
        Console.WriteLine("Welkom!");
    }
}

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.

Deel 2. Onderstaand programma compileert en draait, maar het doet niet wat Steven wil. Kwadraat moet het kwadraat van 5 berekenen, en de klant moet 10% korting krijgen op 80 euro.

static int Kwadraat(int getal)
{
    getal = int.Parse(Console.ReadLine());
    return getal * getal;
}

static double BerekenKorting(double bedrag)
{
    Console.WriteLine($"Je krijgt {bedrag * 0.1} euro korting.");
    return 0;
}

static void Main(string[] args)
{
    Console.WriteLine($"5 in het kwadraat is {Kwadraat(5)}");
    double bedrag = 80;
    double teBetalen = bedrag - BerekenKorting(bedrag);
    Console.WriteLine($"Je betaalt {teBetalen} euro.");
}

Voer het uit. Wat gebeurt er, en wat moet Steven aan de twee methoden veranderen?

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.

  • Tonen en teruggeven zijn twee verschillende dingen. Wat op het scherm staat, kan de rest van je programma niet gebruiken. Wat je teruggeeft wel.
  • Wat een methode nodig heeft, komt binnen als parameter. Een ReadLine in een methode die niet Vraag... heet, is bijna altijd fout.
  • Lees de foutmelding. not all code paths return a value en Cannot implicitly convert type 'void' ga je nog vaak zien.

Vraagmethoden (Essential)

In Herbruikbare gebruikersinvoer vragen zag je VraagInt. Methoden die Vraag... heten, mogen WriteLine en ReadLine gebruiken: dat is net hun taak.

Deel 1. Schrijf static int VraagInt(string vraag) en static string VraagTekst(string vraag). Ze tonen de vraag, lezen het antwoord in en geven het terug. Test ze in Main.

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.

Deel 2. Schrijf een methode VraagIntTussen(string vraag, int min, int max) die een int teruggeeft. Ze blijft vragen tot de gebruiker een getal van min tot en met max typt, en geeft dat getal terug. Gebruik er VraagInt in.

Hoe oud ben je? (0 tot en met 120)
>150
Dat getal ligt niet tussen 0 en 120.
Hoe oud ben je? (0 tot en met 120)
>30

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.

Paswoord generator

Schrijf een methode static string GenereerPaswoord(int lengte) die een willekeurig paswoord van de gevraagde lengte teruggeeft. Het paswoord bestaat uit kleine letters, hoofdletters en cijfers door elkaar. Test ze in Main met een paar lengtes.

Tip

Een char is intern een getal. (char)rng.Next('a', 'z' + 1) geeft dus een willekeurige kleine letter.

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.

Netflix (Essential)

Je bent aangenomen als backend developer bij Netflix. Je eerste taak: enkele hulpmethoden schrijven voor een console-applicatie. Maak een programma met onderstaande methoden, en test ze in Main met invoer van de gebruiker.

ToonWelkomstBericht

  • Parameter: de naam van de gebruiker (string).
  • Toont Welkom terug, [naam]! Tijd om te bingen.
  • Returntype: void.

BerekenKijktijd

  • Parameters: het aantal afleveringen (int) en de minuten per aflevering (int).
  • Geeft het totaal aantal minuten terug (int).

MagKijken

  • Parameters: de leeftijd van de gebruiker (int) en de minimumleeftijd van de serie (int).
  • Geeft true terug als de gebruiker oud genoeg is, anders false.

GenereerTitel

  • Parameters: de naam van de serie (string), het seizoen (int) en de aflevering (int).
  • Geeft een string terug in het formaat [SerieNaam] - S[seizoen]E[aflevering].

Het scenario in Main:

  1. Vraag de naam van de gebruiker en roep ToonWelkomstBericht op.
  2. Vraag de leeftijd van de gebruiker.
  3. Vraag de naam van de serie en haar minimumleeftijd.
  4. Gebruik MagKijken. Is de gebruiker niet oud genoeg, toon dan Helaas, je bent te jong voor deze serie. en stop het programma. Anders toon je Veel kijkplezier!
  5. Vraag hoeveel afleveringen de gebruiker wil kijken, en hoeveel minuten een aflevering duurt.
  6. Gebruik BerekenKijktijd en toon Totale kijktijd: X minuten.
  7. Vraag het seizoen en de aflevering.
  8. Gebruik GenereerTitel en toon Je start met: [titel].
Voer je naam in:
>Jan
Welkom terug, Jan! Tijd om te bingen.
Voer je leeftijd in:
>18
Naam van de serie:
>Squid Game
Minimumleeftijd van de serie:
>16
Veel kijkplezier!
Hoeveel afleveringen wil je kijken?
>3
Hoeveel minuten duurt één aflevering?
>45
Totale kijktijd: 135 minuten
Seizoen:
>1
Aflevering:
>1
Je start met: Squid Game - S1E1

Ander voorbeeld:

Voer je naam in:
>Emma
Welkom terug, Emma! Tijd om te bingen.
Voer je leeftijd in:
>13
Naam van de serie:
>Squid Game
Minimumleeftijd van de serie:
>16
Helaas, je bent te jong voor deze serie.
Tip

Een programma stoppen midden in Main kan met return;. Hoe dat werkt in een void-methode, lees je in return.

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.

Deel 2. Main telt veel paren van WriteLine en ReadLine. Herschrijf Main met je VraagTekst en VraagInt uit Vraagmethoden. De uitvoer blijft dezelfde.

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.

  • Enkel ToonWelkomstBericht toont iets. De drie andere geven hun resultaat terug, en Main beslist wat ermee gebeurt.
  • return leeftijdGebruiker >= minimumLeeftijdSerie; geeft de bool meteen terug. Een if met return true; en return false; doet hetzelfde, in vijf lijnen meer.
  • return; in Main stopt het programma. Na die if hoef je dus geen else meer te schrijven: wie te jong is, komt er nooit.

Armstrong (PRO)

Een getal is een Armstrong-nummer als het de som is van zijn eigen cijfers, elk tot de macht verheven van het aantal cijfers. 153 is er een, want 153 = 1³ + 5³ + 3³ = 1 + 125 + 27. In Armstrong nummer van hoofdstuk 6 schreef je al de code die dat test.

Knip die code nu op in methoden:

  • static int TelCijfers(int getal) geeft het aantal cijfers van getal terug.
  • static bool IsArmstrong(int getal) geeft true terug als getal een Armstrong-nummer is. Ze gebruikt TelCijfers.
  • static void ToonArmstrongNummers(int tot) toont alle Armstrong-nummers van 1 tot en met tot. Ze gebruikt IsArmstrong.
Armstrong-nummers tot en met 10000:
1 2 3 4 5 6 7 8 9 153 370 371 407 1634 8208 9474

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.

A.I. assisted oefeningen generator

Dit is geen oefening, maar een manier om zelf extra oefeningen te maken.

Gebruik volgende prompt in ChatGPT, Copilot Chat of Claude om een oefening over methoden te laten maken. Vervang XXXX door een onderwerp dat je interesseert (bijvoorbeeld “Counter-Strike”, “F1 racing” of “je favoriete voetbalclub”).

Je bent een lector van een hogeschool die studenten helpt met programmeren. Je bent heel goed in interessante C#-opgaves bedenken die studenten motiveren om te blijven programmeren.

Verzin een C#-oefening voor mij die me doet oefenen op methoden. Een methode geeft maximum 1 waarde terug. Gebruik dus geen tuples.

Volgende zaken mogen in de oefening voorkomen: variabelen, if else, switch, enum, expressies, de Math-bibliotheek en loops. De nadruk ligt op methoden: parameters, returntypes, void, en methoden die elkaar oproepen.

Volgende zaken mogen niet voorkomen: arrays, lists, LINQ, ref, out, TryParse, try en catch, en objectgeoriënteerd programmeren. Alle methoden zijn static en staan naast Main in class Program. Er zijn geen variabelen buiten Main.

Enkel methoden die Toon... of Vraag... heten, mogen Console.WriteLine of Console.ReadLine gebruiken.

Laat de oefening gaan over XXXX.
Toon geen voorbeeldcode of oplossing.
Toon wel voorbeelduitvoer.
Leg expliciet uit welke methoden ik moet schrijven en hoe ze werken.
Stel ook 3 mogelijke uitbreidingen voor.
Waarschuwing

Een A.I. maakt soms toch een oefening met iets wat je nog niet kent, ondanks de prompt. Vraagt de oefening bijvoorbeeld arrays, vereenvoudig ze dan zelf, of vraag de A.I. om dat stuk eruit te halen of uit te leggen.