Gå til innhold

Anbefalte innlegg

Skrevet

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.
	 . .

Videoannonse
Annonse
Skrevet (endret)

for(i = 0; i < 100; i++)
{
 if(AvsluttLøkke)
break;
}

 

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

Endret av GeirGrusom
Skrevet
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.

Skrevet (endret)

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
Skrevet
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

Skrevet

Typisk eksempel på hvor goto ikke blr brukes. Det er greit ENKELTE steder der det ikke er andre løsninger, men her mener jeg det blir helt feil.

Skrevet

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...

Skrevet

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.

Skrevet

Det var vel ikke det som var tipset mitt, var det vel?

 

Poenget mitt er at det er en løsning på større funksjoner, ikke akkurat i dette tilfellet.

Skrevet (endret)

Nå er jeg best i Pascal-programmering, men likevel.

 

Hvorfor ikke bare sette 'i' til siste telletall med en IF-setning, da vil jo sløyfa avbryte....

Endret av runerask
Skrevet
Nå er jeg best i Pascal-programmering, men likevel.

 

Hvorfor ikke bare sette 'i' til siste telletall med en IF-setning, da vil jo sløyfa avbryte....

En litt "grisete" løsning etter min smak, men den vil jo forsåvidt fungere...

Skrevet

#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#.

Skrevet

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...

Skrevet
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...

Skrevet
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.

Skrevet (endret)
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

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...