Lösungshinweise/-vorschläge zum Übungsblatt 4: Software-Entwicklung 1 (WS 2017/18)

Ähnliche Dokumente
Programmierkurs Java

JAVA für Nichtinformatiker - Probeklausur -

Informatik B von Adrian Neumann

Sie müssen den Test bis 20:00 Uhr am Abgabetag dieses Übungszettels absolviert haben.

public class SternchenRechteckGefuellt {

Übungsblatt 2. Java Vorkurs (WS 2015)

Java: Eine kurze Einführung an Beispielen

Java 8. Elmar Fuchs Grundlagen Programmierung. 1. Ausgabe, Oktober 2014 JAV8

Einführung Datentypen Verzweigung Schleifen Funktionen Dynamische Datenstrukturen. Java Crashkurs. Kim-Manuel Klein

Tutoraufgabe 1 (Programmanalyse):

Arbeitsblatt zu Methoden

System.out.println("TEXT");

Einführung Datentypen Verzweigung Schleifen. Java Crashkurs. Kim-Manuel Klein May 4, 2015

Programmierstarthilfe SS 2008 Fakultät für Ingenieurwissenschaften und Informatik 5. Blatt Für den 26. und

Einführung in die Java- Programmierung

Objektorientierte Programmierung OOP Programmieren mit Java

FAKULTÄT FÜR INFORMATIK

Bei for-schleifen muss man nur immer bedenken, dass die letzte Anweisung immer erst nach der Ausführung der restlichen Anweisungen der Schleife

Tutoraufgabe 1 (Zweierkomplement): Lösung: Programmierung WS16/17 Lösung - Übung 2

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

Programmierung WS12/13 Lösung - Übung 1 M. Brockschmidt, F. Emmes, C. Otto, T. Ströder

Probeklausur: Programmierung WS04/05

Propädeutikum zur Programmierung

1.) Zahlensysteme (10 Punkte)

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

Klausur Fachprüfung Wirtschaftsinformatik. Name:

Wiederholung Wozu Methoden? Methoden Schreiben Methoden Benutzen Rekursion?! Methoden. Javakurs 2012, 3. Vorlesung

Praktikum zur Vorlesung Einführung in die Programmierung WS 14/15 Blatt 3

Internationaler Studiengang Medieninformatik

Algorithmen und Programmierung II

Übungen zu Algorithmen

Arrays und Schleifen

Praktikum zu Einführung in die Informatik für LogWings und WiMas Wintersemester 2013/14

Klausur Software-Entwicklung September 00

Informatik II Musterlösung

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

Institut für Informatik und Angewandte Kognitionswissenschaften

Repetitorium Informatik (Java)

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

Autor: Michael Spahn Version: 1.0 1/10 Vertraulichkeit: öffentlich Status: Final Metaways Infosystems GmbH

Einstieg in die Informatik mit Java

Übungsblatt 4. Java Vorkurs (WS 2015)

Die einfachsten Anweisungen

Beispiel: Temperaturumwandlung. Imperative Programmierung. Schwerpunkte. 3. Grundlegende Sprachkonstruktionen imperativer Programme

3. Grundlegende Sprachkonstruktionen imperativer Programme

Grundlagen der Programmierung Teil1 Einheit III Okt. 2010

Übungen zur Vorlesung Einführung in die Informatik Wintersemester 2010/11

5. Tutorium zu Programmieren

Zeichendarstellung. Zeichen sind Zahlen (in C) Zeichen und switch

Arbeitsblätter für die Lehrveranstaltung OOP JAVA 1

Einführung in die Informatik I Informatik I/A

Übung Informatik I - Programmierung - Blatt 3

Eingabe und Ausgabe in Java. Dr. Horst Treiblmaier Abteilung für Wirtschaftsinformatik WU Wien

Grundlagen der Programmierung Prof. H. Mössenböck. 4. Schleifen

1 Aufgaben 1.1 Objektorientiert: ("extended-hamster") Sammel-Hamster

Standardkonstrukte in Java

Einstieg in die Informatik mit Java

Tag 4 Repetitorium Informatik (Java)

Java Cheatsheet. Mehrzeiliger Kommentar (beginnt mit /* und endet mit */)

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

Allgemeine Hinweise:

PIWIN 1 Übung Blatt 5

JAVA - Methoden

Klassen und Objekte. Klassen sind Vorlagen für Objekte. Objekte haben. Attribute. Konstruktoren. Methoden. Merkblatt

Bearbeitungszeit: 120 Minuten. Kommentare kosten Zeit; kommentieren Sie ihr Programm nur da, wo der Code alleine nicht verständlich wäre.

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

Einstieg in die Informatik mit Java

Ausdrucksbäume in verschiedenen Darstellungen

Prüfung Informatik D-MATH/D-PHYS :00 11:00

Modul Entscheidungsunterstützung in der Logistik. Einführung in die Programmierung mit C++ Übung 2

Elementare Konzepte von

Grundzüge der Wirtschaftsinformatik WS 2002/03. Wiederholung Java. Programmierzyklus. Heiko Rossnagel Problem

Die for -Schleife HEUTE. Schleifen. Arrays. Schleifen in JAVA. while, do reichen aus, um alle iterativen Algorithmen zu beschreiben

Java Einführung Methoden. Kapitel 6

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

Primitive Datentypen

Tutoren Jan Ebbe Tatjana Frank Cedric Geissmann Sascha Scherrer Alexander Stiemer

Es ist für die Lösung der Programmieraufgabe nicht nötig, den mathematischen Hintergrund zu verstehen, es kann aber beim Verständnis helfen.

Übersicht. Informatik 2 Teil 3 Anwendungsbeispiel für objektorientierte Programmierung

Einstieg in die Informatik mit Java

Programmieren I. Kapitel 5. Kontrollfluss

E-/A-Funktionalität nicht Teil der Programmiersprache

Tutoraufgabe 1 (Überladen von Methoden):

Java programmieren mit JavaKara. Eine Zusammenfassung in Beispielen

Programmieren in C (Übungsblatt 1)

Einführung in die Programmierung für Wirtschaftsinformatik

Tutoraufgabe 1 (Programmanalyse):

Android will doch nur spielen. Java Übung

Dr. Monika Meiler. Inhalt

Musterlösung Stand: 5. Februar 2009

Probeklausur: Programmierung WS04/05

6 Speicherorganisation

Übersicht PERL. !!!! Wichtig: Nach dem Befehl einem Strichpunkt setzen!!!!

AuD-Tafelübung T-B5b

Graphische Benutzungsoberflächen

Ausgabe: :00 Abgabe: :00. Sie müssen bei Ihren Lösungen eine maximale Zeilenbreite von 120 Zeichen einhalten.

1 Aufgaben 1.1 Umgebungsvariable setzen: CLASSPATH

Wie entwerfe ich ein Programm?

Einführung in die Programmierung WS 2016/17. Übungsblatt 9: Objekt-orientierte Programmierung

16. Dezember 2004 Dr. M. Schneider, P. Ziewer

Transkript:

Dr. Annette Bieniusa Mathias Weber, M. Sc. Peter Zeller, M. Sc. TU Kaiserslautern Fachbereich Informatik AG Softwaretechnik Lösungshinweise/-vorschläge zum Übungsblatt 4: Software-Entwicklung 1 (WS 2017/18) Die Hinweise und Vorschläge in diesem Dokument sollen der Lösungsfindung dienen und erheben demnach weder Anspruch auf Vollständigkeit noch Korrektheit. Sollten Sie Fehler finden, würden wir uns freuen, wenn Sie uns diese mitteilen. (Kontaktdaten finden Sie auf unserer Webpräsenz.) Aufgabe 1 Arrays und Prozeduren (11 Punkte) Laden Sie sich für diese Aufgabe die Vorlage ArraysAndProcedures.java herunter. Diese enthält bereits Vorlagen für die zu implementierenden Prozeduren. Zum Testen können Sie die main-prozedur anpassen und mit der Bibliotheksfunktion Arrays.toString(ar) die Ergebnisse ausgeben. Verwenden Sie für diese Aufgabe sonst keine weiteren Bibliotheksfunktionen. a) Schreiben Sie eine Prozedur replaceall, welche zwei int Werte x und y sowie ein Array von int-werten nimmt. Die Prozedur soll dann alle Vorkommen von x im gegebenen Array durch y ersetzen. Dies ist eine typischer Fall, bei dem eine Prozedur nur für ihre Seiteneffekte aufgerufen wird: Das übergebene Array wird verändert und es wird kein Wert zurückgegeben. Die Prozedur replaceall ist auch typisches Beispiel für eine Prozedur, bei der eine Operation auf alle Elemente eines Arrays angewendet wird. Solche Prozeduren können immer nach dem gleichen Schema programmiert werden, nur der Schleifenrumpf ist jeweils anders. public static void replaceall( int x, int y, int[] ar) for ( int i=0; i<ar. length; i++) if (ar[i] == x) ar[i] = y; b) Schreiben Sie zwei weitere Prozeduren wie replaceall. Eine Variante replacefirst, die nur das erste Vorkommen im Array ersetzt und eine andere replacelast, die nur das letzte Vorkommen im Array ersetzt. Die Lösungen hier zeigt das Verwenden von break um die Schleife frühzeitig abzubrechen und das Iterieren durch ein Array in umgekehrter Richtung. public static void replacefirst( int x, int y, int[] ar) for ( int i=0; i<ar. length; i++) if (ar[i] == x) ar[i] = y; break; public static void replacelast( int x, int y, int[] ar) for ( int i=ar. length -1; i>=0; i--)

if (ar[i] == x) ar[i] = y; break; c) Schreiben Sie eine Prozedur substall, welche wie replaceall funktioniert, jedoch das Eingabe-Array nicht verändert, sondern ein neues Array mit dem Ergebnis zurückliefert. Wichtig ist hier den Unterschied zu replaceall zu verstehen. Beim Lösen einer Aufgabe ist es wichtig, genau darauf zu achten, welche Variante verlangt ist. Beim Schreiben einer eigenen Prozedur muss man sich überlegen, welche Variante für den konkreten Fall besser geeignet ist. Eine Variante ohne Seiteneffekte wie substall ist oft leichter zu verstehen, ist aber manchmal weniger effizient. public static int[] substall( int x, int y, int[] ar) int[] res = new int[ar. length]; for ( int i=0; i<ar. length; i++) if (ar[i] == x) res[i] = y; else res[i] = ar[i]; return res; d) Schreiben Sie eine Prozedur onlyeven, welche ein Array von int-werten nimmt und ein neues Array zurückgibt, in dem sich nur die geraden Zahlen aus dem ursprünglichen Array befinden. Die Prozedur onlyeven ist ein typisches Beispiel für eine Prozedur, die alle Elemente aus einem Array auswählt, die ein bestimmtes Kriterium erfüllen. Oft wird diese Art der Operation auch filter genannt. In der folgenden Lösung ist das Kriterium iseven in eine extra Prozedur ausgelagert um die Lesbarkeit zu verbessern. Für ein anderes Auswahlkriterium kann hier einfach eine andere Prozedur eingesetzt werden. Die Prozedur onlyeven zeigt auch das Problem, dass sich Arrays nach dem Erstellen nicht in der Länge verändern lassen. Wir berechnen deshalb zuerst die benötigte Länge und erstellen dann das neue Array für die Rückgabe. public static boolean iseven( int x) return x % 2 == 0; public static int[] onlyeven( int[] ar) // Anzahl der Geraden Zahlen berechnen: int evencount = 0; for ( int i=0; i<ar. length; i++) if (iseven(ar[i])) evencount = evencount + 1; // Array der richtigen Größe anlegen: int[] res = new int[ evencount]; int insertposition = 0; for ( int i=0; i<ar. length; i++) if (iseven(ar[i])) res[ insertposition] = ar[i]; insertposition ++; return res;

e) Schreiben Sie eine Prozedur allhavezero, welche ein Array von int-arrays nimmt und prüft, ob alle Arrays die Zahl 0 enthalten. Diese Aufgabe ist ein Beispiel für das Verwenden von mehrdimensionalen Arrays. Die Lösung zeigt auch zwei Muster mit denen man Fragen wie die folgenden beantworten kann: existiert ein Element mit einer bestimmten Eigenschaft im Array? und gilt eine bestimmte Eigenschaft für alle Elemente im Array?. Für die Existenz-Frage geben wir true zurück sobald wir ein entsprechendes Element gefunden haben. Wenn wir nach Durchlaufen des Arrays kein passendes Element gefunden haben geben wir false zurück. Für die Für alle -Frage geben wir false zurück, sobald ein Element die Eigenschaft nicht erfüllt. Wenn wir am Ende kein solches Element gefunden haben, geben wir true zurück. public static boolean containszero( int[] ar) for ( int j=0; j<ar. length; j++) if (ar[j] == 0) return true; return false; public static boolean allhavezero( int[][] arrays) for ( int i=0; i<arrays. length; i++) if (! containszero( arrays[i])) return false; return true; Aufgabe 2 2D-Arrays (11 Punkte) In dieser Aufgabe soll ein Programm entwickelt werden, welches Zahlen mit bis zu drei Stellen in ein geeignetes Format für eine LED-Matrix-Anzeige umwandelt. Bei einer LED-Matrix-Anzeige werden Ziffern durch eine Anzahl an Leuchtdioden angezeigt. Diese sind in einem Rechteck angeordnet. Durch das aktivieren und deaktivieren bestimmter LEDs kann das angezeigte Muster verändert werden. Wir gehen in dieser Aufgabe von einer Matrix von drei LEDs in der Breite und fünf LEDs in der Höhe für jede Ziffer aus. Die Ziffern sollen auf der Anzeige wie folgt angezeigt werden: Die Matrixrepräsentation einer Zahl besteht aus einer Matrix mit 5 Zeilen und jeweils 9 Spalten aus 0 und 1. Ist eine Stelle gleich 1, so leuchtet die LED an dieser Stelle, ist die Stelle gleich 0 so ist die LED aus. Zur Anzeige stehen drei Ziffern zur Verfügung, sodass Zahlen zwischen 0 und 999 angezeigt werden können. Bei einstelligen und zweistelligen Zahlen sollen die ersten Ziffern dunkel bleiben. Aufgabe ist es, ein Programm ToMatrix zu schreiben, welches Zahlen von der Standardeingabe ließt bis diese leer ist und für jede dieser Zahlen die Matrixrepräsentation auf die Standardausgabe ausgibt. Die Matrix der nächsten Zahl folgt direkt darunter (ohne Trennung). Beispiel:

Die Matrixrepräsentation der Zahl 123 ist auf der linken Seite dargestellt. Diese wird wie rechts zu sehen auf der LED-Matrix angezeigt: 001111111 001001001 001111111 001100001 001111111 Hinweise: Zum Aufteilen der eingelesenen Zahl in Ziffern sind die Modulo Operation (%) und die Integer- Division (/) hilfreich. Überlegen Sie sich eine geeignete Einteilung in Prozeduren. Die Aufgabe, eine Ziffer an eine bestimmte Stelle in der Matrix zu schreiben kommt mehrfach mit verschiedenen Stellen vor. Zum Einlesen der Zahlen von der Standardeingabe können Sie die Bibliothek StdIn verwenden. Sie können das Programm ShowMatrix von der Vorlesungsseite verwenden, um die Anzeige zu kontrollieren. Dazu leiten Sie die Ausgabe Ihrer Implementierung von ToMatrix an das Programm ShowMatrix weiter durch java ToMatrix java ShowMatrix. public class ToMatrix static int[][][] digits = new int[][][] 1, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1,

;,,,, 0, 0, 1, 1, 1, 1 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1 static void put( int[][] character, int[][] display, int offsetx, int offsety) for ( int i = 0; i < 3; i++) for ( int j = 0; j < 5; j++) display[i + offsetx][j + offsety] = character[j][i]; public static void main( String[] args) // Display mit drei Spalten int spalten = 3; while (!StdIn.isEmpty()) int[][] display = new int[ spalten * 3][5]; int input = StdIn. readint(); if (input < 0) System. err. println(" Negative Zahlen nicht unterstuetzt!"); System.exit(1); if (input > 999) System. err. println(" Input zu gross!"); System.exit(1); for ( int position = spalten - 1; position >= 0; position --) int digit = input % 10; put( digits[ digit], display, position * 3, 0); input = input / 10; // wenn keine Digits mehr folgen, brich ab if (input == 0) break;

// Ausgabe for ( int j = 0; j < 5; j++) for ( int i = 0; i < spalten * 3; i++) StdOut. print( display[i][j]); StdOut. println(); Aufgabe 3 StdIn und StdOut (4 Punkte) Schreiben Sie eine Prozedur static String[] readstrings() in einer Datei ReadStrings.java, welche mit StdIn.readString() String-Werte von der Standardeingabe liest, bis die Standardeingabe leer ist und die Werte in einem Array speichert. Hinweis: Arrays können in Java nach ihrer Erstellung nicht vergrößert oder verkleinert werden. Legen Sie deshalb zu Beginn der Prozedur ein Array der Größe 5 an und erstellen Sie ein neues Array der doppelten Größe, sobald das aktuelle Array zu klein wird. Kopieren Sie dann am Ende der Prozedur die Werte in ein Array der passenden Größe. static String[] readstrings() String[] result = new String[5]; int n = 0; while (!StdIn.isEmpty()) if (n >= result. length) result = resized( result, result. length*2); result[n] = StdIn. readstring(); n++; if (n < result. length) result = resized( result, n); return result; /** erstellt eine Kopie von einem Array mit anderer Groesse */ static String[] resized( String[] values, int newsize) String[] res = new String[ newsize]; copyvalues( values, res); return res; private static void copyvalues( String[] source, String[] destination) for ( int i = 0; i < source. length && i < destination. length; i++) destination[i] = source[i]; Aufgabe 4 Formatierte Ausgabe (3 Punkte) Schreiben Sie ein Programm SqrtTable, welches double-werte von der Standardeingabe liest und nach jeder gelesenen Zahl die Zahl selbst und die Wurzel der Zahl, jeweils durch Komma getrennt in einer Zeile aus-

gibt. Die Zahlen sollen dabei mit zwei Nachkommastellen ausgegeben werden. Verwenden Sie hierzu die Prozeduren StdIn.isEmpty, StdIn.readDouble, StdOut.printf, und Math.sqrt. public class SqrtTable public static void main( String[] args) while (!StdIn.isEmpty()) double d = StdIn. readdouble(); StdOut.printf("%.2f,%.2f%n", d, Math.sqrt(d)); Aufgabe 5 StdDraw (11 Punkte) a) Ändern Sie das Beispiel-Programm so ab, dass ein Balken-Diagramm gezeichnet wird, das etwa wie das oben gezeigte aussieht. Die Lösung zu Teilaufgabe a) müssen Sie nicht abgeben. Geben Sie am Ende nur eine Datei mit dem kompletten Programm ab, wie es in Aufgabe d) gefordert ist. Siehe Lösung von b) b) Schreiben Sie eine Prozedur void drawbar(double x, double width, String text, double height), welche einen einzelnen Balken des Balken-Diagramms zeichnet. Dabei ist der Parameter text der Text, der unter dem Balken angezeigt wird, x ist die x-koordinate für die Mitte des Balkens und width und height geben die Breite und Höhe des Balken an. Schreiben Sie Ihr Programm so um, dass diese Prozedur zum Zeichnen des Diagramms verwendet wird. public class BalkenDiagramm1 private static void drawbar( double x, double width, String text, double height) StdDraw. filledrectangle(x, 0.1 + height/2, width/2, height/2); StdDraw. text(x, 0.05, text); public static void main( String[] args) double width = 0.1; drawbar(0.2, width, "A", 0.5); drawbar(0.4, width, "B", 0.8); drawbar(0.6, width, "C", 0.3); drawbar(0.8, width, "D", 0.4); StdDraw. line(0, 0.1, 1, 0.1);

c) Schreiben Sie eine Prozedur void drawbars(string[] labels, double[] heights, double width, double gap), welche ein Array von String-Werten und ein Array von double-werten nimmt, die jeweils die- Beschriftung und Höhe eines Balken angeben. Außerdem nimmt die Prozedur die Breite der Balken width und den Abstand zwischen den einzelnen Balken gap. Sie können annehmen, dass es für jede Höhe ein Label gibt. Die Prozedur soll das Diagramm mit den gegeben Balken und Beschriftungen zeichnen, so wie es im obigen Bild zu sehen ist. Verwenden Sie zur Implementierung die Prozedur drawbar. static void drawbars( String[] labels, double[] heights, double width, double gap) // aktuelle Position auf der x- Achse double x = gap + width / 2; for ( int i = 0; i < heights. length; i++) drawbar(x, width, labels[i], heights[i]); x += width + gap; // Trennlinie zwischen Text und Balken StdDraw. line(0, 0.1, 1, 0.1); d) Schreiben Sie eine main-prozedur für Ihr Programm. Das Programm soll 2 Programm-Parameter nehmen: 1. Die Breite der Balken 2. Der Abstand zwischen den Balken Die Werte und Beschriftungen für das Diagramm sollen von der Standardeingabe gelesen werden (bis die Eingabe leer ist). Dabei soll immer zuerst ein String gelesen werden, der die Beschriftung angibt und dann ein dazugehöriger double-wert. Das gezeichnete Diagramm soll entsprechend den gegebenen Parametern die Prozedur drawbars verwenden, um ein Balkendiagramm zu zeichnen. java BarChart 0.1 0.03 < wahlen.txt public static void main( String[] args) double width = Double. parsedouble( args[0]); double gap = Double. parsedouble( args[1]); // Wiederverwenden von readstrings zum Einlesen der Labels und Werte String[] input = ReadStrings. readstrings(); // Aufteilen der Eingabe in Labels und Werte: String[] labels = new String[ input. length / 2]; double[] values = new double[ input. length / 2]; for ( int i=0; i<labels. length; i++) labels[i] = input[i*2]; values[i] = Double. parsedouble( input[i*2+1]); drawbars( labels, values, width, gap); e) (Zusatzaufgabe) Verbessern Sie Ihr Programm so, dass die Breite der Balken und der Abstand zwischen den Balken automatisch sinnvoll berechnet werden, wenn sie nicht als Programm-Parameter angegeben werden. f) (Zusatzaufgabe) Normalisieren Sie die Eingabewerte so, dass der größte Balken eine Höhe von 80% des Bildschirms hat. Beim Normalisieren sollen alle Werte mit dem gleichen Faktor multipliziert werden.

static double max( double[] values) double result = values [0]; for ( int i = 1; i < values. length; i++) result = Math. max( result, values[i]); return result; static void normalize( double[] values, double max) double maxinarray = max( values); double scale = max / maxinarray; for ( int i = 0; i < values. length; i++) values[i] = values[i] * scale; public static void main( String[] args) // Wiederverwenden von readstrings zum Einlesen der Labels und Werte String[] input = ReadStrings. readstrings(); // Aufteilen der Eingabe in Labels und Werte: String[] labels = new String[ input. length / 2]; double[] values = new double[ input. length / 2]; for ( int i=0; i<labels. length; i++) labels[i] = input[i*2]; values[i] = Double. parsedouble( input[i*2+1]); if ( labels. length == 0) System. out. println(" Keine Daten angegeben"); return; // Zusatzaufgabe: Breite und Abstand automatisch anpassen, wenn nicht spezifiziert: double width; double gap; if ( args. length == 2) width = Double. parsedouble( args[0]); gap = Double. parsedouble( args[1]); else // Abstand zwischen Balken macht 20% der Breite aus double relativegapsize = 0.2; // Es soll gelten: // 1) n* width + (n+1)* gap == 1.0 // 2) gap == relativegapsize * ( gap + width) // Daraus ergibt sich folgende Berechnung: double widthplusgap = 1.0 / ( labels. length + relativegapsize); width = (1 - relativegapsize) * widthplusgap; gap = relativegapsize * widthplusgap; // Zusatzaufgabe: Höhen normalisieren: normalize( values, 0.8); drawbars( labels, values, width, gap);