de bedoelde antwoorden

Uitwerking Eerste deeltentamen Imperatief programmeren
Vrijdag 26 september 2014, 8.30–10.30 uur
1. Deze opgave bestaat uit een aantal tekstvragen.
Houd het antwoord kort: een of twee zinnen per onderdeel kan al genoeg zijn.
(a) Het begrip klasse hangt op twee verschillende manieren samen met andere kernbegrippen.
Welke zijn dat, en wat is die samenhang?
Beschrijf ook hoe die twee andere begrippen op hun beurt met elkaar samenhangen.
Antwoord: Een klasse is een bundeling van methoden, maar ook het type van een
object.
De methoden in de klasse hebben een object onder handen dat deze klasse als type heeft.
(b) Beschrijf de syntax van een while-opdracht.
Beschrijf daarna ook de semantiek daarvan.
Antwoord: Syntax: een while-opdracht bestaat uit het woord while, een boolean
expressie tussen haakjes, en een opdracht.
Semantiek: de opdracht wordt steeds opnieuw uitgevoerd zolang de boolean expressie
de waarde true heeft.
(c) Noem drie wezenlijk verschillende plaatsen waar in een programma een declaratie kan
staan. Geef voor elke van deze drie aan op welke manier de gedeclareerde variabele zijn
waarde krijgt (als dat niet meteen bij de declaratie al gebeurt).
Antwoord: Declaratie van lokale variabelen in de body van een methode; deze krijgt
zijn waarde met een toekenningsopdracht in diezelfde methode.
Declaratie van een parameter in de header van een methode; deze krijgt zijn waarde
door een expressie mee te geven bij aanroep van de methode.
Declaratie van een membervariabele in de body van een klasse; deze krijgt zijn waarde
met een toekenningsopdracht in de constructor-methode.
(d) Wat is het verschil tussen een compiler en een interpreter voor een bepaalde programmeertaal?
Antwoord: Een compiler voor een programmeertaal vertaalt een programma in die
taal naar machinecode.
Een interpreter voor een programmeertaal leest een programma in die taal en voert het
meteen uit.
(e) Wat is het effect van de opdracht x*=5; ?
Hoe hangt de waarde van de expressie p&&q af van de waarden van de variabelen p en q
?
Antwoord: De variabele x wordt vijf keer zo groot als hij was.
De expressie p&&q heeft de waarde true als p en q de waarde true hebben, en anders
false.
2. Hieronder staat 16 fragmenten uit een programma. Schrijf op je antwoordblad een blok van
4 bij 4 vakjes en zet in elk vakje een letter passend bij het overeenkomstige fragment:
• T als het programmafragment een type is
• E als het programmafragment een expressie
• O als het programmafragment een opdracht is
• D als het programmafragment een declaratie is
1
• H als het programmafragment een methode-header is
• X als het programmafragment geen van bovenstaande dingen is
double
return "";
Pens.Black
false||true
double d()
string s;
Pen
while(false) {}
double d=1;
"\n\"
void d(Pen p)
const bool b=1==2;
1.2*3
Console.WriteLine(1);
new Pen p;
for {t=0; t<10; t++}
Antwoord:
T
H
D
E
O
D
X
O
E
T
H
X
E
O
D
X
3. In deze opgave is het niet toegestaan om methodes uit de klasse Math te gebruiken.
Alle methodes in deze opgave maken deel uit van de klasse Prog.
(a) Schrijf een methode Macht met twee getallen als parameter: een re¨eel getal, en een nietnegatief geheel getal. De aanroep van Macht(x,e) moet x tot de macht e uitrekenen.
(b) Een benadering van de logaritme van een (re¨eel) getal a kun je als volgt uitrekenen:
Bereken eerst x = a − 1. Bereken vervolgens
x x2 x3 x4 x5 x6
−
+
−
+
−
+ ···
1
2
3
4
5
6
Let op: de termen worden dus afwisselend bij het resultaat opgeteld en afgetrokken. Het
resultaat is ook weer een re¨eel getal. (Deze formule werkt alleen als 0 < a < 2, maar
daarop hoef je niet te controleren). Schrijf een methode Logaritme die deze benadering
uitvoert door 20 van deze termen te sommeren, en dat als resultaat oplevert.
(c) Maak er een compleet programma van, dat via de console met de gebruiker communiceert. Het programma vraagt aan de gebruiker om een getal, en toont daarna de
logaritme van dat getal. Je mag zonder controle aannemen dat de gebruiker inderdaad
een re¨eel getal tussen 0 en 2 intikt.
2
Antwoord:
public static double Macht(double x, int e)
{
double res = 1;
for (int t=0; t<e; t++)
res *= x;
return res;
}
public static double Logaritme(double a)
{
double res = 0;
double x = a-1;
int s = 1;
for (int t=1; t<=20; t++)
{
res += s * Prog.Macht(x,t)/t
s *= -1;
}
return res;
}
public static void Main()
{
Console.WriteLine("tik een getal: ");
string s = Console.ReadLine();
double a = double.Parse(s);
Console.WriteLine( Prog.Logaritme(a) );
}
4. Gegeven is de volgende klasse:
class Program
{
public static void Main()
{
Taart t = new Taart();
t.Text
= "Taart";
t.BackColor = Color.White;
t.ClientSize = new Size(500, 500);
Application.Run(t);
}
}
Schrijf de klasse Taart, zo dat het programma zich als volgt gaat gedragen. Op de plek waar
de muis zich bevindt is een taart zichtbaar, bestaande uit drie etages. De taart beweegt mee
met de muis.
De hoogte van elke etage is 20 pixels, de breedtes zijn 50, 30 en 10 pixels. De kleur van elke
etage is verschillend: de bovenste etage is zwart, en naar onderen toe wordt het steeds lichter.
Elke keer als de gebruiker klikt met de muis, komt er een etage bij. Zie het plaatje: links is
de startsituatie, rechts heeft de gebruiker zeven keer geklikt. (Het pijltje is de muiscursor, die
hoef je niet te tekenen).
Antwoord:
3
class Taart : Form
{
int x, y, n = 3;
Taart()
{
this.Paint += this.teken;
this.MouseMove += muis;
this.MouseClick += klik;
}
void muis(object obj, MouseEventArgs mea)
{
this.x = mea.X;
this.y = mea.Y;
this.Invalidate();
}
void klik(object obj, MouseEventArgs mea)
{
this.n++;
this.Invalidate();
}
void teken(object obj, PaintEventArgs pea)
{
for (int t = 0; t <= n; t++)
{
int w = t*20+10;
int k = 250 * t / n;
Brush b = new SolidBrush(Color.FromArgb(k, k, k));
pea.Graphics.FillRectangle(b, x-w/2, y-20*(n-t), w, 20);
}
}
}
4