Lösungen zum Übungsblatt 10: Entwicklung von Softwaresystemen I (WS 2003/04)

Ähnliche Dokumente
16. Dezember 2004 Dr. M. Schneider, P. Ziewer

Fortgeschrittene Programmiertechnik Klausur WS 2014/15 Angewandte Informatik Bachelor

Lösungsvorschläge. zu den Aufgaben im Kapitel 4

ihrer Klasse benötigt die Funktion einfuegenan:

Java-Schulung Grundlagen

Geordnete Binärbäume

System.out.println("TEXT");

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 16/17. Kapitel 14. Bäume. Bäume 1

Bäume. Text. Prof. Dr. Margarita Esponda SS 2012 O4 O5 O6 O ALP2-Vorlesung, M. Esponda

Objektorientierte Programmierung

Bäume. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 10: Collections 4. Inhalt. Bäume. Einführung. Bäume.

Klausur Software-Entwicklung September 00

Schnittstellen, Stack und Queue

Aufgabe 1: Objekte, Klassen, Vererbung (15 Punkte)

ALP II Dynamische Datenmengen

Einstieg in die Informatik mit Java

public class SternchenRechteckGefuellt {

Datenstrukturen und Abstrakte Datentypen

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

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

Beispiel: DB-Mock (1/7)

Distributed Computing Group

Vorlesung Datenstrukturen

1. Erste Schritte 2. Einfache Datentypen 3. Anweisungen und Kontrollstrukturen 4. Verifikation 5. Reihungen (Arrays)

Primitive Datentypen

Allgemeine Hinweise:

Klausur zur Informatik A WS 2001/2002 Name: Korrektor: Punkte: a) Zeichnen Sie zu der nachstehenden Syntax in EBNF die passenden Syntaxdiagramme.

II.3.1 Rekursive Algorithmen - 1 -

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java:

Programmiertechnik II Klausur WS 15/16 Angewandte Informatik Bachelor

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 14/15. Kapitel 11. Fehler und Ausnahmen 1

Java - Programmierung - Objektorientierte Programmierung 1

Name: Matrikelnr : Aufgabe 1: (ca. 8 Punkte )

Arrays (Reihungen) Arrays (Reihungen) in Java: Syntax, Typisierung, Semantik.

15 Fehlerobjekte: Werfen, Fangen, Behandeln

Grundlagen der Programmierung Prof. H. Mössenböck. 14. Schrittweise Verfeinerung

Arbeitsblätter für die Lehrveranstaltung OOP JAVA 1

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 11/12. Kapitel 13. Bäume. Bäume

1. Typen und Literale (6 Punkte) 2. Zuweisungen (6 = Punkte)

Programmdokumentation

Musterlösung Stand: 5. Februar 2009

Programmierkurs Java

Objektorientierte Programmierung

Praxis der Programmierung

Suchbäume. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Einstieg in die Informatik mit Java

II.4.1 Unterklassen und Vererbung - 1 -

Java: Vererbung. Teil 3: super()

Kapitel 10. Programmierkurs. Grundlagen von Exceptions Behandlung von Exceptions

Grafik-Programmierung

Verkettete Listen. Implementierung von einfach verketteten Listen. Implementierung von doppelt verketteten Listen

Vorlesung Informatik 2 Algorithmen und Datenstrukturen

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

Praktikum Informatik II Prof. Dr. Martin Trauth, Dr. Michael Männel

Kapitel 3: Datentyp Liste

Algorithmen und Datenstrukturen (ESE) Entwurf, Analyse und Umsetzung von Algorithmen (IEMS) WS 2014 / Vorlesung 10, Donnerstag 8.

1. Aufgabe (6 Punkte): Java-Programmierung (Arrays)

! 1. Unterklassen und Vererbung! 2. Abstrakte Klassen und Interfaces! 3. Modularität und Pakete! 4. Ausnahmen (Exceptions) II.4.

Fortgeschrittene Programmiertechnik Klausur WS 2014/15 Angewandte Informatik Bachelor

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

Informatik II Vorlesung am D-BAUG der ETH Zürich

Vorkurs Informatik Wintersemester 2015/2016. Programmtexte

Klausur Programmieren 2 WS2016/17

Musterlösungen zur Klausur Informatik 3

1 Polymorphie (Vielgestaltigkeit)

Programmieren in Java

Klausur Grundlagen der Informatik 9. April 2015

Algorithmen und Programmierung II

ALP II Dynamische Datenmengen Datenabstraktion (Teil 2)

Beispiel: Methode mit einem Fehler. Diese Methode wird problematisch, wenn von außen eine Dauer von 0 Sekunden angegeben wird, etwa im Aufruf

Informatik II. /* c) Baumstruktur in einen String schreiben und zurueckgeben */ public String tostring() {

Innere Klassen. Innere Klassen. Page 1. Lernziele: innere Klassen, statische geschachtelte Klassen, anonyme Klassen.

Dr. Monika Meiler. Inhalt

Bitte beachten Sie: Es gibt mehr als einen Lösungsweg. Ihre Lösung kann auch richtig sein, wenn sie nicht mit der hier gezeigten Lösung übereinstimmt.

Informatik 1 - Translation Studies in Information Technology. Musterlösung zum Aufgabenblatt der ersten Pflichtübung im Wintersemester 16/17

Technische Universität München WS 2004/2005 Fakultät für Informatik 11. Dezember 2004 Prof. Dr. Seidl

Exceptions. Prof. Dr. Margarita Esponda SS M. Esponda-Argüero

Programmieren 2 Java Überblick

Java-Implementierung der Priority-Queue und des Huffman-Algorithmus Effiziente Algorithmen SS12 Übung 4 Aufgabe 5 Johannes Hein

1 Organisatorisches. 2 Compilezeit- und Laufzeitfehler. 3 Exceptions. 4 Try-Catch-Finally

Informatik II. PVK Part1 Severin Wischmann n.ethz.ch/~wiseveri

Einführung in die Programmierung für Wirtschaftsinformatik

Musterlösung: IntToGerman

Einführung in die Programmierung WS 2009/10. Übungsblatt 9: Objekt-Orientierung

MB2-ALG, SS15 Seite 1 Hauptklausur, geschrieben am

class BahnTest2 { public static void main(string[] args) { Zug myice = new Zug("ICE Duisburg", 1200, 0, 50); BahnCardFahrer kunde2 = new BahnCardFahre

2 Java: Bäume. 2.1 Implementierung von Bäumen. 2.2 Implementierung eines binären Suchbaums. 2.3 Traversierung von Bäumen

Informatik II - Übung 04. Christian Beckel Besprechung Übungsblatt 3

JAVA - Methoden

Große Übung Praktische Informatik 1

Fortgeschrittene Programmiertechnik Klausur SS 2015 Angewandte Informatik Bachelor

In C und Java müssen Variablen und Methodenergebnisse durch Typangaben erläutert werden. Welche der folgenden Aussagen sind korrekt und welche nicht:

Binärbäume. Prof. Dr. E. Ehses,

1.) Zahlensysteme (10 Punkte)

Java Einführung Methoden. Kapitel 6

1 Fehler-Objekte: Werfen, Fangen, Behandeln

Exceptions: Parameterprüfung import java.io.ioexception;

5. Tutorium zu Programmieren

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

JAVA - Methoden - Rekursion

Transkript:

Prof. Dr. A. Poetzsch-Heffter Dipl.-Inform. N. Rauch Dipl.-Inform. C. Stenzel Technische Universität Kaiserslautern Fachbereich Informatik AG Softwaretechnik Lösungen zum Übungsblatt 10: Entwicklung von Softwaresystemen I (WS 2003/04) Aufgabe 1 Objektorientierte Implementierung (praktisch) (10 Punkte) a) class Flugliniencomputer { private String fluglinie; /* Das folgende Attribut realisiert die Beziehung "verwaltet". */ private Flug[] fluege; public Flugliniencomputer(String fluglinie) { this.fluglinie = fluglinie; this.fluege = new Flug[0]; public String getfluglinie() { return fluglinie; public void einfuegenflug(flug flug) { for (int i = 0; i < fluege.length; i++) if (fluege[i] == flug) return; Flug[] neufluege = new Flug[fluege.length+1]; for (int i = 0; i < fluege.length; i++) neufluege[i] = fluege[i]; neufluege[fluege.length] = flug; fluege = neufluege; public boolean existiertflug(string von, String nach, String wann) { for (int i = 0; i < fluege.length; i++){ if (fluege[i].getvon().equals(von) && fluege[i].getnach().equals(nach) && fluege[i].getwann().equals(wann)) return true; return false; public Flug getflug(string von, String nach, String wann) { for (int i = 0; i < fluege.length; i++){ if (fluege[i].getvon().equals(von) && fluege[i].getnach().equals(nach) && fluege[i].getwann().equals(wann)) return fluege[i]; return null; public boolean existiertfreierplatz(flug flug) { return!flug.istkapazitaetausgeschoepft();

public void buchen(flug flug, String reisebuero, String kunde) { flug.einfuegenbuchung(new Buchung(reisebuero,kunde,flug)); public boolean existiertbuchung(flug flug, String reisebuero, String kunde) { return flug.existiertbuchung(reisebuero,kunde); public void stornieren(flug flug, String reisebuero, String kunde) { if (flug.existiertbuchung(reisebuero,kunde)) flug.entfernenbuchung(flug.getbuchung(reisebuero,kunde)); class Terminal { private String reisebuero; /* Das folgende Attribut realisiert die Beziehung "bezieht_daten". */ private Flugliniencomputer[] flcs; public Terminal(String reisebuero, Flugliniencomputer[] flcs) { this.reisebuero = reisebuero; this.flcs = flcs; public String getreisebuero() { return reisebuero; public boolean existiertfreierplatz(string von, String nach, String wann, String linie) { for (int i = 0; i < flcs.length; i++){ if (flcs[i].existiertfreierplatz(flug)) return true; return false; public void buchen(string von, String nach, String wann, String linie, String kunde) { for (int i = 0; i < flcs.length; i++) if (flcs[i].existiertfreierplatz(flug)) { flcs[i].buchen(flug,reisebuero,kunde); return; public boolean existiertbuchung(string von, String nach, String wann, String linie, String kunde) { for (int i = 0; i < flcs.length; i++){ 2

if (flcs[i].existiertbuchung(flug,reisebuero,kunde)) return true; return false; public void stornieren(string von, String nach, String wann, String linie, String kunde) { for (int i = 0; i < flcs.length; i++) if (flcs[i].existiertbuchung(flug,reisebuero,kunde)) { flcs[i].stornieren(flug,reisebuero,kunde); return; class Mitarbeiter { private Terminal terminal; public Mitarbeiter (Terminal terminal) { this.terminal = terminal; public Terminal getterminal() { return terminal; public void buchen(string von, String nach, String wann, String fluglinie, String kunde) { System.out.println("\nIch versuche einen Platz für den Flug von "+von+ " nach "+nach+"\nam "+wann+" mit der Linie "+fluglinie+ " für "+kunde+" zu buchen."); if (terminal.existiertfreierplatz(von,nach,wann,fluglinie)) { System.out.println("Es gibt noch freie Plätze."); terminal.buchen(von,nach,wann,fluglinie,kunde); System.out.println("Ich habe Ihren Flug gebucht."); System.out.println("Vielen Dank für Ihren Besuch bei "+ terminal.getreisebuero()+"."); else System.out.println("Alle Plätze sind bereits belegt "+ "oder es gibt keinen solchen Flug"); public void stornieren(string von, String nach, String wann, String fluglinie, String kunde) { System.out.println("\nIch versuche die Buchung für den Flug von "+von+ " nach "+nach+"\nam "+wann+" mit der Linie "+fluglinie+ " für "+kunde+" zu stornieren."); if (terminal.existiertbuchung(von,nach,wann,fluglinie,kunde)) { System.out.println("Es gibt eine solche Buchung."); terminal.stornieren(von,nach,wann,fluglinie,kunde); System.out.println("Ich habe Ihre Buchung storniert."); System.out.println("Vielen Dank für Ihren Besuch bei "+ terminal.getreisebuero()+"."); else System.out.println("Sie haben für den Flug nicht gebucht."); 3

(8 Punkte) b) public static void main(string[] args) { Flugliniencomputer softfall = new Flugliniencomputer("SoftFall-Air"), hartfall = new Flugliniencomputer("HartFall-Air"); /* Die Kapazität des Fluges von SoftFall-Air muss 2 sein, damit * das Szenario funktioniert. */ softfall.einfuegenflug(new Flug("SoftFall-Air","A","B","Montag",2)); hartfall.einfuegenflug(new Flug("HartFall-Air","A","B","Montag",2)); Flugliniencomputer[] flcs = {softfall,hartfall; Mitarbeiter ma_lasthour = new Mitarbeiter(new Terminal("LastHour",flcs)); Mitarbeiter ma_flying = new Mitarbeiter(new Terminal("Flying-Discounter",flcs)); ma_lasthour.buchen("a","b","montag","softfall-air","hans Hansen"); ma_flying.buchen("a","b","montag","softfall-air","maria Maroni"); ma_flying.buchen("a","b","montag","hartfall-air","anton Antonio"); ma_lasthour.buchen("a","b","montag","softfall-air","marco Marconi"); ma_lasthour.stornieren("a","b","montag","softfall-air","hans Hansen"); (2 Punkte) Aufgabe 2 Verkettete Objektstrukturen (12 Punkte) a) class SLEntry { String data; SLEntry next; public class StringList { SLEntry first; int size; public void addfirst(string s){ SLEntry newelem = new SLEntry(); newelem.data = s; newelem.next = first; first = newelem; size++; public int size() { return size; public void print(){ SLEntry iter = first; while( iter!= null ){ System.out.print(iter.data); iter = iter.next; if( iter!= null ) System.out.print(" "); // i bezeichnet die Einfuegeposition. // 1 bezeichnet das Einfuegen vor dem // ersten Listenelement usw. public void insertat(int i, String s){ if (i < 1 i > size+1) return; if (i == 1) addfirst(s); else { int pos = 1; SLEntry iter = first; // wir bleiben einen Schritt vor // der neuen Position stehen while (++pos < i) iter = iter.next; // jetzt steht iter auf dem Element, // nach dem eingefuegt werden soll SLEntry newnode = new SLEntry(); newnode.next = iter.next; newnode.data = s; iter.next = newnode; size++; // i bezeichnet die Nummer des zu // entfernenden Knotens. 1 bezeichnet // den ersten Knoten usw. public String removeat( int i ){ if (i < 1 i > size) return null; String s; 4

if (i == 1) { // erstes Element s = first.data; first = first.next; else { int pos = 1; SLEntry iter = first; // wir bleiben einen Schritt vor // der neuen Position stehen while (++pos < i) iter = iter.next; // jetzt stehen wir vor dem zu // entfernenden Element s = iter.next.data; iter.next = iter.next.next; size--; return s; (3 Punkte) b) In der umbenannten Klasse aus Teilaufgabe 1 müssen alle Vorkommen von String durch ListTreeNode ersetzt werden. Ein Eintrag in dieser Liste ist damit logischerweise: class LTNLEntry { ListTreeNode node; LTNLEntry next; Außerdem muss die print-methode angepasst werden: public void print(){ LTNLEntry iter = first; while( iter!= null ){ iter.node.print(); iter = iter.next; if( iter!= null ) System.out.print(" "); Die Klasse ListTreeNode kann dann folgendermaßen aussehen: public class ListTreeNode { String data; LTNList children; ListTreeNode(String s){ data = s; children = new LTNList(); void add(string s){ data = s; void add(listtreenode t){ children.addfirst(t); void print(){ System.out.print(data + " "); children.print(); (5 Punkte) c) public class TreeNode { String data; // Listen-Verkettung (rechter Nachbar) TreeNode next; // Baum-Verkettung (erster Kindknoten) TreeNode child; public void add(string s){ data = s; // fuegt einen neuen Knoten als erstes // Kind ein public void add(treenode n){ if (n!= null) { n.next = child; child = n; // durchlaeuft den gesamten Baum (depth-first) // und gibt die gespeicherten Strings aus public void print(){ System.out.print(data+" "); if (child!= null) child.print(); if (next!= null) next.print(); (4 Punkte) 5

Aufgabe 3 Ausnahmebehandlung (8 Punkte) a) int intfromstring(string s) { if (s == null) throw new NullPointerException(); try { return Integer.parseInt(s); catch (NumberFormatException e) { return 0; b) Das Verfahren lässt sich wie folgt veranschaulichen: y (3 Punkte) f(x) x 2 x 0 x 1 x Es gilt nach den Strahlensätzen: x 0 x 2 f(x 0) = x1 x2 f(x 1) f(x 0 )f(x 1 ) x 0 f(x 1 ) x 2 f(x 1 ) = x 1 f(x 0 ) x 2 f(x 0 ) + x 2 f(x 0 ) x 0 f(x 1 ) x 2 (f(x 0 ) f(x 1 )) = x 1 f(x 0 ) x 0 f(x 1 ) : (f(x 0 ) f(x 1 )) x 2 = x1 f(x0) x0 f(x1) f(x 0) f(x 1) Das Verfahren funktioniert nicht, wenn x 0 = x 1 ist, da dann die Gerade g nicht eindeutig bestimmt ist. Aber auch bei y 0 = y 1 versagt das Verfahren, da g dann keinen Schnittpunkt mit der x-achse hat. Bei der Ausführung auf einem Rechner müssen außerdem Bereichsüberschreitungen (Über- bzw. Unterläufe) abgefangen werden. public static double next (double x0, double x1) throws Exception { double y0 = f(x0), y1 = f(x1); double result; if (Double.isInfinite(x0) Double.isNaN(x0) Double.isInfinite(x1) Double.isNaN(x1) Double.isInfinite(y0) Double.isNaN(y0) Double.isInfinite(y1) Double.isNaN(y1)) throw new Exception ("Ungültiger Stütz- oder Funktionswert"); if (Double.compare(x0,x1) == 0) throw new Exception ("Zwei gleiche Stützwerte übergeben"); if (Double.compare(y0,y1) == 0) throw new Exception ("Zwei gleiche Funktionswerte an Stützstellen"); result = (x1*y0 - x0*y1)/(y0-y1); if (Double.isNaN(result) Double.isInfinite(result)) throw new Exception("Bereichsüberschreitung"); return result; (5 Punkte) 6