Skip to content

Commit

Permalink
Inhaltliche Änderungen für den Vorkurs 2024 (#128)
Browse files Browse the repository at this point in the history
* initial commit fuer eigen computer

* added eigene computer part to main script

* small ansible changes

* updated readme #124

* Section für Windows leicht überarbeitet und aktualisiert auf WSL2.

* Update build.yml

Updated from upload-artifact@v2 to @v4, as @V3 will be deprecated as of Nov. 30 2024 (1,5months)

* Windows section aktualisiert, hello world angepasst auf vscode

* In Kapitel 10 werden jetzt for und while Loops vorgestellt. Außerdem wurden Aufgaben hinzugefügt um for-loops zu benutzen und einen for-loop in einen while-loop umzuwandeln

* kleine rechtschreibkorrektur im diagramm

* Dopplung entfernt

* Kapitel Vektoren leicht überarbeitet: Einen while-loop durch einen for-loop ersetut, kleine aufgabenstellung hinzugefügt zur verhinderung von out-of bounce zugriffen. kleine fehlerkorrektur in prim-for-loop

* preprocessing hinzugefügt

* huch ist mir ein fehler durchgerutscht

* added missing escape symbol

* rechtschreibfehler korrigiert

Co-authored-by: Christian Heusel <[email protected]>

* clarification

Co-authored-by: Christian Heusel <[email protected]>

* Delete vorkurs_log.txt

no idea why this got committed

* renamed lesson 18

* of course i forgot to edit the script to include the new name for lesson 18

* Update basics/schleifen.tex

* rechtschreibfehler und clion footnote hinzugefügt

* Update hello_world.tex

fix broken link

---------

Co-authored-by: Felix <[email protected]>
Co-authored-by: holyaltbier <[email protected]>
Co-authored-by: Christian Heusel <[email protected]>
Co-authored-by: Tim Grube <[email protected]>
Co-authored-by: Felix Schledorn <[email protected]>
  • Loading branch information
5 people authored Sep 21, 2024
1 parent 01118c9 commit 7330fd9
Show file tree
Hide file tree
Showing 18 changed files with 245 additions and 46 deletions.
6 changes: 4 additions & 2 deletions basics/linker.tex → basics/compiling.tex
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
\lesson{Compiler, Assembler, Linker}
\lesson{Preprocessing, Compiler, Assembler, Linker}

In der letzten Lektion klang es bereits an -- was der Befehl \texttt{g++}
eigentlich tut, ist mehr, als nur Kompilieren im strengen Sinne des Wortes. Wir
Expand All @@ -11,9 +11,11 @@
In Lektion 1 haben wir vereinfacht dargestellt, dass der Compiler eine
Quelltextdatei mit der Endung \texttt{.cpp} nimmt und daraus direkt eine
ausführbare Datei erstellt. Die Schritte, die hier eigentlich in einem Befehl
durchgeführt werden, aber zu trennen sind, sind das \emph{Kompilieren}, das
durchgeführt werden, aber zu trennen sind, sind das \emph{Preprocessing}, das \emph{Kompilieren}, das
\emph{Assemblieren} und das \emph{Linken}.

Beim Preprocessing werden alle \texttt{\#include}-Anweisungen aufgelöst und so etwas wie Makros ersetzt. Das ist der erste Schritt, der passiert, wenn wir \texttt{g++} aufrufen. Das Ergebnis des Preprocessings ist ein \Cpp-Programm, das nur noch die \Cpp-Features enthält, die wir auch wirklich benutzen. Das ist der Grund, warum wir in den bisherigen Lektionen immer \texttt{g++ -o helloworld helloworld.cpp} benutzt haben, obwohl wir in \texttt{helloworld.cpp} auch \texttt{\#include <iostream>} stehen haben -- der Compiler hat das schon für uns erledigt.

Das Kompilieren übersetzt unseren \Cpp-Code in eine Zwischenform, so genannten
\emph{Assembler}. In Lektion 1 haben wir den Maschinencode angesprochen, in der
Befehle und Parameter an Befehle in 1en und 0en dargestellt werden. Assembler
Expand Down
4 changes: 2 additions & 2 deletions basics/funktionen.tex
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@
\[
\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{Paramter 1}}},\
\smashoperator{\mathop{\overbrace{\text{\cppinline{int n}}}^{\text{Paramter 2}}}})
(\smashoperator{\mathop{\underbrace{\text{\cppinline{double x}}}}_{\text{Parameter 1}}},\
\smashoperator{\mathop{\overbrace{\text{\cppinline{int n}}}^{\text{Parameter 2}}}})
\]
%sorry etwas hässlich

Expand Down
20 changes: 7 additions & 13 deletions basics/hello_world.tex
Original file line number Diff line number Diff line change
Expand Up @@ -39,10 +39,7 @@
\textbf{Wie gehe ich dabei vor?}

Um den Programmcode in eine Textdatei zu schreiben verwenden wir einen Texteditor.
Dies kann mit fast jedem einfachen Texteditor bewerkstelligt werden. Wir verwenden beispielsweise im Vokurs gedit unter Ubuntu.
Unter Windows kannst du den Editor oder notepad++ verwenden, unter MacOS Textedit.
In der fortgeschrittenen Programmierung werden intelligente Programmierumgebungen verwendet, die jedoch in diesem Kurs vernachlässigt werden.

Dies kann mit fast jedem einfachen Texteditor bewerkstelligt werden. Populäre konsolenbasierte Editoren sind \texttt{vim} und \texttt{nano}. Es existieren aber auch grafische Editoren, die speziell für das Schreiben von Programmcode entwickelt wurden, wie \texttt{Visual Studio Code} oder \texttt{CLion}\footnote{https://www.jetbrains.com/community/education}.
Um dem Compiler zusagen, welche Textdatei er in ein Programm übersetzen soll, verwenden wir die sogenannte Shell. Vorerst reicht uns zu wissen, dass die Shell
ein Werkzeug ist, um dem Computer spezifisch zu sagen, was er machen soll (mehr dazu im folgenden Kapitel). In Ubuntu verwenden wir hierzu das Terminal, ebenso in MacOS,
unter Windows CMD oder Powershell. Ein Befehl für \texttt{g++} (dem Compiler für \Cpp) sieht beispielsweise wie folgt aus:
Expand All @@ -65,7 +62,7 @@
\textbf{Erstes Programm in \Cpp schreiben}

\begin{enumerate}
\item Öffne einen Texteditor (In Ubuntu unter „Zubehör“ den Editor gedit).
\item Erstelle eine neue, leere Datei in einem Editor deiner Wahl.

\item Kopiere folgenden Programmcode in den Texteditor und speichere ihn in einer Datei mit dem Namen „helloworld.cpp“ ab.
Das nähere Verständnis des Programmcodes ist an dieser Stelle nicht notwendig.
Expand All @@ -81,7 +78,7 @@
Was dieser Befehl genau tut und wie er funktioniert, erfahrt ihr in Lektion 2.
\item In diesem Verzeichnis liegt nun eine Datei mit dem Namen \texttt{helloworld.cpp}.
Benutzt \texttt{g++}, um diese zu einer Datei (in diesem Fall dem Programm) \texttt{hello} zu
kompilieren. Orientiert euch dazu an den folgenden Befehlen.
kompilieren. Orientiert euch dazu an den folgenden Befehlen. (siehe Diagramm)
\item Führt die Datei \texttt{hello} aus.
\end{enumerate}
\end{praxis}
Expand All @@ -90,7 +87,7 @@
Zur besseren Übersichtlichkeit hier der ganze Vorgang noch mal in einem
Diagramm:

% TODO: Buttugly, but well...
% TODO: Buttugly, but well... - its gonna stay this way
\begin{center}
\resizebox{\textwidth}{!}{
\begin{tikzpicture}
Expand All @@ -108,11 +105,8 @@
\begin{spiel}

Ihr könnt nun versuchen, den Quellcode selbst zu verändern und damit ein wenig
herumzuspielen. Öffnet dazu einen Editor (in den Anwendungen findet ihr z.B.
unter „Zubehör“ den Editor gedit) und öffnet die Datei
\texttt{vorkurs/lektion01/helloworld.cpp}\footnote{entweder mittels
\glqq{}Datei/Öffnen\grqq{} in gedit oder über das Terminal mittels \texttt{gedit
helloworld.cpp}}. Denkt daran, nach jeder Änderung die Datei zu speichern und
herumzuspielen. Öffnet dazu einen Editor und öffnet die Datei
\texttt{vorkurs/lektion01/helloworld.cpp}\footnote{am besten öffnet ihr in VSCode den gesamten Vorkurs-Ordner}. Denkt daran, nach jeder Änderung die Datei zu speichern und
im Terminal neu zu kompilieren und auszuführen.

Dinge, die ihr ausprobieren könntet sind zum Beispiel:
Expand All @@ -134,4 +128,4 @@
\item Es gibt einen Fehler
\item Das Programm tut garnichts mehr
\item Das Programm gibt trotzdem \texttt{Hello world} aus
\end{enumerate}
\end{enumerate}
2 changes: 1 addition & 1 deletion basics/intro.tex
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ \chapter{Die Basics}
\input{basics/vektoren}
\input{basics/warning}
\input{basics/tictactoe1}
\input{basics/linker}
\input{basics/compiling.tex}
\input{basics/tictactoe2}

\clearpage
Expand Down
21 changes: 19 additions & 2 deletions basics/schleifen.tex
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,22 @@
ihr könnt alleine mit den Mitteln, die ihr bisher kennen gelernt habt,
\emph{jede} mögliche Berechnung anstellen!

Es gibt noch eine weitere Art von Schleifen, die \texttt{for}-Schleife. Die for-Schleife hat folgende Struktur:
\begin{center}
\texttt{for (Initialisierung; Bedingung; Inkrementierung) \{ Code-Fragment \}}
\end{center}
Die Initialisierung wird nur einmal ausgeführt, bevor die Schleife beginnt. Die Bedingung wird vor jedem Durchlauf der Schleife überprüft. Wenn die Bedingung wahr ist, wird das Code-Fragment ausgeführt. Nachdem das Code-Fragment ausgeführt wurde, wird die Inkrementierung ausgeführt. Danach wird die Bedingung erneut überprüft. Wenn die Bedingung nicht mehr wahr, also falsch ist, wird die Schleife beendet.

Der Unterschied zwischen den beiden Schleifenarten liegt hauptsächlich in ihrer Struktur:
\begin{itemize}
\item \texttt{for}-Schleife: Ideal, wenn du im Voraus weißt, wie oft die Schleife laufen soll. Sie hat eine eingebaute Zählervariable (oft i), eine Bedingung, die überprüft, ob der Zähler einen bestimmten Wert erreicht hat, und eine Inkrementierung, die den Zähler bei jedem Durchlauf erhöht.
\item \texttt{while}-Schleife: Flexibler, da sie für verschiedene Arten von Abbruchbedingungen verwendet werden kann. Sie läuft so lange, bis die angegebene Bedingung falsch wird.
\end{itemize}

Wie ihr später im Studium beweisen werdet, lassen sich die beiden Ausdrücke immer ineinander überführen. Sie sind also gleichmächtig, d.h. jede \texttt{for}-Schleife kann in eine \texttt{while}-Schleife umgewandelt werden und umgekehrt. Es ist also erst einmal egal, welche Schleife ihr verwendet, nutzt einfach die, die euch am meisten zusagt.\newline
Die \texttt{while}-Schleife aus dem vorherigen Beispiel mit den Primzahlen könnte also auch so aussehen:
\inputcpp{prim-for-loop.cpp}

\begin{praxis}
\begin{enumerate}
\item Versucht, die Arbeitsweise des Programms zu simulieren. Geht selbst
Expand All @@ -79,9 +95,10 @@
Computer (bei Kontrollflussstrukturen) als nächstes springen würde.
\item Warum funktioniert das Programm für den Fall $n = 2$?
\item Schreibt selbst ein Programm, welches eine Zahl von der Nutzerin
entgegennimmt und dann alle Zahlen bis zu dieser Zahl ausgibt.
entgegennimmt und dann alle Zahlen bis zu dieser Zahl ausgibt. Nutz dafür eine \texttt{for}-Schleife.
\item Versucht nun das gleiche mit einer \texttt{while}-Schleife.
\item Modifiziert euer Programm, sodass es von dieser Zahl bis zu 0
hinunterzählt.
hinunterzählt, jeweils wieder mit einer \texttt{while}-Schleife und mit einer \texttt{for}-Schleife.
\end{enumerate}
\end{praxis}

Expand Down
17 changes: 1 addition & 16 deletions basics/stdbib.tex
Original file line number Diff line number Diff line change
Expand Up @@ -67,22 +67,7 @@
\end{enumerate}
\end{praxis}

\textbf{Praxis:}
\begin{enumerate}
\item Findet in der \Cpp-Referenz eine Funktion, um die aktuelle Zeit
auszugeben. Schreibt ein Programm, welches die Aktuelle Zeit ausgibt
(es reicht, einen so genannten \emph{Unix timestamp}\footnote{Der
Unix-Timestamp ist eine einzelne Zahl, die alle Sekunden seit dem
1.1.1970 anzeigt und die also jede Sekunde eins größer wird} auszugeben).
Ihr könnt die Ausgabe eures Programms mit der Ausgabe von \texttt{date
+\%s} vergleichen, um es zu testen.
\item Mit der Funktion \texttt{rand()} könnt ihr Zufallszahlen generieren
(ihr braucht dazu den Header \texttt{<cstdlib>}). Schreibt ein
Programm, welches vom Benutzer eine Zahl entgegennimmt und diese Anzahl
Zufallszahlen ausgibt. Führt das Programm mehrfach aus. Was fällt auf?
\item Konsultiert die \Cpp-Referenz, um heraus zu finden, wo das Problem
liegt. Könnt ihr es beheben?
\end{enumerate}


\newpage

Expand Down
7 changes: 4 additions & 3 deletions basics/vektoren.tex
Original file line number Diff line number Diff line change
Expand Up @@ -52,16 +52,17 @@
\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.
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.
Expand Down
10 changes: 10 additions & 0 deletions eigene_computer/intro.tex
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
\setcounter{chapter}{-1}
\chapter{Vorbereitung eigener Computer}
\pagestyle{empty}
Dieses Kapitel dient der Vorbereitung privater Computer, um daran den Kurs zu bearbeiten.
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}
13 changes: 13 additions & 0 deletions eigene_computer/linux.tex
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
\textbf{Linux}

\pagestyle{empty}

Falls ihr privat bereits ein Linux-System nutzt.
\begin{enumerate}
\item Optional: Alternativ zu Visual Studio Code, könnt ihr auch eine Quelloffene Version des Editors verwenden.
Da die Installation dieser Version je nach Distribution variiert, verweisen wir euch an dieser Stelle an eine kurze Internetrecherche.
\item Installiert mit eurem Packagemanager \texttt{g++} und ggf. \texttt{unzip}, sowie \texttt{wget}.
\item Das Archiv mit den Vorkursdateien könnt ihr mit \\
\texttt{wget https://mathphys.info/vorkurs/pvk/vorkurs.zip} herunterladen.
\item Mit \texttt{unzip vorkurs.zip} könnt ihr dieses entpacken.
\end{enumerate}
14 changes: 14 additions & 0 deletions eigene_computer/macos.tex
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
\textbf{MacOS}

\pagestyle{empty}

Das Setup unter MacOS ist im Vergleich zu Windows recht einfach.

\begin{enumerate}
\item Öffnet ein Terminal.
\item Tippt \texttt{g++} ein.
\item Bestätigt in dem erscheinenden Fenster die Installation.
\item Die Dateien des Vorkurses können \href{https://mathphys.info/vorkurs/pvk/vorkurs.zip}{hier} heruntergeladen werden.
\item Entpackt die Dateien in ein Verzeichnis eurer Wahl.
\item In Visual Studio Code könnt ihr dann über den Explorer auf die Dateien des Kurses zugreifen.
\end{enumerate}
27 changes: 27 additions & 0 deletions eigene_computer/windows.tex
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
\textbf{Windows}

\pagestyle{empty}
Um dem Kurs unter Windows folgen zu können sollte zunächst eine Linux-Umgebung erzeugt werden, in der die entsprechenden Tools zur Verfügung stehen. Dafür muss zunächst das so genannte Windows-Subsystem für Linux (kurz WSL) aktiviert werden.
Wie der Name bereits vermuten lässt, erlaubt es das WSL, eine Linux-Umgebung unter Windows zu nutzen.
In dieser werden wir dann die nötigen Tools installieren.
\begin{enumerate}
\item Zunächst muss mittels PowerShell das WSL aktiviert werden. Dafür kann man im Suchfeld des Windows-Desktops einfach nach „PowerShell“ suchen.
Durch einen Rechtsklick kann diese als Administrator gestartet werden, was für die Aktivierung notwendig ist.
\item Hat man die PowerShell als Administrator geöffnet, kann das WSL durch den Befehl \texttt{wsl -{}-install} aktivieren.
\item Das System startet danach einen Download, diesen durchlaufen lassen, und anschließend den PC neu starten.
\item Nach dem Neustart kann in den Programmen „Ubuntu“ gestartet werden.
Wenn ihr an dieser Stelle „Ubuntu“ nicht auswählen könnt, dann ist die Installation unter Umständen noch nicht fertig.
Startet in diesem Fall die PowerShell erneut als Administrator und führt erneut \texttt{wsl -{}-install} aus.
\item In dem erscheinenden Terminal wird zunächst um die Erstellung eines neuen Nutzers für die Linux-Umgebung gebeten.
Hierbei könnt ihr Nutzername und Passwort frei wählen. Bitte notiert euch diese, da ihr sie noch braucht.\\
\textbf{Hinweis zum setzen des Passworts:} Anders als bei Windows werden hier bei der Eingabe keine Sternchen, oder ähnliche Symbole erscheinen, die als Platzhalter für bereits eingegebene Symbole erscheinen.
Das Passwort muss also „blind“ eingegeben werden. Um hier ein eventuelles Vertippen auszuschließen, muss das Passwort nach der ersten Eingabe erneut bestätigt werden.
\item Bevor ihr neue Tools installiert, solltet ihr euer System updaten. Gebt dazu ins Terminal folgende Befehle ein: \texttt{sudo apt update} und danach \texttt{sudo apt upgrade}. Im Allgemeinen empfiehlt es sich, diese Befehle im regelmäßigen Abstand auszuführen um euer System aktuell zu halten. Ihr werdet hier eventuell nach einem Passwort gefragt, ihr müsst hier das eben von euch gesetzte verwenden.
\item Im Anschluss müssen im Terminal mittels \texttt{sudo apt install gdb g++ unzip -y} die nötigen Tools installiert werden.
Der Start des Vorgangs muss dabei wieder mit dem vorhin gesetzten Passwort bestätigt werden.
(Auch hier werden keine Sternchen oder Ähnliches für bereits eingegeben Symbole angezeigt)
\item Jetzt könnt ihr die Dateien des Kurses mittels \\
\texttt{wget https://mathphys.info/vorkurs/pvk/vorkurs.zip} herunterladen.
\item Abschließend könnt ihr das Archiv mit \texttt{unzip vorkurs.zip} entpacken.
\item Die Dateien des Vorkurses können nun mittels \texttt{code vorkurs} über das Terminal geöffnet werden.
\end{enumerate}
31 changes: 31 additions & 0 deletions files/prim-for-loop.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
#include <iostream>

int main() {
int n;
std::cout << "Gebe eine (positive) Zahl ein: ";
std::cin >> n;

if (n <= 0) {
std::cerr << "Die Zahl soll positiv sein!" << std::endl;
// Wir benutzen return, um unser Programm vorzeitig
// abzubrechen. 1 bedeutet, dass ein Fehler aufgetreten
// ist, 0 bedeutet, alles ist okay
return 1;
}

bool hat_teiler = false;
// Äquivaltent zu while (i < n)
for (int i = 2; i < n; i++) {
if ((n % i) == 0) {
hat_teiler = true;
}
}

if (hat_teiler) {
std::cout << n << " ist keine Primzahl" << std::endl;
}
else {
std::cout << n << " ist eine Primzahl" << std::endl;
}
return 0;
}
6 changes: 2 additions & 4 deletions files/vector.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,17 +8,15 @@ int main() {

srand(time(NULL));

int i = 0;
while (i < 100) {
for (int i = 0; i < 100; i++) {
einvector.push_back(rand());
i = i + 1;
}
std::cout << "An Index 0 steht " << einvector[0] << std::endl;
std::cout << "An Index 42 steht " << einvector[42] << std::endl;
std::cout << "An Index 99 steht " << einvector[99] << std::endl;

// und nun alle werte auf 42 setzen ;-)
i = 0;
int i = 0;
while (i < einvector.size()) {
einvector[i] = 42;
i = i + 1;
Expand Down
Loading

0 comments on commit 7330fd9

Please sign in to comment.