Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix compile workflow #157

Open
wants to merge 11 commits into
base: new_features_2025
Choose a base branch
from
7 changes: 4 additions & 3 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,10 @@ jobs:
timeout-minutes: 30
steps:
- name: Checkout
uses: actions/checkout@v2
- uses: xu-cheng/texlive-action/full@v1
with:
uses: actions/checkout@v4
- uses: xu-cheng/texlive-action@v2
with:
scheme: full
run: |
apk add make
apk add g++
Expand Down
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -17,3 +17,6 @@ vorkurs/
vorkurs.zip
pool_setup/poolpw
title.pdf
.vscode/
.DS_Store
*.dSYM
Empty file.
Empty file.
Empty file added appendix/error_messages.tex
Empty file.
8 changes: 4 additions & 4 deletions appendix/intro.tex
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,10 @@ \chapter{Appendix}


\pagestyle{fancy}
\input{appendix/cheatsheet_shortcuts}
\input{appendix/cheatsheet_shellcomands}
\input{appendix/coding_style}
\input{appendix/fehler_fehlermeldungen}
\input{appendix/cheatsheet_shortcuts} %ToDo needs to be added
\input{appendix/cheatsheet_shellcomands} % ToDo needs to be added
\input{appendix/coding_style} %ToDo, partially done
\input{appendix/error_messages} % ToDo needs to be added

\clearpage
\pagestyle{empty}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,6 @@ \chapter{Vorbereitung eigener Computer}
Wir werden in diesem Fall den proprietären Editor „Visual Studio Code“ verwenden, welcher \href{https://code.visualstudio.com/Download}{hier} heruntergeladen werden kann.\\

\pagestyle{fancy}
\input{eigene_computer/windows.tex}
\input{eigene_computer/macos.tex}
\input{eigene_computer/linux.tex}
\input{eigener_computer/linux}
\input{eigener_computer/windows}
\input{eigener_computer/macos}
File renamed without changes.
File renamed without changes.
File renamed without changes.
Empty file added files/array.cpp
Empty file.
File renamed without changes.
85 changes: 0 additions & 85 deletions lektionen/arrays.tex

This file was deleted.

166 changes: 166 additions & 0 deletions lektionen/arrays_vectors.tex
Original file line number Diff line number Diff line change
@@ -0,0 +1,166 @@
\lesson{\texttt{C}-Arrays}

Als nächstes wichtiges Konzept in \Cpp werden wir uns \emph{Arrays} anschauen.
Arrays sind eine Möglichkeit, mehrere Elemente des gleichen Typs zusammen zu
fassen. Statt also einer Stelle im Speicher, an der ein \texttt{int} liegt,
habt ihr einen ganzen Speicherbereich, in dem 100 (oder eine beliebige andere
Anzahl an) \texttt{int}s liegen.

Die Elemente in einem Array sind durchnummeriert, man nennt die Nummer eines
Arrayelements seinen \emph{Index}. Das erste Element hat den Index 0, das
zweite den Index 1 und das 100te hat den Index 99 -- Vorsicht also, der höchste
Index in einem Array mit 100 Elementen ist 99, nicht 100! Um ein Array zu
definieren, schreibt ihr hinter seinen Namen eine eckige Klammer auf, die
Anzahl an Elementen, die es enthalten soll, und eine eckige Klammer zu. Auf ein
bestimmtes Arrayelement zuzugreifen könnt ihr tun, indem ihr seinen Index in
eckigen Klammern hinter den Namen schreibt. Folgendes Programm macht
hoffentlich die Syntax klar:
\inputcpp{array.cpp} % ToDo: Add this file

Es gibt einige Dinge, zu beachnten, wenn ihr mit Arrays arbeitet. Das
wichtigste ist oben schon genannt -- sich davon verwirren zu lassen, dass
Indizes bei 0 anfangen und aus Versehen über das Array hinaus schreiben oder
lesen ist ein so häufiger Fehler, dass er seinen eigenen Namen bekommen hat:
„Off-by-one error“. Wichtig ist, dass der Compiler diesen Zugriff nicht
verhindern wird! Das ist von daher eine sehr fiese Sache, als dass dieser
Fehler auch beim Ausführen nicht immer Probleme machen wird -- aber manchmal
lässt er auch euer Programm spontan abstürzen in einem so genannten
\emph{segmentation fault}.

Eine Limitation von Arrays, die ihr beachten solltet, ist, dass bereits zur
Compilezeit fest stehen muss, wie viele Elemente sie enthalten sollen. Ihr
könnt also z.B. nicht die Nutzerin fragen, wie viele Elemente in das Array
passen soll, denn dies würde erst zur Laufzeit feststehen (wir werden später
noch Wege um diese Limitation kennen lernen).

Ihr könnt auch Arrays von Arrays (so genannte zweidimensionale Arrays)
erstellen, indem ihr zweimal in eckigen Klammern die Größe des Arrays
hinschreibt. Die erste Größe gibt dann die Anzahl der Zeilen an, die zweite die
Anzahl der Spalten. Auch beim Zugriff auf Arrayelemente müsst ihr dann zwei
Indizes angeben. Wir werden dies später noch nutzen, hier sei erst einmal nur
die generelle Möglichkeit genannt.

\textbf{Praxis:}
Wir wollen die Seite \url{http://www.ich-kann-mich-nicht-entscheiden.de/}
nachmachen und eine Entscheidungshilfe programmieren, die aus mehreren von der
Nutzerin gegebenen Möglichkeiten eine per Zufall auswählt.

\begin{enumerate}
\item Schreibt zunächst ein Programm, welches ein Array aus 10 Strings
erstellt und die Nutzerin 10 mal nach einer Antwortmöglichkeit fragt
und die gegebenen Antworten nacheinander in das Array schreibt.
\item Fügt nun die Möglichkeit zu, weniger Antworten anzugeben. Dazu könnt
ihr zum Beispiel zuerst fragen, wie viele Antwortmöglichkeiten es geben
soll und dann so oft fragen (und natürlich einen Fehler ausgeben, wenn
es mehr als 10 Antworten geben soll).
\item Ihr könnt dann (so wie in dem Programm oben) eine Zufallszahl
erzeugen. Um sicher zu gehen, dass sie nicht zu groß wird, könnt ihr
den Rest bei Teilung durch Anzahl der eingegebenen Antworten nehmen
(sind z.B. 7 Antworten angegeben und die Zufallszahl ist 25778, so wäre
der resultierende Index \texttt{25778 \% 7 == 4}). Gebt dann die
Antwortmöglichkeit aus, die dem zufallsgeneriertem Index
entspricht.
\end{enumerate}

Sollte euer Programm einmal nicht korrekt kompilieren, denkt daran die
Fehlermeldung sorgfältig zu lesen, damit sie euch Aufschluss über die
Fehlerursache gibt. Sollte euer Programm zwar kompilieren, sich dann aber
komisch verhalten, denkt daran, den debugger zu benutzen und es Schritt für
Schritt durchzugehen, um die Fehlerquelle zu finden. Solltet ihr trotz alledem
nicht weiter kommen, oder nicht wissen, was von euch erwartet wird, fragt einen
von uns.

\textbf{Spiel:}
\begin{enumerate}
\item Schreibt ein Progamm, welches ein Array beliebiger Größe erstellt und
dann auf einen Index weit ausserhalb des erlaubten Bereichs schreibt.
Was beobachtet ihr?\footnote{Es wird natürlich Quark sein was dabei
rauskommt, es geht hier haupsächlich darum das ihr seht was für
einen Fehler das gibt}
\item Implementiert das \emph{Sieb des Eratosthenes}
\footnote{\url{https://de.wikipedia.org/wiki/Sieb_des_Eratosthenes}},
wenn ihr noch nicht ausgelastet seid.
Denkt daran, es initial zu befüllen und denkt euch eine clevere
Möglichkeit aus, das „Streichen“ zu realisieren.
\end{enumerate}


\lesson{Vektor}

Als nächstes wichtiges Konzept in \Cpp werden wir uns \emph{Vektoren} anschauen.
Vektoren sind eine Möglichkeit, mehrere Elemente des gleichen Typs zusammen zu fassen.
Statt also einer Stelle im Speicher, an der ein \texttt{int} liegt, habt ihr einen ganzen Speicherbereich, in dem 100 (oder eine beliebige andere Anzahl an) \texttt{int}s liegen.

Die Elemente in einem Vektor sind durchnummeriert, man nennt die Nummer eines Vektorelements seinen \emph{Index}.
Das erste Element hat den Index 0, das zweite den Index 1 und das 100te hat den Index 99 -- Vorsicht also, der höchste Index in einem Vektor mit 100 Elementen ist 99, nicht 100!
Um einen Vektor zu definieren, schreibt ihr:
\begin{center}
\cppinline{std::vector<}\emph{Datentyp}\cppinline{> einvektor;}
\end{center}
um den Datentypen schreibt ihr also noch \cppinline{std::vector<}\dots\cppinline{>}.
Um ein Element am Ende einzufügen gibt es
\begin{center}
\cppinline{einvektor.push_back(}\emph{Element}\cppinline{);}
\end{center}
und auf ein bestimmtes Vektorelement zugreifen könnt ihr indem ihr seinen Index in eckigen Klammern hinter den Namen schreibt.
\begin{center}
\cppinline{einvektor[}\emph{Index}\cppinline{]}
\end{center}
Wenn ihr die Größe eines Vektors wissen wollt könnt ihr
\begin{center}
\cppinline{einvektor.size()}
\end{center}
verwenden.

Folgendes Programm macht hoffentlich die Syntax klar:

\inputcpp{vector.cpp}

Es gibt einige Dinge, zu beachten, wenn ihr mit Vektoren arbeitet.
Das wichtigste ist oben schon genannt -- lasst euch nicht davon verwirren, dass Indizes bei 0 anfangen.
Aus Versehen über den Vektor hinaus zu schreiben oder zu lesen ist ein so häufiger Fehler, dass er seinen eigenen Namen bekommen hat: \emph{Off-by-one} error.
Wichtig ist, dass der Compiler diesen Zugriff nicht verhindern wird!
Das ist von daher eine sehr fiese Sache, als dass dieser Fehler auch beim Ausführen nicht immer Probleme machen wird -- aber manchmal lässt er auch euer Programm spontan abstürzen in einem so genannten \emph{segmentation fault}.

\begin{praxis}

Wir wollen die Seite \url{http://www.ich-kann-mich-nicht-entscheiden.de/} nachmachen und eine Entscheidungshilfe programmieren, die aus mehreren von der Nutzerin gegebenen Möglichkeiten eine per Zufall auswählt.

\begin{enumerate}
\item
Schreibt zunächst ein Programm, welches einen Vektor aus 10 Strings erstellt und die Nutzerin 10 mal nach einer Antwortmöglichkeit fragt und die gegebenen Antworten nacheinander in den Vektor schreibt.
\item
Fügt nun die Möglichkeit zu, weniger Antworten anzugeben.
Dazu könnt ihr zum Beispiel zuerst fragen, wie viele Antwortmöglichkeiten es geben soll und dann so oft fragen.
\item
Ihr könnt dann (so wie in dem Programm oben) eine Zufallszahl erzeugen.
Um sicher zu gehen, dass sie nicht zu groß wird, könnt ihr den Rest bei Teilung durch Anzahl der eingegebenen Antworten nehmen (sind z.B. 7 Antworten angegeben und die Zufallszahl ist 25778, so wäre der resultierende Index \texttt{25778 \% 7 == 4}).
Gebt dann die Antwortmöglichkeit aus, die dem zufallsgeneriertem Index entspricht.
\end{enumerate}
\end{praxis}

Sollte euer Programm einmal nicht korrekt kompilieren, denkt daran die Fehlermeldung sorgfältig zu lesen, damit sie euch Aufschluss über die Fehlerursache gibt.\\
Sollte euer Programm zwar kompilieren, sich dann aber komisch verhalten, denkt daran, den Debugger zu benutzen und es Schritt für Schritt durchzugehen, um die Fehlerquelle zu finden. Solltet ihr trotz alledem nicht weiter kommen, oder nicht wissen, was von euch erwartet wird, fragt einen von uns.


\begin{spiel}
\begin{enumerate}
\item
Schreibt ein Progamm, welches einen Vektor mit einer beliebigen Anzahl an Elementen befüllt und dann auf einen Index weit über der tatsächlichen Größe schreibt.
Was beobachtet ihr?\footnote{Es wird natürlich Quark sein was dabei rauskommt, es geht hier haupsächlich darum das ihr seht was für einen Fehler das gibt}
\item
Überlegt euch wie ihr verhindern könnt, dass über den Rand des Vektors hinaus geschrieben oder gelesen wird.
\item
Implementiert das \emph{Sieb des Eratosthenes}\footnote{\url{https://de.wikipedia.org/wiki/Sieb_des_Eratosthenes}}, wenn ihr noch nicht ausgelastet seid.
Denkt daran, es initial zu befüllen und denkt euch eine clevere Möglichkeit aus, das „Streichen“ zu realisieren.
\end{enumerate}
\end{spiel}

\textbf{Quiz 15}\\
\textit{Welche Aussagen über Vektoren sind falsch?}
\begin{enumerate}[label=\alph*)]
\item Vektoren haben immer die Größe 3
\item Vektoren können nur mit Elementen eines einzigen Datentyps befüllt werden
\item Der Index startet bei 0
\item Der letzte Index ist immer die Größe - 1
\end{enumerate}
2 changes: 1 addition & 1 deletion lektionen/compiling.tex
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@
Eintrittspunkt für das Programm genommen, sonst gibt es einen
\emph{Linkerfehler}. Ein Linkerfehler tritt auch auf, wenn wir versuchen, eine
Funktion zu verwenden, die es nicht gibt (z.B. indem wir Funktionen aus einem
Headerfile benutzen ohne das Header-File mit \texttt{#include} auch tatsächlich einzubinden).
Headerfile benutzen ohne das Header-File mit \texttt{\#include} auch tatsächlich einzubinden).
Linkerfehler deuten also darauf hin, dass wir vergessen haben, alle
relevanten Dateien auf der Kommandozeile anzugeben, oder dass eine
\texttt{main}-Funktion fehlt, oder dass wir in mehren Dateien eine Funktion
Expand Down
File renamed without changes.
File renamed without changes.
File renamed without changes.
5 changes: 5 additions & 0 deletions lektionen/exercises/intro.tex
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
\chapter{Zusätzliche Übungen}
\pagestyle{empty}
Dieses Kapitel dient als Aufgabenpool für zusätzliche Übungen, die ihr bearbeiten könnt, um euer Wissen zu festigen.

\pagestyle{fancy}
14 changes: 7 additions & 7 deletions lektionen/funktionen.tex → lektionen/functions.tex
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,13 @@
Die Kombination von Parametertypen und Rückgabetyp bildet die Signatur einer Funktion.
Parameter sind Werte, die der Funktion übergeben werden, zum Beispiel das $x$ in $f(x)$.
Für eine Funktion \cppinline{my_func}, die $x^n$ berechnen soll, könnte eine Signatur so aussehen:
\[
\smashoperator{\mathop{\underbrace{\text{\cppinline{double}}}}_{\text{Rückgabetyp}}}\quad
\smashoperator{\mathop{\overbrace{\text{\cppinline{my_func}}}}^{\text{Name}}}
(\smashoperator{\mathop{\underbrace{\text{\cppinline{double x}}}}_{\text{Parameter 1}}},\
\smashoperator{\mathop{\overbrace{\text{\cppinline{int n}}}^{\text{Parameter 2}}}})
\]
%sorry etwas hässlich
%\[
% \smashoperator{\mathop{\underbrace{\text{\cppinline{double}}}}_{\text{Rückgabetyp}}}\quad
% \smashoperator{\mathop{\overbrace{\text{\cppinline{my_func}}}}^{\text{Name}}}
% (\smashoperator{\mathop{\underbrace{\text{\cppinline{double x}}}}_{\text{Parameter 1}}},\
% \smashoperator{\mathop{\overbrace{\text{\cppinline{int n}}}^{\text{Parameter 2}}}})
%\]
% This structure currently causes the workflow to crash. It will need to be addressed in the future.

\begin{itemize}
\item Rückgabetyp: Bestimmt welchen Datentyp die Rückgabe der Funktion hat
Expand Down
Loading