Skip to content
Snippets Groups Projects
exam.xml 10.2 KiB
Newer Older
Goik Martin's avatar
Goik Martin committed
<?xml version="1.0" encoding="UTF-8"?>
<section version="5.0" xml:id="sd1_exam_2023_summer" xml:lang="en"
         xmlns="http://docbook.org/ns/docbook"
         xmlns:xlink="http://www.w3.org/1999/xlink"
         xmlns:xila="http://www.w3.org/2001/XInclude/local-attributes"
         xmlns:xi="http://www.w3.org/2001/XInclude"
         xmlns:trans="http://docbook.org/ns/transclusion"
         xmlns:svg="http://www.w3.org/2000/svg"
         xmlns:m="http://www.w3.org/1998/Math/MathML"
         xmlns:html="http://www.w3.org/1999/xhtml"
         xmlns:db="http://docbook.org/ns/docbook">
  <title>SD1 examination summer 2023</title>

  <section xml:id="sd1_exam_2023_summer_task1">
    <title>Implementing tasks</title>

    <section xml:id="sd1_exam_2023_summer_task1_preparation">
      <title>Preparation</title>

      <orderedlist>
        <listitem>
          <para>Download and unzip the above file
          <filename>exam.zip</filename>. You should see a directory
          »<filename>Exam</filename>« containing a
          <filename>pom.xml</filename> file.</para>
        </listitem>

        <listitem>
          <para>Open this project in your <productname>IDEA</productname> IDE
          by selecting the <filename>Exam/pom.xml</filename> file.</para>
        </listitem>
      </orderedlist>
    </section>

    <section xml:id="sd1_exam_2023_summer_task1_task">
      <title>Task</title>

      <qandaset defaultlabel="qanda" xml:id="sd1_exam_2023_summer_task1Qanda">
        <qandadiv>
          <qandaentry>
            <question>
              <para>Open the <filename>Readme.md</filename> file in your
              project's root. It contains all necessary instructions for
              solving the implementation tasks.</para>
            </question>

            <answer>
              <para>Solution see <link
              xlink:href="https://gitlab.mi.hdm-stuttgart.de/goik/GoikLectures/-/tree/master/Klausuren/Sd1/2023summer/Solve">summer
              2023 exam</link>.</para>
            </answer>
          </qandaentry>
        </qandadiv>
      </qandaset>
    </section>

    <section xml:id="sd1_exam_2023_summer_task1Caveats">
      <title>Caveats</title>

      <itemizedlist>
        <listitem>
          <para>When approaching end of examination check your input for
          completeness prior to being automatically logged out by the system.
          Remember: There is 120 minutes for the examination and another 5
          minutes to check for completeness.</para>
        </listitem>

        <listitem>
          <para>Projects residing just on your local workstation's file system
          cannot be recovered after finishing the exam.</para>
        </listitem>
      </itemizedlist>
    </section>
  </section>

  <section xml:id="sd1_exam_2023_summer_task2">
    <title>switch versus if ... else if ... else</title>

    <qandaset defaultlabel="qanda" xml:id="sd1_exam_2023_summer_task3Qanda">
      <qandadiv>
        <qandaentry>
          <question>
            <para>Consider a method
            <methodname>computeItemCount()</methodname> of following
            signature:</para>

            <programlisting language="none">static int computeItemCount() {...}</programlisting>

            <para>This method will be called by two different implementations
            of another method <methodname>getScore()</methodname>:</para>

            <informaltable border="1">
              <tr>
                <th>Implementation by <code>switch</code></th>

                <th>Implementation by <code>if ... else if ...
                else</code></th>
              </tr>

              <tr>
                <td valign="top"><programlisting language="java">public static int getScore() {

   switch (computeItemCount()){
      case 1: return 20;
      case 3: return 50;
      default: return 0;
   }
}</programlisting></td>

                <td valign="top"><programlisting language="java">public static int getScore() {

   if (1 == computeItemCount()) {
      return 20;
   } else if (3 == computeItemCount()) {
      return 50;
   } else {
      return 0;
   }
}</programlisting></td>
              </tr>
            </informaltable>

            <para>An experienced programmer claims these two implementations
            possibly return different results when executing
            <methodname>getScore()</methodname>. Is she right? <emphasis
            role="red">Explain</emphasis> your answer.</para>

            <tip>
              <para>Consider possible side effects of calling
              <methodname>computeItemCount()</methodname> and provide an
              example.</para>
            </tip>
          </question>

          <answer>
            <para>Consider:</para>

            <programlisting language="java">public class X {
   private static int itemCount = 2;

    static int computeItemCount() {return itemCount++;}
  ...
}</programlisting>

            <para>On a fresh start calling
            <methodname>computeItemCount()</methodname> for the first time
            will return the current value 2 of our variable <code
            language="java">itemCount</code>.</para>

            <para>The <code language="java">switch</code> implementation will
            match its default and thus return 0.</para>

            <para>On contrary the <code>if ... else if ... else</code>
            implementation will call
            <methodname>computeItemCount()</methodname> two times:</para>

            <orderedlist>
              <listitem>
                <para>The first if <code>(1 == computeItemCount())</code>
                fails since 1 != 2. This results in incrementing <code
                language="java">itemCount</code> by 1 to the new value
                3.</para>
              </listitem>

              <listitem>
                <para>Now the else if <code language="java">(3 ==
                computeItemCount())</code> clause succeeds. Thus
                <methodname>getScore()</methodname> returns 50.</para>
              </listitem>
            </orderedlist>

            <para>So the <code language="java">switch</code> statement
            implementing a jump table differs from <code>if ... else if</code>
            in definitely calling <code
            language="java">computeItemCount()</code> only once.</para>
          </answer>
        </qandaentry>
      </qandadiv>
    </qandaset>
  </section>

  <section xml:id="sd1_exam_2023_summer_task3">
    <title>Exception handling</title>

    <qandaset defaultlabel="qanda" xml:id="sd1_exam_2023_summer_task2Qanda">
      <qandadiv>
        <qandaentry>
          <question>
            <para>Consider the following snippet:</para>

            <programlisting language="java">Object o = ...;
int a = ...;
...
try {
    String  s = (String) o;           // May throw a <link
                xlink:href="https://freedocs.mi.hdm-stuttgart.de/doc/openjdk-17-doc/api/java.base/java/lang/ClassCastException.html">ClassCastException</link>
    int c = 4 / a;                    // May throw an <link
                xlink:href="https://freedocs.mi.hdm-stuttgart.de/doc/openjdk-17-doc/api/java.base/java/lang/ArithmeticException.html">ArithmeticException</link>
} catch (<link xlink:href="https://freedocs.mi.hdm-stuttgart.de/doc/openjdk-17-doc/api/java.base/java/lang/ClassCastException.html">ClassCastException</link> e) {
    System.err.println(e.getMessage());
} catch (<link xlink:href="https://freedocs.mi.hdm-stuttgart.de/doc/openjdk-17-doc/api/java.base/java/lang/ArithmeticException.html">ArithmeticException</link> e) {
    System.err.println(e.getMessage());
}</programlisting>

            <para>Facilitate the above code and <emphasis
            role="red">explain</emphasis> why your simpler implementation
            always and under all circumstances produces an identical runtime
            result.</para>

            <tip>
              <itemizedlist>
                <listitem>
                  <para>Both <code language="java">catch</code> clauses
                  contain the same text.</para>
                </listitem>

                <listitem>
                  <para>Search the inheritance hierarchy for a common ancestor
                  class and consider the <methodname>getMessage()</methodname>
                  method. Where is it actually being defined?</para>
                </listitem>
              </itemizedlist>
            </tip>
          </question>

          <answer>
            <para>Both <link
            xlink:href="https://freedocs.mi.hdm-stuttgart.de/doc/openjdk-17-doc/api/java.base/java/lang/ClassCastException.html">ClassCastException</link>
            and <link
            xlink:href="https://freedocs.mi.hdm-stuttgart.de/doc/openjdk-17-doc/api/java.base/java/lang/ArithmeticException.html">ArithmeticException</link>
            are being derived from their common parent <link
            xlink:href="https://freedocs.mi.hdm-stuttgart.de/doc/openjdk-17-doc/api/java.base/java/lang/RuntimeException.html">RuntimeException</link>.
            All three classes share the common <link
            xlink:href="https://freedocs.mi.hdm-stuttgart.de/doc/openjdk-17-doc/api/java.base/java/lang/Throwable.html">Throwable</link>#<link
            xlink:href="https://freedocs.mi.hdm-stuttgart.de/doc/openjdk-17-doc/api/java.base/java/lang/Throwable.html#getMessage()">getMessage()</link>
            method by inheritance without redefining it.</para>

            <para>Our two <code>catch</code> clauses may thus be combined into
            one:</para>

            <programlisting language="java">...
try {
    String  s = (String) o;         // May throw a <link
                xlink:href="https://freedocs.mi.hdm-stuttgart.de/doc/openjdk-17-doc/api/java.base/java/lang/ClassCastException.html">ClassCastException</link>
    int c = 4 / a;                  // May throw an <link
                xlink:href="https://freedocs.mi.hdm-stuttgart.de/doc/openjdk-17-doc/api/java.base/java/lang/ArithmeticException.html">ArithmeticException</link>
} catch (<link xlink:href="https://freedocs.mi.hdm-stuttgart.de/doc/openjdk-17-doc/api/java.base/java/lang/RuntimeException.html">RuntimeException</link> e) {      // Common parent class
    System.err.println(e.getMessage());
}</programlisting>
          </answer>
        </qandaentry>
      </qandadiv>
    </qandaset>
  </section>
</section>