1 Inhoud 2 Oefeningen

Download Report

Transcript 1 Inhoud 2 Oefeningen

1
Inhoud
Loops (for, while en do-while), debuggen, inleiding tot graphics, timers, arrays.
2
Oefeningen
• Demo 1: Gemiddelde
• Demo 2: Fibonacci reeks
• Demo 3: Geometrische figuren
• A: MinMax search
• A: Array reversal
• A: Faculteit
• A: Biljardtafel
• A: Autorace
• E: Vind de smiley
• E: Kogelwerpen
• X: Teken sinus
2.1
Demo 1: Gemiddelde
Gegeven onderstaande set van 16 waarden:
15, 2, -70, 100, 1, 35, -84, 14, 56, 31, -30, -58, 12, 41, -43, 50.
Bereken uit deze set van punten het gemiddelde, en geef dit weer.
2.2
Demo 2: Fibonacci reeks
De reeks van Fibonacci werd rond 1200 door Leonardo van Pisa voor het eerst beschreven.
Deze rij wordt wiskundig als volgt beschreven:
fn = fn−1 + fn−2
(1)
met n > 1.
De resultaten van deze rij zijn ook terug te vinden in de natuur; zoals de evolutie van een
bijenpopulatie, de vorm van een zonnebloem, de ontwikkeling van een konijnenpopulatie,
enz. Voorts kan men met deze rij ook de waarde van de Gulden Snede bepalen. Deze rij
start met de waarden 0 en 1. het resultaat van deze rijd wordt hieronder wergegeven:
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ...
Schrijf een programma dat de reeks uitrekent zolang het resultaat kleiner is dan een
door de gebruiker aangegeven grens.
1
2.3
Demo 3: Geometrische figuren
In deze demo wordt het tekenen van eenvoudige geometrische figuren aangetoond. Om
te tekenen wordt er een panel op het formulier geplaatst. Verander de achtergrondskleur naar de gewenste kleur (hier zwart). Teken een horizontale witte lijn, waarop een
rechthoek wordt getekend. Laat een rode bal horizontaal over deze lijn rollen totdat deze
de rechthoek raakt.
Hint 1: Het assenkruis om te tekenen (panel) is als volgt:
• het nulpunt van de tekening bevindt zich linksboven,
• horizontaal loopt de x-as van links naar rechts,
• verticaal loopt de y-as van boven naar beneden, dit betekent dat er in de verticale
richting omgekeerd getekend wordt (spiegelen).
Om een tekening volgens de y-as te plotten, wordt volgende conversie voor de y-waarde
aangenomen:
yplot = Heightpanel − y
(2)
Hint 2: De beweging van de bal kan worden gerealiseerd door een snelheidsvector te
bepalen. Het beste is om deze globaal (als een veld) te declaren als een X en Y component.
In deze opgave beweegt de bal enkel volgens de horizontale as totdat deze de rechthoek
raakt. Daarna stopt de bal met rollen. De Y component wordt hier dus 0. Gebruik een
timer (zie toolbox) om het rollen te visualiseren. Zet deze timer aan met een interval
tussen 10 ms en 250 ms. Pas de horizontale snelheid (X component) zodanig aan dat de
bal een zichtbare beweging vertoont.
2.4
A: MinMax search
Gegeven onderstaande set van 16 waarden:
15, 87, 45, 0, -48, -100, 15, 12, -99, 101, 22, 67, -50, 41, -65, -34.
Zoek zowel het kleinste als het grootste getal uit de reeks, en geef deze weer.
2.5
A: Array reversal
Voorzie een array van 20 gehele getallen, en vul deze met oplopende getallen van 1 t.e.m.
20. Nadat deze array ingevuld is, moet je ervoor zorgen dat getal 1 met 20 omgewisseld
wordt, getal 2 met 19, 3 met 18, enz.. Nadat alle getallen gewisseld zijn, zijn de elementen
in aflopende volgorde in de array aanwezig (dus van 20 naar 1).
2.6
A: Faculteit
De faculteit wordt veel toegepast binnen de kansrekening. Formule 3 geeft het principe
hiervan weer.
i=n
Y
n! =
i = 1 · 2 · 3 · 4 · 5 · 6 · ... · n
(3)
i=1
2
Schrijf een programma dat de faculteit uitrekent totdat een bepaalde grens (door de
gebruiker in te geven) overschreden wordt.
2.7
A: Biljardtafel
Schrijf een programma dat een bal op een veld laat rollen. Zorg ervoor dat deze bal
bij het botsen tegen een wanden terugkaatst. Stel de wanden van het veld gelijk aan
de randen van de panel waarop je tekent. De beweging van deze bal wordt voorgesteld
door een X en Y component. Samen vormen deze componenten een snelheidsvector.
Dankzij een timer kan de beweging van de bal gevisualiseerd worden (zet deze aan, met
een interval tussen 10 ms en 250 ms). De X en Y beweging worden aangepast in functie
van de timerfrequentie, zodat deze bal een al dan niet vloeiende beweging uitvoert. De
terugkaatsing kan plaatsvinden door ´e´en element van de snelheidsvector van teken te doen
wisselen. Als de bal tegen een verticale wand aanbotst, wordt de horizontale richting
omgedraaid. In het het geval dat de bal tegen een horizontale wand aanbotst, wordt
de verticale richting omgedraaid (tekenwissel). Een voorbeeld van deze applicatie kan
teruggevonden worden in figuur 1.
Figuur 1: Voorbeeld biljardtafel
2.8
A: Autorace
Twee auto’s nemen het tegen elkaar op in een race. De eerste auto start met een voorsprong van 350 m, en rijdt aan een constante snelheid van 22 m/s. De tweede auto start
zonder voorsprong, en behaalt een constante snelheid van 25 m/s. Wanneer haalt auto 2
auto 1 in?
3
2.9
E: Vind de smiley
Hedendaagse chatapplicaties laten toe om smilies te herkennen in een tekst en aan te
duiden met een emoticon. In deze opgave is het de bedoeling dat je verschillende smilies
in een tekst terugvindt. Hierbij worden de plaats van de smiley, en het type smiley
weergegeven. Om de tekst te doorlopen, benader je best de string als een array van
characters (“char”). Ga na hoe de lengte van een string bepaald kan worden.
De smilies die gezocht worden zijn: “:-p”, “:-)”, “;-)”, “o-)” en “:-D”
2.10
E: Kogelwerpen
In een partijtje kogelwerpen worden massa’s geworpen. De kromme die de massa’s volgen
wordt beschreven als:
x(t) = v · cos(α) · t
(4)
y(t) = v · sin(α) · t − 12 · g · t2
Plot de baan die deze kogel aflegt. Voor deze opgave mag je de volledige baan in ´e´en keer
plotten (dus geen timers nodig). De beginsnelheid en de afschiethoek worden ingegeven
worden door de gebruiker. Let hierbij op dat het mogelijk is dat de plot niet op het
scherm past. Wanneer en op welke afstand raakt de kogel de grond? Ga ervan uit dat
de kogel vanaf de grond afgeschoten wordt, en maak in het programma gebruik van een
do-while lus.
Figuur 2: Voorbeeld kogelwerpen
2.11
X: Teken sinus
Plot een sinusfunctie in een panel. Zorg ervoor dat de periode instelbaar is door de gebruiker. Om ervoor te zorgen dat je een continue plot bekomt, ga je in verschillende
4
stappen te werk. Maak een array aan met een lengte dat gelijk is met het aantal horizontale pixels van de panel (width-property). Vul deze array met de y-waarden die je
bekomt uit de sinus-functie. Vergeet hierbij niet dat de ingebouwde sinus-functie van C#
in radialen rekent. Je berekent de y-waarden door de gepaste x-waarde in de sinus in te
vullen. Dit kan via onderstaande formule.
y = A · sin(
2π
rx)
180
(5)
In deze formule stelt y de huidige y-waarde voor, x de huidige pixel, en r de hoeksnelheid
(in te stellen door de gebruiker. Door deze punten als pixels (lijn met lengte 1) te plotten,
wordt een grafiek zoals in figuur 3 bekomen. Om een vloeiende beweging te bekomen
(figuur 4), worden deze punten tijdens het tekenen met elkaar verbonden. Gebruik hiervoor een lijn (“drawLine”), dat het huidige punt met het voorgaande verbindt (let hierbij
op dat je loop-index vanaf 1 start in de array, niet vanaf 0, waarom?).
Hint 1: Teken de plot met een verticale offset (een constante dat opgeteld wordt t.o.v.
berekende y-waarde). Vergeet niet dat je volgens de verticale gespiegeld tekent! Als offset
kan de halve hoogte van de panel genomen worden. In dat geval wordt de getekende
y-waarde:
Heightpanel
−y
(6)
yplot =
2
Hint 2: Neem voor de amplitude van de sinus een waarde tussen de 25 en 250 (afhankelijk
van de panelhoogte).
Figuur 3: Sinus op basis van punten.
5
Figuur 4: Continue sinus.
6