Jak pozbyć się continue?

0

Nauczyciel zadał nam zadanie. Podał jakiś kod, i powiedział, żebysmy zapisali to samo, ale bez continue. Ja nie mam jednak pojęcia, jak to zrobić:(

To jest kod:

vector<int> liczby;
int len = liczby.size();

                    if(len==0)
                    {
                        //wypisanie liczb z wektora
                        continue;
                    }
                    if(len%2==0)
                    {
                        //operacje na wektorze
                    }
                    else
                    {
                        //inne operacje na wektorze
                    }
0

Ok, to jedno rozwiazanie - czysą jeszcze jakieś inne? Mi pzychodzi do głowy switch, ale nie wiem, czy poprawnie

0

Czyli coś takiego bym dostał?

vector<int> liczby;
int len = liczby.size();
 
                    if(len==0)
                    {
                        //wypisanie liczb z wektora
                    
                    }
                    else if(len%2==0)
                    {
                        //operacje na wektorze
                    }
                    else
                    {
                        //inne operacje na wektorze
                    }
0
                    if(len!=0)
                    {
                    if(len%2==0)
                    {
                        //operacje na wektorze
                    }
                    else
                    {
                        //inne operacje na wektorze
                    }
                    }
0

@krwq: ale tu uzyles continue:)

0

Może da się to zrobić na switch / case (tylko nie wrzucaj breaków)

0

no wlasnie, switchem tego nie zrobie:/

0

cz to aby na pewno bedzie dobry sposob?

if(len==0)
                    {
                        //wypisanie liczb z wektora
 
                    }
                    else if(len%2==0)
                    {
                        //operacje na wektorze
                    }
                    else
                    {
                        //inne operacje na wektorze
                    }
0

Powie mi ktoś jaki sens ma continue w if?

0

continue działa tylko w pętlach a tu nie widzę żadnej.. ale okej przypuszczam że zapomniałeś... możesz użyć ewentualnie goto w ostateczności :D

0

Bo to jest w petli, ale nie moge dac calego kodu ... ale jesli to jest w petli. to, czy to, co podalem wczesniej i to co podpowiedzial Zjarek bedzie dobrze?

0
vector<int> liczby;
int len = liczby.size();
 
                    if(len!=0)
                    {
                        if(len%2==0)
                        {
                            //operacje na wektorze
                        }
                        else
                        {
                            //inne operacje na wektorze
                        }
                    }
                    else
                         //wypisanie liczb z wektora
0

w zasadzie bezsensu ;p jest coś dalej w tym kodzie ?:)

0

sorry nie zauważyłem, że po tym pierwszym ifie nie ma else'a. Błędna odpowiedź

1

Przeciez prawidlowa odpowiedz juz podal krwq. Jeżeli to poczatki programowana, to mozna uzyc tak jak powiedzial juz jeden uzytkownik instrukcji goto. Choc w takich przypadkach przy pisaniu programow sie tego nie stosuje

0

Moim zdaniem dokładnie taki sam efekt co wersja z continue daje już wcześniej podane rozwiązanie:

vector<int> liczby;
int len = liczby.size();
 
                    if(len!=0)
                    {
                        if(len%2==0)
                        {
                            //operacje na wektorze
                        }
                        else
                        {
                            //inne operacje na wektorze
                        }
                    }
0
void wypisz_liczby(vector<int> &vec) {
  // ...
}

void normalne_operacje(vector<int> &vec) {
  // ...
}

void nienormalne_operacje(vector<int> &vec) {
  // ...
}

void wuja_sie_znacie() {
  static void (*dispatch[])(vector<int> &) = {
    wypisz_liczby,
    normalne_operacje,
    nienormalne_operacje
  };
  // ...
  vector<int> liczby;
  int len = liczby.size();
  // ...
  dispatch[!!len+len&1](liczby);
  // ...
}
Patryk27 napisał(a)

Do kodeksu karnego mogliby dodać taki zapisek: "Za namawianie do używania 'goto', bądź innych przyciemniających kod instrukcji grozi kara pozbawienia wolności od lat 40 do 50." :)

I kastracja gimnazjalnych pr0gram1stooff, którzy bezmyślnie powtarzają zasłyszane brednie. Takie jądro linuksa to chyba straszne g**no, prawie milion goto w kodzie.

0

Ale krwq podał rozwiązanie z continue, więc gdzie tu jest pozbycie sie go?

@wuja się znacie: fajnie, tylko, że ja tego nie rozumiem.

@zibicoder i reszta: mi też się zdaje, że to co podał Zjarek będzie ok:)

0

zapomniałem skasować. w ifie masz odwrócony warunek. w moim poprzednim poscie juz jest ok

0

@krwq: ok, ale to gdzie w takim razie powinna sie znalezc operacja wypisywania liczb?:>

0

W tym samym warunku co wczesniej

0

Dla somekind przykład użycia goto(na upartego można by zrobic w while z jakas zmienna bool):

     WYNIK bd_config;
szukaj:
    std::cout<<"\tWysylanie maili [2/4 PLIK Z ADRESAMI ODBIORCOW]"<<std::endl<<std::endl;
    bd_config=f_fileExists("file.txt");
    if(bd_config==OK)
    {
        std::cout<<" [+] Program odnalazl plik z adresami odbiorcow"<<std::endl<<std::endl<<" ";
    }
    else
    {
        std::cout<<" [-] Program nie odnalazl pliku z adresami odbiorcow!"<<std::endl;
        std::cout<<"     Pamietaj, ze plik ten musi nazywac sie \"file.txt\""<<std::endl;
        std::cout<<"     i znajdowac sie w tym samym folderze co aplikacja!"<<std::endl<<std::endl;
        std::cout<<" Co zrobic:"<<std::endl<<std::endl;
        std::cout<<"\t[1] Przeszukaj folder jeszcze raz"<<std::endl;
        std::cout<<"\t[2] Wroc do menu glownego"<<std::endl<<std::endl;
        std::cout<<" Wybierz opcje: ";
        while((!(std::cin>>opcja)) || (opcja<1 || opcja>2) ) //dopóki strumieñ jest w stanie b³êdu -> dopóki podawane s¹ b³êdne dane
        {
            std::cout<<std::endl<<"\t[!] Prosze podac liczbe od 1 do 2: ";
            std::cin.clear(); //kasowanie flagi b³êdu strumienia
            std::cin.sync(); //kasowanie zbêdnych znaków z bufora
        }
        if(opcja==1) goto szukaj;
        else
        {
            delete pUser;
            pUser=0;
            f_menu();
        }
    }
0

<strike>Rekurencja ogonowa/wydzielenie do procedur/wtf</strike>
Edit: Przeczytałem kod, masakra. while(true) aka while(notStopped) to ukradli? Już pomijam fakt że każdy normalny by to rozbił na kilka funkcji. Przykład użycia goto ala jędrzejowski: "Bo fajnie ryje psychikę"

0

@mto9 nie zrozumiałeś co ja miałem na myśli. Tam gdzie można zastosować pętle, nie używamy goto, chodzi o to, że kiedy masz jakąć pętle i instrukcje switch, która przerywa sprawdzanie warunków poprzez instrukcję break, to nie jesteś w stanie wyjść inaczej jak przez warunek, lub przez goto.
Przykład:

bool quit = false;
while(!quit)
{
    cin >> choice;
    switch(choice)
    {
    case 1: cout << 1;
        break;
    case 2: cout << 2;
        break;
    case 0: quit = true;
        break;
    default: cout << "cos";
    }
}

Ale przy większej ilości pętli np nieskończonych:

while(1)
{
    while(1)
    {
        while(1)
        {
            cin >> choice;
            switch(choice)
            {
            case 1: cout << 1;
                break;
            case 2: cout << 2;
                break;
            case 0: goto quit;
            default: cout << "cos";
            }
        }
    }
}
quit:
//dalsza część programu
0

wg. mnie jedyny uzasadniony przypadek użycia goto, który oczywiście można na upartego poprawić na przykład bez goto, ale wg. mnie zaćmi tylko bardziej kod:

for (int i=0; i<x; i++)
  for (int j=0; j<y; j++)
    for (int k=0; k<z; k++)
      {
        if (...)
           goto koniec;
        ...
      }
koniec:

na upartego:

[&]()
{
for (int i=0; i<x; i++)
  for (int j=0; j<y; j++)
    for (int k=0; k<z; k++)
      {
        if (...)
           return;
        ...
      }
}();
0
Macron napisał(a)
wuja się znacie napisał(a)
Patryk27 napisał(a)

Do kodeksu karnego mogliby dodać taki zapisek: "Za namawianie do używania 'goto', bądź innych przyciemniających kod instrukcji grozi kara pozbawienia wolności od lat 40 do 50." :)

I kastracja gimnazjalnych pr0gram1stooff, którzy bezmyślnie powtarzają zasłyszane brednie. Takie jądro linuksa to chyba straszne g**no, prawie milion goto w kodzie.

Sorka, ale kernel raczej nie ma być przenośny - Nie będę go odpalał ani pod Linux'em, Windą czy iMac'em

Tak, kernela Linux (jednego z najbardziej przenośnych) nie odpalisz pod systemem GNU/Linuksem, cholerny {autobus wozacy dzieci z podstawowki i z zerowki do szkoly}. Co jest w goto takiego nieprzenośnego? Ta instrukcja została przejęta przez C razem z większością składni języka B, występuje we wszystkich standardach C/C++. Z ilością goto przesadziłem, obecnie jest 90400 wystąpień w kodzie. Ten wątek powinien być +18, zdecydowanie, tylko Riddle'a brakuje.

0

Ale naprawdę, REALNY przykład, a nie abstrakcyjny jak trzy fory z ifem i goto w nim. Realny przykład, w którym goto robi coś sensownego i nie ma sensu go zastąpić inną konstrukcją, po spowoduje to znaczne zmniejszenie czytelności kodu, spadek wydajności jakiegoś algorytmu, itp.
Serio pytam, bo nigdy jeszcze nie użyłem goto i nie widziałem miejsca, w którym mógłbym je użyć, chciałbym się wreszcie tego doświadczyć. Bo rozumiem, że skoro ktoś goto broni, to go choć raz użył? (Ja goto nie atakuje, kieruje mną tylko ciekawość.)

No chyba, że argumentem za goto ma być to, że niektóre języki wreszcie tę instrukcję dostały, jak PHP w 2009 roku. ;)

0

W sumie w C++ to ciężko znaleźć taki przykład, ale np w C nie masz takich bloków jak try i catch. Za pomocą instrukcji goto można by było coś takiego zainsynuować. Prawdę mówiąc nigdy też nie użyłem instrukcji goto, ale fakt, że wyjście z pętli ułatwiłaby. No chyba, że robisz to tak, jak przedstawił @krwq i powiedział @somekind, czyli wstawiasz pętle do funkcji.

0

Haha, no właśnie co jest gorsze: używanie goto czy wyjątków do sterowania przepływem? :D

Nota bene: goto można zasymulować za pomocą np while(1) i switch, np:

while(branch != 0)
switch(branch) {
case 1:
rób cośtam;
branch = 3;
break;
case 2:
rób cośtam;
branch = 2;
case 3:
rób cośtam;
branch = cośtam ? 0 : 1;
break;
}

Symulowanie goto powyżej to chyba nawet większy mózgotrzep niż używanie goto wprost :P

Goto jest w C, bo C to język niskopoziomowy. Natomiast C++, jako język starający się zachować maksymalną zgodność z C, także ma goto. Goto jest w zasadzie do bardzo niskopoziomowych optymalizacji, czyli dla kodu, którego z założenia nie będzie się już rozwijać (a co najwyżej pisać od nowa kod o zbliżonej funkcjonalności).

0

A w Javie wciąż jest keyword goto, chociaż nie ma dla niego żadnego poprawnego zastosowania. Dla pętel jest podrasowane goto (albo podrasowane break/continue) - break/continue z labelami. Mimo to nie pamiętam, kiedy i czy kiedykolwiek tego użyłem.

1 użytkowników online, w tym zalogowanych: 0, gości: 1