1 / 130

Programmieren in Java

Prof. Dr. Fritz Jobst. 2.

samuru
Download Presentation

Programmieren in 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. 1 Programmieren in Java Daten und Typen, Ein-/Ausgabe, Kontrollstrukturen, Methoden und Rekursion, Felder, Bubblesort, Matrizen

    2. Prof. Dr. Fritz Jobst 2 Änderungsgeschehen SS 2008 Uebernommen von Prof. Jobst Aenderungen H. Feyrer Beispiele hinzugefuegt Stand: 15.3.2008

    4. Prof. Dr. Fritz Jobst 4 Grundlagen: prozedurale Elemente Elementare Daten: Variable im RAM int : ganze Zahlen float: Gleitkommazahlen Operatoren: Verarbeitung von Daten + - * / % > >> >>> etc. Wertzuweisung als elementare Anweisung Zuweisung von Werten an Variable Kontrollfluss: Anweisungen zur Steuerung von Abläufen if, switch: Fallunterscheidungen do, while, for: Wiederholte Ausführung Methoden: Folgen von Anweisungen System.out.println ("hello"); Felder: Folgen von Variablen int[] zahlen = {30, 5, 2001};

    5. Prof. Dr. Fritz Jobst 5 Verarbeitung im Rechner

    6. Prof. Dr. Fritz Jobst 6 Daten erklären: elementare Datentypen Ganzzahlige Datentypen: ganze Zahlen mit Vorzeichen byte 8-Bit-Zahlen von -128 bis +127 (-27 bis 27-1)? short 16-Bit-Zahlen von -32768 bis +32767 (-215 bis 215-1)? int 32-Bit-Zahlen von –2147483648 bis 2147483647 long 64-Bit-Zahlen von –9223372036854775808 bis 9223372036854775807 Beispiel 1l, 12345l (Zusatz l ist zu beachten, d.h. klein-L)? Gleitkommazahlen: Nach IEEE-754-Standard float Zahlen mit 32 Bit Genauigkeit. Beispiel: 1.0f (Zusatz f ist zu beachten)? double Zahlen mit 64 Bit Genauigkeit. Beispiel: 1.0 oder 1.0d Beispiele: k02/src/DemoFuerSchreibweisen.java k02/src/DemoFuerBereichsUeberschreitungen.java

    7. Prof. Dr. Fritz Jobst 7 Daten erklären: elementare Datentypen Zeichentyp char 16-Bit-Unicode-Zeichen. Beispiel: 'A', 'a'‚ Achtung: nur ein einzelnes Zeichen Boolescher Typ boolean Wahrheitswert. Entweder true oder false Die elementaren Datentypen werden direkt von der CPU bearbeitet. Die Verarbeitung erfolgt effizient. Dies ist mit ein Grund für die relativ gute Performance von Java-Programmen. Beispiele: k02/src/DemoFuerDeklarationen.java k02/src/DemoFuerDaten.java

    8. Prof. Dr. Fritz Jobst 8 Ergänzung: Zeichenketten Zeichenketten können in Java mit dem Typ String definiert werden. Dieser Typ ist nicht elementar (d.h. kein im Rechner eingebauter Typ). Vgl. Kapitel 3. Die Beschreibung der Methoden zur Bearbeitung von Zeichenketten findet sich in java.lang.String. String Text1 = "Hello "; String Text2 = "World"; System.out.println (Text1 + Text2); System.out.println (Text1 + 5555); Bei Zeichenketten bedeutet + das Zusammenfügen der Texte der einzelnen Zeichenketten. Auch der Text für Zahlen kann so an Zeichenketten angehängt werden.

    9. Prof. Dr. Fritz Jobst 9 Info: Darstellung ganzer Zahlen im Rechner

    10. Prof. Dr. Fritz Jobst 10 Die Wertzuweisung Schreibweise: Variable = Ausdruck; Funktion: Variablen bezeichnen Speicherplätze im RAM. Der Wert des Ausdrucks (rechte Seite) wird berechnet und in diesen Speicherplatz (linke Seite) geschrieben. Der Typ des Ausdrucks muss mit dem Typ der Variablen verträglich sein: int i; i = 99; // richtig i = true; // falsch i = 2 + 3 * 4; // richtig

    11. Prof. Dr. Fritz Jobst 11 Ablauf von i = i + 1 Anweisungen: int i = 99; i = i + 1; Die Wertzuweisung = ist nicht als Gleichheit zu sehen, sondern als Zuweisungsoperator. Ablauf: Der Wert von i wird gelesen. Ergebnis: 99 Dieser Wert wird erhöht. Dieser neue Wert wird zurück geschrieben i hat nun den Wert 100

    12. Prof. Dr. Fritz Jobst 12 Ablauf von i = 99; i = i + 1; Skizze

    13. Prof. Dr. Fritz Jobst 13 Beispiel: Mehrwertsteuer berechnen Das Programm soll einen Betrag einlesen. Danach soll die Mehrwertsteuer berechnet werden. Annahme: 19% MWSt-Satz. Das Ergebnis soll ausgegeben werden: Netto-Betrag, MWSt-Betrag, Gesamt-Betrag Einlesen von Zahlen: Benutze nextDouble()-Methode von java.util.Scanner. Ausgeben: Benutze printf (…)-Methode von java.io.PrintWriter.

    14. Prof. Dr. Fritz Jobst 14 Programm zur MWSt-Berechnung import java.util.*; import java.io.*; public class MWSt { public static void main(String[] args) { System.out.println ("Bitte einen Betrag OHNE MWSt eingeben (z.B. 3,5):"); // Gleitkommazahlen bei Text-Eingabe in deutscher Darstellung Scanner input = new Scanner(System.in);` double netto = input.nextDouble(); double mwst = netto * 0.19; // Gleitpunktzahlen in Java double gesamt = netto + mwst; System.out.printf("netto=%f mwst=%f gesamt=%f\n", netto, mwst, gesamt); System.out.printf("netto=%7.2f mwst=%6.2f gesamt=%8.2f\n", netto, mwst, gesamt); } } Beispiel: k02/src/Formeln.java

    15. Prof. Dr. Fritz Jobst 15 Ein-/Ausgabe Eingabe mit Scanner double-Zahlen einlesen mit nextDouble int-Zahlen einlesen mit nextInt()? Ausgabe mit printf System.out.printf("%f\n", Gleitpunktzahl); System.out.printf("%7.2f\n", Gleitpunktzahl); System.out.printf("%d\n", Ganze Zahl); System.out.printf("%s\n", Text-String); \n bedeutet: neue Zeile nach Ausgabe System.out.printf("%b\n", Boolescher Wert); Beispiel: k02/src/GrundRechenarten.java

    16. Prof. Dr. Fritz Jobst 16 Packages Packages sind Zusammenfassungen von Klassen zu Paketen. Jedes Paket liegt in einem eigenen Verzeichnis Der Name setzt sich dann aus den Verzeichnisnamen zusammen, getrennt durch „.“ (Punkt)? Im Prinzip: Der Name einer Klasse muss vollständig angegeben werden: java.awt.Graphics Aber: Packages können importiert werden import java.awt.Graphics; import java.awt.*; // Gleich alle awt-Klassen Dann kann man im Java-Programm einfach Graphics schreiben Das Package java.lang muss nicht angegeben werden: Z.B.: String statt java.lang.String Beispiel: k02/src/NameDemo/MyFirstClass.java k02/src/PackageDemo.java

    17. Prof. Dr. Fritz Jobst 17 Beispiel Das folgende Beispiel zeigt Deklarationen von Daten Wertzuweisung auf die Daten Ausgabe der Daten auf Konsole mit println

    18. Prof. Dr. Fritz Jobst 18 public class JavaSchreibweisen { public static void main (String args[]) { // Daten erklären : definieren // int, double, char, boolean // String für Zeichenketten int ganzeZahl; // Speicherplatz für ganze Zahl double gleitKommaZahl; // Speicherplatz für Gleitkommazahl char buchstabe; // buchstabe: Speicherplatz für EINEN Buchstaben boolean wahrHeitswert; // true oder false? String text; // KEINE elementare Variable // text: Zeichenkette bearbeiten Beispiel: Deklarationen

    19. // Werte zuweisen ganzeZahl = 1357867; gleitKommaZahl = 3.1415; buchstabe = 'a'; wahrHeitswert = false; text = "Was gibt es in der Mensa?"; // Ausgeben der Werte mit println-Befehl System.out.println (ganzeZahl); System.out.println (gleitKommaZahl); System.out.println (buchstabe); System.out.println (wahrHeitswert); System.out.println (text);

    20. Prof. Dr. Fritz Jobst 20 // Ergänzung: Definition+Wertzuweisung long langeganzeZahl = 1357l; System.out.println (langeganzeZahl); // Noch eine Wertzuweisung ganzeZahl = ganzeZahl + 1 + 7 * 300; System.out.println ("Wert der ganzen Zahl= " + ganzeZahl); } } Beispiel: Wertzuweisungen

    21. Prof. Dr. Fritz Jobst 21 Schreibweisen für ganze Zahlen

    22. Prof. Dr. Fritz Jobst 22 Ziffern der Darstellung von 1234 1234 Dezimal = Binär: 0100.1101.0010 Hex. 4d2 Oktal 2322 1234 Hex = Binär: 0001.0010.0011.0100 Hex.: 1234 Oktal: 11064 1234 Oktal = Binär: 0010.1001.1100 Hex.: 29c Oktal: 1234

    23. Prof. Dr. Fritz Jobst 23 Darstellung von Zahlen public class OperatorTest { public static void main(String[] args) { int x1 = 1234; int x2 = 0x1234; int x3 = 01234; System.out.println(Integer.toBinaryString(x1)); System.out.println(Integer.toHexString(x1)); System.out.println(Integer.toOctalString(x1)); … analog für x2 und x3 } } Nützliche Methoden für Zahlen: Klasse Integer (bzw. java.lang.Integer): http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Integer.html

    24. Prof. Dr. Fritz Jobst 24 Ausdrücke zum Rechnen und Bearbeiten Variable = Ausdruck; Der Wert des Ausdrucks wird berechnet. Dann wird dieser Wert auf den durch Variable benannten Speicherplatz geschrieben. Für Gleitkommazahlen gibt es die Rechenarten + - * / Für ganze Zahlen ist Vorsicht bei der Division geboten: Was soll 3 / 2 als ganze Zahl liefern? i / j Quotient. 7 / 2 liefert 3, 9/4 liefert 2 i % j Rest 7 % 2 liefert 1 Es gilt stets: i = (i / j) * j + (i % j)? Dividend = Quotient * Divisor + Rest Beispiel: k02/src/DemoFuerElementareAusdruecke.java

    25. Prof. Dr. Fritz Jobst 25 Verarbeitung ganzer Zahlen Ganze Zahlen (byte, short, int bzw. long) sind Bitketten der Länge 8, 16, 32 bzw. 64. Solche Bitketten können bitweise verarbeitet werden: & Bitweises und (0xff00 & 0xf0f0 liefert 0xf000)? | Bitweises oder (0xff00 | 0xf0f0 liefert 0xfff0)? ^ Bitweises exklusives oder (0xff00 ^ 0xf0f0 liefert 0x0ff0)? ~ Bitweise Negation (~0xff00 liefert 0x00ff)? Bitketten können geschoben (shift) werden. Dies erfolgt im Sinne dualer Zahlen (binäre Werte)? Die Variable a wird um b Stellen nach links geschoben a << b 1 << 2 ? 4 Die Variable a wird um b Stellen nach rechts geschoben a >> b 8 >> 2 ? 2 Die Variable a wird um b Stellen nach rechts geschoben. Dabei wird von links 0 nachgezogen a >>> b. Unterschied zu >> nur bei negativen Zahlen (höchstes Bit auf 1)?

    26. Prof. Dr. Fritz Jobst 26 Rechnen mit Wahrheitswerten

    27. Prof. Dr. Fritz Jobst 27 Typumwandlungen byte m_byte = 0 ; short m_short = 1 ; // Der folgende Type-Cast heißt im Klartext: // Auf das Risiko des Programmierers hin: // Umwandlung erzwingen // Denn: die linke Seite kann den Wert der // rechten Seite nicht aufnehmen m_byte = (byte)m_short; //... aber die folgende Zeile ist problemlos: int m_int = m_short; Beispiel: k02/src/DemoFuerTypumwandlungen.java

    28. Prof. Dr. Fritz Jobst 28 Vereinfachte Regel bei Wertzuweisungen Wenn die rechte Seite in die linke Seite passt, dann ist die Wertzuweisung möglich. Dies gilt jeweils für den Typ der rechten bzw. linken Seite, nicht die aktuellen Werte. Ausnahme: Vorsicht bei boolean Genaue Darstellung: Siehe nächste Folie Cast: Typumwandlung mit Gewalt erzwingen. Der Compiler weist auf ein Risiko hin. Der Programmierer kann die Warnung abschalten.

    29. Prof. Dr. Fritz Jobst 29 Wertzuweisungen a = b

    30. Prof. Dr. Fritz Jobst 30 Umwandlung von Zeichenketten

    31. Prof. Dr. Fritz Jobst 31 Beispiel: Parameter der Kommandozeile public class DemoFuerParameter { public static void main (String[] args) { int i = Integer.parseInt (args[0]); int j = Integer.parseInt (args[1]); System.out.println (i+j); } } Mit einem Aufruf java DemoFuerParameter 3 4 erhält man als Ergebnis die erwartete Zahl 7 Die Parameter der Kommandozeile werden als Argumente args[0], args[1], usw. übergeben, sofern vorhanden.

    32. Prof. Dr. Fritz Jobst 32 Zusammenfassen von Anweisungen: {} Mehrere Anweisungen können innerhalb von {}-Klammern zu einer Anweisung zusammengefaßt werden. public static void main (String[] args) { int i = 0; { int j = i; System.out.println (j); } // Hier gilt j nicht mehr Die so geklammerte Folge von Anweisungen wird wie eine einzige Anweisung behandelt. Innerhalb dieser Klammern können wieder Daten definiert werden, die dort und nur dort gelten. j ist außerhalb der Klammer, in der es definiert wurde, nicht mehr ansprechbar.

    33. Prof. Dr. Fritz Jobst 33 Informationen zu Java Das Java-System enthält Tausende von Klassen Diese können nicht alle im Rahmen der Vorlesung behandelt werden. Zugriff über die Original-Dokumentation von Sun http://java.sun.com/j2se/1.5.0/docs/api Sun gliedert den Zugriff dreistufig über die Packages (Verzeichnise), Klassen (Dateien) und dann die Beschreibung der Methoden etc.

    34. Prof. Dr. Fritz Jobst 34

    35. Prof. Dr. Fritz Jobst 35 Beschreibung der Sprache Java Programme sind keine einfachen Sammlungen von Anweisungen. Sie sind in Sprachen verfasst. Diese Sprachen haben einzelne Worte. Token, lexikalische Bestandteile Für den Aufbau der Sprache gelten bestimmte Regeln. Syntax „mögliche Reihenfolge der Worte“ Die Programme können eine Bedeutung haben Semantik

    36. Prof. Dr. Fritz Jobst 36 Java-Syntax (Einstieg)? Die Sprache Java ist von der Fa. Sun (Autoren: James Gosling, Bill Joy, Guy Steele, Gilad Bracha) unter der folgenden Adresse (URL, Uniform Resource Locator) definiert: http://java.sun.com/docs/books/jls/third_edition/html/j3TOC.html Die o. a. Definition ist komplex. Sie ist die Referenz, wird in dieser Einführung in Auszügen benutzt. Die folgenden Folien beschreiben die Worte der Sprache Java und einige Regeln. Zusammenfassungen finden Sie nach den Abschnitten über Anweisungen bzw. Methoden.

    37. Prof. Dr. Fritz Jobst 37 Reservierte Worte Java 5 abstract continue for new switch assert default if package synchronized boolean do goto private this break double implements protected throw byte else import public throws case enum instanceof return transient catch extends int short try char final interface static void class finally long strictfp volatile const float native super while

    38. Prof. Dr. Fritz Jobst 38 Weitere Worte der Sprache Java Literale: Zahlen 12324, Zeichen 'a', Zeichenfolgen Trennzeichen ( ) { } [ ] ; , . Operatoren = > < ! ~ ? : == <= >= != && || ++ -- + - * / & | ^ % << >> >>> += -= *= /= &= |= ^= %= <<= >>= >>>= Und: vom Programmierer festgelegte Benennungen ? Folie über Namen

    39. Prof. Dr. Fritz Jobst 39 Vorrangbeziehungen und Auswertung

    40. Prof. Dr. Fritz Jobst 40 Vorrangbeziehungen und Auswertung Die Operatoren sind in Zeilen nach wachsendem Vorrang angeordnet. Die 1. Zeile enthält Operatoren des höchsten Vorrangs, die letzte die des Niedrigsten. Es gibt die Regel "Punkt vor Strich": * hat Vorrang vor + a+b*c wird wie a + (b*c) ausgewertet Auch die Auswertung spielt eine Rolle: a=b=c wird wie a = (b=c), also von rechts her ausgewertet. a+b+c wird von links her, also wie (a+b)+c ausgewertet. Merkregeln Es gibt keine Überraschungen (fast, siehe nächste Zeile)? Vermeiden Sie exotische Operatoren (rot gekennzeichnet)!

    41. Prof. Dr. Fritz Jobst 41 Namen und ihre Gültigkeit Alle in einem Programm deklarierten Dinge können benannt werden: int i; Namen beginnen mit einem Buchstaben. Danach folgen weitere Buchstaben bzw. Ziffern oder das Zeichen _ Reservierte Worte dürfen nicht zur Benennung benutzt werden. Im Programm definierte Dinge können über ihre Namen angesprochen werden: i = 3; Jede Deklaration erfolgt innerhalb von Klammern der Art {}. Diese Klammern können geschachtelt werden. Die hierdurch bedingten Regeln für die Gültigkeit von Namen innerhalb der Schachtelung sind zu beachten.

    42. Prof. Dr. Fritz Jobst 42 Namensräume Ein durch {} begrenzter Bereich wird auch als Namensraum bezeichnet. Namen gelten in dem durch {} begrenzten Namensraum, in dem sie definiert wurden. Auf der Ebene der Klasse: Namen gelten auch vor der Definition Namen können auch außerhalb der Klasse gelten. Innerhalb von Methoden: Namen gelten ab der Definition Sie gelten auch in allen darin enthaltenen Namensräumen. Weiter innen definierte Namen verdecken außen definierte Namen. Da dies gefährlich ist, ist ein Verdecken von Namen in Java innerhalb von Methoden nur für Namen auf der Klassenebene erlaubt, sonst nicht.

    43. Prof. Dr. Fritz Jobst 43 Namen und ihre Gültigkeit Geschachtelte Namensräume

    44. Prof. Dr. Fritz Jobst 44 Deklarationen mit static static: diese Dinge gehören zur Klasse Die Daten werden beim Laden der Klasse initialisiert und können innerhalb der Klasse benutzt werden. Sie stehen beim Ablauf eines Programms oder Programmsystems allen anderen Java-Klassen zur Verfügung (soweit public). Ansprechen: Klassenname.Bezeichner Beispiel: die Farbe rot java.awt.Color.red Die Bedeutung von static wird im Rahmen der Objektorientierung in Kapitel 3 erläutert. Beispiel: k02/src/StaticInitTest.java

    45. Prof. Dr. Fritz Jobst 45 Aufbau von Java-Programmen Ein Programm besteht aus Anweisungen: System.out.println (....); x = 2; Diese werden der Reihe nach ausgeführt, sofern man dies nicht mit speziellen Anweisungen für den Kontrollfluss steuert: Fallunterscheidungen, Wiederholungen Einzelne Programmteile (sog. Methoden) fassen Folgen von Anweisungen zusammen und können mit variablen Parametern ausgeführt werden.

    46. Prof. Dr. Fritz Jobst 46 Kontrollfluss: Übersicht Fallunterscheidung Wiederholungen

    47. Prof. Dr. Fritz Jobst 47 Elemente von Struktogrammen (1)? Verarbeitung (Prozess)? Mit dem Verarbeitungssymbol werden die Struktur- und Elementarblöcke dargestellt, die Ein- und Ausgabebefehle, Berechnungen und Unterprogrammaufrufe enthalten. Folge (Sequenz)? Folgen mit zwei oder mehreren Arbeitsschritten werden durch aneinander gereihte Strukturblöcke dargestellt. Diese Blöcke müssen gleich breit sein. Alternative (Verzweigung)? Wird im Programmablauf eine Bedingung gestellt, wird dies mit dem Symbol "Alternative" dargestellt. Ist die Bedingung erfüllt, wird der Strukturblock 1 (Anweisung1) ausgeführt, sonst Strukturblock 2 (Anweisung2).

    48. Prof. Dr. Fritz Jobst 48 Elemente von Struktogrammen (2)? Fallauswahl (Mehrfachverzweigung)? Eine mehrfache Bedingung im Programmablauf wird mit diesem Symbol dargestellt. Es wird kontrolliert, welche Auswahl vorgenommen wurde, und in den entsprechenden Strukturblock verzweigt. Trifft keine der Bedingungen zu, wird der Alternativblock (default-Anweisung) ausgeführt. Wiederholung (Schleife)? Diese Wiederholungssymbole dienen der Darstellung von Anweisungen in Schleifen. Der Rumpf der Schleife wird in Abhängigkeit einer Bedingung ausgeführt. Bedingung am Anfang der Schleife: (while-Schleife) Vorsicht: Es gibt Fälle, bei denen der Rumpf der while-Schleife niemals durchlaufen wird. Bedingung am Ende der Schleife: (do-Schleife)? Vorsicht: der Rumpf der do-Schleife wird in jedem Fall mindestens einmal durchlaufen.

    49. Prof. Dr. Fritz Jobst 49 Fallunterscheidungen Fallunterscheidung mit zwei Alternativen. Genau eine Anweisung wird ausgeführt! Falls Haltbarkeit abgelaufen: wegwerfen Sonst Verbrauchen Fallunterscheidungen mit mehreren Alternativen. Auswahl einer Anweisung Tätigkeit: falls Informatiker: Gehalt = x falls Kaminkehrer: Gehalt = y falls Industriekaufmann: Gehalt = z Falls Konzernchef: Gehalt = u falls Bäcker: Gehalt = v

    50. Prof. Dr. Fritz Jobst 50 Fallunterscheidung mit if if (Ausdruck)? Anweisung1 // Entweder Anweisung1 (falls Ausdruck wahr)? else Anweisung2 // oder Anweisung2, aber niemals beide // Hier wird die Ausführung nach if fortgesetzt Ausdruck: vom Typ boolean und sonst nichts.

    51. Prof. Dr. Fritz Jobst 51 if-Anweisung: Bedeutung (Semantik) Die Verzweigung mit if dient zum Programmieren von Fallunterscheidungen. Man kann eine Entweder-oder-Entscheidung treffen oder eine Anweisung nur unter einer bestimmten Bedingung ausführen lassen. Auswahl einer Anweisung: entweder Fall 1 oder Fall 2 Oder: Bedingte Ausführung einer Anweisung if (Ausdruck)? Anweisung // Nur falls Ausdruck wahr: ausführen // Hier wird die Ausführung nach if fortgesetzt

    52. Prof. Dr. Fritz Jobst 52 Vergleiche Bedeutung Java Falls a kleiner ist als b if (a < b)? Falls a kleiner ist als b oder gleich b if (a <= b)? Falls a gleich b ist if (a == b)? Falls a ungleich b ist if (a != b)? Falls a größer ist als b if (a > b)? Falls a größer ist als b oder gleich b if (a >= b)? Vergleiche liefern boolesche Werte. Sie können daher bei der if-Anweisung als Ausdruck benutzt werden.

    53. Prof. Dr. Fritz Jobst 53 Logische Verknüpfungen von Ausdrücken

    54. Prof. Dr. Fritz Jobst 54 Schachtelung von if 01 if (a < 0)? 02 System.out.println ("Fall: a < 0"); 03 else if (a == 0)? 04 System.out.println ("Fall: a = 0"); 05 else 06 System.out.println ("Fall: a > 0"); 07 // ...

    55. Prof. Dr. Fritz Jobst 55 Vorsicht mit leeren Anweisungen 01 if (a < 0); 02 System.out.println ("Fall: a < 0"); Hier würde die leere Anweisung vor ; ausgeführt. Die Anweisung 02 würde in jedem Fall ausgeführt.

    56. Prof. Dr. Fritz Jobst 56 Fallunterscheidung: Quadratische Gleichung ax2 + bx + c = 0 Lösung: Falls a ungleich 0: quadratische Gleichung Dann mit Formel (nächste Seite) lösen. Aber: Fallunterscheidung für Diskriminante! Sonst lineare Gleichung bx + c = 0 Falls b = 0: konstante Gleichung Falls c = 0: alle x sind Lösung Sonst: kein x löst die Gleichung Sonst: Lösung = -c/b

    57. Prof. Dr. Fritz Jobst 57 Fallunterscheidungen: Lösung der quadratischen Gleichung ax2 + bx + c = 0

    58. Prof. Dr. Fritz Jobst 58 Fallunterscheidung: quadratische Gleichung ax2 + bx + c = 0

    59. Prof. Dr. Fritz Jobst 59 Auswahl von Anweisungen: Fallunterscheidung mit switch

    60. Prof. Dr. Fritz Jobst 60 Schreibweise : switch Vorsicht: break schreiben! switch (Ausdruck) { case konst1: Anweisungen1 break; case konst2: Anweisungen2 break; ......... usw. default : Anweisungen } Ausdruck : eine ganze Zahl konst… : ganzzahlige Konstanten Zur Beachtung: Auch Zeichen sind ganze Zahlen Aber: Zeichenfolgen, Gleitkommazahlen sind keine ganzen Zahlen!

    61. Prof. Dr. Fritz Jobst 61 switch: Beispiel public class DemoFuerSwitch { public static void main (String args []) { int i = Integer.parseInt (args[0]); // i = Zahl als Wert des 1. Parameters switch (i) { case 1: case 2: System.out.println (i + " Fall 1,2"); // Weiter bei Fall 3 case 3: System.out.println (i + " Fall 3"); // Weiter bei Fall 7 case 7: System.out.println (i + " Fall 7"); break; default : System.out.println (i + " sonst"); } } }

    62. Prof. Dr. Fritz Jobst 62 switch: Probelauf Beispiel >java DemoFuerSwitch 1 1 Fall 1,2 1 Fall 3 1 Fall 7 >java DemoFuerSwitch 2 2 Fall 1,2 2 Fall 3 2 Fall 7 >java DemoFuerSwitch 3 3 Fall 3 3 Fall 7 >java DemoFuerSwitch 5 5 sonst >java DemoFuerSwitch 7 7 Fall 7

    63. Prof. Dr. Fritz Jobst 63 Wiederholung von Anweisungen: while, for Prüfung am Anfang: Solange wahr tue Anweisung while (Ausdruck)? Anweisung for (Initialisierer; Bedingung; Ausdruck)? Anweisung

    64. Prof. Dr. Fritz Jobst 64 while: Beispiel int i = 0; while (i < 10) { System.out.println (i); // Anweisung i = i + 1; } Anweisung wird für die Werte i = 0 i = 1 i = 2 ... i = 9 ausgeführt. Diese Werte werden der Reihe nach ausgegeben.

    65. Prof. Dr. Fritz Jobst 65 for: Beispiel for (int i = 0; // Initialisierung i < 10; // Bedingung i++) // Ausdruck { System.out.println (i); // Anweisung } Anweisung wird für die Werte i = 0 i = 1 i = 2 ... i = 9 ausgeführt Funktioniert genauso (außer: Gültigkeit von i) wie while auf der vorigen Folie!

    66. Prof. Dr. Fritz Jobst 66 for: Bedeutung for (Initialisierer; Bedingung; Ausdruck)? Anweisung ... bedeutet: { Initialisierer; while (Bedingung) { Anweisung Ausdruck; } } Beispiel: k02/src/DemoFuerFor.java

    67. Prof. Dr. Fritz Jobst 67 Erweiterte for-Anweisung bei Java 5 Java 5 kennt eine erweiterte Form der for-Schleife: für-alle-Elemente public static void main (String[] args) { for (String s : args)? System.out.println (s); } Die println-Anweisung wird der Reihe nach für alle Elemente von args durchlaufen.

    68. Prof. Dr. Fritz Jobst 68 Wiederholung von Anweisungen: do-while Schleifen mit Prüfung am Ende tue Anweisung, solange wahr do Anweisung while (Ausdruck);

    69. Prof. Dr. Fritz Jobst 69 do-while: Beispiel int i = 0; do { System.out.println (i); // Anweisung i = i + 1; } while (i < 10) Anweisung wird für die Werte i = 0 i = 1 i = 2 ... i = 9 ausgeführt Beispiel: k02/src/QuadratWurzel.java

    70. Prof. Dr. Fritz Jobst 70 Verlassen von Schleifen: break Mit break wird die do-while-for-Schleife bzw. die switch-Anweisung verlassen, in der die Anweisung steht. Bei geschachtelten Anweisungen wird dabei nur eine Anweisung verlassen: Die Schachtelungstiefe der Anweisungen verringert sich um eins. break mit Name: In diesem Fall muss bei break ein Name angegeben sein, der eine die Schleife umfassende Anweisung bezeichnet. Damit kann man auch geschachtelte Schleifen mit einer einzigen break-Anweisung verlassen. Eine mögliche Anwendung sind geschachtelte Suchschleifen.

    71. Prof. Dr. Fritz Jobst 71 Fortsetzen mit continue Mit continue wird die Schleifenausführung fortgesetzt. Dies erfolgt bei while- und do-Schleifen beim Bewerten des Ausdrucks. Bei for(A1; A2; A3) wird A3 durchlaufen und danach A2 bewertet. Beispiel: k02/src/DemofuerContinue.java

    72. Prof. Dr. Fritz Jobst 72 Programmausnahmen Wenn Programme nicht auf Ausnahme-situationen reagieren können, führt das zu den von den Anwendern gefürchteten Abstürzen. Bei komplexen Programmsystemen und verteilten Anwendungen sind Programme ohne jede Reaktion auf Ausnahmesituationen nicht akzeptabel. Sind solche Programme je zumutbar???

    73. Prof. Dr. Fritz Jobst 73 Programmausnahmen Die Behandlung von Ausnahmen mit den Sprachkonstrukten für den Normalfall hat sich nicht bewährt. So könnte man sich eine Behandlung von Ausnahmen im Rahmen von Abfragen mit if vorstellen. Jede Routine müsste dann entsprechende Fehlerschalter bzw. entsprechende Ergebnisse liefern. Bei dieser Vorgehensweise hat man eine völlig unübersichtliche Programmstruktur erhalten: Eine tiefe Schachtelung nach Aufrufen von Routinen, eine Verquickung von Programmcode für den Ablauf sowie für den Ausnahmefall.

    74. Prof. Dr. Fritz Jobst 74 Ausnahmen in Java: Schreibweisen try { // Probieren wir eine Folge von Anweisungen... …. …. } catch (xException e) { // und wenn es schief geht: Reaktion oder aber } catch (yException e) { // Reaktion auf oben nicht aufgefangene // Programmausnahme } finally { // Abschließende Maßnahmen // Nach try-catch: wird in jedem Fall durchlaufen }

    75. Prof. Dr. Fritz Jobst 75 Programmausnahmen catch macht keine Aktionen des Programms rückgängig Keine Bestellung stornieren, … catch: nur eine Art Fortsetzung des Programms an einer bestimmten Auffangstelle. Je nach Art der Programmausnahme kann eine geeignete Behandlung erfolgen Dadurch wird eine „weiche Landung“ des Programms möglich, Abstürze werden vermieden.

    76. Prof. Dr. Fritz Jobst 76 Beispiel public class DemoFuerException { public static void main (String args []) { for (int i = -3; i <= 3; i++)? try { // Schauen wir mal...klappt das wirklich? // Wohl eher weniger: Division durch 0? System.out.println (1 / i); } catch (ArithmeticException e) { // Hoppla: System.out.println ("Exception: " + e); } } } Beispiel: k02/src/DemoFuerException.java

    77. Prof. Dr. Fritz Jobst 77 Kontrollfluss: Zusammenfassung Ein Programm besteht als elementaren Anweisungen wie Wertzuweisung und Methodenaufrufen. Mit if und switch können Fallunterscheidungen getroffen werden. while, for und do dienen der wiederholten Ausführung von Anweisungen. Ausnahmesituationen lassen sich mit try-catch strukturiert behandeln.

    78. Prof. Dr. Fritz Jobst 78 Syntax für Anweisungen Die Syntax einer Programmiersprache kann mit Syntaxdiagrammen beschrieben werden. Symbole in Rechtecken: werden durch andere Diagramme erklärt Symbole in Ovalen müssen in genau so angegeben werden, nachfolgend im Text mit "…" bezeichnet. Im o. a. Beispiel: Die if-Anweisung besteht aus "if", gefolgt von "(", Expression, ")" sowie Statement. Optional kann ein Zweig aus "else" und einem Statement folgen. Statement ist eine beliebige Anweisung, also z.B. eine Wertzuweisung, eine if-Anweisung … Expression muss ein Ausdruck sein. Die folgenden Folien stellen die Syntax für Anweisungen dar.

    81. Prof. Dr. Fritz Jobst 81

    82. Prof. Dr. Fritz Jobst 82 Methoden Bezeichnung in C, Pascal...: Funktionen, Prozeduren Programme dienen der Lösung von Problemen. Wenn man das Problem in Teilprobleme zerlegt, dann dienen die Methoden der Lösung dieser Teilprobleme. Beispiel: (daten, y, j, k als definiert angenommen)? System.out.println (daten); double x = Math.sqrt (y); // Methode liefert Wert int i = Math.min (j, k); // Methode liefert Wert Methoden können über Aufrufe aktiviert werden. Danach wird das Programm mit der nächsten Anweisung fortgesetzt. Methoden können auch als "erweiterte Befehle" an die Maschine verstanden werden.

    83. Prof. Dr. Fritz Jobst 83 Aufruf von Methoden Methoden können aufgerufen werden. System.out.println (daten); Beim Aufruf werden Parameter übergeben. Die Methode benutzt diese Parameter und arbeitet damit (aktuelle Parameter)? System.out.println ("Hallo"); System.out.println ("Welt"); double x = Math.sqrt (9.0); // x ? 3.00... double y = Math.sqrt (16.0); // y ? 4.00... int i = Math.min (4, 9); // i ? 4 Methoden können Werte liefern

    84. Prof. Dr. Fritz Jobst 84 Parameter Im Aufruf werden Parameter als Wert übergeben: aktuelle Parameter. Der Wert des Ausdrucks wird berechnet und an die Methode übergeben. Die aktuellen Parameter müssen mit der Definition der Parameter (formale Parameter) in der Methode hinsichtlich Anzahl und Typ übereinstimmen. Siehe nächste Folie. Wenn z.B. ein Parameter vom Typ double verlangt war, so muss ein Wert übergeben werden, der im Sinne der Wertzuweisung hier passt: int, float, double.

    85. Prof. Dr. Fritz Jobst 85 Definition von Methoden Methoden können in den Java-Klassen auf Klassenebene definiert werden. Definition von Daten: int zahl; Definition einer Methode: int methode1 (int parameter) { ...Befehle... ... return Ausdruck; // Ein Ergebnis liefern } Dann kann die Methode wie im Java-API definierte Methoden benutzt werden: ... = methode1 (2+3*4); Die Parameter in der Definition heißen auch formale Parameter. Hinweis: Bis zur OOP müssen wir static vor die Definitionen schreiben. Vgl. hierzu Kapitel 3. Beispiel zum Ueberladen von Funktionen: k02/src/Ueberladen.java

    86. Prof. Dr. Fritz Jobst 86 Methoden: Beispiele // Ermittle das Maximum zweier ganzer Zahlen // Parameter : i und j vom Typ int // Ergebnis : vom Typ int static int maximum (int i, int j) { if (i > j)? return i; else return j; }   // Ausgabe eines Textes nach Standard-Ausgabe // Parameter : Eine Zeichenfolge vom Typ String // Ergebnis : keines (d.h. void)? static void print (String text) { System.out.println (text); }

    87. Prof. Dr. Fritz Jobst 87 Methoden: Beispiel // Stelle eine ganze Zahl n-stellig mit AnzahlZiffern dar. // Verwende Leerzeichen für rechtsbündige Darstellung. // Es werden mindestens n Zeichen ausgegeben. // Parameter : Zahl und AnzahlZiffern // Ergebnis : eine Zeichenfolge (String)? static String zahl2Text (int Zahl, int AnzahlZiffern) { // StringBuffer dient dem Aufbau von Zeichenfolgen // Vgl. Kapitel 3. StringBuffer b = new StringBuffer (); // Wandle die Zahl in eine Zeichenfolge um b.append (Zahl); // append (...): ... anhängen  // Fülle mit Leerzeichen von Links her auf while (b.length() < AnzahlZiffern)? b.insert (0, ' '); // insert (...) ... bei 0 einsetzen return b.toString (); }

    88. Prof. Dr. Fritz Jobst 88 Beispiel für Ablauf eines Aufrufs

    89. Prof. Dr. Fritz Jobst 89 Ablauf des Aufrufs: Hintergrundinformation Die JVM (Java Virtual Machine) ist für den Ablauf von Java-Programmen zuständig. Für jeden Aufruf Methode wird ein Aktivierungsblock, ein sog. Frame angelegt. Dieser lebt genau so lange, bis der Aufruf beendet wird. Dieser „Frame“ enthält alle Parameter, lokalen Daten der Methode sowie Platz für die Rücksprungadresse und das Ergebnis einer Methode, sofern vorhanden. Beim Aufruf einer Methode wird ein „Frame“ angelegt. Die Werte der Parameter werden vom Aufrufer in die dafür vorgesehenen Plätze im „Frame“ übertragen. Die Rücksprungadresse muss notiert werden, damit nach Ablauf der Methode eine Programmfortsetzung möglich wird. Der „Frame“ des Aufrufers mit all seinen Daten bleibt während des Aufrufs von minimum erhalten, da sein eigener Aufruf noch nicht beendet ist. Er wird nach dem Rücksprung aus der gerufenen Methode minimum wieder benützt.

    90. Prof. Dr. Fritz Jobst 90 Ablauf des Aufrufs: Skizze

    91. Prof. Dr. Fritz Jobst 91 Beispiel Einlesen zweier Zahlen Ausgabe des Minimums Hierzu: Deklaration einer Methode min()? main liest Daten ein main ruft die Methode min auf main gibt die Ergebnisse aus

    92. Prof. Dr. Fritz Jobst 92 Beispiel für eine Methode import java.util.*; public class BestimmeMinimum { static int min (int i, int j) { if (i < j)? return i; // i < j else return j; // sonst i >= j, liefere j } public static void main (String args[]){ System.out.println ("Bitte zwei Zahlen eingeben"); Scanner eingabe = new Scanner (System.in); int zahl1 = eingabe.nextInt (); int zahl2 = eingabe.nextInt (); System.out.printf ("Das Minimum aus %d und %d ist %d\n", zahl1, zahl2, min (zahl1, zahl2)); } }

    93. Prof. Dr. Fritz Jobst 93 Ablauf des Beispiels main ruft ...println (parameter) auf: Ausgabe main ruft ...nextInt() auf: 1. Zahl einlesen main ruft ...nextInt() auf: 2. Zahl einlesen Aufruf von min (wert von zahl1, wert von zahl2); min erhält die eingegebenen Werte min setzt das Ergebnis: die kleinere Zahl printf erhält dieses Ergebnis und gibt es aus.

    94. Prof. Dr. Fritz Jobst 94 Rekursion Methoden in Java sind ohne Einschränkung auch rekursiv aufrufbar. Dies gilt in gleicher Weise für static-Methoden wie auch für andere. Die Rekursion kann als Strategie zur Lösung eines Problems immer dann eingesetzt werden, wenn ein Teilproblem ähnlich zu lösen ist wie das gesamte Problem. Zur Lösung eines Problems verwendet die Rekursion eine Routine zur Lösung eines Teilproblems, nämlich sich selbst, aber mit anderen Parametern als im „eigenen“ Aufruf. Wenn der Aufruf stets mit gleichen Parametern erfolgen würde, würde man versuchen, das Problem durch sich selbst zu lösen. Dieser Versuch ist natürlich zum Scheitern verurteilt.

    95. Prof. Dr. Fritz Jobst 95 Rekursion: Fakultät Definition der Fakultät über eine Wertetabelle n 0 1 2 3 4 5 6 n! 1 1 2 6 24 120 720 Das Problem der Berechnung von n! wird in Teilprobleme zerlegt: Berechne (n-1)! Multipliziere das Ergebnis mit n

    96. Prof. Dr. Fritz Jobst 96 Fakultät programmieren Die Formel lässt sich 1:1 umsetzen int fakultaet (int n) { if (n == 0)? return 1; // Ergebnis 1 else return n* fakultaet (n-1); }

    97. Prof. Dr. Fritz Jobst 97 Probelauf für den Aufruf fakultaet (2)?

    98. Prof. Dr. Fritz Jobst 98 Prinzip der Rekursion Probleme können gelöst werden, indem man sie in Teilproblem zerlegt. Die Methode zur Lösung des Problems ruft dann die Methoden zur Lösung der Teilprobleme auf. Wenn ein Teilproblem Ähnlichkeiten zum Problem aufweist, eignet es sich als Methode. Die Aufgabenstellung wird über die Parameter definiert. Diese müssen sich für das Teilproblem ändern ? einfacher werden. Damit kann die Gesamtlösung aus den Teillösungen zusammengesetzt werden.

    99. Prof. Dr. Fritz Jobst 99 Türme von Hanoi Die Scheiben auf dem Stapel „Quelle“ sollen auf den Stapel „Ziel“ transportiert werden. Dabei darf jeweils nur eine Scheibe bewegt werden. Es darf niemals eine größere auf eine kleinere Scheibe zu liegen kommen. Alle drei Stapel dürfen benutzt werden.

    100. Prof. Dr. Fritz Jobst 100 Türme von Hanoi: 1 Scheibe

    101. Prof. Dr. Fritz Jobst 101 Türme von Hanoi: 2 Scheiben

    102. Prof. Dr. Fritz Jobst 102 Türme von Hanoi: 3 Scheiben

    103. Prof. Dr. Fritz Jobst 103 Türme von Hanoi: Vorgehen

    104. Prof. Dr. Fritz Jobst 104 Türme von Hanoi: Lösungsansatz public class Hanoi { // Bewege eine Scheibe public static void bewege1 (int Quelle, int Ziel) { System.out.println ("Bewege "+Quelle+" nach "+Ziel); } // Bewege zwei Scheiben. Benutze die Lösung für 1 Scheibe public static void bewege2 (int Quelle,int Hilf,int Ziel) { bewege1 (Quelle, Hilf); // (I) bewege1 (Quelle, Ziel); // (II)? bewege1 (Hilf, Ziel); // (III)? }

    105. Prof. Dr. Fritz Jobst 105 Türme von Hanoi: Lösungsansatz // Bewege drei Scheiben. Benutze die Lösung für 2 Scheiben public static void bewege3 (int Quelle, int Hilf, int Ziel) { bewege2 (Quelle, Ziel, Hilf); // (I)? bewege1 (Quelle, Ziel); // (II) bewege2 (Hilf, Quelle, Ziel); // (III)? } public static void main (String[] args) { // Quelle = Stapel 0, Hilf = Stapel 1, Ziel = Stapel 2 bewege3 (0, 1, 2); } }

    106. Prof. Dr. Fritz Jobst 106 Vereinfachung dieses Ansatzes Die bewege…-Routinen ähneln sich stark. Der Unterschied liegt in der Anzahl der Türme. Wenn man diese Anzahl als Parameter übergibt, dann hat man eine Routine für alle Fälle. Diese Routine kann dann sogar mehr als nur 3 Türme bewegen: der Parameter kann beliebig groß sein.

    107. Prof. Dr. Fritz Jobst 107 Türme von Hanoi: Lösung public class TowersOfHanoi { static void bewege (int Quelle, int Hilf, int Ziel, int n) { if (n == 1)? System.out.println ("Bewege "+Quelle+" nach "+Ziel); else { bewege (Quelle, Ziel, Hilf, n-1); // (I)? bewege (Quelle, 0, Ziel, 1); // (II)? bewege (Hilf, Quelle, Ziel, n-1); // (III)? } } public static void main (String[] args) { bewege (0, 1, 2, 3); } } Beispiele: k02/src/TowersOfHanoi.java, …/Hanoi.java

    108. Prof. Dr. Fritz Jobst 108 Methoden: Zusammenfassung Der aktive Teil eines Programm besteht aus den Methoden. Methoden enthalten Anweisungen. Methoden können in der Definition formale Parameter enthalten. Bei Aufruf führt das Laufzeitsystem Wertzuweisungen auf diese Parameter aus. Die Methode rechnet also mit den Parametern. Für Parameter gibt es nur diese Übergabe als Wert.

    109. Prof. Dr. Fritz Jobst 109 Methoden: Syntax der Definition

    110. Prof. Dr. Fritz Jobst 110 Felder: Daten in variabler Anzahl public class ZugriffAufParameter { public static void main (String[] args) { // args.length = Anzahl der Parameter // args[0] = 1. Parameter usw........ for (int i = 0; i < args.length; i++) { System.out.println ("Par. " + i + " = " + args[i]); } int i = 0; for (String s: args) { System.out.printf ("Par. %d = %s\n", i, s); } } } Die Anzahl der Parameter im Aufruf ist variabel und bei der Programmierung nicht vorherzusehen. Beispiel: k02/src/DemoFuerParameter.java

    111. Prof. Dr. Fritz Jobst 111 Lösung: Felder Programmiersprachen lösen dieses Problem mit Feldern. Bezeichnung: Array, Feld Ein Feld ist eine Ansammlung von Daten gleichen Typs. Der Zugriff auf die einzelnen Komponenten erfolgt mit einem Index zur Auswahl []. Die Anzahl der Indices heißt auch Dimension des Feldes: 1 Index = 1-dimensionales Feld Java kennt ein- und mehrdimensionale Felder

    112. Prof. Dr. Fritz Jobst 112 Felder in Java

    113. Prof. Dr. Fritz Jobst 113 Felder in Java Kurz: int[] zahlen = {1, 2, 3, 4}; zahlen.length enthält die Feldlänge Feldlängen sind unveränderlich, wenn sie einmal gesetzt sind Die Variable zahlen enthält nicht den Inhalt des Feldes, sie entspricht einer „Hausnummer“. Das eigentliche „Haus“ steht an anderer Stelle. Die einzelnen Komponenten können über die „Hausnummer“ zahlen erreicht werden: zahlen[0] zahlen[1] zahlen[i] für eine int-Variable i. Ein solches Feld ist ein eindimensionales Feld.

    114. Prof. Dr. Fritz Jobst 114 Felder: Wertzuweisung Kopieren des Inhaltes der Feldvariablen, nicht des Inhalts des Feldes!

    115. Prof. Dr. Fritz Jobst 115 Felder: Wertzuweisung Der Feldname wird häufig auch als Referenz auf das Feld bezeichnet. Wenn statt der Kopie des Feldnamens (=„Hausnummer“) eine Kopie des Inhalts (=„Haus“) gewünscht wird, so müssen die Werte aller Komponenten kopiert werden. Dies ist das sog. Clonen des Feldes. Hierfür gibt es in Java eine clone-Anweisung. Diese Kopie der Inhalte eines Feldes erfordert einen Aufwand, der proportional zur Größe des Feldes ist. Da jede Referenz in der CPU gerade ein Maschinenwort belegt, ist die Kopie von Referenzen (=„Hausnummern“) effizient. Damit ist auch die Übergabe von Feldern als Parameter an Methoden effizient. Die Methode erhält die Referenz: eine Kopie der „Hausnummer“ und kann mit dieser auch auf die Feldinhalte lesend und schreibend zugreifen. Denn: die Kopie der Hausnummer ist identisch mit der Hausnummer.

    116. Prof. Dr. Fritz Jobst Beispiele zu Feldern 1 k02/src/DemoFuerFelderClonen.java k02/src/LineareSuche.java

    117. Prof. Dr. Fritz Jobst 117 Einlesen eines Feldes import java.util.*; public class Demofeld_1_Dim { private static Scanner eingabe = new Scanner (System.in); static void lies(double[] feld) { for (int i = 0; i < feld.length; i++) { feld[i] = eingabe.nextDouble (); } }

    118. Prof. Dr. Fritz Jobst 118 Maximum bestimmen static double maximum(double[] feld) { double max = feld[0]; for (double f : feld) { if (f > max)? max = f; } /* Alternative: die "klassische" for-Schleife double max = feld[0]; for (int i = 1; i < feld.length; i++) { if (feld[i] > max) { max = feld[i]; } } */ return max; }

    119. Prof. Dr. Fritz Jobst 119 Summe bestimmen static double summe(double[] feld) { double summe = 0; for (double f : feld) { summe += f; } /* Alternative: die "klassische" for-Schleife double summe = feld[0]; for (int i = 1; i < feld.length; i++) { summe += feld[i]; } */ return summe; }

    120. Prof. Dr. Fritz Jobst 120 Durchschnitt bestimmen static double durchschnitt(double[] feld) { return summe (feld) / feld.length; } public static void main(String[] args) { System.out.printf ("Bitte die Anzahl der Zahlen im feld eingeben:\n"); int anzahlKomponenten = eingabe.nextInt(); double feld[] = new double[anzahlKomponenten]; System.out.printf ("Bitte die %d Zahlen im feld eingeben:\n", anzahlKomponenten); lies (feld); System.out.printf ("Maximum %f\n", maximum (feld)); System.out.printf ("Minimum %f \n", summe (feld)); System.out.printf ("Durchschnitt %f\n", durchschnitt (feld)); } }

    121. Prof. Dr. Fritz Jobst Beispiele zu Feldern 2 k02/src/DemoFeld_1_Dim.java k02/src/Lotto.java k02/src/BinaereSuche.java

    122. Prof. Dr. Fritz Jobst 122 Sortieren eines Feldes Eine der immer wiederkehrenden Aufgaben der Programmierung ist das Sortieren von Feldern. Natürlich bietet die Java-Bibliothek Methoden zum Sortieren von Feldern: Siehe die Klasse java.util.Arrays. Zum Einstieg ist es sinnvoll, einige Verfahren zum Sortieren kennenzulernen. Bubblesort ist eines der elementaren Verfahren zum Sortieren von Feldern.

    123. Prof. Dr. Fritz Jobst 123 Bubblesort Bubblesort arbeitet in mehreren Durchgängen: Zunächst wird das größte Element des ganzen Feldes an den Anfang gesetzt. (Schritt 1 nächste Folie)? Dann wird das größte Element des restlichen Feldes an den Anfang des Restes gesetzt. Usw… (Schritte 2, 3, 4) dadurch erhält man ein sortiertes Feld. Das größte Element eines Feldes wird durch den Austausch benachbarter Elemente bewegt. Dabei beginnt man am Ende des Feldes. Man vergleicht zwei benachbarte Elemente. Ist das weiter unten liegende Element „leichter“ als sein Vorgänger, so wandert es nach oben. Diesem „Aufsteigen“ verdankt das Verfahren seinen Namen. Dies wiederholt man, bis man am Anfang des Feldes ist.

    124. Prof. Dr. Fritz Jobst 124 Sortieren von Feldern: Bubble-Sort

    125. Prof. Dr. Fritz Jobst 125 Sortieren von Feldern: Bubble-Sort in Java void bubble (int[] feld) { // Für alle Teilfelder ab Anfang tue for (int i = 1; i < feld.length; i++)? // Bringe das größte Element des jeweiligen Feldes nach oben for (int j = feld.length-1; j >= i; j--)? if (feld[j] < feld[j-1]) { int temp = feld[j]; feld[j] = feld[j-1]; feld[j-1] = temp; } } Beispiel: k02/src/SortDemo.java

    126. Prof. Dr. Fritz Jobst 126 Mehrdimensionale Felder in Java Java realisiert mehrdimensionale Felder als Felder aus Feldern… Ein zweidimensionales Feld (Matrix) ist damit ein Feld aus eindimensionalen Feldern. D.h.: Jede Komponente (=Zeile) der Matrix ist ihrerseits wieder ein Feld. Vorteil: Das zweidimensionale Feld kann ungleich lange Komponenten haben. Nachteil: Der Zugriff erfordert eine relativ hohe Laufzeit.

    127. Prof. Dr. Fritz Jobst 127 Mehrdimensionale Felder

    128. Prof. Dr. Fritz Jobst 128 Arbeiten mit Matrizen in Java public class Feld_2_Dim { // Hilfsprogramme // Wandle eine Zahl in eine Darstellung mit // AnzahlZiffern um static String z2T (int zahl, int AnzahlZiffern) { StringBuffer b = new StringBuffer (); b.append (zahl); while (b.length() < AnzahlZiffern)? b.insert (0, ' '); return b.toString (); } public static void main (String[] args) { test2Dim (); // ? Nächste Folien }

    129. Prof. Dr. Fritz Jobst 129 Ausgabe einer Matrix // Ausgabe eines 2-dim-Feldes static void print2Dim (int[][] feld) { for (int i = 0; i < feld.length; i++) { for (int j = 0;j < feld[i].length;j++)? System.out.print ("feld[" + z2T(i, 2) + "][" + z2T(j, 2) + "] = " + z2T(feld[i][j], 4) + ' '); System.out.println (); } }

    130. Prof. Dr. Fritz Jobst 130 Bearbeiten einer Matrix static void test2Dim() { // a) Deklaration eines Feldes int[][] feld; // b) Speicher holen feld = new int[2][2]; // c) Zuweisen der Inhalte der Werte der Komponenten for (int i = 0; i < feld.length; i++)? for (int j = 0; j < feld[i].length; j++)? feld[i][j] = i*10 + j; print2Dim (feld); // Direktes Auflisten aller Elemente print2Dim (new int[][] {{0, 1}, {10, 11}}); } } Beispiel: k02/src/DemoFeld_2_Dim.java

    131. Prof. Dr. Fritz Jobst 131 Zusammenfassung Prozedurale Programmierung Daten und Typen Ein-/Ausgabe Kontrollstrukturen Methoden und Rekursion Felder, Bubblesort, Matrizen

More Related