Strukturiertes Programmierdiagramm von Jackson (Formatieren eines Baumdiagramms)

Strukturiertes Programmierdiagramm von Jackson (Formatieren eines Baumdiagramms)

Ich versuche eineStrukturierte Programmierung nach JacksonDiagramm. Dies ist im Grunde ein einfaches Baumdiagramm mit der Ausnahme, dass die Kästen in der oberen rechten Ecke entweder einen Kreis (O) oder einen Stern (*) haben können. Ich verwende die TikZ-Bibliothek für das Diagramm, weiß aber nicht, wie ich die Stile erweitern kann, um dies zu erreichen. Hier ist das unfertige Diagramm:

\documentclass{minimal}
\usepackage[a4paper,margin=1cm,landscape]{geometry}
\usepackage{tikz}
\usetikzlibrary{positioning,shadows,arrows}

\begin{document}
\begin{center}
\begin{tikzpicture}[
    box/.style={rectangle, draw=red!50!black!50, rounded corners=1mm, fill=blue, drop shadow, minimum width=5em, minimum height=3em, level distance=10cm,
        text centered, anchor=north, text=white},
    circle/.style={rectangle, draw=red!50!black!50, rounded corners=1mm, fill=blue, drop shadow, minimum width=5em, minimum height=3em, level distance=10cm,
        text centered, anchor=north, text=white},
    %SHOULD CONTAIN THE CIRCLES
    star/.style={rectangle, draw=red!50!black!50, rounded corners=1mm, fill=blue, drop shadow, minimum width=5em, minimum height=3em, level distance=10cm,
        text centered, anchor=north, text=white},
     %SHOULD CONTAIN THE STARS       
]
\node (State00) [box] {Jackson Diagramm}
 [sibling distance=3cm]
    child {node (a) [box] {int a = 1}}
    child {node (a) [box] {boolean n = true}}
    child {node (a) [box] {boolean z = true}}
    child {[sibling distance=4cm] node (d) [circle] {if (n)}
        child{  [sibling distance=3cm] node (e) [star] {while (z)}
        child {node (f) [box] {n = !z}}
        child {node (g) [box] {a++}}
        child { [sibling distance=4cm] node (h) [circle] {a <= 10}
                child {node (i) [box] {z = true}}
                child {node (j) [box] {System.out.println( "z\(>\)10")}}
            }
        }
        child {node (k) [box] {System.out.println(a)}} 
        child {node (l) [box] {System.out.println(z)}}      
    } 
;
\end{tikzpicture}
\end{center}
\end{document}

Aktueller Output:

Bildbeschreibung hier eingeben

Antwort1

Mit können Sie label={[xshift=-1.25em, yshift=-2.25ex]north east:$\ast$}zusätzliche Grafiken innerhalb des Knotens platzieren:

Bildbeschreibung hier eingeben

Anmerkungen:

  • Ich habe die Farben geändert, damit man leichter erkennen kann, wo sich die speziellen Knoten befinden.

Code:

\documentclass{minimal}
\usepackage[a4paper,margin=1cm,landscape]{geometry}
\usepackage{tikz}
\usetikzlibrary{positioning,shadows,arrows}

\begin{document}
\begin{center}
\begin{tikzpicture}[
    box/.style={rectangle, draw=red!50!black!50, rounded corners=1mm, fill=blue!25, drop shadow, minimum width=5em, minimum height=3em, level distance=10cm,
        text centered, anchor=north, text=white},
    circle/.style={rectangle, draw=red!50!black!50, rounded corners=1mm, fill=green!25, drop shadow, minimum width=5em, minimum height=3em, level distance=10cm,
        text centered, anchor=north, text=black, label={[xshift=-1.25em, yshift=-2.25ex]north east:$\circ$}},
    %SHOULD CONTAIN THE CIRCLES
    star/.style={rectangle, draw=red!50!black!50, rounded corners=1mm, fill=red!25, drop shadow, minimum width=5em, minimum height=3em, level distance=10cm,
        text centered, anchor=north, text=black, label={[xshift=-1.25em, yshift=-2.25ex]north east:$\ast$}},
     %SHOULD CONTAIN THE STARS       
]
\node (State00) [box] {Jackson Diagramm}
 [sibling distance=3cm]
    child {node (a) [box] {int a = 1}}
    child {node (a) [box] {boolean n = true}}
    child {node (a) [box] {boolean z = true}}
    child {[sibling distance=4cm] node (d) [circle] {if (n)}
        child{  [sibling distance=3cm] node (e) [star] {while (z)}
        child {node (f) [box] {n = !z}}
        child {node (g) [box] {a++}}
        child { [sibling distance=4cm] node (h) [circle] {a <= 10}
                child {node (i) [box] {z = true}}
                child {node (j) [box] {System.out.println( "z\(>\)10")}}
            }
        }
        child {node (k) [box] {System.out.println(a)}} 
        child {node (l) [box] {System.out.println(z)}}      
    } 
;
\end{tikzpicture}
\end{center}
\end{document}

Antwort2

Hier ist ein anderer Ansatz, nämlich der path pictureSchlüssel und der path picture bounding boxPseudoknoten.

Ich habe die Stildefinitionen bereinigt und insbesondere den circleStil umbenannt, da bereits eine Form vorhanden ist circle, die zu Verwirrung führen könnte.

Ich habe den Kreis direkt in die abgerundete Ecke gesetzt (Sie können die Verschiebung natürlich anpassen, um ihn weiter in die Mitte des Knotens zu verschieben).

Der starredStil akzeptiert ein optionales Argument (Standard: 5), das die Anzahl der Ecken angibt. Der Radius für die äußeren Ecken beträgt 1mm, für die inneren Ecken .5mm.

Code

\documentclass[tikz]{standalone}

\usetikzlibrary{positioning,shadows}

\begin{document}
\begin{tikzpicture}[
  box/.style={
    shape=rectangle,
    draw=red!50!black!50,
    rounded corners=1mm,
    fill=blue,
    drop shadow,
    minimum width=5em,
    minimum height=3em,
    level distance=10cm,
    text centered,
    anchor=north,
    text=white
    },
  circled/.style={
    box,
    path picture={
      \path[draw=red!50!black!50, fill=blue!50] ([shift={(-1mm,-1mm)}]path picture bounding box.north east) circle[radius = 1mm];
    }
  },
  starred/.style={
    box,
    path picture={
       \path[sharp corners,draw=red!50!black!50, fill=blue!50,] ([shift={(-1.5mm,-1.5mm)}]path picture bounding box.north east) + (1/#1*360+90:1mm) \foreach \i in {1,...,#1} {-- + (\i/#1*360+90:1mm) -- + (\i.5/#1*360+90:.5mm)} -- cycle;
    }
  },
  starred/.default=5,% default number of corners
]
\node (State00) [box] {Jackson Diagramm}
 [sibling distance=3cm]
    child {node (a) [box] {int a = 1}}
    child {node (a) [box] {boolean n = true}}
    child {node (a) [box] {boolean z = true}}
    child {[sibling distance=4cm] node (d) [circled] {if (n)}
        child{  [sibling distance=3cm] node (e) [starred] {while (z)}
        child {node (f) [box] {n = !z}}
        child {node (g) [box] {a++}}
        child { [sibling distance=4cm] node (h) [circled] {a <= 10}
                child {node (i) [box] {z = true}}
                child {node (j) [box] {System.out.println( "z\(>\)10")}}
            }
        }
        child {node (k) [box] {System.out.println(a)}} 
        child {node (l) [box] {System.out.println(z)}}      
    } 
;
\end{tikzpicture}
\end{document}

Ausgabe

Bildbeschreibung hier eingeben

verwandte Informationen