<?xml version="1.0" encoding="UTF-8"?>
<book version="5.0" xml:id="klausur_SoSe_2017" xml:lang="de"
      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">
  <!-- saxon9he-xslt -s:klausur.xml -xsl:/usr/share/hdm-docbook-xsl/CustomLayer/Klausur/docbook2klausur.xsl -->

  <info>
    <title/>

    <author>
      <personname/>
    </author>

    <pubdate/>
  </info>

  <chapter xml:id="task1">
    <title>Klassenmethoden</title>

    <!-- Hier gemeinsames zip Archiv hochladen, auch von anderen Aufgaben. -->

    <section xml:id="aufgabe1_prepare">
      <title>Vorbereitung</title>

      <para>Entpacken Sie das oben sichtbare Archiv
      <filename>exam.zip</filename> und importieren Sie den resultierenden
      Ordner <filename>Exam</filename> als <productname>Maven</productname>
      Projekt in Ihren <productname>Eclipse</productname> <foreignphrase
      xml:lang="en">Workspace</foreignphrase>.</para>
    </section>

    <section xml:id="aufgabe1_descr">
      <title>Beschreibung</title>

      <para>Implementierung vorbereiteter Methoden gemäß
      <productname>Javadoc</productname> Beschreibungen und nachfolgend
      beschriebener Funktionalitäten. Sie bekommen bei unvollständiger
      Implementierung Teilpunkte.</para>
    </section>

    <section xml:id="aufgabe1_task">
      <title>Aufgabe</title>

      <para>Vervollständigen Sie die Implementierung aller Methoden aus
      folgenden Klassen im <foreignphrase
      xml:lang="en">package</foreignphrase>
      <package>de.hdm_stuttgart.mi.sd1.aufgabe1</package>:</para>

      <itemizedlist>
        <listitem>
          <para><classname>BodenlegerKosten</classname></para>

          <programlisting language="java">System.out.println("Die Kosten für einen Raum der Länge 5m bei " +
  " 3m Breite, 17€ pro Quadratmeter Laminat, 2€ pro Meter Sockelleiste "
  + " und 37 Km Anfahrt betragen " +
  new BodenlegerKosten(3, 5).
    getGesamtKosten(17, 2, 37) + "€");</programlisting>

          <para>Ergebnis:</para>

          <screen>Die Kosten für einen Raum der Länge 5m bei  3m Breite, 17€ pro Quadratmeter
Laminat, 2€ pro Meter Sockelleiste  und 37 Km Anfahrt betragen 298.1€</screen>
        </listitem>

        <listitem>
          <para><classname>Helper</classname></para>

          <programlisting language="java">System.out.println("Die Quersumme von " + 33215 + " ist " +
    Helper.quersumme(33215));</programlisting>

          <para>Ergebnis:</para>

          <screen>Die Quersumme von 33215 ist 14</screen>
        </listitem>
      </itemizedlist>

      <tip>
        <para>Das <foreignphrase xml:lang="en">package</foreignphrase>
        <package>de.hdm_stuttgart.mi.sd1.test.aufgabe1</package> im Test Zweig
        Ihres Projekts enthält zugehörige <productname>Junit</productname>
        Testklassen:</para>

        <itemizedlist>
          <listitem>
            <para><classname>TestBodenlegerKosten</classname></para>
          </listitem>

          <listitem>
            <para><classname>TestHelper</classname></para>
          </listitem>
        </itemizedlist>
      </tip>
    </section>

    <section xml:id="aufgabe1_commonHints">
      <title>Allgemeine Hinweise</title>

      <itemizedlist>
        <listitem>
          <para>Für jede Methode stehen Ihnen in der zugehörigen Testklasse
          korrespondierende Tests zur Verfügung. Nutzen Sie diese!</para>
        </listitem>

        <listitem>
          <para>Die von Ihnen erreichte Punktzahl richtet sich nach der Anzahl
          positiv bestandener Tests. Sie bekommen keine Punkte, wenn Ihre
          Implementierung in Bezug auf einen einzelnen Test lediglich
          <quote>fast richtig</quote> ist. Implementieren Sie im Zweifelsfall
          weniger Methoden, diese dafür aber vollständig.</para>
        </listitem>

        <listitem>
          <para>Die <productname>Javadoc</productname> Kommentare der
          jeweiligen Methoden beschreiben das gewünschte Verhalten. Unter
          <link
          xlink:href="https://freedocs.mi.hdm-stuttgart.de/sd1SectMavenGenerateJavadoc.html">Generating
          Javadoc™ project documentation</link> finden Sie eine Anleitung zur
          Umwandlung in das HTML Format zwecks besserer Lesbarkeit.</para>

          <para>Lesen Sie die (generierte) Dokumentation <emphasis
          role="bold">sehr genau</emphasis>.</para>
        </listitem>

        <listitem>
          <para>Beachten Sie alle Sonderfälle. Dazu zählen insbesondere
          <code>null</code> Werte von Variablen oder enthaltene
          <code>null</code> Werte in <foreignphrase
          xml:lang="en">Arrays</foreignphrase>.</para>
        </listitem>

        <listitem>
          <para>Nutzen Sie den <foreignphrase
          xml:lang="en">Debugger</foreignphrase> oder logging <foreignphrase
          xml:lang="en">Statements</foreignphrase> im Fall fehlgeschlagener
          Testfälle.</para>
        </listitem>

        <listitem>
          <para>Die Ausführung von
          <package>de.hdm_stuttgart.mi.sd1.test</package>.<classname>ShowAllReachedPoints</classname>
          im Testzweig Ihres Projekts als <productname>Java</productname>
          Anwendung (nicht als Junit Test!) zeigt Ihnen zu jedem Zeitpunkt die
          in allen Programmieraufgaben bislang erreichten Punkte.</para>
        </listitem>
      </itemizedlist>
    </section>

    <section version="5.1" xml:id="uploadFirst" xml:lang="de">
      <title>Hochladen Ihrer Lösung in das Klausursystem</title>

      <para>Exportieren Sie Ihre Implementierung dieser und weiterer
      Programmieraufgaben per Rechtsklick im <foreignphrase
      xml:lang="en">Package Explorer</foreignphrase> Ihres
      <productname>Eclipse</productname> Projekts. Klicken Sie im
      <foreignphrase xml:lang="en">Package Explorer</foreignphrase> (Maus
      Rechtsklick) auf Ihre Projektwurzel und exportieren Sie über das
      Kontextmenü <quote>Export</quote> → <quote>General</quote> →
      <quote>Archive File</quote> einen auf <filename>.zip</filename> endenden
      Archivnamen, z.B. <filename>solution_1.zip</filename>. Laden Sie danach
      <filename>solution_1.zip</filename> über die <quote><foreignphrase
      xml:lang="en">Upload</foreignphrase> File</quote> Funktion am unteren
      Seitenende des <productname>Ilias</productname> Klausursystems hoch.
      Wichtige Punkte:</para>

      <itemizedlist>
        <listitem>
          <para>Achten Sie auf vollständigen Export. Im Exportmenü können Sie
          (versehentlich) einzelne Ordner, wie z.B. <filename>src</filename>,
          abwählen. In diesem Fall wird Ihr Quellcode nicht in das Archiv
          <filename>solution_1.zip</filename> exportiert.</para>
        </listitem>

        <listitem>
          <para>Wählen Sie beim Hochladen nicht die falsche Datei, etwa das
          Ausgangsarchiv <filename>exam.zip</filename> oder eine ältere
          Version Ihres Projekts.</para>
        </listitem>

        <listitem>
          <para>Kontrollieren Sie nach dem Hochladen die Sichtbarkeit Ihres
          <filename>solution_1.zip</filename> Archivs im Klausursystem.</para>
        </listitem>

        <listitem>
          <para>Sie können mehrere Versionen
          <filename>solution_2.zip</filename> ... hochladen und bei Bedarf
          ältere im <productname>Ilias</productname> System löschen. Nur die
          zuletzt hochgeladene Version wird bewertet.</para>
        </listitem>
      </itemizedlist>

      <caution>
        <itemizedlist>
          <listitem>
            <para>Reservieren Sie für den Vorgang des Hochladens ausreichend
            Zeit vor Klausurende.</para>
          </listitem>

          <listitem>
            <para>Bearbeitungen, welche sich nach Klausurende lediglich auf
            Ihrem Arbeitsplatzrechner befinden, werden nicht gewertet.</para>
          </listitem>

          <listitem>
            <para>Laden Sie keine Projekte mit <productname>Java</productname>
            Syntaxfehlern hoch, diese werden nicht bewertet!</para>
          </listitem>

          <listitem>
            <para>Exportieren Sie Ihr Projekt nicht als
            <filename>.tgz</filename>, <filename>.java</filename>,
            <filename>.tar.gz</filename> <acronym>o.ä.</acronym>. Das
            Klausursystem akzeptiert nur Archive mit der Endung
            <filename>.zip</filename>.</para>
          </listitem>
        </itemizedlist>
      </caution>
    </section>
  </chapter>

  <chapter xml:id="task2">
    <title>Kreise</title>

    <section xml:id="aufgabe2_prepare">
      <title>Vorbereitung</title>

      <para>Falls Sie die erste Aufgabe »<xref linkend="task1"/>« bearbeitet
      haben, arbeiten Sie einfach an Ihrem <productname>Maven</productname>
      Projekt weiter. Ansonsten lesen Sie bitte die Anleitung in der Aufgabe
      »<xref linkend="task1"/>« zum <productname>Eclipse</productname>
      <productname>Maven</productname> Projektimport sowie weitere Hinweise
      zum Hochladen in das <productname>Ilias</productname> System.</para>
    </section>

    <section xml:id="aufgabe2_descr">
      <title>Beschreibung</title>

      <para>Implementierung einer Methode zur Prüfung, ob ein gegebener Kreis
      einen anderen Kreis enthält.</para>

      <para>Das <productname>Maven</productname> Projektskelett enthält eine
      Klasse <classname>Kreis</classname> im <foreignphrase
      xml:lang="en">Package</foreignphrase>
      <package>de.hdm_stuttgart.mi.sd1.aufgabe2</package>.</para>

      <para>Implementieren Sie die Klasse und insbesondere den Konstruktor
      sowie die Methode <methodname>enthaelt(...)</methodname>. Nutzen Sie zum
      Test Ihrer Implementierung die <productname>Junit</productname> Tests in
      <package>de.hdm_stuttgart.mi.sd1.test.aufgabe2</package>.<classname>TestKreis</classname>.</para>

      <tip>
        <orderedlist>
          <listitem>
            <para>Zur Berechnung des Abstandes zwischen zwei Punktkoordinaten
            können Sie die Methode <methodname
            xlink:href="https://docs.oracle.com/javase/9/docs/api/java/lang/Math.html#sqrt-double-">Math.sqrt()</methodname>
            oder besser <methodname
            xlink:href="https://docs.oracle.com/javase/9/docs/api/java/lang/Math.html#hypot-double-double-">Math.hypot()</methodname>
            verwenden.</para>
          </listitem>

          <listitem>
            <para>Unter <link
            xlink:href="https://learn.mi.hdm-stuttgart.de/ilias/data/iliasclient1/mobs/mm_14078/kreise.png">https://learn.mi.hdm-stuttgart.de/ilias/data/iliasclient1/mobs/mm_14078/kreise.png</link>
            finden Sie eine hilfreiche Illustration mit passenden
            Testkoordinaten und Radien.</para>
          </listitem>

          <listitem>
            <para>Beispiel:</para>

            <programlisting language="java">final Kreis kreis1 = new Kreis(0,0,4),
            kreis2 = new Kreis(0,0,3);

if (kreis1.enthaelt(kreis2)) {
  System.out.println("Zweiter Kreis ist im ersten Kreis enthalten.");
} else {
  System.out.println("Zweiter Kreis ist nicht im ersten Kreis enthalten.");
}</programlisting>

            <screen>Zweiter Kreis ist im ersten Kreis enthalten.</screen>
          </listitem>
        </orderedlist>
      </tip>
    </section>

    <section version="5.1" xml:id="uploadFollow" xml:lang="de">
      <title>Hochladen Ihrer Lösung in das Klausursystem</title>

      <para>Laden Sie die Lösung dieser Aufgabe als gemeinsamen Projekt Export
      mit der ersten Aufgabe <xref linkend="task1"/> gemäß den dortigen
      Hinweisen hoch. Falls Sie die Aufgabe »<xref linkend="task1"/>«
      ebenfalls bearbeitet haben, enthält Ihr <foreignphrase
      xml:lang="en">Upload</foreignphrase> die Lösungen zu beiden
      Aufgaben.</para>

      <para>Tragen Sie im Freitextfeld weiter unten genau einen der beiden
      Texte ein:</para>

      <itemizedlist>
        <listitem>
          <para>Ich habe die aktuelle Aufgabe bearbeitet und erhoffe dafür
          Punkte.</para>
        </listitem>

        <listitem>
          <para>Ich habe die aktuelle Aufgabe nicht bearbeitet.</para>
        </listitem>
      </itemizedlist>
    </section>
  </chapter>

  <chapter xml:id="task3">
    <title>Compile time Fehler</title>

    <para>Wir betrachten:</para>

    <programlisting language="java">public static int max (int a, int b, int c) {
  if (a &lt; b) {
    if (b &lt; c) {
      return c;
    } else {
      return b;
    }
  } else {
    if (a &lt; c) {
      return c;
    }
  }
}<emphasis role="red"> // Fehler: Missing Return Statement</emphasis></programlisting>

    <orderedlist>
      <listitem>
        <para>Was bedeutet der Compile time Fehler »Missing Return Statement«?
        Erklären Sie dessen Auftreten, obwohl doch sogar drei
        <code>return</code> Anweisungen vorhanden sind.</para>
      </listitem>

      <listitem>
        <para>Korrigieren Sie diesen Fehler durch eine minimale
        Ergänzung.</para>
      </listitem>
    </orderedlist>
  </chapter>
</book>