HDSoftware Skrevet 16. mai 2008 Del Skrevet 16. mai 2008 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
GeirGrusom Skrevet 16. mai 2008 Del Skrevet 16. mai 2008 (endret) for(i = 0; i < 100; i++) { if(AvsluttLøkke) break; } Hvis du derimot vil gå til neste iterasjon, bruker du continue istedet. Endret 16. mai 2008 av GeirGrusom Lenke til kommentar
HDSoftware Skrevet 16. mai 2008 Forfatter Del Skrevet 16. mai 2008 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
GeirGrusom Skrevet 16. mai 2008 Del Skrevet 16. mai 2008 Heh, nei, ikke annet en goto etter det jeg vet Lenke til kommentar
HDSoftware Skrevet 16. mai 2008 Forfatter Del Skrevet 16. mai 2008 Heh, nei, ikke annet en goto etter det jeg vet OJ!! Jeg får ikke lov å bruke GOTO av Manfred!!! Lenke til kommentar
Manfred Skrevet 16. mai 2008 Del Skrevet 16. mai 2008 (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 16. mai 2008 av Manfred Lenke til kommentar
HDSoftware Skrevet 17. mai 2008 Forfatter Del Skrevet 17. mai 2008 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
Manfred Skrevet 17. mai 2008 Del Skrevet 17. mai 2008 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. Lenke til kommentar
Mr.Garibaldi Skrevet 18. mai 2008 Del Skrevet 18. mai 2008 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
Manfred Skrevet 18. mai 2008 Del Skrevet 18. mai 2008 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
teflonpanne Skrevet 18. mai 2008 Del Skrevet 18. mai 2008 Ja, legg hele løkka i en egen funksjon å returnere fra den istedetfor å bruke goto. Smart! Det er jo hvertfall ikke idioti. Lenke til kommentar
Manfred Skrevet 18. mai 2008 Del Skrevet 18. mai 2008 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. Lenke til kommentar
teflonpanne Skrevet 18. mai 2008 Del Skrevet 18. mai 2008 Ja, hvorfor bruke én instruksjon når man kan bruke 10, alt for å unngå goto. Lenke til kommentar
runerask Skrevet 18. mai 2008 Del Skrevet 18. mai 2008 (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 18. mai 2008 av runerask Lenke til kommentar
Manfred Skrevet 18. mai 2008 Del Skrevet 18. mai 2008 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... Lenke til kommentar
x871kx6167ss7 Skrevet 18. mai 2008 Del Skrevet 18. mai 2008 #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
Mr.Garibaldi Skrevet 19. mai 2008 Del Skrevet 19. mai 2008 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
HDSoftware Skrevet 19. mai 2008 Forfatter Del Skrevet 19. mai 2008 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
GeirGrusom Skrevet 19. mai 2008 Del Skrevet 19. mai 2008 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
j000rn Skrevet 19. mai 2008 Del Skrevet 19. mai 2008 (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!!!!!!!!!!!! edit; uj, så at Geir hadde samme forslag som mitt... Endret 19. mai 2008 av jorn79 Lenke til kommentar
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå