Einführung in Java Silke Trißl Wissensmanagement in der Bioinformatik Ein kurzes Java Tutorial n Programmiersprache Java – Einfach zu erlernen n Einfache Syntax – Platform-unabhängig n Linux, Unix, Windows, Macintosh, … – Objekt-orientiert n Kann aus Bausteinen zusammengesetzt werden – verfügt über Vielzahl von Laufzeitbibliotheken n andere Programmierer haben häufige Probleme schon gelöst – Interpretiert n muß vor Ausführung kompiliert werden Silke Trißl: Bioinformatik für Biophysiker, WS 2006/07 2 1 Java und how to start n Java zum Herunterladen – http://java.sun.com/j2se/1.5/ Silke Trißl: Bioinformatik für Biophysiker, WS 2006/07 3 Java Grundstruktur // Klassenname.java public class Klassenname { // Ausführbare Klasse (Hauptprogramm) public static void main (String [] args) { Programmanweisungen } } n n Alle Anweisungen müssen innerhalb einer Klasse stehen Klassen sind die Bausteine, aus denen Java Anwendungen aufgebaut sind. Silke Trißl: Bioinformatik für Biophysiker, WS 2006/07 4 2 Programme kompilieren und ausführen public class Hallo_Welt { public static void main (String [] args) { System.out.println("Hello World"); } } javac Hallo_Welt.java Hallo_Welt.class Hallo_Welt.java java Hallo_Welt Silke Trißl: Bioinformatik für Biophysiker, WS 2006/07 5 Java n Syntax – Variablen und Klassennamen müssen mit einem Buchstaben beginnen – Sonderzeichen (@, +, #, ...) und reservierte Java-Wörter (if, class, ...) sind nicht erlaubt – Elementare Anweisungen werden immer durch ein Semikolon abgeschlossen n Konventionen – Aussagekräftige Variablennamen verwenden – Variablennamen beginnen mit Kleinbuchstaben, Klassennamen mit Großbuchstaben – Groß- / und Kleinschreibung beachten Silke Trißl: Bioinformatik für Biophysiker, WS 2006/07 6 3 Kommentare n Einzeilig a = 5; n // dies ist ein Kommentar // bis zum Ende jeder Zeile Mehrere Zeilen /* Hier kann man einen Kommentar über mehrere Zeilen einfügen a = 5; alles wird ignoriert */ Silke Trißl: Bioinformatik für Biophysiker, WS 2006/07 7 Hallo Welt n Einfachstes Programm: Hallo_Welt.java // Hallo_Welt.java public class Hallo_Welt { public static void main (String [] args) { System.out.println("Hallo Welt"); } } System.out.println() System.out.print() String + neue Zeile String ohne neue Zeile Silke Trißl: Bioinformatik für Biophysiker, WS 2006/07 8 4 Variablendeklaration n n Alle verwendeten Variablen in Java müssen vor der ersten Nutzung deklariert werden Datentyp- Ganzzahl – int – short – long – byte 4 2 8 1 Byte Byte Byte Byte 232 Zahlen 216 Zahlen 264 Zahlen 28 Zahlen Silke Trißl: Bioinformatik für Biophysiker, WS 2006/07 9 Variablendeklaration - cont. n n n Datentyp- Gleitkommazahlen – float 4 Byte ± 3,4 *1038 (6 bis 7 sign. Nachkommast.) – double 8 Byte ± 1,8 * 10308 (15 sign. Nachkommast.) Weitere Datentypen – char – boolean 1 Zeichen true / false Sonderfall (als vordefinierte Klasse): – String Zeichenketten Silke Trißl: Bioinformatik für Biophysiker, WS 2006/07 10 5 Variablendeklaration - Beispiele n Allgemein Datentyp variablenname = Ausdruck; n Beispiele double gehalt; // Deklaration int freieTage = 15; // Initialisierung long erdbevoelkerung; char jaZeichen; boolean fertig; String adresse; jaZeichen = 'j'; fertig = true; // Zuweisung Silke Trißl: Bioinformatik für Biophysiker, WS 2006/07 11 Konstanten n In Java bezeichnet man eine Konstante mit dem Schlüsselwort final. final double CM_PER_INCH = 2.54; Silke Trißl: Bioinformatik für Biophysiker, WS 2006/07 12 6 Operatoren n n Addition, Subtraktion, Multiplikation und Division +, -, *, / (% für Modulo) int n = 5; int a = 2 * n; // a ist 10 int b = 15 / 2; int c = 15 % 2; double d = 15.0 / 2.0; // b ist 7 // c ist 1 // d ist 7.5 Silke Trißl: Bioinformatik für Biophysiker, WS 2006/07 13 Kurzschreibweisen n binäre arithmetische Operatoren int x = 0; x = x + 4; n // gleichbedeutend mit x += 4; Inkrementieren und Dekrementieren int i = 0; i = i + 1; int n = 0; int a = n++; a = n--; // gleichbedeutend mit i++; // Vorsicht: gibt auch ++i; // a = 0; Test mit ++n; // dekrementieren Silke Trißl: Bioinformatik für Biophysiker, WS 2006/07 14 7 Relationale und boolesche Operatoren n Gleichheitstest 3 == 7 n Ungleichheit 3 != 7 3 <= 7 3 > 7 n // false // true // true // false Logisch und (&&) und Logisch oder (||) (x != 0) && (1/x > 0) // beide müssen true sein (a == 5) || (b <= 7) // eine muß true sein Silke Trißl: Bioinformatik für Biophysiker, WS 2006/07 15 Bedienungsanweisungen - if ... else n Allgemeiner Aufbau: if ( boolean_expression ) statement(s)_1 } else { statement(s)_2 } n { Der boolesche Ausdruck wird ausgewertet. – Falls true: statement_1 wird ausgeführt – Falls false: statement_2 wird ausgeführt Silke Trißl: Bioinformatik für Biophysiker, WS 2006/07 16 8 Flußdiagramm - if ... else - Silke Trißl: Bioinformatik für Biophysiker, WS 2006/07 17 Aufgabe: if ... else 1. Schreibt eine Anwendung, die den Satz "weiter so" ausgibt, wenn der Umsatz des Angestellten größer ist als der Sollumsatz. – natürlich ist auch die Konstruktion if (Bedingung) else if (Bedingung) else { { { ... ... ... } } } 2. Damit können wir eine gestaffelte Ausgabe einführen – – – – Umsatz Umsatz Umsatz Umsatz > 2 * Sollumsatz: > 1,5 * Sollumsatz: = Sollumsatz: < Sollumsatz: Silke Trißl: Bioinformatik für Biophysiker, WS 2006/07 Ausgezeichnet Gut Na ja Gefeuert! 18 9 Tastatureingaben n Eingaben von Strings, Zahlenwerten, ... von der Tastatur – mit der Methode 'prompt()' – immer als String – muss zum richtigen Datentyp umgewandelt werden ... public static void main(String[] args) { // Einlesen der Argumente String eingabe; eingabe = prompt("Gib einen Wert ein"); } ... Silke Trißl: Bioinformatik für Biophysiker, WS 2006/07 Methode prompt() import java.io.*; 19 Importieren der notwendigen Bibliothek - vor public class public class Einlesen { public static void main(String[] args) { ... eingabe = prompt("Gib einen Wert ein"); } Methodenaufruf mit Argument(en) public static String prompt(String frage) { System.out.print(frage+” “); byte [] buffer = new byte [255]; try { System.in.read(buffer, 0, 255); } catch ( IOException e ) { System.out.println(e.getMessage()); } return new String(buffer); Methode Versuche einzulesen, wenn es nicht klappt gib die Fehlermeldung aus } } Silke Trißl: Bioinformatik für Biophysiker, WS 2006/07 20 10 Umwandeln n von String zu int oder double ... public static void main(String[] args) { // Einlesen der Argumente String eingabe; int value1; double value2; eingabe = prompt("Gib einen Wert ein"); value1 = Integer.parseInt(eingabe); // zu int value2 = Double.parseDouble(eingabe); // zu double } ... Silke Trißl: Bioinformatik für Biophysiker, WS 2006/07 21 Fehlerhandling n Es können Fehler beim Umwandeln eines Strings in einen anderen Datentypen auftreten – String ist wirklich ein String und keine Zahl – ',' anstelle von '.' in reellen Zahlen – ... n Exception muss abgefangen werden ... eingabe = prompt("Gib einen Wert ein"); try { value1 = Integer.parseInt(eingabe); // zu int } catch (NumberFormatException ne) { System.out.println("War keine Zahl " + ne.getMessage()); } ... Silke Trißl: Bioinformatik für Biophysiker, WS 2006/07 22 11 Strings n vordefinierte Klasse 'String' String e = ""; // ein leerer String String hallo = "Hallo"; n Verknüpfung von Strings mit '+' String name = "Student"; String message = hallo + " " + name; int stud_nummer = 3; System.out.println(message + stud_nummer); // int stud_nummer wird zu String konvertiert Silke Trißl: Bioinformatik für Biophysiker, WS 2006/07 23 Teilstrings n m Buchstaben eines Strings ab Position n ausgeben – 1. Buchstabe im Wort hat den Positionswert 0 int n = 1; int m = 4; String hallo = "Hallo"; String s = hallo.substring(n,m); n // ergibt all Buchstabe n eines Strings ausgeben int n = 3; String hallo = "Hallo"; char c = hallo.charAt(n); Silke Trißl: Bioinformatik für Biophysiker, WS 2006/07 // liefert l 24 12 Länge n Länge eines Strings String hallo = "Hallo"; int n = hallo.length(); n // Ergebnis ist 5 Strings auf Gleichheit testen String hallo = "Hallo"; String hi = "hallo"; boolean greet = hallo.equals(hi); greet = hallo.equalsIgnoreCase(hi); // false // true Silke Trißl: Bioinformatik für Biophysiker, WS 2006/07 25 Bestimmte Schleifen - for n Allgemeiner Aufbau for ( Anfang; Bedingung; Iteration ) statement(s) } n { Beispiel System.out.println("Alle geraden Zahlen bis 10:"); for ( int i = 0; i < 11; i += 2) { System.out.print(i + " "); } Silke Trißl: Bioinformatik für Biophysiker, WS 2006/07 26 13 Beispiel - for n Wir wollen für einen bestimmten Zeitraum jedes Jahr Geld einzahlen und den Saldo am Ende des Jahres erfahren for ( int jahre = 1; jahre <= n; jahre++ ) { saldo += zahlung; double zins = saldo * zinsSatz / 100; saldo += zins; System.out.println("Saldo nach Jahr " + jahre + " beträgt " + saldo); } System.out.println("Saldo am Ende der Laufzeit: " + saldo); Silke Trißl: Bioinformatik für Biophysiker, WS 2006/07 27 break - Anweisung n Ermöglicht den Sprung aus einer Schleife – Beispiel: wie eben, aber wenn der Saldo einen gewissen Betrag erreicht hat, wollen wir aufhören for ( int jahre = 1; jahre <= n; jahre++ ) { saldo += zahlung; double zins = saldo * zinsSatz / 100; saldo += zins; if ( saldo > ziel ) break; System.out.println("Saldo nach Jahr " + jahre + " beträgt " + saldo); } System.out.println("Saldo am Ende der Laufzeit: " + saldo); Silke Trißl: Bioinformatik für Biophysiker, WS 2006/07 28 14 Aufgabe: for 1. Schreibt eine Anwendung, mit der alle Vorkommen eines bestimmten Buchstabens in einem String gezählt werden. Hint: Dazu müsst ihr jeden Buchstaben ansehen, mit der Vorgabe vergleichen und wenn sie gleich sind, dann die Zahl der Vorkommen erhöhen. n Beispiel: – 'a' kommt in dem String 'abbabeatles' 3 mal vor 2. Der wenn der gesuchte Buchstabe mindestens 3 mal vorkommt, soll “Hat 3 oder mehr Vorkommen” ausgegeben werden. Hint: mit break-Anweisung Silke Trißl: Bioinformatik für Biophysiker, WS 2006/07 29 Anwendungen - Debug und Breakpoints n Debug – Laufzeitfehler aufspüren n n n n Endlosschleifen Zugriff auf Position n+x eines Strings oder Arrays der Länge n ... Breakpoint – Setzen in Eclipse: Doppelklick links neben dem Text (Bild folgt) – Code wird bis zum Breakpoint ausgeführt n n Step over Step into arbeitet nächste Anweisung ab geht in eine Methode oder Klasse Silke Trißl: Bioinformatik für Biophysiker, WS 2006/07 30 15 Breakpoint setzen Silke Trißl: Bioinformatik für Biophysiker, WS 2006/07 31 Debugging starten Silke Trißl: Bioinformatik für Biophysiker, WS 2006/07 32 16 Debug - Ansicht Stoppe das Programm Variablen, die an diesem Punkt bekannt sind Step into Step over Gehe bis zum nächsten Breakpoint Silke Trißl: Bioinformatik für Biophysiker, WS 2006/07 33 Debug - Step over Variablen ändern sich über den Programmverlauf Silke Trißl: Bioinformatik für Biophysiker, WS 2006/07 34 17 Schleifenkonstrukte - while n n Wiederholung von Anweisungen Allgemeiner Aufbau (Prüfung am Anfang): while ( boolean_expression ) statement(s) } n { Der boolesche Ausdruck wird ausgewertet. – Falls true: statement(s) werden ausgeführt, anschließend der boolsche Ausdruck nochmals geprüft. – Falls false: keine Anweisung wird ausgeführt. Silke Trißl: Bioinformatik für Biophysiker, WS 2006/07 35 Flußdiagramm - while n Flußdiagramm für eine Schleife mit Prüfung am Anfang Silke Trißl: Bioinformatik für Biophysiker, WS 2006/07 36 18 Beispiel - while n Wie lange dauert es, einen bestimmten Geldbetrag anzusparen, wenn man einen Zinssatz pro Jahr annimmt und jedes Jahr den gleichen Geldbetrag deponiert? while (saldo < ziel) { saldo += zahlung; double zins = saldo * zinsSatz / 100; saldo += zins; jahre++; } Silke Trißl: Bioinformatik für Biophysiker, WS 2006/07 37 Schleifenkonstrukte - do ... while n Allgemeiner Aufbau (Prüfung am Ende): do { statement(s) } while ( boolean_expression ); n n do-Anweisung wird immer erst einmal ausgeführt. Der boolesche Ausdruck wird ausgewertet. – Falls true: die gesamte do-Anweisung wird noch einmal ausgeführt. – Falls false: keine weitere Anweisung wird ausgeführt. Silke Trißl: Bioinformatik für Biophysiker, WS 2006/07 38 19 Flußdiagramm - do ... while n Flußdiagramm für eine Schleife mit Prüfung am Ende Silke Trißl: Bioinformatik für Biophysiker, WS 2006/07 39 Beispiel - do ... while n Gleiches Problem wie vorhin, nur der Nutzer soll entscheiden, ob er weiter sparen will. do { saldo += zahlung; double zins = saldo * zinsSatz / 100; saldo += zins; jahre++; System.out.println("Der Saldo ist " + saldo); // fragen, ob weiter sparen, und Eingabe holen } while (input.equals("Y")); Silke Trißl: Bioinformatik für Biophysiker, WS 2006/07 40 20 Vergleich - for - while - do ... while bestimmte Anzahl Einlesen bis EOF Einlesen bis !ok for for(i=0; i<END; i++){ statements; } for(i=0; i!=EOF; i++){ in.read(); } readUser(); for (i=0; !ok; i++) { readUser(); } while i = 0; while (i<END) { statements; i++; } while (!EOF) { in.read(); } readUser(); while ( ok ) { readUser(); i = 0; if (i<END) { do { statements; i++; } while (i<END); if (!EOF) { do { in.read(); while (!EOF); do ... while do } } { readUser(); while ( ok ); } } } Silke Trißl: Bioinformatik für Biophysiker, WS 2006/07 41 21