Jacek Filut

Jacek Filut
Projektant/Programis
ta, Primesoft Polska
Sp. z o.o.

Temat: [C#] Alternatywa dla GOTO

Witam wszystkich,

Czy ktoś posiada inne alternatywne rozwiązanie dla zastąpienia instrukcji GOTO i oczywiście bardziej optymalną.

Opis przypadku
- posiadamy cztery zagnieżdżone w sobie pętle FOR
- na podstawie dwóch parametrów wejściowych przerywamy wykonywanie pętli np.: trzeciej i czwartej.
- po wskazanym/wybranym zatrzymaniu pętli mamy wykonać kilka dodatkowych akcji

Przykłady:

1) Wywołanie metod:


namespace Application
{
class Program
{
public Program()
{
WykonaniePetliGOTO(10, 5, 5);
WykonaniePetliBREAK(10, 5, 5);
WykonaniePetliZAKONCZ(10, 5, 5);
}
...
}
}

2) Rozwiązanie pierwsze przy pomocy GOTO


namespace Application
{
class Program
{
...

/// <summary>
/// Wykonanie powyższego opisanego przykładu przy użyciu GOTO
/// </summary>
public void WykonaniePetliGOTO(int wykujDo, int trzeciStop, int czwartyStop)
{
bool bDodaAkcje = false;
for (int pierwszyFor = 0; pierwszyFor < wykujDo; pierwszyFor++) //Pierwsza pętla
{
for (int drugiFor = 0; drugiFor < wykujDo; drugiFor++) //Druga pętla {
for (int trzeciFor = 0; trzeciFor < wykujDo; trzeciFor++) //Trzecia pętla
{
for (int czwartyFor = 0; czwartyFor < wykujDo; czwartyFor++) //Czwarta pętla
{
if ((trzeciFor == trzeciStop) && (czwartyFor == czwartyStop))
{
bDodaAkcje = true;
goto Wyjscie;
}
}
}
}
}

Wyjscie:
{
if (bDodaAkcje)
{
;
///TODO: Kilka operacji dla wybranego przerwania akcji
}
}
}
...
}
}

3) Rozwiązanie drugie - flagi i instrukcji BREAK


namespace Application
{
class Program
{
...
/// <summary>
/// Wykonanie powyższego opisanego przykładu przy użyciu BREAK
/// </summary>
public void WykonaniePetliBREAK(int wykujDo, int trzeciStop, int czwartyStop)
{
bool czyPrzerwac = false;
bool bDodaAkcje = false;
for (int pierwszyFor = 0; pierwszyFor < wykujDo; pierwszyFor++) //Pierwsza pętla
{
for (int drugiFor = 0; drugiFor < wykujDo; drugiFor++) //Druga pętla {
for (int trzeciFor = 0; trzeciFor < wykujDo; trzeciFor++) //Trzecia pętla
{
for (int czwartyFor = 0; czwartyFor < wykujDo; czwartyFor++) //Czwarta pętla
{
if ((trzeciFor == trzeciStop) && (czwartyFor == czwartyStop))
{
czyPrzerwac = true;
bDodaAkcje = true;
break;
}
}
if (czyPrzerwac)
{
break;
}
}
if (czyPrzerwac)
{
break;
}
}
if (czyPrzerwac)
{
break;
}
}

if (bDodaAkcje)
{
;
///TODO: Kilka operacji dla wybranego przerwania akcji
}
}
...
}
}

4) Rozwiązanie trzecie - jawne kończeniu wykonywania pętli


namespace Application
{
class Program
{
...
/// <summary>
/// Wykonanie powyższego opisanego przykładu przy jawny kończeniu wykonywania pętli
/// </summary>
public void WykonaniePetliZAKONCZ(int wykujDo, int trzeciStop, int czwartyStop)
{
bool bDodaAkcje = false;
for (int pierwszyFor = 0; pierwszyFor < wykujDo; pierwszyFor++) //Pierwsza pętla
{
for (int drugiFor = 0; drugiFor < wykujDo; drugiFor++) //Druga pętla {
for (int trzeciFor = 0; trzeciFor < wykujDo; trzeciFor++) //Trzecia pętla
{
for (int czwartyFor = 0; czwartyFor < wykujDo; czwartyFor++) //Czwarta pętla
{
if ((trzeciFor == trzeciStop) && (czwartyFor == czwartyStop))
{
bDodaAkcje = true;
pierwszyFor = wykujDo;
drugiFor = wykujDo;
trzeciFor = wykujDo;
czwartyFor = wykujDo;
}
}
}
}
}
if (bDodaAkcje)
{
;
///TODO: Kilka operacji dla wybranego przerwania akcji
}
}
...
}
}


Zapraszam do komentowania, sugestii i propozycji własnych rozwiązań.

Pozdrawiam,
Jacek.Jacek Filut edytował(a) ten post dnia 17.09.12 o godzinie 11:42
Rafał Zięba

Rafał Zięba Właściciel, RZ
Software

Temat: [C#] Alternatywa dla GOTO

Proponuję wydzielić część z pętlami do osobnej metody i użyć instrukcji return zamiast goto. Jeżeli trzeba można zwrócić skąd nastąpiło wyjście i odpowiednio zareagować.



public void InnerMethod(int one, int two, int three)
{
for (...)
{
for (...)
{
for (...)
{
if (...) return;
}
}
}
}

public void OuterMethod(int one, int two, int three)
{
//Kod inicjalizujący

InnerMethod(one, two, three);

//Kod kończący i czyszczący
}

Jacek Filut

Jacek Filut
Projektant/Programis
ta, Primesoft Polska
Sp. z o.o.

Temat: [C#] Alternatywa dla GOTO

Faktycznie, zapomniałem o tym wariancie.
Paweł Paluch

Paweł Paluch Software Developer

Temat: [C#] Alternatywa dla GOTO

wyjście z zagnieżdżonych pętli to akurat typowe zastosowanie dla GOTO.

po co potrzebujesz czterech zagnieżdżonych pętli?
zawsze możesz pójść w stronę spłaszczenia pętli


void Flat(int to,int stop3, int stop4)
{
/*
* i - pierwszy for
* j - drugi for
* k - trzeci for
* m - czwarty for
*/
int i = 0, j = 0, k = 0, m = 0;
while (i!=to)
{
m++;
if (m == to)
{
k++; m = 0;
if (k == to)
{
j++; k = 0;
if (j == to) { i++; j = 0; }
}
}
//Twoje warunki i break;
}
}

Następna dyskusja:

Alternatywa dla C#




Wyślij zaproszenie do