Skocz do zawartości

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

Blaviken

[C++] Różnice między funkcjami

Polecane posty

Witam drogich forumowiczów,

ostatnio na lekcji informatyki mieliśmy napisać funkcje, która sprawdza, czy podana liczba jest pierwsza. Ja użyłem czegoś takiego:


bool LiczbaPierwsza(int Liczba)
{
if (Liczba == 2) return true;
for (int i = 2; i <= sqrt(Liczba); ++i)
{
if (Liczba % i == 0)
{
return false;
break;
}
}
return true;
}

Nauczyciel zgodził się, że działa dobrze, ale było widać że coś mi nie pasuje. Niedługo potem ta wersja funkcji zaczęła królować w całej klasie. W tym momencie nauczyciel nauczyciel się przyczepił, bo stwierdził, że ta funkcja działa, ale nie powinno się tego tak robić, a skoro tak dużo ludzi jej używa, on nie może na to pozwolić. Argumentował to tym, że jest ona okropna dla komputera, szczególnie połączenie for i break, a w tym przypadku inne pętle lepiej się sprawdzą. Kazał nam napisać ją jeszcze raz, ale używając pętli do lub while i warunków, które podał. Efekt końcowy wyglądał mniej więcej tak:


bool Pierwszanr2(int Liczba)
{
int i = 2;
int reszta;
if (Liczba == 2) return true;
do
{
reszta = Liczba % i;
i++;
}while (reszta!=0 && i < sqrt(Liczba));
if (reszta == 0)
return false;
else
return true;
}

Zaczęliśmy z kolegą kłócić z nim, że ta funkcja jest mniej przejrzysta, na same warunki nigdy byśmy nie wpadli itd.

No więc tu pojawia się moje pytanie: czy nasz nauczyciel rzeczywiście ma racje i ja, jako człowiek mający ambicje zostać programistą powinien się wystrzegać takich funkcji, czy jednak nie robi to większej różnicy, a ja mogę spokojnie korzystać z pierwszej wersji, nie bojąc się, że zabiję komputer?

Link do komentarza
Udostępnij na innych stronach

Czy powinno się używać break/continue?

Raczej powinno się tego unikać.

Użycie go zazwyczaj nieco utrudnia czytanie i dowodzenie poprawności programu, dużo bardziej elegancki kod najczęściej uzyskamy przez dodanie warunku do pętli while.

Czasami jednak użycie tego jest potrzebne, bo dzięki temu kod będzie czytelniejszy/prostszy etc.

goto.png

Bardziej niż o tego breaka martwiłbym się o sam warunek:


i <= sqrt(Liczba)

Pierwiastek nie jest niczym przyjemnym do liczenia, można ten problem rozwiązać lepiej (mianowicie podnosząc i do kwadratu).

EDIT

Oczywiście moja wypowiedź na temat break tyczy się tyko pętli, w switch jest to najczęściej konieczne i się tego nie obejdzie.

Link do komentarza
Udostępnij na innych stronach

Ja bym tę funkcję zrobił tak:

bool PierwszaNr3(int liczba)
{
bool wynik = true;
int pierwiastekLiczby = pierwiastek(liczba);

for (int i = 2; i <= pierwiastekLiczby; ++i)
{
if (liczba % i == 0)
{
wynik = false;
break;
}
}
return wynik;
}

Moim zdaniem to jest najbardziej czytelne rozwiązanie. Posiada tylko jeden punkt wyjścia z metody - użycie wielu return, szczególnie w dłuższej funkcji, potrafi być irytujące.

do-while jest dobre, jeśli pętla musi się wykonać przynajmniej jeden raz - oszczędzasz sobie jedno sprawdzenie warunku. Zysk prawdopodobnie zerowy, ale ładniej wygląda.

Pętle z pierwszego postu są porówywalne. Ja bym wziął "for", bo i tak potrzebujemy licznika, więc wygodniej niż klepać ekstra zmienną poza pętlą (w Visual Studio użyłbym po prostu snippetu "for").

Link do komentarza
Udostępnij na innych stronach



  • Kto przegląda   0 użytkowników

    • Brak zalogowanych użytkowników przeglądających tę stronę.
×
×
  • Utwórz nowe...