Derde deeltentamen Imperatief programmeren - versie 1 Vrijdag 6 november 2015, 11.00-13.00 uur Schrijf op elk ingeleverd blad je naam. Schrijf op het eerste blad ook je studentnummer en het aantal ingeleverde bladen. De lijst met standaardfuncties na afloop graag weer inleveren. De antwoorden komen binnenkort op de website. Opgave 1 t/m 10 zijn meerkeuzevragen, die meetellen voor 10 4 = 40 punten. Opgave 11 en 12 zijn programmeervragen, die meetellen voor 20 en 40 punten. Meerkeuzevragen: de letter van het goede antwoord volstaat. Belangrijk: dit is versie 1 van het tentamen, vermeld dat boven je antwoorden. 1. De methode Main mag gedefinieerd worden met een parameter. Deze parameter bevat: (a) De regels die door de gebruiker worden ingetikt (b) De files die door het programma gelezen moeten worden (c) De woorden die bij het opstarten achter de programmanaam zijn ingetikt (d) De libraries die in het programma gebruikt worden 2. Een lambda-expressie is (a) Een manier om een naamloze methode aan te duiden (b) Een manier om een event-handler te registreren (c) Een manier om een methode te herdefiniëren in een subklasse (d) Een manier om de methode zoals die in de superklasse was gedefinieerd aan te duiden 3. Wat is het belangrijkste voordeel van een virtuele methode boven een abstracte methode? (a) Je krijgt een waarschuwing als je hem vergeet te overriden in een subklasse (b) Je hoeft er nog geen implementatie van te geven (c) Je kunt alvast een default-gedrag vastleggen (d) Je kunt hem niet per ongeluk aanroepen terwijl dat nog geen zin heeft 4. Een abstracte klasse (a) Kan abstracte methoden bevatten (b) Moet ook abstracte methoden bevatten (c) Mag alleen maar abstracte methoden bevatten (d) Heeft geen body 1
5. Welk van onderstaande uitspraken is niet waar? (a) UTF8 kan dezelfde tekens opslaan als Unicode (b) UTF8 kost soms meer ruimte dan Unicode (c) UTF8 kost soms minder ruimte dan Unicode (d) UTF8 codeert tekens met code 0 t/m 255 hetzelfde als Latin1 6. Welke declaratie is correct? (a) IList<string> x = new IList<string>(); (b) IList<string> x = new LinkedList<string>(); (c) List<string> x = new IList<string>(); (d) ICollection<string> x = new List<string>(); 7. In een MDI-programma... (a) wordt het menu van het container-window samengevoegd met dat van het actieve childwindow en getoond in het child-window (b) wordt het menu van het actieve child-window samengevoegd met dat van het containerwindow en getoond in het container-window (c) worden de menu s van de child-windows gecombineerd weergegeven (d) vervangt het menu van het actieve child-window dat van het container-window 8. Het keyword value kan worden gebruikt binnen de definitie van een property (a) in de set-minimethode, en heeft dan de waarde van de parameter van de property (b) in de set-minimethode, en heeft dan de waarde van de rechterkant van een toekenning aan de property (c) in de get-minimethode, en heeft dan de waarde van het resultaat van de property (d) in de get-minimethode, en heeft dan de waarde van de private variabele die door de property wordt afgeschermd 9. Na de declaratie int[,,,] a = new int[1,2,3,4]; heeft de array a (a) 4 variabelen (b) 10 variabelen (c) 24 variabelen (d) nog geen variabelen 10. Het verschil tussen een list en een collection is (a) In een list staan de elementen in een bepaalde volgorde (b) In een list kun je het aantal elementen bepalen (c) In een list kun je controleren of een bepaalde waarde aanwezig is (d) In een list zitten geen dubbele elementen 2
11. (telt voor 20%) Bij het spel Reversi leggen twee spelers om de beurt een gekleurde steen op een veld van een rechthoekig speelbord. Een steen mag alleen maar worden neergelegd op een veld als het veld nog leeg is, en met deze zet een rij van een of meer stenen van de andere kleur wordt ingesloten tussen de nieuwe steen en een al op het bord liggende steen van de eigen kleur. De ingesloten stenen kunnen in acht mogelijke richtingen naast de nieuwe steen liggen: horizontaal, verticaal of diagonaal. Stenen insluiten in meerdere richtingen mag ook. In de figuur is voor twee voorbeelden met open cirkels aangegeven op welke velden de speler met de lichte stenen mag zetten. Als gevolg van een zet veranderen alle ingesloten stenen van kleur. In een programma wordt de situatie opgeslagen in een twee-dimensionale array: int[,] bord = new int[6,6]; Lege velden zijn gecodeerd met 0, gevulde velden met 1 of 1 voor de twee kleuren. De opgave: Schrijf een methode bool mag (int kleur, int x, int y) die controleert of speler kleur een steen op veld (x, y) mag zetten. (De zet wordt dus nog niet uitgevoerd!). Hint: het is toegestaan (en handig) om een extra methode te schrijven die het insluiten in één van de 8 richtingen controleert. 3
12. Met het programma in deze opgave kan de gebruiker een blokkenwereld tekenen. Op een groot gedeelte van het scherm is een wereld zichtbaar waarin de gebruiker kan klikken. Ernaast staan een schuifregelaar, twee buttons, en twee radio-buttons. Met de radio-buttons kan de gebruiker een tekenmodus kiezen: tekenen of wissen. Als de gebruiker in tekenmodus op de wereld klikt, ontstaat er gecentreerd op dat punt een vierkant. De diameter van het vierkant is bepaald door de stand van de schuifregelaar op dat moment. De kleur van het vierkant is een grijstint, die afhangt van de positie op het scherm: helemaal links zijn de vierkanten zwart, rechts zijn ze wit; hoe verder naar rechts, hoe lichter de grijstint. De vierkanten kunnen elkaar overlappen. Als de gebruiker in wissenmodus op een vierkant in de wereld klikt, verdwijnt dat vierkant. Bij overlappende vierkanten verdwijnt de bovenste. Wordt er geen vierkant geraakt, dan gebeurt er niets. In de bijlage aan het eind van dit tentamen staat een deel van het programma gegeven. Het bestaat uit vier klassen: Program, Scherm, Wereld, en Blok. Een aantal onderdelen moet nog worden ingevuld. (a) Schrijf de klasse Blok, zodat in een object van dit type alle relevante gegevens voor één blok worden opgeslagen. Zet daarin: de benodigde member-variabelen een constructormethode waarmee de members een waarde kunnen krijgen de methode ToString, die de gegevens van een blok omzet naar string-formaat een tweede constructormethode, die gegeven zo n string het oorspronkelijke blok weer reconstrueert een methode waarmee je kunt testen of het blok een bepaald punt bevat (b) Schrijf de klasse Wereld. Zet daarin: de benodigde member-variabelen een constructormethode, die aangeroepen kan worden zoals dat in klasse Scherm gebeurt. Hint: let op, de methode heeft een parameter. Dat is niet voor niets! overige methoden die nodig zijn om ervoor te zorgen dat de tekenmodus gewisseld kan worden, en er inderdaad blokken worden getekend, respectievelijk gewist. (c) Met de button opslaan kan de hele situatie worden opgeslagen in een tekstbestand. Met de button inlezen verdwijnt de huidige situatie, en wordt die vervangen door de eerder opgeslagen situatie. De te gebruiken filenaam staat gedeclareerd in de klasse Scherm. Schrijf de twee benodigde methoden, en geef aan in welke klasse die moeten staan. Einde tentamen 4
// Bijlage bij opgave 12 public class Program { static void Main() { Application.Run(new Scherm()); public class Scherm : Form { public TrackBar schuif; public string filenaam = "test.txt"; public Scherm() { this.size = new Size(700, 400); this.text = "BlokkenWereld"; Wereld w = new Wereld(this); w.location = new Point(20, 20); w.size = new Size(510, 300); w.backcolor = Color.White; this.controls.add(w); schuif = new TrackBar(); schuif.location = new Point(550, 20); schuif.size = new Size(40, 200); schuif.orientation = Orientation.Vertical; schuif.backcolor = Color.DarkGray; schuif.maximum = 100; schuif.value = 20; schuif.tickfrequency = 10; this.controls.add(schuif); Button b1 = new Button(); b1.location = new Point(620, 20); this.controls.add(b1); b1.size = new Size(60, 24); b1.text = "Opslaan"; Button b2 = new Button(); b2.location = new Point(620, 50); b2.size = new Size(60, 24); b2.text = "Inlezen"; this.controls.add(b2); RadioButton r1 = new RadioButton(); r1.location = new Point(620, 100); r1.size = new Size(100, 24); r1.text = "Tekenen"; this.controls.add(r1); r1.select(); RadioButton r2 = new RadioButton(); r2.location = new Point(620, 130); r2.size = new Size(100, 24); r2.text = "Wissen"; this.controls.add(r2); b1.click += w.opslaan; b2.click += w.inlezen; r1.click += w.modechange; r2.click += w.modechange; public class Wereld : UserControl { // TODO public class Blok { // TODO 5
. 6