Beuth Hochschule, TB3-IN3 Stichworte WS10/11, Seite 1 Stichworte zur Lehrveranstaltung Informatik 3 im dritten Semester des Studiengangs Technische Informatik Bachelor im Wintersemester 2010/11 an der Beuth-Hochschule für Technik Berlin von Ulrich Grude. Gegenstand dieser Lehrveranstaltung: Objektorientierte Programmierung (mit Java) In dieser Datei finden Sie nach jedem SU (seminaristischen Unterricht, Vorlesung) - Wiederholungsfragen für den nächsten SU, - Antworten zu den Wiederholungsfragen des letzten SU und - Stichworte zum Stoff, der im letzten SU behandelt wurde. Die Regeln, nach denen Sie in diesem Semester eine Note für das Fach TB3-IN3 erwerben können, stehen am Anfang der Datei AufgabenIN3.pdf. Beuth Hochschule, TB3-IN3 Stichworte WS10/11, Seite 2 1. Übung: Gruppe 1a: Mo 27.09.2010, 14.15 Uhr, Raum D E 16a Gruppe 1b: Fr 01.10.2010, 12.15 Uhr, Raum D E 16b 1. Falls mehr StudentInnen an dieser Übungsgruppe (1a bzw. 1b) teilnehmen möchten als Plätze vorhanden sind, die vorhandenen Plätze verlosen. Anmerkung: Die Kapazität der Übungsgruppen (ca. 22 TeilnehmerInnen) wird vor allem durch die Kapazität des Betreuers begrenzt, nicht durch die Anzahl der Rechner im SWE-Labor. Diese menschliche Betreuungskapazität wird nicht größer, wenn einige StudentInnen auf eigenen Laptops arbeiten, statt die Labor-Rechner zu benutzen (eigene Laptops benötigen eher ein bisschen mehr menschliche Betreuung als die fertig eingerichteten Laborrechner). 2. Einloggen (Noch fehlende Benutzer-Konten einrichten). 3. Meine Netzseite: http://public.beuth-hochschule.de/~grude/ 4. Dort die Datei für TB3-IN3 TipsZumTextPad.pdf öffnen Den folgenden Tip ausführen: 5. Ein kleines Programm zusammenklicken statt es einzutippen. In das erstellte Programm einen Fehler einbauen (z.B. eine Klammer löschen). Erneut compilieren. Auf die 1. Zeile der Fehlermeldung doppelklicken. Was passiert dadurch? Den eingebauten Fehler korrigieren (z.B. die Klammer wieder einfügen). Erneut compilieren und ausführen lassen. 5. Netzseite zum Buch "Java ist eine Sprache": http://public.beuth-hochschule.de/~grude/JavaIstEineSprache/ Von dort das Archiv BspJaSp.zip herunterladen und in ein Verzeichnis namens Z:\BspJaSp entpacken. 6. Ein Verzeichnis namens Z:\Java\Hallo erstellen und aus Z:\BspJaSp alle Hallo*.java-Dateien nach Z:\Java\Hallo kopieren. Die drei Java-Quelldateien Hallo01.java, Hallo01A.java und Hallo01B.java mit dem TextPad öffnen, compilieren und ausführen lassen. Was ist bei diesen drei Quelldateien gleich? Wodurch unterscheiden sie sich? 7. Auf meiner Netzseite die Datei für TB3-IN3 Aufgaben.pdf öffnen Die Seiten 6 und 7 ansehen und den darin beschriebenen Stoff genau verstehen (ist hoffentlich schon bekannt, aber falls nicht, dann jetzt noch mal lernen). Die Aufgabe 1 (auf den Seiten 4 und 5) ausdrucken und lösen (in Gruppen zu je 2 Personen). Diese Übung konnte wegen technischer Probleme nicht wie geplant stattfinden und wird beim nächsten Übungstermin (siehe unten Übung 2) nachgeholt. Beuth Hochschule, TB3-IN3 Stichworte WS10/11, Seite 3 1. SU Fr 01.10.2010 im Raum B554 1. Begrüßung 2. Organisation der LV Wie bekommt man eine Note für diese Lehrveranstaltung? 13 Tests, je 10 Testpunkte, mind. 5 Testpunkte in mind. 10 Tests, Gründe für nicht-Teilnahme an einem Test (keine Lust, Bus verpasst, Krankheit, ...) machen keinen Unterschied. Übungstermine: 1a. montags 4. Block, 1b. freitags 3. Block Falls nötig Verlosung von je 20 Plätzen pro Übungsgruppe. Grundlage der LV: Das Buch "Java ist eine Sprache" (in der BHT-Bibliothek oder im Buchhandel, 30 Euro). Bringen Sie es immer mit. Bin dankbar für Hinweise auf Fehler (Liste bekannter Fehler auf der Netzseite des Buches: http://public.beuth-hochschule.de/~grude/JavaIstEineSprache/welcome.html. Fragen an die TeilnehmerInnen: 1. Sie hatten 2 Semester C-Programmierung. Betriebssystem? Compiler? 2. Wer hat schon mal ein Java-Programm geschrieben? 3. Wer hat zu Hause einen Rechner? Alle? 4. Wer hat sich das Buch "Java ist eine Sprache" schon besorgt? Klausurtermin: Wird noch bekannt gegeben. Beuth Hochschule, TB3-IN3 1. SU Fr 01.10.2010 WS10/11, Seite 4 3. Jetzt geht es los mit dem Stoff (Abschnittsnummern aus dem Buch) Es geht in dieser Lehrveranstaltung um 2 Sprachen: Deutsch und Java (in dieser Reihenfolge). Rein äußerlich sehen viele Befehle in einem Java-Programm ganz ähnlich aus wie C-Befehle. Aber die "Ideen hinter diesen Befehlen", die Grundkonzepte auf denen sie beruhen, sind bei Java ziemlich anders als bei C. Ganz allgemein gilt: C ist eine maschinennahe Sprache. Was ein C-Programm bewirkt hängt (nicht nur vom Programm sondern meistens) auch davon ab, auf was für einer Plattform (Harware, Betriebssystem) man es ausführen lässt. Der C-Standard legt die Bedeutung von C-Programmen nicht in allen Einzelheiten fest, sondern überlässt vieles der jeweiligen Implementierung, z.B. • • • • Wie viele Ganzzahltypen gibt es? Nur einen? Oder 2? Oder 8? Oder ... Wie viele Werte gehören zum Ganzzahltyp int? Wie groß ist der größte Wert des Bruchzahltyps double? Was passiert, wenn man die double-Zahl 17.0 durch die double-Zahl 0.0 dividiert? etc. Dagegen ist Java eine maschinenunabhängige Sprache und die Sprachbeschreibung legt die Bedeutung von Java-Programmen bis in alle Einzelheiten ("Bit-genau") fest, z.B. • Es gibt 5 Ganzzahltypen (namens byte, char, short, int, long) • Zum Ganzzahltyp int gehören genau 232 (etwa 4.3 Milliarden) Werte • Der größte Wert des Bruchzahltyps double ist etwa gleich 1.797693E308, seine genaue Darstellung als Dezimalzahl erfordert 309 Dezimalziffern (alle vor dem Dezimal-Punkt, alle genau festgelegt) • Wenn man die double-Zahl 17.0 durch die double-Zahl 0.0 dividiert ist das Ergebnis ein spezieller double-Wert namens POSITIV_INFINITY. Noch ein paar wichtiger Unterschiede: Ein C-Programmierer Ein Java-Programmierer interessiert sich dafür und weiß, wie seine Programme im Speicher eines bestimmten Rechners aussehen. sollte abstrakter denken und sich weniger um konkrete Maschinen kümmern. ist stolz darauf, die ASCII-Codes aller gängigen Zeichen auswendig zu können. ist stolz darauf, dass man seine Programme lesen kann ohne irgendwelche ASCII-Codes auswendig zu kennen. kennt ein bestimmtes Compilationsmodell (insbesondere die Arbeitsteilung zwischen Compiler und Binder). interessiert sich meist nicht dafür, wie oft seine Quellprogramme compiliert werden (gar nicht, einmal, zweimal, ...) und ob es einen Binder gibt. Jetzt wollen wir noch mal ganz von vorn anfangen und uns (kurz) damit beschäftigen, was Programmieren eigentlich ist und was die wichtigsten Grundbegriffe der Programmierung sind. Beuth Hochschule, TB3-IN3 Stichworte WS10/11, Seite 5 1.1 Programmieren als ein Rollenspiel Rolle Tätigkeiten (die meisten beziehen sich auf Programme) Programmierer schreibt, übergiebt (an den Ausführer) Ausführer prüft, lehnt ab/akzeptiert, führt aus Benutzer läßt ausführen, ist für Ein-/Ausgabedaten zuständig Warter wartet (Programme, nicht auf den Bus) (Wieder-) Verwender will wiederverwenden Sinn der Rollen Warter und (Wieder-) Verwender. Gemeinsam bezeichnen wir den Warter und den (Wieder-) Verwender auch als "die Kollegen des Programmierers". Besetzung der Rollen, verschiedene Möglichkeiten. Def.: Programm: (S. 3) Bevor wir uns mit "kleinen Einzelheiten" befassen, ein Versuch, die "großen Ideen" der Programmierung kurz zu beschreiben: 1.4 Die vier wichtigsten Grundkonzepte der Programmierung Variable (Wertebehälter, Inhalt beliebig oft veränderbar) Typ Unterprogramm Modul Zur Entspannung: Was kostet ein Studium an der Beuth Hochschule? Haushalt der Beuth Hochschule ca. 50 Millionen [Euro pro Jahr]. An der Beuth Hochschule studieren ca. 10 Tausend StudentInnen. Also kostet das Studieren an der Beuth Hochschule ca. 5000 [Euro pro StudentIn und Jahr]. Ein Bachelor-Studium (6 Semester, 3 Jahre) kostet also ca. 15 Tausend [Euros pro StudentIn]. Im WS10/11 liegt die Anzahl der StudentInnen an der Beuth Hochschule erstmals ein wenig über 10 Tausend. Beuth Hochschule, TB3-IN3 1. SU Fr 01.10.2010 WS10/11, Seite 6 2. Übung Gruppe 1a: Mo 04.10.2010, 14.15 Uhr, Raum D E 16a Gruppe 1b: Fr 08.10.2010, 12.15 Uhr, Raum D E 16b Bei der 1. Übung haben wir noch weitgehend auf die Benutzung der Rechner im SWE-Labor verzichtet. In dieser 2. Übung sollen diese Rechner intensiv benutzt werden. Tip: Verwenden Sie als Browser nicht den Internet Explorer (weil der zur Darstellung von .pdf-Dateien den Adobe Reader sucht, der im SWE-Labor nicht installiert ist), sondern den Mozilla Firefox (der .pdf-Dateien ohne Probleme anzeigen kann). 1. Meine Netzseite: http://public.beuth-hochschule.de/~grude/ ansehen. 2. Dort die Datei für TB3-IN3 TipsZumTextPad.pdf (finden und) öffnen. Darin den folgenden Tip ausführen: 5. Ein kleines Programm zusammenklicken, statt es einzutippen. 3. In das erstellte Programm einen Fehler einbauen (z.B. eine Klammer löschen). Erneut compilieren. Auf die 1. Zeile einer Fehlermeldung doppelklicken. Was passiert dadurch? Den eingebauten Fehler korrigieren (z.B. die Klammer wieder einfügen). Erneut compilieren und ausführen lassen. 4. Die Netzseite zum Buch "Java ist eine Sprache": http://public.beuth-hochschule.de/~grude/JavaIstEineSprache/ ansehen. 5. Von dort das Archiv BspJaSp.zip herunterladen und in ein Verzeichnis namens Z:\BspJaSp entpacken. 6. Ein Verzeichnis namens Z:\Java\Hallo erstellen und aus dem Verzeichnis Z:\BspJaSp (siehe vorigen Punkt 5.) alle Hallo*.java-Dateien nach Z:\Java\Hallo kopieren. In einem regulären Ausdruck wie Hallo*.java steht der * allgemein für eine beliebige Zeichenkette. In diesem konkreten Anwendungsfalll steht er für Zahlen wie 01, 01A, 01B, 02 etc.) 7. Die drei Java-Quelldateien Hallo01.java Hallo01A.java Hallo01B.java mit dem TextPad öffnen, compilieren und ausführen lassen. Was ist bei diesen drei Quelldateien gleich? Wodurch unterscheiden sie sich? 8. Auf meiner Netzseite die Datei für TB3-IN3 Aufgaben.pdf (finden und) öffnen 9. Die Aufgabe 2: Rechnen mit Ganzzahlen bearbeiten (und dabei das unter Punkt 2. gelernte "Zusammenklicken eines Programms" praktisch anwenden). Beuth Hochschule, TB3-IN3 Stichworte WS10/11, Seite 7 Wiederholungsfragen, 2. SU, Fr 08.10.10 1. Was sind die charakteristischen Tätigkeiten des Programmierers? Geben Sie nur Tätigkeitsworte an, z.B. laufen, essen, schlafen. 2. Was sind die charakteristischen Tätigkeiten des Ausführers? 3. Was ist ein Programm? 4. Beschreiben Sie kurz den Unterschied zwischen einer M-Variablen in einer mathematischen Abhandlung oder in einem Beweis und einer P-Variablen in einem Programm. 5. Beschreiben Sie den Vorteil von Typen (in einer Programmiersprache wie C oder Java) mit einem möglichst einfachen, kurzen Satz. Diesen Satz soll Ihr Manager (der nur oberflächliche Informatikkenntnisse hat und nicht Programmieren kann) möglichst gut verstehen können. 6. Angenommen, Sie haben eine (in C programmierte) Divisionsfunktion mit folgendem Profil bekommen: int div(int dend, int dor); Schreiben Sie (in C) die zu dieser Divisionsfunktion passende Modulo-Funktion int mod(int dend, int dor) { Beuth Hochschule, TB3-IN3 1. SU Fr 01.10.2010 WS10/11, Seite 8 Antworten zu den Wiederholungsfragen, 2. SU, Fr 08.10.10 1. Was sind die charakteristischen Tätigkeiten des Programmierers? Geben Sie nur Tätigkeitsworte an, z.B. laufen, essen, schlafen. schreiben, übergeben 2. Was sind die charakteristischen Tätigkeiten des Ausführers? prüfen, akzeptieren/ablehenen, ausführen 3. Was ist ein Programm? Eine Folge von Befehlen, die ein Programmierer geschrieben hat und die von einem Ausführer ausgeführt werden können. 4. Beschreiben Sie kurz den Unterschied zwischen einer M-Variablen in einer mathematischen Abhandlung oder in einem Beweis und einer P-Variablen in einem Programm. Einer M-Variablen darf man nur einmal einen Wert zuordnen (und diesen Wert dann nicht mehr verändern). Den Wert einer P-Variablen darf man beliebig oft verändern. 5. Beschreiben Sie den Vorteil von Typen (in einer Programmiersprache wie C oder Java) mit einem möglichst einfachen, kurzen Satz. Diesen Satz soll Ihr Manager (der nur oberflächliche Informatikkenntnisse hat und nicht Programmieren kann) möglichst gut verstehen können. Typen ermöglichen es dem Ausführer bestimmte Fehler des Programmierers automatisch (und damit schneller und billiger) zu erkennen. 6. Angenommen, Sie haben eine (in C programmierte) Divisionsfunktion mit folgendem Profil bekommen: int div(int dend, int dor); Schreiben Sie (in C) die zu dieser Divisionsfunktion passende Modulo-Funktion int mod(int dend, int dor) { return dend - (div(dend, dor) * dor); } Beuth Hochschule, TB3-IN3 Stichworte WS10/11, Seite 9 2. SU Fr 08.10.10 A. Wiederholung B. Organisation: Entgegen dem, was ich am letzten Freitag (01.10.10) dachte, gibt es noch ein paar freie Plätze in der Übungsgruppe 1a (montags im 4. Block), aber die Übungsgruppe 1b (freitags, 3. Block) ist schon weitgehend voll. Rollenspiel, ein Nachtrag Wozu haben wir die Rollen des Warters und des Wiedervervenders (also die Rollen "der Kollegen des Programmierers") eingeführt? Um deutlich zu machen, dass Programme nicht nur die richtigen Befehle an den Ausführer enthalten müssen (der Ausführer ist meist eine Maschine), sondern auch von anderen Menschen (den Kollegen) gelesen und verstanden werden müssen. Es gschieht leider immer noch häufig, dass Programmierer nur "mit dem Ausführer kämpfen", aber nicht an ihre armen Kollegen denken, die das Programm später warten oder wiederverwenden sollen. 1.4 Die vier wichtigsten Grundkonzepte der Programmierung (Fortsetzung) Modul Das fünfte der vier wichtigsten Grundkonzepte: Klasse Eine unvollständige Definition: Eine Klasse ist ein Modul und ... . 1.5 Drei Arten von Befehlen Bezeichnung (deutsch) Bezeichnung (englisch) Übersetzung eines solchen Befehls ins Deutsche (oder: Was befiehlt ein solcher Befehl dem Ausführer?) Vereinbarung declaration "Erzeuge ... !" Ausdruck expression "Berechne den Wert des Ausdrucks ... !" Anweisung statement "Tue die Werte ... in die Wertebehälter ... !" Was ein Ausdruck macht und was ein (normaler) Ausdruck nicht macht! Zwei Vokablen: Methode (engl. method) Attribut (engl. field) Ein Unterprogramm, das in einer Klasse vereinbart wurde. Eine Variable, die in einer Klasse vereinbart wurde. Zur Entspannung: Al-Khwarizmi (ca. 780-850) Abu Ja'far Muhammad ibn Musa Al-Khwarizmi war ein islamischer Mathematiker, der in Bagdad lebte, über Indisch-Arabische Zahlen schrieb und zu den ersten gehörte, die die Ziffer 0 benutzten. Aus seinem Namen entstand (durch Übertragung ins Latein und dann in andere Sprachen) das Wort Algorithmus. Eine seiner Abhandlungen heißt Hisab al-jabr w'al-muqabala (auf Deutsch etwa: "Über das Hinüberbringen", von einer Seite einer Gleichung auf die andere). Daraus entstand unser Wort Algebra. 5.3 Mit primitiven Werten rechnen (S.103) Verschiedene Mengen von Zahlen wie Mathematiker und Ingenieure sie sehen: Verschiedene Mengen von Zahlen wie ein Java-Ausführer sie sieht: Wie viele Elemente enthalten die Zahlen-Mengen N, Z, Q, R und C? (unendlich viele) S.103, Bild 5.1 S.104, Bild 5.2 Beuth Hochschule, TB3-IN3 2. SU Fr 08.10.10 WS10/11, Seite 10 Was haben die Mengen N, Z, Q, R und C miteinander zu tun? (Sie sind Teilmengen voneinander: N ⊂ Z, Z ⊂ Q, Q ⊂ R, R ⊂ C) Wie viele Elemente enthalten die Zahlen-Mengen byte, char, short, int, long, float, double? (endlich viele, die genauen Anzahlen stehen auf S. 93 des Buches) Was haben die Mengen byte, char, short, int, long, float, double miteinandner zu tun? (Wenig, sie sind disjunkt, d.h. sie haben keine gemeinsamen Elemente). In der Mathematik gibt es nur eine Zahl siebzehn. Diese Zahl ist gleichzeitig eine natürliche, eine ganze, eine rationale, eine reelle und eine komplexe Zahl. Ein Java-Ausführer unterscheidet sieben Zahlen namens siebzehn: Eine siebzehn vom Typ byte, eine siebzehn vom Typ char, ..., eine siebzehn vom Typ double. Kurz-Notation: byte-17, char-17, short-17, int-17, long-17, float-17, double-17. Diese sieben Zahlen unterscheiden sich erheblich voneinander. Beispiel für Unterschiede: Beispiel-1: Die Zahl double-17 darf man einer Variablen des Typs double zuweisen, aber nicht in einer Variablen des Typs int oder byte etc. Beispiel-2: Wenn man die Zahl double-17 durch die Zahl double-2 dividiert, kommt als Ergebnis die Zahl double-8.5 heraus. Wenn man die Zahl int-17 durch die Zahl int-2 dividiert, kommt als Ergebnis die Zahl int-8 heraus. Beispiel-3: Wenn man die Zahl float-17 durch die Zahl float-0 dividiert, kommt als Ergenis eine float-Zahl namens Float.POSITIVE_INFINITY heraus. Wenn man die Zahl long-17 durch die Zahl long-0 dividiert, kommt kein Ergebnis heraus, vielmehr wird "eine Ausnahme geworfen". Praktisch bedeutet das häufig (aber nicht immer), dass die Ausführung des betreffende Programm mit einer Fehlermeldung abgebrochen wird). Mit Ausnahmen werden uns später genauer befassen. Allgemein gilt: Wenn ein Java-Ausführer mit Ganzzahlen rechnet (d.h. mit Zahlen der Typen byte, char, short, int oder long), dann gelten ganz andere Regeln, als wenn er mit Gleitpunktzahlen rechnet (d.h. mit Zahlen der Typen float oder double). In einem Java-Programm bezeichnen Literale wie 0 oder 123 oder 587389 immer int-Werte, Literale wie 0.0 oder 12.345 oder 8799.34567 bezeichnen dagegen double-Werte. Es folgen ein paar Beispiele für Rechnungen mit int Werten: 7 / 2 ist gleich 3 5 / 0 loest eine Ausnahme des Typs ArithmeticException aus (Programmabbruch) 0 / 0 loest eine Ausnahme des Typs ArithmeticException aus (Programmabbruch) Beispiele für Rechnungen mit double-Werten: 7.0 5.0 5.0 0.0 7.0 7.0 7.0 / / / / / / + 2.0 0.0 -0.0 0.0 (5.0 / 0.0) (5.0 / -0.0) (0.0 / 0.0) ist ist ist ist ist ist ist gleich 3.5 gleich Infinity gleich -Infinity gleich NaN gleich 0.0 gleich -0.0 gleich NaN Anhand der Aufgaben 2 und 3 sollen sie sich mit den Rechenregeln für int-Werte bzw. float-Werte vertraut machen. Auf S. 107 des Buches finden sie zwei Tabellen, die die Multiplikation * und die Division / für float- und double-Werte beschreiben. Beuth Hochschule, TB3-IN3 Stichworte WS10/11, Seite 11 Wiederholungsfragen, 3. SU, Fr 15.10.10 1. Was ist ein Modul? Vollständige Definition! 2. Was ist eine Klasse? Unsere vorläufige, unvollständige Definition. 3. Wie heißen die drei Arten von Befehlen, die im letzten SU eingeführt wurden auf Deutsch? 4. Ebenso, auf Englisch? 5. Geben Sie von jedem der Java-Befehle in der folgenden Tabelle an, zu welcher Art er gehört: Befehl Art des Befehls int n = 25; n = 37; n + 3 int mult(int a, int b) { return a * b; } double d; pln("Hallo Welt!"); 17 + mult(3, 5) Tip: Um einen Befehl richtig einzuordnen sollten Sie sich fragen: Was befiehlt dieser Befehl dem Ausführer? Etwas zu erzeugen? Oder einen Wert zu berechnen? Oder die Inhalte bestimmter Wertebehälter (Variablen, Bildschirm etc.) zu verändern? 6. Welche zwei Arten von Typen unterscheidet man in Java? 7. Wie viele primitive Typen gibt es in Java, und wie heißen sie? Beuth Hochschule, TB3-IN3 2. SU Fr 08.10.10 WS10/11, Seite 12 Antworten zu den Wiederholungsfragen, 3. SU, Fr 15.10.10 1. Was ist ein Modul? Vollständige Definition! Ein Behälter für Variablen, Unterprogramme, Typen, Module, ... etc., der aus mindestens zwei Teilen besteht, einem öffentlichen Teil und einem privaten Teil (oder: einem ungeschützten und einem geschützten Teil, oder: einem erreichbaren und einem nicht-erreichbaren Teil). 2. Was ist eine Klasse? Unsere vorläufige, unvollständige Definition. Ein Modul und ... 3. Wie heißen die drei Arten von Befehlen, die im letzten SU eingeführt wurden auf Deutsch? Vereinbarung, Ausdruck, Anweisung 4. Ebenso, auf Englisch? declaration, expression, statement 5. Geben Sie von jedem der Java-Befehle in der folgenden Tabelle an, zu welcher Art er gehört: Befehl Art des Befehls int n = 25; Vereinbarung n = 37; Anweisung n + 3 Ausdruck int mult(int a, int b) { return a * b; } Vereinbarung double d; Vereinbarung pln("Hallo Welt!"); Anweisung 17 + mult(3, 5) Ausdruck Tip: Um einen Befehl richtig einzuordnen sollten Sie sich fragen: Was befiehlt dieser Befehl dem Ausführer? Etwas zu erzeugen? Oder einen Wert zu berechnen? Oder die Inhalte bestimmter Wertebehälter (Variablen, Bildschirm etc.) zu verändern? 6. Welche zwei Arten von Typen unterscheidet man in Java? Primitive Typen, Referenztypen. 7. Wie viele primitive Typen gibt es in Java, und wie heißen sie? Acht Stück: byte, char, short, int, long, float, double, boolean. Beuth Hochschule, TB3-IN3 Stichworte WS10/11, Seite 13 3. SU Fr 15.10.10 A. Wiederholung B. Organisation Typen und Variablen Def.: Ein Typ ist ein Bauplan für Variablen Eine Variablen-Vereinbarung beginnt deshalb immer mit einem Typ. 1 2 3 4 5 6 7 // Variablen-Vereinbarungen (mit Initialisierung) int anna = 17; String bert = "Hallo!"; // Zuweisungen (keine Vereinbarungen!) anna = 18; bert = "Hello?"; 2.3. Mehrere Klassen, ein Programm (S. 31) In Zeile 6 wird eine Methode aufgerufen. Welche? Was passiert in Zeile 7? In Zeile 8? Die Punktnotation: Modul Punkt Element Die Methode pln im Modul Hallo04 Die Methode sin im Modul Math Das Attribut MAX_VALUE im Modul Integer Das Attribut PI im Modul Math Hallo04.pln(...) Math.sin(...) Integer.MAX_VALUE Math.PI Mit dieser Notation ist es also ganz leicht, innerhalb eines Moduls M1 auf Methoden und Atrribute zuzugreifen, die in einem anderen Modul M2 drin sind. Die Module M1 und M2 können z.B. zwei Klassen sein (später werden wir noch andere Module kennen lernen, die keine Klassen sind). Zur Entspannung: Unlösbare Probleme? Gibt es exakt definierte Probleme, die man mit Computern nicht lösen kann? Ja. Beispiel 1: Das Kachel-Katalog-Problem Eingabe: Ein Katalog von "Kacheln mit vier farbigen Kanten" und der Anschlussbedingung, dass nur gleichfarbige Kanten aneinander stoßen dürfen. Ausgabe: "Ja", wenn man mit Kacheln aus dem Katalog eine beliebig große Fläche kacheln kann, "Nein" wenn das nicht möglich ist. 3 Katalog 1: 1 4 2 2 1 2 3 7 6 3 2 1 3 4 2 2 6 5 Katalog 2: 4 3 Katalog 3: 1 4 1 3 4 8 6 5 7 4 8 7 8 7 6 5 6 8 1 Kann mit Kacheln aus dem Katalog 1 eine beliebig große Fläche kacheln? (Ja) Ebenso mit Katalog 2? (Ja) Ebenso mit Katalog 3? (Nein) Beispiel 2: Das Halte-Problem Eingabe: Ein Java-Programm P und ein Satz Eingaben E für P. Ausgabe: "Hält" (oder "Ja"), wenn das Programm P mit der Eingabe E nach endlich vielen Rechenschritten von allein anhält. "Hält nicht" (oder "Nein"), wenn P mit E in eine Endlosschleife oder in eine Endlos-Rekursion gerät. Beuth Hochschule, TB3-IN3 3. SU Fr 15.10.10 WS10/11, Seite 14 Variablen als Bojen darstellen Das Bild 5.6 auf S. 119 an der Tafel entwickeln, dann kurz im Buch ansehen. StringBuilder otto = new StringBuilder("Hallo!"); |otto|--<78>--[<22>]--["Hallo!"] Def.: Eine Variable besteht aus mindestens zwei Teilen (Referenz und Wert). Einige Variablen haben ein oder zwei zusätzliche Teile (Name und/oder Zielwert). Variablen eines primitiven Typs (primitive Variablen) bestehen aus höchstens 3 Teilen (Name, Referenz, Wert). Variablen eines Refereztyps (Referenzvariablen) bestehen aus höchstens 4 Teilen (Name, Referenz, Wert, Zielwert) S. 121, Beispiel-02: Der Unterschied zwischen primitiven Variablen (eines primitiven Typs) und Referenzvariablen (eines Referenztyps) S. 122, Beispiel-03: Eine Zuweisung ändert immer den Wert einer Variablen! (und nicht etwa die Referenz oder den Zielwert einer Variablen) S. 125, Beispiel-07: Die Vergleichsoperatoren == und != vergleichen immer Werte! (und nicht etwa Referenzen oder Zielwerte von Variablen) Zielwerte kann man nur vergleichen, wenn ihr Typ das zuläßt. Und wenn er es zuläßt, muss man zum Vergleichen Methoden namens equals, compareTo bzw. compare verwenden (und nicht etwa Operationen namens <, <=, ==, !=, >=, >). Beuth Hochschule, TB3-IN3 Stichworte WS10/11, Seite 15 Wiederholungsfragen, 4. SU, Fr 22.10.10 1. Was ist ein Typ? 2. Wie viele primitve Typen gibt es in Java? 3. Wie heißen die primitiven Typen in Java? 4. Beschreiben Sie kurz (Stichworte genügen) den Unterschied zwischen der Zahl 3 in der Mathematik und der Zahl 3 in der Sprache Java. 5. Angenommen, Sie sehen in einem Java-Programm folgenden Befehl: 1 Anna.bert = Carl.dora(); Was für ein Ding bezeichnet der Name Anna in diesem Befehl? Und bert? Und Carl? Und dora? 6. Aus wie vielen Teilen besteht eine Variable mindestens? Und wie heißen diese Teile? 7. Aus wie vielen Teilen besteht eine Variable höchstens? Und wie heißen diese Teile? 8. Welcher Teil einer Variablen wird durch eine Zuweisung (z.B. x = ...;) verändert? 9. Wenn man zwei Variablen mit einem Vergleichsoperator vergleicht (z.B. x == y oder x != y oder x < y etc.), welche Teile der Variablen werden dann verglichen? 10. Stellen Sie die folgenden Variablen als Bojen dar: 2 3 4 long emil = 123; String fanny = new String("ABC"); String gerd = null; Um ehrlich zu sein: Die letzte Teilaufgabe (in Zeile 4) ist gar keine Wiederholung, sondern "Neuland". Raten Sie mal, wie die Boje von gerd aussieht. Welcher Teil der Variablen gerd wird durch die Initialisierung = null festgelegt? Der Name? Oder die Referenz? Oder ... ? Beuth Hochschule, TB3-IN3 3. SU Fr 15.10.10 WS10/11, Seite 16 Antworten zu den Wiederholungsfragen, 4. SU, Fr 22.10.10 1. Was ist ein Typ? Ein Bauplan für Variablen. 2. Wie viele primitve Typen gibt es in Java? 8 Stück. 3. Wie heißen die primitiven Typen in Java? byte, char, short, int, long, float, double, boolean. 4. Beschreiben Sie kurz (Stichworte genügen) den Unterschied zwischen der Zahl 3 in der Mathematik und der Zahl 3 in der Sprache Java. In der Mathematik gibt es nur eine Zahl 3, die gleichzeitig eine eine natürliche, eine ganze, eine rationale ... Zahl ist. In Java gibt es sieben verschiedene Zahlen 3, eine vom Typ byte, eine vom Typ char, eine vom Typ short etc. 5. Angenommen, Sie sehen in einem Java-Programm folgenden Befehl: 1 Anna.bert = Carl.dora(); Was für ein Ding bezeichnet der Name Anna in diesem Befehl? Und bert? Und Carl? Und dora? Anna bezeichnet einen Modul (z.B. eine Klasse). bert bezeichnet eine Variable (die sich im Modul Anna befindet). Carl bezeichnet einen Modul (z.B. eine Klasse). dora bezeichnet eine Methode (die sich im Modul Carl befindet). 6. Aus wie vielen Teilen besteht eine Variable mindestens? Und wie heißen diese Teile? Aus 2 Teilen: Referenz und Wert. 7. Aus wie vielen Teilen besteht eine Variable höchstens? Und wie heißen diese Teile? Aus 4 Teilen: Name, Referenz, Wert, Zielwert. 8. Welcher Teil einer Variablen wird durch eine Zuweisung (z.B. x = ...;) verändert? Der Wert 9. Wenn man zwei Variablen mit einem Vergleichsoperator vergleicht (z.B. x == y oder x != y oder x < y etc.), welche Teile der Variablen werden dann verglichen? Die Werte der Variablen 10. Stellen Sie die folgenden Variablen als Bojen dar: 2 3 4 long emil = 123; String fanny = new String("ABC"); String gerd = null; Um ehrlich zu sein: Die letzte Teilaufgabe (in Zeile 4) ist gar keine Wiederholung, sondern "Neuland". Raten Sie mal, wie die Boje von gerd aussieht.Welcher Teil der Variablen gerd wird durch die Initialisierung = null festgelegt? Der Name? Oder die Referenz? Oder ... ? Die Variablen emil, fanny und gerd als ASCII-Bojen dargestellt: |emil|---<10>---[123] |fanny|--<20>---[<30>]---["ABC"] |gerd|---<40>---[<null>] Die Variable gerd hat (noch) keinen Zielwert. Beuth Hochschule, TB3-IN3 Stichworte WS10/11, Seite 17 4. SU Fr 22.10.10 A. Wiederholung B. Organisation: Bojen (Ergänzung) Referenztypen in Java haben ziemlich viel Ähnlichkeit mit Pointer-Typen in C (die man daran erkennt, dass ihre Namen mit mindestens einem Sternchen * beginnen, z.B. *int oder **double etc.). Eine Referenzvariabe in Java (d.h. eine Variable eines Referenztyps wie z.B. String oder StringBuilder etc.) kann den besonderen Wert null haben. In einem solchen Fall hat sie keinen Zielwert ("der Wert null zeigt nicht [auf einen Zielwert]"). Wenn eine Referenzvariable einen anderen Wert hat als null, dann hat sie einen Zielwert (dann zeigt sie auf einen Zielwert). Eine Referenzvariable in Java kann aber nie auf null zeigen! (Eine Pointer-Variable in C kann dagegen auf null zeigen, aber nur wenn der Name ihres Typs mit mindestens zwei Sternchen ** beginnt, z.B. **double). Eine Klasse (wir sind wieder bei Java) ist nicht nur ein Modul, sondern gleichzeitig ein Typ, genauer: ein Referenztyp. In der Java-Standardbibliothek gibt es zur Zeit etwa 4000 Klassen (d.h. Referenztypen), und jeder Programmierer kann weitere solche Referenztypen programmieren. Aufgabe: Lernen Sie bis nächste Woche die Namen aller Referenztypen in Java! (War nicht ernst gemeint :-). Anweisungen Man unterscheidet (in Java und anderen Sprachen) 2 Arten von Anweisungen: einfache und zusammengesetzte (simple and compound expressions). Def.: Eine Anweisung ist zusammengesetzt, wenn sie andere Anweisungen enthalten kann. Einfache Anweisungen: Zuweisung, Prozeduraufruf (in C-Slang: Aufruf einer void-Funktion), return, break, continue, throw, assert, die leere Anweisung. Woraus besteht eine Zuweisung? (Aus einem Variablennamen und einem Ausdruck). Eine Zweisung kann aber keine anderen Anweisungen enthalten. Woraus besteht eine return-Anweisung? (Nur aus dem Schlüsselwort return oder aus return und einem Ausdruck). Eine return-Anweisung kann aber keine anderen Anweisungen enthalten). Zusammengesetzte Anweisungen: Die Blockanweisung {... }, if, switch, while, for, ... . Eine if-Anweisung enthält Anweisungen als ihre Teile (sie besteht unter anderem aus Anweisungen). Wie viele Anweisungen kann eine if-Anweisung enthalten? Mindestens? Höchstens? (Mindestens eine, höchstens zwei). Wie viele Anweisungen enthält eine while-Schleife? (Genau eine). Beuth Hochschule, TB3-IN3 4. SU Fr 22.10.10 WS10/11, Seite 18 Beispiel für eine while-Schleife: Wir wollen wiederholt int-Werte einlesen und in eine summe addieren, bis der Benutzer 999 eingibt (die 999 bedeutet nur, dass der Benutzer aufhören will, soll aber nicht addiert werden) 1 int summe = 0; 2 3 while(true) { 4 int n = EM.liesInt(); 5 if (n == 999) break; 6 summe += n; 7 } Tip: Schreiben Sie alle while-Schleifen so wie diese. Vermeiden Sie while-Schleifen mit einer "komplizierten Bedingung" (ungleich true) und benutzen Sie auf keinen Fall do-while-Schleifen (es sei denn, sie wollen den Sinn Ihres Programms unbedingt geheim halten :-). Allerdings: Sie müssen while-Schleifen mit "komplizierten Bedingungen" und do-while-Schleifen lesen und verstehen können (weil offenbar noch ziemlich viele Programmierer den Sinn ihrer Programme geheim halten wollen :-)! Um ehrlich zu sein: Was while-Schleifen betrifft sind einige (vielleicht sogar noch ziemlich viele) Informatiker (darunter auch einige meiner Kollegen an der Beuth Hochschule) anderer Ansicht als ich. for-i-Schleifen Aus wie vielen Teilen besteht eine for-i-Schleife und wie heißen diese Teile? Diagramm auf S. 75 besprechen. Beuth Hochschule, TB3-IN3 Stichworte WS10/11, Seite 19 Zur Entspannung: Eigenschaften von Qbits (Quanten-Bits) 1. Mit n "normalen Bits" kann man eine Zahl (zwischen 0 und 2n-1) darstellen. Mit n Qubits kann man gleichzeitig bis zu 2n Zahlen (zwischen 0 und 2n-1) darstellen und mit einer Operation kann man alle diese Zahlen "gleichzeitig bearbeiten". 2. Wenn man ein Qubit "ansieht und ausliest", bekommt man nur einen seiner Werte. Alle anderen Werte gehen dabei unvermeidbar und unwiderruflich verloren. 3. Es ist nicht möglich, ein Qubit (mit all seinen Werten) zu kopieren. Man kann höchstens einen seiner Werte kopieren. 4. Auf Qubits kann man nur umkehrbare Verknüpfungen anwenden. Zur Zeit (2008) erforschen mehrere Tausend Physiker, Informatiker und Ingenieure in mehr als 100 Forschungsgruppen etwa ein Dutzend Möglichkeiten, Qbits zu realisieren (durch ion traps. quantum dots, linear optics, ...). Eine interessante Einführung in die Quantenmechanik von einer berliner Schülerin: Silvia Arroyo Camejo: "Skurrile Quantenwelt", Springer 2006, Fischer 2007 7 Reihungen (arrays) Angenommen, wir brauchen in einem Programm 100 Variablen des Typs long. Wie können wir dem Ausführer befehlen, diese Variablen zu erzeugen? S. 150, Beispiel-01: Viele Variablen eines bestimmten Typs vereinbaren Das war ziemlich viel Schreibarbeit. Und jedesmal, wenn wir alle Variablen bearbeiten wollen (z.B. mit pln ausgeben oder ihren Wert auf 0 setzen oder ...) müssen wir nochmal 100 Befehle hinschreiben. S. 150, Beispiel-02: Viele Variablen ausgeben Was kann der Programmierer mit einer Schleife bewirken? (Dass die Befehle im Rumpf der Schleife mehr als einmal, z.B. 100 Mal, ausgeführt werden). S. 151: Beispiel-03: Viele Variablen mit einer Schleife erzeugen lassen Warum funktioniert diese Schleife nicht so, wie wir gewünscht haben. Es werden doch 100 Variablen erzeugt. Was ist das Problem? (Die Namen der 100 Variablen sind alle gleich. Deshalb können wir immer nur auf eine zugreifen, nämlich auf die zuletzt erzeugte) Um möglichst einfach viele Variablen (eines bestimmten Typs) vereinbaren zu können, hat man Reihungen (engl. arrays) erfunden (und in die meisten Programmiersprachen eingebaut). S. 151, Beispiel-04: Eine Reihung von 100 long-Variablen vereinbaren Wir mussten nur einen Namen für die Reihung erfinden (im Beispiel: v). Damit haben wir aber 100 Namen festgelegt: v[0], v[1], v[2], ..., v[99]. Zusätzlich gibt es automatisch noch eine ganz neue Art von Namen (für Variablen), z.B. so: 8 9 10 11 12 13 int i = 17; pln(v[i]); i = 38; pln(v[i]); ... ... // Hie bezeichnet der Name v[i] die Variable v[17] // Hie bezeichnet der Name v[i] die Variable v[38] Die Bedeutung des Namens v[i] steht nicht "eisern fest". Wir können sie ändern, indem wir der Variablen i einen anderen Wert zuweisen. Mit diesem Trick ist es möglich, alle 100 Variablen in der Reihung v mit demselben Namen v[i] zu bezeichnen. Wow! S. 152, Beispiel-05: Die Reihung v mit Hilfe von Schleifen bearbeiten In Java ist auch jede Reihung ein Modul. Dieser Modul enthält u.a. eine (unveränderbare) int-Variable namens length. In der steht die Länge der Reihung (d.h. die Anzahl der Variablen in der Reihung). Beuth Hochschule, TB3-IN3 4. SU Fr 22.10.10 WS10/11, Seite 20 Was passiert, wenn wir die Vereinbarung der Reihung v (S. 151, Zeile 13) verändern, etwa so: 14 long[] v = new long[500]; und danach die Schleifen im Beispiel-05 noch mal ausführen lassen? (Alles geht gut! Wow2!) Mit Reihungen kann man auch ganz neue Fehler machen, z.B.: 15 pln(v[100]); 16 pln(v[-17]); Solche Fehler entdeckt der Java-Ausführer noch nicht bei der Übergabe des Programms ("zur Compilezeit"), aber immerhin während der Ausführung ("zur Laufzeit") und wirft dann eine Ausnahme des Typs ArrayIndexOutOfBoundsException. Die zweite for-Schleifen im Beispiel-05 ist noch unnötig kompliziert. Mit Java 5 wurden für solche Fälle einfachere for-each-Schleifen eingeführt. S. 153, Beispiel-06: Eine (neue) for-each-Schleife und eine (alte) for-i-Schleife, die das Gleiche machen (daran kann man erkennen, was man mit einer for-each-Schleife machen kann und was nicht). Das Schwierige an diesen einfachen Schleifen ist, dass man bestimmte Schleifenprobleme damit nicht lösen kann (und dann z.B. eine klassische for-i-Schleife verwenden muss, z.B. die erste Schleife im Beispiel-05). Beuth Hochschule, TB3-IN3 Stichworte WS10/11, Seite 21 Wiederholungsfragen, 5. SU, Fr 29.10.10 1. Welche der folgenden Variablenvereinbarungen werden vom Java-Ausführer akzeptiert und welche werden abgelehnt? 1 2 3 String siegfried = null; int ingeborg = null; Integer irmgard = null; 2. Stellen Sie die akzeptablen Variablen der vorigen Frage als Bojen dar. 3. Was kann der Programmierer dem Ausführer (ganz allgemein) mit einer Anweisung (eng. statement) befehlen? 4. Welche Anweisungen gehören zur Gruppe der zusammengesetzten Anweisungen (engl. compound statements)? 5. Was kann man (ganz allgemein) mit einer if- oder einer switch-Anweisung bewirken? 6. Was kann man (ganz allgemein) mit einer while- oder for-Anweisung bewirken? 7. Vereinbaren Sie 3500 double-Variablen und sorgen Sie dafür, dass in jeder dieser Variablen der Wert -1.0 steht. 8. Geben Sie die Werte aller double-Variablen (die Sie als Lösung der vorigen Aufgabe vereinbart haben) zur Standardausgabe aus (einen Wert pro Zeile, mit dem Befehl pln), und zwar zweimal: 8.1. Mit einer for-i-Schleife (die Sie schon aus C kennen) 8.2. Mit einer for-each-Schleife (die es in C nicht gibt). 9. Erhöhen Sie den Wert von jeder double-Variablen (die Sie als Lösung der vorvorigen Aufgabe vereinbart haben) um den Wert 3.0. Beuth Hochschule, TB3-IN3 4. SU Fr 22.10.10 WS10/11, Seite 22 Rückseite der Wiederholungsfragen, 5. SU, Fr 29.10.10 Sorry: Das SWE-Labor wurde in den vorigen Semesterferien (erfolgreich) umgebaut, musste dann aber in sehr kurzer Zeit wieder eingerichtet werden. Dabei ist mir bei der Konfiguration des Editors Textpad ein Fehler unterlaufen, den jeder einzelne von Ihnen möglichst bald (in der nächsten Übung) korrigieren sollte. Hier ein paar Hinweise dazu. 1. Korrigieren Sie die Parameter für den TextPad-Befehl Extras, Benutzer-Programme, Java kompilieren. Wie das geht, wird im Papier TipsZumTextpad, im Abschnitt 15. Der TextPad-Befehle "Java kompilieren" beschrieben. Sie müssen nur den Wert im Textfeld hinter Parameter: verändern, indem Sie dort -d Z:\klassen $FileName eintragen. Den Wert im Textfeld unter Regulärer Ausdruck für Sprungziele in Werkzeug-Ausgabe brauchen Sie nicht zu ändern. 2. Und wenn Sie schon mal dabei sind, die Konfirguration Ihres TextPads zu verbessern, sollten Sie auch noch zwei Tasten-Kürzel (für zwei besonders praktische Editier-Befehle) vereinbaren. Wie das im Prinzip geht, steht im Papier TipsZumTextpad im Abschnitt 14. Nützliche Tasten-Kürzel. Hier ein paar eränzende Hinweise dazu: Starten Sie den TextPad und wählen Sie Konfiguration, Einstellungen, Tastatur. Ein Fenster wie das folgende sollte aufgehen: Wählen Sie (wie oben dargestellt) unter Kategorien die Kategorie Bearbeiten. Wählen Sie dann unter Befehle den Befehl EditCopyLine. Geben Sie dann unter Neue Tastenkombination die Tastenkombination Alt-C ein und klicken Sie auf den Knopf Zuweisen (rechts oben). Wählen Sie dann unter Befehle den Befehl EditDeleteLine. Geben Sie dann unter Neue Tastenkombination die Tastenkombination Alt-Y ein und klicken Sie auf den Knopf Zuweisen (rechts oben). Jetzt können Sie beim Editieren die aktuelle Zeile (die, in der der Curser sich gerade befindet) mit Alt-C copieren und mit Alt-Y löschen (ohne die ganze Zeile umständlich mit der Maus auswählen zu müssen). Beuth Hochschule, TB3-IN3 Stichworte WS10/11, Seite 23 Antworten zu den Wiederholungsfragen, 5. SU, Fr 29.10.10 1. Welche der folgenden Variablenvereinbarungen werden vom Java-Ausführer akzeptiert und welche werden abgelehnt? 1 2 3 String siegfried = null; int ingeborg = null; Integer irmgard = null; Die Vereinbarungen der (Referenz-) Variablen siegfried und irmgard sind akzeptabel, die Vereinbarung der (primitiven) Variablen ingeborg ist nicht akzeptabel. 2. Stellen Sie die akzeptablen Variablen der vorigen Frage als Bojen dar. |sigfried|--<110>--[<null>] |irmgard|---<120>--[<null>] 3. Was kann der Programmierer dem Ausführer (ganz allgemein) mit einer Anweisung (eng. statement) befehlen? Bestimmte Werte in bestimmte Wertebehälter zu tun. 4. Welche Anweisungen gehören zur Gruppe der zusammengesetzten Anweisungen (engl. compound statements)? Die, die andere Anweisungen als ihre Teile enthalten. 5. Was kann man (ganz allgemein) mit einer if- oder einer switch-Anweisung bewirken? Dass die in der (if- bzw. switch-) Anweisung enthaltenen Anweisungen weniger als einmal ausgeführt werden. 6. Was kann man (ganz allgemein) mit einer while- oder for-Anweisung bewirken? Dass die in der (while- bzw. for-) Anweisung enthaltenen Anweisungen mehr als einmal ausgeführt werden (oder in Sonderfällen nullmal oder einmal ausgeführt werden). 7. Vereinbaren Sie 3500 double-Variablen und sorgen Sie dafür, dass in jeder dieser Variablen der Wert -1.0 steht. 4 5 double[] dora = new double[3500]; for (int i=0; i<dora.length; i++) dora[i] = -1; 8. Geben Sie die Werte aller double-Variablen (die Sie als Lösung der vorigen Aufgabe vereinbart haben) zur Standardausgabe aus (einen Wert pro Zeile, mit dem Befehl pln), und zwar zweimal: 8.1. Mit einer for-i-Schleife (die Sie schon aus C kennen) 6 for (int i=0; i<dora.length; i++) pln(dora[i]); 8.2. Mit einer for-each-Schleife (die es in C nicht gibt). 7 for (double d : dora) pln(d); 9. Erhöhen Sie den Wert von jeder double-Variablen (die Sie als Lösung der vorvorigen Aufgabe vereinbart haben) um den Wert 3.0. 8 for (int i=0; i<dora.length; i++) dora[i] += 3.0; Anmerkung: Diese Aufgabe kann man nicht mit einer for-each-Schleife lösen! Beuth Hochschule, TB3-IN3 5. SU Fr 29.10.10 WS10/11, Seite 24 5. SU Fr 29.10.10 A. Wiederholung B. Organisation 1. Bei den Tests auf das ausgeteilte Blatt bitte nur die Lösungen schreiben. Nebenrechnungen und Skizzen sollten Sie auf einem extra Papier machen. Solche "Skizzenblätter" brauchen Sie nicht abzugeben. 2. Bei den Übungen: Achten Sie darauf, nur auf der Z-Platte Ordner anzulegen und Dateien abzuspeichern. Schreiben Sie nie auf die C-Platte! 3. Klausur: Am Mo 07.02.2011, 14 Uhr im Raum B101 Was man mit for-each-Schleifen nicht kann: - Die Werte der Komponenten (Variablen) einer Reihung verändern. - 2 oder mehr Reihungen "parallel" bearbeiten (z.B. komponentenweise vergleichen) Andererseits: Wenn man eine Reihung von Referenzvariablen (z.B. des Typs StringBuilder) hat, dann kann man die Zielwerte der Reihungskomponenten durchaus mit einer for-each-Schleife verändern, etwa so: 9 10 11 12 13 14 15 16 17 StringBuilder[] sbr = { new StringBuilder("Hallo"); new StringBuilder("Sonja!"); new StringBuilder("Wie geht's?"); } for (StringBuilder sb : sbr) { sb.append("ABC"); } Reihungen als Bojen darstellen Die "Dinger, die in einer Reihung drin sind" bezeichnen wir als die Komponenten der Reihung (engl. elements of an array). Achtung: Komponenten sollte man im Deutschen nicht Elemente nennen (weil Elemente schon als Übersetzung des engl. member verbreitet ist) Reihungen mit primitiven Komponenten: S. 155, Beispiel-01, Seite 156, Bild 7.1 In vereinfachter Darstellung: S. 157, Bild 7.2 Reihungen mit Referenzkomponenten: S. 157, Beispiel-02, Bild 7.3 In vereinfachter Darstellung: S. 158, Bild 7.4 Statt Zielwert sagt man häufig: Objekt Statt Reihung mit Referenzkomponenten sagt man häufig: Reihung von Objekten Wichtig: Eine Reihung von Objekten enthält (genau genommen) keine Objekte, sondern nur Referenzen, die auf Objekte zeigen. Die Objekte liegen außerhalb der Reihung! 7.2 Erzeugung einer Reihung in 3 Schritten (S. 161) 7.3 Reihungen auf verschiedene Weisen kopieren (S. 162) 7.4 Mehrstufige Reihungen (Reihungen von Reihungen) (S. 165) Mehrstufige Reihungen (engl. nested arrays) sollte man nicht mit mehrdimensionalen Reihungen (engl. multidimensional arrays) verwechseln! Beuth Hochschule, TB3-IN3 Stichworte WS10/11, Seite 25 S. 165, Beispiel-01: Die zweistufige Reihung irrA Vereinbarung und Bojendarstellung Die Komponenten irrA[0], irrA[1], ... dieser Reihung sind Reihungen vom Typ int[]. Die elementaren Komponenten von irrA (d.h. die Komponenten der Komponenten, die keine Reihungen mehr sind) sind vom Typ int. Noch ein Beispiel, um die Grundbegriffe zu üben: 1 String[][][] robert = new String[3][2][4]; Von welchem Typ ist robert? (Reihung von Reihungen von Reihung von String-Variablen) Von welchem Typ sind die Komponenten robert[0], robert[1], ... von robert? (Reihung von Reihungen von String-Variablen) Von welchem Typ sind die Komponenten der Komponenten von robert? (Reihung von String-Variablen) Von welchem Typ sind die elementaren Komponenten von robert? (Sie sind vom Typ String) Wichtiger Unterschied zwischen mehrstufigen und mehrdimensionalen Reihungen: Mehrstufige Reihungen (nested arrays) können Komponenten unterschiedlicher Länge enthalten (mit Worten aus der Druckindustrie: "sie können einen Flatterrand haben"). Mehrdimensionale Reihungen müssen immer "rechteckig" sein. S. 168, Beispiel-04: Ein dreistufige Reihung mit unterschiedlich langen Komponenten Ein Unterschied zwischen C und Java: In C gibt es erstmal mehrdimensionale Reihungen. Mehrstufige Reihungen kann man aber leicht als Reihungen von Pointern realisieren. In Java gibt es erstmal nur mehrstufige Reihungen. Es gibt aber Klassen, deren Objekte sich genau wie mehrdimensionale Reihungen verhalten (siehe alphaWorks.ibm.com). Zur Entspannung: Englische Vokabeln: ambiguous, geek, drag etc. ambiguous zweideutig, unklar geek Fachmann (z. B. für Computer), mild negativ. Früher war ein geek "ein wilder Mann mit Bart" auf einer Kirmes, der z. B. Mäusen den Kopf abbiss. to execute ausführen (z. B. ein Programm oder einen Befehl), hinrichten (z. B. einen Verurteilten, nur in Ländern mit Todesstrafe). rocket science wörtlich: Raketenwissenschaft, sonst: schwierig zu lernen, anspruchsvoll. to drag ziehen, zerren (z. B. eine Maus über eine Tischplatte). what a drag Was für ne Mühe, Umstand. in full drag aufgebrezelt, aufgetakelt, auffällig zurecht gemacht. drag queen Transvestit. for the birds für die Katz (wörtlich: für die Vögel), bringt nichts, unnütz, z. B. im Wortspiel nesting (of functions) is for the birds. Beuth Hochschule, TB3-IN3 5. SU Fr 29.10.10 WS10/11, Seite 26 Wiederholungsfragen, 6. SU, Fr 05.11.10 1. Aus wie vielen Teilen besteht eine Variable höchstens und wie heißen diese Teile? 2. Welche Teile der Komponenten einer Reihung kann man nicht mit einer for-each-Schleife verändern? 3. Betrachten Sie die folgende Vereinbarung einer Reihungsvariablen: 1 int[][][] otto = {{{1,2}, {3,4,5}}, {{6}, {7,8,9},{10}}}; Geben Sie die folgenden Typen so in Worten an, wie man sie ausspricht: 3.1. Den Typ von otto? 3.2. Den Typ der Komponenten von otto? 3.3. Den Typ der Komponenten der Komponenten von otto? 3.4. Den Typ der elementaren Komponenten von otto? 4. Betrachten Sie die folgenden drei Befehle: 2 3 4 Integer[] ir = null; ir = new Integer[2]; ir[1] = new Integer(17); Wie sieht die Reihungsvariable ir nach Ausführung der Zeile 2 aus (als Boje dargestellt)? Ebenso für Zeile 3 und für Zeile 4 (Sie sollen ir also insgesamt dreimal als Boje darstellen). 5. Erinnern Sie sich an den Unterschied zwischen mehrstufigen Reihungen und mehrdimensionalen Reihungen. Welche Eigenschaft können die Komponenten einer mehrstufigen Reihung haben, aber die Komponenten einer mehrdimensionalen Reihung können sie nicht haben? Beuth Hochschule, TB3-IN3 Stichworte WS10/11, Seite 27 Rückseite der Wiederholungsfragen, 6. SU, Fr 05.11.10 Mehrdimensionale und mehrstufige Reihungen in der Programmiersprache C (kurze Wiederholgung) A: Zwischen eindimensionalen und einstufigen Reihungen gibt es keinen Unterschied: 1 2 // Die Reihung dr ist eindimensional und einstufig: double dr[3] = {1.5, 2.5, 3.5}; B: Mehrdimensionale und mehrstufige Reihungen unterscheiden sich voneinander: 3 4 5 6 7 8 double double double double double double * zd [3][2] drA[3] drB[2] drC[4] drD[0] zs [6] = = = = = = {{11.5, 12.5}, {21.5, 22.5}, {31.5, 32.5}}; {11.5, 12.5, 13.5}; {21.5, 22.5}; {31.5, 32.5, 33.5, 34.5}; {}; {drA, drB, drC, NULL, drD, NULL}; Die Reihung zs enthält 6 Komponenten vom Typ double * (Zeiger-auf-double, engl. pointer to double). Davon haben 2 den Wert NULL. Die anderen 4 Komponenten zeigen auf einstufige Reihungen von double-Variablen. Diese einstufigen Reihungen sind unterschiedlich lang. Merke: Eine Reihung der Länge 0 (wie z.B. die Reihung drD oder zs[4]) ist etwas ganz anderes als eine NULL-Komponente (wie z.B. zs[3] und zs[5]). C: Eine zweidimensionale Reihung von double-Variablen enthält nur double-Variablen, keine Zeiger (engl. pointer). Z.B. enthält die zweidimensionale Reihung zd insgesamt 6 double Variablen. D: Eine mehrdimensionale Reihung ist in einem bestimmten Sinne "rechteckig". Z.B. entspricht die zweidimensionale Reihung zd einem Rechteck von double-Variablen. Eine dreidimensionale Reihung entspricht einem Quader etc. E: Eine zweistufige Reihung (von Reihungen von double-Variablen) enthält (erstmal) keine doubleVariablen, sondern Zeiger, die auf Reihungen zeigen (oder den Wert NULL haben). Diese Reihungen können unterschiedlich lang sein. F: Problem: In einem C-Programm enthält keine Reihung "von sich aus" Informationen über ihre Länge (d.h. über die Anzahl ihrer Komponenten). Dieses Problem ist bei mehrstufigen Reihungen besonders groß (weil die Komponenten-Reihungen unterschiedlich lang sein können). Lösung 1: Man läßt jede Reihung mit einer Null-Komponenten enden (bei int-Reihungen ist die NullKomponente eine 0, bei double-Reihungen eine 0.0, bei Reihungen von Zeigern ein NULL-Wert etc.). Lösung 2: Bei Reihungen r mit Zahlen als Komponenten (int, double, ...) kann man die Länge in der 0-ten-Komponente r[0] ablegen. G: In C ist der Name einer Reihung (wie z.B. der Name dr) der Name einer Zeiger-Konstanten. Eine Konstante besteht (nur) aus einem Namen und einem Wert. Der Wert einer Konstanten kann nicht verändert werden. Der Wert einer Zeiger-Konstanten ist ein Zeiger. Die Zeiger-Konstante dr zeigt auf die nullte Komponente der Reihung dr (d.h. auf die Komponente mit dem Index 0). Die Ausdrücke *dr und dr[0] bezeichnen also dieselbe Variable (vom Typ double). Als Illustration eine Darstellung der Reihung dr (siehe oben Zeile 1) als ASCII-Boje: |dr|--[<100>] | [1.5] <108> | [2.5] <116> | [3.5] Der Zeiger dr gleich <100> zeigt auf die nullte Komponente von dr (die den Wert 1.5 hat). Die Zeiger dr+1 gleich <108> und dr+2 gleich <116> zeigen auf die 1. bzw. 2. Komponente von dr (unter der Annahme, dass ein double-Wert 8 Bytes lang ist). H: Die folgenden Ausdrücke bezeichnen (per Definition) dieselbe Variable: dr[i] ist gleich *(dr + i) ist gleich *(i + dr) ist gleich i[dr]. Beuth Hochschule, TB3-IN3 5. SU Fr 29.10.10 WS10/11, Seite 28 Antworten zu den Wiederholungsfragen, 6. SU, Fr 05.11.10 1. Aus wie vielen Teilen besteht eine Variable höchstens und wie heißen diese Teile? Aus 4 Teilen: Name, Referenz, Wert, Zielwert 2. Welche Teile der Komponenten einer Reihung kann man nicht mit einer for-each-Schleife verändern? Die Werte 3. Betrachten Sie die folgende Vereinbarung einer Reihungsvariablen: 1 int[][][] otto = {{{1,2}, {3,4,5}}, {{6}, {7,8,9},{10}}}; Geben Sie die folgenden Typen so in Worten an, wie man sie ausspricht: 3.1. Den Typ von otto? 3.2. Den Typ der Komponenten von otto? 3.3. Den Typ der Komponenten der Komponenten von otto? 3.4. Den Typ der elementaren Komponenten von otto? 3.1. Reihung von Reihungen von Reihungen von int (-Variablen). 3.2. Reihung von Reihungen von int (-Variablen). 3.3. Reihung von int (-Variablen) 3.4. int 4. Betrachten Sie die folgenden drei Befehle: 2 3 4 Integer[] ir = null; ir = new Integer[2]; ir[1] = new Integer(17); Wie sieht die Reihungsvariable ir nach Ausführung der Zeile 2 aus (als Boje dargestellt)? Ebenso für Zeile 3 und für Zeile 4 (Sie sollen ir also insgesamt dreimal als Boje darstellen). Nach Zeile 2: |ir|--<110>--[<null>] 0 1 Nach Zeile 3: |ir|--<110>--[<120>]--[ [<null>] [<null>] ] 0 1 Nach Zeile 4: |ir|--<110>--[<120>]--[ [<null>] [<130>] ] | [17] 5. Erinnern Sie sich an den Unterschied zwischen mehrstufigen Reihungen und mehrdimensionalen Reihungen. Welche Eigenschaft können die Komponenten einer mehrstufigen Reihung haben, aber die Komponenten einer mehrdimensionalen Reihung können sie nicht haben? Die Komponenten von mehrstufigen Reihungen (sind Reihungen und) können unterschiedlich lang sein ("mehrstufige Reihungen können einen Flatterrand haben"). Beuth Hochschule, TB3-IN3 Stichworte WS10/11, Seite 29 6. SU Fr 05.11.10 A. Wiederholung B. Organisation Was bedeutet oder bezeichnet der Name einer Rerferenzvariablen? Angenommen, wir haben folgende Referenzvariable: 1 StringBuilder stb = new StringBuilder("ABC"); Die vier Teile der Variablen stb als (ASCI-) Boje dargestellt: |stb| | <100> | [<110>] | ["ABC"] Name Referenz Wert Zielwert In jedem der folgenden Befehle kommt der Variablenname stb vor: 1 2 3 4 if (stb == ...) ... stb.append("ZZ"); stb = ... ; pln(stb); Welchen Teil der Variablen bezeichnet der Name stb in den einzelnen Befehlen? In Zeile 1: Den Wert [<110>], denn der wird durch den Operator == verglichen. In Zeile 2: Den Zielwert ["ABC"]. Dieser Zielwert ist ein Objekt des Typs StringBuilder, d.h. ein Modul, in dem sich u.a. eine Methode namens append (mit einem String-Parameter) befindet. Diese Methode append im Zielwert-Modul von sb wird aufgerufen. In Zeile 3: Den Wert [<110>], denn dieser Wert wird durch einen anderen Wert ersetzt. In Zeile 4: Ein Teil des Zielwertes d.h. Moduls ["ABC"], falls ein Zielwert vorhanden ist, sonst der Wert der Variablen sb (der dann gleich null ist). Man muss also immer aus dem Zusammenhang erkennen, ob mit dem Namen einer Referenzvariablen gerade der Wert oder der Zielwert (bzw. welcher Teil des Zielwertes) gemeint ist. 6. Ausdrücke Man unterscheidet (in Java und anderen Sprachen) 2 Arten von Ausdrücken: einfache und zusammengesetzte (simple and compound expressions). Haben Sie einen ganz ähnlichen Satz schon mal gehört oder gelesen? Siehe oben, S. 17 6.1. Einfache Ausdrücke Jeder Variablenname und jedes Literal ist ein (einfacher) Ausdruck. S. 133, Beispiel-01: Typische Literale verschiedener Typen S. 133, Beispiel-02: int-Literale Def.: Ein Literal ist ein Name für einen bestimmten Wert. Ein Java-Programmierer kann im Prinzip von jedem Literal wissen, zu wlechem Typ es gehört und welchen Wert es bezeichnet! Die Literale 10, 0xA, 0Xa und 012 bezeichnen alle den int-Wert zehn. Das Literal 0.1 bezeichnet einen double-Wert, der ein bisschen größer ist als ein Zehntel (diesen Wert braucht man nur "im Prinzip" zu kennen, ohne seine exakte Darstellung auswendig zu wissen). Beuth Hochschule, TB3-IN3 6. SU Fr 05.11.10 WS10/11, Seite 30 Das Literal 0.1F bezeichnet einen float-Wert, der ein bisschen größer ist als ein Zehntel und ein bisschen größer als der Wert des double-Literals 0.1. Ein Variablenname ist auch eine Art Name für einen Wert (für den Wert, den die Variable gerade enthält). Aber so ein Name sagt einem nicht, welcher Wert gemeint ist: Eine int-Variable namens drei muss nicht unbedingt den Wert 3, sondern kann ohne weiteres einen anderen Wert enthalten. Eine double-Variable namens pi muss nicht den Wert der berühmten Kreiszahl enthalten, sondern kann auch den Wert 5.0 oder -7.5 etc. enthalten. Dagegen bezeichnet das Literal 17 immer den int-Wert siebzehn (sonst dürfen Sie ihren Java-Ausführer umtauschen und einen neuen verlangen :-). Literale sind syntaktische Größen (d.h. sie können in einem Quellprogramm vorkommen). Werte sind semantische Größen (d.h. sie können in Quellprogrammen nur benannt werden, dort aber selbst nicht vorkommen). Sie werden erst bei der Ausführung eines Programms vom Ausführer berechnet, miteinander verglichen, umgewandelt, in Variablen gespeichert etc. Vergleich: Menschen können in Romanen nur benannt werden, dort aber selbst (als Wesen aus Fleisch und Blut) nicht vorkommen. 6.2 Zusammengesetzte Ausdrücke Sie bestehen aus Ausdrücken, Operatoren wie +, -, *, /, %, <, <=, &&, ||, ! ... etc. und runden Klammern. Beispiele: Aus welchen Teilen bestehen die Ausdrücke in der nachfolgenden Tabelle? // Als "Rohmaterial" vereinbaren wir ein paar Variablen: int otto, emil, anna, bert, carl, dora; boolean fany, gerd, heinz; Ausdruck Teil 1 Teil 2 Teil 3 otto + emil otto + emil anna + bert + carl + dora anna + bert * carl anna + anna * bert + carl anna * bert + - otto anna + bert + carl + dora -otto bert * carl carl fany || gerd && heinz fany || gerd && heinz fany && gerd || heinz fanny && gerd || heinz ! heinz !heinz Zur Entspannung: Christian Morgenstern (1871-1914) Tertius Gaudens Da freut sich der Dritte (eigentlich das 4. Perlhuhn nach 3 Schweinen) Vor vielen Jahren sozusagen, hat folgendes sich zugetragen: Drei Säue taten um ein Huhn / in einem Korb zusammen ruhn. Ein String-Literal bezeichnet ein String-Objekt Der Unterschied zwischen 5 6 String s04 = "Hallo"; String s05 = new String("Hallo"); S. 230, Beispiel-02 Beuth Hochschule, TB3-IN3 Stichworte WS10/11, Seite 31 Wiederholungsfragen, 7. SU, Fr 12.11.10 1. Betrachten Sie die folgenden Befehle: 1 2 3 4 5 6 StringBuilder sb = new StringBuilder("Hallo") ; pln(sb); sb = null; pln(sb); if (sb != null) pln("Guten Morgen!"); pln(sb.length()); Welchen Teil der Variablen sb bezeichnet der Name "sb" in Zeile 2? Und in Zeile 3? Und in Zeile 4? Und in Zeile 5? Und in Zeile 6? 2. Woraus bestehen zusammengesetzte Ausdrücke? 3. Mit welchen Werten werden die Variablen gleich1 und gleich2 initialisiert? 7 8 9 10 11 String String String boolean boolean meldungA meldungB meldungC gleich1 gleich2 = new String("Falscher Param"); = "Falscher Param"; = "Falscher Param"; = meldungA == meldungB; = meldungB == meldungC; Im Buch auf S. 143-144 finden Sie eine Tabelle aller Operatoren, die in Java-Ausdrücken vokommen dürfen. 4. Wo in der Tabelle steht die Regel "Punktrechnung geht vor Strichrechnung"? Geben Sie zwei ZeilenNummern und die Überschrift einer Spalte an (die Zeilen müssen Sie selbst "mit dem Finger zählen"). 5. Betrachten Sie folgende Variablenvereinbarung: 12 13 int i1, i2, i3, i4; boolean b1, b2, b3, b4; Aus welchen Teilen bestehen die Ausdrücke, die in der zweiten Spalte der folgenden Tabelle stehen? Tragen Sie die Teile in die daneben stehenden Spalten der Tabelle ein. Nr Ausdruck 1 i1 + i2 < i3 2 i1 >= i2 + i3 3 i1 < i2 == i3 < i4 4 i1 == i2 == b1 5 b1 & b2 ^ b3 6 b1 || b2 | b3 7 b1 & b2 && b3 8 b1 != b2 != b3 Teil1 Teil2 Teil3 Beuth Hochschule, TB3-IN3 6. SU Fr 05.11.10 WS10/11, Seite 32 Rückseite der Wiederholungsfragen, 7. SU, Fr 12.11.10 Zum Thema char-Literale Informelle Bezeichnung Wie viele char-Werte kann man mit solchen Literalen bezeichnen? Normale Literale viele, aber nicht alle 'A' '0' '?' 8 '\b' '\'' '\t' '\"' '\n' '\f' '\r' '\\' Flucht-Literale Unicode-Literale alle 65535 Oct-Literale 256 Beispiele '\u0000' '\0' '"' '\1' '\u0001' ... ... '\uFFFF' '377' Achtung: Wenn man dem Java-Ausführer ein Programm übergibt, "sieht er" keine grafischen Zeichen (Kringel für eine 0 oder ein O, Striche für Minuszeichen oder Unterstriche etc.), sondern eine Folge von Zahlen (z.B. die Zahlenfolge 65 66 67 wenn der Programmierer die Zeichenfolge ABC in sein Programm geschrieben hat). Bevor der Ausführer das Programm liest und prüft, ersetzt er darin alle Zeichenfolgen der Form \uxxxx (wobei jedes x für eine Hex-Ziffer steht) in die entsprechende Zahl. Zwei Beispiele: Die Zeichenfolge d.h. die Zahlenfolge wird ersetzt durch die Zahl \u0041 92 117 48 48 52 49 65 \u4EB8 92 117 52 69 66 56 die steht für das Zeichen A 亸 19976 Das Schriftzeichen 亸 bedeutet (wenn ich mich nicht täusche) in etwa "früh aufstehen" oder "die Morgenröte" :-). Durch die Ersetzung kann der Programmtext falsch (unakzeptabel) werden, z.B. in folgenden Fällen: Fehlerhafte char-Literale: 1 2 3 4 5 6 char[] cr = { '\u000A', // '\u000D', // '\u0027', // '\u005C', // }; Ein Ein Ein Ein LF-Zeichen '\n' CR-Zeichen '\r' einfaches Anfuehrungszeichen Rueckwaertsschraegstrich ' \ Wie diese Zeilen aussehen, wenn der Java-Ausführer sie liest: 1 2 3 4 5 6 char[] cr = { ' ', // Ein LF-Zeichen, '\n' ' ', // Ein CR-Zeichen, '\r' ''', // Ein einfaches Anfuehrungszeichen ' '\', // Ein Rueckwaertsschraegstrich \ }; Dass der Java-Ausführer zuerst alle Zeichenfolgen der Form \uxxxx durch die Codezahlen der entsprechenden Zeichen ersetzt, macht es möglich, auch ohne einen speziellen Editor z.B. Variablennamen einzugeben, die aus chinesischen Schriftzeichen bestehen etwa so: 14 char 丈丅亸 = (char) 19976; Eine (für den Java-Ausführer) gleichwertige Vereinbarung kann z.B. so aussehen: 15 char \u4E08\u4E05\u4EB8 = '\uEB8'; Beuth Hochschule, TB3-IN3 Stichworte WS10/11, Seite 33 Antworten zu den Wiederholungsfragen, 7. SU, Fr 12.11.10 1. Betrachten Sie die folgenden Befehle: 1 2 3 4 5 6 StringBuilder sb = new StringBuilder("Hallo") ; pln(sb); sb = null; pln(sb); if (sb != null) pln("Guten Morgen!"); pln(sb.length()); Welchen Teil der Variablen sb bezeichnet der Name "sb" in Zeile 2? Den Zielwert Und in Zeile 3? Den Wert Und in Zeile 4? Den Wert Und in Zeile 5? Den Wert Und in Zeile 6? Den Zielwert 2. Woraus bestehen zusammengesetzte Ausdrücke? Aus Ausdrücken, Operatoren und runden Klammern. 3. Mit welchen Werten werden die Variablen gleich1 und gleich2 initialisiert? 7 8 9 10 11 String String String boolean boolean meldungA meldungB meldungC gleich1 gleich2 = new String("Falscher Param"); = "Falscher Param"; = "Falscher Param"; = meldungA == meldungB; = meldungB == meldungC; Die Variable gleich1 wird mit false und gleich2 wird mit true initialisiert. Im Buch auf S. 143-144 finden Sie eine Tabelle aller Operatoren, die in Java-Ausdrücken vokommen dürfen. 4. Wo in der Tabelle steht die Regel "Punktrechnung geht vor Strichrechnung"? Geben Sie zwei ZeilenNummern und die Überschrift einer Spalte an (die Zeilen müssen Sie selbst "mit dem Finger zählen"). In den Zeilen 3 und 4 in der Spalte Bindungsstärke (12 bzw. 11). 5. Betrachten Sie folgende Variablenvereinbarung: 12 13 int i1, i2, i3, i4; boolean b1, b2, b3, b4; Aus welchen Teilen bestehen die Ausdrücke, die in der zweiten Spalte der folgenden Tabelle stehen? Tragen Sie die Teile in die daneben stehenden Spalten der Tabelle ein. Nr Ausdruck Teil1 Teil2 Teil3 1 i1 + i2 < i3 i1 + i2 < i3 2 i1 >= i2 + i3 i1 >= i2 + i3 3 i1 < i2 == i3 < i4 i1 >= i2 == i3 < i4 4 i1 == i2 == b1 i1 == i2 == b1 5 b1 & b2 ^ b3 b1 & b2 ^ b3 6 b1 || b2 | b3 b1 || b2 | b3 7 b1 & b2 && b3 b1 & b2 && b3 8 b1 != b2 != b3 b1 != b2 != b3 Beuth Hochschule, TB3-IN3 7. SU Fr 12.11.10 WS10/11, Seite 34 7. SU Fr 12.11.10 A. Wiederholung B. Organisation Ausdrücke (Ergänzung) In Java gibt es verschiedene Arten von Literalen. S. 133, Beispiel-01: Eine Übersicht über typische Literale verschiedener Typen Für alle primitive Typen außer byte und short gibt es Literale: S. 133, Beispiel-02: int-Literale S. 134, Beispiel-04: char-Literale Die Rückseite der Wiederholungsfragen besprechen. S. 135, Beispiel-05: String-Literale Daumenregel: Ein String besteht aus char-Werten. Jeden einzelnen dieser char-Werte kann man ganz ähnlich beschreiben wie mit einem char-Literal, aber ohne die einfachen Anführungszeichen ' drumrum. Beispiel: 14 15 16 17 char char char String c1 c2 c3 s = = = = 'A'; '\u0042'; '\\'; "A\u0042\\"; // // // // Ein A Ein B Ein Rueckswaertsschraegstrich \ Drei Zeichen: AB\ Unterschied zwischen "ein char-Wert" und "ein Zeichen": Im Unicode werden etwa 60 Tausend Zeichen durch je einen char-Wert dargestellt. Etwa eine Million weitere Zeichen können durch je zwei char-Werte dargestellt werden. Zwei char-Werte, die zusammen ein Zeichen repräsentieren, bezeichnet man als ein Surrogat-Paar oder auch als einen Codepoint. Ist s ein String, so bezeichnet s.length() die Anzahl der char-Werte in s und s.codePointCount(0, s.length()) die Anzahl der Zeichen in s Beispiel für den Unterschied zwischen char-Werten und Zeichen: 18 19 String s41 = "\u0041\u0042\u0043"; String s42 = "\uD840\uDC01\u0043"; Für die Strings s41 und s42 gilt: ------------------------------------s41.length() : 3 s41.codePointCount(0, s.length(): 3 s41 : ABC ------------------------------------s42.length() : 3 s42.codePointCount(0, s.length(): 2 s42 : 洛C ------------------------------------- Um ehrlich zu sein: Das hier abgebildete chinesische Schriftzeichen ist nicht das richtige (das mit dem Unicode \uD840\uDC01), sondern ein falsches (das mit dem Unicode \uF915), weil ich nicht herausfinden konnte, ob und wie man in ein OpenOffice-Dokument Surrogat-Paare eingeben kann. Aber das richtige Zeichen sieht dem hier abgebildeten Zeichen hoffentlich sehr ähnlich :-). Beuth Hochschule, TB3-IN3 Stichworte WS10/11, Seite 35 Zur Entspannung: Alan Mathison Turing (1912-1954), einer der Begründer der Informatik Bevor man die ersten elektronischen Computer baute, konzipierte und untersuchte der Mathematiker Turing eine Rechenmaschine, die so einfach war, dass niemand an ihrer prinzipiellen Realisierbarkeit zweifelte. Eine solche Turing-Maschine besteht aus einem unbegrenzt langen Band, welches in kleine Abschnitte eingeteilt ist, von denen jeder genau ein Zeichen eines endlichen Alphabets aufnehmen kann. Ein Schreib-Lese-Kopf über dem Band kann bei jedem Arbeitsschritt der Maschine das Zeichen auf dem aktuellen Abschnitt lesen und in Abhängigkeit davon ein bestimmtes Zeichen auf den aktuellen Abschnitt schreiben und einen Abschnitt nach links oder rechts weiterrücken. Ein Programm für eine solche Maschine besteht aus einer endlichen Menge von Befehlen der folgenden Form: "Wenn das aktuelle Zeichen gleich X ist, dann schreibe Y und gehe einen Abschnitt nach links bzw. nach rechts bzw. bleib wo du bist" (wobei X und Y beliebige Zeichen des Alphabets sind). Wichtige Erkenntnis 1: Es gibt viele (präzise definierte, mathematische) Probleme, die man mit Hilfe einer solchen Turing-Maschine lösen kann (z. B. das Multiplizieren von dreidimensionalen Matrizen). Wichtige Erkenntnis 2: Es gibt aber auch (präzise definierte, mathematische) Probleme, die man nicht mit Hilfe einer solchen Turing-Maschine lösen kann. Wichtige Vermutung 3: Alle Probleme, die man mit heutigen oder zukünftigen Computern lösen kann, kann man im Prinzip auch mit einer Turing-Maschine lösen. Im zweiten Weltkrieg arbeitete Turing für die Government Code and Cypher School in Bletchley Park (d. h. für den britischen Geheimdienst) und half entscheidend dabei, die Maschine zu durchschauen, mit der die deutsche Marine ihre Funksprüche verschlüsselte (die Enigma), und wichtige Funksprüche zu entschlüsseln. Damit hat er vermutlich einer ganzen Reihe von aliierten Soldaten (Engländern, Amerikanern, Franzosen, Russen) das Leben gerettet. Weil er homosexuell war, wurde Turing nach dem Krieg zu einer Hormonbehandlung "seiner Krankheit" gezwungen, bekam schwere Depressionen und nahm sich das Leben. Inzwischen wurden die entsprechenden Gesetze in England (und ähnliche Gesetze in anderen Ländern) beseitigt. Im September 2009 entschuldigte sich der britische Premierminister Gordon Brown dafür, wie Turing behandelt worden ist. Ein Blatt mit den Übungen Schleifen (ausführen) 1 und Schleifen (programmieren) 2 austeilen und bearbeiten lassen. Beuth Hochschule, TB3-IN3 7. SU Fr 12.11.10 WS10/11, Seite 36 Wiederholungsfragen, 8. SU, Fr 19.11.10 1. Geben Sie von jedem der folgenden Typen mindestens ein Literal an: Typ Literal(e) long String int double boolean char float 2. Geben von jeder der folgenden pln-Anweisungen den Typ ihres Parameters und ihre Ausgabe zum Bidlschirm an: pln-Anweisung Typ des Parameters Ausgabe pln('\u0041'); pln("\u0041"); pln(0041); pln(0x41L); pln(0.041); pln(0041F); 3. Sie bekommen zum Kurban Bayrami (dtsch: Opferfest) anstelle eines Lammrückens einen String s geschenkt und stellen fest, dass der Funktionsaufruf s.length() den Wert 10 liefert. Wie viele char-Werte enthält dieser String? Was wissen Sie über die Anzahl der Zeichen, die s enthält? 4. Zwei der folgenden Namen bezeichnen verbreitete und erfolgreich eingesetzte Zeichencodes. Einer der Name bezeichnet mehrere Zeichencodes, die viele Probleme und Ärger verursacht haben. Welcher Name bezeichnet diese problematischen Codes? 8-Bit-ASCII 7-Bit-ASCII Unicode 5. Wie vielen Namen von Zeichen kann der Unicode eine 16-Bit lange Codezahl zuordnen? 6. Wie vielen Namen von Zeichen kann der Unidoce eine 32-Bit lange Codezahl zuordnen? Beuth Hochschule, TB3-IN3 Stichworte WS10/11, Seite 37 Rückseite der Wiederholungsfragen, 8. SU, Fr 19.1110 Klassen und Objekte (Beginn eines größeren Kapitels) Def.: Eine Klasse ist ein Modul und ein Bauplan für Module. Beispiel-M für die Benutzung der Klasse Character als Modul: 1 char meinZeichen = EM.liesChar(); 2 ... Character.isDigit(meinZeichen) ... In Zeile 2 wird die Funktion isDigit aufgerufen, die sich im Modul Character befindet. Sie liefert true, wenn ihr Parameter eine Ziffer darstellt. Im Unicode gelten zur Zeit 208 Zeichen als Ziffern. Einige davon werden im folgenden dargestellt (aber für einige habe ich offenbar keinen passenden Font): 0123456789٩٨٧٦٥٤٣٢١٠۰۱۲۳۴۵۶۷۸۹०१२३४५६७८९০১২৩৪৫৬৭৮৯ ੦੧੨੩੪੫੬੭੮੯૦૧૨૩૪૫૬૭૮૯୦୧୨୩୪୫୬୭୮୯௧௨௩௪௫௬௭௮௯౦౧౨౩౪ ౫౬౭౮౯೦೧೨೩೪೫೬೭೮೯൦൧൨൩൪൫൬൭൮൯๐๑๒๓๔๕๖๗๘๙໐໑໒໓໔໕ ໖໗໘໙༠༡༢༣༤༥༦༧༨༩ ?????????????????????????????????? ???? 0 1 2 3 4 5 6 7 8 9 Beispiel-B1 für die Benutzung der Klasse Character als Bauplan: 3 ... new Character(meinZeichen) ... Hier wird dem Ausführer befohlen, einen neuen Modul nach dem Bauplan Character zu bauen. Im Bauplan steht, welche Methoden und Variablen in diesen neuen Modul eingebaut werden müssen. Module, die man (wie hier gezeigt) mit dem new-Befehl erzeugen läßt, werden meist als Objekte oder als Instanzen (der Klasse Character) bezeichnet. Beispiel-B2 für die Benutzung der Klasse Character als Bauplan: 4 Character deinZeichen = null; Hier wird dem Ausführer befohlen, eine Variable vom Typ Character zu bauen. Diese Variable kann im Prinzip auf ein Character-Objekt zeigen, wird aber erstmal mit dem Wert null initialisiert und zeigt somit erstmal nicht auf ein Objekt. Beispiel-B3 für die Benutzung der Klasse Character als Bauplan: Die vorigen beiden Beispiele kann man auch kombinieren, etwa so: 5 Character deinZeichen = new Character(meinZeichen); Hier wird dem Ausführer befohlen, einen neuen Modul (oder: ein neues Objekt) nach dem Bauplan Character zu bauen und eine Variable namens deinZeichen zu erzeugen, die auf das neue Objekt zeigt (oder: die das neue Objekt als Zielwert hat). Beuth Hochschule, TB3-IN3 7. SU Fr 12.11.10 WS10/11, Seite 38 Antworten zu den Wiederholungsfragen, 8. SU, Fr 19.11.10 1. Geben Sie von jedem der folgenden Typen mindestens ein Literal an: Typ long Literal(e) 123L 123l (<- schrecklich!) String "Hallo!" int 123 double 12.345 boolean true char 'A' float 12.345F " " "" 1234567890 0L 1234567890123456789L "A\u0042B" 0 12345E-3 0.12345E2 0.0 false '\u0041' '\n' 12345E-3f '\100' 0.12345E2 0.0F 2. Geben von jedem der folgenden pln-Anweisungen den Typ seines Parameters und seine Ausgabe zum Bidlschrim an: pln-Anweisung Ausgabe pln('\u0041'); Typ des Parameters char pln("\u0041"); String A int 33 pln(0x41L); long 65 pln(0.041); double 0.041 pln(0041F); float 41.0 pln(0041); A 3. Sie bekommen zum Kurban Bayrami (dtsch: Opferfest) anstelle eines Lammrückens einen String s geschenkt und stellen fest, dass der Funktionsaufruf s.length() den Wert 10 liefert. Wie viele char-Werte enthält dieser String? Was wissen Sie über die Anzahl der Zeichen, die s enthält? s enthält 10 char-Werte und zwischen 5 und 10 Zeichen. 4. Zwei der folgenden Namen bezeichnen verbreitete und erfolgreich eingesetzte Zeichencodes. Einer der Name bezeichnet mehrere Zeichencodes, die viele Probleme und Ärger verursacht haben. Welcher Name bezeichnet diese problematischen Codes? 8-Bit-ASCII 7-Bit-ASCII Unicode Zahlreiche 8-Bit-ASCII-Codes verursachen auch heute noch viele Probleme und Ärger. 5. Wie vielen Namen von Zeichen kann der Unicode eine 16-Bit lange Codezahl zuordnen? Etwa 63 Tausend Zeichen 6. Wie vielen Namen von Zeichen kann der Unidoce eine 32-Bit lange Codezahl zuordnen? Etwa einer Million Zeichen Beuth Hochschule, TB3-IN3 Stichworte WS10/11, Seite 39 8. SU Fr 19.11.10 A. Wiederholung B. Organisation Unicode Zur Zeit (November 2010) ordnet der Unicode 98 884 Zeichen eine Codezahl zu, davon etwa 60 Tausend eine 16-Bit-Codezahl und den restlichen etwa 40 Tausend Zeichen eine 32-Bit-Codezahl. 4598 Anträge zur Aufnahme weiterer Zeichen, die zusammen 2030 Zeichen betreffen, werden zur Zeit bearbeitet und geprüft (Quelle: www.decodeunicode.org) Wenn Sie ein wichtiges Zeichen entdecken, dem im Unicode noch keine Codezahl zugeordnet wird, können Sie auch einen Antrag stellen (über 900 Tausend Codezahlen sind noch frei!). Klassen Klassen in Java sind so etwas wie "Kombinationswerkzeuge" (z.B. ein Kugelschreiber-und-Flaschenöffner oder ein Stemmeisen-mit-Haken-zum-Nägel-rausziehen etc.). Wir betrachten jetzt die Rückseite der Wiederholungsfragen: Def.: Eine Klasse ist ein Modul und ein Bauplan für Module. Beispiel-M für die Benutzung der Klasse Character als Modul: 1 char meinZeichen = EM.liesChar(); 2 ... Character.isDigit(meinZeichen) ... In Zeile 2 wird die Funktion isDigit aufgerufen, die sich im Modul Character befindet. Sie liefert true, wenn ihr Parameter eine Ziffer darstellt. Beispiel-B1 für die Benutzung der Klasse Character als Bauplan: 3 ... new Character(meinZeichen) ... Hier wird dem Ausführer befohlen, einen neuen Modul nach dem Bauplan Character zu bauen. Im Bauplan steht, welche Methoden und Variablen in diesen neuen Modul eingebaut werden müssen. Module, die man (wie hier gezeigt) mit dem new-Befehl erzeugen läßt, werden meist als Objekte oder als Instanzen (der Klasse Character) bezeichnet. Beispiel-B2 für die Benutzung der Klasse Character als Bauplan: 4 Character deinZeichen = null; Hier wird dem Ausführer befohlen, eine Variable vom Typ Character zu bauen. Diese Variable kann im Prinzip auf ein Character-Objekt zeigen, wird aber erstmal mit dem Wert null initialisiert und zeigt somit erstmal nicht auf ein Objekt. Beispiel-B3 für die Benutzung der Klasse Character als Bauplan: Die vorigen beiden Beispiele kann man auch kombinieren, etwa so: 5 Character deinZeichen = new Character(meinZeichen); Hier wird dem Ausführer befohlen, einen neuen Modul (oder: ein neues Objekt) nach dem Bauplan Character zu bauen und eine Variable namens deinZeichen zu erzeugen, die auf das neue Objekt zeigt (oder: die das neue Objekt als Zielwert hat). Beuth Hochschule, TB3-IN3 8. SU Fr 19.11.10 WS10/11, Seite 40 S. 203, Beispiel-01: Die Klasse Zaehler01 S. 204, Bild 9.1: Der Modulaspket der Klasse Zaehler01 S. 205, Bild 9.2: Zwei Objekte der Klasse Zaehler01 Die record-Types in C/C++ kann man als Vorläufer von Klassen sehen. Oder andersherum: Mit record-Types kann man einige Eigenschaften von Klassen nachmachen. Aber Klassen sind "viel mächtiger" als record-Types. Zur Entspannung: Hilberts Hotel Denken Sie sich ein Hotel mit unendlich vielen, nummerierten Zimmern: 1, 2, 3, ... . Alle Zimmer sind belegt. Dieses Hotel wurde nach dem Mathematiker David Hilbert (1862-1943) benannt. 1. Wie kann man einen weiteren Gast unterbringen? (ZrNr := ZrNr + 1) 2. Wie kann man 100 weitere Gäste unterbringen? (ZrNr := ZrNr + 100) 3. Wie kann man unendlich viele weitere Gäste unterbringen? (ZrNr := ZrNr * 2, danach sind alle Zimmer mit ungeraden Nrn. (1, 3, 5, ...) frei. Def.: Eine Variable, die innerhalb einer Klasse vereinbart wurde, bezeichnet man auch als ein Attribut. Beispiel: 6 class Otto { 7 static int punkte; 8 String text; 9 10 void machWas() { 11 int n = 17; 12 13 ... 14 } // machWas 15 ... 16 } // class Otto // Ein Attribut // Ein Attribut // Kein Attribut, // sondern lokale Variable der Methode machWas! Beuth Hochschule, TB3-IN3 Stichworte WS10/11, Seite 41 9. SU Fr 26.11.03 Frau Dr. Wolfers hält eine Probevorlesung über das Thema: "Effiziente Datenstrukturen und ihre Implementierung, eine Auswahl" (insgesamt ca. 60 Minuten). Anschließend sollen von den teilnehmenden StudentInnen Evalutationsbögen ausgefüllt werden. Beuth Hochschule, TB3-IN3 9. SU Fr 26.11.03 Wiederholungsfragen, 10. SU, Fr 03.12.10 Betrachten Sie die folgende Klassenvereinbarung: 1 class Carsten { 2 int e1; 3 static String e2() 4 float e3() 5 Carsten(int n) 6 static double e4; 7 static String e5; 8 Carsten() 9 String e6() 10 } { ... } { ... } { ... } { ... } { ... } 1. Wie viele Elemente werden in der Klasse Carsten vereinbart? 2. Wie viele Konstruktoren werden in der Klasse Carsten vereinbart? 3. Wie heißen die Elemente, die zum Modulaspekt der Klasse Carsten gehören? 4. Wie heißen die Elemente, die zum Bauplanaspket der Klasse Carsten gehören? 5. Geben Sie einen Befehl an, der die Klasse Carsten als Modul benutzt. 6. Geben Sie einen Befehl an, der die Klasse Carsten als Bauplan benutzt. 7. Was ist ein Modul? 8. In Java gibt es zwei verschiedene Arten von Modulen. Welche der folgenden Dinge sind (auch) Module: Variablen, Objekte, Methoden, Anweisungen, Klassen, Pakete, Programme WS10/11, Seite 42 Beuth Hochschule, TB3-IN3 Stichworte WS10/11, Seite 43 Rückseite der Wiederholungsfragen, 10. SU, Fr 03.12.10 Ein wichtiger Informatiker: Niklaus Wirth (geb. 1934 in Winterthur, Schweiz) Diplom 1959 an der ETH Zürich, M.Sc. 1960 an der Laval University, Canada und 1963 Ph.D. an der UCL Berkley. Wirth erhielt 1984 den Turing-Award (die wohl höchste Auszeichnung für Informatiker). Einige wichtige Programmiersprachen (die von Wirth entwickelten Sprachen sind fett hervorgehoben): 1955 1960 1965 1968 1970 1972 1975 1980 1980 1984 1990 1994 1995 Fortran, Cobol Algol60 Algol-W Algol68 C Pascal Modula Modula-2 Ada C++ Oberon Java Ada95 Erste höhere Programmiersprachen Erste "akademische" Sprache Besseres Algol 2-Stufen-Grammatiken., Bojen Maschinennahe höhere Sprache Strukturierte Programmierung Module Module, Nebenläufigkeit Module, Nebenläufigkeit, Schablonen C mit Klassen, Schablonen Klassen Maschinenunabhängigkeit Klassen Beuth Hochschule, TB3-IN3 9. SU Fr 26.11.03 WS10/11, Seite 44 Antworten zu den Wiederholungsfragen, 10. SU, Fr 03.12.10 Betrachten Sie die folgende Klassenvereinbarung: 1 class Carsten { 2 int e1; 3 static String e2() 4 float e3() 5 Carsten(int n) 6 static double e4; 7 static String e5; 8 Carsten() 9 String e6() 10 } { ... } { ... } { ... } { ... } { ... } 1. Wie viele Elemente werden in der Klasse Carsten vereinbart? 6 2. Wie viele Konstruktoren werden in der Klasse Carsten vereinbart? 2 3. Wie heißen die Elemente, die zum Modulaspekt der Klasse Carsten gehören? e2, e4, e5 4. Wie heißen die Elemente, die zum Bauplanaspket der Klasse Carsten gehören? e1, e3, e6 5. Geben Sie einen Befehl an, der die Klasse Carsten als Modul benutzt. 11 12 13 String s = Carsten.e2(); double d = Carsten.e4; if (Carsten.e5.equals("Hallo") ... 6. Geben Sie einen Befehl an, der die Klasse Carsten als Bauplan benutzt. 14 15 Carsten c01 = new Carsten(17); Carsten c02 = new Carsten(); 7. Was ist ein Modul? Ein Behälter für Variablen, Unterprogramme, Typen, Module (und evtl. weitere Elemente), der aus mindestens zwei Teilen besteht, einem öffentlichen (ungeschützten) Teil und einem privaten (geschützten) Teil. 8. In Java gibt es zwei verschiedene Arten von Modulen. Welche der folgenden Dinge sind (auch) Module: Variablen, Objekte, Methoden, Anweisungen, Klassen, Pakete, Programme Beuth Hochschule, TB3-IN3 Stichworte WS10/11, Seite 45 10. SU Fr 03.12.10 A. Wiederholung B. Organisation Module mit vier Teilen Module in Java (d.h. Klassen und Objekte) bestehen nicht nur aus zwei Teilen, sondern aus vier Teilen: je einem öffentlichen, halb-öffentlichen, halb-privaten, privaten Teil. Die Klasse Zaehler01 enthält nur primitive Attribute. 9.2 Eine Klasse mit Attributen eines Referenztyps S. 211, Beispiel-04: Ein Bauplan für etwas kompliziertere Objekte Wie viele Attribute werden in der Klasse Person00 vereinbart? (3) Welche davon sind von einem Referenztyp? (vorName und nachName) Was wird dem Ausführer in Zeile 18 befohlen? (Ein Objekt zu erzeugen und eine Variable zu erzeugen und die Variable auf das Objekt zeigen zu lassen) Und in Zeile 19? (Ebenso) S.212, Bild 9.6: Zwei Person00-Objekte und drei String-Objekte Wichtig: Die Person00-Objekte enthalten nur Referenzen auf String-Objekte (die Referenzen <77>, <78> und <81>), die String-Objekte (die Module, auf die die Referenzen zeigen), liegen ausserhalb der Person00-Objekte. Vorteil: Das String-Objekt "Schulz" gibt es nur einmal, und die Attribute anna.nachName und bert.nachName zeigen auf (ein und) dasselbe String-Objekt. 9.4 Klassische Fachbegriffe In einer Klasse kann man Elemente (engl. members) und Konstruktoren (engl. constructors) vereinbaren. Konstruktoren gelten also nicht als Elemente! Die Elemente einer Klasse kann man (unter anderem) nach den folgenden Kriterien einteilen (und dann die folgenden Gruppen unterscheiden): Einteilungskriterium Gruppen nach Art Attribut, Methode, Klasse, Schnittstelle nach Aspektzugehörigkeit Klassenelemente (gehören zum Modulaspekt) Objektelemente (gehören zum Bauplanaspekt) nach Erreichbarkeit öffentlich (public) geschützt (protected) paketweit erreichbar (--) privat (private) Wenn man ein Element einer Klasse kurz und präzise beschreibt, nennt man die Gruppenzugehörigkeiten in folgender Reihenfolge: Erreichbarkeit, Aspektzugehörigkeit, Art. Es gibt alle Kombinationen, z.B. so: Öffentliches Klassen-Attribut Öffentliche Klassen-Methode Öffentliche Klassen-Schnittstelle etc. Private Objekt-Methode Privates Objekt-Attribut Öffentliche Objekt-Schnittstelle Wie viele solcher Kombinationen gibt es? (4 x 2 x 4 ist gleich 32) Beuth Hochschule, TB3-IN3 10. SU Fr 03.12.10 WS10/11, Seite 46 S. 218, Beispiel-01: und Aufgabe-01: Was ist n1? Was ist n2? Was ist inkrementA? Was ist inkrementB? Was ist Erreichbarkeit01? etc. (Ein öffentliches Klassen-Attribut) (Ein privates Klassen-Attribut) (Eine öffentliche Klassen-Methode) (Eine private Klassen-Methode) (Ein öffentlicher Konstruktor, kein Element) 9.5 Objektorientierte Programmierung Angenommen, wir woll ein objektorientiertes Programm zur Verwaltung der Beuth Hochschule schreiben? Wie gehen wir vor? 1. Wir fragen: Was sind die wichtigen Objekte in der Beuth Hochschule? Mögliche Antwort: StudentInnen, Hörsäle, Lehrveranstaltungen, ... 2. Wir fragen: Was sind die relevanten Daten einer StudentIn? Mögliche Antwort: Name, Matrikel-Nr, Noten, ... 3. Wir fragen: Was sind die relevanten Tätigkeiten und Aktionen einer StudentIn? Mögliche Antworten: Einschreiben, belegen, eine-Note-bekommen, ... Für Hörsäle, Lehrveranstaltungen klären wir entsprechende Fragen wie 2. und 3. 4. Wir programmieren eine Klasse Namens StudentIn mit Attributen namens name, matrikel_nr, noten, ... und Methoden namens einschreiben, belegen, bekommtEineNote, ... Jedes Objekt dieser Klasse repräsentiert eine StudentIn. Für Hörsäle, Lehrveranstaltungen etc. programmieren wir entsprechend Klassen namens Hoersaal, Lehrveranstaltung, ... etc. Ziel: Die Objekte ausserhalb von Computern (StudentInnen, Hörsäle, Lehrveranstaltungen, ...) und die Objekte im Verwaltungscomputer (StudentIn-Objekte, Hoersaal-Objekte, Lehrveranstaltung-Objekte, ...) sollen sich möglichst direkt und offensichtlich entsprechen. Zur Entspannung: Niklaus Wirth (siehe Rückseite der Wiederholungsfragen) Wofür er gelobt wurde: Er hat immer wieder von vorn angefangen Wofür er getadelt wurde: Er hat immer wieder von vorn angefangen 10 Ein paar Standardklassen und Methoden (S. 221) 10.1 Die Klasse String String-Objekte repräsentieren unveränderbare Zeichenfolgen. S. 222, Beispiel-01 bis S. 225, Beispiel-06 kurz besprechen. 10.3 Die Klasse StringBuilder (S. 233) StringBuilder-Objekte repräsentieren veränderbare Zeichenfolgen. S. 233, Beispiel-01 (Kapazität und Länge) Die Methoden insert und delete. 10.2 Objekte mit Hilfe von Bojen genauer verstehen (S. 228) Beuth Hochschule, TB3-IN3 Stichworte WS10/11, Seite 47 Wiederholungsfragen, 11. SU, Fr 10.12.10 Vereinbaren Sie eine Klasse namens Clarissa und innerhalb dieser Klassenvereinbarung folgende Elemente und Konstruktoren: 1. Ein privates Klassenattribut namens anna vom Typ float mit dem Anfangswert 1.5. 2. Eine geschützte Klassenmethode namens bert mit dem Rückgabetyp float und zwei float-Parametern. 3. Eine paketweit sichtbare Klassenmethode namens caesar mit dem Rückgabetyp String und einem String-Parameter. 4. Ein paketweit erreichbares Objektattribut namens dora vom Typ String. 5. Eine öffentliche Objektmethode namens emil mit dem Rückgabetyp String und einem int-Parameter. 6. Ein geschütztes Objektattribut namens fritz vom Typ boolean. 7. Einen paketweit erreichbaren Standardkonstruktor, der die Attribute dora und fritz mit "XXX" bzw. true initialisiert. 8. Einen öffentlichen Konstruktor mit einem String-Paramtern namens dora und einem boolean-Parameter namens fritz, der mit den Werten seiner Parameter die Attribute dora und fritz initialisiert. Hinweis: Wenn Mißverständnisse zu befürchten sind, kann man das aktuelle Objekt (welches vom Konstruktor gerade initialisiert wird) immer mit this und seine Elemente a, b, ... mit this.a, this.b, ... bezeichnen). Was die Methoden bert, caesar und emil "machen" (d.h. die Befehle in ihren Rümpfen) können Sie frei festlegen. Allerdings müssen Sie dabei die Java-Regeln für Methoden einhalten. 9. Was für einen Wert liefert der Ausdruck "Bückling".equals("Büffet")? 10. Was für einen int-Wert liefert der Ausdruck "Bückling".compareTo("Büffet"), einen negativen int-Wert, den int-Wert 0 oder einen positiven int-Wert? Beuth Hochschule, TB3-IN3 10. SU Fr 03.12.10 WS10/11, Seite 48 Rückseite der Wiederholungsfragen, 11. SU, Fr 10.12.10 Wie verändern sich die Kapazität und die Länge eines StringBuilder-Objekts wenn man wiederholt weitere Zeichen einfügt (z.B. mit der Methode append)? Eine kleine Demo: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 // Datei CapacityAndLength.java /* -----------------------------------------------------------------------Demonstriert die Laenge und die Kapazitaet eines StringBuilder-Objekts ------------------------------------------------------------------------ */ class CapacityAndLength { // --------------------------------------------------------------------static public String myString(StringBuilder sb) { // Liefert eine String-Darstellung von sb mit Laenge und Kapazitaet int len = sb.length(); int cap = sb.capacity(); String inh = (len<=15) ? sb.toString() : sb.substring(0, 6) + "..." + sb.substring(len-6); return String.format(" %2d| %2d|%-15s|", cap, len, inh); } // myString // --------------------------------------------------------------------static public void main(String[] _) { // Haengt ein paar Zeichenketten an einen StringBuilder sb an. // Dabei werden die Ziffern 1, 2, 3 etc. je 5-Mal wiederholt. // Gibt nach jedem Anhaengen die Kapazitaet, die Laenge und // den Inhalt von sb aus. StringBuilder sb = new StringBuilder("111"); // Ausgabe zum Bildschirm: pln("+-+---+---+---------------+"); // +-+---+---+---------------+ pln("| |cap|len|Inhalt von sb: |"); // | |cap|len|Inhalt von sb: | pln("+-+---+---+---------------+"); // +-+---+---+---------------+ pln("|A|" + myString(sb)); // |A| 19| 3|111 | sb.append("11222223333344"); pln("|B|" + myString(sb)); // |B| 19| 17|111112...333344| sb.append("444"); pln("|C|" + myString(sb)); // |C| 40| 20|111112...344444| sb.append("5555566666"); pln("|D|" + myString(sb)); // |D| 40| 30|111112...677777| sb.append("7777788888"); pln("|E|" + myString(sb)); // |E| 40| 40|111112...899999| sb.append("9"); pln("|F|" + myString(sb)); // |F| 82| 41|111112...999990| pln("+-+---+---+---------------+"); // +-+---+---+---------------+ pln("CapacityAndLength: Das war's erstmal!"); } // main // --------------------------------------------------------------------// Eine Methode mit einem kurzen Namen: static void pln(Object ob) {System.out.println(ob);} // --------------------------------------------------------------------} // class CapacityAndLength Beuth Hochschule, TB3-IN3 Stichworte WS10/11, Seite 49 Antworten zu den Wiederholungsfragen, 11. SU, Fr 10.12.10 Vereinbaren Sie eine Klasse namens Clarissa und innerhalb dieser Klassenvereinbarung folgende Elemente und Konstruktoren: 1. Ein privates Klassenattribut namens anna vom Typ float mit dem Anfangswert 1.5. 2. Eine geschützte Klassenmethode namens bert mit dem Rückgabetyp float und zwei float-Parametern. 3. Eine paketweit sichtbare Klassenmethode namens caesar mit dem Rückgabetyp String und einem String-Parameter. 4. Ein paketweit erreichbares Objektattribut namens dora vom Typ String. 5. Eine öffentliche Objektmethode namens emil mit dem Rückgabetyp String und einem int-Parameter. 6. Ein geschütztes Objektattribut namens fritz vom Typ boolean. 7. Einen paketweit erreichbaren Standardkonstruktor, der die Attribute dora und fritz mit "XXX" bzw. true initialisiert. 8. Einen öffentlichen Konstruktor mit einem String-Paramtern namens dora und einem boolean-Parameter namens fritz, der mit den Werten seiner Parameter die Attribute dora und fritz initialisiert. Hinweis: Wenn Mißverständnisse zu befürchten sind, kann man das aktuelle Objekt (welches vom Konstruktor gerade initialisiert wird) immer mit this und seine Elemente a, b, ... mit this.a, this.b, ... bezeichnen). 1 class Clarissa { 2 private static float anna = 1.5F; // Das F ist notwendig! 3 protected static float bert (float f1, float f2) {return f1+f2;} 4 static String caesar(String s) {return s+s;} 5 6 String dora; 7 public String emil(int n) {return "Ergebnis: " + n;} 8 protected boolean fritz; 9 10 Clarissa() { 11 dora = "XXX"; 12 fritz = true; 13 } 14 15 public Clarissa(String dora, boolean fritz) { 16 this.dora = dora; 17 this.fritz = fritz; 18 } 19 } 9. Was für einen Wert liefert der Ausdruck "Bückling".equals("Büffet")? Den boolean-Wert false. 10. Was für einen int-Wert liefert der Ausdruck "Bückling".compareTo("Büffet"), einen negativen int-Wert, den int-Wert 0 oder einen positiven int-Wert? Einen negativen int-Wert (genauer: den Wert 'c' - 'f' gleich -3) Beuth Hochschule, TB3-IN3 11. SU Mo 10.12.10 WS10/11, Seite 50 11. SU Mo 10.12.10 A. Wiederholung B. Organisation: Die Vorlesung am Fr 28.02.1011 findet nicht hier im B554 statt, sondern im Raum C113. Das ist im Haus Grashof (im Haus "mit den vielen Stockwerken"). Die Online-Dokumentation der Java-Standardklassen Spätestens in der nächsten Übung sollte jeder damit anfangen, in dieser Online-Dokumentation Informationen über Standard-Klassen wie String, StringBuilder, Integer, ArrayList<K>, ... etc. nachzusehen. Suchmaschinen wie Yahoo und Google finden die richtige Dokumentation, wenn man z.B. nach java 6 doc api sucht. Achtung: Es gibt viele falsche (ältere) Versionen dieser Dokumentation! 10.3 Die Klasse StringBuilder Zeichenketten, die man nicht verändern will, sollte man durch String-Objekte darstellen. Zeichenketten, die man verändern will, sollte man durch StringBuilder-Objekte darstellen. Ein StringBuilder-Objekt besteht im Kern aus einer internen Reihung von char-Variablen. Diese Reihung ist privat, und man kann nicht direkt darauf zugreifen, nur indirekt über öffentliche Objekt-Methoden wie charAt, append, insert, delete, ... etc. Jedes StringBuilder-Objekt hat in jedem Moment eine Länge ("Wie viele char-Werte enthält die interne Reihung gerade?") und eine Kapazität ("Für wie viele char-Werte hat die interne Reihung Platz?"). Die Kapazität wird meistens vom Ausführer verwaltet. Das Demoprogramm CapacityAndLength auf der Rückseite der Wiederholungsfragen besprechen. Ein kleiner, informeller Zeitvergleich (mit einem Pentium 2.52 GHz, Windows XP, Java 6, Dez 2010): A append : pro Sekunde: 15.656.250 B insert : pro Sekunde: 5.637 C konkat : pro Sekunde: 1.333 append und insert sind StringBuilder-Methoden, konkat bezeichnet hier das Konkatenieren von String-Objekten mit dem Plus-Operator +. Die in der Klasse StringBuilder vereinbarte equals-Methode vergleicht die Werte von StringBuilder-Variablen, nicht die Zielwerte! Zum Vergleich: Die in der Klasse String vereinbarte equals-Methode vergleicht die Zielwerte von String-Variablen, nicht die Werte! 10.4 Die Klasse ArrayList<K> Eine gewöhnliche Klasse definiert einen Typ: Die Klasse String definiert den einen Typ String, die Klasse Integer definiert den einen Typ Integer etc. Die Klasse ArrayList ist eine generische Klasse (erkennbar an den Spitzen Klammern <K>), sie definiert unbegrenzt viele Typen, z.B. ArrayList<Integer>, ArrayList<StringBuilder>, ArrayList<String>, ArrayList<ArrayList<String>>, ArrayList<ArrayList<ArrayList<String>>>, ... Außerdem ist ArrayList ein Sammlungstyp. Das bedeutet: In einem Objekt eines ArrayList-Typs kann man andere Objekte sammeln (d.h. einfügen, suchen, wieder entfernen etc.). Beuth Hochschule, TB3-IN3 Stichworte WS10/11, Seite 51 Für den Typ-Parameter K zwischen den spitzen Klammern darf man nur Referenztypen einsetzen, keine primitiven Typen. Mit anderen Worten: Primitive Werte kann man nicht sammeln. Aber: Für jeden der 8 primitiven Typen gibt es eine sog. Hüllklasse. S. 91, unten Einen int-Wert in ein Integer-Objekt umwandeln oder umgekehrt, ein Integer-Objekt in einen int-Wert umwandeln geht ganz einfach (mit einem Cast-Befehl wie (int) bzw. (Integer)) und an vielen Stellen eines Java-Programms führt der Ausführer solche Umwandlungen automatisch durch (ohne ausdrücklichen Befehl des Programmierers). Statt primitive Werte direkt zu sammeln (was nicht erlaubt ist) kann man die entsprechenden Hüllobjekte sammeln. Vergleich zwischen Reihungen und Sammlungen: S. 243, Tabelle Beuth Hochschule, TB3-IN3 11. SU Mo 10.12.10 WS10/11, Seite 52 Wiederholungsfragen, 12. SU, Fr 17.12.10 1. Sie wollen in einem Java-Programm eine Zeichenkette benutzen. Wann realisieren Sie diese Zeichenkette als String-Objekt und wann als StringBuilder-Objekt? Betrachten Sie die folgende Befehle: 1 2 3 StringBuilder sb = new StringBuilder(EM.liesString()); int n1 = sb.length(); int n2 = sb.codePointCount(0, s.b.length()); 2. Was steht nach Ausführung dieser Befehle in der Variablen n1? Die Anzahl der Komponenten von sb? Die Anzahl der Zeichen von sb? Die Anzahl der int-Variablen in sb? Die Anzahl der char-Variablen in sb? Die Zahl 0, weil sb noch leer ist? 3. Und was steht in der Variablen n2? Die Anzahl der Komponenten von sb? Die Anzahl der Zeichen von sb? Die Anzahl der int-Variablen in sb? Die Anzahl der char-Variablen in sb? Die Zahl 0, weil sb noch leer ist? 4. Angenommen, s ist ein String- oder StringBuilder-Objekt der Länge 10. Wie viele Zeichen enthält s dann mindestens und wie viele höchstens? Zur Erinnerung: Eine Variable besteht aus 2 bis 4 Teilen. 5. Angenommen, s1 und s2 sind String-Variablen. Welche Teile dieser Variablen werden durch den Vergleichsbefehl s1.equals(s2) verglichen? 6. Angenommen, s1 und s2 sind StringBuilder-Variablen. Welche Teile dieser Variablen werden durch den Vergleichsbefehl s1.equals(s2) verglichen? 7. Angenommen, s1 und s2 sind Variablen von irgendeinem Typ (z.B. String oder StringBuilder oder int oder double oder ...). Welche Teile dieser Variablen werden durch den Vergleichsbefehl s1==s2 verglichen? 8. Ein StringBuilder-Objekt sb besteht "im Kern" aus einer privaten Reihung rc von char-Variablen. Was versteht man unter der Kapazität von sb? 9. Wie viele Typen definiert die generische Klasse ArrayList<K>? Geben Sie drei Beispiele für solche ArrayList-Typen an. 10. Geben Sie zwei Unterschiede zwischen Reihungen (engl. arrays) und Sammlungen (engl. collections) an. Beuth Hochschule, TB3-IN3 Stichworte WS10/11, Seite 53 Antworten zu den Wiederholungsfragen, 12. SU, Fr 17.12.10 1. Sie wollen in einem Java-Programm eine Zeichenkette benutzen. Wann realisieren Sie diese Zeichenkette als String-Objekt und wann als StringBuilder-Objekt? Als StringBuilder wenn die Zeichenkette wiederholt verändert werden soll, sonst als String. Betrachten Sie die folgende Befehle: 1 2 3 StringBuilder sb = new StringBuilder(EM.liesString()); int n1 = sb.length(); int n2 = sb.codePointCount(0, s.b.length()); 2. Was steht nach Ausführung dieser Befehle in der Variablen n1? Die Anzahl der Komponenten von sb? Die Anzahl der Zeichen von sb? Die Anzahl der int-Variablen in sb? Die Anzahl der char-Variablen in sb! Die Zahl 0, weil sb noch leer ist? 3. Und was steht in der Variablen n2? Die Anzahl der Komponenten von sb? Die Anzahl der Zeichen von sb! Die Anzahl der int-Variablen in sb? Die Anzahl der char-Variablen in sb? Die Zahl 0, weil sb noch leer ist? 4. Angenommen, s ist ein String- oder StringBuilder-Objekt der Länge 10. Wie viele Zeichen enthält s dann mindestens und wie viele höchstens? Mindestens 5, höchstens 10. Zur Erinnerung: Eine Variable besteht aus 2 bis 4 Teilen. 5. Angenommen, s1 und s2 sind String-Variablen. Welche Teile dieser Variablen werden durch den Vergleichsbefehl s1.equals(s2) verglichen? Die Zielwerte. 6. Angenommen, s1 und s2 sind StringBuilder-Variablen. Welche Teile dieser Variablen werden durch den Vergleichsbefehl s1.equals(s2) verglichen? Die Werte. 7. Angenommen, s1 und s2 sind Variablen von irgendeinem Typ (z.B. String oder StringBuilder oder int oder double oder ...). Welche Teile dieser Variablen werden durch den Vergleichsbefehl s1==s2 verglichen? Die Werte. 8. Ein StringBuilder-Objekt sb besteht "im Kern" aus einer privaten Reihung rc von char-Variablen. Was versteht man unter der Kapazität von sb? Die Länge der Reihung rc (d.h. rc.length) 9. Wie viele Typen definiert die generische Klasse ArrayList<K>? Geben Sie drei Beispiele für solche ArrayList-Typen an. Die Klasse ArrayList<K> definiert unendlich viele Typen, z.B. die Typen ArrayList<String>, ArrayList<Integer>, ArrayList<ArrayList<Integer>>, ... 10. Geben Sie zwei Unterschiede zwischen Reihungen (engl. arrays) und Sammlungen (engl. collections) an. - Reihungen sind aus Beton, (die meisten) Sammlungen aus Gummi - Reihungen können primitive Werte enthalten, Sammlungen nur Objekte Beuth Hochschule, TB3-IN3 12. SU Fr 17.12.10 WS10/11, Seite 54 12. SU Fr 17.12.10 A. Wiederholung B. Organisation: Die Vorlesung am Fr 28.01.1011 findet nicht hier im B554 statt, sondern im Raum C113. Das ist im Haus Grashof (im Haus "mit den vielen Stockwerken"). 12 Klassen erweitern (beerben) und Typgrafen Motivation dafür, eine Klasse zu erweitern (zu beerben) S. 278, Beispiel-01: Die Klasse Person01 ("eine alte und bewährte Klasse") S. 278, Bild 12.1 Der Modul Person01 S. 279, Bild 12.2 Ein Person01-Objekt S. 280, Beispiel-02: Die Klasse Person02 (eine Erweiterung von Person01) S. 281, Bild 12.3 Der Modul Person02 S. 281, Bild 12.4 Ein Person02-Objekt Und jetzt die volle Wahrheit: S. 282, Bild 12.5 Der Modul Person02 (volle Wahrheit) S. 283, Bild 12.6 Ein Person02-Objekt (volle Wahrheit) Zur Entspannung: Christian Morgenstern (1871-1914, München-Meran): Anto-Logie Die Evolution großer Tiere und Zahlen: Im Anfang lebte, wie bekannt, als größter Säuger der Gig-ant. ... 12.2 Allgemeine Regeln zum Beerben und Vererben (S. 283) Begriffe: Direkte Oberklasse (genau eine), direkte Unterklassen (0 oder mehr) Oberklassen, Unterklassen S. 285, Bild 12.7 Ein Typgraf 12.3. Ein größeres Beispiel für Beerbung (S. 286) Beuth Hochschule, TB3-IN3 Stichworte WS10/11, Seite 55 Wiederholungsfragen, 13. SU, Fr 07.01.11 1. Zeichnen Sie (vorzugsweise mit Bleistift, auf ein separates, ausreichend großes Blatt) den Typgraf, in dem folgende Klassen vorkommen: Object, E01Punkt, E01Rechteck, E01Quadrat, E01Ellipse, E01Kreis, Punkt3D, Quader, Würfel, Kugel. 2. An wie viele direkte Unterklassen darf eine Klasse ihre Elemente vererben? 3. Wie viele direkte Oberklassen darf eine Java-Klasse beerben? 4. Wie viele Unterklassen kann eine Klasse haben? Und wieviele Oberklassen? 5. Welche Dinge, die in einer Klasse vereinbart werden können, werden nicht vererbt/geerbt? 6. Was bewirkt der erste Befehl im Rumpf von jedem Konstruktor (unabhängig davon, ob der Programmierer diesen Befehl ausdrücklich hinschreibt oder ob der Ausführer ihn stillschweigend hinzufügt)? 7. Zu der Regel, die in der vorigen Frage erwähnt wurde, gibt es eine einzige Ausnahme. Welche? 8. Was passiert, wenn der Programmierer eine Klasse vereinbart, darin aber keinen Konstruktor vereinbart? 9. Wann und wo findet die Klausur statt? Beuth Hochschule, TB3-IN3 12. SU Fr 17.12.10 WS10/11, Seite 56 Antworten zu den Wiederholungsfragen, 13. SU, Fr 07.01.11 1. Zeichnen Sie (vorzugsweise mit Bleistift, auf ein separates, ausreichend großes Blatt) den Typgraf, in dem folgende Klassen vorkommen: Object, E01Punkt, E01Rechteck, E01Quadrat, E01Ellipse, E01Kreis, Punkt3D, Quader, Würfel, Kugel. Object | +--- E01Punkt | +--- E01Rechteck | | | +--- E01Quadrat | +--- E01Ellipse | | | +--- E01Kreis | +--- Punkt3D | +--- Quader | | | +--- Wuerfel | +--- Kugel 2. An wie viele direkte Unterklassen darf eine Klasse ihre Elemente vererben? An beliebig viele (0, 1, 2, ...) 3. Wie viele direkte Oberklassen darf eine Java-Klasse beerben? Genau eine 4. Wie viele Unterklassen kann eine Klasse haben? Und wieviele Oberklassen? Belibig viele Unterklassen, belieb viele Oberklassen. 5. Welche Dinge, die in einer Klasse vereinbart werden können, werden nicht vererbt/geerbt? Konstruktoren 6. Was bewirkt der erste Befehl im Rumpf von jedem Konstruktor (unabhängig davon, ob der Programmierer diesen Befehl ausdrücklich hinschreibt oder ob der Ausführer ihn stillschweigend hinzufügt)? Er ruft einen Konstruktor der direkten Oberklasse auf. 7. Zu der Regel, die in der vorigen Frage erwähnt wurde, gibt es eine einzige Ausnahme. Welche? Der erste Befehl im (einzigen) Konstruktor der Klasse Object ruft keinen Konstruktor der direkten Oberklasse auf, weil die Klasse Object keine direkte Oberklasse hat. 8. Was passiert, wenn der Programmierer eine Klasse vereinbart, darin aber keinen Konstruktor vereinbart? Der Ausführer "schenkt" der Klasse einen Standardkonstruktor (d.h. einen Kostruktor mit 0 Parametern), dessen Rumpf leer ist. 9. Wann und wo findet die Klausur statt? Am Mo 07.02.2011, ab 14 Uhr, im Raum B101. Beuth Hochschule, TB3-IN3 Stichworte WS10/11, Seite 57 13. SU Fr 07.01.11 A. Wiederholung B. Organisation Pakete (die nichts mit Weihnachten zu tun haben) Motivation: Sie wollen ein großes Java-Programm entwickeln, einige der Klassen aber nicht selbst schreiben, sondern von verschiedenen Firmen dazukaufen. Natürlich hat jede dieser Firmen mindestens eine Klasse namens Logging und zwei namens Test vereinbart und Sie brauchen alle diese Loggingund Test-Klassen. Wie kann man in solchen Situationen Mehrdeutigkeiten verhindern? Mit Paketen! Def.: Ein Paket ist ein Behälter für Klassen, Schnittstellen und weitere Pakete. D.h. man kann Pakete schachteln (packages can be nested). Anmerkung: Ein Paket ist kein Modul, weil die Bedingung mit dem öffentlichen und dem privaten Teil nicht vollständig erfüllt ist (geschachtelte Pakete sind immer öffentlich und können nicht als privat gekennzeichnet werden). Fachbegriffe: Top-Paket, Name eines Pakets, voller Name eines Pakets, Wald von Paketen. Paketregel-1: Jede Klasse gehört zu genau einem Paket. (S. 425) S. 426, Beispiel-01 S. 426, Beispiel-02 Damit hat auch jede Klasse (nicht nur einen Namen sondern auch) einen vollen Namen: Der volle Name des Paketes gefolgt vom (einfachen) Namen der Klasse. Das namenlose Paket. Wird nur "beim Lernen und Ausprobieren" verwendet. "Ernsthafte Klassen" gehören alle zu einem Paket. Erreichbarkeit von Klassen in Paketen-mit-Namen Eine Klasse, die zu einem Paket gehört, ist entweder öffentlich (public) oder paketweit erreichbar. Anmerkung: Eine innerhalb einer anderen Klasse vereinbarte Klasse kann öffentlich, geschützt, paketweit erreichbar oder privat sein. Anmerkung: Die Klassen im namenlosen Paket sind immer nur paketweit erreichbar, egal ob ihre Vereinbarung mit public beginnt oder nicht. Grund: Klassen in einem Paket-mit-Namen können nicht auf Klassen in namenlosen Paket zugreifen, weil 1. steht in einer Klasse K in einem Paket P z.B. der einfache Klassenname MeineTestKlasse, dann bezeichet der ein Klasse im Paket P (sonst ist er falsch). 2. import-Befehle ohne Paket-Namen, z.B. import MeineTestKlasse; sind (seit Java 1.4) nicht mehr erlaubt. Grundlegende Vorstellung: Klassen haben mit zwei Baumstrukturen zu tun: 1. Dem Baum aller Klassen mit der beerbt-Relation 2. Dem Paket-Wald, in dem jede Klasse zu einem Paket gehört Wichtig-1: Diese beiden Strukturen sind völlig unabhängig voneinander Beispiel: Sei K2 eine Unterklasse von K1. Dann kann man K1 und K2 in dasselbe Paket tun, oder K1 in ein "Oberpaket" und K2 in ein "Unterpaket" tun, oder umgekehrt: K1 in ein "Unterpaket" und K2 in ein "Oberpaket", oder K1 in ein Paket P1 und K2 in ein anderes Paket P2, wobei die Pakete P1 und P2 nichts miteinander zu tun haben. Beuth Hochschule, TB3-IN3 13. SU Fr 07.01.11 WS10/11, Seite 58 Wichtig-2: Klassen, die sich in einem gemeinsamen Paket befinden, haben "Privilegien beim Zugriff auf einander", denn für sie sind auch paketweit erreichbare Elemente und Konstruktoren erreichbar. S. 434, Bild 17.1: Fünf Klassen in zwei Paketen K10 ist hier die "Zentralklasse", die anderen stehen "in allen möglichen Verhältnissen" zu K10: im selben Paket wie K10 ja ja nein nein beerbt K10 ja nein ja nein Klasse K11 K12 K21 K22 In der Klasse K10 sind 4 Elemente vereinbart. Wie heißen diese Elemente und warum heißen sie so? Dargestellt wird, welche dieser 4 Elemente aus K10 in den übrigen 4 Klassen erreichbar sind (z.B. ist in K22 nur noch das Element publicE erreichbar. Eindeutigkeit von vollen Paketnamen Wie schafft man es, dass die vollen Namen aller Java-Klassen eindeutig sind? Indem man Internetadressen (von Firmen) als Paketnamen verwendet (wobei man die Reihenfolge der einzelenen Bestandteile der Adresse umdreht von klein-zuerst auf groß-zuerst), z.B. so: de.beuth_hochschule.fb6.goethe de.beuth_hochschule.fb6.pr2_mb2 org.junit.rules org.junit.runners com.sun.crypto.provider com.sun.java.browser.plugin2.liveconnect.v1 Zur Entspannung: Wie lernt man? Ein simples Modell. Angenommen, Sie sollen 1024 kleine Einzelteile ("Perlen der Länge 1 Millimeter") zu einer ungefähr einen Meter langen Kette zusammenfügen. Dann können Sie folgendermaßen vorgehen: 1. Sie verbinden je zwei Einzelteile zu einem 2-er-Teil. Das sind 500 Arbeitsschritte. Sie sehen kaum einen Fortschritt, weil ein 2-er-Teil nicht viel länger aussieht als ein Einzelteil. 2. Sie verbinden je zwei 2-er-Teile zu einem 4-er-Teil. Das sind 250 Arbeitsschritte. Immer noch ist kaum ein Fortschritt zu sehen, denn die 4-er-Teile sind noch sehr kurz im Vergleich zum ein Meter langen Endergebnis. 3. Sie verbinden je zwei 4-er-Teile zu einem 8-er-Teil. 125 Arbeitsschritte. ... 9. Sie verbinden je zwei 256er-Teile zu einem 512er-Teil (2 Arbeitsschritte). Die Ergebnisse sind immer noch viel kürzer als das Endergebnis. 10. Sie verbinden zwei 512er-Teile zu einem 1024er-Teil. Das ist nur ein einziger Arbeitsschritt, aber der Fortschritt ist beeindruckend: Aus 50 Zentimeter langen Teilen wird ein 100 Zentimeter langes Ganzes. Falls beim Lernen in unseren Gehirnen etwas (entfernt) Ähnliches abläuft, dann muss man sehr geduldig sein: Erst ganz am Ende eines komplizierten Lernvorgangs sieht man einen "großen Fortschritt". Der letzte Schritt eines Lernvorgangs ist manchmal ein so genanntes Aha-Erlebnis. Beuth Hochschule, TB3-IN3 Stichworte WS10/11, Seite 59 Wiederholungsfragen, 14. SU, Fr 14.01.11 1. Schon in der ersten Version von Java gab es Pakete (engl. packages). Welches Problem wollte man damit lösbar machen? 2. Was kann ein Paket alles enthalten? 3. Was ist ein Top-Paket? 4. Was für eine (in der Informatik häufig vorkommende) Struktur bildet ein Top-Paket mit allem, was darin enthalten ist? 5. Was für eine Struktur bilden alle Pakete zusammen? 6. Angenommen, Sie haben eine Firma mit der Internetadresse www.MacroHard.com. Wie sollte das Paket heißen, in dem sich alle von Ihrer Firma entwickelten Pakete, Klassen und Schnittstellen befinden? Zur Erinnerung: Jede Klasse, jede Schnittstelle und jedes Paket hat einen einfachen Namen (z.B. String oder Serializable oder javax) 7. Woraus besteht der volle Name eines Top-Paketes? (Die Antwort ist ziemlich einfach) 8. Woraus besteht der volle Name eines Paketes p1, welches sich in einem Paket p2 befindet? 9. Woraus besteht der volle Name einer Klasse k1, die zu einem Paket p1 gehört? 10. Angenommen, eine öffentliche (public) Klasse k1 gehört zu einem Paket p1 und in der Klasse k1 wird ein geschütztes Element (protected member) namens otto vereinbart. Beschreiben Sie alle Klassen, innerhalb derer man auf otto zugreifen kann. Beuth Hochschule, TB3-IN3 13. SU Fr 07.01.11 WS10/11, Seite 60 Rückseite der Wiederholungsfragen, 14. SU, Fr 14.01.11 Klassische (d.h. veraltete) Programmstruktur mit selbsgebauter Ausnahmebehandlung Ein paar Befehle für den Normalfall Ein paar Befehle für Ausnahmefälle Ein paar Befehle für den Normalfall Ein paar Befehle für Ausnahmefälle ... Dieses Zebramuster erschwert das Lesen und Verstehen der Befehle. Neuere Programmstruktur mit speziellen Ausnahme-Behandlungsbefehlen Neuere Programmiersprachen (z.B. C++, Ada, Java, C# etc.) enthalten spezielle Befehle zur Behandlung von Ausnahmefällen. Diese Befehle sollen es dem Programmierer möglich machen, die Befehle für den Normalfall zu trennen von den Befehlen für die einzelnen Ausnahmefälle. Anstelle eines Zebra-Musters kann man damit (stark vereinfacht dargestellt) etwa folgendes Muster realisieren: Ein paar Befehle für den Normalfall Ein paar Befehle für den Normalfall ... Ein paar Befehle für Ausnahmefälle Ein paar Befehle für Ausnahmefälle ... Beuth Hochschule, TB3-IN3 Stichworte WS10/11, Seite 61 Antworten zu den Wiederholungsfragen, 14. SU, Fr 14.01.11 1. Schon in der ersten Version von Java gab es Pakete (engl. packages). Welches Problem wollte man damit lösbar machen? Man will in einem Java-Programm Klassen verwenden, die von verschiedenen Firmen entwickelt wurden und zum Teil gleich heißen (z.B. drei Klassen namens Test). Pakete machen es möglich, dass man solche Klassen problemlos in einem Programm verwenden kann (weil die vollen Namen der Klassen sich unterscheiden). 2. Was kann ein Paket alles enthalten? Klassen, Schnittstellen und Pakete. 3. Was ist ein Top-Paket? Ein Paket, welches nicht in einem anderen Paket enthalten ist. 4. Was für eine (in der Informatik häufig vorkommende) Struktur bildet ein Top-Paket mit allem, was darin enthalten ist? Einen Baum. 5. Was für eine Struktur bilden alle Pakete zusammen? Einen Wald. 6. Angenommen, Sie haben eine Firma mit der Internetadresse www.MacroHard.com. Wie sollte das Paket heißen, in dem sich alle von Ihrer Firma entwickelten Pakete, Klassen und Schnittstellen befinden? com.macrohard Zur Erinnerung: Jede Klasse, jede Schnittstelle und jedes Paket hat einen einfachen Namen (z.B. String oder Serializable oder javax) 7. Woraus besteht der volle Name eines Top-Paketes? (Die Antwort ist ziemlich einfach) (Nur) aus dem einfachen Namen des Pakets (z.B. javax). 8. Woraus besteht der volle Name eines Paketes p1, welches sich in einem Paket p2 befindet? Aus dem vollen Namen von p2, gefolgt von einem Punkt ".", gefolgt vom einfachen Namen von p1. 9. Woraus besteht der volle Name einer Klasse k1, die zu einem Paket p1 gehört? (z.B. java.util.logging) Aus dem vollen Namen von p1, gefolgt von einem Punkt ".", gefolgt vom einfachen Namen von k1 (z.B. java.lang.String) 10. Angenommen, eine öffentliche (public) Klasse k1 gehört zu einem Paket p1 und in der Klasse k1 wird ein geschütztes Element (protected member) namens otto vereinbart. Beschreiben Sie alle Klassen, innerhalb derer man auf otto zugreifen kann. Alle Klassen, die zum Paket p1 gehören, und alle Klassen, die k1 beerben. Beuth Hochschule, TB3-IN3 14. SU Fr 14.01.11 WS10/11, Seite 62 14. SU Fr 14.01.11 A. Wiederholung B. Organisation Ausnahmen Bei sehr vielen Programmen kann man zwei Arten von Befehlsfolgen unterscheiden: Solche für den Normalfall Solche für Ausnahmefälle Dabei ist Ausnahmefall kein exakt definierter Begriff, kann aber durch typische Beispiele erläutert werden, siehe Buch, S. 362, unten. Erfahrung vieler Programmierer: 1. Die Befehlesfolge für den Normalfall ist oft relativ einfach und relativ kurz. 2. Die Befehlsfolgen für die verschiedenen Ausnahmefälle sind zahlreich, relativ schwer zu schreiben ("Was soll man bloß machen, wenn ein bestimmte Ausnahmefall eintritt?") und lang. In älteren Programmiersprachen (Fortran, Cobol, ..., bis etwa C und Pascal) gab es keine speziellen Befehle zum Behandeln von Ausnahmefällen. Programme in diesen Sprachen bilden deshalb häufig eine Art Zebra-Muster: Ein paar Befehle für den Normalfall Ein paar Befehle für Ausnahmefälle Ein paar Befehle für den Normalfall Ein paar Befehle für Ausnahmefälle ... Die Befehle für den Normalfall waren häufig Aufrufe von Unterprogrammen. Nach dem Aufruf eines Unterprogramms wurde dann geprüft, ob während der Ausfühung eine Ausnahme erkannt wurde. Diese Zebramuster erschweren das Lesen und Verstehen der Befehle. Um zu erkennen, was im Normalfall passiert, muss man bestimmte Befehle berücksichtigen und andere überspringen. Und für die Ausnahmefälle gilt das Gleiche. Neuere Programmiersprachen (z.B. C++, Ada, Java, C# etc.) enthalten spezielle Befehle zur Behandlung von Ausnahmefällen. Diese Befehle sollen es dem Programmierer möglich machen, die Befehle für den Normalfall zu trennen von den Befehlen für die einzelnen Ausnahmefälle. Anstelle eines Zebra-Musters kann man damit (stark vereinfacht dargestellt) etwa folgendes Muster realisieren: Ein paar Befehle für den Normalfall Ein paar Befehle für den Normalfall ... Ein paar Befehle für Ausnahmefälle Ein paar Befehle für Ausnahmefälle ... In Java gibt es zum Behandlen von Ausnahmen folgende Konstrukte: - Ausnahmeklassen (alle Unterklassen der Klasse Throwable) - Ausnahmeobjekte (Objekte von Ausnahmeklassen) - den throw-Befehl (mit dem man ein Ausnahmeobjekt werfen kann) - die throws-Klausel ("Vorsicht, Ausnahmen" etwa wie "Vorsicht, Steinschlag") - den try-catch-Befehl (evtl. verlängert zu try-catch-finally) Statt einer präzisen Definition: Beispiele für typische Ausnahmen: S. 362/363 Beuth Hochschule, TB3-IN3 Stichworte WS10/11, Seite 63 S. 363, Beispiel-01: Ein gefährlicher Befehl: Die Ganzzahldivision S. 364, Beispiel-02: Ein gefährlicher Befehl: parseInt S. 365, Beispiel-01: Eine gefährliche Methode S. 366, Beispiel-02: Ausnahmen fangen und behandeln (mit einem try-catch-Befehl) Ein try-Block kann auf zwei Weisen zu Ende gehen: Wenn keine Ausnahme auftritt: normales Ende. Wenn eine Ausnahme auftritt: Abbruch des try-Block und ... . Zur Entspannung: Was ist grundsätzlich falsch an verbreiteten Betriebssystemen wie Windows und Linux? Ältere Betriebssysteme wie Windows und Linux sind grundsätzlich unsicher, weil sie in C geschrieben sind und im Prinzip die Installation beliebiger Programme erlauben, auch solcher, die "sehr böse Befehle enthalten". Es ist sehr aufwendig, sich vor solchen Programmen zu schützen. Android ist teilweise in C geschrieben, erlaubt aber grundsätzlich nur die Installation von Java-Programmen. Java enthält keine "bösen Befehle". Android ist quelloffen (open source). Moral: Zwischen die Hardware und Programme gehört eine Sofware-Schicht (HAL: Hardware Abstraction Layer, oder eine Virtuelle Maschine, oder eine Sicherheits-Schicht). iOS ist ein Unix-Nachfolger und in C geschrieben. Das iOS wird vollständig von der Firma Apple kontrolliert. Unter iOS laufen nur Programme, die von Apple "genehmigt" wurden. Apple hat ein starkes Interesse daran, nur "sichere Programme" zu genehmigen. Diese starke Kontrolle ist zweischneidig. Beuth Hochschule, TB3-IN3 14. SU Fr 14.01.11 WS10/11, Seite 64 Wiederholungsfragen, 15. SU, Fr 21.01.11 1. Was passiert, wenn der Java-Ausführer folgende Befehle ausführt: 1 2 double a = 17.5, b = -0.0; double c = a / b; 2. Was passiert, wenn der Java-Ausführer folgende Befehle ausführt: 3 4 int int d = 17, e = 0; f = d / e; 3. Was passiert, wenn der Java-Ausführer den folgenden Befehl ausführt: 5 pln(Integer.parseInt("-123")); 4. Was passiert, wenn der Java-Ausführer den folgenden Befehl ausführt: 6 pln(Integer.parseInt("+123")); 5. Woraus besteht ein try-catch-Befehl? Geben Sie insbesondere genau an, wie oft die einzelnen Bestandteile vorkommen dürfen. 6. Welche Frage stellt sich der Java-Ausführer immer dann, wenn er gerade eine Ausnahme geworfen hat? (Die Frage ist ein bisschen kompliziert, aber da der Java-Ausführer sie sich häufig stellt, sollte man sie genau kennen) 7. Was macht der Ausführer, wenn die Antwort auf die Frage (siehe 5.) "nein" ist? 8. Was macht der Ausführer, wenn die Antwort auf die Frage (siehe 5.) "ja" ist? 9. Was passiert, wenn (während der Ausführung eines Java-Programms) eine Ausnahme geworfen, aber nirgends gefangen wird? Beuth Hochschule, TB3-IN3 Stichworte WS10/11, Seite 65 Rückseite der Wiederholungsfragen, 15. SU, Fr 21.01.11 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 // Datei Window01.java /* -----------------------------------------------------------------------Dieses Grabo-Programm zeigt ein Fenster mit einem Knopf darin. ------------------------------------------------------------------------ */ import java.awt.Frame; import java.awt.Button; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; class Window01 extends Frame { // --------------------------------------------------------------------// Ein Listener fuer den Fenster-Schliessen-Knopf: static class ProgTerminator extends WindowAdapter { public void windowClosing(WindowEvent we) { pln("Dies Programm beendet sich!"); System.exit(0); // Programm beenden } } // class ProgTerminator static ProgTerminator arnold = new ProgTerminator(); // --------------------------------------------------------------------// Ein Listener fuer den knopf: static int nr = 1; static class AktionsBehandler implements ActionListener { public void actionPerformed(ActionEvent ae) { pln("Jetzt mach ich gleich was!"); Button b = (Button) ae.getSource(); // Ereignis-Quelle? b.setLabel("Knopf " + nr++); // Text des Knopfes aendern } } // class AktionsBehandler static AktionsBehandler alfred = new AktionsBehandler(); // --------------------------------------------------------------------public Window01(String titel) { super(titel); this.setBounds(400, 300, 200, 100); // Groesse und Pos. Fenster Button knopf = new Button("Knopf " + nr++); // Knopf erzeugen knopf.addActionListener(alfred); // ActionListener anmelden this.add(knopf); // Knopf ins Fenster this.addWindowListener(arnold); // WindowListener anmelden setVisible(true); } // Konstruktor Window01 // --------------------------------------------------------------------static public void main(String[] _) { pln("Window01: Jetzt geht es los!"); Window01 w = new Window01("Mein Fenster"); // Ein Window01 erzeugen pln("Window01: Das war's erstmal!"); } // main // --------------------------------------------------------------------// Eine Methode mit einem kurzen Namen: static void pln(Object ob) {System.out.println(ob);} // --------------------------------------------------------------------} // class Window01 Beuth Hochschule, TB3-IN3 14. SU Fr 14.01.11 WS10/11, Seite 66 Antworten zu den Wiederholungsfragen, 15. SU, Fr 21.01.11 1. Was passiert, wenn der Java-Ausführer folgende Befehle ausführt: 1 2 double a = 17.5, b = -0.0; double c = a / b; Der Variablen c wird der Wert Double.NEGATIVE_INFINITY zugewiesen. 2. Was passiert, wenn der Java-Ausführer folgende Befehle ausführt: 3 4 int int d = 17, e = 0; f = d / e; Der Ausführer wirft eine Ausnahme des Typs ArithmeticException. 3. Was passiert, wenn der Java-Ausführer den folgenden Befehl ausführt: 5 pln(Integer.parseInt("-123")); Die Zahl -123 wird zur Standardausgabe ausgegeben. 4. Was passiert, wenn der Java-Ausführer den folgenden Befehl ausführt: 6 pln(Integer.parseInt("+123")); Der Ausführer wirft eine Ausnahme des Typs NumberFormatException. 5. Woraus besteht ein try-catch-Befehl? Geben Sie insbesondere genau an, wie oft die einzelnen Bestandteile vorkommen dürfen. Aus einem try-Block und einem oder mehr catch-Blöcken. 6. Welche Frage stellt sich der Java-Ausführer immer dann, wenn er gerade eine Ausnahme a geworfen hat? (Die Frage ist ein bisschen kompliziert, aber da der Java-Ausführer sie sich häufig stellt, sollte man sie genau kennen) Trat a in einem try-Block auf, dem ein zum Fangen von a geeigneter catch-Block folgt? 7. Was macht der Ausführer, wenn die Antwort auf die Frage (siehe 5.) "nein" ist? Die Ausführung der aktuellen Methode (das ist die, die gerade ausgeführt wird) wird abgebrochen, der Ausführer kehrt an die Aufrufstelle der Methode zurück und wirft die Ausnahme dort erneut. 8. Was macht der Ausführer, wenn die Antwort auf die Frage (siehe 5.) "ja" ist? Der Ausführer führt den entsprechenden catch-Block aus, und damit ist dann der gesamte try-catch-Befehl fertig ausgeführt. 9. Was passiert, wenn (während der Ausführung eines Java-Programms) eine Ausnahme geworfen, aber nirgends gefangen wird? Die Ausführung des betreffenden Programms wird abgebrochen und eine (manchmal umfangreiche) Fehlermeldung wird ausgegeben. Beuth Hochschule, TB3-IN3 Stichworte WS10/11, Seite 67 15. SU Fr 21.01.11 A. Wiederholung B. Organisation: Der nächste SU (am Fr 28.01.2011) findet nicht hier im B554 statt, sondern im Raum D121 (im Haus Bauwesen). Schnittstellen Das Profil einer Methode besteht aus dem Rückgabetyp der Methode, dem Namen der Methode und den Typen ihrer Parameter. Eine Schnittstelle enthält 0 oder mehr Profile von öffentlichen Objektmethoden. S. 341, Beispiel-01: Die Schnittstelle Vergroesserbar Eine Klasse kann beliebig viele (0 oder mehr) Schnittstellen implementieren S. 343, Beispiel-03: Die Klasse GanzZahl02 implementiert zwei Schnittstellen Eine Schnittstelle definiert (ähnlich wie eine Klasse) einen Typ. Objekte der Klasse GanzZahl02 gehören zu den folgenden drei Typen: GanzZahl02, Vergroesserbar, Verkleinerbar (weil die Klasse die beiden Schnittstellen implementiert). In einer Reihung des Typs Vergroesserbar[] kann man Objekte ganz verschiedener Klassen speichern, die Klassen müssen nur die Schnittstelle Vergroesserbar implementieren. Eine Methode mit einem Parameter des Typs Vergroesserbar kann man auf Objekte ganz verschiedener Klassen anwenden, die Klassen müssen nur die Schnittstelle Vergroesserbar implementieren. S. 345, Beispiel-07: Die Methode reihungVervierfachen Grabos, ganz kurz Eine Grabo (grafische Benutzeroberfläche) besteht aus Grabo-Objekten. Für jedes Grabo-Objekt ist eine grafische Darstellung festgelegt (z.B. als Fenster oder als Knopf oder ...) und wenn man ein Grabo-Objekt erzeugt, wird es (mehr oder weniger automatisch) auf dem Bildschirm dargestellt. Der Benutzer kann Aktionen ausführen. Genauer: Er kann mit den grafischen Darstellungen der GraboObjekte interagieren (z.B. die Maus über ein Fenster bewegen, einen Knopf anklicken, ...). Solche Aktionen bewirken, dass von dem betreffenden Grabo-Objekt (dem Fenster oder dem Knopf oder ...) ein Ereignis erzeugt wird. Ereignisse sind historisch, d.h. sie werden zu einem bestimmten Zeitpunkt von einem bestimmten Grabo-Objekt erzeugt. Ereignisse sind nicht wiederholbar. Ereignisse werden zu Arten von Ereignissen zusammengefaßt und Arten zu Oberarten (die Tabelle auf S. 547 enthält Beispiele). Jeder Oberart von Ereignissen ist eine sog. Listener-Schnittstelle zugeordnet (z.B. WindowListener, MouseListener, ...). Die Listener-Schnittstelle enthält für jede Ereignisart, die zu der Oberart gehört, eine entsprechende Methode. Wir verwenden die Namen dieser Methoden auch dazu, um die Ereignisarten zu bezeichnen. Beispiel-A: Zur Ereignisoberart Mausbewegungsereignis gehören zwei Ereignisarten: mouseDragged und mouseMoved. Der Ereignisoberart Mausbewegungsereignis ist die Schnittstelle MouseMotionListener zugeordnet. Sie enthält zwei Methoden namens mouseDragged und mouseMoved. Alle Listener-Schnittstellen sind Erweiterungen der (leeren) Schnittstelle EventListener. Zur Zeit gibt es in Java etwa 70 Listener-Schnittstellen (und somit etwa 70 Ereignisoberarten). Beuth Hochschule, TB3-IN3 15. SU Fr 21.01.11 WS10/11, Seite 68 Eine Klasse, die eine bestimmte Listener-Schnittstelle implementiert, bezeichnet man auch als Listener-Klasse, und ihre Objekte als Listener-Objekte. Beispiel-B: Eine MouseMotionListener-Klasse und ein MouseMotionListener-Objekt: 1 2 3 4 5 6 7 8 9 10 11 12 class Schuhmacher implements MouseMotionListener { public void mouseDragged(MouseEvent me) { ... } public void mouseMoved(MouseEvent me) { ... } } // class Schuhmacher Schuhmacher michael = new Schuhmacher(); Die Methoden in einem Listener-Objekt bezeichnet man auch als Behandler-Methoden, da sie zur Behandlung von Ereignissen einer bestimmten Art dienen sollen (z.B. soll die Methode mouseDragged zur Behandlung von Ereignissen der Art mouseDragged dienen etc.). Jedes Grabo-Objekt enthält bestimmte Methoden, deren Namen aus "add" und dem Namen einer Listener-Schnittstelle bestehen, z.B. so: addWindowListener, addMouseListener, addMouseMotionListener, ... Mit diesen Methoden kann man entsprechende Listener-Objekte bei dem Grabo-Objekt anmelden. Sei grob irgendein Grabo-Objekt (z.B. ein Window-Objekt oder ein JFrame-Objekt oder ...): 13 grob.addMouseMotionListener(michael); Wenn nach dieser Anmeldung das Objekt grob ein Mausbewegungsereignis erzeugt (weil der Benutzer mit der grafischen Darstellung von grob entsprechend interagiert hat), dann wird die entsprechende Methode michael.mouseDragged bzw. michael.mouseMoved ausgeführt. Beuth Hochschule, TB3-IN3 Stichworte WS10/11, Seite 69 Wiederholungsfragen, 16. SU, Fr 28.01.11 1. Betrachten Sie die folgenden drei Methodenvereinbarungen: 1 2 3 public static void main(String[] sonja) { ... } int add(int a, int b) { ... } static protected add(int param1, int param2) { ... } Geben Sie von jeder dieser Methoden das Profil an. 2. Eine Schnittstelle (engl. interface) enthält Profile. Geben Sie alle Profile an, die in der Schnittstelle ActionListener enthalten sind. 3. Zu welchen Listener-Schnittstellen gibt es keine entsprechende Adapter-Klasse? Sie sollen das allgemeine Kriterium beschreiben und nicht nur Beispiele angeben. 4. In einer Adapter-Klasse sind bestimmte (öffentliche Objekt-) Methoden vereinbart. Was machen diese Methoden? 5. Welche grundlegende, charakteristische Eigenschaft haben alle Ereignisse? 6. Geben Sie die Namen von zwei Ereignisarten an. 7. Geben Sie die Namen von zwei Ereignisoberarten an. Beuth Hochschule, TB3-IN3 15. SU Fr 21.01.11 WS10/11, Seite 70 Rückseite der Wiederholungsfragen, 16. SU, Fr 28.01.11 Die Zahl π mit Hilfe von Zufallszahlen berechnen Für viele Probleme ist es sehr aufwendig, eine exakte Lösung zu berechnen. Für einige dieser Probleme kann man unter Verwendung von Zufallszahlen mit viel weniger Aufwand eine Näherungslösung berechnen. Beispiel: Die Berechnung der Kreiszahl π mit Hilfe von zufälligen Regentropfen: x Quadrat mit Fläche fq = 1.0 1.0 Viertelkreis mit Fläche fv = PI / 4.0 0.0 y 0.0 1.0 Ein Quadrat mit der Kantenlänge 1.0 hat eine Fläche fq von ... (wo ist bloß mein Taschenrechner??) von 1.0. Ein Kreis mit dem Radius 1.0 hat eine Fläche von π, ein Viertelkreis davon hat somit eine Fläche fv gleich π/4.0 (siehe obige Skizze). Angenommen, in das Quadrat fallen tiq ("Tropfen ins Quadrat") viele Regentropfen und tiv viele davon landen im Viertelkrei. Dann gilt: fv / fq = tiv / tiq Pi / 4.0 / 1.0 = tiv / tiq Pi = tiv / tiq * 4.0 Die folgenden Befehle berechnen einen Näherungswert für die Zahl PI: 4 5 6 7 8 9 10 11 12 13 14 15 16 17 Random rand = new Random(123); int tiq = 10*1000*1000; double tiv = 0; // Keim (seed) 123 // Tropfen die ins Quadrat fallen // Tropfen die im Viertelkreis landen for (int i=1; i<=tiq; i++) { // double x = rand.nextDouble(); // double y = rand.nextDouble(); // if (Math.sqrt(x*x + y*y) <= 1.0) } tiq viele Tropfen fallen lassen Zufallszahl aus [0.0 .. 1.0) Zufallszahl aus [0.0 .. 1.0) tiv++; // Treffer im Viertelkreis // Aus tiv und tiq einen Naeherungswert fuer pi berechnen und ausgeben: pln("Hier:Pi ist gleich " + (tiv / tiq * 4.0)); // Zum Vergleich einen *guten* Naeherungswert fuer PI ausgeben: pln("Math.PI ist gleich " + Math.PI); Ausgabe dieser Befehlsfolge: 18 19 Hier:Pi ist gleich 3.141918 Math.PI ist gleich 3.141592653589793 Beuth Hochschule, TB3-IN3 Stichworte WS10/11, Seite 71 Antworten zu den Wiederholungsfragen, 16. SU, Fr 28.01.11 1. Betrachten Sie die folgenden drei Methodenvereinbarungen: 1 2 3 public static void main(String[] sonja) { ... } int add(int a, int b) { ... } static protected add(int param1, int param2) { ... } Geben Sie von jeder dieser Methoden das Profil an. 1 2 3 void main String[] int add int int int add int int 2. Eine Schnittstelle (engl. interface) enthält Profile. Geben Sie alle Profile an, die in der Schnittstelle ActionListener enthalten sind. Die Schnittstelle ActionListener enthält nur ein Profil: public void actionPerformed(ActionEvent ae); 3. Zu welchen Listener-Schnittstellen gibt es keine entsprechende Adapter-Klasse? Sie sollen das allgemeine Kriterium beschreiben und nicht nur Beispiele angeben. Zu den Listener-Schnittstellen, die nur ein Profil enthalten. 4. In einer Adapter-Klasse sind bestimmte (öffentliche Objekt-) Methoden vereinbart. Was machen diese Methoden? Sie machen nichts. 5. Welche grundlegende, charakteristische Eigenschaft haben alle Ereignisse? Ereignisse sind historisch, d.h. sie sind grundsätzlich unwiederholbar. 6. Geben Sie die Namen von zwei Ereignisarten an. windowOpened, windowClosing, windowClosed, ..., mouseClicked, mousePressed, ..., mouseWheelMoved, actionPerformed, ... 7. Geben Sie die Namen von zwei Ereignisoberarten an. Fensterereignis, Mausereignis, Mausbewegungsereignis, Mausradereignis, Aktionsereignis, ... Beuth Hochschule, TB3-IN3 16. SU Fr 28.01.11 WS10/11, Seite 72 16. SU Fr 28.01.11 A. Wiederholung B. Organisation: Der 17. SU am Fr 04.02.11 soll vor allem dazu dienen, Fragen der TeilnehmerInnen (die z.B. beim Wiederholen des Stoffs für die Klausur aufgetreten sind) zu behandeln. Schnittstellen und Profile: Eine Korrektur Beim letzten SU habe ich gesagt: Eine Schnittstelle enthält eine Menge von Profilen. Das war nicht (ganz) richtig. Richtig ist: Eine Schnittstelle enthält eine Menge von öffentlichen, abstrakten Objektmethoden (und kann außerdem öffentliche, konkrete Klassenkonstanten enthalten, siehe S. 348, Beispiel-01). Eine abstrakte Objektmethode hat (noch) keinen Rumpf (und statt des Rumpfes { ... } notiert man nur ein Semikolon ; ). Abstrakte Methoden sind immer Objektmethoden (es gibt keine abstrakten Klassenmethoden). 15.2 Flugregeln für Ausnahmen (S. 369) Die Rolle des Stapels (oder: des Kellers, engl. stack) bei der Ausführung von Unterprogrammen. 15.3 Der try-catch-finally-Befehl (S. 373) 15.5 Geprüfte und ungeprüfte Ausnahmen (S. 377) Die throws-Klausel und die throws-Anweisung 15.7 Übersicht über ein paar wichtige Ausnahmeklassen (S. 382) Zur Entspannung: Die Kreiszahl π mit Hilfe von zufälligen Regentropfen berechnen Siehe Rückseite der Wiederholungsfragen. Beuth Hochschule, TB3-IN3 Stichworte WS10/11, Seite 73 Wiederholungsfragen, 17. SU, Fr 04.02.11 1. Wie heißt (in Java) die oberste Ausnahmeklasse? 2. Wie heißen die beiden Unterklassen der obersten Ausnahmeklasse? 3. Welche von diesen beiden Unterklassen ist geprüft und welche ist ungeprüft? Betrachten Sie die folgende Klassenvereinbarung: 1 import java.io.FileReader; 2 3 class Ausnahme02 { 4 static public void main(String[] _) { 5 FileReader fr = new FileReader("MeineDatei17"); 6 } // main 7 } Wenn man diese Vereinbarung dem Java-Ausführer von Sun übergibt, lehnt er sie ab, und zwar mit folgender Fehlermeldung: D:\meineDateien\Java\Ausnahme02.java:5: unreported exception java.io.FileNotFoundException; must be caught or declared to be thrown FileReader fr = new FileReader("MeineDatei17"); ^ 4. Was ist FileReader("MeineDatei17") (in Zeile 5 und in der Fehlermeldung) für ein Ding? Die Vereinbarung einer Methode? Ein Aufruf einer Funktion? Die Vereinbarung eines Konstruktors? Ein Aufruf eines Konstruktors? Ein Aufruf einer Methode? Eine Anweisung? 5. Was sagt die Fehlermeldung über den Befehl FileReader("MeineDatei17") ? Warum akzeptiert der Ausführer diesen Befehl nicht einfach so? Die Fehlermeldung schägt Ihnen 2 Korrekturmöglichkeiten vor ("must be caught" oder "[must be] declared to be thrown"). 6. Korrigieren Sie die Vereinbarung der Klasse Ausnahme02 nach der zweiten vorgeschlagenen Korrekturmöglichkeit ("[must be] declared to be thrown"). Anmerkung: Es ist nicht verboten, vorher im Buch auf Seite 378 das Beispiel-01 anzusehen. 7. Korrigieren Sie die Vereinbarung der Klasse Ausnahme02 nach der ersten vorgeschlagenen Korrekturmöglichkeit ("must be caught"). Beuth Hochschule, TB3-IN3 16. SU Fr 28.01.11 WS10/11, Seite 74 Antworten zu den Wiederholungsfragen, 17. SU, Fr 04.02.11 1. Wie heißt (in Java) die oberste Ausnahmeklasse? Throwable 2. Wie heißen die beiden Unterklassen der obersten Ausnahmeklasse? Error, Exception 3. Welche von diesen beiden Unterklassen ist geprüft und welche ist ungeprüft? Error ist ungeprüft, Exception ist geprüft. Betrachten Sie die folgende Klassenvereinbarung: 1 import java.io.FileReader; 2 3 class Ausnahme02 { 4 static public void main(String[] _) { 5 FileReader fr = new FileReader("MeineDatei17"); 6 } // main 7 } Wenn man diese Vereinbarung dem Java-Ausführer von Sun übergibt, lehnt er sie ab, und zwar mit folgender Fehlermeldung: D:\meineDateien\Java\Ausnahme02.java:5: unreported exception java.io.FileNotFoundException; must be caught or declared to be thrown FileReader fr = new FileReader("MeineDatei17"); ^ 4. Was ist FileReader("MeineDatei17") (in Zeile 5 und in der Fehlermeldung) für ein Ding? Die Vereinbarung einer Methode? Ein Aufruf einer Funktion? Die Vereinbarung eines Konstruktors? Ein Aufruf eines Konstruktors? Ein Aufruf einer Methode? Eine Anweisung? 5. Was sagt die Fehlermeldung über den Befehl FileReader("MeineDatei17") ? Warum akzeptiert der Ausführer diesen Befehl nicht einfach so? Weil dieser Konstruktoraufruf evtl. eine Ausnahme (vom Typ FileNotFoundException) wirft. Die Fehlermeldung schägt Ihnen 2 Korrekturmöglichkeiten vor ("must be caught" oder "[must be] declared to be thrown"). 6. Korrigieren Sie die Vereinbarung der Klasse Ausnahme02 nach der zweiten vorgeschlagenen Korrekturmöglichkeit ("[must be] declared to be thrown"). 3 class Ausnahme02 throws java.io.FileNotFoundException { ... wie oben ... } Anmerkung: Es ist nicht verboten, vorher im Buch auf Seite 378 das Beispiel-01 anzusehen. 7. Korrigieren Sie die Vereinbarung der Klasse Ausnahme02 nach der ersten vorgeschlagenen Korrekturmöglichkeit ("must be caught"). 3 class Ausnahme02 { 4 static public void main(String[] _) { 5 try { 6 FileReader fr = new FileReader("MeineDatei17"); 7 } catch (java.io.FileNotFoundException ex) { 8 pln("Ausnahme: " + ex); 9 } 10 } // main 11 } Beuth Hochschule, TB3-IN3 Stichworte WS10/11, Seite 75 17. SU Fr 04.02.11 A. Wiederholung B. Organisation: Wer bis heute weniger als 9 Tests bestanden hat (mit 5 oder mehr Punkten) ist nicht zur Klausur (und nicht zur Nachklausur) zugelassen. Von dieser Regel gibt es eine Ausnahme. Wer bis heute nur 9 Tests bestanden hat, kann heute in der Übung einen (von mir ausgewählten) Zusatztest schreiben und hat damit eine Chance, auf 10 bestandene Tests zu kommen. Wer bis heute 10 oder mehr Tests bestanden hat, ist zur Klausur (und Nachklausur) zugelassen. Wer nicht sicher ist, wie viele Tests er bestanden hat, kann das heute klären (indem er mit mir in meine Punkte-und-Noten-Liste schaut). Zur Organisation der Klausur Als Unterlagen darf jeder mitbringen: 5 Blätter, max. DIN A 4, Beschriftung beliebig Bringen Sie zusätzlich ausreichend viele (z.B. 20) leere Blätter Papier mit (für ihre Lösungen). Sehr gut geeignet ist kariertes, ganz weißes, "radierfestes" Papier, kein graues Umweltpapier! Sie können schon zu Hause einige der leeren Blätter (z.B. rechts oben) mit ihrem Nachnamen kennzeichnen (weitere Angaben wie Vorname, Kragenweite, Matrikelnr, Schuhgröße etc. sind erlaubt, aber nicht nötig). Am Ende der Klausur sollte jedes Blatt, das sie abgeben, mit ihrem Nachnamen gekennzeichnet sein. Während der Klausur: Schreiben Sie zuerst ihren Vor- und Nachnamen auf das ausgeteilte Blatt mit den Klausuraufgaben und machen Sie hinter "Diese Klausur ist mein letzter Prüfungsversuch!" an der richtigen Stelle (bei Ja bzw. Nein) ein Kreuzchen. Schreiben Sie jede Lösung einer Aufgabe auf ein neues Blatt (nicht mehrere Lösungen auf dasselbe Blatt). Beschreiben Sie von ihren Blättern nur die Vorderseiten und lassen sie die Rückseiten leer. Es gibt 6 Aufgaben. Normalerweise sollte jede Lösung einer Aufgabe auf eine Seite passen. Aber wenn sie mehr Platz benötigen, dann schreiben Sie die Lösung auf die Vorderseiten von mehreren Blättern. Ziel: Es soll möglich sein, ihre Lösungen so auf einen Tisch zu legen, dass man sie alle und vollständig sehen kann, ohne Blätter rumdrehen zu müssen. Tip: Überfliegen Sie erstmal alle Aufgaben, damit Sie ein Gefühl dafür bekommen, welche sie leichter und welche sie schwerer finden. Lösen Sie dann die Aufgaben in aufsteigender Reihenfolge ihrer Schwierigkeit (erst die einfachste, dann die zweiteinfachste etc.). Bevor sie daran gehen, eine bestimmte Aufgabe zu lösen, sollten sie den Text der Aufgabe vollständig durchlesen (bis zum letzten Punkt!). Möglicherweise müssen sie bestimmte Stellen des Textes mehrmals lesen, um sie zu verstehen. Prüfen Sie dann, ob sie die Aufgabe unzweifelhaft verstanden haben. Wenn sie unsicher sind, wie die Aufgabe "gemeint ist" oder "verstanden werden sollte", dann heben sie ihren linken Arm. Ich komme dann zu ihnen und sie können Fragen der Art "Ist das hier so gemeint?" stellen. Insgesamt haben sie 90 Minuten für 6 Augaben. Das sind etwa 15 Minuten pro Aufgabe. Rückgabe der Klausur: Fr 11.02.2011, 10 Uhr im SWE-Labor Gibt es Fragen zum Stoff dieses Semester? Beuth Hochschule, TB3-IN3 17. SU Fr 04.02.11 WS10/11, Seite 76 Ein paar Bemerkungen zur Klausur: Es gibt 6 Aufgaben und insgesamt 100 Punkte. Für die ersten beiden Aufgaben gibt es je 20 Punkte, für die übrigen je 15 Punkte. Die Aufgaben 1 und 2 haben den gleichen Text: "Schreiben Sie eine Methode, die der folgenden Spezifikation entspricht: " Es schadet wahrscheinlich nicht, folgende Stoffgebiete gut zu beherrschen: Die Wiederholungsfragen (die im Laufe des Semesters gestellt wurden) Zahlensysteme (Fachbegriffe: Basiszahl, Ziffer, Stelle oder Position einer Ziffer, Wert einer Ziffer, Stellenwert einer Ziffer) und wie man mit Zahlen in Java umgehen kann. Reihungen (arrays) und Sammlungen (collections) Umgang mit den Standardklassen und Standardschnittstellen, die wir zum Lösen der Aufgaben benutzt haben (String, StringBuilder, ArrayList, JFrame, JCheckbox, WindowListener, WindowAdapter, ...) Literale (Sie sollten wissen, zu welchen Typen es in Java Literale gibt und sollten jedem Literal ansehen, zu welchem Typ es gehört). Grundlagen der Grabo-Programmierung Alle zusammengesetzten Anweisungen (if, switch, Schleifen, insbesondere foreach-Schleifen) Sie sollten (nicht zu lange) Befehlsfolgen mit Papier und Bleistift ausführen können. Sie sollten das Typensystem von Java kennen (primitive Typen, Referenztypen etc.) und sollten Variablen aller Typen als Bojen darstellen können. Zur Entspannung: Christian Morgenstern (1871-1914) Das Butterbrotpapier: Ein Butterbrotpapier im Wald / da es beschneit wird, fühlt sich kalt. ... Objektorientierte Programmierung, ein Nachtrag S. 295, Beispiel-01 Druckfehler korrigieren: statt pr[...] muss es überalle tab[...] heissen. Von welchem Typ ist die Variable tab (vereinbart in Zeile 2)? (Vom Typ Reihung von E01Punkt) Von welchen Typen sind die Objekte, die in der Reihung tab gespeichert werden (siehe Zeile 3 bis 8)? (Von den Typen E01Ellipse, E01Quadrat, E01Rechteck, E01Punkt) Das ist erlaubt, weil die Typen der Komponenten Untertypen von E01Punkt sind, d.h. weil jedes E01Ellipse-Objekt auch ein E01Punkt-Objekt ist und jedes E01Quadrat-Objekt auch ein E01Punkt-Objekt ist und ... . S. 296, Beispiel-02: Die Methode reihungAusgeben02(E01Punkt[], ... Üben Sie, beim Anblick dieser Methode (oder einer ähnlichen Methode) sofort Pickel zu bekommen (oder zumindest eine deutlich erkennbare Gänsehaut). So darf man in einer objektorientierten Sprache auf keinen Fall programmieren (obwohl die Methode in einem bestimmten Sinn korrekt ist und erstmal das macht, was sie machen soll) S. 298, Beispiel-03: Die Methode reihungAusgeben(E01Punkt[], ... So löst man das Problem objektorientiert! Objektorientierung dient (u.a.) dazu, Fallunterscheidungen wie im Beispiel-02 (Methode reihungAusgeben02) zu beseittigen bzw. zu vermeiden. Beuth Hochschule, TB3-IN3 Stichworte WS10/11, Seite 77 20 Steurfäden (threads of control) Die Java-Programme, die wir bisher geschrieben haben, waren sequentielle-Programme. Ein sequentielles-Programm wird von einem einzigen Java-Ausführer ausgeführt, und die einzelnen Befehle werden in einer genau festgelegten Reihenfolge ausgeführt. Es gibt Probleme, die man mit einem sequentiellen Problem nicht (wirklich, gut, elegant) lösen kann, z.B. das Problem, von zwei Tastaturen Zahlen einzulesen und zu verarbeiten. Einem Java-Ausführer A1 kann man den Befehl geben, einen weiteren Java-Ausführer A11 zu erzeugen und den eine bestimmte Methode m ausführen zu lassen. Das geht auch mehrfach: Der Ausführer A1 kann Ausführer A11, A12, A13, ... erzeugen. Und entsprechendes gilt für alle Ausführer. Z.B. kann der Ausführer A13 weitere Ausführer A131, A132, A133, ... erzeugen etc. All diese Ausführer arbeiten nebenläufig (engl. concurrently) zueinander, d.h. zeitlich unabhängig voneinander. Konkret: Wie schnell die einzelnen Ausführer relativ zueinander arbeiten ist nicht festgelegt und kann, wenn man ein bestimmtes Programm mehrmals ausführen läßt, von Ausführun zu Ausführung sehr verschieden sein. Wenn es nur um die Ausführung von Programmen geht (und nicht um das Prüfen, Akzeptieren bzw. Ablehnen von Programmen), spricht man üblicherweise nicht von Ausführern, sondern von Fäden (engl. threads). Fäden arbeiten nebenläufig zueinander. Ein sequentielles Java-Programm wird von nur einem Faden ausgeführt, und der heißt Faden main (weil es seine Aufgabe ist, die main-Methode auszuführen), oder Hauptfaden. Weitere Fäden heißen dann Thread-1, Thread-2, Thread-3, ... wenn der Programmierer ihnen nicht ausdrücklich einen anderen Namen gibt. S. 509: Zwei Ausgaben des Programms Faden05Tst Dies Programm wird (ausser vom Hauptfaden main) von zwei Fäden namens A und B ausgeführt. Jeder dieser beiden Fäden soll ein StringBuilder-Objekt namens text "mit seinem Namen" (A bzw. B) füllen. An den beiden Ausgaben kann man erkennen: Die beiden Fäden haben sich "beim Füllen von text" gegenseitig mehrmals unterbrochen (sonst stünden in jeder Zeile nur lauter As oder nur lauter Bs). Außerdem unterscheiden sich die beiden Ausgaben voneinander. Problem: Wenn ein Programm Fadenfehler enthält, dann kann es passieren, dass die bei einigen Ausführungen auftreten, aber bei anderen Ausführungen des selben Programm nicht auftreten. Deshalb sind sie im Allgemeinen viel schwerer zu finden, als Fehler in einem sequentiellen Programm. Wer Lust hat, kann weitere Einzelheiten selbst nachlesen. Merke: Das Programmieren von Fäden ist erstaunlich schwierig und wird häufig falsch gemacht (z.B. habe ich ein Radio, welches vermutlich Fadenfehler enthält).