Voorbeeld Java-programma import java.io.*; één klasse...met één functie...met één opdracht public class Hallo { public static void main (String[] a) { System.out.println("Hallo!"); accolades begrenzen klasse, resp. functie
Soorten opdrachten Toekennings -opdracht: verander het geheugen Aanroepp van een andere methode: voer eerst de opdrachten in die methode uit, en ga daarna verder waar je gebleven was en dat kunnen zelf ook weer aanroepen zijn van weer andere methodes... dus de waar was ik gebleven administratie i i is best ingewikkeld! ikk
Syntax van opdracht opdracht functie object. naam ( expressie ) variabele = expressie ;, ;
Functies definiëren en functies aanroepen public static void printkwadraat (int x) { int kw; kw = x*x; System.out.println( x + " kwadraat is " + kw ); public static ti void main (String[] a) { printkwadraat(2); printkwadraat(3); printkwadraat(10); Aanroep van een functie voert opdrachten uit in de body daarvan
Functies met een resultaat t public static int kwadraat (int x) { int kw; kw = x*x; return kw; public static ti void main (String[] a) { System.out.println( "kijk: " + kwadraat(2) ); System.out.println( kwadraat( kwadraat(5) ) );
Syntax van methode-definitie d iti functie definitie public private static type void functie naam ( par-decl ), { opdracht declaratie
Publieksvraag Definieer een functie driewerf die je zo kunt aanroepen: public static void main (String[] a) { System.out.println( driewerf ("Hoera!") );
Di Driewerf-functie ff Definieer een functie driewerf die je zo kunt aanroepen: declaratie van de parameter public static String driewerf (String x) { String res; res = x + x + x ; definitie van return res; de functie aanroep van public static void main (String[] a) de functie { System.out.println( driewerf ("Hoera!") ); waarde van de parameter
Communicatie met functies Parameters : aanroeper geeft waarde door aan de methode Functie-resultaat : methode geeft waarde terug aan de aanroeper met een return-opdracht
Syntax van opdracht opdracht functie object. naam ( expressie ), variabele = expressie ; ; return expressie ; if ( expressie ) opdracht while ( expressie ) opdracht else opdracht { opdracht declaratie
Opdrachten herhalen h public static void main (String[] a) { int x; zolang de x = 1; voorwaarde while ( x<1000 ) geldig is x = 2*x; body wordt System.out.println( "kijk:" +x); steeds opnieuw uitgevoerd X 1024 128 256 512 16 32 641248 1024
Meer opdrachten herhalen h private static int tweelog naam ((int ) n) { int x, t; x=1; t=0; teller telt while ( x<1000 n ) hoe vaak er wordt { x = 2*x; verdubbeld t = t+1; accolades smeden return t; twee opdrachten tot één body
Publieksvraag Schrijf een functie driewerf met een String-parameter, t die 3 herhalingen ervan oplevert driewerf("hoera!") "Hoera!Hoera!Hoera!" S hijf f ti l f Schrijf een functie veelwerf met een String-parameter, en een getal n die n herhalingen van de String oplevert
Veelwerf-functie f private static String veelwerf (String s, int n) { String result; int t; t = 0; result = ""; while ( t<n ) { result = result + s ; t = t+1 ; return result;
Publieksvraag Maak een methode macht met ttwee parameters grondtal exponent (reëel getal) (natuurlijk getal) die de waarde oplevert van grondtal exponent
Machtsverhef-functie h f ti 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;
Vergelijk-operatoren < <= > >= == kleiner dan kleiner dan of gelijk aan groter dan groter dan of gelijk aan gelijk aan x=5 x wordt 5! x 5 is x gelijk aan 5?!= ongelijk aan x==5 is x gelijk aan 5?
Expressies Expressie met een getal als waarde 2 * (lengte + breedte) primitief type int Expressie met een tekst als waarde "Hallo " + persoon object- type String Expressie i met een waarheid als waarde teller < exponent primitief type boolean
Boolean expressies Vergelijken van waarden x <= y Combineren van andere boolean expressies met logische operatoren && and or George Boole x<0 && y>0 (1815-1864)! not! (x==0 && y==0) x!=0 y!=0
Variabelen aanpassen x = x * 2 ; nieuwe waarde wordt oude waarde Afgekorte notaties: x = x * 2 ; x *= 2 ; wordt vermenigvuldigd met wordt vermeerderd met x = x + 5 ; x += 5 ; 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 opdracht opdracht functie object. naam ( expressie ) ; variabele = expressie ;, return expressie ; if ( expressie ) opdracht while ( expressie ) opdracht { opdracht declaratie else opdracht for ( expr ; expr ; expr ) opdracht
Herhaalde herhalingh Body van een for-opdracht is een opdracht dat kan zelf ook een for-opdracht opdracht zijn! int x, y; for (y=0; y<10; y++) { for (x=0; x<10; y x++) System.out.print( "+" ); System.out.println(); ++++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ++++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Extreme gevallen Nul keer herhalen for (y=0; y<0; y++) System.out.println("hoi"); Oneindig g vaak herhalen while (true) Audio.play( "birds gotta fly" ); System.out.println("hoi"); deze opdracht komt nooit aan de beurt!
Onbedoelde oneindigheid id x=1; aantal = 0; while (aantal<10) { x = x*2; aantal = aantal+1; accolades vergeten...
Compiler-meldingen ldi Foutmeldingen variabele a niet gedeclareerd ee d puntkomma vergeten... Waarschuwingeng 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: boolean stopt (String filenaam) {... void gemeen (String filenaam) Ha! { while ( stopt(filenaam) ) En dit dan? x++; wat komt er dan uit: stopt( "Gemeen.java" )?
Het Halting-problem is onoplosbaar stopt( "Gemeen.java" ) Twee mogelijkheden: Gemeen stopt t 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
Hoofdstuk 5 Strings en arrays
Functies en methoden Eigen functie int k; k = kwadraat(5) ; Functie uit een library double d; d = Math. sqrt(10) ; Methode: functie met een object onderhanden String s, t; s="hallo"; t = s. substring(1, 3) ;
Static methoden en methoden Eigen static methode geen object kwadraat(5) Static methode uit een library geen object, maar library-naam Math. sqrt(10) Methode: functie met een object onderhanden String-object String s; s="hallo"; s. substring(1, 3)
String-methodes th int length ( ) boolean equals (String s) String concat (String s) String substring (int start) String substring (int start, int eind) String touppercase () String tolowercase ( )
concat en substring String s, t, u, v, w; s = "ham"; t ="burger"; u = s.concat(t); s + t ; v = u.substring(3); w = u.substring(3, bti 7); ham s t u v w burger hamburger burger 012345678 van en tot en hamburger met zonder burg
Losse letters String substring (int begin, int eind) String voorletter; voorletter = s. substring(0,1); charh charat (int positie) char eerste; char eerste; eerste = s. charat(0);
Pi Primitieve iti types int gehele getallen -17, -5, 0, 3, 178 double reëele getallen 3.141, 2.0, -1.5E8 boolean waarheidswaarden false, true char losse symbolen A, B, Z, a, 4, #, :
Publieksvraag // schrijf een static methode die telt hoe // vaak een symbool voorkomt in een String // voorbeeld-aanroep: int n; n = freq( e, some text ); // hint: gebruik een for opdracht
Tel symbool-frequentie private static int freq(char x, String s) { int aantal; aantal = 0; int t; for (t=0; t<s.length(); t++) if ( s.charat(t)==x ) return aantal; aantal ++ ;
String versus char String klasse object-verwijzing nul, een of meer "" "A" "hello" methoden equals == concat < substring + char primitief type directe waarde precies één symbool A operatoren
Arrays Array: rij genummerde variabelen declaratie van een array tabel 5 length int [] tabel; 0 1 tabel = new int [5]; creëren van het eigenlijke array-object 2 3 4
Gebruik van een array t zijn echte variabelen: tabel [2] = 37; tabel 5 length x = tabel [2] + 5; x 42 if (tabel.length<10)... tabel.length = 10; 37 0 1 2 3 4 echter de lengte mag je niet wijzigen
Gebruik van een array variabele als index in de array tabel [0] = 0; tabel [1] = 0; tabel [2] = 0; tabel [3] = 0; tabel [4] = 0; tabel 5 0 0 0 0 length 0 1 2 3 for (t=0; t<5; t++) tabel [t] = 0; 0 4
Array als parameter int totaal ( int [ ] tabel ) { int resultaat; int t; resultaat = 0 ; for (t=0; t<tabel.length; t++) resultaat += tabel [t] ; tabel 5 12 95 11 length 0 1 2 return resultaat; 23 15 3 4
Array als parameter int kleinste ( int [ ] tabel ) { int resultaat; int t; resultaat = tabel [0] ; for (t=0; t<tabel.length; t++) if (tabel [t] < resultaat) resultaat = tabel [t]; return resultaat; tabel 5 12 95 11 23 15 length 0 1 2 3 4
Tel symbool-frequentie private static int freq (char x, String s) { int aantal; aantal = 0; int t; char c; for (t=0; t<s.length(); t++) { c = s.charat(t); () if (c==x) aantal ++ ; return aantal;
Turf de frequentie van elke letter private static int voidfreq frequentie (char x, ( String s) { int aantal; [ ] aantal; aantal = 0; new int [128]; int t; char c; for (t=0; t<s.length(); t++) { c = s.charat(t); () if (c==x) ( c>='a' && c<='z' ) aantal ++ [c] ++; ; for ( c='a' ; c<='z' ; c++ ) return System.out.println( aantal; c + ": " + aantal[c] );
Methode met een array als resultaat t private static int [] freq frequentie (char x, ( String s) { int aantal; [ ] aantal; aantal = 0; new int [128]; int t; char c; for (t=0; t<s.length(); t++) { c = s.charat(t); () if (c==x) ( c>='a' && c<='z' ) aantal ++ [c] ++; ; return aantal;
Prakticumopgave 2 Turing machines
Het Halting-problem is onoplosbaar Nietes! Deze methode lost het op: boolean stopt (String filenaam) {... void gemeen (String filenaam) Ha! { while ( stopt(filenaam) ) En dit dan? x++; wat komt er dan uit: stopt( "Gemeen.java" )?
Alan Turing (1912-1954) 1954) 1936: "On computable numbers, with an application to the Entscheidungsproblem "
Alan Turing (1912-1954) 1954) en ik :-)
Alan Turing (1912-1954) 1954) 1936: On computable numbers Turing machine 1943: Enigma crack 1946: eerste Engelse computer 1950: Computing machinery and intelligence p g y g Turing test "can machines think?"
Wiskundige logica (1910) Russell Principia Mathematica: waarheid en bewijsbaarheid b id (1931)( ) Gödel incompleteness-stelling: g sommige waarheden zijn niet bewijsbaar (1900) Hilbert 30 open vragen, o.a.: kun je van elke uitspraak beslissen, of hij waar is of niet? (Entscheidungsproblem) 52
Turing Machine: idee Tape met symbolen Machine met toestand t Transitie-regels Startconfiguratie Machine stopt als geen regels toepasbaar Machine kan o.a. echt rekenen! http://math.hws.edu/tmcm/java/labs/xturingmachinelab.ht ml 53
Berekenbare getallen Berekenbaar getal: output van een Turing-machine De Turing-machines zijn aftelbaar (op alfabetische volgorde van regels-tekst) t) Sommige Turing-machines geven geen output (omdat de berekening niet eindigt) Halting-probleem: eindigt de berekening van Turing-machine met nummer M? 54