Commit 6a04359a authored by Dr. Martin Goik's avatar Dr. Martin Goik

Recent examinations

parent 930ad511
<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>sw1klausur</artifactId>
<version>0.8</version>
<packaging>jar</packaging>
<name>sw1klausur</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.2</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
package de.hdm_stuttgart.sw1.klausur.book;
public class Book {
public Book(final int jahr, final String titel) {
this.jahr = jahr;
this.titel = titel;
}
public final int jahr;
public final String titel;
}
package de.hdm_stuttgart.sw1.klausur.book;
import java.util.List;
import java.util.Vector;
public class Driver {
public static void main(String[] args) {
final List<Book> buecher = new Vector<Book>();
buecher.add(new Book(1967, "100 Jahre Einsamkeit"));
buecher.add(new Book(1999, "Ein Spiel"));
buecher.add(new Book(1866, "Schuld und Sühne"));
buecher.add(new Book(1999, "Das Verbrechen"));
for (final Book b: buecher) {
System.out.println(b.jahr + ": " + b.titel);
}
}
}
package de.hdm_stuttgart.sw1.klausur.string;
/**
* Hilfsklasse zur Bereitstellung String-bezogener Methoden.
*
*/
public class StringHelper {
/**
* Bestimmung der Geamtlänge einer Folge von Worten. Beispiel:
*
* <code>{"Dies", " ist ", " kurz.", null} ist ein Array aus drei Strings und einem null Wert mit in Summe
* 4 + 5 + 6 + 0 = 15 Zeichen.</code>
*
* @param words
* Ein Array aus Strings. Kann null sein, null Werte enthalten
* oder die Länge 0 haben.
*
* @return Die Gesamtlänge aller Worte. Enthaltene null Werte werden als
* Länge 0 gewertet. Falls null == words, ist der Rückgabewert 0.
*/
public static int summierteWortLaenge(final String[] words) {
return 0; //TODO
}
/**
* Bestimmung der Anzahl von Ziffern in einer gegebenen Zeichenkette.
*
* Beispiele:
*
* "Anton" enthält 0 Ziffern. "4Laufen 1-2-3" enthält vier Ziffern.
*
* @param s
* Die zu untersuchende Zeichenkette.
* @return Die Anzahl der in s enthaltenen Ziffern. Für null == s soll der
* Wert 0 zurückgegeben werden.
*/
public static int anzahlZiffern(final String s) {
return 0; //TODO
}
/**
* Korrespondierende Methode zu {@link #anzahlZiffern(String)}: Die
* Ziffernsuche wird auf alle in einem Array enthaltenen Strings ausgedehnt.
*
* @param strings
* Liste übergebener Strings.
*
* @return Die Anzahl aller Ziffern aus allen im Array übergebenen Strings.
* Enthaltene null Werte werden ignoriert.
* Ein null Array liefert 0 Ziffern. Ein leeres Array liefert den Wert 0
*/
public static int anzahlZiffern(final String strings[]) {
return 0; //TODO
}
/**
* Entferne alle doppelt auftretenden Zeichenketten und null Werte aus einem
* String Array mit Unterscheidung von Groß- und Kleinschreibung und ordne
* das Ergebnis alphabetisch gemäß {@link String#compareTo(String)}.
* Beispiel:
*
* {"Haus", "Wiese", null, "laufen", null, "Wiese", "Kiste"}
*
* Das erwartete Ergebnis ist:
*
* {"Haus", "Kiste", "Wiese", "laufen"}
*
* Die Reihenfolge ergibt sich aus der alphabetischen Sortierung gemäß
* {@link String#compareTo(String)} unter Beachtung von Groß- und
* Kleinschreibung.
*
* @param inputStrings
* Eine Array aus Strings mit möglichen Duplikaten und null
* Werten. Ein Argument inputStrings == null wird wie ein Array
* der Länge 0, also als {}, gewertet.
*
* @return Die enthaltenen Strings ohne Duplikate und null Werte in
* alphabetisch aufsteigender Reihenfolge. Der Rückgabewert ist
* garantiert von null verschieden.
*/
public static String[] filterUndSortiereDuplikate(final String[] inputStrings) {
return null; //TODO
}
}
\ No newline at end of file
package de.hdm_stuttgart.mi.exam;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention( value = RetentionPolicy.RUNTIME)
@Target( value = { ElementType.METHOD})
public @interface Marking {
int points ();
}
package de.hdm_stuttgart.mi.exam;
import org.junit.AfterClass;
import org.junit.Rule;
public class MarkingTest {
final static ResultCollector globalresultCollector = new ResultCollector();
@Rule
public ResultCollector collectedResults = globalresultCollector;
@AfterClass public static void showResults() {
System.out.println(globalresultCollector);
}
}
package de.hdm_stuttgart.mi.exam;
import java.lang.annotation.Annotation;
import java.util.List;
import java.util.Vector;
import org.junit.rules.TestWatcher;
import org.junit.runner.Description;
public class ResultCollector extends TestWatcher {
public final List<TestResult> failedTests = new Vector<TestResult>(),
successfulTests = new Vector<TestResult>();
@Override
protected void failed(final Throwable e, final Description description) {
failedTests.add(new TestResult(description.getDisplayName(),
getMarking(description), false));
}
@Override
protected void succeeded(final Description description) {
successfulTests.add(new TestResult(description.getDisplayName(),
getMarking(description), true));
}
private static Marking getMarking(final Description description) {
final Marking marking = description.getAnnotation(Marking.class);
if (null == marking) { // Default values: 1 point
return new Marking() {
@Override
public Class<? extends Annotation> annotationType() {
return Marking.class;
}
@Override
public int points() {
return 1;
}
};
}
return marking;
}
@Override
public String toString() {
int reachablePoints = 0, reachedPoints = 0;
for (final TestResult t : successfulTests) {
reachablePoints += t.marking.points();
reachedPoints += t.marking.points();
}
for (final TestResult t : failedTests) {
reachablePoints += t.marking.points();
}
final StringBuffer buffer = new StringBuffer();
buffer.append("You have reached " + reachedPoints + " of "
+ reachablePoints + " possible points in "
+ successfulTests.size() + " successful tests\n");
if (1 == failedTests.size()) {
buffer.append("The following test still fails:\n");
buffer.append(" - " + failedTests.get(0).testMethodDisplayName
+ "\n");
} else if (1 < failedTests.size()) {
buffer.append("The following " + failedTests.size()
+ " tests still fail:\n");
for (final TestResult t : failedTests) {
buffer.append(" - " + t.testMethodDisplayName + "\n");
}
}
return buffer.toString();
}
}
\ No newline at end of file
package de.hdm_stuttgart.mi.exam;
public class TestResult {
public final String testMethodDisplayName;
public final Marking marking;
public final boolean success;
public TestResult(final String testName,
final Marking marking,
final boolean success) {
this.testMethodDisplayName = testName;
this.marking = marking;
this.success = success;
}
}
package de.hdm_stuttgart.sw1.klausur.test;
/**
* String related helper methods
*
*/
public class Helper {
/**
* Turn an array of strings into a readable set .
* @param words Words to be joined into a single string
* @return A String like "{word_1, word_2, ..., word_n}"
*/
public static String toString(final String[] words) {
if (null == words) {
return "null";
} else {
final StringBuffer retValue = new StringBuffer("{");
String sep="";
for(final String w: words) {
retValue.append(sep + "\"" + w + "\"");
sep = ", ";
}
retValue.append("}");
return retValue.toString();
}
}
}
package de.hdm_stuttgart.sw1.klausur.test;
import org.junit.Assert;
import org.junit.Test;
import de.hdm_stuttgart.mi.exam.Marking;
import de.hdm_stuttgart.mi.exam.MarkingTest;
import de.hdm_stuttgart.sw1.klausur.string.StringHelper;
@SuppressWarnings({"static-method", "javadoc"})
public class TestAnzahlZiffernString extends MarkingTest {
private static void pruefeErwarteteZiffernAnzahl(final String s, final int erwarteteZiffernanzahl) {
Assert.assertEquals(
"String '" + s + "' enthält " + erwarteteZiffernanzahl + " Ziffern",
erwarteteZiffernanzahl,
StringHelper.anzahlZiffern(s));
}
@Test
public void anzahlZiffernNull() {
Assert.assertEquals("Ein null String enthält 0 Ziffern",
0, StringHelper.anzahlZiffern((String)null));
}
@Test
@Marking(points=5)
public void anzahlZiffernDiverse() {
pruefeErwarteteZiffernAnzahl("", 0);
pruefeErwarteteZiffernAnzahl("Tim", 0);
pruefeErwarteteZiffernAnzahl(" ", 0);
pruefeErwarteteZiffernAnzahl("1hulgigzgzu", 1);
pruefeErwarteteZiffernAnzahl("wsefresd2", 1);
pruefeErwarteteZiffernAnzahl("0123456789", 10);
pruefeErwarteteZiffernAnzahl("vdfgd123jhztf", 3);
pruefeErwarteteZiffernAnzahl("1a2b3", 3);
pruefeErwarteteZiffernAnzahl("dsfcd1234frsfe", 4);
}
}
package de.hdm_stuttgart.sw1.klausur.test;
import org.junit.Assert;
import org.junit.Test;
import de.hdm_stuttgart.mi.exam.Marking;
import de.hdm_stuttgart.mi.exam.MarkingTest;
import de.hdm_stuttgart.sw1.klausur.string.StringHelper;
/**
* String Tests.
*/
@SuppressWarnings({ "static-method", "javadoc" })
public class TestAnzahlZiffernStringArray extends MarkingTest {
private static void pruefeErwarteteZiffernAnzahl(final String s[], final int erwarteteZiffernzahl) {
Assert.assertEquals(
"String array " + Helper.toString(s) + " enthält " + erwarteteZiffernzahl + " Ziffern.",
erwarteteZiffernzahl,
StringHelper.anzahlZiffern(s));
}
@Test
public void testAnzahlZiffernNull() {
final String t = null;
Assert.assertEquals("Ein null String[] enthält 0 Ziffern",
0,
StringHelper.anzahlZiffern(t));
}
@Test
@Marking(points=2)
public void testAnzahlZiffernNotNull() {
pruefeErwarteteZiffernAnzahl(new String[]{}, 0);
pruefeErwarteteZiffernAnzahl(new String[]{""}, 0);
pruefeErwarteteZiffernAnzahl(new String[]{"1", " and", "33 plus 4"}, 4);
}
@Test
@Marking(points=2)
public void testAnzahlZiffernMixedNull() {
pruefeErwarteteZiffernAnzahl(new String[]{null}, 0);
pruefeErwarteteZiffernAnzahl(new String[]{null, null}, 0);
pruefeErwarteteZiffernAnzahl(new String[]{"1", null, " and", "337 plus 4", null, null}, 5);
}
}
package de.hdm_stuttgart.sw1.klausur.test;
import org.junit.Assert;
import org.junit.Test;
import de.hdm_stuttgart.mi.exam.MarkingTest;
import de.hdm_stuttgart.sw1.klausur.string.StringHelper;
@SuppressWarnings({"static-method", "javadoc"})
public class TestFilterSortiere extends MarkingTest {
@Test
public void nullArray() {
final String[] result = StringHelper.filterUndSortiereDuplikate(null);
assertArrayEquals(new String[0], result);
}
@Test
public void einzelnerNullWert() {
final String[] result = StringHelper.filterUndSortiereDuplikate(new String[]{null});
assertArrayEquals(new String[0], result);
}
@Test
public void mehrereNullWerte() {
final String[] result = StringHelper.filterUndSortiereDuplikate(new String[]{null});
assertArrayEquals(new String[0], result);
}
@Test
public void einzelnNotNull() {
final String testWert = "Hans";
final String[] result = StringHelper.filterUndSortiereDuplikate(new String[]{testWert});
assertArrayEquals(new String[]{testWert}, result);
}
@Test
public void mehrfachIdentischNotNull() {
final String testWert = "Hans";
final String[] result = StringHelper.filterUndSortiereDuplikate(new String[]{testWert, testWert, testWert});
assertArrayEquals(new String[]{testWert}, result);
}
@Test
public void mehrfachIdentischNull() {
final String testWert = "Hans";
final String[] result = StringHelper.filterUndSortiereDuplikate(new String[]{testWert, null, testWert});
assertArrayEquals(new String[]{testWert}, result);
}
@Test
public void verschieden() {
final String[] result = StringHelper.filterUndSortiereDuplikate(new String[]{"eins", "Zwei", "Drei"})
, expected = new String[]{"Drei", "Zwei", "eins"};
assertArrayEquals(expected, result);
}
@Test
public void duplikate() {
final String[] result = StringHelper.filterUndSortiereDuplikate(new String[]{"eins", "Zwei", "Drei"})
, expected = new String[]{"Drei", "Zwei", "eins"};
assertArrayEquals(expected, result);
}
/**
* Hilfsmethode zum Test der Gleichheit zweier String arrays.
*
* @param expected Erwartetes Array
* @param result Erhaltenes Array
*/
public static void assertArrayEquals(final String[] expected, final String[] result) {
Assert.assertEquals("String Länge verschieden: " + expected.length + " != " + result.length, expected.length, result.length);
for (int i = 0; i < expected.length; i++) {
Assert.assertEquals("Array Komponenten sind verschieden: " + expected[i] + " != " + result[i], expected[i], result[i]);
}
}
}
package de.hdm_stuttgart.sw1.klausur.test;
import org.junit.Assert;
import org.junit.Test;
import de.hdm_stuttgart.mi.exam.MarkingTest;
import de.hdm_stuttgart.sw1.klausur.string.StringHelper;
@SuppressWarnings({ "static-method", "javadoc" })
public class TestSummierteWortlaenge extends MarkingTest {
private static void pruefeErwarteteLaenge(final String[] s, int erwarteteLaenge) {
Assert.assertEquals("Wortliste '" + Helper.toString(s) + "' hat erwartete Gesamtlänge " + erwarteteLaenge,
erwarteteLaenge,
StringHelper.summierteWortLaenge(s));
}
@Test
public void testNull() {
Assert.assertEquals("Ein null String hat die Länge 0", 0,
StringHelper.summierteWortLaenge(null));
}
@Test
public void summierteWortLaengeNonNull() {
pruefeErwarteteLaenge(new String[] {}, 0);
pruefeErwarteteLaenge(new String[] { "" }, 0);
pruefeErwarteteLaenge(new String[] { "Einfach" }, 7);
pruefeErwarteteLaenge(new String[] { "Einfach, ", ", doppelt" }, 18);
pruefeErwarteteLaenge(new String[] { "Einfach, ", ", doppelt", ", dreifach" }, 28);
}
@Test
public void testMixedNull() {
pruefeErwarteteLaenge(new String[] { null }, 0);
pruefeErwarteteLaenge(new String[] { null, null }, 0);
pruefeErwarteteLaenge(new String[] { "Einfach", null }, 7);
pruefeErwarteteLaenge(new String[] { "Einfach, ", null, ", doppelt" }, 18);
pruefeErwarteteLaenge(new String[] { null, "Einfach, ", null, ", doppelt"}, 18);
pruefeErwarteteLaenge(new String[] { null, "Einfach, ", null, ", doppelt", ", dreifach", null }, 28);
pruefeErwarteteLaenge(new String[] { "Dies", " ist ", " kurz.", null }, 15);
}
}
<?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>
<h1>Beschreibung</h1><p>In dieser Aufgabe sollen mehrere Methoden zur
Verarbeitung von Zeichenketten (Strings) implementiert
werden.</p><h1>Vorbereitung</h1><p>Importieren Sie <a href="/files/goik/Klausur/WS2014/cwerhfhasfcfzchefherbfer/sw1.zip">sw1.zip</a> als
Maven Projekt in Ihren Eclipse workspace. Ignorieren Sie bitte das darin enthaltene
Package <code>de.hdm_stuttgart.mi.exam</code>.</p>
<h1>Aufgabe</h1><p>Vervollständigen Sie die Implementierung der folgenden Methoden in der Klasse
<code>de.hdm_stuttgart.sw1.klausur.stringlength.StringHelper</code>:</p><ol>
<li><code>int summierteWortLaenge(final String[] words)</code></li>
<li><code>int anzahlZiffern(final String s)</code></li>
<li><code>int anzahlZiffern(final String strings[])</code></li>
<li><code>public static String[] filterUndSortiereDuplikate(final String[] inputStrings)</code></li>
</ol><p>Die Javadoc Kommentare der jeweiligen Methoden beschreiben das
gewünschte Verhalten.</p><h1>Allgemeine Hinweise</h1><ul>
<li><p>Für jede Methode aus der Klasse <code>StringHelper</code> steht
eine korrespondierende Junit Testklasse zur Verfügung:</p>
<table style="border: 1px solid black;">
<tr>
<td>Methode in <code>StringHelper</code></td>
<td>Korrespondierende Testklasse</td>
</tr>
<tr>
<td><hr/><code>int summierteWortLaenge(final String[] words)</code><p
style="color:red;">Das Array übergebener Worte kann null sein,
leer sein oder null Werte enthalten. Die Länge eines Strings
erhalten Sie über die Methode <code>int length()</code> aus der
Klasse <code>java.lang.String</code>.</p></td>
<td><hr/><code>TestSummierteWortlaenge</code></td>
</tr>
<tr>
<td><hr/><code>int anzahlZiffern(final String s)</code><p
style="color:red;">Beachten Sie die Methode
<code><code>java.lang.Character.isDigit(char)</code></code>.</p></td>
<td><hr/><code>TestAnzahlZiffernString</code></td>
</tr>
<tr>
<td><hr/><code>int anzahlZiffern(final String strings[])</code><p
style="color:red;">Die Implementierung kann unter Verwendung der
Methode <code>int anzahlZiffern(final String s)</code>
erfolgen.</p></td>
<td><hr/><code>TestAnzahlZiffernStringArray</code></td>
</tr>