Informatik II Musterlösung



Ähnliche Dokumente
Test-Driven Design: Ein einfaches Beispiel

Einführung in die Programmierung

Objektorientierte Programmierung

Fachgebiet Informationssysteme Prof. Dr.-Ing. N. Fuhr. Programmierung Prof. Dr.-Ing. Nobert Fuhr. Übungsblatt Nr. 6

Objektorientierte Programmierung

S/W mit PhotoLine. Inhaltsverzeichnis. PhotoLine

Verhindert, dass eine Methode überschrieben wird. public final int holekontostand() {...} public final class Girokonto extends Konto {...

Das Typsystem von Scala. L. Piepmeyer: Funktionale Programmierung - Das Typsystem von Scala

Arbeiten mit UMLed und Delphi

Java: Vererbung. Teil 3: super()

Lineargleichungssysteme: Additions-/ Subtraktionsverfahren

Die Größe von Flächen vergleichen

Einführung in die Java- Programmierung

Fachdidaktik der Informatik Jörg Depner, Kathrin Gaißer

Primzahlen und RSA-Verschlüsselung

Zählen von Objekten einer bestimmten Klasse

Anleitung zur Erstellung von Serienbriefen (Word 2003) unter Berücksichtigung von Titeln (wie Dr., Dr. med. usw.)

Programmierkurs Java

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung: Lösungsvorschlag

Softwaretechnologie - Wintersemester 2012/ Dr. Günter Kniesel

SEP 114. Design by Contract

1 Mathematische Grundlagen

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung: Lösungsvorschlag

Mit dem sogenannten Seriendruck können Etiketten und Briefe mit einer Adressdatei (z. B. Excel) verknüpft werden.

OECD Programme for International Student Assessment PISA Lösungen der Beispielaufgaben aus dem Mathematiktest. Deutschland

Anleitung über den Umgang mit Schildern

Starten Sie Eclipse: Hier tragen sie Ihr Arbeitsverzeichnis ein. Zu Hause z.b. c:\workspace.

Windows. Workshop Internet-Explorer: Arbeiten mit Favoriten, Teil 1

Erstellen einer Collage. Zuerst ein leeres Dokument erzeugen, auf dem alle anderen Bilder zusammengefügt werden sollen (über [Datei] > [Neu])

Informationen zum Ambulant Betreuten Wohnen in leichter Sprache

Bewertung des Blattes

Informatik 2 Labor 2 Programmieren in MATLAB Georg Richter

Große Übung Praktische Informatik 1

Typumwandlungen bei Referenztypen

Grundlagen der Theoretischen Informatik, SoSe 2008

Professionelle Seminare im Bereich MS-Office

Wir machen neue Politik für Baden-Württemberg

Mit dem Tool Stundenverwaltung von Hanno Kniebel erhalten Sie die Möglichkeit zur effizienten Verwaltung von Montagezeiten Ihrer Mitarbeiter.

Statuten in leichter Sprache

1. Adressen für den Serienversand (Briefe Katalogdruck Werbung/Anfrage ) auswählen. Die Auswahl kann gespeichert werden.

CodeSaver. Vorwort. Seite 1 von 6

Was bedeutet Inklusion für Geschwisterkinder? Ein Meinungsbild. Irene von Drigalski Geschäftsführerin Novartis Stiftung FamilienBande.

Jetzt sollt ihr von der Vorlage der Grundversion 1.0 ein eigenes Textadventure erstellen.

Bitte wenden. Name: KURSARBEIT NR. 4 (10 DIFF GA) Seite 1

Dieses Tutorial gibt eine Übersicht der Form Klassen von Struts, welche Besonderheiten und Unterschiede diese aufweisen.

Downloadfehler in DEHSt-VPSMail. Workaround zum Umgang mit einem Downloadfehler

4. AuD Tafelübung T-C3

PowerPoint: Text. Text

Kulturelle Evolution 12

Was meinen die Leute eigentlich mit: Grexit?

Tipp III: Leiten Sie eine immer direkt anwendbare Formel her zur Berechnung der sogenannten "bedingten Wahrscheinlichkeit".

Papa - was ist American Dream?

Zwischenablage (Bilder, Texte,...)

Stammdatenanlage über den Einrichtungsassistenten

Hinweise zum Übungsblatt Formatierung von Text:

Praktikum zu Einführung in die Informatik für LogWiIngs und WiMas Wintersemester 2015/16. Vorbereitende Aufgaben

1. Schritt: Export Datei im Fidelio erstellen

Schrittweise Anleitung zur Erstellung einer Angebotseite 1. In Ihrem Dashboard klicken Sie auf Neu anlegen, um eine neue Seite zu erstellen.

Folge 18 - Vererbung

Einführung in die objektorientierte Programmierung mit Java. Klausur am 19. Oktober 2005

Einfache Arrays. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

FAQs für beglaubigte Übersetzungen Francesca Tinnirello

Assoziation und Aggregation

L10N-Manager 3. Netzwerktreffen der Hochschulübersetzer/i nnen Mannheim 10. Mai 2016

Satzhilfen Publisher Seite Einrichten

Wie halte ich Ordnung auf meiner Festplatte?

U08 Entwurfsmuster (II)

Lernerfolge sichern - Ein wichtiger Beitrag zu mehr Motivation

MORE Profile. Pass- und Lizenzverwaltungssystem. Stand: MORE Projects GmbH

Leichte-Sprache-Bilder

Handbuch Fischertechnik-Einzelteiltabelle V3.7.3

Software Engineering Klassendiagramme Assoziationen

Neue Schriftarten installieren

Punkt 1 bis 11: -Anmeldung bei Schlecker und 1-8 -Herunterladen der Software

Inventur. Bemerkung. / Inventur

Etikettendruck mit Works 7.0

Objektorientierte Programmierung. Kapitel 12: Interfaces

Erstellen von x-y-diagrammen in OpenOffice.calc

Säuglingsanfangsnahrung und Folgenahrung Was ändert sich? Was bleibt?

Umzug der abfallwirtschaftlichen Nummern /Kündigung

Übung - Arbeiten mit CLI-Befehlen in Windows

ONLINE-AKADEMIE. "Diplomierter NLP Anwender für Schule und Unterricht" Ziele

1 topologisches Sortieren

Outlook. sysplus.ch outlook - mail-grundlagen Seite 1/8. Mail-Grundlagen. Posteingang

Lehrer: Einschreibemethoden

HANDBUCH PHOENIX II - DOKUMENTENVERWALTUNG

Diese Anleitung wurde erstellt von Niclas Lüchau und Daniel Scherer. Erste Anmeldung. Schritt 1: Anmeldung..2. Schritt 2: Passwort setzen 3

AGROPLUS Buchhaltung. Daten-Server und Sicherheitskopie. Version vom b

Grafischer Tischeplan

Testen mit JUnit. Motivation

Webalizer HOWTO. Stand:

Dokumentation des Projektes Tic Tac Toe

AutoCAD Dienstprogramm zur Lizenzübertragung

Software Entwicklung II (SS12)

Nina. bei der Hörgeräte-Akustikerin. Musterexemplar

myfactory.go! - Verkauf

Barcodedatei importieren

Kurzanleitung fu r Clubbeauftragte zur Pflege der Mitgliederdaten im Mitgliederbereich

Wo möchten Sie die MIZ-Dokumente (aufbereitete Medikamentenlisten) einsehen?

VibonoCoaching Brief -No. 18

Transkript:

Ludwig-Maximilians-Universität München SS 2006 Institut für Informatik Übungsblatt 10 Prof. Dr. M. Wirsing, M. Hammer, A. Rauschmayer Informatik II Musterlösung Zu jeder Aufgabe sind Dateien abzugeben, deren Namen rechts in der Aufgabenüberschrift stehen. Stellen Sie die Dateien in ein extra Verzeichnis (mit beliebigem Namen) und packen Sie dieses zu einem ZIP- Archiv. Geben Sie dieses, wie üblich, per UniWorx ab. Aufgabe 10-1 OCL (12 Punkte,ocl.txt) Das folgende UML-Diagramm gibt die Modellierung eines stark vereinfachten Grafikprogramms wieder, daß die aus der Klausur bekannten grafischen Elemente benutzt. Diese werden in einer Zeichnung verwendet. Eine Zeichnung hat eine gewisse Höhe und Breite, und in diesem Beispiel sollen grafische Elemente stets ganz innerhalb der Zeichnung liegen. Um dies überprüfen zu können, wird eine Methode getboundingbox verwendet. Figure # centerx, centery : double + move(deltax : double, deltay : double) : void + getboundingbox() : Rectangle + isinside(x : double, y : double) : boolean * figures drawing 1 Drawing - dimension : Rectangle + getdimension() : Rectangle Rectangle - width, height : double + getboundingbox() : Rectangle + isinside(x : double, y : double) : boolean Circle - diameter : double + getboundingbox() : Rectangle + isinside(x : double, y : double) : boolean Spezifizieren Sie durch eine geeignete textuelle OCL-Spezifikation folgende Anforderungen an eine korrekte Implementierung: 1. isinside kann jederzeit aufgerufen werden, und soll genau dann true zurückliefern, wenn der Punkt (x, y) echt innerhalb der Figur liegt. context Rectangle::isInside(real x, real y) : boolean post: result = (centerx - x).abs() < width/2 and (centery - y).abs() < height/2 context Circle::isInside(real x, real y) : boolean post: result = (centerx - x) * (centerx - x) + (centery - y) * (centery-y) < (diameter * diameter)/2 Der Satz des Pythagoras heisst ja a 2 +b 2 = c 2, insofern kann auf eine Quadratwurzel in diesem Fall verzichtet werden. Man muss natürlich schauen, ob es jetzt Probleme mit vorher negativen Zahlen geben kann, aber der Durchmesser sollte sowieso positiv sein. Das kann man durch eine Invariante erzwingen: context Circle inv: diameter >= 0 2. move soll eine Figur um die angegebene Distanz verschieben.

context Figure::move(real deltax, real deltay) : void post: centerx = centerx@pre + deltax and centery = centery@pre + deltay 3. getboundingbox soll ein Rechteck zurückliefern, daß alle Punkte der Figur enthält (wo liegt hier das Problem? Können Sie es beheben?) Das Problem ist, daß folgende Lösung korrekt ist: context Figure::getBoundingBox() : Rectangle post: result = drawing.getdimension() (Denn dass dies eine Bounding Box ist, folgt aus der (später gegebenen) Invariante. Gemeint ist natürlich das kleinste Rechteck, daß die Figur umschliesst. Dies ist möglich mit context Rectangle::getBoundingBox() : Rectangle post: result.centerx = centerx and result.centery = centery and result.width = width and result.height = height context Circle::getBoundingBox() : Rectangle post: result.centerx = centerx and result.centery = centery and result.width = diameter and result.height = diameter 4. Zu jedem Zeitpunkt soll eine Figur innerhalb der Fläche der Zeichnung liegen, zu der sie gehört. context Figure inv: drawing.getdimension().isinside( getboundingbox().centerx - getboundingbox().width/2, getboundingbox().centery - getboundingbox().height/2) and drawing.getdimension().isinside( getboundingbox().centerx + getboundingbox().width/2, getboundingbox().centery + getboundingbox().height/2) Dies genügt, wie man an folgender Grafik sieht: Hinweise: ˆ In OCL-Ausdrücken ist es erlaubt, Methoden aufzurufen, sofern diese den Objekt-/globalen Zustand nicht modifizieren (man spricht dann von queries ) und den Rückgabewert zu verwenden. In dem gegebenen Beispiel sind dies alle Methoden ausser move. ˆ Für einen OCL-Ausdruck t vom Typ integer oder real liefert t.abs() den Betrag von t. Eine Berechnung der Quadratwurzel brauchen Sie eigentlich nicht, aber Sie können notfalls auf Math.sqrt ausweichen, welche auch als Query aufgefasst werden kann. Aufgabe 10-2 Test-First-Entwicklung (12 Punkte, Unit.java, Length.java) Gegeben seien die folgenden Unit-Tests:

package testfirst; import junit.framework.testcase; public class LengthTest extends TestCase { public void testconversion() { assertequals(new Length(1.0, Unit.M), new Length(100.0, Unit.CM).convertTo(Unit.M)); assertequals(new Length(1.0, Unit.FT), new Length(12.0, Unit.IN).convertTo(Unit.FT)); assertequals(new Length(2.54, Unit.CM), new Length(1.0, Unit.IN).convertTo(Unit.CM)); public void testequals() { assertequals(new Length(1.0, Unit.IN), new Length(2.54, Unit.CM).convertTo(Unit.IN)); // Längen sollen nur dann gleich sein, wenn sie auch die selbe Masseinheit haben: assertfalse(new Length(1.0, Unit.IN).equals(new Length(2.54, Unit.CM))); public void testtostring() { assertequals("3.0cm", new Length(3.0, Unit.CM).toString()); assertequals("3.0m", new Length(3.0, Unit.M).toString()); assertequals("3.0in", new Length(3.0, Unit.IN).toString()); assertequals("3.0ft", new Length(3.0, Unit.FT).toString()); Implementieren Sie die Enum Unit und die Klasse Length, so dass sie diese Tests erfüllen. Hinweise zur Implementierung von Standard-Methoden von Object (siehe auch und insbesondere deren JavaDoc): ˆ Wer equals() implementiert, muss auch hashcode implementieren! ˆ hashcode: Kann man über die Hashcodes der Attribute implementieren, wenn man jede Komponente mit einer Primzahl multipliziert (so dass sie im Ergebnis nicht zu sehr vermischt werden): return (this.attrib1.hashcode() + (this.attrib2.hashcode() * 3) + (this.attrib3 * 5)); ˆ Man kann in einer Enum u.a. folgendes selbst definieren: (private) Konstruktoren, Attribute und Methoden. Sonstige Bemerkungen: ˆ Der erste Schritt, ist, dass die zu implementierenden Klassen (bzw. deren Skelett) übersetzt werden können. Wird eine Methode als noch nicht vorhanden in Eclipse angezeigt, wird zur Fehlerbehebung angeboten, eine leere Implementierung dieser Methode zu generieren. Danach sollte der Compiler keine Fehler mehr anzeigen. Als nächstes lassen Sie den Test zum ersten Mal laufen und überzeugen sich, dass er auch wirklich scheitert (ansonsten wären Sie fertig). ˆ Arbeiten Sie nun die Tests der Reihe nach ab (indem sie entweder scheiternde Tests ignorieren oder auskommentieren). ˆ Google hilft einem beim Umrechnen von Einheiten. So kann man beispielsweise nach 1in in mm suchen und bekommt die Antwort, dass 1 in = 25.4 millimeters. package testfirst; public enum Unit {

CM("cm", 1.0), M("m", 100.0), IN("in", 2.54), FT("ft", 30.48); private String printname; private double timescm; private Unit(String printname, double timescm) { this.printname = printname; this.timescm = timescm; public double gettimescm() { return this.timescm; public String getprintname() { return this.printname; package testfirst; public class Length { private double amountincm; private Unit unit; public Length(double amount, Unit unit) { this.unit = unit; this.amountincm = convert(amount, unit, Unit.CM); private static double convert(double fromamount, Unit fromunit, Unit tounit) { double cms = fromamount * fromunit.gettimescm(); return cms / tounit.gettimescm(); public Length(Length other) { this.amountincm = other.amountincm; this.unit = other.unit; private void setunit(unit newunit) { this.unit = newunit; public Length convertto(unit newunit) { Length newlength = new Length(this); newlength.setunit(newunit); return newlength; //------------------------- Standard Object methods @Override public int hashcode() { return (new Double(amountInCm).hashCode() * 3) + unit.hashcode();

@Override public boolean equals(object other) { if (! (other instanceof Length)) return false; Length otherlength = (Length) other; return this.amountincm == otherlength.amountincm && this.unit == otherlength.unit; @Override public String tostring() { return Double.toString(convert(this.amountInCm, Unit.CM, this.unit))+unit.getprintname(); Aufgabe 10-3 Objekt-orientierter Entwurf (Keine Punkte, schach-klassen.txt, schach-uml.pdf,ps,jpg) Diese Aufgabe wird zwar korrigiert, aber nicht bewertet. Entwerfen Sie ein Schachspiel. Im folgenden die bewusst ungenau gehaltenen Anforderungen eines Anwenders: Hinweise: Es gibt zwei Spieler, die abwechselnd mit jeweils einer von ihren 16 Figuren ziehen. Jede Figur weiss, wie sie ziehen kann. ˆ Sie müssen nicht alle Figuren modellieren sondern nur den Springer (http://de.wikipedia.org/ wiki/springer_(schach)). ˆ Allzu genaue Details sind nicht gefragt, mehr ein Überblick über den Problembereich. Beim Entwurf sollen Sie wie folgt vorgehen: a) Klassen und deren Aufgaben: Führen Sie alle Klassen auf und schreiben Sie zu jeder Klasse, welche Aufgaben Sie hat. Diese Verantwortlichkeiten sind eine traditionelle Idee im objekt-orientierten Entwurf und werden im Englischen auch als responsibilities bezeichnet. b) Erstellen Sie auf dieser Grundlage ein Klassendiagramm in UML. Spieler - farbe: Farbe 1 besitzer figuren 16 Figur # position : Position + getmoeglichezuege() : Set<Position> + ziehe(position : Position) : void 2 spieler Brett - felder : Figur[][] - anderreihe : Spieler + getfeld(position : Position) : Figur - x - y Position «enum» Farbe + SCHWARZ + WEISS Springer + getmoeglichezuege() : Set<Position> + ziehe(position : Position) : void Responsibilities: ˆ Brett: Verwalte Brettinhalt und Spieler. Merke Dir, welcher Spieler gerade an der Reihe ist.

ˆ Spieler: Hat eine Farbe und verwaltet seine Figuren. ˆ Figur (bzw. deren konkrete Unterklassen): Weiss die Züge, die sie machen kann, steht an einer bestimmten Position auf dem Feld, die man ändern kann. Anmerkungen: ˆ Das ist ein gutes Beispiel für die Unsicherheit, die man immer beim objektorientierten Modellieren hat: Gehören die Figuren dem Spieler oder dem Brett oder gar niemandem? Zieht die Figur selbst oder eher der Spieler oder sollte das Ziehen nicht vom Brett übernommen werden? Hat der Spieler eine Farbe oder ist der Spieler die Farbe? Diese Fragen klären sich überlicherweise, je mehr man sich auf die Implementierung zubewegt. ˆ Assoziationen: Bei den Assoziationen wurde hier besonders hervorgehoben, wer was sehen kann (und weniger die Lebensdauer wie bei schwacher bzw. starker Aggegation). ˆ Getter und Setter: Wurden bewusst nicht ins Klassendiagramm geschrieben, da sie konzeptuell mit den Attributen zusammenfallen. Abgabe: Per UniWorx, bis spätestens Montag, den 17.7.2006 um 9:00 Uhr.