Problemløsning og programmering

Generel strategi for problemløsning

Eksempel 2. Sammenligning og forgrening.

Eksempel 1. Gentagelser og tælleværker.

Lad maskinen tælle til ti. De enkelte tal udskrives under hinanden på skærmen.

Opstilling af drejebog:

Forventet output fra programmet:

1
2
3
4
6
7
8
9
10

Programmets struktur:

Ved valg af en struktur til programmet har man som regel altid flere muligheder. En nærliggende mulighed i dette tilfælde ville være at udføre 10 sætninger efter hinanden, der hver udskriver det næste tal i rækken:

using System;
using System.Text;
class Program
{ // Lad maskinen tælle til 10
  static void Main(string[] args)
  {
    Console.WriteLine(" 1");
    Console.WriteLine(" 2");
    Console.WriteLine(" 3");
    Console.WriteLine(" 4");
    Console.WriteLine(" 5");
    Console.WriteLine(" 6");
    Console.WriteLine(" 7");
    Console.WriteLine(" 8");
    Console.WriteLine(" 9");
    Console.WriteLine(" 10");
    Console.ReadLine();
  }
}

Selv om det er forholdsvis let at lave en sådan løsning, er det også klart, at den ikke er særlig hensigtsmæssig. Forestil dig f.eks. at du får til opgave at lave et program, som kan tælle til 1.000.000 i stedet for til 10.

Gentagelser og variabler.

En af de vigtigste egenskaber ved en datamaskine er dens evne til udføre den samme instruktion - eller en sekvens af instruktioner - flere gange.

Hvis man skal kunne erstatte de 10 skrivesætninger i det første løsningsforslag med en enkelt sætning, må det, der skal udskrives, kunne varieres, og hermed indføres begrebet en variabel.

I det første løsningsforslag vil det være rimeligt at indføre en numerisk heltalsvariabel, som skal kunne antage værdierne fra 1 til 10. En sådan variabel kan man også kalde en tællevariabel. Herved kan der spares 9 skriveinstruktioner; men til gengæld skal der medtages nogle andre instruktioner.

For det første skal tællevariablen tildeles en startværdi inden gentagelsen begynder.

For det andet skal tællevariablens værdi forhøjes med én, hver gang en værdi er blevet udskrevet i gentagelsen.

Endelig skal det undersøges, om slutværdien er nået, i hvilket tilfælde gentagelsen skal stoppes.

Styring af gentagelser.

Der kan tænkes mange forskellige måder til styring af afslutningen på en gentagelse. Dette indikerer, at gentagelser er meget vigtige konstruktionselementer, som bruges tit, når en databehandlingsopgave skal omsættes til et program. I det følgende skal vi se eksempler på tre forskellige måder at styre gentagelsen på. Som det vil fremgå af eksemplerne, er det ikke lige meget, hvilken metode, man anvender; men det kan være svært for begynderen at afgøre hvilken metode, der er den bedste i en given situation.

Løsning med for loop:

using System;
using System.Text;
class Program
{ // Maskinen tæller til 10
  static void Main(string[] args)
  {
    int i;
    for (i = 0; i <= 10; i++)
    {
      Console.WriteLine(i);
    }
    Console.ReadLine();
  }
}

Løsning med do loop:

using System;
using System.Text;
class Program
{ // Maskinen tæller til 10 (DO loop)
  static void Main(string[] args)
  {
    int i = 0;
    do
    {
      i++;
      Console.WriteLine("{0,5:G}", i);
    }
    while (i < 10);
    Console.ReadLine();
  }
}

Løsning med while loop:

using System;
using System.Text;
class Program
{
  static void Main(string[] args)
  {
    int i = 1;
    while (i < 11)
    {
      Console.WriteLine("{0,5:G}", i);
      i++;
    }
    Console.ReadLine();
  }
}

Hvilken styringsmetode til gentagelser er bedst?

Det er ikke altid muligt at udpege en enkelt styringsmetode som værende bedre end andre i en given situation. Ofte er valget af metode et udslag af vane eller smag og behag.

Det vigtigste, man egentlig kan sige om valget af metode, er, at man skal vælge en metode, som man er fortrolig med, fordi man på denne måde undgår at lave fejl i forbindelse med opstilling af betingelser og lignende.

Det skal dog samtidig slås fast, at hvis man behersker flere af de viste styringsmetoder, så har man bedre mulighed for at udarbejde en kort og overskuelig løsning på et givet problem.

I det følgende er der defor forsøgt opstillet nogle tommelfingerregler for, hvornår man bør anvende de forskellige styringsmetoder.

FOR

Denne metode kan med stor fordel anvendes i situationer, hvor en tællevariabel ønskes forøget eller formindsket i faste spring (ofte i spring på én), og hvor start- og slutværdien er et kendt heltal.

DO ... WHILE

Denne metode kan med fordel anvendes, når slutbetingelsen ikke er knyttet til en tællevariabel og gentagelsen skal udføres mindst én gang.

Selv om slutbetingelsen ikke nødvendigvis skal være knyttet til tællevariabel, sådan som den ofte er i forbindelse med FOR konstruktionen, kan der dog godt indgå en tællevariabel i slutbetingelsen; men i så fald skal man selv sørge for at initiere den, inden gentagelsen påbegyndes, og man skal også selv forøge eller formindske dens værdi i hvert gennemløb.

WHILE

Denne metode anvendes i situationer, hvor gentagelsesbetingelsen ikke nødvendigvis er knyttet en tællevariabel. I modsætning til DO ... WHILE, som altid vil blive udført mindst én gang, styres WHILE ... DO af en gentagelsesbetingelse, som testes før gentagelsen udføres, og man kan derfor undgå at udføre gentagelsen, hvis gentagelsesbetingelsen ikke er opfyldt fra starten.

Herved kommer gentagelsesbetingelsen til at virke som en vagtpost, der bestemmer, om gentagelsen skal udføres. Heraf følger den engelske betegnelse, som man ofte benytter om denne type gentagelser: sentinel-styrede gentagelser. Det engelske ord sentinel betyder bevogtning.

Der kan godt indgå en tællevariabel i betingelsen; men i så fald skal man selv initiere den, før gentagelsen påbegyndes, ligesom man selv skal forøge eller formindske dens værdi i hvert gennemløb af gentagelsen.

Oprettet 9. januar 2008
Opdateret 10. januar 2008