From fac050b5dbc3cfc1e43d8ed0bb8347af69bf35c4 Mon Sep 17 00:00:00 2001 From: Martin Goik <goik@hdm-stuttgart.de> Date: Wed, 28 Sep 2016 14:53:50 +0200 Subject: [PATCH] Exam summer 2016 --- Klausuren/Sd1/2016summer/Exam/.gitignore | 5 + Klausuren/Sd1/2016summer/Exam/pom.xml | 64 +++++++ .../hdm_stuttgart/eval/ShowReachedPoints.java | 15 ++ .../de/hdm_stuttgart/eval/Test_Helper.java | 162 ++++++++++++++++++ .../de/hdm_stuttgart/eval/Test_Konto.java | 97 +++++++++++ .../de/hdm_stuttgart/sw1/klausur/Helper.java | 108 ++++++++++++ .../sw1/klausur/angebot/DummyZinsen.java | 21 +++ .../sw1/klausur/angebot/Konto.java | 89 ++++++++++ .../Exam/src/main/resources/log4j2.xml | 21 +++ .../2016summer/Exam/src/test/java/.gitkeep | 0 Klausuren/Sd1/2016summer/Makefile | 6 + Klausuren/Sd1/2016summer/Solution/.gitignore | 5 + Klausuren/Sd1/2016summer/Solution/Doc/a.xhtml | 76 ++++++++ Klausuren/Sd1/2016summer/Solution/Doc/b.xhtml | 48 ++++++ Klausuren/Sd1/2016summer/Solution/pom.xml | 64 +++++++ .../hdm_stuttgart/eval/ShowReachedPoints.java | 15 ++ .../de/hdm_stuttgart/eval/Test_Helper.java | 162 ++++++++++++++++++ .../de/hdm_stuttgart/eval/Test_Konto.java | 97 +++++++++++ .../de/hdm_stuttgart/sw1/klausur/Helper.java | 157 +++++++++++++++++ .../sw1/klausur/angebot/DummyZinsen.java | 21 +++ .../sw1/klausur/angebot/Konto.java | 124 ++++++++++++++ .../Solution/src/main/resources/log4j2.xml | 21 +++ .../Solution/src/test/java/.gitkeep | 0 23 files changed, 1378 insertions(+) create mode 100644 Klausuren/Sd1/2016summer/Exam/.gitignore create mode 100644 Klausuren/Sd1/2016summer/Exam/pom.xml create mode 100644 Klausuren/Sd1/2016summer/Exam/src/main/java/de/hdm_stuttgart/eval/ShowReachedPoints.java create mode 100644 Klausuren/Sd1/2016summer/Exam/src/main/java/de/hdm_stuttgart/eval/Test_Helper.java create mode 100644 Klausuren/Sd1/2016summer/Exam/src/main/java/de/hdm_stuttgart/eval/Test_Konto.java create mode 100644 Klausuren/Sd1/2016summer/Exam/src/main/java/de/hdm_stuttgart/sw1/klausur/Helper.java create mode 100644 Klausuren/Sd1/2016summer/Exam/src/main/java/de/hdm_stuttgart/sw1/klausur/angebot/DummyZinsen.java create mode 100644 Klausuren/Sd1/2016summer/Exam/src/main/java/de/hdm_stuttgart/sw1/klausur/angebot/Konto.java create mode 100644 Klausuren/Sd1/2016summer/Exam/src/main/resources/log4j2.xml create mode 100644 Klausuren/Sd1/2016summer/Exam/src/test/java/.gitkeep create mode 100644 Klausuren/Sd1/2016summer/Makefile create mode 100644 Klausuren/Sd1/2016summer/Solution/.gitignore create mode 100644 Klausuren/Sd1/2016summer/Solution/Doc/a.xhtml create mode 100644 Klausuren/Sd1/2016summer/Solution/Doc/b.xhtml create mode 100644 Klausuren/Sd1/2016summer/Solution/pom.xml create mode 100644 Klausuren/Sd1/2016summer/Solution/src/main/java/de/hdm_stuttgart/eval/ShowReachedPoints.java create mode 100644 Klausuren/Sd1/2016summer/Solution/src/main/java/de/hdm_stuttgart/eval/Test_Helper.java create mode 100644 Klausuren/Sd1/2016summer/Solution/src/main/java/de/hdm_stuttgart/eval/Test_Konto.java create mode 100644 Klausuren/Sd1/2016summer/Solution/src/main/java/de/hdm_stuttgart/sw1/klausur/Helper.java create mode 100644 Klausuren/Sd1/2016summer/Solution/src/main/java/de/hdm_stuttgart/sw1/klausur/angebot/DummyZinsen.java create mode 100644 Klausuren/Sd1/2016summer/Solution/src/main/java/de/hdm_stuttgart/sw1/klausur/angebot/Konto.java create mode 100644 Klausuren/Sd1/2016summer/Solution/src/main/resources/log4j2.xml create mode 100644 Klausuren/Sd1/2016summer/Solution/src/test/java/.gitkeep diff --git a/Klausuren/Sd1/2016summer/Exam/.gitignore b/Klausuren/Sd1/2016summer/Exam/.gitignore new file mode 100644 index 000000000..0f65e3ad7 --- /dev/null +++ b/Klausuren/Sd1/2016summer/Exam/.gitignore @@ -0,0 +1,5 @@ +/.classpath +/.project +/.settings +/.A1.log +/dependency-reduced-pom.xml diff --git a/Klausuren/Sd1/2016summer/Exam/pom.xml b/Klausuren/Sd1/2016summer/Exam/pom.xml new file mode 100644 index 000000000..4f1c7030d --- /dev/null +++ b/Klausuren/Sd1/2016summer/Exam/pom.xml @@ -0,0 +1,64 @@ +<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_2016summer_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> + </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/Exam/src/main/java/de/hdm_stuttgart/eval/ShowReachedPoints.java b/Klausuren/Sd1/2016summer/Exam/src/main/java/de/hdm_stuttgart/eval/ShowReachedPoints.java new file mode 100644 index 000000000..e3000dc25 --- /dev/null +++ b/Klausuren/Sd1/2016summer/Exam/src/main/java/de/hdm_stuttgart/eval/ShowReachedPoints.java @@ -0,0 +1,15 @@ +package de.hdm_stuttgart.eval; + +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_Konto.class); + } +} diff --git a/Klausuren/Sd1/2016summer/Exam/src/main/java/de/hdm_stuttgart/eval/Test_Helper.java b/Klausuren/Sd1/2016summer/Exam/src/main/java/de/hdm_stuttgart/eval/Test_Helper.java new file mode 100644 index 000000000..c4963d24a --- /dev/null +++ b/Klausuren/Sd1/2016summer/Exam/src/main/java/de/hdm_stuttgart/eval/Test_Helper.java @@ -0,0 +1,162 @@ +package de.hdm_stuttgart.eval; + +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#klartextName(int)} + */ + @Test + @Marking(points=3) + public void test_100_klartext() { + Assert.assertEquals("sieben", klartextName(7)); + } + + @Test + @Marking(points=3) + public void test_120_klartext() { + Assert.assertEquals("null", klartextName(0)); + } + + @Test + @Marking(points=3) + public void test_130_klartextNegativ() { + Assert.assertEquals("Uuups, keine Regel für den Wert -1", klartextName(-1)); + Assert.assertEquals("Uuups, keine Regel für den Wert 13", klartextName(13)); + } + + /** + * Tests zu {@link Helper#getProduktBetrag(int, int)} + */ + @Test + @Marking(points=8) + public void test_145_produktbetrag() { + Assert.assertEquals(10, getProduktBetrag(2, 5)); + Assert.assertEquals(110, getProduktBetrag(2, -55)); + Assert.assertEquals(120, getProduktBetrag(-40, 3)); + Assert.assertEquals(21, getProduktBetrag(-3, -7)); + } + + /** + * Tests zu {@link Helper#getQuadrant(double)} + */ + @Test + @Marking(points=8) + public void test_160_quadrant() { + + for (int i = 0; i < 90; i++) { + Assert.assertEquals(1, getQuadrant(i)); + } + + for (int i = 90; i < 180; i++) { + Assert.assertEquals(2, getQuadrant(i)); + } + + for (int i = 180; i < 270; i++) { + Assert.assertEquals(3, getQuadrant(i)); + } + + for (int i = 270; i < 360; i++) { + Assert.assertEquals(4, getQuadrant(i)); + } + } + + /** + * Tests zu {@link Helper#getZeitangabe(long)} + */ + @Test + @Marking(points=8) + public void test_180_zeitangabe() { + Assert.assertEquals("0:0:31", getZeitangabe(31)); + Assert.assertEquals("0:2:5", getZeitangabe(125)); + Assert.assertEquals("0:5:1", getZeitangabe(301)); + Assert.assertEquals("0:10:42", getZeitangabe(642)); + Assert.assertEquals("2:0:41", getZeitangabe(7241)); + } + + /** + * Tests zu {@link Helper#spiegelung(int[])} + */ + @Test + @Marking(points=8) + public void test_200_spiegelung() { + spiegelung(null); // Sollte keine Exception werfen. + + { + final int[] input = new int[]{}; + spiegelung(input); + Assert.assertArrayEquals(new int[]{}, input); + } + + { + final int[] input = new int[]{1}; + spiegelung(input); + Assert.assertArrayEquals(new int[]{1}, input); + } + + { + final int[] input = new int[]{1, 2}; + spiegelung(input); + Assert.assertArrayEquals(new int[]{2, 1}, input); + } + + { + final int[] input = new int[]{2, 1}; + spiegelung(input); + Assert.assertArrayEquals(new int[]{1, 2}, input); + } + + { + final int[] input = new int[]{-1, 22, -333}; + spiegelung(input); + Assert.assertArrayEquals(new int[]{-333, 22, -1}, input); + } + + { + final int[] input = new int[]{-1, 22, -333}; + spiegelung(input); + Assert.assertArrayEquals(new int[]{-333, 22, -1}, input); + } + + { + final int[] input = new int[]{-1, 22, -333, 24, 55}; + spiegelung(input); + Assert.assertArrayEquals(new int[]{55, 24, -333, 22, -1}, input); + } + + } + + /** + * Tests zu {@link Helper#istGueltig(String)} + */ + @Test + @Marking(points=9) + public void test_240_istGueltig() { + Assert.assertTrue(istGueltig("0-201-31452-5")); + Assert.assertTrue(istGueltig("8535902775")); + Assert.assertTrue(istGueltig("8-535-9027-75")); + Assert.assertFalse(istGueltig("1843369283")); + Assert.assertFalse(istGueltig("9-2")); //Just two digits + Assert.assertFalse(istGueltig("")); //empty + } + +} \ No newline at end of file diff --git a/Klausuren/Sd1/2016summer/Exam/src/main/java/de/hdm_stuttgart/eval/Test_Konto.java b/Klausuren/Sd1/2016summer/Exam/src/main/java/de/hdm_stuttgart/eval/Test_Konto.java new file mode 100644 index 000000000..435ae4945 --- /dev/null +++ b/Klausuren/Sd1/2016summer/Exam/src/main/java/de/hdm_stuttgart/eval/Test_Konto.java @@ -0,0 +1,97 @@ +package de.hdm_stuttgart.eval; + +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.Konto; + +@SuppressWarnings({ "javadoc" }) +@FixMethodOrder(MethodSorters.NAME_ASCENDING) +public class Test_Konto { + + // Kill test if tests last longer than 1000 milliseconds unless in debugging mode + @Rule + public final TestRule timeout = new DisableOnDebug(Timeout.millis(1000)); + + + @Test + @Marking(points=2) + public void test_200_NeuesKonto() { + final Konto konto = new Konto(100, 1, 10); + Assert.assertEquals(100, konto.getKontostand(), 1.e-6); + } + + @Test + @Marking(points=1) + public void test_210_NeuesKontoJournal() { + final Konto konto = new Konto(100, 1, 10); + Assert.assertEquals("Jahr 0, Kontostand=100, verzinsung=1.0%\n", konto.getJournal()); + } + + @Test + @Marking(points=3) + public void test_220_einJahrPositiv() { + final Konto konto = new Konto(100, 1, 10); + konto.neuesJahr(100); + Assert.assertEquals(100 + 100*(1 + 1./100), konto.getKontostand(), 1.e-6); + } + + @Test + @Marking(points=2) + public void test_240_einJahrNegativ() { + final Konto konto = new Konto(-100, 1, 10); + konto.neuesJahr(100); + Assert.assertEquals(-100*(1 + 10./100) + 100, konto.getKontostand(), 1.e-6); + } + + @Test + @Marking(points=2) + public void test_250_einJahrJournal() { + final Konto konto = new Konto(-100, 1, 10); + konto.neuesJahr(100); + Assert.assertEquals( + "Jahr 0, Kontostand=-100, verzinsung=-10.0%\n" + + "Jahr 1, Kontostand=-10, verzinsung=-10.0%\n", + konto.getJournal()); + } + + @Test + @Marking(points=4) + public void test_260_zweiJahre() { + final Konto konto = new Konto(100, 1, 10); + konto.neuesJahr(200, 2, 12); + konto.neuesJahr(100); + Assert.assertEquals((100 *(1 + 1./100) + 200) * (1 + 2./100) + 100, konto.getKontostand(), 1.e-6); + } + + @Test + @Marking(points=4) + public void test_280_zweiJahrePlusMinus() { + final Konto konto = new Konto(100, 1, 10); + konto.neuesJahr(-200); + konto.neuesJahr(100); + Assert.assertEquals((100 *(1 + 1./100) - 200)*(1 + 10./100) + 100, konto.getKontostand(), 1.e-6); + } + + @Test + @Marking(points=2) + public void test_300_zweiJahrePlusMinusJournal() { + final Konto konto = new Konto(100, 1, 10); + konto.neuesJahr(-200); + konto.neuesJahr(100); + System.out.println(konto.getJournal()); + Assert.assertEquals( + "Jahr 0, Kontostand=100, verzinsung=1.0%\n" + + "Jahr 1, Kontostand=-99, verzinsung=-10.0%\n" + + "Jahr 2, Kontostand=-9, verzinsung=-10.0%\n", + konto.getJournal()); + } + +} \ No newline at end of file diff --git a/Klausuren/Sd1/2016summer/Exam/src/main/java/de/hdm_stuttgart/sw1/klausur/Helper.java b/Klausuren/Sd1/2016summer/Exam/src/main/java/de/hdm_stuttgart/sw1/klausur/Helper.java new file mode 100644 index 000000000..7e6b7de08 --- /dev/null +++ b/Klausuren/Sd1/2016summer/Exam/src/main/java/de/hdm_stuttgart/sw1/klausur/Helper.java @@ -0,0 +1,108 @@ +package de.hdm_stuttgart.sw1.klausur; + + +public class Helper { + + /** + * <p>Liefert die Deutschen Klartextnamen der Zahlen von 0 bis Zwölf, also:</p> + * + * <p>{0, 1, 2, ..., 12} wird zu {"eins", "zwei", ..., "zwölf"}</p> + * + * <p>Für alle anderen Werte soll "Uuups, keine Regel für den Wert X" zurückgegeben werden.</p> + * + * @param a Umzuwandelnder Wert + * @return Klartextname. + */ + static public String klartextName(final int a) { + return "huhuu!"; // TODO: Implementiere mich richtig. + } + + /** + * Gibt den Betrag des Produkts der beiden Faktoren zurück. + * + * @param a Erster Wert + * @param b Zweiter Wert + * @return Betrag des Produkts. + */ + static public int getProduktBetrag(final int a, final int b) { + return -2234; // TODO: Implementiere mich richtig. + } + + /** + * Der Quadrant für einen gegebenen Winkel. + * + * Der Vollkreis wird in 0 bis 360 Grad eingeteilt. Je nach Winkel liegt ein Vektor + * im Quadrant 1, 2 3 oder 4: + * + * | + * Quadrant 2 | Quadrant 1 + * | + * | + *--------------+------------- + * | + * | + * Quadrant 3 | Quadrant 4 + * | + * + * Werte von einschließlich 0 bis ausschließlich 90 Grad liegen im ersten Quadranten usw. + * + * + * Gibt den Betrag des Produkts der beiden Faktoren zurück. + * + * @param winkel Winkel des zu betrachtenden Vektors aus dem Intervall [0, 360[. + * @return zugehöriger Quadrant. + */ + static public int getQuadrant(final double winkel) { + return 42; // TODO: Implementiere mich richtig. + } + + /** + * Umwandlung von Sekundenangaben in das Format hh:mm:ss Beispiel: + * + * 7290 Sekunden entsprechen 2 Stunden, einer Minute und 30 Sekunden, also "2:1:30" + * + * @param sekunden Nicht-negative Sekundenangabe + * @return Angabe in Stunden:Minuten:Sekunden + */ + static public String getZeitangabe(final long sekunden) { + return "huhuu!"; // TODO: Implementiere mich richtig. + } + + /** + * <p>Kehre die Reihenfolge der Werte eines Feldes um. Beispiel:</p> + * + * <p> {1, 2, 3, 4, 5} wird zu {5, 4, 3, 2, 1} + * + * @param werte Ein Feld aus Werten oder null (keine Aktion). + */ + static public void spiegelung(int [] werte) { + // TODO: Implementiere mich richtig. + } + + /** + * <p>Prüfe die Gültigkeit einer ISBN Nummer.</p> + * + * <p>Eine gegebene ISBN Nummer ist gültig, wenn:</p> + * + * <ul> + * <li>Sie aus 10 Ziffern besteht und ansonsten nur "-" Zeichen enthält</li> + * + * <li><p>Das Produkt 1 * d_1 + 2 * d_2 + ... + 10 * d_10 ein Vielfaches von 11 ist, wobei {d_10 d_9 ...,d_1} die Ziffern von rechts nach links darstellen</p> + * <p>Beispiel: Die ISBN Nummer 0-201-31452-5 ist gültig:</p> + * <p>Produkt von rechts nach links 1*5 + 2*2 + 3*5 + 4*4 + 5*1 + 6*3 + 7*1 + 8*0 + 9*2 + 10*0 = 88, also ein Vielfaches von 11.</p> + * + * <p>18-433-6928-3 ist hingegen ungültig. Ebenso 2234-223-12, da nur 9 Ziffern vorhanden sind.</p> + * + * </li> + * </ul> + * + * @param isbn Referenznummer eines Buchs + * @return true or false + * + * <p style="color: red;font-weight: bold;">Tip: Beachten Sie {@link Character#getNumericValue(char)} und {@link String#toCharArray()}.</p> + * + */ + static public boolean istGueltig(final String isbn) { + return true; // TODO: Implementiere mich richtig. + } +} \ No newline at end of file diff --git a/Klausuren/Sd1/2016summer/Exam/src/main/java/de/hdm_stuttgart/sw1/klausur/angebot/DummyZinsen.java b/Klausuren/Sd1/2016summer/Exam/src/main/java/de/hdm_stuttgart/sw1/klausur/angebot/DummyZinsen.java new file mode 100644 index 000000000..673bb0e1b --- /dev/null +++ b/Klausuren/Sd1/2016summer/Exam/src/main/java/de/hdm_stuttgart/sw1/klausur/angebot/DummyZinsen.java @@ -0,0 +1,21 @@ +package de.hdm_stuttgart.sw1.klausur.angebot; + +/** + * Demo zur Verwendung der Klasse {@link Konto}. Beachten Sie bitte die + * zugehörigen Junit Tests. + * + */ +public class DummyZinsen { + + public static void main(String[] args) { + + final Konto konto = new Konto(100, 1.0, 10); // Start mit 100€, Guthabenzins 1%, Sollzins 10% + + konto.neuesJahr(100); // Verzinsung des bisherigen Betrags und Aufstockung um 100€ + konto.neuesJahr(200, 2.0, 8); // Verzinsung des bisherigen Betrags, Aufstockung um 200€, Änderung der Zinssätze für das Folgejahr. + konto.neuesJahr(-500);// Verzinsung des bisherigen Betrags, Abbuchung von 500€ + + System.out.println(konto.getJournal());// Ausgabe des Journals + } + +} diff --git a/Klausuren/Sd1/2016summer/Exam/src/main/java/de/hdm_stuttgart/sw1/klausur/angebot/Konto.java b/Klausuren/Sd1/2016summer/Exam/src/main/java/de/hdm_stuttgart/sw1/klausur/angebot/Konto.java new file mode 100644 index 000000000..118582b53 --- /dev/null +++ b/Klausuren/Sd1/2016summer/Exam/src/main/java/de/hdm_stuttgart/sw1/klausur/angebot/Konto.java @@ -0,0 +1,89 @@ +package de.hdm_stuttgart.sw1.klausur.angebot; + +/** + * <p>Verzinsung von Guthaben oder Schulden. Es gelten folgende Regeln:</p> + * + * <p>Einmal pro Jahr kann über eine der beiden Methoden {@link #neuesJahr(double, double, double)} oder {@link #neuesJahr(double)} + * gemäß Vorzeichen des Betrags eingezahlt oder abgehoben werden.</p> + * + * <p>Gleichzeitig können zu diesem Zeitpunkt die Zinssätze für Guthaben und Schulden (Soll) für das Folgejahr angepasst werden.</p> + * + */ +public class Konto { + + /** + * Erstelle neues Konto. + * + * @param kontostand Initialer Kontostand. + * @param guthabenZins Initialer Guthabenzins. + * @param sollZins Initialer Schuldzins. + */ + public Konto(double kontostand, double guthabenZins, double sollZins) { + // TODO: Implementiere mich richtig. + } + + /** + * Diese oder alternativ die Methode {@link #neuesJahr(double)} wir einmal jährlich + * + * <ul> + * <li>Durchführung der Verzinsung für das zurückliegende Jahr zu aktuellen Guthaben- bzw. Schuldzinsen.</li> + * <li>Einzahlung für das jeweils nächste Jahr</li> + * <li>Anpassung von Guthaben- und Schuldzins für das kommende Verzinsungsjahr.</li> + * </ul> + * , und . + * + * @param betrag Je nach Vorzeichen neu hinzugefügter oder abgebuchter Betrag. + * @param guthabenZins Der für das jeweils kommende Jahr geltende prozentuale Guthabenzins für nichtnegative Kontostände. + * @param sollZins Der für das jeweils kommende Jahr geltende prozentuale Guthabenzins für negative Kontostände. + * + * <p style="color: red;font-weight: bold;">Tip: Im Hinblick auf das Journal in {@link #getJournal()} können Sie alle + * benötigten Informationen in einer {@link StringBuffer} Instanzvariablen sammeln. Sinngemäß gilt dies auch für den jeweils + * aktuellen Kontostand.</p> + */ + public void neuesJahr(double betrag, double guthabenZins, double sollZins) { + // TODO: Implementiere mich richtig. + } + + /** + * Wie {@link #neuesJahr(double, double, double)} allerdings ohne Änderung von Guthaben- und Sollzins für + * das kommende Verzinsungsjahr. + * + * @param betrag Je nach Vorzeichen neu hinzugefügter oder abgebuchter Betrag. + */ + public void neuesJahr(double betrag) { + // TODO: Implementiere mich richtig. + } + + /** + * @return Der aktuelle Kontostand. + */ + public double getKontostand() { + return -323.43; // TODO: Implementiere mich richtig. + } + + /** + * Die Entwicklung der Kontostände kaufmännisch auf ganzzahlige Werte gerundet. Für das Beispiel {@link DummyZinsen#main(String[])} ergibt sich: + * + * <pre>Jahr 0, Kontostand=100, verzinsung=1.0% + *Jahr 1, Kontostand=201, verzinsung=1.0% + *Jahr 2, Kontostand=403, verzinsung=2.0% + *Jahr 3, Kontostand=-89, verzinsung=-8.0%</pre> + * + * @return Ausdruckbarer Verlauf der Kontoentwicklung + * + * <ul> + * <li><p style="color: red;font-weight: bold;">Tip: Im Hinblick auf das Journal in {@link #getJournal()} können Sie alle + * benötigten Informationen in einer {@link StringBuffer} Instanzvariablen sammeln. Sinngemäß gilt dies auch für den jeweils + * aktuellen Kontostand. Beachten Sie die Methode {@link Math#round(double)}</p></li> + * + * <li><p style="color: red;font-weight: bold;">Tip: Ein Hang zum Erbsenzählen erleichtert die Lösung. + * Bereits ein falsches Leer- oder fehlendes Newline Zeichen (auch am Ende!) + * lässt die zugehörigen Tests scheitern. Beachten Sie allfällige Junit Fehlermeldungen sehr genau.</p></li> + * + * </ul> + * + */ + public String getJournal() { + return "dxas"; // TODO: Implementiere mich richtig. + } +} \ No newline at end of file diff --git a/Klausuren/Sd1/2016summer/Exam/src/main/resources/log4j2.xml b/Klausuren/Sd1/2016summer/Exam/src/main/resources/log4j2.xml new file mode 100644 index 000000000..e4bd6e388 --- /dev/null +++ b/Klausuren/Sd1/2016summer/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/Exam/src/test/java/.gitkeep b/Klausuren/Sd1/2016summer/Exam/src/test/java/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/Klausuren/Sd1/2016summer/Makefile b/Klausuren/Sd1/2016summer/Makefile new file mode 100644 index 000000000..009cd0b7c --- /dev/null +++ b/Klausuren/Sd1/2016summer/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/Solution/.gitignore b/Klausuren/Sd1/2016summer/Solution/.gitignore new file mode 100644 index 000000000..0f65e3ad7 --- /dev/null +++ b/Klausuren/Sd1/2016summer/Solution/.gitignore @@ -0,0 +1,5 @@ +/.classpath +/.project +/.settings +/.A1.log +/dependency-reduced-pom.xml diff --git a/Klausuren/Sd1/2016summer/Solution/Doc/a.xhtml b/Klausuren/Sd1/2016summer/Solution/Doc/a.xhtml new file mode 100644 index 000000000..0996e70ee --- /dev/null +++ b/Klausuren/Sd1/2016summer/Solution/Doc/a.xhtml @@ -0,0 +1,76 @@ +<?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.eval.Test_Helper</code> (Achtung: + Nicht unter <code>src/test/java</code> sondern in + <code>src/main/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/Solution/Doc/b.xhtml b/Klausuren/Sd1/2016summer/Solution/Doc/b.xhtml new file mode 100644 index 000000000..8e8981820 --- /dev/null +++ b/Klausuren/Sd1/2016summer/Solution/Doc/b.xhtml @@ -0,0 +1,48 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE html> +<html lang="de" xmlns="http://www.w3.org/1999/xhtml"> + <head> + <title>Jährliche Verzinsung</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>Eine Bank möchte die Logik zur + Verzinsung von Konten in einer einzelnen Klasse + <code>de.hdm_stuttgart.sw1.klausur.angebot.Konto</code> + implementieren.</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>Konten sollen mit einem Anfangsbetrag + angelegt werden können. Ist dieser positiv, so gelten Guthabenzinsen. Bei + negativem Betrag wird ein Sollzins berechnet.</p><p>Einmal Jährlich erfolgt + die Verzinsung. Nur zu diesem Zeitpunkt können Beträge auf das Konto zu- + oder vom Konto abgebucht werden. Optional können zu diesem Zweitpunkt die + Zinswerte für das nächste Jahr verändert werden</p><p>Beachten Sie die + detaillierteren Erläuterungen und Tips in den Javadoc Köpfen sowie die Tests + in <code>de.hdm_stuttgart.eval.Test_Konto</code> unter + <code>src/main/java</code> und das Programmbeispiel in + <code>de.hdm_stuttgart.sw1.klausur.angebot.DummyZinsen</code>.</p><h2>Aufgabe</h2><p>Vervollständigen + Sie die Implementierung der Klasse + <code>de.hdm_stuttgart.sw1.klausur.angebot.Konto</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.eval.Test_Konto</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/Solution/pom.xml b/Klausuren/Sd1/2016summer/Solution/pom.xml new file mode 100644 index 000000000..30152ad6d --- /dev/null +++ b/Klausuren/Sd1/2016summer/Solution/pom.xml @@ -0,0 +1,64 @@ +<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> + </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/Solution/src/main/java/de/hdm_stuttgart/eval/ShowReachedPoints.java b/Klausuren/Sd1/2016summer/Solution/src/main/java/de/hdm_stuttgart/eval/ShowReachedPoints.java new file mode 100644 index 000000000..e3000dc25 --- /dev/null +++ b/Klausuren/Sd1/2016summer/Solution/src/main/java/de/hdm_stuttgart/eval/ShowReachedPoints.java @@ -0,0 +1,15 @@ +package de.hdm_stuttgart.eval; + +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_Konto.class); + } +} diff --git a/Klausuren/Sd1/2016summer/Solution/src/main/java/de/hdm_stuttgart/eval/Test_Helper.java b/Klausuren/Sd1/2016summer/Solution/src/main/java/de/hdm_stuttgart/eval/Test_Helper.java new file mode 100644 index 000000000..c4963d24a --- /dev/null +++ b/Klausuren/Sd1/2016summer/Solution/src/main/java/de/hdm_stuttgart/eval/Test_Helper.java @@ -0,0 +1,162 @@ +package de.hdm_stuttgart.eval; + +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#klartextName(int)} + */ + @Test + @Marking(points=3) + public void test_100_klartext() { + Assert.assertEquals("sieben", klartextName(7)); + } + + @Test + @Marking(points=3) + public void test_120_klartext() { + Assert.assertEquals("null", klartextName(0)); + } + + @Test + @Marking(points=3) + public void test_130_klartextNegativ() { + Assert.assertEquals("Uuups, keine Regel für den Wert -1", klartextName(-1)); + Assert.assertEquals("Uuups, keine Regel für den Wert 13", klartextName(13)); + } + + /** + * Tests zu {@link Helper#getProduktBetrag(int, int)} + */ + @Test + @Marking(points=8) + public void test_145_produktbetrag() { + Assert.assertEquals(10, getProduktBetrag(2, 5)); + Assert.assertEquals(110, getProduktBetrag(2, -55)); + Assert.assertEquals(120, getProduktBetrag(-40, 3)); + Assert.assertEquals(21, getProduktBetrag(-3, -7)); + } + + /** + * Tests zu {@link Helper#getQuadrant(double)} + */ + @Test + @Marking(points=8) + public void test_160_quadrant() { + + for (int i = 0; i < 90; i++) { + Assert.assertEquals(1, getQuadrant(i)); + } + + for (int i = 90; i < 180; i++) { + Assert.assertEquals(2, getQuadrant(i)); + } + + for (int i = 180; i < 270; i++) { + Assert.assertEquals(3, getQuadrant(i)); + } + + for (int i = 270; i < 360; i++) { + Assert.assertEquals(4, getQuadrant(i)); + } + } + + /** + * Tests zu {@link Helper#getZeitangabe(long)} + */ + @Test + @Marking(points=8) + public void test_180_zeitangabe() { + Assert.assertEquals("0:0:31", getZeitangabe(31)); + Assert.assertEquals("0:2:5", getZeitangabe(125)); + Assert.assertEquals("0:5:1", getZeitangabe(301)); + Assert.assertEquals("0:10:42", getZeitangabe(642)); + Assert.assertEquals("2:0:41", getZeitangabe(7241)); + } + + /** + * Tests zu {@link Helper#spiegelung(int[])} + */ + @Test + @Marking(points=8) + public void test_200_spiegelung() { + spiegelung(null); // Sollte keine Exception werfen. + + { + final int[] input = new int[]{}; + spiegelung(input); + Assert.assertArrayEquals(new int[]{}, input); + } + + { + final int[] input = new int[]{1}; + spiegelung(input); + Assert.assertArrayEquals(new int[]{1}, input); + } + + { + final int[] input = new int[]{1, 2}; + spiegelung(input); + Assert.assertArrayEquals(new int[]{2, 1}, input); + } + + { + final int[] input = new int[]{2, 1}; + spiegelung(input); + Assert.assertArrayEquals(new int[]{1, 2}, input); + } + + { + final int[] input = new int[]{-1, 22, -333}; + spiegelung(input); + Assert.assertArrayEquals(new int[]{-333, 22, -1}, input); + } + + { + final int[] input = new int[]{-1, 22, -333}; + spiegelung(input); + Assert.assertArrayEquals(new int[]{-333, 22, -1}, input); + } + + { + final int[] input = new int[]{-1, 22, -333, 24, 55}; + spiegelung(input); + Assert.assertArrayEquals(new int[]{55, 24, -333, 22, -1}, input); + } + + } + + /** + * Tests zu {@link Helper#istGueltig(String)} + */ + @Test + @Marking(points=9) + public void test_240_istGueltig() { + Assert.assertTrue(istGueltig("0-201-31452-5")); + Assert.assertTrue(istGueltig("8535902775")); + Assert.assertTrue(istGueltig("8-535-9027-75")); + Assert.assertFalse(istGueltig("1843369283")); + Assert.assertFalse(istGueltig("9-2")); //Just two digits + Assert.assertFalse(istGueltig("")); //empty + } + +} \ No newline at end of file diff --git a/Klausuren/Sd1/2016summer/Solution/src/main/java/de/hdm_stuttgart/eval/Test_Konto.java b/Klausuren/Sd1/2016summer/Solution/src/main/java/de/hdm_stuttgart/eval/Test_Konto.java new file mode 100644 index 000000000..435ae4945 --- /dev/null +++ b/Klausuren/Sd1/2016summer/Solution/src/main/java/de/hdm_stuttgart/eval/Test_Konto.java @@ -0,0 +1,97 @@ +package de.hdm_stuttgart.eval; + +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.Konto; + +@SuppressWarnings({ "javadoc" }) +@FixMethodOrder(MethodSorters.NAME_ASCENDING) +public class Test_Konto { + + // Kill test if tests last longer than 1000 milliseconds unless in debugging mode + @Rule + public final TestRule timeout = new DisableOnDebug(Timeout.millis(1000)); + + + @Test + @Marking(points=2) + public void test_200_NeuesKonto() { + final Konto konto = new Konto(100, 1, 10); + Assert.assertEquals(100, konto.getKontostand(), 1.e-6); + } + + @Test + @Marking(points=1) + public void test_210_NeuesKontoJournal() { + final Konto konto = new Konto(100, 1, 10); + Assert.assertEquals("Jahr 0, Kontostand=100, verzinsung=1.0%\n", konto.getJournal()); + } + + @Test + @Marking(points=3) + public void test_220_einJahrPositiv() { + final Konto konto = new Konto(100, 1, 10); + konto.neuesJahr(100); + Assert.assertEquals(100 + 100*(1 + 1./100), konto.getKontostand(), 1.e-6); + } + + @Test + @Marking(points=2) + public void test_240_einJahrNegativ() { + final Konto konto = new Konto(-100, 1, 10); + konto.neuesJahr(100); + Assert.assertEquals(-100*(1 + 10./100) + 100, konto.getKontostand(), 1.e-6); + } + + @Test + @Marking(points=2) + public void test_250_einJahrJournal() { + final Konto konto = new Konto(-100, 1, 10); + konto.neuesJahr(100); + Assert.assertEquals( + "Jahr 0, Kontostand=-100, verzinsung=-10.0%\n" + + "Jahr 1, Kontostand=-10, verzinsung=-10.0%\n", + konto.getJournal()); + } + + @Test + @Marking(points=4) + public void test_260_zweiJahre() { + final Konto konto = new Konto(100, 1, 10); + konto.neuesJahr(200, 2, 12); + konto.neuesJahr(100); + Assert.assertEquals((100 *(1 + 1./100) + 200) * (1 + 2./100) + 100, konto.getKontostand(), 1.e-6); + } + + @Test + @Marking(points=4) + public void test_280_zweiJahrePlusMinus() { + final Konto konto = new Konto(100, 1, 10); + konto.neuesJahr(-200); + konto.neuesJahr(100); + Assert.assertEquals((100 *(1 + 1./100) - 200)*(1 + 10./100) + 100, konto.getKontostand(), 1.e-6); + } + + @Test + @Marking(points=2) + public void test_300_zweiJahrePlusMinusJournal() { + final Konto konto = new Konto(100, 1, 10); + konto.neuesJahr(-200); + konto.neuesJahr(100); + System.out.println(konto.getJournal()); + Assert.assertEquals( + "Jahr 0, Kontostand=100, verzinsung=1.0%\n" + + "Jahr 1, Kontostand=-99, verzinsung=-10.0%\n" + + "Jahr 2, Kontostand=-9, verzinsung=-10.0%\n", + konto.getJournal()); + } + +} \ No newline at end of file diff --git a/Klausuren/Sd1/2016summer/Solution/src/main/java/de/hdm_stuttgart/sw1/klausur/Helper.java b/Klausuren/Sd1/2016summer/Solution/src/main/java/de/hdm_stuttgart/sw1/klausur/Helper.java new file mode 100644 index 000000000..6bd14a3dc --- /dev/null +++ b/Klausuren/Sd1/2016summer/Solution/src/main/java/de/hdm_stuttgart/sw1/klausur/Helper.java @@ -0,0 +1,157 @@ +package de.hdm_stuttgart.sw1.klausur; + + +public class Helper { + + /** + * <p>Liefert die Deutschen Klartextnamen der Zahlen von 0 bis Zwölf, also:</p> + * + * <p>{0, 1, 2, ..., 12} wird zu {"eins", "zwei", ..., "zwölf"}</p> + * + * <p>Für alle anderen Werte soll "Uuups, keine Regel für den Wert X" zurückgegeben werden.</p> + * + * @param a Umzuwandelnder Wert + * @return Klartextname. + */ + static public String klartextName(final int a) { + switch(a) { + case 0: return "null"; + case 1: return "eins"; + case 2: return "zwei"; + case 3: return "drei"; + case 4: return "vier"; + case 5: return "fünf"; + case 6: return "sechs"; + case 7: return "sieben"; + case 8: return "acht"; + case 9: return "neun"; + case 10: return "zehn"; + case 11: return "elf"; + case 12: return "zwölf"; + + default : return "Uuups, keine Regel für den Wert " + a; + } + } + + /** + * Gibt den Betrag des Produkts der beiden Faktoren zurück. + * + * @param a Erster Wert + * @param b Zweiter Wert + * @return Betrag des Produkts. + */ + static public int getProduktBetrag(final int a, final int b) { + return Math.abs(a * b); + } + + /** + * Der Quadrant für einen gegebenen Winkel. + * + * Der Vollkreis wird in 0 bis 360 Grad eingeteilt. Je nach Winkel liegt ein Vektor + * im Quadrant 1, 2 3 oder 4: + * + * | + * Quadrant 2 | Quadrant 1 + * | + * | + *--------------+------------- + * | + * | + * Quadrant 3 | Quadrant 4 + * | + * + * Werte von einschließlich 0 bis ausschließlich 90 Grad liegen im ersten Quadranten usw. + * + * + * Gibt den Betrag des Produkts der beiden Faktoren zurück. + * + * @param winkel Winkel des zu betrachtenden Vektors aus dem Intervall [0, 360[. + * @return zugehöriger Quadrant. + */ + static public int getQuadrant(final double winkel) { + if (winkel < 90) { + return 1; + } else if (winkel < 180) { + return 2; + } else if (winkel < 270) { + return 3; + } else { + return 4; + } + } + + /** + * Umwandlung von Sekundenangaben in das Format hh:mm:ss Beispiel: + * + * 7290 Sekunden entsprechen 2 Stunden, einer Minute und 30 Sekunden, also "2:1:30" + * + * @param sekunden Nicht-negative Sekundenangabe + * @return Angabe in Stunden:Minuten:Sekunden + */ + static public String getZeitangabe(final long sekunden) { + final long stunden = sekunden / (60 * 60); + long rest = sekunden % (60 * 60); + long minuten = rest / 60; + rest = rest % 60; + return stunden + ":" + minuten + ":" + rest; + } + + /** + * <p>Kehre die Reihenfolge der Werte eines Feldes um. Beispiel:</p> + * + * <p> {1, 2, 3, 4, 5} wird zu {5, 4, 3, 2, 1} + * + * @param werte Ein Feld aus Werten oder null (keine Aktion). + */ + static public void spiegelung(int [] werte) { + if (null != werte) { + final int length = werte.length; + for (int i = 0; i < length / 2; i++) { + final int save = werte[i]; + werte[i] = werte[length - i - 1]; + werte[length - i - 1] = save; + } + } + } + + /** + * <p>Prüfe die Gültigkeit einer ISBN Nummer.</p> + * + * <p>Eine gegebene ISBN Nummer ist gültig, wenn:</p> + * + * <ul> + * <li>Sie aus 10 Ziffern besteht und ansonsten nur "-" Zeichen enthält</li> + * + * <li><p>Das Produkt 1 * d_1 + 2 * d_2 + ... + 10 * d_10 ein Vielfaches von 11 ist, wobei {d_10 d_9 ...,d_1} die Ziffern von rechts nach links darstellen</p> + * <p>Beispiel: Die ISBN Nummer 0-201-31452-5 ist gültig:</p> + * <p>Produkt von rechts nach links 1*5 + 2*2 + 3*5 + 4*4 + 5*1 + 6*3 + 7*1 + 8*0 + 9*2 + 10*0 = 88, also ein Vielfaches von 11.</p> + * + * <p>18-433-6928-3 ist hingegen ungültig. Ebenso 2234-223-12, da nur 9 Ziffern vorhanden sind.</p> + * + * </li> + * </ul> + * + * @param isbn + * @return true or false + * + * <p style="color: red;font-weight: bold;">Tip: Beachten Sie {@link Character#getNumericValue(char)} und {@link String#toCharArray()}.</p> + * + */ + static public boolean istGueltig(final String isbn) { + int ziffernAnzahl = 0; + int produktsumme = 0; + for (final char c: new StringBuffer(isbn).reverse().toString().toCharArray()) { + if (Character.isDigit(c)) { + ziffernAnzahl++; + produktsumme += ziffernAnzahl * Character.getNumericValue(c); + } else if (c != '-') { + return false; // + } + } + if (10 == ziffernAnzahl && 0 == produktsumme % 11) { + return true; + } else { + return false; + } + } +} \ No newline at end of file diff --git a/Klausuren/Sd1/2016summer/Solution/src/main/java/de/hdm_stuttgart/sw1/klausur/angebot/DummyZinsen.java b/Klausuren/Sd1/2016summer/Solution/src/main/java/de/hdm_stuttgart/sw1/klausur/angebot/DummyZinsen.java new file mode 100644 index 000000000..673bb0e1b --- /dev/null +++ b/Klausuren/Sd1/2016summer/Solution/src/main/java/de/hdm_stuttgart/sw1/klausur/angebot/DummyZinsen.java @@ -0,0 +1,21 @@ +package de.hdm_stuttgart.sw1.klausur.angebot; + +/** + * Demo zur Verwendung der Klasse {@link Konto}. Beachten Sie bitte die + * zugehörigen Junit Tests. + * + */ +public class DummyZinsen { + + public static void main(String[] args) { + + final Konto konto = new Konto(100, 1.0, 10); // Start mit 100€, Guthabenzins 1%, Sollzins 10% + + konto.neuesJahr(100); // Verzinsung des bisherigen Betrags und Aufstockung um 100€ + konto.neuesJahr(200, 2.0, 8); // Verzinsung des bisherigen Betrags, Aufstockung um 200€, Änderung der Zinssätze für das Folgejahr. + konto.neuesJahr(-500);// Verzinsung des bisherigen Betrags, Abbuchung von 500€ + + System.out.println(konto.getJournal());// Ausgabe des Journals + } + +} diff --git a/Klausuren/Sd1/2016summer/Solution/src/main/java/de/hdm_stuttgart/sw1/klausur/angebot/Konto.java b/Klausuren/Sd1/2016summer/Solution/src/main/java/de/hdm_stuttgart/sw1/klausur/angebot/Konto.java new file mode 100644 index 000000000..7608b3928 --- /dev/null +++ b/Klausuren/Sd1/2016summer/Solution/src/main/java/de/hdm_stuttgart/sw1/klausur/angebot/Konto.java @@ -0,0 +1,124 @@ +package de.hdm_stuttgart.sw1.klausur.angebot; + +/** + * <p>Verzinsung von Guthaben oder Schulden. Es gelten folgende Regeln:</p> + * + * <p>Einmal pro Jahr kann über eine der beiden Methoden {@link #neuesJahr(double, double, double)} oder {@link #neuesJahr(double)} + * gemäß Vorzeichen des Betrags eingezahlt oder abgehoben werden.</p> + * + * <p>Gleichzeitig können zu diesem Zeitpunkt die Zinssätze für Guthaben und Schulden (Soll) für das Folgejahr angepasst werden.</p> + * + */ +public class Konto { + + int jahr = 0; + + private double kontostand = 0, + guthabenZins, sollZins; + + final StringBuffer journal = new StringBuffer(); + + private void verzinsung() { + if (0 < kontostand) { + kontostand *= (1 + guthabenZins / 100); + } else { + kontostand *= (1 + sollZins / 100); + } + jahr++; + } + + private void journalEintrag() { + journal.append("Jahr " + jahr + ", Kontostand=" + Math.round(kontostand)); + if (0 <= kontostand) { + journal.append(", verzinsung=" + guthabenZins); + } else { + journal.append(", verzinsung=-" + sollZins); + } + journal.append("%\n"); + } + + /** + * Erstelle neues Konto. + * + * @param kontostand Initialer Kontostand. + * @param guthabenZins Initialer Guthabenzins. + * @param sollZins Initialer Schuldzins. + */ + public Konto(double kontostand, double guthabenZins, double sollZins) { + this.kontostand = kontostand; + this.guthabenZins = guthabenZins; + this.sollZins = sollZins; + journalEintrag(); + } + + /** + * Diese oder alternativ die Methode {@link #neuesJahr(double)} wir einmal jährlich + * + * <ul> + * <li>Durchführung der Verzinsung für das zurückliegende Jahr zu aktuellen Guthaben- bzw. Schuldzinsen.</li> + * <li>Einzahlung für das jeweils nächste Jahr</li> + * <li>Anpassung von Guthaben- und Schuldzins für das kommende Verzinsungsjahr.</li> + * </ul> + * , und . + * + * @param betrag Je nach Vorzeichen neu hinzugefügter oder abgebuchter Betrag. + * @param guthabenZins Der für das jeweils kommende Jahr geltende prozentuale Guthabenzins für nichtnegative Kontostände. + * @param schuldZins Der für das jeweils kommende Jahr geltende prozentuale Guthabenzins für negative Kontostände. + * + * <p style="color: red;font-weight: bold;">Tip: Im Hinblick auf das Journal in {@link #getJournal()} können Sie alle + * benötigten Informationen in einer {@link StringBuffer} Instanzvariablen sammeln. Sinngemäß gilt dies auch für den jeweils + * aktuellen Kontostand.</p> + */ + public void neuesJahr(double betrag, double guthabenZins, double sollZins) { + verzinsung(); + this.guthabenZins= guthabenZins; + this.sollZins = sollZins; + kontostand += betrag; + journalEintrag(); + } + + /** + * Wie {@link #neuesJahr(double, double, double)} allerdings ohne Änderung von Guthaben- und Sollzins für + * das kommende Verzinsungsjahr. + * + * @param betrag Je nach Vorzeichen neu hinzugefügter oder abgebuchter Betrag. + */ + public void neuesJahr(double betrag) { + verzinsung(); + kontostand += betrag; + journalEintrag(); + } + + /** + * @return Der aktuelle Kontostand. + */ + public double getKontostand() { + return kontostand; + } + + /** + * Die Entwicklung der Kontostände kaufmännisch auf ganzzahlige Werte gerundet. Für das Beispiel {@link DummyZinsen#main(String[])} ergibt sich: + * + * <pre>Jahr 0, Kontostand=100, verzinsung=1.0% + *Jahr 1, Kontostand=201, verzinsung=1.0% + *Jahr 2, Kontostand=403, verzinsung=2.0% + *Jahr 3, Kontostand=-89, verzinsung=-8.0%</pre> + * + * @return Ausdruckbarer Verlauf der Kontoentwicklung + * + * <ul> + * <li><p style="color: red;font-weight: bold;">Tip: Im Hinblick auf das Journal in {@link #getJournal()} können Sie alle + * benötigten Informationen in einer {@link StringBuffer} Instanzvariablen sammeln. Sinngemäß gilt dies auch für den jeweils + * aktuellen Kontostand. Beachten Sie die Methode {@link Math#round(double)}</p></li> + * + * <li><p style="color: red;font-weight: bold;">Tip: Ein Hang zum Erbsenzählen erleichtert die Lösung. + * Bereits ein falsches Leer- oder fehlendes Newline Zeichen (auch am Ende!) + * lässt die zugehörigen Tests scheitern. Beachten Sie allfällige Junit Fehlermeldungen sehr genau.</p></li> + * + * </ul> + * + */ + public String getJournal() { + return journal.toString(); + } +} \ No newline at end of file diff --git a/Klausuren/Sd1/2016summer/Solution/src/main/resources/log4j2.xml b/Klausuren/Sd1/2016summer/Solution/src/main/resources/log4j2.xml new file mode 100644 index 000000000..e4bd6e388 --- /dev/null +++ b/Klausuren/Sd1/2016summer/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/Solution/src/test/java/.gitkeep b/Klausuren/Sd1/2016summer/Solution/src/test/java/.gitkeep new file mode 100644 index 000000000..e69de29bb -- GitLab