Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer, Dr. Thomas H. Kolbe Einführung in die Programmierung mit Java 5. Vorlesung WS 2001/2002 Übersicht • Besprechung der Übungsaufgabe • Grundbegriffe der objektorientierten Modellierung • Klassen und Objekte – Klassendefinition – Objektattribute (Instanzvariablen) – Methoden (Parameterübergabe, Rückgabewert) T. H. Kolbe - Einführung in die Programmierung mit Java - 1. Semester - WS 01/02 2 Übungsaufgabe vom 24. 11. Schreiben Sie ein Programm, das den Wert einer ganzzahligen Variablen w (0 bis 999) so als Text ausgibt, wie er ausgesprochen wird. Beispiele: w = 285 Ausgabe: "zweihundertfünfundachtzig" w = 513 Ausgabe: "fünfhundertdreizehn" T. H. Kolbe - Einführung in die Programmierung mit Java - 1. Semester - WS 01/02 3 Wdh.:Software-Entwicklung: Problemanalyse Was sind die Eingangsdaten? Was soll ausgegeben werden? Ein- und Ausgabe Wie werden aus den Eingabedaten die Ausgabedaten hergeleitet? Zerlegung in Teilprobleme Problemanalyse Formalisierung Randbedingungen Komplexität Software-Entwicklung für einfache Probleme 0 Wert 999 T. H. Kolbe - Einführung in die Programmierung mit Java - 1. Semester - WS 01/02 4 Übungsaufgabe vom 24. 11. Schreiben Sie ein Programm, das den Wert einer ganzzahligen Variablen w (0 bis 999) so als Text ausgibt, wie er ausgesprochen wird. Beispiele: w = 285 Ausgabe: "zweihundertfünfundachtzig" w = 513 Ausgabe: "fünfhundertdreizehn" Lösungsansatz: die 100er, 10er und 1er getrennt betrachten. Sonderfälle: die Zahlen von 0 bis 19 müssen zusammen betrachtet werden und die Zahl 0 muss auch gesondert berücksichtigt werden. T. H. Kolbe - Einführung in die Programmierung mit Java - 1. Semester - WS 01/02 5 Software-Entwicklung: Programmentwurf Zerlegung in Einzelschritte Problem Notation Projekt Zahlenausgabe: einfaches • Keine komplexen Datenstrukturen • Keine besonderen Algorithmen • Nur Hauptprogramm Programmentwurf • Notation direkt in Java Auswahl geeigneter • Benötigte Kontrollstrukturen: if-then-else und switch Software-Entwicklung für einfache Probleme in Pseudo-Code als Ablaufdiagramm direkt in der Zielprogrammiersprache Datenstrukturen Algorithmen Roter Faden = Hauptprogramm für viele Teilprobleme gibt es bereits fertige Alg. + DS (siehe Vorlesung Diskrete Mathe) T. H. Kolbe - Einführung in die Programmierung mit Java - 1. Semester - WS 01/02 6 Lösung zur Aufgabe Teil 1/3 class Zahlenausgabe { public static void main (String args[]) { int wert, einer, zehner, hunderter; wert=157; // dies ist der auszugebende Wert einer = wert % 10; wert = wert / 10; zehner = wert % 10; wert = wert / 10; hunderter=wert; // Ziffer der 1er-Stelle berechnen // Ziffer der 10er-Stelle berechnen // Ziffer der 100er-Stelle berechnen switch(hunderter) { case 1: { System.out.print("einhundert"); break; } case 2: { System.out.print("zweihundert"); break; } case 3: { System.out.print("dreihundert"); break; } case 4: { System.out.print("vierhundert"); break; } case 5: { System.out.print("fünfhundert"); break; } case 6: { System.out.print("sechshundert"); break; } case 7: { System.out.print("siebenhundert"); break; } case 8: { System.out.print("achthundert"); break; } case 9: { System.out.print("neunhundert"); break; } // bei 0 wird nichts ausgegeben } ... Fortsetzung auf der nächsten Seite T. H. Kolbe - Einführung in die Programmierung mit Java - 1. Semester - WS 01/02 7 Lösung zur Aufgabe Teil 2/3 if (zehner<2) // ist die Zehnerstelle 0 oder 1 ? switch(zehner*10+einer) { // ja: Zahlen von 0 bis 19 besonders behandeln case 0: { if (hunderter==0) // wenn auch die 100er Stelle System.out.print("null"); // 0 ist, dann „null“ ausgeben break; } case 1: { System.out.print("eins"); break; } case 2: { System.out.print("zwei"); break; } case 3: { System.out.print("drei"); break; } case 4: { System.out.print("vier"); break; } case 5: { System.out.print("fünf"); break; } case 6: { System.out.print("sechs"); break; } case 7: { System.out.print("sieben"); break; } case 8: { System.out.print("acht"); break; } case 9: { System.out.print("neun"); break; } case 10: { System.out.print("zehn"); break; } case 11: { System.out.print("elf"); break; } case 12: { System.out.print("zwölf"); break; } case 13: { System.out.print("dreizehn"); break; } case 14: { System.out.print("vierzehn"); break; } case 15: { System.out.print("fünfzehn"); break; } case 16: { System.out.print("sechzehn"); break; } case 17: { System.out.print("siebzehn"); break; } case 18: { System.out.print("achtzehn"); break; } case 19: { System.out.print("neunzehn"); break; } } ... Fortsetzung auf der nächsten Seite T. H. Kolbe - Einführung in die Programmierung mit Java - 1. Semester - WS 01/02 8 Lösung zur Aufgabe Teil 3/3 else { } } } // zehner sind größer als 2 switch(einer) { case 0: break; case 1: { System.out.print("einund"); break; } case 2: { System.out.print("zweiund"); break; } case 3: { System.out.print("dreiund"); break; } case 4: { System.out.print("vierund"); break; } case 5: { System.out.print("fünfund"); break; } case 6: { System.out.print("sechsund"); break; } case 7: { System.out.print("siebenund"); break; } case 8: { System.out.print("achtund"); break; } case 9: { System.out.print("neunund"); break; } } switch(zehner) { case 2: { System.out.print("zwanzig"); break; } case 3: { System.out.print("dreißig"); break; } case 4: { System.out.print("vierzig"); break; } case 5: { System.out.print("fünfzig"); break; } case 6: { System.out.print("sechzig"); break; } case 7: { System.out.print("siebzig"); break; } case 8: { System.out.print("achtzig"); break; } case 9: { System.out.print("neunzig"); break; } } // Ende des Else-Teils // Ende der Methode main // Ende der Klasse Zahlenausgabe T. H. Kolbe - Einführung in die Programmierung mit Java - 1. Semester - WS 01/02 9 Software-Entwicklung: Implementierung Implementierung Zahlenausgabe: trivial Software-Entwicklung • Entwurf liegt bereits in Java-Syntax vor für einfache Probleme Realisierung • Nur integer-Variablen in einer konkreten Programmiersprache • Keine besonderen Funktionen aus Auswahl geeigneter Bibliotheken benötigt Datentypen Implementierung Berücksichtigung vorhandener Funktionsbibliotheken Schrittweise Umsetzung des Pseudo-Codes in der Ziel-Programmiersprache Dokumentation des Quelltextes nicht vergessen! T. H. Kolbe - Einführung in die Programmierung mit Java - 1. Semester - WS 01/02 10 Software-Entwicklung: Testen Korrektheit Terminierung Falsche Ergebnisse Absturz (z.B. Durch Fehleingaben) Endlossschleifen Test: mindestens fünfSoftware-Entwicklung Fälle • Zahlen größer 99 für einfache Probleme Sicherung der die in der Aufgabenstellung u.a. Programmgeforderten 285 und 513 eigenschaften • Zahlen kleiner 100 • Zahlen mit Zehnerstelle 0 oder 1 typische • Fehler Zahlen mit Zehnerstelle 2-9 Testen • Die Zahl 0 Testszenarien definieren Programm mit repräsentativen Eingabedaten starten und Ergebnisse überprüfen T. H. Kolbe - Einführung in die Programmierung mit Java - 1. Semester - WS 01/02 11 Objektorientierte Modellierung & Programmierung • Hinter OO stehende Prinzipien – Abstraktion – Kapselung – Objekt – Kommunikation über Botschaften • Klassenbildung – Objekte als Instanzen von Klassen • Vererbung • Polymorphismus T. H. Kolbe - Einführung in die Programmierung mit Java - 1. Semester - WS 01/02 12 Abstraktion • ist eine Repräsentation der für die beabsichtigten Anwendungen / Programme wesentlichen Eigenschaften Abstraktion ermöglicht • in frühen Entwicklungsstadien die Erfassung des Problemraumes • Generalisierung von Details – bei wichtigen Details wird in mehreren Ebenen abstrahiert T. H. Kolbe - Einführung in die Programmierung mit Java - 1. Semester - WS 01/02 13 Kapselung (engl.: Information hiding) • Ergebnis der Kapselung ist eine Entität (Objekt) mit einer scharfen Abgrenzung von seiner Umgebung, einer wohldefinierten Schnittstelle und einer verborgenen internen Repräsentation. Wohldefinierte Schnittstelle • Austauschbarkeit der Realisierung • Objekte sind gut wartbar (z.B. Einbettung in Testumgebung) Verbergen • Schutz vor Fehlern, die aufgrund von Annahmen über interne Realisierung entstehen • Zugriff auf Attribute idealerweise nur über die Schnittstelle T. H. Kolbe - Einführung in die Programmierung mit Java - 1. Semester - WS 01/02 14 Objektkommunikation mittels Botschaften • Eine Botschaft ist eine u.U. parametrisierte Nachricht, die der Kommunikation zwischen Objekten dient. • Botschaften lösen in der Regel beim Empfängerobjekt (Re-)Aktionen aus. • Die Parameterbelegung einer Botschaft kann die Art der Reaktion beeinflussen. T. H. Kolbe - Einführung in die Programmierung mit Java - 1. Semester - WS 01/02 15 Objekt • ist eine gekapselte, der Anwendung entsprechend abstrahierte Entität. Jedes Objekt besitzt • eine eindeutige Objektidentität • einen Zustand, der durch eine Menge von Attributen beschrieben wird • Verfahren, die auf eine definierte Menge von Botschaften entsprechend reagieren T. H. Kolbe - Einführung in die Programmierung mit Java - 1. Semester - WS 01/02 16 Klassenbildung • Gleichartige Objekte werden durch eine Klasse repräsentiert. – Objekte sind Instanzen von Klassen – Alle Objekte einer Klasse haben die gleichen Attribute (aber i.d.R. mit unterschiedlichen Werten) und verstehen Botschaften auf dieselbe Art. Zu einer Klassendefinition gehören • Klassenname • Liste der Attribute (in Java: Instanz- und Klassenvariablen) • Liste der Botschaften, die Objekte dieser Klasse verstehen können (in Java: Methoden) T. H. Kolbe - Einführung in die Programmierung mit Java - 1. Semester - WS 01/02 17 Klassenbezeichner Klassendefinition in Java Deklaration der Instanzvariablen: jede Instanz (Objekt) der Klasse hat gleichnamige Variablen; die Werte können aber für jedes Objekt individuell zugewiesen werden. class Klassenname { Typ1 Variablenname1; Typ2 Variablenname2; ... Rückgabewerttyp1 Methode1 (Parameterliste) { // Methodendefinition der 1. Methode } Methodenbezeichner Rückgabewerttyp2 Methode2 (Parameterliste) { // Methodendefinition der 2. Methode } ... } T. H. Kolbe - Einführung in die Programmierung mit Java - 1. Semester - WS 01/02 18 Beispiel zur Klassendefinition class Rechteck { double breite, höhe; // Instanzvariablen (jedes Objekt der Klasse // Rechteck hat jeweils eigene Variablen) } T. H. Kolbe - Einführung in die Programmierung mit Java - 1. Semester - WS 01/02 19 Beispiel zur Klassendefinition class Rechteck { double breite, höhe; // Instanzvariablen (jedes Objekt der Klasse // Rechteck hat jeweils eigene Variablen) // Methode zur Berechnung des Flächeninhalts double fläche () { // keine Parameter; Rückgabewert vom Typ double double flächeninhalt; // lokale Variable (ex. nur in der Methode) flächeninhalt=breite*höhe; // Berechnung anhand der Instanzvariablen return flächeninhalt; // Rückgabe des berechneten Wertes } } T. H. Kolbe - Einführung in die Programmierung mit Java - 1. Semester - WS 01/02 20 Beispiel zur Klassendefinition class Rechteck { double breite, höhe; // Instanzvariablen (jedes Objekt der Klasse // Rechteck hat jeweils eigene Variablen) // Methode zur Berechnung des Flächeninhalts double fläche () { // keine Parameter; Rückgabewert vom Typ double double flächeninhalt; // lokale Variable (ex. nur in der Methode) flächeninhalt=breite*höhe; // Berechnung anhand der Instanzvariablen return flächeninhalt; // Rückgabe des berechneten Wertes } // Methode zur Ausgabe des Objekts (als Text) void ausgeben() { // keine Parameter; kein Rückgabewert System.out.println("Dieses Rechteck hat folgende Eigenschaften:"); System.out.print("Breite: "); System.out.println(breite); System.out.print("Höhe: "); System.out.println(höhe); System.out.print("Fläche: "); System.out.println(fläche()); // hier steckt ein Methodenaufruf! } “void“ bedeutet, dass die Methode keinen Wert an den Aufrufer zurückliefert } T. H. Kolbe - Einführung in die Programmierung mit Java - 1. Semester - WS 01/02 21 Erzeugen von Objekten Das Erzeugen eines Objekts wird auch als Instantiierung bezeichnet. Syntax: ... Klassenname Objektvariable; // Deklaration ... Objektvariable = new Klassenname (); // Instantiierung Beispiel: Rechteck my_rechteck1, my_rechteck2; my_rechteck1 = new Rechteck(); my_rechteck2 = new Rechteck(); T. H. Kolbe - Einführung in die Programmierung mit Java - 1. Semester - WS 01/02 22 Aufruf von Methoden Syntax: // Methode ohne Rückgabewert (void) Objektvariable.Methode1(Parameterliste); ... // Methode mit Rückgabewert Variable = Objektvariable.Methode2(Parameterliste); Beispiel: my_rechteck.ausgeben(); double flächeninhalt; flächeninhalt=my_rechteck.fläche(); T. H. Kolbe - Einführung in die Programmierung mit Java - 1. Semester - WS 01/02 23 Zugriff auf Instanzvariablen Syntax: ... Objektvariable.Instanzvariable = Wert ; ... Beispiel: my_rechteck = new Rechteck; my_rechteck.breite = 10.0; System.out.println(my_rechteck.breite); T. H. Kolbe - Einführung in die Programmierung mit Java - 1. Semester - WS 01/02 24 Beispiel zu Instantiierung, Variablenzugriff und Methodenaufruf class Rechteck { ... // hier Variablendeklaration & Methodendefinition aus vorigem Beispiel // einfügen ... public static void main (String args[]) Rechteck my_rechteck1; // my_rechteck1 = new Rechteck(); // my_rechteck1.breite = 10.0; // my_rechteck1.höhe = 5.0; // my_rechteck1.ausgeben(); { // Hauptprogramm Deklaration einer Objektvariablen Instantiierung eines Objekts Zugriff auf Variablen der Instanz (Zuweisung eines Werts) Rechteck my_rechteck2 = new Rechteck(); // 2. Objekt dekl. & instant. my_rechteck2.breite = my_rechteck1.breite - 2.0; my_rechteck2.höhe = 7.5; my_rechteck2.ausgeben(); // Die beiden Objekte der Klasse Rechteck haben jeweils einen // eigenen Zustand, der durch die Wertebelegung der Instanzvariablen // breite und höhe gegeben ist ((b=10.0,h=5.0) und (b=8.0,h=7.5)). } } T. H. Kolbe - Einführung in die Programmierung mit Java - 1. Semester - WS 01/02 25 Übungsaufgaben 1. Entwerfen und Implementieren Sie analog zur Definition von Rechtecken die Klassendefinitionen für Dreiecke, Kreise, Ellipsen und Trapeze. Als Methoden sollten mindestens die Flächenberechnung und die textuelle Ausgabe der Variableninhalte zur Verfügung gestellt werden. 2. Entwerfen Sie die Klasse Student, die alle zur Verwaltung eines Studentenregisters wesentlichen Informationen beinhaltet. a) Welche Methoden können Sie sich dazu vorstellen? b) Welche Informationen (Variablen & Methoden) sind auch auf Dozenten oder Verwaltungsangestellte anwendbar? T. H. Kolbe - Einführung in die Programmierung mit Java - 1. Semester - WS 01/02 26