Informatik I - Einstiegskurs Dr. Henrik Brosenne Georg-August-Universität Göttingen Institut für Informatik Basiert auf dem Einstiegskurs im Wintersemester 2009/10 von Markus Osterhoff Wintersemester 2012/13 Inhalt Einstiegskurs Programmiersprachen Bedingungen Schleifen Compilermeldungen, typische Fehler Programmiersprachen Programme sagen“ dem Computer, was er tun soll. ” Aber wie sagt es der Benutzer? Beispiel Star Trek IV, Zurück in die Gegenwart Scott: Computer! Computer? Hallo Computer! ” . . . Tastatur, wie rückständig!“ Editor – Compiler – Ausführung Editor Der Quellcode wird vom Programmierer in einem Editor geschrieben und als Datei (datei.java) abgespeichert. Compiler Der Quellcode wird vom Compiler (javac) in einen Bytecode (datei.class) übersetzt, der weitgehend betriebssystem- und plattformunabhängig ist, aber noch kein maschinenverständliches Programm. Java Virtual Machine (JVM) Der Bytecode kann mit der JVM java ausgeführt werden. Das Programm wird zur Laufzeit interpretiert und so auf der jeweiligen Maschine (Prozessor + Betriebssystem) lauffähig. Editor – Compiler – Ausführung Quellcode $ cat > Hallo.java file: Hallo.java class Hallo { public static void main(String args[]) { System.out.println( "Hallo Welt!" ); javac Hallo.java } Bytecode file: Hallo.class 0000000010011110100011111 0110110110000111010110010 1010101101110100001101111 1110000111101000010001001 1101000111010101110111011 0000011011010110111110100 0000000000010110010011010 1010000111101111010110011 1000110111000011011110000 } Grundgerüst java Hallo Ausführung HelloWorld $ cat -n HelloWorld.java 1 2 class HelloWorld { public static void main ( String [] args ) { System . out . println ( " Hallo Einstiegswelt ! " ); 3 } 4 5 } $ javac HelloWorld.java $ java HelloWorld Hallo Einstiegswelt! HelloWorld 1 2 class HelloWorld { public static void main ( String [] args ) { System . out . println ( " Hallo Einstiegswelt ! " ); 3 } 4 5 } class HelloWorld { ... } eine Klasse“ mit dem Namen HelloWorld wird erstellt ” HelloWorld 1 2 class HelloWorld { public static void main ( String [] args ) { System . out . println ( " Hallo Einstiegswelt ! " ); 3 } 4 5 } public static void main (...) { ... } Dies ist das Hauptprogramm, der Einstiegspunkt. Details zu dem unverständlichen Blah-Blah – in Info I. HelloWorld 1 2 class HelloWorld { public static void main ( String [] args ) { System . out . println ( " Hallo Einstiegswelt ! " ); 3 } 4 5 } System.out.println("Hallo"); Eine Anweisung: Eine bestimmte Funktion, System.out.println, wird aufgerufen. Ergebnis: Der Text wird ausgegeben. HelloWorld 1 2 class HelloWorld { public static void main ( String [] args ) { System . out . println ( " Hallo Einstiegswelt ! " ); 3 } 4 5 } "Hallo Einstiegswelt!" Dies ist ein String-Literal, ein im Quellcode hart eincodierter“ Text. ” HelloWorld 1 2 class HelloWorld { public static void main ( String [] args ) { System . out . println ( " Hallo Einstiegswelt ! " ); 3 } 4 5 } "Hallo Einstiegswelt!" Strings, Zeichenketten“, stehen in Anführungszeichen. ” HelloWorld 1 2 class HelloWorld { public static void main ( String [] args ) { System . out . println ( " Hallo Einstiegswelt ! " ); 3 } 4 5 } System.out.println( ... ) Dieser Aufruf einer Java-Bibliothek kann Texte und Zahlen ausgeben. HalloKommentar 1 class Hall oKomment ar { /* Hier beginnt das Hauptprogramm */ public static void main ( String [] args ) { System . out . println ( " Hallo Einstiegswelt ! " ); // Wir haben eine Meldung ausgegeben } /* Hier endet das Hauptprogramm */ 2 3 4 5 6 7 8 } $ javac HalloKommentar.java $ java HalloKommentar Hallo Kommentar! Zwischen /* und */ steht ein Kommentar; dieser ist für den Menschen und wird vom Compiler ignoriert. Alles ab // bis zum Zeilenende ist ebenfalls ein Kommentar. HalloKommentar Kommentare dienen dem Programmierer, sich in seinem Wust von Programmzeilen zurechtzufinden, dienen anderen Programmierern, zu verstehen, was in einem Programm passiert. Erfahrungswert. Nach drei Wochen hat man alles über sein Programm vergessen, egal wie gut man es mal kannte. Möglichst gute Variablennamen. Möglichst aussagekräftig kommentieren. HalloGrafZahl 1 2 class HalloGrafZahl { public static void main ( String [] args ) { System . out . println ( " Hallo Graf Zahl ! " ); System . out . println (1337 + 42); 3 4 } 5 6 } $ javac HalloGrafZahl.java $ java HalloGrafZahl Hallo Graf Zahl! 1379 HalloVariable 1 2 3 class HalloVariable { public static void main ( String [] args ) { int sieben = 7; System . out . println ( sieben ); 4 } 5 6 } $ javac HalloVariable.java $ java HalloVariable 7 int sieben = 7; Eine Variable vom Typ int (Integer = Ganzzahl) wird angelegt und mit dem Wert 7 initialisiert. HalloFormel 1 2 3 4 5 class HalloFormel { public static void main ( String [] args ) { double pi = 3.14159; int fuenf = 5; double umfang ; 6 umfang = 2 * pi * fuenf ; System . out . println ( " Umfang = " + umfang ); 7 8 } 9 10 } $ javac HalloFormel.java $ java HalloFormel Umfang = 31.4159 double pi = 3.14159; Eine Variable vom Typ double (Gleitkommazahl) wird angelegt und mit dem Wert 3.14159 initialisiert. double umfang; Eine Variable vom Typ double (Gleitkommazahl) wird angelegt. HalloFormel 1 2 3 4 5 class HalloFormel { public static void main ( String [] args ) { double pi = 3.14159; int fuenf = 5; double umfang ; 6 umfang = 2 * pi * fuenf ; System . out . println ( " Umfang = " + umfang ); 7 8 } 9 10 } $ javac HalloFormel.java $ java HalloFormel Umfang = 31.4159 umfang = 2 * pi * fuenf; Die Berechnung wird ausgeführt, das Ergebnis wird in der Variablen umfang gespeichert. HalloFormel 1 2 3 4 5 class HalloFormel { public static void main ( String [] args ) { double pi = 3.14159; int fuenf = 5; double umfang ; 6 umfang = 2 * pi * fuenf ; System . out . println ( " Umfang = " + umfang ); 7 8 } 9 10 } $ javac HalloFormel.java $ java HalloFormel Umfang = 31.4159 System.out.println("Umfang" + umfang); Die Addition“ von einem String mit einer Zahl ist ein String. ” Die Zahl wird als Zeichenkette im Zehnersystem dargestellt. Vorsicht, Fallen! Java achtet auf Groß- und Kleinschreibung Linux achtet auf Groß- und Kleinschreibung $ javac programmdatei.java — Endung! $ java klassenname — keine Endung! Konzepte: Variablen, Datentypen Ein Programm, in dem alle Zahlen fest einprogrammiert sind, ist langweilig. Der Benutzer muss Eingaben machen können / es müssen Dateien eingelesen werden können. Zwischenergebnisse müssen gespeichert werden. → Variablen ≡ benannte Speicherbereiche Es gibt unterschiedliche Arten von Zahlen“ ” Zum Beispiel ganze Zahlen (int) und Gleitkommazahlen (double). Es gibt auch Zeichenketten (String) und Boolsche Ausdrücke (bool: true, false). → Datentypen Konstanten int: Ganze Zahlen, dezimale Schreibweise, keine Anführungszeichen: 1 , 42 , -17 double: Reelle zahlen“, Punkt statt Komma: ” 3.14159 , -17.5 , 0.0 String: Zeichenketten zwischen Anführungszeichen: "Hallo Welt" , "3.14159" , "" Der Wert steht zur Compile-Zeit fest. Variablen Deklaration: double PI; Zuweisung: PI = 3.14159; Deklaration + Zuweisung (Initialisierung): double E = 2.718; Bei einem String: String grussworte = "Liebe Programmierer"; Variablen Und was kann man damit machen? Ausgeben: String grussworte = "Liebe Programmierer"; System.out.println(grussworte); Neu zuweisen: int ganzeZahl = 3; ganzeZahl = 42; Rechnen! Operatoren Rechnen! Java kennt natürlich die vier Grundrechenarten“: ” int b, c, summe, differenz, produkt, quotient; oder alternativ: double b, c, summe, differenz, produkt, quotient; summe = b+c; differenz = b-c; produkt = b*c; quotient = b/c; Operatoren summe = b+c; differenz = b-c; produkt = b*c; quotient = b/c; Der Wert, der aktuell in der Variablen b gespeichert ist, wird abgerufen. Der Wert, der aktuell in der Variablen c gespeichert ist, wird abgerufen. Die mathematische Operation wird ausgeführt. Das Ergebnis wird in der Variablen (z.B. summe) gespeichert – der Variablen wird ein neuer Wert zugewiesen. Der Zuweisungsoperator int b = 3, c = 7; int summe = 11; summe = b+c; Der Zuweisungsoperator ist kein mathematisches Gleichheitszeichen! Es wird zugewiesen; der Wert von summe spielt keine Rolle! Dies ist kein Vergleich! Inkrement-/Dekrementoperatoren int i = 1; i = i+1; i++; In Zählschleifen wird eine Variable bei jedem Durchlauf um 1 erhöht. Dies ist relativ viel zu schreiben, kommt sehr häufig vor – es gibt eine abkürzende Schreibweise, die (fast) jeder Programmierer versteht: i++ Der Wert der Variablen i wird ausgelesen; es wird 1 addiert; das Ergebnis wird der Variablen i zugewiesen. Analog: i-- Operatoren mit Strings String text = "Das Ergebnis lautet " double radius = 5; double umfang = 2*3.14159*radius; System.out.println( text + umfang ); Die Addition“ von Zeichenketten ist die Konkatenation“ (das ” ” Aneinanderhängen) Die Addition“ von Zeichenketten mit Zahlen ist das Anhängen der ” dezimalen Schreibweise der Zahl an den String. Inhalt Einstiegskurs Programmiersprachen Bedingungen Schleifen Compilermeldungen, typische Fehler Bedingungen Java-Programme werden Anweisung für Anweisung ausgeführt: tue dies; tue das; nun dies; mache jenes; rechne aus; gib aus; Man braucht Kontrollstrukturen Alternativen (Abzweigungen, Entscheidungen) Wiederholungen (Schleifen) Alternativen Alternativen tue dies; tue das; nun dies; WENN dieseBedingungErfülltIst: tueDieses; SONST: tueJenes; mache jenes; rechne aus; gib aus; Alternativen tue dies; tue das; tue jenes; if ( x == 1 ) { tue dies hier; und das noch; und jenes; } else { oder halt dies; und dann das; und schließlich mich; } und immer das hier; und dann auch noch dieses; höre auf; Alternativen Alternative if -- else 1 2 3 4 class ifelsetest { public static void main () { int a = 3; int b = 7; 5 if ( a == b ) 6 7 else 8 System . out . println ( " a und b sind anders " ); 9 } 10 11 System . out . println ( " a und b sind gleich " ); } Nur wenn die Bedingung erfüllt (== true) ist, wird die nächste Anweisung ausgeführt. Ist die Bedingung jedoch nicht erfüllt (== false), wird die Anweisung übersprungen. Stattdessen wird die Anweisung hinter else ausgeführt. Alternativen Der else-Zweig ist optional: 1 2 3 4 class iftest { public static void main () { int m = 3; int n = 7; 5 if ( m < n ) 6 System . out . println ( " m ist kleiner als n . " ); 7 } 8 9 } Nach if bzw. else wird genau eine Anweisung ausgeführt. Ist das nicht meistens zu wenig? Ein Block von Anweisungen ist eine Anweisung.“ ” Mehrere Anweisungen lassen sich zu einem Block zusammenfassen. Alternativen Mehrere Anweisungen lassen sich zu einem Block zusammenfassen: 1 2 3 class Block { public static void main ( String [] args ) { if ( 1 == 2 ) { System . out . println ( " 1 ist gleich 2. " ); System . out . println ( " Das ist falsch . " ); 4 5 } 6 else { 7 System . out . println ( " 1 ist ungleich 2. " ); System . out . println ( " Das ist richtig . " ); 8 9 } 10 } 11 12 } $ javac block.java ; java Block 1 ist ungleich 2. Das ist richtig. Ein Block wird durch geschweifte Klammern definiert. Auch die Klassendefinition und die Main-Funktion sind ein Block! Der Vergleichsoperator Erinnerung: Der Zuweisungsoperator, = int b = 3, c = 7; int summe = 11; summe = b+c; Die Zuweisung wird ausgeführt, es findet kein Vergleich statt. Neu: Der Vergleichsoperator, == if ( summe == b+c ) ...else ... Inhalt Einstiegskurs Programmiersprachen Bedingungen Schleifen Compilermeldungen, typische Fehler Konzepte: Schleifen Eine Alternativen kann die eine oder die andere Anweisung einmal ausführen. Eine Schleife kann eine Anweisung (oder einen Block von Anweisungen) mehrmals ausführen. Beispiel 1 2 3 4 5 class Nullkommaeins { public static void main ( String [] args ) { double nke = 0.1; double sum = 0.0; int i ; 6 for ( i =0; i <10; i ++) 7 sum = sum + nke ; 8 9 System . out . println ( " Summe : " + sum ); 10 } 11 12 } Konzepte: Schleifen ; for ( i=0 ; i<10 ; i++ ) vor der Schleife System.out.println( i ); ; Initialisierung Schleifen-Bedingung Erhöhung des Zählers Schleifen-Durchlauf nach der Schleife Konzepte: Schleifen for ( i=0 ; i<10 ; i++ ) anweisung; for wird typischerweise für Zählschleifen verwendet: i=0 — ein Index (Zählvariable) wird initialisiert i<10 — solange eine Bedingung erfüllt ist, wird anweisung; — die Anweisung (oder der Block) wiederholt i++ — nach jedem Schleifendurchlauf (vor dem nächsten Test der Bedingung) wird der Wert von i um 1 erhöht Schleifen: Beispiele for ( i=0 ; i<10 ; i++ ) System.out.println( i ); Die Zahlen von 0 bis 9 werden zeilenweise ausgegeben. Schleifen: Beispiele for ( i=10 ; i>0 ; i-- ) System.out.println( i ); Die Zahlen von 10 bis 1 werden zeilenweise ausgegeben. Schleifen: Beispiele for ( i=10 ; i>0 ; i-- ) System.out.println( 2*i + 1 ); Die Zahlen von 21 bis 3 werden in Zweierschritten zeilenweise ausgegeben. Schleifen: Beispiele for ( i=1 ; i<11 ; i++ ) System.out.println( i + " " + 2*i ); Es werden immer zwei Zahlen nebeneinander ausgegeben, die erste zählt von 1 bis 10 die zweite zählt in Zweierschritten von 2 bis 20. weitere Schleifen while (bedingung) ... Ähnlich zu for, aber nur ein Argument do ... while (bedingung); Ähnlich zu while, aber Test nach dem Durchlauf for (String s: args) ... Ein Iterator über ein Feld von Objekten Inhalt Einstiegskurs Programmiersprachen Bedingungen Schleifen Compilermeldungen, typische Fehler Compilermeldungen, typische Fehler KLASSE.java:1: class, interface, or enum expected CLASS KLASSE { class wird klein geschrieben Compilermeldungen, typische Fehler KLASSE.java:2: ’;’ expected PUBLIC STATIC VOID main(String[] args) { public static void wird klein geschrieben Compilermeldungen, typische Fehler KLASSE.java:6: not a statement for (i=0, i<13; i++) Semikolon, kein Komma Compilermeldungen, typische Fehler KLASSE.java:7: not a statement for (j==i; j>0; j--) Zuweisungsoperator! Compilermeldungen, typische Fehler KLASSE.java:13: ’)’ expected System.out.println("Ergebnis: " result); KLASSE.java:13: illegal start of expression System.out.println("Ergebnis: " result); Konkatenation mit ’+’ Compilermeldungen, typische Fehler 7 public static int xxx ( int m , int n ) { if ( m == 0) return 1; if ( n == 0) return 2; if ( m != 0 && n != 0) return 3; 8 } 1 2 3 4 5 6 fehler2.java:8: missing return statement javac erkennt nicht die Logik: das dritte if ist automatisch erfüllt