Skip to content

Commit 808d25a

Browse files
committed
initial commit. Structure has already been partially implemented in the
intro.tex files
1 parent 7330fd9 commit 808d25a

27 files changed

Lines changed: 2012 additions & 0 deletions

appendix/intro.tex

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
\chapter{Appendix}
2+
\pagestyle{empty}
3+
4+
5+
\pagestyle{fancy}
6+
\input{appendix/cheatsheet_shortcuts}
7+
\input{appendix/cheatsheet_shellcomands}
8+
\input{appendix/coding_style}
9+
\input{appendix/fehler_fehlermeldungen}
10+
11+
\clearpage
12+
\pagestyle{empty}
13+

lektionen/arith.tex

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
\lesson{Arithmetik}
2+
3+
Wir haben in der vergangenen Lektion Variablen vom Typ \texttt{std::string}
4+
kennengelernt. Zeichenketten zu speichern ist schon einmal ein guter Anfang,
5+
aber wir wollen auch rechnen können, wir brauchen also mehr Typen für
6+
Variablen.
7+
8+
\Cpp unterstützt eine Unmenge an Datentypen und hat auch die Möglichkeit,
9+
eigene zu definieren. Wir wollen uns hier nur mit den wichtigsten beschäftigen.
10+
11+
Fangen wir mit dem wohl meist genutzten Datentyp an: Einem \texttt{int}, oder
12+
\texttt{integer}. Dieser speichert eine ganze Zahl (mit bestimmten Grenzen, an
13+
die wir aber erst einmal nicht stossen werden, von daher ignorieren wir sie
14+
erst einmal frech). Mit \texttt{int}s können wir rechnen, das funktioniert in
15+
\Cpp mit ganz normalen Rechenausdrücken, wie wir sie aus der Schule kennen,
16+
plus den bereits angetroffenen Zuweisungen:
17+
18+
\inputcpp{arith1.cpp}
19+
20+
Wichtig ist hier, zu beachten, dass wir dem Computer ein in Reihenfolge
21+
abgearbeitetes Programm geben, keine Reihe von Aussagen. Das bedeutet in diesem
22+
konkreten Fall, dass wir z.B. nicht die Aussage treffen „\texttt{a} ist gleich
23+
7“, sondern dass wir sagen „lasse zuerst \texttt{a} den Wert 7 haben. Lasse
24+
dann \texttt{b} den Wert 19 haben. Lasse dann \texttt{c} den Wert haben, der
25+
heraus kommt, wenn man den Wert von \texttt{b} vom Wert von \texttt{a}
26+
abzieht“. Besonders deutlich wird dieser Unterschied bei einem Beispiel wie
27+
diesem:
28+
29+
\inputcpp{arith2.cpp}
30+
31+
\begin{praxis}
32+
\begin{enumerate}
33+
\item Was gibt dieses Programm aus? Überlegt es euch zuerst und kompiliert
34+
es dann, um es auszuprobieren.
35+
\end{enumerate}
36+
37+
Obwohl \texttt{a = a + 19} mathematisch überhaupt keinen Sinn ergibt, ist doch
38+
klar, was passiert, wenn man sich den Quellcode eben nicht als Reihe von
39+
Aussagen, sondern als Folge von \emph{Anweisungen} vorstellt. Das
40+
Gleichheitszeichen bedeutet dann nicht, dass beide Seiten gleich sein sollen,
41+
sondern dass der Wert auf der linken Seite den Wert auf der rechten Seite
42+
annehmen soll.
43+
44+
Wie wir in diesem Beispiel ausserdem sehen, können wir nicht nur Strings
45+
ausgeben, sondern auch Zahlen. \texttt{std::cout} gibt sie in einer Form aus,
46+
in der wir etwas damit anfangen können. Genauso können wir auch über
47+
\texttt{std::cin} Zahlen vom Benutzer entgegen nehmen:
48+
49+
\inputcpp{arith3.cpp}
50+
51+
Langsam aber sicher tasten wir uns an nützliche Programme heran!
52+
53+
\begin{enumerate}[resume]
54+
\item Schreibt ein Programm, welches von der Nutzerin zwei ganze Zahlen
55+
entgegen nimmt und anschließend Summe, Differenz, Produkt und Quotient
56+
ausspuckt.
57+
\item Was fällt auf, wenn ihr z.B. 19 und 7 eingebt?
58+
\item Findet heraus (Google ist euer Freund), wie man in \Cpp Division mit
59+
Rest durchführt und gebt diese zusätzlich zu den bisherigen Operationen
60+
mit aus\footnote{Falls ihr nicht weiterkommt, hilft euch vielleicht das
61+
Stichwort „modulo“ oder „modulo-operator“ weiter.}.
62+
\item Was passiert, wenn ihr als zweite Zahl eine 0 eingebt?
63+
\end{enumerate}
64+
\end{praxis}
65+
66+
\begin{spiel}
67+
\begin{enumerate}
68+
\item Findet heraus, was die größte positive (und was die kleinste
69+
negative) Zahl ist, die ihr in einem \texttt{int} speichern könnt.
70+
Faulpelze nutzen Google, Lernbegierige versuchen sie experimentell zu
71+
ermitteln. Was passiert, wenn ihr eine größere Zahl eingebt?
72+
\item Wir arbeiten bisher nur mit \texttt{int}s für ganze Zahlen. Wenn wir
73+
mit gebrochenen Zahlen rechnen wollen brauchen wir den Datentyp
74+
\texttt{double}. Schreibt euer Mini Rechenprogramm so um, dass es statt
75+
\texttt{int}s nur noch \texttt{double} benutzt und probiert es aus.
76+
Achtet darauf, dass es Dezimalpunkte und Dezimalkommata gibt, wenn ihr
77+
überraschende Ergebnisse erhaltet.
78+
\end{enumerate}
79+
\end{spiel}
80+
81+
\textbf{Quiz 7}\\
82+
\textit{Was passiert, wenn ihr \texttt{int} verwendet, aber eine Kommazahl eingebt?}
83+
\begin{enumerate}[label=\alph*)]
84+
\item Alles hinter dem Komma wird abgeschnitten
85+
\item Es tritt ein Fehler auf
86+
\item Das Programm kompiliert nicht
87+
\item statt \texttt{int} wird automatisch \texttt{double} genommen
88+
\end{enumerate}
89+

lektionen/arrays.tex

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
\lesson{\texttt{C}-Arrays}
2+
3+
Als nächstes wichtiges Konzept in \Cpp werden wir uns \emph{Arrays} anschauen.
4+
Arrays sind eine Möglichkeit, mehrere Elemente des gleichen Typs zusammen zu
5+
fassen. Statt also einer Stelle im Speicher, an der ein \texttt{int} liegt,
6+
habt ihr einen ganzen Speicherbereich, in dem 100 (oder eine beliebige andere
7+
Anzahl an) \texttt{int}s liegen.
8+
9+
Die Elemente in einem Array sind durchnummeriert, man nennt die Nummer eines
10+
Arrayelements seinen \emph{Index}. Das erste Element hat den Index 0, das
11+
zweite den Index 1 und das 100te hat den Index 99 -- Vorsicht also, der höchste
12+
Index in einem Array mit 100 Elementen ist 99, nicht 100! Um ein Array zu
13+
definieren, schreibt ihr hinter seinen Namen eine eckige Klammer auf, die
14+
Anzahl an Elementen, die es enthalten soll, und eine eckige Klammer zu. Auf ein
15+
bestimmtes Arrayelement zuzugreifen könnt ihr tun, indem ihr seinen Index in
16+
eckigen Klammern hinter den Namen schreibt. Folgendes Programm macht
17+
hoffentlich die Syntax klar:
18+
\inputcpp{array.cpp}
19+
20+
Es gibt einige Dinge, zu beachnten, wenn ihr mit Arrays arbeitet. Das
21+
wichtigste ist oben schon genannt -- sich davon verwirren zu lassen, dass
22+
Indizes bei 0 anfangen und aus Versehen über das Array hinaus schreiben oder
23+
lesen ist ein so häufiger Fehler, dass er seinen eigenen Namen bekommen hat:
24+
„Off-by-one error“. Wichtig ist, dass der Compiler diesen Zugriff nicht
25+
verhindern wird! Das ist von daher eine sehr fiese Sache, als dass dieser
26+
Fehler auch beim Ausführen nicht immer Probleme machen wird -- aber manchmal
27+
lässt er auch euer Programm spontan abstürzen in einem so genannten
28+
\emph{segmentation fault}.
29+
30+
Eine Limitation von Arrays, die ihr beachten solltet, ist, dass bereits zur
31+
Compilezeit fest stehen muss, wie viele Elemente sie enthalten sollen. Ihr
32+
könnt also z.B. nicht die Nutzerin fragen, wie viele Elemente in das Array
33+
passen soll, denn dies würde erst zur Laufzeit feststehen (wir werden später
34+
noch Wege um diese Limitation kennen lernen).
35+
36+
Ihr könnt auch Arrays von Arrays (so genannte zweidimensionale Arrays)
37+
erstellen, indem ihr zweimal in eckigen Klammern die Größe des Arrays
38+
hinschreibt. Die erste Größe gibt dann die Anzahl der Zeilen an, die zweite die
39+
Anzahl der Spalten. Auch beim Zugriff auf Arrayelemente müsst ihr dann zwei
40+
Indizes angeben. Wir werden dies später noch nutzen, hier sei erst einmal nur
41+
die generelle Möglichkeit genannt.
42+
43+
\textbf{Praxis:}
44+
Wir wollen die Seite \url{http://www.ich-kann-mich-nicht-entscheiden.de/}
45+
nachmachen und eine Entscheidungshilfe programmieren, die aus mehreren von der
46+
Nutzerin gegebenen Möglichkeiten eine per Zufall auswählt.
47+
48+
\begin{enumerate}
49+
\item Schreibt zunächst ein Programm, welches ein Array aus 10 Strings
50+
erstellt und die Nutzerin 10 mal nach einer Antwortmöglichkeit fragt
51+
und die gegebenen Antworten nacheinander in das Array schreibt.
52+
\item Fügt nun die Möglichkeit zu, weniger Antworten anzugeben. Dazu könnt
53+
ihr zum Beispiel zuerst fragen, wie viele Antwortmöglichkeiten es geben
54+
soll und dann so oft fragen (und natürlich einen Fehler ausgeben, wenn
55+
es mehr als 10 Antworten geben soll).
56+
\item Ihr könnt dann (so wie in dem Programm oben) eine Zufallszahl
57+
erzeugen. Um sicher zu gehen, dass sie nicht zu groß wird, könnt ihr
58+
den Rest bei Teilung durch Anzahl der eingegebenen Antworten nehmen
59+
(sind z.B. 7 Antworten angegeben und die Zufallszahl ist 25778, so wäre
60+
der resultierende Index \texttt{25778 \% 7 == 4}). Gebt dann die
61+
Antwortmöglichkeit aus, die dem zufallsgeneriertem Index
62+
entspricht.
63+
\end{enumerate}
64+
65+
Sollte euer Programm einmal nicht korrekt kompilieren, denkt daran die
66+
Fehlermeldung sorgfältig zu lesen, damit sie euch Aufschluss über die
67+
Fehlerursache gibt. Sollte euer Programm zwar kompilieren, sich dann aber
68+
komisch verhalten, denkt daran, den debugger zu benutzen und es Schritt für
69+
Schritt durchzugehen, um die Fehlerquelle zu finden. Solltet ihr trotz alledem
70+
nicht weiter kommen, oder nicht wissen, was von euch erwartet wird, fragt einen
71+
von uns.
72+
73+
\textbf{Spiel:}
74+
\begin{enumerate}
75+
\item Schreibt ein Progamm, welches ein Array beliebiger Größe erstellt und
76+
dann auf einen Index weit ausserhalb des erlaubten Bereichs schreibt.
77+
Was beobachtet ihr?\footnote{Es wird natürlich Quark sein was dabei
78+
rauskommt, es geht hier haupsächlich darum das ihr seht was für
79+
einen Fehler das gibt}
80+
\item Implementiert das \emph{Sieb des Eratosthenes}
81+
\footnote{\url{https://de.wikipedia.org/wiki/Sieb_des_Eratosthenes}},
82+
wenn ihr noch nicht ausgelastet seid.
83+
Denkt daran, es initial zu befüllen und denkt euch eine clevere
84+
Möglichkeit aus, das „Streichen“ zu realisieren.
85+
\end{enumerate}

lektionen/compiling.tex

Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
\lesson{Preprocessing, Compiler, Assembler, Linker}
2+
3+
In der letzten Lektion klang es bereits an -- was der Befehl \texttt{g++}
4+
eigentlich tut, ist mehr, als nur Kompilieren im strengen Sinne des Wortes. Wir
5+
wollen jetzt kurz erkunden, welche anderen Schritte in den Prozess vom
6+
Quellcode in die ausführbare Datei notwendig sind und wie sie geschehen. Das
7+
ist im Alltag nicht sehr wichtig, kann uns aber helfen, einige Fehlermeldungen
8+
besser zu verstehen. Von daher müsst ihr auch nicht alles hier beschriebene
9+
vollständig verstehen.
10+
11+
In Lektion 1 haben wir vereinfacht dargestellt, dass der Compiler eine
12+
Quelltextdatei mit der Endung \texttt{.cpp} nimmt und daraus direkt eine
13+
ausführbare Datei erstellt. Die Schritte, die hier eigentlich in einem Befehl
14+
durchgeführt werden, aber zu trennen sind, sind das \emph{Preprocessing}, das \emph{Kompilieren}, das
15+
\emph{Assemblieren} und das \emph{Linken}.
16+
17+
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.
18+
19+
Das Kompilieren übersetzt unseren \Cpp-Code in eine Zwischenform, so genannten
20+
\emph{Assembler}. In Lektion 1 haben wir den Maschinencode angesprochen, in der
21+
Befehle und Parameter an Befehle in 1en und 0en dargestellt werden. Assembler
22+
ist quasi die nächst höhere Evolutionsstufe -- statt die Befehle binär zu
23+
kodieren, gibt es für jeden Befehl ein so genanten \emph{mnemonic}, also ein
24+
merkbares kurzes Wort. Ein Befehl ist allerdings deutlich weniger mächtig, als
25+
z.B. eine Anweisung in \Cpp. Früher wurden ganze Betriebssysteme in Assembler
26+
geschrieben, da es einfach nichts Besseres gab, heutzutage ist Assembler bis
27+
auf die exotischsten Anwendungsfelder eigentlich ausgestorben, da es viel zu
28+
anstrengend und Fehleranfällig ist. Der Compiler tut aber noch mehr, als
29+
einfach nur in diese Zwischensprache zu übersetzen -- er führt auch
30+
\emph{Optimierungen} durch, d.h. er sortiert Anweisungen um, damit der Code
31+
schneller läuft, aber das Gleiche tut. Dieser Prozess ist sehr umständlich,
32+
aber heutige Compiler sind tatsächlich so gut im Optimieren, dass sie meistens
33+
deutlich schnelleren Code erzeugen, als ein Mensch es je könnte.
34+
35+
Der nächste Schritt ist dann das Assemblieren. Das übersetzt den Assembler des
36+
ersten Schrittes tatsächlich in Maschinensprache (genauer: In ein Dateiformat,
37+
welches ELF heißt, welches dann die Maschinensprache plus einiger
38+
Meta-Informationen enthält). Der Assembler erzeugt so genannte
39+
\emph{Objectfiles}, die meistens die Endung \texttt{.o} haben (und im
40+
ELF-Format sind). Ein Objectfile enthält dann mehrere Funktionen (in
41+
Maschinencode) und Variablen, die es \emph{exportieren} kann, d.h. Funktionen
42+
anderer Objectfiles die dagegen (im nächsten Schritt) gelinkt werden, können
43+
diese Variablen und Funktionen sehen. Der Vorteil, diesen Schritt vom
44+
vorhergehenden zu trennen ist, dass wir wenn wir wollen auch nur kompilieren
45+
können und den resultierenden Assembler betrachten -- das kann uns helfen,
46+
Engpässe in unserem Code, an denen der Compiler nicht hinreichend gut optimiert
47+
zu erkennen und möglicherweise zu verbessern. z.B. in der Spielentwicklung ist
48+
sehr schnell laufender Code wichtig.
49+
50+
Der letzte Schritt ist das Linken. Hier werden mehrere Objectfiles genommen und
51+
miteinander verbunden, zu einer ausführbaren Datei. Wenn in einer der
52+
Objectfiles eine \texttt{main}-Funktion existiert, wird diese als
53+
Eintrittspunkt für das Programm genommen, sonst gibt es einen
54+
\emph{Linkerfehler}. Ein Linkerfehler tritt auch auf, wenn wir versuchen, eine
55+
Funktion zu verwenden, die es nicht gibt (z.B. indem wir sie mittels
56+
\texttt{extern} deklarieren, ohne später das relevante Objectfile mit
57+
anzugeben). Linkerfehler deuten also darauf hin, dass wir vergessen haben, alle
58+
relevanten Dateien auf der Kommandozeile anzugeben, oder dass eine
59+
\texttt{main}-Funktion fehlt, oder dass wir in mehren Dateien eine Funktion
60+
gleichen Namens haben, oder\dots
61+
62+
Um das Diagramm aus der ersten Lektion zu ergänzen, dies ist der Weg, den euer
63+
Programm durch die verschiedenen Phasen geht:
64+
65+
\begin{tikzpicture}
66+
\tikzstyle{block} = [ shape=rectangle, rounded corners = 0.1cm, draw=black, inner xsep=0.5cm, inner ysep = 0.3cm ];
67+
\tikzstyle{arr} = [ ->, thick, shorten >= 2pt, shorten <= 2pt ];
68+
69+
\node (nHelloWorldCpp) [block] {\texttt{helloworld.cpp}};
70+
\node (nHelloWorldS) [block, right of = nHelloWorldCpp, node distance = 12cm] {\texttt{helloworld.S}};
71+
\draw [arr] (nHelloWorldCpp) -- (nHelloWorldS) node [midway,above,font=\small] {\texttt{g++ -S -o helloworld.S helloworld.cpp}};
72+
\node (nHelloWorldO) [block, below of = nHelloWorldCpp, node distance = 2cm] {\texttt{helloworld.o}};
73+
\draw [arr] (nHelloWorldS) -- (nHelloWorldO) node [pos=0.56,above,sloped,font=\small] {\texttt{g++ -c -o helloworld.o helloworld.S}};
74+
\node (nAnderesO) [block, below of = nHelloWorldO, node distance = 1cm] {\texttt{anderes.o}};
75+
\node (nHelloWorld) [block, below of = nHelloWorldS, node distance = 2cm] {\texttt{helloworld}};
76+
\draw [arr] (nHelloWorldO) -- (nHelloWorld) node [midway,below,font=\small] {\texttt{g++ -o helloworld helloworld.o anderes.o}};
77+
\draw [arr] (nAnderesO) -| (nHelloWorld) node {};
78+
\end{tikzpicture}
79+
80+
Der bisherige Befehl, den wir zum Kompilieren benutzt haben, ist tatsächlich
81+
nur ein Spezialfall von diesem: Geben wir nämlich auf der Kommandozeile eine
82+
input-Datei an, so rät \texttt{g++} anhand der Dateierweiterung und der
83+
Parameter, was wir damit tun wollen. Er führt dann alle Schritte, um von
84+
unserer input-Datei zu der gewünschten zu kommen automatisch aus, wenn wir also
85+
\texttt{g++ -o helloworld helloworld.cpp} eingeben, dann weiß der Compiler,
86+
dass wir eine ausführbare Datei wünschen (da wir weder \texttt{-c} noch
87+
\texttt{-S} angegeben haben) und dass er dafür kompilieren, assemblieren und
88+
linken muss (da wir ihm eine \texttt{.cpp} Datei gegeben haben). Genauso konnte
89+
er in der vorigen Lektion raten, dass \texttt{g++ -o tictactoe tictactoe.cpp
90+
tictactoe.o} heißt, dass wir eine ausführbare Datei wollen, die aus einem
91+
kompilierten und assemblierten \texttt{tictactoe.cpp} zusammen gelinkt mit
92+
\texttt{tictactoe.o} bestehen soll.
93+
94+
\begin{praxis}
95+
\begin{enumerate}
96+
\item \texttt{assemble.cpp} enthält ein kleines (ziemlich nutzloses)
97+
Programm, welches zwei Zahlen addiert und das Ergebnis ausgibt.
98+
Kompiliert es (nun nur der erste Schritt in dem Diagramm, nicht so, wie
99+
in den vergangenen Lektionen) und schaut euch das resultierende
100+
\texttt{.S}-file in einem Editor an. Ihr müsst nicht verstehen,
101+
was genau hier überall passiert, aber vielleicht findet ihr ja die
102+
\texttt{main}-Funktion, die Definition der Variablen und die Addition?
103+
104+
Wir können nun mal Optimierung anschalten -- gebt dazu zusätzlich den
105+
Parameter \texttt{-O3} direkt nach dem \texttt{g++} an. Schaut euch das
106+
\texttt{.S}-file nun wieder im Editor an. Was fällt euch
107+
(im Vergleich zu vorher) auf?
108+
\item Assembliert eines der im vorigen Schritt erzeugten \texttt{.S} files
109+
in ein \texttt{.o}-File.
110+
\item Benennt in einem eurer bisherigen Programme die
111+
\texttt{main}-Funktion um und versucht, es zu kompilieren (wie in den
112+
bisherigen Lektionen, also alle Schritte auf einmal). Schaut euch die
113+
resultierenden Fehlermeldungen an. Wo wird euch der Linkerfehler
114+
ausgegeben?
115+
\item Macht die Umbenennung wieder rückgängig und kompiliert das Programm
116+
erneut -- übergebt aber dieses mal den Quellcode doppelt (also z.B.
117+
\texttt{g++ -o helloworld helloworld.cpp helloworld.cpp}). Was
118+
beobachtet ihr? Könnt ihr die Beobachtung erklären?
119+
\end{enumerate}
120+
121+
\inputcpp{assemble.cpp}
122+
\end{praxis}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
\setcounter{chapter}{-1}
2+
\chapter{Vorbereitung eigener Computer}
3+
\pagestyle{empty}
4+
Dieses Kapitel dient der Vorbereitung privater Computer, um daran den Kurs zu bearbeiten.
5+
Wir werden in diesem Fall den proprietären Editor „Visual Studio Code“ verwenden, welcher \href{https://code.visualstudio.com/Download}{hier} heruntergeladen werden kann.\\
6+
7+
\pagestyle{fancy}
8+
\input{eigene_computer/windows.tex}
9+
\input{eigene_computer/macos.tex}
10+
\input{eigene_computer/linux.tex}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
\textbf{Linux}
2+
3+
\pagestyle{empty}
4+
5+
Falls ihr privat bereits ein Linux-System nutzt.
6+
\begin{enumerate}
7+
\item Optional: Alternativ zu Visual Studio Code, könnt ihr auch eine Quelloffene Version des Editors verwenden.
8+
Da die Installation dieser Version je nach Distribution variiert, verweisen wir euch an dieser Stelle an eine kurze Internetrecherche.
9+
\item Installiert mit eurem Packagemanager \texttt{g++} und ggf. \texttt{unzip}, sowie \texttt{wget}.
10+
\item Das Archiv mit den Vorkursdateien könnt ihr mit \\
11+
\texttt{wget https://mathphys.info/vorkurs/pvk/vorkurs.zip} herunterladen.
12+
\item Mit \texttt{unzip vorkurs.zip} könnt ihr dieses entpacken.
13+
\end{enumerate}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
\textbf{MacOS}
2+
3+
\pagestyle{empty}
4+
5+
Das Setup unter MacOS ist im Vergleich zu Windows recht einfach.
6+
7+
\begin{enumerate}
8+
\item Öffnet ein Terminal.
9+
\item Tippt \texttt{g++} ein.
10+
\item Bestätigt in dem erscheinenden Fenster die Installation.
11+
\item Die Dateien des Vorkurses können \href{https://mathphys.info/vorkurs/pvk/vorkurs.zip}{hier} heruntergeladen werden.
12+
\item Entpackt die Dateien in ein Verzeichnis eurer Wahl.
13+
\item In Visual Studio Code könnt ihr dann über den Explorer auf die Dateien des Kurses zugreifen.
14+
\end{enumerate}

0 commit comments

Comments
 (0)