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