Skip to content

Commit a039895

Browse files
committed
improves #79, probably
1 parent 77536e0 commit a039895

File tree

2 files changed

+40
-23
lines changed

2 files changed

+40
-23
lines changed

basics/schleifen.tex

Lines changed: 32 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -18,29 +18,41 @@
1818
Bedingung erfüllt ist. Wenn wir zum Beispiel testen wollen, ob eine Zahl eine
1919
Primzahl ist, wäre ein einfacher Algorithmus die so genannte Probedivision:
2020
Gehe von 2 aufwärts alle Zahlen (die kleiner sind, als die Eingabe) durch,
21-
teste, ob sie die Eingabe teilen -- wenn ja, dann handelt es sich nicht um eine
22-
Primzahl. Haben wir alle Zahlen durchprobiert ohne Erfolg, muss es sich um eine
23-
Primzahl handeln. Wir können das wieder in einem Kontrollflussdiagramm
24-
ausdrücken ($n$ ist dabei die zu testende Zahl, $i$ ist der Teiler, den wir
25-
gerade testen wollen):
21+
teste, ob sie die Eingabe teilen -- wenn ja, merken wir uns, dass die Zahl
22+
einen Teiler hat. Haben wir alle Zahlen durchprobiert handelt es sich um
23+
eine Primzahl genau dann, wenn wir keinen Teiler gefunden haben. Dafür
24+
benötigen wir einen neuen Datentyp nämlich \texttt{bool}, dieser hat genau
25+
zwei Zustände \texttt{true} und \texttt{false}. Damit können wir uns also
26+
merken, ob wir einen Teiler gefunden haben. Wir können die Probedivision wieder in einem Kontrollflussdiagramm ausdrücken ($n$ ist dabei die zu testende Zahl, $i$
27+
ist der Teiler, den wir gerade testen wollen und \texttt{hat\_teiler} gibt
28+
an, ob wir schon einen Teiler gefunden haben):
2629

2730
\begin{center}
2831
\begin{tikzpicture}[auto, node distance=3cm,>=latex']
29-
\tikzstyle{block} = [draw, fill=blue!20, rectangle, minimum height=3em, minimum width=6em]
30-
31-
\node [block] (start) {$i = 2$};
32-
\node [block, right of=start] (cond) {$i < n$?};
33-
\node [block, right of=cond, node distance=3.5cm] (if) {$i\mid n$?};
34-
\node [block, right of=if, node distance=4cm] (nope) {$n$ keine Primzahl};
35-
\node [block, below of=if, node distance=2cm] (incr) {$i \leftarrow i+1$};
36-
\node [block, above of=nope, node distance=2cm] (yipp) {$n$ Primzahl};
37-
38-
\draw [->] (start) -- node {} (cond);
39-
\draw [->] (cond) -- node {ja} (if);
40-
\draw [->] (cond) |- node [near end] {nein} (yipp);
41-
\draw [->] (if) -- node {ja} (nope);
42-
\draw [->] (if) -- node {nein} (incr);
43-
\draw [->] (incr) -| node {} (cond);
32+
\tikzstyle{block} = [draw, fill=blue!20, rectangle, minimum height=3em, minimum width=6em]
33+
\tikzstyle{border} = [very thick, dashed, red]
34+
35+
\node [block, align=center] (start) {$i = 2$ \\ \texttt{hat\_teiler} $=$ \texttt{false}};
36+
\node [block, right of=start, node distance=4cm] (cond) {$i < n$?};
37+
\node [block, right of=cond, node distance=3.5cm] (if) {$i\mid n$?};
38+
\node [block, right of=if, node distance=4cm] (teiler) {\texttt{hat\_teiler} $\leftarrow$ \texttt{true}};
39+
\node [block, above of=if, node distance=2cm] (incr) {$i \leftarrow i+1$};
40+
\node [block, below of=cond, node distance=3cm] (prim?) {\texttt{hat\_teiler}?};
41+
\node [block, below of=teiler, node distance=3cm] (yipp) {$n$ Primzahl};
42+
\node [block, below of=yipp, node distance=1.5cm] (nope) {$n$ keine Primzahl};
43+
44+
\draw [border] ($(cond) + (-1.5, 0)$) |- ($(if) + (0, -1)$) -| ($(teiler) + (2, 0)$) |- ($(incr) + (0, 1)$) -| cycle;
45+
\node [border] at ($(cond) + (-.8, 3.3)$) {Schleife};
46+
47+
\draw [->] (start) -- node {} (cond);
48+
\draw [->] (cond) -- node {ja} (if);
49+
\draw [->] (cond) -- node [near end] {nein} (prim?);
50+
\draw [->] (prim?) -- node {nein} (yipp);
51+
\draw [->] (if) -- node {ja} (teiler);
52+
\draw [->] (if) -- node {nein} (incr);
53+
\draw [->] (incr) -| node {} (cond);
54+
\draw [->] (teiler) |- (incr);
55+
\draw [->] (prim?) |- node [near end] {ja} (nope);
4456
\end{tikzpicture}
4557
\end{center}
4658
Das Besondere an Schleifen ist, dass sie geschlossene Kreise zum

files/prim.cpp

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,19 @@ int main() {
1414
}
1515

1616
int i = 2;
17+
bool hat_teiler = false;
1718
while (i < n) {
1819
if ((n % i) == 0) {
19-
std::cout << n << " ist keine Primzahl" << std::endl;
20-
return 0;
20+
hat_teiler = true;
2121
}
2222
i = i + 1;
2323
}
24-
std::cout << n << " ist eine Primzahl" << std::endl;
2524

25+
if (hat_teiler) {
26+
std::cout << n << " ist keine Primzahl" << std::endl;
27+
}
28+
else {
29+
std::cout << n << " ist eine Primzahl" << std::endl;
30+
}
2631
return 0;
2732
}

0 commit comments

Comments
 (0)