diff --git a/Doc/Sd1/Exam/2018/Summer/exam.xml b/Doc/Sd1/Exam/2018/Summer/exam.xml index a6854a266aac65c0a1ec0fc8db85cb09f1e7028f..2cc20a120f848238ab4b6125722bb8f0b03f1512 100644 --- a/Doc/Sd1/Exam/2018/Summer/exam.xml +++ b/Doc/Sd1/Exam/2018/Summer/exam.xml @@ -179,6 +179,27 @@ Generating /home/xy123/Downloads/Exam/Solve/target/site/apidocs/help-doc.html... </itemizedlist> </caution> </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 xml:id="sd1_exam_2018_summer_task2"> @@ -302,6 +323,22 @@ Ball / Fahrrad: false</screen></td> </listitem> </itemizedlist> </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 xml:id="sd1_exam_2018_summer_task3"> @@ -354,12 +391,36 @@ System.out.println("Wertvergleich int mit long: " + </informaltable> <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 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 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 xml:id="sd1_exam_2018_summer_task4"> @@ -379,33 +440,72 @@ System.out.println("Wertvergleich int mit long: " + void toString(); }</programlisting></td> - <td valign="top">'toString()' in 'de.hdm_stuttgart.mi.sd1.iface.Konto' - clashes with 'toString()' in 'java.lang.Object'; attempting to use - incompatible return type</td> + <td valign="top" xml:lang="en">'toString()' in + 'de.hdm_stuttgart.mi.sd1.iface.Konto' clashes with 'toString()' in + 'java.lang.Object'; attempting to use incompatible return type</td> </tr> </informaltable> <para>Erläutern Sie die Ursache dieser Fehlermeldung. Welche Beziehung besteht zu <classname 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 xml:id="sd1_exam_2018_summer_task5"> <title>Farbwerte, <code language="java">byte</code> und <code language="java">int</code></title> - <para>Ein Entwickler möchte Farbwerte nach dem RGB Modell abbilden. Die - drei Farbkomponenten rot, grün und blau stellt er jeweils als <code - language="java">byte</code> dar. Er setzt den byte Wert -128 zu null und - 127 als Maximalwert des jeweiligen Farbanteils fest. Das (rgb) Tripel - (-128, 0, 127) entspricht also null Rotanteil, mittlerem Gelbanteil und - maximalem Blauanteil.</para> + <para>Ein Entwickler möchte Farbwerte nach dem <abbrev>RGB</abbrev> Modell + abbilden. Die drei Farbkomponenten rot, grün und blau stellt er jeweils + als <code language="java">byte</code> dar. Er setzt den byte Wert -128 zu + null und 127 als Maximalwert des jeweiligen Farbanteils fest. Das + <abbrev>RGB</abbrev> Tripel <code>(-128, 0, 127)</code> entspricht also + null Rotanteil, mittlerem Gelbanteil und maximalem Blauanteil.</para> <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 - Farbanteile in einen int Wert umwandeln und plant dazu eine entsprechende - Methode:</para> + Farbanteile in einen <code language="java">int</code> Wert umwandeln und + plant dazu eine entsprechende Methode:</para> <programlisting language="java">/** * 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) { <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 - ursprünglichen RGB Anteile zu erhalten:</para> + ursprünglichen <abbrev>RGB</abbrev> Anteile zu erhalten:</para> <programlisting language="java">/** * Umwandlung eines int Farbwerts in die drei (r,g,b) Anteile. Gegenoperation @@ -439,7 +539,15 @@ static public byte[] int2rgb(final int farbwert) { Aussage.</para> <tip> - <para>Betrachten Sie die zugrundliegenden Datentypen.</para> + <para>Betrachten Sie die zugrunde liegenden Datentypen.</para> </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> diff --git a/Doc/Sd1/Exam/2019/Summer/exam.xml b/Doc/Sd1/Exam/2019/Summer/exam.xml index 3f5f69dc9f78a40c2ce7aa13107aaccab2b6990a..8d559345809328c9ac016aa0c62d1290ae86f684 100644 --- a/Doc/Sd1/Exam/2019/Summer/exam.xml +++ b/Doc/Sd1/Exam/2019/Summer/exam.xml @@ -166,6 +166,24 @@ </listitem> </itemizedlist> </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 xml:id="sd1_exam_2019_summer_task2"> @@ -227,6 +245,22 @@ </listitem> </itemizedlist> </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 xml:id="sd1_exam_2019_summer_task3"> diff --git a/Doc/Sd1/appendix.xml b/Doc/Sd1/appendix.xml index 696c194130983164f90d8e6d463f5f5831512fb5..dd3f85239b41f586717c0d1d1c49ee1e46bf357f 100644 --- a/Doc/Sd1/appendix.xml +++ b/Doc/Sd1/appendix.xml @@ -35,7 +35,7 @@ <listitem> <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> diff --git a/Klausuren/Sd1/2019summer/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/task1/Helper.java b/Klausuren/Sd1/2019summer/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/task1/Helper.java index 5114ff57f7e8ef24accbd577663c4964d050de43..16d681f20c383914fc2767157d414e705e5e6977 100644 --- a/Klausuren/Sd1/2019summer/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/task1/Helper.java +++ b/Klausuren/Sd1/2019summer/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/task1/Helper.java @@ -102,14 +102,14 @@ public class Helper { if (null == title) { return false; } else { - // Character.isLetter(...) not required: isUpperCase() returns false for non-letters anyway. - return 20 <= title.length() && Character.isUpperCase(title.charAt(0)); + return 20 <= title.length() && // Character.isLetter(...) not being required: + 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><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. * @return <code>true</code> if the given character is a vowel, <code>false</code> otherwise. @@ -117,17 +117,12 @@ public class Helper { static public boolean isVowel(final char candidate) { - switch(candidate) { + switch(Character.toLowerCase(candidate)) { case 'a': case 'e': case 'i': case 'o': case 'u': - case 'A': - case 'E': - case 'I': - case 'O': - case 'U': return true; default: @@ -184,22 +179,21 @@ public class Helper { * input value. */ static public int getNumberOfVowels(final String s) { - - if (null == s) { + if (null == s) { // Handle special case return 0; } else { - // Alternative Java Stream solution - // return (int) s.chars().filter(c -> isVowel((char)c)).count(); - - int numberOfVowels = 0; + int numberOfVowels = 0; // No vowel found yet. - for (final char c: s.toCharArray()) { - if (isVowel(c)) { + for (final char c: s.toCharArray()) { // Loop each string's character counting + if (isVowel(c)) { // vowel occurrences. numberOfVowels++; } } return numberOfVowels; } + + // Alternative Java Stream solution: + // return (int) s.chars().filter(c -> isVowel((char)c)).count(); } /** @@ -244,11 +238,16 @@ public class Helper { * <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) { - final int firstDotIndex = filename.indexOf('.'); - if (firstDotIndex < 0) { - return newBasename; - } else { - return newBasename + filename.substring(firstDotIndex); + + final int firstDotIndex = filename.indexOf('.'); // Find first dot (.) position within string, will be negative + // if no dot is being found. + + 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 diff --git a/Klausuren/Sd1/2019summer/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/task1/HelperArray.java b/Klausuren/Sd1/2019summer/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/task1/HelperArray.java index 299f4e46f7c94416733657344adeadbe34ef31fd..c0a73d531f50061c827124a2642f6b542db620cb 100644 --- a/Klausuren/Sd1/2019summer/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/task1/HelperArray.java +++ b/Klausuren/Sd1/2019summer/Solve/src/main/java/de/hdm_stuttgart/mi/sd1/task1/HelperArray.java @@ -52,23 +52,20 @@ public class HelperArray { */ static public String[] getAlphabeticalFollowers(final String[] values, final String reference) { - if (null == values || null == reference) { - return new String[] {}; + if (null == values || null == reference) { // Filter special cases returning an empty + return new String[] {}; // result array. } else { - final String[] resultBuffer = new String[values.length]; - int numFollower = 0; // No follower yet found + final String[] resultBuffer = new String[values.length]; // Container for collecting results. + int numFollower = 0; // No follower yet found - for (final String s: values) { - if (null != s && 0 < s.compareTo(reference)) { - resultBuffer[numFollower++] = s; - } - } - if (numFollower < values.length) { - // Array containing empty positions, cut off the trash - return Arrays.copyOf(resultBuffer, numFollower); - } else { - return resultBuffer; - } + for (final String s: values) { // Search all non-null input[] values for alphabetical + if (null != s && 0 < s.compareTo(reference)) { // followers with respect to reference and append + resultBuffer[numFollower++] = s; // them to resultBuffer[] each time incrementing + } // numFollower. + } + return Arrays.copyOf( // Create result array containing only + resultBuffer, // alphabetical followers + numFollower); // Much better: Java stream solution, subject in «Software Development 2» @@ -103,15 +100,18 @@ public class HelperArray { */ static public int[] getLeaders(final int[] values) { - final int[] candidates = new int[values.length]; // Maximum possible length. - int currentLeaderIndex = values.length - 1; - candidates[currentLeaderIndex] = values[currentLeaderIndex]; + final int[] candidates = new int[values.length]; // Maximum possible length. + int currentLeaderIndex = values.length - 1; // Rightmost element is + candidates[currentLeaderIndex] = values[currentLeaderIndex]; // always leader. - for (int i = values.length - 2; 0 <= i; i--) { - if (candidates[currentLeaderIndex] <= values[i]){ - candidates[--currentLeaderIndex] = values[i]; + for (int i = values.length - 2; 0 <= i; i--) { // Search values[] for further + if (candidates[currentLeaderIndex] <= values[i]){ // leader elements and copy those + 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