|
18 | 18 | Bedingung erfüllt ist. Wenn wir zum Beispiel testen wollen, ob eine Zahl eine |
19 | 19 | Primzahl ist, wäre ein einfacher Algorithmus die so genannte Probedivision: |
20 | 20 | 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): |
26 | 29 |
|
27 | 30 | \begin{center} |
28 | 31 | \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); |
44 | 56 | \end{tikzpicture} |
45 | 57 | \end{center} |
46 | 58 | Das Besondere an Schleifen ist, dass sie geschlossene Kreise zum |
|
0 commit comments