Commit a6fff326 authored by Dr. Martin Goik's avatar Dr. Martin Goik

Exam solutions, CheatSheet link correction

parent 9f2c405b
...@@ -179,6 +179,27 @@ Generating /home/xy123/Downloads/Exam/Solve/target/site/apidocs/help-doc.html... ...@@ -179,6 +179,27 @@ Generating /home/xy123/Downloads/Exam/Solve/target/site/apidocs/help-doc.html...
</itemizedlist> </itemizedlist>
</caution> </caution>
</section> </section>
<section xml:id="sd1_exam_2018_summer_solve1">
<title>Lösung</title>
<itemizedlist>
<listitem>
<para>Klassen <classname
xlink:href="https://gitlab.mi.hdm-stuttgart.de/goik/GoikLectures/blob/master/Klausuren/Sd1/2018summer/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/aufgabe1/StringHelper.java">StringHelper</classname>,
<classname
xlink:href="https://gitlab.mi.hdm-stuttgart.de/goik/GoikLectures/blob/master/Klausuren/Sd1/2018summer/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/aufgabe1/MathHelper.java">MathHelper</classname>
und <classname
xlink:href="https://gitlab.mi.hdm-stuttgart.de/goik/GoikLectures/blob/master/Klausuren/Sd1/2018summer/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/aufgabe1/ArrayHelper.java">ArrayHelper</classname>
.</para>
</listitem>
<listitem>
<para><productname>Maven</productname> Projekt mit <filename
xlink:href="https://gitlab.mi.hdm-stuttgart.de/goik/GoikLectures/blob/master/Klausuren/Sd1/2018summer/Solve/pom.xml">pom.xml</filename>.</para>
</listitem>
</itemizedlist>
</section>
</section> </section>
<section xml:id="sd1_exam_2018_summer_task2"> <section xml:id="sd1_exam_2018_summer_task2">
...@@ -302,6 +323,22 @@ Ball / Fahrrad: false</screen></td> ...@@ -302,6 +323,22 @@ Ball / Fahrrad: false</screen></td>
</listitem> </listitem>
</itemizedlist> </itemizedlist>
</section> </section>
<section xml:id="sd1_exam_2018_summer_solve2">
<title>Lösung</title>
<itemizedlist>
<listitem>
<para>Die Klasse <classname
xlink:href="https://gitlab.mi.hdm-stuttgart.de/goik/GoikLectures/blob/master/Klausuren/Sd1/2018summer/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/aufgabe2/Artikel.java">Artikel</classname>.</para>
</listitem>
<listitem>
<para><productname>Maven</productname> Projekt mit <filename
xlink:href="https://gitlab.mi.hdm-stuttgart.de/goik/GoikLectures/blob/master/Klausuren/Sd1/2018summer/Solve/pom.xml">pom.xml</filename>.</para>
</listitem>
</itemizedlist>
</section>
</section> </section>
<section xml:id="sd1_exam_2018_summer_task3"> <section xml:id="sd1_exam_2018_summer_task3">
...@@ -354,12 +391,36 @@ System.out.println("Wertvergleich int mit long: " + ...@@ -354,12 +391,36 @@ System.out.println("Wertvergleich int mit long: " +
</informaltable> </informaltable>
<para>Erklären Sie dieses unterschiedliche Ergebnis <code <para>Erklären Sie dieses unterschiedliche Ergebnis <code
language="java">true</code> vs. <code language="java">false</code>.</para> language="java">true</code> <abbrev>vs.</abbrev> <code
language="java">false</code>.</para>
<para>Hinweis: Wie wird die <methodname <para>Hinweis: Wie wird die <methodname
xlink:href="https://docs.oracle.com/javase/10/docs/api/java/lang/Object.html#equals(java.lang.Object)">equals()</methodname> xlink:href="https://docs.oracle.com/javase/10/docs/api/java/lang/Object.html#equals(java.lang.Object)">equals()</methodname>
Methode in Bezug auf Instanzen »fremder« Klassen implementiert? Was Methode in Bezug auf Instanzen »fremder« Klassen implementiert? Was
bewirken die Zuweisungen?</para> bewirken die Zuweisungen?</para>
<section xml:id="sd1_exam_2018_summer_solve3">
<title>Lösung</title>
<para>Die beiden Objekte <code language="java">x</code> vom Typ
<classname
xlink:href="https://docs.oracle.com/javase/10/docs/api/java/lang/Integer.html">Integer</classname>
und <code language="java">y</code> vom Typ <classname
xlink:href="https://docs.oracle.com/javase/10/docs/api/java/lang/Long.html">Long</classname>
repräsentieren den identischen Wert 44. Es sind aber Instanzen
verschiedener Klassen.</para>
<para>Die Überschreibung der <methodname
xlink:href="https://docs.oracle.com/en/java/javase/12/docs/api/java.base/java/lang/Object.html#equals(java.lang.Object)">equals(...)</methodname>
Methode prüft zunächst, ob die beiden beteiligten Instanzen zur selben
Klasse gehören, wie <abbrev>z.B.</abbrev> in <link
linkend="sd1_coreclasses_fig_hashExample"><classname>Rectangle</classname>.<methodname>equals(..)</methodname></link>.</para>
<para>Da <code language="java">x</code> und <code
language="java">y</code> zu verschiedenen Klassen gehören, liefert <code
language="java">x.equals(y)</code> unabhängig vom repräsentierten Wert
stets <code language="java">false</code>.</para>
</section>
</section> </section>
<section xml:id="sd1_exam_2018_summer_task4"> <section xml:id="sd1_exam_2018_summer_task4">
...@@ -379,33 +440,72 @@ System.out.println("Wertvergleich int mit long: " + ...@@ -379,33 +440,72 @@ System.out.println("Wertvergleich int mit long: " +
void toString(); void toString();
}</programlisting></td> }</programlisting></td>
<td valign="top">'toString()' in 'de.hdm_stuttgart.mi.sd1.iface.Konto' <td valign="top" xml:lang="en">'toString()' in
clashes with 'toString()' in 'java.lang.Object'; attempting to use 'de.hdm_stuttgart.mi.sd1.iface.Konto' clashes with 'toString()' in
incompatible return type</td> 'java.lang.Object'; attempting to use incompatible return type</td>
</tr> </tr>
</informaltable> </informaltable>
<para>Erläutern Sie die Ursache dieser Fehlermeldung. Welche Beziehung <para>Erläutern Sie die Ursache dieser Fehlermeldung. Welche Beziehung
besteht zu <classname besteht zu <classname
xlink:href="https://docs.oracle.com/javase/10/docs/api/java/lang/Object.html">java.lang.Object</classname>?</para> xlink:href="https://docs.oracle.com/javase/10/docs/api/java/lang/Object.html">java.lang.Object</classname>?</para>
<section xml:id="sd1_exam_2018_summer_solve4">
<title>Lösung</title>
<para>Eine beliebige Klasse <classname>X</classname> erbt, explizit oder
implizit, die Methode <methodname
xlink:href="https://docs.oracle.com/javase/10/docs/api/java/lang/Object.html#equals(java.lang.Object)">equals()</methodname>
aus . Falls <classname>X</classname> das Interface
<classname>Konto</classname> implementiert, so hätten wir z.B.:</para>
<programlisting language="java">public class X extends Object implements Konto {
// Vererbte Methode public String toString() {...} aus der Oberklasse Object
// Konflikt; Identischer Name und Argumenttyp, aber anderer Return-Typ
public void toString() {
...
return ...;
}
}</programlisting>
<para>Wir verwenden nun die Methode:</para>
<programlisting language="java">final Class X = new X();
x.toString();</programlisting>
<para>Methodensignaturen berücksichtigen nicht den Return-Typ einer
Methode. Da <xref linkend="glo_Java"/> <link
linkend="sd1_fig_distinctReturnType">nur Methodensignaturen
kennt</link>, kann der Compiler die beiden Methoden nicht unterscheiden
und somit auch nicht zwischen ihnen auswählen.</para>
<para>Aus diesem Grund dürfen <xref linkend="glo_Java"/> <code
language="java">interface</code> Deklarationen generell keine
Methoden-Signaturkonflikte zu <classname
xlink:href="https://docs.oracle.com/javase/10/docs/api/java/lang/Object.html">java.lang.Object</classname>
haben.</para>
</section>
</section> </section>
<section xml:id="sd1_exam_2018_summer_task5"> <section xml:id="sd1_exam_2018_summer_task5">
<title>Farbwerte, <code language="java">byte</code> und <code <title>Farbwerte, <code language="java">byte</code> und <code
language="java">int</code></title> language="java">int</code></title>
<para>Ein Entwickler möchte Farbwerte nach dem RGB Modell abbilden. Die <para>Ein Entwickler möchte Farbwerte nach dem <abbrev>RGB</abbrev> Modell
drei Farbkomponenten rot, grün und blau stellt er jeweils als <code abbilden. Die drei Farbkomponenten rot, grün und blau stellt er jeweils
language="java">byte</code> dar. Er setzt den byte Wert -128 zu null und als <code language="java">byte</code> dar. Er setzt den byte Wert -128 zu
127 als Maximalwert des jeweiligen Farbanteils fest. Das (rgb) Tripel null und 127 als Maximalwert des jeweiligen Farbanteils fest. Das
(-128, 0, 127) entspricht also null Rotanteil, mittlerem Gelbanteil und <abbrev>RGB</abbrev> Tripel <code>(-128, 0, 127)</code> entspricht also
maximalem Blauanteil.</para> null Rotanteil, mittlerem Gelbanteil und maximalem Blauanteil.</para>
<para>Der Entwickler möchte den Farbwert in einer fremden, von ihm nicht <para>Der Entwickler möchte den Farbwert in einer fremden, von ihm nicht
veränderbaren, Klasse darstellen. Dort kann er ein nicht mehr genutztes veränderbaren, Klasse darstellen. Dort kann er ein nicht mehr benutztes
<code language="java">int</code> Attribut verwenden. Er möchte die drei <code language="java">int</code> Attribut verwenden. Er möchte die drei
Farbanteile in einen int Wert umwandeln und plant dazu eine entsprechende Farbanteile in einen <code language="java">int</code> Wert umwandeln und
Methode:</para> plant dazu eine entsprechende Methode:</para>
<programlisting language="java">/** <programlisting language="java">/**
* Wandele die drei Farbanteile (r, g, b) einer Farbe in einen int * Wandele die drei Farbanteile (r, g, b) einer Farbe in einen int
...@@ -422,7 +522,7 @@ static public int rgb2int(final byte r, final byte g, final byte b) { ...@@ -422,7 +522,7 @@ static public int rgb2int(final byte r, final byte g, final byte b) {
<para>Zudem möchte er diese <code language="java">int</code> Werte auch <para>Zudem möchte er diese <code language="java">int</code> Werte auch
wieder eindeutig in die drei Farbanteile zurückwandeln können, um so die wieder eindeutig in die drei Farbanteile zurückwandeln können, um so die
ursprünglichen RGB Anteile zu erhalten:</para> ursprünglichen <abbrev>RGB</abbrev> Anteile zu erhalten:</para>
<programlisting language="java">/** <programlisting language="java">/**
* Umwandlung eines int Farbwerts in die drei (r,g,b) Anteile. Gegenoperation * Umwandlung eines int Farbwerts in die drei (r,g,b) Anteile. Gegenoperation
...@@ -439,7 +539,15 @@ static public byte[] int2rgb(final int farbwert) { ...@@ -439,7 +539,15 @@ static public byte[] int2rgb(final int farbwert) {
Aussage.</para> Aussage.</para>
<tip> <tip>
<para>Betrachten Sie die zugrundliegenden Datentypen.</para> <para>Betrachten Sie die zugrunde liegenden Datentypen.</para>
</tip> </tip>
<section xml:id="sd1_exam_2018_summer_solve5">
<title>Lösung</title>
<para>Ein <code language="java">int</code> besteht aus vier Bytes und
bietet somit ausreichend Speicherplatz zur Aufnahme von drei <code
language="java">byte</code> Werten.</para>
</section>
</section> </section>
</section> </section>
...@@ -166,6 +166,24 @@ ...@@ -166,6 +166,24 @@
</listitem> </listitem>
</itemizedlist> </itemizedlist>
</section> </section>
<section xml:id="sd1_exam_2019_summer_solve1">
<title>Solution</title>
<itemizedlist>
<listitem>
<para>Classes <classname
xlink:href="https://gitlab.mi.hdm-stuttgart.de/goik/GoikLectures/blob/master/Klausuren/Sd1/2019summer/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/task1/Helper.java">Helper</classname>
and <classname
xlink:href="https://gitlab.mi.hdm-stuttgart.de/goik/GoikLectures/blob/master/Klausuren/Sd1/2019summer/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/task1/HelperArray.java">HelperArray</classname>.</para>
</listitem>
<listitem>
<para>Maven project containing <filename
xlink:href="https://gitlab.mi.hdm-stuttgart.de/goik/GoikLectures/blob/master/Klausuren/Sd1/2019summer/Solve/pom.xml">pom.xml</filename>.</para>
</listitem>
</itemizedlist>
</section>
</section> </section>
<section xml:id="sd1_exam_2019_summer_task2"> <section xml:id="sd1_exam_2019_summer_task2">
...@@ -227,6 +245,22 @@ ...@@ -227,6 +245,22 @@
</listitem> </listitem>
</itemizedlist> </itemizedlist>
</section> </section>
<section xml:id="sd1_exam_2019_summer_solve2">
<title>Solution</title>
<itemizedlist>
<listitem>
<para>Classes <filename
xlink:href="https://gitlab.mi.hdm-stuttgart.de/goik/GoikLectures/blob/master/Klausuren/Sd1/2019summer/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/task2/ChangeAmount.java">ChangeAmount.java</filename>.</para>
</listitem>
<listitem>
<para>Maven project containing <filename
xlink:href="https://gitlab.mi.hdm-stuttgart.de/goik/GoikLectures/blob/master/Klausuren/Sd1/2019summer/Solve/pom.xml">pom.xml</filename>.</para>
</listitem>
</itemizedlist>
</section>
</section> </section>
<section xml:id="sd1_exam_2019_summer_task3"> <section xml:id="sd1_exam_2019_summer_task3">
......
...@@ -35,7 +35,7 @@ ...@@ -35,7 +35,7 @@
<listitem> <listitem>
<para>Subsequent transfer to read-only location <uri <para>Subsequent transfer to read-only location <uri
xlink:href="https://klausur.mi.hdm-stuttgart.de/files/CheatSheet/Sd1">https://klausur.mi.hdm-stuttgart.de/files/CheatSheet/Sd1</uri>.</para> xlink:href="https://learn.mi.hdm-stuttgart.de/files/CheatSheet/Sd1">https://learn.mi.hdm-stuttgart.de/files/CheatSheet/Sd1</uri>.</para>
</listitem> </listitem>
<listitem> <listitem>
......
...@@ -102,14 +102,14 @@ public class Helper { ...@@ -102,14 +102,14 @@ public class Helper {
if (null == title) { if (null == title) {
return false; return false;
} else { } else {
// Character.isLetter(...) not required: isUpperCase() returns false for non-letters anyway. return 20 <= title.length() && // Character.isLetter(...) not being required:
return 20 <= title.length() && Character.isUpperCase(title.charAt(0)); Character.isUpperCase(title.charAt(0)); // isUpperCase() returns «false» for non-letters anyway.
} }
} }
/** <p>Tell whether a given character is a vowel or not. The set of vowels is:</p> /** <p>Tell whether a given character is a vowel or not. The set of vowels is:</p>
* *
* <p><code>{a, e, i, o, u}</code> plus the five corresponding uppercase counterparts.</p> * <p><code>{a, e, i, o, u}</code> and their five corresponding uppercase counterparts.</p>
* *
* @param candidate The character to be examined. * @param candidate The character to be examined.
* @return <code>true</code> if the given character is a vowel, <code>false</code> otherwise. * @return <code>true</code> if the given character is a vowel, <code>false</code> otherwise.
...@@ -117,17 +117,12 @@ public class Helper { ...@@ -117,17 +117,12 @@ public class Helper {
static public boolean isVowel(final char candidate) { static public boolean isVowel(final char candidate) {
switch(candidate) { switch(Character.toLowerCase(candidate)) {
case 'a': case 'a':
case 'e': case 'e':
case 'i': case 'i':
case 'o': case 'o':
case 'u': case 'u':
case 'A':
case 'E':
case 'I':
case 'O':
case 'U':
return true; return true;
default: default:
...@@ -184,22 +179,21 @@ public class Helper { ...@@ -184,22 +179,21 @@ public class Helper {
* input value. * input value.
*/ */
static public int getNumberOfVowels(final String s) { static public int getNumberOfVowels(final String s) {
if (null == s) { // Handle special case
if (null == s) {
return 0; return 0;
} else { } else {
// Alternative Java Stream solution int numberOfVowels = 0; // No vowel found yet.
// return (int) s.chars().filter(c -> isVowel((char)c)).count();
int numberOfVowels = 0;
for (final char c: s.toCharArray()) { for (final char c: s.toCharArray()) { // Loop each string's character counting
if (isVowel(c)) { if (isVowel(c)) { // vowel occurrences.
numberOfVowels++; numberOfVowels++;
} }
} }
return numberOfVowels; return numberOfVowels;
} }
// Alternative Java Stream solution:
// return (int) s.chars().filter(c -> isVowel((char)c)).count();
} }
/** /**
...@@ -244,11 +238,16 @@ public class Helper { ...@@ -244,11 +238,16 @@ public class Helper {
* <code>'.'</code> character. If no separation character is present, the entire name will be replaced. * <code>'.'</code> character. If no separation character is present, the entire name will be replaced.
*/ */
public static String renameFileBasename(final String filename, final String newBasename) { public static String renameFileBasename(final String filename, final String newBasename) {
final int firstDotIndex = filename.indexOf('.');
if (firstDotIndex < 0) { final int firstDotIndex = filename.indexOf('.'); // Find first dot (.) position within string, will be negative
return newBasename; // if no dot is being found.
} else {
return newBasename + filename.substring(firstDotIndex); if (firstDotIndex < 0) { // No dot found? Just
return newBasename; // return basename.
} else { // Current filename contains at least one dot: Return input string
return newBasename + // up to and including first dot appending newBasename.
filename.substring(firstDotIndex);
} }
} }
} }
\ No newline at end of file
...@@ -52,23 +52,20 @@ public class HelperArray { ...@@ -52,23 +52,20 @@ public class HelperArray {
*/ */
static public String[] getAlphabeticalFollowers(final String[] values, final String reference) { static public String[] getAlphabeticalFollowers(final String[] values, final String reference) {
if (null == values || null == reference) { if (null == values || null == reference) { // Filter special cases returning an empty
return new String[] {}; return new String[] {}; // result array.
} else { } else {
final String[] resultBuffer = new String[values.length]; final String[] resultBuffer = new String[values.length]; // Container for collecting results.
int numFollower = 0; // No follower yet found int numFollower = 0; // No follower yet found
for (final String s: values) { for (final String s: values) { // Search all non-null input[] values for alphabetical
if (null != s && 0 < s.compareTo(reference)) { if (null != s && 0 < s.compareTo(reference)) { // followers with respect to reference and append
resultBuffer[numFollower++] = s; resultBuffer[numFollower++] = s; // them to resultBuffer[] each time incrementing
} } // numFollower.
} }
if (numFollower < values.length) { return Arrays.copyOf( // Create result array containing only
// Array containing empty positions, cut off the trash resultBuffer, // alphabetical followers
return Arrays.copyOf(resultBuffer, numFollower); numFollower);
} else {
return resultBuffer;
}
// Much better: Java stream solution, subject in «Software Development 2» // Much better: Java stream solution, subject in «Software Development 2»
...@@ -103,15 +100,18 @@ public class HelperArray { ...@@ -103,15 +100,18 @@ public class HelperArray {
*/ */
static public int[] getLeaders(final int[] values) { static public int[] getLeaders(final int[] values) {
final int[] candidates = new int[values.length]; // Maximum possible length. final int[] candidates = new int[values.length]; // Maximum possible length.
int currentLeaderIndex = values.length - 1; int currentLeaderIndex = values.length - 1; // Rightmost element is
candidates[currentLeaderIndex] = values[currentLeaderIndex]; candidates[currentLeaderIndex] = values[currentLeaderIndex]; // always leader.
for (int i = values.length - 2; 0 <= i; i--) { for (int i = values.length - 2; 0 <= i; i--) { // Search values[] for further
if (candidates[currentLeaderIndex] <= values[i]){ if (candidates[currentLeaderIndex] <= values[i]){ // leader elements and copy those
candidates[--currentLeaderIndex] = values[i]; candidates[--currentLeaderIndex] = values[i]; // into candidates[].
} }
} }
return Arrays.copyOfRange(candidates, currentLeaderIndex, values.length); return Arrays.copyOfRange( // Create result array from «lower» part
candidates, // of candidates[] containing at least one leader.
currentLeaderIndex,
values.length);
} }
} }
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment