En praktisk vejledning: gyldige symboler, layout-regler og typiske mønstre for
betinget udførsel og løkker (if, switch, for,
foreach, while, do-while).
Brug den som tjekliste, når du tegner i hånden eller i et værktøj som draw.io.
Her vises oversigt over de gyldige byggeblokke, de forklares lidt længere nede af siden.
Byggeblokke (symboler) og hvad de betyder
Start / Slut – oval
Markerer begyndelse og afslutning. Skriv fx Start eller Stop i symbolet.
Proces – rektangel
En handling eller beregning. Brug udsagnsord i bydeform: Beregn areal, Sorter liste, Opdater tæller.
Bruges også til funktionskald.
Input/Output – parallelogram
Læs (input) eller skriv/vis (output). Skriv Læs n eller Skriv
resultat.
Det er ikke så ofte vi bruger denne. Kan bruges i konsol-app eller hvis IO fokus er vigtigt.
Beslutningsdiamant
Et ja/nej-spørgsmål (sand/falsk). Navngiv udgangene med Ja / Nej (eller Sand/Falsk).
Dette er den eneste blok der må udgå to pile fra. Det skal være entydigt hvilken vej man vil gå (afhænger af om betingelsen er sand eller falsk)
Side-skift / Forbindelsespunkt – lille cirkel
Bruges som side-skift eller til at hoppe til et andet rutediagram/sektion. Det er ikke en samlingscirkel. Mærk hver cirkel med en kort identifikator, fx A, og gentag samme mærke der, hvor flowet fortsætter.
Pile
Viser retningen for flowet. Pile bør fortrinsvis gå nedad eller til højre for at forøge læsbarhed, men kun i de simpleste programmer kan dette overholdes overalt.
Når en pil løber ind i siden af en anden læses det som: følg retningen på den pil du kommer ind på, se indikation med stiplet blå pil.
Hint: drawio.net har ikke snap til midtpunkt på linjestykker. Det er derfor vanskeligt at tegne som vist til højre. I stedet tegnes som vist til venstre. Indsæt et Waypoint (sort fyldt cirkel, under Div. / Misc), der hvor to pile går sammen. Derved fremkommer figuren til venstre, og nye pile kan trækkes til punktet.
Fra programmering til rutediagram (typiske mønstre)
Sekvens
Instruktioner udføres i rækkefølge: Instruks1 → Instruks2 → Instruks3. Dette betegnes sekventiel kode.
Kode (C#)
int x = 2; // Instruks 1
x = x * 3; // Instruks 2
Console.WriteLine(x); // Instruks 3
Valg (if–else)
En if-else sætning vises på følgende måde i rutediagram: Beslutningsdiamant med to udgange (Ja/Sand/Nej/Falsk) til hver sin gren, der ender i samme næste trin.
Kode (C#)
if (a > 3) { // betingelse: a > 3
a++; // instruks hvis sand
} else {
a--; // instruks hvis falsk
}
Gentag n gange (for-løkke)
En for-løkke vises på følgende måde i rutediagram: Start → Initialiser tæller → Beslutning (tæller < 10?) → Gren Ja udfører kroppen → Opdater tæller → tilbage til beslutning → Nej fører videre.
Kode (C#)
for (int n = 0; n < 10; n++)
{
// instrukser i krop
}
For hvert element (foreach)
En foreach (i C#: foreach (var x in collection)) er en løkke over
en samling uden eksplicit indeks. I rutediagrammet tegnes den som en løkke med en proces
"tag næste element" og en beslutning "er der flere elementer?" — samme form som en
while, bare med samlingens iterator i stedet for en tæller.
Tip: Hvis algoritmen har brug for indekset (i), er en almindelig
for-løkke ofte klarere end foreach — både i kode og i diagrammet.
Kode (C#)
int[] numbers = { 7, 3, 9 };
foreach (int n in numbers)
{
Console.WriteLine(n);
}
Flow: Start → (flere elementer?) Ja → behandl n → tilbage → Nej → slut.
Så længe betingelse er sand (while)
En while-løkke vises på følgende måde i rutediagram: Beslutning øverst: betingelse sand? → Ja: kør kroppen → tilbage til beslutning. Nej: fortsæt.
Kode (C#)
int i = 0;
while (i < 5) // betingelse: i < 5
{
Console.WriteLine($"i = {i}"); // krop
i++; // opdatér tæller
}
Gør–så længe (do–while)
En do-while løkke vises på følgende måde i rutediagram: Kør kroppen mindst én gang → Beslutning nederst: fortsæt? → Ja: tilbage; Nej: videre.
(mindst én iteration).
Kode (C#)
int i = 0;
do
{
Console.WriteLine($"i = {i}"); // krop
i++; // opdatér tæller
} while (i < 5); // betingelse: i < 5
Switch-case
En switch-case konstruktion vises på følgende måde i rutediagram: Beslut værdien i én diamant og tilføj en gren per case. Grenene samles igen i næste trin. Alternativt kan tegnes en kæde af diamanter, se sidste variant
While med break – lineær søgning i heltals-array
I det følgende vises eksempel på hvordan en while-løkke med et break kan vises i rutediagram.
Eksempel (C#)
Herunder vises kode der svarer til (del af) figur M7a.
int[] A
= { 3, 8, 2, 7, 9, 1, 5 };
int key = 7;
int i = 0;
bool found = false;
while (i < A.Length)
{
if (A[i] == key)
{
Console.WriteLine
($"Fundet {key} på indeks {i}");
found = true;
break; // forlad løkken straks
}
i++;
}
if (!found)
{
Console.WriteLine
($"Fandt ikke {key}");
}
While med continue – spring de lige tal over
I det følgende vises eksempel på hvordan en while-løkke med et continue kan vises i rutediagram.
Eksempel (C#)
Herunder vises kode der svarer til (del af) figur M7b.
int[] A = { 4, 11, 2, 7, 10, 9, 5 };
int i = 0;
while (i < A.Length)
{
// er tallet lige?
if (A[i] % 2 == 0)
{
// opdatere i før continue
i++;
// spring resten af kroppen over:
continue;
}
Console.WriteLine
($"Uligt tal: {A[i]}");
i++;
}
While med både break og continue – spring lige tal over, stop ved
-1
I det følgende vises eksempel på hvordan en while-løkke med både break og continue kan vises i rutediagram.
Eksempel (C#)
Herunder vises kode der svarer til (del af) figur M7c.
int[] A = { 3, 4, 7, -1, 9, 11 };
int i = 0;
while (i < A.Length)
{
// Tjek stop-signal først
if (A[i] == -1)
{
Console.WriteLine
("Stødt på -1, stopper helt.");
// forlad løkken:
break;
}
// Spring lige tal over
if (A[i] % 2 == 0)
{
i++;
// gå til næste iteration:
continue;
}
// Behandl ulige, ikke-sentinel
Console.WriteLine
($"Uligt tal: {A[i]}");
i++;
}