Skip to content

Commit

Permalink
Merge pull request #158 from FIUS/minor-changes-sheet2
Browse files Browse the repository at this point in the history
Minor reformatting and rephrasing changes on sheet 2
  • Loading branch information
Sara424242 authored Oct 2, 2023
2 parents ad03976 + 6b92646 commit 2606b61
Show file tree
Hide file tree
Showing 4 changed files with 67 additions and 62 deletions.
44 changes: 23 additions & 21 deletions sheets/2/exercise-2.tex
Original file line number Diff line number Diff line change
Expand Up @@ -2,48 +2,43 @@

\excercise{Exceptions}

Tank und Neo wollen nun in einer neuen Simulationsumgebung trainieren.
Tank und Neo wollen nun in einer neuen Simulationsumgebung trainieren.
Dabei soll Neo in einem potenziell gefährlichen Situation so schnell wie möglich zur nächsten Telefonstation laufen.

\begin{enumerate}
\item Instanziiere die Simulation wie bekannt (\lstinline{Sheet2Task2} und \lstinline{Sheet2Task2Verifier}) und mache dich mit dieser vertraut.
\item Als Operator hat Tank die Möglichkeit Hindernisse zwischen Neo und der Telefonstation einzufügen.
Betrachte die Klasse \lstinline{Sheet2Task2} mit der Operation \lstinline{run} an der markierten Stelle.

Überlege dir wie du an Tank's Stelle ein solches Hindernis an einer geeigneten Stelle platzieren kann und platziere es dort. Falls du nicht weißt wie man ein Hindernis platziert, schaue dir nochmal Blatt 1 Aufgabe 3 oder die Klasse \lstinline{Sheet2Task2} genauer an.
Überlege dir wie du an Tank's Stelle ein solches Hindernis an einer geeigneten Stelle platzieren kannst und platziere es dort.
Falls du nicht weißt wie man ein Hindernis platziert, schaue dir nochmal Blatt 1 Aufgabe 3 oder die Klasse \lstinline{Sheet2Task2} genauer an.

Was passiert, wenn man jetzt die Simulation wie zuvor ausführt?\\

\end{enumerate}
Was passiert, wenn man jetzt die Simulation wie zuvor ausführt?

\textbf{Antwort}: Es wird eine Excepion geworfen.\\
\begin{Infobox}[Exception]
Eine Exception ist ein Fehler der beim Ausführen des Programmes passieren kann wenn z.B. unvorhergesehene oder verbotene Sachen passieren.\\
\end{enumerate}

\begin{Infobox}[Exceptions]
Eine Exception ist ein Fehler der beim Ausführen des Programmes passieren kann wenn z.B. unvorhergesehene oder verbotene Sachen passieren.\newline

\textbf{Notiz}: Es gibt in PSE später genauere Unterscheidungen zwischen verschiedene Arten von Exceptions und Errors,... wir wollen das ganze hier mal vereinfacht betrachten. Dabei werden wir allerdings teilweise nicht hundertprozentig genau sein.\\
\textbf{Hinweis:} Es gibt in PSE später genauere Unterscheidungen zwischen verschiedene Arten von Exceptions und Errors, wir wollen das ganze hier mal vereinfacht betrachten.
Dabei werden wir allerdings teilweise nicht hundertprozentig genau sein.\newline

Als nächstes wollen wir den Aufbau einer Exception genauer verstehen.
Überlege dazu was der folgende Programmausschnitt macht:

\begin{lstlisting}[numbers=left,xleftmargin=2em,frame=single,framexleftmargin=1.5em]
public class Main{
public class Main {
//Programmeinstieg
public void main(){
public void main() {
//some other code
divide(1, 0);
}
public Integer divide(Integer a, Integer b){

public int divide(int a, int b) {
return a / b;
}
}
\end{lstlisting}
Exkurs: Operatoren sind in eine Programmiersprache eingebaute Funktion, die durch ein Zeichen repräsentiert werden.
Beispielsweise können wir zwei Zahlen durch den \texttt{-}-Operator voneinander abziehen, z.B. mit \texttt{42 - 73}.
Damit wir das Ergebnis auch ansehen können und die Rechnung nicht nur ausgewertet wird und dann verschwindet, kann man es entweder in einer Variable speichern (siehe Nachschlagwerk) oder etwa als Argument in einer Funktionen verwenden.
Wenn man beispielsweise das Ergebnis der Subtraktion oben auf der Konsole ausgeben möchte, kann man diese einfach als Parameter in die runden Klammern der Java-internen Funktion \lstinline{System.out.println()} geben.
Die meisten Programmiersprachen haben eingebaute, einfache arithmetische Operatoren wie \texttt{+}, \texttt{-}, \texttt{*} oder \texttt{/}.\\

Dabei lässt sich erkennen, dass in Zeile 9 der Programmausführung durch 0 geteilt wird.\\
Dieses ungewollte (''verbotene'') Verhalten wird bei der Programmausführung durch die folgende Exception ersichtlich:
Expand All @@ -52,7 +47,7 @@
java.lang.ArithmeticException: / by zero
at de.unistuttgart.informatik.fius.jvk.Main.divide(Main.java:9)
at de.unistuttgart.informatik.fius.jvk.Main.main(Main.java:5)
\end{lstlisting}
\end{lstlisting}

Der Inhalt der Fehlermeldung, lässt sich in folgende Teile aufteilen:

Expand All @@ -63,9 +58,17 @@
In unserem Fall ist die Nachricht \lstinline{"/ by zero"}.
\item Fehlerstelle im Programm: Der Stacktrace der Exception beinhaltet Informationen, wo im Programm die Exception geflogen also passiert ist. Genauer, welche Klassen wo Fehler geworfen haben und so den eigentlichen Fehler produziert haben.\\
Hier interessiert uns fürs Erste nur die zweite Zeile. In unserem Beispiel deutet die zweite Zeile darauf hin, dass die Exception expliziet in der \lstinline{Main} Klasse in der \lstinline{divide}
Operation in Zeile 9 geflogen ist, was wiederum Auswirkungen auf die Main Funktion hatte.
Operation in Zeile 9 geflogen ist, was wiederum Auswirkungen auf die Main Funktion hatte.
\end{enumerate}

\textit{Exkurs:} Operatoren sind in eine Programmiersprache eingebaute Funktion, die durch ein oder mehrere Zeichen repräsentiert werden.\newline

Beispielsweise können wir zwei Zahlen durch den \texttt{-}-Operator voneinander abziehen, z.B. mit \texttt{42 - 73}.
Damit wir das Ergebnis auch ansehen können und die Rechnung nicht nur ausgewertet wird und dann verschwindet, kann man es entweder in einer Variable speichern (siehe Nachschlagwerk) oder etwa als Argument in einer Funktionen verwenden.\newline

Wenn man beispielsweise das Ergebnis der Subtraktion oben auf der Konsole ausgeben möchte, kann man diese einfach als Parameter in die runden Klammern der Java-internen Funktion \lstinline{System.out.println()} geben.
Die meisten Programmiersprachen haben eingebaute arithmetische Operatoren wie \texttt{+}, \texttt{-}, \texttt{*} oder \texttt{/}.

\end{Infobox}


Expand Down Expand Up @@ -108,4 +111,3 @@
Du kannst Neo aber auch um die Wand herum gehen lassen.
\item \optional Welche \q{linenumber} aus dem obigen Stacktrace ändert sich, wenn man zwischen den \lstinline{neo.move()} Aufrufen jeweils Leerzeilen einfügt?
\end{enumerate}

54 changes: 28 additions & 26 deletions sheets/2/exercise-3.tex
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@

\excercise{Vor- und Nachbedingungen}

In dieser Aufgabe wollen wir eine neue Funktion von Neo einführen.
Neo kann Goldmünzen mit den Kommandos \lstinline{collectCoin()} und \lstinline{dropCoin()} aufheben und niederlegen.
In dieser Aufgabe wollen wir eine neue Funktion von Neo einführen.
Neo kann Goldmünzen mit den Kommandos \lstinline{collectCoin()} und \lstinline{dropCoin()} aufheben und niederlegen.

\begin{enumerate}
\item Instanziiere die Simulation wie bekannt (\lstinline{Sheet2Task3} und \lstinline{Sheet2Task3Verifier}) und mache dich mit dieser vertraut.
Expand All @@ -17,34 +17,41 @@


\begin{Infobox}[Vor- und Nachbedingungen]
Damit Operationen richtig funktionieren, müssen oft bestimme Bedingungen gelten, bevor man diese aufruft.\\
Z.B. darf sich bei dem \lstinline{move()} Kommando, wie wir in der letzten Aufgabe gelernt haben, vor dem Spieler keine Wand befinden.\\
Da diese Bedingungen gelten müssen bevor man die Operation aufruft, nennt man sie Vorbedingungen.\\
Meistens findet man diese Vorbedingungen im Javadoc Kommentar (Dokumentation) der Operation. Welchen man sehen kann wenn man mit der Maus, wie in Blatt 1 Aufgabe 2 beschrieben, über dem Funktionsnamen hovert.\\
Damit Operationen richtig funktionieren, müssen oft bestimme Bedingungen gelten, bevor man diese aufruft.
Zum Beispiel darf sich bei dem \lstinline{move()} Kommando, wie wir in der letzten Aufgabe gesehen haben, vor dem Spieler keine Wand befinden.\newline

So wie bei Vorbedingungen bestimmte Zustände gelten müssen bevor man die Operation aufrufen darf, sind Nachbedingungen Zustände die nach einer Operation gelten.\\
Nach dem Ausführen von \lstinline{move()} hat sich Neo eine Position nach vorne (in seine Blickrichtung) bewegt.\\
Das gilt allerdings, nur wenn vor dem Aufruf von \lstinline{move()} die Vorbedingungen erfüllt sind z.B. es darf sich keine Wand vor Neo befinden.\\
Da diese Bedingungen gelten müssen bevor man die Operation aufruft, nennt man sie \textit{Vorbedingungen}.
Meistens findet man diese Vorbedingungen im Javadoc Kommentar (Dokumentation) der Operation.
Diese kann man einsehen, wenn man mit der Maus - wie im Nachschlagwerk beschrieben - über dem Funktionsnamen hovert.
Auch gelangst du mit \fbox{Strg} + Linke Maustaste zur Definition einer Methode, Klasse oder Variable, um dir die entsprechende JavaDoc oder den Code dort genauer anzusehen.\newline

So wie bei Vorbedingungen bestimmte Zustände gelten müssen bevor man die Operation aufrufen darf, sind Nachbedingungen Zustände die nach einer Operation gelten.
Nach dem Ausführen von \lstinline{move()} hat sich Neo beispielsweise eine Position nach vorne (in seine Blickrichtung) bewegt, was also die Nachbedingung dieser Operation ist.
Diese gilt allerdings, nur wenn vor dem Aufruf von \lstinline{move()} die Vorbedingungen erfüllt sind, also unter anderen, dass sich keine Wand vor Neo befindet.


\end{Infobox}
\begin{Infobox}[Javadoc]
Im Zusammenhang mit Vor- und Nachbedingungen, ist wichtig zu erwähnen, dass diese neben einer detaillierteren Beschreibung der Funktion im Javadoc einer Operation zu finden sein sollten.
Dieser befindet sich als spezieller Kommentar in Quellcode vor einer Operation oder Klasse.
Wie andere Kommentare wird er nicht als Programmcode ausgeführt, sondern dienen zur Dokumentation der zugeordneten Elemente.
Im Zusammenhang mit Vor- und Nachbedingungen, ist wichtig zu erwähnen, dass diese neben einer detaillierteren Beschreibung der Funktion im Javadoc einer Operation zu finden sein sollten.\newline

Javadoc-Kommentare sind spezielle Kommentare in Quellcode vor einer Operation, einer Klassenvariable oder Klasse.
Wie andere Kommentare werden sie nicht als Programmcode ausgeführt, sondern dienen zur Dokumentation der zugeordneten Elemente.\newline

In den letzten Aufgaben haben wir bis jetzt immer recht \enquote{einfache} Methoden verwendet, deren Zweck Du vielleicht ganz gut aus dem Quellcode oder Beispielen ableiten konntest.
Beim schreiben von eigenen Methoden ist es daher sehr wichtig darauf zu achten, dass der Name der Funktion und die Werte, die diese "empfangen" kann, für sich sprechende Namen zu geben.
Beim schreiben von eigenen Methoden ist es daher sehr wichtig darauf zu achten, dass der Name der Funktion und die Werte, die diese "empfangen" kann, für sich sprechende Namen zu geben.\newline

Vielleicht sind dir die Funktion von machen Methoden allerdings auch noch nicht ganz klar geworden oder der Name hat zu wenig Kontext hergegeben, um die Funktion der Methode
zu verstehen.
Genau hier setzt die Dokumentation in Form von JavaDoc ein.
Genau hier setzt die Dokumentation in Form von JavaDoc ein.\newpage

Hier ein Beispiel, wie ein Javadoc-Kommentar aussehen kann:

\begin{lstlisting}[numbers=none]
/**
* Turn Neo around.
*
* This operation turns Neo around by calling
* turnClockWise twice. This operation will fail
* turnClockWise twice. This operation will fail
* if Neo is not on a Playfield of a Simulation.
*
*/
Expand All @@ -54,19 +61,14 @@
}
\end{lstlisting}

Ein Javadoc Kommentar unterscheidet sich nur dahingehend von einem normalen Kommentar, dass dieser mit \lstinline{/**} statt \lstinline{/*} anfängt.\\

Der erste Satz ist eine kurze Beschreibung was die Operation macht.
Gefolgt davon kommt eine ausführliche Beschreibung der Operation oder Klasse.\\

Der Kommentar sollte alles enthalten, was man jemals über die Operation wissen muss.
Ein Javadoc Kommentar unterscheidet sich nur dahingehend von einem normalen Kommentar, dass dieser mit \lstinline{/**} statt von \lstinline{/*} beginnt.\newline

In dem Javadoc Kommentar soll dabei insbesondere wir vorhin schon erwähnt Vorbedingungen beschrieben werden, also was der Programmierer beachten muss bevor er die Operation nutzen darf.
Wenn dies nicht passiert oder das Javadoc ungenau ist, ist es sehr wahrscheinlich das daraus ein Bug entstehen kann.
Der erste Satz ist eine kurze Beschreibung was die Operation macht.
Gefolgt davon kommt eine ausführliche Beschreibung der Operation oder Klasse.
Der Kommentar sollte alles enthalten, was man jemals über die Operation wissen muss.\newline

Eclipse kann diese speziellen JavaDoc-Kommentare erkennen und anzeigt, wenn man mit der Maus im Quelltext über einen Aufruf einer Operation fährt.
Außerdem kann man im Quellcode durch Ctrl + Linksklick auf Operationen oder Klassen zu den Definitionen von diesen gelangen, wo man auch die zugehörige JavaDoc finden sollte.
Letzteres kann man natürlich auch nutzen, um die Funktion einer Operation durch das Lesen des Quellcodes besser zu verstehen.
In dem Javadoc Kommentar soll dabei insbesondere wir vorhin schon erwähnt \textit{Vorbedingungen} beschrieben werden, also was der Programmierer beachten muss bevor er die Operation nutzen darf.
Wenn dies nicht passiert oder das Javadoc ungenau ist, ist es sehr wahrscheinlich das daraus ein Bug entstehen kann, weil die Nutzer vielleicht nicht angegebene Vorbedingungen der Methode nicht erfüllen.

\end{Infobox}

Expand Down
27 changes: 14 additions & 13 deletions sheets/2/exercise-4.tex
Original file line number Diff line number Diff line change
Expand Up @@ -4,29 +4,30 @@

In dieser Aufgabe wollen wir uns Conditions näher anschauen.

\begin{enumerate}
\begin{enumerate}
\item Instanziiere die Simulation wie bekannt (\lstinline{Sheet2Task4} und \lstinline{Sheet2Task4Verifier}) und mache dich mit dieser vertraut.
Was passiert bei der Ausführung?
\end{enumerate}

\begin{Infobox}[Bool'sche Werte]
Um if-Verzweigung verstehen zu können, müssen wir uns zuerst Bool'sche Werte anschauen. Bool'sche Werte sind Variablen oder auch Rückgabewerte von Funktionen, welche nur den Wert \lstinline{true} oder \lstinline{false} (also wahr oder falsch) annehmen können. \\
Um if-Verzweigung verstehen zu können, müssen wir uns zuerst bool'sche Werte anschauen. Bool'sche Werte sind Variablen oder auch Rückgabewerte von Funktionen, welche nur den Wert \lstinline{true} oder \lstinline{false} (also wahr oder falsch) annehmen können.\newline

Im Quellcode hat jeder Wert, ob Rückgabe einer Funktion oder eben Variablen, einen Typ.
Dieser Typ bestimmt, welche Werte für diesen Wert zulässig sind.
Beispielsweise gibt es einfachen - primitive - Werte wie zum Beispiel Ganzzahlen oder Zeichenketten, die wir bisher sogar schon verwendet haben.
Eine Zeichenkette (in Programmiersprachen in der Regel als \lstinline{String} bezeichnet) kann beispielsweise den Inhalt \lstinline{''Hello World''} haben.
Diesen Wert allerdings in einer Variable, die nur Ganzzahlen speichert (= \lstinline{int} für Integer) zuweisen, macht allerdings weniger Sinn.
Eine Zeichenkette (in Programmiersprachen in der Regel als \texttt{String} bezeichnet) kann beispielsweise den Inhalt \lstinline{"Hello World"} haben.
Diesen Wert allerdings in einer Variable, die nur Ganzzahlen speichert (= \lstinline{int} für Integer) zuweisen, macht allerdings weniger Sinn.\newline

Genau wie \lstinline{int} gibt es noch ein paar andere primitive Typen, welche häufig verwendet werden.
Am häufigsten kommen dabei wohl bool'sche Werte mit dem zugehörige primitive Typ \lstinline{boolean} zur Verwendung.
Da es sich um einen primitiven Typ handelt, wird er genau wie \lstinline{int} in klein geschrieben.\\
Da es sich um einen primitiven Typ handelt, wird er genau wie \lstinline{int} in klein geschrieben.\newline

Es ist wichtig zu erwähnen, dass in Java \lstinline{int} und \lstinline{Integer} dieselben Werte speichern können, aber nicht derselbe Typ sind.
Den genauen Unterschied zwischen den beiden Typen werdet ihr noch in der PSE kennenlernen.
Den genauen Unterschied zwischen den beiden Typen werdet ihr noch in der PSE (\enquote{Programmierung und Softwareentwicklung}) kennenlernen.\newline

Die Funktion \lstinline{player.canMove()} zum Beispiel gibt den bool'schen Wert \lstinline{true} zurück wenn der Player (z.B. Neo) eine Schritt in seine Blickrichtung gehen kann, also auf diesem Feld sind keine Hindernisse.
Die \lstinline{canMove}-Methode hat also den Rückgabewert \lstinline{boolean}.

\end{Infobox}

\begin{Infobox}[IF-Verzweigung]
Expand All @@ -35,7 +36,7 @@
\begin{lstlisting}[breaklines=true, numbers=none]
if (player.canMove()) {
player.move();
}
}
\end{lstlisting}

Das beispielhafte IF-Statement bedeutet informal, dass falls player.canMove() den bool'schen Wert \lstinline{true} hat, wird player.move() ausgeführt. Falls player.canMove() den bool'schen Wert \lstinline{false} hat wird der Code in den geschweiften Klammern übersprungen.
Expand All @@ -48,7 +49,7 @@
}
\end{lstlisting}

Nun wurde noch ein ELSE-Statement angehängt. Dadurch dient der Code als Verzweigung mit der Bedingung, falls etwas gilt mache etwas, falls nicht mache irgendwas anderes. In unserem Beispiel, falls player.canMove() den bool'schen Wert \lstinline{false} hat wird auf der Konsole der Text "Morpheus: There is a difference between knowing the path and walking the path" ausgegeben.\\
Nun wurde noch ein ELSE-Statement angehängt. Dadurch dient der Code als Verzweigung mit der Bedingung, falls etwas gilt mache etwas, falls nicht mache irgendwas anderes. In unserem Beispiel, falls player.canMove() den bool'schen Wert \lstinline{false} hat wird auf der Konsole der Text \enquote{\texttt{Morpheus: There is a difference between knowing the path and walking the path}} ausgegeben.\newline

Für sowohl das IF- als auch das ELSE-Statement gilt, dass in den geschweiften Klammern beliebig viel Code stehen kann, nicht nur eine Zeile wie in unserem Beispiel.
\end{Infobox}
Expand All @@ -58,7 +59,7 @@
\item Betrachte die Operation \lstinline{movement} der Klasse \lstinline{Sheet2Task4}.\\
Füge das obige IF-Statement an einer geeigneten Stelle ein und führe die Simulation erneut aus.
Dabei sollten die dann noch vorhandenen \lstinline{.move()} Kommandos in den ersten Code-Block vom IF verschoben werden.
Der \lstinline{else} Code-Block soll erstmal leer bleiben.
Der \lstinline{else} Code-Block soll erstmals leer bleiben.
\item Schließe nun das Fenster und öffne es erneut.
Lösche die Wand in dem Spielfenster.
Dazu musst du oben rechts das rote Minus auswählen und dann auf die Wand klicken.
Expand Down
4 changes: 2 additions & 2 deletions sheets/2/exercise-5.tex
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@
Dafür kannst du eine der Schleifen von oben verwenden.

\textbf{Hinweis}: Bei dieser Aufgabe ist das Spielfeld und die Anzahl der Münzen jedes mal anders.
\item Platziere jetzt alle Münzen auf dem rechten mittleren Spielfeld an der Wand.
\item Platziere jetzt alle Münzen auf dem rechten mittleren Spielfeld an der Wand.
Hier kannst du dich wieder an den Beispielen oben orientieren.
\item Zeichne mit den aufgehobenen Münzen eine Linie auf der mittleren Spur, beginnend auf dem Feld neben Neo.
Auf jedem Feld in der mittleren Reihe sollte jetzt eine Münze liegen.\\
Expand All @@ -65,7 +65,7 @@
\item Platziere auf jedem zweiten Feld eine Münze.\\
Also die Linie soll abwechselnd eine Münze und ein leeres Feld nacheinander haben.
\textbf{Hinweis}: Hier kannst du entweder die Abfolge direkt kodieren oder mit Variablen vom Typ \lstinline{boolean} und if-Verzweigungen aus Aufgabe 4 arbeiten.
\item \optional Lege auf jedem von Neo aus erreichbaren Feld genau eine Münze ab.
\item \optional Lege auf jedem von Neo aus erreichbaren Feld genau eine Münze ab.
Beachte hierbei, dass die Wände auf der oberen und unteren Spur zufällig platziert werden.

\textbf{Hinweis}: Hier musst du neben einer While Schleife auch IF-Statements verwenden.\\
Expand Down

0 comments on commit 2606b61

Please sign in to comment.