Skip to content

Commit 7a6c2e3

Browse files
authored
Vektor (#67)
* nun std::vector<int> statt int * * datei heis nun wie es sollte vector.cpp * variablen name `einarray` -> `einvector` * bindet nun korreckte Quelldatei (vector.cpp) ein * vergessenes leerzeichen eingefügt * nun auch .size() und zuweisung über [Index] * alles zu von array zu std::vector geändert * datei namen von arrays zu vektoren geändert um inhalt wieder zu spiegeln * datei namen änderungen bedacht * tictactoe verwendet nun vector (und hat ein #pragma once) * nun mit vector * sätze verbessert * übersehene Array zu Vektor geändert
1 parent a07a49d commit 7a6c2e3

11 files changed

Lines changed: 154 additions & 177 deletions

File tree

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ dir: files/*
4343
@cp files/fizzbuzz.cpp vorkurs/lektion12/. > /dev/null
4444
@cp files/funktion.cpp vorkurs/lektion13/. > /dev/null
4545
@cp files/namespaces.cpp vorkurs/lektion14/. > /dev/null
46-
@cp files/array.cpp vorkurs/lektion15/. > /dev/null
46+
@cp files/vector.cpp vorkurs/lektion15/. > /dev/null
4747
@cp files/warnings.cpp vorkurs/lektion16/. > /dev/null
4848
@cp files/warnprim.cpp vorkurs/lektion16/. > /dev/null
4949
@cp files//zaehlen.cpp vorkurs/lektion16/. > /dev/null

basics/arrays.tex

Lines changed: 0 additions & 85 deletions
This file was deleted.

basics/intro.tex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ \chapter*{Die Basics}
2424
\input{basics/style}
2525
\input{basics/funktionen}
2626
\input{basics/stdbib}
27-
\input{basics/arrays}
27+
\input{basics/vektoren}
2828
\input{basics/warning}
2929
\input{basics/tictactoe1}
3030
\input{basics/linker}

basics/tictactoe1.tex

Lines changed: 41 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
11
\lesson{Tic Tac Toe - Teil 1}
22

3-
Nachdem wir jetzt lange dröge und unspannende -- und zum Teil einfach
4-
un\emph{sinnige} -- Lektionen und Beispiele hatten, wollen wir uns als Ende von
3+
Nachdem wir jetzt lange dröge und unspannende Lektionen und Beispiele hatten, wollen wir uns als Ende von
54
Kapitel 1 einer ein wenig spannenderen Aufgabe widmen -- wir wollen ein
65
einfaches Spiel programmieren. Wir haben dazu Tic Tac Toe ausgewählt, da es
76
relativ überschaubare Spiellogik besitzt. Ein- und Ausgabe, werden wir über die
87
Konsole machen.
98

109
In \texttt{vorkurs/lektion17} findet ihr eine Datei \texttt{tictactoe.o}. Diese
11-
könnt ihr nicht in eurem Editor öffnen - sie enthält von uns bereitgestellte,
10+
könnt ihr nicht in eurem Editor öffnen -- sie enthält von uns bereitgestellte,
1211
bereits vorkompilierte Funktionen, die ihr nutzen könnt, um einen Anfang zu
1312
haben. Wir werden sie später Stück für Stück ersetzen.
1413

@@ -26,75 +25,58 @@
2625

2726
\texttt{tictactoe.o} definiert euch insgesamt folgende Funktionen:
2827
\begin{description}
29-
\item[frage\_feld\_nummer]
30-
Nimmt ein Array von \texttt{int}s der Länge 9 entgegen und gibt einen
31-
\texttt{int} zurück.
28+
\item[frage\_feld\_nummer]
29+
Nimmt einen Vektor mit 9 \texttt{int}s entgegen und gibt einen \texttt{int} zurück.
3230

33-
Gibt auf der Konsole eine Frage nach der Feldnummer aus
34-
(durchnummeriert von 0 bis 8), liest eine Feldnummer von der Nutzerin
35-
ein und gibt diese zurück. Die Funktion stellt sicher, dass die
36-
Feldnummer zwischen 0 und 8 liegt und dass das Feld noch nicht besetzt
37-
ist (sonst wird noch einmal nachgefragt).
38-
\item[gebe\_feld\_aus]
39-
Nimmt ein Array von \texttt{int}s der Länge 9 entgegen und hat als
40-
Rückgabetyp \texttt{void} (was für „keine Rückgabe“ steht).
31+
Gibt auf der Konsole eine Frage nach der Feldnummer aus (durchnummeriert von 0 bis 8), liest eine Feldnummer von der Nutzerin ein und gibt diese zurück.
32+
Die Funktion stellt sicher, dass die Feldnummer zwischen 0 und 8 liegt und dass das Feld noch nicht besetzt ist (sonst wird noch einmal nachgefragt).
33+
\item[gebe\_feld\_aus]
34+
Nimmt einen Vektor mit 9 \texttt{int}s entgegen und hat als Rückgabetyp \texttt{void} (was für „keine Rückgabe“ steht).
4135

42-
Gibt das gegebene Feld auf der Konsole aus. Dabei werden die 9 Felder
43-
von oben links nach unten rechts von 0 beginnend durchnummeriert. Das
44-
9-elementige Array stellt also das Feld dar. Eine 0 in einem
45-
Arrayelement bedeutet, dass das Feld leer ist, eine 1 bedeutet, dass
46-
sich dort ein Kreuz befindet und eine 2 bedeutet, dass sich ein O dort
47-
befindet. Andere Werte werden mit einem \texttt{?} dargestellt.
48-
\item[gewinnerin]
49-
Nimmt ein Array von \texttt{int}s der Länge 9 entgegen und hat als
50-
Rückgabetyp \texttt{int}.
36+
Gibt das gegebene Feld auf der Konsole aus. Dabei werden die 9 Felder von oben links nach unten rechts von 0 beginnend durchnummeriert.
37+
Der 9-elementige Vektor stellt also das Feld dar.
38+
Eine 0 in einem Vektorelement bedeutet, dass das Feld leer ist, eine 1 bedeutet, dass sich dort ein \textbf{X} befindet und eine 2 bedeutet, dass sich ein \textbf{O} dort befindet.
39+
Andere Werte werden mit einem \textbf{?} dargestellt.
40+
\item[gewinnerin]
41+
Nimmt einen Vektor mit 9 \texttt{int}s entgegen und hat als Rückgabetyp \texttt{int}.
5142

52-
Prüft, ob in diesem Zustand des Feldes bereits eine der Spielerinnen
53-
gewonnen hat. Die Funktion gibt 0 zurück, wenn noch niemand gewonnen
54-
hat, 1, wenn die Spielerin X gewonnen hat und 2, wenn die Spielerin O
55-
gewonnen hat. Sollte das Spiel unentschieden ausgegangen sein, wird
56-
eine 3 zurück gegeben.
43+
Prüft, ob in diesem Zustand des Feldes bereits eine der Spielerinnen gewonnen hat.
44+
Die Funktion gibt 0 zurück, wenn noch niemand gewonnen hat, 1, wenn die Spielerin \textbf{X} gewonnen hat und 2, wenn die Spielerin \textbf{O} gewonnen hat.
45+
Sollte das Spiel unentschieden ausgegangen sein, wird eine 3 zurück gegeben.
5746
\end{description}
5847

59-
Der zweite Teil, den ihr zur Benutzung der Funktionen braucht ist das Linken
60-
(was genau das bedeutet, wird später noch erklärt). Dies ist fürs Erste sehr
61-
einfach: Ihr gebt einfach dem \texttt{g++} Befehl zusätzlich zu eurer
62-
\texttt{.cpp} Datei noch \texttt{tictactoe.o} als zusätzliche Inputdatei an.
48+
Der zweite Teil, den ihr zur Benutzung der Funktionen braucht ist das Linken (was genau das bedeutet, wird später noch erklärt).
49+
Dies ist fürs Erste sehr einfach: Ihr gebt einfach dem \texttt{g++} Befehl zusätzlich zu eurer \texttt{.cpp} Datei noch \texttt{tictactoe.o} als zusätzliche Inputdatei an.
6350

6451
\inputcpp{tictactoe.cpp}
6552

6653
\textbf{Praxis:}
6754
\begin{enumerate}
68-
\item Ergänzt \texttt{tictactoe.cpp} um Deklarationen für die anderen
69-
beschriebenen Funktionen aus \texttt{tictactoe.o}. Ein Array als
70-
Parameter könnt ihr in genau der gleichen Notation angeben, wie ihr es
71-
euch in einer Funktion als Variable definieren würdet.
72-
\item Das Grundgerüst eines Spiels ist die \emph{input-update-display}-loop.
73-
Dies ist eine Endlosschleife, in der zunächst der \emph{input} der
74-
Spielerin abgefragt wird. Anschließend wird der interne Spielzustand
75-
aktualisiert (\emph{update}). Zuletzt wird der neue Spielzustand
76-
angezeigt (\emph{display}). Der anfängliche Spielzustand wird vor
77-
dieser loop hergestellt (\emph{setup}).
55+
\item
56+
Ergänzt \texttt{tictactoe.cpp} um Deklarationen für die anderen beschriebenen Funktionen aus \texttt{tictactoe.o}.
57+
Einen Vektor als Parameter könnt ihr in genau der gleichen Notation angeben, wie ihr es euch in einer Funktion als Variable definieren würdet.
58+
\item
59+
Das Grundgerüst eines Spiels ist die \emph{input-update-display}-loop.
60+
Dies ist eine Endlosschleife, in der zunächst der \emph{input} der Spielerin abgefragt wird.
61+
Anschließend wird der interne Spielzustand aktualisiert (\emph{update}).
62+
Zuletzt wird der neue Spielzustand angezeigt (\emph{display}).
63+
Der anfängliche Spielzustand wird vor dieser loop hergestellt (\emph{setup}).
7864

79-
\texttt{tictactoe.cpp} zeigt dieses Grundgerüst. Ergänzt den input- und
80-
den display-Teil mithilfe der gegebenen Funktionen. Ergänzt auch den
81-
setup-Teil; ihr braucht für den Spielzustand einerseits das Array,
82-
welches das Spielfeld fassen soll, andererseits eine Variable für die
83-
Spielerin, die gerade am Zug ist und eine Variable, die das im
84-
aktuellen Zug eingegebene Feld speichert. Vergesst auch nicht, dass ihr
85-
das Feld zu Beginn mit 0en vollschreiben müsst, um es zu
86-
initialisieren.
87-
\item Nun müssen wir noch den Update-Teil ergänzen. Hier solltet ihr in das
88-
von der aktuellen Spielerin gewählte Feld mit deren Nummer füllen,
89-
testen, ob jemand gewonnen hat und wenn ja, die Siegerin ausgeben und
90-
euer Programm beenden (denkt daran, dass das Spiel auch unentschieden
91-
ausgehen kann). Sonst sollte die aktuelle Spielerin gewechselt werden.
65+
\texttt{tictactoe.cpp} zeigt dieses Grundgerüst.
66+
Ergänzt den input- und den display-Teil mithilfe der gegebenen Funktionen.
67+
Ergänzt auch den setup-Teil; ihr braucht für den Spielzustand einerseits den Vektor, welcher das Spielfeld fassen soll, andererseits eine Variable für die Spielerin, die gerade am Zug ist und eine Variable, die das im aktuellen Zug eingegebene Feld speichert.
68+
Vergesst auch nicht, dass ihr das Feld zu Beginn 9 0en enhalten muss.
69+
\item
70+
Nun müssen wir noch den Update-Teil ergänzen.
71+
Hier solltet ihr in das von der aktuellen Spielerin gewählte Feld mit deren Nummer füllen, testen, ob jemand gewonnen hat und wenn ja, die Siegerin ausgeben und euer Programm beenden (denkt daran, dass das Spiel auch unentschieden ausgehen kann).
72+
Sonst sollte die aktuelle Spielerin gewechselt werden.
9273
\end{enumerate}
9374

9475
\textbf{Spiel:}
9576
\begin{enumerate}
96-
\item Okay, das ist nun wirklich nicht schwierig zu erraten oder? Wenn ihr
97-
dem obigen Rezept gefolgt seid, habt ihr jetzt ein funktionierendes
98-
Tic-Tac-Toe Spiel. Und ihr habt eine Sitznachbarin. Zählt eins und eins
99-
zusammen.
77+
\item
78+
Okay, das ist nun wirklich nicht schwierig zu erraten oder?
79+
Wenn ihr dem obigen Rezept gefolgt seid, habt ihr jetzt ein funktionierendes Tic-Tac-Toe Spiel.
80+
Und ihr habt eine Sitznachbarin.
81+
Zählt eins und eins zusammen.
10082
\end{enumerate}

basics/vektoren.tex

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
\lesson{Vektor}
2+
3+
Als nächstes wichtiges Konzept in \Cpp werden wir uns \emph{Vektoren} anschauen.
4+
Vektoren sind eine Möglichkeit, mehrere Elemente des gleichen Typs zusammen zu fassen.
5+
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.
6+
7+
Die Elemente in einem Vektor sind durchnummeriert, man nennt die Nummer eines Vektorelements seinen \emph{Index}.
8+
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!
9+
Um einen Vektor zu definieren, schreibt ihr:
10+
\begin{center}
11+
\cppinline{std::vector<}\emph{Datentyp}\cppinline{> einvektor;}
12+
\end{center}
13+
um den Datentypen schreibt ihr also noch \cppinline{std::vector<}\dots\cppinline{>}.
14+
Um ein Element am Ende einzufügen gibt es
15+
\begin{center}
16+
\cppinline{einvektor.push_back(}\emph{Element}\cppinline{);}
17+
\end{center}
18+
und auf ein bestimmtes Vektorelement zugreifen könnt ihr indem ihr seinen Index in eckigen Klammern hinter den Namen schreibt.
19+
\begin{center}
20+
\cppinline{einvektor[}\emph{Index}\cppinline{]}
21+
\end{center}
22+
Wenn ihr die Größe eines Vektors wissen wollt könnt ihr
23+
\begin{center}
24+
\cppinline{einvektor.size()}
25+
\end{center}
26+
verwenden.
27+
28+
Folgendes Programm macht hoffentlich die Syntax klar:
29+
30+
\inputcpp{vector.cpp}
31+
32+
Es gibt einige Dinge, zu beachten, wenn ihr mit Vektoren arbeitet.
33+
Das wichtigste ist oben schon genannt -- lasst euch nicht davon verwirren, dass Indizes bei 0 anfangen.
34+
Aus Versehen über das Array hinaus zu schreiben oder zu lesen ist ein so häufiger Fehler, dass er seinen eigenen Namen bekommen hat: \emph{Off-by-one} error.
35+
Wichtig ist, dass der Compiler diesen Zugriff nicht verhindern wird!
36+
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}.
37+
38+
\textbf{Praxis:}
39+
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.
40+
41+
\begin{enumerate}
42+
\item
43+
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 das Array schreibt.
44+
\item
45+
Fügt nun die Möglichkeit zu, weniger Antworten anzugeben.
46+
Dazu könnt ihr zum Beispiel zuerst fragen, wie viele Antwortmöglichkeiten es geben soll und dann so oft fragen.
47+
\item
48+
Ihr könnt dann (so wie in dem Programm oben) eine Zufallszahl erzeugen.
49+
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}).
50+
Gebt dann die Antwortmöglichkeit aus, die dem zufallsgeneriertem Index entspricht.
51+
\end{enumerate}
52+
53+
Sollte euer Programm einmal nicht korrekt kompilieren, denkt daran die Fehlermeldung sorgfältig zu lesen, damit sie euch Aufschluss über die Fehlerursache gibt.
54+
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
55+
von uns.
56+
57+
\textbf{Spiel:}
58+
\begin{enumerate}
59+
\item
60+
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.
61+
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}
62+
\item
63+
Implementiert das \emph{Sieb des Eratosthenes}\footnote{\url{https://de.wikipedia.org/wiki/Sieb_des_Eratosthenes}}, wenn ihr noch nicht ausgelastet seid.
64+
Denkt daran, es initial zu befüllen und denkt euch eine clevere Möglichkeit aus, das „Streichen“ zu realisieren.
65+
\end{enumerate}

files/array.cpp

Lines changed: 0 additions & 21 deletions
This file was deleted.

files/tictactoe.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#include <iostream>
2+
#include <vector>
23

3-
extern int frage_feld_nummer(int feld[9]);
4+
extern int frage_feld_nummer(std::vector<int> feld);
45
// Fügt hier die anderen Funktionen ein
56

67
int main() {

files/ttt_closed/frage_feld_nummer.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1+
#pragma once
12
#include <iostream>
3+
#include <vector>
24

3-
int frage_feld_nummer(int feld[9]) {
5+
int frage_feld_nummer(std::vector<int> feld) {
46
int in = -1;
57
while (true) {
68
std::cout << "Gib ein Feld ein (0-8): ";

files/ttt_closed/gebe_feld_aus.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1+
#pragma once
12
#include <iostream>
23
#include <string>
4+
#include <vector>
35

46
static std::string fts(int feld) {
57
switch (feld) {
@@ -14,7 +16,7 @@ static std::string fts(int feld) {
1416
}
1517
}
1618

17-
void gebe_feld_aus(int feld[9]) {
19+
void gebe_feld_aus(std::vector<int> feld) {
1820
std::cout << " | | " << std::endl;
1921
std::cout << " " << fts(feld[0]) << " | " << fts(feld[1]) << " | " << fts(feld[2]) << " " << std::endl;
2022
std::cout << " | | " << std::endl;

0 commit comments

Comments
 (0)