Skip to content
Snippets Groups Projects
Commit 1b739bfc authored by Goik Martin's avatar Goik Martin
Browse files

Screwed exam

parent fac050b5
No related branches found
No related tags found
No related merge requests found
Showing
with 1160 additions and 0 deletions
/.classpath
/.project
/.settings
/.A1.log
/dependency-reduced-pom.xml
<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>
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
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
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());
}
}
<?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
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);
}
}
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
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
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
/.classpath
/.project
/.settings
/.A1.log
/dependency-reduced-pom.xml
<?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
-&gt; Run As... -&gt; 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--&gt;General--&gt;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>
<?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>
<?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>
<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>
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
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 + "€";
}
}
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());
}
}
<?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
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);
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment