Informatik II Musterlösung

Ähnliche Dokumente
Informatik II Musterlösung

Informatik II Musterlösung

Übungsblatt 13. Abgabe / Besprechung in Absprache mit dem Tutor

Übungsblatt 13. Abgabe / Besprechung in Absprache mit dem Tutor

Javakurs für Anfänger

Prüfung Softwareentwicklung II (IB)

Probeklausur Java Einführung in die Informatik. Wintersemester 2016/2017

FH D. Objektorientierte Programmierung in Java FH D FH D. Prof. Dr. Ing. André Stuhlsatz. Referenzen. Referenzen

Objektorientierung. Klassen und Objekte. Dr. Beatrice Amrhein

Probeklausur Java Einführung in die Informatik. Wintersemester 2017/2018

1 Klassen und Objekte

Aufgabenblatt: OOP - Seite 1. (2.) Geometrie: Erstellen Sie eine Klasse CPyramid, die sich von der Klasse Square ableitet:

Objektorientierte Programmierung. Kapitel 22: Aufzählungstypen (Enumeration Types)

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

CoMa 04. Java II. Paul Boeck. 7. Mai Humboldt Universität zu Berlin Institut für Mathematik. Paul Boeck CoMa 04 7.

12 Abstrakte Klassen, finale Klassen und Interfaces

Probeklausur Java Einführung in die Informatik. Wintersemester 2014/2015

Ausgabe:

Fakultät IV Elektrotechnik/Informatik

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

Vorbereitende Aufgaben

Die Klasse java.lang.object. Thorsten Treffer

Übung Programmierung WS 2007/08 - Blatt 6

Probeklausur Java Einführung in die Informatik. Wintersemester 2014/2015. Musterlösung

Musterlösung Stand: 5. Februar 2009

Einführung in die Java- Programmierung

Felder - Arrays. Typ feldname[] = new Typ[<ganze Zahl >]; Beispiel: double vektor[] = new double[5]; auch eine Initialisierung ist möglich.

Einführung in die Programmierung WS 2009/10. Übungsblatt 7: Imperative Programmierung, Parameterübergabe

Einfache Arrays. Dr. Philipp Wendler. Zentralübung zur Vorlesung Einführung in die Informatik: Programmierung und Softwareentwicklung

Programmierkurs Java

Vererbung. Martin Wirsing. Ziele. Vererbung

Probeklausur: Programmierung WS04/05

Vorkurs Informatik WiSe 15/16

1. Grundzüge der Objektorientierung 2. Methoden, Unterprogramme und Parameter 3. Datenabstraktion 4. Konstruktoren 5. Vordefinierte Klassen

Programmieren in Java

ALP II Dynamische Datenmengen Datenabstraktion

Programmierstarthilfe SS 2010 Fakultät für Ingenieurwissenschaften und Informatik 2. Blatt Für die Woche vom 3.5. bis zum 7.5.

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 16/17. Kapitel 13. Listen. Listen 1

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 15/16. Kapitel 12. Listen. Listen 1

JAVA - Methoden

hue12 January 24, 2017

Programmiertechnik Klassenvariablen & Instantiierung

Übungsblatt 1. Java Vorkurs (WS 2017)

Programmieren in Java -Eingangstest-

Konstruktor. public Rational(int i) { Zaehler = i; Nenner = 1; }

JAVA BASICS. 2. Primitive Datentypen. 1. Warum Java? a) Boolean (logische Werte wahr & falsch)

Einführung in die Programmierung

Hochschule Augsburg, Fakultät für Informatik Name:... Prüfung "Programmieren 1", IN1bac, WS 10/11 Seite 1 von 6

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 11/12 1. Kapitel 11. Listen. Listen

Vorbereitende Aufgaben

Klausur zur Vorlesung Einführung in die Programmierung

1. Grundzüge der Objektorientierung 2. Methoden, Unterprogramme und Parameter 3. Datenabstraktion 4. Konstruktoren 5. Vordefinierte Klassen

Übung zur Vorlesung Programmierung

Beuth Hochschule Parameter-Übergabe-Mechanismen WS17/18, S. 1

Praktikum 4: Grafiken und Ereignisse

Informatik - Übungsstunde

Prüfung Softwareentwicklung I (IB)

Algorithmen und Datenstrukturen

Übungen zum Bioinformatik-Tutorium. Blatt 6

Tag 8 Repetitorium Informatik (Java)

Vererbung. Gerd Bohlender. Institut für Angewandte und Numerische Mathematik. Vorlesung: Einstieg in die Informatik mit Java 14.1.

Grundlagen der Objektorientierten Programmierung Static

14 Abstrakte Klassen, finale Klassen, Interfaces

Klassenvariablen, Klassenmethoden

Javakurs für Anfänger

14 Abstrakte Klassen, finale Klassen, Interfaces. Auswertung von Ausdrücken. Beispiel. Abstrakte Methoden und Klassen

Objektorientierte Programmierung Studiengang Medieninformatik

14 Abstrakte Klassen, finale Klassen, Interfaces

Klausur Grundlagen der Programmierung

Probe-Klausur im Modul: Grundlagen der Informatik (GDI)

Programmiertechnik II Klausur SS 2018 Angewandte Informatik Bachelor

Anregungen zu Übung 2

Algorithmen und Datenstrukturen 07

a) Für das vorgegebene Programmstück ergibt sich folgendes Referenzgeflecht:

Transkript:

Ludwig-Maximilians-Universität München SS 2006 Institut für Informatik Übungsblatt 5 Prof. Dr. M. Wirsing, M. Hammer, A. Rauschmayer Informatik II Musterlösung Zu jeder Aufgabe ist eine Datei abzugeben, deren Name rechts in der Aufgabenüberschrift steht. 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 5-1 Beschäftigte bei Behörden (Clerk.java, 12 Punkte) Wir modellieren einen Beschäftigten bei einer Behörde aus der Sicht des Personalreferats; naturgemäß ist unsere Modellierung stark vereinfacht. Für das Personalreferat ist ein Beschäftigter gegeben durch ˆ seinen Nach- und Vornamen (jeweils vom Typ String) ˆ das Jahr seiner Geburt (von Typ int) ˆ seine Besoldungskategorie (vom Typ int) ˆ einen booleschen Wert, der anzeigt, ob der Beschäftigte verheiratet ist. Ziel der Aufgabe ist es, einen Beschäftigten zu modellieren und aus den gegebenen Daten die monatliche Besoldung zu ermitteln, die sich wie folgt berechnet: Der Grundsold von e2000 wird um x 17/9 Prozent erhöht, wobei x die Besoldungskategorie ist. Beginnend mit dem Jahr, in dem das 30. Lebensjahr vollendet wird, wird der so errechnete Betrag alle 5 Jahre zusätzlich um 1 Prozent erhöht. Der Zuschlag für Verheiratete beträgt 12.3 Prozent des Grundsolds. a) Definieren Sie eine Klasse Clerk, deren Attribute einen Angestellten (wie oben modelliert) beschreiben. b) Erweitern Sie Ihre Klasse um einen Konstruktor Clerk(String firstname, String lastname, int yearofbirth, int salaryclass, boolean married), der die Instanzvariablen eines Beschäftigten mit den übergebenen Werten vorbesetzt. c) Erweitern Sie Ihre Klasse um eine Methode void promote(int newsalaryclass), die einen Beschäftigten in eine neue Gehaltsstufe einordnet. d) Erweitern Sie Ihre Klasse um Methoden void marry() und void divorce(), die den Familienstand verheiratet bzw. nicht verheiratet verändern. e) Erweitern Sie Ihre Klasse um eine Methode double salary(int thisyear), die den Sold bestimmt. In der Variablen thisyear wird das Jahr übergeben, für das der Sold berechnet werden soll. f) Erweitern Sie Ihre Klasse um eine Methode boolean envies(clerk c), die genau dann true zurückliefert, wenn der Beschäftigte, bei dem die Methode aufgerufen wird, den Beschäftigten c beneidet. Dies ist der Fall, wenn ˆ der Beschäftigte bereits älter ist als c ˆ aber im Jahr 2006 einen geringeren Sold bezieht. g) Erweitern Sie Ihre Klasse um eine Prozedur main, die zwei Beschäftigte erzeugt, und die folgenden Aktionen durchführt: ˆ Ausgabe des Solds beider Beschäftigten auf dem Bildschirm. ˆ Der erste Beschäftigte heiratet; danach erneute Ausgabe des Sold beider Beschäftigten. ˆ Der zweite Beschäftigte wird in die Gehaltsklasse 7 übernommen.

ˆ Es soll auf dem Bildschirm ausgegeben werden, ob der erste Angestellte den zweiten beneidet. ˆ Es soll auf den Bildschirm ausgegeben werden, ob der zweite Angestellte sich selbst beneidet. h) Schreiben Sie eine Prozedur boolean allhappy(clerk[] cs), die für eine Reihung von Clerk- Objekten bestimmt, ob alle Beschäftigten glücklich sind, d.h. ob bei einem paarweisen Vergleich envies stets false liefert. Fügen Sie einen Test dieser Prozedur in die main-prozedur ein! Lösung: public class Clerk { /* Teilaufgabe (a): Instanzenvariablen mit Defaultwerten private String firstname, lastname; private int yearofbirth; private int salaryclass; private boolean married; /* * wegen der vermeidung von magic numbers hier der Grundsold und die * weiteren Konstanten private static final double basicsalary = 2000.0; private static final double classmultiplier = 17.0 / 9.0; private static final double marriagebonus = 12.3; private static final int year = 2006; public String tostring() { return firstname + " " + lastname + "(born " + yearofbirth + ", " + (married?"married":"bac * Teilaufgabe (b): Initialisieren der Instanzenvariablen per Konstruktor public Clerk(String firstname, String lastname, int yearofbirth, int salaryclass, boolean married) { this.firstname = firstname; this.lastname = lastname; this.yearofbirth = yearofbirth; this.salaryclass = salaryclass; this.married = married; Teilaufgabe (c): Befoerdern eines Angestellten public void promote(int newsalaryclass) { salaryclass = newsalaryclass; Teilaufgabe (d): Heirat und Scheidung public void marry() { married = true; public void divorce() { married = false; Teilaufgabe (e): Berechnung des Solds public double salary(int thisyear) { /* berechnet den Sold

double thesalary; /* Grundsold + x * 17/9 Prozent mit x = salaryclass: thesalary = basicsalary * ((100.0 + classmultiplier) / 100.0 * salaryclass); // System.out.println("s1: " + thesalary); /* Altersbonus int age = thisyear - yearofbirth; int nbonus = 0; if (age >= 30) nbonus = (age - 25) / 5; thesalary = ((100.0 + nbonus) / 100.0) * thesalary; /* Verheiratetenzuschlag if (married) thesalary += ((100.0 + marriagebonus) / 100.0) * basicsalary; return thesalary; Teilaufgabe (f): wer beneidet wen? public boolean envies(clerk c) { return (yearofbirth < c.yearofbirth) && (salary(year) < c.salary(year)); Teilaufgabe (g): main (enthaelt etwas mehr als verlangt) public static void main(string[] args) { Clerk c1 = new Clerk("Jack", "Miller", 1970, 1, false); Clerk c2 = new Clerk("John", "Smith", 1980, 1, false); System.out.println(c1 + " earns " + c1.salary(year)); System.out.println(c2 + " earns " + c2.salary(year)); System.out.println(c1 + " envies " + c2 + ": " + c1.envies(c2)); c2.promote(7); System.out.println(c2 + " earns " + c2.salary(year)); System.out.println(c1 + " envies " + c2 + ": " + c1.envies(c2)); System.out.println(c2 + " envies himself: " + c2.envies(c2)); Clerk c3 = new Clerk("Clark", "Kent", 1962, 3, false); Clerk c4 = new Clerk("Jerry", "Maguire", 1974, 1, true); Clerk[] clerks = new Clerk[]{c1, c2, c3, c4; System.out.println(java.util.Arrays.toString(clerks) + "are happy: " + allhappy(clerks)); // wir machen sie gluecklich c4.divorce(); c2.promote(1); System.out.println(java.util.Arrays.toString(clerks) + "are happy: " + allhappy(clerks)); Teilaufgabe(h): Ist eine Reihung von Clerk-Objekten paarweise zufrieden? public static boolean allhappy(clerk[] cs) { for (Clerk c1 : cs) { for (Clerk c2 : cs) { if (c1.envies(c2)) { // beachte die Nichtreflexivitaet! return false; return true;

Aufgabe 5-2 Keller als Klasse implementieren (ArrayStack.java, 10 Punkte) Implementieren Sie einen Keller (engl. Stack) als eine Klasse. Erweitern Sie hierzu das unten angegebene Gerüst. public class ArrayStackSkeleton { * Hier werden die Stack-Einträge gespeichert. private int[] data; * Das nächste zu schreibende Element (= Anzahl der Elemente auf dem Stack) private int topofstack; * Legt einen Stack mit der Anfangskapazität <code>initialcapacity</code> * an. Die Kapazität wirkt sich nicht auf das beobachtbare Verhalten aus * (sprich: sie wird bei Bedarf erweitert). public ArrayStackSkeleton(int initialcapacity) { * Lege einen leeren Stack an. public ArrayStackSkeleton() { * Lege einen neuen Stack an, belege ihn mit den Elementen * <code>elements</code>. public ArrayStackSkeleton(int[] elements) { * Copy constructor: Erzeuge eine neue Instanz als echte Kopie von * <code>other</code>. public ArrayStackSkeleton(ArrayStackSkeleton other) { * Stelle einen neuen Wert auf den Stack, erweitere gegebenenfalls die * Kapazität. public void push(int value) {

* Entferne den obersten Wert vom Stack und gib ihn zurück. public int pop() { * Lies den obersten Wert vom Stack aus. public int peek() { * Gib den momentanen Stackzustand als String zurück. public String tostring() { public static void main(string[] args) { ArrayStackSkeleton stack = new ArrayStackSkeleton(); stack.push(5); stack.push(3); System.out.println("-->" + stack.pop()); System.out.println("-->" + stack.peek()); Hinweise: ˆ Methode tostring(): Wenn man diese parameterlose Methode in eine Klasse schreibt, kann man deren Instanzen direkt per System.out.println() ausgeben. Mit dem +-Operator kann man in Java nicht nur Zahlen addieren, sondern auch Strings zusammenhängen. Kommt ein Objekt, das kein String ist, in so einer Addition vor, dann setzt Java tostring() ein, um dieses Objekt zu konvertieren. Die untenstehende Klasse IntArrayContainer enthält eine tostring-implementierung. Ihre Implementierung soll zu folgender Ausgabe führen: ArrayStack[] ArrayStack[5] ArrayStack[5, 3] -->3 ArrayStack[5] -->5 ArrayStack[5] ˆ Weiterhin kann ihnen die Klasse StringBuilder und die Methode System.arraycopy() bei der Implementierung helfen. Schlagen Sie beides im JavaDoc nach. ˆ Copy-Konstruktoren: sind ein einfaches Mittel, um Objekte zu kopieren. Prinzip: Einer der Konstruktoren einer Klasse bekommt als Argument eine andere Instanz der selben Klasse. Nun wird der interne Zustand des neuen Objekts komplett von dem existierenden übernommen und fertig ist die Kopie. ArrayStack hat einen Copy-Konstruktor.

ˆ Assertions: Manche Methoden können, abhängig vom momentanen Zustand des Stacks, manchmal nicht aufgerufen werden. Überprüfen Sie diese Fälle über Assertions. ˆ Pseudo-Methode this(): Damit kann man von einem Konstruktor einen anderen aufrufen, allerdings nur in der ersten Zeile, also bevor andere Anweisungen aufgeführt werden. IntArrayContainer ist auch hierfür ein Beispiel. Beispiel für ein paar der erwähnten Konstrukte: public class IntArrayContainer { private int[] data; public IntArrayContainer(int[] mydata) { this.data = mydata; public IntArrayContainer() { this(new int[0]); public String tostring() { // Bei leeren Arrays ist das Ergebnis nicht optimal! StringBuilder sb = new StringBuilder(); sb.append(" "); for(int i : this.data) { sb.append(i); sb.append(" "); String mystring = sb.tostring(); return mystring; public static void main(string[] args) { System.out.println(new IntArrayContainer(new int[] { 1, 2, 3)); System.out.println(new IntArrayContainer(new int[] { 77 )); System.out.println(new IntArrayContainer(new int[0])); Die main-methode erzeugt folgende Ausgabe: 1 2 3 77 Lösung: public class ArrayStack { * Hier werden die Stack-Einträge gespeichert. private int[] data; * Das nächste zu schreibende Element (= Anzahl der Elemente auf dem Stack) private int topofstack;

* Lege einen leeren Stack an. public ArrayStack() { this(5); * Legt einen Stack mit der Anfangskapazität <code>initialcapacity</code> * an. Die Kapazität wirkt sich nicht auf das beobachtbare Verhalten aus * (sprich: sie wird bei bedarf erweitert). public ArrayStack(int initialcapacity) { assert initialcapacity >= 0; this.data = new int[initialcapacity]; topofstack = 0; * Lege einen neuen Stack an, belege ihn mit den Elementen * <code>elements</code>. public ArrayStack(int[] elements) { this(elements.length); // Nicht schnell, aber dafür einfach: for (int elem : elements) { push(elem); * Copy constructor: Erzeuge eine neue Instanz als echte Kopie von * <code>other</code>. public ArrayStack(ArrayStack other) { this.data = new int[other.data.length]; System.arraycopy(other.data, 0, this.data, 0, other.data.length); this.topofstack = other.topofstack; * Stelle einen neuen Wert auf den Stack, erweitere gegebenenfalls die * Kapazität. public void push(int value) { if (this.topofstack >= data.length) { extendcapacity(); this.data[this.topofstack] = value; this.topofstack++; * Hilfsfunktion: Verdopple Kapazität.

private void extendcapacity() { int newlength = this.data.length * 2; if (newlength == 0) { // Zur Sicherheit: Möglicherweise war die Anfangskapazität = 0 newlength = 2; int[] newdata = new int[newlength]; System.arraycopy(this.data, 0, newdata, 0, this.data.length); this.data = newdata; * Entferne den obersten Wert vom Stack und gib ihn zurück. public int pop() { assert this.topofstack > 0; this.topofstack--; return this.data[topofstack]; * Lies den obersten Wert vom Stack aus. public int peek() { assert this.topofstack > 0; return this.data[topofstack - 1]; * Gib den momentanen Stackzustand als String zurück. public String tostring() { StringBuilder sb = new StringBuilder(); sb.append("arraystack["); for (int i = 0; i < this.topofstack; i++) { if (i > 0) { sb.append(", "); sb.append(this.data[i]); sb.append("]"); return sb.tostring(); public static void main(string[] args) { ArrayStack stack = new ArrayStack(); stack.push(5); stack.push(3); System.out.println("-->" + stack.pop()); System.out.println("-->" + stack.peek());

Abgabe: Per UniWorx, bis spätestens Montag, den 5.6.2006 um 9:00 Uhr.