Skip to content

Commit

Permalink
teach all loop variants to adjust to sheet
Browse files Browse the repository at this point in the history
  • Loading branch information
Rdeisenroth committed Oct 4, 2023
1 parent def5e43 commit b6ecca7
Show file tree
Hide file tree
Showing 4 changed files with 94 additions and 38 deletions.
41 changes: 30 additions & 11 deletions exercises/Aufgabe3.tex
Original file line number Diff line number Diff line change
Expand Up @@ -6,42 +6,49 @@
\maketitle{}

\begin{task}[points=auto]{Schleifen}
\begin{subtask*}[points=0]{Gaußsche Summenformel Reloaded \stage1}
Erinnert euch an die Gaußsche Summenformel aus Übungsblatt 1:
\begin{subtask*}[points=0]{Gaußsche Summenformel \stage1}
Das hier ist die Gaußsche Summenformel:
$$1+2+3+\ldots+n = \sum_{k=1}^nk=\frac{n\cdot(n+1)}{2}$$
Nun soll die Summe nicht mit Hilfe der geschlossenen Darstellung der Reihe berechnet werden, sondern unter Verwendung einer \textbf{for-Schleife}.
(i) Berechne die Summe der Zahlen von \kotlininline{1} bis \kotlininline{100} mit Hilfe der Gaußschen Summenformel.

(ii) Nun soll die Summe nicht mit Hilfe der geschlossenen Darstellung der Reihe berechnet werden, sondern unter Verwendung einer \textbf{for-Schleife}.

\begin{solution}
\begin{codeBlock}[]{minted language=kotlin}
(i) Nach der Summenformel gilt: $\frac{100\cdot(100+1)}{2} = \underline{\underline{5050}}$

(ii) \begin{codeBlock}[]{minted language=kotlin}
var summe = 0

for (k in 1..100) {
for (k in 1..100) { // alternativ 1 until 101
summe += k
}

println("Die Summe von 1 bis 100 ist $summe.")
\end{codeBlock}
Ausgabe: \mintinline{text}{Die Summe von 1 bis 100 ist 5050.}
\end{solution}
\end{subtask*}
\begin{subtask*}[points=0]{Fakultät \stage1}
\begin{enumerate}
\item Schreibt ein Programm, das den Wert des Ausdrucks $1 \cdot 2 \cdot 3 \cdot \ldots \cdot 15 = 15!$ (Fakultät von 15) berechnet, und das Ergebnis auf der Konsole ausgibt.
\item Erweitert euer Programm so, dass es von beliebigen Eingaben in der Konsole die Fakultät berechnet.
\item Erweitert nun euer Programm so, dass es von beliebigen Eingaben in der Konsole die Fakultät berechnet.
\end{enumerate}
\begin{solution}
\begin{codeBlock}[]{minted language=kotlin}
print("Welche Fakultät soll berechnet werden: ")
println("Welche Fakultät soll berechnet werden: ")
val fak = readln().toInt()
var erg = 1
var erg = fak
for (i in 1..fak) {
for (i in fak-1 downTo 1) {
erg *= i
}
println("Die $fak. Fakultät ist $erg")
\end{codeBlock}
Ausgabe für Eingabe \mintinline{text}{5}: \mintinline{text}{Die 5. Fakultät ist 120}
\end{solution}
\end{subtask*}
\begin{subtask*}[points=0]{FizzBuzz \stage3}
Expand Down Expand Up @@ -89,6 +96,9 @@
\begin{solution}
\kotlinfile[][]{code/3_1_d_2_sol.kts}
\begin{anmerkung}
Effizienter wäre es natürlich, wenn man in Zeile 8 nur bis $\sqrt{\text{\kotlininline{prime}}}$ iteriert.
\end{anmerkung}
\end{solution}
\end{subtask*}
\end{task}
Expand Down Expand Up @@ -138,6 +148,9 @@
Schreibt nun ein Programm, dass für beliebige Listen alle Elemente der Reihe
nach ausgibt. Ihr könnt dafür eine \kotlininline{while}-Schleife verwenden.

\begin{anmerkung}
\kotlininline{liste.toString()} ist natürlich nicht erlaubt ;)
\end{anmerkung}
\begin{solution}
Da die Indices bei 0 anfangen ist \kotlininline{liste.size - 1} der letzte gültige Index.

Expand Down Expand Up @@ -230,8 +243,8 @@
Slicing funktioniert auch mit Text. Dabei wird der Text wie eine Liste von
Buchstaben behandelt. \\
\kotlininline{"Hallo Welt!".slice(0 .. 4)} ergibt beispielsweise
den String \kotlininline{"Hallo"}. Findet ihr einen Ausdruck mittels Slicing ein
Palindrom erkennt? \textit{Ein Palindrom ist ein Wort, das vorwärts und rückwärts
den String \kotlininline{"Hallo"}. Schafft ihr es, mittels Slicing ein
Palindrom zu erkennen? \textit{Ein Palindrom ist ein Wort, das vorwärts und rückwärts
identisch ist}.

\begin{solution}
Expand Down Expand Up @@ -272,6 +285,12 @@

Was müsst ihr bei der Berechnung des Durchschnitts beachten?

\begin{infoBox}
\fatsf{Herausforderung:}

Schafft ihr es, die Aufgabe mit nur einer Schleife zu lösen?
\end{infoBox}

\begin{solution}
\begin{codeBlock}[]{minted language=kotlin}
val liste = listOf(1, 2, 3, 4, 5, 6, 7)
Expand Down
80 changes: 61 additions & 19 deletions lecture/04_Schleifen/04_Schleifen.tex
Original file line number Diff line number Diff line change
Expand Up @@ -147,34 +147,54 @@ \section{For-Schleife}
\slidehead

\begin{itemize}
\vspace{-1ex}
%\vspace{-1ex}
\item Häufig gibt es folgende Schleifenart:
\vspace{-1ex}
%\vspace{-1ex}
\kotlinfile[][top=0pt,bottom=0pt]{listings/while3.kts}
\pause
\vspace{-1ex}
%\vspace{-1ex}
\item Kurzschreibweise:
\vspace{-1ex}
\kotlinfile[][top=0pt,bottom=0pt]{listings/forschleife.kts}
\vspace{-1ex}
\end{itemize}\pause
\begin{block}{Frage:}
Von wo bis wo zählt diese Schleife?
\end{block}
%\vspace{-1ex}
\kotlinfile[escapeinside=\$\$][top=0pt,bottom=0pt]{listings/forschleife.kts}
%\vspace{-1ex}
\end{itemize}%\pause
% \begin{block}{Frage:}
% Von wo bis wo zählt diese Schleife?
% \end{block}
\end{frame}

\begin{frame}
\begin{frame}[fragile]
\slidehead

\begin{itemize}
\item Sinnvoll, wenn eine Variable bis zu einem bestimmten Wert \textit{hochzählen} soll
\item Syntax:
\kotlinfile{listings/forschleife.kts}
\item Beispiel:
\kotlinfile{listings/forschleife-print.kts}
\item Schleife von 0 bis exklusive 10:
\begin{codeBlock}[]{minted language=kotlin}
for (zahl in 0 until 10) {
print(zahl + " ")
} // Ausgabe: 0 1 2 3 4 5 6 7 8 9
\end{codeBlock}
\pause
\item Schleife von 0 bis inklusive 10:
\begin{codeBlock}[]{minted language=kotlin}
for (zahl in 0..10) {
print(zahl + " ")
} // Ausgabe: 0 1 2 3 4 5 6 7 8 9 10
\end{codeBlock}
\end{itemize}
\end{frame}

% \begin{frame}
% \slidehead

% \begin{itemize}
% \item Sinnvoll, wenn eine Variable bis zu einem bestimmten Wert \textit{hochzählen} soll
% \item Syntax:
% \kotlinfile{listings/forschleife.kts}
% \item Beispiel:
% \kotlinfile{listings/forschleife-print.kts}
% \end{itemize}
% \end{frame}

\begin{frame}
\slidehead

Expand All @@ -188,7 +208,29 @@ \section{For-Schleife}
\item Schreibweise: \kotlininline{startwert until grenzwert step schrittweite}
\end{itemize}
\end{itemize}
\kotlinfile[][top=0cm,bottom=0cm]{listings/range.kts}
\kotlinfile[]{listings/range.kts}
\end{frame}

\begin{frame}[fragile]
\slidehead

Man kann auch rückwärts zählen:
\begin{itemize}
\item Schreibweise: \kotlininline{startwert downTo endwert}
\begin{codeBlock}[]{top=0cm,bottom=0cm,minted language=kotlin}
for (zahl in 10 downTo 0) {
print(zahl + " ")
}
// Ausgabe: 10 9 8 7 6 5 4 3 2 1 0
\end{codeBlock}
\item Schreibweise: \kotlininline{startwert downTo endwert step schrittweite}
\begin{codeBlock}[]{top=0cm,bottom=0cm,minted language=kotlin}
for (zahl in 10 downTo 0 step 2) {
print(zahl + " ")
}
// Ausgabe: 10 8 6 4 2 0
\end{codeBlock}
\end{itemize}
\end{frame}

\subsection{Verschachtelte Schleifen}
Expand All @@ -202,7 +244,7 @@ \subsection{Verschachtelte Schleifen}

\pause
\vspace{-1.5ex}
\begin{block}{Frage: Was wird ausgegeben?}
\begin{block}{Frage: Was wird ausgegeben?}\pause
\kotlininline{0000000000}\\
\kotlininline{0000000000}\\
\kotlininline{...}\\
Expand All @@ -226,7 +268,7 @@ \section{Quiz}
\kotlinfile{listings/FrageStunde_Schleife_ErrorListing.kts}
\end{block}
% while in range (Syntaxfehler)
% : fehlt (Syntaxfehler)
% println außerhalb der Schleife (Logikfehler)
% schleife wird 10 und nicht 20 mal ausgeführt (Logikfehler)
\end{frame}

Expand Down
2 changes: 1 addition & 1 deletion lecture/04_Schleifen/listings/forschleife.kts
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
for (zahl in 0 until 100) {
for (zahl in $\textit{\PYG{l+s}{<range>}}$) { // range wird gleich erklärt
// code
}
9 changes: 2 additions & 7 deletions lecture/04_Schleifen/listings/range.kts
Original file line number Diff line number Diff line change
@@ -1,8 +1,3 @@
for (zahl in 2 until 8 step 2) {
println(zahl)
}

// Ausgabe:
// 2
// 4
// 6
print(zahl + " ")
} // Ausgabe: 2 4 6

0 comments on commit b6ecca7

Please sign in to comment.