diff --git a/Klausuren/Sd1/2016summer.failed/Exam/.gitignore b/Klausuren/Sd1/2016summer.failed/Exam/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..0f65e3ad793981d41fbc541f88a6dc777597c115 --- /dev/null +++ b/Klausuren/Sd1/2016summer.failed/Exam/.gitignore @@ -0,0 +1,5 @@ +/.classpath +/.project +/.settings +/.A1.log +/dependency-reduced-pom.xml diff --git a/Klausuren/Sd1/2016summer.failed/Exam/pom.xml b/Klausuren/Sd1/2016summer.failed/Exam/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..3dbf0a16474ad90f793d2a3952d284a89ab0e9f8 --- /dev/null +++ b/Klausuren/Sd1/2016summer.failed/Exam/pom.xml @@ -0,0 +1,65 @@ +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + + <groupId>de.hdm-stuttgart.sw1.klausur</groupId> + <artifactId>sw1_2016sommer_exam</artifactId> + <version>0.8</version> + <packaging>jar</packaging> + + <name>sw1_2016sommer_exam</name> + <url>https://freedocs.mi.hdm-stuttgart.de</url> + + <properties> + <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> + </properties> + + <repositories> + <repository> + <id>hdm-mi-internal-maven-repo</id> + <url>https://maven.mi.hdm-stuttgart.de/artifacts</url> + </repository> + </repositories> + + <build> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-compiler-plugin</artifactId> + <version>3.5.1</version> + <configuration> + <source>1.8</source> + <target>1.8</target> + </configuration> + </plugin> + </plugins> + </build> + + <dependencies> + <dependency> + <groupId>junit</groupId> + <artifactId>junit</artifactId> + <version>4.12</version> + <scope>test</scope> + </dependency> + + <dependency> + <groupId>org.apache.logging.log4j</groupId> + <artifactId>log4j-api</artifactId> + <version>2.1</version> + </dependency> + + <dependency> + <groupId>org.apache.logging.log4j</groupId> + <artifactId>log4j-core</artifactId> + <version>2.1</version> + </dependency> + + <dependency> + <groupId>de.hdm_stuttgart.mi.exam</groupId> + <artifactId>unitmarking</artifactId> + <version>0.9</version> + </dependency> + + </dependencies> +</project> diff --git a/Klausuren/Sd1/2016summer.failed/Exam/src/main/java/de/hdm_stuttgart/sw1/klausur/Helper.java b/Klausuren/Sd1/2016summer.failed/Exam/src/main/java/de/hdm_stuttgart/sw1/klausur/Helper.java new file mode 100644 index 0000000000000000000000000000000000000000..9d9dea09024371d75fa750fd5fcd39d7682945e0 --- /dev/null +++ b/Klausuren/Sd1/2016summer.failed/Exam/src/main/java/de/hdm_stuttgart/sw1/klausur/Helper.java @@ -0,0 +1,91 @@ +package de.hdm_stuttgart.sw1.klausur; + + +public class Helper { + + /** + * Gebe den größeren der beiden Werte zurück, mindestens aber 0. + * + * @param a Erster Wert + * @param b Zweiter Wert + * @return Den größeren der beiden Eingabewerte. Falls beide Werte kleiner als 0 sind, wird 0 zurückgegeben. + */ + static public int maxMindestensNull(final int a, final int b) { + return 123321; // TODO: Implementiere mich! + } + + /** + * Umkehrung der Reihenfolge aller durch einzelne Leerzeichen getrennten Worte eines Satzes. Beispiele: + * + * <ol> + * <li><b>"Dies ist gut an der HdM"</b> wird zu <b>"HdM der gut ist Dies"</b></li> + * <li><b>"Ein Test"</b> wird zu <b>"Test Ein"</b></li> + * </ol> + * + * @param satz + * Ein Satz aus Worten, welche durch einzelne Leerzeichen (" " bzw. ' ') voneinander getrennt sind. + * @return + * Die Worte des Satzes in umgekehrter Reihenfolge. + * Ein null Wert oder eine leere Zeichenkette werden identisch zurückgegeben. + * + * <p style="color: red;font-weight: bold;">Tip: Nutzen Sie die Methode {@link String#split(String)} mit " " als Trennsymbol zur Zerlegung des Satzes in Worte.</p> + */ + static public String getUmgekehrteReihenfolge(final String satz) { + return "csdfe"; // TODO: Implementiere mich! + } + + /** + * Erzwinge Großbuchstaben für den jeweils ersten Buchstaben aller Worte eines Satzes. Worte bestehen aus denjenigen char Zeichen, + * für welche die Methode {@link Character#isLetterOrDigit(char)} wahr ist. Insbesondere dürfen Worte auch Ziffern enthalten. + * Sonderzeichen sind hingegen ausgeschlossen und gelten als Worttrenner. Beispiele: + * + * <ol> + * <li><b>"source Code kennt das Konzept des CamelCase"</b> wird zu <b>"Source Code Kennt Das Konzept Des CamelCase"</b></li> + * <li><b>"miles o'Brien"</b> wird zu <b>"Miles O'Brien"</b></li> + * <li><b>"Das Kunstwort just4all"</b> wird zu <b>"Das Kunstwort Just4all"</b></li> + * </ol> + * + * @param input Der Eingabesatz + * @return Der potentiell umgewandelte Satz. Für die Eingabe null oder "" ändert sich nichts. + * + * <p style="color: red;font-weight: bold;">Tip: Nutzen Sie die Methode {@link String#toCharArray()} zur Zerlegung des Satzes in einzelne Zeichen. + * Erzeugen Sie daraus das Ergebnis unter Verwendung von {@link Character#isLetterOrDigit(char)} und {@link Character#toUpperCase(char)}.</p> + */ + static public String capitalize(final String input) { + return "gdrg"; // TODO: Implementiere mich! + } + + /** + * Funktionalität ähnlich zu {@link Integer#parseInt(String)}. Allerdings wird im Fall einer nicht umwandelbaren Eingabe + * das Werfen einer {@link NumberFormatException} durch Rückgabe des Werts 0 ersetzt. Beispiele: + * + * <dl> + * <dt>Normalfall: String repräsentiert eine Ganzzahl</dt> + * <dd>z.B. input == "42", Rückgabe 42 (int)</dd> + * + * <dt>Ausnahmefall: String repräsentiert keine Ganzzahl</dt> + * <dd>z.B. input == "Geht nicht" oder input == null: Rückgabe 0</dd> + * </dl> + * + * @param input Eine beliebige Zeichenkette oder null + * @return 0, falls input == null ist oder input nicht in einen int Wert umgewandelt werden kann. Ansonsten den durch input + * festgelegten int Wert. + * + * <p style="color: red;font-weight: bold;">Tip: Nutzen Sie die Methode {@link Integer#parseInt(String)} und behandeln Sie allfällige Ausnahmen.</p> + */ + static public int parseIntOhneAusnahme(final String input) { + return 1312; // TODO: Implementiere mich! + } + + /** + * <p>Rotiere die Werte eines Feldes zyklisch nach "rechts". Der letzte Feldwert wird an den Anfang verschoben. Beispiel:</p> + * + * <p><b>{1, 2, 3, 4, 5, 6}</b> wird zu <b>{6, 1, 2, 3, 4, 5}</b> </p> + * + * @param values Das zu verschiebende Feld aus Werten. Die Werte werden beim Aufruf zyklisch nach "rechts" verschoben. Falls + * das Feld null oder leer ist, erfolgt keine Aktion. + */ + static public void zyklischRechtsRotieren(final int[] values) { + // TODO: Implementiere mich! + } +} \ No newline at end of file diff --git a/Klausuren/Sd1/2016summer.failed/Exam/src/main/java/de/hdm_stuttgart/sw1/klausur/angebot/Angebot.java b/Klausuren/Sd1/2016summer.failed/Exam/src/main/java/de/hdm_stuttgart/sw1/klausur/angebot/Angebot.java new file mode 100644 index 0000000000000000000000000000000000000000..45fdc28676caf21a696018e5b4410795866556a0 --- /dev/null +++ b/Klausuren/Sd1/2016summer.failed/Exam/src/main/java/de/hdm_stuttgart/sw1/klausur/angebot/Angebot.java @@ -0,0 +1,81 @@ +package de.hdm_stuttgart.sw1.klausur.angebot; + +/** + * Erstellung von Angeboten für Dienstleistungen eines Handwerksbetriebs. Erfaßt werden: + * + * <ul> + * <li>Bodenverlegung in Räumen: Kosten für Boden und Fußleisten</li> + * <li>Berücksichtigung der Anzahl von Anfahrtswegen</li> + * </ul> + * + * <p>Im Hinblick auf den Kostenanteil für Anfahrtswege wird der Kilometerpreis über den Konstruktor + * des jeweiligen Angebots festgelegt.</p> + * + */ +public class Angebot { + + /** + * @param kostenProKilometer Kosten pro Kilometer Anfahrtsweg. + */ + public Angebot(int kostenProKilometer) { + // TODO: Implementiere mich! + } + + /** + * Kosten für die Bodenverlegung in einem einzelnen, rechteckigen Raum. Diese ergeben sich einerseits aus der Fläche des verlegten Bodens über den Preis pro Quadratmeter. + * Andererseits bestimmt der Umfang des Raumes die Länge der benötigten Bodenleisten, welche über den Preis pro Meter zu den Kosten beiträgt. + * + * @param laenge Länge des Raums + * @param breite Breite des Raums + * @param preisProQuadratmeter Kosten des gewählten Bodens (Laminat, Parkett,...) pro Quadratmeter. + * @param preisProMeter Kosten für die gewählte Art der Fußleiste pro Meter. Türaussparungen etc. werden vernachlässigt. + * + * <p style="color: red;font-weight: bold;">Tip: Im Hinblick auf die Ausgabe der Angebotsdetails in {@link #getAngebotDetails()} können Sie alle benötigten Informationen + * in einer {@link StringBuffer} Instanzvariablen sammeln. Sinngemäß gilt dies auch für die Gesamtkosten.</p> + */ + public void addiereRaum(int laenge, int breite, int preisProQuadratmeter, int preisProMeter) { + // TODO: Implementiere mich! + } + + /** + * Kosten für eine oder mehrere Anfahrten. Der Preis pro Kilometer wird bereits im Konstruktor {@link #Angebot(int)} festgelegt. + * + * @param anzahl Anzahl benötigter Anfahrten + * @param kilometer Entfernung pro Anfahrt. + * + * <p style="color: red;font-weight: bold;"> Tip: Im Hinblick auf die Ausgabe der Angebotsdetails in {@link #getAngebotDetails()} können Sie alle benötigten Informationen + * in einer (weiteren) {@link StringBuffer} Instanzvariablen sammeln. Sinngemäß gilt dies auch für die Gesamtkosten.</p> + */ + public void addiereAnfahrt(int anzahl, int kilometer) { + // TODO: Implementiere mich! + } + + /** + * Die Kosten ergeben sich durch alle vorherigen Aufrufe von {@link #addiereRaum(int, int, int, int)} und {@link #addiereAnfahrt(int, int)} in Verbindung + * mit dem im Konstruktor {@link #Angebot(int)} festgesetzten Kilometerpreis. + * + * @return Kosten für Bodenverlegung und Anfahrt + */ + public int getGesamtKosten() { + return 4325; // TODO: Implementiere mich! + } + + /** + * Die Angebotsdetails ergeben sich durch alle vorherigen Aufrufe von {@link #addiereRaum(int, int, int, int)} und {@link #addiereAnfahrt(int, int)} in Verbindung + * mit dem im Konstruktor {@link #Angebot(int)} festgesetzten Kilometerpreis. Die Testapplikation {@link DummyAngebot#main(String[])} erzeugt eine typische Ausgabe: + * + * <pre><code>Raum 2 x 4: 172€ + *Raum 3 x 5: 439€ + *3 x Anfahrt 44 Km: 264€ + *Summe: 875€</code></pre> + * + * @return Erläuternder Angebotstext zum Ausdrucken + * + * <p style="color: red;font-weight: bold;">Tip: Für das korrekte Zusammenbasteln des Texts ist eine Veranlagung zum Erbsenzählen hilfreich: + * Bereits ein falsches Leerzeichen lässt alle Tests scheitern. Schauen Sie sich bei Fehlern die Ausgabe der Junit Tests <b>sehr genau</b> an.</p> + * + */ + public String getAngebotDetails() { + return "cfdsfrew"; // TODO: Implementiere mich! + } +} \ No newline at end of file diff --git a/Klausuren/Sd1/2016summer.failed/Exam/src/main/java/de/hdm_stuttgart/sw1/klausur/angebot/DummyAngebot.java b/Klausuren/Sd1/2016summer.failed/Exam/src/main/java/de/hdm_stuttgart/sw1/klausur/angebot/DummyAngebot.java new file mode 100644 index 0000000000000000000000000000000000000000..f41c15c6c0ee575af87e912461288cc04ba370e2 --- /dev/null +++ b/Klausuren/Sd1/2016summer.failed/Exam/src/main/java/de/hdm_stuttgart/sw1/klausur/angebot/DummyAngebot.java @@ -0,0 +1,24 @@ +package de.hdm_stuttgart.sw1.klausur.angebot; + +/** + * Demo zur Verwendung der Klasse {@link Angebot}. Beachten Sie bitte die + * zugehörigen Junit Tests. + * + */ +public class DummyAngebot { + + public static void main(String[] args) { + + final int preisProKilometer = 2; + + final Angebot angebot = new Angebot(preisProKilometer); + + angebot.addiereRaum(2, 4, 17, 3); + angebot.addiereRaum(3, 5, 25, 4); + + angebot.addiereAnfahrt(3, 44); + + System.out.println(angebot.getAngebotDetails()); + } + +} diff --git a/Klausuren/Sd1/2016summer.failed/Exam/src/main/resources/log4j2.xml b/Klausuren/Sd1/2016summer.failed/Exam/src/main/resources/log4j2.xml new file mode 100644 index 0000000000000000000000000000000000000000..e4bd6e38899c495a0a6c363b44847059063a2e23 --- /dev/null +++ b/Klausuren/Sd1/2016summer.failed/Exam/src/main/resources/log4j2.xml @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="UTF-8"?> +<Configuration> + <Appenders> + <File name="A1" fileName="A1.log" append="false"> + <PatternLayout pattern="%t %-5p %c{2} - %m%n"/> + </File> + <Console name="STDOUT" target="SYSTEM_OUT"> + <PatternLayout pattern="%d %-5p [%t] %C{2} (%F:%L) - %m%n"/> + </Console> + </Appenders> + <Loggers> + + <!-- You my want to define class or package level per-logger rules --> + <Logger name="q.w.App" level="debug"> + <AppenderRef ref="A1"/> + </Logger> + <Root level="info"> + <AppenderRef ref="STDOUT"/> + </Root> + </Loggers> +</Configuration> \ No newline at end of file diff --git a/Klausuren/Sd1/2016summer.failed/Exam/src/test/java/de/hdm_stuttgart/sw1/klausur/test/ShowReachedPoints.java b/Klausuren/Sd1/2016summer.failed/Exam/src/test/java/de/hdm_stuttgart/sw1/klausur/test/ShowReachedPoints.java new file mode 100644 index 0000000000000000000000000000000000000000..8c0f20e8cd8f7f0ffa42888237ce180a8100cdbe --- /dev/null +++ b/Klausuren/Sd1/2016summer.failed/Exam/src/test/java/de/hdm_stuttgart/sw1/klausur/test/ShowReachedPoints.java @@ -0,0 +1,15 @@ +package de.hdm_stuttgart.sw1.klausur.test; + +import de.hdm_stuttgart.mi.exam.unitmarking.RunTests; + +public class ShowReachedPoints { + + /** + * Execution reveals the number of reached points. + * + * @param args Unused + */ + public static void main(String[] args) { + RunTests.exec(Test_Helper.class, Test_Angebot.class); + } +} diff --git a/Klausuren/Sd1/2016summer.failed/Exam/src/test/java/de/hdm_stuttgart/sw1/klausur/test/Test_Angebot.java b/Klausuren/Sd1/2016summer.failed/Exam/src/test/java/de/hdm_stuttgart/sw1/klausur/test/Test_Angebot.java new file mode 100644 index 0000000000000000000000000000000000000000..49ca215087cfc19ae170f85a1680ed7b9c8d5033 --- /dev/null +++ b/Klausuren/Sd1/2016summer.failed/Exam/src/test/java/de/hdm_stuttgart/sw1/klausur/test/Test_Angebot.java @@ -0,0 +1,135 @@ +package de.hdm_stuttgart.sw1.klausur.test; + +import org.junit.Assert; +import org.junit.FixMethodOrder; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.DisableOnDebug; +import org.junit.rules.TestRule; +import org.junit.rules.Timeout; +import org.junit.runners.MethodSorters; + +import de.hdm_stuttgart.mi.exam.unitmarking.Marking; +import de.hdm_stuttgart.sw1.klausur.angebot.Angebot; + +@SuppressWarnings({ "javadoc" }) +@FixMethodOrder(MethodSorters.NAME_ASCENDING) +public class Test_Angebot { + + // Kill test if tests last longer than 1000 milliseconds unless in debugging mode + @Rule + public final TestRule timeout = new DisableOnDebug(Timeout.millis(1000)); + + /** + * Tests zu {@link Angebot#Angebot(int)} und {@link Angebot#getGesamtKosten()} + */ + @Test + @Marking(points=3) + public void test_200_konstruktorKosten() { + + final int preisProKilometer = 2; + final Angebot angebot = new Angebot(preisProKilometer); + + final int anzahlFahrten = 3, kilometer = 5; + angebot.addiereAnfahrt(anzahlFahrten, kilometer); + + Assert.assertEquals( + anzahlFahrten * kilometer * preisProKilometer, + angebot.getGesamtKosten()); + } + + @Test + @Marking(points=3) + public void test_210_konstruktorDetails() { + + final int preisProKilometer = 2; + final Angebot angebot = new Angebot(preisProKilometer); + + final int anzahlFahrten = 3, kilometer = 5; + angebot.addiereAnfahrt(anzahlFahrten, kilometer); + + Assert.assertEquals( + "3 x Anfahrt 5 Km: 30€" + "\n" + + "Summe: 30€", + angebot.getAngebotDetails()); + } + + /** + * Tests zu {@link Angebot#addiereRaum(int, int, int, int)} + */ + @Test + @Marking(points=4) + public void test_220_einRaumKosten() { + + final Angebot angebot = new Angebot(12345); + + final int laenge = 5, breite = 3, preisProQuadratmeter = 11, preisProMeter = 2; + angebot.addiereRaum(laenge, breite, preisProQuadratmeter, preisProMeter); + + Assert.assertEquals( + laenge * breite * preisProQuadratmeter + 2 * preisProMeter * (laenge + breite), + angebot.getGesamtKosten()); + } + + @Test + @Marking(points=2) + public void test_230_einRaumDetails() { + + final Angebot angebot = new Angebot(12345); + + final int laenge = 5, breite = 3, preisProQuadratmeter = 11, preisProMeter = 2; + angebot.addiereRaum(laenge, breite, preisProQuadratmeter, preisProMeter); + + Assert.assertEquals( + "Raum 5 x 3: 197€"+ "\n" + + "Summe: 197€", + angebot.getAngebotDetails()); + } + + @Test + @Marking(points=6) + public void test_240_2RaeumeUndAnfahrtKosten() { + + final int preisProKilometer = 1; + final Angebot angebot = new Angebot(preisProKilometer); + + final int laenge1 = 5, breite1 = 3, preisProQuadratmeter1 = 17, preisProMeter1 = 3; + angebot.addiereRaum(laenge1, breite1, preisProQuadratmeter1, preisProMeter1); + + final int laenge2 = 8, breite2 = 1, preisProQuadratmeter2 = 13, preisProMeter2 = 2; + angebot.addiereRaum(laenge2, breite2, preisProQuadratmeter2, preisProMeter2); + + final int anzahlFahrten = 7, kilometer = 19; + angebot.addiereAnfahrt(anzahlFahrten, kilometer); + + Assert.assertEquals( + laenge1 * breite1 * preisProQuadratmeter1 + 2 * preisProMeter1 * (laenge1 + breite1) + + laenge2 * breite2 * preisProQuadratmeter2 + 2 * preisProMeter2 * (laenge2 + breite2) + + anzahlFahrten * kilometer * preisProKilometer, + angebot.getGesamtKosten()); + } + + @Test + @Marking(points=2) + public void test_250_2RaeumeUndAnfahrtDetails() { + + final int preisProKilometer = 1; + final Angebot angebot = new Angebot(preisProKilometer); + + final int laenge1 = 5, breite1 = 3, preisProQuadratmeter1 = 17, preisProMeter1 = 3; + angebot.addiereRaum(laenge1, breite1, preisProQuadratmeter1, preisProMeter1); + + final int laenge2 = 7, breite2 = 2, preisProQuadratmeter2 = 17, preisProMeter2 = 2; + angebot.addiereRaum(laenge2, breite2, preisProQuadratmeter2, preisProMeter2); + + final int anzahlFahrten = 7, kilometer = 19; + angebot.addiereAnfahrt(anzahlFahrten, kilometer); + + Assert.assertEquals( + "Raum 5 x 3: 303€" + "\n" + + "Raum 7 x 2: 274€" + "\n" + + "7 x Anfahrt 19 Km: 133€" + "\n" + + "Summe: 710€", + angebot.getAngebotDetails()); + } +} \ No newline at end of file diff --git a/Klausuren/Sd1/2016summer.failed/Exam/src/test/java/de/hdm_stuttgart/sw1/klausur/test/Test_Helper.java b/Klausuren/Sd1/2016summer.failed/Exam/src/test/java/de/hdm_stuttgart/sw1/klausur/test/Test_Helper.java new file mode 100644 index 0000000000000000000000000000000000000000..dc1ab0936f64743fad39daac3dc9e2bd868d9d4f --- /dev/null +++ b/Klausuren/Sd1/2016summer.failed/Exam/src/test/java/de/hdm_stuttgart/sw1/klausur/test/Test_Helper.java @@ -0,0 +1,202 @@ +package de.hdm_stuttgart.sw1.klausur.test; + +import org.junit.Assert; +import org.junit.FixMethodOrder; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.DisableOnDebug; +import org.junit.rules.TestRule; +import org.junit.rules.Timeout; +import org.junit.runners.MethodSorters; + +import de.hdm_stuttgart.mi.exam.unitmarking.Marking; +import de.hdm_stuttgart.sw1.klausur.Helper; + +import static de.hdm_stuttgart.sw1.klausur.Helper.*; + +@SuppressWarnings({"javadoc"}) +@FixMethodOrder(MethodSorters.NAME_ASCENDING) +public class Test_Helper { + + // Kill test if tests last longer than 1000 milliseconds unless in debugging mode + @Rule + public final TestRule timeout = new DisableOnDebug(Timeout.millis(1000)); + + /** + * Tests zu {@link Helper#maxMindestensNull(int, int)} + */ + @Test + @Marking(points=3) + public void test_080_maxMindestensNull_positiv() { + Assert.assertEquals(3, maxMindestensNull(1, 3)); + Assert.assertEquals(3, maxMindestensNull(3, 1)); + } + + @Test + @Marking(points=2) + public void test_090_maxMindestensNull_negativ() { + Assert.assertEquals(0, maxMindestensNull(-1, -3)); + Assert.assertEquals(0, maxMindestensNull(-3, -1)); + } + + @Test + @Marking(points=2) + public void test_100_maxMindestensNull_gemischt() { + Assert.assertEquals(5, maxMindestensNull(-1, 5)); + Assert.assertEquals(5, maxMindestensNull(5, -1)); + } + + @Test + @Marking(points=2) + public void test_100_maxMindestensNull_gemischt2() { + Assert.assertEquals(0, maxMindestensNull(-1, 0)); + Assert.assertEquals(0, maxMindestensNull(0, -4)); + Assert.assertEquals(0, maxMindestensNull(0, 0)); + } + + /** + * Tests zu {@link Helper#getUmgekehrteReihenfolge(String)} + */ + @Test + @Marking(points=3) + public void test_110_getUmgekehrteReihenfolge () { + Assert.assertTrue("Test dieser ist Gut".equals(getUmgekehrteReihenfolge("Gut ist dieser Test"))); + } + + @Test + @Marking(points=2) + public void test_115_getUmgekehrteReihenfolge () { + Assert.assertTrue("Worte drei Nur".equals(getUmgekehrteReihenfolge("Nur drei Worte"))); + } + + @Test + @Marking(points=2) + public void test_120_getUmgekehrteReihenfolge () { + Assert.assertTrue("Test".equals(getUmgekehrteReihenfolge("Test"))); + } + + @Test + @Marking(points=2) + public void test_130_getUmgekehrteReihenfolge () { + Assert.assertEquals(null, getUmgekehrteReihenfolge(null)); + } + + /** + * Tests zu {@link Helper#capitalize(String)} + */ + @Test + @Marking(points=2) + public void test_150_capitalize () { + Assert.assertEquals("Source Code Kennt Das Konzept Des CamelCase", capitalize("source Code kennt das Konzept des CamelCase")); + } + + @Test + @Marking(points=3) + public void test_155_capitalize () { + Assert.assertEquals("Miles O'Brien", capitalize("miles o'Brien")); + } + + @Test + @Marking(points=2) + public void test_160_capitalize () { + Assert.assertEquals("Das Kunstwort Just4all", capitalize("Das Kunstwort just4all")); + } + + @Test + @Marking(points=2) + public void test_165_capitalize () { + Assert.assertEquals("", capitalize("")); + } + + @Test + @Marking(points=2) + public void test_167_capitalize () { + Assert.assertEquals(null, capitalize(null)); + } + + @Test + @Marking(points=2) + public void test_169_capitalize () { + Assert.assertEquals("A", capitalize("a")); + Assert.assertEquals("A", capitalize("A")); + } + + @Test + @Marking(points=2) + public void test_172_capitalize () { + Assert.assertEquals(".", capitalize(".")); + Assert.assertEquals("2", capitalize("2")); + Assert.assertEquals("4all", capitalize("4all")); + } + + /** + * Tests zu {@link Helper#parseIntOhneAusnahme(String)} + */ + @Test + @Marking(points=2) + public void test_180_parseIntOhneAusnahme_positiv () { + Assert.assertEquals(42, parseIntOhneAusnahme("42")); + Assert.assertEquals(-42, parseIntOhneAusnahme("-42")); + } + + @Test + @Marking(points=3) + public void test_190_parseIntOhneAusnahme_negativ () { + Assert.assertEquals(0, parseIntOhneAusnahme("Geht nicht!")); + Assert.assertEquals(0, parseIntOhneAusnahme("4.3")); + Assert.assertEquals(0, parseIntOhneAusnahme("")); + } + + @Test + @Marking(points=2) + public void test_200_parseIntOhneAusnahme_null () { + Assert.assertEquals(0, parseIntOhneAusnahme(null)); + } + + /** + * Tests zu {@link Helper#zyklischRechtsRotieren(int[])} + */ + @Test + @Marking(points=1) + public void test_220_zyklischRechtsRotieren_null () { + final int[] in = new int[]{}; + zyklischRechtsRotieren(in); + Assert.assertArrayEquals(new int[]{}, in); + } + + @Test + @Marking(points=1) + public void test_230_zyklischRechtsRotieren_leer () { + final int[] in = new int[]{}; + zyklischRechtsRotieren(in); + Assert.assertArrayEquals(new int[]{}, in); + } + + @Test + @Marking(points=1) + public void test_240_zyklischRechtsRotieren_eins () { + final int[] in = new int[]{1}; + zyklischRechtsRotieren(in); + Assert.assertArrayEquals(new int[]{1}, in); + } + + @Test + @Marking(points=3) + public void test_250_zyklischRechtsRotieren_zwei () { + final int[] in = new int[]{7, 8}, + expected = new int[]{8, 7}; + zyklischRechtsRotieren(in); + + Assert.assertArrayEquals(expected, in); + } + + @Test + @Marking(points=4) + public void test_260_zyklischRechtsRotieren_sieben () { + final int[] in = new int[]{7, 6, 5, 4, 3, 2, 1}, + expected = new int[]{1, 7, 6, 5, 4, 3, 2}; + zyklischRechtsRotieren(in); + + Assert.assertArrayEquals(expected, in); + } +} \ No newline at end of file diff --git a/Klausuren/Sd1/2016summer.failed/Makefile b/Klausuren/Sd1/2016summer.failed/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..009cd0b7c67598d3d4307eaf88b2716ad357efe0 --- /dev/null +++ b/Klausuren/Sd1/2016summer.failed/Makefile @@ -0,0 +1,6 @@ +all: + tar c- Exam|tar -x -C /tmp + cd /tmp/Exam; mvn clean eclipse:clean + cd /tmp; rm -f exam.zip; zip -r exam.zip Exam + echo /tmp/exam.zip has been created +#end diff --git a/Klausuren/Sd1/2016summer.failed/Solution/.gitignore b/Klausuren/Sd1/2016summer.failed/Solution/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..0f65e3ad793981d41fbc541f88a6dc777597c115 --- /dev/null +++ b/Klausuren/Sd1/2016summer.failed/Solution/.gitignore @@ -0,0 +1,5 @@ +/.classpath +/.project +/.settings +/.A1.log +/dependency-reduced-pom.xml diff --git a/Klausuren/Sd1/2016summer.failed/Solution/Doc/a.xhtml b/Klausuren/Sd1/2016summer.failed/Solution/Doc/a.xhtml new file mode 100644 index 0000000000000000000000000000000000000000..f898bd4c38270354093a14a687cbad98f029d772 --- /dev/null +++ b/Klausuren/Sd1/2016summer.failed/Solution/Doc/a.xhtml @@ -0,0 +1,75 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE html> +<html lang="de" xmlns="http://www.w3.org/1999/xhtml"> + <head> + <title>Helper Methoden</title> + </head> + + <body><h2>Vorbereitung</h2><p>Entpacken Sie das oben sichtbare Archiv + <b>exam.zip</b> und importieren Sie den resultierenden Ordner + <code>Exam</code> als <span lang="en">Maven</span> Projekt in Ihren <span + lang="en">Eclipse Workspace</span>.</p><h2>Aufgabe</h2><p>Implementieren Sie + die in der Klasse <code>de.hdm_stuttgart.sw1.klausur.Helper</code> des + Eclipse Projekts vorbereiteten Dummy Methoden.</p><h2>Allgemeine + Hinweise</h2><ul> + <li><p>Die Javadoc Kommentare der jeweiligen Methoden beschreiben das + gewünschte Verhalten. Wählen Sie im Package Explorer die Projektwurzel + und generieren Sie die HTML Dokumentation über die Menüpunkte <code>Run + -> Run As... -> Maven build</code> mit dem Parameter + <code>javadoc:javadoc</code> im Eingabefeld „Goals:â€. Die generierte + HTML Dokumentation wird im Unterordner <code>target/site/apidocs</code> + Ihres Projekts angelegt und kann durch einen Web Browser Ihrer Wahl + betrachtet werden.</p><p>Lesen Sie diese Dokumentation <b>sehr + genau</b>.</p><p>Bei einzelnen Methoden finden Sie rot markierte, + unverbindlicher Tips zur Implementierung. Sie können eine völlig andere + Strategie der Implementierung wählen, solange die zugehörigen JUnit + Tests erfolgreich sind.</p></li> + + <li><p>Für jede Methode aus der Klasse + <code>de.hdm_stuttgart.sw1.klausur.Helper</code> stehen Ihnen in der + Testklasse <code>de.hdm_stuttgart.sw1.klausur.test.Test_Helper</code> + des Junit Test Zweigs <code>src/test/java</code> korrespondierende Tests + zur Verfügung. Nutzen Sie diese!</p><p>Die von Ihnen erreichte Punktzahl + richtet sich nach der Anzahl positiv bestandener Tests. Sie bekommen + keine Punkte für Tests, bei denen Ihre Implementierung „fast richtig“ + ist. Implementieren Sie daher im Zweifelsfall weniger Methoden, diese + dafür aber vollständig.</p><p>Die Ausführung der Klasse + <code>de.hdm_stuttgart.sw1.klausur.test.ShowReachedPoints</code> liefert + Ihnen die Zahl der in dieser und anderen Programmieraufgaben insgesamt + erreichten und erreichbaren Punkte.</p></li> + + <li><p>Beachten Sie alle beschriebenen Sonderfälle. Dazu zählen + insbesondere <code>null</code> Werte übergebener Variablen sowie + enthaltene <code>null</code> Werte in übergebenen Arrays.</p></li> + + <li><p>Nutzen Sie den Debugger oder logging Statements im Fall + fehlgeschlagener Testfälle, falls Sie das zugrundeliegende Problem nicht + unmittelbar lösen können.</p></li> + </ul><h2 id="upload">Hochladen Ihrer Lösung in das + Klausursystem</h2><p>Exportieren Sie Ihre Implementierung dieser und + weiterer Programmieraufgaben per Rechtsklick im Package Explorer Ihres + Eclipse Projekts. Wählen Sie im Kontextmenü unter + »Export-->General-->Archive File« einen auf <code>.zip</code> endenden + Archivnamen. Exportieren Sie Ihr Projekt in dieses <code>.zip</code> Archiv + und laden Sie es in das Ilias Klausursystem hoch (unteres Seitenende) und + beachten Sie:</p><ul> + <li style="color: red;">Die hochgeladene .zip Datei muss im + Klausursystem sichtbar sein.</li> + + <li style="color: red;">Reservieren Sie ausreichend Zeit vor Klausurende + für den Vorgang des Hochladens. Projekte, welche sich lediglich auf dem + Arbeitsplatzrechner befinden, werden nicht gewertet.</li> + + <li style="color: red;">Laden Sie keine Projekte mit Java Syntaxfehlern + hoch, diese werden nicht bewertet!</li> + + <li style="color: red;">Exportieren Sie Ihr Projekt <b>nicht</b> als + „.tgz“, „.java“, „.tar.gz“ o.ä. Das Klausursystem akzeptiert nur Archive + mit der Endung „.zip“.</li> + </ul><p>Alternativ können Sie auch sofort nachfolgende Aufgaben bearbeiten + und diese gemeinsam mit der Lösung der aktuellen Aufgabe hochladen. + Nachfolgende Programmieraufgaben enthalten keine separate Möglichkeit zum + Hochladen.</p><p>Falls Sie mehrere Archive hochladen, wird nur das zuletzt + hochgeladene Archiv bewertet. Sie können hochgeladene Archive + löschen.</p></body> +</html> diff --git a/Klausuren/Sd1/2016summer.failed/Solution/Doc/b.xhtml b/Klausuren/Sd1/2016summer.failed/Solution/Doc/b.xhtml new file mode 100644 index 0000000000000000000000000000000000000000..67acf2b2f279a0cc3a1224f4b8344bebddcf773a --- /dev/null +++ b/Klausuren/Sd1/2016summer.failed/Solution/Doc/b.xhtml @@ -0,0 +1,54 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE html> +<html lang="de" xmlns="http://www.w3.org/1999/xhtml"> + <head> + <title>Angebotserstellung Handwerksbetrieb</title> + </head> + + <body><h2>Hinweis zur Bewertung</h2><p>Diese Aufgabe erbringt im Vergleich + zur ihrer Schwierigkeit eine geringere Punktzahl als die Aufgabe „Helper + Methodenâ€.</p><h2>Beschreibung</h2><p>Ein Bodenleger benötigt eine Software + zur Erstellung von Angeboten. Die Logik soll in einer einzelnen Klasse + implementiert werden.</p><h2>Vorbereitung</h2><p>Sollten Sie die Aufgabe + „Helper Methoden†nicht bearbeitet haben, so lesen Sie bitte die dortige + Anleitung zum Eclipse Maven Projektimport und die zugehörigen allgemeinen + Hinweise. Ansonsten arbeiten Sie mit Ihrem Eclipse Maven Projekt + weiter.</p><h2>Erläuterung</h2><p>Zur Angebotserstellung benötigt ein + Bodenleger folgende Angaben:</p><ol> + <li>Länge und Breite der zu verlegenden Räume. Die Materialkosten + ergeben sich über den Quadratmeterpreis des verwendeten Bodenmaterials + sowie über den Meterpreis der für Rand des jeweiligen Raums benötigten + Sockelleisten.</li> + + <li>Die Kosten für Anfahrten ergeben sich aus der Entfernung, der Zahl + benötigter Anfahrten sowie dem Kilometerpreis.</li> + </ol><p>Die Aufgabenstellung ist stark vereinfacht:</p><ul> + <li>Räume werden als rechteckig angenommen.</li> + + <li>Türaussparungen bleiben bei der Berechnung der Fläche und der + benötigten Sockelleisten unberücksichtigt</li> + + <li>Alle Angaben für Längen und Kosten erfolgen ganzzahlig.</li> + </ul><h2>Aufgabe</h2><p>Vervollständigen Sie die Implementierung der + Klasse <code>de.hdm_stuttgart.sw1.klausur.angebot.Angebot</code>. Die + Javadoc Kommentare präzisieren obige Erläuterungen.</p><h2>Allgemeine + Hinweise</h2><ul> + <li><p>Konvertieren Sie (soweit noch nicht geschehen) die Javadoc + Kommentare gemäß der Beschreibung in der Aufgabe „Helper Methoden†zur + besseren Ansicht im Browser in das Html Format.</p></li> + + <li><p>Verwenden Sie die Testklasse + <code>de.hdm_stuttgart.sw1.klausur.test.Test_Angebot</code> des Junit + Test Zweigs <code>src/test/java</code> zur Prüfung der Vollständigkeit + und Korrektheit Ihrer Implementierung.</p></li> + </ul><h2>Hochladen Ihrer Lösung in das Klausursystem</h2><p>Laden Sie Ihre + Lösung in der Aufgabe „Helper Methoden†gemäß den dortigen Hinweisen hoch. + Falls Sie diese andere Aufgabe bereits bearbeitet haben, enthält Ihr Upload + beide Aufgaben.</p><p>Tragen Sie im unten stehenden Freitextfeld genau einen + der beiden Texte ein:</p><ol> + <li><b>Ich habe die aktuelle Aufgabe bearbeitet und erhoffe dafür + Punkte.</b></li> + + <li><b>Ich habe die aktuelle Aufgabe nicht bearbeitet.</b></li> + </ol></body> +</html> diff --git a/Klausuren/Sd1/2016summer.failed/Solution/Doc/c.xhtml b/Klausuren/Sd1/2016summer.failed/Solution/Doc/c.xhtml new file mode 100644 index 0000000000000000000000000000000000000000..9941043690f1d160a3202c63d8bd9ec90212b193 --- /dev/null +++ b/Klausuren/Sd1/2016summer.failed/Solution/Doc/c.xhtml @@ -0,0 +1,37 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE html> +<html xml:lang="de" xmlns="http://www.w3.org/1999/xhtml"> + <head> + <title></title> + </head> + + <body><p>Wir betrachten folgende Klasse <code>Person</code>:</p><pre><code>package company; + +public class Person { + public void greeting(final String empfaenger) { + System.out.println("Grüß Dich, " + empfaenger + ", ich bin Dein Kollege"); + } +}</code></pre><p>Eine weitere Klasse <code>Manager</code> wird von + <code>Person</code> abgeleitet:</p><pre><code>package company; + +import company.helper.String; + +public class Manager extends Person { + + // Ãœberschreibe greeting(String) aus der Basisklasse Person + public void greeting(final String empfaenger) { + System.out.println("Grüß Dich, " + empfaenger + ", ich bin Dein Boss"); + } +}</code></pre><p>Ein Entwickler verwendet die <code>Manager</code> + Klasse:</p><pre><code>new Manager().greeting("Michael");</code></pre><p>Das + Ergebnis lautet:</p><pre><code>Grüß Dich, Michael, ich bin Dein Kollege</code></pre><p>Beantworten + Sie folgende Fragen:</p><ol> + <li><p>Wieso lautet die Ausgabe gemäß der in der <code>Manager</code> + Klasse überschriebenen Methode nicht wie folgt?</p><pre><code>Grüß Dich, Michael, ich bin Dein Boss</code></pre><p>Tip: + Beachten Sie die <code>import</code> Anweisungen.</p></li> + + <li>Durch Verwendung welches auf dieses Problem zugeschnittenen Java + Sprachmittels hätte der Entwickler seinen Fehler zur Ãœbersetzungszeit + erkennen können?</li> + </ol></body> +</html> diff --git a/Klausuren/Sd1/2016summer.failed/Solution/pom.xml b/Klausuren/Sd1/2016summer.failed/Solution/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..692da8cc5b2b83df388d81ef0a181b3719589a78 --- /dev/null +++ b/Klausuren/Sd1/2016summer.failed/Solution/pom.xml @@ -0,0 +1,65 @@ +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + + <groupId>de.hdm-stuttgart.sw1.klausur</groupId> + <artifactId>sw1_2016sommer_solve</artifactId> + <version>0.9</version> + <packaging>jar</packaging> + + <name>sw1_2016summer_solve</name> + <url>https://freedocs.mi.hdm-stuttgart.de</url> + + <properties> + <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> + </properties> + + <repositories> + <repository> + <id>hdm-mi-internal-maven-repo</id> + <url>https://maven.mi.hdm-stuttgart.de/artifacts</url> + </repository> + </repositories> + + <build> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-compiler-plugin</artifactId> + <version>3.5.1</version> + <configuration> + <source>1.8</source> + <target>1.8</target> + </configuration> + </plugin> + </plugins> + </build> + + <dependencies> + <dependency> + <groupId>junit</groupId> + <artifactId>junit</artifactId> + <version>4.12</version> + <scope>test</scope> + </dependency> + + <dependency> + <groupId>org.apache.logging.log4j</groupId> + <artifactId>log4j-api</artifactId> + <version>2.1</version> + </dependency> + + <dependency> + <groupId>org.apache.logging.log4j</groupId> + <artifactId>log4j-core</artifactId> + <version>2.1</version> + </dependency> + + <dependency> + <groupId>de.hdm_stuttgart.mi.exam</groupId> + <artifactId>unitmarking</artifactId> + <version>0.9</version> + </dependency> + + </dependencies> +</project> diff --git a/Klausuren/Sd1/2016summer.failed/Solution/src/main/java/de/hdm_stuttgart/sw1/klausur/Helper.java b/Klausuren/Sd1/2016summer.failed/Solution/src/main/java/de/hdm_stuttgart/sw1/klausur/Helper.java new file mode 100644 index 0000000000000000000000000000000000000000..c67deee716cdbef0b7d1275d2c5809d162f55001 --- /dev/null +++ b/Klausuren/Sd1/2016summer.failed/Solution/src/main/java/de/hdm_stuttgart/sw1/klausur/Helper.java @@ -0,0 +1,132 @@ +package de.hdm_stuttgart.sw1.klausur; + + +public class Helper { + + /** + * Gebe den größeren der beiden Werte zurück, mindestens aber 0. + * + * @param a Erster Wert + * @param b Zweiter Wert + * @return Den größeren der beiden Eingabewerte. Falls beide Werte kleiner als 0 sind, wird 0 zurückgegeben. + */ + static public int maxMindestensNull(final int a, final int b) { + return Math.max(0, Math.max(a, b)); + } + + /** + * Umkehrung der Reihenfolge aller durch einzelne Leerzeichen getrennten Worte eines Satzes. Beispiele: + * + * <ol> + * <li><b>"Dies ist gut an der HdM"</b> wird zu <b>"HdM der gut ist Dies"</b></li> + * <li><b>"Ein Test"</b> wird zu <b>"Test Ein"</b></li> + * </ol> + * + * @param satz + * Ein Satz aus Worten, welche durch einzelne Leerzeichen (" " bzw. ' ') voneinander getrennt sind. + * @return + * Die Worte des Satzes in umgekehrter Reihenfolge. + * Ein null Wert oder eine leere Zeichenkette werden identisch zurückgegeben. + * + * <p style="color: red;font-weight: bold;">Tip: Nutzen Sie die Methode {@link String#split(String)} mit " " als Trennsymbol zur Zerlegung des Satzes in Worte.</p> + */ + static public String getUmgekehrteReihenfolge(final String satz) { + + if (null == satz) { + return null; + } else { + final String[] worte = satz.split(" "); + final StringBuffer umkehrung = new StringBuffer(worte[worte.length - 1]); + for (int i = worte.length - 2; 0 <=i; i--) { + umkehrung.append(' ').append(worte[i]); + } + return umkehrung.toString(); + } + } + + /** + * Erzwinge Großbuchstaben für den jeweils ersten Buchstaben aller Worte eines Satzes. Worte bestehen aus denjenigen char Zeichen, + * für welche die Methode {@link Character#isLetterOrDigit(char)} wahr ist. Insbesondere dürfen Worte auch Ziffern enthalten. + * Sonderzeichen sind hingegen ausgeschlossen und gelten als Worttrenner. Beispiele: + * + * <ol> + * <li><b>"source Code kennt das Konzept des CamelCase"</b> wird zu <b>"Source Code Kennt Das Konzept Des CamelCase"</b></li> + * <li><b>"miles o'Brien"</b> wird zu <b>"Miles O'Brien"</b></li> + * <li><b>"Das Kunstwort just4all"</b> wird zu <b>"Das Kunstwort Just4all"</b></li> + * </ol> + * + * @param input Der Eingabesatz + * @return Der potentiell umgewandelte Satz. Für die Eingabe null oder "" ändert sich nichts. + * + * <p style="color: red;font-weight: bold;">Tip: Nutzen Sie die Methode {@link String#toCharArray()} zur Zerlegung des Satzes in einzelne Zeichen. + * Erzeugen Sie daraus das Ergebnis unter Verwendung von {@link Character#isLetterOrDigit(char)} und {@link Character#toUpperCase(char)}.</p> + */ + static public String capitalize(final String input) { + + if (null == input || 0 == input.length()) { + return input; + } else { + final char[] c = input.toCharArray(); + + final StringBuffer result = new StringBuffer(); + result.append(Character.toUpperCase(c[0])); + + for (int i = 1; i < c.length; i++) { + if (Character.isLetterOrDigit(c[i - 1])) { + result.append(c[i]); + } else { + result.append(Character.toUpperCase(c[i])); + } + } + return result.toString(); + } + } + + /** + * Funktionalität ähnlich zu {@link Integer#parseInt(String)}. Allerdings wird im Fall einer nicht umwandelbaren Eingabe + * das Werfen einer {@link NumberFormatException} durch Rückgabe des Werts 0 ersetzt. Beispiele: + * + * <dl> + * <dt>Normalfall: String repräsentiert eine Ganzzahl</dt> + * <dd>z.B. input == "42", Rückgabe 42 (int)</dd> + * + * <dt>Ausnahmefall: String repräsentiert keine Ganzzahl</dt> + * <dd>z.B. input == "Geht nicht" oder input == null: Rückgabe 0</dd> + * </dl> + * + * @param input Eine beliebige Zeichenkette oder null + * @return 0, falls input == null ist oder input nicht in einen int Wert umgewandelt werden kann. Ansonsten den durch input + * festgelegten int Wert. + * + * <p style="color: red;font-weight: bold;">Tip: Nutzen Sie die Methode {@link Integer#parseInt(String)} und behandeln Sie allfällige Ausnahmen.</p> + */ + static public int parseIntOhneAusnahme(final String input) { + if (null == input) { + return 0; + } else { + try { + return Integer.parseInt(input); + } catch (final NumberFormatException e) { + return 0; + } + } + } + + /** + * <p>Rotiere die Werte eines Feldes zyklisch nach "rechts". Der letzte Feldwert wird an den Anfang verschoben. Beispiel:</p> + * + * <p><b>{1, 2, 3, 4, 5, 6}</b> wird zu <b>{6, 1, 2, 3, 4, 5}</b> </p> + * + * @param values Das zu verschiebende Feld aus Werten. Die Werte werden beim Aufruf zyklisch nach "rechts" verschoben. Falls + * das Feld null oder leer ist, erfolgt keine Aktion. + */ + static public void zyklischRechtsRotieren(final int[] values) { + if (null != values && 1 < values.length) { + final int letzterWert = values[values.length - 1]; + for (int i = values.length - 1; 0 < i; i--) { + values[i] = values[i - 1]; + } + values[0] = letzterWert; + } + } +} \ No newline at end of file diff --git a/Klausuren/Sd1/2016summer.failed/Solution/src/main/java/de/hdm_stuttgart/sw1/klausur/angebot/Angebot.java b/Klausuren/Sd1/2016summer.failed/Solution/src/main/java/de/hdm_stuttgart/sw1/klausur/angebot/Angebot.java new file mode 100644 index 0000000000000000000000000000000000000000..9eaf386ffacaa33f2a65903f879f6fe61b9782f7 --- /dev/null +++ b/Klausuren/Sd1/2016summer.failed/Solution/src/main/java/de/hdm_stuttgart/sw1/klausur/angebot/Angebot.java @@ -0,0 +1,87 @@ +package de.hdm_stuttgart.sw1.klausur.angebot; + +/** + * Erstellung von Angeboten für Dienstleistungen eines Handwerksbetriebs. Erfaßt werden: + * + * <ul> + * <li>Bodenverlegung in Räumen: Kosten für Boden und Fußleisten</li> + * <li>Berücksichtigung der Anzahl von Anfahrtswegen</li> + * </ul> + * + * <p>Im Hinblick auf den Kostenanteil für Anfahrtswege wird der Kilometerpreis über den Konstruktor + * des jeweiligen Angebots festgelegt.</p> + * + */ +public class Angebot { + + private StringBuffer raeume = new StringBuffer(), + anfahrten = new StringBuffer(); + + private final int kostenProKilometer; + private int gesamtKosten = 0; + + /** + * @param kostenProKilometer Kosten pro Kilometer Anfahrtsweg. + */ + public Angebot(int kostenProKilometer) { + this.kostenProKilometer = kostenProKilometer; + } + + /** + * Kosten für die Bodenverlegung in einem einzelnen, rechteckigen Raum. Diese ergeben sich einerseits aus der Fläche des verlegten Bodens über den Preis pro Quadratmeter. + * Andererseits bestimmt der Umfang des Raumes die Länge der benötigten Bodenleisten, welche über den Preis pro Meter zu den Kosten beiträgt. + * + * @param laenge Länge des Raums + * @param breite Breite des Raums + * @param preisProQuadratmeter Kosten des gewählten Bodens (Laminat, Parkett,...) pro Quadratmeter. + * @param preisProMeter Kosten für die gewählte Art der Fußleiste pro Meter. Türaussparungen etc. werden vernachlässigt. + * + * <p style="color: red;font-weight: bold;">Tip: Im Hinblick auf die Ausgabe der Angebotsdetails in {@link #getAngebotDetails()} können Sie alle benötigten Informationen in einer {@link StringBuffer} + * Instanzvariablen sammeln. Sinngemäß gilt dies auch für die Gesamtkosten.</p> + */ + public void addiereRaum(int laenge, int breite, int preisProQuadratmeter, int preisProMeter) { + final int kosten = laenge * breite * preisProQuadratmeter + 2 * (laenge + breite) * preisProMeter; + raeume.append("Raum ").append(laenge).append(" x ").append(breite).append(": ").append(kosten).append("€\n"); + gesamtKosten += kosten; + } + + /** + * Kosten für eine oder mehrere Anfahrten. Der Preis pro Kilometer wird bereits im Konstruktor {@link #Angebot(int)} festgelegt. + * + * @param anzahl Anzahl benötigter Anfahrten + * @param kilometer Entfernung pro Anfahrt. + * + * <p style="color: red;font-weight: bold;"> Tip: Im Hinblick auf die Ausgabe der Angebotsdetails in {@link #getAngebotDetails()} können Sie alle benötigten Informationen + * in einer (weiteren) {@link StringBuffer} Instanzvariablen sammeln. Sinngemäß gilt dies auch für die Gesamtkosten.</p> + */ + public void addiereAnfahrt(int anzahl, int kilometer) { + final int kosten = anzahl * kilometer * kostenProKilometer; + anfahrten.append(anzahl).append(" x ").append(" Anfahrt ").append(kilometer).append(" Km: ").append(kosten).append("€\n"); + gesamtKosten += kosten; + } + + /** + * Die Kosten ergeben sich durch alle vorherigen Aufrufe von {@link #addiereRaum(int, int, int, int)} und {@link #addiereAnfahrt(int, int)} in Verbindung + * mit dem im Konstruktor {@link #Angebot(int)} festgesetzten Kilometerpreis. + * + * @return Kosten für Bodenverlegung und Anfahrt + */ + public int getGesamtKosten() { + return gesamtKosten; + } + + /** + * Die Angebotsdetails ergeben sich durch alle vorherigen Aufrufe von {@link #addiereRaum(int, int, int, int)} und {@link #addiereAnfahrt(int, int)} in Verbindung + * mit dem im Konstruktor {@link #Angebot(int)} festgesetzten Kilometerpreis. Die Testapplikation {@link DummyAngebot#main(String[])} erzeugt eine typische Ausgabe: + * + * <pre><code>Raum 2 x 4: 172€ + *Raum 3 x 5: 439€ + *3 x Anfahrt 44 Km: 264€ + *Summe: 875€</code></pre> + * + * @return Erläuternder Angebotstext zum Ausdrucken + */ + public String getAngebotDetails() { + return raeume.toString() + anfahrten.toString() + "Summe: " + gesamtKosten + "€"; + } +} diff --git a/Klausuren/Sd1/2016summer.failed/Solution/src/main/java/de/hdm_stuttgart/sw1/klausur/angebot/DummyAngebot.java b/Klausuren/Sd1/2016summer.failed/Solution/src/main/java/de/hdm_stuttgart/sw1/klausur/angebot/DummyAngebot.java new file mode 100644 index 0000000000000000000000000000000000000000..f41c15c6c0ee575af87e912461288cc04ba370e2 --- /dev/null +++ b/Klausuren/Sd1/2016summer.failed/Solution/src/main/java/de/hdm_stuttgart/sw1/klausur/angebot/DummyAngebot.java @@ -0,0 +1,24 @@ +package de.hdm_stuttgart.sw1.klausur.angebot; + +/** + * Demo zur Verwendung der Klasse {@link Angebot}. Beachten Sie bitte die + * zugehörigen Junit Tests. + * + */ +public class DummyAngebot { + + public static void main(String[] args) { + + final int preisProKilometer = 2; + + final Angebot angebot = new Angebot(preisProKilometer); + + angebot.addiereRaum(2, 4, 17, 3); + angebot.addiereRaum(3, 5, 25, 4); + + angebot.addiereAnfahrt(3, 44); + + System.out.println(angebot.getAngebotDetails()); + } + +} diff --git a/Klausuren/Sd1/2016summer.failed/Solution/src/main/resources/log4j2.xml b/Klausuren/Sd1/2016summer.failed/Solution/src/main/resources/log4j2.xml new file mode 100644 index 0000000000000000000000000000000000000000..e4bd6e38899c495a0a6c363b44847059063a2e23 --- /dev/null +++ b/Klausuren/Sd1/2016summer.failed/Solution/src/main/resources/log4j2.xml @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="UTF-8"?> +<Configuration> + <Appenders> + <File name="A1" fileName="A1.log" append="false"> + <PatternLayout pattern="%t %-5p %c{2} - %m%n"/> + </File> + <Console name="STDOUT" target="SYSTEM_OUT"> + <PatternLayout pattern="%d %-5p [%t] %C{2} (%F:%L) - %m%n"/> + </Console> + </Appenders> + <Loggers> + + <!-- You my want to define class or package level per-logger rules --> + <Logger name="q.w.App" level="debug"> + <AppenderRef ref="A1"/> + </Logger> + <Root level="info"> + <AppenderRef ref="STDOUT"/> + </Root> + </Loggers> +</Configuration> \ No newline at end of file diff --git a/Klausuren/Sd1/2016summer.failed/Solution/src/test/java/de/hdm_stuttgart/sw1/klausur/test/ShowReachedPoints.java b/Klausuren/Sd1/2016summer.failed/Solution/src/test/java/de/hdm_stuttgart/sw1/klausur/test/ShowReachedPoints.java new file mode 100644 index 0000000000000000000000000000000000000000..8c0f20e8cd8f7f0ffa42888237ce180a8100cdbe --- /dev/null +++ b/Klausuren/Sd1/2016summer.failed/Solution/src/test/java/de/hdm_stuttgart/sw1/klausur/test/ShowReachedPoints.java @@ -0,0 +1,15 @@ +package de.hdm_stuttgart.sw1.klausur.test; + +import de.hdm_stuttgart.mi.exam.unitmarking.RunTests; + +public class ShowReachedPoints { + + /** + * Execution reveals the number of reached points. + * + * @param args Unused + */ + public static void main(String[] args) { + RunTests.exec(Test_Helper.class, Test_Angebot.class); + } +} diff --git a/Klausuren/Sd1/2016summer.failed/Solution/src/test/java/de/hdm_stuttgart/sw1/klausur/test/Test_Angebot.java b/Klausuren/Sd1/2016summer.failed/Solution/src/test/java/de/hdm_stuttgart/sw1/klausur/test/Test_Angebot.java new file mode 100644 index 0000000000000000000000000000000000000000..4f901e9abe427acdbd9191c0f144a6cbb242bf74 --- /dev/null +++ b/Klausuren/Sd1/2016summer.failed/Solution/src/test/java/de/hdm_stuttgart/sw1/klausur/test/Test_Angebot.java @@ -0,0 +1,135 @@ +package de.hdm_stuttgart.sw1.klausur.test; + +import org.junit.Assert; +import org.junit.FixMethodOrder; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.DisableOnDebug; +import org.junit.rules.TestRule; +import org.junit.rules.Timeout; +import org.junit.runners.MethodSorters; + +import de.hdm_stuttgart.mi.exam.unitmarking.Marking; +import de.hdm_stuttgart.sw1.klausur.angebot.Angebot; + +@SuppressWarnings({ "javadoc" }) +@FixMethodOrder(MethodSorters.NAME_ASCENDING) +public class Test_Angebot { + + // Kill test if tests last longer than 1000 milliseconds unless in debugging mode + @Rule + public final TestRule timeout = new DisableOnDebug(Timeout.millis(1000)); + + /** + * Tests zu {@link Angebot#Angebot(int)} und {@link Angebot#getGesamtKosten()} + */ + @Test + @Marking(points=3) + public void test_200_konstruktorKosten() { + + final int preisProKilometer = 2; + final Angebot angebot = new Angebot(preisProKilometer); + + final int anzahlFahrten = 3, kilometer = 5; + angebot.addiereAnfahrt(anzahlFahrten, kilometer); + + Assert.assertEquals( + anzahlFahrten * kilometer * preisProKilometer, + angebot.getGesamtKosten()); + } + + @Test + @Marking(points=3) + public void test_210_konstruktorDetails() { + + final int preisProKilometer = 2; + final Angebot angebot = new Angebot(preisProKilometer); + + final int anzahlFahrten = 3, kilometer = 5; + angebot.addiereAnfahrt(anzahlFahrten, kilometer); + + Assert.assertEquals( + "3 x Anfahrt 5 Km: 30€" + "\n" + + "Summe: 30€", + angebot.getAngebotDetails()); + } + + /** + * Tests zu {@link Angebot#addiereRaum(int, int, int, int)} + */ + @Test + @Marking(points=3) + public void test_220_einRaumKosten() { + + final Angebot angebot = new Angebot(12345); + + final int laenge = 5, breite = 3, preisProQuadratmeter = 11, preisProMeter = 2; + angebot.addiereRaum(laenge, breite, preisProQuadratmeter, preisProMeter); + + Assert.assertEquals( + laenge * breite * preisProQuadratmeter + 2 * preisProMeter * (laenge + breite), + angebot.getGesamtKosten()); + } + + @Test + @Marking(points=3) + public void test_230_einRaumDetails() { + + final Angebot angebot = new Angebot(12345); + + final int laenge = 5, breite = 3, preisProQuadratmeter = 11, preisProMeter = 2; + angebot.addiereRaum(laenge, breite, preisProQuadratmeter, preisProMeter); + + Assert.assertEquals( + "Raum 5 x 3: 197€"+ "\n" + + "Summe: 197€", + angebot.getAngebotDetails()); + } + + @Test + @Marking(points=4) + public void test_240_2RaeumeUndAnfahrtKosten() { + + final int preisProKilometer = 1; + final Angebot angebot = new Angebot(preisProKilometer); + + final int laenge1 = 5, breite1 = 3, preisProQuadratmeter1 = 17, preisProMeter1 = 3; + angebot.addiereRaum(laenge1, breite1, preisProQuadratmeter1, preisProMeter1); + + final int laenge2 = 8, breite2 = 1, preisProQuadratmeter2 = 13, preisProMeter2 = 2; + angebot.addiereRaum(laenge2, breite2, preisProQuadratmeter2, preisProMeter2); + + final int anzahlFahrten = 7, kilometer = 19; + angebot.addiereAnfahrt(anzahlFahrten, kilometer); + + Assert.assertEquals( + laenge1 * breite1 * preisProQuadratmeter1 + 2 * preisProMeter1 * (laenge1 + breite1) + + laenge2 * breite2 * preisProQuadratmeter2 + 2 * preisProMeter2 * (laenge2 + breite2) + + anzahlFahrten * kilometer * preisProKilometer, + angebot.getGesamtKosten()); + } + + @Test + @Marking(points=4) + public void test_250_2RaeumeUndAnfahrtDetails() { + + final int preisProKilometer = 1; + final Angebot angebot = new Angebot(preisProKilometer); + + final int laenge1 = 5, breite1 = 3, preisProQuadratmeter1 = 17, preisProMeter1 = 3; + angebot.addiereRaum(laenge1, breite1, preisProQuadratmeter1, preisProMeter1); + + final int laenge2 = 7, breite2 = 2, preisProQuadratmeter2 = 17, preisProMeter2 = 2; + angebot.addiereRaum(laenge2, breite2, preisProQuadratmeter2, preisProMeter2); + + final int anzahlFahrten = 7, kilometer = 19; + angebot.addiereAnfahrt(anzahlFahrten, kilometer); + + Assert.assertEquals( + "Raum 5 x 3: 303€" + "\n" + + "Raum 7 x 2: 274€" + "\n" + + "7 x Anfahrt 19 Km: 133€" + "\n" + + "Summe: 710€", + angebot.getAngebotDetails()); + } +} \ No newline at end of file diff --git a/Klausuren/Sd1/2016summer.failed/Solution/src/test/java/de/hdm_stuttgart/sw1/klausur/test/Test_Helper.java b/Klausuren/Sd1/2016summer.failed/Solution/src/test/java/de/hdm_stuttgart/sw1/klausur/test/Test_Helper.java new file mode 100644 index 0000000000000000000000000000000000000000..dc1ab0936f64743fad39daac3dc9e2bd868d9d4f --- /dev/null +++ b/Klausuren/Sd1/2016summer.failed/Solution/src/test/java/de/hdm_stuttgart/sw1/klausur/test/Test_Helper.java @@ -0,0 +1,202 @@ +package de.hdm_stuttgart.sw1.klausur.test; + +import org.junit.Assert; +import org.junit.FixMethodOrder; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.DisableOnDebug; +import org.junit.rules.TestRule; +import org.junit.rules.Timeout; +import org.junit.runners.MethodSorters; + +import de.hdm_stuttgart.mi.exam.unitmarking.Marking; +import de.hdm_stuttgart.sw1.klausur.Helper; + +import static de.hdm_stuttgart.sw1.klausur.Helper.*; + +@SuppressWarnings({"javadoc"}) +@FixMethodOrder(MethodSorters.NAME_ASCENDING) +public class Test_Helper { + + // Kill test if tests last longer than 1000 milliseconds unless in debugging mode + @Rule + public final TestRule timeout = new DisableOnDebug(Timeout.millis(1000)); + + /** + * Tests zu {@link Helper#maxMindestensNull(int, int)} + */ + @Test + @Marking(points=3) + public void test_080_maxMindestensNull_positiv() { + Assert.assertEquals(3, maxMindestensNull(1, 3)); + Assert.assertEquals(3, maxMindestensNull(3, 1)); + } + + @Test + @Marking(points=2) + public void test_090_maxMindestensNull_negativ() { + Assert.assertEquals(0, maxMindestensNull(-1, -3)); + Assert.assertEquals(0, maxMindestensNull(-3, -1)); + } + + @Test + @Marking(points=2) + public void test_100_maxMindestensNull_gemischt() { + Assert.assertEquals(5, maxMindestensNull(-1, 5)); + Assert.assertEquals(5, maxMindestensNull(5, -1)); + } + + @Test + @Marking(points=2) + public void test_100_maxMindestensNull_gemischt2() { + Assert.assertEquals(0, maxMindestensNull(-1, 0)); + Assert.assertEquals(0, maxMindestensNull(0, -4)); + Assert.assertEquals(0, maxMindestensNull(0, 0)); + } + + /** + * Tests zu {@link Helper#getUmgekehrteReihenfolge(String)} + */ + @Test + @Marking(points=3) + public void test_110_getUmgekehrteReihenfolge () { + Assert.assertTrue("Test dieser ist Gut".equals(getUmgekehrteReihenfolge("Gut ist dieser Test"))); + } + + @Test + @Marking(points=2) + public void test_115_getUmgekehrteReihenfolge () { + Assert.assertTrue("Worte drei Nur".equals(getUmgekehrteReihenfolge("Nur drei Worte"))); + } + + @Test + @Marking(points=2) + public void test_120_getUmgekehrteReihenfolge () { + Assert.assertTrue("Test".equals(getUmgekehrteReihenfolge("Test"))); + } + + @Test + @Marking(points=2) + public void test_130_getUmgekehrteReihenfolge () { + Assert.assertEquals(null, getUmgekehrteReihenfolge(null)); + } + + /** + * Tests zu {@link Helper#capitalize(String)} + */ + @Test + @Marking(points=2) + public void test_150_capitalize () { + Assert.assertEquals("Source Code Kennt Das Konzept Des CamelCase", capitalize("source Code kennt das Konzept des CamelCase")); + } + + @Test + @Marking(points=3) + public void test_155_capitalize () { + Assert.assertEquals("Miles O'Brien", capitalize("miles o'Brien")); + } + + @Test + @Marking(points=2) + public void test_160_capitalize () { + Assert.assertEquals("Das Kunstwort Just4all", capitalize("Das Kunstwort just4all")); + } + + @Test + @Marking(points=2) + public void test_165_capitalize () { + Assert.assertEquals("", capitalize("")); + } + + @Test + @Marking(points=2) + public void test_167_capitalize () { + Assert.assertEquals(null, capitalize(null)); + } + + @Test + @Marking(points=2) + public void test_169_capitalize () { + Assert.assertEquals("A", capitalize("a")); + Assert.assertEquals("A", capitalize("A")); + } + + @Test + @Marking(points=2) + public void test_172_capitalize () { + Assert.assertEquals(".", capitalize(".")); + Assert.assertEquals("2", capitalize("2")); + Assert.assertEquals("4all", capitalize("4all")); + } + + /** + * Tests zu {@link Helper#parseIntOhneAusnahme(String)} + */ + @Test + @Marking(points=2) + public void test_180_parseIntOhneAusnahme_positiv () { + Assert.assertEquals(42, parseIntOhneAusnahme("42")); + Assert.assertEquals(-42, parseIntOhneAusnahme("-42")); + } + + @Test + @Marking(points=3) + public void test_190_parseIntOhneAusnahme_negativ () { + Assert.assertEquals(0, parseIntOhneAusnahme("Geht nicht!")); + Assert.assertEquals(0, parseIntOhneAusnahme("4.3")); + Assert.assertEquals(0, parseIntOhneAusnahme("")); + } + + @Test + @Marking(points=2) + public void test_200_parseIntOhneAusnahme_null () { + Assert.assertEquals(0, parseIntOhneAusnahme(null)); + } + + /** + * Tests zu {@link Helper#zyklischRechtsRotieren(int[])} + */ + @Test + @Marking(points=1) + public void test_220_zyklischRechtsRotieren_null () { + final int[] in = new int[]{}; + zyklischRechtsRotieren(in); + Assert.assertArrayEquals(new int[]{}, in); + } + + @Test + @Marking(points=1) + public void test_230_zyklischRechtsRotieren_leer () { + final int[] in = new int[]{}; + zyklischRechtsRotieren(in); + Assert.assertArrayEquals(new int[]{}, in); + } + + @Test + @Marking(points=1) + public void test_240_zyklischRechtsRotieren_eins () { + final int[] in = new int[]{1}; + zyklischRechtsRotieren(in); + Assert.assertArrayEquals(new int[]{1}, in); + } + + @Test + @Marking(points=3) + public void test_250_zyklischRechtsRotieren_zwei () { + final int[] in = new int[]{7, 8}, + expected = new int[]{8, 7}; + zyklischRechtsRotieren(in); + + Assert.assertArrayEquals(expected, in); + } + + @Test + @Marking(points=4) + public void test_260_zyklischRechtsRotieren_sieben () { + final int[] in = new int[]{7, 6, 5, 4, 3, 2, 1}, + expected = new int[]{1, 7, 6, 5, 4, 3, 2}; + zyklischRechtsRotieren(in); + + Assert.assertArrayEquals(expected, in); + } +} \ No newline at end of file