Zie scherp scherper oefeningen

Deze oefeningen horen bij het handboek Zie Scherp Scherper (meer info op ziescherp.be. Dit boek wordt gebruikt als handboek binnen de opleidingen professionele bachelor toegepaste informatica en bachelor elektronica-ict van de AP Hogeschool, alsook bij tal van andere hogescholen en middelbare scholen.

Concreet is dit het handboek voor de eerste 2 semesters omtrent 'leren programmeren met C#':

  • Deel 1: Programming Principles, eerste semester
  • Deel 2: Object Oriented Programming, tweede semester

Indien bepaalde hoofdstukken of onderdelen niet duidelijk zijn of fouten bevatten, aarzel dan niet om me te contacteren. Normaal gezien zijn alle tekst en afbeeldingen de mijne, tenzij ik anders vermeld. Uiteraard maak ik soms fouten, als je dus een niet geattribueerde tekst of afbeelding ontdekt, aarzel dan niet om me te contacteren.

Alle feedback is zéér welkom.

Veel leer-en leesplezier,

Tim Dams

Logo ikke

PS: Besef dat goed kunnen programmeren enkel kan geleerd worden indien je ook effectief veel programmeert. Je kan ook niet leren fietsen door enkel een handboek "Fietsen met Merckx" te lezen, je zal op de fiets moeten springen! En vallen...véél vallen.

Licensed under Creative Commmons Attribution-NonCommercial 4.0 International (CC BY-NC 4.0)

LiceniconLiceniconLicenicon

Licensed under CC-BY-NC 4.0 as shown here.

This is a human-readable summary of (and not a substitute for) the license.

You are free to

Share : copy and redistribute the material in any medium or format

Adapt : remix, transform, and build upon the material

The licensor cannot revoke these freedoms as long as you follow the license terms.

Under the following terms

Attribution : You must give appropriate credit, provide a link to the license, and indicate if changes were made. You may do so in any reasonable manner, but not in any way that suggests the licensor endorses you or your use.
NonCommercial : You may not use the material for commercial purposes.

No additional restrictions : You may not apply legal terms or technological measures that legally restrict others from doing anything the license permits.

Hoofdstuk 1

Vergeet IntelliCode niet uit te schakelen (hoe?)!

Kijk pas naar de oplossing als je 100% klaar bent. En zelfs dan, wees erg kritisch over jouw oplossing tegenover de modeloplossing. Vraag hulp aan de lector bij de minste twijfel die je hebt wanneer je jouw oplossing vergelijkt me de modeloplossing!

Maak telkens een volledig nieuwe solution aan per oefening (enkel de oefening "Stad kleuren" doe je in de bestaande "Wie ben ik" oplossing). Zo kan je later makkelijk terugkeren naar een specifieke oefening.

Wie ben ik (Essential)

Schrijf een applicatie dat onder elkaar volgende informatie op het scherm toont gebruik makende van WriteLine():

  • Je voornaam en achternaam.
  • De stad waar je woont.
  • Je leeftijd.

Voorbeeld van de output:

Vincent Van Camp
Boom
38

Visitekaart (Essential)

Schrijf een programma dat aan de gebruiker de volgende zaken vraagt:

  • Voornaam
  • Achternaam
  • Adres
  • Hobby

Vervolgens toon je de vragen gevolgd door de antwoorden, met de naam als 1 antwoord (voornaam en achternaam). Je zal hiervoor de Write-methode en WriteLine-methode moeten gebruiken.

Bijvoorbeeld (tekst die start met liggende streepjes is input van de gebruiker):

Wat is je voornaam?
_Tom
Wat is je achternaam?
_Peeters
Waar woon je?
_Parel van de Kempen
Wat is je hobby?
_fietsen


Goed. Hier volgt je visitekaartje"

Naam: Tom Peeters
Adres: Parel van de Kempen
Hobby: fietsen

Stad kleuren (Essential)

Open terug je "Wie ben ik"-solution. Pas de code aan zodat je stad in rode letters met witte achtergrond wordt getoond. Vergeet niet je kleur terug te resetten naar de standaardkleuren na het tonen van de stad.

Voorbeeld van de output (gebruik je eigen gegevens uiteraard):

Rommel zin (Essential) (Dodona beschikbaar)

Schrijf een applicatie met behulp van ReadLine() en WriteLine()-methoden waarbij de computer aan de gebruiker om zijn of haar favoriete kleur, eten, auto en boek vraagt. Het programma gaat echter de gebruiker plagen en de ingelezen informatie op de verkeerde manier aan de gebruiker tonen. Het programma zal de antwoorden namelijk door elkaar halen waardoor de computer vervolgens toont:

Je favoriete kleur is [eten]. Je eet graag [auto]. Je lievelingsfilm is [boek] en je favoriete boek is [kleur].

Waarbij tussen de rechte haakjes steeds de invoer komt die de gebruiker eerder opgaf voor de bijhorende vraag.

Voorbeeld (tekst die start met liggende streepjes is input van de gebruiker):

Geef je favoriete kleur:
_rood
Geef je favoriete eten:
_lasagne
Geef je favoriete auto:
_mazda
Geef je favoriete boek:
_Het oneindige verhaal

Je favoriete kleur is lasagne. Je eet graag mazda. Je lievelingsfilm is Het oneindige verhaal en je favoriete boek is rood.

Woordenslinger (Essential)

Maak een applicatie die volgende woorden na elkaar in twee zinnen toont, waarbij de letters van het woord de kleur van het woord zelf hebben:

blauwgroenrood
geelroodblauw

De output moet er als volgt uitzien:

Tekening

Kan je volgende afbeeldingen namaken in de console?

Volgende tekening toont een schematische weergave:

Je kan een gekleurd vakje 'tekenen' door de BackGroundColor van de console in te stellen en dan een spatie naar het scherm te sturen.

Muziek (Extra'tjes)

Extra'tjes oefeningen gebruiken zaken die niet bij de leerstof horen, maar die eenvoudig genoeg zijn om eens te bekijken. Meestal zijn ze ook nog eens leuk om te maken, wat mooi is meegenomen.

Met de Console.Beep() methode kan je muziek maken. Volgende voorbeeld toont bijvoorbeeld hoe je do-re-mi-fa-sol-la-si-do afspeelt:

Console.Beep(264, 1000);
Console.Beep(297, 1000);
Console.Beep(330, 1000);
Console.Beep(352, 1000);
Console.Beep(396, 1000);
Console.Beep(440, 1000);
Console.Beep(495, 1000);
Console.Beep(528, 1000);

Je geeft aan Beep 2 getallen mee (argumenten):

  1. De frequentie van de toon die moet afgespeeld worden. Bijvoorbeeld 264 (in Hertz, hz).
  2. De duur dat de toon moet afgespeeld worden in milliseconden. Als je dus 1000 meegeeft zal de toon gedurende 1000 ms, oftewel 1 seconde, afgespeeld worden.

Open 1 van de eerder gemaakte oefeningen en zorg ervoor dat bij het opstarten ervan er een kort, door jezelf gecomponeerd, introliedje wordt afgespeeld.

Hoofdstuk 2

Het is aanbevolen dat je vanaf nu per hoofdstuk een nieuwe solution aanmaakt op je computer. Per oefening maak je dan best een nieuw project aan dat je in de solution zet. Geef ieder project een duidelijke naam (bv EuroNaarDollar) zodat je later vlot je oefeningen kan terugvinden. Denk er aan dat je je projecten best enkel met cijfers en letters benoemd (dus beter EuroNaarDollar dan Euro-Dollar).

Meer uitleg over Projecten en Solutions en hoe je bovenstaande doet kan je hier terugvinden.

Het is een goede gewoonte om ogenblikkelijk de juiste coding guidelines te volgen. Deze staan in het handboek hier opgelijst.

We vragen in deze oefeningen nog geen input aan de gebruiker. Alle getallen worden hard gecodeerd in de variabelen. In een volgend hoofdstuk gaan we leren hoe we input van de gebruiker kunnen vragen.

Gemiddelde (Essential)

Maak 3 variabelen aan van het type int genaamd september, oktober en november. Plaats in elke variabele de hoeveelheid uren slaap je die in die maand verwacht te doen. Bereken nu het gemiddelde van 3 maanden en toon het resultaat op het scherm (kies uiteraard 3 verschillende hoeveelheden slaap).

Opgelet: het resultaat moet als een kommagetal worden getoond!

Euro naar dollar (Essential)

Ontwerp een toepassing waarmee je een bedrag (dat je hardcode in een variabele), inclusief komma-getallen in euro kan omrekenen naar dollar. Gebruik hierbij de huidige wisselkoers. Je hoeft niet af te ronden. Het resultaat op het scherm wordt als volgt weergegeven: [x] EUR is gelijk aan [y] USD.

Dit is de startcode van je applicatie:

double bedragInEuro = 78.65;

Uitvoer:

78,65 EUR is gelijk aan 81,0095 USD.

Begrijp je dat al deze oefeningen eigenlijk altijd dezelfde 3 fases hebben?

  1. Data invoer: variabelen aanmaken en waarden geven.
  2. Data verwerken: berekeningen doen met de ingevoerde data.
  3. Data uitvoer: resultaten op het scherm tonen

Als je je applicaties zo opbouwt dan zal je snel ontdekken dat al deze oefeningen eigenlijk in essentie hetzelfde zijn.

Kill/Death-ratio (Essential) (Dodona beschikbaar)

De k/d ratio is de verhouding tussen het aantal kills dat je in een spel hebt gehaald ten opzichte van het aantal keer dat je zelf bent gestorven, deads. Wanneer deze verhouding dus groter is dan 1 heb je vaker iemand gedood dan dat je zelf gestorven bent. Onder de 1 is dit net omgekeerd...en ben je dus niet zo goed in het spel dat je aan het spelen bent.

Maak twee variabelen double kills en double deaths aan. Wijs er jouw typische gamescores aan toe die je haalt in een spel naar keuze. Bereken en toon vervolgens je kill/death-ratio.

Uitvoer (indien kill=44 is en deaths=9)

Je k/d-ratio is 4,888888888888889

Begrijp je waarom we best een van beide variabelen in double zetten? Lees de waarschuwing van de voorman bij Expressies zeker nog eens na... Of test eens wat er gebeurt indien je met int zou werken.

Merk op dat het vreemd is dat je een niet-geheel aantal kills of deaths kunt halen als je met double werkt. Dat kan natuurlijk niet. Je kunt niet 2,5 keer dood zijn gegaan in een spel. In hoofdstuk 4 gaan we dit oplossen (en er dus voor zorgen dat kills en deaths wel als int kan blijven staan, maar we toch een double als resultaat voor de kdratio krijgen)

BTW (Essential)

Schrijf een programma waarin je het BTW-percentage 21% als een constante definieert door het keyword const voor de variabele te zetten. Vervolgens toon je een prijs naar keuze, met en zonder btw op het scherm.

Dit is je startcode:

double prijs = 20;
const double BTW = 21.0;

Bereken nu de prijs met BTW en toon het resultaat op het scherm.

Voorbeeld output:

Prijs 20 euro zonder btw. Met BTW: 24.2 euro.

Je kan de BTW op verschillende manieren berekenen. Kies zelf hoe je dit doet? Je mag dus gerust ook werken met const double BTW = 1.21; of const double BTW = 0.21; , afhankelijk van welke berekenwijze je prefereert.

Gewicht in space (Essential)

Je massa is overal dezelfde. Je gewicht daarentegen is afhankelijk van de zwaartekracht van de plek waar je bent. Zo is je gewicht veel groter op Jupiter dan op Mars (uitgedrukt in Newton).

Maak een variabele double gewichtOpAarde aan. Wijs een gewicht toe (bv. het jouwe). Schrijf nu een programma dat onder elkaar jouw gewicht op verschillende planeten toont.

Hier de omzettingstabel (je gewicht op Mercurius is dus je gewicht op aarde x 0.38):

  • Mercurius: 0.38
  • Venus: 0.91
  • Aarde: 1.00
  • Mars: 0.38
  • Jupiter: 2.34
  • Saturnus: 1.06
  • Uranus: 0.92
  • Neptunus: 1.19
  • Pluto: 0.06 (we laten de discussie achterwege of pluto wel of niet een planeet is)

De output zijn verschillende lijnen onder elkaar in de vorm van:

Je weegt op [planeet] [gewichtopdieplaneet] N.

Plaats de zin met Jupiter in het rood, daar je daar het zwaarst weegt en die van pluto in het groen.

Voorbeeld output:

Je weegt op Mercurius 30,627999999999997 N.
Je weegt op Venus 73,346 N.
en zo verder...

Tafel en Console.Clear() (Essential)

Met het statement Console.Clear(); kan je de console - je raadt het nooit - leegmaken. Test deze code in het volgende programma:

Schrijf een programma dat de tafels van vermenigvuldigen geeft van 411 (dus 1x411= 411, 2x411= 822 tot en met 10x411= 4110). Toon telkens 1 zin en wacht dan tot de gebruiker op enter duwt om de volgende vermenigvuldiging op een nieuw scherm te tonen. De output ziet er dus als volgt uit:

1 x 411 = 411
Druk op enter voor de volgende lijn.
[Scherm leeg gemaakt]
2 x 411 = 822
Druk op enter voor de volgende lijn.
[Scherm leeg gemaakt]
...

Plaats 411 en de teller (die van 1 tot en met 10 gaat) elk in een variabele aan de start van het programma en gebruik deze in je berekeningen verderop. Toon dat je code ook werkt door de inhoud van de variabele in een ander getal te veranderen zodat je van dat nieuwe getal nu de tafels van vermenigvuldiging krijgt. Door de waarde 411 bovenaan in een variabele te steken kan je heel snel je programma een andere tafel laten berekenen, je hoeft dan gewoon de waarde van die variabele aan te passen.

Gebruik teller++ om de teller-variabele telkens te verhogen.

Je kan wachten tot de gebruiker op enter duwt door gewoon een lege Console.ReadLine te doen, zoals volgende voorbeeld toont:

Console.WriteLine("Eerste beeld");
Console.WriteLine("Druk enter om voort te gaan.");
Console.ReadLine();
Console.Clear();
Console.WriteLine("Tweede beeld");

Merk op dat Console.Clear() niet werkt zoals verwacht op Mac.

Simple maths

Schrijf een programma dat de uitkomst van volgende resultaten op het scherm toont:

-1 + 4 * 6
( 35 + 5 ) % 7
14 + -4 * 6 / 11
2 + 15 / 6 * 1 - 7 % 2

Bewaar het resultaat van iedere opgave in een aparte variabele. Reken op papier of met je calculator na wat het resultaat moet zijn. Toon vervolgens de uitkomst (m.b.v. WriteLine) telkens op het scherm en vergelijk die met je eigen berekening. Begrijp je waar de verschillen zitten (als die er zijn)?! Waarom moet je bij de derde en vierde expressie met double werken en niet bij de eerste 2?.

De % hier is de modulo-operator.

Je toont het resultaat als volgt:

-1 + 4 * 6 geeft 23
( 35 + 5 ) % 7 geeft 5 
14 + -4 * 6 / 11 geeft 11,818181818181818
2 + 15 / 6 * 1 - 7 % 2 geeft 3,5

Tekstmaker (PRO)

PRO oefeningen bevatten leerstof die mogelijk niet in deze cursus wordt behandeld, of die in een later hoofdstuk pas aan bod zal komen.

Met de methode System.IO.File.WriteAllText(); kan je een string naar een bestand wegschrijven.

Je geeft hierbij 2 variabelen mee: de bestandsnaam, en de inhoud van het bestand.

Volgende voorbeeld schrijft bijvoorbeeld de zin "Ik ben tim" weg naar een bestand dat zal aangemaakt worden genaamd "me.txt":

System.IO.File.WriteAllText("me.txt", "Ik ben tim");

Schrijf een programma dat aan de gebruiker de naam van het bestand vraagt, gevolgd door wat er in het bestand moet geschreven worden. Vervolgens maak je dit bestand aan en plaats je die inhoud er in.

Als je enkel een bestandsnaam meegeeft (en geen volledige folderpath) dan wordt het bestand geplaatst op de plek waar het programma wordt uitgevoerd.

Standaard staat je gecompileerde programma in de bin\debug folder van je project.

Als je dus een solution hebt aangemaakt genaamd "Oefening" in de folder "C:\Temp" dan zal het bestand zich in de volgende folder bevinden "C:\Temp\Oefening\Oefening\bin\debug".

Je kan ook snel naar deze folder gaan door in de solution explorer aan de rechterzijde in VS te rechterklikken op je project en dan te kiezen voor: Open folder in file explorer.

Hoofdstuk 3

Vanaf dit hoofdstuk wordt verwacht dat je steeds string interpolatie gebruikt om strings samen te voegen, en dus niet meer met + werkt!

Mad Libs (Essential)

MadLibs is een populair woordspelletje waarbij de gebruiker een aantal verschillende woorden moet opgeven. Vervolgens worden deze woorden in een verhaal geplaatst dat zo plots erg grappig kan worden.

Bron afbeelding: Swanton Public Library

In deze oefening vraag je aan de gebruiker volgende zaken:

  • Een naam (bv. Jos)
  • Een zelfstandig naamwoord (bv. bal)
  • Een adjectief (bv. groene)
  • Een werkwoord (bv. springen)

Vervolgens worden deze woorden in volgende zin geplaatst en aan de gebruiker getoond (gebruik hier string interpolation voor).

Op een dag ging [naam] naar de AP Hogeschool. Hij zag daar een [adjectief] [zelfstandig naamwoord] en vond dat zo grappig dat hij begon te [werkwoord].

Voorbeeld werking:

Geef een naam:
_Jos
Geef een zelfstandig naamwoord:
_bal
Geef een adjectief:
_groene
Geef een werkwoord:
_springen

Hier komt het!

Op een dag ging Jos naar de AP Hogeschool. Hij zag daar een groene bal en vond dat zo grappig dat hij begon te springen.

Dertien in een dozijn (Essential)

Een klassieker (youtube-filmpje).

Schrijf een applicatie die berekent hoeveel dozen van 8 eieren je volledig kan vullen en hoeveel eieren je dan nog zal over hebben. Gebruik ook nu string interpolation in de finale uitvoer.

Bovenaan je programma schrijf je:

const int doosGrootte = 8;
int aantalEieren = 124;

Met deze startinvoer (test ook met andere getallen!) moet je volgende uitvoer krijgen.

124 eieren passen in 15 dozen van doosgrootte:8. Daarbij zal je nog 4 eieren over hebben.

Test of je applicatie ook werkt met andere aantal eieren én doosgrootte.

In deze oefening moet je gebruik maken van je kennis van het vorige hoofdstuk, waaronder:

  • De modulo operator.
  • Datatypes en wat de impact ervan is op onder andere de deling (twee integers delen geeft...een integer!).

Escape conversatie (Essential)

Gegeven volgende code:

string personage1 = "Alice";
string personage2 = "Bob";

string dialoog = $"X";

Console.WriteLine(dialoog);

Zorg ervoor dat volgende dialoog op het scherm, met juiste formatering getoond wordt. Je mag enkel de tekst tussen de aanhalingstekens (in de plaats van X) van de variabele dialoog gebruiken (en zal dus escape characters nodig hebben.):

Alice: "Hoe gaat het met je?"
    Bob: "Goed, dank je! Hoe gaat het met jou?"
Alice: "Ook goed, bedankt dat je het vraagt."

Gebruik \t om de tekst van Bob te doen inspringen. Merk op dat de tabgrootte verschillend kan zijn (wat geen probleem is) dan wat je hier als voorbeeld ziet.

Systeem informatie (Essential)

Maak een applicatie die de belangrijkste computer-informatie (geheugen, etc) aan de gebruiker toont m.b.v. de Environment. Zoals je ziet wordt het geheugen in bytes teruggegeven. Zorg ervoor dat het geheugen steeds in mega of gigabytes op het scherm wordt getoond. Toon minstens volgende zaken:

  • ProcessorCount
  • WorkingSet (in MB en GB)
  • MachineName
  • UserName
  • is64OperatingSystem

Voorbeeld uitvoer:

Systeeminformatie voor admin op damsPowahPC:
---------------------------------------------------
    Aantal processors: 8
    64-bit besturingssysteem: True
    Huidige geheugengebruik: 23.00 MB (0.02 GB)
---------------------------------------------------

Gebruik string formatering (m.b.v. met F2) om de output tot 2 cijfers na de komma op het scherm te tonen.

Unicode Art

Genereer je naam in Unicode Art met een van de vele online generators. Toon deze art (m.b.v. WriteLine of Write) aan de start van een van je bestaande programma's, zodat nu je naam wordt getoond wanneer het programma start, gevolgd door de rest.

PRO-oefeningen

Systeem informatie Deel 2 (PRO)

Ook informatie over de harde schijven kan je verkrijgen (in bits). Dit vereist wel dat je bovenaan je programma volgende lijn bijschrijft: using System.IO.

Vervolgens kan je in je programma schrijven:

long cdriveinbytes = DriveInfo.GetDrives()[0].AvailableFreeSpace;  
long totalsize = DriveInfo.GetDrives()[0].TotalSize;  

De lijn met using is om aan te geven dat we iets uit de System.IO bibliotheek nodig hebben, namelijk DriveInfo. Schrijven we dat niet dan moeten we in onze code DriveInfo aanroepen met z'n volledige path: System.IO.DriveInfo....

De 0 tussen rechte haakjes is de index van welke schijf je informatie wenst. 0 is de eerste harde schijf, 1 de tweede, enzovoort.

Vraag aan de gebruiker het nummer van de harde schijf waar meer informatie over moet getoond worden.

Opgelet: sta toe dat de gebruiker 1 voor de eerste harde schijf mag gebruiken, 2 voor de tweede, enzovoort. Je zal dus in code nog manueel 1 moeten aftrekken van de invoer van de gebruiken. Bv:

int invoer=int.Parse(Console.ReadLine()) - 1; 
long totalsize = DriveInfo.GetDrives()[invoer].TotalSize;  

Shell-starter (PRO)

Je kan de output van een Process.Start() programma naar je console scherm sturen. Dit vereist wat meer code. Volgend voorbeeld zal de output van het commando ipconfig /all op het scherm tonen:

System.Diagnostics.Process process = new System.Diagnostics.Process();
process.StartInfo.FileName = "ipconfig";
process.StartInfo.Arguments = "/all"; 
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.RedirectStandardError = true;
process.Start(); //start process

// Read the output (or the error)
string output = process.StandardOutput.ReadToEnd(); //normal output
Console.WriteLine(output);
string err = process.StandardError.ReadToEnd(); //error output (if any)
Console.WriteLine(err);
//Continue
Console.WriteLine("Klaar");

Let er op dat dit voorbeeld niet perfect werkt met een shell-commando dat even duurt. Denk bijvoorbeeld aan ping. De output komt namelijk pas op het scherm als het commando is afgelopen. Test zelf maar eens!

Maak enkele kleine C# programma's die bepaalde shell-commando's zullen uitvoeren, eventueel na input van de gebruiker. Enkele nuttige shell-commando's in de netwerk-sfeer zijn bijvoorbeeld:

hostname
arp -a
getmac
nslookup google.com
netstat

Andere toffe commando's kunnen zijn:

chrome.exe ap.be
notepad mytest.txt

Of de naam van een bestand dat je wilt openen, maar dan met het hele path:

c:\Temp\mydocument.docx

Unicode Art en Colors (niet PRO, wel saai)

Gebruik je kennis van het verschil tussen Console.Write en Console.WriteLine, alsook de werking van kleuren in console-applicaties, om je Unicode-art naam van de eerdere oefening nu van kleur te voorzien. Zorg ervoor dat minstens 1 letter in een andere kleur is.

Dit is een redelijke lange oefening, doe deze best op het einde.

Deze oefening kan je op 2 manieren oplossen:

  1. Je gebruikt een combinatie van Write en Console.SetCursorPosition
  2. Je knipt je tekening op in stukken die je met verschillende Write en WriteLines op het scherm zet. Volgend voorbeeld toont bijvoorbeeld hoe je een vierkantje van sterretjes tekent waarbij het midden van het vierkant rood is:
Console.WriteLine("***");
Console.Write("*");
Console.ForegroundColor = ConsoleColor.Red;
Console.Write("*");
Console.ResetColor();
Console.WriteLine("*");
Console.WriteLine("***");

Hoofdstuk 4

Gebruik je kennis van debuggen om vanaf dit hoofstuk problemen op te lossen. Gebruik niet Console.WriteLine() om de waarde van een variabele te controleren at-runtime, maar gebruik daarentegen breakpoints!

Supercomputer (Dodona beschikbaar)

Vanaf dit punt zullen de meeste oefeningen iets "vragen" aan de gebruiker. Hiermee wordt bedoeld dat je de gebruikersinput via ReadLine moet inlezen en indien nodig moet converteren naar het gewenste type.

Vraag aan de gebruiker 3 kommagetallen. Bereken het gemiddelde van deze 3 getallen en toon dit als een kommagetal op het scherm

Voorbeeld:

Geef getal 1:
23,4
Geef getal 2:
34,6
Geef getal 3:
27,7
Het gemiddelde hiervan is: 28,566666666666666

Vierkant (Essential) (Dodona beschikbaar)

Schrijf een programma om de omtrek en de oppervlakte van een vierkant te bepalen. De zijde wordt ingelezen.

Voorbeeld:

Geef de zijde:
4,6
Omtrek is 18.4
Oppervlakte is 21,16

Balk (Dodona beschikbaar)

Bereken de oppervlakte en de inhoud van een balk . De gegevens (hoogte, breedte, lengte) worden ingelezen als gehele getallen. Zorg ervoor dat de uitvoer er als volgt uitziet:

Lengte?
_3
Breedte?
_5
Hoogte?
_4
Oppervlakte is 94
Inhoud is 60

Geometric fun (Dodona beschikbaar)

Vraag aan de gebruiker een hoek in graden. Zet deze om naar radialen , gebruik Math.PI voor Pi. Gebruik vervolgens de verschillende geometrische functies in de Math. bibliotheek om de sinus (.Sin), cosinus (.Cos) en tangens (.Tan) van de hoek aan de gebruiker te tonen

Denk eraan: de methoden die met hoeken werken, werken in radialen, daarom moeten we deze eerst omzetten. 1 rad = 180°/PI = 57.295779513°.

Je zal merken dat voor bepaalde hoeken (bijvoorbeeld 90 graden) je erg kleine of erg grote waarden krijgt, dat is normaal. De geometrische functie in de Math-bibliotheek berekenen de resultaten (en werken dus niet met een tabel) wat met eindige kommagetallen ervoor zorgt dat je soms in plaats van 1 of 0 iets erg kleins of groot krijgt.

Uitvoer:

Geef de hoek in graden:
[hoekInGraden]

Sinus van deze hoek is: [sinus]
Cosinus van deze hoek is: [cosinus]
Tangens van deze hoek is: [tangens]

BMI berekenaar (Essential) (Dodona beschikbaar)

Maak een programma dat aan de gebruiker z'n lengte (in cm) en gewicht (in kg) vraagt en vervolgens de berekende BMI (Body Mass Index) toont. Zoek zelf op hoe je het BMI berekent.

Gebruik Math.Round om de uitkomst tot maximum 2 cijfers na de komma te tonen.

Reken na met je rekenmachine of je uitkomst wel degelijk klopt!

Uitvoer:

Wat is uw lengte in cm?
[lengteInCm]

Wat is uw gewicht in kg?
[gewicht]

Een persoon met een lengte van [lengteInMeter] m en een gewicht van [gewicht] kg heeft een BMI van [bmi].

Op-de-poef (Essential)

Een vaste klant in je café bestelt altijd "op-de-poef". Dat wil zeggen dat hij niet onmiddellijk betaalt en dat z'n rekeningen worden neergeschreven. Ooit zal de klant dan gevraagd worden de hele som te betalen.

Schrijf een programma dat 5 keer na elkaar aan de barman vraagt om een bedrag in te voeren. Het ingevoerde bedrag wordt opgeteld bij wat er reeds op de rekening staat. Na 5 keer wordt de totale som getoond alsook hoeveel weken het duurt indien de klant wekelijks 10 euro afbetaalt.

Voorbeeldwerking:

Voer bedrag in?
_12
De poef staat op 12 euro.
Voer bedrag in?
_14
De poef staat op 26 euro.
Voer bedrag in?
_3
De poef staat op 29 euro.
Voer bedrag in?
_8
De poef staat op 37 euro.
Voer bedrag in?
_2
De poef staat op 39 euro.
*************************
Het totaal van  de poef is 39 en zal 4 weken duren om volledig afbetaald te worden.

Voor deze oefening heb je Math.Ceiling() nodig. Deze methode zal een getal altijd naar boven afronden.

Feestkassa (Essential)

De plaatselijke voetbalclub organiseert een mosselfestijn. Naast mosselen met frietjes (20 EUR) bieden ze voor de kinderen de mogelijkheid om een koninginnenhapje (10 EUR) te kiezen. Verder is er een ijsje als nagerecht voorzien (3 EUR). Om het gemakkelijk te maken kosten alle dranken 2 EUR.

Ontwerp een applicatie zodat de vrijwilliger aan de kassa alleen maar de juiste aantallen moet ingeven, lijn per lijn. (frietjes, koninginnenhapje, ijsje, drank) om de totaal te betalen prijs te berekenen.

Het resultaat wordt als volgt weergegeven: Het totaal te betalen bedrag is x EURO.

Voorbeeld:

Frietjes?
_3   
Tussenprijs= 60 euro
koninginnenhapje?
_5
Tussenprijs= 60 euro + 50 euro
Ijsjes?
_2
Tussenprijs= 60 euro + 50 euro + 6 euro
Dranken?
_5
Tussenprijs= 60 euro + 50 euro + 6 euro + 10 euro

Het totaal te betalen bedrag is 126 EURO.

Het Orakeltje van Delphi (Essential)

Gebruik een random generator om een orakel (een duur woord voor waarzegger) te maken, namelijk de kleine broer of zus van het Orakel van Delphi. Het programma zal aan de gebruiker vertellen hoe lang deze nog zal leven. Bijvoorbeeld: "Je zal nog 15 jaar leven.".

Het orakel zal enkel realistische getallen geven. M.a.w., getallen van 5 tot en met 125 jaar.

We gaan geregeld een oefening in een later hoofdstuk verder uitbreiden. Het orakeltje van Delphi is er zo eentje. Bewaar je oefeningen dus goed!

Schaak-ELO

Sinds 2022 en de sappige verhalen rond Magnus en Niemann is schaken erg populair aan het worden bij "de massa". Tijd om hier dus een oefening rond te maken.

"Een Elo-rating is een getalsmatige aanduiding van de sterkte van een speler. Het wordt het meest gebruikt in schaken, dammen en go, maar kan in principe gebruikt worden bij elke sport waarbij spelers 1 tegen 1 spelen." (bron Wikipedia). We gaan een applicatie schrijven (zie verderop voor de effectieve werking van de applicatie) die:

1° De verwachte score (Ea en Eb) berekend indien 2 spelers tegen elkaar gaan spelen, gebaseerd op hun ELO-rating (Ra en Rb) die je applicatie aan de gebruiker vraagt. 2° Berekenen van hun nieuwe Elo score (R'a en R'b) gebaseerd op de effectieve uitslag (Sa en Sb).

Volgende afbeelding (bron) toont beide stappen:

Opmerkingen bij deze formules:

  • De waarde K mag je standaard op 10 zetten (dit geeft aan dat er maximum 10 Elo-punten kunnen bijkomen of afgaan).
  • De eindscore (Sa en Sb) is als volgt: 1 voor een win, 0,5 voor gelijkstond, 0 voor verlies.
  • Gebruik voor ALLES doubles.
  • De finale, nieuwe, rating wordt afgerond tot 0 cijfers na de komma.

Getalvoorbeeld:

Indien speler A een rating van 1000 heeft en B 1100 dan zal speler A na een gewonnen wedstrijd een rating van 1006 krijgen en speler B 1094.

Applicatie

Schrijf een applicatie die eerst de Elo-ratings van beide spelers vraagt. Vervolgens toont de applicatie de nieuwe Elo-ratings voor de 3 scenario's:

  • Indien speler A wint.
  • Indien speler B wint.
  • Indien er een gelijke stand (draw) is.

K vragen

Breidt de applicatie uit en vraag de waarde K ook aan de gebruiker en gebruik deze in je berekeningen.

Hoofdstuk 5

Oefeningen worden sinds vorig hoofdstuk al eens wat langer. Het is belangrijk dat eerste de volledige opgave doorneemt voor je begint te programmeren. Deze gewoonte is essentieel indien je over enkele weken grote 2uur-durende projecten tot een goed einde wenst te brengen.

BMI met if (Essential)

Pas je BMI-programma uit het vorige hoofdstuk aan zodat je programma feedback geeft aan de gebruiker naargelang het berekende BMI.

De kleur tussen haakjes geeft aan in welke kleur je deze tekst zet:

  • Onder de 18,5 (rood): ondergewicht.
  • Van 18,5 tot 25, met 25 niet inbegrepen (groen): normaal gewicht.
  • Van 25 tot 30, met 30 niet inbegrepen (donkergeel): overgewicht. Je loopt niet echt een risico, maar je mag niet dikker worden.
  • Van 30 tot 40, met 40 niet inbegrepen (rood): Zwaarlijvigheid (obesitas). Verhoogde kans op allerlei aandoeningen zoals diabetes, hartaandoeningen en rugklachten. Je zou 5 tot 10 kg moeten vermageren.
  • 40 of meer (magenta): ernstige zwaarlijvigheid. Je moet dringend vermageren want je gezondheid is in gevaar (of je hebt je lengte of gewicht in verkeerde eenheid ingevoerd).

Schoenverkoper

a) Maak een oefening die aan de gebruiker vraagt hoeveel paar schoenen hij wenst te kopen. Ieder paar schoenen kost steeds 20 euro. Indien de gebruiker 10 paar of meer koopt kosten de eerste 9 paar nog steeds 20 euro, de overige kosten echter maar 10 euro. Toon aan de gebruiker de totale prijs.

Voorbeeld:

  • 8 schoenen kost 8x20 = 160 euro
  • 12 schoenen kost 9x20 + 3x10 = 210 euro

b) Voeg nu toe dat het programma eerst aan de kassier vraagt tot hoeveel schoenen de korting niet geldt.

Voorbeeld:

  • De kassierster voert 6 in. Dan kosten 8 schoenen: 6x20 + 2x10 = 140 euro.

Je hebt niet noodzakelijk een if voor deze oefening nodig. Indien je deze oefening zonder if kunt oplossen, dan krijg je als extra opgave bij

c) Zorg ervoor dat de kassier enkel een getal van 3 tot en met 10 kan invoeren bij de vraag tot hoeveel schoenen de korting niet geldt. Indien de kassier een getal buiten deze range invoert wordt de gewone korting toegekend, namelijk vanaf 10 of meer schoenen.

Ohm-berekenaar

Vraag aan de gebruiker wat hij wenst te berekenen: spanning, weerstand of stroomsterkte. Vraag vervolgens de 2 andere waarden (als dus de gebruiker "Spanning" kiest vraag je aan de gebruiker de stroomsterkte en de weerstand) en bereken m.b.v. de wet van Ohm de gewenste waarde.

BankRekening controle (Essential)

Schrijf een programma om het vroegere nationale bankrekeningnummer te controleren of het al dan niet een geldig nummer is (dus niet het IBAN nummer).

Het bankrekeningnummer wordt ingelezen als 3 gehele getallen van 3, 7 en 2 die de gebruiker apart invoert en die je in 3 aparte variabelen bewaard.

Een bankrekeningnummer is geldig als de rest van de deling van het getal, dat bestaat uit de eerste 10 cijfers, door 97, gelijk is aan het getal bestaande uit de laatste 2 cijfers.

  • Dit is een voorbeeld van een geldige rekenig: 000 1459325 57 , want 000 1459325 gedeeld door 97 geeft als rest 57.
  • Dit een ongeldige: 000 1359325 77, want 1359325 gedeeld door 97 geeft als rest 64 en niet 77

Kleurcode weerstand naar ohm

Vraag aan de gebruiker om de ringkleuren van de eerste 3 ringen in te voeren als tekst (bv groen). Toon vervolgens de waarde van deze weerstand. Als dus de gebruiker na elkaar invoert:

rood
paars
rood

Dan zal het programma tonen:

Deze weerstand heeft een waarde van 2700 Ohm

Los deze oefening op met een switchstatement.

Orakeltje van Delphi, part deux

We gaan het Orakeltje verbeteren. Voor het orakel je vertelt hoe lang je te leven hebt zal het eerste vragen of je een vrouw (v) of een man (m) bent. Dan vraagt ze je leeftijd. Mannen leven maximum tot hun 120 jaar. Vrouwen echter tot 150 jaar. Laat het orakel een duur voorspellen die kan. Als een vrouw van 50 de vraag stelt dan zal het orakel dus een getal van 5 tot en met 100 (150-50) genereren. Een man van 35 zal van 5 tot en met 85 (120-35) jaren langer kunnen leven.

Casino (Essential)

Genereer een random getal van 1 t.e.m. 6 maar toon dit niet aan de gebruiker. Vraag aan de gebruiker welk getal hij denkt dat de computer heeft "geworpen". Indien de gebruiker juist raadt verschijnt er "proficiat" op het scherm. Anders: "you lose".

Casino 3

Vul de voorgaande oefening aan, maar laat de gebruiker 3x na mekaar raden. Enkel als hij juist raadt mag hij nog eens raden. Als hij ook de derde juist raadt wint hij. In alle andere gevallen niet.

Schaakstuk (Essential)

Schrijf een applicatie om het volgende te verwezenlijken: De bedoeling is om 3 stukken willekeurig te kiezen van een schaakspel. Maak maximaal gebruik van enumeratie-types. Op het scherm moet dus willekeurig een opsomming van 3 stukken (als woorden) verschijnen. De uitvoer kan dus bijvoorbeeld zijn:

wit paard
zwarte loper
witte pion

Voor de experts die al vlot werken met casting, enums en Random: je kan deze oefening ook oplossen zonder ook maar 1 switch of if. Beter zelfs: je kan deze oplossen met 3 WriteLines en een Random getal generator.

Quiz (Essential)

Maak een quiz. Maak gebruik van het switch-statement om de input van de gebruiker (a, b, c of d) te verwerken en bij iedere vraag aan te geven of dit juist of fout is. Voorzie 3 multiple choice vragen. Houd bij hoe vaak de speler juist antwoordde en geef op het einde de eindscore (Juist is +2, fout is -1).

Zoek op hoe je de kleur van de letters en de achtergrond in een console-applicatie kunt aanpassen en pas dit toe op je quiz om deze er iets boeiender uit te laten zien. Toon iedere vraag op een nieuw scherm.

Schrikkeljaar

De gebruiker voert een jaartal in en jouw programma toont of het wel of geen schrikkeljaar is. Een schrikkeljaar is deelbaar door 4, behalve als het ook deelbaar is door 100, tenzij het wél deelbaar is door 400. Bijvoorbeeld:

  • 1997: geen schrikkeljaar
  • 1996: wél schrikkeljaar
  • 1900: geen schrikkeljaar
  • 2000: wél schrikkeljaar

GuntherD Stemwijzer (Essential)

Kan jij volgende ludieke stemwijzer van GuntherD in een eenvoudig programma gieten dat door een reeks j/n vragen aan de gebruiker uiteindelijk zijn "stemprofiel" toont?

Bron Stubru

Enum seizoenen

Maak een enum die de seizoenen van het jaar bevat. Vraag aan de gebruiker om een maandnummer in te voeren. Gebruik vervolgens een switch om te bepalen in welk seizoen deze maand (grotendeels) ligt. Wijs deze enum toe aan een variabele in de switch. Vervolgens gebruik je een if om, gebaseerd op deze enum-variabele, te tonen of het om een koud seizoen (winter en herfst) of een warm seizoen (zomer en lente) gaat.

Fifa ranking berekenen (PRO)

FIFA berekent de score per nationaal voetbal team met een eigen formule bron waarvan de belangrijkste informatie hier samengevat wordt:

Schrijf een applicatie die de nieuwe P berekent nadat de gebruiker alle nodige informatie heeft ingevoert. Bij de invoer van I krijgt de gebruiker een keuze menu te zien dat de verschillende zinnetjes toont zonder de I-waarde. De gebruiker kiest uit het menu de juiste importance (bijvoorbeeld door a, b, c, etc. in te voeren) en jouw programma zet dit dan om naar een getal. De gebruiker moet voor W invoeren: gewonnen, verloren, gelijk. Jouw programma zal dit omzetten naar het juiste getal (1, 0.5 of 0).

Enum bij BMI

Maak een enum die de verschillende soorten gewichten voorstelt (Obees, Zwaarlijvig, NormaalGewicht, etc.) Pas de bestaande "BMI met if" oefening aan zodat je deze enum gebruikt om je code leesbaarder te maken.

Schaak-Elo met if en Random

In plaats van de 3 mogelijke scenarios (win,loss, draw) vraag je nu aan de gebruiker wie van beide spelers heeft gewonnen ("A", "B" of "D" van Draw/gelijk) en toont enkel de nieuwe ratings gebaseerd op de ingevoerde uitslag.

Pas je applicatie ook aan als volgt: indien de gebruiker een negatieve rating voor een van de beide spelers opgeeft dan gebeuren er 2 zaken:

  1. Er verschijnt een foutboodschap ("Negatieve rating mag niet. Ik genereer een random rating.")
  2. Je genereert een random rating tussen 500 en 3000, toont dit getal aan de gebruiker, en gebruikt dit vervolgens verder in de applciatie.

Dit zijn goede oefeningen om te testen of je alle leerstof van de voorbije hoofdstukken goed beheerst. De volgende opgaven waren ook soms effectieve (tussentijdse) vaardigheidsproeven voor dit vak.

Geschatte tijd om dit te maken: 60 minuten

Module 1 Afsluiter

Opgave

Maak een multitool-applicatie die wanneer deze opstart aan de gebruiker een menu toont. Afhankelijk van de input van de gebruiker zal er vervolgens een ander stuk uitgevoerd worden. De verschillende keuzes zijn (de gebruiker voert een cijfer in!):

  • Menuitem 1 - Rekenmachine. Indien dit gekozen wordt zal het programma eerst 2 getallen aan de gebruiker vragen, gevolgd door een keuzemenu waarop de gebruiker een operator kan kiezen (+,-,*,/,%). Het programma toont dan het resultaat indien de operator op de twee ingevoerde getallen wordt uitgevoerd. Wanneer de uitkomst negatief is dan zal de uitkomst in het rood worden getoond.
  • Menuitem 2 - Password tester: Vraag aan de gebruiker z'n paswoord. Indien dit gelijk is aan "TrumpSux" zal er een groene tekst "Toegelaten" verschijnen. Zoniet een rode "Verboden" tekst.
  • Menuitem 3 - Recyclage: Kies eender welk programma dat je in dit of vorig hoofdstuk hebt gemaakt waarin je input aan de gebruiker ook verwerkt. Plaats dit programma achter dit menuitem
  • Menuitem 4 - Computersolver : Implementeer volgende flowchart . Een ruit geeft aan dat je een ja/nee vraag aan de gebruiker stelt (gebruik de tekst dus in de ruit). Een rechthoek (ook die met ronde hoeken) is tekst die je aan de gebruiker toont.

Opgave vaardigheidsproef 2019-2020, deel 1 - IT Helpdesk

Geschatte tijd om dit te maken: 90 minuten

Introductie

Maak een applicatie die de IT-helpdesk medewerkers kunnen gebruiken om bij gebruikers computerproblemen op te lossen.

Stap 1- Flowchart

Het programma implementeert volgende flowchart:

  • De gebruiker dient steeds met "ja" of "nee" te antwoorden bij de vragen.
  • De applicatie begint met "Zet de computer aan." En stelt dan de eerste vraag ("Gaat de computer aan").
  • Na ieder antwoord wordt het scherm leeggemaakt. Finaal bereikt de gebruiker dan een van de onderstaande fasen A,B of C, die verderop in de opgave worden uitgelegd.

Flowchart

Stap 2- Fase A

In fase A gebeurt het volgende:

  1. De gebruiker dient de foutcode als geheel getal in te voeren. Dit moet een getal van 0 tot en met 9 zijn. Bij alle andere getallen (bijvoorbeeld -1 of 14) verschijnt er "Los het dan zelf op he!" en sluit het programma zich af.
  2. Wanneer een correct getal werd ingevoerd verschijnt er in RODE LETTERS de boodschap "Gelieve je computer gedurende X minuten af te zetten."

X is een getal dat berekend wordt als volgt:
vierkantswortel van (foutcode * 3)

X verschijnt op het scherm met 1 cijfer na de komma.

Stap 2 – Fase B

In fase B verschijnt er op het scherm op het "Mooi zo, alles werkt."

Om de gebruiker aan te moedigen een werkende computer te hebben is er ook 25% kans dat hij een extra bonus krijgt.

In 25% van de gevallen dat fase B wordt bereikt verschijnt er namelijk een tweede zin: “En u wint ook nog eens 1 jaar gratis IT support!” De overige 75% keren dat fase B wordt bereikt verschijnt er enkel "Mooi zo, alles werkt." op het scherm.

Stap 3- Fase C

  • In deze fase wordt eerst wat meer informatie over de huidige computer getoond (merk op dat deze fase bij de klant op de computer eigenlijk moet uitgevoerd worden, maar doe maar alsof)

    Verkrijg via de Environment-bibliotheek het aantal processoren van de huidige computer ( ProcessorCount) en gebruik deze waarden om

    1. Indien er 1 processor in de computer zit komt er in witte letters op rode achtergrond op het scherm “1 processor”
    2. Indien er 2 of meer in zitten toon je het aantal processoren als getal met een groene achtergrond en blauwe letters,
  • Vervolgens berekent het programma de kostprijs voor de reparatie. Deze is 50€ per processor. Een computer met 5 of meer processoren zal altijd 200 euro kosten. Bereken de kost door het aantal processoren uit de vorige stap te gebruiken en toon dit op het scherm.

Voorbeeld 1 fase C:

Flowchart

Voorbeeld 2 fase C:

Flowchart

  • De gebruiker krijgt een bon voor een gratis reparatie indien hij een 64 bit computer gebruikt. Bevraag dit via de Environment-bibliotheek en toon "Hier een bon!" indien een 64 bit processor aanwezig is.

Opgave vaardigheidsproef 1819, module 1 - Intergalactic pizzaphone bestel-module

Geschatte tijd om dit te maken: 120 minuten

Introductie

IPP – Intergalactic PizzaPhone - is de populairste pizza-delivery service van het heelal. Ze hebben jouw hulp ingeschakeld om een nieuwe bestel-module te maken. Jouw module moet ervoor zorgen dat de telefoonoperators veel sneller de bestellingen kunnen invoeren en doorgeven aan de keuken.

yIghoSDo' chenmoHwI'! (Klingon voor: Veel succes maker!)

Opgave

De opgave bestaat uit twee delen:

  • Deel 1- Bestelmodule (15 punten) De bestelmodule uit een aantal onderdelen (Alle prijzen worden uitgedrukt in Intergalactic Credits (IC))

    • Bevraging: er wordt aan de klant een aantal vragen gesteld (bv type pizza, etc)
    • Visualisatie: de bestelling wordt getoond op het scherm
    • Berekening: de totaalprijs wordt berekend
    • Ticket: de totaalprijs wordt getoond
  • Deel 2 – Uitbreidingen (5 punten) Deze zullen achteraan de opgave uitgelegd worden. Het is aangeraden om eerst deel 1 af te werken voor je aan de uitbreidingen begint.

    De uitbreidingen zijn:

    • Een random kortingsmodule
    • Een benzine berekenaar

Deel 1- Bestelmodule

Bevraging (5 punten)

Een reeks vragen zal gesteld worden waarbij de gebruiker (operator) z’n keuze invoert en naar de volgende vraag gaat.

Pizzabodem?

De pizzabodem kan bestaat uit:

  • Cheesy crust (kost 5 IC)
  • Martian meal (kost 2.8 IC)
  • Pegasus lime (kost 12.4 IC)

Indien "Martian meal" wordt besteld moet de operator ook vertellen dat dit niet geschikt is voor kinderen onder de 54 jaar. De operator zal daarom nu de leeftijd vragen en enkel verder gaan indien deze groter of gelijk is aan 54. Indien jonger stopt programma en verschijnt er “ERROR” in rode letters op het scherm.

Topping?

De gebruiker kan kiezen uit 2 soorten toppings, hij mag ook verkiezen om zonder topping verder te gaan. De kost van een topping kan afhankelijk zijn van de gekozen pizzabodem:

  • Endrali pies
    • kost 10 IC voor cheesy crust,
    • kost 15 IC voor Martian meal en Pegasus Lime
  • Italian Cheese
    • kost 5.5 IC op alle bodems
  • Geen
    • geen kost

Chefs extra?

Indien de klant voor geen topping kiest dan kan deze voor 1 IC de chef’s extra (een dikke fluim) aan z’n pizza toevoegen.

Afstand tot aarde in lichtjaar?

  • Als finale vraag dient de gebruiker door te geven hoe ver het afleveradres is in lichtjaren. Dit zal steeds een geheel getal van 1 tot en met 100 moeten zijn.
  • Indien de gebruiker een getal buiten deze grenzen ingeeft dan sluit het programma door in rode letters “ERROR” op het scherm te zetten

Visualisatie (4punten)

De pizzabestelling wordt gevisualiseerd als volgt:

  • Een letter verschijnt in een bepaalde kleur afhankelijk van de bodem, namelijk:
    • Gele C voor cheesy crust
    • Rode M voor martian meal
    • Groene P voor pegasus lime
  • Na de bodemletter verschijnt een O in de kleur van de topping.
    • Blauw voor endrali pies
    • Geel voor italian cheese
    • Indien gebruiker geen topping koos maar wel de chef’s extra verschijnt in de plaats een Witte E
    • Indien de gebruiker geen topping koos en ook geen chef’s extra dan verschijnt er geen O maar een gele Z

Voorbeelden:

Prijsberekening (3 punten)

De prijsberekening van de pizza gebruikt de prijzen hierboven vermeld en is gewoon de optelsom van de aparte delen.

Na de pizza-prijs berekening wordt berekend hoeveel de transportkosten zullen zijn. Deze zijn gebaseerd op de afstand tot de aarde in lichtjaren als volgt:

Transportkosten:

  • Afstand kleiner dan 10 : 25 IC
  • Afstand groter of gelijk aan 10: $\sqrt(s/p)+p$ (met p gelijk aan de pizzaprijs en s de afstand)
    • De transportprijs wordt naar beneden afgerond tot het eerste gehele getal.
  • Indien de chef’s extra werd gekozen dan zal er een 10% korting op de totale transportkosten gegeven worden

Ticket (3 punten)

Gebruik string interpolatie voor dit deel. Een ticket wordt getoond dat de volledige bestelling in tekst toont met erachter, via tab, steeds de prijs. Onderaan volgt de totaalprijs. Voorbeeld van een ticket:

Martian meal			2.8 IC
Italian Cheese			5.5 IC
- 	-	-	-	-	-	-	-	-
Totaal pizza			8.3 IC

Afstand		                12 Lichtjaren
Transportkosten:		9  IC
- 	-	-	-	-	-	-	-	-
TOTAAL				17.3 IC

Deel 2- Uitbreidingen

Random korting- module (2 punt)

De standaard korting voor de chef’s extra op de transportkosten is 10%. In deze uitbreiding zou het bedrijf graag hebben dat een willekeurige korting wordt toegekend. Deze zal steeds een willekeurige bedrag van 0 tot en met 50% korting zijn.

Benzine module (3 punten)

Deze module zal berekenen hoeveel tonnen benzine er nodig zijn om de pizza bij de klant te krijgen. Er is 1 ton benzine nodig per 5 lichtjaar. Indien de klant dus 12 lichtjaren ver woont dan zijn 3 tonnen nodig, waarbij de derde ton maar voor 2/5 (40%) zal opgebruikt worden.

De module zal dus steeds het geheel aantal tonnen benzine tonen , gevolgd door hoeveel % van de laatste ton nodig zal zijn (indien deze volledig opgebruikt zal worden dan toon je 100% uiteraard; bv wanneer de klant op 10 lichtjaar woont)

De benzine module toont deze informatie onderaan het ticket:

Martian meal			2.8 IC
Italian Cheese			5.5 IC
- 	-	-	-	-	-	-
Totaal pizza			8.3 IC

Afstand	                	12 Lichtjaren
Transportkosten:		9  IC
- 	-	-	-	-	-	-
TOTAAL				17.3 IC
*********************************
Informatie voor de piloot:
Benzine tonnen in te laden	2
Benzine over in laatste ton:	20%

Geschatte tijd om dit te maken: 60 minuten

Introductie

We maken een applicatie die leerlingen kunnen gebruiken om beter te weten wat ze moeten doen in tijden van corona. De applicatie bestaat uit 2 delen:

  • Een “Covidbeslissingshelper”: deze zal enkele vragen aan de leerling vragen om te beslissen of de leerling naar school mag blijven gaan of in quarantaine moet
  • Een “Covidquiz”: de leerling zal een vraag over Covid moeten oplossen om te zien of de leerling de regels goed genoeg kent.

3 punten staan op naamgeving, layout en algemene oplossingsmethode

Flowchart (2 punten)

Maak een applicatie volgens volgende flowchart en de uitleg verderop:

Gebruik een switch om afhankelijk van de invoer van de gebruiker een ander deel (Covidquiz of Covidbeslissingshelper) uit te voeren:

  • Indien de gebruiker iets anders dan ‘c’ of ‘q’ invoert dient de applicatie af te sluiten nadat het de boodschap “Verkeerde invoer” op het scherm heeft getoond.

Rechterklik op de afbeelding en bewaar of kopieer deze om ze vergroot in je eigen tekenprogramma te zien.

Covidbeslissingshelper (4 punten)

Een reeks vragen wordt gesteld, afhankelijk van het vorige antwoord wordt er mogelijk een andere vraag gesteld.

Toon finaal wat de leerling moet doen. Toon dit met tekst wiens achtergrondkleur overeenkomt met die in de flowchart (groen indien naar school mag gegaan worden, rood indien quarantaine)

Covidquiz (4 punten)

Deze quiz gaat testen of de leerling weet wanneer hij/zij getest moet worden na een risico-contact te hebben gehad. De regel is eenvoudig: bij een contact moet je je na 5 dagen laten testen.

De quiz zal dit testen als volgt:

  • • De quiz genereert een getal tussen 1 en 5 dagen, inclusief 5 zelf. Dit stelt het aantal dagen voor dat de leerling reeds in quarantaine is.
  • Dit wordt aan de gebruiker getoond.
  • Vervolgens wordt gevraagd hoeveel dagen de leerling nog moet wachten voor deze zich moet laten testen.
  • De gebruiker voert dit getal is. Indien dit juist is toon je in groene letters “correct”. Bij fout toon je in rode letters “Fout” gevolgd door het juiste antwoord

Voorbeeld: Als de computer 3 toont, dan is het juiste antwoord 2. De student moet namelijk op dag 3 nog 2 dagen wachten om op dag 5 getest te worden.

Zorg ervoor dat ieder deel (ruiten en vierkanten) uit de covidbeslissingshelper maar 1x in code moet beschreven staan. Je kan de covidbeslissingshelper in 40 of minder lijnen code oplossen.

Intro

Een bekende streamingdienst twim.tv heeft jou gevraagd om een softwarepakket te ontwikkelen dat hun klanten kunnen gebruiken terwijl ze video’s streamen. De applicatie zal de streamers helpen om viewers bij te kopen en te zien hoe goed hun stream het doet.

De applicatie bestaat uit 3 duidelijke delen die alle 3 steeds zullen uitgevoerd worden:

Belangrijke afspraken

  • Strings worden altijd m.b.v. string interpolatie naar het scherm gestuurd.
  • Gebruik constanten waar nodig

Deel 1: initialisatie

Wanneer de applicatie opstart, groet deze de gebruiker. Hierbij wordt de gebruikersnaam uit het systeem (m.b.v. de correcte Environment-eigenschap) uitgelezen.

Voorts worden volgende willekeurige getallen (uiteraard automatisch gegenereerd) aangemaakt:

  • Het aantal viewers dat naar de stream kijkt: dit kan 1000, 2000, 3000 , 4000 of 5000 zijn. Dit wordt willekeurig bepaald.
  • Het huidige budget uitgedrukt in credits van de gebruiker: dit is een willekeurig geheel getal gelegen tussen 100 (100 inbegrepen) tot en met 600.

Deel 2: Menu

Een menu wordt aan de gebruiker getoond, waarbij met tabs de keuzemogelijkheden onder elkaar worden getoond:

Gebruik enum voor de keuzes.

Keuze 1: viewers kopen

Deze optie kost 200 credits. Indien de gebruiker niet genoeg credits heeft dan verschijnt er in rode letters “Niet genoeg credits” en wordt er naar deel 3 van het programma gegaan. Indien de gebruiker 200 of meer credits heeft dan:

  • Wordt het budget met 200 verlaagd.
  • Wordt het aantal viewers met 1000 verhoogd

Voorzie ook de mogelijkheid om te onthouden of je viewers gekocht hebt. Vervolgens verschijnt er het nieuwe budget en aantal viewers op het scherm en wordt het laatste deel van de applicatie gegaan (“Bepalen van de categorie”)

Keuze 2: adspace kopen

Deze optie kost 300 credits. Indien de gebruiker niet genoeg credits heeft dan verschijnt er in rode letters “Niet genoeg credits” en wordt er naar deel 3 van het programma gegaan.

Indien de gebruiker 300 of meer credits heeft dan:

  • Wordt het budget met 200 verlaagd.
  • Wordt het aantal viewers als volgt verhoogd:
    • Indien het huidig aantal viewers een veelvoud van 2000 is komen er 1000 viewers bij
    • Zo niet komen er 500 viewers bij

Voorzie ook de mogelijkheid om te onthouden of je adspace gekocht hebt.

Vervolgens verschijnt er het nieuwe budget en aantal viewers op het scherm en wordt er naar het laatste deel van de applicatie gegaan (“Bepalen van de categorie”)

Keuze 3: niets kiezen

Indien de gebruiker optie 3, niets, kiest dan gaat het programma automatisch verder naar deel 3.

Andere Keuze: budget afname

Indien de gebruiker een ander getal dan 1, 2 of 3 invoert dan verschijnt er op het scherm dat dit geen geldige keuze is. Voorts gebeuren er volgende zaken:

  • Er wordt 10% van het budget afgetrokken (tot 2 cijfers na de komma). Het resultaat wordt naar beneden afgerond.
  • Het aantal viewers wordt met een vierde (naar boven afgerond) verminderd.

Er verschijnt op het scherm: “Je verliest 1 op 4 viewers.”

Deel 3: Menu

In dit finale gedeelte wordt de “gezondheid” van de streamer bepaald. Het aantal viewers, budget en aankopen in deel 2 bepalen hoe gezond een streamer is. Er zijn 4 soorten streamers:

  1. Beginner
  2. Gevorderde
  3. Faker
  4. Onbekend

De applicatie toont tot welke categorie de streamer zich bevind waarbij deze categorie als een enum intern wordt voorgesteld.

  • Beginner: je hebt 200 of minder credits en je hebt 4000 of minder viewers
  • Gevorderde: je hebt 5000 of meer viewers en je hebt 1 aankoop gedaan in deel 2
  • Faker: je hebt 4000 of minder viewers en je hebt in deel 2 adspace viewers gekocht
  • Onbekend: je voldoet niet aan 1 van voorgaande categorieën Indien 2 of meer categorieën gelden voor een gebruiker, dan wordt de bovenste uit deze lijst toegewezen.

Voorbeeld uitvoer

Indien de gebruiker als “Faker” wordt bestempeld krijg je de vraag of je voor 100 credits het profiel wil omgezet zien worden naar “Gevorderde”. Indien de gebruiker met “nee” antwoordt sluit het programma af. Indien de gebruiker “ja” antwoordt komt er op het scherm “Word beter!” en dan sluit het programma af.

Vanaf dit hoofdstuk zul je véél meer oefeningen voorgeschoteld krijgen dan je kan afwerken in 1 labo tijd (I dare you ;) ). Selecteer zelf de oefeningen die je wenst te doen en sla die over waarvan je overtuigd bent ze al te kunnen.

De oefeningen zijn, in de mate van het mogelijke, gerangschikt op relatieve moeilijkheidsgraad.

Indien niet expliciet vermeld mag je kiezen met wat voor loop (for, while, do while) je het probleem zal oplossen. Denk echter steeds goed na wat voor loop de beste keuze is. Indien je van te voren weet hoe vaak de loop moet uitgevoerd worden, dan is een for de beste keuze. Weet je dat niet dan kies je voor while of do while (weet je nog het verschil tussen beiden?).

Oefeningen waar n wordt gebruikt geven aan dat dit een getal is dat je aan de gebruiker vraagt aan de start.

Oefeningen week 1

Opwarmers 1

  • Toon alle natuurlijke getallen van 1 tot n. (bv 1,2,3,4,5,6)
  • Toon alle natuurlijke getallen van n tot 1. (bv 6,5,4,3,2,1)
  • Toon alle even getallen tussen 1 en 100. (2,4,6,...100)
  • Toon alle oneven getallen tussen 1 en 100. (1,3,5,7,...99)
  • Toon de som van alle getallen van 1 tot n (dus 1+2+3+4+...+n).
  • Toon de som van alle even getallen van 1 tot n. (voorbeeld:indien de gebruiker 7 invoerde dan zal er 12 op het scherm verschijnen , namelijk (2+4+6)).
  • Toon de som van alle oneven getallen van 1 tot n.

Opwarmers van opwarmers

Met afsluitwaarde bedoelen we een waarde die de gebruiker moet invoeren om het programma te stoppen. Dus zolang de gebruiker NIET die afsluitwaarde invoert zal het programma om nieuwe waarden blijven vragen.

  1. Lees een willekeurig aantal getallen van de gebruiker (de gebruiker kiest zelf de getallen) met als afsluitwaarde 0. Bereken de som en druk die af. Je blijft dus de getallen van de gebruiker optellen tot deze 0 invoert, dan stopt het programma.
  2. Lees een willekeurig aantal getallen in met als afsluitwaarde 0. Druk het aantal strikt positieve en het aantal strikt negatieve getallen af.
  3. Lees een willekeurig aantal getallen in met als afsluitwaarde -32768. Bepaal het aantal strikt positieve getallen, het aantal strikt negatieve getallen en het aantal getallen gelijk aan nul. Druk deze aantallen af.
  4. Lees een willekeurig aantal getallen in met als afsluitwaarde 0. Bereken het product en druk dit af.
  5. (PRO) Lees een getal in en druk de som van zijn cijfers af.
  6. Lees een willekeurig aantal positieve getallen in en bereken het (afgekapt) gemiddelde ervan. De afsluitwaarde is een willekeurig negatief getal.
  7. Lees een willekeurig aantal getallen in met afsluitwaarde -32768. Druk het kleinste getal af en het aantal keer dat het voorkomt. Als de gebruiker volgende reeks invoerde: "3,2,1,2,3,1,4,5,1,2,-32768'. Dan komt er 1 als kleinste getal op het scherm en 3 (omdat 1 drie maal werd ingetypt)
  8. Een reeks in stijgende volgorde gesorteerde getallen wordt ingelezen. De invoer moet stoppen indien er een fout in de sorteervolgorde voorkomt.
  9. Een reeks getallen wordt ingelezen. De invoer moet stoppen indien er twee maal achter elkaar een nul wordt ingelezen. Het gemiddelde van de reeks getallen wordt afgedrukt. De laatste twee nullen tellen uiteraard niet mee voor de bepaling van het gemiddelde.
  10. Bepaal de som van de kwadraten van de even natuurlijke getallen van 50 tot 100 (inbegrepen). De som wordt afgedrukt.
  11. Een reeks van 100 getallen wordt ingelezen. Van de positieve getallen moet er afgedrukt worden hoeveel deelbaar waren door 2, hoeveel deelbaar waren door 3 en hoeveel door 6.
  12. Druk de som af van de eerste 30 termen van de volgende reeksen:
  • 6 + 12 + 18 + 24 + 30 + ...
  • 4 + 12 + 20 + 28 + 36 + ...
  • 1 + 2 + 4 + 8 + 16 + ...
  • 1 + 1/2 + 1/4 + 1/8 + 1/16 + ...
  • 1 + 1/3 + 1/5 + 1/7 + 1/9 + ...
  • 1/2 + 1/3 + 1/5 + 1/9 + 1/17 + ...
  1. Druk de som af van de eerste 20 termen van de volgende reeksen:
  • 4 + 8 + 12 + 16 + 20 + ...
  • 4 + 10 + 16 + 22 + 28 + ...
  • 1 + 3 + 9 + 27 + 81 + ...
  • 1/2 + 1/4 + 1/6 + 1/8 + 1/10 + ...
  • 1 + 1/2 + 1/4 + 1/8 + 1/16 + ...
  • 1 + 1/3 + 1/7 + 1/15 + 1/31 + ...

Tafels van vermenigvuldigen 1

Gebruik de kracht van loops om pijlsnel de tafels van vermenigvuldigen op het scherm te tonen van een getal naar keuze(dus bijvoorbeeld 2x1, 2x2, tot 2x10 en alles daartussen).

Tafels van supervermenigvuldigen (Essential)

Gebruik de kracht van geneste loops om pijlsnel alle tafels van vermenigvuldigen op het scherm te tonen van de getallen 1 tot en met n(dus 1x1, 1x2,... 1xn, 2x1, 2x2,...,2xn tot en met n x n).

RNA Transscriptie (Essential)

DNA heeft steeds een RNA-complement (DNA is het gevolg van RNA transscriptie). Schrijf een programma dat een ingevoerde DNA-string omzet naar een RNA-string. De gebruiker voert steeds 1 DNA-nucleotide in per keer en duwt op enter, de RNA string wordt steeds groter. Na 12 karakters stopt het programma.

De omzetting is als volgt:

  • G wordt C
  • C wordt G
  • T wordt A
  • A wordt U

Als de gebruiker dus ACGTGGTCTTAA heeft ingevoerd moet het resultaat: UGCACCAGAAUU zijn.

Ga er van uit dat de gebruiker letter per letter invoert (telkens dus enter na een letter) en je de omgezette string doet groeien (m.b.v. +=).

Armstrong nummer (PRO)

Een getal is een narcistisch getal of armstronggetal als het de som is van zijn eigen cijfers elk tot de macht verheven van het aantal cijfers.

  • 9 is een Armstrong nummer, want 9 = 9^1 = 9
  • 10 is geen Armstrong nummer, want 10 != 1^2 + 0^2 = 1
  • 153 is een Armstrong nummer, want: 153 = 1^3 + 5^3 + 3^3 = 1 + 125 + 27 = 153
  • 154 is geen Armstrong nummer, want: 154 != 1^3 + 5^3 + 4^3 = 1 + 125 + 64 = 190

Schrijf een programma dat aan de gebruiker een getal vraagt en vervolgens toont of het ingevoerde getal een Armstrong-nummer is of niet.

Je zou deze oefening kunnen oplossen door het ingevoerde getal als string op te splitsen in individuele char's. Maar we raden je aan om de "wiskunde" weg te volgen zodat je terdege leert met loops en wiskunde te werken.

Stel dat je het getal 4563 hebt:

  • Eerst deel je 4563 door 1000. Dit geeft 4.
  • We trekken 4x1000 van 4563 af. Dit geeft 563.
  • Deel 563 door 100. Dit geeft 5.
  • We trekken 5x100 van 563 af. Dit geeft 63.
  • Deel 63 door 10. Dit geeft 6.
  • We trekken 6 x 10 van 63 af. Dit geeft 3

Je kan van een string weten hoe groot deze is als volgt:

//veronderstellend dat myInputGetal van het type string is
int lengte= myInputGetal.Length;  

Je kan dan nu met Math.Pow(10,lengte-1) berekenen vanaf welke exponent van 10 we moeten beginnen werken.

Schaak-elo met loop

Zorg ervoor dat je Schaak-elo programma "blijft werken" als volgt:

1° De gebruiker geeft z'n begin Elo-rating op 2° Een loop start en vraagt nu telkens de Elo-rating van de huidige tegenstander, gevolgd door de uitslag. Telkens wordt de nieuwe Elo-rating van de gebruiker getoond. Wanneer de gebruiker een negatieve rating voor z'n volgende tegenstander opgeeft stopt de loop.

Euler project (Essential)

Maak volgende opdracht van projecteuler.net: >Indien we alle natuurlijke getallen van 0 tot en met 10 oplijsten die een meervoud van 3 of 5 zijn, dan krijgen we de getallen 3,5,6,9 en 10. De som van deze 4 getallen is 33. Maak nu een programma dat de som van alle veelvouden van 3 of 5 weergeeft van 0 tot en met 1000 (dit zou 234168 moeten geven).

De modulo-operator (%) is je grote held hier. Een getal is een veelvoud van x indien getal % x 0 als resultaat geeft.

For doordenker (PRO)

Schrijf een programma dat de volgende output geeft, gegeven dat de gebruiker een maximum waarde invoert, dus als hij 4 ingeeft dan zal de driehoek maximum 4 breed worden. Gebruik enkel 2 keer 2 geneste for-loops!

*
**
***
****
***
**
*

Huiswerk

Een extra grote hoop oefeningen om je loops te drillen (originele bron). De oefeningen zijn gerangschikt naar moeilijkheid, je moet deze allemaal met loops oplossen! Hoe ver geraak je?

Probeer niet alle oefeningen met hetzelfde type loop te doen, wissel tussen while, do-while en for.

Indien er sprake is van n in de opgave dan is dit een getal dat je eerst aan de gebruiker moet vragen.

Opgelet: de oplossing van dit soort oefeningen vind je overal. Weersta hier aan, en probeer ZELF de oplossing te vinden. Dat is de enige manier om dit te leren.

Niet zeker van je oplossing? Test of je met minimale aanpassing de grenzen van je programma kunt aanpassen. Als je bijvoorbeeld de getallen van 1 tot 100 moet tonen dan zou je met 2 wijzigingen maximum dit moeten kunnen aanpassen naar de getallen van -1000 tot 21234.

Drillen

Beide grenzen zijn steeds inbegrepen!

  • Schrijf een programma dat alle Unicode karakters en hun waarde toont van 10 tot n (tip: char c = Convert.ToChar(65); zal hoofdletter A tonen). Merk op dat sommige unicode karakters (zeker die vooraan) "onzichtbaar" zijn en dus niets op het scherm zullen geven.
  • Toon het alfabet van a tot z.
  • Schrijf een programma dat de macht van een getal toont. De gebruiker voert eerst het getal in, gevolgd door de macht (bv. 2 en 4 zal als resultaat 16 geven (2 tot de 4e macht)). Merk op dat je geen gebruik mag maken van Math.Pow. Je dient zelf de vermenigvuldiging helemaal (m.b.v. loops) uit te voeren.
  • Schrijf een programma een getal n ontbindt in factoren. Factoren zijn de getallen waardoor je n kan delen zonder rest (van bijvoorbeeld het getal 100 zijn de factoren 1, 2, 4, 5, 10, 20, 25, 50 en 100).
  • Schrijf een programma dat controleert of een getal priem is of niet.
  • Toon alle priemgetallen van 1 tot n.
  • Toon de reeks van Fibonacci tot n termen.
  • Schrijf een programma dat het aantal digits in een getal telt (het getal 12348 heeft bijvoorbeeld 5 digits).
  • (PRO) Schrijf een programma dat een ingevoerd getal als tekst uitschrijft. Als de gebruiker dus 123 invoert zal de uitvoer zijn: honderd drie en twintig.

Cooldown

  • Toon alle getallen die een veelvoud van 3 zijn en oneven zijn tot en met 100.

  • Toon alle machten tot 5 van n.

  • Toon de tafels tot 10 van ieder getal van 1 tot en met n. Toon iedere tafel horizontaal! Als de gebruiker 8 invoert verschijnt er:

    1x1=1,2x1=2,3x1=3,4x1=4,5x1=5,6x1=6,7x1=7,8x1=8, 
    ... 
    1x10=10,2x10=20,3x10=30,4x10=40,5x10=50,6x10=60,7x10=70,8x10=80, 
    
  • Schrijf een programma om de eerste n termen van een harmonische reeks te tonen en bereken vervolgens de som van deze termen. Als de gebruiker bijvoorbeeld 5 invoert verschijnt er (de laatste plus mag je tonen om geen onnodige ingewikkelde code te moeten schrijven):

    1/1 + 1/2 + 1/3 + 1/4 + 1/5 + 
    Som = 2.283334 
    
  • Schrijf een programma dat de som van de serie 9+99+999+9999+99999+999999 berekent (mét loop uiteraard).

  • Vraag aan de gebruiker getallen tot hij -1 invoert. Toon het gemiddelde van de ingevoerde getallen.

Oefeningen week 2

Begin pas aan deze oefeningen wanneer je voldoende geoefend hebt door de vorige 2 delen oefeningen op te lossen.

Deze oefeningen zijn oefeningen die je moet kunnen indien je hoofdstuk 6 goed en wel beheerst. Ze zijn dus een goede maat om te weten of je het hoofdstuk al voldoende in de vingers hebt.

Bekijk zeker de Wiskunde-quizprogramma-opdracht!

Boekhouder (Essential)

Maak een 'boekhoud-programma': de gebruiker kan continu positieve en negatieve getallen invoeren. Telkens hij op enter duwt wordt de huidige invoer aan de balans bijgevoegd. Het programma stopt met getallen vragen wanneer de gebruiker 'q' invoert. Finaal worden dan de volgende zaken op het scherm getoond:

  • De balans van alle ingevoerde getallen: dit is gewoon de som van de getallen. Als de gebruiker dus de getallen 4, -10 en 8 invoerde dan zal de balans op +2 staan (4 -10 + 8).
  • De som van alle negatieve invoeren. Als de gebruiker dus 4, -10, 8 en -6 invoerde dan zal dit getal op -16 staan (= -10 -6).
  • De som van alle positieve invoeren. Als de gebruiker dus 4, -10, 8 en -6 invoerde dan zal dit getal op +12 staan (= 4 + 8).
  • Het gemiddelde van alle ingevoerde getallen.

Deze 4 getallen worden ook steeds geüpdatet en getoond wanneer de gebruiker een nieuw getal invoert en op enter duwt.

Hoger Lager (Essential)

Simulatie van het "hoger-lager" spel. Het programma kiest een random-getal van 1 tot en met 100 (telkens inbegrepen). Vervolgens wordt de gebruiker gevraagd om een gok te doen en toont het programma of de gok juist was, te laag was ("hoger") of te hoog ("lager"). Het programma blijft gokken van de gebruiker accepteren tot de gok juist is of de gebruiker besluit te stoppen (door een negatief getal in te voeren). Het aantal beurten wordt op het einde van het spel getoond en de mogelijkheid om opnieuw te spelen.

Limiet

Pas het Hoger Lager programma aan zodat er een maximum aantal pogingen is toegestaan.

Wiskundequiz (Essential)

Maak een applicatie die je kan gebruiken om je tafels van vermenigvuldigen te oefenen. De applicatie vraagt steeds een willekeurige vermenigvuldiging (enkel getallen tussen 1 tot en met 10) en de gebruiker moet de oplossing invoeren. Indien correct gaat de gebruiker verder. Bij fout stopt het programma en wordt getoond hoeveel keer je juist hebt ingevoerd.

Wiskundequiz met levels (Essential)

Bouw levels in de voorgaande wiskundequiz. Per 5 juiste antwoorden, stijg je 1 level. Het level bepaalt het bereik van getallen die gegenereerd worden bij de oefening. Bijvoorbeeld level 1 enkel getallen van 1 tot en met 5, level 2 tot en met 10, level 3 tot en met 20 etc.

PRO: Kan je ervoor zorgen dat het bereik van de getalgeneratie met een formule afhankelijk is van het level? Zodat je de grenzen per level niet moet hardcoden?

Wiskunde-quizprogramma

Integreer voorgaande quiz met een menu dat je bijvoorbeeld in codemenu hebt gemaakt. Het menu wordt aan de start getoond en geeft de gebruiker de optie om te kiezen wat hij wenst te doen:

  • Gewoon spelen
  • Starten op een bepaald level (de gebruiker moet vervolgens het level invoeren)
  • Studeren: de oplossing wordt steeds getoond. De gebruiker hoeft niets in te voeren, elke 5 seconden verschijnt de volgende opgave met oplossing. Gebruik System.Threading.Thread.Sleep(5000) om je programma 5 seconden (5000 ms) te pauzeren.

Tekenen

Twee getallen van 2 tot en met 20 worden ingelezen (invoercontrole!). Er moet een open rechthoek afgedrukt worden bestaande uit *en waarbij de ingelezen getallen respectievelijk de breedte en de hoogte van de rechthoek voorstellen. Als bijvoorbeeld 10 en 4 werden ingelezen, wordt de volgende rechthoek getoond:

* * * * * * * * * *
*                 *
*                 *
* * * * * * * * * *

Steen schaar papier (Essential)

Maak een applicatie waarbij de gebruiker steen-schaar-papier met de computer kan spelen. De gebruiker kiest telkens steen, schaar of papier en drukt op enter. Vervolgens kiest de computer willekeurig steen, schaar of papier (gebruik de Random.Next() methode, waarbij je deze van 1 tot en met 3 laat varieren). Vervolgens krijgt de winnaar 1 punt:

  • Steen wint van schaar, verliest van papier.
  • Papier wint van steen, verliest van schaar.
  • Schaar wint van papier, verliest van steen.
  • Indien beide hetzelfde hebben wint niemand een punt.

Op het scherm wordt telkens getoond wie de huidige ronde heeft gewonnen en hoeveel de tussenscore is. De eerste (pc of gebruiker) die 10 punten haalt wint.

Teken een flowchart van je applicatie.

Los dit op met enum : je code zal een pak leesbaarder worden

Codemenu (Essential)

Maak een applicatie die bij het opstarten een keuze menu toont. Het menu toont 5 verschillende oefeningen naar keuze. Telkens de gebruiker in het menu een oefening kiest (door a, b, c, d of e in te voeren) wordt de code van die oefening getoond. Vervolgens kan de gebruiker op enter duwen zodat terug het menu verschijnt, zodat de gebruiker een nieuwe oefening kan kiezen

Extra: maak je menu visueel interessanter (m.b.v. kaders en kleuren)

Become Neo

Neo Tim

Volgende code genereert een beeld zoals dat ook in de cultfilm The Matrix (1999) plaatsvindt.

Random rangen = new Random();
Console.ForegroundColor = ConsoleColor.Green;
while (true)
{
    //Genereer nieuw random teken:
    char teken = Convert.ToChar(rangen.Next(62, 400));
    //Zet teken op scherm
    Console.Write(teken);
    
    //10 ms pauze tussen ieder frame (pas gerust aan)
    System.Threading.Thread.Sleep(10); 
    
    //Af en toe donker kleurtje
    if(rangen.Next(0, 3) == 0)
    {
        Console.ForegroundColor = ConsoleColor.DarkGreen;
    }
    else
    {
        Console.ForegroundColor = ConsoleColor.Green;
    }
}

Vul de code aan zodat de karakters random kleuren krijgen. Kan je het nog cooler maken?

BeerSong

Schrijf een BeerSong-generator zoals onderstaande output. Merk op dat de laatste 5 zinnen anders zijn:

99 bottles of beer on the wall, 99 bottles of beer.
Take one down and pass it around, 98 bottles of beer on the wall.

98 bottles of beer on the wall, 98 bottles of beer.
Take one down and pass it around, 97 bottles of beer on the wall.

97 bottles of beer on the wall, 97 bottles of beer.
Take one down and pass it around, 96 bottles of beer on the wall.

96 bottles of beer on the wall, 96 bottles of beer.
Take one down and pass it around, 95 bottles of beer on the wall.

95 bottles of beer on the wall, 95 bottles of beer.
Take one down and pass it around, 94 bottles of beer on the wall.

...

4 bottles of beer on the wall, 4 bottles of beer.
Take one down and pass it around, 3 bottles of beer on the wall.

3 bottles of beer on the wall, 3 bottles of beer.
Take one down and pass it around, 2 bottles of beer on the wall.

2 bottles of beer on the wall, 2 bottles of beer.
Take one down and pass it around, 1 bottle of beer on the wall.

1 bottle of beer on the wall, 1 bottle of beer.
Take it down and pass it around, no more bottles of beer on the wall.

No more bottles of beer on the wall, no more bottles of beer.
Go to the store and buy some more, 99 bottles of beer on the wall.

Oefeningen week 1

Ook dit hoofdstuk bevat meer oefeningen dan je lief zijn. Zoek zelf de oefeningen uit die je aanspreken en focus je op het leren werken met methoden en deze te integreren in een grotere applicatie.

Tip van een lector: meestal als een boek veel oefeningen van een bepaald onderwerp bevat is de kans bestaande dat dit onderwerp misschien wel eens belangrijk kan zijn ;)

Opgelet: wanneer je een oefening maakt die invoer van de gebruiker vereist, gelieve die invoer dan BUITEN de methode te vragen (dus meestal in de Main methode). Op die manier zorg je er voor dat je je methoden kunt herbruiken.

Sommige oefeningen zijn van de vorm "Maak een methode die...". Het is steeds de bedoeling dat je de werking van je methode ook test in je main door deze aan te roepen.

Opwarmers (Essential)

Een extra grote hoop oefeningen om je methoden te drillen (originele bron). De oefeningen zijn ongeveer gerangschikt naar moeilijkheid.

OPGELET: de naam van de methode geeft meestal aan wat er juist moet gebeuren. ReadLine en WriteLine mag je bijna NOOIT in methoden gebruiken. Enkel als de methode bijvoorbeeld ToonGetal heet dan zal je iets met WriteLine IN de methode moeten doen. Heet de methode VraagGetal dan zal je inderdaad ReadLine mogen gebruiken. In bijna alle andere gevallen mag dat niet en is het dus de bedoeling dat je de vereiste informatie als parameters aan de methode meegeeft (i.p.v ReadLine), en het resultaat als return teruggeeft (i.p.v. WriteLine).

Iedere oefening verwacht dat je steeds een methode schrijft en de werking ervan aantoont:

  • Methode Kwadraat die het kwadraat van een ingevoerd getal berekent ( het getal geef je mee als parameter).
  • Methode BerekenStraal die de straal van een cirkel kan berekenen waarvan je de diameter meegeeft (de diameter geef je mee als parameter).
  • Idem voor omtrek en oppervlakte.
  • Methode die het grootste van 2 getallen teruggeeft (beide getallen geef je mee als parameter).
  • Methode IsEven die bepaalt of een getal even of oneven is (geeft een bool terug die true is indien even).
  • Methode ToonOnEvenNummers die alle oneven getallen van 1 tot n toont waarbij n als parameter wordt meegegeven.
  • (PRO) Methode IsArmstrong die bepaalt of een getal een Armstrong getal is.
  • (PRO)Methode ToonArmstrongNummers die alle Armstrong nummers tot n toont.

Basic

Maak een methode die jezelf voorstelt op het scherm in de vorm van "Ik ben Tim Dams, ik ben 18 jaar oud en woon in de Lambrisseringsstraat 666". Deze informatie mag hardcoded in je methode staan. Bedoeling is dat je de methode kan aanroepen als volgt:

MyIntro();

Deze methode toont enkel zaken op het scherm en heeft dus als returntype void.

Basic 2

Zorg er voor dat je nu je naam, leeftijd en adres via parameters kan meegeven en dus de methode als volgt kunt aanhouden:

MyIntro("Jos", 34, "Trammezantlei 21");

Grootste methode

Schrijf een methode die 3 ints aanvaardt en vervolgens de grootste van de 3 parameters als resultaat terug geeft.

Rekenmachine (Essential)

Maak minimaal de methoden genaamd TelOp, TrekAf, Vermenigvuldig en Deel. Je kan aan deze methoden steeds twee doubles meegeven en het resultaat dat terugkomt is uiteraard de bewerking van die twee parameters.

Maak een eenvoudig programma waarin je die methoden test.

Pro Rekenmachine

Kan je een eenvoudige zakrekenmachine maken (inclusief geheugen)? Voeg extra methoden naar keuze toe (denk aan macht, sinus, cosinus, modulo, etc.).

Paswoord generator methode

Maak een paswoord generator die paswoorden van bepaalde lengte genereert en bestaat uit willekeurige letters, hoofdletters en cijfers. Plaats deze code in een methode die 1 parameter aanvaardt namelijk de lengte van het paswoord dat gemaakt moet worden. De methode geeft het gegenereerde paswoord terug als resultaat. (tip gebruik een random number generator(s) om getallen te genereren die je ook kan casten naar chars dankzij de Unicode waarde van chars).

Oefeningen week 2

Film Default (Essential)

Maak een methode FilmRuntime() die 3 parameters accepteert:

  1. Een string die de naam van de film bevat
  2. Een integer die duur in minuten van de film bevat
  3. Een enum-type die het genre van de film bevat (Drama, Actie, etc.)

Indien de duur van de film niet wordt meegeven wordt een standaard lengte van 90 minuten ingesteld. Indien het genre niet wordt meegeven dan wordt deze default op Onbekend ingesteld.

De methode geeft niets terug maar toont eenvoudigweg de film op het scherm, gevolgd door z’n duur en genre in volgende formaat. Voorbeelduitvoer=

The Matrix (120 minuten, Actie)

Toon aan in je main dat de methode werkt met zowel 1, 2 als 3 parameters. Toon ook aan dat je met ‘named arguments’ de methode kan aanroepen.

Opwarmers met geavanceerde methoden (Essential)

Zorg ervoor dat de opwarmers vooraan deze reeks oefeningen steeds minstens 1 optionele parameter hebben. Roep deze methoden aan via named parameters.

Oude oefeningen leesbaarder maken

Kan je code uit vorige hoofdstukken herbruiken door deze in handige methoden te plaatsen zodat je code leesbaarder én bruikbaarder wordt?

Einde deel 1 test herschrijven

Bekijk terug jouw (of mijn) oplossing van de vaardigheidsproef of de deel 1 eindetest in dit boek.

Kan je deze code leesbaarder maken door methoden (en loops) toe te voegen?

Verhaalgenerator

Bekijk het all-one-project "De verhaal generator": kan jij dit project afwerken zoals onderaan de opgave wordt voorgesteld?

Hoe ver geraak je?

Challenges

Oefeningen week 1

Een aantal oefeningen is geïnspireerd op oefeningen van Exercism.io.

Opwarmers

  • Vul een array van ints met alle getallen van 1 tot 100. Druk de array af.
  • Vul een array van ints met alle even getallen tot en met 100. Druk de array af.
  • Vraag aan de gebruiker 3 keer een getal, stop deze in een array, druk deze array af.
  • Maak een array aan en plaats daarin de 4 namen van je beste vrienden in volgorde van "beste vriend" tot "minst beste vriend". Toon nu de namen op het scherm, onder elkaar, met telkens ervoor "Beste vriend", "Tweede beste vriend", "Derde beste vriend", "Minst beste vriend".
  • Maak een array van 20 booleans en zorg dat alle oneven indexen False en de even True zijn. Druk vervolgens de array af.
  • Maak een array van 20 bool-waarden. Deze waarden zijn willekeurig. Print de array. Toon hoeveel keer true en hoeveel keer false er in de array zit. Opgelet, je doet de visualisatie in aparte loop nadat je deze hebt aangemaakt. Voorts tel je de true en false variabelen in nog eens een aparte loop.
  • Vul een array met 10 random doubles tussen 0 en 10. Toon het gemiddelde ervan.
  • Maak een enum Schooltype met mogelijke waarden TSO, BSO, ASO, KSO. Maak een array van 20 Schooltype-waarden. Vul deze met willekeurige schooltypes. Toon de array. Toon hoe vaak ieder schooltype in de array voorkomt.

Vraag Array

Maak een array die 6 strings kan bevatten. Ieder element van de array bevat een vraag (naar keuze te verzinnen) als string waar de gebruiker met een getal op moet antwoorden. Maak een array aan die tot 6 ints kan bevatten. Lees 1 voor 1 de vraag uit de string-array uit en toon deze op het scherm. Lees vervolgens het antwoord uit dat de gebruiker intypt en bewaar dit als int in de 2e array.

Na de 6 vragen toon je vervolgens de vragen opnieuw met achter iedere vraag het antwoord van de gebruiker.

Mogelijk uitvoer programma

Array Zoeker (Essential)

Maak een programma dat eerst aan de gebruiker 10 waarden vraagt die in een array worden gezet.

Vervolgens vraagt het programma welke waarde verwijderd moet worden. Wanneer de gebruiker hierop antwoordt met een nieuwe waarde dan zal deze nieuw ingevoerde waarde in de array gezocht worden. Indien deze gevonden wordt dan wordt deze waarde uit de array verwijderd en worden alle waarden die erachter komen met een plaatsje naar links opgeschoven, zodat achteraan de array terug een lege plek komt.

Deze laatste plek krijgt de waarde -1.

Toon vervolgens alle waarden van de array.

Indien de te zoeken waarde meer dan 1 keer voorkomt, wordt enkel de eerst gevonden waarde verwijderd.

Voorbeeld uitvoer

LeveringsBedrijf (Essential)

Maak een programma voor een koeriersbedrijf. Maak een array die 10 postcodes bevat (zelf te kiezen) van gemeenten waar het bedrijf naar levert. Maak een tweede array die de prijs bevat per kg voor iedere respectievelijke gemeente. Het eerste element van deze array bevat dus de prijs/kg om naar de gemeente te leveren die als eerste in de array met postcodes staat.

Vraag aan de gebruiker een postcode en het gewicht van het pakket. Vervolgens wordt de prijs/kg opgezocht voor die gemeente en wordt de prijs berekend, gegeven het ingegeven gewicht.

Indien het bedrijf niet levert aan de ingetypte postcode dan wordt een foutmelding weergegeven.

Geef gewicht pakket
45
Naar welke postcode wenst u dit pakket te versturen?
2020
Dit zal 9630 euro kosten.

Bob

Kan je "Bob" programmeren die als volgt werkt:

Bob is a lackadaisical teenager. In conversation, his responses are very limited. Bob answers 'Sure.' if you ask him a question. He answers 'Whoa, chill out!' if you yell at him. He answers 'Calm down, I know what I'm doing!' if you yell a question at him. He says 'Fine. Be that way!' if you address him without actually saying anything. He answers 'Whatever.' to anything else."

Bekijk steeds de laatste 2 tekens die de gebruiker invoert om de response van Bob te bepalen.

Kan je een gesofisticeerdere bot maken?

myInputstring.Contains(somestring) geeft een bool terug indien somestring voorkomt in de variabele myInputstring van het type string.

Gebruik een array om de antwoorden in te bewaren.

PRO: Bob++

Kan je met een array eerdere vragen van de gebruiker bewaren om zo complexere antwoorden te genereren?

Hamming distance (Essential)

De hamming distance is het aantal tekens dat twee reeksen verschillen indien we ieder element vergelijken op dezelfde plaats in de andere reeks.

Maak een programma dat aan de gebruiker vraagt om twee DNA strings in te voeren (een reeks bestaande uit de letters G, A, C & T). Beide reeksen moeten even lang zijn.

Bereken de hamming distance tussen beide reeksen.

De hamming distance van volgende twee DNA strings is 7, omdat er 7 elementen in beide strings staan die niet gelijk zijn aan mekaar op dezelfde plek (aangeduid met ^).

GAGCCTACTAACGGGAT
CATCGTAATGACGGCCT
^ ^ ^  ^ ^    ^^

Password generator (PRO)

Ontwerp een consoletoepassing waarmee je een wachtwoord genereert voor een gebruiker. Het wachtwoord is opgebouwd uit:

de 2 eerste letters van de familienaam: de 1ste letter is een hoofdletter, de 2de letter is een kleine letter. Daarna worden de 2 letters gewisseld; het zonenummer van het telefoonnummer zonder de 0; het eerste cijfer van de postcode in het kwadraat.

Gebruik de ToCharArray() methode die je op een string kunt toepassen, zoals hier getoond: char[] chars = myEpicName.ToCharArray();

Schrijf nooit een paswoord manager die je paswoorden gortdroog als string bewaart. Secure code schrijven is een hele discipline op zich en laat je best nog even links liggen tot je C# goed in de vingers hebt.

Puzzelen met arrays (Essential)

Sommige oefeningen zijn op randje van PRO. U weze gewaarschuwd.

Je mag in deze oefeningen NIET gebruik maken van .Reverse(), .BinarySearch() etc. Alles moet je manueel kunnen. Enkel sorteren mag je automatisch doen met .Sort().

Als er dus staat "lees 20 getallen in", dan moet je die in volgorde bewaren in je array. Vervolgens begin je die array te manipuleren.

  1. Er worden 20 getallen ingelezen. De getallen worden in omgekeerde volgorde afgedrukt.
  2. Er worden 20 getallen ingelezen. De getallen worden 1 plaats naar voor verschoven afgedrukt, d.w.z. eerst het tweede ingelezen getal, dan het derde ingelezen getal, dan het vierde ingelezen getal , ... , dan het laatste ingelezen getal en tenslotte het eerste ingelezen getal.
  3. Er worden 20 getallen ingelezen. De getallen worden 3 plaatsen naar achter verschoven afgedrukt, d.w.z. eerst het derde laatste ingelezen getal, dan het voorlaatste ingelezen getal, dan het laatste ingelezen getal, dan het eerste ingelezen getal, dan het tweede ingelezen getal en tenslotte het vierde laatste ingelezen getal.
  4. Er worden 20 getallen ingelezen. De getallen worden geroteerd (verschoven) afgedrukt over een aantal elementen x zoals in de vorige opgave. Maak dus de vorige oefening maar nu is 3 een variabele die je op voorhand kan instellen.
  5. [Pro] Een rij van 100 getallen wordt ingelezen. Druk de inhoud van de rij af in 3 kolommen. De getallen worden gerangschikt rij per rij. Als je input bijvoorbeeld volgende reeks getallen is: 4 5 8 7 5 2 6 8 7 1 3 2, dan wordt dit je output:
4 5 8
2 5 7
6 7 8
1 2 3
  1. [Pro] Een rij van 100 getallen wordt ingelezen. Druk de inhoud van de rij af in 3 kolommen. De getallen worden gerangschikt kolom per kolom (hier mag je Sort gebruiken).

Oefeningen week 2

Volgende oefeningen vereisen dat je methoden schrijft die arrays als parameter en/of resultaat hebben.

Parkeergarage (Essential)

Een parkeergarage vraagt sowieso €2.00 om tot maximum 3uur te parkeren. Per extra uur NA die 3uur wordt telkens €0.50 aangerekend (dus 4uur parkeren kost €2.50. Er wordt maximum €10 aangerekend per dag. Veronderstel dat er nooit langer dan 1 dag (24u) kan geparkeerd worden.

Schrijf een programma dat het verschuldigde bedrag toont gegeven de duur dat de parkeergarage gebruikt werd. Bij het opstarten van het programma wordt eerst gevraagd hoeveel auto’s ingevoerd zullen worden, dan wordt per auto de duur van het parkeren gevraagd. Finaal wordt, met tabs, alle informatie getoond, inclusief het totaal bedrag. Gebruik minstens 1 methode BerekenKosten die de kost voor 1 gebruiker telkens teruggeeft, gegeven de duur als parameter.

Voorbeeldoutput:

Opstart

Resultaat

Array Viewer (Essential)

Maak een programma dat een methode VisualiseerArray implementeert. De methode zal een array (type int) als parameter hebben en niets teruggeven (void). Echter, de methode zal met behulp van Write() de array, van eender welke grootte, op het scherm tonen. Tussen ieder element van dezelfde rij dient een tab (herinner: "\t") gezet te worden. Je dient in de methode gebruik te maken van een for-loop. Voorbeeld van main:

int[] array={15, 6, 9};
int[] array2={0, 1, 2, 3, 4, 5, 6};
VisualiseerArray(array);
VisualiseerArray(array2);

Geeft volgende output:

Uitvoer

Caesar-encryptie

Maak 2 methoden Encrypt en Decrypt die als parameters telkens een chararray krijgen en een integer. Bedoeling is dat de Encrypt-methode de array van het type chararray versleuteld gegeven de sleutel x volgens het Caesar cipher (zie hieronder). Als resultaat komt er uit de methode de geëncrypteerde array.

De decrypt-methode doet hetzelfde maar omgekeerd: je kan er een versleutelde tekst insteken en de sleutel en de ontcijferde tekst komt terug (merk op dat je decrypt-methode gebruik kan maken van de encrypt-methode!).

Toon in je main aan dat je methoden werken (door bijvoorbeeld aan de gebruiker een stuk tekst als string te vragen en een sleutel en deze dan te encrypteren/de-crypteren).

Encryptie is de kunst van het vercijferen van data. Hierbij gaat men een gewone tekst zodanig omvormen (versleutelen) zodat deze onleesbaar is en enkel kan ontcijferd worden door de ontvanger die weet hoe de tekst terug kan verkregen worden en enkel indien deze ook de ‘private’ sleutel heeft.

Een klassiek encryptie-algoritme uit de oudheid is de Caesar substitutie. Hierbij gaan we het alfabet met x plaatsen opschuiven en vervolgens de te vercijferen tekst letter per letter vervangen met z’n respectievelijke opgeschoven versie. Hierbij is x dus de geheime sleutel die zender en ontvanger moeten afspreken.

Caesar-encryptie is een erg eenvoudig concept. Het programmeren is iets pittiger.

Stel bijvoorbeeld dat x=3 dan krijgen we volgende nieuwe alfabet:

DEFGHIJKLMNOPQRSTUVWXYZABC

Waarbij dus de A zal vervangen worden door een D, de Z door een C, etc.

Willen we deze tekst dus encrypteren:

the quick brown fox jumps over the lazy dog

dan krijgen we:

WKH TXLFN EURZQ IRA MXPSV RYHU WKH ODCB GRJ

Ondernemingsnummer (Essential)

Originele bron voor dit idee

Ontwerp een methode waarmee je een Belgisch ondernemingsnummer kan controleren. Een Belgisch ondernemingsnummer is als volgt opgebouwd: BE 0xxx.xxx.xxx waarbij BE de landcode is die standaard gevolgd wordt door een spatie en dan een 0. Wanneer je de volgende 7 cijfers deelt door 97 in een gehele deling, dan is het getal gevormd door de laatste 2 cijfers gelijk aan 97 minus de rest van deze gehele deling. Bij een geldig ondernemingsnummer verschijnt de tekst "Geldig ondernemingsnummer.", bij een ongeldig ondernemingsnummer "Ongeldig ondernemingsnummer.". De methode aanvaardt een string waarin je het ondernemingsnummer staat.

Puzzelen met array deel 2 (pittig)

  1. Een rij van 100 gehele getallen wordt ingelezen. Maak een tweede rij die bestaat uit de elementen van de eerste rij in omgekeerde volgorde.
  2. Een rij van 100 gehele getallen wordt ingelezen. Wissel de inhoud van de rij om.
  3. Een rij van 100 gehele getallen wordt ingelezen. Verschuif de inhoud van de rij 1 plaats naar achter. Het laatste getal moet eerst komen.
  4. Een rij van 100 gehele getallen wordt ingelezen. Maak een tweede rij die bestaat uit de elementen van de eerste rij maar 1 plaats naar achter verschoven . Het laatste getal van de eerste rij moet eerst komen in de tweede rij.
  5. Een rij van 100 gehele getallen wordt ingelezen. Maak een tweede rij die bestaat uit de elementen van de eerste rij maar 3 plaatsen naar voor verschoven. Het eerste getal van de eerste rij moet derde laatst komen in de tweede rij, het tweede getal van de eerste rij moet voorlaatst komen in de tweede rij en het derde getal van de eerste rij moet laatst komen in de tweede rij.
  6. Een rij van 100 gehele getallen wordt ingelezen. Verschuif de inhoud van de rij 3 plaatsen naar voor. Het eerste getal moet derde laatst komen, het tweede, voorlaatst en het derde, laatst.
  7. Gegeven is een rij van 50 getallen. Maak een tweede rij waarin geen dubbels voorkomen.
  8. Gegeven is een gesorteerde rij van 50 getallen. Maak een tweede (eveneens gesorteerde) rij waarin geen dubbels voorkomen.
  9. Een rij van maximaal 100 gehele getallen met afsluitwaarde 32767 wordt ingelezen. Druk het maximum van de rij af, het aantal keer dat het voorkwam en de plaats waar het de eerste keer voorkwam.
  10. Een rij van maximaal 100 gehele getallen met afsluitwaarde 32767 wordt ingelezen. Druk het minimum van de rij af, het aantal keer dat het voorkwam en de plaats waar het de laatste keer voorkwam.
  11. Een rij gehele getallen met afsluitwaarde 32767 wordt ingelezen. Het aantal ingelezen getallen is onbeperkt, maar er zullen maximaal 100 verschillende getallen worden ingelezen. Druk af hoeveel verschillende getallen ingelezen werden.
  12. [PRO] Druk alle priemgetallen kleiner dan 100.000 af. Maak gebruik van het algoritme van Eratosthenes.

Determinant (Essential)

Er volgen nu enkele meer-dimensionale array oefeningen

Schrijf een programma dat een methode BerekenDeterminant heeft. Deze methode heeft één parameter als input: een 2 bij 2 array van integers. Als resultaat geeft de methode de determinant als integer terug. Zoek zelf op hoe je de determinant van een matrix kunt berekenen.

Volgende voorbeeld-main dient te werken,

int[,] aMatrix = { 
                  {2, 4},
                  {3, 5}
                 };
Console.WriteLine($"Determinant van matrix is {BerekenDeterminant(aMatrix)}");

geeft als output:

Determinant van matrix is -2

Extra: Breid uit zodat de BerekenDeterminant-methode ook werkt voor 3-bij-3 matrices. De methodeaanroep blijft dezelfde, enkel de interne code van de methode zal nu rekening moeten houden met de grootte van de matrix .

2D Array Viewer

Breid het ArrayViewer programma uit zodat ook 2-dimensionale arrays gevisualiseerd kunnen worden. (Hint: gebruik de GetLength()-methode van een array).

Voorbeeld van main:

int [,] array = { {15, 6, 9}, {1, 2, 3}, {6, 9, 12}};
VisualiseerArray(array);
15  6  9
1   2  3
6   9  12

MatrixMultiplier

Schrijf een methode VermenigvuldigMatrix die 2 matrices als invoer verwacht en als resultaat een nieuwe matrix teruggeeft die het product van beide matrices bevat.

Voetbalcoach (Essential)

Maak een console-applicatie voor een assistent voetbaltrainer (of een sport naar keuze).

De voetbalcoach wil na de match iedere knappe en domme actie van een speler weten. Op die manier weet hij aan het einde van de match wie er de meeste goede en slechte acties doet. De spelers hebben rugnummers 1 tot en met 12. (het gaat om een voetbal variant waar m'n geen elftal maar een twaalftal gebruikt :p)

Wanneer de coach een rugnummer intypt kan hij vervolgens ingeven of hij (a) een knappe actie of (b) een domme actie wil ingeven. Vervolgens geeft hij een getal in. Gebruik een 2dimensionale array die per speler het aantal domme en goede acties bijhoudt (de array is dus 12 bij 2 groot: 1 lijn per speler, bestaande uit 2 kolommen voor goede en domme actie. De index van de lijn is de rugnummer van speler -1).

Een typische invoer kan dus zijn:

2
a
6

De coach kiest dus de speler met rugnummer 2, hij kiest voor een knappe actie, en voert 6 in als aantal goede acties.

In de array op index 1 (rugnummer -1) zal in de 0'de kolom (0 = goede, 1 = slechte) het getal 6 geplaatst worden.

Vervolgens kan de coach een ander rugnummer (of hetzelfde) invoeren en zo verder.

Wanneer de coach 99 invoert stopt het programma en worden de finale statistieken getoond: per speler/rugnummer wordt het aantal goede en domme acties getoond, met daarnaast het verschil tussen beide:

(gebruik \t om goede tabs te zetten tussen de data)

Rugnummer   Goede   Domme   Verschil
1               5       2        3
2               6       7       -1

Het programma toont ook welke speler(s) het meest performant waren, namelijk zij met het grootste positieve verschil tussen goede en domme acties, alsook de minst performante en de meeste “gemiddelde” speler (i.e. verschil == 0 )

Robot Simulator (PRO)

Volgende opgave komt uit Exercism.io

" Write a robot simulator.

A robot factories' test facility needs a program to verify robot movements. The robots have three possible movements:

  • turn right
  • turn left
  • advance Robots are placed on a hypothetical infinite grid, facing a particular direction (north, east, south, or west) at a set of (x, y) coordinates, e.g., (3, 8), with coordinates increasing to the north and east.

The robot then receives a number of instructions, at which point the testing facility verifies the robot's new position, and in which direction it is pointing.

The letter-string "RAALAL" means:

  • Turn right
  • Advance twice
  • Turn left
  • Advance once
  • Turn left yet again

Say a robot starts at (7, 3) facing north. Then running this stream of instructions should leave it at (9, 4) facing west."

Teken het gevolgde pad in de console (gebruik Console.SetCursorPosition()).

Galgje (PRO)

Maak een spel, vergelijkbaar met galgje, waarin de speler een woord moet raden. Zie Wiki voor de spelregels indien je deze niet kent.

Voorbeeld output:

Uitvoer

Grote Som (PRO)

Maak een methode Som() die eender welke hoeveelheid parameters van het type int aanvaardt en vervolgens de som van al deze parameters teruggeeft (als int).

Toon in je main aan dat de methode werkt door onder andere 1, 3, 5 en 10 als gehele getalen mee te geven.

Toon ook aan dat je een array van 50 ints als parameter kan meegeven aan de methode.

Je moet het params keyword gebruiken, zoek zelf op hoe dit werkt!

Gecombineerde oefeningen hoofdstukken 1 tot en met 8

Volgende opgaven waren ooit examenopgaven:

Volgende hoofdstukken bevatten grotere projecten waarin wordt getracht meerdere technieken uit de vorige hoofdstukken te combineren. Het doel van dit hoofdstuk is tweeledig:

  1. Op een andere manier tonen hoe specifieke C# elementen in een 'realistische' programma's kunnen gebruikt worden
  2. Aantonen dat, indien je tot hier bent geraakt, je al een aardig hoop skills hebt om grote, complexe applicaties te maken die verder gaan dan de standaard oefeningen die je na ieder hoofdstuk hebt gemaakt.

Volgt nu een beschrijving van de belangrijkste technieken die je in de projecten hierna zal tegenkomen:

Klassen objecten introductie

Week 1

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)

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:

Rapport mijnpunten = new Rapport();
mijnpunten.Percentage = 65;
mijnpunten.PrintGraad();

Rapport mijnVriendPunten = new Rapport();
mijnVriendPunten.Percentage = 89;
mijnVriendPunten.PrintGraad();

Werkt het naar behoren?! Voer nu de bijhorende unit tests uit om alles extra te controleren: Test=> Run All Tests.

Nummers (Essential)

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:

NummerBerekenaar paar1 = new NummerBerekenaar();
paar1.Getal1 = 12;
paar1.Getal2 = 34;
Console.WriteLine($"Paar: {paar1.Getal1}, {paar1.Getal2}");

int berekendeSom =  paar1.Som();
Console.WriteLine($"Som =  {berekendeSom}");

Console.WriteLine($"Verschil = {paar1.Verschil()}");
Console.WriteLine($"Product = {paar1.Product()}");
Console.WriteLine($"Quotient = {paar1.Quotient()}");

Output:

Paar: 12, 34
Som = 46
Verschil = -22
Product = 408
Quotient = 0,352941176470588

Studentklasse (Essential)

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:

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

    student1.GeefOverzicht();

Output:

Joske Vermeulen, 21 jaar
Klas: TI1

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

PizzaTime

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.

Figuren

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.

Week 2

Bibliotheek (Essential)

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.

Visuele voorstelling van de klasse

BankManager (Essential)

Deel 1

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:

  1. HaalGeldAf: bepaald bedrag (als parameter type int) wordt van de balans verwijderd.
  2. StortGeld: bepaald bedrag (als parameter type int) wordt aan balans toegevoegd.
  3. 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:

//rekening 2 geeft 300 euro aan rekening 1
rekening1.StortGeld(rekening2.HaalGeldAf(300));

Test je klasse.

  1. Nieuwe klant aanmaken
  2. Geld op een bepaalde Rekening zetten
  3. Geld van een bepaalde Rekening afhalen
  4. 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").

Persoon (Essential)

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.

Verjaardag

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:

string dagLokaleTaal = System.Globalization.DateTimeFormatInfo.CurrentInfo.GetDayName(myDate.DayOfWeek)

Voorbeeld invoer en uitvoer:

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

Sports

Sportspeler

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:

speler1.StelIn("Tim", 5, false, true, "tweedeklas");

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?

Dobbelstenen

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.

Er zijn geen aparte Exception handling oefeningen. De bedoeling is dat je zelf steeds in je oefening naar een goede plek(ken) zoekt waar deze kan toegepast worden.

Meetlat

Maak een klasse Meetlat. Via een write-only full property BeginLengte kan de gebruiker de lengte van een voorwerp instellen (in meter, type double) van de instantievariabele lengte.

In hoofdstuk 11 zullen we constructors leren gebruiken: deze zullen methoden zoals BeginLengte vervangen.

Via een reeks read-only properties (die transformeren) kan de gebruiker deze lengte in verschillende eenheden uitlezen namelijk (alles van type double):

  • LengteInM
  • LengteInCm
  • LengteInKm
  • LengteInVoet (1m= 3.2808ft)

Voorbeeld gebruik van klasse:

Meetlat mijnLat = new Meetlat();
mijnLat.BeginLengte = 2;
Console.WriteLine($"{mijnLat.LengteInM} meter is {mijnLat.LengteInVoet} voet.");

Kleur mixer (essential)

Maak een klasse Kleur, deze bestaat uit 3 autoproperties van het type int , namelijk Rood, Groen, Blauw. De klasse heeft een methode MengKleur die niets teruggeeft en één parameter aanvaardt van het type Kleur.

In de methode zal de meegegeven kleur gemengd worden met de kleur van het object zelf. Hierbij wordt van elk kanaal (Rood,groen en blauw) het gemiddelde van beide kleuren genomen. Als dus de huidige kleur 10,0,20 (RGB) als waarden heeft en we de methode aanroepen met een kleur met waarden 10,10,50 dan zal de huidige kleur veranderen naar 10,5,35 . De kleur van de meegegeven parameter verandert niet.

Voorbeeld gebruik:

Kleur k1 = new Kleur();
k1.Rood= 10;
k1.Groen= 0;
k1.Blauw= 20;
Kleur k2 = new Kleur();
k2.Rood= 10;
k2.Groen= 10;
k2.Blauw= 50;

k1.MengKleur(k2);
Console.WriteLine($"{k1.Rood},{k1.Groen},{k1.Blauw}");

Er verschijnt: 10,5,35 op het scherm.

Pokémon (Essential)

We gaan een programma schrijven dat ons toelaat enkele basis-eigenschappen van specifieke Pokémon te berekenen terwijl ze levellen. Nadruk van deze oefening is het juist gebruiken van properties. Bekijk de cheat sheet bij twijfel.

Disclaimer: de informatie in deze tekst is een vereenvoudigde versie van de echte Pokémon-stats in de mate dat ik het allemaal een beetje kon begrijpen en juist interpreteren.

Hoe Pokémon werken

Korte uitleg over Pokémon en hun interne werking: Iedere Pokémon wordt uniek gemaakt door z’n base-stats, deze zijn voor iedere Pokémon anders. Deze base-stats zijn onveranderlijk en blijven dus doorheen het hele leven van een Pokémon dezelfde. Je kan de base-stats als het dna van een Pokémon beschouwen.

De full-stats zijn echter de stats die de effectieve ‘krachten’ van een Pokémon bepalen in een gevecht. Deze stats worden berekend gebaseerd op de vaste base-stats en het huidige level van de Pokémon. Hoe hoger het level van de Pokémon, hoe hoger dus zijn full-stats.

Pokémon

De Pokémonopdracht

Maak je oplossing in een kopie van volgende solution met bijhorende unittests.

Merk op dat enkel de basis aspecten tot en met de sectie "Level-gebaseerde stats" getest worden.

Maak een consoleapplicatie met daarin een klasse Pokémon die de werking zoals hierboven beschreven heeft:

Base-stats

De base-stats worden als int bewaard. Maak voor al deze basis-eigenschappen full properties, namelijk:

  • HP_Base
  • Attack_Base
  • Defense_Base
  • SpecialAttack_Base
  • SpecialDefense_Base
  • Speed_Base

Merk op dat deze waarden eigenlijk nooit nog veranderen in een Pokémon. Het is dus raar dat we ze als full properties beschouwen. In het volgende hoofdstuk zullen we dit oplossen door te werken met een constructor.

Extra stats

Voorts wordt een Pokémon ook gedefinieerd door z’n Naam (string), Type (string, bv. grass & poison) en Nummer (int), maak hiervoor auto properties aan.

Met Nummer bedoelen we de Pokémon index die je in de Pokédex kunt opzoeken. Zo heeft Bulbasaur nummer 1 en Pikachu heeft 25.

Nog een goede reden nodig om met enum te werken? Het Type van een Pokémon zou je eigenlijk beter met een enum datatype kunnen doen dan met een string.

Level

Voeg een fullproperty Level toe (int). Deze heeft een public get, maar een private setter.

Voeg een publieke methode VerhoogLevel toe. Deze methode zal, via de private setter van Level, het level van de Pokémon met 1 verhogen. Deze methode heeft géén parameters nodig en return'd niets.

Statistieken

Voeg 2 read-only properties toe (enkel get, géén set) genaamd Average (double) en Total (int):

  • De Average-property geeft het gemiddelde van de 6 base-stats terug, dus (HP_Base + Attack_Base + Defense_Base + SpAttack_Base + SpDefense_Base +Speed_Base)/6.0.

  • De Total-property geeft de som terug van de 6 basestats. Daar de base stats niet evolueren met het level veranderen dus Average en Total ook niet van zodra de base-stats werden ingesteld, toch mag je beide statistieken steeds herberekenen in de get.

Merk op dat je voor deze twee properties dus geen instantievariable nodig hebt. Dit geldt ook voor de hier na beschreven "level-gebaseerde stats".

Level-gebaseerde stats

De eigenschappen van de Pokémon die mee evolueren met het level gaan we steeds als read-only properties van het type int implementeren:

  • Voeg een read-only property HP_Full toe om de maximum health voor te stellen. Deze wordt berekend als volgt: ( ( (HP_Base + 50) * Level) / 50) + 10 wanneer de get wordt aangeroepen.
  • Voeg voor iedere ander base-stat een XX_Full readonly property toe . Dus Defense_Full, Speed_Full, etc. Ook deze properties zijn readonly. Deze stats worden berekend als volgt: ( (stat_Base*Level) / 50 ) + 5. Attack_Full bijvoorbeeld wordt dus berekend als: ( (Attack_Base * Level) / 50) + 5

Merk op dat de formules enkel met int werken. Het effect hiervan zal zijn dat je full-stats niet per level veranderen, maar pas om de paar levels, daar we informatie "verliezen" door in de deling met int te werken.

Maak enkele Pokémon

Kies enkele Pokémon uit deze lijst en maak in je Main enkele Pokémon-objecten aan met de juiste eigenschappen.

Opgelet: Je dient dus enkel de base stats in te stellen. Alle andere zaken zijn op deze stats en het huidige level van de Pokémon gebaseerd.

Toon aan dat de Average, Total, HP en andere stats correct berekend worden (controleer in de tabel op de voorgaande url).

De volgende stats zouden steeds hetzelfde moeten zijn: Average, Total, Naam, Nummer, Type en de base_stats.

De volgende stats zouden moeten veranderen naarmate je levelt: level-gebaseerde stats en Level.

Via deze site kan je controleren welke stats je Pokémon moet hebben op een bepaald level

Level-up tester

Maak een kleine loop die je toelaat om per loop een bepaalde Pokémon z’n level met 1 te verhogen en vervolgens toon je dan z’n nieuwe stats.

Test eens hoe de stats na bv 100 levels evolueren. Je zal zien dat bepaalde stats pas na een paar keer levelen ook effectief beginnen stijgen.

Deel 2: De Pokémontester

Bekijk zeker eerst of jouw Pokémon oplossing juist is (vergelijk met de oplossing in deze cursus) voor je verder gaat.

Het is een heel gedoe om telkens manueel de informatie van een Pokémon op het scherm te outputen. Voeg een methode public void ShowInfo() toe aan je Pokémon klasse. Deze methode zal alle relevante informatie (alle properties!) in een mooie vorm op het scherm tonen, bv:

Pikachu (level 5)
Base stats:
    * Health = 56
    * Speed = 30
    etc
Full stats:
    * Health = 100
    etc.

Maak nu een nieuwe console-applicatie genaamd "Pokémon Tester":

  1. Voeg je Pokémon-klasse-bestand toe aan dit project. Verander de "namespace" van dit bestand naar de namespace van je nieuwe console-applicatie .
  2. Maak enkele Pokémon objecten aan en stel hun base stats in.
  3. Schrijf een applicatie die aan de gebruiker eerst de 6 base-stats vraagt. Vervolgens wordt de Pokémon aangemaakt met die stats en worden de full-stats aan de gebruiker getoond.
  4. Vraag nu aan de gebruiker tot welke level de Pokémon moet gelevelled worden. Roep zoveel keer de LevelUp-methode aan van de Pokémon. (of kan je dit via een parameter doorgeven aan LevelUp?!)
  5. Toon terug de full-stats van de nu ge-levelde Pokémon.

Deel 3: Pokémon-battler

Pokémon generator

Maak een methode met volgende signatuur: static Pokémon GeneratorPokémon(). Plaats deze methode niet in je Pokémon-klasse, maar in Program.cs.

Deze methode zal telkens een Pokémon aanmaken met willekeurige base-stats. Bepaal zelf hoe je dit gaat doen.

Battle tester

Voeg een methode met volgende signatuur toe aan je hoofdprogramma (dus ook weer in Program.cs): static int Battle(Pokémon poke1, Pokémon poke2).

De methode zal een getal teruggeven dat aangeeft welke van de twee Pokémon een gevecht zou winnen. 1= poke1, 2 = poke2, 0 = gelijke stand.

Controleer steeds of 1 of beide van de meegegeven Pokémon niet null zijn. Indien er 1 null is, dien je een Exception op te werpen.

Bepaal zelf hoe Pokémon vechten (bv. degene met de hoogste average van full-stats). Werk niet enkel met de base-stats, daar deze constant zijn. Het is leuker dat het level ook een invloed heeft (maar ga niet gewoon het level vergelijken).

Alles samen

Genereer 2 willekeurige Pokémon met je generator en laat ze vechten met je battle-methode. Toon wat output aan de gebruiker zodat hij ziet wat er allemaal gebeurt (en gebruik zeker de ShowInfo methode om dit snel te doen). Kan je dit in een loop zetten en wat leuker maken met Pokémon die telkens levelen als ze een gevecht winnen?!

Meer info

Voor de volledige info over Pokémon hun stats. Klik hier.

Bankmanager 2 (Essential)

Breidt de bankmanager oefening uit het vorige hoofdstuk uit met volgende functionaliteiten:

  • Voorzie in je programma een methode SimuleerOverdracht. Je kan aan deze methode 2 Rekening objecten meegeven. Vervolgens zal de methode 5x een willekeurig bedrag van de ene naar de andere rekening sturen, hierbij wisselen de rekeningen om de beurt wie verzender en wie ontvanger is. Wanneer de methode klaar is wordt er niets teruggestuurd.
  • Maak een methode CreeerTienerRekening in je programma. Deze methode geeft een nieuwe rekening terug waar de balans reeds op 50 staat. De methode aanvaardt 1 parameter: de naam van de klant, dat vervolgens in het nieuwe object wordt ingesteld.

Meetlat constructor (Essential)

Vul de Meetlat klasse uit het vorige hoofdstuk aan met een constructor. De constructor laat toe om de lengte in meter als parameter mee te geven. De LengteInMeter write-only property vervang je door een private instantievariabele double lengteInMeter.

lengteInMeter stel je nu in via de parameter die je in de constructor meekrijgt.

Persoonsregistratie (Essential) (GPT)

Deze oefening werd gemaakt (en aangepast nadien) met behulp van volgende GPT en heeft daarom de tag (GPT) achter de titel staan.

Implementeer een systeem voor persoonsregistratie dat gebruik maakt van constructors en object initializer syntax om personen op verschillende manieren te initialiseren.

Ontwerp een klasse Persoon met de volgende eigenschappen: Voornaam, Achternaam, Geboortejaar, en Email. Alle eigenschappen zijn autoproperties.

  • Implementeer een overloaded constructor waarmee je Voornaam Achternaam kan instellen.
  • Voeg een methode toe ToonInformatie() die de informatie van de persoon netjes afdrukt als volgt: "{Voornaam} {Achternaam} geboren in {Geboortejaar} heeft emailadres: {Email}".

Maak een object van Persoon aan en initialiseer de rest van de eigenschappen ( GeboorteJaar en Email) met object initializer syntax. Test de ToonInformatie() methode voor beide objecten om te verifiëren dat alle gegevens correct zijn geïnitialiseerd.

Bibliotheek constructor en static (Essential)

Pas de Bibliotheek klasse aan uit hoofdstuk 9 zodat deze een default constructor heeft. In de default constructor zorg je ervoor dat de Uitgeleend property standaard de huidige tijd krijgt van het moment waarop het object werd aangemaakt.

Voeg ook een overloaded constructor mee die een DateTime object als parameter aanvaardt. Deze parameter zal toegewezen worden aan Uitgeleend. Werp een Exception op indien je een datum in de toekomst meegeeft.

  • Een static methode VeranderAlgemeneUitleenTermijn , die 1 int als parameter aanvaardt.De methode zorgt ervoor dat het aantal dagen dat je boek mag uitlenen veranderd wordt naar de meegeven parameter. Tip: dit zal vereisen dat je een static instantievariabele hebt die je vervolgens in je InleverDatum getter gebruikt.

Digitale kluis (Essential)

Basiskluis

Maak een klasse DigitaleKluis die we gaan gebruiken om een kluis voor te stellen.

De klasse heeft volgende elementen:

  • Een fullproperty Code met private set. De get van deze property zal altijd -666 teruggeven, tenzij CanShowcode op true staat, in dit geval zal de effectieve code worden terug gegeven die in de bijhorende instantievariabele code staat.
  • Een overloaded constructor die als parameter een geheel getal toelaat. Dit getal zal worden toegewezen aan Code en is dus de toegangscode
  • Een autoproperty CanShowCode type bool, om aan te geven of de code van buitenuit kan gezien worden.
  • Een read-only property CodeLevel van type int. Deze property zal het level van de code teruggeven (ongeacht CanShowCode). Het level is eenvoudigweg de effectieve code gedeeld door 1000 als geheel getal (dus indien de code 500 is zal 0 worden teruggegeven, indien de code 2000 is wordt 2 teruggegeven, etc.)
  • Een private variabele aantalPogingen om bij te houden hoe vaak de gebruiker geprobeerd heeft de code te vinden.
  • Een methode TryCode die een geheel getal als parameter aanvaardt. De methode geeft een true terug indien de code correct was, anders false. Deze methode kan gebruikt worden om extern een code te testen , indien deze overeenkomt met de bewaarde code dan zal gemeld worden dat de code geldig is en wordt ook getoond hoeveel keer de gebruiker geprobeerd heeft Deze code is geldig. Aantalpogingen = 5. Indien de gebruiker -666 meegaf dan verschijnt er CHEATER op het scherm. Indien de gebruiker een foute code meegaf dan meldt de methode dat dit een foute code was ("geen geldige code") en wordt het aantal pogingen met 1 verhoogd. Deze methode kan maar 10 keer aangeroepen worden (ongeacht of de juiste code werd meegegeven of niet).Indien dus aantalPogingen 10 of meer is zal er op het scherm verschijnen Je hebt je 10 pogingen opgebruikt.Sorry..

Maak enkele Digitale Kluis objecten aan in je main en test of je bovenstaande klasse correct is geïmplementeerd.

Kluizen kraken

Voeg aan de klasse een static methode BruteForce toe waar je een kluis-object aan kan geven. De methode zal een aantal random codes brute forcen (met een loop die 10 verschillende getallen test) door telkens de TryCode methode van de meegegeven kluis aan te roepen. Wanneer toevallig de juiste code werd gevonden zal het aantal pogingen getoond worden.

Beeld je in dat Bruteforce een student is. Ik maak een kluis-object aan en vertel aan die student niet welke code ik heb gekozen. Vervolgens geef ik hem mijn object en zeg hem "Je krijgt 10 pogingen om met TryCode de kluiscode te raden. Succes!"

Toelichting

De BruteForcemethode is static en heeft dus geen informatie over de interne staat van een Kluis-object. Vind je dit verwarrend? Maak deze methode dan aan in je hoofdprogramma (Program.cs): public static void BruteForce(DigitaleKluis testKluis) en zorg ervoor dat ze daar werkt. De methode zal dus 10 keer TryCode aanroepen op de testKluis, telkens met een andere getal. Enkel wanneer TryCode true teruggeeft weet je dat je de juiste code hebt gevonden (merk op dat de kans erg klein is dat in 10 beurten dit zal gevonden worden).

In je main moet dit dus werken:

DigitaleKluis kluisje = new DigitaleKluis(2342);
BruteForce(kluisje);

Vervolgens verplaats je de methode naar je klasse DigitaleKluis en pas je de aanroep ervan aan in je Main:

DigitaleKluis kluisje = new DigitaleKluis(2342);
DigitaleKluis.BruteForce(kluisje);

Je hebt de oefening nu opgelost :)

Pokémon deel 2 (Essential)

Constructors

Pas de kennis van constructors toe op je Pokémon-project uit het vorige hoofdstuk. Zorg ervoor dat je Pokémon op 3 manieren kunt aanmaken als volgt:

  • Via een default constructor: alle base stats worden daarbij op 10 standaard ingesteld via de constructor
  • Via een overloaded constructor die de gebruiker toelaat om de 6 base stats als parameters mee te geven (bv new Pokemon(45,42,50,65,34,67))
  • Via object initializer syntax waarbij je eender welke base stat etc. kunt instellen (bv new Pokemon(){HP_Base=40, Name="Pikachu"};)

Het is ook logischer dat je van de base_stats een full property met private setter maakt, daar we die waarden nooit nog mogen aanpassen nadat de constructor werd aangeroepen.

Static methoden

  • Verhuis de methoden (GeneratorPokemon en Battle) die je maakte in deel 3 van de Pokémon-opdracht in vorige hoofdstuk naar de klasse Pokemon zelf en test of deze nog steeds werkt. (Is dit een logischere plek?)
  • Voeg enkele static properties met private set toe om bij te houden:
    • Hoe vaak een Pokémon z'n level werd verhoogd (dus telkens bij aanroep van VerhoogLevel)
    • Hoe veel Battles er al zijn geweest (verhoogt telkens Battle wordt uitgevoerd)
    • Hoe vaak een battle resulteerde in gelijkstand (verhoogd bij gelijkstand in Battle)
    • Hoe veel random Pokémon werden aangemaakt (verhoogt telkens GeneratorPokemon wordt aangeroepen)
  • Maak een static methode Info die deze properties als een soort samenvatting naar het scherm stuurt
  • Maak een static property NoLevelingAllowed aan van het type bool. Deze kan van buiten de klasse aangepast worden. Indien deze bool op true staat kunnen Pokémon hun level niet verhoogd worden. Wanneer in dit geval VerhoogLevel wordt aangeroepen zal er een foutboodschap op het scherm komen.

Toon in je hoofdprogramma aan dat je kunt werken met deze static methoden en properties.

Student Kevin Van Rooy maakte volgende applicatie waarbij bovenstaande opgave als initiële inspiratie diende:

Knap gedaan! (click to enlarge)

Natures (PRO)

In generatie 3 werd het concept Natures geïntroduceerd. Afhankelijk van deze eigenschap zullen bepaalde full stats van een Pokémon met 10% verhoogd of verlaagd worden.

Een Pokémon krijgt bij de constructie steeds 1 van de 25 onderstaande natures willekeurig toegewezen en zal vervolgens bij impact hebben op 2 full stats.

Gebruik je kennis van Enum, constructors en properties om dit concept in je Pokemon klasse te implementeren.

NatureVerhoogt met 10%Verlaagt met 10
AdamantAttackSp. Atk
BashfulSp. AtkSp. Atk
BoldDefenseAttack
BraveAttackSpeed
CalmSp. DefAttack
CarefulSp. DefSp. Atk
DocileDefenseDefense
GentleSp. DefDefense
HardyAttackAttack
HastySpeedDefense
ImpishDefenseSp. Atk
JollySpeedSp. Atk
LaxDefenseSp. Def
LonelyAttackDefense
MildSp. AtkDefense
ModestSp. AtkAttack
NaiveSpeedSp. Def
NaughtyAttackSp. Def
QuietSp. AtkSpeed
QuirkySp. DefSp. Def
RashSp. AtkSp. Def
RelaxedDefenseSpeed
SassySp. DefSpeed
SeriousSpeedSpeed
TimidSpeedAttack

Het is aangeraden dat je met een extra methode werkt die een waarde 0,10 of -10 zal teruggeven. Deze methode kan je dan gebruiken in de get van je full stat properties zodat deze code zo compact mogelijk blijft.

Volgende artikel lijst de natures op en beschrijft hoe ze werken

(meer indepth informatie in dit artikel)

Sport simulator

Haal je Sportspeler klasse van van het vorige hoofdstuk boven en voeg volgende statische methode er aan toe (vervang het soort speler door de naam van jouw klasse. Mijn klasse noemde Waterpolospeler)

Schrijf een methode genaamd:

static void SimuleerSpeler(Waterpolospeler testspeler)

(vervang dus Waterpolospeler door de klasse die je zelf hebt gemaakt)

De SimuleerSpeler-methode zal beide methoden van je klasse telkens 3x aanroepen m.b.v. een for-loop in de methode (dus in mijn geval 3x GooiBal en 3xWatertrappen)

Test je methode door 2 objecten aan te maken en telkens mee te geven als parameter.

Maak een tweede methode

static void SimuleerWedstrijd(Waterpolospeler speler1, Waterpolospeler speler2)

Bij aanroep van de methode verschijnt er op het scherm wie van beide speler zou winnen als ze zouden spelen. Gebruik een random uitkomst om te bepalen over speler 1 of 2 wint. Toon op het scherm "Speler 1 wint." Gevolg door de aanroep van iedere methode van die speler.

Maak een derde methode

static Waterpolospeler BesteSpeler(Waterpolospeler speler1, Waterpolospeler speler2)

Deze methode gaat ook random bepalen welke speler de beste is. Vervolgens geef je deze speler terug als resultaat. In de main roep je vervolgens iedere methode van dit object aan.

Prijzen met foreach

Maak een array die tot 20 prijzen (double) kan bewaren. Vraag aan de gebruiker om 20 prijzen in te voeren en bewaar deze in de array. Doorloop vervolgens m.b.v. een foreach-lus de volledige array en toon enkel de elementen op het scherm wiens prijs hoger of gelijk is aan €5.00. Toon op het einde van het programma het gemiddelde van alle prijzen (dus inclusief de lagere prijzen).

Computer-winkel (Essential)

Een firma heeft een grote lijst met computeronderdelen en wil hier de nodige filters op kunnen toepassen.

Computeronderdeel

De klasse computeronderdeel bestaat uit volgende autoproperties:

  • Prijs (int)
  • ID (int)
  • InDoos (bool)

Voorts heeft de klasse een default constructor die voorgaande autoproperties op willekeurige waarden instelt (prijs positief tot max 1000, ID een getal tussen 100 en 999, en InDoos heeft 50% kan om true te zijn)

De klasse heeft 1 methode ToonInfo die de 3 waarden van het object naar het scherm stuurt:

Prijs: 845, ID: 45, InDoos: true

Filteren

Maak in je hoofdprogramma een List dat je vult met 100 willekeurige aangemaakte objecten. Vervolgens:

  • Roep de ToonInfo methode aan van ieder computeronderdeel in de lijst aan.
  • Roep de ToonInfo methode aan van ieder computeronderdeel met een prijs boven de 400.
  • Idem nu voor alle onderdelen die in een doos zitten.
  • Idem nu voor alle onderdelen die een even ID hebben én wiens prijs onder de 200 ligt.

Tussen iedere filter toon je op het scherm wat de volgende lijst juist voorstelt (bv "Nu tonen we alle onderdelen in een doos").

Managen

Vraag nu aan de gebruiker wat er met de lijst moet gebeuren:

  1. Alle objecten in een doos verwijderen
  2. Alle objecten met een prijs kleiner dan 100 verwijderen.

Toon het resultaat van de aangepaste lijst (door de ToonInfo van ieder object in de lijst aan te roepen.)

Finale

Kan je hier een volledige applicatie van maken die een computerfirma als een soort inventaristool kan gebruiken? (en dus met de nodige menu's en mogelijkheden om bijvoorbeeld een nieuw onderdeel toe te voegen.) Kijk zeker eens naar volgende oefening daaromtrent.

Dit soort "de array als inventaris"-oefeningen waarbij je allerlei zaken met die array moet doen zijn geliefkoosde oefeningen en zal je vaak zien terugkomen.

Pokédex

Maak een eenvoudige Pokédex (een "bibliotheek van pokémon") die als volgt werkt. De gebruiker kan kiezen uit 5 menu-opties:

  1. Voeg Pokémon toe. Deze optie zal een random Pokémon object aanmaken en achteraan de Pokédex toevoegen.
  2. Toon Pokédex. Deze optie zal alle pokémon in de pokédex op het scherm tonen door de ShowInfo methode van ieder object in de lijst aan te roepen.
  3. Remove random: deze optie zal een pokémon op een willekeurige plek in de lijst verwijderen.
  4. Verwijder alles: deze optie zal de pokédex leeg maken.
  5. Stoppen: het programma sluit af.

Het menu blijft getoond worden tot de gebruiker de optie 5 kiest.

Pokédex++ (PRO)

Bekijk het voorbeeld in dit artikel. Kan je je pokédex van zonet integreren met deze informatie?

Student Organizer (Essential)

We gaan nu de Student-klasse uit een vorige hoofdstuk (zie onderaan de opgave) gebruiken om een List<Student> van studenten te vullen.

Maak daarom een studenten-lijst aan die 5 studenten bevat :

Initialiseer alle properties van iedere student op een standaard-waarde via de default constructor.

Het programma start op en geeft de gebruiker een menu waaruit kan gekozen worden:

  1. Student gegevens invoeren (eerstvolgende student wordt ingevuld) Vervolgens moet de gebruiker kiezen welke student (nummer) moet ingevuld worden, van 1 tot 5. Vervolgens kan de gebruiker de gegevens 1 voor 1 invullen (oude gegevens worden zonder pardon overschreven).

  2. Student gegevens tonen (alle studenten) Wanneer de gebruiker voor 2 kiest dan wordt de GeefOverzicht-methode aangeroepen van iedere student zodat de 5 ‘rapportjes’ onder elkaar op het scherm

Extra's: Bouw extra functionaliteit naar keuze bij de StudentOrganizer, zoals:

  • Vragen aan de gebruiker of de oude gegevens overschreven mogen worden, indien deze reeds ingevuld zijn.
  • Inbouwen van een eenvoudige zoekfunctie. Je kan bijvoorbeeld zoeken op naam (exacte invoer) of alle studenten tonen die in een bepaalde klas zitten of wiens punten onder/boven een bepaalde waarde zitten. Je kan dit als extra menuitem inbouwen, waarbij een nieuw menu verschijnt dat de gebruiker de verschillende zoekmogelijkheden voorstelt.
  • Verwijderen van een student (waarbij alle gegevens worden gewist)
  • Controle in alle methode inbouwen zodat ‘lege studenten’ worden genegeerd. Wanneer bijvoorbeeld menu item 2 wordt uitgevoerd (alle studenten tonen) dan worden enkel de ingevulde studenten getoond.

StudentKlasse

enum Klassen { EA1, EA2, EA3, EA4}

class Student
{
    public string Naam { get; set; }
    public int Leeftijd { get; set; }
    public Klassen Klas { get; set; }

    public int PuntenCommunicatie { get; set; }
    public int PuntenProgrammingPrinciples { get; set; }
    public int PuntenWebTech { get; set; }

    public double BerekenTotaalCijfer()
    {
        return (PuntenCommunicatie + PuntenProgrammingPrinciples + PuntenWebTech) / 3.0;
    }

    public void GeefOverzicht()
    {
        Console.WriteLine($"{Naam}, {Leeftijd} jaar");
        Console.WriteLine($"Klas: {Klas}");
        Console.WriteLine();
        Console.WriteLine("Cijferrapport");
        Console.WriteLine("*************");
        Console.WriteLine($"Communicatie:\t\t{PuntenCommunicatie}");
        Console.WriteLine($"Programming Principles:\t{PuntenProgrammingPrinciples}");
        Console.WriteLine($"Web Technology:\t\t{PuntenWebTech}");
        Console.WriteLine($"Gemiddelde:\t\t{BerekenTotaalCijfer():0.0}");
    }
}

Je kan aan de gebruiker enkel strings als input vragen. Om dus zijn ingevoerde klas om te zetten naar een enum gebruik je ofwel: a) een switch of if-else structuur die naargelang de invoer een andere enumwaarde toekent aan een enumvariabele b) (PRO) je gebruikt Enum.Parse() (vb : Klassen mijnKlas= (Klassen)Enum.Parse(typeof(Klassen), "EA2");)

Bookmark Manager

Maak een "bookmark manager". Deze tool zal in de console aan de gebruiker 5 favoriete sites vragen: naam en url. Vervolgens zal de tool alle sites in een lijst tonen met een nummer voor. De gebruiker kan dan de nummer intypen en de tool zal automatisch de site in een vereenvoudigde versie op het scherm tonen.

Je opdracht:

  1. Maak een array of List waarin je 5 bookmark objecten kan plaatsen.
  2. Vul de applicatie aan zodat de gebruiker: een bestaand bookmark kan verwijderen en een bestaand bookmark kan aanpassen

Probeer met behulp van hulpmethoden in Program.cs om zo veel mogelijk code te herbruiken.

Enkele zaken die je nodig hebt:

BookMark klasse:

class BookMark
{

    public string Naam { get; set; }
    public string URL { get; set; }
    public void ToonSite()
    {
        WebClient wc = new WebClient();
        string result = wc.DownloadString(URL);
        Console.WriteLine(GetPlainTextFromHtml(result));
    }
    //Bron: https://www.mercator.eu/mercator/std/info_aruba/reporting-hoe-gegevens-afdrukken-met-html-tags.html
    private string GetPlainTextFromHtml(string htmlString)
    {
        string htmlTagPattern = "<.*?>";
        var regexCss = new Regex("(\\<script(.+?)\\</script\\>)|(\\<style(.+?)\\</style\\>)", RegexOptions.Singleline | RegexOptions.IgnoreCase);
        htmlString = regexCss.Replace(htmlString, string.Empty);
        htmlString = Regex.Replace(htmlString, htmlTagPattern, string.Empty);
        htmlString = Regex.Replace(htmlString, @"^\s+$[\r\n]*", "", RegexOptions.Multiline);
        htmlString = htmlString.Replace("&nbsp;", " ");
        return htmlString;
    }
}

Voorbeeld van hoe de bookmark klasse zal werken:

BookMark u = new BookMark();
u.Naam = "Google";
u.URL = "https://www.google.be";
u.ToonSite();

Kan je je eigen "console browser" maken?

Speelkaarten

Maak een klasse Speelkaart die je kan gebruiken om een klassieke kaart met getal en "kleur" voor te stellen.

  • Een kaart heeft 2 eigenschappen, een getal van 1 tot en met 13 (boer=11, koningin= 12, heer= 13).
  • Een kleur, de zogenaamde suite. Deze stel je voor via een enumtype en kan als waarden Schoppen, Harten, Klaveren of Ruiten zijn.

Schrijf nu 2 loops die de 52 kaarten van een standaard pak in een List<SpeelKaart> lijst plaatst.

Maak een applicatie die telkens een willekeurige kaart uit de stapel trekt en deze aan de gebruiker toont. De kaart wordt na het tonen ook uit de lijst verwijderd. Door met een willekeurig getal te werken hoef je dus je deck niet te schudden.

OO Textbased game (PRO)

Bij de all-in-one projecten van dit semester vind je als eerst een tekstgebaseerde game (hier). Volg deze uitleg, maak het spel en voeg je eigen zotte ideeën toe.

Gecombineerde oefeningen hoofdstukken 9 tot en met 12

Volgende opgaven waren ooit examenopgaven:

Wil je de leerstof op een andere manier leren gebruiken? Bekijk dan eens de Corona Files oefeningen. Merk op dat de corona files niet zo diepgaand zijn als de andere oefeningen, maar mogelijk wel boeiender. Het is wel zo dat iedere week voort werkt op hetgeen je de missie ervoor hebt gemaakt waardoor je dus finaal een lekker groot project zal hebben.

Het dierenrijk

Vereenvoudigde voorstelling van (een deel van het) dierenrijk

Maak bovenstaande klassenhierarchie na. Animal is de parentklasse , mammal en reptile zijn childklassen van Animal en zo voort.

Verzin voor iedere klasse een property die de parent klasse niet heeft. (bv Animal heeft "BeweegVoort", Reptile heeft "AantalSchubben", etc).

Voorzie in de klasse Animal een virtual methode ToonInfo die alle properties van de klasse op het scherm zet. De overgeërfde klassen overriden deze methode door de extra properties ook te tonen (maar gebruik base.ToonInfo om zeker de parentklasse werking te bewaren).

Maak nu van iedere klasse een object en roep de ToonInfo methode van ieder object aan.

Plaats deze dieren nu in een List<Animal> en kijk wat er gebeurt als je deze met een foreach aanroept om alle ToonInfo-methoden van ieder dier te gebruiken.

Ziekenhuis (Essential)

Deel 1

Maak een basisklasse Patient die een programma kan gebruiken om de doktersrekening te berekenen. Een patiënt heeft:

  • een naam
  • het aantal uur dat hij in het ziekenhuis heeft gelegen

Een virtual methode BerekenKost zal de totaalkost berekenen en teruggeven. Deze bestaat uit 50euro+ 20euro per uur dat de patiënt in het ziekenhuis lag.

Maak een methode ToonInfo die steeds de naam van de patiënt toont gevolgd door het aantal uur en z'n kosten.

Deel 2

Maak een specialisatieklasse VerzekerdePatient. Deze klasse heeft alles dat een gewone Patient heeft, echter de berekening van de kosten zal steeds gevolgd worden door een 10% reductie.

Toon de werking aan van deze klasse.

HiddenBookmark

Voeg een HiddenBookmark klasse toe aan je bestaande Bookmark Manager applicatie van vorige hoofdstuk.

De HiddenBookmark is een Bookmark klasse die de ToonSite methode override door VOOR en NA dat de site op het scherm werd getoond er de tekst **********INCOGNITO MODE************ getoond wordt

Test wat er gebeurt als je al je bookmarks vervangt door HiddenBookmarks.

Ballspel met overerving

Deze oefening bouwt verder op het Pong spel uit hoofdstuk 9 van het handboek.

Volgende code toont hoe we een bestaande klasse Ball kunnen overerven om een bestuurbare bal te maken

Basisklasse Ball

We maken een klasse Ball die via Update en Draw zichzelf over het consolescherm beweegt. Enkele opmerkingen:

  • We maken sommige variabelen protected zodat later de overgeërfde klassen er aan kunnen
  • Een static methode CheckHit laat ons toe te ontdekken of twee Ballobjecten mekaar raken
class Ball
{
   public int X { get { return x; } }
   public int Y { get { return y; } }
   private int x = 0;
   private int y = 0;
   protected int vx = 0;
   protected int vy = 0;
   protected char drawChar = 'O';
   protected ConsoleColor drawColor = ConsoleColor.Red;

   public Ball(int xin, int yin, int vxin, int vyin)
   {
      x = xin;
      y = yin;
      vx = vxin;
      vy = vyin;
   }

   public void Update()
   {
      x += vx;
      y += vy;
      if (x >= Console.WindowWidth || x < 0)
      {
            vx *= -1;
            x += vx;
      }
      if (y >= Console.WindowHeight || y < 0)
      {
            vy *= -1;
            y += vy;
      }
   }
   public void Draw()
   {
      Console.SetCursorPosition(x, y);
      Console.ForegroundColor = drawColor;
      Console.Write(drawChar);
      Console.ResetColor();

   }

   static public bool CheckHit(Ball ball1, Ball ball2)
   {

      if (ball1.X == ball2.X && ball1.Y == ball2.Y)
            return true;

      return false;
   }
}

Specialisatie klasse PlayerBall

De overgeërfde klasse PlayerBall is een Ball maar zal z'n vx en vy updaten gebaseerd op input via de ChangeVelocity methode:

class PlayerBall : Ball
{
   public PlayerBall(int xin, int yin, int vxin, int vyin) : base(xin, yin, vxin, vyin)
   {
      drawChar = 'X';
      drawColor = ConsoleColor.Green;
   }

   public void ChangeVelocity(ConsoleKeyInfo richting)
   {
      switch (richting.Key)
      {
            case ConsoleKey.UpArrow:
               vy--;
               break;
            case ConsoleKey.DownArrow:
               vy++;
               break;
            case ConsoleKey.LeftArrow:
               vx--;
               break;
            case ConsoleKey.RightArrow:
               vx++;
               break;
            default:
               break;
      }
   }
}

Eenvoudig spel

We maken nu een rudimentair spel waarin de gebruiker een bal moet proberen te raken.

static void Main(string[] args)
{
   Console.CursorVisible = false;
   Console.WindowHeight = 20;
   Console.WindowWidth = 30;
   Ball b1 = new Ball(4, 4, 1, 0);
   PlayerBall player = new PlayerBall(10, 10, 0, 0);
   while (true)
   {

         Console.Clear();

         //Ball
         b1.Update();
         b1.Draw();
         
         //SpelerBall
         if (Console.KeyAvailable)
         {
            var key = Console.ReadKey();
            player.ChangeVelocity(key);
         }

         player.Update();
         player.Draw();
         
         //Check collisions
         if (Ball.CheckHit(b1, player))
         {
            Console.Clear();
            Console.WriteLine("Gewonnen!");
            Console.ReadLine();
         }
         System.Threading.Thread.Sleep(100);
   }
}

Kan je dit uitbreiden met?

  • Ballen met andere eigenschappen
  • Meerdere ballen die over het scherm vliegen (benodigdheden: array )
  • Meerdere levels
  • Score gebaseerd op tijd die gebruiker nodig had om bal te raken (benodigdheden: teller die optelt na iedere Sleep)
  • PRO: collision detection tussen de ballen

Nu je overerving in de vingers krijgt, is het tijd om de ingebouwde "Class designer" van Visual Studio eens te bekijken. Volgende kennisclip toont hoe je deze handige tool kunt installeren en gebruiken: Class diagram en de class designer in Visual Studio

Extra ToString aan bestaande projecten

Voeg ToString toe aan bestaande van volgende projecten. Ik raad aan dat je dit even test in een nieuwe applicatie waarin je de bestaande klasse even toevoegt en niet de hele main overneemt.

Pokémon extra

Implementeer de ToString() methode in je Pokemon klasse zodat deze z'n full stats toont wanneer je schrijft:

Console.WriteLine(myPokemon);

Bookmark extra

Implementeer de ToString() methode in zowel de Bookmark als de HiddenBookmark klasse. Bij bookmark moet de output bestaan uit de titel van de site, gevolgd door de url tussen haakjes, bv:

Google (www.google.com)

Bij HiddenBookmark wordt er achteraan nog "---HIDDEN---" gezet:

Reddit (www.reddit.com)  ---HIDDEN---

Zorg ervoor dat er géén dubbele code in HiddenBookmark staat (tip: base()).

Boek (Essential)

Maak een klasse Boek en gebruik auto-properties voor de velden:

  • ISBN (long)
  • Titel (string)
  • Auteur (string)

Maak voorts een full property voor Prijs (double)

Maak een child-klasse die van Boek overerft genaamd TekstBoek. Een TekstBoek heeft één extra property:

  • SchoolGraad (int)

Maak een child-klasse die van Boek overerft genaamd KoffietafelBoek. Deze klasse heeft geen extra velden.

Voorts kunnen boeken "opgeteld" worden om als omnibus uitgebracht te worden. De titel wordt dan "Omnibus van X". waarbij X de Auteurs bevat, gescheiden met een komma. De prijs van een Omnibus is steeds de som van beide boeken gedeeld door 2. Schrijf een static methode TelOp die twee Boek objecten als parameter aanvaardt en als returntype een nieuw Boek teruggeeft. Deze methode voeg je toe aan de klasse Boek

In beide child-klassen, override de Prijs-setter zodat: a) Bij TekstBoek de prijs enkel tussen 20 en 80 kan liggen b) Bij KoffietafelBoek de prijs enkel tussen 35 en 100 kan liggen

PRO: Bekijk gerust de appendix indien je wilt weten hoe je de + operator kunt overriden om boeken op te tellen.

  • Zorg ervoor dat boeken de ToString overriden zodat je boekobjecten eenvoudig via Console.WriteLine(mijnBoek) hun info op het scherm tonen. Ze tonen deze info als volgt: "Titel - Auteur (ISBN) _ Prijs" (bv The Shining - Stephen King (05848152) _ 50)

Maak boeken aan van de 3 klassen, toon dat de prijs niet altijd zomaar ingesteld kan worden.

Money, money, money (Essential)

Maak enkele klassen die een bank kan gebruiken (of hergebruik je BankManager code uit hoofdstuk 1)

  1. Abstracte klasse Rekening: deze bevat een methode VoegGeldToe en HaalGeldAf. Het saldo van de rekening wordt in een private variabele bijgehouden (en via de voorgaande methoden aangepast) die enkel via een read-only property kan uitgelezen worden. Voorts is er een abstracte methode BerekenRente de rente als double teruggeeft.
  2. Een klasse BankRekening die een Rekening is. De rente van een BankRekening is 5% wanneer het saldo hoger is dan 100 euro, zoniet is deze 0%.
  3. Een klasse SpaarRekening die een Rekening is. De rente van een SpaarRekening bedraagt steeds 2%.
  4. Een klasse ProRekening die een SpaarRekening is. De ProRekening hanteert de Rente-berekening van een SpaarRekening (base.BerekenRente) maar zal per 1000 euro saldo nog eens 10 euro verhogen.

Schrijf deze klassen en toon de werking ervan in je main.

Geometric figures (Essential)

Maak een abstracte klasse GeometricFigure. Iedere figuur heeft een hoogte, breedte en oppervlakte. Maak autoproperties voor van Hoogte en Breedte. De Oppervlakte is een read-only property want deze wordt berekend gebaseerd op de hoogte en breedte. Deze berekening gebeurt in de methode BerekenOppervlakte: deze roep je met andere woorden aan in de getter van Oppervlakte en dat resultaat geeft de getter terug

Let er dus op dat Oppervlakte enkel een getter heeft. Een Setter schrijven zou vreemde bugs geven: wat als de gebruiker de Oppervlakte van de figuur zo aanpast, maar wel andere hoogte en breedte heeft ingesteld? Je zou dan een foute oppervlakte krijgen daar die niet berekend wordt.

Voorzie een abstracte methode BerekenOppervlakte die een int teruggeeft.

Maak 3 klassen:

  • Rechthoek: erft over van GeometricFigure. Oppervlakte is gedefinieerd als breedte * hoogte.
  • Vierkant: erft over van Rechthoek. Voorzie een constructor die lengte en breedte als parameter aanvaard: deze moeten gelijk zijn, indien niet zet je deze tijdens de constructie gelijk. Voorzie een 2e constructor die één parameter aanvaardt dat dan geldt als zowel de lengte als breedte. Deze klasse gebruikt de methode BerekenOppervlakte van de Rechthoek-klasse.
  • Driehoek: erft over van GeometricFigure. Oppervlakte is gedefinieerd als breedte*hoogte/2.

Maak een applicatie waarin je de werking van deze klassen aantoont

Dierentuin

Maak een console-applicatie waarin je een zelfverzonnen abstract klasse Dier in een List kunt plaatsen. Ieder dier heeft een gewicht en een methode Zegt (die abstract is) die het geluid van het dier in kwestie op het scherm zal tonen. Maak enkele childklassen die overerven van Dier en uiteraard de Zegt methode overriden.

Plaats enkele dieren in de nieuw aangemaakt lijst. Vervolgens verschijnt er een menu Wanneer de gebruiker 'q' kiest stopt het programma.Het keuze menu heeft volgende opties:

  1. Dier verwijderen , gevolgd door de gebruiker die invoert het hoeveelste dier weg moet uit de List.
  2. Diergewicht gemiddelde: het gemiddelde van alle dieren hun gewicht wordt getoond
  3. Dier praten: alle dieren hun Zegt() methode wordt aangeroepen en via WriteLine getoond
  4. Opnieuw beginnen: de List wordt leeggemaakt en het programma zal terug van voor af aan beginnen. Waarbij de lijst terug gevuld wordt met enkele start dieren.

Probeer zo modulair mogelijk te werken.

UML naar code

Kan je volgende 2 UML-diagrammen implementeren in code? Uiteraard kan je dat: make it happen!

Iedereen bestaat nog steeds uit een hoofd, handen en benen bron

Een groter compositievoorbeeld bron

Politiek (Essential)

Maak een programma om de politieke situatie van een land te simuleren.

Maak volgende klassen:

  • Land
  • Minister
  • President

Minister

Een Minister heeft geen speciale eigenschappen. Enkel een autoproperty om de Naam van de minister in bij te houden

President

Een President is een minister maar met 1 extra property met private setter: hij heeft een Teller (autoproperty type int) die start op 4 alsook een methode JaarVerderdie deze teller bij iedere aanroep met 1 verlaagt.

Land

  • Een land heeft 0 of 1 president (of koning, kies zelf)
  • Een land heeft 0 of 1 eerste minister
  • Een land heeft 0 tot 4 ministers (via een List<Minister>)

Al deze compositieobjecten zijn private. Een land heeft volgende publieke methoden:

MaakRegering

Deze methode aanvaardt volgende parameters:

  1. 1 president object die aan de private president variabele wordt toegekend

  2. Een List<Minister> object waarin tussen de 1 tot en met 5 ministers in staan: de eerste minister in de lijst wordt toegewezen aan de private eerste minister variabele. De overige ministers in de lijst worden aan de private lijst van ministers toegewezen.

Deze methode zal enkel iets doen indien er geen president in het land is (null). Indien er reeds een regering is dan zal er een foutboodschap verschijnen.

JaarVerder

Deze methode aanroepen zal de JaarVerder aanroepen op de president indien deze er is (en dus niet null is). Deze methode controleert ook of de Teller van de president na deze aanroep op 0 staat. Als dat het geval is dan worden alle ministers en president in het land op null gezet.

Eindfase

Controleer je klasse Land door enkele ministers en een president te maken en deze in een object van het type Land via MaakRegering door te geven. Test dan wat er gebeurt indien je enkele malen JaarVerder op het land aanroept.

Verkiezingen

Maak klasse VerkiezingsUitslag. Deze klasse heeft een default constructor die volgende twee properties random waarden zal geven:

  • Een full property met private set VerkozenPresident van het type President.
  • Een full property met private set VerkozenMinisters van het type List<Minister>.

Maak in je hoofdprogramma een VerkiezingsUitslag-object aan en gebruik deze om de MaakRegeringmethode van je Land van de nodige informatie te voorzien.

Moederbord

Maak een klasse Moederbord die een, je raadt het nooit, moederbord van een computer voorstelt. Kies een van de vele moederborden die je online vindt (enkele voorbeelden) en bekijk uit welke delen een moederbord bestaat ('heeft een').

Maak voor ieder deel een aparte klasse. Voorzie vervolgens via compositie de nodige objecten in je moederbord. Denk er aan dat je bijvoorbeeld 2 (of 4) RAM-slots hebt en dus hier ofwel een array moet voorzien van het type List<RAM>, oftewel twee aparte delen RAMSlot1 en RAMSlot2.

Maak een methode TestMoederbord in de klasse Moederbord. Wanneer je deze aanroept zal deze weergeven welke onderdelen nog leeg zijn (==null).

Iedere module moet via een property langs buiten ingesteld worden. (beeld je in dat je effectief een moederbord ineenknutselt):

Moederbord Z390E_GAMING = new Moederbord();
Z390E_GAMING.AGP= new AGPSlot("GeForceRTX2080");
Z390E_GAMING.CPU= new CPUSlot("IntelCorei9_9900K");
//etc.

Kan je zelf een computer samenstellen door enkele objecten van verschillende types aan te maken en deze aan je moederbord-object toe te wijzen?

Risk

Land

In het bordspel Risk heeft ieder Land-object volgende eigenschappen:

  • Naam van het land
  • Lijst met buurlanden
  • Leger dat in het land gestationeerd staat.

De referenties in deze beide zijn aggregaties: wanneer het land verdwijnt dan verdwijnen niet de buurlanden en ook niet de legers die er op gestationeerd zijn (ze kunnen gewoon naar een ander land bewegen).

Voorts implmenteert het de ToString methode en zal het de informatie oplijsten als volgt:

*[Naamland] (Buurlanden:[oplijsten buurlanden, enkel de naam]) . Grootte gestationeerd leger: *[grootte van het leger]

Leger

De Leger klasse heeft een capaciteit (sterkte) die enkel positief kan zijn.

Ieder Leger-objecthoudt via een referentie ook bij waar het leger gestationeerd is (referentie naar het Land-object).

Bordspel

Maak een klasse Bordspel dat een lijst van Land-objecten bevat (dit is compositie: wanneer het bordspel in brand wordt gestoken dan zijn ook de landen er op weg).

Maak een vereenvoudigde voorstelling van de landkaart met de Bordspel klasse, enkele Land-objecten en enkele legers.

Voeg aan de Bordspel klasse een methode "ToonKaart": deze methode zal de landen in de lijst onder elkaar schrijven (via de ToString methode van Land).

Maak een methode VerplaatsLeger dat 2 referenties naar 2 landen aanvaardt. Wanneer de aanroept gebeurt zal eerst gecontroleerd worden of het eerste land een leger bevat (zoniet wordt er een exception opgeworpen). Indien dit in orde is dan zal het leger in kwestie verhuizen naar 2e land op voorwaarde dat daar ook geen leger al is. Als dat wél het geval is dan wordt het leger in het eerste land verwijderd, en wordt de capaciteit van het 2e leger verhoogd met die van het eerste leger.

(PRO) Textbased RPG

Bekijk het volgende All-in-One project :OO Textbased Game.

Dit project gebruikt alle materie tot en met dit hoofdstuk. Kan je dit project maken én , belangrijker, uitbreiden met nieuwe functionaliteit?

Dierentuin advanced

Voeg een filter toe aan de dierentuin applicatie uit een eerder hoofdstuk:

  • Filter praten: er wordt gevraagd welke dieren moeten praten (Koe, Slang of Varken) vervolgens zullen enkel die dieren praten (tip: "is" operator).

Pokémon vergelijken

Implementeer de Equals methode (via override) in je Pokemon klasse. Twee Pokémon zijn dezelfde indien volgende zaken gelijk zijn:

  • Basis stats
  • Naam
  • Level

Een eigen huis (Essential)

Gebruik compositie én overerving om een klasse Huis te voorzien van enkele kamers, waarbij iedere kamer een klasse op zich is (denk aan BadKamer, Salon, etc). Alle kamers erven over van de klasse Kamer. Iedere kamer heeft een oppervlakte (in vierkante meter), een naam en prijs. Standaard is de prijs van een kamer 400euro, maar mogelijke child-klassen zullen deze property soms overriden. De Prijs is een readonly property (zonder setter, en heeft ook geen achterliggende instantievariabele).

Maak minstens volgende klassen:

  • Badkamer: kost 500 euro
  • Gang: kost 10euro per vierkante meter dat deze kamer groot is
  • Salon: kost 300 euro indien er geen schouw aanwezig is (via bool bijhouden) anders 500euro

De klasse Huis heeft een lijst van kamers. De klasse heeft ook een methode BerekenPrijs die de totale prijs van het huis berekent gebaseerd op de prijzen van iedere kamer in de lijst.

Test je klasse door enkele huizen te maken en er enkele kamers in te plaatsen (bepaal zelf hoe je de kamers aan het huis toevoegt: via methode, constructor, etc) en vervolgens de prijs ervan te tonen.

Mapmaker

Voorzie een Teken methode die een huis kan tekenen, gebruikmakend van de Teken-methoden van de kamers. Hiervoor dien je een X en Y coördinaat per , alsook lengte en breedte per huis én kamer te hebben zodat je deze op de juiste plekken op het scherm kan plaatsen.

Kan je ervoor zorgen dat een architect nieuwe kamers kan toevoegen en verwijderen?

Magic

Bekijk de vraag en het goedgekeurde antwoord op volgende pagina

Kan je de manager aanpassen zodat deze niet met card1 en card2 werkt, maar met een List<Card>.

Voeg zelf enkele kaarten toe en verzin ook enkele afgeleide Card-types , bv Land en Artifact.

Ganzenbord Dams Van Camp editie (Essential)

Bordspelen zoals Ganzenbord of Monopoly zijn goede oefeningen om je polymorfisme mee te oefenen. Het speelbord is niet meer dan een lijst van objecten, met ieder vakje een object in die lijst. Echter, sommige vakjes kunnen meer dan andere en je lijst bevat dus objecten van verschillende child-klassen die allemaal overerven van een basisklasse Vakje of iets dergelijks. Volgende opgave uit een oud examen toont dit. Kan je deze oefening maken?

Volgende opgave komt uit de vaardigheidsproefopdracht voor 2e zit examen van dit vak (OOP) in augustus 2021.

Intro

De kinderen van meneer Dams en Van Camp spelen graag Ganzenbord. Laatst toen we speelden vroegen ze zich af of mijn studenten eigenlijk ganzenbord zouden kunnen programmeren? "Uiteraard!" antwoordde meneer Dams. "Weliswaar een vereenvoudigde versie, maar toch. Ze zouden dat wel kunnen, ja", vulde hij fier aan.

En hier zit je nu dus, opgescheept met het programmeren van de basisfunctionaliteit van ganzenbord voor 1 speler (geen flauw benul hoe ganzenbord werkt? Geen probleem! Alles wordt duidelijk doorheen de opgave!)

Ganzenbord single player edition

Ganzenbord, the single player edition, wordt gespeeld door één speler die moet proberen zo ver mogelijk te geraken op een traject van vakjes. Sommige vakjes doen iets met de speler wanneer deze op het vakje belandt (bijvoorbeeld een stapje vooruit), anderen doen niets.

Het bord wordt aan de start van ieder spel random aangemaakt. De speler moet een dobbelsteen werpen om te weten hoeveel stappen z'n pion vooruit zal gaan. De speler verdient punten hoe verder hij geraakt.

Te maken klassen

Dobbelsteen

Deze eenvoudige klasse heeft een statische methode Rol en geeft een willekeurig getal, namelijk 1, 2 of 3.

Speelvakje

Het spelbord zal opgebouwd worden door een reeks van speelvakjes. Daarom maken we eerst dit vakje.

Een vakje wordt gedefinieerd door:

  • Een read-only int-property BeweegVakjes (met private set): deze eigenschap geeft aan hoeveel vakjes vooruit (positief) of achteruit (negatief) de speler zal gaan als op dit vakje wordt geland.
  • Een default constructor die de BeweegVakjes instelt op een waarde als volgt:
    • 30% kans op +1 of +2
    • 20% kans op -1 of -2
    • 50% kans op 0
  • Een virtuele methode ToonVakje dat op de huidige locatie van de cursor in de console de BeweegVakjeswaarde van het vakje op het scherm schrijft. Indien de waarde positief of 0 is, toon je dit met een + voor. Bijvoorbeeld: +2 of +0. Een negatief toon je met de - , zoals -2.

Ganzenbord

Een ganzenbord heeft altijd een lijst,SpeelVakjes van 10 Speelvakje-objecten. Deze zijn niet publiek zichtbaar.

Een ganzenbord heeft:

  • Een default constructor die de lijst vult met 10 Speelvakje-objecten.
  • Een instantievariabele pionIndex die aangeeft op welke vakje in de lijst de speler zich momenteel bevindt.
  • Een autoproperty HuidigeScore die standaard op 0 staat.
  • Een methode BeweegPion die een int als parameter aanvaardt en een bool teruggeeft. De werking van de methode wordt verderop uitgelegd.
  • Een methode TekenBord die het ganzenbord op het scherm toont zoals verderop uitgelegd.

BeweegPion()

Deze methode zal de speler voortbewegen op het bord en laten weten of de speler het einde heeft gehaald heeft of niet.

De speler kan een getal (het getal dat hij met de dobbelsteen verderop zal rollen) aan deze methode meegeven zodat het volgende gebeurt:

De pionIndex wordt verhoogd met het getal dat wordt meegeven, vervolgens:

  • Indien pionIndex hierdoor hoger wordt dan 9 en dus voorbij het laatste vakje wordt gegaan, dan wint de speler en wordt eerst de HuidigeScore met 10 verhoogd en wordt vervolgens true teruggegeven om aan te geven dat de speler gewonnen is.
  • Indien pionIndex eindigt op een getal 8 of lager, dan gebeurt het volgende:
    • In de lijst van SpeelVakje-objecten wordt gekeken op welk vakje de speler is aangekomen. De BeweegVakjes waarde van dit vakje wordt bijgeteld of afgetrokken van pionIndex. Dit wordt de nieuwe locatie van de speler. Er gebeurt niets meer na het belanden op dit nieuwe vakje (ook al is het een vakje waar vooruit of achteruit zou moeten gegaan worden).
    • De methode geeft false terug indien pionIndex terug een getal tussen 0 en 8 wordt, anders true indien hoger dan 8 (hij is dan gewonnnen-. Indien de speler op een index onder 0 belandt wordt false teruggegeven, wordt de score met 10 verlaagd én wordt de pionIndex finaal op 0 teruggezet (reset), ongeacht waar de speler op negatief belandde.

TekenBord()

Deze methode zal de 10 vakjes naast elkaar op het scherm visualiseren door de lijst SpeelVakjes te overlopen en van ieder object de ToonVakje methode aan te roepen. Vervolgens wordt de pionIndex locatie gebruikt om dat vakje op het scherm te overschrijven met een 'T'

Indien de speler dus op index 3 (het vierde vakje) zit van een willekeurig bord, dan kan de output zijn:

-1+2+1-T+0+0-2+1+1+0

Dus het eerste vakje heeft waarde -1, het volgende 2, het derde 1, het vierde zien we niet want daar staat het mannetje (het was was blijkbaar een negatief vakje) en zien we een T, dan krijgen we twee vakjes met waarde 0.

Main spelloop

De main spelloop werkt als volgt:

  • Een nieuw Ganzenbord object wordt aangemaakt.
  • Een loop wordt gestart die blijft duren tot de speler aan het einde geraakt. Deze loop doet het volgende:
    • Het scherm wordt leeggemaakt.
    • Het spelbord wordt getoond mbv van de TekenBord methode.
    • Een nieuw getal wordt met de Rol methode van de dobbelsteen gerold. Dit getal wordt op het scherm getoond , onder het spelbord Je rolde 2
    • De loop pauzeert nu tot de gebruiker op enter duwt.
    • Het gerolde getal wordt aan de BeweegPion-methode meegeven en het resultaat van die methode wordt gebruikt om te bepalen of de loop nog een iteratie zal doen of niet.
  • Finaal wordt de HuidigeScore van de speler getoond.

Polymorfisme komt er aan

Voeg volgende uitbreidingen toe nadat je een werkend geheel hebt.

Maak een klasse KleurVakje dat overerft van SpeelVakje

Dit vakje doet alles wat een gewoon vakje doet, het zal enkel de ToonVakje method aanvullen zodat het huidige vakje een rode achtergrond met witte letters heeft indien de BeweegVakjes waarde negatief is. Anders groen met zwarte letters bij positieve of waarde 0.

Aan de start van het spel wordt aan de speler gevraagd of hij de kleuren of zwartwit versie van het spel wil spelen.

Voeg een overloaded constructor aan GanzenBord toe die een bool aanvaardt. Deze bool geeft aan of de speler een kleuren of klassiek zwart/wit speelbord wil gebruiken. Afhankelijk van deze parameter wordt dan het juiste soort vakjes in de ``SpeelVakjes`lijst geplaatst.

Bij het opstarten van het spel vraag je aan de gebruiker of hij de kleur of de zwartwit versie van Ganzenbord wil spelen.

Mapmaker "all-in-one-project"

Begin aan het all-in-project "Map Maker". Stop aan de sectie interfaces (die je pas in volgend hoofdstuk zult leren gebruiken). Je zal in dit project dingen herkennen die je eerder al in de "Een eigen huis" oefening hebt moeten maken.

(Pro²) Methoden als objecten

Deze oefening gaat erg ver voorbij de leerstof van dit boek en is enkel bedoeld voor diegene die 'above and beyond' willen gaan in hun kennis.

Tot hiertoe hebben we altijd gepraat over enerzijds objecten, en anderzijds methoden. Twee zaken die wel een relatie met elkaar hebben (een klasse kan methoden hebben, een methode kan objecten als parameter of return type hebben). Maar wat als ik je vertel dat je ook methoden als objecten kunt gebruiken. Het concept "delegate" laat ons toe om methoden als parameters doorheen een applicatie door te geven. Hier een droog, maar duidelijk voorbeeld (bron)

public delegate void MyDelegate(string msg); //declaring a delegate

class Program
{
    static void Main(string[] args)
    {
        MyDelegate del = MethodA; //same as MyDelegate del = new MyDelegate(MethodA);
        del("Hello world");
    }

    static void MethodA(string message)
    {
        Console.WriteLine("Called ClassA.MethodA() with parameter: " + message);
    }
}

Vanaf nu kan je de variabele del als object gebruiken én aanroepen:

del("Hello World!");

Of zelfs doorgeven als parameter

static void Main(string[] args)
{
    MyDelegate del = MethodA;
    InvokeDelegate(del);
}

static void InvokeDelegate(MyDelegate del) // MyDelegate type parameter
{
    del("Hello World");
}

Omdat delegates al wat oldschool zijn geworden, heeft .NET ook al vele jaren wat meer generieke (en dus bruikbaardere) versies hiervan, namelijk Action<T> en Func<T>. De werking hiervan legt deze gekende man stap voor stap uit in deze blog.

Kan je de hele tekst volgen en de gemaakte finale oefening uitbreiden naar een echte "applicatie"?

Figures with interfaces

Gebruik je Rechthoek-klasse uit de Figuren oefening die je eerder hebt aangemaakt. Maak een List aan waarin je een 10 rechthoek-objecten plaatsen, allen met een verschillende grootte. Zorg ervoor dat je nu je rechthoeken met de Sort()-methode kan sorteren op oppervlakte.

Toon de werking aan in een klein voorbeeld programma.

Carbon Footprint (Essential)

Maak 4 klassen:

  • Huis
  • Fabriek
  • Auto
  • Plant

Maak een interface ICarbonFootPrint die

  • 1 methode BerekenFootprint heeft die een int teruggeeft en geen parameters nodig heeft
  • 1 methode VerlaagFootprint die niets teruggeeft en geen parameters nodig heeft

Breidt de volgende klassen met de interface uit:

  • De carbon footprint van een huis is gebaseerd op het volume van het huis in kubieke meter maal 10.
  • De carbon footprint van een fabriek is gebaseerd op het aantal werknemers maal 100.
  • De carbon footprint van een auto is gebaseerd op het merk

Het verlagen van de footprint in iedere klasse verzin je zelf (door bijvoorbeeld bij het huis de factor 10 met 1 te verlagen).

Zorg ervoor dat van iedere klasse de footprint kan bevraagd worden (maak/verzin dus de nodige properties per klasse om dit te bereken). De klasse plant moet je niet aanpassen.

Plaats van iedere klasse 2 objecten in een gemeenschappelijke lijst en zorg ervoor dat:

  • de footprint van alle objecten getoond wordt (planten worden overgeslagen)
  • de gemiddelde footprint van alle objecten (ook planten worden meegeteld) berekend
  • toont welk object de hoogte footprint heeft
  • van alle objecten de footprint kan verlaagd worden

Pokémon interfaces (Essential)

Shadow Pokémon zijn een speciaal ras Pokémon (zie hier) en kunnen "purified" worden op verschillende manieren. Maak een interface IShadow die een methode Purify heeft. Verzin enkele Pokémon die Shadow Pokémon zijn, geef ze de interface, en verzin manieren hoe ze purified kunnen worden (bv door hun HP op -1 te zetten). Kan je door je lijst van Pokémon gaan enkel de Shadow Pokémon op het scherm tonen?

PokéDex IList (PRO)

Maak een PokéDex die de interface IEnumerable implementeert zoals hier uitgelegd. Hierdoor kan je je PokéDex klasse gebruiken als een List.

Mapmaker afwerken

Vervolledig het all-in-project "Map Maker". Inclusief interfaces en is/as .Kan je zelf extra zaken toevoegen zoals andere kamers, andere functionaliteit, etc.

Game

Maak eerst de corona missie van dit hoofdstuk. Die opdracht is veel kleiner dan deze stevige brok.

Zie onderaan pagina voor minimale klasse-hiërarchie en interfaces.

Maak een spel dat als volgt werkt:

  • De speler dient met zijn pion de overkant van het veld te bereiken.
  • Het veld bestaat uit 20 bij 20 vakjes. Op ieder vakje kan maximum één mapelement staan:
    • De speler zelf
    • Een monster
  • Een rots
  • Een speler kan niet door rotsen of monsters wandelen.
  • Een speler kan in zijn beurt telkens één vakje bewegen OF naar rechts schieten:
  • Indien geschoten wordt dan zal het mapelement op het vakje rechts van de speler vernietigd worden (rots of monster)
  • Monsters kunnen ook bewegen. In de beurt van de monsters beweegt ieder monster in een willekeurige richting indien er geen rotsen of spelers LINKS van het monster staan.
  • Indien er WEL een rots of speler LINKS van het monster staat dan schiet het monster en vernietigd het de speler of rots.
  • Enkel RockDestroyer monsters kunnen schieten. De setup van het spel bestaat uit volgende stappen:
  1. Maak een 20 bij 20 array aan en plaats bepaalde hoeveelheid monsters en rotsen op de kaart, behalve op kolom 0.
  2. Plaats de speler op de plek 0,10 in de array (midden van kolom 0)
  3. Doorloop de volgende stappen tot er winnaar is

Iedere beurt van het spel bestaat uit volgende stappen:

  1. Vraag speler om input (bewegen in 1 van de 4 richtingen OF schieten)
  2. Voer actie van speler uit
  3. Kijk of speler overkant van kaart heeft bereikt, zo ja: gewonnen!
  4. Beweeg ieder monster op de kaart in een willekeurige richting
  5. Beweeg iedere RockDestroyer OF laat RockDestroyer schieten

Stel de speler voor door een X, een rots door O , een monster door M een RockDestroyer door D.

Je zal de meeste logica in je Main of een Manager klasse moeten plaatsen. De Speler klasse bijvoorbeeld kan niet beslissen at een monster moet doen, dat zou willen zeggen dat de speler als jet ware " in het monster" beslissingen kan maken, wat tegen het principe van OOP zou zijn.

Extra’s:

Voorgaande beschrijving is een ‘minimale’ beschrijving. Voorzie extra functionaliteit naar believen zoals:

  • Speler heeft levens
  • Monsters hebben levens
  • Andere soort monsters (bv slimmere)
  • Meerdere levels met telkens andere/meer monsters bijvoorbeeld
  • Meerdere spelers
  • Verder schieten, of schieten in andere richtingen.

Klasse-schema

Klasse-schema

Location is van het type Point (compositie). Point is een zelfgemaakte mini klasse die er als volgt uit (minimaal uitziet):

class Point
{
  public int X{get;set;}
  public int Y{get;set;}
}

En dus in je abstracte klasse MapElement zal iets krijgen in de trend van: public Point Location {get;set;} = new Point();

Enkele screenshots

Interfaces Het spel in actie

Boekencollectie (Essential)

Maak een applicatie die een gebruiker in staat stelt om zijn/haar boekencollectie te beheren. De boekengegevens worden opgeslagen in een tekstbestand op de computer. De gebruiker moet boeken kunnen toevoegen, verwijderen, en de volledige lijst van boeken kunnen bekijken.

De applicatie moet de volgende menu-opties bieden:

  1. Een nieuw boek toevoegen
  2. Een boek verwijderen
  3. Alle boeken weergeven
  4. Programma afsluiten

Elke regel in het tekstbestand (boeken.txt) representeert een boek in het volgende formaat: Titel;Auteur;Jaar

Bijvoorbeeld:

De Hobbit;J.R.R. Tolkien;1937
Harry Potter en de Steen der Wijzen;J.K. Rowling;1997
Het Leven van Pi;Yann Martel;2001

IMDB Top 100 JSON (Essential)

Op deze site vind je de top 100 films ooit volgens IMDB. Download het bestand en gebruik het om een applicatie rond te ontwikkelen. De applicatie toont een menu'tje met volgende functionaliteiten:

  1. Top 100 titels tonen.
  2. Zoeken naar een titel (of deel ervan) en dan tonen op welke plek de titel staat.
  3. Voor een nummer tussen 1 en 100 in en open vervolgens de browser (zoek zelf op hoe dit kan mbv Process) naar de bijhorende IMDB-pagina van die film. Je gebruikt hiervoor het id van de film, bv: "https://www.imdb.com/title/tt0111161/" indien je de pagina van The Shawnshank Redemption nodig hebt.

Bitmap header analyzer (Essential)

Maak een applicatie die de headerinformatie van een bitmap-afbeelding binair inleest en de basisinformatie ervan toont. Je gaat de hoogte, breedte en bitdiepte van de afbeelding tonen aan de gebruiker. De gebruiker kan zelf ingeven welk bitmap (.bmp)-bestand moet ingelezen worden.

Een BMP-header bevat veel details, maar voor deze opdracht richten we ons op de volgende informatie:

  • Breedte van de afbeelding: bytes 18-21 (4 bytes, Little Endian)
  • Hoogte van de afbeelding: bytes 22-25 (4 bytes, Little Endian)
  • Bitdiepte van de afbeelding: bytes 28-29 (2 bytes, Little Endian)

Ter info de volledige structuur van de BMP header (eerste 54 bytes):

  • BMP Signature: bytes 0-1 (2 bytes)
  • File Size: bytes 2-5 (4 bytes)
  • Reserved: bytes 6-9 (4 bytes)
  • Data Offset: bytes 10-13 (4 bytes)
  • DIB Header Size: bytes 14-17 (4 bytes)
  • Width: bytes 18-21 (4 bytes)
  • Height: bytes 22-25 (4 bytes)
  • Planes: bytes 26-27 (2 bytes)
  • Bit Depth: bytes 28-29 (2 bytes)

Tips:

  • De ReadBytes methode van een BinaryReader aanvaardt een int als parameter om aan te geven hoevel bytes je van het bestand wilt inlezen.
  • De BitConverter-klasse kan eenvoudig bytes omzetten naar int met behulp van de ToInt32 klasse.

Gecombineerde oefeningen hoofdstukken 13 tot en met 17

Volgende opgaven waren ooit examenopgaven:

Volgende hoofdstukken bevatten grotere projecten waarin wordt getracht meerdere technieken uit de vorige hoofdstukken te combineren. Het doel van dit hoofdstuk is tweeledig:

  1. Op een andere manier tonen hoe specifieke C# elementen in een 'realistische' programma's kunnen gebruikt worden
  2. Aantonen dat, indien je tot hier bent geraakt, je al een aardig hoop skills hebt om grote, complexe applicaties te maken die verder gaan dan de standaard oefeningen die je na ieder hoofdstuk hebt gemaakt: