1 / 163

Folien zum Kurs Programmierung mit Java

Einfhrung in die Programmierung. 1. Der Begriff des Algorithmus2. Sprache und Grammatik3. Entwurf von Programmen4. Programmieren mit JAVAVariablen und Typen, OperatorenAnweisungen, Wiederholungsanweisungen, VerzweigungenBeispiele: Auswertung von Formeln, Monte-Carlo-Simulation, Molekl-Kineti

bud
Download Presentation

Folien zum Kurs Programmierung mit Java

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


    1. Folien zum Kurs „Programmierung mit Java“ SS 2004 Siehe www.informatik.uni-essen.de http://www.informatik.uni-essen.de/SysMod/lehre/Chemie/

    2. Einführung in die Programmierung 1. Der Begriff des Algorithmus 2. Sprache und Grammatik 3. Entwurf von Programmen 4. Programmieren mit JAVA Variablen und Typen, Operatoren Anweisungen, Wiederholungsanweisungen, Verzweigungen Beispiele: Auswertung von Formeln, Monte-Carlo-Simulation, Molekül-Kinetik, Zelluläre Automaten Einführung in die Objektorientierung Programmierung von Java-Applets

    3. 1. Der Begriff des Algorithmus

    4. Andere Sicht auf den Begriff Algorithmus Definition (Algorithmus als Funktion) Ein Algorithmus beschreibt eine Funktion (oder Abbildung) f: E ?A, wobei E die Menge der zulässigen Eingabedaten und A die Menge der möglichen Ausgabedaten bezeichnet.

    5. Eigenschaften von Algorithmen (1) Abstraktion oder Abstrahierung Durch einen Algorithmus wird kein Einzelproblem, sondern eine Klasse von Problemen gelöst. Das konkrete Einzelproblem wird dann durch Parameter definiert. Beispiel: "Berechne die Fakultät von n" löst eine Problemklasse; ein konkreter Einzelfall ergibt sich durch Angabe eines konkreten Parameters, z.B. n=4711.

    6. Eigenschaften von Algorithmen (2) Finitheit statische Finitheit (= Endlichkeit der Beschreibung des Algorithmus) dynamische Finitheit (= Endlichkeit von Datenstrukturen und Zwischenergebnissen)

    7. Eigenschaften von Algorithmen (3) Terminierung Terminierende Algorithmen enden nach endlich vielen Schritten mit einem Ergebnis. Aber auch nicht-terminierende Algorithmen sind von Bedeutung. Beispiele sind: Software zur Steuerung von technischen Prozessen Betriebssysteme Kommunikationsprotokolle für Rechnernetze

    8. Eigenschaften von Algorithmen (4) Determinismus Zu jedem Zeitpunkt der Ausführung des Algorithmus besteht maximal eine Fortsetzung, ansonsten heißt der Algorithmus nicht-deterministisch. Ordnet man den möglichen Fortsetzungen Wahrscheinlichkeiten zu, dann erhält man einen stochastischen Algorithmus.

    9. Eigenschaften von Algorithmen (5) Determiniertheit Bei gleichen Startbedingungen liefert der Algorithmus im Wiederholungsfalle das gleiche Ergebnis. D.h. es wird nicht notwendigerweise die eindeutige Reihenfolge gefordert. Beispiel: Die Auswertung von 3+4+5 kann erfolgen durch (3+4)+5 oder durch 3 + (4+5).

    10. Eigenschaften von Algorithmen (6) Effizienz Ressourcenverbrauch eines Algorithmus, v.a. bzgl. Laufzeit oder Anzahl von Rechenschritten, meist abhängig von der Problemgröße. Man spricht z.B. von linearer Ordnung O(n), quadratischer Ordnung O(n2), oder logarithmischer Ordnung O(log n).

    11. Eigenschaften von Algorithmen (7) Portabilität oder Portierbarkeit, Übertragbarkeit von Programmen zwischen verschiedenen Rechnern und verschiedenen Betriebssystemen. Portabilität ist im allgemeinen nicht ohne weiteres gegeben (Ausnahme: Java-Programme)

    12. Eigenschaften von Algorithmen (8) Robustheit und Zuverlässigkeit Wie gutmütig reagiert ein Programm auf fehlerhafte Eingabedaten? Wartbarkeit und Änderbarkeit Wie gut ist ein Algorithmus an veränderte Problemstellungen oder andere Anwendungsumgebungen anzupassen?

    13. Beispiele für Algorithmen Algorithmus zur Division von zwei Zahlen. (Ein robuster Algorithmus, muß den Fall der Division durch Null berücksichtigen). Verfahren zur Bestimmung des größten gemeinsamen Teilers (ggT) zweier natürlicher Zahlen. Verfahren zur Auswertung des geklammerten Ausdrucks (a+b)*c. Hier kann man einen nicht-deterministischen Algorithmus konstruieren, der bei gleichen Eingabewerten a, b und c unterschiedlich abläuft, aber dennoch immer das gleiche Ergebnis liefert. Hinweis: (a+b)*c=a*c+b*c.

    14. Beispiele für Algorithmen (2) Ein Algorithmus zur Bestimmung der Lösungsmenge der quadratischen Gleichung ax2 +bx+c=0 muss für alle reellwertigen Parameter a,b und c korrekt arbeiten, also auch den Fall von nicht-reellen Lösungen berücksichtigen. Ein Algorithmus zur Berechnung von p kann nicht dynamisch finit sein, die produzierte Darstellung von p besitzt ja unendlich viele Stellen.

    15. Wie beschreibt man Programme präzise und vollständig? Dazu benötigt man eine (formale) Sprache und eine Grammatik, d.h. es wird ein Formalismus oder Repräsentation benötigt um Programme aufschreiben zu können

    16. Programmentwicklung durchläuft verschiedene Stadien Verstehen und Analysieren des Problems Finden und Präzisieren eines Lösungsweges Aufschreiben des Algorithmus in sog. Pseudo-Code, der aus einer Mischung von natürlichsprachlichen und programmiersprachlichen Anteilen besteht Übersetzen des in Pseudo-Code notierten Algorithmus in eine Programmiersprache Das entstandene Programm auf dem Rechner von Syntaxfehlern befreit und auf Funktionsfähigkeit getestet Einsatz des Rechners zum Bearbeiten des Programms und Finden von Lösungen für konkrete Parameterwerte

    17. Rolle von Programmen auf einem Rechner

    18. Algorithmen werden in unterschiedlicher Form benötigt Maschinenprogramme (Maschinencode) Für Menschen verständliche Programme (problemorientiert) Lesbarkeit, Modifizierbarkeit, …

    19. Sprachen müssen also definiert werden Syntax Aufbau von Worten und Sätzen einer Sprache Semantik Bedeutung der Sprachelemente (Worte und Sätze) der Sprache Hier: nur künstliche (mathematische) Sprachen

    20. Notwendige Elemente einer Sprachdefinition Zunächst: Syntax … Zeichenvorrat … Alphabet Regeln, nach denen aus dem Alphabet neue zusammengesetzte Elemente der Sprache gebildet werden können

    21. Grundbegriffe … Alphabet A (Vorrat von Zeichen) freies Monoid A* (Menge aller Zeichenfolgen über dem Alphabet A) Wörter w Î A* (Elemente aus A*) Sprache L Í?A* (Eine Teilmenge von A*)

    22. Beispiele für (künstliche) Sprachen Wörter und Sprachen sind allgemein definiert $$§§ ist ein Wort über dem Alphabet {$,§} L={0, 1, 01, 11, 001, 011, 101, 111, ....} ? {0,1}* ist eine Sprache, welche sogar eine Interpretation hat (Binärzahlen), allerdings ist L hier nicht präzise definiert! "Die Katze jagt die Maus!" ist ein Wort über dem Alphabet, welches auch die Leerzeichen enthält {Katze, Maus, Die, die, !, ,}. Die Elemente des Alphabets kann man als Atome der Sprache bezeichnen.

    23. Es wird ein Regelwerk zur Wortbildung benötigt

    24. Formale Sprache & Grammatik Definition (Formale Sprache) Die Menge aller Wörter, die aus dem Startsymbol S ableitbar sind und nur aus Terminalsymbolen bestehen, heißt die durch die Grammatik G erzeugte formale Sprache L(G). Beispiel (Wort einer formalen Sprache) Sei G eine Grammatik welche die Programmiersprache XYZ beschreibt, d.h. es gelte L(G)=XYZ. Ein Wort dieser formalen Sprache ist ein syntaktisch korrektes XYZ-Programm. (Für XYZ kann stehen Pascal, Modula-2, C, C++, ..., Java).

    25. Beispiel für formale Sprache Die Grammatik G1 = (N1 , T1 , P1 , S1) definiert einen kleinen Auszug der deutschen Sprache.

    26. Ein Beispiel für einen Ableitungsprozess Satz ? Subjekt Prädikat Objekt „.“ ? Artikel Substantiv Prädikat Objekt „.“ ? „die“ Substantiv Prädikat Objekt „.“ ? „die“ „Maus“ Prädikat Objekt „.“ ? „die“ „Maus“ „beißt“ Objekt „.“ ? „die“ „Maus“ „beißt“ Artikel Substantiv „.“ ? „die“„Maus“ „beißt“ „die“ Substantiv „.“ ? „die“„Maus“ „beißt“ „die“ „Katze“„.“

    27. Beschreibung des Regelwerks ist komplex Die Angabe der Mengen N und T in der Regel einfach durch Aufzählung Die Regelmenge P ist allerdings in den meisten praktischen Fällen etwas umfangreicher (zwar endlich aber groß) Noch eine Bemerkung: bisher haben wir damit „nur“ die Syntax betrachtet!

    28. Darstellung der Syntax von Sprachen Syntaxdiagramme und EBNF … sind Hilfsmittel um die Regelmengen für die Syntax zu beschreiben.

    29. Wichtige Regeln für Syntaxdiagramme Syntaxdiagramme repräsentieren Produktionsregeln. Syntaxdiagramme sind (oft) numeriert. Kreise stehen für Zeichen des Alphabets (wie a,b, ..z, A,...,Z, +,-,*,/, ? <,>, ...) Ovale stehen für Terminalsymbole (Atome wie float, int, if, else, ...) Rechtecke stehen für Nicht-Terminalsymbole (block, ..., literal, variable, ...) Die Durchlaufrichtung eines Diagramms wird durch Pfeile angegeben Syntaxdiagramme können auch rekursiv verwendet werden

    30. Beispiel für Syntaxdiagramme

    31. Übungen (Zur Syntax von Namen) Beschreiben Sie das oben gezeigte Syntaxdiagramm verbal. Geben Sie jeweils zwei gültige und zwei ungültige Java-Identifier an. Geben Sie das (ziemlich triviale) Syntaxdiagramm für Java-Digit an.

    32. Kommentare zur Namensgebung Es gibt weitere Möglichkeiten zur Namensgebung in Java. So sind nach einem einleitenden Java-Letter auch Sonderzeichen wie *, % und @ erlaubt, sogar der komplette Unicode-Zeichensatz (nicht nur ASCII) ist erlaubt! Aber man ahnt die Konfliktmöglichkeiten mit Java-Operatoren! Also man beschränke sich am besten auf die ASCII-Zeichen A-Z und a-z. Positive Beispiele zur (pragmatischen) Namensgebung sind z.B. AnzahlVersuche,AnzahlErfolge, MittelwertDerMessreihe, aktuellerWert, etc.

    33. Backus-Naur-Normal-Form (BNF) und Erweiterte BNF Zwei ältere Notationen sind genauso mächtig wie die Syntaxdiagramme BNF , Extended BNF Metasymbole in BNF sind: ::= bedeutet: ist definiert als ... | bedeutet: oder. Nichtterminalsymbole (entsprechen den Rechtecken in den Syntaxdiagrammen) werden in spitze Klammern gesetzt, also z.B. <Programm>

    34. Beispiel: Regeln für das Bilden beliebig langer Summen <Summe> ::= <Summand> | <Summand> + <Summe> <Summand> ::= a | b | c a + c + b + c

    35. EBNF und BNF EBNF und BNF sind gleich mächtig EBNF ist komfortabler -> reichere Metasyntax = ”definiert als” (”::=” in BNF) (...|...) genau eine Alternative aus der Klammer muß stehen [ ... ] Inhalt der Klammer kann stehen oder nicht { ... } Inhalt der Klammer kann n–fach stehen, n = 0 . Ende der Produktion (in BNF nicht speziell markiert). Nichtterminalsymbole sind einfach Symbole Terminalsymbole sind speziell gekennzeichnet, durch Klammerung mit Anführungszeichen (”...”).

    36. 3. Entwurf von Programmen 3.1 Schrittweise Verfeinerung oder Top-Down-Entwurf 3.2 Bottom-Up-Entwurf 3.3 Greedy-Algorithmen

    37. 3.1 Schrittweise Verfeinerung Betrachtung dieses Prinzips geht auch ohne Programmiersprache Prinzip: Betrachte Algorithmus in Pseudosprache Ersetze eine Anweisung in der Pseudosprache durch einfachere Anweisungen Mache das so lange bis alle Anweisungen sog. elementare (oder „atomare“) Anweisungen sind, die von der „Maschine“ ausgeführt werden können.

    38. Beispiel: Haushalts - Roboter Koche eine Kanne Tee --- komplex (1) Gib Teebeutel in Kanne (2) Gib kochendes Wasser in die Kanne (3) Lasse 3 Minuten ziehen (4) Entferne Teebeutel aus der Kanne Die Anweisungen (1)-(4) müssen weiter verfeinert werden!

    39. Betrachte Anweisung (2) "Gib kochendes Wasser in die Kanne" (2.1) Fülle Topf mit Wasser (2.2) Stelle Topf auf Herdplatte (2.3) Warte bis Wasser kocht (2.4) Gieße das Wasser vom Topf in die Kanne

    40. Betrachte Anweisung (2.3) "Warte bis Wasser kocht" (2.3.1) Schalte Herdplatte ein (2.3.2) Wiederhole "Messe die Wassertemperatur" solange bis "Wassertemperatur nahe bei 100 C" (2.3.3) Schalte die Herdplatte aus

    41. Bemerkungen zu Top-Down Ansatz Beachte: manche Anweisungen oben müssen noch weiter präzisiert werden Das Verfahren wird solange fortgesetzt, bis man auf „elementare“ Anweisungen kommt, die die Maschine (Haushaltsrobot oder Rechner/Java) direkt ausführen kann Übung: Tic Tac Toe

    42. Tic Tac Toe Machen Sie einen Entwurf für ein Programm zum Spielen von Tic-Tac-Toe. Zwei Spieler setzen abwechselnd einen Kreis (O) bzw. ein Kreuz (X) in ein 3x3-Spielfeld. Der Spieler, welcher zuerst 3 Kreise bzw. 3 Kreuze in einer Reihe, Linie oder Diagonale hat, hat gewonnen. Das Programm soll abwechselnd Kreise und Kreuze entgegen nehmen, die Korrektheit der Eingabe prüfen, nach jedem Zug die Spielposition ausgeben, etc. Schreiben Sie Ihren Entwurf in Pseudo-Code auf.

    43. 3.2 Bottom-Up-Entwurf Entgegengesetzt zu TopDown Zunächst abgeschlossene Teilaufgaben lösen und implementieren Lösungsalgorithmen für Teilaufgaben können dann in Form von Prozeduren oder Modulen vorliegen, aus denen größere Lösungsalgorithmen zusammengesetzt werden können.

    44. Anwendungen des Bottom-Up Prinzips Z. B. Numerik Vektorrechnung Matrizen Numerische Integration … In der Regel wird man eine Kombination von TopDown und BottomUp verwenden

    45. Java Programmierung Variablen und Typen, Operatoren Anweisungen, Wiederholungsanweisungen, Verzweigungen Beispiele: Auswertung von Formeln Monte-Carlo-Simulation Molekül-Kinetik Zelluläre Automaten Einführung in die Objektorientierung Programmierung von Java-Applets

    46. Java Programmierung: Hello World //HelloWorld class HelloWorld { public static void main (String args[ ]) { System.out.println("Hello" + "World!!"); } }

    47. Aufbau von Java - Programmen Klassen Klassen bestehen aus Variablen- und Methoden-Vereinbarungen Methoden bestehen aus Kopf Rumpf -> enthält Algorithmus Startpunkt eines Programms: die spezielle Methode main

    48. Variablen Variablen haben Namen (frei wählbar) z. B. i Typ (ist fest kann in Java nicht geändert werden) Wert (kann durch Zuweisung geändert werden) D. h. Variablen sind wie Behälter, die einen Wert aus einem bestimmten Wertevorrat (durch den Typ festgelegt) aufnehmen können

    49. Deklaration von Variablen Variablen existieren nicht automatisch, sie müssen deklariert werden: int Ordnungszahl; boolean IstMetall; float pi; String Name; int i,j,k;

    50. Deklaration von Variablen (2) mit gleichzeitiger Initialisierung: int i = 123; float r = 5.5; boolean sunny = true;

    51. Datentypen Datentypen (=Typen, Wertebereiche, Operationen) Es gibt drei Arten von Typen: sog "primitive" Datentypen byte, short, int, long (von 8, 16, 32 bzw. 64 bit Länge) float, double (mit 32 bzw. 64 bit Länge) char (16 Bit, wegen Unicode) boolean (true, false) Klassen (später) Arrays oder Felder (später)

    52. Wertzuweisung (assignment) // Mit sofortiger Initialisierung double SpeedOfLight = 2.99792458E8, Pi = 3.141592, PlanckConstant = 6.26176E-34, BoltzmannConstant = 1.38066E-23; // … oder erst deklarieren float Frequency, Temperature; char EinZeichen; boolean Hit; // ... und spaeter initialisieren Frequency = 5.1E12; Temperature = 273.0; EinZeichen = 'X‘; Hit = false;

    53. Konstante in Java (siehe Pascal) Es gibt keine echten Konstanten. Diese werden durch den Zusatz final nachgebildet: Beispiele: final float Pi = 3.141592; final double PlanckConstant = 6.26176E-34; Das Java-System sorgt dafür, dass final -Variablen nicht modifiziert werden können

    54. Die Klasse String (Zeichenkette) Hier nur drei Beispiele für String-Variable (ausführlicher später). String S0 = " Das Ergebnis lautet: ", S1 = "Hello", S2 = "Es geht auch \n Zeilenumbruch!", S3 = "... oder \t Tabulator!" ; Übung: \n und \t sind sog. Character Escape Codes, die einen Zeilenumbruch bzw. Tabulatorvorschub durchführen!

    55. Literale repräsentieren Werte primitiver Typen Hier eine kleine Auswahl: 13, -47, 10000000, 13L, 007, 011, 0XA, 0XB, 5.677777, 5.677777F, -2.5, 10.1E45, .36E-2, true, false, 'a', 'b', '7', '#', "Hello", "7", Zu welchen Datentypen gehören die o.g. Literale? Geben Sie ein paar plausible, aber nicht zulässige Literale an!

    56. Ausdrücke und Operatoren Die grundlegenden arithmetischen Operatoren sind +, -, *, /, und %. Das %-Zeichen stellt die Modulo-Funktion dar. Es gibt eine Reihe weiterer Operatoren …

    57. Beispiel: Arithmetische Operatoren class ArithmeticOperators { public static void main (String args[ ]) {System.out.println("Dealing with operators!!"); int e,m,c; m = 47; c = 11;// Wertzuweisung an m und c e = m*c*c; // Arithmetische Operation System.out.println("e = m*c*c = " + e); System.out.println("e = m*c*c = " + m*c*c); System.out.println("e = m+c = " + (m+c) ); System.out.println("e = m-c = " + (m-c) ); System.out.println("e = m/c = " + (m/c) ); System.out.println("e = m%c = " + (m%c) ); } }

    58. Zuweisungsoperatoren Wegen der Verwandtschaft von Java mit C und C++ gibt es (neben dem einfachen Zuweisungsoperator =) auch folgende, weitere Zuweisungsoperatoren.

    59. Inkrementieren & Dekrementieren Die Operatoren ++ und -- dienen zum inkrementieren (+1) und dekrementieren (-1). Problematisch ist, daß ++ und -- beide als postfix- und als präfix-Operatoren verwendet werden können, d.h y=x++; postfix-Operator: Erst Zuweisung von x an y, dann Inkrementierung von x y=++x; präfix-Operator: Erst Inkrementierung von x, dann Zuweisung von x an y,

    60. Vergleichsoperatoren Die Vergleichsoperatoren sind gegeben durch: ==, !=, <,>, >=, <=, beachtenswert ist der Gleichheitsoperator == Beispiele zur Anwendung von Vergleichsoperatoren: a == 0 b == b // ist immer true c<3E9 epsilon < e-9

    61. Logische Operatoren

    62. Präzedenz von Operatoren ... ist natürlich geregelt, z.B. "Punkt- geht vor Strich-Rechnung". Im Zweifelsfalle bitte Klammern setzen, auch im Hinblick auf die Lesbarkeit.

    63. Wiederholungsanweisungen Wiederholungsanweisungen oder Schleifen dienen dem mehrfachen Durchlaufen bestimmter Programmteile. Dabei wird meist ein Zähler (oder auch mehrere Zähler ) aufwärts (oder auch abwärts) gezählt.

    64. for-Schleifen (Zählschleifen) Sog. for-Schleifen bestehen aus den drei Teilen 1. Initialisierung der Schleife (Startwert festlegen, z.B. i=0) 2. Test der Zählvariablen (z.B. i<10) 3. Inkrementieren der Zählvariablen (z.B. durch i++ oder i=i+1) for (i = 0; i<10; i++) { ...<Schleifenrumpf ... }

    65. Beispiel for-Schleife Als sog. Pseudo-Code: Beginne mit i=0 Für i tue , (falls i < 10) folgendes Drucke den Wert von i … und erhöhe den Wert von i um 1. Als Java-Code: for (i=0; i<10; i++) System.out.println("Loop: " + i);

    66. Beispiel: Summation von Werten Endliche bzw. abbrechende Reihen können einfach mit for-Schleifen berechnet werden, wenn die Zahl der Summanden bekannt ist und die Form der Summanden eine Funktion des Index ist, wie z.B. bei der geometrischen Reihe. 1+2+3+4+ ... + 9. int summe = 0; for (i=1; i<10; i++) summe = summe + i;

    67. Geschachtelte (for-) Schleifen for (…) { s1; for (…) { s2;…} } Wie häufig werden die jeweiligen Anweisungen durchlaufen? Beispiel: Schreiben Sie eine 3-fache for-Schleife, welche alle Sekunden eines Tages im Format hh:mm:ss angibt, also von 00:00:00, 00:00:01, ...., über 11:55:59, .. bis 23:59:59.

    68. Schleifenabbruch durch Bedingungen while , do - Schleifen while (condition) { <Schleifenrumpf> } Beispiel zur while-Schleife int i = 1; while (i <5) { System.out.println ("Nr: " + i); i++; }

    69. Übungen & Fragen Ersetze die Anweisung i++ durch eine gleichwertige Anweisung! Was passiert, wenn i++ durch i-- ersetzt wird? Schreibe das Beispiel mit einer for-Schleife statt einer while-Schleife.

    70. do-Schleife do { <Schleifenrumpf> } while (condition)

    71. Beispiel do-Schleife /* Simple do loop */ class DoTest { public static void main (String args[]) { int x = 1; do { System.out.println ("Looping, round " + x); x++; } while (x <= 10); } }

    72. Wichtige Aspekte von Schleifen Die while- und die do-Schleife sind die allgemeinere Form im Vergleich zur for-Schleife Grundsätzlich kann es passieren, dass Schleifen während des Ablaufs nicht terminieren: (1) while (true) { … } (2) for (i=0; i>=0; i++) { … } Die Formulierung von Schleifen sollte daher mit Sorgfalt geplant werden

    73. Verzweigungsanweisungen Man kann den Programmablauf aber abhängig davon machen, ob bestimmte Bedingungen (Boolesche Ausdrücke) erfüllt sind. Bedingungen sind logische (=Boolesche) Ausdrücke, deren Auswertung entweder true oder false ergibt. Beispiele für typische Bedingungen sind m > 0 (* hängt ab vom Wert von m *) n=m (* hängt ab von Wert von n und m *) 2<3 (* ist immer true *)

    74. Allgemeinste Form: if-Anweisung Die Syntax der if-Anweisung ist if (condition) { <Anweisungsfolge1>} else { <Anweisungsfolge2> } Der else-Teil kann auch entfallen, dann spricht man von bedingter Anweisung. Beispiel (Bedingte Anweisung) if (a>b) System.out.println("a ist groesser als b!");

    75. Beispiel (AlternativAnweisungen) if (a>b) System.out.println("a ist groesser als b!"); else System.out.println ("a ist nicht groesser als b!“); Übungen und Fragen: Was bedeutet "condition"? Geben Sie Beispiele für "conditions" an Konstruieren Sie ein Beispiel! Kann in den Anweisungsfolgen wiederum eine if-Anweisung stehen?

    76. Switch-Anweisung Das switch-Konstrukt erlaubt die Auswahl zwischen mehreren (evtl. sehr vielen) Alternativen. //Switch-Example import java.lang.System; class SwitchExample { public static void main (String args[ ]) { System.out.println("Switch-example"); System.out.println("--------------");

    77. Switch (Fortsetzung) double x = 7.0, y = 3.0; char operator; operator = '-'; switch (operator) { case '+': System.out.println("x + y = " + (x+y)); break; case '-' : System.out.println("x - y = " + (x-y)); break; case '*' : System.out.println("x * y = " + (x*y)); break; case '/' : System.out.println("x / y = " + (x/y)); break; } } }

    78. Bemerkungen zur switch-Anweisung Die Auswahl erfolgt aus einer zu int kompatiblen Wertemenge switch ( int-ausdruck) { … } Die einzelnen switch - Arme laufen „ineinander“ wenn sie nicht explizit mit break; abgebrochen werden Es gibt noch die Möglichkeit auch einen sogenannten default - Arm zu definieren

    79. Weitere Beispiele (1) //temperatur class dh_temperatur_for { public static void main (String args[ ]) { System.out.println("Umrechnung für verschiedene Temperaturskalen"); int kelvin, celsius, fahrenheit; for (kelvin=250;kelvin<=320; kelvin++) { celsius = kelvin-273; fahrenheit = celsius*9/5 + 32 ; System.out.println("Kelvin : "+kelvin+" Celsius :"+celsius+ " °"+ " Fahrenheit : "+fahrenheit+" °"); } } }

    80. Weitere Beispiele (2) // Bestimmung von Pi mit Monte Carlo Simulation class piberechnung { public static void main (String args []) { int i; int treffer=0; double x,y; double pi; for (i=1; i<=5000; i++) { x=Math.random(); y=Math.random(); if ((x*x+y*y)<=1) treffer++; pi=(4*treffer/(double)i); System.out.println("Pi(n="+i+")="+pi); } } }

    81. Weitere Beispiele (3) public class Mittelwert { public static void main(String args[]) { int Anzahl; float Summe, Mittel; System.out.println( "Mittelwert einer Folge von float-Werten" ); Anzahl = 4; Summe = 10.0f; Mittel = Summe / Anzahl; System.out.println("Der Mittelwert beträgt " + Mittel); } }

    82. Weitere Beispiele (4) Nun wirklich eine Folge von Werten Folge repräsentiert durch eine Datei Ein/Ausgabe ist in Java etwas aufwändiger, da viele Spezialitäten sichtbar werden, die sonst versteckt werden

    83. Mittelwertbestimmung (1): Start des Programms public class Mittelwert { public static void main(String args[]) { System.out.println( "Mittelwert einer Folge von float - Werten" ); System.out.println("Bitte den Dateinamen eingeben, “+ "der die Werte enthaelt"); boolean weiter = true; String line; String DateiName = StringEingabe(); float f; float Summe=0.0f, Mittel=0.0f; int Anzahl=0;

    84. Mittelwertbestimmung (2): Eingabe static String StringEingabe () { String s = ""; try {java.io.BufferedReader d = new java.io.BufferedReader( new java.io.InputStreamReader(System.in)); s = d.readLine(); } catch (java.io.IOException e) {} return s.trim(); }

    85. Mittelwertbestimmung (3): Datei eröffnen java.io.BufferedReader DieDatei; try {DieDatei = new java.io.BufferedReader( new java.io.InputStreamReader(new java.io.FileInputStream(DateiName)));

    86. Mittelwertbestimmung (4): Verarbeitung der Werte while (weiter) { try { line = DieDatei.readLine(); if (line != null) { try { f= Float.valueOf(line).floatValue(); Summe = Summe +f; Anzahl ++; } catch (NumberFormatException e) {System.out.println ("String Conversion to float failed" + e);} } else weiter = false; // EOF occurred } catch (java.io.IOException e) {System.out.println (e); weiter = false;} }

    87. Mittelwertbestimmung (5): Abschluss: Datei schließen Mittelwert ausgeben try {DieDatei.close();} catch (java.io.IOException e) {System.out.println ("Error in closing file:"+DateiName+":" + e);} if (Anzahl > 0) { Mittel = Summe / Anzahl; System.out.println ("Der Mittelwert der " + Anzahl + " Werte beträgt " + Mittel ); } else System.out.println("Zu wenig Werte!");

    88. Arrays bzw. Felder Prinzip eines linearen Arrays

    89. Prinzip von Arrays Das zugrundeliegende Modell ist das homogene Cartesische Produkt. Alle Komponenten eines Arrays sind alle vom gleichen Grundtyp (Basistyp oder Komponententyp) Auf die Komponenten kann über Indizes (= Nummern) zugegriffen werden.

    90. Wichtige Aspekte von Arrays Die einzelnen Elemente werden von 0 bis n-1 durchnummeriert (-> Indexbereich) Die einzelnen Elemente sind über einen sogenannten Index zugreifbar, der aus dem Indexbereich sein muss. In Java werden Array-Objekte zuerst deklariert, danach generiert! Das Generieren geschieht mit new! Deklarieren und Generieren kann auch in einer einzigen Anweisung formuliert werden Beide Phasen sollten unterschieden werden! In der Regel haben Arrays eine feste Größe, nachdem sie generiert wurden.

    91. Erstes Array - Beispiel class ArrayExample1 { public static void main (String args[ ]) { System.out.println("Array-Example"); System.out.println("--------------"); int[ ] Feld; // Deklaration einer Array- // Variablen Feld = new int[10]; // Erzeugung eines Array- // Objekts !! // mit subscripts // 0,1,2, ..., 9 Feld [0] = 17; // Zugriff auf Array-Elemente Feld [1] = -5; System.out.println("Feld [0] :" + Feld [0]); System.out.println("Feld [1] :" + Feld [1]); } }

    92. Weitere Eigenschaften von Arrays Arrays lassen sich besonders gut durch for-Schleifen bearbeiten. Die Zählvariable durchläuft einfach den Index-Bereich des Arrays! Ein Array kann nicht erweitert oder verkleinert werden (stattdessen umkopieren! s.u.) Die Anzahl der Elemente in einem Array kann über das Attribut length abgefragt werden.

    93. Beispiel (Umkopieren von Werten mit Hilfe einer for-schleife) int i; int[ ] Quelle, Ziel; // Namen für 2 int-Arrays Quelle = new int[20];// Array der Laenge 20 Ziel = new int[Quelle.length + 10]; // Array der Laenge 30 . . for (i=0; i<Quelle.length;i++) { Ziel[i] = Quelle[i]; System.out.println(i + „: „+ Quelle[i]); }

    94. Mehrdimensionale Arrays ? Tabellen float[ ][ ] mat ; // Deklaration mat = new float [4][4]; // Erzeugen der Matrix ... // Zeilenweises Ausdrucken der Matrix mat for (int y = 0; y < 4; y++) // y ist nur innerhalb des for-Schleifenrumpfs verfügbar { for (int x = 0; x < 4; x++) // für x gilt dies auch { System.out.print(mat[y][x] + „ ”); }; System.out.println(); };

    95. Deklaration mit Initialisierung Initialisierung einer Array-Variablen: in geschweifte Klammern eingeschlossene Initialisierungswerte Beispiel (ein-dimensionales Arrays) String[ ] Element = { "Dummy", "Hydrogen", "Helium", "Lithium"}; // ist äquivalent zu String[ ] Element = new String[4]; Element[0] = "Dummy" ; Element[1] = "Hydrogen" ; Element[2] = "Helium"; Element[3] = "Lithim" ;

    96. Initialisierung im mehrdimensionalen Fall Beispiel (zwei-dimensionales Array) // 4x4-Einheits-Matrix double[ ][ ] identity = // die 4 x 4 //Einheits - Matrix { {1.0 , 0.0 , 0.0 , 0.0 } , {0.0 , 1.0 , 0.0 , 0.0 } , {0.0 , 0.0 , 1.0 , 0.0 } , {0.0 , 0.0 , 0.0 , 1.0 } , };

    97. Programmierung von Modellen aus Chemie und Physik Formelauswertung Monte-Carlo-Techniken Molekül-Kinetik Game of Life

    98. Beispiel: Mittlere freie Weglänge von Gasmolekülen (1) Formel zur Berechnung: mit

    99. Beispiel: Mittlere freie Weglänge von Gasmolekülen (2) import java.lang.System; class weglaenge { public static void main (String args [ ]) { int i=0; double L; // mittlere freie Weglaenge [m] double sigma=3.64E-10; // Molekueldurchmesser [m] double p=1013.25; // Druck [mbar] double T=298.15; // Temperatur [K] double U; // mittlere Geschwindigkeit [m*s^-1] double M=4.0; // Molmasse [g*mol^-1] double Na=6.022E23; // Avogadrokonst. [mol^-1] double R=8.314; // Gaskonst. [J*(mol*K)^-1] double pi=3.1415; // Pi

    100. Beispiel: Mittlere freie Weglänge von Gasmolekülen (3) U=Math.sqrt(3*R*T/M); L=1/(Math.sqrt(2)*pi*sigma*sigma*Na*p/(R*T)); System.out.println(""); System.out.println("Angabe von U in [m*s^-1]"); System.out.println("Angabe von L in [m]"); System.out.println("Standardtemperatur T="+T+"K"); System.out.println("Standarddruck p="+p+"mbar"); System.out.println("U="+U+" L="+L); System.out.println(""); for (T=273.15; T<=373.15; T+=10) { System.out.print("T="+T+" "); U=Math.sqrt(3*R*T/M); System.out.println("U="+U+" ");

    101. Beispiel: Mittlere freie Weglänge von Gasmolekülen (4) for (p=900.0; p<1100; p+=10) { L=1/(Math.sqrt(2)*pi*sigma*sigma*Na*p/(R*T)); i++; if ((i%5)>0) System.out.print("p="+p+" L="+L+" : "); if ((i%5)==0) System.out.println("p="+p+" L="+L+" "); } System.out.println(""); } } }

    102. Berechnung von p mit Monte-Carlo-Techniken (1) Bestimmung der Zahl p kann durch „Werfen“ von zufälligen Punkten (x,y) in den Einheitskreis durchgeführt werden Wir betrachten ein Quadrat mit Seitenlänge 1 im I. Quadranten mit dem einbeschriebenen Viertelkreis mit Radius 1 (Fläche p/4) Sei die Zahl der Treffer T und die Gesamtzahl der Würfe N, so ist p » T/N Mit wachsender Zahl der Würfe sollte das Ergebnis genauer werden

    103. Berechnung von p mit Monte-Carlo-Techniken (2)

    104. Berechnung von p mit Monte-Carlo-Techniken (3) import java.lang.System; class piberechnung { public static void main (String args [ ]) { int i; int treffer=0; double x,y; double pi; for (i=1; i<50001; i++) { x=Math.random(); y=Math.random(); if ((x*x+y*y)<=1) treffer++; pi=(4*treffer/(double)i); System.out.println("Pi(n="+i+")="+pi); } } } Für die Lösung mehrfacher Integrale sind Monte-Carlo-Methoden häufig den gewöhnlichen numerischen Integrationsmethoden überlegen. Betrachtet man z.B. ein bestimmtes Integral einer Funktion f(x) in einem gegebenen Intervall (a, b) auf der x - Achse, so kann die Fläche unter der Funktion f(x) im Intervall (a, b) als Fläche eines Rechtecks mit den Seiten b - a und h ausgedrückt werden. Die Höhe h ist dabei der Mittelwert der Funktion f(x) im Intervall (a, b). Zur Berechnung des bestimmten Integrals ist also nur die Bestimmung der mittleren Höhe h von f(x) auszuwerten. Dies geschieht einfach dadurch, daß man möglichst viele im Intervall (a, b) gleichverteilte x-Werte auswählt ("zieht") und jeweils die zugehörigen Funktionswerte f(x) bestimmt. Der Mittelwert über all diese Funktionswerte ergibt die gesuchte Höhe. Wenn man im zweidimensionalen Fall das Integral einer Funktion zweier unabhängiger Variablen f (x, y) über einer Fläche in der x-y-Ebene bilden will, so wählt man Zufallspunkte in dieser Fläche, bestimmt die Funktionswerte unter Verwendung von f , bildet deren Durchschnitt und multipliziert diesen Mittelwert mit der Fläche, über der integriert werden soll. In ähnlicher Weise kann man drei- und mehrdimensionale Integrale bestimmen. Für die Lösung mehrfacher Integrale sind Monte-Carlo-Methoden häufig den gewöhnlichen numerischen Integrationsmethoden überlegen. Betrachtet man z.B. ein bestimmtes Integral einer Funktion f(x) in einem gegebenen Intervall (a, b) auf der x - Achse, so kann die Fläche unter der Funktion f(x) im Intervall (a, b) als Fläche eines Rechtecks mit den Seiten b - a und h ausgedrückt werden. Die Höhe h ist dabei der Mittelwert der Funktion f(x) im Intervall (a, b). Zur Berechnung des bestimmten Integrals ist also nur die Bestimmung der mittleren Höhe h von f(x) auszuwerten. Dies geschieht einfach dadurch, daß man möglichst viele im Intervall (a, b) gleichverteilte x-Werte auswählt ("zieht") und jeweils die zugehörigen Funktionswerte f(x) bestimmt. Der Mittelwert über all diese Funktionswerte ergibt die gesuchte Höhe. Wenn man im zweidimensionalen Fall das Integral einer Funktion zweier unabhängiger Variablen f (x, y) über einer Fläche in der x-y-Ebene bilden will, so wählt man Zufallspunkte in dieser Fläche, bestimmt die Funktionswerte unter Verwendung von f , bildet deren Durchschnitt und multipliziert diesen Mittelwert mit der Fläche, über der integriert werden soll. In ähnlicher Weise kann man drei- und mehrdimensionale Integrale bestimmen.

    105. Molekül-Kinetik und Monte-Carlo-Simulation (1) Wir betrachten hier nur ein einziges Molekül in der x/y-Ebene, d.h. der Ort des Moleküls werde nur durch ein Koordinatenpaar (x, y) beschrieben Die mittlere freie Weglänge sei L. Bei einer Kollision wird das Molekül mit dem Winkel j (phi) abgelenkt und fliegt die Strecke r (rho) m weit bis zur nächsten Kollision

    106. Molekül-Kinetik und Monte-Carlo-Simulation (2) Der neue Ort ergibt sich durch (x0+dx, y0+dy) wobei wir dx und dy durch eine Transformation der Polarkoordinaten j und r in das Cartesische Koordinatensystem erhalten: dx = r cos (j) dy = r sin (j) Nach N Kollision befindet sich das Molekül am Ort (xN, yN). Die sog. Diskolation ergibt sich durch

    107. Molekül-Kinetik und Monte-Carlo-Simulation (3) //Monte-Carlo-Simulation-Molekülausbreitung import java.lang.System; class Dislocation { public static void main (String args[ ]) { System.out.println("Gas molecule located at (x=0,y=0)"); int i, number = 0; double x=0.0, y=0.0, /* Aktuelle Koordinaten */ dx=0.0, dy=0.0, /* aktuelle Verschiebung */ phi=0.0, rho=0.0, /* Phi Winkel, Rho Länge */ L=0.0, /* L mittlere freie Pfadlänge */ disloc=0.0; /* dislocation */ L = 5.0E-10; // Halbwegs plausibler Wert System.out.println("mean free path length: " + L); number = 100; System.out.println("Number of steps " + number); System.out.println("Simulation starts now!");

    108. Molekül-Kinetik und Monte-Carlo-Simulation (4) for (i=0; i<number; i++) { phi = 360.0*Math.random(); // Winkel rho = L*Math.random()*2.0; // Zufallswert aus [0, 2*L] dx = rho*Math.cos(phi); // Transformation von dy = rho*Math.sin(phi); // Polar-> Cartesischen Koord. x = x + dx; y = y + dy; } disloc = Math.sqrt(x*x+y*y); // Berechnung der Dislokation d System.out.println("dislocation after " + number + "steps: " + disloc); } }

    109. Game of Life und Zelluläre Automaten Das Game of Life wird auf einer Fläche durchgeführt, die in rechteckige Zellen aufgeteilt ist Im Originalmodell wird die Fläche als unbegrenzt betrachtet. Aber um die Generierung von Mustern auf dem Bildschirm zu verfolgen, werden wir die begrenzte Bildschirmfläche betrachten, unter der Annahme, daß der linke Rand mit dem rechten verbunden ist und ebenso die obere Bildschirmzeile mit der unteren. Diese Abwandlung spielt das “Game of Life” auf der Oberfläche eines Torus Zu Beginn nimmt man eine Anfangspopulation an. Die belegten Felder werden mit einem Stern auf dem Monitor gekennzeichnet, die leeren Zellen ergeben eine leere Fläche. Von der ursprünglichen Population ausgehend wird die folgende Generation unter Anwendung folgender Regeln berechnet:

    110. Game of Life und Zelluläre Automaten Belegte Zellen werden nur überleben, wenn sie zwei oder drei belegte Nachbarzellen haben. Nachbarzellen sind Zellen mit einer gemeinsamen Linie oder mit einer gemeinsamen Ecke Belegte Zellen sterben und werden zu leeren Zellen, wenn es mehr als drei Nachbarn gibt (überfüllt) oder wenn es nur einen oder überhaupt keinen Nachbarn gibt (Isolationstod) Eine Geburt findet in einer leeren Zelle statt, wenn diese Zelle genau drei belegte Nachbarzellen hat

    111. Game of Life und Zelluläre Automaten Tod (T), Geburt (G) und Überleben (Ü) von Zellen Mit diesen sehr einfachen Gesetzen werden geometrische Strukturen generiert, die in ihrer Dynamik von überraschender Vielfalt sind. Zum Beispiel gibt es Populationen, die am Anfang aufblühen und später völlig aussterben. Es gibt andere, die stabile Inseln einer konstanten Population entwickeln. Es kann oszillierende oder stabile Figuren geben, die sich innerhalb des Spielfelds in verschiedene Richtungen bewegen. Simulationsmodelle dieser Art heißen zelluläre Automaten und können, natürlich mit modifizierten Regeln, zur Lösung wissenschaftlicher Probleme benutzt werden, z.B. zur Simulation von Krebszellen in einem Gewebe, des Leitvermögens von Legierungen, der Ausbreitung von Waldbränden oder ansteckenden Krankheiten.Mit diesen sehr einfachen Gesetzen werden geometrische Strukturen generiert, die in ihrer Dynamik von überraschender Vielfalt sind. Zum Beispiel gibt es Populationen, die am Anfang aufblühen und später völlig aussterben. Es gibt andere, die stabile Inseln einer konstanten Population entwickeln. Es kann oszillierende oder stabile Figuren geben, die sich innerhalb des Spielfelds in verschiedene Richtungen bewegen. Simulationsmodelle dieser Art heißen zelluläre Automaten und können, natürlich mit modifizierten Regeln, zur Lösung wissenschaftlicher Probleme benutzt werden, z.B. zur Simulation von Krebszellen in einem Gewebe, des Leitvermögens von Legierungen, der Ausbreitung von Waldbränden oder ansteckenden Krankheiten.

    112. Aufgabe: Ferromagnetismus Schreiben Sie ein Programm zur Simulation des zweidimensionalen Ising-Modells für Ferromagnetismus Jede Zelle kann in einem von zwei Spin-Zuständen sein In diesem Modell werden nur vier Nachbarn in Betracht gezogen (West, Nord, Ost und Süd) Wenn eine Zelle zwei Nachbarn mit Aufwärtsspin und zwei mit Abwärtsspin hat, dann kann die Zelle in der nächsten Generation mit derselben Wahrscheinlichkeit einen der beiden Spins haben

    113. Aufgabe: Ferromagnetismus Wenn es mehr Nachbarn mit einer Art von Spin gibt, geht man bei dieser Zelle von einer höheren Wahrscheinlichkeit aus, daß sie diesen Spin belegen wird Darüber hinaus sind diese Wahrscheinlichkeiten temperaturabhängig

    114. Aufgabe: Ferromagnetismus Man könnte z.B. annehmen, daß drei Nachbarn mit identischem Spin mit der Wahrscheinlichkeit p = 0.5+0.25/(1+a*T) zu einer Belegung mit demselben Spin führen Wenn es vier identische Nachbarn gibt, kann diese Wahrscheinlichkeit 0.5+0.5/(1+a*T) sein. Die Konstante a ist charakteristisch für das Material (Stichwort: Curie-Temperatur). Natürlich kann man nicht erwarten, daß dieses einfache zweidimensionale Modell einen exakten und realistischen Curie-Punkt zur Magnetisierung und Demagnetisierung liefert. Aber dieses Modell zeigt deutlich die eher statistische Verteilung der Spins bei höheren Temperaturen und große Regionen identischer Spins bei niedrigeren Temperaturen. Zusätzlich kann man sehen, daß bei einer Temperatur von 0 K der antiferromagnetische Zustand genauso stabil ist wie der ferromagnetische Zustand.Natürlich kann man nicht erwarten, daß dieses einfache zweidimensionale Modell einen exakten und realistischen Curie-Punkt zur Magnetisierung und Demagnetisierung liefert. Aber dieses Modell zeigt deutlich die eher statistische Verteilung der Spins bei höheren Temperaturen und große Regionen identischer Spins bei niedrigeren Temperaturen. Zusätzlich kann man sehen, daß bei einer Temperatur von 0 K der antiferromagnetische Zustand genauso stabil ist wie der ferromagnetische Zustand.

    115. Aufgabe: Legierungen Gegeben ist eine n x n - Matrix, die mit As und Bs gefüllt ist. Dies sollte in einem Zufallsprozeß geschehen, in dem die Wahrscheinlichkeit der Füllung eines bestimmten Matrixelements mit A durch pa gegeben ist Um die Matrix vollständig zu füllen, muß die Wahrscheinlichkeit für B pB = 1 - pA sein. Dies kann als ein sehr einfaches Modell für eine Legierung betrachtet werden Was ist die Mindestwahrscheinlichkeit pA , um Strukturen in der Matrix zu erhalten, wo alle (oder fast alle) As verbunden sind?

    116. Das Programm zur linearen Regression Zunächst der Kern Dann alles drum herum : Eingabe, Darstellung,… Ausgangspunkt: Tabelle (zwei-dimensionales Array) für die Speicherung der Werte Methoden zur Berechnung der Mittelwerte …

    117. Das Array zur Speicherung der Werte

    118. Zu berechnende Formeln …

    119. Ziel: die Geradengleichung

    120. Nun rückwärts …

    121. Empirische Kovarianz …

    122. Die Quadrate der Differenzen

    123. Nun muss alles zusammengefügt werden Die Mittelwerte berechnen Der Mittelwert der Quadrate der Abweichungen Die empirische Kovarianz Die Regressionskoeffizienten -> Abstraktionen schaffen -> Methoden

    124. Abstraktion: Berechne alles void computeCoeffiecients() { computeMeans(); computeSquareDiffs(); computeCovariance(); regressioncoeff_x = covariance/sdiff2x; regressioncoeff_y = covariance/sdiff2y; }

    125. … stützt sich auf einfachere Abstraktionen void computeMeans() { double sumx = 0.0d; double sumy = 0.0d; for (int i = 0; i<theArray.length;i++) {sumx = sumx + theArray[i][0]; sumy = sumy + theArray[i][1]; } meanx = sumx / theArray.length; meany = sumy / theArray.length; }

    126. Punkte zur Beachtung Einige Variablen sind lokal Die anderen sind für die Methode global, d.h. sie müssen an anderer Stelle deklariert sein

    127. Fortsetzung (1) … void computeSquareDiffs() { double sumxdiffs=0.0d, sumydiffs=0.0d; for (int i = 0 ; i<theArray.length;i++) { sumxdiffs = sumxdiffs + (theArray[i][0]-meanx) *(theArray[i][0]-meanx); sumydiffs = sumydiffs + (theArray[i][1]-meany) *(theArray[i][1]-meany); } sdiff2x = sumxdiffs/(theArray.length - 1); sdiff2y = sumydiffs/(theArray.length - 1); }

    128. Fortsetzung (2)

    129. Noch ist nicht alles zusammen gefügt Wo sind die bisher nicht deklarierten Variablen aufgeführt? Es werden alle Eigenschaften zu einer Klasse zusammengefasst Wie kommen die Daten zu der Berechnung? Die Daten werden bei der Initialisierung übergeben (siehe new)

    130. Die Idee der Objektorientierung Zusammenfassung der Daten und der diese Daten manipulierenden Methoden in einer Einheit Klassendefinition enthält Variablendeklarationen und Methodenvereinbarungen Von einer Klasse können Instanzen gebildet werden Mit anderen Worten: Eine Klasse ist ein Bauplan für Instanzen Instanzen heißen Objekte

    131. Im Beispiel lineare Regression class Table { double [ ] [ ] theArray; double meanx, meany; double sdiff2x,sdiff2y; double covariance, regressioncoeff_x, regressioncoeff_y; void computeMeans() { … } void computeSquareDiffs() {…} void computeCovariance() {…} void computeCoeffiecients() { computeMeans(); computeSquareDiffs(); … } }

    132. Nun müssen noch die Daten her … Ein neues Objekt der Klasse Table wird mit Hilfe von new hergestellt Table Messwerte = new Table(); Eine Möglichkeit: Zuweisung an die Variable theArray … z.B.: Messwerte.theArray = new double … Messwerte.computeCoeffiecients(); … ist unschön

    133. Besser: Werte bei Objekterzeugung übergeben Formulierung eines speziellen sogenannten Konstruktor, der für die richtige Initialisierung und Werteübergabe sorgt Table (double [] xs, double [] ys) {theArray = new double [xs.length][2]; for (int i=0;i< theArray.length; i++) {theArray[i][0] = xs[i]; theArray[i][1] = ys[i]; } }

    134. Konstruktor … Ist keine Methode Daher eigene Syntax (kein Rückgabewert) Vordefinierte Konstruktoren sorgen für Speicherplatz und Standardinitialisierung Benutzerdefinierte Konstruktoren werden anschließend ausgeführt Im obigen Beispiel werden die als Parameter übergebenen Arrays in die Variable theArray kopiert Vorteil?

    135. Das gesamte Programm public class LineareRegression { public static void main(String args[]) { System.out.println( “…" ); double [] xs = {1d, 2d, 3d}, ys = {1d,1.5d,3d}; Table T = new Table(xs,ys); T.computeCoeffiecients(); System.out.println(T.meanx + " " + T.meany + " " + T); } }

    136. Beachte T.meany -> Zugriff auf die Variable meany des Objektes auf das T verweist System.out.println( … T); funktioniert, da in der Klasse Table eine Methode toString() definiert wurde! public String toString() { return "Coefficients:“ +regressioncoeff_x + " , " + regressioncoeff_y; }

    137. Zusammenfassend Programm ist in mancher Hinsicht noch nicht ausgereift: Nicht sehr fehlertolerant (z.B. nur ein Wertepaar) Es muss immer ein neues Objekt erzeugt werden, wenn ein Wertepaar hinzugefügt wird …

    138. Verwendung von Vector statt Array Zusammenfassend Nachteile / Vorteile Wichtigster Nachteil des Arrays: nach der Initialisierung ist die Größe fest Wichtigster Vorteil des Array: einfacher Zugriff auf einzelne Elemente […] Vector (siehe Java package java.util) Kann in seiner Größe variieren Zugriff ein wenig komplizierter (mittels spezieller Methoden) Sonst kann der Programmcode fast so bleiben

    139. Hier kurz der Vergleich Array ? Vector void computeMeans() { double sumx = 0.0d; double sumy = 0.0d; for (int i = 0; i<theArray.length;i++) {sumx = sumx + theArray[i][0]; sumy = sumy + theArray[i][1]; } meanx = sumx/theArray.length; meany = sumy / theArray.length; }

    140. Hier kurz der Vergleich Array ? Vector void computeMeans() { double sumx = 0.0d; double sumy = 0.0d; for (int i = 0; i<theArray.size();i++) {sumx = sumx + ((WertePaar)theArray.elementAt(i)).x(); sumy = sumy + ((WertePaar)theArray.elementAt(i)).y(); } meanx = sumx/theArray.size(); meany = sumy / theArray.size(); }

    141. Objektorientierung: Prinzipien Klasse Eine Klasse (in Java genannt ”class”) ist ein Muster oder eine Schablone zur Erzeugung von Objekten mit identischen oder ähnlichen Eigenschaften. Das heißt, in Java werden nicht direkt Objekte definiert, sondern zunächst Klassen, welche diese Objekte beschreiben. Instanz, Objekt Eine Instanz (englisch ”instance”) einer Klasse ist ein anderes Wort für ”tatsächlich existierendes Objekt”. Während Klassen sozusagen abstrakte Repräsentationen von Objekten sind, ist eine Instanz eine Konkretisierung, manchmal auch "Inkarnation" genannt.

    142. Objektorientierung (2): Attribute Attribute Objekte besitzen Attribute, welche das Aussehen, den Zustand oder andere Eigenschaften des Objekts beschreiben. Solche Attribute werden durch Instanzenvariablen (englisch ”instance variables”) beschrieben. Bei Erzeugung eines konkreten Objekts, also einer Instanz, erhalten diese Variablen konkrete Werte, die während der Lebenszeit des Objekts konstant sein oder auch während des Programmablaufs verändert werden können.

    143. Objektorientierung (3): Methode Methoden zur Beschreibung von Verhalten Klassen besitzen auch ein sogenanntes Verhalten (englisch ”behaviour”). Das Verhalten einer Klasse legt fest, ob und wie sich der interne Zustand einer Klasse ändert oder was eine Instanz gegebenenfalls als Auftrag ausführen kann. Dieses Verhalten wird durch sogenannte Methoden (englisch ”methods”) beschrieben, welche klasseninterne Funktionen beschreiben. Methoden arbeiten also auf den Instanzen dieser Klassen.

    144. Objektorientierung (4): Konstruktoren Konstruktoren Das Erzeugen von Instanzen als konkreten Objekten geschieht mit Hilfe von sogenannten Konstruktoren. Wir haben das schon im Zusammenhang mit den Arrays kennen gelernt, als ein konkreter Array mit Hilfe von new erzeugt wurde. Ähnliches gilt auch für Objekte der Klasse String. Bemerkenswert ist, dass in Java eine Klasse über mehrere Konstruktionsmethoden verfügen kann.

    145. Erstes Beispiel für ein Java-Programm mit Klasse (1) Betrachte Punkte in einem 2-dimensionalen Koordinatensystem mit ganzzahlig eingeteilten x- und y- Koordinaten (z.B. Bildschirmspeicher, Pixelgraphik oder auch Atome in einem Kristallgitter) Die Klasse zur Beschreibung von Punkten könnte so aussehen: class Punkt // Der Name der Klasse ist Punkt { int x,y; // Die Attribute sind x und y . . . }

    146. Da ein Klassenname auch ein Typname ist, können Variablen angelegt werden durch Punkt P1, P2; Die Variablen P1 und P2 stellen aber noch keine aktuellen Punkte dar, sondern sie müssen erst mit aktuellen Objekten ”versorgt” werden. Die Erzeugung erfolgt mit der Anweisung new z.B.: Punkt P1; P1 = new Punkt(); Erstes Beispiel für ein Java-Programm mit Klasse (2)

    147. Da Objekte etwas komplexer sind als einfache Werte (int, float, char …) ist dieser etwas aufwendigere Prozeß notwendig Für die Erzeugung eines neuen Objektes eines Typs können spezielle Vorschriften angegeben werden, damit schon zu diesem Zeitpunkt bestimmte Eigenschaften des Objektes sichergestellt werden können Zunächst soll jedoch betrachtet werden, wie objektspezifische Vorschriften – die Operationen oder Methoden aussehen Erstes Beispiel für ein Java-Programm mit Klasse (3)

    148. Es soll die Methode move für das Bewegen von Punkten definiert werden. Die Eingabe für move ist der Versatz dx bzw. dy in x- bzw. y- Richtung. Die Beschreibung von move wird Teil der Deklaration der Klasse Punkt: class Punkt { int x,y; void move(int dx, int dy) // Methode mit Parametern { x = x + dx; // Rumpf der Methode y = y + dy; } . . . } Erstes Beispiel für ein Java-Programm mit Klasse (4)

    149. Wichtig: Methoden besitzen eine sog. Signatur. D.h. sie haben einen Rückgabetyp (hier void = keine Rückgabe) einen Namen (hier move) und eine Liste von sog. Formalparametern (hier dx und dy) Insgesamt ergibt sich folgendes Fragment zur Klassenbenutzung: Punkt P1; // Deklaration einer Variablen P1 P1 = new Punkt(); // Erzeugung des Objektes P1.x = 5; P1.y = 2; // Attribute erhalten Werte P1.move(-1,1); // Aufruf der Methode move Erstes Beispiel für ein Java-Programm mit Klasse (5) Der Aufruf der Methode move erfordert die Angabe von typ-kompatiblen Aktualparametern, hier die int-Zahlen -1 und 1. Es könnten aber auch Ausdrücke (z.B. 17+4) oder Variable als Aktualparameter stehen. Übung zur Syntax von Methoden-Aufrufen: • Geben Sie 3 syntaktisch korrekte und 3 syntaktisch falsche Methodenaufrufe an. • Was passiert wohl, wenn sie in dem og. 4-Zeiler die 2. Zeile entfernen? Hinweis Später werden noch Zugriffsrechte erklärt, die erlauben bestimmte Teile der Information einer Klassenbeschreibung vor unerwünschten Zugriffen von außen zu verstecken. Es ist also notwendig, die Objekte explizit vor ihrer Benutzung zu erzeugen. Da dieser Vorgang in der Regel komplexer ist als die Initialisierung eines einfachen Wertes (beispielsweise vom Typ int), ist es möglich, spezielle Vorschriften für die Erzeugung von Objekten der jeweiligen Klasse anzugeben. Diese Vorschriften nennt man Konstruktoren. Es ist desweiteren sinnvoll und in Java auch möglich, verschiedene(!) Vorschriften zur Erzeugung von Objekten einer Klasse anzugeben. Grundsätzlich gilt, daß diese Vorschriften wie alle anderen Bearbeitungsvorschriften in Java, d.h. als Methoden formuliert werden. Es sind aber ein paar Besonderheiten zu beachten: • Konstruktoren treten im Zusammenhang mit dem new - Ausdruck auf! Der Name der Methode (=Konstruktor) ist der Klassenname. • Die auffälligste Besonderheit eines Konstruktors ist das Fehlen des Rückgabetyps. Der Rückgabetyp ist ja für einen Konstruktor klar, nämlich ein Objekt dieser Klasse! Der Aufruf der Methode move erfordert die Angabe von typ-kompatiblen Aktualparametern, hier die int-Zahlen -1 und 1. Es könnten aber auch Ausdrücke (z.B. 17+4) oder Variable als Aktualparameter stehen. Übung zur Syntax von Methoden-Aufrufen: • Geben Sie 3 syntaktisch korrekte und 3 syntaktisch falsche Methodenaufrufe an. • Was passiert wohl, wenn sie in dem og. 4-Zeiler die 2. Zeile entfernen? Hinweis Später werden noch Zugriffsrechte erklärt, die erlauben bestimmte Teile der Information einer Klassenbeschreibung vor unerwünschten Zugriffen von außen zu verstecken. Es ist also notwendig, die Objekte explizit vor ihrer Benutzung zu erzeugen. Da dieser Vorgang in der Regel komplexer ist als die Initialisierung eines einfachen Wertes (beispielsweise vom Typ int), ist es möglich, spezielle Vorschriften für die Erzeugung von Objekten der jeweiligen Klasse anzugeben. Diese Vorschriften nennt man Konstruktoren. Es ist desweiteren sinnvoll und in Java auch möglich, verschiedene(!) Vorschriften zur Erzeugung von Objekten einer Klasse anzugeben. Grundsätzlich gilt, daß diese Vorschriften wie alle anderen Bearbeitungsvorschriften in Java, d.h. als Methoden formuliert werden. Es sind aber ein paar Besonderheiten zu beachten: • Konstruktoren treten im Zusammenhang mit dem new - Ausdruck auf! Der Name der Methode (=Konstruktor) ist der Klassenname. • Die auffälligste Besonderheit eines Konstruktors ist das Fehlen des Rückgabetyps. Der Rückgabetyp ist ja für einen Konstruktor klar, nämlich ein Objekt dieser Klasse!

    150. // Erstes Java Programm ... mit Klassen public class Punkte { public static void main(String args[ ]) { Punkt P; P = new Punkt(); // ... hier mit Konstruktor 1 P.x = 5; System.out.println(”x: ”+P.x + ”; y: ” + P.y); P = new Punkt(4,6); // ... hier mit Konstruktor 2 System.out.println(”x: ”+P.x + ”; y: ” + P.y); P.move(1,-10); // ... Benutzung der Methode System.out.println(”x: ”+P.x + ”; y: ” + P.y); } } Erstes Beispiel für ein Java-Programm mit Klasse (6) class Punkt { int x,y; void move(int dx, int dy) { x = x + dx; y = y + dy; } Punkt () { // Konstruktor ohne Parameter x = 0; y = 0; } } Gibt es mehrere Konstruktoren, so unterscheiden sie sich durch ihre Parameterliste. Genauer, sie müssen sich durch ihre Parameterliste unterscheiden! Hier ein anderer Konstruktor für Punkte: Punkt (int xx, int yy) // xx u. yy sind Formalparameter, deren { // Wert an die Attribute gegeben wird x = xx; y = yy; } class Punkt { int x,y; void move(int dx, int dy) { x = x + dx; y = y + dy; } Punkt () { // Konstruktor ohne Parameter x = 0; y = 0; } } Gibt es mehrere Konstruktoren, so unterscheiden sie sich durch ihre Parameterliste. Genauer, sie müssen sich durch ihre Parameterliste unterscheiden! Hier ein anderer Konstruktor für Punkte: Punkt (int xx, int yy) // xx u. yy sind Formalparameter, deren { // Wert an die Attribute gegeben wird x = xx; y = yy; }

    151. class Punkt // Hier beginnt die Klassendefinition { int x,y; void move(int dx, int dy) { x = x + dx; y = y + dy; } Punkt () // Konstruktor 1 { x = 0; y = 0; } Punkt (int xx, int yy) // Konstruktor 2 { x = xx; y = yy; } } Erstes Beispiel für ein Java-Programm mit Klasse (7)

    152. Ausgabe: x: 5; y: 0 x: 4; y: 6 x: 5; y: -4 Zur Übung: Entwerfen ( oder programmieren Sie sogar) ein Java-Programm zur Darstellung und Manipulation von Punkten im 3-dimensionalen reellen Raum Erstes Beispiel für ein Java-Programm mit Klasse (8)

    153. Die class Motorcycle könnte z.B. die Attribute Farbe und Fabrikat haben. Das Verhalten wäre durch Methoden wie Starte den Motor, stoppe den Motor, Beschleunigen, Gang wechseln beschrieben. // Programm mit Klasse class Motorcycle // Hier beginnt die Klassendefinition { // Attribute des Motorrads String make; // Fabrikat String color; boolean engineState; // Motor an oder aus? // Methode zum Starten des Motors void startEngine ( ) { Noch ein Beispiel: Die Klasse Motorcycle

    154. if (engineState == true) { System.out.println ("The engine is already on."); } else { engineState = true; System.out.println ("The engine is now on."); } } // Ende dieser Methode // Methode zum Anzeigen der Attribute void showAtts ( ) { System.out.println ("This motorcycle is a " + color + " " + make); Noch ein Beispiel: Die Klasse Motorcycle

    155. if (engineState == true) { System.out.println ("The engine is on."); } else { System.out.println ("The engine is off."); } } // Ende dieser Methode } // Ende der Klassendefinition fuer Motorcycle public class MotorcycleTest // Beginn des eigentlichen Programms { public static void main (String args [ ]) { // Definition und Generierung eines Objekts!! Motorcycle m = new Motorcycle ( ); Noch ein Beispiel: Die Klasse Motorcycle

    156. // ... und jetzt erhalten die Attribute ihre Werte m.make = "Yamaha RZ2350"; m.color = "yellow"; System.out.println ("Calling showAtts..."); m.showAtts ( ); System.out.println ("--------"); System.out.println ("Starting engine..."); m.startEngine ( ); System.out.println ("---------"); System.out.println ("Calling showAtts..."); m.showAtts ( ); System.out.println ("---------"); System.out.println ("Starting engine..."); m.startEngine ( ); } } Noch ein Beispiel: Die Klasse Motorcycle

    157. Compilieren generiert zwei Klassen, nämlich Motorcycle.class und MotorcycleTest.class. Die Klasse Motorcycle.class kann auch von anderen main-Klassen benutzt werden. /home/bmc/MyJava>javac MotorcycleTest.java Das Ausführen erfolgt durch die Zeile /home/bmc/MyJava>java MotorcycleTest Noch ein Beispiel: Die Klasse Motorcycle

    158. Ausgabe: Calling showAtts... This motorcycle is a yellow Yamaha RZ2350 The engine is off. -------- Starting engine... The engine is now on. --------- Calling showAtts... This motorcycle is a yellow Yamaha RZ2350 The engine is on. --------- Starting engine... The engine is already on. Noch ein Beispiel: Die Klasse Motorcycle

    159. Unter einem Applet versteht man ein „kleines“ Anwendungsprogramm in Java für eine spezielle Aufgabe Ein Applet ist an eine WWW-Seite gekoppelt Es wird mit der WWW-Seite über das Internet übertragen und auf dem Client ausgeführt Ein Applet wird durch einen Web-Browser nach dem sogenannten Sandkastenprinzip (Sandbox) abgearbeitet, d. h. es hat keine Rechte für die Bearbeitung lokaler (Client) Dateien Java-Applet Programmierung (1)

    160. Erzeuge eine Datei namens "HelloWorld.java" mit folgendem Inhalt: import java.applet.*; import java.awt.*; public class HelloWorld extends Applet { public void paint(Graphics g) { g.drawString("Hello World",25,50); } } Java-Applet Beispiel (1)

    161. Compiliere die Datei: javac HelloWorld.java Erzeuge eine Datei namens "HelloWorld.html" im selben Verzeichnis: <HTML> <HEAD> <TITLE>Java-Applet Beispiel</TITLE> </HEAD> <BODY> Applet: <APPLET code="HelloWorld.class" width=150 height=100> </APPLET> </BODY> </HTML> Java-Applet Beispiel (2)

    162. Lade die HTML-Datei in einen WWW-Browser, der Java-Applets ausführen kann: Java-Applet Beispiel (3)

    163. Alternativ kann das Applet auch im Appletviewer (Bestandteil des Java Development Kit) gestartet werden: Java-Applet Beispiel (4)

    164. Java-Applet / Applikation Unterschiede

More Related