Wat gaan we doen? Theorie (14 colleges + 3 deeltentamens) Oefening (6 werkcolleges) Praktijk (15 keer, 3 inleveropgaven) 13-15 wo 15-17 <24 11-13 vr 13-15 15-17 <24 prakt. college prakt. college werkcoll prakt. college prakt. college werkcoll prakt. 1 college Tent. 1 prakt. 1 college prakt. 1 college werkcoll prakt. 2 college prakt. 2 college werkcoll prakt. 2 college Tent. 2 prakt. 2 college prakt. 3 college werkcoll prakt. 3 college prakt. 3 college werkcoll prakt. 3 Tent. 3
Tentamen vrijdag 30 sept 16-18 uur In Educatorium, zaal Beta Standaardlibraries (appendix D in diktaat) mag je erbij gebruiken (wordt uitgedeeld bij het tentamen) Recht op extra tijd? Mail mij van tevoren! Op de website: uitwerkingen van werkcollege-opgaven oude tentamens met uitwerkingen
Opdrachten herhalen public void tekenScherm (object o, PEA pea) { int x; x = 1; pea.Graphics . DrawString ( x.ToString() , ft, br, 10, 10); } zolang de voorwaarde geldig is while ( x<1000 ) x = 2*x; body wordt steeds opnieuw uitgevoerd X 1024 512 256 128 64 16 32 4 1 2 8
Veelwerf-methode private static string veelwerf (string x, int n) { string result; int t; t = 0; result = ""; while ( t<n ) { t = t+1 ; } result = result + x ; return result; }
Machtsverhef-methode private static double macht (double x, int n) { double result; int t; t = 0; result = 1; while ( t<n ) { t = t+1 ; } result = result * x ; return result; }
wordt vermenigvuldigd met Variabelen aanpassen x = x * 2 ; nieuwe waarde wordt oude waarde Afgekorte notaties: wordt vermenigvuldigd met x = x * 2 ; x *= 2 ; wordt vermeerderd met x = x + 5 ; x += 5 ; wordt opgehoogd x = x + 1 ; x += 1 ; x ++ ;
Herhaling met een teller int t ; t = 0; t = 0; for while ( t<x ) for ( t=0 ; t<x ; t++ ) { // doe iets nuttigs // met t t ++ ; t ++ ; }
Syntax van opdrachten opdracht naam naam ( expressie ) ; . , expressie klasse naam methode naam ( expressie ) ; . , object expressie property naam += variabele = expressie ; return expressie ; while ) ( expressie opdracht for ) ( expr opdracht ; blok
Voorbeeldprogramma: Renteberekening door de gebruiker in te vullen TextBox -objecten Button met een Click handler Label met het resultaat
Rente-programma private void knop_Click(object o, EventArgs ea) { double bedrag = double.Parse( bedragBox.Text ) ; double rente = double.Parse( renteBox.Text ); resultaat.Text = ""; int jaar; for (jaar=0; jaar<=10; jaar++) { resultaat.Text += "na" + jaar + "jaar" + bedrag + "\n"; bedrag *= (1+0.01*rente); } }
Stralen class Programma { public static void Main( ) } public static void Main( ) { Stralen s = new Stralen(); s.Text = "Stralen"; Application.Run(s); }
Stralen class Stralen { : Form int x, y; int n=1; public Stralen( ) void teken (obj o, PEA pea) { this.Paint += teken; this.MouseMove += beweeg; this.MouseClick += klik; Graphics g = pea.Graphics; g.FillEllipse( Brushes.Black, this.x-20, this.y-20, 40, 40); } void beweeg (obj o, MEA mea) { for (int t=0; t<=this.n; t++) this.x = mea.X; this.y = mea.Y; g.DrawLine( Pens.Black, this.x, this.y, this.Invalidate(); this.Width * t / this.n, } this.Height ); void klik (obj o, EA ea) { } this.n ++; this.Invalidate(); } }
Vergelijk-operatoren < kleiner dan <= kleiner dan of gelijk aan > groter dan >= groter dan of gelijk aan == gelijk aan != ongelijk aan x=5 x wordt 5 ! x==5 is x gelijk aan 5 ?
Bool expressies Vergelijken van waarden x <= y Combineren van andere bool-expressies met logische operatoren && and || or ! not George Boole (1815-1864) x<0 && y>0 ! (x==0 && y==0) x!=0 || y!=0
Gebruik van bool expressies Als voorwaarde van een while-opdracht while (x<10) ... Rechts van een toekenningsopdracht bool b; b = x<10 ; Als resultaat van een methode return x<10 ;
waarheidswaarde als resultaat Publieksvraag Schrijf een methode deelbaar , die antwoordt of x deelbaar is door d private static bool deelbaar (int x, int d) { } waarheidswaarde als resultaat return ; x%d == 0
Publieksvraag Schrijf een methode kleinsteDeler , die antwoordt wat de kleinste deler is van x probeer ze één voor één private static int kleinsteDeler (int x) { } int d; d = 2; while ( x%d != 0) d = d+1; return d ;
for-opdracht int t ; for ( t=0 ; t<x ; t++ ) eenmalige initialisatie voorwaarde om door te gaan stap naar de volgende int t ; for ( t=0 ; t<x ; t++ ) gr.DrawString( "#", br, ft, 0, t*10 ); for ( t=1 ; t<=x ; t++ ) gr.DrawString( "#", br, ft, 0, t*10 ); for ( t=x ; t>=0 ; t -- ) gr.DrawString( "#", br, ft, 0, t*10 ); for ( d=2 ; !deelbaar(x,d) ; d++ ) lege body ;
Herhaalde herhaling Body van een for-opdracht is een opdracht dat kan zelf ook een for-opdracht zijn! int x, y; for (y=0; y<10; y++) for (x=0; x<10; x++) gr.DrawString( "+", br, ft , 10*x, 10*(y+1) ); + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + y
Extreme gevallen Nul keer herhalen Oneindig vaak herhalen for (y=0; y<0; y++) gr.DrawString("hoi", br, ft, 10, 10); deze opdracht wordt 0 keer uitgevoerd Oneindig vaak herhalen while (true) audio.Play( ); gr.DrawString("hoi", br, ft, 10, 10); deze opdracht komt nooit aan de beurt!
Onbedoelde oneindigheid x=1; aantal = 0; while (aantal<10) x = x*2; aantal = aantal+1; accolades vergeten... { }
Onbedoelde oneindigheid Puntkomma teveel… for (x=0; x<10; x++) ; totaal = totaal + x ; ;
Publieksvraag Schrijf een methode wortel , die de wortel trekt van een niet-negatieve double Zonder Math.Sqrt te gebruiken! Gebruik de Newton-benadering: als y een benadering is van Sqrt(x), dan is het gemiddelde van y en x/y een betere benadering
Worteltrek-methode private static double wortel (double x) { double y; } double y; y = 1; for (int t=0; t<100; t++) y = (y + x/y) / 2 ; return y;
while ( Math.Abs (y*y - x) <0.000001 ) Worteltrek-methode private static double wortel (double x) { } stopt dit? double y; y = 1; wiskundige: nee, gelijkheid geldt pas in limiet while ( y*y != x ) y = (y + x/y) / 2 ; return y; programmeur: ja, want reken- precisie is beperkt veiliger: informaticus: nee, want afrond- fouten verhinderen bereiken limiet while ( Math.Abs (y*y - x) <0.000001 )
Opbouw herhaling Initialisatie Herhaalde aanpassing Gebruik van het resultaat kap=start; y=1; tot=0; res=""; kap*=(1+0.01*rente); y=(y+x/y)/2; tot+=x; res+="|"; gr . DrawString (""+kap, ...); return y; return res; lab . Text = tot ;
resultaat komt meteen op het scherm Tekenen of opleveren? Console.WriteLine(x); pea.Graphics.DrawString (x, ...) Label res = new Label(); res.Text += x; return x; resultaat komt meteen op het scherm resultaat wordt teruggegeven aan de aanroeper, die zelf kan beslissen wat hij ermee doet
Syntax van opdrachten opdracht naam naam ( expressie ) ; . , expressie klasse naam methode naam ( expressie ) ; . , object expressie property naam += variabele = expressie ; return expressie ; while ) ( expressie opdracht for ) ( expr opdracht ; blok
Syntax van opdrachten opdracht return expressie ; while ) ( expressie for ) ( expr opdracht ; blok
Overzicht programma-constructies kun je doen kun je uitrekenen Opdrachten Toekenning Aanroep void-methode return-opdracht while-opdracht for-opdracht { ... } - bundeling Expressies Constante Variabele Aanroep methode Expressie met operatoren Expressie met haakjes new-expressie this (cast)-conversie
Overzicht programma-constructies waarde-verzameling van een expressie geeft het type van variabelen Declaratie Lokale variabele voor tijdelijk gebruik Member permanent deel van het object Parameter om waarden door te spelen aan methode Type Primitief type int double bool Object-type Color, String enz. TextBox, Button enz. Form, HalloForm, enz.
Type / Expr / Opdr / Decl / Head / X Methode Button (bool)true int t( ) class A : Size Button b; const bool true; int t=1; this.Size= this.ClientSize; b.Text ="ok"; bool t==t+1 Size s (Size t) new Button b; while (true) t=1; t=t+1; new Size(x,y)
Type / Expr / Opdr / Decl / Head / X Methode Button (bool)true int t( ) class A : Size Button b; const bool true; int t=1; this.Size= this.ClientSize; b.Text ="ok"; bool t==t+1 Size s (Size t) new Button b; while (true) t=1; t=t+1; new Size(x,y)
Type / Expr / Opdr / Decl / Head / X Methode Button (bool)true int t( ) class A : Size Button b; const bool true; int t=1; this.Size= this.ClientSize; b.Text ="ok"; bool t==t+1 Size s (Size t) new Button b; while (true) t=1; t=t+1; new Size(x,y)
Type / Expr / Opdr / Decl / Head / X Methode Button (bool)true int t( ) class A : Size Button b; const bool true; int t=1; this.Size= this.ClientSize; b.Text ="ok"; bool t==t+1 Size s (Size t) new Button b; while (true) t=1; t=t+1; new Size(x,y)
Type / Expr / Opdr / Decl / Head / X Methode Button (bool)true int t( ) class A : Size Button b; const bool true; int t=1; this.Size= this.ClientSize; b.Text ="ok"; bool t==t+1 Size s (Size t) new Button b; while (true) t=1; t=t+1; new Size(x,y)
Type / Expr / Opdr / Decl / Head / X Methode Button (bool)true int t( ) class A : Size Button b; const bool true; int t=1; this.Size= this.ClientSize; b.Text ="ok"; bool t==t+1 Size s (Size t) new Button b; while (true) t=1; t=t+1; new Size(x,y)
Hoofdstuk 7 verplicht… Keuze
Opdrachten voorwaardelijk uitvoeren opdracht wordt steeds opnieuw uitgevoerd zolang voorwaarde geldt if while (temperatuur<0) temperatuur += 5; if (temperatuur<0) uitvoer.Text = "Het vriest!"; opdracht wordt alleen uitgevoerd als voorwaarde geldt
opdracht wordt alleen uitgevoerd als voorwaarde niet geldt Twee alternatieven if (temperatuur<0) uitvoer.Text = "Het vriest!”; else uitvoer.Text = "Het dooit."; opdracht wordt alleen uitgevoerd als voorwaarde niet geldt
Keuze is ook een opdracht for (n=1; n<20; n++) if (n%3==0) uitvoer.Text += (n + " drievoud"); else uitvoer.Text += (n + " geen drievoud"); één opdracht dus geen accolades nodig! if-opdracht dient in z’n geheel als body van for-opdracht
Meer opdrachten als body if (temperatuur<0) lab1.Text = "Het vriest"; { } lab2.Text = "Koud he!"; accolades maken twee opdrachten tot één body
Meerdere alternatieven if (leeftijd<4) uitvoer.Text = "Gratis"; else if (leeftijd<12) uitvoer.Text = "Railrunner"; else if (leeftijd<65) uitvoer.Text = "Vol tarief"; else uitvoer.Text = "Senioren"; if-opdracht dient in z’n geheel als body van else-deel if-opdracht dient in z’n geheel als body van else-deel
Meerdere alternatieven if (leeftijd<4) uitvoer.Text = "Gratis"; else if (leeftijd<12) uitvoer.Text = "Railrunner"; else if (leeftijd<65) uitvoer.Text = "Railrunner"; else if (leeftijd<65) uitvoer.Text = "Vol tarief"; else uitvoer.Text = "Senioren"; uitvoer.Text = "Vol tarief"; else uitvoer.Text = "Senioren"; uitzondering op gewoonte om body in te springen
Meerdere alternatieven bij return-opdracht is methode beëindigd private string tarief(int leeftijd) { } if (leeftijd<4) return "Gratis"; else if (leeftijd<12) return "Railrunner"; else if (leeftijd<65) return "Vol tarief"; else return "Seniorenkaart"; if (leeftijd<4) return "Gratis"; if (leeftijd<12) return "Railrunner"; if (leeftijd<65) return "Vol tarief"; return "Seniorenkaart";
CirkelGroei class Cirkel : Form { Button kleiner, groter; int straal = 100; Cirkel() { kleiner = new Button(); groter = new Button(); kleiner.Text = "Kleiner"; kleiner.Location = ...; // etc. this.Controls.Add(kleiner); this.Controls.Add(groter); this.Paint += this.teken; this.kleiner.Click += this.klik; this.groter.Click += this.klik; } }
CirkelGroei class Cirkel : Form { Button kleiner, groter; int straal = 100; void teken(object o, PEA pea) { pea.Graphics.FillEllipse( , Brushes.Green , 150–this.straal, 150–this.straal , 2*this.straal, 2*this.straal ); } void klik(object obj, EA ea) { if (obj==kleiner) && straal>10) this.straal –= 10; if (obj==groter) && straal<150) this.straal += 10; this.Invalidate(); } }
Geheime tekening class Geheim : Form { bool open; Geheim ( ) { open = false; this.Paint += this.teken; } TextBox pass; pass = new TextBox(); this.Controls.Add(pass); pass.TextChanged += this.controleer; } void teken (object o, PEA pea) { pea.Graphics.FillEllipse(Brushes,Yellow,10,10,100,100); pea.Graphics.DrawArc(Pens.Blue,25,25,50,50,45,90); } if (open) { }
Geheime tekening class Geheim : Form { bool open; Geheim ( ) { open = false; this.Paint += this.teken; } TextBox pass; pass = new TextBox(); this.Controls.Add(pass); pass.TextChanged += this.controleer; } const string sleutel = "geheim"; void controleer (object o, EA ea) { } if (pass.Text == sleutel) { } open = true; this.Invalidate(); pass.Visible=false;
Thermometer partial class Thermo : Form { TrackBar min, temp, max; Button reset; Thermo() { this.InitializeComponent(); temp.Scroll += temp_Scroll; reset.Click += reset_Click; } void temp_Scroll(object o, EA ea) { int x = this.temp.Value; if (x < this.min.Value) this.min.Value = x; } void reset_Click(object o, EA ea) { this.min.Value = this.temp.Value; } }
Exceptions Exception: Uitzonderlijke toestand die door een methode wordt opgeworpen De situatie moet door de aanroeper van de methode worden opgevangen throw catch
Voorbeeld van Exception kan een Exception opwerpen try { } s = invoer . Text; n = int . Parse (s); uitvoer . Text = ( "kwadraat is " + n*n ); catch ( Exception e ) { uitvoer . Text = ( s + " is geen getal" ); } opvangen van het probleem
Meerdere catch-delen try { // open een file } // en lees de inhoud als er een Exception optreedt, wordt de eerste catch gekozen met een passend type try { } // open een file // en lees de inhoud catch ( FileNotFoundException f ) { uitvoer . Text = ( s + " bestaat niet" ); } catch ( IOException i ) { uitvoer . Text = ( s + " is onleesbaar" ); }
Grafiek-tekenprogramma TextBox : ingevoerde waarden abc Label : nulpunten volgens abc-formule Panel : grafiek van een parabool y = a∙x2 + b∙x + c
Parabool: tekst ingevoerd TextBox aBox, bBox, cBox; double a, b, c; void invoer_TextChanged(object box, EventArgs ea) { try { a = double.Parse(aBox.Text); b = double.Parse(bBox.Text); c = double.Parse(cBox.Text); uitvoer.Text = this.oplossingen(); grafiek.Invalidate(); } catch (Exception e) { ((TextBox) ) box . BackColor = Color.Red; uitvoer.Text = e.Message; } }
Parabool: oplossingen string oplossingen ( ) { } -b ± b2-4ac 2a double discriminant, noemer, wortel; discriminant = b*b – 4*a*c; noemer = 2*a; if (discriminant<0) return "geen nulpunten"; else { } wortel = Math.sqrt(discriminant); return ( (–b –wortel)/noemer + " en " +(–b+wortel)/noemer );
Parabool: functie uitrekenen double functie ( double x) { return a * x * x + b * x + c; }
Parabool: grafiek tekenen void grafiek_Paint (object o, PaintEventArgs pea ) { Graphics gr = pea.Graphics; int x, y,oldy; double xw, yw, schaal; schaal = 0.03; oldy = 0; for ( x=0 ; x<500 ; x++ ) { } xw = schaal * x ; w w y = yw / schaal ; ( -250) y = this.functie ( x ); (int) (250-( )) if (x>0) gr.DrawLine(Pens.Blue, , , x, y ); x-1 oldy oldy = y; }
Overzicht programma-constructies kun je doen kun je uitrekenen Opdrachten Toekenning Aanroep void-methode return-opdracht while-opdracht for-opdracht { ... } - bundeling if-opdracht try/catch-opdracht Expressies Constante Variabele Aanroep methode Expressie met operatoren Expressie met haakjes new-expressie this (cast)-conversie