Flowcharts: Mermaid og Graphviz¶
Omsætter den samme pseudokode til et Mermaid- eller Graphviz-flowchart. Begge motorer deler samme semantik; Graphviz prioriterer deterministisk geometri.
Diagrammerne nedenfor gengives direkte af MkDocs fra Mermaid- og Graphviz-kilderne; der bruges ingen omtrentlige statiske billeder.
Komplet eksempel: gæt et tal¶
Først læses n som øvre grænse. Programmet vælger tilfældigt et mål mellem 1 og n og beder derefter om gæt m. Når tallet findes, afslutter Afbryde løkken.
Læse n
mål = tilfældigMellem(1, n)
m = mål + 1
Mens m er ikke lig med mål:
Læse m
Hvis m > mål Så:
Vise "For stort!"
Ellers Hvis m < mål Så:
Vise "For lille!"
Ellers:
Vise "Vundet!"
Afbryde
Slut
Slut
%%{init: {"flowchart":{"curve":"basis","nodeSpacing":55,"rankSpacing":72,"htmlLabels":false},"layout":"elk","look":"classic","elk":{"preset":"modelOrder","nodePlacementStrategy":"LINEAR_SEGMENTS","nodePlacementAlignment":"NONE","layeringStrategy":"NETWORK_SIMPLEX","cycleBreakingStrategy":"MODEL_ORDER","considerModelOrder":"NODES_AND_EDGES","forceNodeModelOrder":true,"keepEntryNodeOnTop":true,"straightenEdges":true,"lineHops":false,"mergeEdges":false},"htmlLabels":false}}%%
%% pseudocode-layout-profile: validated-loop-attached-edges-v22
flowchart TD
n1(["Start"])
n2(["Slut"])
n3[/"Læse n"/]
%% pseudocode-edge e0 n1 n3 normal
n1 e0@--> n3
%% pseudocode-sequence e0 n1 n3
n4["mål = tilfældigMellem(1, n)"]
%% pseudocode-edge e1 n3 n4 normal
n3 e1@--> n4
%% pseudocode-sequence e1 n3 n4
n5["m = mål + 1"]
%% pseudocode-edge e2 n4 n5 normal
n4 e2@--> n5
%% pseudocode-sequence e2 n4 n5
n6{"Mens m er ikke lig med mål ?"}
%% pseudocode-edge e3 n5 n6 normal
n5 e3@--> n6
%% pseudocode-sequence e3 n5 n6
subgraph loop1_body[" "]
direction TB
n7[/"Læse m"/]
n8{"m #62; mål ?"}
%% pseudocode-edge e4 n7 n8 normal
n7 e4@--> n8
%% pseudocode-sequence e4 n7 n8
n9[/"Vise 'For stort!'"/]
%% pseudocode-edge e5 n8 n9 branch
n8 e5@-->|"Ja"| n9
n10{"m #60; mål ?"}
%% pseudocode-edge e6 n8 n10 branch
n8 e6@-->|"Nej"| n10
n11[/"Vise 'For lille!'"/]
%% pseudocode-edge e7 n10 n11 branch
n10 e7@-->|"Ja"| n11
n12[/"Vise 'Vundet!'"/]
%% pseudocode-edge e8 n10 n12 branch
n10 e8@-->|"Nej"| n12
n13["Afbryde"]
%% pseudocode-edge e9 n12 n13 normal
n12 e9@--> n13
%% pseudocode-sequence e9 n12 n13
n14((" ")):::pseudocodeGhost
%% pseudocode-edge e10 n9 n14 normal
n9 e10@--- n14
%% pseudocode-sequence e10 n9 n14
%% pseudocode-edge e11 n11 n14 normal
n11 e11@--- n14
%% pseudocode-sequence e11 n11 n14
end
style loop1_body fill:none,stroke:none
%% pseudocode-edge e12 n6 n7 branch
n6 e12@-->|"Ja"| n7
%% pseudocode-loop-continue e12 n6 n7
%% pseudocode-edge e13 n14 n6 loop_back
n14 e13@--> n6
%% pseudocode-loop-back e13 n14 n6
%% pseudocode-edge e14 n6 n2 branch
n6 e14@-->|"Nej"| n2
%% pseudocode-loop-exit e14 n6 n2
%% pseudocode-edge e15 n13 n2 normal
n13 e15@--> n2
%% pseudocode-sequence e15 n13 n2
classDef pseudocodeGhost fill:transparent,stroke:transparent,color:transparent;
Vigtigste programmeringsstrukturer¶
De følgende eksempler viser de mest almindelige kontrolstrukturer hver for sig, så deres Mermaid- og Graphviz-visning hurtigt kan sammenlignes.
Betingelse: Hvis … Så … Ellers …¶
x = 5
Hvis x > 0 Så:
Vise "positiv"
Ellers:
Vise "nul eller negativ"
Slut
%%{init: {"flowchart":{"curve":"basis","nodeSpacing":55,"rankSpacing":72,"htmlLabels":false},"layout":"elk","look":"classic","elk":{"preset":"modelOrder","nodePlacementStrategy":"LINEAR_SEGMENTS","nodePlacementAlignment":"NONE","layeringStrategy":"NETWORK_SIMPLEX","cycleBreakingStrategy":"MODEL_ORDER","considerModelOrder":"NODES_AND_EDGES","forceNodeModelOrder":true,"keepEntryNodeOnTop":true,"straightenEdges":true,"lineHops":false,"mergeEdges":false},"htmlLabels":false}}%%
%% pseudocode-layout-profile: validated-loop-attached-edges-v22
flowchart TD
n1(["Start"])
n2(["Slut"])
n3["x = 5"]
%% pseudocode-edge e0 n1 n3 normal
n1 e0@--> n3
%% pseudocode-sequence e0 n1 n3
n4{"x #62; 0 ?"}
%% pseudocode-edge e1 n3 n4 normal
n3 e1@--> n4
%% pseudocode-sequence e1 n3 n4
n5[/"Vise 'positiv'"/]
%% pseudocode-edge e2 n4 n5 branch
n4 e2@-->|"Ja"| n5
n6[/"Vise 'nul eller negativ'"/]
%% pseudocode-edge e3 n4 n6 branch
n4 e3@-->|"Nej"| n6
%% pseudocode-edge e4 n5 n2 normal
n5 e4@--> n2
%% pseudocode-sequence e4 n5 n2
%% pseudocode-edge e5 n6 n2 normal
n6 e5@--> n2
%% pseudocode-sequence e5 n6 n2
Løkke: For … fra … til …¶
total = 0
For i fra 1 til 5:
total = total + i
Slut
Vise total
%%{init: {"flowchart":{"curve":"basis","nodeSpacing":55,"rankSpacing":72,"htmlLabels":false},"layout":"elk","look":"classic","elk":{"preset":"modelOrder","nodePlacementStrategy":"LINEAR_SEGMENTS","nodePlacementAlignment":"NONE","layeringStrategy":"NETWORK_SIMPLEX","cycleBreakingStrategy":"MODEL_ORDER","considerModelOrder":"NODES_AND_EDGES","forceNodeModelOrder":true,"keepEntryNodeOnTop":true,"straightenEdges":true,"lineHops":false,"mergeEdges":false},"htmlLabels":false}}%%
%% pseudocode-layout-profile: validated-loop-attached-edges-v22
flowchart TD
n1(["Start"])
n2(["Slut"])
n3["total = 0"]
%% pseudocode-edge e0 n1 n3 normal
n1 e0@--> n3
%% pseudocode-sequence e0 n1 n3
n4{"For i fra 1 til 5"}
%% pseudocode-edge e1 n3 n4 normal
n3 e1@--> n4
%% pseudocode-sequence e1 n3 n4
subgraph loop1_body[" "]
direction TB
n5["total = total + i"]
end
style loop1_body fill:none,stroke:none
%% pseudocode-edge e2 n4 n5 branch
n4 e2@-->|"Ja"| n5
%% pseudocode-loop-continue e2 n4 n5
%% pseudocode-edge e3 n5 n4 loop_back
n5 e3@-->|"(i = i + 1)"| n4
%% pseudocode-loop-back e3 n5 n4
n6[/"Vise total"/]
%% pseudocode-edge e4 n4 n6 branch
n4 e4@-->|"Nej"| n6
%% pseudocode-loop-exit e4 n4 n6
%% pseudocode-edge e5 n6 n2 normal
n6 e5@--> n2
%% pseudocode-sequence e5 n6 n2
Løkke: For … fra … til … med trin …¶
For i fra 0 til 10 med trin 2:
Vise i
Slut
%%{init: {"flowchart":{"curve":"basis","nodeSpacing":55,"rankSpacing":72,"htmlLabels":false},"layout":"elk","look":"classic","elk":{"preset":"modelOrder","nodePlacementStrategy":"LINEAR_SEGMENTS","nodePlacementAlignment":"NONE","layeringStrategy":"NETWORK_SIMPLEX","cycleBreakingStrategy":"MODEL_ORDER","considerModelOrder":"NODES_AND_EDGES","forceNodeModelOrder":true,"keepEntryNodeOnTop":true,"straightenEdges":true,"lineHops":false,"mergeEdges":false},"htmlLabels":false}}%%
%% pseudocode-layout-profile: validated-loop-attached-edges-v22
flowchart TD
n1(["Start"])
n2(["Slut"])
n3{"For i fra 0 til 10 med trin 2"}
%% pseudocode-edge e0 n1 n3 normal
n1 e0@--> n3
%% pseudocode-sequence e0 n1 n3
subgraph loop1_body[" "]
direction TB
n4[/"Vise i"/]
end
style loop1_body fill:none,stroke:none
%% pseudocode-edge e1 n3 n4 branch
n3 e1@-->|"Ja"| n4
%% pseudocode-loop-continue e1 n3 n4
%% pseudocode-edge e2 n4 n3 loop_back
n4 e2@-->|"(i = i + 2)"| n3
%% pseudocode-loop-back e2 n4 n3
%% pseudocode-edge e3 n3 n2 branch
n3 e3@-->|"Nej"| n2
%% pseudocode-loop-exit e3 n3 n2
Løkke: For … I …¶
For c I "Hej":
Vise c
Slut
%%{init: {"flowchart":{"curve":"basis","nodeSpacing":55,"rankSpacing":72,"htmlLabels":false},"layout":"elk","look":"classic","elk":{"preset":"modelOrder","nodePlacementStrategy":"LINEAR_SEGMENTS","nodePlacementAlignment":"NONE","layeringStrategy":"NETWORK_SIMPLEX","cycleBreakingStrategy":"MODEL_ORDER","considerModelOrder":"NODES_AND_EDGES","forceNodeModelOrder":true,"keepEntryNodeOnTop":true,"straightenEdges":true,"lineHops":false,"mergeEdges":false},"htmlLabels":false}}%%
%% pseudocode-layout-profile: validated-loop-attached-edges-v22
flowchart TD
n1(["Start"])
n2(["Slut"])
n3{"For c I 'Hej'"}
%% pseudocode-edge e0 n1 n3 normal
n1 e0@--> n3
%% pseudocode-sequence e0 n1 n3
subgraph loop1_body[" "]
direction TB
n4[/"Vise c"/]
end
style loop1_body fill:none,stroke:none
%% pseudocode-edge e1 n3 n4 branch
n3 e1@-->|"Ja"| n4
%% pseudocode-loop-continue e1 n3 n4
%% pseudocode-edge e2 n4 n3 loop_back
n4 e2@--> n3
%% pseudocode-loop-back e2 n4 n3
%% pseudocode-edge e3 n3 n2 branch
n3 e3@-->|"Nej"| n2
%% pseudocode-loop-exit e3 n3 n2
Løkke: Mens …¶
i = 0
Mens i < 3:
Vise i
i = i + 1
Slut
%%{init: {"flowchart":{"curve":"basis","nodeSpacing":55,"rankSpacing":72,"htmlLabels":false},"layout":"elk","look":"classic","elk":{"preset":"modelOrder","nodePlacementStrategy":"LINEAR_SEGMENTS","nodePlacementAlignment":"NONE","layeringStrategy":"NETWORK_SIMPLEX","cycleBreakingStrategy":"MODEL_ORDER","considerModelOrder":"NODES_AND_EDGES","forceNodeModelOrder":true,"keepEntryNodeOnTop":true,"straightenEdges":true,"lineHops":false,"mergeEdges":false},"htmlLabels":false}}%%
%% pseudocode-layout-profile: validated-loop-attached-edges-v22
flowchart TD
n1(["Start"])
n2(["Slut"])
n3["i = 0"]
%% pseudocode-edge e0 n1 n3 normal
n1 e0@--> n3
%% pseudocode-sequence e0 n1 n3
n4{"Mens i #60; 3 ?"}
%% pseudocode-edge e1 n3 n4 normal
n3 e1@--> n4
%% pseudocode-sequence e1 n3 n4
subgraph loop1_body[" "]
direction TB
n5[/"Vise i"/]
n6["i = i + 1"]
%% pseudocode-edge e2 n5 n6 normal
n5 e2@--> n6
%% pseudocode-sequence e2 n5 n6
end
style loop1_body fill:none,stroke:none
%% pseudocode-edge e3 n4 n5 branch
n4 e3@-->|"Ja"| n5
%% pseudocode-loop-continue e3 n4 n5
%% pseudocode-edge e4 n6 n4 loop_back
n6 e4@--> n4
%% pseudocode-loop-back e4 n6 n4
%% pseudocode-edge e5 n4 n2 branch
n4 e5@-->|"Nej"| n2
%% pseudocode-loop-exit e5 n4 n2
Løkke: Gentag … gange¶
Gentage 3 gange:
Vise "Hej"
Slut
%%{init: {"flowchart":{"curve":"basis","nodeSpacing":55,"rankSpacing":72,"htmlLabels":false},"layout":"elk","look":"classic","elk":{"preset":"modelOrder","nodePlacementStrategy":"LINEAR_SEGMENTS","nodePlacementAlignment":"NONE","layeringStrategy":"NETWORK_SIMPLEX","cycleBreakingStrategy":"MODEL_ORDER","considerModelOrder":"NODES_AND_EDGES","forceNodeModelOrder":true,"keepEntryNodeOnTop":true,"straightenEdges":true,"lineHops":false,"mergeEdges":false},"htmlLabels":false}}%%
%% pseudocode-layout-profile: validated-loop-attached-edges-v22
flowchart TD
n1(["Start"])
n2(["Slut"])
n3{"Gentage 3 gange"}
%% pseudocode-edge e0 n1 n3 normal
n1 e0@--> n3
%% pseudocode-sequence e0 n1 n3
subgraph loop1_body[" "]
direction TB
n4[/"Vise 'Hej'"/]
end
style loop1_body fill:none,stroke:none
%% pseudocode-edge e1 n3 n4 branch
n3 e1@-->|"Ja"| n4
%% pseudocode-loop-continue e1 n3 n4
%% pseudocode-edge e2 n4 n3 loop_back
n4 e2@--> n3
%% pseudocode-loop-back e2 n4 n3
%% pseudocode-edge e3 n3 n2 branch
n3 e3@-->|"Nej"| n2
%% pseudocode-loop-exit e3 n3 n2
Løkke: Gentag … Indtil …¶
i = 0
Gentage:
Vise i
i = i + 1
Indtil i >= 3
%%{init: {"flowchart":{"curve":"basis","nodeSpacing":55,"rankSpacing":72,"htmlLabels":false},"layout":"elk","look":"classic","elk":{"preset":"modelOrder","nodePlacementStrategy":"LINEAR_SEGMENTS","nodePlacementAlignment":"NONE","layeringStrategy":"NETWORK_SIMPLEX","cycleBreakingStrategy":"MODEL_ORDER","considerModelOrder":"NODES_AND_EDGES","forceNodeModelOrder":true,"keepEntryNodeOnTop":true,"straightenEdges":true,"lineHops":false,"mergeEdges":false},"htmlLabels":false}}%%
%% pseudocode-layout-profile: validated-loop-attached-edges-v22
flowchart TD
n1(["Start"])
n2(["Slut"])
n3["i = 0"]
%% pseudocode-edge e0 n1 n3 normal
n1 e0@--> n3
%% pseudocode-sequence e0 n1 n3
subgraph loop1[" "]
direction TB
subgraph loop1_body[" "]
direction TB
n4[/"Vise i"/]
n5["i = i + 1"]
%% pseudocode-edge e1 n4 n5 normal
n4 e1@--> n5
%% pseudocode-sequence e1 n4 n5
end
style loop1_body fill:none,stroke:none
subgraph loop1_condition[" "]
direction TB
n6{"i #62;= 3 ?"}
end
style loop1_condition fill:none,stroke:none
%% pseudocode-edge e2 n5 n6 normal
n5 e2@--> n6
%% pseudocode-sequence e2 n5 n6
end
style loop1 fill:none,stroke:none
%% pseudocode-edge e3 n3 n4 normal
n3 e3@--> n4
%% pseudocode-sequence e3 n3 n4
%% pseudocode-edge e4 n6 n4 loop_back
n6 e4@-->|"Nej"| n4
%% pseudocode-loop-back e4 n6 n4
%% pseudocode-edge e5 n6 n2 branch
n6 e5@-->|"Ja"| n2
%% pseudocode-loop-exit e5 n6 n2