Opdrachten herhalen public void tekenscherm (object o, PEA pea) { int x; x = 1; while ( x<1000 ) x = 2*x; pea.graphics. DrawString ( x.tostring(), ft, br, 10, 10); zolang de voorwaarde geldig is body wordt steeds opnieuw uitgevoerd X 1024 128 256 512 16 32 641248
Veelwerf-methode private static string veelwerf (string x, int n) { string result; int t; t = 0; result = ""; while ( t<n ) { result = result + x ; t = t+1 ; return result;
Machtsverhef-methode private static double macht (double x, int n) { double result; int t; t = 0; result = 1; while ( t<n ) { result = result * x ; t = t+1 ; return result;
Variabelen aanpassen x = x * 2 ; nieuwe waarde wordt oude waarde Afgekorte notaties: x = x * 2 ; x *= 2 ; x = x + 5 ; x += 5 ; wordt vermenigvuldigd met wordt vermeerderd met wordt opgehoogd x = x + 1 ; x += 1 ; x ++ ;
Herhaling met een teller int t ; t = 0; for while ( ( t=0 t<x ) ; t<x ; t++ ) { // doe iets nuttigs // met t t ++ ;
Syntax van opdrachten opdracht klasse naam methode naam ( expressie ) ; object expressie. property naam +=, variabele = expressie ; return expressie ; while ( expressie ) opdracht for ( expr ; expr ; 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( ) { Stralen s = new Stralen(); s.text = "Stralen"; Application.Run(s);
Stralen class Stralen { int x, y; : Form int n=1; public Stralen( ) { this.paint += teken; this.mousemove += beweeg; this.mouseclick += klik; void beweeg (obj o, MEA mea) { this.x = mea.x; this.y = mea.y; this.invalidate(); void klik (obj o, EA ea) { this.n ++; this.invalidate(); void teken (obj o, PEA pea) { Graphics g = pea.graphics; g.fillellipse( Brushes.Black, this.x-20, this.y-20, 40, 40); for (int t=0; t<=this.n; t++) g.drawline( Pens.Black, this.x, this.y, this.width * t / this.n, this.height );
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?
Expressies Expressie met een getal als waarde 2 * (lengte + breedte) value type int Expressie met een tekst als waarde "Hallo " + persoon type string Expressie met een waarheid als waarde teller < exponent objectvalue type bool
Bool expressies Vergelijken van waarden x <= y Combineren van andere bool-expressies met logische operatoren &&! and or not x<0 && y>0 George Boole (1815-1864)! (x==0 && y==0) x!=0 y!=0
Publieksvraag Schrijf een methode deelbaar, die antwoordt of x deelbaar is door d private static bool deelbaar (int x, int d) { return x%d == 0 ; waarheidswaarde als resultaat
Publieksvraag Schrijf een methode kleinstedeler, die antwoordt wat de kleinste deler is van x private static int kleinstedeler (int x) { int d; d = 2; while ( x%d!= 0) d = d+1; return d ; probeer ze één voor één
for-opdracht 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 ); lege body for ( d=2 ;!deelbaar(x,d) ; d++ ) ;
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; y x++) gr.drawstring( "+", br, ft, 10*x, 10*(y+1) ); + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Extreme gevallen Nul keer herhalen for (y=0; y<0; y++) gr.drawstring("hoi", br, ft, 10, 10); Oneindig vaak herhalen deze opdracht wordt 0 keer uitgevoerd 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 for (x=0; totaal<100; x++) ; totaal = totaal + x ; Puntkomma teveel
Compiler-meldingen Foutmeldingen variabele niet gedeclareerd puntkomma vergeten... Waarschuwingen variabele ongebruikt unreachable code statement has no effect while-statement doesn t terminate deze waarschuwing is theoretisch onmogelijk!
Het Halting-problem is onoplosbaar Nietes! Deze methode lost het op: bool stopt (string filenaam) {... Ha! En dit dan? wat komt er dan uit: void gemeen (string filenaam) { while ( stopt(filenaam) ) x++; stopt( "Gemeen.cs" )?
Het Halting-problem is onoplosbaar stopt( "Gemeen.cs" ) Twee mogelijkheden: Gemeen stopt wel...dus stopt levert true op...dus gemeen bijft hangen! Gemeen stopt niet...dus stopt levert false op...dus gemeen stopt direct! void gemeen (string filenaam) { while ( stopt(filenaam) ) x++; tegenspraak! dus stopt kan helemaal niet bestaan
Andere Halting -achtige problemen Wordt een opdracht ooit uitgevoerd? Is een programma een virus? en hoe werkt een virus-checker dan? òf te streng: keurt teveel af òf te coulant: laat sommige door lastig gevaarlijk
Het Halting-problem is onoplosbaar Er bestaan dus onoplosbare problemen! Alan Turing (1936): On computable numbers, with an application to the Entscheidungsproblem door Hilbert in 1900 bedachte uitdaging voor de nieuwe eeuw
On computable numbers... Introduceert als gedachtenexperiment een Logical Computing Machine gegevens op een papierstrook programma 10 jaar voor de eerste computer! in een geheugen, of zelfs: ook op de papierstrook "Turing machine"
Syntax van opdrachten opdracht klasse naam methode naam ( expressie ) ; object expressie. property naam +=, variabele = expressie ; return expressie ; while ( expressie ) opdracht for ( expr ; expr ; expr ) opdracht blok