Wejście z dwóch lub więcej pętli

0

Poniżej prosty programik który ma sprawdzić czy w wektorze są jakieś dwie liczby akie same. Po znalezieniu pierwszej takiej samej pary powinien zakończyć przeszukiwanie i wyświetlić komunikat.
No i właśnie jedyne co gdzieś udało mi się znaleźć to podpowiedź "goto" która nie dość że w 99 % nie zalecają stosowania to w tym przypadku co zrobiłem działa poprawnie tylko jak w wektorze są dwie takie same liczby inaczej wypisuje głupoty.
Można prosić o podpowiedź ?
Dzięki.

#include <iostream>
using namespace std;

void sprawdz(int T[],unsigned size);

int main ()
{const unsigned size = 12;
int T[size] = {12, 19, 119, 1, 112, -22, -25, 11, 7, -19, 8, 9};

sprawdz(T, size);

return 0;
}

void sprawdz(int T[], unsigned size)
{int i,j;
for(i=0;i<size-1;i++)
{
for(j=i+1;j<size;j++)
{if(T[i]==T[j]) goto stop;
}

  }

stop: cout << "Takie same" << T[i] << " " << T[j] << endl;
}

0
int sprawdz(...)
{
    ...
    return znaleziona_liczba;
}

Czemu nie robic tego jak czlowiek i wyswietlac wynik funkcji w main?

0

No i właśnie jedyne co gdzieś udało mi się znaleźć to podpowiedź "goto" która nie dość że w 99 % nie zalecają
Wyskoczenie z zagnieżdżonej pętli mieści się w tym 1% dopuszczalnego użycia goto.
Jednak lepsze będzie chyba return, wychodzące z funkcji.

0

Dzięki,
przerobiłem na return i zgodnie ze słuszną sugestią wynik wyświetliłem w mainie.

Na marginesie jednak ciekawi mnie, dlaczego przy w tym co napisałem na początku przy braku dwóch takich samych liczb program zwraca durny wynik ???

0
...
for(i=0;i<size-1;i++)       //   <---- Tu: (size - 2). Na początku jeszcze trzebaby sprawdzić czy size >= 2
{
    for(j=i+1;j<size;j++)   //   <---- Tu: (size - 1)
...

Głupoty Ci wypisuje, bo jak nie znajdzie pasujących liczb to "cout" i tak się wykona - i to jeszcze dla "T[12] << " " << T[13]"

BTW: formatowanie = koszmar. Kod wrzucaj w odpowiednie tagi.

0

Dzięki !

0

Ja czasem stosuję jeszcze dodatkową zmienną sterujacą.

bool found = false;
for(i=0;i<size-2 && !found;i++)      
{
    for(j=i+1;j<size-1;j++)
    {
        if(T[i]==T[j])
        {
            found = true;
            break;
        }
    }  
}
0
Sarrus napisał(a):

Ja czasem stosuję jeszcze dodatkową zmienną sterujacą.

Tak jest bardziej elegancko (niż return) - zwłaszcza gdy w funkcji ma być coś więcej niż pętla.

Dopiero w C++11 jest coś jeszcze ładniejszego:

std::tuple<int, int> sprawdz(int T[],unsigned size)
{
  //...
  if(T[i]==T[j])    
    return std::make_tuple(i, j);
  //...
  return std::make_tuple(-1,-1);
}

std::tie(foundI, foundJ) = sprawdz(T, size);

Przy takiej konstrukcji aż się chce ograniczać zakres funkcji do znalezienia pary (do jednego zadania) - co w sumie jest dobrą praktyką, a wyniki pośrednie nie muszą być nazwane w interfejsie funkcji.

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