# Opgave 10 (2025)

> Deze 2 opgaven waren onderdeel van de vaardigheidsproefopdracht voor het examen van dit vak (OOP) in juli 2025 (OPGELET: de moeilijkheidsgraad van deze opgave was iets lager dan gewoonlijk. Kijk zeker naar opgave 11 voor een meer realistische oefening).

### Opgave 1 Voetbalteam (12p)

Je bent aangenomen als softwareontwikkelaar bij de Belgische Voetbalbond. Een aantal trainers heeft gevraagd om een digitale toepassing waarmee ze **hun teamopstelling kunnen beheren en analyseren**. Ze willen niet alleen spelers toevoegen en de sterkte van hun team bekijken, maar ook weten hoeveel hun opstelling waard is — iets wat belangrijk is bij transfers, scouts, en media-aandacht.

### Deel 1: Klassenstructuur en gedragsregels (6 punten)

Je systeem moet volgende structuur en logica ondersteunen:

#### Klasse `Speler`

Elke speler op het veld heeft:

* Een **rugnummer** (bijv. 10 voor een spits)
* Een **naam** (bijv. Eden Hazard)
* Een **kracht**, op een schaal van 1 tot 10

Deze gegevens worden opgegeven via een **constructor** bij het aanmaken van een speler.

De `Kracht` van een speler moet steeds **tussen 1 en 10** liggen. Als een andere waarde wordt ingegeven, moet het programma een foutmelding geven via een `ArgumentOutOfRangeException`.

Elke speler heeft ook een `IsBasisSpeler`-eigenschap.

De **marktwaarde** wordt berekend als **kracht × €100.000**. En wordt via een readonly property teruggegeven.

Daarnaast moet een **`static` property** aanwezig zijn dat het totaal aantal spelers bijhoudt dat ooit is toegevoegd. Deze teller verhoogt automatisch bij elke creatie van een nieuwe speler.

#### Klasse `Aanvaller`

Een aanvaller is een speler.\
Een aanvaller heeft een marktwaarde van **de waarde van een speler + €50.000**.

#### Klasse `Verdediger`

Een verdediger is een speler.\
Een verdediger heeft altijd een vaste marktwaarde van **€200.000**.

#### Interface `IScouteerbaar`

Deze interface definieert spelers waarvan de waarde verborgen blijft tot ze gescout zijn.

* `Scout()` activeert de werkelijke waarde.
* `AantalScoutPogingen()` telt de leespogingen vóór het scouten.

#### Klasse `GeheimeSpeler`

Deze speler heeft de interface `IScouteerbaar` en is een speler.

* Toont **0** als marktwaarde zolang hij niet is gescout.
* Houdt bij hoe vaak zijn marktwaarde werd opgevraagd vóór het scouten.
* Toont zijn echte waarde na het aanroepen van `Scout()`.

#### Klasse `VoetbalTeam`

Een team:

* Heeft een naam
* Bevat maximaal **11 spelers**

De methode `VoegSpelerToe(speler)`:

* Voegt een speler toe tenzij er al 11 spelers zijn
* Gooit een `Exception` met boodschap *“Team is vol. Speler niet toegevoegd.”* als het team vol is.
* Verhoogt de globale `static` teller bij een succesvolle toevoeging.

De methode `ToonOpstelling()` toont:

1. De teamnaam
2. Spelers met naam, rugnummer, marktwaarde
3. Indien `IScouteerbaar`: ook `#####X` met het aantal pogingen
4. Totale kracht
5. Totale marktwaarde (inclusief €100.000 extra voor elke `IScouteerbaar` speler)

### Deel 2: Console-applicatie (4 punten)

Bij het opstarten wordt de teamnaam gevraagd.

#### Hoofdmenu (blijft herhalen)

1. Speler toevoegen
2. Opstelling tonen
3. Programma afsluiten
4. Alle geheime spelers scouten

#### Speler toevoegen

Drie stappen:

1. Kies type speler (Verdediger, Aanvaller, GeheimeSpeler)
2. Geef naam, rugnummer en kracht (kracht moet tussen 1 en 10)
3. Indien GeheimeSpeler: vraag of meteen gescout moet worden

### Deel 3: Extra functionaliteit (2 punten)

#### 3.1 `ToString()` output

Bij gebruik van `Console.WriteLine(speler)`:

* Toon type, rugnummer, marktwaarde, naam
* Indien `GeheimeSpeler`: ook of hij gescout is

#### 3.2 `ScoutAlles()` methode

Deze methode scout alle `GeheimeSpelers` in een team. Wordt aangeroepen via menu-optie 4.

#### 3.3 totaal aantal spelers

Toon onderaan in het hoofdmenu hoeveel spelers er in totaal al toegevoegd zijn.

### Deel 4: Wedstrijdsimulatie (3 punten)

De Belgische Voetbalbond wil ook graag **vriendschappelijke wedstrijden kunnen simuleren** tussen twee teams. Hiervoor voeg je een nieuwe klasse toe.

#### Klasse `Wedstrijd`

Een `Wedstrijd` simuleert een duel tussen **twee voetbalteams**.

Eigenschappen:

* `Thuisploeg`: een `VoetbalTeam`
* `Uitploeg`: een `VoetbalTeam`

Constructor:

* Neemt twee `VoetbalTeam`-objecten aan en stelt ze in als thuis- en uitploeg.

Methode:

* `Simuleer()`: bepaalt de winnaar van de wedstrijd.
  * Vergelijk de **totale kracht** van beide teams.
  * Het team met de hoogste kracht wint.
  * Bij een gelijkstand wint het team met de **hoogste marktwaarde**.
  * Is ook die gelijk? Dan is het een **gelijkspel**.

De methode geeft een string terug in volgende stijl:

"Team Gent wint van Team Brugge met kracht 76 tegen 65." Of "Gelijkspel tussen Team Gent en Team Brugge met kracht 70."

Opmerking: deze klasse hoeft niet via het hoofdmenu opgeroepen te worden, maar moet wel instantieerbaar en bruikbaar zijn in code (bv. voor latere uitbreiding)

### Opgave 2 Bestandsfilter (4p)

Schrijf een applicatie die aan de gebruiker in de console een folderpath vraagt (bijvoorbeeld “c:”). Vervolgens wordt een grootte in megabyte gevraagd. Vervolgens de applicatie alle bestanden in die folder, en alle subfolders, wiens bestandsgrootte gelijk of meer dan de ingegeven grootte is. De applicatie toont de naam van het bestand, de grootte in MB en de datum waarop het bestand is aangemaakt. Bij het verwerken van de bestanden mogen eventuele uitzonderingen geen impact hebben op de nog te verwerken bestanden. Bestanden die dus niet geopend kunnen worden, worden overgeslagen. De applicatie toont dan wel een melding in de console dat het bestand niet geopend kon worden.

#### Voorbeeld uitvoer

Tekst die start met ">" is invoer van de gebruiker.

```
Geef het pad van een folder in: 
>c:\temp
Geef de minimum grootte (in megabyte) van bestanden die ik moet tonen:
>50

Bestanden groter dan 50 MB:

Bestand: c:\temp\mycontract.docx
Grootte: 83,58 MB
Aangemaakt op: 2024-09-30 15:19:46

Bestand c:\temp\corruptefile.docx kon niet geopend worden.

Bestand: c:\temp\video\zookeeper.mp4
Grootte: 535,40 MB
Aangemaakt op: 2024-09-30 15:19:46

Bestand: c:\temp\ffmpeg\bin\ffprobe.exe
Grootte: 63,45 MB
Aangemaakt op: 2024-09-30 15:19:48

```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://apwt.gitbook.io/ziescherp-oefeningen/oefeningen-h13-tot-en-met-h18/voorbeeld-vaardigheidsproeven/opgave_2425.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
