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:
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:
for (int y = 0; y < 10; y++)
{
for (int x = 0; x < 10; x++)
{
Console.WriteLine("Hej x=" + x + " y=" + y);
}
}
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:
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();
}
}
}
}
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 #.
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();
}
}
}
}
Ö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.
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
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.
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();
}