\documentclass{bschlangaul-aufgabe}
\bLadePakete{java,tabelle}
\begin{document}
\bAufgabenMetadaten{
  Titel = {Aufgabe 3},
  Thematik = {Code-Inspection bei Binärer Suche},
  Referenz = 66116-2017-H.T1-TA2-A4,
  RelativerPfad = Examen/66116/2017/09/Thema-1/Teilaufgabe-2/Aufgabe-4.tex,
  ZitatSchluessel = sosy:ab:9,
  ZitatBeschreibung = {Aufgabe 3},
  BearbeitungsStand = mit Lösung,
  Korrektheit = unbekannt,
  Ueberprueft = {unbekannt},
  Stichwoerter = {Binäre Suche, Design by Contract, Kontrollflussgraph, Vollständige Anweisungsüberdeckung},
  EinzelpruefungsNr = 66116,
  Jahr = 2017,
  Monat = 09,
  ThemaNr = 1,
  TeilaufgabeNr = 2,
  AufgabeNr = 4,
}

Die\footcite[Aufgabe 3]{sosy:ab:9} folgende Seite enthält
Software-Quellcode, der einen Algorithmus zur binären Suche\index{Binäre
Suche} implementiert. Dieser ist durch Inspektion zu überprüfen. Im
Folgenden sind die Regeln der Inspektion angegeben.
\footcite[Thema 1 Teilaufgabe 2 Aufgabe 4]{examen:66116:2017:09}

\bigskip

\noindent
\begin{tabularx}{\linewidth}{|l|l|X|}
\hline
RM1 &
(Dokumentation) &
Jede Quellcode-Datei beginnt mit einem Kommentar, der den Klassennamen,
Versionsinformationen, Datum und Urheberrechtsangaben enthält.

\\\hline

RM2 &
(Dokumentation) &
Jede Methode wird kommentiert. Der Kommentar enthält eine vollständige
Beschreibung der Signatur so wie eine
Design-by-Contract-Spezifikation\index{Design by Contract}.

\\\hline

RM3 &
(Dokumentation) &
Deklarationen von Variablen werden kommentiert.
\\\hline

RM4 &
(Dokumentation) &
Jede Kontrollstruktur wird kommentiert.
\\\hline

RM5 &
(Formatierung) &
Zwischen einem Schlüsselwort und einer Klammer steht
ein Leerzeichen.
\\\hline

RM6 &
(Formatierung) &
Zwischen binären Operatoren und den Operanden stehen
Leerzeichen.
\\\hline

RM7 &
(Programmierung) &
Variablen werden in der Anweisung initialisiert, in der sie
auch deklariert werden.
\\\hline

RM8 &
(Bezeichner) &
Klassennamen werden groß geschrieben, Variablennamen klein.
\\\hline
\end{tabularx}

%-----------------------------------------------------------------------
%
%-----------------------------------------------------------------------

\bigskip

% Datei kann nicht in das Java-Repository eingebundne werden, weil
% javadoc dann sehr viele Dokumentationsfehler meldet

% \bJavaExamen{66116}{2017}{09}{BinarySearch}

\begin{bJavaAngabe}
/**
 * BinarySearch.java
 *
 * Eine Implementierung der ”Binaere Suche”
 * mit einem iterativen Algorithmus
 */
class BinarySearch {

  /**
   * BinaereSuche
   * a: Eingabefeld
   * item: zusuchendesElement
   * returnValue: der Index des zu suchenden Elements oder -1
   *
   * Vorbedingung:
   * a.length > 0
   * a ist ein linear geordnetes Feld:
   * For all k: (1 <= k < a.length) ==> (a[k−1] <=a [k])
   *
   * Nachbedingung:
   * Wenn item in a, dann gibt es ein k mit a[k] == item und returnValue == k
   * Genau dann wenn returnValue == −1 gibt es kein k mit 0 <= k < a.length
   * und a[k]==item.
   */
  public static int binarySearch(float a[], float item) {

    int End;  // exklusiver Index fuer das Ende des
              // zudurchsuchenden Teils des Arrays
    int start = 1; // inklusiver Index fuer den Anfang der Suche
    End = a.length;

    // Die Schleife wird verlassen, wenn keine der beiden Haelften das
    // Element enthaelt.
    while(start < End) {

      // Teilung des Arrays in zwei Haelften
      // untere Haelfte: [0,mid[
      // obere Haelfte: ]mid,End[
      int mid = (start + End) / 2;

      if (item > a[mid]) {
        // Ausschluss der oberen Haelfte
        start = mid + 1;
      } else if(item < a[mid]) {
        // Ausschluss der unteren Haelfte
        End = mid-1;
      } else {
        // Das gesuchte Element wird zurueckgegeben
        return (mid);
      }
    } // end of while

    // Bei Misserfolg der Suche wird −1 zurueckgegeben
    return (-1);
  }
}
\end{bJavaAngabe}

\begin{enumerate}

%%
%
%%

\item Überprüfen Sie durch Inspektion, ob die obigen Regeln für den
Quellcode eingehalten wurden. Erstellen Sie eine Liste mit allen
Verletzungen der Regeln. Geben Sie für jede Verletzung einer Regel die
Zeilennummer, Regelnummer und Kommentar an, \zB (07, RM4, while nicht
kommentiert). Schreiben Sie nicht in den Quellcode.

\begin{bAntwort}
\noindent
\begin{tabularx}{\linewidth}{|l|l|X|}
\hline
Zeile & Regel & Kommentar\\\hline\hline

3-8 & RM1 &
Fehlen von Versionsinformationen, Datum und Urheberrechtsangaben \\\hline

11-26 & RM2 &
Fehlen der Invariante in der Design-by-Contract-Spezifikation \\\hline

36,46 & RM5 & Fehlen des Leerzeichens vor der Klammer \\\hline

48 & RM6 &

Um einen binären (zweistellige) Operator handelt es sich im
Code-Beispiel um den Subtraktionsoperator: \bJavaCode{mid-1}. Hier
fehlen die geforderten Leerzeichen. \\\hline

32 & RM7 &

Die Variable \bJavaCode{End} wird in Zeile 32 deklariert, aber erst in
Zeile initialisiert \bJavaCode{End = a.length;} \\\hline

32 & RM8 &
Die Variable \bJavaCode{End} muss klein geschrieben werden. \\\hline
\end{tabularx}

\end{bAntwort}

%%
%
%%

\item Entspricht die Methode \bJavaCode{binarySearch} ihrer Spezifikation,
die durch Vor-und Nachbedingungen angeben ist? Geben Sie gegebenenfalls
Korrekturen der Methode an.

\begin{bAntwort}
\bPseudoUeberschrift{Korrektur der Vorbedingung}

Die Vorbedingung ist nicht erfüllt, da weder die Länge des Feldes
\bJavaCode{a} noch die Reihenfolge der Feldeinträge geprüft wurden.

\begin{bJavaAngabe}
if (a.length <= 0) {
  return -1;
}

for (int i = 0; i < a.length; i ++) {
  if ( a[i] > a[i + 1]) {
    return -1;
  }
}
\end{bJavaAngabe}

\bPseudoUeberschrift{Korrektur der Nachbedingung}

\bJavaCode{int start} muss mit \bJavaCode{0} initialisiert werden, da sonst
\bJavaCode{a[0]} vernachlässigt wird.
\end{bAntwort}

%%
%
%%

\item Beschreiben alle Kommentare ab Zeile 24 die Semantik des Codes
korrekt? Geben Sie zu jedem falschen Kommentar einen korrigierten
Kommentar mit Zeilennummer an.

\begin{bAntwort}
\begin{tabularx}{\linewidth}{lXX}
Zeile & Kommentar im Code & Korrektur \\

34-35 &
\bJavaCode{// Die Schleife wird verlassen, wenn keine der beiden Haelften das
Element enthaelt.} &
\bJavaCode{// Die Schleife wird verlassen, wenn keine der beiden Haelften das
Element enthaelt oder das Element gefunden wurde.} \\

44 &
\bJavaCode{// Ausschluss der oberen Haelfte} &
\bJavaCode{// Ausschluss der unteren Haelfte} \\

47 &
\bJavaCode{// Ausschluss der unteren Haelfte} &
\bJavaCode{// Ausschluss der oberen Haelfte} \\

50 &
\bJavaCode{// Das gesuchte Element wird zurueckgegeben} &
\bJavaCode{// Der Index des gesuchten Elements wird zurueckgegeben} \\

\end{tabularx}
\end{bAntwort}

%%
%
%%

\item Geben Sie den Kontrollflussgraphen\index{Kontrollflussgraph} für
die Methode \bJavaCode{binarySearch} an.

%%
%
%%

\item Geben Sie maximal drei Testfälle für die Methode
\bJavaCode{binarySearch} an, die insgesamt eine vollständige
Anweisungsüberdeckung\index{Vollständige Anweisungsüberdeckung} leisten.

\begin{bAntwort}
Die gegebene Methode: \bJavaCode{binarySearch(a[], item)}

\bPseudoUeberschrift{Testfall}

\begin{enumerate}
\item Testfall: \bJavaCode{a[] = {1, 2, 3}, item = 4}
\item Testfall: \bJavaCode{a[] = {1, 2, 3}, item = 2}
\end{enumerate}
\end{bAntwort}
\end{enumerate}
\end{document}
