Rutediagrammer

Symboler, regler og oversættelse til/fra programstrukturer

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.

Oversigt over rutediagram-symboler
Oversigt. De almindelige byggeblokke.

Byggeblokke (symboler) og hvad de betyder

Start / Slut – oval

Markerer begyndelse og afslutning. Skriv fx Start eller Stop i symbolet.

Figur S1 – Start/Slut (oval) med tydelig tekst og én indgang og mindst en udgang
Figur S1. Start/Slut (oval) med tydelig tekst og én indgang og mindst en dgang.

Proces – rektangel

En handling eller beregning. Brug udsagnsord i bydeform: Beregn areal, Sorter liste, Opdater tæller.

Figur S2 – Procesboks med kort, handlingsorienteret tekst
Figur S2. Procesboks med kort, handlingsorienteret tekst.

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.

Figur S3 – I/O-blok for læs/skriv af data
Figur S3. I/O-blok for læs/skriv af data.

Beslutningsdiamant

Et ja/nej-spørgsmål (sand/falsk). Navngiv udgangene med Ja / Nej (eller Sand/Falsk).

Figur S4 – Beslutningsdiamant med to udgange, labellet Ja/Nej
Figur S4. Beslutningsdiamant med to udgange, labellet Ja/Nej.

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.

Figur S5 – Forbindelsespunkt (cirkelform) til skift mellem sider eller diagrammer
Figur S5. Forbindelsespunkt (cirkelform) markerer skift mellem sider/diagrammer.

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.

Figur S6 – Pile med ensartet retning og gren-labels ved beslutninger
Figur S6. Pile med ensartet retning og gren-labels ved beslutninger.

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.

Figur M1 – Sekvens af tre procesbokse uden forgreninger
Figur M1. Sekvens af tre procesbokse uden forgreninger.

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.

Figur M2 – If–else: to grene, der samles før næste proces
Figur M2. If–else: to grene, der samles før efterfølgende instruktioner.

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.

Figur M3 – For-løkke med initialisering, test, krop og opdatering
Figur M3. For-løkke med initialisering, test, krop og opdatering.

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.

Figur – foreach-løkke: flere elementer? Ja → behandl element → næste; Nej → slut
Figur. Foreach: beslutning "flere elementer?" med krop og tilbagekobling — uden eksplicit tæller.

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.

Figur M4 – While-løkke med test før krop
Figur M4. While-løkke med test før krop.

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.

Figur M5 – Do–while med test efter krop (mindst én iteration)
Figur M5. Do–while med test efter krop
(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

Figur M6 – Switch-case med flere udgående grene, der samles
Figur M6. Switch-case med flere udgående grene, der samles.
Figur M6 – Switch-case med flere udgående grene, der samles
Figur M6. Switch-case med flere udgående grene, der samles.
Figur M6 – Switch-case med kæde af beslutningsdiamanter
Figur M6. Switch-case med kæde af beslutningsdiamanter.

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.

Figur M7a – While-løkke med break (udgang direkte ud af løkken)
Figur M7a. break: udgang direkte ud af løkken, når værdien er fundet. Blå stiplet vej indikerer normal kørsel af while-løkkens krop.

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.

Figur M8b – While-løkke med continue (spring til test/opdatering)
Figur M7b. continue: spring resten af kroppen over og gå direkte til næste iteration. Blå stiplet vej indikerer normal kørsel af while-løkkens krop.

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.

Figur M8c – While med både break (udgang) og continue (spring iteration)
Figur M7c. Kombineret: break til udgang; continue til næste iteration. Blå stiplet vej indikerer normal kørsel af while-løkkens krop.

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++;
}