Nästlade loopar

Inledning

Okej, vad är en nästlad loop?

Det är en loop innuti en annan loop. Nästlade loop'ar är inte direkt ovanliga speciellt vid algoritmer som behandlar data. Exempel kan vara vid uppritning av kartor i grafiska spel eller sortering av data. En nästlad loop kan se ut som:

Exempel 1

for (int y = 0; y < 10; y++)
{
    //Yttre loop (början)
	
    for (int x = 0; x < 10; x++)
    {
        //Inre loop
        Console.WriteLine("Hej");
    }
	
    //Yttre loop efter den inre loop'en
}

I den första loop'en (rad 1), även kallad den yttre loop'en, finns det en inre loop (rad 5). Kan du se hur många gånger texten "Hej" skrivs ut?

Rätt svar på den frågan är 100 gånger. Båda loop'arna kontrolleras av variabel och villkor som gör att de görs exakt 10 gånger. Den yttre loop'en körs 10 gånger. I den yttre loop'en ligger den inre loop'en som också den körs 10 gånger. Totalt sett körs den inre loop'en 10 gånger vilket ger svaret 10 x 10 utskrifter på "Hej".

Ändrar vi lite i koden så kan vi få med variablerna x och y i utskriften:

Exempel 2

for (int y = 0; y < 10; y++)
{
    for (int x = 0; x < 10; x++)
    {
        Console.WriteLine("Hej x=" + x + " y=" + y);
    }
}

bild

Multiplikationstabell

Det underlättar om vi tänker 2-dimensionellt när vi konstruerar nästlade loop'ar. I exemplet nu ska vi konstruera ett program som skriver ut multiplikationstabellen, 1:ans till 10:ans, med lite snygga utskrifter. Studerar vi exemplet ovan så är vi nästan där, vi behöver bara göra beräkningen samt snygga till utskrifterna lite. Förslag:

Exempel: Multiplikationstabell

using System;
using System.Collections.Generic;
using System.Text;

namespace NestedLoops
{
    class Program
    {
        static void Main(string[] args)
        {
            for (int tabell = 1; tabell <= 10; tabell++)
            {
                Console.WriteLine(tabell + ":ans tabell");
                for (int tal = 1; tal <= 10; tal++)
                {
                    Console.WriteLine(tabell + " x " + tal + " = " + tabell*tal);
                }
                Console.WriteLine();
            }
        }
    }
}

bild

Ytterloop'en reglerar aktuell tabell och varibeln tal loop'as för att kunna ge multiplikationstabellen, tabell*tal. Beräkningen görs i utskriften. Före och efter innerloop'en görs nödvändig textformatering.

Spelplan

Nästlade loop'ar är ofta användbara i spelsammanhang. Ett typiskt exempel kan vara att generera ett mönster, hämta data från en spelplan eller just rita ut en spelplan. För att göra det lite roligare så ska vi i programmet kunna ange spelplanens höjd och bredd. Varje tänkt ruta i spelplanen ritas ut som ett #.

Exempel: Spelplan

using System;
using System.Collections.Generic;
using System.Text;

namespace NestedLoops
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.Write("Ange bredd: ");
            int bredd = int.Parse(Console.ReadLine());
            Console.Write("Ange höjd: ");
            int hojd = int.Parse(Console.ReadLine());

            for (int y = 0; y < hojd; y++)
            {
                for (int x = 0; x < bredd; x++)
                {
                    Console.Write("#");
                }
                Console.WriteLine();
            }
        }
    }
}

bild

Övningar

Utifrån exemplen ovan så kan du testa och se om du kan lösa följande uppgifter. En del av dem kan vara lite knepiga.

Övning 1

Efterlikna följande spelplan (10x10) där rutor i varannan kolumn ska ritas ut som ett o.

bild

Övning 2

Efterlikna följande spelplan (11x11) där varannan ruta, i den ordning som den ritas, ska ritas ut som ett o.

bild

Övning 3

Efterlikna följande mönster. Tips är att innerloop'ens villkor måste bygga på ytterloop'ens variabel.

bild

3 comments on Nästlade loopar

  1. Roland Nyberg skriver:

    Hej!
    Vet inte om denna mailfunktion fungerar.
    Såg lite övningar på denna sida och försökte göra dom, men fastnade på övning 2:
    Efterlikna följande spelplan (11×11) där varannan ruta, i den ordning som den ritas, ska ritas ut som ett o.

    Skulle inte vulja ha lösningen men en liten input på hur jag skall få den att alternera mellan 2 tecken så att den inte börjar om från början när ny rad kommer.

    Tack på förhand
    MVH
    /Roland Nyberg

    1. Jonas Nilsson skriver:

      Det finns många olika sätt att lösa den på. Ett tips kan vara att ha en variabel som håller reda på vilket tecken som ska skrivas ut (o). Efter utskrift ändrar variabeln till alternativ 2 (#). Efter alt 2 så ändras den senare tillbaka till alt 1. Osv.

    2. Lasse skriver:

      Hej,
      Märk skillnaden var ”varv-indikatorn” initieras.. – i övning 1, så initieras (nollställs) den varje gång den yttre loopen loopar, till skillnad från övning 2 där den endast initieras en gång utanför looparna..
      Mvh
      Lasse

      Övning 1
      static void Main(string[] args)
      {
      for (int i = 0; i < 10; i++)
      {
      int varv = 0;
      for (int j = 0; j < 10; j++)
      {
      if (varv == 0)
      {
      Console.Write("o");
      varv++;
      }
      else
      {
      Console.Write("#");
      varv–;
      }
      }
      Console.WriteLine();
      }
      Console.ReadKey();
      }

      Övning 2
      static void Main(string[] args)
      {
      int varv = 0;
      for (int i = 0; i < 10; i++)
      {
      for (int j = 0; j < 10-i; j++)
      {
      if (varv == 0)
      {
      Console.Write("o");
      varv++;
      }
      else
      {
      Console.Write("#");
      varv–;
      }
      }
      Console.WriteLine();
      }
      Console.ReadKey();
      }

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *

Scroll to top