Gå til innhold

Anbefalte innlegg

Kansje et dumt spørsmål, men har C# noen måte å terminere en FOR løkke på når man er inne i en annen løkke av ett elelr annet slag?

for(int i = 0; i <= 10; i++)
{
for(int o = 1; o <= 5; o++)
{
	if(o == 4)
	  // Her vil jeg terminere FOR(i.. løkka
}
}

Jada, vet jeg kan bruke et flagg og sjekke på det. Lurer bare på om det finnes en måte jeg...

 

I Clarion er dette gjort på en enkel måte ved å bruke LABEL

L1	  loop i = 1 to 10
	   Loop o = 1 to 5
		 if o = 4 then break L1.
	 . .

Lenke til kommentar
Videoannonse
Annonse
for(i = 0; i < 100; i++)
{
 if(AvsluttLøkke)
break;
}

 

Hvis du derimot vil gå til neste iterasjon, bruker du continue istedet.

Som sagt, jeg vet hvordan man bruker et flagg. Var mer den tekniske løsningen jeg var ute etter, altså om C# har noe annen form for break. Legg merke til at jeg spurte etter hvordan man kunen bryte ut av en utenforliggende løkke.

Lenke til kommentar

Haha. Da er det bedre å bruke flagg...

 

bool shouldAbort = false;
for(int i = 0; i < jall; i++)
{
 if( shouldAbort )
 break;
 for(int j = 0; j < tull; j++)
 {
  if(noeErFeil)
  {
	 shouldAbort = true;
	 break;
  }
 }
}

Endret av Manfred
Lenke til kommentar
Haha. Da er det bedre å bruke flagg...

 

bool shouldAbort = false;
for(int i = 0; i < jall; i++)
{
 if( shouldAbort )
 break;
 for(int j = 0; j < tull; j++)
 {
  if(noeErFeil)
  {
	 shouldAbort = true;
	 break;
  }
 }
}

På ingen måte! GOTO er tingen, bare se her:

int x = 200, y = 4;
int Count = 0;
string[,] array = new string[x,y];

for (int i = 0; i < x; i++)
 for(j = 0; j < y; j++)
array[i, j] = (++count).ToString();

Console.Write("Søke etter et tall: ");
string Tallet = Console.ReadLine();

for(int i = 0; i < x; i++)
 for(int j = 0; j < y; j++)
if(array[i, j].Equals(Tallet))
  goto Funnet;

Console.WriteLine("Tallet {0} ble ikke funnet.", Tallet);
goto Ferdig;

Funnet:
 Console.WriteLine("Tallet {0} er funnet.", Tallet);

Ferdig:
 Console.WriteLine("Ferdig med søket");

Ser jo bra ut dette da ;-)

(hentet fra MSDN)

 

 

Ha en fantastisk 17. Mai og gratulere med dagen

Lenke til kommentar

Og hva er galt med med å bruke goto i eksempelet over?

 

Det sparer deg for en unødvendig ekstra iterasjon i løkken, og en if-test i løkken med en if-test etter løkken for å se om du har funnet tallet eller ikke.

 

Høres ut som en grei optimisering der, og det blir ikke uoversiktelig med bruk av goto her...

Lenke til kommentar

du trenger ikke en ekstra iterasjon. Du kan legge teksten under den innerste for-en i stedet for over.

 

Evt kunne man skilt ut hele denne doble iterasjonen i en egen funksjon og brukt return for å returnere fra hele shiten.

 

Når det er så enkelt å unngå bruk av goto mener jeg det er direkte idioti å bruke det.

Lenke til kommentar

#include <iostream>

bool andreLoop(int i);

int main()
{
for (int i = 0; andreLoop(i); i++);
}

bool andreLoop(int i)
{
for (int o = 0; o <= 5; o++)
{
	std::cout << i << " - " << o << std::endl;
	if (o == 5 && i == 2)
		return false;
} 
return true;
}

 

Nå er dette skrevet i c++, men prinsippet blir jo det samme for C#.

Lenke til kommentar

Det å kalle en metode i en loop på den måte fjerner de fleste muligheter for optimaliseringer, i følge forelesern jeg hadde i Alg.Dat (INF1020) på blindern, så det der virket ikke som en lur løsning.

 

bool notFound = true;
int i, j;
for(i = 0; i < 2 && notFound; i++){
for(j = 0; j< 5 && notFound; j++){
	 if(array[i, j].Equals(Tallet))
		notFound = false;
}
}
if(notFound)
  //do something

 

Tror dette ville være en raskere løsning, den kombinerer ihvertfall testene for om du skal fortsette løkken eller ikke...

Lenke til kommentar
Det å kalle en metode i en loop på den måte fjerner de fleste muligheter for optimaliseringer, i følge forelesern jeg hadde i Alg.Dat (INF1020) på blindern, så det der virket ikke som en lur løsning.

 

bool notFound = true;
int i, j;
for(i = 0; i < 2 && notFound; i++){
for(j = 0; j< 5 && notFound; j++){
	 if(array[i, j].Equals(Tallet))
		notFound = false;
}
}
if(notFound)
  //do something

 

Tror dette ville være en raskere løsning, den kombinerer ihvertfall testene for om du skal fortsette løkken eller ikke...

 

AHH!! Glemmer hele tiden at C#(eller C for den saken skyld) sine FOR løkker faktisk kan inneholde kjørbar kode i elementene sine. Denne var faktisk skikkelig lur!

Men problemstilling var i utgangspuntet generell. Denne løsningen vil kun funke på en FOR løkke. Det finne mange andre varianter av løkker som ikke vil bli løst slik. Det er jo selvsagt en måte til:

try
{
 for(int i = 0; i < 10; i++)
 {
for(int o=1; o<10; o++)
  if(EttEllerAnnet)
	throw new exception("Fant tallet");
 }
}
catch(Exception e)
{
 MessageBox.Show(e.Message);
}

Grisete, men fungerer vel...

Lenke til kommentar
Det å kalle en metode i en loop på den måte fjerner de fleste muligheter for optimaliseringer, i følge forelesern jeg hadde i Alg.Dat (INF1020) på blindern, så det der virket ikke som en lur løsning.

 

bool notFound = true;
int i, j;
for(i = 0; i < 2 && notFound; i++){
for(j = 0; j< 5 && notFound; j++){
	 if(array[i, j].Equals(Tallet))
		notFound = false;
}
}
if(notFound)
  //do something

 

Tror dette ville være en raskere løsning, den kombinerer ihvertfall testene for om du skal fortsette løkken eller ikke...

 

C++ utfører ganske mye optimaliseringer på løkker, så det er ofte lurt å bare la de være.

 

for eksempel:

 

int* some_array = new int[256 * 256];

for(int i = 0; i < 256; i++)
 for(int j = 0; j < 256; j++)
some_array[i, j] = 0;

 

vil bli optimalisert til

 

int* some_array = new int[256 * 256];

for(int i = 0; i < 65536; i++)
 some_array[i] = 0;

 

Hvis du har en funksjon i løkken blir det umulig for kompilatoren å løse dette opp.

Lenke til kommentar
try
{
 for(int i = 0; i < 10; i++)
 {
for(int o=1; o<10; o++)
  if(EttEllerAnnet)
	throw new exception("Fant tallet");
 }
}
catch(Exception e)
{
 MessageBox.Show(e.Message);
}

Grisete, men fungerer vel...

 

FYYY!!!!

Da er GOTO bedre!!

 

 

Jeg stemmer for GOTO versjonen eller denne:

  bool FoundIt = false;
 for(int i = 0; i < 10 && FoundIt == false; i++)
 {
for(int o=1; o<10 && FoundIt == false; o++)
  if(EttEllerAnnet)
		  FoundIt = true;
 }

 

 

btw; GOTO FTW!!!!!!!!!!!! :love:

 

edit; uj, så at Geir hadde samme forslag som mitt...

Endret av jorn79
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...